From 0d464f48be3ac0dc4a4dd2a0fc1e2da7af1b4993 Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 16 2020 08:41:54 +0000 Subject: OpenEXR-2.2.0 base --- diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e16202d --- /dev/null +++ b/AUTHORS @@ -0,0 +1,47 @@ +Developers: +----------- + +Florian Kainz +Rod Bogart +Drew Hess +Paul Schneider +Bill Anderson +Wojciech Jarosz +Andrew Kunz +Piotr Stanczyk +Peter Hillman + +Contributors: +------------- + +Simon Green +Rito Trevino +Josh Pines +Christian Rouet +Rodrigo Damazio +Greg Ward +Joseph Goldstone +Loren Carpenter, Pixar Animation Studios +Nicholas Yue +Yunfeng Bai (ILM) +Pascal Jette (Autodesk) +Karl Rasche, DreamWorks Animation + +Win32 build system: +------------------- + +Nick Porcino +Kimball Thurston + +Win32 port contributors: +------------------------ + +Dustin Graves +Jukka Liimatta +Baumann Konstantin +Daniel Koch +E. Scott Larsen +stephan mantler +Andreas Kahler +Frank Jargstorff +Lutz Latta diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d3e3365 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,260 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +PROJECT (openexr) + +SET(OPENEXR_VERSION_MAJOR "2") +SET(OPENEXR_VERSION_MINOR "2") +SET(OPENEXR_VERSION_PATCH "0") + +SET(OPENEXR_VERSION ${OPENEXR_VERSION_MAJOR}.${OPENEXR_VERSION_MINOR}.${OPENEXR_VERSION_PATCH}) +SET(OPENEXR_VERSION_API ${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR}) + + +# enable the tests +ENABLE_TESTING() + + +# distro building +SET(CPACK_PACKAGE_VERSION_MAJOR "${OPENEXR_VERSION_MAJOR}") +SET(CPACK_PACKAGE_VERSION_MINOR "${OPENEXR_VERSION_MINOR}") +SET(CPACK_PACKAGE_VERSION_PATCH "${OPENEXR_VERSION_PATCH}") +SET(CPACK_SOURCE_GENERATOR "TGZ") +set(CPACK_SOURCE_PACKAGE_FILE_NAME + "${CMAKE_PROJECT_NAME}-${OPENEXR_VERSION}" + ) +set(CPACK_SOURCE_IGNORE_FILES + "/.git*;/.cvs*;${CPACK_SOURCE_IGNORE_FILES}") +INCLUDE ( CPack ) + + + +# Allow the developer to select if Dynamic or Static libraries are built +OPTION (BUILD_SHARED_LIBS "Build Shared Libraries" ON) +OPTION (USE_ZLIB_WINAPI "Use ZLib Win API" OFF) +OPTION (NAMESPACE_VERSIONING "Use Namespace Versioning" ON) + +# Setup osx rpathing +SET (CMAKE_MACOSX_RPATH 1) +SET (BUILD_WITH_INSTALL_RPATH 1) + +ADD_DEFINITIONS ( -DHAVE_CONFIG_H -DILM_IMF_TEST_IMAGEDIR="${CMAKE_SOURCE_DIR}/IlmImfTest/" ) + +INCLUDE_DIRECTORIES ( + ${CMAKE_CURRENT_BINARY_DIR}/config + IlmImf + IlmImfUtil + exrmaketiled + exrenvmap + exrmakepreview + exrmultiview + IlmImfFuzzTest +) + +FIND_PACKAGE(ZLIB REQUIRED) +INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) + +IF (NOT WIN32) + SET ( PTHREAD_LIB pthread ) +ENDIF() + +INCLUDE_DIRECTORIES ( ${ILMBASE_PACKAGE_PREFIX}/include/OpenEXR ) +LINK_DIRECTORIES ( ${ILMBASE_PACKAGE_PREFIX}/lib ) +MESSAGE ( "ILMBASE_PACKAGE_PREFIX = " ${ILMBASE_PACKAGE_PREFIX}) + +SET (LIB_TYPE STATIC) +IF (BUILD_SHARED_LIBS) + # User wants to build Dynamic Libraries, so change the LIB_TYPE variable to CMake keyword 'SHARED' + SET (LIB_TYPE SHARED) + IF (WIN32) + ADD_DEFINITIONS(-DOPENEXR_DLL) + ENDIF () +ENDIF () + +IF (USE_ZLIB_WINAPI) + ADD_DEFINITIONS(-DZLIB_WINAPI) +ENDIF () + +# Test for GCC-style inline asm support with AVX instructions +INCLUDE (CheckCXXSourceCompiles) +CHECK_CXX_SOURCE_COMPILES ( + " + int main() + { + #if defined(__GNUC__) && defined(__SSE2__) + int n = 0; + int eax = 0; + int edx = 0; + __asm__( + \"xgetbv ;\" + \"vzeroupper \" + : \"=a\"(eax), \"=d\"(edx) : \"c\"(n) : ); + #else + #error No GCC style inline asm supported for AVX instructions + #endif + } + " HAVE_GCC_INLINE_ASM_AVX) + +# Check if sysconf(_SC_NPROCESSORS_ONLN) can be used for CPU count +CHECK_CXX_SOURCE_COMPILES ( + " + #include + int main() + { + sysconf(_SC_NPROCESSORS_ONLN); + } + " HAVE_SYSCONF_NPROCESSORS_ONLN) + + +########################## +# OpenEXRConfig.h generation +########################## +IF (WIN32) + FILE ( WRITE ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_COMPLETE_IOMANIP 1\n" ) +ELSEIF (APPLE) + FILE ( WRITE ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_DARWIN 1\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_COMPLETE_IOMANIP 1\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#include \n" ) +ELSE () + # Linux + FILE ( WRITE ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_LINUX_PROCFS 1\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_COMPLETE_IOMANIP 1\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_LARGE_STACK 1\n" ) +ENDIF() + +IF (NAMESPACE_VERSIONING) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM 1\n") + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_NAMESPACE Imf\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_INTERNAL_NAMESPACE Imf_${OPENEXR_VERSION_API}\n\n" ) +ELSE () + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM 0\n") + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_NAMESPACE Imf\n" ) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_INTERNAL_NAMESPACE Imf\n\n" ) +ENDIF () + +FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_VERSION_STRING \"${OPENEXR_VERSION}\"\n" ) +FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_PACKAGE_STRING \"OpenEXR ${OPENEXR_VERSION}\"\n" ) + + +FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h " +#define OPENEXR_VERSION_MAJOR ${OPENEXR_VERSION_MAJOR} +#define OPENEXR_VERSION_MINOR ${OPENEXR_VERSION_MINOR} +#define OPENEXR_VERSION_PATCH ${OPENEXR_VERSION_PATCH} +") + + + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h " +// Version as a single hex number, e.g. 0x01000300 == 1.0.3 +#define OPENEXR_VERSION_HEX ((OPENEXR_VERSION_MAJOR << 24) | \\ + (OPENEXR_VERSION_MINOR << 16) | \\ + (OPENEXR_VERSION_PATCH << 8))\n +") + +IF (HAVE_GCC_INLINE_ASM_AVX) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX 1\n" ) +ENDIF() + +IF (HAVE_SYSCONF_NPROCESSORS_ONLN) + FILE ( APPEND ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h "#define OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN 1\n" ) +ENDIF() + +SET (OPENEXR_LIBSUFFIX "") +SET (ILMBASE_LIBSUFFIX "") +IF (NAMESPACE_VERSIONING) + SET ( OPENEXR_LIBSUFFIX "-${OPENEXR_VERSION_API}" ) + # assume same NAMESPACE_VERSION setting for IlmBase for now + SET ( ILMBASE_LIBSUFFIX "-${OPENEXR_VERSION_API}" ) +ENDIF () + +########################## +# IlmImf library +########################## +ADD_SUBDIRECTORY ( IlmImf ) + +SET_TARGET_PROPERTIES ( IlmImf + PROPERTIES + VERSION 22.0.0 + SOVERSION 22 + OUTPUT_NAME "IlmImf${OPENEXR_LIBSUFFIX}" + ) + +########################## +# IlmImfUtil library +########################## +ADD_SUBDIRECTORY ( IlmImfUtil ) + +SET_TARGET_PROPERTIES ( IlmImfUtil + PROPERTIES + VERSION 22.0.0 + SOVERSION 22 + OUTPUT_NAME "IlmImfUtil${OPENEXR_LIBSUFFIX}" + ) + +########################## +# Example Code +########################## +ADD_SUBDIRECTORY ( IlmImfExamples ) + + +########################## +# Tests +########################## +ADD_SUBDIRECTORY ( IlmImfTest ) +ADD_SUBDIRECTORY ( IlmImfUtilTest ) +ADD_SUBDIRECTORY ( IlmImfFuzzTest ) + + +########################## +# Binaries / Utilities +########################## +ADD_SUBDIRECTORY ( exrheader ) +ADD_SUBDIRECTORY ( exrmaketiled ) +ADD_SUBDIRECTORY ( exrstdattr ) +ADD_SUBDIRECTORY ( exrmakepreview ) +ADD_SUBDIRECTORY ( exrenvmap ) +ADD_SUBDIRECTORY ( exrmultiview ) +ADD_SUBDIRECTORY ( exrmultipart ) + + +########################## +# Installation +########################## + +INSTALL ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/config/OpenEXRConfig.h + DESTINATION + ${CMAKE_INSTALL_PREFIX}/include/OpenEXR + ) + +# Documentation +INSTALL ( FILES + doc/TechnicalIntroduction.pdf + doc/ReadingAndWritingImageFiles.pdf + doc/OpenEXRFileLayout.pdf + doc/MultiViewOpenEXR.pdf + doc/InterpretingDeepPixels.pdf + doc/TheoryDeepPixels.pdf + DESTINATION + ${CMAKE_INSTALL_PREFIX}/share/doc/OpenEXR-${OPENEXR_VERSION} + ) + +# Examples +INSTALL ( FILES + IlmImfExamples/main.cpp + IlmImfExamples/drawImage.cpp + IlmImfExamples/rgbaInterfaceExamples.cpp + IlmImfExamples/rgbaInterfaceTiledExamples.cpp + IlmImfExamples/generalInterfaceExamples.cpp + IlmImfExamples/lowLevelIoExamples.cpp + IlmImfExamples/previewImageExamples.cpp + IlmImfExamples/generalInterfaceTiledExamples.cpp + IlmImfExamples/generalInterfaceTiledExamples.h + IlmImfExamples/drawImage.h + IlmImfExamples/rgbaInterfaceExamples.h + IlmImfExamples/generalInterfaceExamples.h + IlmImfExamples/rgbaInterfaceTiledExamples.h + IlmImfExamples/lowLevelIoExamples.h + IlmImfExamples/previewImageExamples.h + IlmImfExamples/namespaceAlias.h + DESTINATION + ${CMAKE_INSTALL_PREFIX}/share/doc/OpenEXR-${OPENEXR_VERSION}/examples + ) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..6372750 --- /dev/null +++ b/COPYING @@ -0,0 +1,34 @@ +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +Entertainment Company Ltd. Portions contributed and copyright held by +others as indicated. 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 Industrial Light & Magic nor the names of + any other contributors to this software 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/ChangeLog b/ChangeLog new file mode 100644 index 0000000..32a2cae --- /dev/null +++ b/ChangeLog @@ -0,0 +1,704 @@ +Version 2.0.1 + * Temporarily turning off optimisation code path + (Piotr Stanczyk) + * Added additional tests for future optimisation refactoring + (Piotr Stanczyk / Peter Hillman) + * Fixes for StringVectors + (Peter Hillman) + * Additional checks for type mismatches + (Peter Hillman) + * Fix for Composite Deep Scanline + (Brendan Bolles) + +Version 2.0.0 + * Updated Documentation + (Peter Hillman) + * Updated Namespacing mechanism + (Piotr Stanczyk) + * Fixes for succd & predd + (Peter Hillman) + * Fixes for FPE control registers + (Piotr Stanczyk) + * Additional checks and tests on DeepImages, scanlines and tiles + (Peter Hillman) + * Folded in Autodesk read optimisations for RGB(A) files + (Pascal Jette, Peter Hillman) + * Updated the bootstrap scripts to use libtoolize if glibtoolize isn't available on darwin. + (Nick Rasmussen) + * Numerous minor fixes, missing includes etc + +Version 2.0.0.beta.1: +* Please read the separate file for v2 additions and changes. + * Added git specific files + (Piotr Stanczyk) + * Updated the so verison to 20 + (Piotr Stanczyk) + * Initial use of the CMake build system + (Nicholas Yue) + +Version 1.7.1: + * Updated the .so verison to 7. + (Piotr Stanczyk) + +Version 1.7.0: + * Added support for targetting builds on 64bit Windows and minimising + number of compiler warnings on Windows. Thanks to Ger Hobbelt for his + contributions to CreateDLL. + (Ji Hun Yu) + * Added new atttribute types: + M33dAttribute 3x3 double-precision matrix + M44dAttribute 4x4 double-precision matrix + V2d 2D double-precision vector + V3d 3D double-precision vector + (Florian Kainz) + * Bug fix: crash when reading a damaged image file (found + by Apple). An exception thrown inside the PIZ Huffman + decoder bypasses initialization of an array of pointers. + The uninitialized pointers are later passed to operator + delete. + (Florian Kainz) + * Bug fix: crash when reading a damaged image file (found by + Apple). Computing the size of input certain buffers may + overflow and wrap around to a small number, later causing + writes beyond the end of the buffer. + (Florian Kainz) + * In the "Technical Introduction" document, added + Premultiplied vs. Un-Premulitiplied Color section: + states explicitly that pixels with zero alpha and non-zero + RGB are allowed, points out that preserving such a pixel can + be a problem in application programs with un-premultiplied + internal image representations. + (Florian Kainz) + * exrenvmap improvements: + - New command line flags set the type of the input image to + latitude-longitude map or cube-face map, overriding the + envmap attribute in the input file header. + - Cube-face maps can now be assembled from or split into six + square sub-images. + - Converting a cube-face map into a new cube-face map with + the same face size copies the image instead of resampling + it. This avoids blurring when a cube-face map is assembled + from or split into sub-images. + (Florian Kainz) + * Updated standard chromaticities in ImfAcesFile.cpp to match + final ACES (Academy Color Encoding Specification) document. + (Florian Kainz) + * Added worldToCamera and worldToNDC matrices to + ImfStandardAttributes.h (Florian Kainz) + * Increased the maximum length of attribute and channel names + from 31 to 255 characters. For files that do contain names + longer than 31 characters, a new LONG_NAMES_FLAG in the fil + version number is set. This flag causes older versions of + the IlmImf library (1.6.1 and earlier) to reject files with + long names. Without the flag, older library versions would + mis-interpret files with long names as broken. + (Florian Kainz) + * Reading luminance/chroma-encoded files via the RGBA + interface is faster: buffer padding avoids cache thrashing + for certain image sizes, redundant calls to saturation() + have been eliminated. + (Mike Wall) + * Added "hemispherical blur" option to exrenvmap. + (Florian Kainz) + * Added experimental version of I/O classes for ACES file + format (restricted OpenEXR format with special primaries + and white point); added exr2aces file converter. + (Florian Kainz) + * Added new constructors to classes Imf::RgbaInputFile and + Imf::TiledRgbaInputFile. The new constructors have a + layerName parameter, which allows the caller to specify + which layer of a multi-layer or multi-view image will + be read. + (Florian Kainz) + * A number of member functions in classes Imf::Header, + Imf::ChannelList and Imf::FrameBuffer have parameters + of type "const char *". Added equivalent functions that + take "const std::string &" parameters. + (Florian Kainz) + * Added library support for Weta Digital multi-view images: + StringVector attribute type, multiView standard attribute + of type StringVector, utility functions related to grouping + channels into separate views. + (Peter Hillman, Florian Kainz) + +Version 1.6.1: + * Removed Windows .suo files from distribution. + (Eric Wimmer) + * Bug fix: crashes, memory leaks and file descriptor leaks + when reading damaged image files (some reported by Apple, + others found by running IlmImfFuzzTest). + (Florian Kainz) + * Added new IlmImfFuzzTest program to test how resilient the + IlmImf library is with respect broken input files: the program + first damages OpenEXR files by partially overwriting them with + random data; then it tries to read the damaged files. If all + goes well, the program doesn't crash. + (Florian Kainz) + +Version 1.6.0: + * Bumped DSO version number to 6.0 + (Florian Kainz) + * Added new standard attributes related to color rendering with + CTL (Color Transformation Language): renderingTransform, + lookModTransform and adoptedNeutral. + (Florian Kainz) + * Bug fix: for pixels with luminance near HALF_MIN, conversion + from RGB to luminance/chroma produces NaNs and infinities + (Florian Kainz) + * Bug fix: excessive desaturation of small details with certain + colors after repeatedly loading and saving luminance/chroma + encoded images with B44 compression. + (Florian Kainz) + * Added B44A compression, a minor variation of B44: in most cases, + the compression ratio is 2.28:1, the same as with B44, but in + uniform image areas where all pixels have the same value, the + compression ratio increases to 10.66:1. Uniform areas occur, for + example, in an image's alpha channel, which typically contains + large patches that are solid black or white, or in computer- + generated images with a black background. + (Florian Kainz) + * Added flag to configure.ac to enable or disable use of large + auto arrays in the IlmImf library. Default is "enable" for + Linux, "disable" for everything else. + (Darby Johnston, Florian Kainz) + * corrected version number on dso's (libtool) - now 5.0 + * Separated ILMBASE_LDFLAGS and ILMBASE_LIBS so that test programs + can link with static libraries properly + * eliminated some warning messages during install + (Andrew Kunz) + +Version 1.5.0: + * reorganized packaging of OpenEXR libraries to facilitate + integration with CTL. Now this library depends on the library + IlmBase. Some functionality has been moved into OpenEXR_Viewers, + which depends on two other libraries, CTL and OpenEXR_CTL. + Note: previously there were separate releases of + OpenEXR-related plugins for Renderman, Shake and Photoshop. + OpenEXR is supported natively by Rendermand and Photoshop, so + these plugins will not be supported for this or future + versions of OpenEXR. + (Andrew Kunz) + * New build scripts for Linux/Unix + (Andrew Kunz) + * New Windows project files and build scripts + (Kimball Thurston) + * float-to-half conversion now preserves the sign of float zeroes + and of floats that are so small that they become half zeroes. + (Florian Kainz) + * Bug fix: Imath::Frustum::planes() returns incorrect planes + if the frustum is orthogonal. + (Philip Hubbard) + * added new framesPerSecond optional standard attribute + (Florian Kainz) + * Imath cleanup: + - Rewrote function Imath::Quat::setRotation() to make it + numerically more accurate, added confidence tests + - Rewrote function Imath::Quat::slerp() using Don Hatch's + method, which is numerically more accurate, added confidence + tests. + - Rewrote functions Imath::closestPoints(), Imath::intersect(), + added confidence tests. + - Removed broken function Imath::nearestPointOnTriangle(). + - Rewrote Imath::drand48(), Imath::lrand48(), etc. to make + them functionally identical with the Unix/Linux versions + of drand48(), lrand48() and friends. + - Replaced redundant definitions of Int64 in Imath and IlmImf + with a single definition in ImathInt64.h. + (Florian Kainz) + * exrdisplay: if the file's and the display's RGB chromaticities + differ, the pixels RGB values are transformed from the file's + to the display's RGB space. + (Florian Kainz) + * Added new lossy B44 compression method. HALF channels are + compressed with a fixed ratio of 2.28:1. UINT and FLOAT + channels are stored verbatim, without compression. + (Florian Kainz) + +Version 1.4.0a: + * Fixed the ReleaseDLL targets for Visual Studio 2003. + (Barnaby Robson) + +Version 1.4.0: + * Production release. + * Bug Fix: calling setFrameBuffer() for every scan line + while reading a tiled file through the scan line API + returns bad pixel data. (Paul Schneider, Florian Kainz) + +Version 1.3.1: + * Fixed the ReleaseDLL targets for Visual Studio 2005. + (Nick Porcino, Drew Hess) + * Fixes/enhancements for createDLL. + (Nick Porcino) + +Version 1.3.0: + * Removed openexr.spec file, it's out of date and broken to + boot. + (Drew Hess) + * Support for Visual Studio 2005. + (Drew Hess, Nick Porcino) + * When compiling against OpenEXR headers on Windows, you + no longer need to define any HAVE_* or PLATFORM_* + macros in your projects. If you are using any OpenEXR + DLLs, however, you must define OPENEXR_DLL in your + project's preprocessor directives. + (Drew Hess) + * Many fixes to the Windows VC7 build system. + (Drew Hess, Nick Porcino) + * Support for building universal binaries on OS X 10.4. + (Drew Hess, Paul Schneider) + * Minor configure.ac fix to accomodate OS X's automake. + (Drew Hess) + * Removed CPU-specific optimizations from configure.ac, + autoconf's guess at the CPU type isn't very useful, + anyway. Closes #13429. + (Drew Hess) + * Fixed quoting for tests in configure.ac. Closes #13428. + (Drew Hess) + * Use host specification instead of target in configure.ac. + Closes #13427. + (Drew Hess) + * Fix use of AC_ARG_ENABLE in configure.ac. Closes + #13426. + (Drew Hess) + * Removed workaround for OS X istream::read bug. + (Drew Hess) + * Added pthread support to OpenEXR pkg-config file. + (Drew Hess) + * Added -no-undefined to LDFLAGS and required libs to LIBADD + for library projects with other library dependencies, per + Rex Dieter's patch. + (Drew Hess) + * HAVE_* macros are now defined in the OpenEXRConfig.h header + file instead of via compiler flags. There are a handful of + public headers which rely on the value of these macros, + and projects including these headers have previously needed + to define the same macros and values as used by OpenEXR's + 'configure', which is bad form. Now 'configure' writes these + values to the OpenEXRConfig.h header file, which is included + by any OpenEXR source files that need these macros. This + method of specifying HAVE_* macros guarantees that projects + will get the proper settings without needing to add compile- + time flags to accomodate OpenEXR. Note that this isn't + implemented properly for Windows yet. + (Drew Hess) + * Platform cleanups: + - No more support for IRIX or OSF1. + - No more explicit support for SunOS, because we have no way to + verify that it's working. I suspect that newish versions of + SunOS will just work out of the box, but let me know if not. + - No more PLATFORM_* macros (vestiges of the ILM internal build + system). PLATFORM_DARWIN_PPC is replaced by HAVE_DARWIN. + PLATFORM_REDHAT_IA32 (which was only used in IlmImfTest) is + replaced by HAVE_LINUX_PROCFS. + - OS X 10.4, which is the minimum version we're going to support + with this version, appears to have support for nrand48 and friends, + so no need to use the Imath-supplied version of them anymore. + (Drew Hess) + * No more PLATFORM_WINDOWS or PLATFORM_WIN32, replace with + proper standard Windows macros. (Drew Hess) + * Remove support for gcc 2.95, no longer supported. (Drew Hess) + * Eliminate HAVE_IOS_BASE macro, OpenEXR now requires support for + ios_base. (Drew Hess) + * Eliminate HAVE_STL_LIMITS macro, OpenEXR now requires the ISO C++ + header. (Drew Hess) + * Use double quote-style include dirctives for OpenEXR + includes. (Drew Hess) + * Added a document that gives an overview of the on-disk + layout of OpenEXR files (Florian Kainz) + * Added sections on layers and on memory-mapped file input + to the documentation. (Florian Kainz) + * Bug fix: reading an incomplete file causes a deadlock while + waiting on a semaphore. (Florian Kainz) + * Updated documentation (ReadingAndWritingImageFiles.sxw) and + sample code (IlmImfExamples): + Added a section about multi-threading, updated section on + thread-safety, changed documentation and sample code to use + readTiles()/writeTiles() instead of readTile()/writeTile() + where possible, mentioned that environment maps contain + redundant pixels, updated section on testing if a file is + an OpenEXR file. + (Florian Kainz) + * Multi-threading bug fixes (exceptions could be thrown + multiple times, some operations were not thread safe), + updated some comments, added comments, more multithreaded + testing. + (Florian Kainz) + * Added multi-threading support: multiple threads + cooperate to read or write a single OpenEXR file. + (Wojciech Jarosz) + * Added operator== and operator!= to Imath::Frustum. + (Andre Mazzone) + * Bug fix: Reading a PIZ-compressed file with an invalid + Huffman code table caused crashes by indexing off the + end of an array. + (Florian Kainz) + +Version 1.2.2: + * Updated README to remove option for building with Visual C++ 6.0. + (Drew Hess) + * Some older versions of gcc don't support a full iomanip + implemenation; check for this during configuration. + (Drew Hess) + * Install PDF versions of documentation, remove old/out-of-date + HTML documentation. (Florian Kainz) + * Removed vc/vc6 directory; Visual C++ 6.0 is no longer + supported. (Drew Hess) + * Updated README.win32 with details of new build system. + (Florian Kainz, Drew Hess) + * New build system for Windows / Visual C++ 7 builds both + static libraries and DLLs. + (Nick Porcino) + * Removed Imath::TMatrix and related classes, which are not + used anywhere in OpenEXR. + (Florian Kainz) + * Added minimal support for "image layers" to class Imf::ChannelList + (Florian Kainz) + * Added new isComplete() method to InputFile, TiledInputFile + etc., that checks if a file is complete or if any pixels + are missing (for example, because writing the file was + aborted prematurely). + (Florian Kainz) + * Exposed staticInitialize() function in ImfHeader.h in order + to allow thread-safe library initialization in multithreaded + programs. + (Florian Kainz) + * Added a new "time code" attribute + (Florian Kainz) + * exrmaketiled: when a MIPMAP_LEVELS or RIPMAP_LEVELS image + is produced, low-pass filtering takes samples outside the + image's data window. This requires extrapolating the image. + The user can now specify how the image is extrapolated + horizontally and vertically (image is surrounded by black / + outermost row of pixels repeats / entire image repeats / + entire image repeats, every other copy is a mirror image). + exrdisplay: added option to swap the top and botton half, + and the left and right half of an image, so that the image's + four corners end up in the center. This is useful for checking + the seams of wrap-around texture map images. + IlmImf library: Added new "wrapmodes" standard attribute + to indicate the extrapolation mode for MIPMAP_LEVELS and + RIPMAP_LEVELS images. + (Florian Kainz) + * Added a new "key code" attribute to identify motion picture + film frames. + (Florian Kainz) + * Removed #include from ImfAttribute.h, ImfHeader.h + and ImfXdr.h so that including header files such as + ImfInputFile.h no longer defines ASSERT and THROW macros, + which may conflict with similar macros defined by + application programs. + (Florian Kainz) + * Converted HTML documentation to OpenOffice format to + make maintaining the documents easier: + api.html -> ReadingAndWritingImageFiles.sxw + details.html -> TechnicalIntroduction.sxw + (Florian Kainz) + +Version 1.2.1: + * exrenvmap and exrmaketiled use slightly less memory + (Florian Kainz) + * Added functions to IlmImf for quickly testing if a file + is an OpenEXR file, and whether the file is scan-line + based or tiled. (Florian Kainz) + * Added preview image examples to IlmImfExamples. Added + description of preview images and environment maps to + docs/api.html (Florian Kainz) + * Bug fix: PXR24 compression did not work properly for channels + with ySampling != 1. + (Florian Kainz) + * Made template become template for + the transform(ObjectS, ObjectT) methods. This was done to allow + for differing templated objects to be passed in e.g. say a + Box> and a Matrix44, where S=float and T=double. + (Jeff Yost, Arkell Rasiah) + * New method Matrix44::setTheMatrix(). Used for assigning a + M44f to a M44d. (Jeff Yost, Arkell Rasiah) + * Added convenience Color typedefs for half versions of Color3 + and Color4. Note the Makefile.am for both Imath and ImathTest + have been updated with -I and/or -L pathing to Half. + (Max Chen, Arkell Rasiah) + * Methods equalWithAbsError() and equalWithRelError() are now + declared as const. (Colette Mullenhoff, Arkell Rasiah) + * Fixes for gcc34. Mainly typename/template/using/this syntax + correctness changes. (Nick Ramussen, Arkell Rasiah) + * Added Custom low-level file I/O examples to IlmImfExamples + and to the docs/api.html document. (Florian Kainz) + * Eliminated most warnings messages when OpenEXR is compiled + with Visual C++. The OpenEXR code uses lots of (intentional + and unintended) implicit type conversions. By default, Visual + C++ warns about almost all of them. Most implicit conversions + have been removed from the .h files, so that including them + should not generate warnings even at warning level 3. Most + .cpp files are now compiled with warning level 1. + (Florian Kainz) + +Version 1.2.0: + * Production-ready release. + * Disable long double warnings on OS X. (Drew Hess) + * Add new source files to VC7 IlmImfDll target. (Drew Hess) + * Iex: change the way that APPEND_EXC and REPLACE_EXC modify + their what() string to work around an issue with Visual C++ + 7.1. (Florian Kainz, Nick Porcino) + * Bumped OpenEXR version to 1.2 and .so versions to 2.0.0 in + preparation for the release. (Drew Hess) + * Imath: fixed ImathTMatrix.h to work with gcc 3.4. (Drew Hess) + * Another quoting fix in openexr.m4. (Drew Hess) + * Quoting fix in acinclude.m4 for automake 1.8. (Brad Hards) + * Imath: put inline at beginning of declaration in ImathMatrix.h + to fix a warning. (Ken McGaugh) + * Imath: made Vec equalWith*Error () methods const. + * Cleaned up compile-time Win32 support. (Florian Kainz) + * Bug fix: Reading a particular broken PIZ-compressed file + caused crashes by indexing off the end of an array. + (Florian Kainz) + +Version 1.1.1: + * Half: operator= and variants now return by reference rather + than by value. This brings half into conformance with + built-in types. (Drew Hess) + * Half: remove copy constructor, let compiler supply its + own. This improves performance up to 25% on some + expressions using half. (Drew Hess) + * configure: don't try to be fancy with CXXFLAGS, just use + what the user supplies or let configure choose a sensible + default if CXXFLAGS is not defined. + * IlmImf: fixed a bug in reading scanline files on big-endian + architectures. (Drew Hess) + * exrmaketiled: Added an option to select compression type. + (Florian Kainz) + * exrenvmap: Added an option to select compression type. + (Florian Kainz) + * exrdisplay: Added some new command-line options. (Florian Kainz) + * IlmImf: Added Pixar's new "slightly lossy" image compression + method. The new method, named PXR24, preserves HALF and + UINT data without loss, but FLOAT pixels are converted to + a 24-bit representation. PXR24 appears to compress + FLOAT depth buffers very well without losing much accuracy. + (Loren Carpenter, Florian Kainz) + * Changed top-level LICENSE file to allow for other copyright + holders for individual files. + * IlmImf: TILED FILE FORMAT CHANGE. TiledOutputFile was + incorrectly interleaving channels and scanlines before + passing pixel data to a compressor. The lossless compressors + still work, but lossy compressors do not. Fix the bug by + interleaving channels and scanlines in tiled files in the + same way as ScanLineOutputFile does. Programs compiled with + the new version of IlmImf cannot read tiled images produced + with version 1.1.0. (Florian Kainz) + * IlmImf: ImfXdr.h fix for 64-bit architectures. (Florian Kainz) + * IlmImf: OpenEXR now supports YCA (luminance/chroma/alpha) + images with subsampled chroma channels. When an image + is written with the RGBA convenience interface, selecting + WRITE_YCA instead of WRITE_RGBA causes the library to + convert the pixels to YCA format. If WRITE_Y is selected, + only luminance is stored in the file (for black and white + images). When an image file is read with the RGBA convenience + interface, YCA data are automatically converted back to RGBA. + (Florian Kainz) + * IlmImf: speed up reading tiled files as scan lines. + (Florian Kainz) + * Half: Fixed subtle bug in Half where signaling float NaNs + were being converted to inf in half. (Florian Kainz) + * gcc 3.3 compiler warning cleanups. (various) + * Imath: ImathEuler.h fixes for gcc 3.4. (Garrick Meeker) + +Version 1.1.0: + * Added new targets to Visual C++ .NET 2003 project + for exrmaketiled, exrenvmap, exrmakepreview, and exrstdattr. + (Drew Hess) + * A few assorted Win32 fixes for Imath. (Drew Hess) + * GNU autoconf builds now produce versioned libraries. + This release is 1:0:0. (Drew Hess) + * Fixes for Visual C++ .NET 2003. (Paul Schneider) + * Updated Visual C++ zlib project file to zlib 1.2.1. + (Drew Hess) + * exrdisplay: Fixed fragment shader version. (Drew Hess) + * *Test: Fixed some compiler issues. (Drew Hess) + * Imath: Handle "restrict" keyword properly. (Drew Hess) + * IlmImfExamples: Updated to latest versions of example + source code, includes tiling and multi-res images. + (Florian Kainz) + * exrmakepreview: A new utility to create preview images. + (Florian Kainz) + * exrenvmap: A new utility to create OpenEXR environment + maps. (Florian Kainz) + * exrstdattr: A new utility to modify standard + attributes. (Florian Kainz) + * Updated exrheader to print level rounding mode and + preview image size. (Florian Kainz) + * Updated exrmaketiled to use level rounding mode. + (Florian Kainz) + * IlmImf: Changed the orientation of lat-long envmaps to + match typical panoramic camera setups. (Florian Kainz) + * IlmImf: Fixed a bug where partially-completed files with + DECREASING_Y could not be read. (Florian Kainz) + * IlmImf: Added support for selectable rounding mode (up/down) + when generating multiresolution files. (Florian Kainz) + * exrdisplay: Support for tiled images, mip/ripmaps, preview + images, and display windows. (Florian Kainz, Drew Hess) + * exrmaketiled: A new utility which generates tiled + versions of OpenEXR images. (Florian Kainz) + * IlmImf: Changed Imf::VERSION to Imf::EXR_VERSION to + work around problems with autoconf VERSION macro + conflict. (Drew Hess) + * exrheader: Support for tiles, mipmaps, environment + maps. (Florian Kainz) + * IlmImf: Environment map support. (Florian Kainz) + * IlmImf: Abstracted stream I/O support. (Florian Kainz) + * IlmImf: Support for tiled and mip/ripmapped files; + requires new file format. (Wojciech Jarosz, Florian Kainz) + * Imath: TMatrix*, generic 2D matricies and algorithms. + (Francesco Callari) + * Imath: major quaternions cleanup. (Cary Phillips) + * Imath: added GLBegin, GLPushAttrib, GLPushMatrix objects + for automatic cleanup on exceptions. (Cary Phillips) + * Imath: removed implicit scalar->vector promotions and vector + comparisons. (Nick Rasmussen) + +Version 1.0.7: + * Fixed a typo in one of the IlmImfTest tests. (Paul Schneider) + * Fixed a bug in exrdisplay that causes the image to display + as all black if there's a NaN or infinity in an OpenEXR + image. (Florian Kainz) + * Updated exrheader per recent changes to IlmImf library. + (Florian Kainz) + * Changed an errant float to a T in ImathFrame.h nextFrame(). + (Cary Phillips) + * Support for new "optional standard" attributes + (chromaticities, luminance, comments, etc.). + (Florian Kainz, Greg Ward, Joseph Goldstone) + * Fixed a buffer overrun in ImfOpaqueAttribute. (Paul Schneider) + * Added new function, isImfMagic (). (Florian Kainz) + +Version 1.0.6: + * Added README.win32 to disted files. + * Fixed OpenEXR.pc.in pkg-config file, OpenEXR now works + with pkg-config. + * Random fixes to readme files for new release. + * Fixed openexr.m4, now looks in /usr by default. + * Added Visual Studio .NET 2003 "solution." + * Fixes for Visual Studio .NET 2003 w/ Microsoft C++ compiler. + (Various) + * Random Imath fixes and enhancements. Note that + extractSHRT now takes an additional optional + argument, see ImathMatrixAlgo.h for details. (Various) + * Added Wojciech Jarosz to AUTHORS file. + * Added test cases for uncompressed case, preview images, + frame buffer type conversion. (Wojciech Jarosz, + Florian Kainz) + * Fix a bug in IlmImf where uncompressed data doesn't get + read/written correctly. (Wojciech Jarosz) + * Added support for preview images and preview image + attributes (thumbnail images) in IlmImf. (Florian Kainz) + * Added support for automatic frame buffer type conversion + in IlmImf. (Florian Kainz) + * Cleaned up some compile-time checks. + * Added HalfTest unit tests. + * [exrdisplay] Download half framebuffer to texture memory + instead of converting to float first. Requires latest + Nvidia drivers. + +Version 1.0.5: + * Fixed IlmImf.dll to use static runtime libs (Andreas). + * Added exrheader project to Visual Studio 6.0 workspace. + * Added some example code showing how to use the IlmImf library. + (Florian) + * Use DLL runtime libs for Win32 libraries rather than static + runtime libs. + * Add an exrdisplay_fragshader project to the Visual Studio 6.0 + workspace to enable fragment shaders in Win32. + * Add an IlmImfDll project to the Visual Studio 6.0 workspace. + * In Win32, export the ImfCRgbaFile C interface via a DLL so + that Visual C++ 6.0 users can link against an Intel-compiled + IlmImf. (Andreas Kahler) + * Use auto_ptr in ImfAutoArray on Win32, it doesn't like large + automatic stacks. + * Performance improvements in PIZ decoding, between + 20 and 60% speedup on Athlon and Pentium 4 systems. + (Florian) + * Updated the README with various information, made + some cosmetic changes for readability. + * Added fragment shader support to exrdisplay. + * Bumped the version to 1.0.5 in prep for release. + * Updated README and README.OSX to talk about CodeWarrior + project files. + * Incorporated Rodrigo Damazio's patch for an openexr.m4 + macro file and an openexr.spec file for building RPMs. + * Small change in ImfAttribute.h to make IlmImf compile with gcc 2.95. + * Updated ImfDoubleAttribute.h for Codewarrior on MacOS. + * Added exrheader utility. + * Update to AUTHORS file. + * Added a README.win32 file. + * Added project files for Visual Studio 6.0. + * Initial Win32 port. Requires Visual Studio 6.0 and Intel C++ + compiler version 7.0. + * Added new intersectT method in ImathSphere.h + * Fixed some bugs in ImathQuat.h + * Proper use of fltk-config to get platform-specific FLTK + compile- and link-time flags. + * exrdisplay uses Imath::Math::pow instead of powf now. + powf is not availble on all platforms. + * Roll OS X "hack" into the source until Apple fixes their + istream implementation. + +Version 1.0.4: + * OpenEXR is now covered by a modified BSD license. See LICENSE + for the new terms. + +Version 1.0.3: + + * OpenEXR is now in sf.net CVS. + * Imf::Xdr namespace cleanups. + * Some IlmImfTest cleanups for OS X. + * Use .cpp extension in exrdisplay sources. + * Iex cleanups. + * Make IlmImf compile with Metrowerks Codewarrior. + * Change large automatic stacks in ImfHuf.C to auto_ptrs allocated + off the heap. MacOS X default stack size isn't large enough. + * std::ios fix for MacOS X in ImfInputFile.C. + * Added new FP predecessor/successor functions to Imath, added + tests to ImathTest + * Fixed a bug in Imath::extractSHRT for 3x3 matricies when + exactly one of the original scaling factors is negative, updated + ImathTest to check this case. + * Install include files when 'make install' is run. + * exrdisplay requires fltk 1.1+ now in an effort to support + a MacOS X display program (fltk 1.1 runs on OS X), though this + is untested. + * renamed configure.in to configure.ac + * Removed some tests from IexTest that are no longer used. + * Removed ImfHalfXdr.h, it's not used anymore. + * Revamped the autoconf system, added some compile-time + optimizations, a pkgconfig target, and some maintainer-specific + stuff. + +Version 1.0.2: + + * More OS X fixes in Imath, IlmImf and IlmImfTest. + * Imath updates. + * Fixed a rotation bug in Imath + +Version 1.0.1: + + * Used autoconf 2.53 and automake 1.6 to generate build environment. + * Makefile.am cleanups. + * OS X fixes. + * removed images directory (now distributed separately). + +Version 1.0: + + * first official release. + * added some high-level documentation, removed the old OpenEXR.html + documentation. + * fixed a few nagging build problems. + * bumped IMV_VERSION_NUMBER to 2 + +Version 0.9: + + * added exrdisplay viewer application. + * cleanup _data in Imf::InputFile and Imf::OutputFile constructors. + * removed old ILM copyright notices. + +Version 0.8: + + * Initial release. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..06d1f09 --- /dev/null +++ b/INSTALL @@ -0,0 +1,2 @@ +See the README file for instructions on how to build OpenEXR from +source. diff --git a/IlmImf/CMakeLists.txt b/IlmImf/CMakeLists.txt new file mode 100644 index 0000000..18d90ed --- /dev/null +++ b/IlmImf/CMakeLists.txt @@ -0,0 +1,265 @@ +# yue.nicholas@gmail.com + +SET(CMAKE_INCLUDE_CURRENT_DIR 1) + +ADD_EXECUTABLE ( b44ExpLogTable + b44ExpLogTable.cpp +) + +TARGET_LINK_LIBRARIES ( b44ExpLogTable + Half + Iex${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} +) + +ADD_CUSTOM_COMMAND ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/b44ExpLogTable.h + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/b44ExpLogTable > ${CMAKE_CURRENT_BINARY_DIR}/b44ExpLogTable.h + DEPENDS b44ExpLogTable +) + +ADD_EXECUTABLE ( dwaLookups + dwaLookups.cpp +) + +TARGET_LINK_LIBRARIES ( dwaLookups + Half + Iex${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} +) + +ADD_CUSTOM_COMMAND ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dwaLookups.h + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/dwaLookups > ${CMAKE_CURRENT_BINARY_DIR}/dwaLookups.h + DEPENDS dwaLookups +) + +SET ( ILMIMF_SRCS + ImfAttribute.cpp + ImfBoxAttribute.cpp + ImfCRgbaFile.cpp + ImfChannelList.cpp + ImfChannelListAttribute.cpp + ImfFloatAttribute.cpp + ImfFrameBuffer.cpp + ImfHeader.cpp + ImfIO.cpp + ImfInputFile.cpp + ImfIntAttribute.cpp + ImfLineOrderAttribute.cpp + ImfMatrixAttribute.cpp + ImfOpaqueAttribute.cpp + ImfOutputFile.cpp + ImfRgbaFile.cpp + ImfStringAttribute.cpp + ImfVecAttribute.cpp + ImfHuf.cpp + ImfThreading.cpp + ImfWav.cpp + ImfLut.cpp + ImfCompressor.cpp + ImfRleCompressor.cpp + ImfZipCompressor.cpp + ImfPizCompressor.cpp + ImfB44Compressor.cpp + ImfDwaCompressor.cpp + ImfMisc.cpp + ImfCompressionAttribute.cpp + ImfDoubleAttribute.cpp + ImfConvert.cpp + ImfPreviewImage.cpp + ImfPreviewImageAttribute.cpp + ImfVersion.cpp + ImfChromaticities.cpp + ImfChromaticitiesAttribute.cpp + ImfKeyCode.cpp + ImfKeyCodeAttribute.cpp + ImfTimeCode.cpp + ImfTimeCodeAttribute.cpp + ImfRational.cpp + ImfRationalAttribute.cpp + ImfFramesPerSecond.cpp + ImfStandardAttributes.cpp + ImfStdIO.cpp + ImfEnvmap.cpp + ImfEnvmapAttribute.cpp + ImfScanLineInputFile.cpp + ImfTiledInputFile.cpp + ImfTiledMisc.cpp + ImfTiledOutputFile.cpp + ImfTiledRgbaFile.cpp + ImfTileDescriptionAttribute.cpp + ImfTileOffsets.cpp + ImfRgbaYca.cpp + ImfPxr24Compressor.cpp + ImfTestFile.cpp + ImfStringVectorAttribute.cpp + ImfMultiView.cpp + ImfAcesFile.cpp + ImfMultiPartOutputFile.cpp + ImfGenericOutputFile.cpp + ImfOutputPartData.cpp + ImfMultiPartInputFile.cpp + ImfGenericInputFile.cpp + ImfPartType.cpp + ImfInputPartData.cpp + ImfOutputPart.cpp + ImfTiledOutputPart.cpp + ImfInputPart.cpp + ImfTiledInputPart.cpp + ImfDeepScanLineInputPart.cpp + ImfDeepScanLineOutputPart.cpp + ImfDeepScanLineInputFile.cpp + ImfDeepScanLineOutputFile.cpp + ImfDeepTiledInputPart.cpp + ImfDeepTiledOutputPart.cpp + ImfDeepTiledInputFile.cpp + ImfDeepTiledOutputFile.cpp + ImfDeepFrameBuffer.cpp + ImfDeepCompositing.cpp + ImfCompositeDeepScanLine.cpp + ImfDeepImageStateAttribute.cpp + ImfFastHuf.cpp + ImfFloatVectorAttribute.cpp + ImfRle.cpp + ImfSystemSpecific.cpp + ImfZip.cpp +) + +IF (BUILD_SHARED_LIBS) + ADD_DEFINITIONS(-DILMIMF_EXPORTS) +ENDIF() + +ADD_LIBRARY ( IlmImf ${LIB_TYPE} + ${ILMIMF_SRCS} +) + +TARGET_LINK_LIBRARIES ( IlmImf + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} ${ZLIB_LIBRARIES} +) + + +ADD_DEPENDENCIES ( IlmImf b44ExpLogTable ) + +SET_SOURCE_FILES_PROPERTIES ( + ImfB44Compressor.cpp + PROPERTIES + OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/b44ExpLogTable.h +) + + +ADD_DEPENDENCIES ( IlmImf dwaLookups ) + +SET_SOURCE_FILES_PROPERTIES ( + ImfDwaCompressor.cpp + PROPERTIES + OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dwaLookups.h +) + +# Libraries + +INSTALL ( TARGETS + IlmImf + DESTINATION + ${CMAKE_INSTALL_PREFIX}/lib +) + +# Headers +INSTALL ( FILES + ImfForward.h + ImfExport.h + ImfAttribute.h + ImfBoxAttribute.h + ImfCRgbaFile.h + ImfChannelList.h + ImfChannelListAttribute.h + ImfCompressionAttribute.h + ImfDoubleAttribute.h + ImfFloatAttribute.h + ImfFrameBuffer.h + ImfHeader.h + ImfIO.h + ImfInputFile.h + ImfIntAttribute.h + ImfLineOrderAttribute.h + ImfMatrixAttribute.h + ImfOpaqueAttribute.h + ImfOutputFile.h + ImfRgbaFile.h + ImfStringAttribute.h + ImfVecAttribute.h + ImfHuf.h + ImfWav.h + ImfLut.h + ImfArray.h + ImfCompression.h + ImfLineOrder.h + ImfName.h + ImfPixelType.h + ImfVersion.h + ImfXdr.h + ImfConvert.h + ImfPreviewImage.h + ImfPreviewImageAttribute.h + ImfChromaticities.h + ImfChromaticitiesAttribute.h + ImfKeyCode.h + ImfKeyCodeAttribute.h + ImfTimeCode.h + ImfTimeCodeAttribute.h + ImfRational.h + ImfRationalAttribute.h + ImfFramesPerSecond.h + ImfStandardAttributes.h + ImfEnvmap.h + ImfEnvmapAttribute.h + ImfInt64.h + ImfRgba.h + ImfTileDescription.h + ImfTileDescriptionAttribute.h + ImfTiledInputFile.h + ImfTiledOutputFile.h + ImfTiledRgbaFile.h + ImfRgbaYca.h + ImfTestFile.h + ImfThreading.h + ImfB44Compressor.h + ImfStringVectorAttribute.h + ImfMultiView.h + ImfAcesFile.h + ImfMultiPartOutputFile.h + ImfGenericOutputFile.h + ImfMultiPartInputFile.h + ImfGenericInputFile.h + ImfPartType.h + ImfPartHelper.h + ImfOutputPart.h + ImfTiledOutputPart.h + ImfInputPart.h + ImfTiledInputPart.h + ImfDeepScanLineOutputFile.h + ImfDeepScanLineOutputPart.h + ImfDeepScanLineInputFile.h + ImfDeepScanLineInputPart.h + ImfDeepTiledInputFile.h + ImfDeepTiledInputPart.h + ImfDeepTiledOutputFile.h + ImfDeepTiledOutputPart.h + ImfDeepFrameBuffer.h + ImfDeepCompositing.h + ImfCompositeDeepScanLine.h + ImfNamespace.h + ImfMisc.h + ImfDeepImageState.h + ImfDeepImageStateAttribute.h + ImfFloatVectorAttribute.h + DESTINATION + ${CMAKE_INSTALL_PREFIX}/include/OpenEXR +) + diff --git a/IlmImf/ImfAcesFile.cpp b/IlmImf/ImfAcesFile.cpp new file mode 100644 index 0000000..8f33fb0 --- /dev/null +++ b/IlmImf/ImfAcesFile.cpp @@ -0,0 +1,633 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// ACES image file I/O. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +const Chromaticities & +acesChromaticities () +{ + static const Chromaticities acesChr + (V2f (0.73470, 0.26530), // red + V2f (0.00000, 1.00000), // green + V2f (0.00010, -0.07700), // blue + V2f (0.32168, 0.33767)); // white + + return acesChr; +} + + +class AcesOutputFile::Data +{ + public: + + Data(); + ~Data(); + + RgbaOutputFile * rgbaFile; +}; + + +AcesOutputFile::Data::Data (): + rgbaFile (0) +{ + // empty +} + + +AcesOutputFile::Data::~Data () +{ + delete rgbaFile; +} + + +namespace { + +void +checkCompression (Compression compression) +{ + // + // Not all compression methods are allowed in ACES files. + // + + switch (compression) + { + case NO_COMPRESSION: + case PIZ_COMPRESSION: + case B44A_COMPRESSION: + break; + + default: + throw ArgExc ("Invalid compression type for ACES file."); + } +} + +} // namespace + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads) +: + _data (new Data) +{ + checkCompression (header.compression()); + + Header newHeader = header; + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads) +: + _data (new Data) +{ + checkCompression (header.compression()); + + Header newHeader = header; + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (os, + header, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _data (new Data) +{ + checkCompression (compression); + + Header newHeader (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + int width, + int height, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _data (new Data) +{ + checkCompression (compression); + + Header newHeader (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::~AcesOutputFile () +{ + delete _data; +} + + +void +AcesOutputFile::setFrameBuffer + (const Rgba *base, + size_t xStride, + size_t yStride) +{ + _data->rgbaFile->setFrameBuffer (base, xStride, yStride); +} + + +void +AcesOutputFile::writePixels (int numScanLines) +{ + _data->rgbaFile->writePixels (numScanLines); +} + + +int +AcesOutputFile::currentScanLine () const +{ + return _data->rgbaFile->currentScanLine(); +} + + +const Header & +AcesOutputFile::header () const +{ + return _data->rgbaFile->header(); +} + + +const IMATH_NAMESPACE::Box2i & +AcesOutputFile::displayWindow () const +{ + return _data->rgbaFile->displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +AcesOutputFile::dataWindow () const +{ + return _data->rgbaFile->dataWindow(); +} + + +float +AcesOutputFile::pixelAspectRatio () const +{ + return _data->rgbaFile->pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +AcesOutputFile::screenWindowCenter () const +{ + return _data->rgbaFile->screenWindowCenter(); +} + + +float +AcesOutputFile::screenWindowWidth () const +{ + return _data->rgbaFile->screenWindowWidth(); +} + + +LineOrder +AcesOutputFile::lineOrder () const +{ + return _data->rgbaFile->lineOrder(); +} + + +Compression +AcesOutputFile::compression () const +{ + return _data->rgbaFile->compression(); +} + + +RgbaChannels +AcesOutputFile::channels () const +{ + return _data->rgbaFile->channels(); +} + + +void +AcesOutputFile::updatePreviewImage (const PreviewRgba pixels[]) +{ + _data->rgbaFile->updatePreviewImage (pixels); +} + + +class AcesInputFile::Data +{ + public: + + Data(); + ~Data(); + + void initColorConversion (); + + RgbaInputFile * rgbaFile; + + Rgba * fbBase; + size_t fbXStride; + size_t fbYStride; + int minX; + int maxX; + + bool mustConvertColor; + M44f fileToAces; +}; + + +AcesInputFile::Data::Data (): + rgbaFile (0), + fbBase (0), + fbXStride (0), + fbYStride (0), + minX (0), + maxX (0), + mustConvertColor (false) +{ + // empty +} + + +AcesInputFile::Data::~Data () +{ + delete rgbaFile; +} + + +void +AcesInputFile::Data::initColorConversion () +{ + const Header &header = rgbaFile->header(); + + Chromaticities fileChr; + + if (hasChromaticities (header)) + fileChr = chromaticities (header); + + V2f fileNeutral = fileChr.white; + + if (hasAdoptedNeutral (header)) + fileNeutral = adoptedNeutral (header); + + const Chromaticities acesChr = acesChromaticities(); + + V2f acesNeutral = acesChr.white; + + if (fileChr.red == acesChr.red && + fileChr.green == acesChr.green && + fileChr.blue == acesChr.blue && + fileChr.white == acesChr.white && + fileNeutral == acesNeutral) + { + // + // The file already contains ACES data, + // color conversion is not necessary. + + return; + } + + mustConvertColor = true; + minX = header.dataWindow().min.x; + maxX = header.dataWindow().max.x; + + // + // Create a matrix that transforms colors from the + // RGB space of the input file into the ACES space + // using a color adaptation transform to move the + // white point. + // + + // + // We'll need the Bradford cone primary matrix and its inverse + // + + static const M44f bradfordCPM + (0.895100, -0.750200, 0.038900, 0.000000, + 0.266400, 1.713500, -0.068500, 0.000000, + -0.161400, 0.036700, 1.029600, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000); + + const static M44f inverseBradfordCPM + (0.986993, 0.432305, -0.008529, 0.000000, + -0.147054, 0.518360, 0.040043, 0.000000, + 0.159963, 0.049291, 0.968487, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000); + + // + // Convert the white points of the two RGB spaces to XYZ + // + + float fx = fileNeutral.x; + float fy = fileNeutral.y; + V3f fileNeutralXYZ (fx / fy, 1, (1 - fx - fy) / fy); + + float ax = acesNeutral.x; + float ay = acesNeutral.y; + V3f acesNeutralXYZ (ax / ay, 1, (1 - ax - ay) / ay); + + // + // Compute the Bradford transformation matrix + // + + V3f ratio ((acesNeutralXYZ * bradfordCPM) / + (fileNeutralXYZ * bradfordCPM)); + + M44f ratioMat (ratio[0], 0, 0, 0, + 0, ratio[1], 0, 0, + 0, 0, ratio[2], 0, + 0, 0, 0, 1); + + M44f bradfordTrans = bradfordCPM * + ratioMat * + inverseBradfordCPM; + + // + // Build a combined file-RGB-to-ACES-RGB conversion matrix + // + + fileToAces = RGBtoXYZ (fileChr, 1) * bradfordTrans * XYZtoRGB (acesChr, 1); +} + + +AcesInputFile::AcesInputFile (const std::string &name, int numThreads): + _data (new Data) +{ + _data->rgbaFile = new RgbaInputFile (name.c_str(), numThreads); + _data->initColorConversion(); +} + + +AcesInputFile::AcesInputFile (IStream &is, int numThreads): + _data (new Data) +{ + _data->rgbaFile = new RgbaInputFile (is, numThreads); + _data->initColorConversion(); +} + + +AcesInputFile::~AcesInputFile () +{ + delete _data; +} + + +void +AcesInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + _data->rgbaFile->setFrameBuffer (base, xStride, yStride); + _data->fbBase = base; + _data->fbXStride = xStride; + _data->fbYStride = yStride; +} + + +void +AcesInputFile::readPixels (int scanLine1, int scanLine2) +{ + // + // Copy the pixels from the RgbaInputFile into the frame buffer. + // + + _data->rgbaFile->readPixels (scanLine1, scanLine2); + + // + // If the RGB space of the input file is not the same as the ACES + // RGB space, then the pixels in the frame buffer must be transformed + // into the ACES RGB space. + // + + if (!_data->mustConvertColor) + return; + + int minY = min (scanLine1, scanLine2); + int maxY = max (scanLine1, scanLine2); + + for (int y = minY; y <= maxY; ++y) + { + Rgba *base = _data->fbBase + + _data->fbXStride * _data->minX + + _data->fbYStride * y; + + for (int x = _data->minX; x <= _data->maxX; ++x) + { + V3f aces = V3f (base->r, base->g, base->b) * _data->fileToAces; + + base->r = aces[0]; + base->g = aces[1]; + base->b = aces[2]; + + base += _data->fbXStride; + } + } +} + + +void +AcesInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +const Header & +AcesInputFile::header () const +{ + return _data->rgbaFile->header(); +} + + +const IMATH_NAMESPACE::Box2i & +AcesInputFile::displayWindow () const +{ + return _data->rgbaFile->displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +AcesInputFile::dataWindow () const +{ + return _data->rgbaFile->dataWindow(); +} + + +float +AcesInputFile::pixelAspectRatio () const +{ + return _data->rgbaFile->pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +AcesInputFile::screenWindowCenter () const +{ + return _data->rgbaFile->screenWindowCenter(); +} + + +float +AcesInputFile::screenWindowWidth () const +{ + return _data->rgbaFile->screenWindowWidth(); +} + + +LineOrder +AcesInputFile::lineOrder () const +{ + return _data->rgbaFile->lineOrder(); +} + + +Compression +AcesInputFile::compression () const +{ + return _data->rgbaFile->compression(); +} + + +RgbaChannels +AcesInputFile::channels () const +{ + return _data->rgbaFile->channels(); +} + + +const char * +AcesInputFile::fileName () const +{ + return _data->rgbaFile->fileName(); +} + + +bool +AcesInputFile::isComplete () const +{ + return _data->rgbaFile->isComplete(); +} + + +int +AcesInputFile::version () const +{ + return _data->rgbaFile->version(); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfAcesFile.h b/IlmImf/ImfAcesFile.h new file mode 100644 index 0000000..b801a86 --- /dev/null +++ b/IlmImf/ImfAcesFile.h @@ -0,0 +1,324 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_ACES_FILE_H +#define INCLUDED_IMF_ACES_FILE_H + + +//----------------------------------------------------------------------------- +// +// ACES image file I/O. +// +// This header file declares two classes that directly support +// image file input and output according to the Academy Image +// Interchange Framework. +// +// The Academy Image Interchange file format is a subset of OpenEXR: +// +// - Images are stored as scanlines. Tiles are not allowed. +// +// - Images contain three color channels, either +// R, G, B (red, green, blue) or +// Y, RY, BY (luminance, sub-sampled chroma) +// +// - Images may optionally contain an alpha channel. +// +// - Only three compression types are allowed: +// - NO_COMPRESSION (file is not compressed) +// - PIZ_COMPRESSION (lossless) +// - B44A_COMPRESSION (lossy) +// +// - The "chromaticities" header attribute must specify +// the ACES RGB primaries and white point. +// +// class AcesOutputFile writes an OpenEXR file, enforcing the +// restrictions listed above. Pixel data supplied by application +// software must already be in the ACES RGB space. +// +// class AcesInputFile reads an OpenEXR file. Pixel data delivered +// to application software is guaranteed to be in the ACES RGB space. +// If the RGB space of the file is not the same as the ACES space, +// then the pixels are automatically converted: the pixels are +// converted to CIE XYZ, a color adaptation transform shifts the +// white point, and the result is converted to ACES RGB. +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfRgba.h" +#include "ImathVec.h" +#include "ImathBox.h" +#include "ImfThreading.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// ACES red, green, blue and white-point chromaticities. +// + +const Chromaticities & acesChromaticities (); + + +// +// ACES output file. +// + +class IMF_EXPORT AcesOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- header is constructed by the caller + //--------------------------------------------------- + + AcesOutputFile (const std::string &name, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------- + // Constructor -- header is constructed by the caller, + // file is opened by the caller, destructor will not + // automatically close the file. + //---------------------------------------------------- + + AcesOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------------------- + // Constructor -- header data are explicitly specified as function + // call arguments (empty dataWindow means "same as displayWindow") + //---------------------------------------------------------------- + + AcesOutputFile (const std::string &name, + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + AcesOutputFile (const std::string &name, + int width, + int height, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~AcesOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + + //------------------------------------------------- + // Write pixel data (see class Imf::OutputFile) + // The pixels are assumed to contain ACES RGB data. + //------------------------------------------------- + + void writePixels (int numScanLines = 1); + int currentScanLine () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + // -------------------------------------------------------------------- + // Update the preview image (see Imf::OutputFile::updatePreviewImage()) + // -------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + private: + + AcesOutputFile (const AcesOutputFile &); // not implemented + AcesOutputFile & operator = (const AcesOutputFile &); // not implemented + + class Data; + + Data * _data; +}; + + +// +// ACES input file +// + +class IMF_EXPORT AcesInputFile +{ + public: + + //------------------------------------------------------- + // Constructor -- opens the file with the specified name, + // destructor will automatically close the file. + //------------------------------------------------------- + + AcesInputFile (const std::string &name, + int numThreads = globalThreadCount()); + + + //----------------------------------------------------------- + // Constructor -- attaches the new AcesInputFile object to a + // file that has already been opened by the caller. + // Destroying the AcesInputFile object will not automatically + // close the file. + //----------------------------------------------------------- + + AcesInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~AcesInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + + //-------------------------------------------- + // Read pixel data (see class Imf::InputFile) + // Pixels returned will contain ACES RGB data. + //-------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + private: + + AcesInputFile (const AcesInputFile &); // not implemented + AcesInputFile & operator = (const AcesInputFile &); // not implemented + + class Data; + + Data * _data; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + +#endif diff --git a/IlmImf/ImfArray.h b/IlmImf/ImfArray.h new file mode 100644 index 0000000..6a80d8f --- /dev/null +++ b/IlmImf/ImfArray.h @@ -0,0 +1,285 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_ARRAY_H +#define INCLUDED_IMF_ARRAY_H + +#include "ImfForward.h" + +//------------------------------------------------------------------------- +// +// class Array +// class Array2D +// +// "Arrays of T" whose sizes are not known at compile time. +// When an array goes out of scope, its elements are automatically +// deleted. +// +// Usage example: +// +// struct C +// { +// C () {std::cout << "C::C (" << this << ")\n";}; +// virtual ~C () {std::cout << "C::~C (" << this << ")\n";}; +// }; +// +// int +// main () +// { +// Array a(3); +// +// C &b = a[1]; +// const C &c = a[1]; +// C *d = a + 2; +// const C *e = a; +// +// return 0; +// } +// +//------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +template +class Array +{ + public: + + //----------------------------- + // Constructors and destructors + //----------------------------- + + Array () {_data = 0; _size = 0;} + Array (long size) {_data = new T[size]; _size = size;} + ~Array () {delete [] _data;} + + + //----------------------------- + // Access to the array elements + //----------------------------- + + operator T * () {return _data;} + operator const T * () const {return _data;} + + + //------------------------------------------------------ + // Resize and clear the array (the contents of the array + // are not preserved across the resize operation). + // + // resizeEraseUnsafe() is more memory efficient than + // resizeErase() because it deletes the old memory block + // before allocating a new one, but if allocating the + // new block throws an exception, resizeEraseUnsafe() + // leaves the array in an unusable state. + // + //------------------------------------------------------ + + void resizeErase (long size); + void resizeEraseUnsafe (long size); + + + //------------------------------- + // Return the size of this array. + //------------------------------- + + long size() const {return _size;} + + + private: + + Array (const Array &); // Copying and assignment + Array & operator = (const Array &); // are not implemented + + long _size; + T * _data; +}; + + +template +class Array2D +{ + public: + + //----------------------------- + // Constructors and destructors + //----------------------------- + + Array2D (); // empty array, 0 by 0 elements + Array2D (long sizeX, long sizeY); // sizeX by sizeY elements + ~Array2D (); + + + //----------------------------- + // Access to the array elements + //----------------------------- + + T * operator [] (long x); + const T * operator [] (long x) const; + + + //------------------------------------------------------ + // Resize and clear the array (the contents of the array + // are not preserved across the resize operation). + // + // resizeEraseUnsafe() is more memory efficient than + // resizeErase() because it deletes the old memory block + // before allocating a new one, but if allocating the + // new block throws an exception, resizeEraseUnsafe() + // leaves the array in an unusable state. + // + //------------------------------------------------------ + + void resizeErase (long sizeX, long sizeY); + void resizeEraseUnsafe (long sizeX, long sizeY); + + + //------------------------------- + // Return the size of this array. + //------------------------------- + + long height() const {return _sizeX;} + long width() const {return _sizeY;} + + + private: + + Array2D (const Array2D &); // Copying and assignment + Array2D & operator = (const Array2D &); // are not implemented + + long _sizeX; + long _sizeY; + T * _data; +}; + + +//--------------- +// Implementation +//--------------- + +template +inline void +Array::resizeErase (long size) +{ + T *tmp = new T[size]; + delete [] _data; + _size = size; + _data = tmp; +} + + +template +inline void +Array::resizeEraseUnsafe (long size) +{ + delete [] _data; + _data = 0; + _size = 0; + _data = new T[size]; + _size = size; +} + + +template +inline +Array2D::Array2D (): + _sizeX(0), _sizeY (0), _data (0) +{ + // emtpy +} + + +template +inline +Array2D::Array2D (long sizeX, long sizeY): + _sizeX (sizeX), _sizeY (sizeY), _data (new T[sizeX * sizeY]) +{ + // emtpy +} + + +template +inline +Array2D::~Array2D () +{ + delete [] _data; +} + + +template +inline T * +Array2D::operator [] (long x) +{ + return _data + x * _sizeY; +} + + +template +inline const T * +Array2D::operator [] (long x) const +{ + return _data + x * _sizeY; +} + + +template +inline void +Array2D::resizeErase (long sizeX, long sizeY) +{ + T *tmp = new T[sizeX * sizeY]; + delete [] _data; + _sizeX = sizeX; + _sizeY = sizeY; + _data = tmp; +} + + +template +inline void +Array2D::resizeEraseUnsafe (long sizeX, long sizeY) +{ + delete [] _data; + _data = 0; + _sizeX = 0; + _sizeY = 0; + _data = new T[sizeX * sizeY]; + _sizeX = sizeX; + _sizeY = sizeY; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfAttribute.cpp b/IlmImf/ImfAttribute.cpp new file mode 100644 index 0000000..cb4ac36 --- /dev/null +++ b/IlmImf/ImfAttribute.cpp @@ -0,0 +1,158 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Attribute +// +//----------------------------------------------------------------------------- + +#include +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; + + +Attribute::Attribute () {} + + +Attribute::~Attribute () {} + + +namespace { + +struct NameCompare: std::binary_function +{ + bool + operator () (const char *x, const char *y) const + { + return strcmp (x, y) < 0; + } +}; + + +typedef Attribute* (*Constructor)(); +typedef std::map TypeMap; + + +class LockedTypeMap: public TypeMap +{ + public: + + Mutex mutex; +}; + + +LockedTypeMap & +typeMap () +{ + static Mutex criticalSection; + Lock lock (criticalSection); + + static LockedTypeMap* typeMap = 0; + + if (typeMap == 0) + typeMap = new LockedTypeMap (); + + return *typeMap; +} + + +} // namespace + + +bool +Attribute::knownType (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + return tMap.find (typeName) != tMap.end(); +} + + +void +Attribute::registerAttributeType (const char typeName[], + Attribute *(*newAttribute)()) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + if (tMap.find (typeName) != tMap.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot register image file attribute " + "type \"" << typeName << "\". " + "The type has already been registered."); + + tMap.insert (TypeMap::value_type (typeName, newAttribute)); +} + + +void +Attribute::unRegisterAttributeType (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + tMap.erase (typeName); +} + + +Attribute * +Attribute::newAttribute (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + TypeMap::const_iterator i = tMap.find (typeName); + + if (i == tMap.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot create image file attribute of " + "unknown type \"" << typeName << "\"."); + + return (i->second)(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfAttribute.h b/IlmImf/ImfAttribute.h new file mode 100644 index 0000000..86762ad --- /dev/null +++ b/IlmImf/ImfAttribute.h @@ -0,0 +1,407 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_ATTRIBUTE_H +#define INCLUDED_IMF_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class Attribute +// +//----------------------------------------------------------------------------- + +#include "IexBaseExc.h" +#include "ImfIO.h" +#include "ImfXdr.h" +#include "ImfForward.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT Attribute +{ + public: + + //--------------------------- + // Constructor and destructor + //--------------------------- + + Attribute (); + virtual ~Attribute (); + + + //------------------------------- + // Get this attribute's type name + //------------------------------- + + virtual const char * typeName () const = 0; + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const = 0; + + + //---------------------------------------- + // Type-specific attribute I/O and copying + //---------------------------------------- + + virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const = 0; + + virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version) = 0; + + virtual void copyValueFrom (const Attribute &other) = 0; + + + //------------------ + // Attribute factory + //------------------ + + static Attribute * newAttribute (const char typeName[]); + + + //----------------------------------------------------------- + // Test if a given attribute type has already been registered + //----------------------------------------------------------- + + static bool knownType (const char typeName[]); + + + protected: + + //-------------------------------------------------- + // Register an attribute type so that newAttribute() + // knows how to make objects of this type. + //-------------------------------------------------- + + static void registerAttributeType (const char typeName[], + Attribute *(*newAttribute)()); + + //------------------------------------------------------ + // Un-register an attribute type so that newAttribute() + // no longer knows how to make objects of this type (for + // debugging only). + //------------------------------------------------------ + + static void unRegisterAttributeType (const char typeName[]); +}; + + +//------------------------------------------------- +// Class template for attributes of a specific type +//------------------------------------------------- + +template +class TypedAttribute: public Attribute +{ + public: + + //---------------------------- + // Constructors and destructor + //------------_--------------- + + TypedAttribute (); + TypedAttribute (const T &value); + TypedAttribute (const TypedAttribute &other); + virtual ~TypedAttribute (); + + + //-------------------------------- + // Access to the attribute's value + //-------------------------------- + + T & value (); + const T & value () const; + + + //-------------------------------- + // Get this attribute's type name. + //-------------------------------- + + virtual const char * typeName () const; + + + //--------------------------------------------------------- + // Static version of typeName() + // This function must be specialized for each value type T. + //--------------------------------------------------------- + + static const char * staticTypeName (); + + + //--------------------- + // Make a new attribute + //--------------------- + + static Attribute * makeNewAttribute (); + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const; + + + //----------------------------------------------------------------- + // Type-specific attribute I/O and copying. + // Depending on type T, these functions may have to be specialized. + //----------------------------------------------------------------- + + virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const; + + virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version); + + virtual void copyValueFrom (const Attribute &other); + + + //------------------------------------------------------------ + // Dynamic casts that throw exceptions instead of returning 0. + //------------------------------------------------------------ + + static TypedAttribute * cast (Attribute *attribute); + static const TypedAttribute * cast (const Attribute *attribute); + static TypedAttribute & cast (Attribute &attribute); + static const TypedAttribute & cast (const Attribute &attribute); + + + //--------------------------------------------------------------- + // Register this attribute type so that Attribute::newAttribute() + // knows how to make objects of this type. + // + // Note that this function is not thread-safe because it modifies + // a global variable in the IlmIlm library. A thread in a multi- + // threaded program may call registerAttributeType() only when no + // other thread is accessing any functions or classes in the + // IlmImf library. + // + //--------------------------------------------------------------- + + static void registerAttributeType (); + + + //----------------------------------------------------- + // Un-register this attribute type (for debugging only) + //----------------------------------------------------- + + static void unRegisterAttributeType (); + + + private: + + T _value; +}; + +//------------------------------------ +// Implementation of TypedAttribute +//------------------------------------ +template +TypedAttribute::TypedAttribute (): + Attribute (), + _value (T()) +{ + // empty +} + + +template +TypedAttribute::TypedAttribute (const T & value): + Attribute (), + _value (value) +{ + // empty +} + + +template +TypedAttribute::TypedAttribute (const TypedAttribute &other): + Attribute (other), + _value () +{ + copyValueFrom (other); +} + + +template +TypedAttribute::~TypedAttribute () +{ + // empty +} + + +template +inline T & +TypedAttribute::value () +{ + return _value; +} + + +template +inline const T & +TypedAttribute::value () const +{ + return _value; +} + + +template +const char * +TypedAttribute::typeName () const +{ + return staticTypeName(); +} + + +template +Attribute * +TypedAttribute::makeNewAttribute () +{ + return new TypedAttribute(); +} + + +template +Attribute * +TypedAttribute::copy () const +{ + Attribute * attribute = new TypedAttribute(); + attribute->copyValueFrom (*this); + return attribute; +} + + +template +void +TypedAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, _value); +} + + +template +void +TypedAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version) +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, _value); +} + + +template +void +TypedAttribute::copyValueFrom (const Attribute &other) +{ + _value = cast(other)._value; +} + + +template +TypedAttribute * +TypedAttribute::cast (Attribute *attribute) +{ + TypedAttribute *t = + dynamic_cast *> (attribute); + + if (t == 0) + throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); + + return t; +} + + +template +const TypedAttribute * +TypedAttribute::cast (const Attribute *attribute) +{ + const TypedAttribute *t = + dynamic_cast *> (attribute); + + if (t == 0) + throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); + + return t; +} + + +template +inline TypedAttribute & +TypedAttribute::cast (Attribute &attribute) +{ + return *cast (&attribute); +} + + +template +inline const TypedAttribute & +TypedAttribute::cast (const Attribute &attribute) +{ + return *cast (&attribute); +} + + +template +inline void +TypedAttribute::registerAttributeType () +{ + Attribute::registerAttributeType (staticTypeName(), makeNewAttribute); +} + + +template +inline void +TypedAttribute::unRegisterAttributeType () +{ + Attribute::unRegisterAttributeType (staticTypeName()); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfAutoArray.h b/IlmImf/ImfAutoArray.h new file mode 100644 index 0000000..c1ecaff --- /dev/null +++ b/IlmImf/ImfAutoArray.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_AUTO_ARRAY_H +#define INCLUDED_IMF_AUTO_ARRAY_H + +//----------------------------------------------------------------------------- +// +// class AutoArray -- a workaround for systems with +// insufficient stack space for large auto arrays. +// +//----------------------------------------------------------------------------- + +#include "ImfNamespace.h" +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +#if !defined (HAVE_LARGE_STACK) + + + template + class AutoArray + { + public: + + AutoArray (): _data (new T [size]) { memset(_data, 0, size*sizeof(T)); } + ~AutoArray () {delete [] _data;} + + operator T * () {return _data;} + operator const T * () const {return _data;} + + private: + + T *_data; + }; + + +#else + + + template + class AutoArray + { + public: + + operator T * () {return _data;} + operator const T * () const {return _data;} + + private: + + T _data[size]; + }; + + +#endif + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfB44Compressor.cpp b/IlmImf/ImfB44Compressor.cpp new file mode 100644 index 0000000..f13e143 --- /dev/null +++ b/IlmImf/ImfB44Compressor.cpp @@ -0,0 +1,1072 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class B44Compressor +// +// This compressor is lossy for HALF channels; the compression rate +// is fixed at 32/14 (approximately 2.28). FLOAT and UINT channels +// are not compressed; their data are preserved exactly. +// +// Each HALF channel is split into blocks of 4 by 4 pixels. An +// uncompressed block occupies 32 bytes, which are re-interpreted +// as sixteen 16-bit unsigned integers, t[0] ... t[15]. Compression +// shrinks the block to 14 bytes. The compressed 14-byte block +// contains +// +// - t[0] +// +// - a 6-bit shift value +// +// - 15 densely packed 6-bit values, r[0] ... r[14], which are +// computed by subtracting adjacent pixel values and right- +// shifting the differences according to the stored shift value. +// +// Differences between adjacent pixels are computed according +// to the following diagram: +// +// 0 --------> 1 --------> 2 --------> 3 +// | 3 7 11 +// | +// | 0 +// | +// v +// 4 --------> 5 --------> 6 --------> 7 +// | 4 8 12 +// | +// | 1 +// | +// v +// 8 --------> 9 --------> 10 --------> 11 +// | 5 9 13 +// | +// | 2 +// | +// v +// 12 --------> 13 --------> 14 --------> 15 +// 6 10 14 +// +// Here +// +// 5 ---------> 6 +// 8 +// +// means that r[8] is the difference between t[5] and t[6]. +// +// - optionally, a 4-by-4 pixel block where all pixels have the +// same value can be treated as a special case, where the +// compressed block contains only 3 instead of 14 bytes: +// t[0], followed by an "impossible" 6-bit shift value and +// two padding bits. +// +// This compressor can handle positive and negative pixel values. +// NaNs and infinities are replaced with zeroes before compression. +// +//----------------------------------------------------------------------------- + +#include "ImfB44Compressor.h" +#include "ImfHeader.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfCheckedArithmetic.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "ImfNamespace.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using std::min; + +namespace { + +// +// Lookup tables for +// y = exp (x / 8) +// and +// x = 8 * log (y) +// + +#include "b44ExpLogTable.h" + + +inline void +convertFromLinear (unsigned short s[16]) +{ + for (int i = 0; i < 16; ++i) + s[i] = expTable[s[i]]; +} + + +inline void +convertToLinear (unsigned short s[16]) +{ + for (int i = 0; i < 16; ++i) + s[i] = logTable[s[i]]; +} + + +inline int +shiftAndRound (int x, int shift) +{ + // + // Compute + // + // y = x * pow (2, -shift), + // + // then round y to the nearest integer. + // In case of a tie, where y is exactly + // halfway between two integers, round + // to the even one. + // + + x <<= 1; + int a = (1 << shift) - 1; + shift += 1; + int b = (x >> shift) & 1; + return (x + a + b) >> shift; +} + + +int +pack (const unsigned short s[16], + unsigned char b[14], + bool optFlatFields, + bool exactMax) +{ + // + // Pack a block of 4 by 4 16-bit pixels (32 bytes) into + // either 14 or 3 bytes. + // + + // + // Integers s[0] ... s[15] represent floating-point numbers + // in what is essentially a sign-magnitude format. Convert + // s[0] .. s[15] into a new set of integers, t[0] ... t[15], + // such that if t[i] is greater than t[j], the floating-point + // number that corresponds to s[i] is always greater than + // the floating-point number that corresponds to s[j]. + // + // Also, replace any bit patterns that represent NaNs or + // infinities with bit patterns that represent floating-point + // zeroes. + // + // bit pattern floating-point bit pattern + // in s[i] value in t[i] + // + // 0x7fff NAN 0x8000 + // 0x7ffe NAN 0x8000 + // ... ... + // 0x7c01 NAN 0x8000 + // 0x7c00 +infinity 0x8000 + // 0x7bff +HALF_MAX 0xfbff + // 0x7bfe 0xfbfe + // 0x7bfd 0xfbfd + // ... ... + // 0x0002 +2 * HALF_MIN 0x8002 + // 0x0001 +HALF_MIN 0x8001 + // 0x0000 +0.0 0x8000 + // 0x8000 -0.0 0x7fff + // 0x8001 -HALF_MIN 0x7ffe + // 0x8002 -2 * HALF_MIN 0x7ffd + // ... ... + // 0xfbfd 0x0f02 + // 0xfbfe 0x0401 + // 0xfbff -HALF_MAX 0x0400 + // 0xfc00 -infinity 0x8000 + // 0xfc01 NAN 0x8000 + // ... ... + // 0xfffe NAN 0x8000 + // 0xffff NAN 0x8000 + // + + unsigned short t[16]; + + for (int i = 0; i < 16; ++i) + { + if ((s[i] & 0x7c00) == 0x7c00) + t[i] = 0x8000; + else if (s[i] & 0x8000) + t[i] = ~s[i]; + else + t[i] = s[i] | 0x8000; + } + + // + // Find the maximum, tMax, of t[0] ... t[15]. + // + + unsigned short tMax = 0; + + for (int i = 0; i < 16; ++i) + if (tMax < t[i]) + tMax = t[i]; + + // + // Compute a set of running differences, r[0] ... r[14]: + // Find a shift value such that after rounding off the + // rightmost bits and shifting all differenes are between + // -32 and +31. Then bias the differences so that they + // end up between 0 and 63. + // + + int shift = -1; + int d[16]; + int r[15]; + int rMin; + int rMax; + + const int bias = 0x20; + + do + { + shift += 1; + + // + // Compute absolute differences, d[0] ... d[15], + // between tMax and t[0] ... t[15]. + // + // Shift and round the absolute differences. + // + + for (int i = 0; i < 16; ++i) + d[i] = shiftAndRound (tMax - t[i], shift); + + // + // Convert d[0] .. d[15] into running differences + // + + r[ 0] = d[ 0] - d[ 4] + bias; + r[ 1] = d[ 4] - d[ 8] + bias; + r[ 2] = d[ 8] - d[12] + bias; + + r[ 3] = d[ 0] - d[ 1] + bias; + r[ 4] = d[ 4] - d[ 5] + bias; + r[ 5] = d[ 8] - d[ 9] + bias; + r[ 6] = d[12] - d[13] + bias; + + r[ 7] = d[ 1] - d[ 2] + bias; + r[ 8] = d[ 5] - d[ 6] + bias; + r[ 9] = d[ 9] - d[10] + bias; + r[10] = d[13] - d[14] + bias; + + r[11] = d[ 2] - d[ 3] + bias; + r[12] = d[ 6] - d[ 7] + bias; + r[13] = d[10] - d[11] + bias; + r[14] = d[14] - d[15] + bias; + + rMin = r[0]; + rMax = r[0]; + + for (int i = 1; i < 15; ++i) + { + if (rMin > r[i]) + rMin = r[i]; + + if (rMax < r[i]) + rMax = r[i]; + } + } + while (rMin < 0 || rMax > 0x3f); + + if (rMin == bias && rMax == bias && optFlatFields) + { + // + // Special case - all pixels have the same value. + // We encode this in 3 instead of 14 bytes by + // storing the value 0xfc in the third output byte, + // which cannot occur in the 14-byte encoding. + // + + b[0] = (t[0] >> 8); + b[1] = (unsigned char) t[0]; + b[2] = 0xfc; + + return 3; + } + + if (exactMax) + { + // + // Adjust t[0] so that the pixel whose value is equal + // to tMax gets represented as accurately as possible. + // + + t[0] = tMax - (d[0] << shift); + } + + // + // Pack t[0], shift and r[0] ... r[14] into 14 bytes: + // + + b[ 0] = (t[0] >> 8); + b[ 1] = (unsigned char) t[0]; + + b[ 2] = (unsigned char) ((shift << 2) | (r[ 0] >> 4)); + b[ 3] = (unsigned char) ((r[ 0] << 4) | (r[ 1] >> 2)); + b[ 4] = (unsigned char) ((r[ 1] << 6) | r[ 2] ); + + b[ 5] = (unsigned char) ((r[ 3] << 2) | (r[ 4] >> 4)); + b[ 6] = (unsigned char) ((r[ 4] << 4) | (r[ 5] >> 2)); + b[ 7] = (unsigned char) ((r[ 5] << 6) | r[ 6] ); + + b[ 8] = (unsigned char) ((r[ 7] << 2) | (r[ 8] >> 4)); + b[ 9] = (unsigned char) ((r[ 8] << 4) | (r[ 9] >> 2)); + b[10] = (unsigned char) ((r[ 9] << 6) | r[10] ); + + b[11] = (unsigned char) ((r[11] << 2) | (r[12] >> 4)); + b[12] = (unsigned char) ((r[12] << 4) | (r[13] >> 2)); + b[13] = (unsigned char) ((r[13] << 6) | r[14] ); + + return 14; +} + + +inline +void +unpack14 (const unsigned char b[14], unsigned short s[16]) +{ + // + // Unpack a 14-byte block into 4 by 4 16-bit pixels. + // + + #if defined (DEBUG) + assert (b[2] != 0xfc); + #endif + + s[ 0] = (b[0] << 8) | b[1]; + + unsigned short shift = (b[ 2] >> 2); + unsigned short bias = (0x20 << shift); + + s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3f) << shift) - bias; + s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3f) << shift) - bias; + s[12] = s[ 8] + ((b[ 4] & 0x3f) << shift) - bias; + + s[ 1] = s[ 0] + ((b[ 5] >> 2) << shift) - bias; + s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3f) << shift) - bias; + s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3f) << shift) - bias; + s[13] = s[12] + ((b[ 7] & 0x3f) << shift) - bias; + + s[ 2] = s[ 1] + ((b[ 8] >> 2) << shift) - bias; + s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3f) << shift) - bias; + s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3f) << shift) - bias; + s[14] = s[13] + ((b[10] & 0x3f) << shift) - bias; + + s[ 3] = s[ 2] + ((b[11] >> 2) << shift) - bias; + s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3f) << shift) - bias; + s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3f) << shift) - bias; + s[15] = s[14] + ((b[13] & 0x3f) << shift) - bias; + + for (int i = 0; i < 16; ++i) + { + if (s[i] & 0x8000) + s[i] &= 0x7fff; + else + s[i] = ~s[i]; + } +} + + +inline +void +unpack3 (const unsigned char b[3], unsigned short s[16]) +{ + // + // Unpack a 3-byte block into 4 by 4 identical 16-bit pixels. + // + + #if defined (DEBUG) + assert (b[2] == 0xfc); + #endif + + s[0] = (b[0] << 8) | b[1]; + + if (s[0] & 0x8000) + s[0] &= 0x7fff; + else + s[0] = ~s[0]; + + for (int i = 1; i < 16; ++i) + s[i] = s[0]; +} + + +void +notEnoughData () +{ + throw IEX_NAMESPACE::InputExc ("Error decompressing data " + "(input data are shorter than expected)."); +} + + +void +tooMuchData () +{ + throw IEX_NAMESPACE::InputExc ("Error decompressing data " + "(input data are longer than expected)."); +} + +} // namespace + + +struct B44Compressor::ChannelData +{ + unsigned short * start; + unsigned short * end; + int nx; + int ny; + int ys; + PixelType type; + bool pLinear; + int size; +}; + + +B44Compressor::B44Compressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines, + bool optFlatFields) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _optFlatFields (optFlatFields), + _format (XDR), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _numChans (0), + _channels (hdr.channels()), + _channelData (0) +{ + // + // Allocate buffers for compressed an uncompressed pixel data, + // allocate a set of ChannelData structs to help speed up the + // compress() and uncompress() functions, below, and determine + // if uncompressed pixel data should be in native or Xdr format. + // + + _tmpBuffer = new unsigned short + [checkArraySize (uiMult (maxScanLineSize, numScanLines), + sizeof (unsigned short))]; + + const ChannelList &channels = header().channels(); + int numHalfChans = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); + ++_numChans; + + if (c.channel().type == HALF) + ++numHalfChans; + } + + // + // Compressed data may be larger than the input data + // + + size_t padding = 12 * numHalfChans * (numScanLines + 3) / 4; + + _outBuffer = new char + [uiAdd (uiMult (maxScanLineSize, numScanLines), padding)]; + + _channelData = new ChannelData[_numChans]; + + int i = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c, ++i) + { + _channelData[i].ys = c.channel().ySampling; + _channelData[i].type = c.channel().type; + _channelData[i].pLinear = c.channel().pLinear; + _channelData[i].size = + pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + } + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; + + // + // We can support uncompressed data in the machine's native + // format only if all image channels are of type HALF. + // + + assert (sizeof (unsigned short) == pixelTypeSize (HALF)); + + if (_numChans == numHalfChans) + _format = NATIVE; +} + + +B44Compressor::~B44Compressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; + delete [] _channelData; +} + + +int +B44Compressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +B44Compressor::format () const +{ + return _format; +} + + +int +B44Compressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +B44Compressor::compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +B44Compressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +B44Compressor::uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +B44Compressor::compress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + // + // Compress a block of pixel data: First copy the input pixels + // from the input buffer into _tmpBuffer, rearranging them such + // that blocks of 4x4 pixels of a single channel can be accessed + // conveniently. Then compress each 4x4 block of HALF pixel data + // and append the result to the output buffer. Copy UINT and + // FLOAT data to the output buffer without compressing them. + // + + outPtr = _outBuffer; + + if (inSize == 0) + { + // + // Special case - empty input buffer. + // + + return 0; + } + + // + // For each channel, detemine how many pixels are stored + // in the input buffer, and where those pixels will be + // placed in _tmpBuffer. + // + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + if (_format == XDR) + { + // + // The data in the input buffer are in the machine-independent + // Xdr format. Copy the HALF channels into _tmpBuffer and + // convert them back into native format for compression. + // Copy UINT and FLOAT channels verbatim into _tmpBuffer. + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + if (cd.type == HALF) + { + for (int x = cd.nx; x > 0; --x) + { + Xdr::read (inPtr, *cd.end); + ++cd.end; + } + } + else + { + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + } + else + { + // + // The input buffer contains only HALF channels, and they + // are in native, machine-dependent format. Copy the pixels + // into _tmpBuffer. + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + #if defined (DEBUG) + assert (cd.type == HALF); + #endif + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + // + // The pixels for each channel have been packed into a contiguous + // block in _tmpBuffer. HALF channels are in native format; UINT + // and FLOAT channels are in Xdr format. + // + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + // + // For each HALF channel, split the data in _tmpBuffer into 4x4 + // pixel blocks. Compress each block and append the compressed + // data to the output buffer. + // + // UINT and FLOAT channels are copied from _tmpBuffer into the + // output buffer without further processing. + // + + char *outEnd = _outBuffer; + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (cd.type != HALF) + { + // + // UINT or FLOAT channel. + // + + int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); + memcpy (outEnd, cd.start, n); + outEnd += n; + + continue; + } + + // + // HALF channel + // + + for (int y = 0; y < cd.ny; y += 4) + { + // + // Copy the next 4x4 pixel block into array s. + // If the width, cd.nx, or the height, cd.ny, of + // the pixel data in _tmpBuffer is not divisible + // by 4, then pad the data by repeating the + // rightmost column and the bottom row. + // + + unsigned short *row0 = cd.start + y * cd.nx; + unsigned short *row1 = row0 + cd.nx; + unsigned short *row2 = row1 + cd.nx; + unsigned short *row3 = row2 + cd.nx; + + if (y + 3 >= cd.ny) + { + if (y + 1 >= cd.ny) + row1 = row0; + + if (y + 2 >= cd.ny) + row2 = row1; + + row3 = row2; + } + + for (int x = 0; x < cd.nx; x += 4) + { + unsigned short s[16]; + + if (x + 3 >= cd.nx) + { + int n = cd.nx - x; + + for (int i = 0; i < 4; ++i) + { + int j = min (i, n - 1); + + s[i + 0] = row0[j]; + s[i + 4] = row1[j]; + s[i + 8] = row2[j]; + s[i + 12] = row3[j]; + } + } + else + { + memcpy (&s[ 0], row0, 4 * sizeof (unsigned short)); + memcpy (&s[ 4], row1, 4 * sizeof (unsigned short)); + memcpy (&s[ 8], row2, 4 * sizeof (unsigned short)); + memcpy (&s[12], row3, 4 * sizeof (unsigned short)); + } + + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + + // + // Compress the contents of array s and append the + // results to the output buffer. + // + + if (cd.pLinear) + convertFromLinear (s); + + outEnd += pack (s, (unsigned char *) outEnd, + _optFlatFields, !cd.pLinear); + } + } + } + + return outEnd - _outBuffer; +} + + +int +B44Compressor::uncompress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + // + // This function is the reverse of the compress() function, + // above. First all pixels are moved from the input buffer + // into _tmpBuffer. UINT and FLOAT channels are copied + // verbatim; HALF channels are uncompressed in blocks of + // 4x4 pixels. Then the pixels in _tmpBuffer are copied + // into the output buffer and rearranged such that the data + // for for each scan line form a contiguous block. + // + + outPtr = _outBuffer; + + if (inSize == 0) + { + return 0; + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (cd.type != HALF) + { + // + // UINT or FLOAT channel. + // + + int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); + + if (inSize < n) + notEnoughData(); + + memcpy (cd.start, inPtr, n); + inPtr += n; + inSize -= n; + + continue; + } + + // + // HALF channel + // + + for (int y = 0; y < cd.ny; y += 4) + { + unsigned short *row0 = cd.start + y * cd.nx; + unsigned short *row1 = row0 + cd.nx; + unsigned short *row2 = row1 + cd.nx; + unsigned short *row3 = row2 + cd.nx; + + for (int x = 0; x < cd.nx; x += 4) + { + unsigned short s[16]; + + if (inSize < 3) + notEnoughData(); + + if (((const unsigned char *)inPtr)[2] == 0xfc) + { + unpack3 ((const unsigned char *)inPtr, s); + inPtr += 3; + inSize -= 3; + } + else + { + if (inSize < 14) + notEnoughData(); + + unpack14 ((const unsigned char *)inPtr, s); + inPtr += 14; + inSize -= 14; + } + + if (cd.pLinear) + convertToLinear (s); + + int n = (x + 3 < cd.nx)? + 4 * sizeof (unsigned short) : + (cd.nx - x) * sizeof (unsigned short); + + if (y + 3 < cd.ny) + { + memcpy (row0, &s[ 0], n); + memcpy (row1, &s[ 4], n); + memcpy (row2, &s[ 8], n); + memcpy (row3, &s[12], n); + } + else + { + memcpy (row0, &s[ 0], n); + + if (y + 1 < cd.ny) + memcpy (row1, &s[ 4], n); + + if (y + 2 < cd.ny) + memcpy (row2, &s[ 8], n); + } + + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + } + } + } + + char *outEnd = _outBuffer; + + if (_format == XDR) + { + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + if (cd.type == HALF) + { + for (int x = cd.nx; x > 0; --x) + { + Xdr::write (outEnd, *cd.end); + ++cd.end; + } + } + else + { + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + } + else + { + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + #if defined (DEBUG) + assert (cd.type == HALF); + #endif + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + if (inSize > 0) + tooMuchData(); + + outPtr = _outBuffer; + return outEnd - _outBuffer; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfB44Compressor.h b/IlmImf/ImfB44Compressor.h new file mode 100644 index 0000000..5c381c1 --- /dev/null +++ b/IlmImf/ImfB44Compressor.h @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_B44_COMPRESSOR_H +#define INCLUDED_IMF_B44_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class B44Compressor -- lossy compression of 4x4 pixel blocks +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT B44Compressor: public Compressor +{ + public: + + B44Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines, + bool optFlatFields); + + virtual ~B44Compressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + private: + + struct ChannelData; + + int compress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + bool _optFlatFields; + Format _format; + int _numScanLines; + unsigned short * _tmpBuffer; + char * _outBuffer; + int _numChans; + const ChannelList & _channels; + ChannelData * _channelData; + int _minX; + int _maxX; + int _maxY; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfBoxAttribute.cpp b/IlmImf/ImfBoxAttribute.cpp new file mode 100644 index 0000000..6d44d0c --- /dev/null +++ b/IlmImf/ImfBoxAttribute.cpp @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Box2iAttribute +// class Box2fAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +Box2iAttribute::staticTypeName () +{ + return "box2i"; +} + + +template <> +void +Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.min.x); + Xdr::write (os, _value.min.y); + Xdr::write (os, _value.max.x); + Xdr::write (os, _value.max.y); +} + + +template <> +void +Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.min.x); + Xdr::read (is, _value.min.y); + Xdr::read (is, _value.max.x); + Xdr::read (is, _value.max.y); +} + + +template <> +const char * +Box2fAttribute::staticTypeName () +{ + return "box2f"; +} + + +template <> +void +Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.min.x); + Xdr::write (os, _value.min.y); + Xdr::write (os, _value.max.x); + Xdr::write (os, _value.max.y); +} + + +template <> +void +Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.min.x); + Xdr::read (is, _value.min.y); + Xdr::read (is, _value.max.x); + Xdr::read (is, _value.max.y); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfBoxAttribute.h b/IlmImf/ImfBoxAttribute.h new file mode 100644 index 0000000..7bf2585 --- /dev/null +++ b/IlmImf/ImfBoxAttribute.h @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_BOX_ATTRIBUTE_H +#define INCLUDED_IMF_BOX_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class Box2iAttribute +// class Box2fAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfForward.h" +#include "ImfExport.h" +#include "ImfAttribute.h" +#include "ImathBox.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute Box2iAttribute; + +template <> +IMF_EXPORT +const char *Box2iAttribute::staticTypeName (); +template <> +IMF_EXPORT +void Box2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; +template <> +IMF_EXPORT +void Box2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +typedef TypedAttribute Box2fAttribute; +template <> +IMF_EXPORT +const char *Box2fAttribute::staticTypeName (); +template <> +IMF_EXPORT +void Box2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; +template <> +IMF_EXPORT +void Box2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfCRgbaFile.cpp b/IlmImf/ImfCRgbaFile.cpp new file mode 100644 index 0000000..48363b4 --- /dev/null +++ b/IlmImf/ImfCRgbaFile.cpp @@ -0,0 +1,1438 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// C interface to C++ classes Imf::RgbaOutputFile and Imf::RgbaInputFile +// +//----------------------------------------------------------------------------- + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "half.h" +#include "ImfNamespace.h" +#include "ImathForward.h" + +#include + + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::Box2f; +using IMATH_NAMESPACE::V2i; +using IMATH_NAMESPACE::V2f; +using IMATH_NAMESPACE::V3i; +using IMATH_NAMESPACE::V3f; +using IMATH_NAMESPACE::M33f; +using IMATH_NAMESPACE::M44f; + + +namespace { + + +const int MAX_ERR_LENGTH = 1024; +char errorMessage[MAX_ERR_LENGTH]; + + +void +setErrorMessage (const std::exception &e) +{ + strncpy (errorMessage, e.what(), MAX_ERR_LENGTH - 1); + errorMessage[MAX_ERR_LENGTH - 1] = 0; +} + + +inline OPENEXR_IMF_INTERNAL_NAMESPACE::Header * +header (ImfHeader *hdr) +{ + return (OPENEXR_IMF_INTERNAL_NAMESPACE::Header *)(hdr); +} + + +inline const OPENEXR_IMF_INTERNAL_NAMESPACE::Header * +header (const ImfHeader *hdr) +{ + return (const OPENEXR_IMF_INTERNAL_NAMESPACE::Header *)(hdr); +} + + +inline OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile * +outfile (ImfOutputFile *out) +{ + return (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile *) out; +} + + +inline const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile * +outfile (const ImfOutputFile *out) +{ + return (const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile *) out; +} + + +inline OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile * +outfile (ImfTiledOutputFile *out) +{ + return (OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile *) out; +} + + +inline const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile * +outfile (const ImfTiledOutputFile *out) +{ + return (const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile *) out; +} + + +inline OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile * +infile (ImfInputFile *in) +{ + return (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile *) in; +} + + +inline const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile * +infile (const ImfInputFile *in) +{ + return (const OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile *) in; +} + + +inline OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile * +infile (ImfTiledInputFile *in) +{ + return (OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile *) in; +} + + +inline const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile * +infile (const ImfTiledInputFile *in) +{ + return (const OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile *) in; +} + + +} // namespace + + +void +ImfFloatToHalf (float f, ImfHalf *h) +{ + *h = half(f).bits(); +} + + +void +ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/]) +{ + for (int i = 0; i < n; ++i) + h[i] = half(f[i]).bits(); +} + + +float +ImfHalfToFloat (ImfHalf h) +{ + return float (*((half *)&h)); +} + + +void +ImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/]) +{ + for (int i = 0; i < n; ++i) + f[i] = float (*((half *)(h + i))); +} + + +ImfHeader * +ImfNewHeader (void) +{ + try + { + return (ImfHeader *) new OPENEXR_IMF_INTERNAL_NAMESPACE::Header; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfDeleteHeader (ImfHeader *hdr) +{ + delete header (hdr); +} + + +ImfHeader * +ImfCopyHeader (const ImfHeader *hdr) +{ + try + { + return (ImfHeader *) new OPENEXR_IMF_INTERNAL_NAMESPACE::Header (*header (hdr)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfHeaderSetDisplayWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax) +{ + header(hdr)->displayWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); +} + + +void +ImfHeaderDisplayWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + const Box2i dw = header(hdr)->displayWindow(); + *xMin = dw.min.x; + *yMin = dw.min.y; + *xMax = dw.max.x; + *yMax = dw.max.y; +} + + +void +ImfHeaderSetDataWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax) +{ + header(hdr)->dataWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); +} + + +void +ImfHeaderDataWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + const Box2i dw = header(hdr)->dataWindow(); + *xMin = dw.min.x; + *yMin = dw.min.y; + *xMax = dw.max.x; + *yMax = dw.max.y; +} + + +void +ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio) +{ + header(hdr)->pixelAspectRatio() = pixelAspectRatio; +} + + +float +ImfHeaderPixelAspectRatio (const ImfHeader *hdr) +{ + return header(hdr)->pixelAspectRatio(); +} + + +void +ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y) +{ + header(hdr)->screenWindowCenter() = V2f (x, y); +} + + +void +ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y) +{ + const V2i &swc = header(hdr)->screenWindowCenter(); + *x = (float) swc.x; + *y = (float) swc.y; +} + + +void +ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width) +{ + header(hdr)->screenWindowWidth() = width; +} + + +float +ImfHeaderScreenWindowWidth (const ImfHeader *hdr) +{ + return header(hdr)->screenWindowWidth(); +} + + +void +ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder) +{ + header(hdr)->lineOrder() = OPENEXR_IMF_INTERNAL_NAMESPACE::LineOrder (lineOrder); +} + + +int +ImfHeaderLineOrder (const ImfHeader *hdr) +{ + return header(hdr)->lineOrder(); +} + + +void +ImfHeaderSetCompression (ImfHeader *hdr, int compression) +{ + header(hdr)->compression() = OPENEXR_IMF_INTERNAL_NAMESPACE::Compression (compression); +} + + +int +ImfHeaderCompression (const ImfHeader *hdr) +{ + return header(hdr)->compression(); +} + + +int +ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::IntAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value) +{ + try + { + *value = header(hdr)->typedAttribute(name).value(); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::FloatAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::DoubleAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value) +{ + try + { + *value = header(hdr)->typedAttribute(name).value(); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderDoubleAttribute (const ImfHeader *hdr, + const char name[], + double *value) +{ + try + { + *value = header(hdr)-> + typedAttribute(name).value(); + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetStringAttribute (ImfHeader *hdr, + const char name[], + const char value[]) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::StringAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderStringAttribute (const ImfHeader *hdr, + const char name[], + const char **value) +{ + try + { + *value = header(hdr)-> + typedAttribute(name).value().c_str(); + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetBox2iAttribute (ImfHeader *hdr, + const char name[], + int xMin, int yMin, + int xMax, int yMax) +{ + try + { + Box2i box (V2i (xMin, yMin), V2i (xMax, yMax)); + + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::Box2iAttribute (box)); + } + else + { + header(hdr)->typedAttribute(name).value() = + box; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderBox2iAttribute (const ImfHeader *hdr, + const char name[], + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + try + { + const Box2i &box = + header(hdr)->typedAttribute(name).value(); + + *xMin = box.min.x; + *yMin = box.min.y; + *xMax = box.max.x; + *yMax = box.max.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetBox2fAttribute (ImfHeader *hdr, + const char name[], + float xMin, float yMin, + float xMax, float yMax) +{ + try + { + Box2f box (V2f (xMin, yMin), V2f (xMax, yMax)); + + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::Box2fAttribute (box)); + } + else + { + header(hdr)->typedAttribute(name).value() = + box; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderBox2fAttribute (const ImfHeader *hdr, + const char name[], + float *xMin, float *yMin, + float *xMax, float *yMax) +{ + try + { + const Box2f &box = + header(hdr)->typedAttribute(name).value(); + + *xMin = box.min.x; + *yMin = box.min.y; + *xMax = box.max.x; + *yMax = box.max.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV2iAttribute (ImfHeader *hdr, + const char name[], + int x, int y) +{ + try + { + V2i v (x, y); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V2iAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV2iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y) +{ + try + { + const V2i &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV2fAttribute (ImfHeader *hdr, + const char name[], + float x, float y) +{ + try + { + V2f v (x, y); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V2fAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV2fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y) +{ + try + { + const V2f &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV3iAttribute (ImfHeader *hdr, + const char name[], + int x, int y, int z) +{ + try + { + V3i v (x, y, z); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V3iAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV3iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y, int *z) +{ + try + { + const V3i &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + *z = v.z; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV3fAttribute (ImfHeader *hdr, + const char name[], + float x, float y, float z) +{ + try + { + V3f v (x, y, z); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::V3fAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV3fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y, float *z) +{ + try + { + const V3f &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + *z = v.z; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetM33fAttribute (ImfHeader *hdr, + const char name[], + const float m[3][3]) +{ + try + { + M33f m3 (m); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::M33fAttribute (m3)); + else + header(hdr)->typedAttribute(name).value() = m3; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderM33fAttribute (const ImfHeader *hdr, + const char name[], + float m[3][3]) +{ + try + { + const M33f &m3 = + header(hdr)->typedAttribute(name).value(); + + m[0][0] = m3[0][0]; + m[0][1] = m3[0][1]; + m[0][2] = m3[0][2]; + + m[1][0] = m3[1][0]; + m[1][1] = m3[1][1]; + m[1][2] = m3[1][2]; + + m[2][0] = m3[2][0]; + m[2][1] = m3[2][1]; + m[2][2] = m3[2][2]; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetM44fAttribute (ImfHeader *hdr, + const char name[], + const float m[4][4]) +{ + try + { + M44f m4 (m); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, OPENEXR_IMF_INTERNAL_NAMESPACE::M44fAttribute (m4)); + else + header(hdr)->typedAttribute(name).value() = m4; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderM44fAttribute (const ImfHeader *hdr, + const char name[], + float m[4][4]) +{ + try + { + const M44f &m4 = + header(hdr)->typedAttribute(name).value(); + + m[0][0] = m4[0][0]; + m[0][1] = m4[0][1]; + m[0][2] = m4[0][2]; + m[0][3] = m4[0][3]; + + m[1][0] = m4[1][0]; + m[1][1] = m4[1][1]; + m[1][2] = m4[1][2]; + m[1][3] = m4[1][3]; + + m[2][0] = m4[2][0]; + m[2][1] = m4[2][1]; + m[2][2] = m4[2][2]; + m[2][3] = m4[2][3]; + + m[3][0] = m4[3][0]; + m[3][1] = m4[3][1]; + m[3][2] = m4[3][2]; + m[3][3] = m4[3][3]; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +ImfOutputFile * +ImfOpenOutputFile (const char name[], const ImfHeader *hdr, int channels) +{ + try + { + return (ImfOutputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaOutputFile + (name, *header(hdr), OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseOutputFile (ImfOutputFile *out) +{ + try + { + delete outfile (out); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputSetFrameBuffer (ImfOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + outfile(out)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputWritePixels (ImfOutputFile *out, int numScanLines) +{ + try + { + outfile(out)->writePixels (numScanLines); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputCurrentScanLine (const ImfOutputFile *out) +{ + return outfile(out)->currentScanLine(); +} + + +const ImfHeader * +ImfOutputHeader (const ImfOutputFile *out) +{ + return (const ImfHeader *) &outfile(out)->header(); +} + + +int +ImfOutputChannels (const ImfOutputFile *out) +{ + return outfile(out)->channels(); +} + + +ImfTiledOutputFile * +ImfOpenTiledOutputFile (const char name[], + const ImfHeader *hdr, + int channels, + int xSize, int ySize, + int mode, int rmode) +{ + try + { + return (ImfTiledOutputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaOutputFile + (name, *header(hdr), + OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels), + xSize, ySize, + OPENEXR_IMF_INTERNAL_NAMESPACE::LevelMode (mode), + OPENEXR_IMF_INTERNAL_NAMESPACE::LevelRoundingMode (rmode)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseTiledOutputFile (ImfTiledOutputFile *out) +{ + try + { + delete outfile (out); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + outfile(out)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputWriteTile (ImfTiledOutputFile *out, + int dx, int dy, + int lx, int ly) +{ + try + { + outfile(out)->writeTile (dx, dy, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly) +{ + try + { + outfile(out)->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfTiledOutputHeader (const ImfTiledOutputFile *out) +{ + return (const ImfHeader *) &outfile(out)->header(); +} + + +int +ImfTiledOutputChannels (const ImfTiledOutputFile *out) +{ + return outfile(out)->channels(); +} + + +int +ImfTiledOutputTileXSize (const ImfTiledOutputFile *out) +{ + return outfile(out)->tileXSize(); +} + + +int +ImfTiledOutputTileYSize (const ImfTiledOutputFile *out) +{ + return outfile(out)->tileYSize(); +} + + +int +ImfTiledOutputLevelMode (const ImfTiledOutputFile *out) +{ + return outfile(out)->levelMode(); +} + + +int +ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out) +{ + return outfile(out)->levelRoundingMode(); +} + + +ImfInputFile * +ImfOpenInputFile (const char name[]) +{ + try + { + return (ImfInputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaInputFile (name); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseInputFile (ImfInputFile *in) +{ + try + { + delete infile (in); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfInputSetFrameBuffer (ImfInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + infile(in)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *) base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfInputReadPixels (ImfInputFile *in, int scanLine1, int scanLine2) +{ + try + { + infile(in)->readPixels (scanLine1, scanLine2); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfInputHeader (const ImfInputFile *in) +{ + return (const ImfHeader *) &infile(in)->header(); +} + + +int +ImfInputChannels (const ImfInputFile *in) +{ + return infile(in)->channels(); +} + + +const char * +ImfInputFileName (const ImfInputFile *in) +{ + return infile(in)->fileName(); +} + + +ImfTiledInputFile * +ImfOpenTiledInputFile (const char name[]) +{ + try + { + return (ImfTiledInputFile *) new OPENEXR_IMF_INTERNAL_NAMESPACE::TiledRgbaInputFile (name); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseTiledInputFile (ImfTiledInputFile *in) +{ + try + { + delete infile (in); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + infile(in)->setFrameBuffer ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *) base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputReadTile (ImfTiledInputFile *in, + int dx, int dy, + int lx, int ly) +{ + try + { + infile(in)->readTile (dx, dy, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputReadTiles (ImfTiledInputFile *in, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly) +{ + try + { + infile(in)->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfTiledInputHeader (const ImfTiledInputFile *in) +{ + return (const ImfHeader *) &infile(in)->header(); +} + + +int +ImfTiledInputChannels (const ImfTiledInputFile *in) +{ + return infile(in)->channels(); +} + + +const char * +ImfTiledInputFileName (const ImfTiledInputFile *in) +{ + return infile(in)->fileName(); +} + + +int +ImfTiledInputTileXSize (const ImfTiledInputFile *in) +{ + return infile(in)->tileXSize(); +} + + +int +ImfTiledInputTileYSize (const ImfTiledInputFile *in) +{ + return infile(in)->tileYSize(); +} + + +int +ImfTiledInputLevelMode (const ImfTiledInputFile *in) +{ + return infile(in)->levelMode(); +} + + +int +ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in) +{ + return infile(in)->levelRoundingMode(); +} + + +ImfLut * +ImfNewRound12logLut (int channels) +{ + try + { + return (ImfLut *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut + (OPENEXR_IMF_INTERNAL_NAMESPACE::round12log, OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +ImfLut * +ImfNewRoundNBitLut (unsigned int n, int channels) +{ + try + { + return (ImfLut *) new OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut + (OPENEXR_IMF_INTERNAL_NAMESPACE::roundNBit (n), OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfDeleteLut (ImfLut *lut) +{ + delete (OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut *) lut; +} + + +void +ImfApplyLut (ImfLut *lut, ImfRgba *data, int nData, int stride) +{ + ((OPENEXR_IMF_INTERNAL_NAMESPACE::RgbaLut *)lut)->apply ((OPENEXR_IMF_INTERNAL_NAMESPACE::Rgba *)data, nData, stride); +} + + +const char * +ImfErrorMessage () +{ + return errorMessage; +} diff --git a/IlmImf/ImfCRgbaFile.h b/IlmImf/ImfCRgbaFile.h new file mode 100644 index 0000000..5ac2bf8 --- /dev/null +++ b/IlmImf/ImfCRgbaFile.h @@ -0,0 +1,555 @@ +/* + +Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +Digital Ltd. LLC + +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 Industrial Light & Magic 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. + +*/ + +#ifndef INCLUDED_IMF_C_RGBA_FILE_H +#define INCLUDED_IMF_C_RGBA_FILE_H + +#include "ImfExport.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Interpreting unsigned shorts as 16-bit floating point numbers +*/ + +typedef unsigned short ImfHalf; + +IMF_EXPORT +void ImfFloatToHalf (float f, + ImfHalf *h); + +IMF_EXPORT +void ImfFloatToHalfArray (int n, + const float f[/*n*/], + ImfHalf h[/*n*/]); + +IMF_EXPORT +float ImfHalfToFloat (ImfHalf h); + +IMF_EXPORT +void ImfHalfToFloatArray (int n, + const ImfHalf h[/*n*/], + float f[/*n*/]); + +/* +** RGBA pixel; memory layout must be the same as struct Imf::Rgba. +*/ + +struct ImfRgba +{ + ImfHalf r; + ImfHalf g; + ImfHalf b; + ImfHalf a; +}; + +typedef struct ImfRgba ImfRgba; + +/* +** Magic number; this must be the same as Imf::MAGIC +*/ + +#define IMF_MAGIC 20000630 + +/* +** Version number; this must be the same as Imf::EXR_VERSION +*/ + +#define IMF_VERSION_NUMBER 2 + +/* +** Line order; values must the the same as in Imf::LineOrder. +*/ + +#define IMF_INCREASING_Y 0 +#define IMF_DECREASING_Y 1 +#define IMF_RAMDOM_Y 2 + + +/* +** Compression types; values must be the same as in Imf::Compression. +*/ + +#define IMF_NO_COMPRESSION 0 +#define IMF_RLE_COMPRESSION 1 +#define IMF_ZIPS_COMPRESSION 2 +#define IMF_ZIP_COMPRESSION 3 +#define IMF_PIZ_COMPRESSION 4 +#define IMF_PXR24_COMPRESSION 5 +#define IMF_B44_COMPRESSION 6 +#define IMF_B44A_COMPRESSION 7 + + +/* +** Channels; values must be the same as in Imf::RgbaChannels. +*/ + +#define IMF_WRITE_R 0x01 +#define IMF_WRITE_G 0x02 +#define IMF_WRITE_B 0x04 +#define IMF_WRITE_A 0x08 +#define IMF_WRITE_Y 0x10 +#define IMF_WRITE_C 0x20 +#define IMF_WRITE_RGB 0x07 +#define IMF_WRITE_RGBA 0x0f +#define IMF_WRITE_YC 0x30 +#define IMF_WRITE_YA 0x18 +#define IMF_WRITE_YCA 0x38 + + +/* +** Level modes; values must be the same as in Imf::LevelMode +*/ + +#define IMF_ONE_LEVEL 0 +#define IMF_MIPMAP_LEVELS 1 +#define IMF_RIPMAP_LEVELS 2 + + +/* +** Level rounding modes; values must be the same as in Imf::LevelRoundingMode +*/ + +#define IMF_ROUND_DOWN 0 +#define IMF_ROUND_UP 1 + + +/* +** RGBA file header +*/ + +struct ImfHeader; +typedef struct ImfHeader ImfHeader; + +IMF_EXPORT +ImfHeader * ImfNewHeader (void); + +IMF_EXPORT +void ImfDeleteHeader (ImfHeader *hdr); + +IMF_EXPORT +ImfHeader * ImfCopyHeader (const ImfHeader *hdr); + +IMF_EXPORT +void ImfHeaderSetDisplayWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax); + +IMF_EXPORT +void ImfHeaderDisplayWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax); + +IMF_EXPORT +void ImfHeaderSetDataWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax); + +IMF_EXPORT +void ImfHeaderDataWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax); + +IMF_EXPORT +void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, + float pixelAspectRatio); + +IMF_EXPORT +float ImfHeaderPixelAspectRatio (const ImfHeader *hdr); + +IMF_EXPORT +void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, + float x, float y); + +IMF_EXPORT +void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, + float *x, float *y); + +IMF_EXPORT +void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, + float width); + +IMF_EXPORT +float ImfHeaderScreenWindowWidth (const ImfHeader *hdr); + +IMF_EXPORT +void ImfHeaderSetLineOrder (ImfHeader *hdr, + int lineOrder); + +IMF_EXPORT +int ImfHeaderLineOrder (const ImfHeader *hdr); + +IMF_EXPORT +void ImfHeaderSetCompression (ImfHeader *hdr, + int compression); + +IMF_EXPORT +int ImfHeaderCompression (const ImfHeader *hdr); + +IMF_EXPORT +int ImfHeaderSetIntAttribute (ImfHeader *hdr, + const char name[], + int value); + +IMF_EXPORT +int ImfHeaderIntAttribute (const ImfHeader *hdr, + const char name[], + int *value); + +IMF_EXPORT +int ImfHeaderSetFloatAttribute (ImfHeader *hdr, + const char name[], + float value); + +IMF_EXPORT +int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, + const char name[], + double value); + +IMF_EXPORT +int ImfHeaderFloatAttribute (const ImfHeader *hdr, + const char name[], + float *value); + +IMF_EXPORT +int ImfHeaderDoubleAttribute (const ImfHeader *hdr, + const char name[], + double *value); + +IMF_EXPORT +int ImfHeaderSetStringAttribute (ImfHeader *hdr, + const char name[], + const char value[]); + +IMF_EXPORT +int ImfHeaderStringAttribute (const ImfHeader *hdr, + const char name[], + const char **value); + +IMF_EXPORT +int ImfHeaderSetBox2iAttribute (ImfHeader *hdr, + const char name[], + int xMin, int yMin, + int xMax, int yMax); + +IMF_EXPORT +int ImfHeaderBox2iAttribute (const ImfHeader *hdr, + const char name[], + int *xMin, int *yMin, + int *xMax, int *yMax); + +IMF_EXPORT +int ImfHeaderSetBox2fAttribute (ImfHeader *hdr, + const char name[], + float xMin, float yMin, + float xMax, float yMax); + +IMF_EXPORT +int ImfHeaderBox2fAttribute (const ImfHeader *hdr, + const char name[], + float *xMin, float *yMin, + float *xMax, float *yMax); + +IMF_EXPORT +int ImfHeaderSetV2iAttribute (ImfHeader *hdr, + const char name[], + int x, int y); + +IMF_EXPORT +int ImfHeaderV2iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y); + +IMF_EXPORT +int ImfHeaderSetV2fAttribute (ImfHeader *hdr, + const char name[], + float x, float y); + +IMF_EXPORT +int ImfHeaderV2fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y); + +IMF_EXPORT +int ImfHeaderSetV3iAttribute (ImfHeader *hdr, + const char name[], + int x, int y, int z); + +IMF_EXPORT +int ImfHeaderV3iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y, int *z); + +IMF_EXPORT +int ImfHeaderSetV3fAttribute (ImfHeader *hdr, + const char name[], + float x, float y, float z); + +IMF_EXPORT +int ImfHeaderV3fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y, float *z); + +IMF_EXPORT +int ImfHeaderSetM33fAttribute (ImfHeader *hdr, + const char name[], + const float m[3][3]); + +IMF_EXPORT +int ImfHeaderM33fAttribute (const ImfHeader *hdr, + const char name[], + float m[3][3]); + +IMF_EXPORT +int ImfHeaderSetM44fAttribute (ImfHeader *hdr, + const char name[], + const float m[4][4]); + +IMF_EXPORT +int ImfHeaderM44fAttribute (const ImfHeader *hdr, + const char name[], + float m[4][4]); + +/* +** RGBA output file +*/ + +struct ImfOutputFile; +typedef struct ImfOutputFile ImfOutputFile; + +IMF_EXPORT +ImfOutputFile * ImfOpenOutputFile (const char name[], + const ImfHeader *hdr, + int channels); + +IMF_EXPORT +int ImfCloseOutputFile (ImfOutputFile *out); + +IMF_EXPORT +int ImfOutputSetFrameBuffer (ImfOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride); + +IMF_EXPORT +int ImfOutputWritePixels (ImfOutputFile *out, + int numScanLines); + +IMF_EXPORT +int ImfOutputCurrentScanLine (const ImfOutputFile *out); + +IMF_EXPORT +const ImfHeader * ImfOutputHeader (const ImfOutputFile *out); + +IMF_EXPORT +int ImfOutputChannels (const ImfOutputFile *out); + + +/* +** Tiled RGBA output file +*/ + +struct ImfTiledOutputFile; +typedef struct ImfTiledOutputFile ImfTiledOutputFile; + +IMF_EXPORT +ImfTiledOutputFile * ImfOpenTiledOutputFile (const char name[], + const ImfHeader *hdr, + int channels, + int xSize, int ySize, + int mode, int rmode); + +IMF_EXPORT +int ImfCloseTiledOutputFile (ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride); + +IMF_EXPORT +int ImfTiledOutputWriteTile (ImfTiledOutputFile *out, + int dx, int dy, + int lx, int ly); + +IMF_EXPORT +int ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly); + +IMF_EXPORT +const ImfHeader * ImfTiledOutputHeader (const ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputChannels (const ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputTileXSize (const ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputTileYSize (const ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputLevelMode (const ImfTiledOutputFile *out); + +IMF_EXPORT +int ImfTiledOutputLevelRoundingMode + (const ImfTiledOutputFile *out); + + +/* +** RGBA input file +*/ + +struct ImfInputFile; +typedef struct ImfInputFile ImfInputFile; + +ImfInputFile * ImfOpenInputFile (const char name[]); + +IMF_EXPORT +int ImfCloseInputFile (ImfInputFile *in); + +IMF_EXPORT +int ImfInputSetFrameBuffer (ImfInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride); + +IMF_EXPORT +int ImfInputReadPixels (ImfInputFile *in, + int scanLine1, + int scanLine2); + +IMF_EXPORT +const ImfHeader * ImfInputHeader (const ImfInputFile *in); + +IMF_EXPORT +int ImfInputChannels (const ImfInputFile *in); + +IMF_EXPORT +const char * ImfInputFileName (const ImfInputFile *in); + + +/* +** Tiled RGBA input file +*/ + +struct ImfTiledInputFile; +typedef struct ImfTiledInputFile ImfTiledInputFile; + +IMF_EXPORT +ImfTiledInputFile * ImfOpenTiledInputFile (const char name[]); + +IMF_EXPORT +int ImfCloseTiledInputFile (ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride); + +IMF_EXPORT +int ImfTiledInputReadTile (ImfTiledInputFile *in, + int dx, int dy, + int lx, int ly); + +IMF_EXPORT +int ImfTiledInputReadTiles (ImfTiledInputFile *in, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly); + +IMF_EXPORT +const ImfHeader * ImfTiledInputHeader (const ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputChannels (const ImfTiledInputFile *in); + +IMF_EXPORT +const char * ImfTiledInputFileName (const ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputTileXSize (const ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputTileYSize (const ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputLevelMode (const ImfTiledInputFile *in); + +IMF_EXPORT +int ImfTiledInputLevelRoundingMode + (const ImfTiledInputFile *in); + +/* +** Lookup tables +*/ + +struct ImfLut; +typedef struct ImfLut ImfLut; + +IMF_EXPORT +ImfLut * ImfNewRound12logLut (int channels); + +IMF_EXPORT +ImfLut * ImfNewRoundNBitLut (unsigned int n, int channels); + +IMF_EXPORT +void ImfDeleteLut (ImfLut *lut); + +IMF_EXPORT +void ImfApplyLut (ImfLut *lut, + ImfRgba *data, + int nData, + int stride); +/* +** Most recent error message +*/ + +IMF_EXPORT +const char * ImfErrorMessage (void); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/IlmImf/ImfChannelList.cpp b/IlmImf/ImfChannelList.cpp new file mode 100644 index 0000000..ae2ccaa --- /dev/null +++ b/IlmImf/ImfChannelList.cpp @@ -0,0 +1,322 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Channel +// class ChannelList +// +//----------------------------------------------------------------------------- + +#include +#include + + +using std::string; +using std::set; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +Channel::Channel (PixelType t, int xs, int ys, bool pl): + type (t), + xSampling (xs), + ySampling (ys), + pLinear (pl) +{ + // empty +} + + +bool +Channel::operator == (const Channel &other) const +{ + return type == other.type && + xSampling == other.xSampling && + ySampling == other.ySampling && + pLinear == other.pLinear; +} + + +void +ChannelList::insert (const char name[], const Channel &channel) +{ + if (name[0] == 0) + THROW (IEX_NAMESPACE::ArgExc, "Image channel name cannot be an empty string."); + + _map[name] = channel; +} + + +void +ChannelList::insert (const string &name, const Channel &channel) +{ + insert (name.c_str(), channel); +} + + +Channel & +ChannelList::operator [] (const char name[]) +{ + ChannelMap::iterator i = _map.find (name); + + if (i == _map.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\"."); + + return i->second; +} + + +const Channel & +ChannelList::operator [] (const char name[]) const +{ + ChannelMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\"."); + + return i->second; +} + + +Channel & +ChannelList::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Channel & +ChannelList::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Channel * +ChannelList::findChannel (const char name[]) +{ + ChannelMap::iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +const Channel * +ChannelList::findChannel (const char name[]) const +{ + ChannelMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +Channel * +ChannelList::findChannel (const string &name) +{ + return findChannel (name.c_str()); +} + + +const Channel * +ChannelList::findChannel (const string &name) const +{ + return findChannel (name.c_str()); +} + + +ChannelList::Iterator +ChannelList::begin () +{ + return _map.begin(); +} + + +ChannelList::ConstIterator +ChannelList::begin () const +{ + return _map.begin(); +} + + +ChannelList::Iterator +ChannelList::end () +{ + return _map.end(); +} + + +ChannelList::ConstIterator +ChannelList::end () const +{ + return _map.end(); +} + + +ChannelList::Iterator +ChannelList::find (const char name[]) +{ + return _map.find (name); +} + + +ChannelList::ConstIterator +ChannelList::find (const char name[]) const +{ + return _map.find (name); +} + + +ChannelList::Iterator +ChannelList::find (const string &name) +{ + return find (name.c_str()); +} + + +ChannelList::ConstIterator +ChannelList::find (const string &name) const +{ + return find (name.c_str()); +} + + +void +ChannelList::layers (set &layerNames) const +{ + layerNames.clear(); + + for (ConstIterator i = begin(); i != end(); ++i) + { + string layerName = i.name(); + size_t pos = layerName.rfind ('.'); + + if (pos != string::npos && pos != 0 && pos + 1 < layerName.size()) + { + layerName.erase (pos); + layerNames.insert (layerName); + } + } +} + + +void +ChannelList::channelsInLayer (const string &layerName, + Iterator &first, + Iterator &last) +{ + channelsWithPrefix (layerName + '.', first, last); +} + + +void +ChannelList::channelsInLayer (const string &layerName, + ConstIterator &first, + ConstIterator &last) const +{ + channelsWithPrefix (layerName + '.', first, last); +} + + +void +ChannelList::channelsWithPrefix (const char prefix[], + Iterator &first, + Iterator &last) +{ + first = last = _map.lower_bound (prefix); + size_t n = int(strlen (prefix)); + + while (last != Iterator (_map.end()) && + strncmp (last.name(), prefix, n) <= 0) + { + ++last; + } +} + + +void +ChannelList::channelsWithPrefix (const char prefix[], + ConstIterator &first, + ConstIterator &last) const +{ + first = last = _map.lower_bound (prefix); + size_t n = strlen (prefix); + + while (last != ConstIterator (_map.end()) && + strncmp (last.name(), prefix, n) <= 0) + { + ++last; + } +} + + +void +ChannelList::channelsWithPrefix (const string &prefix, + Iterator &first, + Iterator &last) +{ + return channelsWithPrefix (prefix.c_str(), first, last); +} + + +void +ChannelList::channelsWithPrefix (const string &prefix, + ConstIterator &first, + ConstIterator &last) const +{ + return channelsWithPrefix (prefix.c_str(), first, last); +} + + +bool +ChannelList::operator == (const ChannelList &other) const +{ + ConstIterator i = begin(); + ConstIterator j = other.begin(); + + while (i != end() && j != other.end()) + { + if (!(i.channel() == j.channel())) + return false; + + ++i; + ++j; + } + + return i == end() && j == other.end(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfChannelList.h b/IlmImf/ImfChannelList.h new file mode 100644 index 0000000..fc31a15 --- /dev/null +++ b/IlmImf/ImfChannelList.h @@ -0,0 +1,436 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_CHANNEL_LIST_H +#define INCLUDED_IMF_CHANNEL_LIST_H + +//----------------------------------------------------------------------------- +// +// class Channel +// class ChannelList +// +//----------------------------------------------------------------------------- + +#include "ImfName.h" +#include "ImfPixelType.h" + +#include "ImfNamespace.h" +#include "ImfExport.h" + +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct IMF_EXPORT Channel +{ + //------------------------------ + // Data type; see ImfPixelType.h + //------------------------------ + + PixelType type; + + + //-------------------------------------------- + // Subsampling: pixel (x, y) is present in the + // channel only if + // + // x % xSampling == 0 && y % ySampling == 0 + // + //-------------------------------------------- + + int xSampling; + int ySampling; + + + //-------------------------------------------------------------- + // Hint to lossy compression methods that indicates whether + // human perception of the quantity represented by this channel + // is closer to linear or closer to logarithmic. Compression + // methods may optimize image quality by adjusting pixel data + // quantization acording to this hint. + // For example, perception of red, green, blue and luminance is + // approximately logarithmic; the difference between 0.1 and 0.2 + // is perceived to be roughly the same as the difference between + // 1.0 and 2.0. Perception of chroma coordinates tends to be + // closer to linear than logarithmic; the difference between 0.1 + // and 0.2 is perceived to be roughly the same as the difference + // between 1.0 and 1.1. + //-------------------------------------------------------------- + + bool pLinear; + + + //------------ + // Constructor + //------------ + + Channel (PixelType type = HALF, + int xSampling = 1, + int ySampling = 1, + bool pLinear = false); + + + //------------ + // Operator == + //------------ + + bool operator == (const Channel &other) const; +}; + + +class IMF_EXPORT ChannelList +{ + public: + + //-------------- + // Add a channel + //-------------- + + void insert (const char name[], + const Channel &channel); + + void insert (const std::string &name, + const Channel &channel); + + //------------------------------------------------------------------ + // Access to existing channels: + // + // [n] Returns a reference to the channel with name n. + // If no channel with name n exists, an IEX_NAMESPACE::ArgExc + // is thrown. + // + // findChannel(n) Returns a pointer to the channel with name n, + // or 0 if no channel with name n exists. + // + //------------------------------------------------------------------ + + Channel & operator [] (const char name[]); + const Channel & operator [] (const char name[]) const; + + Channel & operator [] (const std::string &name); + const Channel & operator [] (const std::string &name) const; + + Channel * findChannel (const char name[]); + const Channel * findChannel (const char name[]) const; + + Channel * findChannel (const std::string &name); + const Channel * findChannel (const std::string &name) const; + + + //------------------------------------------- + // Iterator-style access to existing channels + //------------------------------------------- + + typedef std::map ChannelMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + + //----------------------------------------------------------------- + // Support for image layers: + // + // In an image file with many channels it is sometimes useful to + // group the channels into "layers", that is, into sets of channels + // that logically belong together. Grouping channels into layers + // is done using a naming convention: channel C in layer L is + // called "L.C". + // + // For example, a computer graphic image may contain separate + // R, G and B channels for light that originated at each of + // several different virtual light sources. The channels in + // this image might be called "light1.R", "light1.G", "light1.B", + // "light2.R", "light2.G", "light2.B", etc. + // + // Note that this naming convention allows layers to be nested; + // for example, "light1.specular.R" identifies the "R" channel + // in the "specular" sub-layer of layer "light1". + // + // Channel names that don't contain a "." or that contain a + // "." only at the beginning or at the end are not considered + // to be part of any layer. + // + // layers(lns) sorts the channels in this ChannelList + // into layers and stores the names of + // all layers, sorted alphabetically, + // into string set lns. + // + // channelsInLayer(ln,f,l) stores a pair of iterators in f and l + // such that the loop + // + // for (ConstIterator i = f; i != l; ++i) + // ... + // + // iterates over all channels in layer ln. + // channelsInLayer (ln, l, p) calls + // channelsWithPrefix (ln + ".", l, p). + // + //----------------------------------------------------------------- + + void layers (std::set &layerNames) const; + + void channelsInLayer (const std::string &layerName, + Iterator &first, + Iterator &last); + + void channelsInLayer (const std::string &layerName, + ConstIterator &first, + ConstIterator &last) const; + + + //------------------------------------------------------------------- + // Find all channels whose name begins with a given prefix: + // + // channelsWithPrefix(p,f,l) stores a pair of iterators in f and l + // such that the following loop iterates over all channels whose name + // begins with string p: + // + // for (ConstIterator i = f; i != l; ++i) + // ... + // + //------------------------------------------------------------------- + + void channelsWithPrefix (const char prefix[], + Iterator &first, + Iterator &last); + + void channelsWithPrefix (const char prefix[], + ConstIterator &first, + ConstIterator &last) const; + + void channelsWithPrefix (const std::string &prefix, + Iterator &first, + Iterator &last); + + void channelsWithPrefix (const std::string &prefix, + ConstIterator &first, + ConstIterator &last) const; + + //------------ + // Operator == + //------------ + + bool operator == (const ChannelList &other) const; + + private: + + ChannelMap _map; +}; + + +//---------- +// Iterators +//---------- + +class ChannelList::Iterator +{ + public: + + Iterator (); + Iterator (const ChannelList::ChannelMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Channel & channel () const; + + private: + + friend class ChannelList::ConstIterator; + + ChannelList::ChannelMap::iterator _i; +}; + + +class ChannelList::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const ChannelList::ChannelMap::const_iterator &i); + ConstIterator (const ChannelList::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Channel & channel () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + ChannelList::ChannelMap::const_iterator _i; +}; + + +//----------------- +// Inline Functions +//----------------- + +inline +ChannelList::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +ChannelList::Iterator::Iterator (const ChannelList::ChannelMap::iterator &i): + _i (i) +{ + // empty +} + + +inline ChannelList::Iterator & +ChannelList::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline ChannelList::Iterator +ChannelList::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +ChannelList::Iterator::name () const +{ + return *_i->first; +} + + +inline Channel & +ChannelList::Iterator::channel () const +{ + return _i->second; +} + + +inline +ChannelList::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +ChannelList::ConstIterator::ConstIterator + (const ChannelList::ChannelMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +ChannelList::ConstIterator::ConstIterator (const ChannelList::Iterator &other): + _i (other._i) +{ + // empty +} + +inline ChannelList::ConstIterator & +ChannelList::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline ChannelList::ConstIterator +ChannelList::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +ChannelList::ConstIterator::name () const +{ + return *_i->first; +} + +inline const Channel & +ChannelList::ConstIterator::channel () const +{ + return _i->second; +} + + +inline bool +operator == (const ChannelList::ConstIterator &x, + const ChannelList::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const ChannelList::ConstIterator &x, + const ChannelList::ConstIterator &y) +{ + return !(x == y); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfChannelListAttribute.cpp b/IlmImf/ImfChannelListAttribute.cpp new file mode 100644 index 0000000..5549493 --- /dev/null +++ b/IlmImf/ImfChannelListAttribute.cpp @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class ChannelListAttribute +// +//----------------------------------------------------------------------------- + +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +template +void checkIsNullTerminated (const char (&str)[N], const char *what) +{ + for (size_t i = 0; i < N; ++i) { + if (str[i] == '\0') + return; + } + std::stringstream s; + s << "Invalid " << what << ": it is more than " << (N - 1) + << " characters long."; + throw IEX_NAMESPACE::InputExc(s); +} + +} // namespace + + +template <> +const char * +ChannelListAttribute::staticTypeName () +{ + return "chlist"; +} + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +void +ChannelListAttribute::writeValueTo (OStream &os, int version) const +{ + for (ChannelList::ConstIterator i = _value.begin(); + i != _value.end(); + ++i) + { + // + // Write name + // + + Xdr::write (os, i.name()); + + // + // Write Channel struct + // + + Xdr::write (os, int (i.channel().type)); + Xdr::write (os, i.channel().pLinear); + Xdr::pad (os, 3); + Xdr::write (os, i.channel().xSampling); + Xdr::write (os, i.channel().ySampling); + } + + // + // Write end of list marker + // + + Xdr::write (os, ""); +} + + +template <> +void +ChannelListAttribute::readValueFrom (IStream &is, + int size, + int version) +{ + while (true) + { + // + // Read name; zero length name means end of channel list + // + + char name[Name::SIZE]; + Xdr::read (is,Name::MAX_LENGTH,name); + + if (name[0] == 0) + break; + + checkIsNullTerminated (name, "channel name"); + + // + // Read Channel struct + // + + int type; + bool pLinear; + int xSampling; + int ySampling; + + Xdr::read (is, type); + Xdr::read (is, pLinear); + Xdr::skip (is, 3); + Xdr::read (is, xSampling); + Xdr::read (is, ySampling); + + _value.insert (name, Channel (PixelType (type), + xSampling, + ySampling, + pLinear)); + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfChannelListAttribute.h b/IlmImf/ImfChannelListAttribute.h new file mode 100644 index 0000000..60d8907 --- /dev/null +++ b/IlmImf/ImfChannelListAttribute.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H +#define INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class ChannelListAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfChannelList.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute ChannelListAttribute; + +template <> +IMF_EXPORT +const char *ChannelListAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void ChannelListAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void ChannelListAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif + diff --git a/IlmImf/ImfCheckedArithmetic.h b/IlmImf/ImfCheckedArithmetic.h new file mode 100644 index 0000000..6a7fc15 --- /dev/null +++ b/IlmImf/ImfCheckedArithmetic.h @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_CHECKED_ARITHMETIC_H +#define INCLUDED_IMF_CHECKED_ARITHMETIC_H + +//----------------------------------------------------------------------------- +// +// Integer arithmetic operations that throw exceptions +// on overflow, underflow or division by zero. +// +//----------------------------------------------------------------------------- + +#include +#include "IexMathExc.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +template struct StaticAssertionFailed; +template <> struct StaticAssertionFailed {}; + +#define IMF_STATIC_ASSERT(x) \ + do {StaticAssertionFailed staticAssertionFailed; ((void) staticAssertionFailed);} while (false) + + +template +T +uiMult (T a, T b) +{ + // + // Unsigned integer multiplication + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a > 0 && b > std::numeric_limits::max() / a) + throw IEX_NAMESPACE::OverflowExc ("Integer multiplication overflow."); + + return a * b; +} + + +template +T +uiDiv (T a, T b) +{ + // + // Unsigned integer division + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (b == 0) + throw IEX_NAMESPACE::DivzeroExc ("Integer division by zero."); + + return a / b; +} + + +template +T +uiAdd (T a, T b) +{ + // + // Unsigned integer addition + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a > std::numeric_limits::max() - b) + throw IEX_NAMESPACE::OverflowExc ("Integer addition overflow."); + + return a + b; +} + + +template +T +uiSub (T a, T b) +{ + // + // Unsigned integer subtraction + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a < b) + throw IEX_NAMESPACE::UnderflowExc ("Integer subtraction underflow."); + + return a - b; +} + + +template +size_t +checkArraySize (T n, size_t s) +{ + // + // Verify that the size, in bytes, of an array with n elements + // of size s can be computed without overflowing: + // + // If computing + // + // size_t (n) * s + // + // would overflow, then throw an IEX_NAMESPACE::OverflowExc exception. + // Otherwise return + // + // size_t (n). + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + IMF_STATIC_ASSERT (sizeof (T) <= sizeof (size_t)); + + if (size_t (n) > std::numeric_limits::max() / s) + throw IEX_NAMESPACE::OverflowExc ("Integer multiplication overflow."); + + return size_t (n); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfChromaticities.cpp b/IlmImf/ImfChromaticities.cpp new file mode 100644 index 0000000..f354cdf --- /dev/null +++ b/IlmImf/ImfChromaticities.cpp @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// CIE (x,y) chromaticities, and conversions between +// RGB tiples and CIE XYZ tristimulus values. +// +//----------------------------------------------------------------------------- + +#include +#include "ImfNamespace.h" +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +Chromaticities::Chromaticities (const IMATH_NAMESPACE::V2f &red, + const IMATH_NAMESPACE::V2f &green, + const IMATH_NAMESPACE::V2f &blue, + const IMATH_NAMESPACE::V2f &white) +: + red (red), + green (green), + blue (blue), + white (white) +{ + // empty +} + + +bool +Chromaticities::operator == (const Chromaticities & c) const +{ + return red == c.red && green == c.green && blue == c.blue; +} + + +bool +Chromaticities::operator != (const Chromaticities & c) const +{ + return red != c.red || green != c.green || blue != c.blue; +} + + +IMATH_NAMESPACE::M44f +RGBtoXYZ (const Chromaticities chroma, float Y) +{ + // + // For an explanation of how the color conversion matrix is derived, + // see Roy Hall, "Illumination and Color in Computer Generated Imagery", + // Springer-Verlag, 1989, chapter 3, "Perceptual Response"; and + // Charles A. Poynton, "A Technical Introduction to Digital Video", + // John Wiley & Sons, 1996, chapter 7, "Color science for video". + // + + // + // X and Z values of RGB value (1, 1, 1), or "white" + // + + float X = chroma.white.x * Y / chroma.white.y; + float Z = (1 - chroma.white.x - chroma.white.y) * Y / chroma.white.y; + + // + // Scale factors for matrix rows + // + + float d = chroma.red.x * (chroma.blue.y - chroma.green.y) + + chroma.blue.x * (chroma.green.y - chroma.red.y) + + chroma.green.x * (chroma.red.y - chroma.blue.y); + + float Sr = (X * (chroma.blue.y - chroma.green.y) - + chroma.green.x * (Y * (chroma.blue.y - 1) + + chroma.blue.y * (X + Z)) + + chroma.blue.x * (Y * (chroma.green.y - 1) + + chroma.green.y * (X + Z))) / d; + + float Sg = (X * (chroma.red.y - chroma.blue.y) + + chroma.red.x * (Y * (chroma.blue.y - 1) + + chroma.blue.y * (X + Z)) - + chroma.blue.x * (Y * (chroma.red.y - 1) + + chroma.red.y * (X + Z))) / d; + + float Sb = (X * (chroma.green.y - chroma.red.y) - + chroma.red.x * (Y * (chroma.green.y - 1) + + chroma.green.y * (X + Z)) + + chroma.green.x * (Y * (chroma.red.y - 1) + + chroma.red.y * (X + Z))) / d; + + // + // Assemble the matrix + // + + IMATH_NAMESPACE::M44f M; + + M[0][0] = Sr * chroma.red.x; + M[0][1] = Sr * chroma.red.y; + M[0][2] = Sr * (1 - chroma.red.x - chroma.red.y); + + M[1][0] = Sg * chroma.green.x; + M[1][1] = Sg * chroma.green.y; + M[1][2] = Sg * (1 - chroma.green.x - chroma.green.y); + + M[2][0] = Sb * chroma.blue.x; + M[2][1] = Sb * chroma.blue.y; + M[2][2] = Sb * (1 - chroma.blue.x - chroma.blue.y); + + return M; +} + + +IMATH_NAMESPACE::M44f +XYZtoRGB (const Chromaticities chroma, float Y) +{ + return RGBtoXYZ (chroma, Y).inverse(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfChromaticities.h b/IlmImf/ImfChromaticities.h new file mode 100644 index 0000000..9af4769 --- /dev/null +++ b/IlmImf/ImfChromaticities.h @@ -0,0 +1,131 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_CHROMATICITIES_H +#define INCLUDED_IMF_CHROMATICITIES_H + +//----------------------------------------------------------------------------- +// +// CIE (x,y) chromaticities, and conversions between +// RGB tiples and CIE XYZ tristimulus values. +// +//----------------------------------------------------------------------------- + +#include "ImathVec.h" +#include "ImathMatrix.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct IMF_EXPORT Chromaticities +{ + //----------------------------------------------- + // The CIE x and y coordinates of the RGB triples + // (1,0,0), (0,1,0), (0,0,1) and (1,1,1). + //----------------------------------------------- + + IMATH_NAMESPACE::V2f red; + IMATH_NAMESPACE::V2f green; + IMATH_NAMESPACE::V2f blue; + IMATH_NAMESPACE::V2f white; + + //-------------------------------------------- + // Default constructor produces chromaticities + // according to Rec. ITU-R BT.709-3 + //-------------------------------------------- + + Chromaticities (const IMATH_NAMESPACE::V2f &red = IMATH_NAMESPACE::V2f (0.6400f, 0.3300f), + const IMATH_NAMESPACE::V2f &green = IMATH_NAMESPACE::V2f (0.3000f, 0.6000f), + const IMATH_NAMESPACE::V2f &blue = IMATH_NAMESPACE::V2f (0.1500f, 0.0600f), + const IMATH_NAMESPACE::V2f &white = IMATH_NAMESPACE::V2f (0.3127f, 0.3290f)); + + + //--------- + // Equality + //--------- + + bool operator == (const Chromaticities &v) const; + bool operator != (const Chromaticities &v) const; +}; + + +// +// Conversions between RGB and CIE XYZ +// +// RGB to XYZ: +// +// Given a set of chromaticities, c, and the luminance, Y, of the RGB +// triple (1,1,1), or "white", RGBtoXYZ(c,Y) computes a matrix, M, so +// that multiplying an RGB value, v, with M produces an equivalent +// XYZ value, w. (w == v * M) +// +// If we define that +// +// (Xr, Yr, Zr) == (1, 0, 0) * M +// (Xg, Yg, Zg) == (0, 1, 0) * M +// (Xb, Yb, Zb) == (0, 0, 1) * M +// (Xw, Yw, Zw) == (1, 1, 1) * M, +// +// then the following statements are true: +// +// Xr / (Xr + Yr + Zr) == c.red.x +// Yr / (Xr + Yr + Zr) == c.red.y +// +// Xg / (Xg + Yg + Zg) == c.red.x +// Yg / (Xg + Yg + Zg) == c.red.y +// +// Xb / (Xb + Yb + Zb) == c.red.x +// Yb / (Xb + Yb + Zb) == c.red.y +// +// Xw / (Xw + Yw + Zw) == c.red.x +// Yw / (Xw + Yw + Zw) == c.red.y +// +// Yw == Y. +// +// XYZ to RGB: +// +// YYZtoRGB(c,Y) returns RGBtoXYZ(c,Y).inverse(). +// + +IMF_EXPORT IMATH_NAMESPACE::M44f RGBtoXYZ (const Chromaticities chroma, float Y); +IMF_EXPORT IMATH_NAMESPACE::M44f XYZtoRGB (const Chromaticities chroma, float Y); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfChromaticitiesAttribute.cpp b/IlmImf/ImfChromaticitiesAttribute.cpp new file mode 100644 index 0000000..4d7b985 --- /dev/null +++ b/IlmImf/ImfChromaticitiesAttribute.cpp @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class ChromaticitiesAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +ChromaticitiesAttribute::staticTypeName () +{ + return "chromaticities"; +} + + +template <> +void +ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.red.x); + Xdr::write (os, _value.red.y); + Xdr::write (os, _value.green.x); + Xdr::write (os, _value.green.y); + Xdr::write (os, _value.blue.x); + Xdr::write (os, _value.blue.y); + Xdr::write (os, _value.white.x); + Xdr::write (os, _value.white.y); +} + + +template <> +void +ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.red.x); + Xdr::read (is, _value.red.y); + Xdr::read (is, _value.green.x); + Xdr::read (is, _value.green.y); + Xdr::read (is, _value.blue.x); + Xdr::read (is, _value.blue.y); + Xdr::read (is, _value.white.x); + Xdr::read (is, _value.white.y); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfChromaticitiesAttribute.h b/IlmImf/ImfChromaticitiesAttribute.h new file mode 100644 index 0000000..6c0c35a --- /dev/null +++ b/IlmImf/ImfChromaticitiesAttribute.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H +#define INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class ChromaticitiesAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfChromaticities.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute ChromaticitiesAttribute; + +template <> +IMF_EXPORT +const char *ChromaticitiesAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void ChromaticitiesAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void ChromaticitiesAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, + int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfCompositeDeepScanLine.cpp b/IlmImf/ImfCompositeDeepScanLine.cpp new file mode 100644 index 0000000..7e0dac0 --- /dev/null +++ b/IlmImf/ImfCompositeDeepScanLine.cpp @@ -0,0 +1,591 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImfCompositeDeepScanLine.h" +#include "ImfDeepScanLineInputPart.h" +#include "ImfDeepScanLineInputFile.h" +#include "ImfChannelList.h" +#include "ImfFrameBuffer.h" +#include "ImfDeepFrameBuffer.h" +#include "ImfDeepCompositing.h" +#include "ImfPixelType.h" +#include "IlmThreadPool.h" + +#include +#include +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using std::vector; +using std::string; +using IMATH_NAMESPACE::Box2i; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + + + +struct CompositeDeepScanLine::Data{ + public : + vector _file; // array of files + vector _part; // array of parts + FrameBuffer _outputFrameBuffer; // output frame buffer provided + bool _zback; // true if we are using zback (otherwise channel 1 = channel 0) + vector< vector > _channeldata; // pixel values, read from the input, one array per channel + vector< int > _sampleCounts; // total per-pixel sample counts, + Box2i _dataWindow; // data window of combined inputs + DeepCompositing * _comp; // user-provided compositor + vector _channels; // names of channels that will be composited + vector _bufferMap; // entry _outputFrameBuffer[n].name() == _channels[ _bufferMap[n] ].name() + + void check_valid(const Header & header); // check newly added part/file is OK; on first good call, set _zback/_dataWindow + + // + // set up the given deep frame buffer to contain the required channels + // resize counts and pointers to the width of _dataWindow + // zero-out all counts, since the datawindow may be smaller than/not include this part + // + + void handleDeepFrameBuffer (DeepFrameBuffer & buf, + vector & counts, //per-pixel counts + vector< vector > & pointers, //per-channel-per-pixel pointers to data + const Header & header, + int start, + int end); + + Data(); +}; + +CompositeDeepScanLine::Data::Data() : _zback(false) , _comp(NULL) {} + +CompositeDeepScanLine::CompositeDeepScanLine() : _Data(new Data) {} + +CompositeDeepScanLine::~CompositeDeepScanLine() +{ + delete _Data; +} + +void +CompositeDeepScanLine::addSource(DeepScanLineInputPart* part) +{ + _Data->check_valid(part->header()); + _Data->_part.push_back(part); +} + +void +CompositeDeepScanLine::addSource(DeepScanLineInputFile* file) +{ + _Data->check_valid(file->header()); + _Data->_file.push_back(file); +} + +int +CompositeDeepScanLine::sources() const +{ + return int(_Data->_part.size())+int(_Data->_file.size()); +} + +void +CompositeDeepScanLine::Data::check_valid(const Header & header) +{ + + bool has_z=false; + bool has_alpha=false; + // check good channel names + for( ChannelList::ConstIterator i=header.channels().begin();i!=header.channels().end();++i) + { + std::string n(i.name()); + if(n=="ZBack") + { + _zback=true; + } + else if(n=="Z") + { + has_z=true; + } + else if(n=="A") + { + has_alpha=true; + } + } + + if(!has_z) + { + throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine is missing a Z channel"); + } + + if(!has_alpha) + { + throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine is missing an alpha channel"); + } + + + if(_part.size()==0 && _file.size()==0) + { + // first in - update and return + + _dataWindow = header.dataWindow(); + + return; + } + + + const Header * const match_header = _part.size()>0 ? &_part[0]->header() : &_file[0]->header(); + + // check the sizes match + if(match_header->displayWindow() != header.displayWindow()) + { + throw IEX_NAMESPACE::ArgExc("Deep data provided to CompositeDeepScanLine has a different displayWindow to previously provided data"); + } + + _dataWindow.extendBy(header.dataWindow()); + +} +void +CompositeDeepScanLine::Data::handleDeepFrameBuffer (DeepFrameBuffer& buf, + std::vector< unsigned int > & counts, + vector< std::vector< float* > > & pointers, + const Header& header, + int start, + int end) +{ + int width=_dataWindow.size().x+1; + size_t pixelcount = width * (end-start+1); + pointers.resize(_channels.size()); + counts.resize(pixelcount); + buf.insertSampleCountSlice (Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::UINT, + (char *) (&counts[0]-_dataWindow.min.x-start*width), + sizeof(unsigned int), + sizeof(unsigned int)*width)); + + pointers[0].resize(pixelcount); + buf.insert ("Z", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(&pointers[0][0]-_dataWindow.min.x-start*width), + sizeof(float *), + sizeof(float *)*width, + sizeof(float) )); + + if(_zback) + { + pointers[1].resize(pixelcount); + buf.insert ("ZBack", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(&pointers[1][0]-_dataWindow.min.x-start*width), + sizeof(float *), + sizeof(float *)*width, + sizeof(float) )); + } + + pointers[2].resize(pixelcount); + buf.insert ("A", DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(&pointers[2][0]-_dataWindow.min.x-start*width), + sizeof(float *), + sizeof(float *)*width, + sizeof(float) )); + + + size_t i =0; + for(FrameBuffer::ConstIterator qt = _outputFrameBuffer.begin(); + qt != _outputFrameBuffer.end(); + qt++) + { + int channel_in_source = _bufferMap[i]; + if(channel_in_source>2) + { + // not dealt with yet (0,1,2 previously inserted) + pointers[channel_in_source].resize(pixelcount); + buf.insert (qt.name(), + DeepSlice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(&pointers[channel_in_source][0]-_dataWindow.min.x-start*width), + sizeof(float *), + sizeof(float *)*width, + sizeof(float) )); + } + + i++; + } + +} + +void +CompositeDeepScanLine::setCompositing(DeepCompositing* c) +{ + _Data->_comp=c; +} + +const IMATH_NAMESPACE::Box2i& CompositeDeepScanLine::dataWindow() const +{ + return _Data->_dataWindow; +} + + +void +CompositeDeepScanLine::setFrameBuffer(const FrameBuffer& fr) +{ + + // + // count channels; build map between channels in frame buffer + // and channels in internal buffers + // + + _Data->_channels.resize(3); + _Data->_channels[0]="Z"; + _Data->_channels[1]=_Data->_zback ? "ZBack" : "Z"; + _Data->_channels[2]="A"; + _Data->_bufferMap.resize(0); + + for(FrameBuffer::ConstIterator q=fr.begin();q!=fr.end();q++) + { + string name(q.name()); + if(name=="ZBack") + { + _Data->_bufferMap.push_back(1); + }else if(name=="Z") + { + _Data->_bufferMap.push_back(0); + }else if(name=="A") + { + _Data->_bufferMap.push_back(2); + }else{ + _Data->_bufferMap.push_back(_Data->_channels.size()); + _Data->_channels.push_back(name); + } + } + + _Data->_outputFrameBuffer=fr; +} + +namespace +{ + +class LineCompositeTask : public Task +{ + public: + + LineCompositeTask ( TaskGroup* group , + CompositeDeepScanLine::Data * data, + int y, + int start, + vector* names, + vector > >* pointers, + vector* total_sizes, + vector* num_sources + ) : Task(group) , + _Data(data), + _y(y), + _start(start), + _names(names), + _pointers(pointers), + _total_sizes(total_sizes), + _num_sources(num_sources) + {} + + virtual ~LineCompositeTask () {} + + virtual void execute (); + CompositeDeepScanLine::Data* _Data; + int _y; + int _start; + vector* _names; + vector > >* _pointers; + vector* _total_sizes; + vector* _num_sources; + +}; + + +void +composite_line(int y, + int start, + CompositeDeepScanLine::Data * _Data, + vector & names, + const vector > > & pointers, + const vector & total_sizes, + const vector & num_sources + ) +{ + vector output_pixel(names.size()); //the pixel we'll output to + vector inputs(names.size()); + DeepCompositing d; // fallback compositing engine + DeepCompositing * comp= _Data->_comp ? _Data->_comp : &d; + + int pixel = (y-start)*(_Data->_dataWindow.max.x+1-_Data->_dataWindow.min.x); + + for(int x=_Data->_dataWindow.min.x;x<=_Data->_dataWindow.max.x;x++) + { + // set inputs[] to point to the first sample of the first part of each channel + // if there's a zback, set all channel independently... + + if(_Data->_zback) + { + + for(size_t channel=0;channelcomposite_pixel(&output_pixel[0], + &inputs[0], + &names[0], + names.size(), + total_sizes[pixel], + num_sources[pixel] + ); + + + size_t channel_number=0; + + + // + // write out composited value into internal frame buffer + // + for(FrameBuffer::Iterator it = _Data->_outputFrameBuffer.begin();it !=_Data->_outputFrameBuffer.end();it++) + { + + float value = output_pixel[ _Data->_bufferMap[channel_number] ]; // value to write + + + // cast to half float if necessary + if(it.slice().type==OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) + { + * (float *)(it.slice().base + y*it.slice().yStride + x*it.slice().xStride) = value; + } + else if(it.slice().type==HALF) + { + * (half *)(it.slice().base + y*it.slice().yStride + x*it.slice().xStride) = half(value); + } + + channel_number++; + + } + + pixel++; + + }// next pixel on row +} + +void LineCompositeTask::execute() +{ + composite_line(_y,_start,_Data,*_names,*_pointers,*_total_sizes,*_num_sources); +} + + +} + +void +CompositeDeepScanLine::readPixels(int start, int end) +{ + size_t parts = _Data->_file.size() + _Data->_part.size(); // total of files+parts + + vector framebuffers(parts); + vector< vector > counts(parts); + + // + // for each part, a pointer to an array of channels + // + vector > > pointers(parts); + vector headers(parts); + + { + size_t i; + for(i=0;i<_Data->_file.size();i++) + { + headers[i] = &_Data->_file[i]->header(); + } + + for(size_t j=0;j<_Data->_part.size();j++) + { + headers[i+j] = &_Data->_part[j]->header(); + } + } + + + for(size_t i=0;ihandleDeepFrameBuffer(framebuffers[i],counts[i],pointers[i],*headers[i],start,end); + } + + // + // set frame buffers and read scanlines from all parts + // TODO what happens if SCANLINE not in data window? + // + + { + size_t i=0; + for(i=0;i<_Data->_file.size();i++) + { + _Data->_file[i]->setFrameBuffer(framebuffers[i]); + _Data->_file[i]->readPixelSampleCounts(start,end); + } + for(size_t j=0;j<_Data->_part.size();j++) + { + _Data->_part[j]->setFrameBuffer(framebuffers[i+j]); + _Data->_part[j]->readPixelSampleCounts(start,end); + } + } + + + // + // total width + // + + size_t total_width = _Data->_dataWindow.size().x+1; + size_t total_pixels = total_width*(end-start+1); + vector total_sizes(total_pixels); + vector num_sources(total_pixels); //number of parts with non-zero sample count + + size_t overall_sample_count=0; // sum of all samples in all images between start and end + + + // + // accumulate pixel counts + // + for(size_t ptr=0;ptr0) num_sources[ptr]++; + } + overall_sample_count+=total_sizes[ptr]; + + + + } + + + + + // + // allocate arrays for pixel data + // samples array accessed as in pixels[channel][sample] + // + + vector > samples( _Data->_channels.size() ); + + for(size_t channel=0;channel<_Data->_channels.size();channel++) + { + if( channel!=1 || _Data->_zback) + { + samples[channel].resize(overall_sample_count); + } + } + + for(size_t channel=0;channel_zback) + { + + samples[channel].resize(overall_sample_count); + + + // + // allocate pointers for channel data + // + + size_t offset=0; + + for(size_t pixel=0;pixel_file.size();i++) + { + _Data->_file[i]->readPixels(start,end); + } + for(size_t j=0;j<_Data->_part.size();j++) + { + _Data->_part[j]->readPixels(start,end); + } + + + + + // + // composite pixels and write back to framebuffer + // + + + // turn vector of strings into array of char * + // and make sure 'ZBack' channel is correct + vector names(_Data->_channels.size()); + for(size_t i=0;i_channels[i].c_str(); + } + + if(!_Data->_zback) names[1]=names[0]; // no zback channel, so make it point to z + + + + TaskGroup g; + for(int y=start;y<=end;y++) + { + ThreadPool::addGlobalTask(new LineCompositeTask(&g,_Data,y,start,&names,&pointers,&total_sizes,&num_sources)); + }//next row +} + +const FrameBuffer& +CompositeDeepScanLine::frameBuffer() const +{ + return _Data->_outputFrameBuffer; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfCompositeDeepScanLine.h b/IlmImf/ImfCompositeDeepScanLine.h new file mode 100644 index 0000000..2dc23e5 --- /dev/null +++ b/IlmImf/ImfCompositeDeepScanLine.h @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_COMPOSITEDEEPSCANLINE_H +#define INCLUDED_IMF_COMPOSITEDEEPSCANLINE_H + +//----------------------------------------------------------------------------- +// +// Class to composite deep samples into a frame buffer +// Initialise with a deep input part or deep inputfile +// (also supports multiple files and parts, and will +// composite them together, as long as their sizes and channelmaps agree) +// +// Then call setFrameBuffer, and readPixels, exactly as for reading +// regular scanline images. +// +// Restrictions - source file(s) must contain at least Z and alpha channels +// - if multiple files/parts are provided, sizes must match +// - all requested channels will be composited as premultiplied +// - only half and float channels can be requested +// +// This object should not be considered threadsafe +// +// The default compositing engine will give spurious results with overlapping +// volumetric samples - you may derive from DeepCompositing class, override the +// sort_pixel() and composite_pixel() functions, and pass an instance to +// setCompositing(). +// +//----------------------------------------------------------------------------- + +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT CompositeDeepScanLine +{ + public: + CompositeDeepScanLine(); + virtual ~CompositeDeepScanLine(); + + /// set the source data as a part + ///@note all parts must remain valid until after last interaction with DeepComp + void addSource(DeepScanLineInputPart * part); + + /// set the source data as a file + ///@note all file must remain valid until after last interaction with DeepComp + void addSource(DeepScanLineInputFile * file); + + + ///////////////////////////////////////// + // + // set the frame buffer for output values + // the buffers specified must be large enough + // to handle the dataWindow() + // + ///////////////////////////////////////// + void setFrameBuffer(const FrameBuffer & fr); + + + + ///////////////////////////////////////// + // + // retrieve frameBuffer + // + //////////////////////////////////////// + const FrameBuffer & frameBuffer() const; + + + ////////////////////////////////////////////////// + // + // read scanlines start to end from the source(s) + // storing the result in the frame buffer provided + // + ////////////////////////////////////////////////// + + void readPixels(int start,int end); + + int sources() const; // return number of sources + + ///////////////////////////////////////////////// + // + // retrieve the datawindow + // If multiple parts are specified, this will + // be the union of the dataWindow of all parts + // + //////////////////////////////////////////////// + + const IMATH_NAMESPACE::Box2i & dataWindow() const; + + + // + // override default sorting/compositing operation + // (otherwise an instance of the base class will be used) + // + + void setCompositing(DeepCompositing *); + + struct Data; + private : + struct Data *_Data; + + CompositeDeepScanLine(const CompositeDeepScanLine &); // not implemented + const CompositeDeepScanLine & operator=(const CompositeDeepScanLine &); // not implemented +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfCompression.h b/IlmImf/ImfCompression.h new file mode 100644 index 0000000..c066d34 --- /dev/null +++ b/IlmImf/ImfCompression.h @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_COMPRESSION_H +#define INCLUDED_IMF_COMPRESSION_H + +//----------------------------------------------------------------------------- +// +// enum Compression +// +//----------------------------------------------------------------------------- +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +enum Compression +{ + NO_COMPRESSION = 0, // no compression + + RLE_COMPRESSION = 1, // run length encoding + + ZIPS_COMPRESSION = 2, // zlib compression, one scan line at a time + + ZIP_COMPRESSION = 3, // zlib compression, in blocks of 16 scan lines + + PIZ_COMPRESSION = 4, // piz-based wavelet compression + + PXR24_COMPRESSION = 5, // lossy 24-bit float compression + + B44_COMPRESSION = 6, // lossy 4-by-4 pixel block compression, + // fixed compression rate + + B44A_COMPRESSION = 7, // lossy 4-by-4 pixel block compression, + // flat fields are compressed more + + DWAA_COMPRESSION = 8, // lossy DCT based compression, in blocks + // of 32 scanlines. More efficient for partial + // buffer access. + + DWAB_COMPRESSION = 9, // lossy DCT based compression, in blocks + // of 256 scanlines. More efficient space + // wise and faster to decode full frames + // than DWAA_COMPRESSION. + + NUM_COMPRESSION_METHODS // number of different compression methods +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfCompressionAttribute.cpp b/IlmImf/ImfCompressionAttribute.cpp new file mode 100644 index 0000000..a32c689 --- /dev/null +++ b/IlmImf/ImfCompressionAttribute.cpp @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class CompressionAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfCompressionAttribute.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + + +template <> +const char * +CompressionAttribute::staticTypeName () +{ + return "compression"; +} + + +template <> +void +CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = Compression (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfCompressionAttribute.h b/IlmImf/ImfCompressionAttribute.h new file mode 100644 index 0000000..bfc72de --- /dev/null +++ b/IlmImf/ImfCompressionAttribute.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H +#define INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class CompressionAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfCompression.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute CompressionAttribute; +template <> const char *CompressionAttribute::staticTypeName (); +template <> void CompressionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; +template <> void CompressionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, + int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfCompressor.cpp b/IlmImf/ImfCompressor.cpp new file mode 100644 index 0000000..1905a4d --- /dev/null +++ b/IlmImf/ImfCompressor.cpp @@ -0,0 +1,226 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Compressor +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfRleCompressor.h" +#include "ImfZipCompressor.h" +#include "ImfPizCompressor.h" +#include "ImfPxr24Compressor.h" +#include "ImfB44Compressor.h" +#include "ImfDwaCompressor.h" +#include "ImfCheckedArithmetic.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; + + +Compressor::Compressor (const Header &hdr): _header (hdr) {} + + +Compressor::~Compressor () {} + + +Compressor::Format +Compressor::format () const +{ + return XDR; +} + + +int +Compressor::compressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range.min.y, outPtr); +} + + +int +Compressor::uncompressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range.min.y, outPtr); +} + + +bool +isValidCompression (Compression c) +{ + switch (c) + { + case NO_COMPRESSION: + case RLE_COMPRESSION: + case ZIPS_COMPRESSION: + case ZIP_COMPRESSION: + case PIZ_COMPRESSION: + case PXR24_COMPRESSION: + case B44_COMPRESSION: + case B44A_COMPRESSION: + case DWAA_COMPRESSION: + case DWAB_COMPRESSION: + + return true; + + default: + + return false; + } +} + +bool isValidDeepCompression(Compression c) +{ + switch(c) + { + case NO_COMPRESSION: + case RLE_COMPRESSION: + case ZIPS_COMPRESSION: + return true; + default : + return false; + } +} + + +Compressor * +newCompressor (Compression c, size_t maxScanLineSize, const Header &hdr) +{ + switch (c) + { + case RLE_COMPRESSION: + + return new RleCompressor (hdr, maxScanLineSize); + + case ZIPS_COMPRESSION: + + return new ZipCompressor (hdr, maxScanLineSize, 1); + + case ZIP_COMPRESSION: + + return new ZipCompressor (hdr, maxScanLineSize, 16); + + case PIZ_COMPRESSION: + + return new PizCompressor (hdr, maxScanLineSize, 32); + + case PXR24_COMPRESSION: + + return new Pxr24Compressor (hdr, maxScanLineSize, 16); + + case B44_COMPRESSION: + + return new B44Compressor (hdr, maxScanLineSize, 32, false); + + case B44A_COMPRESSION: + + return new B44Compressor (hdr, maxScanLineSize, 32, true); + + case DWAA_COMPRESSION: + + return new DwaCompressor (hdr, maxScanLineSize, 32, + DwaCompressor::STATIC_HUFFMAN); + + case DWAB_COMPRESSION: + + return new DwaCompressor (hdr, maxScanLineSize, 256, + DwaCompressor::STATIC_HUFFMAN); + + default: + + return 0; + } +} + + +Compressor * +newTileCompressor (Compression c, + size_t tileLineSize, + size_t numTileLines, + const Header &hdr) +{ + switch (c) + { + case RLE_COMPRESSION: + + return new RleCompressor (hdr, uiMult (tileLineSize, numTileLines)); + + case ZIPS_COMPRESSION: + case ZIP_COMPRESSION: + + return new ZipCompressor (hdr, tileLineSize, numTileLines); + + case PIZ_COMPRESSION: + + return new PizCompressor (hdr, tileLineSize, numTileLines); + + case PXR24_COMPRESSION: + + return new Pxr24Compressor (hdr, tileLineSize, numTileLines); + + case B44_COMPRESSION: + + return new B44Compressor (hdr, tileLineSize, numTileLines, false); + + case B44A_COMPRESSION: + + return new B44Compressor (hdr, tileLineSize, numTileLines, true); + + case DWAA_COMPRESSION: + case DWAB_COMPRESSION: + + return new DwaCompressor (hdr, tileLineSize, numTileLines, + DwaCompressor::DEFLATE); + + default: + + return 0; + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + diff --git a/IlmImf/ImfCompressor.h b/IlmImf/ImfCompressor.h new file mode 100644 index 0000000..d04a4bb --- /dev/null +++ b/IlmImf/ImfCompressor.h @@ -0,0 +1,265 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_COMPRESSOR_H +#define INCLUDED_IMF_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class Compressor +// +//----------------------------------------------------------------------------- + +#include "ImfCompression.h" +#include "ImathBox.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT Compressor +{ + public: + + //--------------------------------------------- + // Constructor -- hdr is the header of the file + // that will be compressed or uncompressed + //--------------------------------------------- + + Compressor (const Header &hdr); + + + //----------- + // Destructor + //----------- + + virtual ~Compressor (); + + + //---------------------------------------------- + // Maximum number of scan lines processed by + // a single call to compress() and uncompress(). + //---------------------------------------------- + + virtual int numScanLines () const = 0; + + + //-------------------------------------------- + // Format of the pixel data read and written + // by the compress() and uncompress() methods. + // The default implementation of format() + // returns XDR. + //-------------------------------------------- + + enum Format + { + NATIVE, // the machine's native format + XDR // Xdr format + }; + + virtual Format format () const; + + + //---------------------------- + // Access to the file's header + //---------------------------- + + const Header & header () const {return _header;} + + + //------------------------------------------------------------------------- + // Compress an array of bytes that represents the contents of up to + // numScanLines() scan lines: + // + // inPtr Input buffer (uncompressed data). + // + // inSize Number of bytes in the input buffer + // + // minY Minimum y coordinate of the scan lines to + // be compressed + // + // outPtr Pointer to output buffer + // + // return value Size of compressed data in output buffer + // + // Arrangement of uncompressed pixel data in the input buffer: + // + // Before calling + // + // compress (buf, size, minY, ...); + // + // the InputFile::writePixels() method gathers pixel data from the + // frame buffer, fb, and places them in buffer buf, like this: + // + // char *endOfBuf = buf; + // + // for (int y = minY; + // y <= min (minY + numScanLines() - 1, header().dataWindow().max.y); + // ++y) + // { + // for (ChannelList::ConstIterator c = header().channels().begin(); + // c != header().channels().end(); + // ++c) + // { + // if (modp (y, c.channel().ySampling) != 0) + // continue; + // + // for (int x = header().dataWindow().min.x; + // x <= header().dataWindow().max.x; + // ++x) + // { + // if (modp (x, c.channel().xSampling) != 0) + // continue; + // + // Xdr::write (endOfBuf, fb.pixel (c, x, y)); + // } + // } + // } + // + // int size = endOfBuf - buf; + // + //------------------------------------------------------------------------- + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) = 0; + + virtual int compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + //------------------------------------------------------------------------- + // Uncompress an array of bytes that has been compressed by compress(): + // + // inPtr Input buffer (compressed data). + // + // inSize Number of bytes in the input buffer + // + // minY Minimum y coordinate of the scan lines to + // be uncompressed + // + // outPtr Pointer to output buffer + // + // return value Size of uncompressed data in output buffer + // + //------------------------------------------------------------------------- + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) = 0; + + virtual int uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + private: + + const Header & _header; +}; + + +//-------------------------------------- +// Test if c is a valid compression type +//-------------------------------------- + +IMF_EXPORT +bool isValidCompression (Compression c); + +//-------------------------------------- +// Test if c is valid for deep data +//-------------------------------------- + +IMF_EXPORT +bool isValidDeepCompression (Compression c); + + +//----------------------------------------------------------------- +// Construct a Compressor for compression type c: +// +// maxScanLineSize Maximum number of bytes per uncompressed +// scan line. +// +// header Header of the input or output file whose +// pixels will be compressed or uncompressed. +// +// return value A pointer to a new Compressor object (it +// is the caller's responsibility to delete +// the object), or 0 (if c is NO_COMPRESSION). +// +//----------------------------------------------------------------- + +IMF_EXPORT +Compressor * newCompressor (Compression c, + size_t maxScanLineSize, + const Header &hdr); + + +//----------------------------------------------------------------- +// Construct a Compressor for compression type c for a tiled image: +// +// tileLineSize Maximum number of bytes per uncompressed +// line in a tile. +// +// numTileLines Maximum number of lines in a tile. +// +// header Header of the input or output file whose +// pixels will be compressed or uncompressed. +// +// return value A pointer to a new Compressor object (it +// is the caller's responsibility to delete +// the object), or 0 (if c is NO_COMPRESSION). +// +//----------------------------------------------------------------- + +IMF_EXPORT +Compressor * newTileCompressor (Compression c, + size_t tileLineSize, + size_t numTileLines, + const Header &hdr); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfConvert.cpp b/IlmImf/ImfConvert.cpp new file mode 100644 index 0000000..cce7163 --- /dev/null +++ b/IlmImf/ImfConvert.cpp @@ -0,0 +1,143 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Routines for converting between pixel data types, +// with well-defined behavior for exceptional cases. +// +//----------------------------------------------------------------------------- + +#include "ImfConvert.h" +#include "ImfNamespace.h" + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +inline bool +isNegative (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x80000000) != 0; +} + + +inline bool +isNan (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7fffffff) > 0x7f800000; +} + + +inline bool +isInfinity (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7fffffff) == 0x7f800000; +} + + +inline bool +isFinite (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7f800000) != 0x7f800000; +} + +} // namespace + + +unsigned int +halfToUint (half h) +{ + if (h.isNegative() || h.isNan()) + return 0; + + if (h.isInfinity()) + return UINT_MAX; + + return (unsigned int) h; +} + + +unsigned int +floatToUint (float f) +{ + if (isNegative (f) || isNan (f)) + return 0; + + if (isInfinity (f) || f > UINT_MAX) + return UINT_MAX; + + return (unsigned int) f; +} + + +half +uintToHalf (unsigned int ui) +{ + if (ui > HALF_MAX) + return half::posInf(); + + return half ((float) ui); +} + + +half +floatToHalf (float f) +{ + if (isFinite (f)) + { + if (f > HALF_MAX) + return half::posInf(); + + if (f < -HALF_MAX) + return half::negInf(); + } + + return half (f); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfConvert.h b/IlmImf/ImfConvert.h new file mode 100644 index 0000000..b0a7f47 --- /dev/null +++ b/IlmImf/ImfConvert.h @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_CONVERT_H +#define INCLUDED_IMF_CONVERT_H + +//----------------------------------------------------------------------------- +// +// Routines for converting between pixel data types, +// with well-defined behavior for exceptional cases, +// without depending on how hardware and operating +// system handle integer overflows and floating-point +// exceptions. +// +//----------------------------------------------------------------------------- + +#include "half.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +//--------------------------------------------------------- +// Conversion from half or float to unsigned int: +// +// input result +// --------------------------------------------------- +// +// finite, >= 0 input, cast to unsigned int +// (rounds towards zero) +// +// finite, < 0 0 +// +// NaN 0 +// +// +infinity UINT_MAX +// +// -infinity 0 +// +//--------------------------------------------------------- + +IMF_EXPORT unsigned int halfToUint (half h); +IMF_EXPORT unsigned int floatToUint (float f); + + +//--------------------------------------------------------- +// Conversion from unsigned int or float to half: +// +// input result +// --------------------------------------------------- +// +// finite, closest possible half +// magnitude <= HALF_MAX +// +// finite, > HALF_MAX +infinity +// +// finite, < -HALF_MAX -infinity +// +// NaN NaN +// +// +infinity +infinity +// +// -infinity -infinity +// +//--------------------------------------------------------- + +IMF_EXPORT half uintToHalf (unsigned int ui); +IMF_EXPORT half floatToHalf (float f); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfDeepCompositing.cpp b/IlmImf/ImfDeepCompositing.cpp new file mode 100644 index 0000000..76702c1 --- /dev/null +++ b/IlmImf/ImfDeepCompositing.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfDeepCompositing.h" + +#include "ImfNamespace.h" +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using std::sort; +using std::vector; +DeepCompositing::DeepCompositing() +{ +} + +DeepCompositing::~DeepCompositing() +{ +} + +void +DeepCompositing::composite_pixel (float outputs[], + const float* inputs[], + const char*channel_names[], + int num_channels, + int num_samples, + int sources) +{ + for(int i=0;i sort_order; + if(sources>1) + { + sort_order.resize(num_samples); + for(int i=0;i1) ? sort_order[i] : i; + float alpha=outputs[2]; + if(alpha>=1.0) return; + + for(int c=0;c inputs[0][b]) return false; + if(inputs[1][a] < inputs[1][b]) return true; + if(inputs[1][a] > inputs[1][b]) return false; + return asecond; +} + + +const DeepSlice & +DeepFrameBuffer::operator [] (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + { + THROW (IEX_NAMESPACE::ArgExc, + "Cannot find frame buffer slice \"" << name << "\"."); + } + + return i->second; +} + + +DeepSlice & +DeepFrameBuffer::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const DeepSlice & +DeepFrameBuffer::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +DeepSlice * +DeepFrameBuffer::findSlice (const char name[]) +{ + SliceMap::iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +const DeepSlice * +DeepFrameBuffer::findSlice (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +DeepSlice * +DeepFrameBuffer::findSlice (const string &name) +{ + return findSlice (name.c_str()); +} + + +const DeepSlice * +DeepFrameBuffer::findSlice (const string &name) const +{ + return findSlice (name.c_str()); +} + + +DeepFrameBuffer::Iterator +DeepFrameBuffer::begin () +{ + return _map.begin(); +} + + +DeepFrameBuffer::ConstIterator +DeepFrameBuffer::begin () const +{ + return _map.begin(); +} + + +DeepFrameBuffer::Iterator +DeepFrameBuffer::end () +{ + return _map.end(); +} + + +DeepFrameBuffer::ConstIterator +DeepFrameBuffer::end () const +{ + return _map.end(); +} + + +DeepFrameBuffer::Iterator +DeepFrameBuffer::find (const char name[]) +{ + return _map.find (name); +} + + +DeepFrameBuffer::ConstIterator +DeepFrameBuffer::find (const char name[]) const +{ + return _map.find (name); +} + + +DeepFrameBuffer::Iterator +DeepFrameBuffer::find (const string &name) +{ + return find (name.c_str()); +} + + +DeepFrameBuffer::ConstIterator +DeepFrameBuffer::find (const string &name) const +{ + return find (name.c_str()); +} + + +void +DeepFrameBuffer::insertSampleCountSlice(const Slice & slice) +{ + if (slice.type != UINT) + { + throw IEX_NAMESPACE::ArgExc("The type of sample count slice should be UINT."); + } + + _sampleCounts = slice; +} + + +const Slice & +DeepFrameBuffer::getSampleCountSlice() const +{ + return _sampleCounts; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepFrameBuffer.h b/IlmImf/ImfDeepFrameBuffer.h new file mode 100644 index 0000000..8eec6ff --- /dev/null +++ b/IlmImf/ImfDeepFrameBuffer.h @@ -0,0 +1,339 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFDEEPFRAMEBUFFER_H_ +#define IMFDEEPFRAMEBUFFER_H_ + +#include "ImfFrameBuffer.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//-------------------------------------------------------- +// Description of a single deep slice of the frame buffer: +//-------------------------------------------------------- + +struct IMF_EXPORT DeepSlice : public Slice +{ + //--------------------------------------------------------------------- + // The stride for each sample in this slice. + // + // Memory layout: The address of sample i in pixel (x, y) is + // + // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride + // + i * sampleStride + // + // where xp and yp are computed as follows: + // + // * If we are reading or writing a scanline-based file: + // + // xp = x + // yp = y + // + // * If we are reading a tile whose upper left coorner is at (xt, yt): + // + // if xTileCoords is true then xp = x - xt, else xp = x + // if yTileCoords is true then yp = y - yt, else yp = y + // + //--------------------------------------------------------------------- + + int sampleStride; + + //------------ + // Constructor + //------------ + DeepSlice (PixelType type = HALF, + char * base = 0, + size_t xStride = 0, + size_t yStride = 0, + size_t sampleStride = 0, + int xSampling = 1, + int ySampling = 1, + double fillValue = 0.0, + bool xTileCoords = false, + bool yTileCoords = false); +}; + +//----------------- +// DeepFrameBuffer. +//----------------- + +class IMF_EXPORT DeepFrameBuffer +{ + public: + + + //------------ + // Add a slice + //------------ + + void insert (const char name[], + const DeepSlice &slice); + + void insert (const std::string &name, + const DeepSlice &slice); + + //---------------------------------------------------------------- + // Access to existing slices: + // + // [n] Returns a reference to the slice with name n. + // If no slice with name n exists, an IEX_NAMESPACE::ArgExc + // is thrown. + // + // findSlice(n) Returns a pointer to the slice with name n, + // or 0 if no slice with name n exists. + // + //---------------------------------------------------------------- + + DeepSlice & operator [] (const char name[]); + const DeepSlice & operator [] (const char name[]) const; + + DeepSlice & operator [] (const std::string &name); + const DeepSlice & operator [] (const std::string &name) const; + + DeepSlice * findSlice (const char name[]); + const DeepSlice * findSlice (const char name[]) const; + + DeepSlice * findSlice (const std::string &name); + const DeepSlice * findSlice (const std::string &name) const; + + + //----------------------------------------- + // Iterator-style access to existing slices + //----------------------------------------- + + typedef std::map SliceMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + //---------------------------------------------------- + // Public function for accessing a sample count slice. + //---------------------------------------------------- + + void insertSampleCountSlice(const Slice & slice); + const Slice & getSampleCountSlice() const; + + private: + + SliceMap _map; + Slice _sampleCounts; +}; + +//---------- +// Iterators +//---------- + +class DeepFrameBuffer::Iterator +{ + public: + + Iterator (); + Iterator (const DeepFrameBuffer::SliceMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + DeepSlice & slice () const; + + private: + + friend class DeepFrameBuffer::ConstIterator; + + DeepFrameBuffer::SliceMap::iterator _i; +}; + + +class DeepFrameBuffer::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const DeepFrameBuffer::SliceMap::const_iterator &i); + ConstIterator (const DeepFrameBuffer::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const DeepSlice & slice () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + DeepFrameBuffer::SliceMap::const_iterator _i; +}; + + +//----------------- +// Inline Functions +//----------------- + +inline +DeepFrameBuffer::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +DeepFrameBuffer::Iterator::Iterator (const DeepFrameBuffer::SliceMap::iterator &i): + _i (i) +{ + // empty +} + + +inline DeepFrameBuffer::Iterator & +DeepFrameBuffer::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline DeepFrameBuffer::Iterator +DeepFrameBuffer::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +DeepFrameBuffer::Iterator::name () const +{ + return *_i->first; +} + + +inline DeepSlice & +DeepFrameBuffer::Iterator::slice () const +{ + return _i->second; +} + + +inline +DeepFrameBuffer::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +DeepFrameBuffer::ConstIterator::ConstIterator + (const DeepFrameBuffer::SliceMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +DeepFrameBuffer::ConstIterator::ConstIterator (const DeepFrameBuffer::Iterator &other): + _i (other._i) +{ + // empty +} + +inline DeepFrameBuffer::ConstIterator & +DeepFrameBuffer::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline DeepFrameBuffer::ConstIterator +DeepFrameBuffer::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +DeepFrameBuffer::ConstIterator::name () const +{ + return *_i->first; +} + +inline const DeepSlice & +DeepFrameBuffer::ConstIterator::slice () const +{ + return _i->second; +} + + +inline bool +operator == (const DeepFrameBuffer::ConstIterator &x, + const DeepFrameBuffer::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const DeepFrameBuffer::ConstIterator &x, + const DeepFrameBuffer::ConstIterator &y) +{ + return !(x == y); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + + +#endif /* IMFDEEPFRAMEBUFFER_H_ */ diff --git a/IlmImf/ImfDeepImageState.h b/IlmImf/ImfDeepImageState.h new file mode 100644 index 0000000..a3941c4 --- /dev/null +++ b/IlmImf/ImfDeepImageState.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_DEEPIMAGESTATE_H +#define INCLUDED_IMF_DEEPIMAGESTATE_H + +//----------------------------------------------------------------------------- +// +// enum DeepImageState -- describes how orderly the pixel data +// in a deep image are +// +// The samples in a deep image pixel may be sorted according to +// depth, and the sample depths or depth ranges may or may not +// overlap each other. A pixel is +// +// - SORTED if for every i and j with i < j +// +// (Z[i] < Z[j]) || (Z[i] == Z[j] && ZBack[i] < ZBack[j]), +// +// - NON_OVERLAPPING if for every i and j with i != j +// +// (Z[i] < Z[j] && ZBack[i] <= Z[j]) || +// (Z[j] < Z[i] && ZBack[j] <= Z[i]) || +// (Z[i] == Z[j] && ZBack[i] <= Z[i] & ZBack[j] > Z[j]) || +// (Z[i] == Z[j] && ZBack[j] <= Z[j] & ZBack[i] > Z[i]), +// +// - TIDY if it is SORTED and NON_OVERLAPPING, +// +// - MESSY if it is neither SORTED nor NON_OVERLAPPING. +// +// A deep image is +// +// - MESSY if at least one of its pixels is MESSY, +// - SORTED if all of its pixels are SORTED, +// - NON_OVERLAPPING if all of its pixels are NON_OVERLAPPING, +// - TIDY if all of its pixels are TIDY. +// +// Note: the rather complicated definition of NON_OVERLAPPING prohibits +// overlapping volume samples, coincident point samples and point samples +// in the middle of a volume sample, but it does allow point samples at +// the front or back of a volume sample. +// +//----------------------------------------------------------------------------- + +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +enum DeepImageState +{ + DIS_MESSY = 0, + DIS_SORTED = 1, + DIS_NON_OVERLAPPING = 2, + DIS_TIDY = 3, + + DIS_NUMSTATES // Number of different image states +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfDeepImageStateAttribute.cpp b/IlmImf/ImfDeepImageStateAttribute.cpp new file mode 100644 index 0000000..86a70a6 --- /dev/null +++ b/IlmImf/ImfDeepImageStateAttribute.cpp @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class DeepImageStateAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +DeepImageStateAttribute::staticTypeName () +{ + return "deepImageState"; +} + + +template <> +void +DeepImageStateAttribute::writeValueTo + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +DeepImageStateAttribute::readValueFrom + (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = DeepImageState (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepImageStateAttribute.h b/IlmImf/ImfDeepImageStateAttribute.h new file mode 100644 index 0000000..6174e94 --- /dev/null +++ b/IlmImf/ImfDeepImageStateAttribute.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DEEPIMAGESTATE_ATTRIBUTE_H +#define INCLUDED_IMF_DEEPIMAGESTATE_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class DeepImageStateAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfDeepImageState.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute + DeepImageStateAttribute; + +template <> IMF_EXPORT const char *DeepImageStateAttribute::staticTypeName (); + +template <> IMF_EXPORT +void DeepImageStateAttribute::writeValueTo + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; + +template <> IMF_EXPORT +void DeepImageStateAttribute::readValueFrom + (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDeepScanLineInputFile.cpp b/IlmImf/ImfDeepScanLineInputFile.cpp new file mode 100644 index 0000000..8a7002b --- /dev/null +++ b/IlmImf/ImfDeepScanLineInputFile.cpp @@ -0,0 +1,2025 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class DeepScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ImfMultiPartInputFile.h" +#include "ImfDeepFrameBuffer.h" +#include "ImfInputStreamMutex.h" +#include "ImfInputPartData.h" + + +#include "ImathBox.h" +#include "ImathFun.h" + + +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" + +#include "Iex.h" + +#include +#include +#include +#include +#include + + +#include "ImfNamespace.h" +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using std::string; +using std::vector; +using std::ifstream; +using std::min; +using std::max; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct InSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char * base; + char* pointerArrayBase; + size_t xPointerStride; + size_t yPointerStride; + size_t sampleStride; + int xSampling; + int ySampling; + bool fill; + bool skip; + double fillValue; + + InSliceInfo (PixelType typeInFrameBuffer = HALF, + char * base = NULL, + PixelType typeInFile = HALF, + size_t xPointerStride = 0, + size_t yPointerStride = 0, + size_t sampleStride = 0, + int xSampling = 1, + int ySampling = 1, + bool fill = false, + bool skip = false, + double fillValue = 0.0); +}; + + +InSliceInfo::InSliceInfo (PixelType tifb, + char * b, + PixelType tifl, + size_t xpst, + size_t ypst, + size_t spst, + int xsm, int ysm, + bool f, bool s, + double fv) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + base(b), + xPointerStride (xpst), + yPointerStride (ypst), + sampleStride (spst), + xSampling (xsm), + ySampling (ysm), + fill (f), + skip (s), + fillValue (fv) +{ + // empty +} + + +struct LineBuffer +{ + const char * uncompressedData; + char * buffer; + Int64 packedDataSize; + Int64 unpackedDataSize; + + int minY; + int maxY; + Compressor * compressor; + Compressor::Format format; + int number; + bool hasException; + string exception; + + LineBuffer (); + ~LineBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (): + uncompressedData (0), + buffer (0), + packedDataSize (0), + compressor (0), + format (defaultFormat(compressor)), + number (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +LineBuffer::~LineBuffer () +{ + if (compressor != 0) + delete compressor; +} + +} // namespace + + +struct DeepScanLineInputFile::Data: public Mutex +{ + Header header; // the image header + int version; // file's version + DeepFrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // order of the scanlines in file + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each line + bool fileIsComplete; // True if no scanlines are missing + // in the file + int nextLineBufferMinY; // minimum y of the next linebuffer + vector bytesPerLine; // combined size of a line over all + // channels + vector offsetInLineBuffer; // offset for each scanline in its + // linebuffer + vector slices; // info about channels in file + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each buffer + // holds + int partNumber; // part number + int numThreads; // number of threads + + bool multiPartBackwardSupport; // if we are reading a multipart file using single file API + MultiPartInputFile* multiPartFile; // for multipart files opened as single part + bool memoryMapped; // if the stream is memory mapped + + Array2D sampleCount; // the number of samples + // in each pixel + + Array lineSampleCount; // the number of samples + // in each line + + Array gotSampleCount; // for each scanline, indicating if + // we have got its sample count table + + char* sampleCountSliceBase; // pointer to the start of + // the sample count array + int sampleCountXStride; // x stride of the sample count array + int sampleCountYStride; // y stride of the sample count array + bool frameBufferValid; // set by setFrameBuffer: excepts if readPixelSampleCounts if false + + Array sampleCountTableBuffer; + // the buffer for sample count table + + Compressor* sampleCountTableComp; + // the decompressor for sample count table + + int combinedSampleSize; // total size of all channels combined: used to sanity check sample table size + + int maxSampleCountTableSize; + // the max size in bytes for a pixel + // sample count table + InputStreamMutex* _streamData; + bool _deleteStream; + + + Data (int numThreads); + ~Data (); + + inline LineBuffer * getLineBuffer (int number); // hash function from line + // buffer indices into our + // vector of line buffers +}; + + +DeepScanLineInputFile::Data::Data (int numThreads): + partNumber(-1), + numThreads(numThreads), + multiPartBackwardSupport(false), + multiPartFile(NULL), + memoryMapped(false), + frameBufferValid(false), + _streamData(NULL), + _deleteStream(false) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers + // + + lineBuffers.resize (max (1, 2 * numThreads)); + + for (size_t i = 0; i < lineBuffers.size(); i++) + lineBuffers[i] = 0; + + sampleCountTableComp = 0; +} + + +DeepScanLineInputFile::Data::~Data () +{ + for (size_t i = 0; i < lineBuffers.size(); i++) + if (lineBuffers[i] != 0) + delete lineBuffers[i]; + + for (size_t i = 0; i < slices.size(); i++) + delete slices[i]; + + if (sampleCountTableComp != 0) + delete sampleCountTableComp; + + if (multiPartBackwardSupport) + delete multiPartFile; +} + + +inline LineBuffer * +DeepScanLineInputFile::Data::getLineBuffer (int lineBufferNumber) +{ + return lineBuffers[lineBufferNumber % lineBuffers.size()]; +} + + +namespace { + + +void +reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + LineOrder lineOrder, + vector &lineOffsets) +{ + Int64 position = is.tellg(); + + try + { + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + Int64 lineOffset = is.tellg(); + + int y; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y); + + Int64 packed_offset; + Int64 packed_sample; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); + //next is unpacked sample table size - skip this too + Xdr::skip (is, packed_offset+packed_sample+8); + + if (lineOrder == INCREASING_Y) + lineOffsets[i] = lineOffset; + else + lineOffsets[lineOffsets.size() - i - 1] = lineOffset; + } + } + catch (...) + { + // + // Suppress all exceptions. This functions is + // called only to reconstruct the line offset + // table for incomplete files, and exceptions + // are likely. + // + } + + is.clear(); + is.seekg (position); +} + + +void +readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + LineOrder lineOrder, + vector &lineOffsets, + bool &complete) +{ + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, lineOffsets[i]); + } + + complete = true; + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + if (lineOffsets[i] <= 0) + { + // + // Invalid data in the line offset table mean that + // the file is probably incomplete (the table is + // the last thing written to the file). Either + // some process is still busy writing the file, + // or writing the file was aborted. + // + // We should still be able to read the existing + // parts of the file. In order to do this, we + // have to make a sequential scan over the scan + // line data to reconstruct the line offset table. + // + + complete = false; + reconstructLineOffsets (is, lineOrder, lineOffsets); + break; + } + } +} + + +void +readPixelData (InputStreamMutex *streamData, + DeepScanLineInputFile::Data *ifd, + int minY, + char *&buffer, + Int64 &packedDataSize, + Int64 &unpackedDataSize) +{ + // + // Read a single line buffer from the input file. + // + // If the input file is not memory-mapped, we copy the pixel data into + // into the array pointed to by buffer. If the file is memory-mapped, + // then we change where buffer points to instead of writing into the + // array (hence buffer needs to be a reference to a char *). + // + + int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer; + + Int64 lineOffset = ifd->lineOffsets[lineBufferNumber]; + + if (lineOffset == 0) + THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); + + // + // Seek to the start of the scan line in the file, + // if necessary. + // + + if (!isMultiPart(ifd->version)) + { + if (ifd->nextLineBufferMinY != minY) + streamData->is->seekg (lineOffset); + } + else + { + // + // In a multi-part file, the file pointer may have been moved by + // other parts, so we have to ask tellg() where we are. + // + if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber]) + streamData->is->seekg (lineOffset); + } + + // + // Read the data block's header. + // + + int yInFile; + + // + // Read the part number when we are dealing with a multi-part file. + // + + if (isMultiPart(ifd->version)) + { + int partNumber; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); + if (partNumber != ifd->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << ifd->partNumber << "."); + } + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, yInFile); + + if (yInFile != minY) + throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); + + Int64 sampleCountTableSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, sampleCountTableSize); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, packedDataSize); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, unpackedDataSize); + + + // + // We make a check on the data size requirements here. + // Whilst we wish to store 64bit sizes on disk, not all the compressors + // have been made to work with such data sizes and are still limited to + // using signed 32 bit (int) for the data size. As such, this version + // insists that we validate that the data size does not exceed the data + // type max limit. + // @TODO refactor the compressor code to ensure full 64-bit support. + // + + int compressorMaxDataSize = std::numeric_limits::max(); + if (packedDataSize > Int64(compressorMaxDataSize) || + unpackedDataSize > Int64(compressorMaxDataSize)) + { + THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not support " + << "the allocation of data with size > " << compressorMaxDataSize + << " file unpacked size :" << unpackedDataSize + << " file packed size :" << packedDataSize << ".\n"); + } + + // + // Skip the pixel sample count table because we have read this data. + // + + Xdr::skip (*streamData->is, sampleCountTableSize); + + // + // Read the pixel data. + // + + if (streamData->is->isMemoryMapped ()) + buffer = streamData->is->readMemoryMapped (packedDataSize); + else + { + // (TODO) check if the packed data size is too big? + // (TODO) better memory management. Don't delete buffer all the time. + if (buffer != 0) delete[] buffer; + buffer = new char[packedDataSize]; + streamData->is->read (buffer, packedDataSize); + } + + // + // Keep track of which scan line is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + if (ifd->lineOrder == INCREASING_Y) + ifd->nextLineBufferMinY = minY + ifd->linesInBuffer; + else + ifd->nextLineBufferMinY = minY - ifd->linesInBuffer; +} + +// +// A LineBufferTask encapsulates the task uncompressing a set of +// scanlines (line buffer) and copying them into the frame buffer. +// + +class LineBufferTask : public Task +{ + public: + + LineBufferTask (TaskGroup *group, + DeepScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + DeepScanLineInputFile::Data * _ifd; + LineBuffer * _lineBuffer; + int _scanLineMin; + int _scanLineMax; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + DeepScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax) +: + Task (group), + _ifd (ifd), + _lineBuffer (lineBuffer), + _scanLineMin (scanLineMin), + _scanLineMax (scanLineMax) +{ + // empty +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // Uncompress the data, if necessary + // + + if (_lineBuffer->uncompressedData == 0) + { + Int64 uncompressedSize = 0; + int maxY = min (_lineBuffer->maxY, _ifd->maxY); + + for (int i = _lineBuffer->minY - _ifd->minY; + i <= maxY - _ifd->minY; + ++i) + { + uncompressedSize += (int) _ifd->bytesPerLine[i]; + } + + // + // Create the compressor everytime when we want to use it, + // because we don't know maxBytesPerLine beforehand. + // (TODO) optimize this. don't do this every time. + // + + if (_lineBuffer->compressor != 0) + delete _lineBuffer->compressor; + Int64 maxBytesPerLine = 0; + for (int i = _lineBuffer->minY - _ifd->minY; + i <= maxY - _ifd->minY; + ++i) + { + if (_ifd->bytesPerLine[i] > maxBytesPerLine) + maxBytesPerLine = _ifd->bytesPerLine[i]; + } + _lineBuffer->compressor = newCompressor(_ifd->header.compression(), + maxBytesPerLine, + _ifd->header); + + if (_lineBuffer->compressor && + _lineBuffer->packedDataSize < uncompressedSize) + { + _lineBuffer->format = _lineBuffer->compressor->format(); + + _lineBuffer->packedDataSize = _lineBuffer->compressor->uncompress + (_lineBuffer->buffer, _lineBuffer->packedDataSize, + _lineBuffer->minY, _lineBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _lineBuffer->format = Compressor::XDR; + _lineBuffer->uncompressedData = _lineBuffer->buffer; + } + } + + int yStart, yStop, dy; + + if (_ifd->lineOrder == INCREASING_Y) + { + yStart = _scanLineMin; + yStop = _scanLineMax + 1; + dy = 1; + } + else + { + yStart = _scanLineMax; + yStop = _scanLineMin - 1; + dy = -1; + } + + for (int y = yStart; y != yStop; y += dy) + { + // + // Convert one scan line's worth of pixel data back + // from the machine-independent representation, and + // store the result in the frame buffer. + // + + const char *readPtr = _lineBuffer->uncompressedData + + _ifd->offsetInLineBuffer[y - _ifd->minY]; + + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + InSliceInfo &slice = *_ifd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the x coordinates of the leftmost and rightmost + // sampled pixels (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, + _ifd->lineSampleCount[y - _ifd->minY]); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + int width = (_ifd->maxX - _ifd->minX + 1); + + copyIntoDeepFrameBuffer (readPtr, slice.base, + (char*) (&_ifd->sampleCount[0][0] + - _ifd->minX + - _ifd->minY * width), + sizeof(unsigned int) * 1, + sizeof(unsigned int) * width, + y, _ifd->minX, _ifd->maxX, + 0, 0, + 0, 0, + slice.sampleStride, + slice.xPointerStride, + slice.yPointerStride, + slice.fill, + slice.fillValue, _lineBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what(); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + + +LineBufferTask * +newLineBufferTask + (TaskGroup *group, + DeepScanLineInputFile::Data *ifd, + int number, + int scanLineMin, + int scanLineMax) +{ + // + // Wait for a line buffer to become available, fill the line + // buffer with raw data from the file if necessary, and create + // a new LineBufferTask whose execute() method will uncompress + // the contents of the buffer and copy the pixels into the + // frame buffer. + // + + LineBuffer *lineBuffer = ifd->getLineBuffer (number); + + try + { + lineBuffer->wait (); + + if (lineBuffer->number != number) + { + lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer; + lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1; + + lineBuffer->number = number; + lineBuffer->uncompressedData = 0; + + readPixelData (ifd->_streamData, ifd, lineBuffer->minY, + lineBuffer->buffer, + lineBuffer->packedDataSize, + lineBuffer->unpackedDataSize); + } + } + catch (std::exception &e) + { + if (!lineBuffer->hasException) + { + lineBuffer->exception = e.what(); + lineBuffer->hasException = true; + } + lineBuffer->number = -1; + lineBuffer->post(); + throw; + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the line buffer is free, and + // re-throw the exception. + // + + lineBuffer->exception = "unrecognized exception"; + lineBuffer->hasException = true; + lineBuffer->number = -1; + lineBuffer->post(); + throw; + } + + scanLineMin = max (lineBuffer->minY, scanLineMin); + scanLineMax = min (lineBuffer->maxY, scanLineMax); + + return new LineBufferTask (group, ifd, lineBuffer, + scanLineMin, scanLineMax); +} + +} // namespace + + +void DeepScanLineInputFile::initialize(const Header& header) +{ + try + { + if (header.type() != DEEPSCANLINE) + throw IEX_NAMESPACE::ArgExc("Can't build a DeepScanLineInputFile from " + "a type-mismatched part."); + + if(header.version()!=1) + { + THROW(IEX_NAMESPACE::ArgExc, "Version " << header.version() << " not supported for deepscanline images in this version of the library"); + } + + _data->header = header; + + _data->lineOrder = _data->header.lineOrder(); + + const Box2i &dataWindow = _data->header.dataWindow(); + + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->sampleCount.resizeErase(_data->maxY - _data->minY + 1, + _data->maxX - _data->minX + 1); + _data->lineSampleCount.resizeErase(_data->maxY - _data->minY + 1); + + Compressor* compressor = newCompressor(_data->header.compression(), + 0, + _data->header); + + _data->linesInBuffer = numLinesInBuffer (compressor); + + delete compressor; + + _data->nextLineBufferMinY = _data->minY - 1; + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + _data->linesInBuffer) / _data->linesInBuffer; + + _data->lineOffsets.resize (lineOffsetSize); + + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + _data->lineBuffers[i] = new LineBuffer (); + + _data->gotSampleCount.resizeErase(_data->maxY - _data->minY + 1); + for (int i = 0; i < _data->maxY - _data->minY + 1; i++) + _data->gotSampleCount[i] = false; + + _data->maxSampleCountTableSize = min(_data->linesInBuffer, _data->maxY - _data->minY + 1) * + (_data->maxX - _data->minX + 1) * + sizeof(unsigned int); + + _data->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); + + _data->sampleCountTableComp = newCompressor(_data->header.compression(), + _data->maxSampleCountTableSize, + _data->header); + + _data->bytesPerLine.resize (_data->maxY - _data->minY + 1); + + const ChannelList & c=header.channels(); + + _data->combinedSampleSize=0; + for(ChannelList::ConstIterator i=c.begin();i!=c.end();i++) + { + switch(i.channel().type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : + _data->combinedSampleSize+=Xdr::size(); + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : + _data->combinedSampleSize+=Xdr::size(); + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : + _data->combinedSampleSize+=Xdr::size(); + break; + default : + THROW(IEX_NAMESPACE::ArgExc, "Bad type for channel " << i.name() << " initializing deepscanline reader"); + + } + } + + } + catch (...) + { + delete _data; + _data=NULL; + throw; + } +} + + +DeepScanLineInputFile::DeepScanLineInputFile(InputPartData* part) + +{ + + _data = new Data(part->numThreads); + _data->_deleteStream=false; + _data->_streamData = part->mutex; + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + _data->version = part->version; + + initialize(part->header); + + _data->lineOffsets = part->chunkOffsets; + + _data->partNumber = part->partNumber; +} + + +DeepScanLineInputFile::DeepScanLineInputFile + (const char fileName[], int numThreads) +: + _data (new Data (numThreads)) +{ + _data->_streamData = new InputStreamMutex(); + _data->_deleteStream = true; + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0; + + try + { + is = new StdIFStream (fileName); + readMagicNumberAndVersionField(*is, _data->version); + // + // Backward compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(*is); + return; + } + _data->_streamData->is = is; + _data->memoryMapped = is->isMemoryMapped(); + _data->header.readFrom (*_data->_streamData->is, _data->version); + _data->header.sanityCheck (isTiled (_data->version)); + + initialize(_data->header); + + readLineOffsets (*_data->_streamData->is, + _data->lineOrder, + _data->lineOffsets, + _data->fileIsComplete); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (is) delete is; + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if (is) delete is; + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + + +DeepScanLineInputFile::DeepScanLineInputFile + (const Header &header, + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int version, + int numThreads) +: + _data (new Data (numThreads)) +{ + _data->_streamData=new InputStreamMutex(); + _data->_deleteStream=false; + _data->_streamData->is = is; + + _data->memoryMapped = is->isMemoryMapped(); + + _data->version =version; + + initialize (header); + + readLineOffsets (*_data->_streamData->is, + _data->lineOrder, + _data->lineOffsets, + _data->fileIsComplete); +} + + +DeepScanLineInputFile::~DeepScanLineInputFile () +{ + if (_data->_deleteStream) + delete _data->_streamData->is; + + if (_data) + { + if (!_data->memoryMapped) + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + delete [] _data->lineBuffers[i]->buffer; + + // + // Unless this file was opened via the multipart API, delete the streamdata + // object too. + // (TODO) it should be "isMultiPart(data->version)", but when there is only + // single part, + // (see the above constructor) the version field is not set. + // + // (TODO) we should have a way to tell if the stream data is owned by this + // file or by a parent multipart file. + // + + if (_data->partNumber == -1 && _data->_streamData) + delete _data->_streamData; + + delete _data; + } +} + +void +DeepScanLineInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) +{ + is.seekg(0); + // + // Construct a MultiPartInputFile, initialize TiledInputFile + // with the part 0 data. + // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. + // + _data->multiPartBackwardSupport = true; + _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); + InputPartData* part = _data->multiPartFile->getPart(0); + + multiPartInitialize(part); +} + +void DeepScanLineInputFile::multiPartInitialize(InputPartData* part) +{ + + _data->_streamData = part->mutex; + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + _data->version = part->version; + + initialize(part->header); + + _data->lineOffsets = part->chunkOffsets; + + _data->partNumber = part->partNumber; + +} + + +const char * +DeepScanLineInputFile::fileName () const +{ + return _data->_streamData->is->fileName(); +} + + +const Header & +DeepScanLineInputFile::header () const +{ + return _data->header; +} + + +int +DeepScanLineInputFile::version () const +{ + return _data->version; +} + + +void +DeepScanLineInputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + + // + // Check if the new frame buffer descriptor is + // compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // + // Store the pixel sample count table. + // (TODO) Support for different sampling rates? + // + + const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); + if (sampleCountSlice.base == 0) + { + throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); + } + else + { + _data->sampleCountSliceBase = sampleCountSlice.base; + _data->sampleCountXStride = sampleCountSlice.xStride; + _data->sampleCountYStride = sampleCountSlice.yStride; + } + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (new InSliceInfo (i.channel().type, + NULL, + i.channel().type, + 0, + 0, + 0, // sampleStride + i.channel().xSampling, + i.channel().ySampling, + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (new InSliceInfo (j.slice().type, + j.slice().base, + fill? j.slice().type: + i.channel().type, + j.slice().xStride, + j.slice().yStride, + j.slice().sampleStride, + j.slice().xSampling, + j.slice().ySampling, + fill, + false, // skip + j.slice().fillValue)); + + + if (i != channels.end() && !fill) + ++i; + } + + // + // Client may want data to be filled in multiple arrays, + // so we reset gotSampleCount and bytesPerLine. + // + + for (long i = 0; i < _data->gotSampleCount.size(); i++) + _data->gotSampleCount[i] = false; + for (size_t i = 0; i < _data->bytesPerLine.size(); i++) + _data->bytesPerLine[i] = 0; + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + + for (size_t i = 0; i < _data->slices.size(); i++) + delete _data->slices[i]; + _data->slices = slices; + _data->frameBufferValid = true; +} + + +const DeepFrameBuffer & +DeepScanLineInputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +bool +DeepScanLineInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + + +void +DeepScanLineInputFile::readPixels (int scanLine1, int scanLine2) +{ + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + int scanLineMin = min (scanLine1, scanLine2); + int scanLineMax = max (scanLine1, scanLine2); + + if (scanLineMin < _data->minY || scanLineMax > _data->maxY) + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + + for (int i = scanLineMin; i <= scanLineMax; i++) + { + if (_data->gotSampleCount[i - _data->minY] == false) + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line without " + "knowing the sample counts, please" + "read the sample counts first."); + } + + + // + // We impose a numbering scheme on the lineBuffers where the first + // scanline is contained in lineBuffer 1. + // + // Determine the first and last lineBuffer numbers in this scanline + // range. We always attempt to read the scanlines in the order that + // they are stored in the file. + // + + int start, stop, dl; + + if (_data->lineOrder == INCREASING_Y) + { + start = (scanLineMin - _data->minY) / _data->linesInBuffer; + stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1; + dl = 1; + } + else + { + start = (scanLineMax - _data->minY) / _data->linesInBuffer; + stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1; + dl = -1; + } + + // + // Create a task group for all line buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add the line buffer tasks. + // + // The tasks will execute in the order that they are created + // because we lock the line buffers during construction and the + // constructors are called by the main thread. Hence, in order + // for a successive task to execute the previous task which + // used that line buffer must have completed already. + // + + for (int l = start; l != stop; l += dl) + { + ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup, + _data, l, + scanLineMin, + scanLineMax)); + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to ScanLineInputFile::readPixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +DeepScanLineInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +void +DeepScanLineInputFile::rawPixelData (int firstScanLine, + char *pixelData, + Int64 &pixelDataSize) +{ + + + int minY = lineBufferMinY + (firstScanLine, _data->minY, _data->linesInBuffer); + int lineBufferNumber = (minY - _data->minY) / _data->linesInBuffer; + + Int64 lineOffset = _data->lineOffsets[lineBufferNumber]; + + if (lineOffset == 0) + THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); + + + // enter the lock here - prevent another thread reseeking the file during read + Lock lock (*_data->_streamData); + + // + // Seek to the start of the scan line in the file, + // + + if (_data->_streamData->is->tellg() != _data->lineOffsets[lineBufferNumber]) + _data->_streamData->is->seekg (lineOffset); + + // + // Read the data block's header. + // + + int yInFile; + + // + // Read the part number when we are dealing with a multi-part file. + // + + if (isMultiPart(_data->version)) + { + int partNumber; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, partNumber); + if (partNumber != _data->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << _data->partNumber << "."); + } + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, yInFile); + + if (yInFile != minY) + throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); + + Int64 sampleCountTableSize; + Int64 packedDataSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, sampleCountTableSize); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*_data->_streamData->is, packedDataSize); + + // total requirement for reading all the data + + Int64 totalSizeRequired=28+sampleCountTableSize+packedDataSize; + + bool big_enough = totalSizeRequired<=pixelDataSize; + + pixelDataSize = totalSizeRequired; + + // was the block we were given big enough? + if(!big_enough || pixelData==NULL) + { + // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek + // in single part files) + if(!isMultiPart(_data->version)) + { + if (_data->nextLineBufferMinY == minY) + _data->_streamData->is->seekg (lineOffset); + } + // leave lock here - bail before reading more data + return; + } + + // copy the values we have read into the output block + *(int *) pixelData = yInFile; + *(Int64 *) (pixelData+4) =sampleCountTableSize; + *(Int64 *) (pixelData+12) = packedDataSize; + + // didn't read the unpackedsize - do that now + Xdr::read (*_data->_streamData->is, *(Int64 *) (pixelData+20)); + + // read the actual data + _data->_streamData->is->read(pixelData+28, sampleCountTableSize+packedDataSize); + + // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek + // in single part files) + if(!isMultiPart(_data->version)) + { + if (_data->nextLineBufferMinY == minY) + _data->_streamData->is->seekg (lineOffset); + } + + // leave lock here + +} + +void DeepScanLineInputFile::readPixels (const char* rawPixelData, + const DeepFrameBuffer& frameBuffer, + int scanLine1, + int scanLine2) const +{ + // + // read header from block - already converted from Xdr to native format + // + int data_scanline = *(int *) rawPixelData; + Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4); + Int64 packedDataSize = *(Int64 *) (rawPixelData+12); + Int64 unpackedDataSize = *(Int64 *) (rawPixelData+20); + + + + // + // Uncompress the data, if necessary + // + + + Compressor * decomp = NULL; + const char * uncompressed_data; + Compressor::Format format = Compressor::XDR; + if(packedDataSize header.compression(), + unpackedDataSize, + _data->header); + + decomp->uncompress(rawPixelData+28+sampleCountTableDataSize, + packedDataSize, + data_scanline, uncompressed_data); + format = decomp->format(); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + format = Compressor::XDR; + uncompressed_data = rawPixelData+28+sampleCountTableDataSize; + } + + + int yStart, yStop, dy; + + if (_data->lineOrder == INCREASING_Y) + { + yStart = scanLine1; + yStop = scanLine2 + 1; + dy = 1; + } + else + { + yStart = scanLine2; + yStop = scanLine1 - 1; + dy = -1; + } + + + + const char* samplecount_base = frameBuffer.getSampleCountSlice().base; + int samplecount_xstride = frameBuffer.getSampleCountSlice().xStride; + int samplecount_ystride = frameBuffer.getSampleCountSlice().yStride; + + // + // For each line within the block, get the count of bytes. + // + + int minYInLineBuffer = data_scanline; + int maxYInLineBuffer = min(minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY); + + vector bytesPerLine(1+_data->maxY-_data->minY); + + + bytesPerDeepLineTable (_data->header, + minYInLineBuffer, + maxYInLineBuffer, + samplecount_base, + samplecount_xstride, + samplecount_ystride, + bytesPerLine); + + // + // For each scanline within the block, get the offset. + // + + vector offsetInLineBuffer; + offsetInLineBufferTable (bytesPerLine, + minYInLineBuffer - _data->minY, + maxYInLineBuffer - _data->minY, + _data->linesInBuffer, + offsetInLineBuffer); + + + const ChannelList & channels=header().channels(); + + + for (int y = yStart; y != yStop; y += dy) + { + + const char *readPtr =uncompressed_data + + offsetInLineBuffer[y - _data->minY]; + + // + // need to know the total number of samples on a scanline to skip channels + // compute on demand: -1 means uncomputed + // + int lineSampleCount = -1; + + + // + // Iterate over all image channels in frame buffer + // + + + ChannelList::ConstIterator i = channels.begin(); + + for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; skip + + if(lineSampleCount==-1) + { + lineSampleCount=0; + const char * ptr = (samplecount_base+y*samplecount_ystride + samplecount_xstride*_data->minX); + for(int x=_data->minX;x<=_data->maxX;x++) + { + + lineSampleCount+=*(const unsigned int *) ptr; + ptr+=samplecount_xstride; + } + } + + skipChannel (readPtr, i.channel().type, lineSampleCount ); + + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + if (modp (y, i.channel().ySampling) == 0) + { + + copyIntoDeepFrameBuffer (readPtr, j.slice().base, + samplecount_base, + samplecount_xstride, + samplecount_ystride, + y, _data->minX, _data->maxX, + 0, 0, + 0, 0, + j.slice().sampleStride, + j.slice().xStride, + j.slice().yStride, + fill, + j.slice().fillValue, + format, + j.slice().type, + i.channel().type); + + ++i; + + } + }//next slice in framebuffer + }//next row in image + + // + // clean up + // + + delete decomp; +} + + + +void DeepScanLineInputFile::readPixelSampleCounts (const char* rawPixelData, + const DeepFrameBuffer& frameBuffer, + int scanLine1, + int scanLine2) const +{ + // + // read header from block - already converted from Xdr to native format + // + int data_scanline = *(int *) rawPixelData; + Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4); + + + int maxY; + maxY = min(data_scanline + _data->linesInBuffer - 1, _data->maxY); + + if(scanLine1 != data_scanline) + { + THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect start scanline - should be " << data_scanline ); + } + + if(scanLine2 != maxY) + { + THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect end scanline - should be " << maxY ); + } + + + // + // If the sample count table is compressed, we'll uncompress it. + // + + Int64 rawSampleCountTableSize = (maxY - data_scanline + 1) * (_data->maxX - _data->minX + 1) * + Xdr::size (); + + + Compressor * decomp=NULL; + const char* readPtr; + if (sampleCountTableDataSize < rawSampleCountTableSize) + { + decomp = newCompressor(_data->header.compression(), + rawSampleCountTableSize, + _data->header); + + decomp->uncompress(rawPixelData+28, + sampleCountTableDataSize, + data_scanline, + readPtr); + } + else readPtr = rawPixelData+28; + + char* base = frameBuffer.getSampleCountSlice().base; + int xStride = frameBuffer.getSampleCountSlice().xStride; + int yStride = frameBuffer.getSampleCountSlice().yStride; + + + + for (int y = scanLine1; y <= scanLine2; y++) + { + int lastAccumulatedCount = 0; + for (int x = _data->minX; x <= _data->maxX; x++) + { + int accumulatedCount, count; + + // + // Read the sample count for pixel (x, y). + // + + Xdr::read (readPtr, accumulatedCount); + if (x == _data->minX) + count = accumulatedCount; + else + count = accumulatedCount - lastAccumulatedCount; + lastAccumulatedCount = accumulatedCount; + + // + // Store the data in both internal and external data structure. + // + + sampleCount(base, xStride, yStride, x, y) = count; + } + } + + if(decomp) + { + delete decomp; + } +} + + + +namespace +{ + +void +readSampleCountForLineBlock(InputStreamMutex* streamData, + DeepScanLineInputFile::Data* data, + int lineBlockId) +{ + streamData->is->seekg(data->lineOffsets[lineBlockId]); + + if (isMultiPart(data->version)) + { + int partNumber; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); + + if (partNumber != data->partNumber) + throw IEX_NAMESPACE::ArgExc("Unexpected part number."); + } + + int minY; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, minY); + + // + // Check the correctness of minY. + // + + if (minY != data->minY + lineBlockId * data->linesInBuffer) + throw IEX_NAMESPACE::ArgExc("Unexpected data block y coordinate."); + + int maxY; + maxY = min(minY + data->linesInBuffer - 1, data->maxY); + + Int64 sampleCountTableDataSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, sampleCountTableDataSize); + + + + if(sampleCountTableDataSize>data->maxSampleCountTableSize) + { + THROW (IEX_NAMESPACE::ArgExc, "Bad sampleCountTableDataSize read from chunk "<< lineBlockId << ": expected " << data->maxSampleCountTableSize << " or less, got "<< sampleCountTableDataSize); + } + + Int64 packedDataSize; + Int64 unpackedDataSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, packedDataSize); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, unpackedDataSize); + + + + // + // We make a check on the data size requirements here. + // Whilst we wish to store 64bit sizes on disk, not all the compressors + // have been made to work with such data sizes and are still limited to + // using signed 32 bit (int) for the data size. As such, this version + // insists that we validate that the data size does not exceed the data + // type max limit. + // @TODO refactor the compressor code to ensure full 64-bit support. + // + + int compressorMaxDataSize = std::numeric_limits::max(); + if (sampleCountTableDataSize > Int64(compressorMaxDataSize)) + { + THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not " + << "support the allocation of data with size > " + << compressorMaxDataSize + << " file table size :" << sampleCountTableDataSize << ".\n"); + } + streamData->is->read(data->sampleCountTableBuffer, sampleCountTableDataSize); + + const char* readPtr; + + // + // If the sample count table is compressed, we'll uncompress it. + // + + + if (sampleCountTableDataSize < data->maxSampleCountTableSize) + { + if(!data->sampleCountTableComp) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep scanline data corrupt at chunk " << lineBlockId << " (sampleCountTableDataSize error)"); + } + data->sampleCountTableComp->uncompress(data->sampleCountTableBuffer, + sampleCountTableDataSize, + minY, + readPtr); + } + else readPtr = data->sampleCountTableBuffer; + + char* base = data->sampleCountSliceBase; + int xStride = data->sampleCountXStride; + int yStride = data->sampleCountYStride; + + // total number of samples in block: used to check samplecount table doesn't + // reference more data than exists + + size_t cumulative_total_samples=0; + + for (int y = minY; y <= maxY; y++) + { + int yInDataWindow = y - data->minY; + data->lineSampleCount[yInDataWindow] = 0; + + int lastAccumulatedCount = 0; + for (int x = data->minX; x <= data->maxX; x++) + { + int accumulatedCount, count; + + // + // Read the sample count for pixel (x, y). + // + + Xdr::read (readPtr, accumulatedCount); + + // sample count table should always contain monotonically + // increasing values. + if (accumulatedCount < lastAccumulatedCount) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << " (negative sample count detected)"); + } + + count = accumulatedCount - lastAccumulatedCount; + lastAccumulatedCount = accumulatedCount; + + // + // Store the data in both internal and external data structure. + // + + data->sampleCount[yInDataWindow][x - data->minX] = count; + data->lineSampleCount[yInDataWindow] += count; + sampleCount(base, xStride, yStride, x, y) = count; + } + cumulative_total_samples+=data->lineSampleCount[yInDataWindow]; + if(cumulative_total_samples*data->combinedSampleSize > unpackedDataSize) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << ": pixel data only contains " << unpackedDataSize + << " bytes of data but table references at least " << cumulative_total_samples*data->combinedSampleSize << " bytes of sample data" ); + } + data->gotSampleCount[y - data->minY] = true; + } +} + + +void +fillSampleCountFromCache(int y, DeepScanLineInputFile::Data* data) +{ + int yInDataWindow = y - data->minY; + char* base = data->sampleCountSliceBase; + int xStride = data->sampleCountXStride; + int yStride = data->sampleCountYStride; + + for (int x = data->minX; x <= data->maxX; x++) + { + unsigned int count = data->sampleCount[yInDataWindow][x - data->minX]; + sampleCount(base, xStride, yStride, x, y) = count; + } +} + +} // namespace + +void +DeepScanLineInputFile::readPixelSampleCounts (int scanline1, int scanline2) +{ + Int64 savedFilePos = 0; + + if(!_data->frameBufferValid) + { + throw IEX_NAMESPACE::ArgExc("readPixelSampleCounts called with no valid frame buffer"); + } + + try + { + Lock lock (*_data->_streamData); + + savedFilePos = _data->_streamData->is->tellg(); + + int scanLineMin = min (scanline1, scanline2); + int scanLineMax = max (scanline1, scanline2); + + if (scanLineMin < _data->minY || scanLineMax > _data->maxY) + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line sample counts outside " + "the image file's data window."); + + for (int i = scanLineMin; i <= scanLineMax; i++) + { + // + // if scanline is already read, it'll be in the cache + // otherwise, read from file, store in cache and in caller's framebuffer + // + if (_data->gotSampleCount[i - _data->minY]) + { + fillSampleCountFromCache(i,_data); + + }else{ + + int lineBlockId = ( i - _data->minY ) / _data->linesInBuffer; + + readSampleCountForLineBlock ( _data->_streamData, _data, lineBlockId ); + + int minYInLineBuffer = lineBlockId * _data->linesInBuffer + _data->minY; + int maxYInLineBuffer = min ( minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY ); + + // + // For each line within the block, get the count of bytes. + // + + bytesPerDeepLineTable ( _data->header, + minYInLineBuffer, + maxYInLineBuffer, + _data->sampleCountSliceBase, + _data->sampleCountXStride, + _data->sampleCountYStride, + _data->bytesPerLine ); + + // + // For each scanline within the block, get the offset. + // + + offsetInLineBufferTable ( _data->bytesPerLine, + minYInLineBuffer - _data->minY, + maxYInLineBuffer - _data->minY, + _data->linesInBuffer, + _data->offsetInLineBuffer ); + } + } + + _data->_streamData->is->seekg(savedFilePos); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading sample count data from image " + "file \"" << fileName() << "\". " << e); + + _data->_streamData->is->seekg(savedFilePos); + + throw; + } +} + +void +DeepScanLineInputFile::readPixelSampleCounts(int scanline) +{ + readPixelSampleCounts(scanline, scanline); +} + +int +DeepScanLineInputFile::firstScanLineInChunk(int y) const +{ + return int((y-_data->minY)/_data->linesInBuffer)*_data->linesInBuffer + _data->minY; +} + +int +DeepScanLineInputFile::lastScanLineInChunk(int y) const +{ + int minY = firstScanLineInChunk(y); + return min(minY+_data->linesInBuffer-1,_data->maxY); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepScanLineInputFile.h b/IlmImf/ImfDeepScanLineInputFile.h new file mode 100644 index 0000000..87a4065 --- /dev/null +++ b/IlmImf/ImfDeepScanLineInputFile.h @@ -0,0 +1,276 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_DEEP_SCAN_LINE_INPUT_FILE_H +#define INCLUDED_IMF_DEEP_SCAN_LINE_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class DeepScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfThreading.h" +#include "ImfGenericInputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" +#include "ImfDeepScanLineOutputFile.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT DeepScanLineInputFile : public GenericInputFile +{ + public: + + //------------ + // Constructor + //------------ + + DeepScanLineInputFile (const char fileName[], + int numThreads = globalThreadCount()); + + DeepScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int version, /*version field from file*/ + int numThreads = globalThreadCount()); + + + //----------------------------------------- + // Destructor -- deallocates internal data + // structures, but does not close the file. + //----------------------------------------- + + virtual ~DeepScanLineInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + // If threading is enabled, readPixels (s1, s2) tries to perform + // decopmression of multiple scanlines in parallel. + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + + //--------------------------------------------------------------- + // Extract pixel data from pre-read block + // + // readPixels(rawPixelData,frameBuffer,s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the data provided and + // stores them in the provided frameBuffer. + // the data can be obtained from a call to rawPixelData() + // + // + // Both s1 and s2 must be within the data specified + // + // you must provide a frameBuffer with a samplecountslice, which must have been read + // and the data valid - readPixels uses your sample count buffer to compute + // offsets to the data it needs + // + // This call does not block, and is thread safe for clients with an existing + // threading model. The InputFile's frameBuffer is not used in this call. + // + // This call is only provided for clients which have an existing threading model in place + // and unpredictable access patterns to the data. + // The fastest way to read an entire image is to enable threading,use setFrameBuffer then + // readPixels(header().dataWindow().min.y, header.dataWindow().max.y) + // + //--------------------------------------------------------------- + + void readPixels (const char * rawPixelData, + const DeepFrameBuffer & frameBuffer, + int scanLine1, + int scanLine2) const; + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + // note: returns the entire payload of the relevant chunk of data, not including part number + // including compressed and uncompressed sizes + // on entry, if pixelDataSize is insufficiently large, no bytes are read (pixelData can safely be NULL) + // on exit, pixelDataSize is the number of bytes required to read the chunk + // + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + char * pixelData, + Int64 &pixelDataSize); + + + //------------------------------------------------- + // firstScanLineInChunk() returns the row number of the first row that's stored in the + // same chunk as scanline y. Depending on the compression mode, this may not be the same as y + // + // lastScanLineInChunk() returns the row number of the last row that's stored in the same + // chunk as scanline y. Depending on the compression mode, this may not be the same as y. + // The last chunk in the file may be smaller than all the others + // + //------------------------------------------------ + int firstScanLineInChunk(int y) const; + int lastScanLineInChunk (int y) const; + + //----------------------------------------------------------- + // Read pixel sample counts into a slice in the frame buffer. + // + // readPixelSampleCounts(s1, s2) reads all the counts of + // pixel samples with y coordinates in the interval + // [min (s1, s2), max (s1, s2)] from the file, and stores + // them in the slice naming "sample count". + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // readPixelSampleCounts(s) calls readPixelSampleCounts(s,s). + // + //----------------------------------------------------------- + + void readPixelSampleCounts (int scanline1, + int scanline2); + void readPixelSampleCounts (int scanline); + + + //---------------------------------------------------------- + // Read pixel sample counts into the provided frameBuffer + // using a block read of data read by rawPixelData + // for multi-scanline compression schemes, you must decode the entire block + // so scanline1=firstScanLineInChunk(y) and scanline2=lastScanLineInChunk(y) + // + // This call does not block, and is thread safe for clients with an existing + // threading model. The InputFile's frameBuffer is not used in this call. + // + // The fastest way to read an entire image is to enable threading in OpenEXR, use setFrameBuffer then + // readPixelSampleCounts(header().dataWindow().min.y, header.dataWindow().max.y) + // + //---------------------------------------------------------- + void readPixelSampleCounts (const char * rawdata , + const DeepFrameBuffer & frameBuffer, + int scanLine1 , + int scanLine2) const; + + struct Data; + + private: + + Data * _data; + + DeepScanLineInputFile (InputPartData* part); + + void initialize(const Header& header); + void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream & is); + void multiPartInitialize(InputPartData* part); + + friend class InputFile; + friend class MultiPartInputFile; + friend void DeepScanLineOutputFile::copyPixels(DeepScanLineInputFile &); +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDeepScanLineInputPart.cpp b/IlmImf/ImfDeepScanLineInputPart.cpp new file mode 100644 index 0000000..068e1d4 --- /dev/null +++ b/IlmImf/ImfDeepScanLineInputPart.cpp @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImfDeepScanLineInputPart.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +DeepScanLineInputPart::DeepScanLineInputPart(MultiPartInputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getInputPart(partNumber); +} + + +const char * +DeepScanLineInputPart::fileName () const +{ + return file->fileName(); +} + + +const Header & +DeepScanLineInputPart::header () const +{ + return file->header(); +} + + +int +DeepScanLineInputPart::version () const +{ + return file->version(); +} + + +void +DeepScanLineInputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + + +const DeepFrameBuffer & +DeepScanLineInputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + + +bool +DeepScanLineInputPart::isComplete () const +{ + return file->isComplete(); +} + + +void +DeepScanLineInputPart::readPixels (int scanLine1, int scanLine2) +{ + file->readPixels(scanLine1, scanLine2); +} + + +void +DeepScanLineInputPart::readPixels (int scanLine) +{ + file->readPixels(scanLine); +} + + +void +DeepScanLineInputPart::rawPixelData (int firstScanLine, + char *pixelData, + Int64 &pixelDataSize) +{ + file->rawPixelData(firstScanLine, pixelData, pixelDataSize); +} + + +void +DeepScanLineInputPart::readPixelSampleCounts(int scanline1, + int scanline2) +{ + file->readPixelSampleCounts(scanline1, scanline2); +} + + +void +DeepScanLineInputPart::readPixelSampleCounts(int scanline) +{ + file->readPixelSampleCounts(scanline); +} + +int +DeepScanLineInputPart::firstScanLineInChunk(int y) const +{ + return file->firstScanLineInChunk(y); +} + +int +DeepScanLineInputPart::lastScanLineInChunk(int y) const +{ + return file->lastScanLineInChunk(y); +} + +void +DeepScanLineInputPart::readPixels(const char* rawPixelData, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const +{ + return file->readPixels(rawPixelData,frameBuffer,scanLine1,scanLine2); +} +void +DeepScanLineInputPart::readPixelSampleCounts(const char* rawdata, const DeepFrameBuffer& frameBuffer, int scanLine1, int scanLine2) const +{ + return file->readPixelSampleCounts(rawdata,frameBuffer,scanLine1,scanLine2); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepScanLineInputPart.h b/IlmImf/ImfDeepScanLineInputPart.h new file mode 100644 index 0000000..c21786b --- /dev/null +++ b/IlmImf/ImfDeepScanLineInputPart.h @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef IMFDEEPSCANLINEINPUTPART_H_ +#define IMFDEEPSCANLINEINPUTPART_H_ + +#include "ImfMultiPartInputFile.h" +#include "ImfDeepScanLineInputFile.h" +#include "ImfDeepScanLineOutputFile.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT DeepScanLineInputPart +{ + public: + + DeepScanLineInputPart(MultiPartInputFile& file, int partNumber); + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + // If threading is enabled, readPixels (s1, s2) tries to perform + // decopmression of multiple scanlines in parallel. + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + void readPixels (const char * rawPixelData,const DeepFrameBuffer & frameBuffer, + int scanLine1,int scanLine2) const; + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + char * pixelData, + Int64 &pixelDataSize); + + + //----------------------------------------------------------- + // Read pixel sample counts into a slice in the frame buffer. + // + // readPixelSampleCounts(s1, s2) reads all the counts of + // pixel samples with y coordinates in the interval + // [min (s1, s2), max (s1, s2)] from the file, and stores + // them in the slice naming "sample count". + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // readPixelSampleCounts(s) calls readPixelSampleCounts(s,s). + //----------------------------------------------------------- + + void readPixelSampleCounts(int scanline1, + int scanline2); + void readPixelSampleCounts(int scanline); + + void readPixelSampleCounts( const char * rawdata , const DeepFrameBuffer & frameBuffer, + int scanLine1 , int scanLine2) const; + + int firstScanLineInChunk(int y) const; + int lastScanLineInChunk (int y) const; + private: + DeepScanLineInputFile *file; + + // needed for copyPixels + friend void DeepScanLineOutputFile::copyPixels(DeepScanLineInputPart &); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif /* IMFDEEPSCANLINEINPUTPART_H_ */ diff --git a/IlmImf/ImfDeepScanLineOutputFile.cpp b/IlmImf/ImfDeepScanLineOutputFile.cpp new file mode 100644 index 0000000..ebee084 --- /dev/null +++ b/IlmImf/ImfDeepScanLineOutputFile.cpp @@ -0,0 +1,1552 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class DeepScanLineOutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include "ImathFun.h" +#include +#include +#include +#include +#include "ImfDeepFrameBuffer.h" +#include "ImfOutputStreamMutex.h" +#include "ImfOutputPartData.h" + +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using std::string; +using std::vector; +using std::ofstream; +using std::min; +using std::max; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + + +struct OutSliceInfo +{ + PixelType type; + const char * base; + ptrdiff_t sampleStride; + ptrdiff_t xStride; + ptrdiff_t yStride; + int xSampling; + int ySampling; + bool zero; + + OutSliceInfo (PixelType type = HALF, + const char * base =NULL, + ptrdiff_t sampleStride = 0, + ptrdiff_t xStride = 0, + ptrdiff_t yStride =0, + int xSampling = 1, + int ySampling = 1, + bool zero = false); +}; + + +OutSliceInfo::OutSliceInfo (PixelType t, + const char * base, + ptrdiff_t spstride, + ptrdiff_t xst, + ptrdiff_t yst, + int xsm, int ysm, + bool z) +: + type (t), + base (base), + sampleStride (spstride), + xStride(xst), + yStride(yst), + xSampling (xsm), + ySampling (ysm), + zero (z) +{ + // empty +} + + +struct LineBuffer +{ + Array< Array > buffer; + Array consecutiveBuffer; + const char * dataPtr; + Int64 uncompressedDataSize; + Int64 dataSize; + Array sampleCountTableBuffer; + const char * sampleCountTablePtr; + Int64 sampleCountTableSize; + Compressor* sampleCountTableCompressor; + int minY; // the min y scanline stored + int maxY; // the max y scanline stored + int scanLineMin; // the min y scanline writing out + int scanLineMax; // the max y scanline writing out + Compressor * compressor; + bool partiallyFull; // has incomplete data + bool hasException; + string exception; + + LineBuffer (int linesInBuffer); + ~LineBuffer (); + + void wait () {_sem.wait();} + void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (int linesInBuffer) : + dataPtr (0), + dataSize (0), + sampleCountTablePtr (0), + sampleCountTableCompressor (0), + compressor (0), + partiallyFull (false), + hasException (false), + exception (), + _sem (1) +{ + buffer.resizeErase(linesInBuffer); +} + + +LineBuffer::~LineBuffer () +{ + if (compressor != 0) + delete compressor; + + if (sampleCountTableCompressor != 0) + delete sampleCountTableCompressor; +} + +} // namespace + + +struct DeepScanLineOutputFile::Data +{ + Header header; // the image header + int version; // file format version + bool multipart; // from a multipart file + Int64 previewPosition; // file position for preview + DeepFrameBuffer frameBuffer; // framebuffer to write into + int currentScanLine; // next scanline to be written + int missingScanLines; // number of lines to write + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each scanline + vector bytesPerLine; // combined size of a line over + // all channels + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + Int64 lineOffsetsPosition; // file position for line + // offset table + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each + // buffer holds + int partNumber; // the output part number + + char* sampleCountSliceBase; // the pointer to the number + // of samples in each pixel + int sampleCountXStride; // the x stride for sampleCountSliceBase + int sampleCountYStride; // the y stride for sampleCountSliceBase + + Array lineSampleCount; // the number of samples + // in each line + + Int64 maxSampleCountTableSize; + // the max size in bytes for a pixel + // sample count table + OutputStreamMutex* _streamData; + bool _deleteStream; + + Data (int numThreads); + ~Data (); + + + inline LineBuffer * getLineBuffer (int number);// hash function from line + // buffer indices into our + // vector of line buffers + + inline int& getSampleCount(int x, int y); // get the number of samples + // in each pixel +}; + + +DeepScanLineOutputFile::Data::Data (int numThreads): + lineOffsetsPosition (0), + partNumber (-1) , + _streamData(NULL), + _deleteStream(false) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers. + // + + lineBuffers.resize (max (1, 2 * numThreads)); + for (size_t i = 0; i < lineBuffers.size(); i++) + lineBuffers[i] = 0; +} + + +DeepScanLineOutputFile::Data::~Data () +{ + for (size_t i = 0; i < lineBuffers.size(); i++) + if (lineBuffers[i] != 0) + delete lineBuffers[i]; + + for (size_t i = 0; i < slices.size(); i++) + delete slices[i]; +} + + +int& +DeepScanLineOutputFile::Data::getSampleCount(int x, int y) +{ + return sampleCount(sampleCountSliceBase, + sampleCountXStride, + sampleCountYStride, + x, y); +} + + +LineBuffer* +DeepScanLineOutputFile::Data::getLineBuffer (int number) +{ + return lineBuffers[number % lineBuffers.size()]; +} + + +namespace { + +Int64 +writeLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const vector &lineOffsets) +{ + Int64 pos = os.tellp(); + + if (pos == -1) + IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, lineOffsets[i]); + + return pos; +} + + +void +writePixelData (OutputStreamMutex *filedata, + DeepScanLineOutputFile::Data *partdata, + int lineBufferMinY, + const char pixelData[], + Int64 packedDataSize, + Int64 unpackedDataSize, + const char sampleCountTableData[], + Int64 sampleCountTableSize) +{ + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = filedata->currentPosition; + filedata->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = filedata->os->tellp(); + + partdata->lineOffsets[(partdata->currentScanLine - partdata->minY) / partdata->linesInBuffer] = + currentPosition; + + #ifdef DEBUG + + assert (filedata->os->tellp() == currentPosition); + + #endif + + // + // Write the optional part number. + // + + if (partdata->multipart) + { + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, partdata->partNumber); + } + + // + // Write the y coordinate of the first scanline in the chunk. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, lineBufferMinY); + + // + // Write the packed size of the pixel sample count table. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, sampleCountTableSize); + + // + // Write the packed pixel data size. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, packedDataSize); + + // + // Write the unpacked pixel data size. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, unpackedDataSize); + + // + // Write the packed pixel sample count table. + // + + filedata->os->write (sampleCountTableData, sampleCountTableSize); + + // + // Write the compressed data. + // + + filedata->os->write (pixelData, packedDataSize); + + // + // Update stream position. + // + + filedata->currentPosition = currentPosition + + Xdr::size() + // y coordinate + Xdr::size() + // packed sample count table size + Xdr::size() + // packed data size + Xdr::size() + // unpacked data size + sampleCountTableSize + // pixel sample count table + packedDataSize; // pixel data + + if (partdata->multipart) + { + filedata->currentPosition += Xdr::size(); // optional part number + } +} + + +inline void +writePixelData (OutputStreamMutex* filedata, + DeepScanLineOutputFile::Data *partdata, + const LineBuffer *lineBuffer) +{ + writePixelData (filedata, partdata, + lineBuffer->minY, + lineBuffer->dataPtr, + lineBuffer->dataSize, + lineBuffer->uncompressedDataSize, + lineBuffer->sampleCountTablePtr, + lineBuffer->sampleCountTableSize); +} + + +void +convertToXdr (DeepScanLineOutputFile::Data *ofd, + Array &lineBuffer, + int lineBufferMinY, + int lineBufferMaxY, + int inSize) +{ + // + // Convert the contents of a lineBuffer from the machine's native + // representation to Xdr format. This function is called by + // CompressLineBuffer::execute(), below, if the compressor wanted + // its input pixel data in the machine's native format, but then + // failed to compress the data (most compressors will expand rather + // than compress random input data). + // + // Note that this routine assumes that the machine's native + // representation of the pixel data has the same size as the + // Xdr representation. This makes it possible to convert the + // pixel data in place, without an intermediate temporary buffer. + // + + // + // Iterate over all scanlines in the lineBuffer to convert. + // + + char* writePtr = &lineBuffer[0]; + for (int y = lineBufferMinY; y <= lineBufferMaxY; y++) + { + // + // Set these to point to the start of line y. + // We will write to writePtr from readPtr. + // + + const char *readPtr = writePtr; + + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel is + // contains any data (the scan line contains + // data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = *ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the number of sampled pixels, dMaxX-dMinX+1, for + // slice i in scan line y (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int xSampleCount = ofd->lineSampleCount[y - ofd->minY]; + + // + // Convert the samples in place. + // + + convertInPlace (writePtr, readPtr, slice.type, xSampleCount); + } + } +} + + +// +// A LineBufferTask encapsulates the task of copying a set of scanlines +// from the user's frame buffer into a LineBuffer object, compressing +// the data if necessary. +// + +class LineBufferTask: public Task +{ + public: + + LineBufferTask (TaskGroup *group, + DeepScanLineOutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + DeepScanLineOutputFile::Data * _ofd; + LineBuffer * _lineBuffer; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + DeepScanLineOutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax) +: + Task (group), + _ofd (ofd), + _lineBuffer (_ofd->getLineBuffer(number)) +{ + // + // Wait for the lineBuffer to become available + // + + _lineBuffer->wait (); + + // + // Initialize the lineBuffer data if necessary + // + + if (!_lineBuffer->partiallyFull) + { + + _lineBuffer->minY = _ofd->minY + number * _ofd->linesInBuffer; + + _lineBuffer->maxY = min (_lineBuffer->minY + _ofd->linesInBuffer - 1, + _ofd->maxY); + + _lineBuffer->partiallyFull = true; + } + + _lineBuffer->scanLineMin = max (_lineBuffer->minY, scanLineMin); + _lineBuffer->scanLineMax = min (_lineBuffer->maxY, scanLineMax); +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the + // frame buffer into the line buffer + // + + int yStart, yStop, dy; + + if (_ofd->lineOrder == INCREASING_Y) + { + yStart = _lineBuffer->scanLineMin; + yStop = _lineBuffer->scanLineMax + 1; + dy = 1; + } + else + { + yStart = _lineBuffer->scanLineMax; + yStop = _lineBuffer->scanLineMin - 1; + dy = -1; + } + + // + // Allocate buffers for scanlines. + // And calculate the sample counts for each line. + // + + bytesPerDeepLineTable (_ofd->header, + _lineBuffer->scanLineMin, + _lineBuffer->scanLineMax, + _ofd->sampleCountSliceBase, + _ofd->sampleCountXStride, + _ofd->sampleCountYStride, + _ofd->bytesPerLine); + for (int i = _lineBuffer->scanLineMin; i <= _lineBuffer->scanLineMax; i++) + { + // (TODO) don't do this all the time. + _lineBuffer->buffer[i - _lineBuffer->minY].resizeErase( + _ofd->bytesPerLine[i - _ofd->minY]); + + for (int j = _ofd->minX; j <= _ofd->maxX; j++) + _ofd->lineSampleCount[i - _ofd->minY] += _ofd->getSampleCount(j, i); + } + + // + // Copy data from frame buffer to line buffer. + // + + int y; + + for (y = yStart; y != yStop; y += dy) + { + // + // Gather one scan line's worth of pixel data and store + // them in _ofd->lineBuffer. + // + + char *writePtr = &_lineBuffer->buffer[y - _lineBuffer->minY][0]; + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = *_ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Fill the line buffer with with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _lineBuffer->buffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + _ofd->lineSampleCount[y - _ofd->minY]); + } + else + { + + copyFromDeepFrameBuffer (writePtr, slice.base, + _ofd->sampleCountSliceBase, + _ofd->sampleCountXStride, + _ofd->sampleCountYStride, + y, _ofd->minX, _ofd->maxX, + 0, 0,//offsets for samplecount + 0, 0,//offsets for data + slice.sampleStride, + slice.xStride, + slice.yStride, + _ofd->format, + slice.type); + } + } + } + + // + // If the next scanline isn't past the bounds of the lineBuffer + // then we have partially filled the linebuffer, + // otherwise the whole linebuffer is filled and then + // we compress the linebuffer and write it out. + // + + if (y >= _lineBuffer->minY && y <= _lineBuffer->maxY) + return; + + // + // Copy all data into a consecutive buffer. + // + + Int64 totalBytes = 0; + Int64 maxBytesPerLine = 0; + for (int i = 0; i < _lineBuffer->maxY - _lineBuffer->minY + 1; i++) + { + totalBytes += _lineBuffer->buffer[i].size(); + if (Int64(_lineBuffer->buffer[i].size()) > maxBytesPerLine) + maxBytesPerLine = _lineBuffer->buffer[i].size(); + } + _lineBuffer->consecutiveBuffer.resizeErase(totalBytes); + + int pos = 0; + for (int i = 0; i < _lineBuffer->maxY - _lineBuffer->minY + 1; i++) + { + memcpy(_lineBuffer->consecutiveBuffer + pos, + &_lineBuffer->buffer[i][0], + _lineBuffer->buffer[i].size()); + pos += _lineBuffer->buffer[i].size(); + } + + _lineBuffer->dataPtr = _lineBuffer->consecutiveBuffer; + + _lineBuffer->dataSize = totalBytes; + _lineBuffer->uncompressedDataSize = _lineBuffer->dataSize; + + // + // Compress the pixel sample count table. + // + + char* ptr = _lineBuffer->sampleCountTableBuffer; + Int64 tableDataSize = 0; + for (int i = _lineBuffer->minY; i <= _lineBuffer->maxY; i++) + { + int count = 0; + for (int j = _ofd->minX; j <= _ofd->maxX; j++) + { + count += _ofd->getSampleCount(j, i); + Xdr::write (ptr, count); + tableDataSize += sizeof (int); + } + } + + if(_lineBuffer->sampleCountTableCompressor) + { + _lineBuffer->sampleCountTableSize = + _lineBuffer->sampleCountTableCompressor->compress ( + _lineBuffer->sampleCountTableBuffer, + tableDataSize, + _lineBuffer->minY, + _lineBuffer->sampleCountTablePtr); + } + + // + // If we can't make data shrink (or we weren't compressing), then just use the raw data. + // + + if (!_lineBuffer->sampleCountTableCompressor || + _lineBuffer->sampleCountTableSize >= tableDataSize) + { + _lineBuffer->sampleCountTableSize = tableDataSize; + _lineBuffer->sampleCountTablePtr = _lineBuffer->sampleCountTableBuffer; + } + + // + // Compress the sample data + // + + // (TODO) don't do this all the time. + if (_lineBuffer->compressor != 0) + delete _lineBuffer->compressor; + _lineBuffer->compressor = newCompressor (_ofd->header.compression(), + maxBytesPerLine, + _ofd->header); + + Compressor *compressor = _lineBuffer->compressor; + + if (compressor) + { + const char *compPtr; + + Int64 compSize = compressor->compress (_lineBuffer->dataPtr, + _lineBuffer->dataSize, + _lineBuffer->minY, compPtr); + + if (compSize < _lineBuffer->dataSize) + { + _lineBuffer->dataSize = compSize; + _lineBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using the machine's + // native format, so we need to convert the lineBuffer + // to Xdr. + // + + convertToXdr (_ofd, _lineBuffer->consecutiveBuffer, _lineBuffer->minY, + _lineBuffer->maxY, _lineBuffer->dataSize); + } + } + + _lineBuffer->partiallyFull = false; + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what (); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + +} // namespace + + +DeepScanLineOutputFile::DeepScanLineOutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) +{ + _data->_streamData=new OutputStreamMutex (); + _data->_deleteStream=true; + try + { + header.sanityCheck(); + _data->_streamData->os = new StdOFStream (fileName); + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = + _data->header.writeTo (*_data->_streamData->os); + _data->lineOffsetsPosition = + writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); + _data->multipart=false;// not multipart; only one header + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data->_streamData; + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data->_streamData; + delete _data; + throw; + } +} + + +DeepScanLineOutputFile::DeepScanLineOutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) + +{ + _data->_streamData = new OutputStreamMutex (); + _data->_deleteStream = false; + try + { + header.sanityCheck(); + _data->_streamData->os = &os; + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = + _data->header.writeTo (*_data->_streamData->os); + _data->lineOffsetsPosition = + writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); + _data->multipart=false; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data->_streamData; + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data->_streamData; + delete _data; + throw; + } +} + +DeepScanLineOutputFile::DeepScanLineOutputFile(const OutputPartData* part) +{ + try + { + if (part->header.type() != DEEPSCANLINE) + throw IEX_NAMESPACE::ArgExc("Can't build a DeepScanLineOutputFile from a type-mismatched part."); + + _data = new Data (part->numThreads); + _data->_streamData = part->mutex; + _data->_deleteStream=false; + initialize (part->header); + _data->partNumber = part->partNumber; + _data->lineOffsetsPosition = part->chunkOffsetTablePosition; + _data->previewPosition = part->previewPosition; + _data->multipart=part->multipart; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot initialize output part " + "\"" << part->partNumber << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + +void +DeepScanLineOutputFile::initialize (const Header &header) +{ + _data->header = header; + + _data->header.setType(DEEPSCANLINE); + + const Box2i &dataWindow = header.dataWindow(); + + _data->currentScanLine = (header.lineOrder() == INCREASING_Y)? + dataWindow.min.y: dataWindow.max.y; + + _data->missingScanLines = dataWindow.max.y - dataWindow.min.y + 1; + _data->lineOrder = header.lineOrder(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->lineSampleCount.resizeErase(_data->maxY - _data->minY + 1); + + Compressor* compressor = newCompressor (_data->header.compression(), + 0, + _data->header); + _data->format = defaultFormat (compressor); + _data->linesInBuffer = numLinesInBuffer (compressor); + if (compressor != 0) + delete compressor; + + int lineOffsetSize = (_data->maxY - _data->minY + + _data->linesInBuffer) / _data->linesInBuffer; + + + _data->header.setChunkCount(lineOffsetSize); + + _data->lineOffsets.resize (lineOffsetSize); + + _data->bytesPerLine.resize (_data->maxY - _data->minY + 1); + + _data->maxSampleCountTableSize = min(_data->linesInBuffer, _data->maxY - _data->minY + 1) * + (_data->maxX - _data->minX + 1) * + sizeof(unsigned int); + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + _data->lineBuffers[i] = new LineBuffer (_data->linesInBuffer); + _data->lineBuffers[i]->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); + + _data->lineBuffers[i]->sampleCountTableCompressor = + newCompressor (_data->header.compression(), + _data->maxSampleCountTableSize, + _data->header); + } +} + + +DeepScanLineOutputFile::~DeepScanLineOutputFile () +{ + { + Lock lock(*_data->_streamData); + Int64 originalPosition = _data->_streamData->os->tellp(); + + if (_data->lineOffsetsPosition > 0) + { + try + { + _data->_streamData->os->seekp (_data->lineOffsetsPosition); + writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); + + // + // Restore the original position. + // + _data->_streamData->os->seekp (originalPosition); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + if (_data->_deleteStream) + delete _data->_streamData->os; + + // + // (TODO) we should have a way to tell if the stream data is owned by this file or + // by a parent multipart file. + // + + if (_data->partNumber == -1) + delete _data->_streamData; + + delete _data; +} + + +const char * +DeepScanLineOutputFile::fileName () const +{ + return _data->_streamData->os->fileName(); +} + + +const Header & +DeepScanLineOutputFile::header () const +{ + return _data->header; +} + + +void +DeepScanLineOutputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + { + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + } + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + { + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + } + + // + // Store the pixel sample count table. + // (TODO) Support for different sampling rates? + // + + const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); + if (sampleCountSlice.base == 0) + { + throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); + } + else + { + _data->sampleCountSliceBase = sampleCountSlice.base; + _data->sampleCountXStride = sampleCountSlice.xStride; + _data->sampleCountYStride = sampleCountSlice.yStride; + } + + // + // Initialize slice table for writePixels(). + // Pixel sample count slice is not presented in the header, + // so it wouldn't be added here. + // Store the pixel base pointer table. + // (TODO) Support for different sampling rates? + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (new OutSliceInfo (i.channel().type, + NULL,// base + 0,// sampleStride, + 0,// xStride + 0,// yStride + i.channel().xSampling, + i.channel().ySampling, + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (new OutSliceInfo (j.slice().type, + j.slice().base, + j.slice().sampleStride, + j.slice().xStride, + j.slice().yStride, + j.slice().xSampling, + j.slice().ySampling, + false)); // zero + + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + + for (size_t i = 0; i < _data->slices.size(); i++) + delete _data->slices[i]; + _data->slices = slices; +} + + +const DeepFrameBuffer & +DeepScanLineOutputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +void +DeepScanLineOutputFile::writePixels (int numScanLines) +{ + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data source."); + + // + // Maintain two iterators: + // nextWriteBuffer: next linebuffer to be written to the file + // nextCompressBuffer: next linebuffer to compress + // + + int first = (_data->currentScanLine - _data->minY) / + _data->linesInBuffer; + + int nextWriteBuffer = first; + int nextCompressBuffer; + int stop; + int step; + int scanLineMin; + int scanLineMax; + + { + // + // Create a task group for all line buffer tasks. When the + // taskgroup goes out of scope, the destructor waits until + // all tasks are complete. + // + + TaskGroup taskGroup; + + // + // Determine the range of lineBuffers that intersect the scan + // line range. Then add the initial compression tasks to the + // thread pool. We always add in at least one task but the + // individual task might not do anything if numScanLines == 0. + // + + if (_data->lineOrder == INCREASING_Y) + { + int last = (_data->currentScanLine + (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMin = _data->currentScanLine; + scanLineMax = _data->currentScanLine + numScanLines - 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + last - first + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first + i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first + numTasks; + stop = last + 1; + step = 1; + } + else + { + int last = (_data->currentScanLine - (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMax = _data->currentScanLine; + scanLineMin = _data->currentScanLine - numScanLines + 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + first - last + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first - i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first - numTasks; + stop = last - 1; + step = -1; + } + + while (true) + { + if (_data->missingScanLines <= 0) + { + throw IEX_NAMESPACE::ArgExc ("Tried to write more scan lines " + "than specified by the data window."); + } + + // + // Wait until the next line buffer is ready to be written + // + + LineBuffer *writeBuffer = + _data->getLineBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + int numLines = writeBuffer->scanLineMax - + writeBuffer->scanLineMin + 1; + + _data->missingScanLines -= numLines; + + // + // If the line buffer is only partially full, then it is + // not complete and we cannot write it to disk yet. + // + + if (writeBuffer->partiallyFull) + { + _data->currentScanLine = _data->currentScanLine + + step * numLines; + writeBuffer->post(); + + return; + } + + // + // Write the line buffer + // + + writePixelData (_data->_streamData, _data, writeBuffer); + nextWriteBuffer += step; + + _data->currentScanLine = _data->currentScanLine + + step * numLines; + + #ifdef DEBUG + + assert (_data->currentScanLine == + ((_data->lineOrder == INCREASING_Y) ? + writeBuffer->scanLineMax + 1: + writeBuffer->scanLineMin - 1)); + + #endif + + // + // Release the lock on the line buffer + // + + writeBuffer->post(); + + // + // If this was the last line buffer in the scanline range + // + + if (nextWriteBuffer == stop) + break; + + // + // If there are no more line buffers to compress, + // then only continue to write out remaining lineBuffers + // + + if (nextCompressBuffer == stop) + continue; + + // + // Add nextCompressBuffer as a compression task + // + + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, nextCompressBuffer, + scanLineMin, scanLineMax)); + + // + // Update the next line buffer we need to compress + // + + nextCompressBuffer += step; + } + + // + // Finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to OutputFile::writePixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +DeepScanLineOutputFile::currentScanLine () const +{ + Lock lock (*_data->_streamData); + return _data->currentScanLine; +} + + +void +DeepScanLineOutputFile::copyPixels (DeepScanLineInputPart &in) +{ + copyPixels(*in.file); +} + +void +DeepScanLineOutputFile::copyPixels (DeepScanLineInputFile &in) +{ + + Lock lock (*_data->_streamData); + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + if(!inHdr.hasType() || inHdr.type()!=DEEPSCANLINE) + { + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\": the input needs to be a deep scanline image"); + } + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". " + "The files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different channel lists."); + + // + // Verify that no pixel data have been written to this file yet. + // + + const Box2i &dataWindow = hdr.dataWindow(); + + if (_data->missingScanLines != dataWindow.max.y - dataWindow.min.y + 1) + THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "\"" << fileName() << "\" already contains " + "pixel data."); + + // + // Copy the pixel data. + // + + vector data(4096); + + while (_data->missingScanLines > 0) + { + Int64 dataSize = (Int64) data.size(); + in.rawPixelData(_data->currentScanLine, &data[0], dataSize); + if(dataSize > data.size()) + { + // block wasn't big enough - go again with enough memory this time + data.resize(dataSize); + in.rawPixelData(_data->currentScanLine, &data[0], dataSize); + } + + // extract header from block to pass to writePixelData + + Int64 packedSampleCountSize = *(Int64 *) (&data[4]); + Int64 packedDataSize = *(Int64 *) (&data[12]); + Int64 unpackedDataSize = *(Int64 *) (&data[20]); + const char * sampleCountTable = &data[0]+28; + const char * pixelData = sampleCountTable + packedSampleCountSize; + + + writePixelData (_data->_streamData, _data, lineBufferMinY (_data->currentScanLine, + _data->minY, + _data->linesInBuffer), + pixelData, packedDataSize, unpackedDataSize,sampleCountTable,packedSampleCountSize); + + _data->currentScanLine += (_data->lineOrder == INCREASING_Y)? + _data->linesInBuffer: -_data->linesInBuffer; + + _data->missingScanLines -= _data->linesInBuffer; + } +} + + +void +DeepScanLineOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_data->_streamData); + + if (_data->previewPosition <= 0) + THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _data->_streamData->os->tellp(); + + try + { + _data->_streamData->os->seekp (_data->previewPosition); + pia.writeValueTo (*_data->_streamData->os, _data->version); + _data->_streamData->os->seekp (savedPosition); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepScanLineOutputFile.h b/IlmImf/ImfDeepScanLineOutputFile.h new file mode 100644 index 0000000..c823d7f --- /dev/null +++ b/IlmImf/ImfDeepScanLineOutputFile.h @@ -0,0 +1,244 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_DEEP_SCAN_LINE_OUTPUT_FILE_H +#define INCLUDED_IMF_DEEP_SCAN_LINE_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class DeepScanLineOutputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImfThreading.h" +#include "ImfGenericOutputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct PreviewRgba; + +class IMF_EXPORT DeepScanLineOutputFile : public GenericOutputFile +{ + public: + + //----------------------------------------------------------- + // Constructor -- opens the file and writes the file header. + // The file header is also copied into the DeepScanLineOutputFile + // object, and can later be accessed via the header() method. + // Destroying this DeepScanLineOutputFile object automatically closes + // the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //----------------------------------------------------------- + + DeepScanLineOutputFile (const char fileName[], const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------------------ + // Constructor -- attaches the new DeepScanLineOutputFile object + // to a file that has already been opened, and writes the file header. + // The file header is also copied into the DeepScanLineOutputFile + // object, and can later be accessed via the header() method. + // Destroying this DeepScanLineOutputFile object does not automatically + // close the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //------------------------------------------------------------ + + DeepScanLineOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------- + // Destructor + // + // Destroying the DeepScanLineOutputFile object + // before writing all scan lines within the data + // window results in an incomplete file. + //------------------------------------------------- + + virtual ~DeepScanLineOutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the OutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writePixels() is + // called. The current frame buffer can be changed + // after each call to writePixels. + //------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------------- + // Write pixel data: + // + // writePixels(n) retrieves the next n scan lines worth of data from + // the current frame buffer, starting with the scan line indicated by + // currentScanLine(), and stores the data in the output file, and + // progressing in the direction indicated by header.lineOrder(). + // + // To produce a complete and correct file, exactly m scan lines must + // be written, where m is equal to + // header().dataWindow().max.y - header().dataWindow().min.y + 1. + //------------------------------------------------------------------- + + void writePixels (int numScanLines = 1); + + + //------------------------------------------------------------------ + // Access to the current scan line: + // + // currentScanLine() returns the y coordinate of the first scan line + // that will be read from the current frame buffer during the next + // call to writePixels(). + // + // If header.lineOrder() == INCREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().min.y. After writing each scan line, + // the current scan line is incremented by 1. + // + // If header.lineOrder() == DECREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().max.y. After writing each scan line, + // the current scan line is decremented by 1. + // + //------------------------------------------------------------------ + + int currentScanLine () const; + + + //-------------------------------------------------------------- + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder" and "channels" attributes must be the same. + //-------------------------------------------------------------- + + void copyPixels (DeepScanLineInputFile &in); + + // -------------------------------------------------------------- + // Shortcut to copy pixels from a given part of a multipart file + // -------------------------------------------------------------- + void copyPixels (DeepScanLineInputPart &in); + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few scan lines at a + // time, while the image is being generated. Since the preview + // image is an attribute in the file's header, it gets stored in + // the file as soon as the file is opened, but we may not know + // what the preview image should look like until we have written + // the last scan line of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + struct Data; + + private: + + //------------------------------------------------------------ + // Constructor -- attaches the OutputStreamMutex to the + // given one from MultiPartOutputFile. Set the previewPosition + // and lineOffsetsPosition which have been acquired from + // the constructor of MultiPartOutputFile as well. + //------------------------------------------------------------ + DeepScanLineOutputFile (const OutputPartData* part); + + DeepScanLineOutputFile (const DeepScanLineOutputFile &); // not implemented + DeepScanLineOutputFile & operator = (const DeepScanLineOutputFile &); // not implemented + + void initialize (const Header &header); + void initializeLineBuffer(); + + Data * _data; + + + + friend class MultiPartOutputFile; +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDeepScanLineOutputPart.cpp b/IlmImf/ImfDeepScanLineOutputPart.cpp new file mode 100644 index 0000000..d7a44e8 --- /dev/null +++ b/IlmImf/ImfDeepScanLineOutputPart.cpp @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfDeepScanLineOutputPart.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +DeepScanLineOutputPart::DeepScanLineOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getOutputPart(partNumber); +} + + +const char * +DeepScanLineOutputPart::fileName () const +{ + return file->fileName(); +} + + +const Header & +DeepScanLineOutputPart::header () const +{ + return file->header(); +} + + +void +DeepScanLineOutputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + + +const DeepFrameBuffer & +DeepScanLineOutputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + + +void +DeepScanLineOutputPart::writePixels (int numScanLines) +{ + file->writePixels(numScanLines); +} + + +int +DeepScanLineOutputPart::currentScanLine () const +{ + return file->currentScanLine(); +} + + +void +DeepScanLineOutputPart::copyPixels (DeepScanLineInputFile &in) +{ + file->copyPixels(in); +} + +void +DeepScanLineOutputPart::copyPixels (DeepScanLineInputPart &in) +{ + file->copyPixels(in); +} + +void +DeepScanLineOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) +{ + file->updatePreviewImage(newPixels); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + diff --git a/IlmImf/ImfDeepScanLineOutputPart.h b/IlmImf/ImfDeepScanLineOutputPart.h new file mode 100644 index 0000000..05410f3 --- /dev/null +++ b/IlmImf/ImfDeepScanLineOutputPart.h @@ -0,0 +1,168 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFDEEPSCANLINEOUTPUTPART_H_ +#define IMFDEEPSCANLINEOUTPUTPART_H_ + +#include "ImfDeepScanLineOutputFile.h" +#include "ImfMultiPartOutputFile.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT DeepScanLineOutputPart +{ + public: + + DeepScanLineOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the OutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writePixels() is + // called. The current frame buffer can be changed + // after each call to writePixels. + //------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------------- + // Write pixel data: + // + // writePixels(n) retrieves the next n scan lines worth of data from + // the current frame buffer, starting with the scan line indicated by + // currentScanLine(), and stores the data in the output file, and + // progressing in the direction indicated by header.lineOrder(). + // + // To produce a complete and correct file, exactly m scan lines must + // be written, where m is equal to + // header().dataWindow().max.y - header().dataWindow().min.y + 1. + //------------------------------------------------------------------- + + void writePixels (int numScanLines = 1); + + + //------------------------------------------------------------------ + // Access to the current scan line: + // + // currentScanLine() returns the y coordinate of the first scan line + // that will be read from the current frame buffer during the next + // call to writePixels(). + // + // If header.lineOrder() == INCREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().min.y. After writing each scan line, + // the current scan line is incremented by 1. + // + // If header.lineOrder() == DECREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().max.y. After writing each scan line, + // the current scan line is decremented by 1. + // + //------------------------------------------------------------------ + + int currentScanLine () const; + + + //-------------------------------------------------------------- + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder" and "channels" attributes must be the same. + //-------------------------------------------------------------- + + void copyPixels (DeepScanLineInputFile &in); + void copyPixels (DeepScanLineInputPart &in); + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few scan lines at a + // time, while the image is being generated. Since the preview + // image is an attribute in the file's header, it gets stored in + // the file as soon as the file is opened, but we may not know + // what the preview image should look like until we have written + // the last scan line of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + private: + DeepScanLineOutputFile* file; +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif /* IMFDEEPSCANLINEOUTPUTPART_H_ */ diff --git a/IlmImf/ImfDeepTiledInputFile.cpp b/IlmImf/ImfDeepTiledInputFile.cpp new file mode 100644 index 0000000..4919620 --- /dev/null +++ b/IlmImf/ImfDeepTiledInputFile.cpp @@ -0,0 +1,1979 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class DeepTiledInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include +#include +#include +#include +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "ImfInputStreamMutex.h" +#include "ImfInputPartData.h" +#include "ImathVec.h" +#include "Iex.h" +#include +#include +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using std::string; +using std::vector; +using std::min; +using std::max; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct TInSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char* pointerArrayBase; + size_t xStride; + size_t yStride; + ptrdiff_t sampleStride; + bool fill; + bool skip; + double fillValue; + int xTileCoords; + int yTileCoords; + + TInSliceInfo (PixelType typeInFrameBuffer = HALF, + char * base = NULL, + PixelType typeInFile = HALF, + size_t xStride = 0, + size_t yStride = 0, + ptrdiff_t sampleStride = 0, + bool fill = false, + bool skip = false, + double fillValue = 0.0, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TInSliceInfo::TInSliceInfo (PixelType tifb, + char * b, + PixelType tifl, + size_t xs, size_t ys, + ptrdiff_t spst, + bool f, bool s, + double fv, + int xtc, + int ytc) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + pointerArrayBase (b), + xStride (xs), + yStride (ys), + sampleStride (spst), + fill (f), + skip (s), + fillValue (fv), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileBuffer +{ + Array2D sampleCount; + const char * uncompressedData; + char * buffer; + Int64 dataSize; + Int64 uncompressedDataSize; + Compressor * compressor; + Compressor::Format format; + int dx; + int dy; + int lx; + int ly; + bool hasException; + string exception; + + TileBuffer (); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (): + uncompressedData (0), + buffer (0), + dataSize (0), + compressor (0), + format (defaultFormat (compressor)), + dx (-1), + dy (-1), + lx (-1), + ly (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + delete compressor; +} + +} // namespace + + +class MultiPartInputFile; + + +// +// struct TiledInputFile::Data stores things that will be +// needed between calls to readTile() +// + +struct DeepTiledInputFile::Data: public Mutex +{ + Header header; // the image header + TileDescription tileDesc; // describes the tile layout + int version; // file's version + DeepFrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + bool fileIsComplete; // True if no tiles are missing + // in the file + + vector slices; // info about channels in file + + // ourselves? or does someone + // else do it? + + int partNumber; // part number + + bool multiPartBackwardSupport; // if we are reading a multipart file + // using OpenEXR 1.7 API + + int numThreads; // number of threads + + MultiPartInputFile* multiPartFile; // the MultiPartInputFile used to + // support backward compatibility + + vector tileBuffers; // each holds a single tile + + bool memoryMapped; // if the stream is memory mapped + + char* sampleCountSliceBase; // pointer to the start of + // the sample count array + ptrdiff_t sampleCountXStride; // x stride of the sample count array + ptrdiff_t sampleCountYStride; // y stride of the sample count array + + int sampleCountXTileCoords; // the value of xTileCoords from the + // sample count slice + int sampleCountYTileCoords; // the value of yTileCoords from the + // sample count slice + + Array sampleCountTableBuffer; // the buffer for sample count table + + Compressor* sampleCountTableComp; // the decompressor for sample count table + + Int64 maxSampleCountTableSize; // the max size in bytes for a pixel + // sample count table + int combinedSampleSize; // total size of all channels combined to check sampletable size + + InputStreamMutex * _streamData; + bool _deleteStream; // should we delete the stream + Data (int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile indices + // into our vector of tile buffers + + int& getSampleCount(int x, int y); + // get the number of samples + // in each pixel +}; + + +DeepTiledInputFile::Data::Data (int numThreads): + numXTiles (0), + numYTiles (0), + partNumber (-1), + multiPartBackwardSupport(false), + numThreads(numThreads), + memoryMapped(false), + _streamData(NULL), + _deleteStream(false) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); +} + + +DeepTiledInputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + for (size_t i = 0; i < tileBuffers.size(); i++) + delete tileBuffers[i]; + + if (multiPartBackwardSupport) + delete multiPartFile; + + for (size_t i = 0; i < slices.size(); i++) + delete slices[i]; +} + + +TileBuffer* +DeepTiledInputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +int& +DeepTiledInputFile::Data::getSampleCount(int x, int y) +{ + return sampleCount(sampleCountSliceBase, + sampleCountXStride, + sampleCountYStride, + x, y); +} + + +namespace { + +void +readTileData (InputStreamMutex *streamData, + DeepTiledInputFile::Data *ifd, + int dx, int dy, + int lx, int ly, + char *&buffer, + Int64 &dataSize, + Int64 &unpackedDataSize) +{ + // + // Read a single tile block from the file and into the array pointed + // to by buffer. If the file is memory-mapped, then we change where + // buffer points instead of writing into the array (hence buffer needs + // to be a reference to a char *). + // + + // + // Look up the location for this tile in the Index and + // seek to that position if necessary + // + + Int64 tileOffset = ifd->tileOffsets (dx, dy, lx, ly); + + if (tileOffset == 0) + { + THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << + lx << ", " << ly << ") is missing."); + } + + // + // In a multi-part file, the next chunk does not need to + // belong to the same part, so we have to compare the + // offset here. + // + + if ( !isMultiPart(ifd->version) ) + { + if (streamData->currentPosition != tileOffset) + streamData->is->seekg(tileOffset); + } + else + { + // + // In a multi-part file, the file pointer may be moved by other + // parts, so we have to ask tellg() where we are. + // + if (streamData->is->tellg() != tileOffset) + streamData->is->seekg (tileOffset); + } + + // + // Read the first few bytes of the tile (the header). + // Verify that the tile coordinates and the level number + // are correct. + // + + int tileXCoord, tileYCoord, levelX, levelY; + + if (isMultiPart(ifd->version)) + { + int partNumber; + Xdr::read (*streamData->is, partNumber); + if (partNumber != ifd->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << ifd->partNumber << "."); + } + } + + Xdr::read (*streamData->is, tileXCoord); + Xdr::read (*streamData->is, tileYCoord); + Xdr::read (*streamData->is, levelX); + Xdr::read (*streamData->is, levelY); + + Int64 tableSize; + Xdr::read (*streamData->is, tableSize); + + Xdr::read (*streamData->is, dataSize); + Xdr::read (*streamData->is, unpackedDataSize); + + + // + // Skip the pixel sample count table because we have read this data. + // + + Xdr::skip (*streamData->is, tableSize); + + + if (tileXCoord != dx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); + + if (tileYCoord != dy) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); + + if (levelX != lx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); + + if (levelY != ly) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); + + // + // Read the pixel data. + // + + if (streamData->is->isMemoryMapped ()) + buffer = streamData->is->readMemoryMapped (dataSize); + else + { + // (TODO) check if the packed data size is too big? + // (TODO) better memory management here. Don't delete buffer everytime. + if (buffer != 0) delete[] buffer; + buffer = new char[dataSize]; + streamData->is->read (buffer, dataSize); + } + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + streamData->currentPosition = tileOffset + 4 * Xdr::size() + + 3 * Xdr::size() + + tableSize + + dataSize; +} + + +void +readNextTileData (InputStreamMutex *streamData, + DeepTiledInputFile::Data *ifd, + int &dx, int &dy, + int &lx, int &ly, + char * & buffer, + Int64 &dataSize, + Int64 &unpackedDataSize) +{ + // + // Read the next tile block from the file + // + + // + // Read the first few bytes of the tile (the header). + // + + Xdr::read (*streamData->is, dx); + Xdr::read (*streamData->is, dy); + Xdr::read (*streamData->is, lx); + Xdr::read (*streamData->is, ly); + + Int64 tableSize; + Xdr::read (*streamData->is, tableSize); + + Xdr::read (*streamData->is, dataSize); + Xdr::read (*streamData->is, unpackedDataSize); + + // + // Skip the pixel sample count table because we have read this data. + // + + Xdr::skip (*streamData->is, tableSize); + + // + // Read the pixel data. + // + + streamData->is->read (buffer, dataSize); + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + streamData->currentPosition += 4 * Xdr::size() + + 3 * Xdr::size() + + tableSize + + dataSize; +} + + +// +// A TileBufferTask encapsulates the task of uncompressing +// a single tile and copying it into the frame buffer. +// + +class TileBufferTask : public Task +{ + public: + + TileBufferTask (TaskGroup *group, + DeepTiledInputFile::Data *ifd, + TileBuffer *tileBuffer); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + DeepTiledInputFile::Data * _ifd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + DeepTiledInputFile::Data *ifd, + TileBuffer *tileBuffer) +: + Task (group), + _ifd (ifd), + _tileBuffer (tileBuffer) +{ + // empty +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // Calculate information about the tile + // + + Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _ifd->tileDesc, + _ifd->minX, _ifd->maxX, + _ifd->minY, _ifd->maxY, + _tileBuffer->dx, + _tileBuffer->dy, + _tileBuffer->lx, + _tileBuffer->ly); + + // + // Get the size of the tile. + // + + Array numPixelsPerScanLine; + numPixelsPerScanLine.resizeErase(tileRange.max.y - tileRange.min.y + 1); + + int sizeOfTile = 0; + int maxBytesPerTileLine = 0; + + for (int y = tileRange.min.y; y <= tileRange.max.y; y++) + { + numPixelsPerScanLine[y - tileRange.min.y] = 0; + + int bytesPerLine = 0; + + for (int x = tileRange.min.x; x <= tileRange.max.x; x++) + { + int xOffset = _ifd->sampleCountXTileCoords * tileRange.min.x; + int yOffset = _ifd->sampleCountYTileCoords * tileRange.min.y; + + int count = _ifd->getSampleCount(x - xOffset, y - yOffset); + for (unsigned int c = 0; c < _ifd->slices.size(); ++c) + { + sizeOfTile += count * pixelTypeSize(_ifd->slices[c]->typeInFile); + bytesPerLine += count * pixelTypeSize(_ifd->slices[c]->typeInFile); + } + numPixelsPerScanLine[y - tileRange.min.y] += count; + } + + if (bytesPerLine > maxBytesPerTileLine) + maxBytesPerTileLine = bytesPerLine; + } + + // (TODO) don't do this every time. + if (_tileBuffer->compressor != 0) + delete _tileBuffer->compressor; + _tileBuffer->compressor = newTileCompressor + (_ifd->header.compression(), + maxBytesPerTileLine, + _ifd->tileDesc.ySize, + _ifd->header); + + // + // Uncompress the data, if necessary + // + + if (_tileBuffer->compressor && _tileBuffer->dataSize < Int64(sizeOfTile)) + { + _tileBuffer->format = _tileBuffer->compressor->format(); + + _tileBuffer->dataSize = _tileBuffer->compressor->uncompressTile + (_tileBuffer->buffer, _tileBuffer->dataSize, + tileRange, _tileBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _tileBuffer->format = Compressor::XDR; + _tileBuffer->uncompressedData = _tileBuffer->buffer; + } + + // + // Convert the tile of pixel data back from the machine-independent + // representation, and store the result in the frame buffer. + // + + const char *readPtr = _tileBuffer->uncompressedData; + // points to where we + // read from in the + // tile block + + // + // Iterate over the scan lines in the tile. + // + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + TInSliceInfo &slice = *_ifd->slices[i]; + + // + // These offsets are used to facilitate both + // absolute and tile-relative pixel coordinates. + // + + int xOffsetForData = (slice.xTileCoords == 0) ? 0 : tileRange.min.x; + int yOffsetForData = (slice.yTileCoords == 0) ? 0 : tileRange.min.y; + int xOffsetForSampleCount = + (_ifd->sampleCountXTileCoords == 0) ? 0 : tileRange.min.x; + int yOffsetForSampleCount = + (_ifd->sampleCountYTileCoords == 0) ? 0 : tileRange.min.y; + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, + numPixelsPerScanLine[y - tileRange.min.y]); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + copyIntoDeepFrameBuffer (readPtr, slice.pointerArrayBase, + _ifd->sampleCountSliceBase, + _ifd->sampleCountXStride, + _ifd->sampleCountYStride, + y, + tileRange.min.x, + tileRange.max.x, + xOffsetForSampleCount, yOffsetForSampleCount, + xOffsetForData, yOffsetForData, + slice.sampleStride, + slice.xStride, + slice.yStride, + slice.fill, + slice.fillValue, _tileBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + + +TileBufferTask * +newTileBufferTask + (TaskGroup *group, + DeepTiledInputFile::Data *ifd, + int number, + int dx, int dy, + int lx, int ly) +{ + // + // Wait for a tile buffer to become available, + // fill the buffer with raw data from the file, + // and create a new TileBufferTask whose execute() + // method will uncompress the tile and copy the + // tile's pixels into the frame buffer. + // + + TileBuffer *tileBuffer = ifd->getTileBuffer (number); + + try + { + tileBuffer->wait(); + + tileBuffer->dx = dx; + tileBuffer->dy = dy; + tileBuffer->lx = lx; + tileBuffer->ly = ly; + + tileBuffer->uncompressedData = 0; + + readTileData (ifd->_streamData, ifd, dx, dy, lx, ly, + tileBuffer->buffer, + tileBuffer->dataSize, + tileBuffer->uncompressedDataSize); + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the tile buffer is free, and + // re-throw the exception. + // + + tileBuffer->post(); + throw; + } + + return new TileBufferTask (group, ifd, tileBuffer); +} + + +} // namespace + + +DeepTiledInputFile::DeepTiledInputFile (const char fileName[], int numThreads): + _data (new Data (numThreads)) +{ + _data->_deleteStream=true; + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + IStream* is = 0; + try + { + is = new StdIFStream (fileName); + readMagicNumberAndVersionField(*is, _data->version); + + // + // Compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(*is); + } + else + { + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + initialize(); + _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,true); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); + } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (is) delete is; + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if (is) delete is; + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + + +DeepTiledInputFile::DeepTiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): + _data (new Data (numThreads)) +{ + _data->_streamData=0; + _data->_deleteStream=false; + + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + try + { + readMagicNumberAndVersionField(is, _data->version); + + // + // Backward compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(is); + } + else + { + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = &is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + initialize(); + // file is guaranteed not to be multipart, but is deep + _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete, false,true); + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); + } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + + +DeepTiledInputFile::DeepTiledInputFile (const Header &header, + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int version, + int numThreads) : + _data (new Data (numThreads)) + +{ + _data->_streamData->is = is; + _data->_deleteStream=false; + + // + // This constructor called by class Imf::InputFile + // when a user wants to just read an image file, and + // doesn't care or know if the file is tiled. + // No need to have backward compatibility here, because + // we have the header. + // + + _data->header = header; + _data->version = version; + initialize(); + _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,true); + _data->memoryMapped = is->isMemoryMapped(); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); +} + + +DeepTiledInputFile::DeepTiledInputFile (InputPartData* part) : + _data (new Data (part->numThreads)) +{ + _data->_deleteStream=false; + multiPartInitialize(part); +} + + +void +DeepTiledInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) +{ + is.seekg(0); + // + // Construct a MultiPartInputFile, initialize TiledInputFile + // with the part 0 data. + // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. + // + _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); + _data->multiPartBackwardSupport = true; + InputPartData* part = _data->multiPartFile->getPart(0); + + multiPartInitialize(part); +} + + +void +DeepTiledInputFile::multiPartInitialize(InputPartData* part) +{ + if (isTiled(part->header.type()) == false) + THROW (IEX_NAMESPACE::ArgExc, "Can't build a DeepTiledInputFile from a part of type " << part->header.type()); + + _data->_streamData = part->mutex; + _data->header = part->header; + _data->version = part->version; + _data->partNumber = part->partNumber; + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + initialize(); + _data->tileOffsets.readFrom(part->chunkOffsets , _data->fileIsComplete); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); +} + + +void +DeepTiledInputFile::initialize () +{ + if (_data->partNumber == -1) + if (_data->header.type() != DEEPTILE) + throw IEX_NAMESPACE::ArgExc ("Expected a deep tiled file but the file is not deep tiled."); + if(_data->header.version()!=1) + { + THROW(IEX_NAMESPACE::ArgExc, "Version " << _data->header.version() << " not supported for deeptiled images in this version of the library"); + } + + _data->header.sanityCheck (true); + + _data->tileDesc = _data->header.tileDescription(); + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + // + // Create all the TileBuffers and allocate their internal buffers + // + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + _data->tileBuffers[i] = new TileBuffer (); + + _data->maxSampleCountTableSize = _data->tileDesc.ySize * + _data->tileDesc.xSize * + sizeof(int); + + _data->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize); + + _data->sampleCountTableComp = newCompressor(_data->header.compression(), + _data->maxSampleCountTableSize, + _data->header); + + + const ChannelList & c=_data->header.channels(); + _data->combinedSampleSize=0; + for(ChannelList::ConstIterator i=c.begin();i!=c.end();i++) + { + switch( i.channel().type ) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : + _data->combinedSampleSize+=Xdr::size(); + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : + _data->combinedSampleSize+=Xdr::size(); + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : + _data->combinedSampleSize+=Xdr::size(); + break; + default : + THROW(IEX_NAMESPACE::ArgExc, "Bad type for channel " << i.name() << " initializing deepscanline reader"); + } + } + +} + + +DeepTiledInputFile::~DeepTiledInputFile () +{ + if (!_data->memoryMapped) + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + if (_data->tileBuffers[i]->buffer != 0) + delete [] _data->tileBuffers[i]->buffer; + + if (_data->_deleteStream) + delete _data->_streamData->is; + + // + // (TODO) we should have a way to tell if the stream data is owned by this file or + // by a parent multipart file. + // + + if (_data->partNumber == -1) + delete _data->_streamData; + + delete _data; +} + + +const char * +DeepTiledInputFile::fileName () const +{ + return _data->_streamData->is->fileName(); +} + + +const Header & +DeepTiledInputFile::header () const +{ + return _data->header; +} + + +int +DeepTiledInputFile::version () const +{ + return _data->version; +} + + +void +DeepTiledInputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + // + // Set the frame buffer + // + + // + // Check if the new frame buffer descriptor is + // compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // + // Store the pixel sample count table. + // (TODO) Support for different sampling rates? + // + + const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); + if (sampleCountSlice.base == 0) + { + throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); + } + else + { + _data->sampleCountSliceBase = sampleCountSlice.base; + _data->sampleCountXStride = sampleCountSlice.xStride; + _data->sampleCountYStride = sampleCountSlice.yStride; + _data->sampleCountXTileCoords = sampleCountSlice.xTileCoords; + _data->sampleCountYTileCoords = sampleCountSlice.yTileCoords; + } + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (new TInSliceInfo (i.channel().type, + NULL, + i.channel().type, + 0, // xStride + 0, // yStride + 0, // sampleStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (new TInSliceInfo (j.slice().type, + j.slice().base, + fill? j.slice().type: i.channel().type, + j.slice().xStride, + j.slice().yStride, + j.slice().sampleStride, + fill, + false, // skip + j.slice().fillValue, + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + + + if (i != channels.end() && !fill) + ++i; + } + + // (TODO) inspect the following code. It's additional to the scanline input file. + // Is this needed? + + while (i != channels.end()) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (new TInSliceInfo (i.channel().type, + NULL, + i.channel().type, + 0, // xStride + 0, // yStride + 0, // sampleStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + + for (size_t i = 0; i < _data->slices.size(); i++) + delete _data->slices[i]; + _data->slices = slices; +} + + +const DeepFrameBuffer & +DeepTiledInputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +bool +DeepTiledInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + + +void +DeepTiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) +{ + // + // Read a range of tiles from the file into the framebuffer + // + + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + if (!isValidLevel (lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Level coordinate " + "(" << lx << ", " << ly << ") " + "is invalid."); + + // + // Determine the first and last tile coordinates in both dimensions. + // We always attempt to read the range of tiles in the order that + // they are stored in the file. + // + + if (dx1 > dx2) + std::swap (dx1, dx2); + + if (dy1 > dy2) + std::swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + int tileNumber = 0; + + for (int dy = dyStart; dy != dyStop; dy += dY) + { + for (int dx = dx1; dx <= dx2; dx++) + { + if (!isValidTile (dx, dy, lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Tile (" << dx << ", " << dy << ", " << + lx << "," << ly << ") is not a valid tile."); + + ThreadPool::addGlobalTask (newTileBufferTask (&taskGroup, + _data, + tileNumber++, + dx, dy, + lx, ly)); + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledInputFile::readTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +DeepTiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int l) +{ + readTiles (dx1, dx2, dy1, dy2, l, l); +} + + +void +DeepTiledInputFile::readTile (int dx, int dy, int lx, int ly) +{ + readTiles (dx, dx, dy, dy, lx, ly); +} + + +void +DeepTiledInputFile::readTile (int dx, int dy, int l) +{ + readTile (dx, dy, l, l); +} + + +void +DeepTiledInputFile::rawTileData (int &dx, int &dy, + int &lx, int &ly, + char * pixelData, + Int64 &pixelDataSize) const +{ + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Tried to read a tile outside " + "the image file's data window."); + + Int64 tileOffset = _data->tileOffsets (dx, dy, lx, ly); + + if(tileOffset == 0) + { + THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << + lx << ", " << ly << ") is missing."); + } + + Lock lock(*_data->_streamData); + + if (_data->_streamData->is->tellg() != tileOffset) + _data->_streamData->is->seekg (tileOffset); + + + // + // Read the first few bytes of the tile (the header). + // Verify that the tile coordinates and the level number + // are correct. + // + + int tileXCoord, tileYCoord, levelX, levelY; + + if (isMultiPart(_data->version)) + { + int partNumber; + Xdr::read (*_data->_streamData->is, partNumber); + if (partNumber != _data->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << _data->partNumber << "."); + } + } + + Xdr::read (*_data->_streamData->is, tileXCoord); + Xdr::read (*_data->_streamData->is, tileYCoord); + Xdr::read (*_data->_streamData->is, levelX); + Xdr::read (*_data->_streamData->is, levelY); + + Int64 sampleCountTableSize; + Int64 packedDataSize; + Xdr::read (*_data->_streamData->is, sampleCountTableSize); + + Xdr::read (*_data->_streamData->is, packedDataSize); + + + + if (tileXCoord != dx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); + + if (tileYCoord != dy) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); + + if (levelX != lx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); + + if (levelY != ly) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); + + + // total requirement for reading all the data + + Int64 totalSizeRequired=40+sampleCountTableSize+packedDataSize; + + bool big_enough = totalSizeRequired<=pixelDataSize; + + pixelDataSize = totalSizeRequired; + + // was the block we were given big enough? + if(!big_enough || pixelData==NULL) + { + // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek + // in single part files) + if(!isMultiPart(_data->version)) + { + _data->_streamData->is->seekg(_data->_streamData->currentPosition); + } + // leave lock here - bail before reading more data + return; + } + + // copy the values we have read into the output block + *(int *) (pixelData+0) = dx; + *(int *) (pixelData+4) = dy; + *(int *) (pixelData+8) = levelX; + *(int *) (pixelData+12) = levelY; + *(Int64 *) (pixelData+16) =sampleCountTableSize; + *(Int64 *) (pixelData+24) = packedDataSize; + + // didn't read the unpackedsize - do that now + Xdr::read (*_data->_streamData->is, *(Int64 *) (pixelData+32)); + + // read the actual data + _data->_streamData->is->read(pixelData+40, sampleCountTableSize+packedDataSize); + + + if(!isMultiPart(_data->version)) + { + _data->_streamData->currentPosition+=sampleCountTableSize+packedDataSize+40; + } + + // leave lock here + + +} + + +unsigned int +DeepTiledInputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +DeepTiledInputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +DeepTiledInputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +DeepTiledInputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +DeepTiledInputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for files " + "with RIPMAP level mode)."); + + return _data->numXLevels; +} + + +int +DeepTiledInputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +DeepTiledInputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +DeepTiledInputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +DeepTiledInputFile::levelWidth (int lx) const +{ + try + { + return levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +DeepTiledInputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +DeepTiledInputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + { + THROW (IEX_NAMESPACE::ArgExc, "Error calling numXTiles() on image " + "file \"" << _data->_streamData->is->fileName() << "\" " + "(Argument is not in valid range)."); + + } + + return _data->numXTiles[lx]; +} + + +int +DeepTiledInputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + { + THROW (IEX_NAMESPACE::ArgExc, "Error calling numYTiles() on image " + "file \"" << _data->_streamData->is->fileName() << "\" " + "(Argument is not in valid range)."); + } + + return _data->numYTiles[ly]; +} + + +Box2i +DeepTiledInputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +DeepTiledInputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +DeepTiledInputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +DeepTiledInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); + + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +DeepTiledInputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + + +void +DeepTiledInputFile::readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int lx, int ly) +{ + Int64 savedFilePos = 0; + + try + { + Lock lock (*_data->_streamData); + + savedFilePos = _data->_streamData->is->tellg(); + + + if (!isValidLevel (lx, ly)) + { + THROW (IEX_NAMESPACE::ArgExc, + "Level coordinate " + "(" << lx << ", " << ly << ") " + "is invalid."); + } + + if (dx1 > dx2) + std::swap (dx1, dx2); + + if (dy1 > dy2) + std::swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + // (TODO) Check if we have read the sample counts for those tiles, + // if we have, no need to read again. + for (int dy = dyStart; dy != dyStop; dy += dY) + { + for (int dx = dx1; dx <= dx2; dx++) + { + + if (!isValidTile (dx, dy, lx, ly)) + { + THROW (IEX_NAMESPACE::ArgExc, + "Tile (" << dx << ", " << dy << ", " << + lx << "," << ly << ") is not a valid tile."); + } + + Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, lx, ly); + + int xOffset = _data->sampleCountXTileCoords * tileRange.min.x; + int yOffset = _data->sampleCountYTileCoords * tileRange.min.y; + + // + // Skip and check the tile coordinates. + // + + _data->_streamData->is->seekg(_data->tileOffsets(dx, dy, lx, ly)); + + if (isMultiPart(_data->version)) + { + int partNumber; + Xdr::read (*_data->_streamData->is, partNumber); + + if (partNumber != _data->partNumber) + throw IEX_NAMESPACE::InputExc ("Unexpected part number."); + } + + int xInFile, yInFile, lxInFile, lyInFile; + Xdr::read (*_data->_streamData->is, xInFile); + Xdr::read (*_data->_streamData->is, yInFile); + Xdr::read (*_data->_streamData->is, lxInFile); + Xdr::read (*_data->_streamData->is, lyInFile); + + if (xInFile != dx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); + + if (yInFile != dy) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); + + if (lxInFile != lx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); + + if (lyInFile != ly) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); + + Int64 tableSize, dataSize, unpackedDataSize; + Xdr::read (*_data->_streamData->is, tableSize); + Xdr::read (*_data->_streamData->is, dataSize); + Xdr::read (*_data->_streamData->is, unpackedDataSize); + + + if(tableSize>_data->maxSampleCountTableSize) + { + THROW (IEX_NAMESPACE::ArgExc, "Bad sampleCountTableDataSize read from tile "<< dx << ',' << dy << ',' << lx << ',' << ly << ": expected " << _data->maxSampleCountTableSize << " or less, got "<< tableSize); + } + + + // + // We make a check on the data size requirements here. + // Whilst we wish to store 64bit sizes on disk, not all the compressors + // have been made to work with such data sizes and are still limited to + // using signed 32 bit (int) for the data size. As such, this version + // insists that we validate that the data size does not exceed the data + // type max limit. + // @TODO refactor the compressor code to ensure full 64-bit support. + // + + Int64 compressorMaxDataSize = Int64(std::numeric_limits::max()); + if (dataSize > compressorMaxDataSize || + unpackedDataSize > compressorMaxDataSize || + tableSize > compressorMaxDataSize) + { + THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not" + << "support the allocation of data with size > " + << compressorMaxDataSize + << " file table size :" << tableSize + << " file unpacked size :" << unpackedDataSize + << " file packed size :" << dataSize << ".\n"); + } + + // + // Read and uncompress the pixel sample count table. + // + + _data->_streamData->is->read(_data->sampleCountTableBuffer, tableSize); + + const char* readPtr; + + if (tableSize < _data->maxSampleCountTableSize) + { + if(!_data->sampleCountTableComp) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep scanline data corrupt at tile " << dx << ',' << dy << ',' << lx << ',' << ly << " (sampleCountTableDataSize error)"); + } + _data->sampleCountTableComp->uncompress(_data->sampleCountTableBuffer, + tableSize, + tileRange.min.y, + readPtr); + } + else + readPtr = _data->sampleCountTableBuffer; + + size_t cumulative_total_samples =0; + int lastAccumulatedCount; + for (int j = tileRange.min.y; j <= tileRange.max.y; j++) + { + lastAccumulatedCount = 0; + for (int i = tileRange.min.x; i <= tileRange.max.x; i++) + { + int accumulatedCount; + Xdr::read (readPtr, accumulatedCount); + + if (accumulatedCount < lastAccumulatedCount) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep tile sampleCount data corrupt at tile " + << dx << ',' << dy << ',' << lx << ',' << ly << " (negative sample count detected)"); + } + + int count = accumulatedCount - lastAccumulatedCount; + lastAccumulatedCount = accumulatedCount; + + _data->getSampleCount(i - xOffset, j - yOffset) =count; + } + cumulative_total_samples += lastAccumulatedCount; + } + + if(cumulative_total_samples * _data->combinedSampleSize > unpackedDataSize) + { + THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at tile " + << dx << ',' << dy << ',' << lx << ',' << ly + << ": pixel data only contains " << unpackedDataSize + << " bytes of data but table references at least " + << cumulative_total_samples*_data->combinedSampleSize << " bytes of sample data" ); + } + + } + } + + _data->_streamData->is->seekg(savedFilePos); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading sample count data from image " + "file \"" << fileName() << "\". " << e); + + _data->_streamData->is->seekg(savedFilePos); + + throw; + } +} + + +void +DeepTiledInputFile::readPixelSampleCount (int dx, int dy, int l) +{ + readPixelSampleCount (dx, dy, l, l); +} + + +void +DeepTiledInputFile::readPixelSampleCount (int dx, int dy, int lx, int ly) +{ + readPixelSampleCounts (dx, dx, dy, dy, lx, ly); +} + + +void +DeepTiledInputFile::readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int l) +{ + readPixelSampleCounts (dx1, dx2, dy1, dy2, l, l); +} + + +size_t +DeepTiledInputFile::totalTiles() const +{ + // + // Calculate the total number of tiles in the file + // + + int numAllTiles = 0; + + switch (levelMode ()) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + for (int i_l = 0; i_l < numLevels (); ++i_l) + numAllTiles += numXTiles (i_l) * numYTiles (i_l); + + break; + + case RIPMAP_LEVELS: + + for (int i_ly = 0; i_ly < numYLevels (); ++i_ly) + for (int i_lx = 0; i_lx < numXLevels (); ++i_lx) + numAllTiles += numXTiles (i_lx) * numYTiles (i_ly); + + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } + return numAllTiles; +} + + + + +void +DeepTiledInputFile::getTileOrder(int dx[],int dy[],int lx[],int ly[]) const +{ + return _data->tileOffsets.getTileOrder(dx,dy,lx,ly); + +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepTiledInputFile.h b/IlmImf/ImfDeepTiledInputFile.h new file mode 100644 index 0000000..87294b5 --- /dev/null +++ b/IlmImf/ImfDeepTiledInputFile.h @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_DEEP_TILED_INPUT_FILE_H +#define INCLUDED_IMF_DEEP_TILED_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class DeepTiledInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImathBox.h" +#include "ImfTileDescription.h" +#include "ImfThreading.h" +#include "ImfGenericInputFile.h" +#include "ImfDeepFrameBuffer.h" +#include "ImfDeepTiledOutputFile.h" +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT DeepTiledInputFile : public GenericInputFile +{ + public: + + //-------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // reads the file header. The constructor throws an IEX_NAMESPACE::ArgExc + // exception if the file is not tiled. + // The numThreads parameter specifies how many worker threads this + // file will try to keep busy when decompressing individual tiles. + // Destroying TiledInputFile objects constructed with this constructor + // automatically closes the corresponding files. + //-------------------------------------------------------------------- + + DeepTiledInputFile (const char fileName[], + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------- + // A constructor that attaches the new TiledInputFile object + // to a file that has already been opened. + // Destroying TiledInputFile objects constructed with this + // constructor does not automatically close the corresponding + // files. + // ---------------------------------------------------------- + + DeepTiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); + + + //----------- + // Destructor + //----------- + + virtual ~DeepTiledInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledInputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readTile() is called. + // The current frame buffer can be changed after each call + // to readTile(). + //----------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------ + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window + // (in all levels) are present in the input file, or false if + // any pixels are missing. (Another program may still be busy + // writing the file, or file writing may have been aborted + // prematurely.) + //------------------------------------------------------------ + + bool isComplete () const; + + + //-------------------------------------------------- + // Utility functions: + //-------------------------------------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with + // MIPMAP_LEVELS files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + // totalTiles() returns the total number of tiles in the image + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + size_t totalTiles() const; + + //---------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //---------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //-------------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //-------------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional region of + // valid pixel coordinates for a level with level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------ + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // the multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //------------------------------------------------------------ + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + char *pixelData, + Int64 &dataSize) const; + + //------------------------------------------------------------------ + // Read pixel sample counts into a slice in the frame buffer. + // + // readPixelSampleCount(dx, dy, lx, ly) reads the sample counts + // for tile (dx, dy) in level (lx, ly). + // + // readPixelSampleCount(dx, dy, l) calls + // readPixelSampleCount(dx, dy, lx = l, ly = l) + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly) reads all + // the sample counts for tiles within range + // [(min(dx1, dx2), min(dy1, dy2))...(max(dx1, dx2), max(dy1, dy2)], + // and on level (lx, ly) + // + // readPixelSampleCounts(dx1, dx2, dy1, dy2, l) calls + // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx = l, ly = l). + //------------------------------------------------------------------ + + void readPixelSampleCount (int dx, int dy, int l = 0); + void readPixelSampleCount (int dx, int dy, int lx, int ly); + + void readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int lx, int ly); + + void readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int l = 0); + + struct Data; + + + + private: + + friend class InputFile; + friend class MultiPartInputFile; + + DeepTiledInputFile (InputPartData* part); + + DeepTiledInputFile (const DeepTiledInputFile &); // not implemented + DeepTiledInputFile & operator = (const DeepTiledInputFile &); // not implemented + + DeepTiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, + int numThreads); + + void initialize (); + void multiPartInitialize(InputPartData* part); + void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + + void getTileOrder(int dx[],int dy[],int lx[],int ly[]) const; + + + Data * _data; + + + // needed for copyPixels + friend void DeepTiledOutputFile::copyPixels(DeepTiledInputFile &); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDeepTiledInputPart.cpp b/IlmImf/ImfDeepTiledInputPart.cpp new file mode 100644 index 0000000..1262f23 --- /dev/null +++ b/IlmImf/ImfDeepTiledInputPart.cpp @@ -0,0 +1,273 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImfDeepTiledInputPart.h" +#include "ImfMultiPartInputFile.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +DeepTiledInputPart::DeepTiledInputPart(MultiPartInputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getInputPart(partNumber); +} + + +const char * +DeepTiledInputPart::fileName () const +{ + return file->fileName(); +} + + +const Header & +DeepTiledInputPart::header () const +{ + return file->header(); +} + + +int +DeepTiledInputPart::version () const +{ + return file->version(); +} + + +void +DeepTiledInputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + + +const DeepFrameBuffer & +DeepTiledInputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + + +bool +DeepTiledInputPart::isComplete () const +{ + return file->isComplete(); +} + + +unsigned int +DeepTiledInputPart::tileXSize () const +{ + return file->isComplete(); +} + + +unsigned int +DeepTiledInputPart::tileYSize () const +{ + return file->tileYSize(); +} + + +LevelMode +DeepTiledInputPart::levelMode () const +{ + return file->levelMode(); +} + + +LevelRoundingMode +DeepTiledInputPart::levelRoundingMode () const +{ + return file->levelRoundingMode(); +} + + +int +DeepTiledInputPart::numLevels () const +{ + return file->numLevels(); +} + + +int +DeepTiledInputPart::numXLevels () const +{ + return file->numXLevels(); +} + + +int +DeepTiledInputPart::numYLevels () const +{ + return file->numYLevels(); +} + + +bool +DeepTiledInputPart::isValidLevel (int lx, int ly) const +{ + return file->isValidLevel(lx, ly); +} + + +int +DeepTiledInputPart::levelWidth (int lx) const +{ + return file->levelWidth(lx); +} + + +int +DeepTiledInputPart::levelHeight (int ly) const +{ + return file->levelHeight(ly); +} + + +int +DeepTiledInputPart::numXTiles (int lx) const +{ + return file->numXTiles(lx); +} + + +int +DeepTiledInputPart::numYTiles (int ly) const +{ + return file->numYTiles(ly); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledInputPart::dataWindowForLevel (int l) const +{ + return file->dataWindowForLevel(l); +} + +IMATH_NAMESPACE::Box2i +DeepTiledInputPart::dataWindowForLevel (int lx, int ly) const +{ + return file->dataWindowForLevel(lx, ly); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledInputPart::dataWindowForTile (int dx, int dy, int l) const +{ + return file->dataWindowForTile(dx, dy, l); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledInputPart::dataWindowForTile (int dx, int dy, + int lx, int ly) const +{ + return file->dataWindowForTile(dx, dy, lx, ly); +} + + +void +DeepTiledInputPart::readTile (int dx, int dy, int l) +{ + file->readTile(dx, dy, l); +} + + +void +DeepTiledInputPart::readTile (int dx, int dy, int lx, int ly) +{ + file->readTile(dx, dy, lx, ly); +} + + +void +DeepTiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly) +{ + file->readTiles(dx1, dx2, dy1, dy2, lx, ly); +} + + +void +DeepTiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, + int l) +{ + file->readTiles(dx1, dx2, dy1, dy2, l); +} + + +void +DeepTiledInputPart::rawTileData (int &dx, int &dy, + int &lx, int &ly, + char * pixelData, + Int64 & dataSize) const +{ + file->rawTileData(dx, dy, lx, ly, pixelData, dataSize ); +} + + +void +DeepTiledInputPart::readPixelSampleCount (int dx, int dy, int l) +{ + file->readPixelSampleCount(dx, dy, l); +} + + +void +DeepTiledInputPart::readPixelSampleCount (int dx, int dy, int lx, int ly) +{ + file->readPixelSampleCount(dx, dy, lx, ly); +} + + +void +DeepTiledInputPart::readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int lx, int ly) +{ + file->readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly); +} + +void +DeepTiledInputPart::readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int l) +{ + file->readPixelSampleCounts(dx1, dx2, dy1, dy2, l); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepTiledInputPart.h b/IlmImf/ImfDeepTiledInputPart.h new file mode 100644 index 0000000..8663639 --- /dev/null +++ b/IlmImf/ImfDeepTiledInputPart.h @@ -0,0 +1,362 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef IMFDEEPTILEDINPUTPART_H_ +#define IMFDEEPTILEDINPUTPART_H_ + +#include "ImfDeepTiledInputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT DeepTiledInputPart +{ + public: + + DeepTiledInputPart(MultiPartInputFile& multiPartFile, int partNumber); + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledInputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readTile() is called. + // The current frame buffer can be changed after each call + // to readTile(). + //----------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------ + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window + // (in all levels) are present in the input file, or false if + // any pixels are missing. (Another program may still be busy + // writing the file, or file writing may have been aborted + // prematurely.) + //------------------------------------------------------------ + + bool isComplete () const; + + + //-------------------------------------------------- + // Utility functions: + //-------------------------------------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with + // MIPMAP_LEVELS files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //---------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //---------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //-------------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //-------------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional region of + // valid pixel coordinates for a level with level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------ + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // the multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //------------------------------------------------------------ + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + char *data, + Int64 &dataSize + ) const; + + //------------------------------------------------------------------ + // Read pixel sample counts into a slice in the frame buffer. + // + // readPixelSampleCount(dx, dy, lx, ly) reads the sample counts + // for tile (dx, dy) in level (lx, ly). + // + // readPixelSampleCount(dx, dy, l) calls + // readPixelSampleCount(dx, dy, lx = l, ly = l) + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx, ly) reads all + // the sample counts for tiles within range + // [(min(dx1, dx2), min(dy1, dy2))...(max(dx1, dx2), max(dy1, dy2)], + // and on level (lx, ly) + // + // readPixelSampleCounts(dx1, dx2, dy1, dy2, l) calls + // readPixelSampleCounts(dx1, dx2, dy1, dy2, lx = l, ly = l). + //------------------------------------------------------------------ + + void readPixelSampleCount (int dx, int dy, int l = 0); + void readPixelSampleCount (int dx, int dy, int lx, int ly); + + void readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int lx, int ly); + + void readPixelSampleCounts (int dx1, int dx2, + int dy1, int dy2, + int l = 0); + + private: + DeepTiledInputFile* file; + + friend void DeepTiledOutputFile::copyPixels(DeepTiledInputPart &); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif /* IMFDEEPTILEDINPUTPART_H_ */ diff --git a/IlmImf/ImfDeepTiledOutputFile.cpp b/IlmImf/ImfDeepTiledOutputFile.cpp new file mode 100644 index 0000000..a9b226b --- /dev/null +++ b/IlmImf/ImfDeepTiledOutputFile.cpp @@ -0,0 +1,2055 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class DeepTiledOutputFile +// +//----------------------------------------------------------------------------- + +#include "ImfDeepTiledOutputFile.h" +#include "ImfDeepTiledInputFile.h" +#include "ImfDeepTiledInputPart.h" +#include "ImfInputFile.h" +#include "ImfTileDescriptionAttribute.h" +#include "ImfPreviewImageAttribute.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfTiledMisc.h" +#include "ImfStdIO.h" +#include "ImfCompressor.h" +#include "ImfOutputStreamMutex.h" +#include "ImfOutputPartData.h" +#include "ImfArray.h" +#include "ImfXdr.h" +#include "ImfVersion.h" +#include "ImfTileOffsets.h" +#include "ImfThreading.h" +#include "ImfPartType.h" + +#include "ImathBox.h" + +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" + +#include "Iex.h" + +#include +#include +#include +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using std::string; +using std::vector; +using std::ofstream; +using std::map; +using std::min; +using std::max; +using std::swap; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct TOutSliceInfo +{ + PixelType type; + const char * base; + size_t sampleStride; + size_t xStride; + size_t yStride; + bool zero; + int xTileCoords; + int yTileCoords; + + TOutSliceInfo (PixelType type = HALF, + size_t sampleStride = 0, + size_t xStride = 0, + size_t yStride = 0, + bool zero = false, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TOutSliceInfo::TOutSliceInfo (PixelType t, + size_t spst, + size_t xStride, + size_t yStride, + bool z, + int xtc, + int ytc) +: + type (t), + sampleStride (spst), + xStride(xStride), + yStride(yStride), + zero (z), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileCoord +{ + int dx; + int dy; + int lx; + int ly; + + + TileCoord (int xTile = 0, int yTile = 0, + int xLevel = 0, int yLevel = 0) + : + dx (xTile), dy (yTile), + lx (xLevel), ly (yLevel) + { + // empty + } + + + bool + operator < (const TileCoord &other) const + { + return (ly < other.ly) || + (ly == other.ly && lx < other.lx) || + ((ly == other.ly && lx == other.lx) && + ((dy < other.dy) || (dy == other.dy && dx < other.dx))); + } + + + bool + operator == (const TileCoord &other) const + { + return lx == other.lx && + ly == other.ly && + dx == other.dx && + dy == other.dy; + } +}; + + +struct BufferedTile +{ + char * pixelData; + Int64 pixelDataSize; + Int64 unpackedDataSize; + char * sampleCountTableData; + Int64 sampleCountTableSize; + + BufferedTile (const char *data, int size, int unpackedSize, + const char *tableData, int tableSize): + pixelData (0), + pixelDataSize(size), + unpackedDataSize(unpackedSize), + sampleCountTableData(0), + sampleCountTableSize(tableSize) + { + pixelData = new char[pixelDataSize]; + memcpy (pixelData, data, pixelDataSize); + + sampleCountTableData = new char[tableSize]; + memcpy (sampleCountTableData, tableData, tableSize); + } + + ~BufferedTile() + { + delete [] pixelData; + delete [] sampleCountTableData; + } +}; + + +typedef map TileMap; + + +struct TileBuffer +{ + Array buffer; + const char * dataPtr; + Int64 dataSize; + Int64 uncompressedSize; + Compressor * compressor; + Array sampleCountTableBuffer; + const char * sampleCountTablePtr; + Int64 sampleCountTableSize; + Compressor* sampleCountTableCompressor; + TileCoord tileCoord; + bool hasException; + string exception; + + TileBuffer (); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (): + dataPtr (0), + dataSize (0), + compressor (0), + sampleCountTablePtr (0), + sampleCountTableCompressor (0), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + if (compressor != 0) + delete compressor; + + if (sampleCountTableCompressor != 0) + delete sampleCountTableCompressor; +} + + +} // namespace + + +struct DeepTiledOutputFile::Data +{ + Header header; // the image header + int version; // file format version + bool multipart; // file is multipart + TileDescription tileDesc; // describes the tile layout + DeepFrameBuffer frameBuffer; // framebuffer to write into + Int64 previewPosition; + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + + vector tileBuffers; + + Int64 tileOffsetsPosition; // position of the tile index + + TileMap tileMap; // the map of buffered tiles + TileCoord nextTileToWrite; + + int partNumber; // the output part number + + char* sampleCountSliceBase; // the pointer to the number + // of samples in each pixel + int sampleCountXStride; // the x stride for sampleCountSliceBase + int sampleCountYStride; // the y stride for sampleCountSliceBase + int sampleCountXTileCoords; // using x coordinates relative to current tile + int sampleCountYTileCoords; // using y coordinates relative to current tile + + Int64 maxSampleCountTableSize;// the max size in bytes for a pixel + // sample count table + OutputStreamMutex* _streamData; + bool _deleteStream; + + Data (int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile + // buffer coords into our + // vector of tile buffers + + int& getSampleCount(int x, int y); + // get the number of samples + // in each pixel + + TileCoord nextTileCoord (const TileCoord &a); +}; + + +DeepTiledOutputFile::Data::Data (int numThreads): + numXTiles(0), + numYTiles(0), + tileOffsetsPosition (0), + partNumber(-1), + _streamData(NULL), + _deleteStream(true) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); + for (size_t i = 0; i < tileBuffers.size(); i++) + tileBuffers[i] = 0; +} + + +DeepTiledOutputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + // + // Delete all the tile buffers, if any still happen to exist + // + + for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i) + delete i->second; + + for (size_t i = 0; i < tileBuffers.size(); i++) + if (tileBuffers[i] != 0) + delete tileBuffers[i]; + + for (size_t i = 0; i < slices.size(); i++) + delete slices[i]; +} + + +int& +DeepTiledOutputFile::Data::getSampleCount(int x, int y) +{ + return sampleCount(sampleCountSliceBase, + sampleCountXStride, + sampleCountYStride, + x, y); +} + + +TileBuffer* +DeepTiledOutputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +TileCoord +DeepTiledOutputFile::Data::nextTileCoord (const TileCoord &a) +{ + TileCoord b = a; + + if (lineOrder == INCREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy++; + + if (b.dy >= numYTiles[b.ly]) + { + // + // the next tile is in the next level + // + + b.dy = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + case NUM_LEVELMODES : + throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord"); + } + } + } + } + else if (lineOrder == DECREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy--; + + if (b.dy < 0) + { + // + // the next tile is in the next level + // + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + case NUM_LEVELMODES : + throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord"); + } + + if (b.ly < numYLevels) + b.dy = numYTiles[b.ly] - 1; + } + } + }else if(lineOrder==RANDOM_Y) + { + THROW (IEX_NAMESPACE::ArgExc, + "can't compute next tile from randomly ordered image: use getTilesInOrder instead"); + + } + + return b; +} + + +namespace { + +void +writeTileData (DeepTiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + Int64 pixelDataSize, + Int64 unpackedDataSize, + const char sampleCountTableData[], + Int64 sampleCountTableSize) +{ + + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file, + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = ofd->_streamData->currentPosition; + ofd->_streamData->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = ofd->_streamData->os->tellp(); + + ofd->tileOffsets (dx, dy, lx, ly) = currentPosition; + + #ifdef DEBUG + assert (ofd->_streamData->os->tellp() == currentPosition); + #endif + + // + // Write the tile header. + // + + if (ofd->multipart) + { + Xdr::write (*ofd->_streamData->os, ofd->partNumber); + } + Xdr::write (*ofd->_streamData->os, dx); + Xdr::write (*ofd->_streamData->os, dy); + Xdr::write (*ofd->_streamData->os, lx); + Xdr::write (*ofd->_streamData->os, ly); + + // + // Write the packed size of the pixel sample count table (64 bits) + // + + Xdr::write (*ofd->_streamData->os, sampleCountTableSize); + + // + // Write the packed and unpacked data size (64 bits each) + // + + Xdr::write (*ofd->_streamData->os, pixelDataSize); + Xdr::write (*ofd->_streamData->os, unpackedDataSize); + + // + // Write the compressed pixel sample count table. + // + + ofd->_streamData->os->write (sampleCountTableData, sampleCountTableSize); + + // + // Write the compressed data. + // + + ofd->_streamData->os->write (pixelData, pixelDataSize); + + // + // Keep current position in the file so that we can avoid + // redundant seekg() operations (seekg() can be fairly expensive). + // + + ofd->_streamData->currentPosition = currentPosition + + 4 * Xdr::size() + // dx, dy, lx, ly, + 3 * Xdr::size() + // sampleCountTableSize, + // pixelDataSize, + // unpackedDataSize + sampleCountTableSize + + pixelDataSize; + + if (ofd->multipart) + { + ofd->_streamData->currentPosition += Xdr::size(); + } +} + + + +void +bufferedTileWrite ( + DeepTiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + Int64 pixelDataSize, + Int64 unpackedDataSize, + const char sampleCountTableData[], + Int64 sampleCountTableSize) +{ + // + // Check if a tile with coordinates (dx,dy,lx,ly) has already been written. + // + + if (ofd->tileOffsets (dx, dy, lx, ly)) + { + THROW (IEX_NAMESPACE::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " + "more than once."); + } + + // + // If tiles can be written in random order, then don't buffer anything. + // + + if (ofd->lineOrder == RANDOM_Y) + { + writeTileData (ofd, dx, dy, lx, ly, + pixelData, pixelDataSize, unpackedDataSize, + sampleCountTableData, sampleCountTableSize); + return; + } + + // + // If the tiles cannot be written in random order, then check if a + // tile with coordinates (dx,dy,lx,ly) has already been buffered. + // + + TileCoord currentTile = TileCoord(dx, dy, lx, ly); + + if (ofd->tileMap.find (currentTile) != ofd->tileMap.end()) + { + THROW (IEX_NAMESPACE::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " + "more than once."); + } + + // + // If all the tiles before this one have already been written to the file, + // then write this tile immediately and check if we have buffered tiles + // that can be written after this tile. + // + // Otherwise, buffer the tile so it can be written to file later. + // + + if (ofd->nextTileToWrite == currentTile) + { + writeTileData (ofd, dx, dy, lx, ly, + pixelData, pixelDataSize, unpackedDataSize, + sampleCountTableData, sampleCountTableSize); + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + + TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite); + + // + // Step through the tiles and write all successive buffered tiles after + // the current one. + // + + while(i != ofd->tileMap.end()) + { + // + // Write the tile, and then delete the tile's buffered data + // + + writeTileData (ofd, + i->first.dx, i->first.dy, + i->first.lx, i->first.ly, + i->second->pixelData, + i->second->pixelDataSize, + i->second->unpackedDataSize, + i->second->sampleCountTableData, + i->second->sampleCountTableSize); + + delete i->second; + ofd->tileMap.erase (i); + + // + // Proceed to the next tile + // + + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + i = ofd->tileMap.find (ofd->nextTileToWrite); + } + } + else + { + // + // Create a new BufferedTile, copy the pixelData into it, and + // insert it into the tileMap. + // + + ofd->tileMap[currentTile] = + new BufferedTile ((const char *)pixelData, pixelDataSize, unpackedDataSize, + sampleCountTableData, sampleCountTableSize); + } +} + + +void +convertToXdr (DeepTiledOutputFile::Data *ofd, + Array& tileBuffer, + int numScanLines, + vector& bytesPerLine) +{ + // + // Convert the contents of a TiledOutputFile's tileBuffer from the + // machine's native representation to Xdr format. This function is called + // by writeTile(), below, if the compressor wanted its input pixel data + // in the machine's native format, but then failed to compress the data + // (most compressors will expand rather than compress random input data). + // + // Note that this routine assumes that the machine's native representation + // of the pixel data has the same size as the Xdr representation. This + // makes it possible to convert the pixel data in place, without an + // intermediate temporary buffer. + // + + // + // Set these to point to the start of the tile. + // We will write to toPtr, and read from fromPtr. + // + + char *writePtr = tileBuffer; + const char *readPtr = writePtr; + + // + // Iterate over all scan lines in the tile. + // + + for (int y = 0; y < numScanLines; ++y) + { + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = *ofd->slices[i]; + + // + // Convert the samples in place. + // + + Int64 numPixelsPerScanLine = bytesPerLine[y]; + + convertInPlace (writePtr, readPtr, slice.type, + numPixelsPerScanLine); + } + } + + #ifdef DEBUG + + assert (writePtr == readPtr); + + #endif +} + + +// +// A TileBufferTask encapsulates the task of copying a tile from +// the user's framebuffer into a LineBuffer and compressing the data +// if necessary. +// + +class TileBufferTask: public Task +{ + public: + + TileBufferTask (TaskGroup *group, + DeepTiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + DeepTiledOutputFile::Data * _ofd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + DeepTiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly) +: + Task (group), + _ofd (ofd), + _tileBuffer (_ofd->getTileBuffer (number)) +{ + // + // Wait for the tileBuffer to become available + // + + _tileBuffer->wait (); + _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly); +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the frame buffer + // into the tile buffer + // + // Convert one tile's worth of pixel data to + // a machine-independent representation, and store + // the result in _tileBuffer->buffer. + // + + Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _ofd->tileDesc, + _ofd->minX, _ofd->maxX, + _ofd->minY, _ofd->maxY, + _tileBuffer->tileCoord.dx, + _tileBuffer->tileCoord.dy, + _tileBuffer->tileCoord.lx, + _tileBuffer->tileCoord.ly); + + int numScanLines = tileRange.max.y - tileRange.min.y + 1; +// int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; + + // + // Get the bytes for each line. + // + + vector bytesPerLine(_ofd->tileDesc.ySize); + vector xOffsets(_ofd->slices.size()); + vector yOffsets(_ofd->slices.size()); + for (size_t i = 0; i < _ofd->slices.size(); i++) + { + const TOutSliceInfo &slice = *_ofd->slices[i]; + xOffsets[i] = slice.xTileCoords * tileRange.min.x; + yOffsets[i] = slice.yTileCoords * tileRange.min.y; + } + + calculateBytesPerLine(_ofd->header, + _ofd->sampleCountSliceBase, + _ofd->sampleCountXStride, + _ofd->sampleCountYStride, + tileRange.min.x, tileRange.max.x, + tileRange.min.y, tileRange.max.y, + xOffsets, yOffsets, + bytesPerLine); + + // + // Allocate the memory for internal buffer. + // (TODO) more efficient memory management? + // + + Int64 totalBytes = 0; + Int64 maxBytesPerTileLine = 0; + for (size_t i = 0; i < bytesPerLine.size(); i++) + { + totalBytes += bytesPerLine[i]; + if (bytesPerLine[i] > maxBytesPerTileLine) + maxBytesPerTileLine = bytesPerLine[i]; + } + _tileBuffer->buffer.resizeErase(totalBytes); + + char *writePtr = _tileBuffer->buffer; + + // + // Iterate over the scan lines in the tile. + // + + int xOffsetForSampleCount = + (_ofd->sampleCountXTileCoords == 0) ? 0 : tileRange.min.x; + int yOffsetForSampleCount = + (_ofd->sampleCountYTileCoords == 0) ? 0 : tileRange.min.y; + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = *_ofd->slices[i]; + + + // + // Fill the tile buffer with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _data->tileBuffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + bytesPerLine[y - tileRange.min.y]); + } + else + { + // + // The frame buffer contains data for this channel. + // + + + int xOffsetForData = slice.xTileCoords ? tileRange.min.x : 0; + int yOffsetForData = slice.yTileCoords ? tileRange.min.y : 0; + + // (TOOD) treat sample count offsets differently. + copyFromDeepFrameBuffer (writePtr, + slice.base, + _ofd->sampleCountSliceBase, + _ofd->sampleCountXStride, + _ofd->sampleCountYStride, + y, + tileRange.min.x, + tileRange.max.x, + xOffsetForSampleCount, + yOffsetForSampleCount, + xOffsetForData, + yOffsetForData, + slice.sampleStride, + slice.xStride, + slice.yStride, + _ofd->format, + slice.type); +#if defined(DEBUG) + assert(writePtr-_tileBuffer->buffer<=totalBytes); +#endif + } + } + } + + // + // Compress the pixel sample count table. + // + + char* ptr = _tileBuffer->sampleCountTableBuffer; + Int64 tableDataSize = 0; + for (int i = tileRange.min.y; i <= tileRange.max.y; i++) + { + int count = 0; + for (int j = tileRange.min.x; j <= tileRange.max.x; j++) + { + count += _ofd->getSampleCount(j - xOffsetForSampleCount, + i - yOffsetForSampleCount); + Xdr::write (ptr, count); + tableDataSize += sizeof (int); + } + } + + if(_tileBuffer->sampleCountTableCompressor) + { + _tileBuffer->sampleCountTableSize = + _tileBuffer->sampleCountTableCompressor->compress ( + _tileBuffer->sampleCountTableBuffer, + tableDataSize, + tileRange.min.y, + _tileBuffer->sampleCountTablePtr); + } + + // + // If we can't make data shrink (or compression was disabled), then just use the raw data. + // + + if ( ! _tileBuffer->sampleCountTableCompressor || + _tileBuffer->sampleCountTableSize >= _ofd->maxSampleCountTableSize) + { + _tileBuffer->sampleCountTableSize = _ofd->maxSampleCountTableSize; + _tileBuffer->sampleCountTablePtr = _tileBuffer->sampleCountTableBuffer; + } + + // + // Compress the contents of the tileBuffer, + // and store the compressed data in the output file. + // + + _tileBuffer->dataSize = writePtr - _tileBuffer->buffer; + _tileBuffer->uncompressedSize = _tileBuffer->dataSize; + _tileBuffer->dataPtr = _tileBuffer->buffer; + + // (TODO) don't do this all the time. + if (_tileBuffer->compressor != 0) + delete _tileBuffer->compressor; + _tileBuffer->compressor = newTileCompressor + (_ofd->header.compression(), + maxBytesPerTileLine, + _ofd->tileDesc.ySize, + _ofd->header); + + if (_tileBuffer->compressor) + { + const char *compPtr; + + Int64 compSize = _tileBuffer->compressor->compressTile + (_tileBuffer->dataPtr, + _tileBuffer->dataSize, + tileRange, compPtr); + + if (compSize < _tileBuffer->dataSize) + { + _tileBuffer->dataSize = compSize; + _tileBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using native format, + // so we need to convert the lineBuffer to Xdr. + // + + convertToXdr (_ofd, _tileBuffer->buffer, numScanLines, + bytesPerLine); + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + +} // namespace + + +DeepTiledOutputFile::DeepTiledOutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) + +{ + _data->_streamData=new OutputStreamMutex(); + _data->_deleteStream =true; + try + { + header.sanityCheck (true); + _data->_streamData->os = new StdOFStream (fileName); + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true); + _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os); + _data->multipart = false; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os; + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os; + if (_data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + + +DeepTiledOutputFile::DeepTiledOutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) +{ + _data->_streamData=new OutputStreamMutex(); + _data->_deleteStream=false; + + try + { + header.sanityCheck(true); + _data->_streamData->os = &os; + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true); + _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os); + _data->multipart = false; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + +DeepTiledOutputFile::DeepTiledOutputFile(const OutputPartData* part) +{ + + try + { + if (part->header.type() != DEEPTILE) + throw IEX_NAMESPACE::ArgExc("Can't build a DeepTiledOutputFile from " + "a type-mismatched part."); + + _data = new Data (part->numThreads); + _data->_streamData=part->mutex; + _data->_deleteStream=false; + initialize(part->header); + _data->partNumber = part->partNumber; + _data->tileOffsetsPosition = part->chunkOffsetTablePosition; + _data->previewPosition = part->previewPosition; + _data->multipart = part->multipart; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot initialize output part " + "\"" << part->partNumber << "\". " << e); + throw; + } + catch (...) + { + if (_data) delete _data; + + throw; + } +} + +void +DeepTiledOutputFile::initialize (const Header &header) +{ + _data->header = header; + _data->header.setType(DEEPTILE); + _data->lineOrder = _data->header.lineOrder(); + + // + // Check that the file is indeed tiled + // + + _data->tileDesc = _data->header.tileDescription(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + // + // Determine the first tile coordinate that we will be writing + // if the file is not RANDOM_Y. + // + + _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)? + TileCoord (0, 0, 0, 0): + TileCoord (0, _data->numYTiles[0] - 1, 0, 0); + + Compressor* compressor = newTileCompressor + (_data->header.compression(), + 0, + _data->tileDesc.ySize, + _data->header); + + _data->format = defaultFormat (compressor); + + if (compressor != 0) + delete compressor; + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); + + //ignore the existing value of chunkCount - correct it if it's wrong + _data->header.setChunkCount(getChunkOffsetTableSize(_data->header,true)); + + _data->maxSampleCountTableSize = _data->tileDesc.ySize * + _data->tileDesc.xSize * + sizeof(int); + + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + { + _data->tileBuffers[i] = new TileBuffer (); + + _data->tileBuffers[i]->sampleCountTableBuffer. + resizeErase(_data->maxSampleCountTableSize); + + char * p = &(_data->tileBuffers[i]->sampleCountTableBuffer[0]); + memset (p, 0, _data->maxSampleCountTableSize); + + _data->tileBuffers[i]->sampleCountTableCompressor = + newCompressor (_data->header.compression(), + _data->maxSampleCountTableSize, + _data->header); + } +} + + +DeepTiledOutputFile::~DeepTiledOutputFile () +{ + if (_data) + { + { + Lock lock(*_data->_streamData); + Int64 originalPosition = _data->_streamData->os->tellp(); + + if (_data->tileOffsetsPosition > 0) + { + try + { + _data->_streamData->os->seekp (_data->tileOffsetsPosition); + _data->tileOffsets.writeTo (*_data->_streamData->os); + + // + // Restore the original position. + // + _data->_streamData->os->seekp (originalPosition); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + if (_data->_deleteStream && _data->_streamData) + delete _data->_streamData->os; + + // + // (TODO) we should have a way to tell if the stream data is owned by + // this file or by a parent multipart file. + // + + if (_data->partNumber == -1 && _data->_streamData) + delete _data->_streamData; + + delete _data; + } +} + + +const char * +DeepTiledOutputFile::fileName () const +{ + return _data->_streamData->os->fileName(); +} + + +const Header & +DeepTiledOutputFile::header () const +{ + return _data->header; +} + + +void +DeepTiledOutputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + + if (j.slice().xSampling != 1 || j.slice().ySampling != 1) + THROW (IEX_NAMESPACE::ArgExc, "All channels in a tiled file must have" + "sampling (1,1)."); + } + + // + // Store the pixel sample count table. + // + + const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice(); + if (sampleCountSlice.base == 0) + { + throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice."); + } + else + { + _data->sampleCountSliceBase = sampleCountSlice.base; + _data->sampleCountXStride = sampleCountSlice.xStride; + _data->sampleCountYStride = sampleCountSlice.yStride; + _data->sampleCountXTileCoords = sampleCountSlice.xTileCoords; + _data->sampleCountYTileCoords = sampleCountSlice.yTileCoords; + } + + // + // Initialize slice table for writePixels(). + // Pixel sample count slice is not presented in the header, + // so it wouldn't be added here. + // Store the pixel base pointer table. + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (new TOutSliceInfo (i.channel().type, + 0, // sampleStride, + 0, // xStride + 0, // yStride + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (new TOutSliceInfo (j.slice().type, + j.slice().sampleStride, + j.slice().xStride, + j.slice().yStride, + false, // zero + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + + TOutSliceInfo* slice = slices.back(); + slice->base = j.slice().base; + + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + + for (size_t i = 0; i < _data->slices.size(); i++) + delete _data->slices[i]; + _data->slices = slices; +} + + +const DeepFrameBuffer & +DeepTiledOutputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +void +DeepTiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly) +{ + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data source."); + + if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Tile coordinates are invalid."); + + if (!isValidLevel (lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Level coordinate " + "(" << lx << ", " << ly << ") " + "is invalid."); + // + // Determine the first and last tile coordinates in both dimensions + // based on the file's lineOrder + // + + if (dx1 > dx2) + swap (dx1, dx2); + + if (dy1 > dy2) + swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); + int numTasks = min ((int)_data->tileBuffers.size(), numTiles); + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add in the initial compression tasks to the thread pool + // + + int nextCompBuffer = 0; + int dxComp = dx1; + int dyComp = dyStart; + + while (nextCompBuffer < numTasks) + { + ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer++, + dxComp, dyComp, + lx, ly)); + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // Write the compressed buffers and add in more compression + // tasks until done + // + + int nextWriteBuffer = 0; + int dxWrite = dx1; + int dyWrite = dyStart; + + while (nextWriteBuffer < numTiles) + { + // + // Wait until the nextWriteBuffer is ready to be written + // + + TileBuffer* writeBuffer = + _data->getTileBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + // + // Write the tilebuffer + // + + bufferedTileWrite ( _data, dxWrite, dyWrite, lx, ly, + writeBuffer->dataPtr, + writeBuffer->dataSize, + writeBuffer->uncompressedSize, + writeBuffer->sampleCountTablePtr, + writeBuffer->sampleCountTableSize); + + // + // Release the lock on nextWriteBuffer + // + + writeBuffer->post(); + + // + // If there are no more tileBuffers to compress, then + // only continue to write out remaining tileBuffers, + // otherwise keep adding compression tasks. + // + + if (nextCompBuffer < numTiles) + { + // + // add nextCompBuffer as a compression Task + // + + ThreadPool::addGlobalTask + (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer, + dxComp, dyComp, + lx, ly)); + } + + nextWriteBuffer++; + dxWrite++; + + if (dxWrite > dx2) + { + dxWrite = dx1; + dyWrite += dY; + } + + nextCompBuffer++; + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledOutputFile::writeTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +DeepTiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l) +{ + writeTiles (dx1, dxMax, dyMin, dyMax, l, l); +} + + +void +DeepTiledOutputFile::writeTile (int dx, int dy, int lx, int ly) +{ + writeTiles (dx, dx, dy, dy, lx, ly); +} + + +void +DeepTiledOutputFile::writeTile (int dx, int dy, int l) +{ + writeTile(dx, dy, l, l); +} + + +void +DeepTiledOutputFile::copyPixels (DeepTiledInputFile &in) +{ + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + + + if (!(hdr.tileDescription() == inHdr.tileDescription())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different tile descriptions."); + + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". The " + "files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" " + "failed. The files have different channel " + "lists."); + + + // Verify that no pixel data have been written to this file yet. + // + + if (!_data->tileOffsets.isEmpty()) + THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << _data->_streamData->os->fileName() << "\" " + "failed. \"" << fileName() << "\" " + "already contains pixel data."); + + + int numAllTiles = in.totalTiles(); + + Lock lock (*_data->_streamData); + + // + // special handling for random tiles + // + + vector dx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); + vector dy_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); + vector lx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); + vector ly_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1); + + if(_data->lineOrder==RANDOM_Y) + { + in.getTileOrder(&dx_list[0],&dy_list[0],&lx_list[0],&ly_list[0]); + _data->nextTileToWrite.dx=dx_list[0]; + _data->nextTileToWrite.dy=dy_list[0]; + _data->nextTileToWrite.lx=lx_list[0]; + _data->nextTileToWrite.ly=ly_list[0]; + } + + + vector data(4096); + for (int i = 0; i < numAllTiles; ++i) + { + + int dx = _data->nextTileToWrite.dx; + int dy = _data->nextTileToWrite.dy; + int lx = _data->nextTileToWrite.lx; + int ly = _data->nextTileToWrite.ly; + + Int64 dataSize = data.size(); + + in.rawTileData (dx, dy, lx, ly, &data[0], dataSize); + if(dataSize>data.size()) + { + data.resize(dataSize); + in.rawTileData (dx, dy, lx, ly, &data[0], dataSize); + } + Int64 sampleCountTableSize = *(Int64 *)(&data[0] + 16); + Int64 pixelDataSize = *(Int64 *)(&data[0] + 24); + Int64 unpackedPixelDataSize = *(Int64 *)(&data[0] + 32); + char * sampleCountTable = &data[0]+40; + char * pixelData = sampleCountTable + sampleCountTableSize; + + writeTileData (_data, dx, dy, lx, ly, pixelData, pixelDataSize,unpackedPixelDataSize,sampleCountTable,sampleCountTableSize); + + + if(_data->lineOrder==RANDOM_Y) + { + if(inextTileToWrite.dx=dx_list[i+1]; + _data->nextTileToWrite.dy=dy_list[i+1]; + _data->nextTileToWrite.lx=lx_list[i+1]; + _data->nextTileToWrite.ly=ly_list[i+1]; + } + }else{ + _data->nextTileToWrite = _data->nextTileCoord (_data->nextTileToWrite); + } + + } +} + + +void +DeepTiledOutputFile::copyPixels (DeepTiledInputPart &in) +{ + copyPixels(*in.file); +} + + +unsigned int +DeepTiledOutputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +DeepTiledOutputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +DeepTiledOutputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +DeepTiledOutputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +DeepTiledOutputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for RIPMAPs)."); + return _data->numXLevels; +} + + +int +DeepTiledOutputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +DeepTiledOutputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +DeepTiledOutputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +DeepTiledOutputFile::levelWidth (int lx) const +{ + try + { + int retVal = levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + + return retVal; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +DeepTiledOutputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +DeepTiledOutputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " + "file \"" << _data->_streamData->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numXTiles[lx]; +} + + +int +DeepTiledOutputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " + "file \"" << _data->_streamData->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numYTiles[ly]; +} + + +Box2i +DeepTiledOutputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +DeepTiledOutputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); + + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +DeepTiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + + +void +DeepTiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_data->_streamData); + + if (_data->previewPosition <= 0) + THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _data->_streamData->os->tellp(); + + try + { + _data->_streamData->os->seekp (_data->previewPosition); + pia.writeValueTo (*_data->_streamData->os, _data->version); + _data->_streamData->os->seekp (savedPosition); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +DeepTiledOutputFile::breakTile + (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c) +{ + Lock lock (*_data->_streamData); + + Int64 position = _data->tileOffsets (dx, dy, lx, ly); + + if (!position) + THROW (IEX_NAMESPACE::ArgExc, + "Cannot overwrite tile " + "(" << dx << ", " << dy << ", " << lx << "," << ly << "). " + "The tile has not yet been stored in " + "file \"" << fileName() << "\"."); + + _data->_streamData->currentPosition = 0; + _data->_streamData->os->seekp (position + offset); + + for (int i = 0; i < length; ++i) + _data->_streamData->os->write (&c, 1); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepTiledOutputFile.h b/IlmImf/ImfDeepTiledOutputFile.h new file mode 100644 index 0000000..e12dda1 --- /dev/null +++ b/IlmImf/ImfDeepTiledOutputFile.h @@ -0,0 +1,475 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_DEEP_TILED_OUTPUT_FILE_H +#define INCLUDED_IMF_DEEP_TILED_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class DeepTiledOutputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImathBox.h" +#include "ImfThreading.h" +#include "ImfGenericOutputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT DeepTiledOutputFile : public GenericOutputFile +{ + public: + + //------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // writes the file header. The file header is also copied into the + // TiledOutputFile object, and can later be accessed via the header() + // method. + // + // Destroying TiledOutputFile constructed with this constructor + // automatically closes the corresponding files. + // + // The header must contain a TileDescriptionAttribute called "tiles". + // + // The x and y subsampling factors for all image channels must be 1; + // subsampling is not supported. + // + // Tiles can be written to the file in arbitrary order. The line + // order attribute can be used to cause the tiles to be sorted in + // the file. When the file is read later, reading the tiles in the + // same order as they are in the file tends to be significantly + // faster than reading the tiles in random order (see writeTile, + // below). + //------------------------------------------------------------------- + + DeepTiledOutputFile (const char fileName[], + const Header &header, + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------------- + // A constructor that attaches the new TiledOutputFile object to + // a file that has already been opened. Destroying TiledOutputFile + // objects constructed with this constructor does not automatically + // close the corresponding files. + // ---------------------------------------------------------------- + + DeepTiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads = globalThreadCount ()); + + + //----------------------------------------------------- + // Destructor + // + // Destroying a TiledOutputFile object before all tiles + // have been written results in an incomplete file. + //----------------------------------------------------- + + virtual ~DeepTiledOutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledOutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writeTile() is + // called. The current frame buffer can be changed + // after each call to writeTile(). + //------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------- + // Utility functions: + //------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with MIPMAP_LEVELS + // files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //--------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //--------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //---------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //---------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a level with + // level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx) - 1] + // dy must lie in the interval [0, numYTiles(ly) - 1] + // + // lx must lie in the interval [0, numXLevels() - 1] + // ly must lie in the inverval [0, numYLevels() - 1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. The tile coordinates, + // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile + // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the + // tiles are always written in the order specified by the line + // order attribute. Hence, it is not possible to specify an + // "invalid" or empty tile range. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + // The file's line order attribute determines the order of the tiles + // in the file: + // + // INCREASING_Y In the file, the tiles for each level are stored + // in a contiguous block. The levels are ordered + // like this: + // + // (0, 0) (1, 0) ... (nx-1, 0) + // (0, 1) (1, 1) ... (nx-1, 1) + // ... + // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) + // + // where nx = numXLevels(), and ny = numYLevels(). + // In an individual level, (lx, ly), the tiles + // are stored in the following order: + // + // (0, 0) (1, 0) ... (tx-1, 0) + // (0, 1) (1, 1) ... (tx-1, 1) + // ... + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // + // where tx = numXTiles(lx), + // and ty = numYTiles(ly). + // + // DECREASING_Y As for INCREASING_Y, the tiles for each level + // are stored in a contiguous block. The levels + // are ordered the same way as for INCREASING_Y, + // but within an individual level, the tiles + // are stored in this order: + // + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // ... + // (0, 1) (1, 1) ... (tx-1, 1) + // (0, 0) (1, 0) ... (tx-1, 0) + // + // + // RANDOM_Y The order of the calls to writeTile() determines + // the order of the tiles in the file. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from a TiledInputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the TiledInputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + //------------------------------------------------------------------ + + void copyPixels (DeepTiledInputFile &in); + void copyPixels (DeepTiledInputPart &in); + + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few tiles at a time, + // while the image is being generated. Since the preview image + // is an attribute in the file's header, it gets stored in the + // file as soon as the file is opened, but we may not know what + // the preview image should look like until we have written the + // last tile of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //------------------------------------------------------------- + // Break a tile -- for testing and debugging only: + // + // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the tile with tile coordinates + // (dx, dy) and level number (lx, ly). + // + // Warning: Calling this function usually results in a broken + // image file. The file or parts of it may not be readable, + // or the file may contain bad data. + // + //------------------------------------------------------------- + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + struct Data; + + private: + + // ---------------------------------------------------------------- + // A constructor attaches the OutputStreamMutex to the + // given one from MultiPartOutputFile. Set the previewPosition + // and lineOffsetsPosition which have been acquired from + // the constructor of MultiPartOutputFile as well. + // ---------------------------------------------------------------- + DeepTiledOutputFile (const OutputPartData* part); + + DeepTiledOutputFile (const DeepTiledOutputFile &); // not implemented + DeepTiledOutputFile & operator = (const DeepTiledOutputFile &); // not implemented + + void initialize (const Header &header); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + Data * _data; + + + friend class MultiPartOutputFile; + +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDeepTiledOutputPart.cpp b/IlmImf/ImfDeepTiledOutputPart.cpp new file mode 100644 index 0000000..7239c01 --- /dev/null +++ b/IlmImf/ImfDeepTiledOutputPart.cpp @@ -0,0 +1,250 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfDeepTiledOutputPart.h" +#include "ImfMultiPartOutputFile.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +DeepTiledOutputPart::DeepTiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getOutputPart(partNumber); +} + +const char * +DeepTiledOutputPart::fileName () const +{ + return file->fileName(); +} + + +const Header & +DeepTiledOutputPart::header () const +{ + return file->header(); +} + + +void +DeepTiledOutputPart::setFrameBuffer (const DeepFrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + + +const DeepFrameBuffer & +DeepTiledOutputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + + +unsigned int +DeepTiledOutputPart::tileXSize () const +{ + return file->tileXSize(); +} + + +unsigned int +DeepTiledOutputPart::tileYSize () const +{ + return file->tileYSize(); +} + + +LevelMode +DeepTiledOutputPart::levelMode () const +{ + return file->levelMode(); +} + + +LevelRoundingMode +DeepTiledOutputPart::levelRoundingMode () const +{ + return file->levelRoundingMode(); +} + + +int +DeepTiledOutputPart::numLevels () const +{ + return file->numLevels(); +} + + +int +DeepTiledOutputPart::numXLevels () const +{ + return file->numXLevels(); +} + + +int +DeepTiledOutputPart::numYLevels () const +{ + return file->numYLevels(); +} + + +bool +DeepTiledOutputPart::isValidLevel (int lx, int ly) const +{ + return file->isValidLevel(lx, ly); +} + + +int +DeepTiledOutputPart::levelWidth (int lx) const +{ + return file->levelWidth(lx); +} + + +int +DeepTiledOutputPart::levelHeight (int ly) const +{ + return file->levelHeight(ly); +} + + +int +DeepTiledOutputPart::numXTiles (int lx) const +{ + return file->numXTiles(lx); +} + + +int +DeepTiledOutputPart::numYTiles (int ly) const +{ + return file->numYTiles(ly); +} + + + +IMATH_NAMESPACE::Box2i +DeepTiledOutputPart::dataWindowForLevel (int l) const +{ + return file->dataWindowForLevel(l); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledOutputPart::dataWindowForLevel (int lx, int ly) const +{ + return file->dataWindowForLevel(lx, ly); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledOutputPart::dataWindowForTile (int dx, int dy, + int l) const +{ + return file->dataWindowForTile(dx, dy, l); +} + + +IMATH_NAMESPACE::Box2i +DeepTiledOutputPart::dataWindowForTile (int dx, int dy, + int lx, int ly) const +{ + return file->dataWindowForTile(dx, dy, lx, ly); +} + + +void +DeepTiledOutputPart::writeTile (int dx, int dy, int l) +{ + file->writeTile(dx, dy, l); +} + + +void +DeepTiledOutputPart::writeTile (int dx, int dy, int lx, int ly) +{ + file->writeTile(dx, dy, lx, ly); +} + + +void +DeepTiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly) +{ + file->writeTiles(dx1, dx2, dy1, dy2, lx, ly); +} + + +void +DeepTiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, + int l) +{ + file->writeTiles(dx1, dx2, dy1, dy2, l); +} + + +void +DeepTiledOutputPart::copyPixels (DeepTiledInputFile &in) +{ + file->copyPixels(in); +} + + +void +DeepTiledOutputPart::copyPixels (DeepTiledInputPart &in) +{ + file->copyPixels(in); +} + + +void +DeepTiledOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) +{ + file->updatePreviewImage(newPixels); +} + + +void +DeepTiledOutputPart::breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c) +{ + file->breakTile(dx, dy, lx, ly, offset, length, c); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDeepTiledOutputPart.h b/IlmImf/ImfDeepTiledOutputPart.h new file mode 100644 index 0000000..c88da12 --- /dev/null +++ b/IlmImf/ImfDeepTiledOutputPart.h @@ -0,0 +1,394 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFDEEPTILEDOUTPUTPART_H_ +#define IMFDEEPTILEDOUTPUTPART_H_ + +#include "ImfForward.h" +#include "ImfDeepTiledInputFile.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT DeepTiledOutputPart +{ + public: + + DeepTiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledOutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writeTile() is + // called. The current frame buffer can be changed + // after each call to writeTile(). + //------------------------------------------------------- + + void setFrameBuffer (const DeepFrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const DeepFrameBuffer & frameBuffer () const; + + + //------------------- + // Utility functions: + //------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with MIPMAP_LEVELS + // files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //--------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //--------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //---------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //---------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a level with + // level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx) - 1] + // dy must lie in the interval [0, numYTiles(ly) - 1] + // + // lx must lie in the interval [0, numXLevels() - 1] + // ly must lie in the inverval [0, numYLevels() - 1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. The tile coordinates, + // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile + // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the + // tiles are always written in the order specified by the line + // order attribute. Hence, it is not possible to specify an + // "invalid" or empty tile range. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + // The file's line order attribute determines the order of the tiles + // in the file: + // + // INCREASING_Y In the file, the tiles for each level are stored + // in a contiguous block. The levels are ordered + // like this: + // + // (0, 0) (1, 0) ... (nx-1, 0) + // (0, 1) (1, 1) ... (nx-1, 1) + // ... + // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) + // + // where nx = numXLevels(), and ny = numYLevels(). + // In an individual level, (lx, ly), the tiles + // are stored in the following order: + // + // (0, 0) (1, 0) ... (tx-1, 0) + // (0, 1) (1, 1) ... (tx-1, 1) + // ... + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // + // where tx = numXTiles(lx), + // and ty = numYTiles(ly). + // + // DECREASING_Y As for INCREASING_Y, the tiles for each level + // are stored in a contiguous block. The levels + // are ordered the same way as for INCREASING_Y, + // but within an individual level, the tiles + // are stored in this order: + // + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // ... + // (0, 1) (1, 1) ... (tx-1, 1) + // (0, 0) (1, 0) ... (tx-1, 0) + // + // + // RANDOM_Y The order of the calls to writeTile() determines + // the order of the tiles in the file. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from a TiledInputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the TiledInputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + //------------------------------------------------------------------ + + void copyPixels (DeepTiledInputFile &in); + void copyPixels (DeepTiledInputPart &in); + + + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few tiles at a time, + // while the image is being generated. Since the preview image + // is an attribute in the file's header, it gets stored in the + // file as soon as the file is opened, but we may not know what + // the preview image should look like until we have written the + // last tile of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //------------------------------------------------------------- + // Break a tile -- for testing and debugging only: + // + // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the tile with tile coordinates + // (dx, dy) and level number (lx, ly). + // + // Warning: Calling this function usually results in a broken + // image file. The file or parts of it may not be readable, + // or the file may contain bad data. + // + //------------------------------------------------------------- + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + + private: + DeepTiledOutputFile* file; + +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFDEEPTILEDOUTPUTPART_H_ */ diff --git a/IlmImf/ImfDoubleAttribute.cpp b/IlmImf/ImfDoubleAttribute.cpp new file mode 100644 index 0000000..cbeabe3 --- /dev/null +++ b/IlmImf/ImfDoubleAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class DoubleAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +template <> +const char * +DoubleAttribute::staticTypeName () +{ + return "double"; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDoubleAttribute.h b/IlmImf/ImfDoubleAttribute.h new file mode 100644 index 0000000..d9a88a8 --- /dev/null +++ b/IlmImf/ImfDoubleAttribute.h @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_DOUBLE_ATTRIBUTE_H +#define INCLUDED_IMF_DOUBLE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class DoubleAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute DoubleAttribute; +template <> IMF_EXPORT const char *DoubleAttribute::staticTypeName (); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfDwaCompressor.cpp b/IlmImf/ImfDwaCompressor.cpp new file mode 100644 index 0000000..1c1bd45 --- /dev/null +++ b/IlmImf/ImfDwaCompressor.cpp @@ -0,0 +1,3424 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation 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. +// +/////////////////////////////////////////////////////////////////////////// + +//--------------------------------------------------- +// +// class DwaCompressor -- Store lossy RGB data by quantizing +// DCT components. +// +// First, we try and figure out what compression strategy to take +// based in channel name. For RGB channels, we want a lossy method +// described below. But, if we have alpha, we should do something +// different (and probably using RLE). If we have depth, or velocity, +// or something else, just fall back to ZIP. The rules for deciding +// which strategy to use are setup in initializeDefaultChannelRules(). +// When writing a file, the relevant rules needed to decode are written +// into the start of the data block, making a self-contained file. +// If initializeDefaultChannelRules() doesn't quite suite your naming +// conventions, you can adjust the rules without breaking decoder +// compatability. +// +// If we're going to lossy compress R, G, or B channels, it's easier +// to toss bits in a more perceptual uniform space. One could argue +// at length as to what constitutes perceptually uniform, expecially +// when storing either scene/input/focal plane referred and output referred +// data. +// +// We'll compromise. For values <= 1, we use a traditional power function +// (without any of that straight-line business at the bottom). For values > 1, +// we want something more like a log function, since power functions blow +// up. At 1, we want a smooth blend between the functions. So, we use a +// piecewise function that does just that - see dwaLookups.cpp for +// a little more detail. +// +// Also, if we find that we have R, G, and B channels from the same layer, +// we can get a bit more compression efficiency by transforming to a Y'CbCr +// space. We use the 709 transform, but with Cb,Cr = 0 for an input of +// (0, 0, 0), instead of the traditional Cb,Cr = .5. Shifting the zero point +// makes no sense with large range data. Transforms are done to from +// the perceptual space data, not the linear-light space data (R'G'B' -> +// (Y'CbCr, not RGB -> YCbCr). +// +// Next, we forward DCT the data. This is done with a floating +// point DCT, as we don't really have control over the src range. The +// resulting values are dropped to half-float precision. +// +// Now, we need to quantize. Quantization departs from the usual way +// of dividing and rounding. Instead, we start with some floating +// point "base-error" value. From this, we can derive quantization +// error for each DCT component. Take the standard JPEG quantization +// tables and normalize them by the smallest value. Then, multiply +// the normalized quant tables by our base-error value. This gives +// a range of errors for each DCT component. +// +// For each DCT component, we want to find a quantized value that +// is within +- the per-component error. Pick the quantized value +// that has the fewest bits set in its' binary representation. +// Brute-forcing the search would make for extremly inefficient +// compression. Fortunatly, we can precompute a table to assist +// with this search. +// +// For each 16-bit float value, there are at most 15 other values with +// fewer bits set. We can precompute these values in a compact form, since +// many source values have far fewer that 15 possible quantized values. +// Now, instead of searching the entire range +- the component error, +// we can just search at most 15 quantization candidates. The search can +// be accelerated a bit more by sorting the candidates by the +// number of bits set, in increasing order. Then, the search can stop +// once a candidate is found w/i the per-component quantization +// error range. +// +// The quantization strategy has the side-benefit that there is no +// de-quantization step upon decode, so we don't bother recording +// the quantization table. +// +// Ok. So we now have quantized values. Time for entropy coding. We +// can use either static Huffman or zlib/DEFLATE. The static Huffman +// is more efficient at compacting data, but can have a greater +// overhead, especially for smaller tile/strip sizes. +// +// There is some additional fun, like ZIP compressing the DC components +// instead of Huffman/zlib, which helps make things slightly smaller. +// +// Compression level is controlled by setting an int/float/double attribute +// on the header named "dwaCompressionLevel". This is a thinly veiled name for +// the "base-error" value mentioned above. The "base-error" is just +// dwaCompressionLevel / 100000. The default value of 45.0 is generally +// pretty good at generating "visually lossless" values at reasonable +// data rates. Setting dwaCompressionLevel to 0 should result in no additional +// quantization at the quantization stage (though there may be +// quantization in practice at the CSC/DCT steps). But if you really +// want lossless compression, there are pleanty of other choices +// of compressors ;) +// +// When dealing with FLOAT source buffers, we first quantize the source +// to HALF and continue down as we would for HALF source. +// +//--------------------------------------------------- + + +#include "ImfDwaCompressor.h" +#include "ImfDwaCompressorSimd.h" + +#include "ImfChannelList.h" +#include "ImfStandardAttributes.h" +#include "ImfHeader.h" +#include "ImfHuf.h" +#include "ImfInt64.h" +#include "ImfIntAttribute.h" +#include "ImfIO.h" +#include "ImfMisc.h" +#include "ImfNamespace.h" +#include "ImfRle.h" +#include "ImfSimd.h" +#include "ImfSystemSpecific.h" +#include "ImfXdr.h" +#include "ImfZip.h" + +#include "ImathFun.h" +#include "ImathBox.h" +#include "ImathVec.h" +#include "half.h" + +#include "dwaLookups.h" + +#include +#include +#include +#include +#include + +// Windows specific addition to prevent the indirect import of the redefined min/max macros +#if defined _WIN32 || defined _WIN64 + #ifdef NOMINMAX + #undef NOMINMAX + #endif + #define NOMINMAX +#endif +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +namespace { + + // + // Function pointer to dispatch to an approprate + // convertFloatToHalf64_* impl, based on runtime cpu checking. + // Should be initialized in DwaCompressor::initializeFuncs() + // + + void (*convertFloatToHalf64)(unsigned short*, float*) = + convertFloatToHalf64_scalar; + + // + // Function pointer for dispatching a fromHalfZigZag_ impl + // + + void (*fromHalfZigZag)(unsigned short*, float*) = + fromHalfZigZag_scalar; + + // + // Dispatch the inverse DCT on an 8x8 block, where the last + // n rows can be all zeros. The n=0 case converts the full block. + // + void (*dctInverse8x8_0)(float*) = dctInverse8x8_scalar<0>; + void (*dctInverse8x8_1)(float*) = dctInverse8x8_scalar<1>; + void (*dctInverse8x8_2)(float*) = dctInverse8x8_scalar<2>; + void (*dctInverse8x8_3)(float*) = dctInverse8x8_scalar<3>; + void (*dctInverse8x8_4)(float*) = dctInverse8x8_scalar<4>; + void (*dctInverse8x8_5)(float*) = dctInverse8x8_scalar<5>; + void (*dctInverse8x8_6)(float*) = dctInverse8x8_scalar<6>; + void (*dctInverse8x8_7)(float*) = dctInverse8x8_scalar<7>; + +} // namespace + + +struct DwaCompressor::ChannelData +{ + std::string name; + CompressorScheme compression; + int xSampling; + int ySampling; + PixelType type; + bool pLinear; + + int width; + int height; + + // + // Incoming and outgoing data is scanline interleaved, and it's much + // easier to operate on contiguous data. Assuming the planare unc + // buffer is to hold RLE data, we need to rearrange to make bytes + // adjacent. + // + + char *planarUncBuffer; + char *planarUncBufferEnd; + + char *planarUncRle[4]; + char *planarUncRleEnd[4]; + + PixelType planarUncType; + int planarUncSize; +}; + + +struct DwaCompressor::CscChannelSet +{ + int idx[3]; +}; + + +struct DwaCompressor::Classifier +{ + Classifier (std::string suffix, + CompressorScheme scheme, + PixelType type, + int cscIdx, + bool caseInsensitive): + _suffix(suffix), + _scheme(scheme), + _type(type), + _cscIdx(cscIdx), + _caseInsensitive(caseInsensitive) + { + if (caseInsensitive) + transform(_suffix.begin(), _suffix.end(), _suffix.begin(), tolower); + } + + Classifier (const char *&ptr, int size) + { + if (size <= 0) + throw Iex::InputExc("Error uncompressing DWA data" + " (truncated rule)."); + + { + char suffix[Name::SIZE]; + memset (suffix, 0, Name::SIZE); + Xdr::read (ptr, std::min(size, Name::SIZE-1), suffix); + _suffix = std::string(suffix); + } + + if (size < _suffix.length() + 1 + 2*Xdr::size()) + throw Iex::InputExc("Error uncompressing DWA data" + " (truncated rule)."); + + char value; + Xdr::read (ptr, value); + + _cscIdx = (int)(value >> 4) - 1; + if (_cscIdx < -1 || _cscIdx >= 3) + throw Iex::InputExc("Error uncompressing DWA data" + " (corrupt cscIdx rule)."); + + _scheme = (CompressorScheme)((value >> 2) & 3); + if (_scheme < 0 || _scheme >= NUM_COMPRESSOR_SCHEMES) + throw Iex::InputExc("Error uncompressing DWA data" + " (corrupt scheme rule)."); + + _caseInsensitive = (value & 1 ? true : false); + + Xdr::read (ptr, value); + if (value < 0 || value >= NUM_PIXELTYPES) + throw Iex::InputExc("Error uncompressing DWA data" + " (corrupt rule)."); + _type = (PixelType)value; + } + + bool match (const std::string &suffix, const PixelType type) const + { + if (_type != type) return false; + + if (_caseInsensitive) + { + std::string tmp(suffix); + transform(tmp.begin(), tmp.end(), tmp.begin(), tolower); + return tmp == _suffix; + } + + return suffix == _suffix; + } + + size_t size () const + { + // string length + \0 + size_t sizeBytes = _suffix.length() + 1; + + // 1 byte for scheme / cscIdx / caseInsensitive, and 1 byte for type + sizeBytes += 2 * Xdr::size(); + + return sizeBytes; + } + + void write (char *&ptr) const + { + Xdr::write (ptr, _suffix.c_str()); + + // Encode _cscIdx (-1-3) in the upper 4 bits, + // _scheme (0-2) in the next 2 bits + // _caseInsen in the bottom bit + unsigned char value = 0; + value |= ((unsigned char)(_cscIdx+1) & 15) << 4; + value |= ((unsigned char)_scheme & 3) << 2; + value |= (unsigned char)_caseInsensitive & 1; + + Xdr::write (ptr, value); + Xdr::write (ptr, (unsigned char)_type); + } + + std::string _suffix; + CompressorScheme _scheme; + PixelType _type; + int _cscIdx; + bool _caseInsensitive; +}; + + +// +// Base class for the LOSSY_DCT decoder classes +// + +class DwaCompressor::LossyDctDecoderBase +{ + public: + + LossyDctDecoderBase + (char *packedAc, + char *packedDc, + const unsigned short *toLinear, + int width, + int height); + + virtual ~LossyDctDecoderBase (); + + void execute(); + + // + // These return number of items, not bytes. Each item + // is an unsigned short + // + + int numAcValuesEncoded() const { return _packedAcCount; } + int numDcValuesEncoded() const { return _packedDcCount; } + + protected: + + // + // Un-RLE the packed AC components into + // a half buffer. The half block should + // be the full 8x8 block (in zig-zag order + // still), not the first AC component. + // + // currAcComp is advanced as bytes are decoded. + // + // This returns the index of the last non-zero + // value in the buffer - with the index into zig zag + // order data. If we return 0, we have DC only data. + // + + int unRleAc (unsigned short *&currAcComp, + unsigned short *halfZigBlock); + + + // + // if NATIVE and XDR are really the same values, we can + // skip some processing and speed things along + // + + bool _isNativeXdr; + + + // + // Counts of how many items have been packed into the + // AC and DC buffers + // + + int _packedAcCount; + int _packedDcCount; + + + // + // AC and DC buffers to pack + // + + char *_packedAc; + char *_packedDc; + + + // + // half -> half LUT to transform from nonlinear to linear + // + + const unsigned short *_toLinear; + + + // + // image dimensions + // + + int _width; + int _height; + + + // + // Pointers to the start of each scanlines, to be filled on decode + // Generally, these will be filled by the subclasses. + // + + std::vector< std::vector > _rowPtrs; + + + // + // The type of each data that _rowPtrs[i] is referring. Layout + // is in the same order as _rowPtrs[]. + // + + std::vector _type; + std::vector _dctData; +}; + + +// +// Used to decode a single channel of LOSSY_DCT data. +// + +class DwaCompressor::LossyDctDecoder: public LossyDctDecoderBase +{ + public: + + // + // toLinear is a half-float LUT to convert the encoded values + // back to linear light. If you want to skip this step, pass + // in NULL here. + // + + LossyDctDecoder + (std::vector &rowPtrs, + char *packedAc, + char *packedDc, + const unsigned short *toLinear, + int width, + int height, + PixelType type) + : + LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height) + { + _rowPtrs.push_back(rowPtrs); + _type.push_back(type); + } + + virtual ~LossyDctDecoder () {} +}; + + +// +// Used to decode 3 channels of LOSSY_DCT data that +// are grouped together and color space converted. +// + +class DwaCompressor::LossyDctDecoderCsc: public LossyDctDecoderBase +{ + public: + + // + // toLinear is a half-float LUT to convert the encoded values + // back to linear light. If you want to skip this step, pass + // in NULL here. + // + + LossyDctDecoderCsc + (std::vector &rowPtrsR, + std::vector &rowPtrsG, + std::vector &rowPtrsB, + char *packedAc, + char *packedDc, + const unsigned short *toLinear, + int width, + int height, + PixelType typeR, + PixelType typeG, + PixelType typeB) + : + LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height) + { + _rowPtrs.push_back(rowPtrsR); + _rowPtrs.push_back(rowPtrsG); + _rowPtrs.push_back(rowPtrsB); + _type.push_back(typeR); + _type.push_back(typeG); + _type.push_back(typeB); + } + + virtual ~LossyDctDecoderCsc () {} +}; + + +// +// Base class for encoding using the lossy DCT scheme +// + +class DwaCompressor::LossyDctEncoderBase +{ + public: + + LossyDctEncoderBase + (float quantBaseError, + char *packedAc, + char *packedDc, + const unsigned short *toNonlinear, + int width, + int height); + + virtual ~LossyDctEncoderBase (); + + void execute (); + + // + // These return number of items, not bytes. Each item + // is an unsigned short + // + + int numAcValuesEncoded () const {return _numAcComp;} + int numDcValuesEncoded () const {return _numDcComp;} + + protected: + + void toZigZag (half *dst, half *src); + int countSetBits (unsigned short src); + half quantize (half src, float errorTolerance); + void rleAc (half *block, unsigned short *&acPtr); + + float _quantBaseError; + + int _width, + _height; + const unsigned short *_toNonlinear; + + int _numAcComp, + _numDcComp; + + std::vector< std::vector > _rowPtrs; + std::vector _type; + std::vector _dctData; + + + // + // Pointers to the buffers where AC and DC + // DCT components should be packed for + // lossless compression downstream + // + + char *_packedAc; + char *_packedDc; + + + // + // Our "quantization tables" - the example JPEG tables, + // normalized so that the smallest value in each is 1.0. + // This gives us a relationship between error in DCT + // components + // + + float _quantTableY[64]; + float _quantTableCbCr[64]; +}; + + + +// +// Single channel lossy DCT encoder +// + +class DwaCompressor::LossyDctEncoder: public LossyDctEncoderBase +{ + public: + + LossyDctEncoder + (float quantBaseError, + std::vector &rowPtrs, + char *packedAc, + char *packedDc, + const unsigned short *toNonlinear, + int width, + int height, + PixelType type) + : + LossyDctEncoderBase + (quantBaseError, packedAc, packedDc, toNonlinear, width, height) + { + _rowPtrs.push_back(rowPtrs); + _type.push_back(type); + } + + virtual ~LossyDctEncoder () {} +}; + + +// +// RGB channel lossy DCT encoder +// + +class DwaCompressor::LossyDctEncoderCsc: public LossyDctEncoderBase +{ + public: + + LossyDctEncoderCsc + (float quantBaseError, + std::vector &rowPtrsR, + std::vector &rowPtrsG, + std::vector &rowPtrsB, + char *packedAc, + char *packedDc, + const unsigned short *toNonlinear, + int width, + int height, + PixelType typeR, + PixelType typeG, + PixelType typeB) + : + LossyDctEncoderBase + (quantBaseError, packedAc, packedDc, toNonlinear, width, height) + { + _type.push_back(typeR); + _type.push_back(typeG); + _type.push_back(typeB); + + _rowPtrs.push_back(rowPtrsR); + _rowPtrs.push_back(rowPtrsG); + _rowPtrs.push_back(rowPtrsB); + } + + virtual ~LossyDctEncoderCsc () {} +}; + + +// ============================================================== +// +// LossyDctDecoderBase +// +// -------------------------------------------------------------- + +DwaCompressor::LossyDctDecoderBase::LossyDctDecoderBase + (char *packedAc, + char *packedDc, + const unsigned short *toLinear, + int width, + int height) +: + _isNativeXdr(false), + _packedAcCount(0), + _packedDcCount(0), + _packedAc(packedAc), + _packedDc(packedDc), + _toLinear(toLinear), + _width(width), + _height(height) +{ + if (_toLinear == 0) + _toLinear = dwaCompressorNoOp; + + _isNativeXdr = GLOBAL_SYSTEM_LITTLE_ENDIAN; +} + + +DwaCompressor::LossyDctDecoderBase::~LossyDctDecoderBase () {} + + +void +DwaCompressor::LossyDctDecoderBase::execute () +{ + int numComp = _rowPtrs.size(); + int lastNonZero = 0; + int numBlocksX = (int) ceil ((float)_width / 8.0f); + int numBlocksY = (int) ceil ((float)_height / 8.0f); + int leftoverX = _width - (numBlocksX-1) * 8; + int leftoverY = _height - (numBlocksY-1) * 8; + + int numFullBlocksX = (int)floor ((float)_width / 8.0f); + + unsigned short tmpShortNative = 0; + unsigned short tmpShortXdr = 0; + const char *tmpConstCharPtr = 0; + + unsigned short *currAcComp = (unsigned short *)_packedAc; + std::vector currDcComp (_rowPtrs.size()); + std::vector halfZigBlock (_rowPtrs.size()); + + if (_type.size() != _rowPtrs.size()) + throw Iex::BaseExc ("Row pointers and types mismatch in count"); + + if ((_rowPtrs.size() != 3) && (_rowPtrs.size() != 1)) + throw Iex::NoImplExc ("Only 1 and 3 channel encoding is supported"); + + _dctData.resize(numComp); + + // + // Allocate a temp aligned buffer to hold a rows worth of full + // 8x8 half-float blocks + // + + unsigned char *rowBlockHandle = new unsigned char + [numComp * numBlocksX * 64 * sizeof(unsigned short) + _SSE_ALIGNMENT]; + + unsigned short *rowBlock[3]; + + rowBlock[0] = (unsigned short*)rowBlockHandle; + + for (int i = 0; i < _SSE_ALIGNMENT; ++i) + { + if (((size_t)(rowBlockHandle + i) & _SSE_ALIGNMENT_MASK) == 0) + rowBlock[0] = (unsigned short *)(rowBlockHandle + i); + } + + for (int comp = 1; comp < numComp; ++comp) + rowBlock[comp] = rowBlock[comp - 1] + numBlocksX * 64; + + // + // Pack DC components together by common plane, so we can get + // a little more out of differencing them. We'll always have + // one component per block, so we can computed offsets. + // + + currDcComp[0] = (unsigned short *)_packedDc; + + for (unsigned int comp = 1; comp < numComp; ++comp) + currDcComp[comp] = currDcComp[comp - 1] + numBlocksX * numBlocksY; + + for (int blocky = 0; blocky < numBlocksY; ++blocky) + { + int maxY = 8; + + if (blocky == numBlocksY-1) + maxY = leftoverY; + + int maxX = 8; + + for (int blockx = 0; blockx < numBlocksX; ++blockx) + { + if (blockx == numBlocksX-1) + maxX = leftoverX; + + // + // If we can detect that the block is constant values + // (all components only have DC values, and all AC is 0), + // we can do everything only on 1 value, instead of all + // 64. + // + // This won't really help for regular images, but it is + // meant more for layers with large swaths of black + // + + bool blockIsConstant = true; + + for (unsigned int comp = 0; comp < numComp; ++comp) + { + + // + // DC component is stored separately + // + + #ifdef IMF_HAVE_SSE2 + { + __m128i *dst = (__m128i*)halfZigBlock[comp]._buffer; + + dst[7] = _mm_setzero_si128(); + dst[6] = _mm_setzero_si128(); + dst[5] = _mm_setzero_si128(); + dst[4] = _mm_setzero_si128(); + dst[3] = _mm_setzero_si128(); + dst[2] = _mm_setzero_si128(); + dst[1] = _mm_setzero_si128(); + dst[0] = _mm_insert_epi16 + (_mm_setzero_si128(), *currDcComp[comp]++, 0); + } + #else /* IMF_HAVE_SSE2 */ + + memset (halfZigBlock[comp]._buffer, 0, 64 * 2); + halfZigBlock[comp]._buffer[0] = *currDcComp[comp]++; + + #endif /* IMF_HAVE_SSE2 */ + + _packedDcCount++; + + // + // UnRLE the AC. This will modify currAcComp + // + + lastNonZero = unRleAc (currAcComp, halfZigBlock[comp]._buffer); + + // + // Convert from XDR to NATIVE + // + + if (!_isNativeXdr) + { + for (int i = 0; i < 64; ++i) + { + tmpShortXdr = halfZigBlock[comp]._buffer[i]; + tmpConstCharPtr = (const char *)&tmpShortXdr; + + Xdr::read (tmpConstCharPtr, tmpShortNative); + + halfZigBlock[comp]._buffer[i] = tmpShortNative; + } + } + + if (lastNonZero == 0) + { + // + // DC only case - AC components are all 0 + // + + half h; + + h.setBits (halfZigBlock[comp]._buffer[0]); + _dctData[comp]._buffer[0] = (float)h; + + dctInverse8x8DcOnly (_dctData[comp]._buffer); + } + else + { + // + // We have some AC components that are non-zero. + // Can't use the 'constant block' optimization + // + + blockIsConstant = false; + + // + // Un-Zig zag + // + + (*fromHalfZigZag) + (halfZigBlock[comp]._buffer, _dctData[comp]._buffer); + + // + // Zig-Zag indices in normal layout are as follows: + // + // 0 1 3 6 10 15 21 28 + // 2 4 7 11 16 22 29 36 + // 5 8 12 17 23 30 37 43 + // 9 13 18 24 31 38 44 49 + // 14 19 25 32 39 45 50 54 + // 20 26 33 40 46 51 55 58 + // 27 34 41 47 52 56 59 61 + // 35 42 48 53 57 60 62 63 + // + // If lastNonZero is less than the first item on + // each row, we know that the whole row is zero and + // can be skipped in the row-oriented part of the + // iDCT. + // + // The unrolled logic here is: + // + // if lastNonZero < rowStartIdx[i], + // zeroedRows = rowsEmpty[i] + // + // where: + // + // const int rowStartIdx[] = {2, 5, 9, 14, 20, 27, 35}; + // const int rowsEmpty[] = {7, 6, 5, 4, 3, 2, 1}; + // + + if (lastNonZero < 2) + dctInverse8x8_7(_dctData[comp]._buffer); + else if (lastNonZero < 5) + dctInverse8x8_6(_dctData[comp]._buffer); + else if (lastNonZero < 9) + dctInverse8x8_5(_dctData[comp]._buffer); + else if (lastNonZero < 14) + dctInverse8x8_4(_dctData[comp]._buffer); + else if (lastNonZero < 20) + dctInverse8x8_3(_dctData[comp]._buffer); + else if (lastNonZero < 27) + dctInverse8x8_2(_dctData[comp]._buffer); + else if (lastNonZero < 35) + dctInverse8x8_1(_dctData[comp]._buffer); + else + dctInverse8x8_0(_dctData[comp]._buffer); + } + } + + // + // Perform the CSC + // + + if (numComp == 3) + { + if (!blockIsConstant) + { + csc709Inverse64 (_dctData[0]._buffer, + _dctData[1]._buffer, + _dctData[2]._buffer); + + } + else + { + csc709Inverse (_dctData[0]._buffer[0], + _dctData[1]._buffer[0], + _dctData[2]._buffer[0]); + } + } + + // + // Float -> Half conversion. + // + // If the block has a constant value, just convert the first pixel. + // + + for (unsigned int comp = 0; comp < numComp; ++comp) + { + if (!blockIsConstant) + { + (*convertFloatToHalf64) + (&rowBlock[comp][blockx*64], _dctData[comp]._buffer); + } + else + { + #if IMF_HAVE_SSE2 + + __m128i *dst = (__m128i*)&rowBlock[comp][blockx*64]; + + dst[0] = _mm_set1_epi16 + (((half)_dctData[comp]._buffer[0]).bits()); + + dst[1] = dst[0]; + dst[2] = dst[0]; + dst[3] = dst[0]; + dst[4] = dst[0]; + dst[5] = dst[0]; + dst[6] = dst[0]; + dst[7] = dst[0]; + + #else /* IMF_HAVE_SSE2 */ + + unsigned short *dst = &rowBlock[comp][blockx*64]; + + dst[0] = ((half)_dctData[comp]._buffer[0]).bits(); + + for (int i = 1; i < 64; ++i) + { + dst[i] = dst[0]; + } + + #endif /* IMF_HAVE_SSE2 */ + } // blockIsConstant + } // comp + } // blockx + + // + // At this point, we have half-float nonlinear value blocked + // in rowBlock[][]. We need to unblock the data, transfer + // back to linear, and write the results in the _rowPtrs[]. + // + // There is a fast-path for aligned rows, which helps + // things a little. Since this fast path is only valid + // for full 8-element wide blocks, the partial x blocks + // are broken into a separate loop below. + // + // At the moment, the fast path requires: + // * sse support + // * aligned row pointers + // * full 8-element wide blocks + // + + for (int comp = 0; comp < numComp; ++comp) + { + // + // Test if we can use the fast path + // + + #ifdef IMF_HAVE_SSE2 + + bool fastPath = true; + + for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) + { + if ((size_t)_rowPtrs[comp][y] & _SSE_ALIGNMENT_MASK) + fastPath = false; + } + + if (fastPath) + { + // + // Handle all the full X blocks, in a fast path with sse2 and + // aligned row pointers + // + + for (int y=8*blocky; y<8*blocky+maxY; ++y) + { + __m128i *dst = (__m128i *)_rowPtrs[comp][y]; + __m128i *src = (__m128i *)&rowBlock[comp][(y & 0x7) * 8]; + + + for (int blockx = 0; blockx < numFullBlocksX; ++blockx) + { + // + // These may need some twiddling. + // Run with multiples of 8 + // + + _mm_prefetch ((char *)(src + 16), _MM_HINT_NTA); + + unsigned short i0 = _mm_extract_epi16 (*src, 0); + unsigned short i1 = _mm_extract_epi16 (*src, 1); + unsigned short i2 = _mm_extract_epi16 (*src, 2); + unsigned short i3 = _mm_extract_epi16 (*src, 3); + + unsigned short i4 = _mm_extract_epi16 (*src, 4); + unsigned short i5 = _mm_extract_epi16 (*src, 5); + unsigned short i6 = _mm_extract_epi16 (*src, 6); + unsigned short i7 = _mm_extract_epi16 (*src, 7); + + i0 = _toLinear[i0]; + i1 = _toLinear[i1]; + i2 = _toLinear[i2]; + i3 = _toLinear[i3]; + + i4 = _toLinear[i4]; + i5 = _toLinear[i5]; + i6 = _toLinear[i6]; + i7 = _toLinear[i7]; + + *dst = _mm_insert_epi16 (_mm_setzero_si128(), i0, 0); + *dst = _mm_insert_epi16 (*dst, i1, 1); + *dst = _mm_insert_epi16 (*dst, i2, 2); + *dst = _mm_insert_epi16 (*dst, i3, 3); + + *dst = _mm_insert_epi16 (*dst, i4, 4); + *dst = _mm_insert_epi16 (*dst, i5, 5); + *dst = _mm_insert_epi16 (*dst, i6, 6); + *dst = _mm_insert_epi16 (*dst, i7, 7); + + src += 8; + dst++; + } + } + } + else + { + + #endif /* IMF_HAVE_SSE2 */ + + // + // Basic scalar kinda slow path for handling the full X blocks + // + + for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) + { + unsigned short *dst = (unsigned short *)_rowPtrs[comp][y]; + + for (int blockx = 0; blockx < numFullBlocksX; ++blockx) + { + unsigned short *src = + &rowBlock[comp][blockx * 64 + ((y & 0x7) * 8)]; + + dst[0] = _toLinear[src[0]]; + dst[1] = _toLinear[src[1]]; + dst[2] = _toLinear[src[2]]; + dst[3] = _toLinear[src[3]]; + + dst[4] = _toLinear[src[4]]; + dst[5] = _toLinear[src[5]]; + dst[6] = _toLinear[src[6]]; + dst[7] = _toLinear[src[7]]; + + dst += 8; + } + } + + #ifdef IMF_HAVE_SSE2 + + } + + #endif /* IMF_HAVE_SSE2 */ + + // + // If we have partial X blocks, deal with all those now + // Since this should be minimal work, there currently + // is only one path that should work for everyone. + // + + if (numFullBlocksX != numBlocksX) + { + for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y) + { + unsigned short *src = (unsigned short *) + &rowBlock[comp][numFullBlocksX * 64 + ((y & 0x7) * 8)]; + + unsigned short *dst = (unsigned short *)_rowPtrs[comp][y]; + + dst += 8 * numFullBlocksX; + + for (int x = 0; x < maxX; ++x) + { + *dst++ = _toLinear[*src++]; + } + } + } + } // comp + } // blocky + + // + // Walk over all the channels that are of type FLOAT. + // Convert from HALF XDR back to FLOAT XDR. + // + + for (unsigned int chan = 0; chan < numComp; ++chan) + { + + if (_type[chan] != FLOAT) + continue; + + std::vector halfXdr (_width); + + for (int y=0; y<_height; ++y) + { + char *floatXdrPtr = _rowPtrs[chan][y]; + + memcpy(&halfXdr[0], floatXdrPtr, _width*sizeof(unsigned short)); + + const char *halfXdrPtr = (const char *)(&halfXdr[0]); + + for (int x=0; x<_width; ++x) + { + half tmpHalf; + + Xdr::read (halfXdrPtr, tmpHalf); + Xdr::write (floatXdrPtr, (float)tmpHalf); + + // + // Xdr::write and Xdr::read will advance the ptrs + // + } + } + } + + delete[] rowBlockHandle; +} + + +// +// Un-RLE the packed AC components into +// a half buffer. The half block should +// be the full 8x8 block (in zig-zag order +// still), not the first AC component. +// +// currAcComp is advanced as bytes are decoded. +// +// This returns the index of the last non-zero +// value in the buffer - with the index into zig zag +// order data. If we return 0, we have DC only data. +// +// This is assuminging that halfZigBlock is zero'ed +// prior to calling +// + +int +DwaCompressor::LossyDctDecoderBase::unRleAc + (unsigned short *&currAcComp, + unsigned short *halfZigBlock) +{ + // + // Un-RLE the RLE'd blocks. If we find an item whose + // high byte is 0xff, then insert the number of 0's + // as indicated by the low byte. + // + // Otherwise, just copy the number verbaitm. + // + + int lastNonZero = 0; + int dctComp = 1; + + // + // Start with a zero'ed block, so we don't have to + // write when we hit a run symbol + // + + while (dctComp < 64) + { + if (*currAcComp == 0xff00) + { + // + // End of block + // + + dctComp = 64; + + } + else if ((*currAcComp) >> 8 == 0xff) + { + // + // Run detected! Insert 0's. + // + // Since the block has been zeroed, just advance the ptr + // + + dctComp += (*currAcComp) & 0xff; + } + else + { + // + // Not a run, just copy over the value + // + + lastNonZero = dctComp; + halfZigBlock[dctComp] = *currAcComp; + + dctComp++; + } + + _packedAcCount++; + currAcComp++; + } + + return lastNonZero; +} + + +// ============================================================== +// +// LossyDctEncoderBase +// +// -------------------------------------------------------------- + +DwaCompressor::LossyDctEncoderBase::LossyDctEncoderBase + (float quantBaseError, + char *packedAc, + char *packedDc, + const unsigned short *toNonlinear, + int width, + int height) +: + _quantBaseError(quantBaseError), + _width(width), + _height(height), + _toNonlinear(toNonlinear), + _numAcComp(0), + _numDcComp(0), + _packedAc(packedAc), + _packedDc(packedDc) +{ + // + // Here, we take the generic JPEG quantization tables and + // normalize them by the smallest component in each table. + // This gives us a relationship amongst the DCT components, + // in terms of how sensitive each component is to + // error. + // + // A higher normalized value means we can quantize more, + // and a small normalized value means we can quantize less. + // + // Eventually, we will want an acceptable quantization + // error range for each component. We find this by + // multiplying some user-specified level (_quantBaseError) + // by the normalized table (_quantTableY, _quantTableCbCr) to + // find the acceptable quantization error range. + // + // The quantization table is not needed for decoding, and + // is not transmitted. So, if you want to get really fancy, + // you could derive some content-dependent quantization + // table, and the decoder would not need to be changed. But, + // for now, we'll just use statice quantization tables. + // + + int jpegQuantTableY[] = + { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 + }; + + int jpegQuantTableYMin = 10; + + int jpegQuantTableCbCr[] = + { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + }; + + int jpegQuantTableCbCrMin = 17; + + for (int idx = 0; idx < 64; ++idx) + { + _quantTableY[idx] = static_cast (jpegQuantTableY[idx]) / + static_cast (jpegQuantTableYMin); + + _quantTableCbCr[idx] = static_cast (jpegQuantTableCbCr[idx]) / + static_cast (jpegQuantTableCbCrMin); + } + + if (_quantBaseError < 0) + quantBaseError = 0; +} + + +DwaCompressor::LossyDctEncoderBase::~LossyDctEncoderBase () +{ +} + + +// +// Given three channels of source data, encoding by first applying +// a color space conversion to a YCbCr space. Otherwise, if we only +// have one channel, just encode it as is. +// +// Other numbers of channels are somewhat unexpected at this point, +// and will throw an exception. +// + +void +DwaCompressor::LossyDctEncoderBase::execute () +{ + int numBlocksX = (int)ceil ((float)_width / 8.0f); + int numBlocksY = (int)ceil ((float)_height/ 8.0f); + + half halfZigCoef[64]; + half halfCoef[64]; + + std::vector currDcComp (_rowPtrs.size()); + unsigned short *currAcComp = (unsigned short *)_packedAc; + + _dctData.resize (_rowPtrs.size()); + _numAcComp = 0; + _numDcComp = 0; + + assert (_type.size() == _rowPtrs.size()); + assert ((_rowPtrs.size() == 3) || (_rowPtrs.size() == 1)); + + // + // Allocate a temp half buffer to quantize into for + // any FLOAT source channels. + // + + int tmpHalfBufferElements = 0; + + for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) + if (_type[chan] == FLOAT) + tmpHalfBufferElements += _width * _height; + + std::vector tmpHalfBuffer (tmpHalfBufferElements); + + char *tmpHalfBufferPtr = 0; + + if (tmpHalfBufferElements) + tmpHalfBufferPtr = (char *)&tmpHalfBuffer[0]; + + // + // Run over all the float scanlines, quantizing, + // and re-assigning _rowPtr[y]. We need to translate + // FLOAT XDR to HALF XDR. + // + + for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) + { + if (_type[chan] != FLOAT) + continue; + + for (int y = 0; y < _height; ++y) + { + float src = 0; + const char *srcXdr = _rowPtrs[chan][y]; + char *dstXdr = tmpHalfBufferPtr; + + for (int x = 0; x < _width; ++x) + { + + Xdr::read (srcXdr, src); + Xdr::write (dstXdr, ((half)src).bits()); + + // + // Xdr::read and Xdr::write will advance the ptr + // + } + + _rowPtrs[chan][y] = (const char *)tmpHalfBufferPtr; + tmpHalfBufferPtr += _width * sizeof (unsigned short); + } + } + + // + // Pack DC components together by common plane, so we can get + // a little more out of differencing them. We'll always have + // one component per block, so we can computed offsets. + // + + currDcComp[0] = (unsigned short *)_packedDc; + + for (unsigned int chan = 1; chan < _rowPtrs.size(); ++chan) + currDcComp[chan] = currDcComp[chan-1] + numBlocksX * numBlocksY; + + for (int blocky = 0; blocky < numBlocksY; ++blocky) + { + for (int blockx = 0; blockx < numBlocksX; ++blockx) + { + half h; + unsigned short tmpShortXdr, tmpShortNative; + char *tmpCharPtr; + + for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) + { + // + // Break the source into 8x8 blocks. If we don't + // fit at the edges, mirror. + // + // Also, convert from linear to nonlinear representation. + // Our source is assumed to be XDR, and we need to convert + // to NATIVE prior to converting to float. + // + // If we're converting linear -> nonlinear, assume that the + // XDR -> NATIVE conversion is built into the lookup. Otherwise, + // we'll need to explicitly do it. + // + + for (int y = 0; y < 8; ++y) + { + for (int x = 0; x < 8; ++x) + { + int vx = 8 * blockx + x; + int vy = 8 * blocky + y; + + if (vx >= _width) + vx = _width - (vx - (_width - 1)); + + if (vx < 0) vx = _width-1; + + if (vy >=_height) + vy = _height - (vy - (_height - 1)); + + if (vy < 0) vy = _height-1; + + tmpShortXdr = + ((const unsigned short *)(_rowPtrs[chan])[vy])[vx]; + + if (_toNonlinear) + { + h.setBits (_toNonlinear[tmpShortXdr]); + } + else + { + const char *tmpConstCharPtr = + (const char *)(&tmpShortXdr); + + Xdr::read + (tmpConstCharPtr, tmpShortNative); + + h.setBits(tmpShortNative); + } + + _dctData[chan]._buffer[y * 8 + x] = (float)h; + } // x + } // y + } // chan + + // + // Color space conversion + // + + if (_rowPtrs.size() == 3) + { + csc709Forward64 (_dctData[0]._buffer, + _dctData[1]._buffer, + _dctData[2]._buffer); + } + + for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan) + { + // + // Forward DCT + // + + dctForward8x8(_dctData[chan]._buffer); + + // + // Quantize to half, and zigzag + // + + if (chan == 0) + { + for (int i = 0; i < 64; ++i) + { + halfCoef[i] = + quantize ((half)_dctData[chan]._buffer[i], + _quantBaseError*_quantTableY[i]); + } + } + else + { + for (int i = 0; i < 64; ++i) + { + halfCoef[i] = + quantize ((half)_dctData[chan]._buffer[i], + _quantBaseError*_quantTableCbCr[i]); + } + } + + toZigZag (halfZigCoef, halfCoef); + + // + // Convert from NATIVE back to XDR, before we write out + // + + for (int i = 0; i < 64; ++i) + { + tmpCharPtr = (char *)&tmpShortXdr; + Xdr::write(tmpCharPtr, halfZigCoef[i].bits()); + halfZigCoef[i].setBits(tmpShortXdr); + } + + // + // Save the DC component separately, to be compressed on + // its own. + // + + *currDcComp[chan]++ = halfZigCoef[0].bits(); + _numDcComp++; + + // + // Then RLE the AC components (which will record the count + // of the resulting number of items) + // + + rleAc (halfZigCoef, currAcComp); + } // chan + } // blockx + } // blocky +} + + +// +// Reorder from zig-zag order to normal ordering +// + +void +DwaCompressor::LossyDctEncoderBase::toZigZag (half *dst, half *src) +{ + const int remap[] = + { + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 + }; + + for (int i=0; i<64; ++i) + dst[i] = src[remap[i]]; +} + + +// +// Precomputing the bit count runs faster than using +// the builtin instruction, at least in one case.. +// +// Precomputing 8-bits is no slower than 16-bits, +// and saves a fair bit of overhead.. +// + +int +DwaCompressor::LossyDctEncoderBase::countSetBits (unsigned short src) +{ + static const unsigned short numBitsSet[256] = + { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + + return numBitsSet[src & 0xff] + numBitsSet[src >> 8]; +} + + +// +// Take a DCT coefficient, as well as an acceptable error. Search +// nearby values within the error tolerance, that have fewer +// bits set. +// +// The list of candidates has been pre-computed and sorted +// in order of increasing numbers of bits set. This way, we +// can stop searching as soon as we find a candidate that +// is within the error tolerance. +// + +half +DwaCompressor::LossyDctEncoderBase::quantize (half src, float errorTolerance) +{ + half tmp; + float srcFloat = (float)src; + int numSetBits = countSetBits(src.bits()); + const unsigned short *closest = closestData + closestDataOffset[src.bits()]; + + for (int targetNumSetBits = numSetBits - 1; + targetNumSetBits >= 0; + --targetNumSetBits) + { + tmp.setBits (*closest); + + if (fabs ((float)tmp - srcFloat) < errorTolerance) + return tmp; + + closest++; + } + + return src; +} + + +// +// RLE the zig-zag of the AC components + copy over +// into another tmp buffer +// +// Try to do a simple RLE scheme to reduce run's of 0's. This +// differs from the jpeg EOB case, since EOB just indicates that +// the rest of the block is zero. In our case, we have lots of +// NaN symbols, which shouldn't be allowed to occur in DCT +// coefficents - so we'll use them for encoding runs. +// +// If the high byte is 0xff, then we have a run of 0's, of length +// given by the low byte. For example, 0xff03 would be a run +// of 3 0's, starting at the current location. +// +// block is our block of 64 coefficients +// acPtr a pointer to back the RLE'd values into. +// +// This will advance the counter, _numAcComp. +// + +void +DwaCompressor::LossyDctEncoderBase::rleAc + (half *block, + unsigned short *&acPtr) +{ + int dctComp = 1; + unsigned short rleSymbol = 0x0; + + while (dctComp < 64) + { + int runLen = 1; + + // + // If we don't have a 0, output verbatim + // + + if (block[dctComp].bits() != rleSymbol) + { + *acPtr++ = block[dctComp].bits(); + _numAcComp++; + + dctComp += runLen; + continue; + } + + // + // We're sitting on a 0, so see how big the run is. + // + + while ((dctComp+runLen < 64) && + (block[dctComp+runLen].bits() == rleSymbol)) + { + runLen++; + } + + // + // If the run len is too small, just output verbatim + // otherwise output our run token + // + // Originally, we wouldn't have a separate symbol for + // "end of block". But in some experimentation, it looks + // like using 0xff00 for "end of block" can save a bit + // of space. + // + + if (runLen == 1) + { + runLen = 1; + *acPtr++ = block[dctComp].bits(); + _numAcComp++; + + // + // Using 0xff00 for "end of block" + // + } + else if (runLen + dctComp == 64) + { + // + // Signal EOB + // + + *acPtr++ = 0xff00; + _numAcComp++; + } + else + { + // + // Signal normal run + // + + *acPtr++ = 0xff00 | runLen; + _numAcComp++; + } + + // + // Advance by runLen + // + + dctComp += runLen; + } +} + + +// ============================================================== +// +// DwaCompressor +// +// -------------------------------------------------------------- + +// +// DwaCompressor() +// + +DwaCompressor::DwaCompressor + (const Header &hdr, + int maxScanLineSize, + int numScanLines, + AcCompression acCompression) +: + Compressor(hdr), + _acCompression(acCompression), + _maxScanLineSize(maxScanLineSize), + _numScanLines(numScanLines), + _channels(hdr.channels()), + _packedAcBuffer(0), + _packedAcBufferSize(0), + _packedDcBuffer(0), + _packedDcBufferSize(0), + _rleBuffer(0), + _rleBufferSize(0), + _outBuffer(0), + _outBufferSize(0), + _zip(0), + _dwaCompressionLevel(45.0) +{ + _min[0] = hdr.dataWindow().min.x; + _min[1] = hdr.dataWindow().min.y; + _max[0] = hdr.dataWindow().max.x; + _max[1] = hdr.dataWindow().max.y; + + for (int i=0; i < NUM_COMPRESSOR_SCHEMES; ++i) + { + _planarUncBuffer[i] = 0; + _planarUncBufferSize[i] = 0; + } + + // + // Check the header for a quality attribute + // + + if (hasDwaCompressionLevel (hdr)) + _dwaCompressionLevel = dwaCompressionLevel (hdr); +} + + +DwaCompressor::~DwaCompressor() +{ + delete[] _packedAcBuffer; + delete[] _packedDcBuffer; + delete[] _rleBuffer; + delete[] _outBuffer; + delete _zip; + + for (int i=0; i channelRules; + if (fileVersion >= 2) + { + relevantChannelRules(channelRules); + + channelRuleSize = Xdr::size(); + for (size_t i = 0; i < channelRules.size(); ++i) + channelRuleSize += channelRules[i].size(); + } + + // + // Remember to allocate _outBuffer, if we haven't done so already. + // + + outBufferSize += channelRuleSize; + if (outBufferSize > _outBufferSize) + { + _outBufferSize = outBufferSize; + if (_outBuffer == 0) + delete[] _outBuffer; + _outBuffer = new char[outBufferSize]; + } + + char *outDataPtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(Imf::Int64) + + channelRuleSize]; + + // + // We might not be dealing with any color data, in which + // case the AC buffer size will be 0, and deferencing + // a vector will not be a good thing to do. + // + + if (_packedAcBuffer) + packedAcEnd = _packedAcBuffer; + + if (_packedDcBuffer) + packedDcEnd = _packedDcBuffer; + + #define OBIDX(x) (Int64 *)&_outBuffer[x * sizeof (Int64)] + + Int64 *version = OBIDX (VERSION); + Int64 *unknownUncompressedSize = OBIDX (UNKNOWN_UNCOMPRESSED_SIZE); + Int64 *unknownCompressedSize = OBIDX (UNKNOWN_COMPRESSED_SIZE); + Int64 *acCompressedSize = OBIDX (AC_COMPRESSED_SIZE); + Int64 *dcCompressedSize = OBIDX (DC_COMPRESSED_SIZE); + Int64 *rleCompressedSize = OBIDX (RLE_COMPRESSED_SIZE); + Int64 *rleUncompressedSize = OBIDX (RLE_UNCOMPRESSED_SIZE); + Int64 *rleRawSize = OBIDX (RLE_RAW_SIZE); + + Int64 *totalAcUncompressedCount = OBIDX (AC_UNCOMPRESSED_COUNT); + Int64 *totalDcUncompressedCount = OBIDX (DC_UNCOMPRESSED_COUNT); + + Int64 *acCompression = OBIDX (AC_COMPRESSION); + + int minX = range.min.x; + int maxX = std::min(range.max.x, _max[0]); + int minY = range.min.y; + int maxY = std::min(range.max.y, _max[1]); + + // + // Zero all the numbers in the chunk header + // + + memset (_outBuffer, 0, NUM_SIZES_SINGLE * sizeof (Int64)); + + // + // Setup the AC compression strategy and the version in the data block, + // then write the relevant channel classification rules if needed + // + *version = fileVersion; + *acCompression = _acCompression; + + setupChannelData (minX, minY, maxX, maxY); + + if (fileVersion >= 2) + { + char *writePtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(Imf::Int64)]; + Xdr::write (writePtr, channelRuleSize); + + for (size_t i = 0; i < channelRules.size(); ++i) + channelRules[i].write(writePtr); + } + + // + // Determine the start of each row in the input buffer + // Channels are interleaved by scanline + // + + std::vector encodedChannels (_channelData.size()); + std::vector< std::vector > rowPtrs (_channelData.size()); + + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + encodedChannels[chan] = false; + + inDataPtr = inPtr; + + for (int y = minY; y <= maxY; ++y) + { + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + { + + ChannelData *cd = &_channelData[chan]; + + if (Imath::modp(y, cd->ySampling) != 0) + continue; + + rowPtrs[chan].push_back(inDataPtr); + inDataPtr += cd->width * Imf::pixelTypeSize(cd->type); + } + } + + inDataPtr = inPtr; + + // + // Make a pass over all our CSC sets and try to encode them first + // + + for (unsigned int csc = 0; csc < _cscSets.size(); ++csc) + { + + LossyDctEncoderCsc encoder + (_dwaCompressionLevel / 100000.f, + rowPtrs[_cscSets[csc].idx[0]], + rowPtrs[_cscSets[csc].idx[1]], + rowPtrs[_cscSets[csc].idx[2]], + packedAcEnd, + packedDcEnd, + dwaCompressorToNonlinear, + _channelData[_cscSets[csc].idx[0]].width, + _channelData[_cscSets[csc].idx[0]].height, + _channelData[_cscSets[csc].idx[0]].type, + _channelData[_cscSets[csc].idx[1]].type, + _channelData[_cscSets[csc].idx[2]].type); + + encoder.execute(); + + *totalAcUncompressedCount += encoder.numAcValuesEncoded(); + *totalDcUncompressedCount += encoder.numDcValuesEncoded(); + + packedAcEnd += encoder.numAcValuesEncoded() * sizeof(unsigned short); + packedDcEnd += encoder.numDcValuesEncoded() * sizeof(unsigned short); + + encodedChannels[_cscSets[csc].idx[0]] = true; + encodedChannels[_cscSets[csc].idx[1]] = true; + encodedChannels[_cscSets[csc].idx[2]] = true; + } + + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + { + ChannelData *cd = &_channelData[chan]; + + if (encodedChannels[chan]) + continue; + + switch (cd->compression) + { + case LOSSY_DCT: + + // + // For LOSSY_DCT, treat this just like the CSC'd case, + // but only operate on one channel + // + + { + const unsigned short *nonlinearLut = 0; + + if (!cd->pLinear) + nonlinearLut = dwaCompressorToNonlinear; + + LossyDctEncoder encoder + (_dwaCompressionLevel / 100000.f, + rowPtrs[chan], + packedAcEnd, + packedDcEnd, + nonlinearLut, + cd->width, + cd->height, + cd->type); + + encoder.execute(); + + *totalAcUncompressedCount += encoder.numAcValuesEncoded(); + *totalDcUncompressedCount += encoder.numDcValuesEncoded(); + + packedAcEnd += + encoder.numAcValuesEncoded() * sizeof (unsigned short); + + packedDcEnd += + encoder.numDcValuesEncoded() * sizeof (unsigned short); + } + + break; + + case RLE: + + // + // For RLE, bash the bytes up so that the first bytes of each + // pixel are contingous, as are the second bytes, and so on. + // + + for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y) + { + const char *row = rowPtrs[chan][y]; + + for (int x = 0; x < cd->width; ++x) + { + for (int byte = 0; + byte < Imf::pixelTypeSize (cd->type); + ++byte) + { + + *cd->planarUncRleEnd[byte]++ = *row++; + } + } + + *rleRawSize += cd->width * Imf::pixelTypeSize(cd->type); + } + + break; + + case UNKNOWN: + + // + // Otherwise, just copy data over verbatim + // + + { + int scanlineSize = cd->width * Imf::pixelTypeSize(cd->type); + + for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y) + { + memcpy (cd->planarUncBufferEnd, + rowPtrs[chan][y], + scanlineSize); + + cd->planarUncBufferEnd += scanlineSize; + } + + *unknownUncompressedSize += cd->planarUncSize; + } + + break; + + default: + + assert (false); + } + + encodedChannels[chan] = true; + } + + // + // Pack the Unknown data into the output buffer first. Instead of + // just copying it uncompressed, try zlib compression at least. + // + + if (*unknownUncompressedSize > 0) + { + uLongf inSize = (uLongf)(*unknownUncompressedSize); + uLongf outSize = (uLongf)(ceil ((float)inSize * 1.01f) + 100); + + if (Z_OK != ::compress2 ((Bytef *)outDataPtr, + &outSize, + (const Bytef *)_planarUncBuffer[UNKNOWN], + inSize, + 9)) + { + throw Iex::BaseExc ("Data compression (zlib) failed."); + } + + outDataPtr += outSize; + *unknownCompressedSize = outSize; + } + + // + // Now, pack all the Lossy DCT coefficients into our output + // buffer, with Huffman encoding. + // + // Also, record the compressed size and the number of + // uncompressed componentns we have. + // + + if (*totalAcUncompressedCount > 0) + { + switch (_acCompression) + { + case STATIC_HUFFMAN: + + *acCompressedSize = (int) + hufCompress((unsigned short *)_packedAcBuffer, + (int)*totalAcUncompressedCount, + outDataPtr); + break; + + case DEFLATE: + + { + uLongf destLen = (uLongf) + (2 * (*totalAcUncompressedCount) * sizeof (unsigned short)); + + if (Z_OK != ::compress2 + ((Bytef *)outDataPtr, + &destLen, + (Bytef *)_packedAcBuffer, + (uLong)(*totalAcUncompressedCount + * sizeof (unsigned short)), + 9)) + { + throw Iex::InputExc ("Data compression (zlib) failed."); + } + + *acCompressedSize = destLen; + } + + break; + + default: + + assert (false); + } + + outDataPtr += *acCompressedSize; + } + + // + // Handle the DC components separately + // + + if (*totalDcUncompressedCount > 0) + { + *dcCompressedSize = _zip->compress + (_packedDcBuffer, + (int)(*totalDcUncompressedCount) * sizeof (unsigned short), + outDataPtr); + + outDataPtr += *dcCompressedSize; + } + + // + // If we have RLE data, first RLE encode it and set the uncompressed + // size. Then, deflate the results and set the compressed size. + // + + if (*rleRawSize > 0) + { + *rleUncompressedSize = rleCompress + ((int)(*rleRawSize), + _planarUncBuffer[RLE], + (signed char *)_rleBuffer); + + uLongf dstLen = + (uLongf)ceil (1.01f * (float) * rleUncompressedSize) + 24; + + if (Z_OK != ::compress2 + ((Bytef *)outDataPtr, + &dstLen, + (Bytef *)_rleBuffer, + (uLong)(*rleUncompressedSize), + 9)) + { + throw Iex::BaseExc ("Error compressing RLE'd data."); + } + + *rleCompressedSize = dstLen; + outDataPtr += *rleCompressedSize; + } + + // + // Flip the counters to XDR format + // + + for (int i = 0; i < NUM_SIZES_SINGLE; ++i) + { + Int64 src = *(((Int64 *)_outBuffer) + i); + char *dst = (char *)(((Int64 *)_outBuffer) + i); + + Xdr::write (dst, src); + } + + // + // We're done - compute the number of bytes we packed + // + + outPtr = _outBuffer; + + return static_cast(outDataPtr - _outBuffer + 1); +} + + +int +DwaCompressor::uncompress + (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Imath::Box2i (Imath::V2i (_min[0], minY), + Imath::V2i (_max[0], minY + numScanLines() - 1)), + outPtr); +} + + +int +DwaCompressor::uncompressTile + (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +DwaCompressor::uncompress + (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + int minX = range.min.x; + int maxX = std::min (range.max.x, _max[0]); + int minY = range.min.y; + int maxY = std::min (range.max.y, _max[1]); + + int headerSize = NUM_SIZES_SINGLE*sizeof(Int64); + if (inSize < headerSize) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(truncated header)."); + } + + // + // Flip the counters from XDR to NATIVE + // + + for (int i = 0; i < NUM_SIZES_SINGLE; ++i) + { + Int64 *dst = (((Int64 *)inPtr) + i); + const char *src = (char *)(((Int64 *)inPtr) + i); + + Xdr::read (src, *dst); + } + + // + // Unwind all the counter info + // + + const Int64 *inPtr64 = (const Int64*) inPtr; + + Int64 version = *(inPtr64 + VERSION); + Int64 unknownUncompressedSize = *(inPtr64 + UNKNOWN_UNCOMPRESSED_SIZE); + Int64 unknownCompressedSize = *(inPtr64 + UNKNOWN_COMPRESSED_SIZE); + Int64 acCompressedSize = *(inPtr64 + AC_COMPRESSED_SIZE); + Int64 dcCompressedSize = *(inPtr64 + DC_COMPRESSED_SIZE); + Int64 rleCompressedSize = *(inPtr64 + RLE_COMPRESSED_SIZE); + Int64 rleUncompressedSize = *(inPtr64 + RLE_UNCOMPRESSED_SIZE); + Int64 rleRawSize = *(inPtr64 + RLE_RAW_SIZE); + + Int64 totalAcUncompressedCount = *(inPtr64 + AC_UNCOMPRESSED_COUNT); + Int64 totalDcUncompressedCount = *(inPtr64 + DC_UNCOMPRESSED_COUNT); + + Int64 acCompression = *(inPtr64 + AC_COMPRESSION); + + Int64 compressedSize = unknownCompressedSize + + acCompressedSize + + dcCompressedSize + + rleCompressedSize; + + const char *dataPtr = inPtr + NUM_SIZES_SINGLE * sizeof(Int64); + + if (inSize < headerSize + compressedSize) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(truncated file)."); + } + + if (unknownUncompressedSize < 0 || + unknownCompressedSize < 0 || + acCompressedSize < 0 || + dcCompressedSize < 0 || + rleCompressedSize < 0 || + rleUncompressedSize < 0 || + rleRawSize < 0 || + totalAcUncompressedCount < 0 || + totalDcUncompressedCount < 0) + { + throw Iex::InputExc("Error uncompressing DWA data" + " (corrupt header)."); + } + + if (version < 2) + initializeLegacyChannelRules(); + else + { + unsigned short ruleSize = 0; + Xdr::read(dataPtr, ruleSize); + + if (ruleSize < 0) + throw Iex::InputExc("Error uncompressing DWA data" + " (corrupt header file)."); + + headerSize += ruleSize; + if (inSize < headerSize + compressedSize) + throw Iex::InputExc("Error uncompressing DWA data" + " (truncated file)."); + + _channelRules.clear(); + ruleSize -= Xdr::size (); + while (ruleSize > 0) + { + Classifier rule(dataPtr, ruleSize); + + _channelRules.push_back(rule); + ruleSize -= rule.size(); + } + } + + + size_t outBufferSize = 0; + initializeBuffers(outBufferSize); + + // + // Allocate _outBuffer, if we haven't done so already + // + + if (_maxScanLineSize * numScanLines() > _outBufferSize) + { + _outBufferSize = _maxScanLineSize * numScanLines(); + if (_outBuffer != 0) + delete[] _outBuffer; + _outBuffer = new char[_maxScanLineSize * numScanLines()]; + } + + + char *outBufferEnd = _outBuffer; + + + // + // Find the start of the RLE packed AC components and + // the DC components for each channel. This will be handy + // if you want to decode the channels in parallel later on. + // + + char *packedAcBufferEnd = 0; + + if (_packedAcBuffer) + packedAcBufferEnd = _packedAcBuffer; + + char *packedDcBufferEnd = 0; + + if (_packedDcBuffer) + packedDcBufferEnd = _packedDcBuffer; + + // + // UNKNOWN data is packed first, followed by the + // Huffman-compressed AC, then the DC values, + // and then the zlib compressed RLE data. + // + + const char *compressedUnknownBuf = dataPtr; + + const char *compressedAcBuf = compressedUnknownBuf + + static_cast(unknownCompressedSize); + const char *compressedDcBuf = compressedAcBuf + + static_cast(acCompressedSize); + const char *compressedRleBuf = compressedDcBuf + + static_cast(dcCompressedSize); + + // + // Sanity check that the version is something we expect. Right now, + // we can decode version 0, 1, and 2. v1 adds 'end of block' symbols + // to the AC RLE. v2 adds channel classification rules at the + // start of the data block. + // + + if ((version < 0) || (version > 2)) + throw Iex::InputExc ("Invalid version of compressed data block"); + + setupChannelData(minX, minY, maxX, maxY); + + // + // Uncompress the UNKNOWN data into _planarUncBuffer[UNKNOWN] + // + + if (unknownCompressedSize > 0) + { + uLongf outSize = static_cast( + ceil( (float)unknownUncompressedSize * 1.01) + 100); + + if (unknownUncompressedSize < 0 || + outSize > _planarUncBufferSize[UNKNOWN]) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(corrupt header)."); + } + + if (Z_OK != ::uncompress + ((Bytef *)_planarUncBuffer[UNKNOWN], + &outSize, + (Bytef *)compressedUnknownBuf, + (uLong)unknownCompressedSize)) + { + throw Iex::BaseExc("Error uncompressing UNKNOWN data."); + } + } + + // + // Uncompress the AC data into _packedAcBuffer + // + + if (acCompressedSize > 0) + { + if (totalAcUncompressedCount*sizeof(unsigned short) > _packedAcBufferSize) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(corrupt header)."); + } + + // + // Don't trust the user to get it right, look in the file. + // + + switch (acCompression) + { + case STATIC_HUFFMAN: + + hufUncompress + (compressedAcBuf, + (int)acCompressedSize, + (unsigned short *)_packedAcBuffer, + (int)totalAcUncompressedCount); + + break; + + case DEFLATE: + { + uLongf destLen = + (int)(totalAcUncompressedCount) * sizeof (unsigned short); + + if (Z_OK != ::uncompress + ((Bytef *)_packedAcBuffer, + &destLen, + (Bytef *)compressedAcBuf, + (uLong)acCompressedSize)) + { + throw Iex::InputExc ("Data decompression (zlib) failed."); + } + + if (totalAcUncompressedCount * sizeof (unsigned short) != + destLen) + { + throw Iex::InputExc ("AC data corrupt."); + } + } + break; + + default: + + throw Iex::NoImplExc ("Unknown AC Compression"); + break; + } + } + + // + // Uncompress the DC data into _packedDcBuffer + // + + if (dcCompressedSize > 0) + { + if (totalDcUncompressedCount*sizeof(unsigned short) > _packedDcBufferSize) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(corrupt header)."); + } + + if (_zip->uncompress + (compressedDcBuf, (int)dcCompressedSize, _packedDcBuffer) + != (int)totalDcUncompressedCount * sizeof (unsigned short)) + { + throw Iex::BaseExc("DC data corrupt."); + } + } + + // + // Uncompress the RLE data into _rleBuffer, then unRLE the results + // into _planarUncBuffer[RLE] + // + + if (rleRawSize > 0) + { + if (rleUncompressedSize > _rleBufferSize || + rleRawSize > _planarUncBufferSize[RLE]) + { + throw Iex::InputExc("Error uncompressing DWA data" + "(corrupt header)."); + } + + uLongf dstLen = (uLongf)rleUncompressedSize; + + if (Z_OK != ::uncompress + ((Bytef *)_rleBuffer, + &dstLen, + (Bytef *)compressedRleBuf, + (uLong)rleCompressedSize)) + { + throw Iex::BaseExc("Error uncompressing RLE data."); + } + + if (dstLen != rleUncompressedSize) + throw Iex::BaseExc("RLE data corrupted"); + + if (rleUncompress + ((int)rleUncompressedSize, + (int)rleRawSize, + (signed char *)_rleBuffer, + _planarUncBuffer[RLE]) != rleRawSize) + { + throw Iex::BaseExc("RLE data corrupted"); + } + } + + // + // Determine the start of each row in the output buffer + // + + std::vector decodedChannels (_channelData.size()); + std::vector< std::vector > rowPtrs (_channelData.size()); + + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + decodedChannels[chan] = false; + + outBufferEnd = _outBuffer; + + for (int y = minY; y <= maxY; ++y) + { + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + { + ChannelData *cd = &_channelData[chan]; + + if (Imath::modp (y, cd->ySampling) != 0) + continue; + + rowPtrs[chan].push_back (outBufferEnd); + outBufferEnd += cd->width * Imf::pixelTypeSize (cd->type); + } + } + + // + // Setup to decode each block of 3 channels that need to + // be handled together + // + + for (unsigned int csc = 0; csc < _cscSets.size(); ++csc) + { + int rChan = _cscSets[csc].idx[0]; + int gChan = _cscSets[csc].idx[1]; + int bChan = _cscSets[csc].idx[2]; + + + LossyDctDecoderCsc decoder + (rowPtrs[rChan], + rowPtrs[gChan], + rowPtrs[bChan], + packedAcBufferEnd, + packedDcBufferEnd, + dwaCompressorToLinear, + _channelData[rChan].width, + _channelData[rChan].height, + _channelData[rChan].type, + _channelData[gChan].type, + _channelData[bChan].type); + + decoder.execute(); + + packedAcBufferEnd += + decoder.numAcValuesEncoded() * sizeof (unsigned short); + + packedDcBufferEnd += + decoder.numDcValuesEncoded() * sizeof (unsigned short); + + decodedChannels[rChan] = true; + decodedChannels[gChan] = true; + decodedChannels[bChan] = true; + } + + // + // Setup to handle the remaining channels by themselves + // + + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + { + if (decodedChannels[chan]) + continue; + + ChannelData *cd = &_channelData[chan]; + int pixelSize = Imf::pixelTypeSize (cd->type); + + switch (cd->compression) + { + case LOSSY_DCT: + + // + // Setup a single-channel lossy DCT decoder pointing + // at the output buffer + // + + { + const unsigned short *linearLut = 0; + + if (!cd->pLinear) + linearLut = dwaCompressorToLinear; + + LossyDctDecoder decoder + (rowPtrs[chan], + packedAcBufferEnd, + packedDcBufferEnd, + linearLut, + cd->width, + cd->height, + cd->type); + + decoder.execute(); + + packedAcBufferEnd += + decoder.numAcValuesEncoded() * sizeof (unsigned short); + + packedDcBufferEnd += + decoder.numDcValuesEncoded() * sizeof (unsigned short); + } + + break; + + case RLE: + + // + // For the RLE case, the data has been un-RLE'd into + // planarUncRleEnd[], but is still split out by bytes. + // We need to rearrange the bytes back into the correct + // order in the output buffer; + // + + { + int row = 0; + + for (int y = minY; y <= maxY; ++y) + { + if (Imath::modp (y, cd->ySampling) != 0) + continue; + + char *dst = rowPtrs[chan][row]; + + if (pixelSize == 2) + { + interleaveByte2 (dst, + cd->planarUncRleEnd[0], + cd->planarUncRleEnd[1], + cd->width); + + cd->planarUncRleEnd[0] += cd->width; + cd->planarUncRleEnd[1] += cd->width; + } + else + { + for (int x = 0; x < cd->width; ++x) + { + for (int byte = 0; byte < pixelSize; ++byte) + { + *dst++ = *cd->planarUncRleEnd[byte]++; + } + } + } + + row++; + } + } + + break; + + case UNKNOWN: + + // + // In the UNKNOWN case, data is already in planarUncBufferEnd + // and just needs to copied over to the output buffer + // + + { + int row = 0; + int dstScanlineSize = cd->width * Imf::pixelTypeSize (cd->type); + + for (int y = minY; y <= maxY; ++y) + { + if (Imath::modp (y, cd->ySampling) != 0) + continue; + + memcpy (rowPtrs[chan][row], + cd->planarUncBufferEnd, + dstScanlineSize); + + cd->planarUncBufferEnd += dstScanlineSize; + row++; + } + } + + break; + + default: + + throw Iex::NoImplExc ("Unhandled compression scheme case"); + break; + } + + decodedChannels[chan] = true; + } + + // + // Return a ptr to _outBuffer + // + + outPtr = _outBuffer; + return (int)(outBufferEnd - _outBuffer); +} + + +// static +void +DwaCompressor::initializeFuncs() +{ + convertFloatToHalf64 = convertFloatToHalf64_scalar; + fromHalfZigZag = fromHalfZigZag_scalar; + + CpuId cpuId; + + // + // Setup HALF <-> FLOAT conversion implementations + // + + if (cpuId.avx && cpuId.f16c) + { + convertFloatToHalf64 = convertFloatToHalf64_f16c; + fromHalfZigZag = fromHalfZigZag_f16c; + } + + // + // Setup inverse DCT implementations + // + + dctInverse8x8_0 = dctInverse8x8_scalar<0>; + dctInverse8x8_1 = dctInverse8x8_scalar<1>; + dctInverse8x8_2 = dctInverse8x8_scalar<2>; + dctInverse8x8_3 = dctInverse8x8_scalar<3>; + dctInverse8x8_4 = dctInverse8x8_scalar<4>; + dctInverse8x8_5 = dctInverse8x8_scalar<5>; + dctInverse8x8_6 = dctInverse8x8_scalar<6>; + dctInverse8x8_7 = dctInverse8x8_scalar<7>; + + if (cpuId.avx) + { + dctInverse8x8_0 = dctInverse8x8_avx<0>; + dctInverse8x8_1 = dctInverse8x8_avx<1>; + dctInverse8x8_2 = dctInverse8x8_avx<2>; + dctInverse8x8_3 = dctInverse8x8_avx<3>; + dctInverse8x8_4 = dctInverse8x8_avx<4>; + dctInverse8x8_5 = dctInverse8x8_avx<5>; + dctInverse8x8_6 = dctInverse8x8_avx<6>; + dctInverse8x8_7 = dctInverse8x8_avx<7>; + } + else if (cpuId.sse2) + { + dctInverse8x8_0 = dctInverse8x8_sse2<0>; + dctInverse8x8_1 = dctInverse8x8_sse2<1>; + dctInverse8x8_2 = dctInverse8x8_sse2<2>; + dctInverse8x8_3 = dctInverse8x8_sse2<3>; + dctInverse8x8_4 = dctInverse8x8_sse2<4>; + dctInverse8x8_5 = dctInverse8x8_sse2<5>; + dctInverse8x8_6 = dctInverse8x8_sse2<6>; + dctInverse8x8_7 = dctInverse8x8_sse2<7>; + } +} + + +// +// Handle channel classification and buffer allocation once we know +// how to classify channels +// + +void +DwaCompressor::initializeBuffers (size_t &outBufferSize) +{ + classifyChannels (_channels, _channelData, _cscSets); + + // + // _outBuffer needs to be big enough to hold all our + // compressed data - which could vary depending on what sort + // of channels we have. + // + + int maxOutBufferSize = 0; + int numLossyDctChans = 0; + int unknownBufferSize = 0; + int rleBufferSize = 0; + + int maxLossyDctAcSize = (int)ceil ((float)numScanLines() / 8.0f) * + (int)ceil ((float)(_max[0] - _min[0] + 1) / 8.0f) * + 63 * sizeof (unsigned short); + + int maxLossyDctDcSize = (int)ceil ((float)numScanLines() / 8.0f) * + (int)ceil ((float)(_max[0] - _min[0] + 1) / 8.0f) * + sizeof (unsigned short); + + for (unsigned int chan = 0; chan < _channelData.size(); ++chan) + { + switch (_channelData[chan].compression) + { + case LOSSY_DCT: + + // + // This is the size of the number of packed + // components, plus the requirements for + // maximum Huffman encoding size. + // + + maxOutBufferSize += 2 * maxLossyDctAcSize + 65536; + numLossyDctChans++; + break; + + case RLE: + { + // + // RLE, if gone horribly wrong, could double the size + // of the source data. + // + + int rleAmount = 2 * numScanLines() * (_max[0] - _min[0] + 1) * + Imf::pixelTypeSize (_channelData[chan].type); + + rleBufferSize += rleAmount; + } + break; + + + case UNKNOWN: + + unknownBufferSize += numScanLines() * (_max[0] - _min[0] + 1) * + Imf::pixelTypeSize (_channelData[chan].type); + break; + + default: + + throw Iex::NoImplExc ("Unhandled compression scheme case"); + break; + } + } + + // + // Also, since the results of the RLE are packed into + // the output buffer, we need the extra room there. But + // we're going to zlib compress() the data we pack, + // which could take slightly more space + // + + maxOutBufferSize += (int)(ceil (1.01f * (float)rleBufferSize) + 100); + + // + // And the same goes for the UNKNOWN data + // + + maxOutBufferSize += (int)(ceil (1.01f * (float)unknownBufferSize) + 100); + + // + // Allocate a zip/deflate compressor big enought to hold the DC data + // and include it's compressed results in the size requirements + // for our output buffer + // + + if (_zip == 0) + _zip = new Zip (maxLossyDctDcSize * numLossyDctChans); + else if (_zip->maxRawSize() < maxLossyDctDcSize * numLossyDctChans) + { + delete _zip; + _zip = new Zip (maxLossyDctDcSize * numLossyDctChans); + } + + + maxOutBufferSize += _zip->maxCompressedSize(); + + // + // We also need to reserve space at the head of the buffer to + // write out the size of our various packed and compressed data. + // + + maxOutBufferSize += NUM_SIZES_SINGLE * sizeof (Int64); + + + // + // Later, we're going to hijack outBuffer for the result of + // both encoding and decoding. So it needs to be big enough + // to hold either a buffers' worth of uncompressed or + // compressed data + // + // For encoding, we'll need _outBuffer to hold maxOutBufferSize bytes, + // but for decoding, we only need it to be maxScanLineSize*numScanLines. + // Cache the max size for now, and alloc the buffer when we either + // encode or decode. + // + + outBufferSize = maxOutBufferSize; + + + // + // _packedAcBuffer holds the quantized DCT coefficients prior + // to Huffman encoding + // + + if (maxLossyDctAcSize * numLossyDctChans > _packedAcBufferSize) + { + _packedAcBufferSize = maxLossyDctAcSize * numLossyDctChans; + if (_packedAcBuffer != 0) + delete[] _packedAcBuffer; + _packedAcBuffer = new char[_packedAcBufferSize]; + } + + // + // _packedDcBuffer holds one quantized DCT coef per 8x8 block + // + + if (maxLossyDctDcSize * numLossyDctChans > _packedDcBufferSize) + { + _packedDcBufferSize = maxLossyDctDcSize * numLossyDctChans; + if (_packedDcBuffer != 0) + delete[] _packedDcBuffer; + _packedDcBuffer = new char[_packedDcBufferSize]; + } + + if (rleBufferSize > _rleBufferSize) + { + _rleBufferSize = rleBufferSize; + if (_rleBuffer != 0) + delete[] _rleBuffer; + _rleBuffer = new char[rleBufferSize]; + } + + // + // The planar uncompressed buffer will hold float data for LOSSY_DCT + // compressed values, and whatever the native type is for other + // channels. We're going to use this to hold data in a planar + // format, as opposed to the native interleaved format we take + // into compress() and give back from uncompress(). + // + // This also makes it easier to compress the UNKNOWN and RLE data + // all in one swoop (for each compression scheme). + // + + int planarUncBufferSize[NUM_COMPRESSOR_SCHEMES]; + for (int i=0; i 0) + { + planarUncBufferSize[UNKNOWN] = + (int) ceil (1.01f * (float)planarUncBufferSize[UNKNOWN]) + 100; + } + + for (int i = 0; i < NUM_COMPRESSOR_SCHEMES; ++i) + { + if (planarUncBufferSize[i] > _planarUncBufferSize[i]) + { + _planarUncBufferSize[i] = planarUncBufferSize[i]; + if (_planarUncBuffer[i] != 0) + delete[] _planarUncBuffer[i]; + _planarUncBuffer[i] = new char[planarUncBufferSize[i]]; + } + } +} + + +// +// Setup channel classification rules to use when writing files +// + +void +DwaCompressor::initializeDefaultChannelRules () +{ + _channelRules.clear(); + + _channelRules.push_back (Classifier ("R", LOSSY_DCT, HALF, 0, false)); + _channelRules.push_back (Classifier ("R", LOSSY_DCT, FLOAT, 0, false)); + _channelRules.push_back (Classifier ("G", LOSSY_DCT, HALF, 1, false)); + _channelRules.push_back (Classifier ("G", LOSSY_DCT, FLOAT, 1, false)); + _channelRules.push_back (Classifier ("B", LOSSY_DCT, HALF, 2, false)); + _channelRules.push_back (Classifier ("B", LOSSY_DCT, FLOAT, 2, false)); + + _channelRules.push_back (Classifier ("Y", LOSSY_DCT, HALF, -1, false)); + _channelRules.push_back (Classifier ("Y", LOSSY_DCT, FLOAT, -1, false)); + _channelRules.push_back (Classifier ("BY", LOSSY_DCT, HALF, -1, false)); + _channelRules.push_back (Classifier ("BY", LOSSY_DCT, FLOAT, -1, false)); + _channelRules.push_back (Classifier ("RY", LOSSY_DCT, HALF, -1, false)); + _channelRules.push_back (Classifier ("RY", LOSSY_DCT, FLOAT, -1, false)); + + _channelRules.push_back (Classifier ("A", RLE, UINT, -1, false)); + _channelRules.push_back (Classifier ("A", RLE, HALF, -1, false)); + _channelRules.push_back (Classifier ("A", RLE, FLOAT, -1, false)); +} + + +// +// Setup channel classification rules when reading files with VERSION < 2 +// + +void +DwaCompressor::initializeLegacyChannelRules () +{ + _channelRules.clear(); + + _channelRules.push_back (Classifier ("r", LOSSY_DCT, HALF, 0, true)); + _channelRules.push_back (Classifier ("r", LOSSY_DCT, FLOAT, 0, true)); + _channelRules.push_back (Classifier ("red", LOSSY_DCT, HALF, 0, true)); + _channelRules.push_back (Classifier ("red", LOSSY_DCT, FLOAT, 0, true)); + _channelRules.push_back (Classifier ("g", LOSSY_DCT, HALF, 1, true)); + _channelRules.push_back (Classifier ("g", LOSSY_DCT, FLOAT, 1, true)); + _channelRules.push_back (Classifier ("grn", LOSSY_DCT, HALF, 1, true)); + _channelRules.push_back (Classifier ("grn", LOSSY_DCT, FLOAT, 1, true)); + _channelRules.push_back (Classifier ("green", LOSSY_DCT, HALF, 1, true)); + _channelRules.push_back (Classifier ("green", LOSSY_DCT, FLOAT, 1, true)); + _channelRules.push_back (Classifier ("b", LOSSY_DCT, HALF, 2, true)); + _channelRules.push_back (Classifier ("b", LOSSY_DCT, FLOAT, 2, true)); + _channelRules.push_back (Classifier ("blu", LOSSY_DCT, HALF, 2, true)); + _channelRules.push_back (Classifier ("blu", LOSSY_DCT, FLOAT, 2, true)); + _channelRules.push_back (Classifier ("blue", LOSSY_DCT, HALF, 2, true)); + _channelRules.push_back (Classifier ("blue", LOSSY_DCT, FLOAT, 2, true)); + + _channelRules.push_back (Classifier ("y", LOSSY_DCT, HALF, -1, true)); + _channelRules.push_back (Classifier ("y", LOSSY_DCT, FLOAT, -1, true)); + _channelRules.push_back (Classifier ("by", LOSSY_DCT, HALF, -1, true)); + _channelRules.push_back (Classifier ("by", LOSSY_DCT, FLOAT, -1, true)); + _channelRules.push_back (Classifier ("ry", LOSSY_DCT, HALF, -1, true)); + _channelRules.push_back (Classifier ("ry", LOSSY_DCT, FLOAT, -1, true)); + _channelRules.push_back (Classifier ("a", RLE, UINT, -1, true)); + _channelRules.push_back (Classifier ("a", RLE, HALF, -1, true)); + _channelRules.push_back (Classifier ("a", RLE, FLOAT, -1, true)); +} + + +// +// Given a set of rules and ChannelData, figure out which rules apply +// + +void +DwaCompressor::relevantChannelRules (std::vector &rules) const +{ + rules.clear(); + + std::vector suffixes; + + for (size_t cd = 0; cd < _channelData.size(); ++cd) + { + std::string suffix = _channelData[cd].name; + size_t lastDot = suffix.find_last_of ('.'); + + if (lastDot != std::string::npos) + suffix = suffix.substr (lastDot+1, std::string::npos); + + suffixes.push_back(suffix); + } + + + for (size_t i = 0; i < _channelRules.size(); ++i) + { + for (size_t cd = 0; cd < _channelData.size(); ++cd) + { + if (_channelRules[i].match (suffixes[cd], _channelData[cd].type )) + { + rules.push_back (_channelRules[i]); + break; + } + } + } +} + + +// +// Take our initial list of channels, and cache the contents. +// +// Determine approprate compression schemes for each channel, +// and figure out which sets should potentially be CSC'ed +// prior to lossy compression. +// + +void +DwaCompressor::classifyChannels + (ChannelList channels, + std::vector &chanData, + std::vector &cscData) +{ + // + // prefixMap used to map channel name prefixes to + // potential CSC-able sets of channels. + // + + std::map prefixMap; + std::vector tmpCscSet; + + unsigned int numChan = 0; + + for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c) + numChan++; + + if (numChan) + chanData.resize (numChan); + + // + // Cache the relevant data from the channel structs. + // + + unsigned int offset = 0; + + for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c) + { + chanData[offset].name = std::string (c.name()); + chanData[offset].compression = UNKNOWN; + chanData[offset].xSampling = c.channel().xSampling; + chanData[offset].ySampling = c.channel().ySampling; + chanData[offset].type = c.channel().type; + chanData[offset].pLinear = c.channel().pLinear; + + offset++; + } + + // + // Try and figure out which channels should be + // compressed by which means. + // + + for (offset = 0; offset::iterator + theSet = prefixMap.find (prefix); + + if (theSet == prefixMap.end()) + { + DwaCompressor::CscChannelSet tmpSet; + + tmpSet.idx[0] = + tmpSet.idx[1] = + tmpSet.idx[2] = -1; + + prefixMap[prefix] = tmpSet; + } + + // + // Check the suffix against the list of classifications + // we defined previously. If the _cscIdx is not negative, + // it indicates that we should be part of a CSC group. + // + + for (std::vector::iterator i = _channelRules.begin(); + i != _channelRules.end(); + ++i) + { + if ( i->match(suffix, chanData[offset].type) ) + { + chanData[offset].compression = i->_scheme; + + if ( i->_cscIdx >= 0) + prefixMap[prefix].idx[i->_cscIdx] = offset; + } + } + } + + // + // Finally, try and find RGB sets of channels which + // can be CSC'ed to a Y'CbCr space prior to loss, for + // better compression. + // + // Walk over our set of candidates, and see who has + // all three channels defined (and has common sampling + // patterns, etc). + // + + for (std::map::iterator + theItem = prefixMap.begin(); theItem != prefixMap.end(); + ++theItem) + { + int red = (*theItem).second.idx[0]; + int grn = (*theItem).second.idx[1]; + int blu = (*theItem).second.idx[2]; + + if ((red < 0) || (grn < 0) || (blu < 0)) + continue; + + if ((chanData[red].xSampling != chanData[grn].xSampling) || + (chanData[red].xSampling != chanData[blu].xSampling) || + (chanData[grn].xSampling != chanData[blu].xSampling) || + (chanData[red].ySampling != chanData[grn].ySampling) || + (chanData[red].ySampling != chanData[blu].ySampling) || + (chanData[grn].ySampling != chanData[blu].ySampling)) + { + continue; + } + + tmpCscSet.push_back ((*theItem).second); + } + + size_t numCsc = tmpCscSet.size(); + + if (numCsc) + cscData.resize(numCsc); + + for (offset = 0; offset < numCsc; ++offset) + cscData[offset] = tmpCscSet[offset]; +} + + + +// +// Setup some buffer pointers, determine channel sizes, things +// like that. +// + +void +DwaCompressor::setupChannelData (int minX, int minY, int maxX, int maxY) +{ + char *planarUncBuffer[NUM_COMPRESSOR_SCHEMES]; + + for (int i=0; iwidth = Imf::numSamples (cd->xSampling, minX, maxX); + cd->height = Imf::numSamples (cd->ySampling, minY, maxY); + + cd->planarUncSize = + cd->width * cd->height * Imf::pixelTypeSize (cd->type); + + cd->planarUncBuffer = planarUncBuffer[cd->compression]; + cd->planarUncBufferEnd = cd->planarUncBuffer; + + cd->planarUncRle[0] = cd->planarUncBuffer; + cd->planarUncRleEnd[0] = cd->planarUncRle[0]; + + for (int byte = 1; byte < Imf::pixelTypeSize(cd->type); ++byte) + { + cd->planarUncRle[byte] = + cd->planarUncRle[byte-1] + cd->width * cd->height; + + cd->planarUncRleEnd[byte] = + cd->planarUncRle[byte]; + } + + cd->planarUncType = cd->type; + + if (cd->compression == LOSSY_DCT) + { + cd->planarUncType = FLOAT; + } + else + { + planarUncBuffer[cd->compression] += + cd->width * cd->height * Imf::pixelTypeSize (cd->planarUncType); + } + } +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfDwaCompressor.h b/IlmImf/ImfDwaCompressor.h new file mode 100644 index 0000000..8e390b0 --- /dev/null +++ b/IlmImf/ImfDwaCompressor.h @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DWA_COMRESSOR_H +#define INCLUDED_IMF_DWA_COMRESSOR_H + +//------------------------------------------------------------------------------ +// +// class DwaCompressor -- Store lossy RGB data by quantizing DCT components. +// +//------------------------------------------------------------------------------ + +#include +#include + +#include "ImfInt64.h" +#include "ImfZip.h" +#include "ImfChannelList.h" +#include "ImfCompressor.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class DwaCompressor: public Compressor +{ + public: + + enum AcCompression + { + STATIC_HUFFMAN, + DEFLATE, + }; + + + DwaCompressor (const Header &hdr, + int maxScanLineSize, + int numScanLines, // ideally is a multiple of 8 + AcCompression acCompression); + + virtual ~DwaCompressor (); + + virtual int numScanLines () const; + + virtual Imf::Compressor::Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + static void initializeFuncs (); + + private: + + struct ChannelData; + struct CscChannelSet; + struct Classifier; + + class LossyDctDecoderBase; + class LossyDctDecoder; + class LossyDctDecoderCsc; + + class LossyDctEncoderBase; + class LossyDctEncoder; + class LossyDctEncoderCsc; + + enum CompressorScheme + { + UNKNOWN = 0, + LOSSY_DCT, + RLE, + + NUM_COMPRESSOR_SCHEMES + }; + + // + // Per-chunk compressed data sizes, one value per chunk + // + + enum DataSizesSingle + { + VERSION = 0, // Version number: + // 0: classic + // 1: adds "end of block" to the AC RLE + + UNKNOWN_UNCOMPRESSED_SIZE, // Size of leftover data, uncompressed. + UNKNOWN_COMPRESSED_SIZE, // Size of leftover data, zlib compressed. + + AC_COMPRESSED_SIZE, // AC RLE + Huffman size + DC_COMPRESSED_SIZE, // DC + Deflate size + RLE_COMPRESSED_SIZE, // RLE + Deflate data size + RLE_UNCOMPRESSED_SIZE, // RLE'd data size + RLE_RAW_SIZE, // Un-RLE'd data size + + AC_UNCOMPRESSED_COUNT, // AC RLE number of elements + DC_UNCOMPRESSED_COUNT, // DC number of elements + + AC_COMPRESSION, // AC compression strategy + NUM_SIZES_SINGLE + }; + + AcCompression _acCompression; + + int _maxScanLineSize; + int _numScanLines; + int _min[2], _max[2]; + + ChannelList _channels; + std::vector _channelData; + std::vector _cscSets; + std::vector _channelRules; + + char *_packedAcBuffer; + size_t _packedAcBufferSize; + char *_packedDcBuffer; + size_t _packedDcBufferSize; + char *_rleBuffer; + size_t _rleBufferSize; + char *_outBuffer; + size_t _outBufferSize; + char *_planarUncBuffer[NUM_COMPRESSOR_SCHEMES]; + size_t _planarUncBufferSize[NUM_COMPRESSOR_SCHEMES]; + + Zip *_zip; + float _dwaCompressionLevel; + + int compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + void initializeBuffers (size_t&); + void initializeDefaultChannelRules (); + void initializeLegacyChannelRules (); + + void relevantChannelRules( std::vector &) const; + + // + // Populate our cached version of the channel data with + // data from the real channel list. We want to + // copy over attributes, determine compression schemes + // releveant for the channel type, and find sets of + // channels to be compressed from Y'CbCr data instead + // of R'G'B'. + // + + void classifyChannels (ChannelList channels, + std::vector &chanData, + std::vector &cscData); + + // + // Compute various buffer pointers for each channel + // + + void setupChannelData (int minX, int minY, int maxX, int maxY); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfDwaCompressorSimd.h b/IlmImf/ImfDwaCompressorSimd.h new file mode 100644 index 0000000..93246f6 --- /dev/null +++ b/IlmImf/ImfDwaCompressorSimd.h @@ -0,0 +1,2145 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMF_DWACOMPRESSORSIMD_H_HAS_BEEN_INCLUDED +#define IMF_DWACOMPRESSORSIMD_H_HAS_BEEN_INCLUDED + +// +// Various SSE accelerated functions, used by Imf::DwaCompressor. +// These have been separated into a separate .h file, as the fast +// paths are done with template specialization. +// +// Unless otherwise noted, all pointers are assumed to be 32-byte +// aligned. Unaligned pointers may risk seg-faulting. +// + +#include "ImfNamespace.h" +#include "ImfSimd.h" +#include "ImfSystemSpecific.h" +#include "OpenEXRConfig.h" + +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +#define _SSE_ALIGNMENT 32 +#define _SSE_ALIGNMENT_MASK 0x0F +#define _AVX_ALIGNMENT_MASK 0x1F + +// +// Test if we should enable GCC inline asm paths for AVX +// + +#ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX + + #define IMF_HAVE_GCC_INLINEASM + + #ifdef __LP64__ + #define IMF_HAVE_GCC_INLINEASM_64 + #endif /* __LP64__ */ + +#endif /* OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX */ + +// +// A simple 64-element array, aligned properly for SIMD access. +// + +template +class SimdAlignedBuffer64 +{ + public: + + SimdAlignedBuffer64(): _buffer (0), _handle (0) + { + alloc(); + } + + SimdAlignedBuffer64(const SimdAlignedBuffer64 &rhs): _handle(0) + { + alloc(); + memcpy (_buffer, rhs._buffer, 64 * sizeof (T)); + } + + ~SimdAlignedBuffer64 () + { + EXRFreeAligned (_handle); + _handle = 0; + _buffer = 0; + } + + void alloc() + { + // + // Try EXRAllocAligned first - but it might fallback to + // unaligned allocs. If so, overalloc. + // + + _handle = (char *) EXRAllocAligned + (64 * sizeof(T), _SSE_ALIGNMENT); + + if (((size_t)_handle & (_SSE_ALIGNMENT - 1)) == 0) + { + _buffer = (T *)_handle; + return; + } + + EXRFreeAligned(_handle); + _handle = (char *) EXRAllocAligned + (64 * sizeof(T) + _SSE_ALIGNMENT, _SSE_ALIGNMENT); + + char *aligned = _handle; + + while ((size_t)aligned & (_SSE_ALIGNMENT - 1)) + aligned++; + + _buffer = (T *)aligned; + } + + T *_buffer; + + private: + + char *_handle; +}; + +typedef SimdAlignedBuffer64 SimdAlignedBuffer64f; +typedef SimdAlignedBuffer64 SimdAlignedBuffer64us; + +namespace { + +// +// Color space conversion, Inverse 709 CSC, Y'CbCr -> R'G'B' +// + +void +csc709Inverse (float &comp0, float &comp1, float &comp2) +{ + float src[3]; + + src[0] = comp0; + src[1] = comp1; + src[2] = comp2; + + comp0 = src[0] + 1.5747f * src[2]; + comp1 = src[0] - 0.1873f * src[1] - 0.4682f * src[2]; + comp2 = src[0] + 1.8556f * src[1]; +} + +#ifndef IMF_HAVE_SSE2 + + +// +// Scalar color space conversion, based on 709 primiary chromaticies. +// No scaling or offsets, just the matrix +// + +void +csc709Inverse64 (float *comp0, float *comp1, float *comp2) +{ + for (int i = 0; i < 64; ++i) + csc709Inverse (comp0[i], comp1[i], comp2[i]); +} + +#else /* IMF_HAVE_SSE2 */ + +// +// SSE2 color space conversion +// + +void +csc709Inverse64 (float *comp0, float *comp1, float *comp2) +{ + __m128 c0 = { 1.5747f, 1.5747f, 1.5747f, 1.5747f}; + __m128 c1 = { 1.8556f, 1.8556f, 1.8556f, 1.8556f}; + __m128 c2 = {-0.1873f, -0.1873f, -0.1873f, -0.1873f}; + __m128 c3 = {-0.4682f, -0.4682f, -0.4682f, -0.4682f}; + + __m128 *r = (__m128 *)comp0; + __m128 *g = (__m128 *)comp1; + __m128 *b = (__m128 *)comp2; + __m128 src[3]; + + #define CSC_INVERSE_709_SSE2_LOOP(i) \ + src[0] = r[i]; \ + src[1] = g[i]; \ + src[2] = b[i]; \ + \ + r[i] = _mm_add_ps (r[i], _mm_mul_ps (src[2], c0)); \ + \ + g[i] = _mm_mul_ps (g[i], c2); \ + src[2] = _mm_mul_ps (src[2], c3); \ + g[i] = _mm_add_ps (g[i], src[0]); \ + g[i] = _mm_add_ps (g[i], src[2]); \ + \ + b[i] = _mm_mul_ps (c1, src[1]); \ + b[i] = _mm_add_ps (b[i], src[0]); + + CSC_INVERSE_709_SSE2_LOOP (0) + CSC_INVERSE_709_SSE2_LOOP (1) + CSC_INVERSE_709_SSE2_LOOP (2) + CSC_INVERSE_709_SSE2_LOOP (3) + + CSC_INVERSE_709_SSE2_LOOP (4) + CSC_INVERSE_709_SSE2_LOOP (5) + CSC_INVERSE_709_SSE2_LOOP (6) + CSC_INVERSE_709_SSE2_LOOP (7) + + CSC_INVERSE_709_SSE2_LOOP (8) + CSC_INVERSE_709_SSE2_LOOP (9) + CSC_INVERSE_709_SSE2_LOOP (10) + CSC_INVERSE_709_SSE2_LOOP (11) + + CSC_INVERSE_709_SSE2_LOOP (12) + CSC_INVERSE_709_SSE2_LOOP (13) + CSC_INVERSE_709_SSE2_LOOP (14) + CSC_INVERSE_709_SSE2_LOOP (15) +} + +#endif /* IMF_HAVE_SSE2 */ + + +// +// Color space conversion, Forward 709 CSC, R'G'B' -> Y'CbCr +// +// Simple FPU color space conversion. Based on the 709 +// primary chromaticies, with no scaling or offsets. +// + +void +csc709Forward64 (float *comp0, float *comp1, float *comp2) +{ + float src[3]; + + for (int i = 0; i<64; ++i) + { + src[0] = comp0[i]; + src[1] = comp1[i]; + src[2] = comp2[i]; + + comp0[i] = 0.2126f * src[0] + 0.7152f * src[1] + 0.0722f * src[2]; + comp1[i] = -0.1146f * src[0] - 0.3854f * src[1] + 0.5000f * src[2]; + comp2[i] = 0.5000f * src[0] - 0.4542f * src[1] - 0.0458f * src[2]; + } +} + + +// +// Byte interleaving of 2 byte arrays: +// src0 = AAAA +// src1 = BBBB +// dst = ABABABAB +// +// numBytes is the size of each of the source buffers +// + +#ifndef IMF_HAVE_SSE2 + +// +// Scalar default implementation +// + +void +interleaveByte2 (char *dst, char *src0, char *src1, int numBytes) +{ + for (int x = 0; x < numBytes; ++x) + { + dst[2 * x] = src0[x]; + dst[2 * x + 1] = src1[x]; + } +} + +#else /* IMF_HAVE_SSE2 */ + +// +// SSE2 byte interleaving +// + +void +interleaveByte2 (char *dst, char *src0, char *src1, int numBytes) +{ + int dstAlignment = (size_t)dst % 16; + int src0Alignment = (size_t)src0 % 16; + int src1Alignment = (size_t)src1 % 16; + + __m128i *dst_epi8 = (__m128i*)dst; + __m128i *src0_epi8 = (__m128i*)src0; + __m128i *src1_epi8 = (__m128i*)src1; + int sseWidth = numBytes / 16; + + if ((!dstAlignment) && (!src0Alignment) && (!src1Alignment)) + { + __m128i tmp0, tmp1; + + // + // Aligned loads and stores + // + + for (int x = 0; x < sseWidth; ++x) + { + tmp0 = src0_epi8[x]; + tmp1 = src1_epi8[x]; + + _mm_stream_si128 (&dst_epi8[2 * x], + _mm_unpacklo_epi8 (tmp0, tmp1)); + + _mm_stream_si128 (&dst_epi8[2 * x + 1], + _mm_unpackhi_epi8 (tmp0, tmp1)); + } + + // + // Then do run the leftovers one at a time + // + + for (int x = 16 * sseWidth; x < numBytes; ++x) + { + dst[2 * x] = src0[x]; + dst[2 * x + 1] = src1[x]; + } + } + else if ((!dstAlignment) && (src0Alignment == 8) && (src1Alignment == 8)) + { + // + // Aligned stores, but catch up a few values so we can + // use aligned loads + // + + for (int x = 0; x < 8; ++x) + { + dst[2 * x] = src0[x]; + dst[2 * x + 1] = src1[x]; + } + + dst_epi8 = (__m128i*)&dst[16]; + src0_epi8 = (__m128i*)&src0[8]; + src1_epi8 = (__m128i*)&src1[8]; + sseWidth = (numBytes - 8) / 16; + + for (int x=0; x half float conversion +// +// To enable F16C based conversion, we can't rely on compile-time +// detection, hence the multiple defined versions. Pick one based +// on runtime cpuid detection. +// + +// +// Default boring conversion +// + +void +convertFloatToHalf64_scalar (unsigned short *dst, float *src) +{ + for (int i=0; i<64; ++i) + dst[i] = ((half)src[i]).bits(); +} + + +// +// F16C conversion - Assumes aligned src and dst +// + +void +convertFloatToHalf64_f16c (unsigned short *dst, float *src) +{ + // + // Ordinarly, I'd avoid using inline asm and prefer intrinsics. + // However, in order to get the intrinsics, we need to tell + // the compiler to generate VEX instructions. + // + // (On the GCC side, -mf16c goes ahead and activates -mavc, + // resulting in VEX code. Without -mf16c, no intrinsics..) + // + // Now, it's quite likely that we'll find ourselves in situations + // where we want to build *without* VEX, in order to maintain + // maximum compatability. But to get there with intrinsics, + // we'd need to break out code into a separate file. Bleh. + // I'll take the asm. + // + + #if defined IMF_HAVE_GCC_INLINEASM + __asm__ + ("vmovaps (%0), %%ymm0 \n" + "vmovaps 0x20(%0), %%ymm1 \n" + "vmovaps 0x40(%0), %%ymm2 \n" + "vmovaps 0x60(%0), %%ymm3 \n" + "vcvtps2ph $0, %%ymm0, %%xmm0 \n" + "vcvtps2ph $0, %%ymm1, %%xmm1 \n" + "vcvtps2ph $0, %%ymm2, %%xmm2 \n" + "vcvtps2ph $0, %%ymm3, %%xmm3 \n" + "vmovdqa %%xmm0, 0x00(%1) \n" + "vmovdqa %%xmm1, 0x10(%1) \n" + "vmovdqa %%xmm2, 0x20(%1) \n" + "vmovdqa %%xmm3, 0x30(%1) \n" + "vmovaps 0x80(%0), %%ymm0 \n" + "vmovaps 0xa0(%0), %%ymm1 \n" + "vmovaps 0xc0(%0), %%ymm2 \n" + "vmovaps 0xe0(%0), %%ymm3 \n" + "vcvtps2ph $0, %%ymm0, %%xmm0 \n" + "vcvtps2ph $0, %%ymm1, %%xmm1 \n" + "vcvtps2ph $0, %%ymm2, %%xmm2 \n" + "vcvtps2ph $0, %%ymm3, %%xmm3 \n" + "vmovdqa %%xmm0, 0x40(%1) \n" + "vmovdqa %%xmm1, 0x50(%1) \n" + "vmovdqa %%xmm2, 0x60(%1) \n" + "vmovdqa %%xmm3, 0x70(%1) \n" + #ifndef __AVX__ + "vzeroupper \n" + #endif /* __AVX__ */ + : /* Output */ + : /* Input */ "r"(src), "r"(dst) + #ifndef __AVX__ + : /* Clobber */ "%xmm0", "%xmm1", "%xmm2", "%xmm3", "memory" + #else + : /* Clobber */ "%ymm0", "%ymm1", "%ymm2", "%ymm3", "memory" + #endif /* __AVX__ */ + ); + #else + convertFloatToHalf64_scalar (dst, src); + #endif /* IMF_HAVE_GCC_INLINEASM */ +} + + +// +// Convert an 8x8 block of HALF from zig-zag order to +// FLOAT in normal order. The order we want is: +// +// src dst +// 0 1 2 3 4 5 6 7 0 1 5 6 14 15 27 28 +// 8 9 10 11 12 13 14 15 2 4 7 13 16 26 29 42 +// 16 17 18 19 20 21 22 23 3 8 12 17 25 30 41 43 +// 24 25 26 27 28 29 30 31 9 11 18 24 31 40 44 53 +// 32 33 34 35 36 37 38 39 10 19 23 32 39 45 52 54 +// 40 41 42 43 44 45 46 47 20 22 33 38 46 51 55 60 +// 48 49 50 51 52 53 54 55 21 34 37 47 50 56 59 61 +// 56 57 58 59 60 61 62 63 35 36 48 49 57 58 62 63 +// + +void +fromHalfZigZag_scalar (unsigned short *src, float *dst) +{ + half *srcHalf = (half *)src; + + dst[0] = (float)srcHalf[0]; + dst[1] = (float)srcHalf[1]; + dst[2] = (float)srcHalf[5]; + dst[3] = (float)srcHalf[6]; + dst[4] = (float)srcHalf[14]; + dst[5] = (float)srcHalf[15]; + dst[6] = (float)srcHalf[27]; + dst[7] = (float)srcHalf[28]; + dst[8] = (float)srcHalf[2]; + dst[9] = (float)srcHalf[4]; + + dst[10] = (float)srcHalf[7]; + dst[11] = (float)srcHalf[13]; + dst[12] = (float)srcHalf[16]; + dst[13] = (float)srcHalf[26]; + dst[14] = (float)srcHalf[29]; + dst[15] = (float)srcHalf[42]; + dst[16] = (float)srcHalf[3]; + dst[17] = (float)srcHalf[8]; + dst[18] = (float)srcHalf[12]; + dst[19] = (float)srcHalf[17]; + + dst[20] = (float)srcHalf[25]; + dst[21] = (float)srcHalf[30]; + dst[22] = (float)srcHalf[41]; + dst[23] = (float)srcHalf[43]; + dst[24] = (float)srcHalf[9]; + dst[25] = (float)srcHalf[11]; + dst[26] = (float)srcHalf[18]; + dst[27] = (float)srcHalf[24]; + dst[28] = (float)srcHalf[31]; + dst[29] = (float)srcHalf[40]; + + dst[30] = (float)srcHalf[44]; + dst[31] = (float)srcHalf[53]; + dst[32] = (float)srcHalf[10]; + dst[33] = (float)srcHalf[19]; + dst[34] = (float)srcHalf[23]; + dst[35] = (float)srcHalf[32]; + dst[36] = (float)srcHalf[39]; + dst[37] = (float)srcHalf[45]; + dst[38] = (float)srcHalf[52]; + dst[39] = (float)srcHalf[54]; + + dst[40] = (float)srcHalf[20]; + dst[41] = (float)srcHalf[22]; + dst[42] = (float)srcHalf[33]; + dst[43] = (float)srcHalf[38]; + dst[44] = (float)srcHalf[46]; + dst[45] = (float)srcHalf[51]; + dst[46] = (float)srcHalf[55]; + dst[47] = (float)srcHalf[60]; + dst[48] = (float)srcHalf[21]; + dst[49] = (float)srcHalf[34]; + + dst[50] = (float)srcHalf[37]; + dst[51] = (float)srcHalf[47]; + dst[52] = (float)srcHalf[50]; + dst[53] = (float)srcHalf[56]; + dst[54] = (float)srcHalf[59]; + dst[55] = (float)srcHalf[61]; + dst[56] = (float)srcHalf[35]; + dst[57] = (float)srcHalf[36]; + dst[58] = (float)srcHalf[48]; + dst[59] = (float)srcHalf[49]; + + dst[60] = (float)srcHalf[57]; + dst[61] = (float)srcHalf[58]; + dst[62] = (float)srcHalf[62]; + dst[63] = (float)srcHalf[63]; +} + + +// +// If we can form the correct ordering in xmm registers, +// we can use F16C to convert from HALF -> FLOAT. However, +// making the correct order isn't trivial. +// +// We want to re-order a source 8x8 matrix from: +// +// 0 1 2 3 4 5 6 7 0 1 5 6 14 15 27 28 +// 8 9 10 11 12 13 14 15 2 4 7 13 16 26 29 42 +// 16 17 18 19 20 21 22 23 3 8 12 17 25 30 41 43 +// 24 25 26 27 28 29 30 31 9 11 18 24 31 40 44 53 (A) +// 32 33 34 35 36 37 38 39 --> 10 19 23 32 39 45 52 54 +// 40 41 42 43 44 45 46 47 20 22 33 38 46 51 55 60 +// 48 49 50 51 52 53 54 55 21 34 37 47 50 56 59 61 +// 56 57 58 59 60 61 62 63 35 36 48 49 57 58 62 63 +// +// Which looks like a mess, right? +// +// Now, check out the NE/SW diagonals of (A). Along those lines, +// we have runs of contiguous values! If we rewrite (A) a bit, we get: +// +// 0 +// 1 2 +// 5 4 3 +// 6 7 8 9 +// 14 13 12 11 10 +// 15 16 17 18 19 20 +// 27 26 25 24 23 22 21 (B) +// 28 29 30 31 32 33 34 35 +// 42 41 40 39 38 37 36 +// 43 44 45 46 47 48 +// 53 52 51 50 49 +// 54 55 56 57 +// 60 59 58 +// 61 62 +// 63 +// +// In this ordering, the columns are the rows (A). If we can 'transpose' +// (B), we'll achieve our goal. But we want this to fit nicely into +// xmm registers and still be able to load large runs efficiently. +// Also, notice that the odd rows are in ascending order, while +// the even rows are in descending order. +// +// If we 'fold' the bottom half up into the top, we can preserve ordered +// runs accross rows, and still keep all the correct values in columns. +// After transposing, we'll need to rotate things back into place. +// This gives us: +// +// 0 | 42 41 40 39 38 37 36 +// 1 2 | 43 44 45 46 47 48 +// 5 4 3 | 53 52 51 50 49 +// 6 7 8 9 | 54 55 56 57 (C) +// 14 13 12 11 10 | 60 59 58 +// 15 16 17 18 19 20 | 61 62 +// 27 26 25 24 23 22 21 | 61 +// 28 29 30 31 32 33 34 35 +// +// But hang on. We still have the backwards descending rows to deal with. +// Lets reverse the even rows so that all values are in ascending order +// +// 36 37 38 39 40 41 42 | 0 +// 1 2 | 43 44 45 46 47 48 +// 49 50 51 52 53 | 3 4 5 +// 6 7 8 9 | 54 55 56 57 (D) +// 58 59 60 | 10 11 12 13 14 +// 15 16 17 18 19 20 | 61 62 +// 61 | 21 22 23 24 25 26 27 +// 28 29 30 31 32 33 34 35 +// +// If we can form (D), we will then: +// 1) Reverse the even rows +// 2) Transpose +// 3) Rotate the rows +// +// and we'll have (A). +// + +void +fromHalfZigZag_f16c (unsigned short *src, float *dst) +{ + #if defined IMF_HAVE_GCC_INLINEASM_64 + __asm__ + + /* x3 <- 0 + * x8 <- [ 0- 7] + * x6 <- [56-63] + * x9 <- [21-28] + * x7 <- [28-35] + * x3 <- [ 6- 9] (lower half) */ + + ("vpxor %%xmm3, %%xmm3, %%xmm3 \n" + "vmovdqa (%0), %%xmm8 \n" + "vmovdqa 112(%0), %%xmm6 \n" + "vmovdqu 42(%0), %%xmm9 \n" + "vmovdqu 56(%0), %%xmm7 \n" + "vmovq 12(%0), %%xmm3 \n" + + /* Setup rows 0-2 of A in xmm0-xmm2 + * x1 <- x8 >> 16 (1 value) + * x2 <- x8 << 32 (2 values) + * x0 <- alignr([35-42], x8, 2) + * x1 <- blend(x1, [41-48]) + * x2 <- blend(x2, [49-56]) */ + + "vpsrldq $2, %%xmm8, %%xmm1 \n" + "vpslldq $4, %%xmm8, %%xmm2 \n" + "vpalignr $2, 70(%0), %%xmm8, %%xmm0 \n" + "vpblendw $0xfc, 82(%0), %%xmm1, %%xmm1 \n" + "vpblendw $0x1f, 98(%0), %%xmm2, %%xmm2 \n" + + /* Setup rows 4-6 of A in xmm4-xmm6 + * x4 <- x6 >> 32 (2 values) + * x5 <- x6 << 16 (1 value) + * x6 <- alignr(x6,x9,14) + * x4 <- blend(x4, [ 7-14]) + * x5 <- blend(x5, [15-22]) */ + + "vpsrldq $4, %%xmm6, %%xmm4 \n" + "vpslldq $2, %%xmm6, %%xmm5 \n" + "vpalignr $14, %%xmm6, %%xmm9, %%xmm6 \n" + "vpblendw $0xf8, 14(%0), %%xmm4, %%xmm4 \n" + "vpblendw $0x3f, 30(%0), %%xmm5, %%xmm5 \n" + + /* Load the upper half of row 3 into xmm3 + * x3 <- [54-57] (upper half) */ + + "vpinsrq $1, 108(%0), %%xmm3, %%xmm3\n" + + /* Reverse the even rows. We're not using PSHUFB as + * that requires loading an extra constant all the time, + * and we're alreadly pretty memory bound. + */ + + "vpshuflw $0x1b, %%xmm0, %%xmm0 \n" + "vpshuflw $0x1b, %%xmm2, %%xmm2 \n" + "vpshuflw $0x1b, %%xmm4, %%xmm4 \n" + "vpshuflw $0x1b, %%xmm6, %%xmm6 \n" + + "vpshufhw $0x1b, %%xmm0, %%xmm0 \n" + "vpshufhw $0x1b, %%xmm2, %%xmm2 \n" + "vpshufhw $0x1b, %%xmm4, %%xmm4 \n" + "vpshufhw $0x1b, %%xmm6, %%xmm6 \n" + + "vpshufd $0x4e, %%xmm0, %%xmm0 \n" + "vpshufd $0x4e, %%xmm2, %%xmm2 \n" + "vpshufd $0x4e, %%xmm4, %%xmm4 \n" + "vpshufd $0x4e, %%xmm6, %%xmm6 \n" + + /* Transpose xmm0-xmm7 into xmm8-xmm15 */ + + "vpunpcklwd %%xmm1, %%xmm0, %%xmm8 \n" + "vpunpcklwd %%xmm3, %%xmm2, %%xmm9 \n" + "vpunpcklwd %%xmm5, %%xmm4, %%xmm10 \n" + "vpunpcklwd %%xmm7, %%xmm6, %%xmm11 \n" + "vpunpckhwd %%xmm1, %%xmm0, %%xmm12 \n" + "vpunpckhwd %%xmm3, %%xmm2, %%xmm13 \n" + "vpunpckhwd %%xmm5, %%xmm4, %%xmm14 \n" + "vpunpckhwd %%xmm7, %%xmm6, %%xmm15 \n" + + "vpunpckldq %%xmm9, %%xmm8, %%xmm0 \n" + "vpunpckldq %%xmm11, %%xmm10, %%xmm1 \n" + "vpunpckhdq %%xmm9, %%xmm8, %%xmm2 \n" + "vpunpckhdq %%xmm11, %%xmm10, %%xmm3 \n" + "vpunpckldq %%xmm13, %%xmm12, %%xmm4 \n" + "vpunpckldq %%xmm15, %%xmm14, %%xmm5 \n" + "vpunpckhdq %%xmm13, %%xmm12, %%xmm6 \n" + "vpunpckhdq %%xmm15, %%xmm14, %%xmm7 \n" + + "vpunpcklqdq %%xmm1, %%xmm0, %%xmm8 \n" + "vpunpckhqdq %%xmm1, %%xmm0, %%xmm9 \n" + "vpunpcklqdq %%xmm3, %%xmm2, %%xmm10 \n" + "vpunpckhqdq %%xmm3, %%xmm2, %%xmm11 \n" + "vpunpcklqdq %%xmm4, %%xmm5, %%xmm12 \n" + "vpunpckhqdq %%xmm5, %%xmm4, %%xmm13 \n" + "vpunpcklqdq %%xmm7, %%xmm6, %%xmm14 \n" + "vpunpckhqdq %%xmm7, %%xmm6, %%xmm15 \n" + + /* Rotate the rows to get the correct final order. + * Rotating xmm12 isn't needed, as we can handle + * the rotation in the PUNPCKLQDQ above. Rotating + * xmm8 isn't needed as it's already in the right order + */ + + "vpalignr $2, %%xmm9, %%xmm9, %%xmm9 \n" + "vpalignr $4, %%xmm10, %%xmm10, %%xmm10 \n" + "vpalignr $6, %%xmm11, %%xmm11, %%xmm11 \n" + "vpalignr $10, %%xmm13, %%xmm13, %%xmm13 \n" + "vpalignr $12, %%xmm14, %%xmm14, %%xmm14 \n" + "vpalignr $14, %%xmm15, %%xmm15, %%xmm15 \n" + + /* Convert from half -> float */ + + "vcvtph2ps %%xmm8, %%ymm8 \n" + "vcvtph2ps %%xmm9, %%ymm9 \n" + "vcvtph2ps %%xmm10, %%ymm10 \n" + "vcvtph2ps %%xmm11, %%ymm11 \n" + "vcvtph2ps %%xmm12, %%ymm12 \n" + "vcvtph2ps %%xmm13, %%ymm13 \n" + "vcvtph2ps %%xmm14, %%ymm14 \n" + "vcvtph2ps %%xmm15, %%ymm15 \n" + + /* Move float values to dst */ + + "vmovaps %%ymm8, (%1) \n" + "vmovaps %%ymm9, 32(%1) \n" + "vmovaps %%ymm10, 64(%1) \n" + "vmovaps %%ymm11, 96(%1) \n" + "vmovaps %%ymm12, 128(%1) \n" + "vmovaps %%ymm13, 160(%1) \n" + "vmovaps %%ymm14, 192(%1) \n" + "vmovaps %%ymm15, 224(%1) \n" + #ifndef __AVX__ + "vzeroupper \n" + #endif /* __AVX__ */ + : /* Output */ + : /* Input */ "r"(src), "r"(dst) + : /* Clobber */ "memory", + #ifndef __AVX__ + "%xmm0", "%xmm1", "%xmm2", "%xmm3", + "%xmm4", "%xmm5", "%xmm6", "%xmm7", + "%xmm8", "%xmm9", "%xmm10", "%xmm11", + "%xmm12", "%xmm13", "%xmm14", "%xmm15" + #else + "%ymm0", "%ymm1", "%ymm2", "%ymm3", + "%ymm4", "%ymm5", "%ymm6", "%ymm7", + "%ymm8", "%ymm9", "%ymm10", "%ymm11", + "%ymm12", "%ymm13", "%ymm14", "%ymm15" + #endif /* __AVX__ */ + ); + + #else + fromHalfZigZag_scalar(src, dst); + #endif /* defined IMF_HAVE_GCC_INLINEASM_64 */ +} + + +// +// Inverse 8x8 DCT, only inverting the DC. This assumes that +// all AC frequencies are 0. +// + +#ifndef IMF_HAVE_SSE2 + +void +dctInverse8x8DcOnly (float *data) +{ + float val = data[0] * 3.535536e-01f * 3.535536e-01f; + + for (int i = 0; i < 64; ++i) + data[i] = val; +} + +#else /* IMF_HAVE_SSE2 */ + +void +dctInverse8x8DcOnly (float *data) +{ + __m128 src = _mm_set1_ps (data[0] * 3.535536e-01f * 3.535536e-01f); + __m128 *dst = (__m128 *)data; + + for (int i = 0; i < 16; ++i) + dst[i] = src; +} + +#endif /* IMF_HAVE_SSE2 */ + + +// +// Full 8x8 Inverse DCT: +// +// Simple inverse DCT on an 8x8 block, with scalar ops only. +// Operates on data in-place. +// +// This is based on the iDCT formuation (y = frequency domain, +// x = spatial domain) +// +// [x0] [ ][y0] [ ][y1] +// [x1] = [ M1 ][y2] + [ M2 ][y3] +// [x2] [ ][y4] [ ][y5] +// [x3] [ ][y6] [ ][y7] +// +// [x7] [ ][y0] [ ][y1] +// [x6] = [ M1 ][y2] - [ M2 ][y3] +// [x5] [ ][y4] [ ][y5] +// [x4] [ ][y6] [ ][y7] +// +// where M1: M2: +// +// [a c a f] [b d e g] +// [a f -a -c] [d -g -b -e] +// [a -f -a c] [e -b g d] +// [a -c a -f] [g -e d -b] +// +// and the constants are as defined below.. +// +// If you know how many of the lower rows are zero, that can +// be passed in to help speed things up. If you don't know, +// just set zeroedRows=0. +// + +// +// Default implementation +// + +template +void +dctInverse8x8_scalar (float *data) +{ + const float a = .5f * cosf (3.14159f / 4.0f); + const float b = .5f * cosf (3.14159f / 16.0f); + const float c = .5f * cosf (3.14159f / 8.0f); + const float d = .5f * cosf (3.f*3.14159f / 16.0f); + const float e = .5f * cosf (5.f*3.14159f / 16.0f); + const float f = .5f * cosf (3.f*3.14159f / 8.0f); + const float g = .5f * cosf (7.f*3.14159f / 16.0f); + + float alpha[4], beta[4], theta[4], gamma[4]; + + float *rowPtr = NULL; + + // + // First pass - row wise. + // + // This looks less-compact than the description above in + // an attempt to fold together common sub-expressions. + // + + for (int row = 0; row < 8 - zeroedRows; ++row) + { + rowPtr = data + row * 8; + + alpha[0] = c * rowPtr[2]; + alpha[1] = f * rowPtr[2]; + alpha[2] = c * rowPtr[6]; + alpha[3] = f * rowPtr[6]; + + beta[0] = b * rowPtr[1] + d * rowPtr[3] + e * rowPtr[5] + g * rowPtr[7]; + beta[1] = d * rowPtr[1] - g * rowPtr[3] - b * rowPtr[5] - e * rowPtr[7]; + beta[2] = e * rowPtr[1] - b * rowPtr[3] + g * rowPtr[5] + d * rowPtr[7]; + beta[3] = g * rowPtr[1] - e * rowPtr[3] + d * rowPtr[5] - b * rowPtr[7]; + + theta[0] = a * (rowPtr[0] + rowPtr[4]); + theta[3] = a * (rowPtr[0] - rowPtr[4]); + + theta[1] = alpha[0] + alpha[3]; + theta[2] = alpha[1] - alpha[2]; + + + gamma[0] = theta[0] + theta[1]; + gamma[1] = theta[3] + theta[2]; + gamma[2] = theta[3] - theta[2]; + gamma[3] = theta[0] - theta[1]; + + + rowPtr[0] = gamma[0] + beta[0]; + rowPtr[1] = gamma[1] + beta[1]; + rowPtr[2] = gamma[2] + beta[2]; + rowPtr[3] = gamma[3] + beta[3]; + + rowPtr[4] = gamma[3] - beta[3]; + rowPtr[5] = gamma[2] - beta[2]; + rowPtr[6] = gamma[1] - beta[1]; + rowPtr[7] = gamma[0] - beta[0]; + } + + // + // Second pass - column wise. + // + + for (int column = 0; column < 8; ++column) + { + alpha[0] = c * data[16+column]; + alpha[1] = f * data[16+column]; + alpha[2] = c * data[48+column]; + alpha[3] = f * data[48+column]; + + beta[0] = b * data[8+column] + d * data[24+column] + + e * data[40+column] + g * data[56+column]; + + beta[1] = d * data[8+column] - g * data[24+column] - + b * data[40+column] - e * data[56+column]; + + beta[2] = e * data[8+column] - b * data[24+column] + + g * data[40+column] + d * data[56+column]; + + beta[3] = g * data[8+column] - e * data[24+column] + + d * data[40+column] - b * data[56+column]; + + theta[0] = a * (data[column] + data[32+column]); + theta[3] = a * (data[column] - data[32+column]); + + theta[1] = alpha[0] + alpha[3]; + theta[2] = alpha[1] - alpha[2]; + + gamma[0] = theta[0] + theta[1]; + gamma[1] = theta[3] + theta[2]; + gamma[2] = theta[3] - theta[2]; + gamma[3] = theta[0] - theta[1]; + + data[ column] = gamma[0] + beta[0]; + data[ 8 + column] = gamma[1] + beta[1]; + data[16 + column] = gamma[2] + beta[2]; + data[24 + column] = gamma[3] + beta[3]; + + data[32 + column] = gamma[3] - beta[3]; + data[40 + column] = gamma[2] - beta[2]; + data[48 + column] = gamma[1] - beta[1]; + data[56 + column] = gamma[0] - beta[0]; + } +} + + +// +// SSE2 Implementation +// + +template +void +dctInverse8x8_sse2 (float *data) +{ + #ifdef IMF_HAVE_SSE2 + __m128 a = {3.535536e-01f,3.535536e-01f,3.535536e-01f,3.535536e-01f}; + __m128 b = {4.903927e-01f,4.903927e-01f,4.903927e-01f,4.903927e-01f}; + __m128 c = {4.619398e-01f,4.619398e-01f,4.619398e-01f,4.619398e-01f}; + __m128 d = {4.157349e-01f,4.157349e-01f,4.157349e-01f,4.157349e-01f}; + __m128 e = {2.777855e-01f,2.777855e-01f,2.777855e-01f,2.777855e-01f}; + __m128 f = {1.913422e-01f,1.913422e-01f,1.913422e-01f,1.913422e-01f}; + __m128 g = {9.754573e-02f,9.754573e-02f,9.754573e-02f,9.754573e-02f}; + + __m128 c0 = {3.535536e-01f, 3.535536e-01f, 3.535536e-01f, 3.535536e-01f}; + __m128 c1 = {4.619398e-01f, 1.913422e-01f,-1.913422e-01f,-4.619398e-01f}; + __m128 c2 = {3.535536e-01f,-3.535536e-01f,-3.535536e-01f, 3.535536e-01f}; + __m128 c3 = {1.913422e-01f,-4.619398e-01f, 4.619398e-01f,-1.913422e-01f}; + + __m128 c4 = {4.903927e-01f, 4.157349e-01f, 2.777855e-01f, 9.754573e-02f}; + __m128 c5 = {4.157349e-01f,-9.754573e-02f,-4.903927e-01f,-2.777855e-01f}; + __m128 c6 = {2.777855e-01f,-4.903927e-01f, 9.754573e-02f, 4.157349e-01f}; + __m128 c7 = {9.754573e-02f,-2.777855e-01f, 4.157349e-01f,-4.903927e-01f}; + + __m128 *srcVec = (__m128 *)data; + __m128 x[8], evenSum, oddSum; + __m128 in[8], alpha[4], beta[4], theta[4], gamma[4]; + + // + // Rows - + // + // Treat this just like matrix-vector multiplication. The + // trick is to note that: + // + // [M00 M01 M02 M03][v0] [(v0 M00) + (v1 M01) + (v2 M02) + (v3 M03)] + // [M10 M11 M12 M13][v1] = [(v0 M10) + (v1 M11) + (v2 M12) + (v3 M13)] + // [M20 M21 M22 M23][v2] [(v0 M20) + (v1 M21) + (v2 M22) + (v3 M23)] + // [M30 M31 M32 M33][v3] [(v0 M30) + (v1 M31) + (v2 M32) + (v3 M33)] + // + // Then, we can fill a register with v_i and multiply by the i-th column + // of M, accumulating across all i-s. + // + // The kids refer to the populating of a register with a single value + // "broadcasting", and it can be done with a shuffle instruction. It + // seems to be the slowest part of the whole ordeal. + // + // Our matrix columns are stored above in c0-c7. c0-3 make up M1, and + // c4-7 are from M2. + // + + #define DCT_INVERSE_8x8_SS2_ROW_LOOP(i) \ + /* \ + * Broadcast the components of the row \ + */ \ + \ + x[0] = _mm_shuffle_ps (srcVec[2 * i], \ + srcVec[2 * i], \ + _MM_SHUFFLE (0, 0, 0, 0)); \ + \ + x[1] = _mm_shuffle_ps (srcVec[2 * i], \ + srcVec[2 * i], \ + _MM_SHUFFLE (1, 1, 1, 1)); \ + \ + x[2] = _mm_shuffle_ps (srcVec[2 * i], \ + srcVec[2 * i], \ + _MM_SHUFFLE (2, 2, 2, 2)); \ + \ + x[3] = _mm_shuffle_ps (srcVec[2 * i], \ + srcVec[2 * i], \ + _MM_SHUFFLE (3, 3, 3, 3)); \ + \ + x[4] = _mm_shuffle_ps (srcVec[2 * i + 1], \ + srcVec[2 * i + 1], \ + _MM_SHUFFLE (0, 0, 0, 0)); \ + \ + x[5] = _mm_shuffle_ps (srcVec[2 * i + 1], \ + srcVec[2 * i + 1], \ + _MM_SHUFFLE (1, 1, 1, 1)); \ + \ + x[6] = _mm_shuffle_ps (srcVec[2 * i + 1], \ + srcVec[2 * i + 1], \ + _MM_SHUFFLE (2, 2, 2, 2)); \ + \ + x[7] = _mm_shuffle_ps (srcVec[2 * i + 1], \ + srcVec[2 * i + 1], \ + _MM_SHUFFLE (3, 3, 3, 3)); \ + /* \ + * Multiply the components by each column of the matrix \ + */ \ + \ + x[0] = _mm_mul_ps (x[0], c0); \ + x[2] = _mm_mul_ps (x[2], c1); \ + x[4] = _mm_mul_ps (x[4], c2); \ + x[6] = _mm_mul_ps (x[6], c3); \ + \ + x[1] = _mm_mul_ps (x[1], c4); \ + x[3] = _mm_mul_ps (x[3], c5); \ + x[5] = _mm_mul_ps (x[5], c6); \ + x[7] = _mm_mul_ps (x[7], c7); \ + \ + /* \ + * Add across \ + */ \ + \ + evenSum = _mm_setzero_ps(); \ + evenSum = _mm_add_ps (evenSum, x[0]); \ + evenSum = _mm_add_ps (evenSum, x[2]); \ + evenSum = _mm_add_ps (evenSum, x[4]); \ + evenSum = _mm_add_ps (evenSum, x[6]); \ + \ + oddSum = _mm_setzero_ps(); \ + oddSum = _mm_add_ps (oddSum, x[1]); \ + oddSum = _mm_add_ps (oddSum, x[3]); \ + oddSum = _mm_add_ps (oddSum, x[5]); \ + oddSum = _mm_add_ps (oddSum, x[7]); \ + \ + /* \ + * Final Sum: \ + * out [0, 1, 2, 3] = evenSum + oddSum \ + * out [7, 6, 5, 4] = evenSum - oddSum \ + */ \ + \ + srcVec[2 * i] = _mm_add_ps (evenSum, oddSum); \ + srcVec[2 * i + 1] = _mm_sub_ps (evenSum, oddSum); \ + srcVec[2 * i + 1] = _mm_shuffle_ps (srcVec[2 * i + 1], \ + srcVec[2 * i + 1], \ + _MM_SHUFFLE (0, 1, 2, 3)); + + switch (zeroedRows) + { + case 0: + default: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + DCT_INVERSE_8x8_SS2_ROW_LOOP (3) + DCT_INVERSE_8x8_SS2_ROW_LOOP (4) + DCT_INVERSE_8x8_SS2_ROW_LOOP (5) + DCT_INVERSE_8x8_SS2_ROW_LOOP (6) + DCT_INVERSE_8x8_SS2_ROW_LOOP (7) + break; + + case 1: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + DCT_INVERSE_8x8_SS2_ROW_LOOP (3) + DCT_INVERSE_8x8_SS2_ROW_LOOP (4) + DCT_INVERSE_8x8_SS2_ROW_LOOP (5) + DCT_INVERSE_8x8_SS2_ROW_LOOP (6) + break; + + case 2: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + DCT_INVERSE_8x8_SS2_ROW_LOOP (3) + DCT_INVERSE_8x8_SS2_ROW_LOOP (4) + DCT_INVERSE_8x8_SS2_ROW_LOOP (5) + break; + + case 3: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + DCT_INVERSE_8x8_SS2_ROW_LOOP (3) + DCT_INVERSE_8x8_SS2_ROW_LOOP (4) + break; + + case 4: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + DCT_INVERSE_8x8_SS2_ROW_LOOP (3) + break; + + case 5: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + DCT_INVERSE_8x8_SS2_ROW_LOOP (2) + break; + + case 6: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + DCT_INVERSE_8x8_SS2_ROW_LOOP (1) + break; + + case 7: + DCT_INVERSE_8x8_SS2_ROW_LOOP (0) + break; + } + + // + // Columns - + // + // This is slightly more straightforward, if less readable. Here + // we just operate on 4 columns at a time, in two batches. + // + // The slight mess is to try and cache sub-expressions, which + // we ignore in the row-wise pass. + // + + for (int col = 0; col < 2; ++col) + { + + for (int i = 0; i < 8; ++i) + in[i] = srcVec[2 * i + col]; + + alpha[0] = _mm_mul_ps (c, in[2]); + alpha[1] = _mm_mul_ps (f, in[2]); + alpha[2] = _mm_mul_ps (c, in[6]); + alpha[3] = _mm_mul_ps (f, in[6]); + + beta[0] = _mm_add_ps (_mm_add_ps (_mm_mul_ps (in[1], b), + _mm_mul_ps (in[3], d)), + _mm_add_ps (_mm_mul_ps (in[5], e), + _mm_mul_ps (in[7], g))); + + beta[1] = _mm_sub_ps (_mm_sub_ps (_mm_mul_ps (in[1], d), + _mm_mul_ps (in[3], g)), + _mm_add_ps (_mm_mul_ps (in[5], b), + _mm_mul_ps (in[7], e))); + + beta[2] = _mm_add_ps (_mm_sub_ps (_mm_mul_ps (in[1], e), + _mm_mul_ps (in[3], b)), + _mm_add_ps (_mm_mul_ps (in[5], g), + _mm_mul_ps (in[7], d))); + + beta[3] = _mm_add_ps (_mm_sub_ps (_mm_mul_ps (in[1], g), + _mm_mul_ps (in[3], e)), + _mm_sub_ps (_mm_mul_ps (in[5], d), + _mm_mul_ps (in[7], b))); + + theta[0] = _mm_mul_ps (a, _mm_add_ps (in[0], in[4])); + theta[3] = _mm_mul_ps (a, _mm_sub_ps (in[0], in[4])); + + theta[1] = _mm_add_ps (alpha[0], alpha[3]); + theta[2] = _mm_sub_ps (alpha[1], alpha[2]); + + gamma[0] = _mm_add_ps (theta[0], theta[1]); + gamma[1] = _mm_add_ps (theta[3], theta[2]); + gamma[2] = _mm_sub_ps (theta[3], theta[2]); + gamma[3] = _mm_sub_ps (theta[0], theta[1]); + + srcVec[ col] = _mm_add_ps (gamma[0], beta[0]); + srcVec[2+col] = _mm_add_ps (gamma[1], beta[1]); + srcVec[4+col] = _mm_add_ps (gamma[2], beta[2]); + srcVec[6+col] = _mm_add_ps (gamma[3], beta[3]); + + srcVec[ 8+col] = _mm_sub_ps (gamma[3], beta[3]); + srcVec[10+col] = _mm_sub_ps (gamma[2], beta[2]); + srcVec[12+col] = _mm_sub_ps (gamma[1], beta[1]); + srcVec[14+col] = _mm_sub_ps (gamma[0], beta[0]); + } + + #else /* IMF_HAVE_SSE2 */ + + dctInverse8x8_scalar (data); + + #endif /* IMF_HAVE_SSE2 */ +} + + +// +// AVX Implementation +// + +#define STR(A) #A + +#define IDCT_AVX_SETUP_2_ROWS(_DST0, _DST1, _TMP0, _TMP1, \ + _OFF00, _OFF01, _OFF10, _OFF11) \ + "vmovaps " STR(_OFF00) "(%0), %%xmm" STR(_TMP0) " \n" \ + "vmovaps " STR(_OFF01) "(%0), %%xmm" STR(_TMP1) " \n" \ + " \n" \ + "vinsertf128 $1, " STR(_OFF10) "(%0), %%ymm" STR(_TMP0) ", %%ymm" STR(_TMP0) " \n" \ + "vinsertf128 $1, " STR(_OFF11) "(%0), %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP1) " \n" \ + " \n" \ + "vunpcklpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST0) " \n" \ + "vunpckhpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST1) " \n" \ + " \n" \ + "vunpcklps %%ymm" STR(_DST1) ", %%ymm" STR(_DST0) ", %%ymm" STR(_TMP0) " \n" \ + "vunpckhps %%ymm" STR(_DST1) ", %%ymm" STR(_DST0) ", %%ymm" STR(_TMP1) " \n" \ + " \n" \ + "vunpcklpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST0) " \n" \ + "vunpckhpd %%ymm" STR(_TMP1) ", %%ymm" STR(_TMP0) ", %%ymm" STR(_DST1) " \n" + +#define IDCT_AVX_MMULT_ROWS(_SRC) \ + /* Broadcast the source values into y12-y15 */ \ + "vpermilps $0x00, " STR(_SRC) ", %%ymm12 \n" \ + "vpermilps $0x55, " STR(_SRC) ", %%ymm13 \n" \ + "vpermilps $0xaa, " STR(_SRC) ", %%ymm14 \n" \ + "vpermilps $0xff, " STR(_SRC) ", %%ymm15 \n" \ + \ + /* Multiple coefs and the broadcasted values */ \ + "vmulps %%ymm12, %%ymm8, %%ymm12 \n" \ + "vmulps %%ymm13, %%ymm9, %%ymm13 \n" \ + "vmulps %%ymm14, %%ymm10, %%ymm14 \n" \ + "vmulps %%ymm15, %%ymm11, %%ymm15 \n" \ + \ + /* Accumulate the result back into the source */ \ + "vaddps %%ymm13, %%ymm12, %%ymm12 \n" \ + "vaddps %%ymm15, %%ymm14, %%ymm14 \n" \ + "vaddps %%ymm14, %%ymm12, " STR(_SRC) "\n" + +#define IDCT_AVX_EO_TO_ROW_HALVES(_EVEN, _ODD, _FRONT, _BACK) \ + "vsubps " STR(_ODD) "," STR(_EVEN) "," STR(_BACK) "\n" \ + "vaddps " STR(_ODD) "," STR(_EVEN) "," STR(_FRONT) "\n" \ + /* Reverse the back half */ \ + "vpermilps $0x1b," STR(_BACK) "," STR(_BACK) "\n" + +/* In order to allow for path paths when we know certain rows + * of the 8x8 block are zero, most of the body of the DCT is + * in the following macro. Statements are wrapped in a ROWn() + * macro, where n is the lowest row in the 8x8 block in which + * they depend. + * + * This should work for the cases where we have 2-8 full rows. + * the 1-row case is special, and we'll handle it seperately. + */ +#define IDCT_AVX_BODY \ + /* ============================================== + * Row 1D DCT + * ---------------------------------------------- + */ \ + \ + /* Setup for the row-oriented 1D DCT. Assuming that (%0) holds + * the row-major 8x8 block, load ymm0-3 with the even columns + * and ymm4-7 with the odd columns. The lower half of the ymm + * holds one row, while the upper half holds the next row. + * + * If our source is: + * a0 a1 a2 a3 a4 a5 a6 a7 + * b0 b1 b2 b3 b4 b5 b6 b7 + * + * We'll be forming: + * a0 a2 a4 a6 b0 b2 b4 b6 + * a1 a3 a5 a7 b1 b3 b5 b7 + */ \ + ROW0( IDCT_AVX_SETUP_2_ROWS(0, 4, 14, 15, 0, 16, 32, 48) ) \ + ROW2( IDCT_AVX_SETUP_2_ROWS(1, 5, 12, 13, 64, 80, 96, 112) ) \ + ROW4( IDCT_AVX_SETUP_2_ROWS(2, 6, 10, 11, 128, 144, 160, 176) ) \ + ROW6( IDCT_AVX_SETUP_2_ROWS(3, 7, 8, 9, 192, 208, 224, 240) ) \ + \ + /* Multiple the even columns (ymm0-3) by the matrix M1 + * storing the results back in ymm0-3 + * + * Assume that (%1) holds the matrix in column major order + */ \ + "vbroadcastf128 (%1), %%ymm8 \n" \ + "vbroadcastf128 16(%1), %%ymm9 \n" \ + "vbroadcastf128 32(%1), %%ymm10 \n" \ + "vbroadcastf128 48(%1), %%ymm11 \n" \ + \ + ROW0( IDCT_AVX_MMULT_ROWS(%%ymm0) ) \ + ROW2( IDCT_AVX_MMULT_ROWS(%%ymm1) ) \ + ROW4( IDCT_AVX_MMULT_ROWS(%%ymm2) ) \ + ROW6( IDCT_AVX_MMULT_ROWS(%%ymm3) ) \ + \ + /* Repeat, but with the odd columns (ymm4-7) and the + * matrix M2 + */ \ + "vbroadcastf128 64(%1), %%ymm8 \n" \ + "vbroadcastf128 80(%1), %%ymm9 \n" \ + "vbroadcastf128 96(%1), %%ymm10 \n" \ + "vbroadcastf128 112(%1), %%ymm11 \n" \ + \ + ROW0( IDCT_AVX_MMULT_ROWS(%%ymm4) ) \ + ROW2( IDCT_AVX_MMULT_ROWS(%%ymm5) ) \ + ROW4( IDCT_AVX_MMULT_ROWS(%%ymm6) ) \ + ROW6( IDCT_AVX_MMULT_ROWS(%%ymm7) ) \ + \ + /* Sum the M1 (ymm0-3) and M2 (ymm4-7) results to get the + * front halves of the results, and difference to get the + * back halves. The front halfs end up in ymm0-3, the back + * halves end up in ymm12-15. + */ \ + ROW0( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm0, %%ymm4, %%ymm0, %%ymm12) ) \ + ROW2( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm1, %%ymm5, %%ymm1, %%ymm13) ) \ + ROW4( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm2, %%ymm6, %%ymm2, %%ymm14) ) \ + ROW6( IDCT_AVX_EO_TO_ROW_HALVES(%%ymm3, %%ymm7, %%ymm3, %%ymm15) ) \ + \ + /* Reassemble the rows halves into ymm0-7 */ \ + ROW7( "vperm2f128 $0x13, %%ymm3, %%ymm15, %%ymm7 \n" ) \ + ROW6( "vperm2f128 $0x02, %%ymm3, %%ymm15, %%ymm6 \n" ) \ + ROW5( "vperm2f128 $0x13, %%ymm2, %%ymm14, %%ymm5 \n" ) \ + ROW4( "vperm2f128 $0x02, %%ymm2, %%ymm14, %%ymm4 \n" ) \ + ROW3( "vperm2f128 $0x13, %%ymm1, %%ymm13, %%ymm3 \n" ) \ + ROW2( "vperm2f128 $0x02, %%ymm1, %%ymm13, %%ymm2 \n" ) \ + ROW1( "vperm2f128 $0x13, %%ymm0, %%ymm12, %%ymm1 \n" ) \ + ROW0( "vperm2f128 $0x02, %%ymm0, %%ymm12, %%ymm0 \n" ) \ + \ + \ + /* ============================================== + * Column 1D DCT + * ---------------------------------------------- + */ \ + \ + /* Rows should be in ymm0-7, and M2 columns should still be + * preserved in ymm8-11. M2 has 4 unique values (and +- + * versions of each), and all (positive) values appear in + * the first column (and row), which is in ymm8. + * + * For the column-wise DCT, we need to: + * 1) Broadcast each element a row of M2 into 4 vectors + * 2) Multiple the odd rows (ymm1,3,5,7) by the broadcasts. + * 3) Accumulate into ymm12-15 for the odd outputs. + * + * Instead of doing 16 broadcasts for each element in M2, + * do 4, filling y8-11 with: + * + * ymm8: [ b b b b | b b b b ] + * ymm9: [ d d d d | d d d d ] + * ymm10: [ e e e e | e e e e ] + * ymm11: [ g g g g | g g g g ] + * + * And deal with the negative values by subtracting during accum. + */ \ + "vpermilps $0xff, %%ymm8, %%ymm11 \n" \ + "vpermilps $0xaa, %%ymm8, %%ymm10 \n" \ + "vpermilps $0x55, %%ymm8, %%ymm9 \n" \ + "vpermilps $0x00, %%ymm8, %%ymm8 \n" \ + \ + /* This one is easy, since we have ymm12-15 open for scratch + * ymm12 = b ymm1 + d ymm3 + e ymm5 + g ymm7 + */ \ + ROW1( "vmulps %%ymm1, %%ymm8, %%ymm12 \n" ) \ + ROW3( "vmulps %%ymm3, %%ymm9, %%ymm13 \n" ) \ + ROW5( "vmulps %%ymm5, %%ymm10, %%ymm14 \n" ) \ + ROW7( "vmulps %%ymm7, %%ymm11, %%ymm15 \n" ) \ + \ + ROW3( "vaddps %%ymm12, %%ymm13, %%ymm12 \n" ) \ + ROW7( "vaddps %%ymm14, %%ymm15, %%ymm14 \n" ) \ + ROW5( "vaddps %%ymm12, %%ymm14, %%ymm12 \n" ) \ + \ + /* Tricker, since only y13-15 are open for scratch + * ymm13 = d ymm1 - g ymm3 - b ymm5 - e ymm7 + */ \ + ROW1( "vmulps %%ymm1, %%ymm9, %%ymm13 \n" ) \ + ROW3( "vmulps %%ymm3, %%ymm11, %%ymm14 \n" ) \ + ROW5( "vmulps %%ymm5, %%ymm8, %%ymm15 \n" ) \ + \ + ROW5( "vaddps %%ymm14, %%ymm15, %%ymm14 \n" ) \ + ROW3( "vsubps %%ymm14, %%ymm13, %%ymm13 \n" ) \ + \ + ROW7( "vmulps %%ymm7, %%ymm10, %%ymm15 \n" ) \ + ROW7( "vsubps %%ymm15, %%ymm13, %%ymm13 \n" ) \ + \ + /* Tricker still, as only y14-15 are open for scratch + * ymm14 = e ymm1 - b ymm3 + g ymm5 + d ymm7 + */ \ + ROW1( "vmulps %%ymm1, %%ymm10, %%ymm14 \n" ) \ + ROW3( "vmulps %%ymm3, %%ymm8, %%ymm15 \n" ) \ + \ + ROW3( "vsubps %%ymm15, %%ymm14, %%ymm14 \n" ) \ + \ + ROW5( "vmulps %%ymm5, %%ymm11, %%ymm15 \n" ) \ + ROW5( "vaddps %%ymm15, %%ymm14, %%ymm14 \n" ) \ + \ + ROW7( "vmulps %%ymm7, %%ymm9, %%ymm15 \n" ) \ + ROW7( "vaddps %%ymm15, %%ymm14, %%ymm14 \n" ) \ + \ + \ + /* Easy, as we can blow away ymm1,3,5,7 for scratch + * ymm15 = g ymm1 - e ymm3 + d ymm5 - b ymm7 + */ \ + ROW1( "vmulps %%ymm1, %%ymm11, %%ymm15 \n" ) \ + ROW3( "vmulps %%ymm3, %%ymm10, %%ymm3 \n" ) \ + ROW5( "vmulps %%ymm5, %%ymm9, %%ymm5 \n" ) \ + ROW7( "vmulps %%ymm7, %%ymm8, %%ymm7 \n" ) \ + \ + ROW5( "vaddps %%ymm15, %%ymm5, %%ymm15 \n" ) \ + ROW7( "vaddps %%ymm3, %%ymm7, %%ymm3 \n" ) \ + ROW3( "vsubps %%ymm3, %%ymm15, %%ymm15 \n" ) \ + \ + \ + /* Load coefs for M1. Because we're going to broadcast + * coefs, we don't need to load the actual structure from + * M1. Instead, just load enough that we can broadcast. + * There are only 6 unique values in M1, but they're in +- + * pairs, leaving only 3 unique coefs if we add and subtract + * properly. + * + * Fill ymm1 with coef[2] = [ a a c f | a a c f ] + * Broadcast ymm5 with [ f f f f | f f f f ] + * Broadcast ymm3 with [ c c c c | c c c c ] + * Broadcast ymm1 with [ a a a a | a a a a ] + */ \ + "vbroadcastf128 8(%1), %%ymm1 \n" \ + "vpermilps $0xff, %%ymm1, %%ymm5 \n" \ + "vpermilps $0xaa, %%ymm1, %%ymm3 \n" \ + "vpermilps $0x00, %%ymm1, %%ymm1 \n" \ + \ + /* If we expand E = [M1] [x0 x2 x4 x6]^t, we get the following + * common expressions: + * + * E_0 = ymm8 = (a ymm0 + a ymm4) + (c ymm2 + f ymm6) + * E_3 = ymm11 = (a ymm0 + a ymm4) - (c ymm2 + f ymm6) + * + * E_1 = ymm9 = (a ymm0 - a ymm4) + (f ymm2 - c ymm6) + * E_2 = ymm10 = (a ymm0 - a ymm4) - (f ymm2 - c ymm6) + * + * Afterwards, ymm8-11 will hold the even outputs. + */ \ + \ + /* ymm11 = (a ymm0 + a ymm4), ymm1 = (a ymm0 - a ymm4) */ \ + ROW0( "vmulps %%ymm1, %%ymm0, %%ymm11 \n" ) \ + ROW4( "vmulps %%ymm1, %%ymm4, %%ymm4 \n" ) \ + ROW0( "vmovaps %%ymm11, %%ymm1 \n" ) \ + ROW4( "vaddps %%ymm4, %%ymm11, %%ymm11 \n" ) \ + ROW4( "vsubps %%ymm4, %%ymm1, %%ymm1 \n" ) \ + \ + /* ymm7 = (c ymm2 + f ymm6) */ \ + ROW2( "vmulps %%ymm3, %%ymm2, %%ymm7 \n" ) \ + ROW6( "vmulps %%ymm5, %%ymm6, %%ymm9 \n" ) \ + ROW6( "vaddps %%ymm9, %%ymm7, %%ymm7 \n" ) \ + \ + /* E_0 = ymm8 = (a ymm0 + a ymm4) + (c ymm2 + f ymm6) + * E_3 = ymm11 = (a ymm0 + a ymm4) - (c ymm2 + f ymm6) + */ \ + ROW0( "vmovaps %%ymm11, %%ymm8 \n" ) \ + ROW2( "vaddps %%ymm7, %%ymm8, %%ymm8 \n" ) \ + ROW2( "vsubps %%ymm7, %%ymm11, %%ymm11 \n" ) \ + \ + /* ymm7 = (f ymm2 - c ymm6) */ \ + ROW2( "vmulps %%ymm5, %%ymm2, %%ymm7 \n" ) \ + ROW6( "vmulps %%ymm3, %%ymm6, %%ymm9 \n" ) \ + ROW6( "vsubps %%ymm9, %%ymm7, %%ymm7 \n" ) \ + \ + /* E_1 = ymm9 = (a ymm0 - a ymm4) + (f ymm2 - c ymm6) + * E_2 = ymm10 = (a ymm0 - a ymm4) - (f ymm2 - c ymm6) + */ \ + ROW0( "vmovaps %%ymm1, %%ymm9 \n" ) \ + ROW0( "vmovaps %%ymm1, %%ymm10 \n" ) \ + ROW2( "vaddps %%ymm7, %%ymm1, %%ymm9 \n" ) \ + ROW2( "vsubps %%ymm7, %%ymm1, %%ymm10 \n" ) \ + \ + /* Add the even (ymm8-11) and the odds (ymm12-15), + * placing the results into ymm0-7 + */ \ + "vaddps %%ymm12, %%ymm8, %%ymm0 \n" \ + "vaddps %%ymm13, %%ymm9, %%ymm1 \n" \ + "vaddps %%ymm14, %%ymm10, %%ymm2 \n" \ + "vaddps %%ymm15, %%ymm11, %%ymm3 \n" \ + \ + "vsubps %%ymm12, %%ymm8, %%ymm7 \n" \ + "vsubps %%ymm13, %%ymm9, %%ymm6 \n" \ + "vsubps %%ymm14, %%ymm10, %%ymm5 \n" \ + "vsubps %%ymm15, %%ymm11, %%ymm4 \n" \ + \ + /* Copy out the results from ymm0-7 */ \ + "vmovaps %%ymm0, (%0) \n" \ + "vmovaps %%ymm1, 32(%0) \n" \ + "vmovaps %%ymm2, 64(%0) \n" \ + "vmovaps %%ymm3, 96(%0) \n" \ + "vmovaps %%ymm4, 128(%0) \n" \ + "vmovaps %%ymm5, 160(%0) \n" \ + "vmovaps %%ymm6, 192(%0) \n" \ + "vmovaps %%ymm7, 224(%0) \n" + +/* Output, input, and clobber (OIC) sections of the inline asm */ +#define IDCT_AVX_OIC(_IN0) \ + : /* Output */ \ + : /* Input */ "r"(_IN0), "r"(sAvxCoef) \ + : /* Clobber */ "memory", \ + "%xmm0", "%xmm1", "%xmm2", "%xmm3", \ + "%xmm4", "%xmm5", "%xmm6", "%xmm7", \ + "%xmm8", "%xmm9", "%xmm10", "%xmm11",\ + "%xmm12", "%xmm13", "%xmm14", "%xmm15" + +/* Include vzeroupper for non-AVX builds */ +#ifndef __AVX__ + #define IDCT_AVX_ASM(_IN0) \ + __asm__( \ + IDCT_AVX_BODY \ + "vzeroupper \n" \ + IDCT_AVX_OIC(_IN0) \ + ); +#else /* __AVX__ */ + #define IDCT_AVX_ASM(_IN0) \ + __asm__( \ + IDCT_AVX_BODY \ + IDCT_AVX_OIC(_IN0) \ + ); +#endif /* __AVX__ */ + +template +void +dctInverse8x8_avx (float *data) +{ + #if defined IMF_HAVE_GCC_INLINEASM_64 + + /* The column-major version of M1, followed by the + * column-major version of M2: + * + * [ a c a f ] [ b d e g ] + * M1 = [ a f -a -c ] M2 = [ d -g -b -e ] + * [ a -f -a c ] [ e -b g d ] + * [ a -c a -f ] [ g -e d -b ] + */ + const float sAvxCoef[32] __attribute__((aligned(32))) = { + 3.535536e-01, 3.535536e-01, 3.535536e-01, 3.535536e-01, /* a a a a */ + 4.619398e-01, 1.913422e-01, -1.913422e-01, -4.619398e-01, /* c f -f -c */ + 3.535536e-01, -3.535536e-01, -3.535536e-01, 3.535536e-01, /* a -a -a a */ + 1.913422e-01, -4.619398e-01, 4.619398e-01, -1.913422e-01, /* f -c c -f */ + + 4.903927e-01, 4.157349e-01, 2.777855e-01, 9.754573e-02, /* b d e g */ + 4.157349e-01, -9.754573e-02, -4.903927e-01, -2.777855e-01, /* d -g -b -e */ + 2.777855e-01, -4.903927e-01, 9.754573e-02, 4.157349e-01, /* e -b g d */ + 9.754573e-02, -2.777855e-01, 4.157349e-01, -4.903927e-01 /* g -e d -b */ + }; + + #define ROW0(_X) _X + #define ROW1(_X) _X + #define ROW2(_X) _X + #define ROW3(_X) _X + #define ROW4(_X) _X + #define ROW5(_X) _X + #define ROW6(_X) _X + #define ROW7(_X) _X + + if (zeroedRows == 0) { + + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 1) { + + #undef ROW7 + #define ROW7(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 2) { + + #undef ROW6 + #define ROW6(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 3) { + + #undef ROW5 + #define ROW5(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 4) { + + #undef ROW4 + #define ROW4(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 5) { + + #undef ROW3 + #define ROW3(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 6) { + + #undef ROW2 + #define ROW2(_X) + IDCT_AVX_ASM(data) + + } else if (zeroedRows == 7) { + + __asm__( + + /* ============================================== + * Row 1D DCT + * ---------------------------------------------- + */ + IDCT_AVX_SETUP_2_ROWS(0, 4, 14, 15, 0, 16, 32, 48) + + "vbroadcastf128 (%1), %%ymm8 \n" + "vbroadcastf128 16(%1), %%ymm9 \n" + "vbroadcastf128 32(%1), %%ymm10 \n" + "vbroadcastf128 48(%1), %%ymm11 \n" + + /* Stash a vector of [a a a a | a a a a] away in ymm2 */ + "vinsertf128 $1, %%xmm8, %%ymm8, %%ymm2 \n" + + IDCT_AVX_MMULT_ROWS(%%ymm0) + + "vbroadcastf128 64(%1), %%ymm8 \n" + "vbroadcastf128 80(%1), %%ymm9 \n" + "vbroadcastf128 96(%1), %%ymm10 \n" + "vbroadcastf128 112(%1), %%ymm11 \n" + + IDCT_AVX_MMULT_ROWS(%%ymm4) + + IDCT_AVX_EO_TO_ROW_HALVES(%%ymm0, %%ymm4, %%ymm0, %%ymm12) + + "vperm2f128 $0x02, %%ymm0, %%ymm12, %%ymm0 \n" + + /* ============================================== + * Column 1D DCT + * ---------------------------------------------- + */ + + /* DC only, so multiple by a and we're done */ + "vmulps %%ymm2, %%ymm0, %%ymm0 \n" + + /* Copy out results */ + "vmovaps %%ymm0, (%0) \n" + "vmovaps %%ymm0, 32(%0) \n" + "vmovaps %%ymm0, 64(%0) \n" + "vmovaps %%ymm0, 96(%0) \n" + "vmovaps %%ymm0, 128(%0) \n" + "vmovaps %%ymm0, 160(%0) \n" + "vmovaps %%ymm0, 192(%0) \n" + "vmovaps %%ymm0, 224(%0) \n" + + #ifndef __AVX__ + "vzeroupper \n" + #endif /* __AVX__ */ + IDCT_AVX_OIC(data) + ); + } else { + assert(false); // Invalid template instance parameter + } + #else /* IMF_HAVE_GCC_INLINEASM_64 */ + + dctInverse8x8_scalar(data); + + #endif /* IMF_HAVE_GCC_INLINEASM_64 */ +} + + +// +// Full 8x8 Forward DCT: +// +// Base forward 8x8 DCT implementation. Works on the data in-place +// +// The implementation describedin Pennebaker + Mitchell, +// section 4.3.2, and illustrated in figure 4-7 +// +// The basic idea is that the 1D DCT math reduces to: +// +// 2*out_0 = c_4 [(s_07 + s_34) + (s_12 + s_56)] +// 2*out_4 = c_4 [(s_07 + s_34) - (s_12 + s_56)] +// +// {2*out_2, 2*out_6} = rot_6 ((d_12 - d_56), (s_07 - s_34)) +// +// {2*out_3, 2*out_5} = rot_-3 (d_07 - c_4 (s_12 - s_56), +// d_34 - c_4 (d_12 + d_56)) +// +// {2*out_1, 2*out_7} = rot_-1 (d_07 + c_4 (s_12 - s_56), +// -d_34 - c_4 (d_12 + d_56)) +// +// where: +// +// c_i = cos(i*pi/16) +// s_i = sin(i*pi/16) +// +// s_ij = in_i + in_j +// d_ij = in_i - in_j +// +// rot_i(x, y) = {c_i*x + s_i*y, -s_i*x + c_i*y} +// +// We'll run the DCT in two passes. First, run the 1D DCT on +// the rows, in-place. Then, run over the columns in-place, +// and be done with it. +// + +#ifndef IMF_HAVE_SSE2 + +// +// Default implementation +// + +void +dctForward8x8 (float *data) +{ + float A0, A1, A2, A3, A4, A5, A6, A7; + float K0, K1, rot_x, rot_y; + + float *srcPtr = data; + float *dstPtr = data; + + const float c1 = cosf (3.14159f * 1.0f / 16.0f); + const float c2 = cosf (3.14159f * 2.0f / 16.0f); + const float c3 = cosf (3.14159f * 3.0f / 16.0f); + const float c4 = cosf (3.14159f * 4.0f / 16.0f); + const float c5 = cosf (3.14159f * 5.0f / 16.0f); + const float c6 = cosf (3.14159f * 6.0f / 16.0f); + const float c7 = cosf (3.14159f * 7.0f / 16.0f); + + const float c1Half = .5f * c1; + const float c2Half = .5f * c2; + const float c3Half = .5f * c3; + const float c5Half = .5f * c5; + const float c6Half = .5f * c6; + const float c7Half = .5f * c7; + + // + // First pass - do a 1D DCT over the rows and write the + // results back in place + // + + for (int row=0; row<8; ++row) + { + float *srcRowPtr = srcPtr + 8 * row; + float *dstRowPtr = dstPtr + 8 * row; + + A0 = srcRowPtr[0] + srcRowPtr[7]; + A1 = srcRowPtr[1] + srcRowPtr[2]; + A2 = srcRowPtr[1] - srcRowPtr[2]; + A3 = srcRowPtr[3] + srcRowPtr[4]; + A4 = srcRowPtr[3] - srcRowPtr[4]; + A5 = srcRowPtr[5] + srcRowPtr[6]; + A6 = srcRowPtr[5] - srcRowPtr[6]; + A7 = srcRowPtr[0] - srcRowPtr[7]; + + K0 = c4 * (A0 + A3); + K1 = c4 * (A1 + A5); + + dstRowPtr[0] = .5f * (K0 + K1); + dstRowPtr[4] = .5f * (K0 - K1); + + // + // (2*dst2, 2*dst6) = rot 6 (d12 - d56, s07 - s34) + // + + rot_x = A2 - A6; + rot_y = A0 - A3; + + dstRowPtr[2] = c6Half * rot_x + c2Half * rot_y; + dstRowPtr[6] = c6Half * rot_y - c2Half * rot_x; + + // + // K0, K1 are active until after dst[1],dst[7] + // as well as dst[3], dst[5] are computed. + // + + K0 = c4 * (A1 - A5); + K1 = -1 * c4 * (A2 + A6); + + // + // Two ways to do a rotation: + // + // rot i (x, y) = + // X = c_i*x + s_i*y + // Y = -s_i*x + c_i*y + // + // OR + // + // X = c_i*(x+y) + (s_i-c_i)*y + // Y = c_i*y - (s_i+c_i)*x + // + // the first case has 4 multiplies, but fewer constants, + // while the 2nd case has fewer multiplies but takes more space. + + // + // (2*dst3, 2*dst5) = rot -3 ( d07 - K0, d34 + K1 ) + // + + rot_x = A7 - K0; + rot_y = A4 + K1; + + dstRowPtr[3] = c3Half * rot_x - c5Half * rot_y; + dstRowPtr[5] = c5Half * rot_x + c3Half * rot_y; + + // + // (2*dst1, 2*dst7) = rot -1 ( d07 + K0, K1 - d34 ) + // + + rot_x = A7 + K0; + rot_y = K1 - A4; + + // + // A: 4, 7 are inactive. All A's are inactive + // + + dstRowPtr[1] = c1Half * rot_x - c7Half * rot_y; + dstRowPtr[7] = c7Half * rot_x + c1Half * rot_y; + } + + // + // Second pass - do the same, but on the columns + // + + for (int column = 0; column < 8; ++column) + { + + A0 = srcPtr[ column] + srcPtr[56 + column]; + A7 = srcPtr[ column] - srcPtr[56 + column]; + + A1 = srcPtr[ 8 + column] + srcPtr[16 + column]; + A2 = srcPtr[ 8 + column] - srcPtr[16 + column]; + + A3 = srcPtr[24 + column] + srcPtr[32 + column]; + A4 = srcPtr[24 + column] - srcPtr[32 + column]; + + A5 = srcPtr[40 + column] + srcPtr[48 + column]; + A6 = srcPtr[40 + column] - srcPtr[48 + column]; + + K0 = c4 * (A0 + A3); + K1 = c4 * (A1 + A5); + + dstPtr[ column] = .5f * (K0 + K1); + dstPtr[32+column] = .5f * (K0 - K1); + + // + // (2*dst2, 2*dst6) = rot 6 ( d12 - d56, s07 - s34 ) + // + + rot_x = A2 - A6; + rot_y = A0 - A3; + + dstPtr[16+column] = .5f * (c6 * rot_x + c2 * rot_y); + dstPtr[48+column] = .5f * (c6 * rot_y - c2 * rot_x); + + // + // K0, K1 are active until after dst[1],dst[7] + // as well as dst[3], dst[5] are computed. + // + + K0 = c4 * (A1 - A5); + K1 = -1 * c4 * (A2 + A6); + + // + // (2*dst3, 2*dst5) = rot -3 ( d07 - K0, d34 + K1 ) + // + + rot_x = A7 - K0; + rot_y = A4 + K1; + + dstPtr[24+column] = .5f * (c3 * rot_x - c5 * rot_y); + dstPtr[40+column] = .5f * (c5 * rot_x + c3 * rot_y); + + // + // (2*dst1, 2*dst7) = rot -1 ( d07 + K0, K1 - d34 ) + // + + rot_x = A7 + K0; + rot_y = K1 - A4; + + dstPtr[ 8+column] = .5f * (c1 * rot_x - c7 * rot_y); + dstPtr[56+column] = .5f * (c7 * rot_x + c1 * rot_y); + } +} + +#else /* IMF_HAVE_SSE2 */ + +// +// SSE2 implementation +// +// Here, we're always doing a column-wise operation +// plus transposes. This might be faster to do differently +// between rows-wise and column-wise +// + +void +dctForward8x8 (float *data) +{ + __m128 *srcVec = (__m128 *)data; + __m128 a0Vec, a1Vec, a2Vec, a3Vec, a4Vec, a5Vec, a6Vec, a7Vec; + __m128 k0Vec, k1Vec, rotXVec, rotYVec; + __m128 transTmp[4], transTmp2[4]; + + __m128 c4Vec = { .70710678f, .70710678f, .70710678f, .70710678f}; + __m128 c4NegVec = {-.70710678f, -.70710678f, -.70710678f, -.70710678f}; + + __m128 c1HalfVec = {.490392640f, .490392640f, .490392640f, .490392640f}; + __m128 c2HalfVec = {.461939770f, .461939770f, .461939770f, .461939770f}; + __m128 c3HalfVec = {.415734810f, .415734810f, .415734810f, .415734810f}; + __m128 c5HalfVec = {.277785120f, .277785120f, .277785120f, .277785120f}; + __m128 c6HalfVec = {.191341720f, .191341720f, .191341720f, .191341720f}; + __m128 c7HalfVec = {.097545161f, .097545161f, .097545161f, .097545161f}; + + __m128 halfVec = {.5f, .5f, .5f, .5f}; + + for (int iter = 0; iter < 2; ++iter) + { + // + // Operate on 4 columns at a time. The + // offsets into our row-major array are: + // 0: 0 1 + // 1: 2 3 + // 2: 4 5 + // 3: 6 7 + // 4: 8 9 + // 5: 10 11 + // 6: 12 13 + // 7: 14 15 + // + + for (int pass=0; pass<2; ++pass) + { + a0Vec = _mm_add_ps (srcVec[ 0 + pass], srcVec[14 + pass]); + a1Vec = _mm_add_ps (srcVec[ 2 + pass], srcVec[ 4 + pass]); + a3Vec = _mm_add_ps (srcVec[ 6 + pass], srcVec[ 8 + pass]); + a5Vec = _mm_add_ps (srcVec[10 + pass], srcVec[12 + pass]); + + a7Vec = _mm_sub_ps (srcVec[ 0 + pass], srcVec[14 + pass]); + a2Vec = _mm_sub_ps (srcVec[ 2 + pass], srcVec[ 4 + pass]); + a4Vec = _mm_sub_ps (srcVec[ 6 + pass], srcVec[ 8 + pass]); + a6Vec = _mm_sub_ps (srcVec[10 + pass], srcVec[12 + pass]); + + // + // First stage; Compute out_0 and out_4 + // + + k0Vec = _mm_add_ps (a0Vec, a3Vec); + k1Vec = _mm_add_ps (a1Vec, a5Vec); + + k0Vec = _mm_mul_ps (c4Vec, k0Vec); + k1Vec = _mm_mul_ps (c4Vec, k1Vec); + + srcVec[0 + pass] = _mm_add_ps (k0Vec, k1Vec); + srcVec[8 + pass] = _mm_sub_ps (k0Vec, k1Vec); + + srcVec[0 + pass] = _mm_mul_ps (srcVec[0 + pass], halfVec ); + srcVec[8 + pass] = _mm_mul_ps (srcVec[8 + pass], halfVec ); + + + // + // Second stage; Compute out_2 and out_6 + // + + k0Vec = _mm_sub_ps (a2Vec, a6Vec); + k1Vec = _mm_sub_ps (a0Vec, a3Vec); + + srcVec[ 4 + pass] = _mm_add_ps (_mm_mul_ps (c6HalfVec, k0Vec), + _mm_mul_ps (c2HalfVec, k1Vec)); + + srcVec[12 + pass] = _mm_sub_ps (_mm_mul_ps (c6HalfVec, k1Vec), + _mm_mul_ps (c2HalfVec, k0Vec)); + + // + // Precompute K0 and K1 for the remaining stages + // + + k0Vec = _mm_mul_ps (_mm_sub_ps (a1Vec, a5Vec), c4Vec); + k1Vec = _mm_mul_ps (_mm_add_ps (a2Vec, a6Vec), c4NegVec); + + // + // Third Stage, compute out_3 and out_5 + // + + rotXVec = _mm_sub_ps (a7Vec, k0Vec); + rotYVec = _mm_add_ps (a4Vec, k1Vec); + + srcVec[ 6 + pass] = _mm_sub_ps (_mm_mul_ps (c3HalfVec, rotXVec), + _mm_mul_ps (c5HalfVec, rotYVec)); + + srcVec[10 + pass] = _mm_add_ps (_mm_mul_ps (c5HalfVec, rotXVec), + _mm_mul_ps (c3HalfVec, rotYVec)); + + // + // Fourth Stage, compute out_1 and out_7 + // + + rotXVec = _mm_add_ps (a7Vec, k0Vec); + rotYVec = _mm_sub_ps (k1Vec, a4Vec); + + srcVec[ 2 + pass] = _mm_sub_ps (_mm_mul_ps (c1HalfVec, rotXVec), + _mm_mul_ps (c7HalfVec, rotYVec)); + + srcVec[14 + pass] = _mm_add_ps (_mm_mul_ps (c7HalfVec, rotXVec), + _mm_mul_ps (c1HalfVec, rotYVec)); + } + + // + // Transpose the matrix, in 4x4 blocks. So, if we have our + // 8x8 matrix divied into 4x4 blocks: + // + // M0 | M1 M0t | M2t + // ----+--- --> -----+------ + // M2 | M3 M1t | M3t + // + + // + // M0t, done in place, the first half. + // + + transTmp[0] = _mm_shuffle_ps (srcVec[0], srcVec[2], 0x44); + transTmp[1] = _mm_shuffle_ps (srcVec[4], srcVec[6], 0x44); + transTmp[3] = _mm_shuffle_ps (srcVec[4], srcVec[6], 0xEE); + transTmp[2] = _mm_shuffle_ps (srcVec[0], srcVec[2], 0xEE); + + // + // M3t, also done in place, the first half. + // + + transTmp2[0] = _mm_shuffle_ps (srcVec[ 9], srcVec[11], 0x44); + transTmp2[1] = _mm_shuffle_ps (srcVec[13], srcVec[15], 0x44); + transTmp2[2] = _mm_shuffle_ps (srcVec[ 9], srcVec[11], 0xEE); + transTmp2[3] = _mm_shuffle_ps (srcVec[13], srcVec[15], 0xEE); + + // + // M0t, the second half. + // + + srcVec[0] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0x88); + srcVec[4] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0x88); + srcVec[2] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0xDD); + srcVec[6] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0xDD); + + // + // M3t, the second half. + // + + srcVec[ 9] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0x88); + srcVec[13] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0x88); + srcVec[11] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0xDD); + srcVec[15] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0xDD); + + // + // M1 and M2 need to be done at the same time, because we're + // swapping. + // + // First, the first half of M1t + // + + transTmp[0] = _mm_shuffle_ps (srcVec[1], srcVec[3], 0x44); + transTmp[1] = _mm_shuffle_ps (srcVec[5], srcVec[7], 0x44); + transTmp[2] = _mm_shuffle_ps (srcVec[1], srcVec[3], 0xEE); + transTmp[3] = _mm_shuffle_ps (srcVec[5], srcVec[7], 0xEE); + + // + // And the first half of M2t + // + + transTmp2[0] = _mm_shuffle_ps (srcVec[ 8], srcVec[10], 0x44); + transTmp2[1] = _mm_shuffle_ps (srcVec[12], srcVec[14], 0x44); + transTmp2[2] = _mm_shuffle_ps (srcVec[ 8], srcVec[10], 0xEE); + transTmp2[3] = _mm_shuffle_ps (srcVec[12], srcVec[14], 0xEE); + + // + // Second half of M1t + // + + srcVec[ 8] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0x88); + srcVec[12] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0x88); + srcVec[10] = _mm_shuffle_ps (transTmp[0], transTmp[1], 0xDD); + srcVec[14] = _mm_shuffle_ps (transTmp[2], transTmp[3], 0xDD); + + // + // Second half of M2 + // + + srcVec[1] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0x88); + srcVec[5] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0x88); + srcVec[3] = _mm_shuffle_ps (transTmp2[0], transTmp2[1], 0xDD); + srcVec[7] = _mm_shuffle_ps (transTmp2[2], transTmp2[3], 0xDD); + } +} + +#endif /* IMF_HAVE_SSE2 */ + +} // anonymous namespace + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfEnvmap.cpp b/IlmImf/ImfEnvmap.cpp new file mode 100644 index 0000000..f962fc9 --- /dev/null +++ b/IlmImf/ImfEnvmap.cpp @@ -0,0 +1,335 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Environment maps +// +//----------------------------------------------------------------------------- + +#include "ImfEnvmap.h" +#include "ImathFun.h" +#include "ImfNamespace.h" + +#include +#include + +using namespace std; +using namespace IMATH_NAMESPACE; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +namespace LatLongMap { + +V2f +latLong (const V3f &dir) +{ + float r = sqrt (dir.z * dir.z + dir.x * dir.x); + + float latitude = (r < abs (dir.y))? + acos (r / dir.length()) * sign (dir.y): + asin (dir.y / dir.length()); + + float longitude = (dir.z == 0 && dir.x == 0)? 0: atan2 (dir.x, dir.z); + + return V2f (latitude, longitude); +} + + +V2f +latLong (const Box2i &dataWindow, const V2f &pixelPosition) +{ + float latitude, longitude; + + if (dataWindow.max.y > dataWindow.min.y) + { + latitude = -1 * float(M_PI) * + ((pixelPosition.y - dataWindow.min.y) / + (dataWindow.max.y - dataWindow.min.y) - 0.5f); + } + else + { + latitude = 0; + } + + if (dataWindow.max.x > dataWindow.min.x) + { + longitude = -2 * float(M_PI) * + ((pixelPosition.x - dataWindow.min.x) / + (dataWindow.max.x - dataWindow.min.x) - 0.5f); + } + else + { + longitude = 0; + } + + return V2f (latitude, longitude); +} + + +V2f +pixelPosition (const Box2i &dataWindow, const V2f &latLong) +{ + float x = latLong.y / (-2 * float(M_PI)) + 0.5f; + float y = latLong.x / (-1 * float(M_PI)) + 0.5f; + + return V2f (x * (dataWindow.max.x - dataWindow.min.x) + dataWindow.min.x, + y * (dataWindow.max.y - dataWindow.min.y) + dataWindow.min.y); +} + + +V2f +pixelPosition (const Box2i &dataWindow, const V3f &direction) +{ + return pixelPosition (dataWindow, latLong (direction)); +} + + +V3f +direction (const Box2i &dataWindow, const V2f &pixelPosition) +{ + V2f ll = latLong (dataWindow, pixelPosition); + + return V3f (sin (ll.y) * cos (ll.x), + sin (ll.x), + cos (ll.y) * cos (ll.x)); +} + +} // namespace LatLongMap + + +namespace CubeMap { + +int +sizeOfFace (const Box2i &dataWindow) +{ + return min ((dataWindow.max.x - dataWindow.min.x + 1), + (dataWindow.max.y - dataWindow.min.y + 1) / 6); +} + + +Box2i +dataWindowForFace (CubeMapFace face, const Box2i &dataWindow) +{ + int sof = sizeOfFace (dataWindow); + Box2i dwf; + + dwf.min.x = 0; + dwf.min.y = int (face) * sof; + + dwf.max.x = dwf.min.x + sof - 1; + dwf.max.y = dwf.min.y + sof - 1; + + return dwf; +} + + +V2f +pixelPosition (CubeMapFace face, const Box2i &dataWindow, V2f positionInFace) +{ + Box2i dwf = dataWindowForFace (face, dataWindow); + V2f pos (0, 0); + + switch (face) + { + case CUBEFACE_POS_X: + + pos.x = dwf.min.x + positionInFace.y; + pos.y = dwf.max.y - positionInFace.x; + break; + + case CUBEFACE_NEG_X: + + pos.x = dwf.max.x - positionInFace.y; + pos.y = dwf.max.y - positionInFace.x; + break; + + case CUBEFACE_POS_Y: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + + case CUBEFACE_NEG_Y: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.min.y + positionInFace.y; + break; + + case CUBEFACE_POS_Z: + + pos.x = dwf.max.x - positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + + case CUBEFACE_NEG_Z: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + } + + return pos; +} + + +void +faceAndPixelPosition (const V3f &direction, + const Box2i &dataWindow, + CubeMapFace &face, + V2f &pif) +{ + int sof = sizeOfFace (dataWindow); + float absx = abs (direction.x); + float absy = abs (direction.y); + float absz = abs (direction.z); + + if (absx >= absy && absx >= absz) + { + if (absx == 0) + { + // + // Special case - direction is (0, 0, 0) + // + + face = CUBEFACE_POS_X; + pif = V2f (0, 0); + return; + } + + pif.x = (direction.y / absx + 1) / 2 * (sof - 1); + pif.y = (direction.z / absx + 1) / 2 * (sof - 1); + + if (direction.x > 0) + face = CUBEFACE_POS_X; + else + face = CUBEFACE_NEG_X; + } + else if (absy >= absz) + { + pif.x = (direction.x / absy + 1) / 2 * (sof - 1); + pif.y = (direction.z / absy + 1) / 2 * (sof - 1); + + if (direction.y > 0) + face = CUBEFACE_POS_Y; + else + face = CUBEFACE_NEG_Y; + } + else + { + pif.x = (direction.x / absz + 1) / 2 * (sof - 1); + pif.y = (direction.y / absz + 1) / 2 * (sof - 1); + + if (direction.z > 0) + face = CUBEFACE_POS_Z; + else + face = CUBEFACE_NEG_Z; + } +} + + +V3f +direction (CubeMapFace face, const Box2i &dataWindow, const V2f &positionInFace) +{ + int sof = sizeOfFace (dataWindow); + + V2f pos; + + if (sof > 1) + { + pos = V2f (positionInFace.x / (sof - 1) * 2 - 1, + positionInFace.y / (sof - 1) * 2 - 1); + } + else + { + pos = V2f (0, 0); + } + + V3f dir (1, 0, 0); + + switch (face) + { + case CUBEFACE_POS_X: + + dir.x = 1; + dir.y = pos.x; + dir.z = pos.y; + break; + + case CUBEFACE_NEG_X: + + dir.x = -1; + dir.y = pos.x; + dir.z = pos.y; + break; + + case CUBEFACE_POS_Y: + + dir.x = pos.x; + dir.y = 1; + dir.z = pos.y; + break; + + case CUBEFACE_NEG_Y: + + dir.x = pos.x; + dir.y = -1; + dir.z = pos.y; + break; + + case CUBEFACE_POS_Z: + + dir.x = pos.x; + dir.y = pos.y; + dir.z = 1; + break; + + case CUBEFACE_NEG_Z: + + dir.x = pos.x; + dir.y = pos.y; + dir.z = -1; + break; + } + + return dir; +} + +} // namespace CubeMap + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfEnvmap.h b/IlmImf/ImfEnvmap.h new file mode 100644 index 0000000..16e4ee3 --- /dev/null +++ b/IlmImf/ImfEnvmap.h @@ -0,0 +1,336 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_ENVMAP_H +#define INCLUDED_IMF_ENVMAP_H + +//----------------------------------------------------------------------------- +// +// Environment maps +// +// Environment maps define a mapping from 3D directions to 2D +// pixel space locations. Environment maps are typically used +// in 3D rendering, for effects such as quickly approximating +// how shiny surfaces reflect their environment. +// +// Environment maps can be stored in scanline-based or in tiled +// OpenEXR files. The fact that an image is an environment map +// is indicated by the presence of an EnvmapAttribute whose name +// is "envmap". (Convenience functions to access this attribute +// are defined in header file ImfStandardAttributes.h.) +// The attribute's value defines the mapping from 3D directions +// to 2D pixel space locations. +// +// This header file defines the set of possible EnvmapAttribute +// values. +// +// For each possible EnvmapAttribute value, this header file also +// defines a set of convienience functions to convert between 3D +// directions and 2D pixel locations. +// +// Most of the convenience functions defined below require a +// dataWindow parameter. For scanline-based images, and for +// tiled images with level mode ONE_LEVEL, the dataWindow +// parameter should be set to the image's data window, as +// defined in the image header. For tiled images with level +// mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the +// image level that is being accessed should be used instead. +// (See the dataWindowForLevel() methods in ImfTiledInputFile.h +// and ImfTiledOutputFile.h.) +// +//----------------------------------------------------------------------------- + +#include "ImathBox.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//-------------------------------- +// Supported environment map types +//-------------------------------- + +enum Envmap +{ + ENVMAP_LATLONG = 0, // Latitude-longitude environment map + ENVMAP_CUBE = 1, // Cube map + + NUM_ENVMAPTYPES // Number of different environment map types +}; + + +//------------------------------------------------------------------------- +// Latitude-Longitude Map: +// +// The environment is projected onto the image using polar coordinates +// (latitude and longitude). A pixel's x coordinate corresponds to +// its longitude, and the y coordinate corresponds to its latitude. +// Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and +// longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has +// latitude -pi/2 and longitude -pi. +// +// In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and +// positive y direction. Latitude 0, longitude 0 points into positive +// z direction; and latitude 0, longitude pi/2 points into positive x +// direction. +// +// The size of the data window should be 2*N by N pixels (width by height), +// where N can be any integer greater than 0. +//------------------------------------------------------------------------- + +namespace LatLongMap +{ + //---------------------------------------------------- + // Convert a 3D direction to a 2D vector whose x and y + // components represent the corresponding latitude + // and longitude. + //---------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V2f latLong (const IMATH_NAMESPACE::V3f &direction); + + + //-------------------------------------------------------- + // Convert the position of a pixel to a 2D vector whose + // x and y components represent the corresponding latitude + // and longitude. + //-------------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V2f latLong (const IMATH_NAMESPACE::Box2i &dataWindow, + const IMATH_NAMESPACE::V2f &pixelPosition); + + + //------------------------------------------------------------- + // Convert a 2D vector, whose x and y components represent + // longitude and latitude, into a corresponding pixel position. + //------------------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V2f pixelPosition (const IMATH_NAMESPACE::Box2i &dataWindow, + const IMATH_NAMESPACE::V2f &latLong); + + + //----------------------------------------------------- + // Convert a 3D direction vector into a corresponding + // pixel position. pixelPosition(dw,dir) is equivalent + // to pixelPosition(dw,latLong(dw,dir)). + //----------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V2f pixelPosition (const IMATH_NAMESPACE::Box2i &dataWindow, + const IMATH_NAMESPACE::V3f &direction); + + + //-------------------------------------------------------- + // Convert the position of a pixel in a latitude-longitude + // map into a corresponding 3D direction. + //-------------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V3f direction (const IMATH_NAMESPACE::Box2i &dataWindow, + const IMATH_NAMESPACE::V2f &pixelPosition); +} + + +//-------------------------------------------------------------- +// Cube Map: +// +// The environment is projected onto the six faces of an +// axis-aligned cube. The cube's faces are then arranged +// in a 2D image as shown below. +// +// 2-----------3 +// / /| +// / / | Y +// / / | | +// 6-----------7 | | +// | | | | +// | | | | +// | 0 | 1 *------- X +// | | / / +// | | / / +// | |/ / +// 4-----------5 Z +// +// dataWindow.min +// / +// / +// +-----------+ +// |3 Y 7| +// | | | +// | | | +// | ---+---Z | +X face +// | | | +// | | | +// |1 5| +// +-----------+ +// |6 Y 2| +// | | | +// | | | +// | Z---+--- | -X face +// | | | +// | | | +// |4 0| +// +-----------+ +// |6 Z 7| +// | | | +// | | | +// | ---+---X | +Y face +// | | | +// | | | +// |2 3| +// +-----------+ +// |0 1| +// | | | +// | | | +// | ---+---X | -Y face +// | | | +// | | | +// |4 Z 5| +// +-----------+ +// |7 Y 6| +// | | | +// | | | +// | X---+--- | +Z face +// | | | +// | | | +// |5 4| +// +-----------+ +// |2 Y 3| +// | | | +// | | | +// | ---+---X | -Z face +// | | | +// | | | +// |0 1| +// +-----------+ +// / +// / +// dataWindow.max +// +// The size of the data window should be N by 6*N pixels +// (width by height), where N can be any integer greater +// than 0. +// +//-------------------------------------------------------------- + +//------------------------------------ +// Names for the six faces of the cube +//------------------------------------ + +enum CubeMapFace +{ + CUBEFACE_POS_X, // +X face + CUBEFACE_NEG_X, // -X face + CUBEFACE_POS_Y, // +Y face + CUBEFACE_NEG_Y, // -Y face + CUBEFACE_POS_Z, // +Z face + CUBEFACE_NEG_Z // -Z face +}; + +namespace CubeMap +{ + //--------------------------------------------- + // Width and height of a cube's face, in pixels + //--------------------------------------------- + + IMF_EXPORT + int sizeOfFace (const IMATH_NAMESPACE::Box2i &dataWindow); + + + //------------------------------------------ + // Compute the region in the environment map + // that is covered by the specified face. + //------------------------------------------ + + IMF_EXPORT + IMATH_NAMESPACE::Box2i dataWindowForFace (CubeMapFace face, + const IMATH_NAMESPACE::Box2i &dataWindow); + + + //---------------------------------------------------- + // Convert the coordinates of a pixel within a face + // [in the range from (0,0) to (s-1,s-1), where + // s == sizeOfFace(dataWindow)] to pixel coordinates + // in the environment map. + //---------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V2f pixelPosition (CubeMapFace face, + const IMATH_NAMESPACE::Box2i &dataWindow, + IMATH_NAMESPACE::V2f positionInFace); + + + //-------------------------------------------------------------- + // Convert a 3D direction into a cube face, and a pixel position + // within that face. + // + // If you have a 3D direction, dir, the following code fragment + // finds the position, pos, of the corresponding pixel in an + // environment map with data window dw: + // + // CubeMapFace f; + // V2f pif, pos; + // + // faceAndPixelPosition (dir, dw, f, pif); + // pos = pixelPosition (f, dw, pif); + // + //-------------------------------------------------------------- + + IMF_EXPORT + void faceAndPixelPosition (const IMATH_NAMESPACE::V3f &direction, + const IMATH_NAMESPACE::Box2i &dataWindow, + CubeMapFace &face, + IMATH_NAMESPACE::V2f &positionInFace); + + + // -------------------------------------------------------- + // Given a cube face and a pixel position within that face, + // compute the corresponding 3D direction. + // -------------------------------------------------------- + + IMF_EXPORT + IMATH_NAMESPACE::V3f direction (CubeMapFace face, + const IMATH_NAMESPACE::Box2i &dataWindow, + const IMATH_NAMESPACE::V2f &positionInFace); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfEnvmapAttribute.cpp b/IlmImf/ImfEnvmapAttribute.cpp new file mode 100644 index 0000000..b6f88c2 --- /dev/null +++ b/IlmImf/ImfEnvmapAttribute.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class EnvmapAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +EnvmapAttribute::staticTypeName () +{ + return "envmap"; +} + + +template <> +void +EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = Envmap (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfEnvmapAttribute.h b/IlmImf/ImfEnvmapAttribute.h new file mode 100644 index 0000000..0d0129b --- /dev/null +++ b/IlmImf/ImfEnvmapAttribute.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_ENVMAP_ATTRIBUTE_H +#define INCLUDED_IMF_ENVMAP_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class EnvmapAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfEnvmap.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute EnvmapAttribute; + +template <> IMF_EXPORT const char *EnvmapAttribute::staticTypeName (); + +template <> IMF_EXPORT +void EnvmapAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> IMF_EXPORT +void EnvmapAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, + int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfExport.h b/IlmImf/ImfExport.h new file mode 100644 index 0000000..6563fd5 --- /dev/null +++ b/IlmImf/ImfExport.h @@ -0,0 +1,46 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#if defined(OPENEXR_DLL) + #if defined(ILMIMF_EXPORTS) + #define IMF_EXPORT __declspec(dllexport) + #define IMF_EXPORT_CONST extern __declspec(dllexport) + #else + #define IMF_EXPORT __declspec(dllimport) + #define IMF_EXPORT_CONST extern __declspec(dllimport) + #endif +#else + #define IMF_EXPORT + #define IMF_EXPORT_CONST extern const +#endif diff --git a/IlmImf/ImfFastHuf.cpp b/IlmImf/ImfFastHuf.cpp new file mode 100644 index 0000000..86c84dc --- /dev/null +++ b/IlmImf/ImfFastHuf.cpp @@ -0,0 +1,768 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfFastHuf.h" +#include + +#include +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +// +// Adapted from hufUnpackEncTable - +// We don't need to reconstruct the code book, just the encoded +// lengths for each symbol. From the lengths, we can build the +// base + offset tables. This should be a bit more efficient +// for sparse code books. +// +// table - ptr to the start of the code length data. Will be +// updated as we decode data +// +// numBytes - size of the encoded table (I think)? +// +// minSymbol - smallest symbol in the code book +// +// maxSymbol - largest symbol in the code book. +// +// rleSymbol - the symbol to trigger RLE in the encoded bitstream +// + +FastHufDecoder::FastHufDecoder + (const char *&table, + int numBytes, + int minSymbol, + int maxSymbol, + int rleSymbol) +: + _rleSymbol (rleSymbol), + _numSymbols (0), + _minCodeLength (255), + _maxCodeLength (0), + _idToSymbol (0) +{ + // + // List of symbols that we find with non-zero code lengths + // (listed in the order we find them). Store these in the + // same format as the code book stores codes + lengths - + // low 6 bits are the length, everything above that is + // the symbol. + // + + std::vector symbols; + + // + // The 'base' table is the minimum code at each code length. base[i] + // is the smallest code (numerically) of length i. + // + + Int64 base[MAX_CODE_LEN + 1]; + + // + // The 'offset' table is the position (in sorted order) of the first id + // of a given code lenght. Array is indexed by code length, like base. + // + + Int64 offset[MAX_CODE_LEN + 1]; + + // + // Count of how many codes at each length there are. Array is + // indexed by code length, like base and offset. + // + + size_t codeCount[MAX_CODE_LEN + 1]; + + for (int i = 0; i <= MAX_CODE_LEN; ++i) + { + codeCount[i] = 0; + base[i] = 0xffffffffffffffffL; + offset[i] = 0; + } + + // + // Count the number of codes, the min/max code lengths, the number of + // codes with each length, and record symbols with non-zero code + // length as we find them. + // + + const char *currByte = table; + Int64 currBits = 0; + int currBitCount = 0; + + const int SHORT_ZEROCODE_RUN = 59; + const int LONG_ZEROCODE_RUN = 63; + const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; + + for (Int64 symbol = minSymbol; symbol <= maxSymbol; symbol++) + { + if (currByte - table > numBytes) + { + throw Iex::InputExc ("Error decoding Huffman table " + "(Truncated table data)."); + } + + // + // Next code length - either: + // 0-58 (literal code length) + // 59-62 (various lengths runs of 0) + // 63 (run of n 0's, with n is the next 8 bits) + // + + Int64 codeLen = readBits (6, currBits, currBitCount, currByte); + + if (codeLen == (Int64) LONG_ZEROCODE_RUN) + { + if (currByte - table > numBytes) + { + throw Iex::InputExc ("Error decoding Huffman table " + "(Truncated table data)."); + } + + int runLen = readBits (8, currBits, currBitCount, currByte) + + SHORTEST_LONG_RUN; + + if (symbol + runLen > maxSymbol + 1) + { + throw Iex::InputExc ("Error decoding Huffman table " + "(Run beyond end of table)."); + } + + symbol += runLen - 1; + + } + else if (codeLen >= (Int64) SHORT_ZEROCODE_RUN) + { + int runLen = codeLen - SHORT_ZEROCODE_RUN + 2; + + if (symbol + runLen > maxSymbol + 1) + { + throw Iex::InputExc ("Error decoding Huffman table " + "(Run beyond end of table)."); + } + + symbol += runLen - 1; + + } + else if (codeLen != 0) + { + symbols.push_back ((symbol << 6) | (codeLen & 63)); + + if (codeLen < _minCodeLength) + _minCodeLength = codeLen; + + if (codeLen > _maxCodeLength) + _maxCodeLength = codeLen; + + codeCount[codeLen]++; + } + } + + for (int i = 0; i < MAX_CODE_LEN; ++i) + _numSymbols += codeCount[i]; + + table = currByte; + + // + // Compute base - once we have the code length counts, there + // is a closed form solution for this + // + + { + double* countTmp = new double[_maxCodeLength+1]; + + for (int l = _minCodeLength; l <= _maxCodeLength; ++l) + { + countTmp[l] = (double)codeCount[l] * + (double)(2 << (_maxCodeLength-l)); + } + + for (int l = _minCodeLength; l <= _maxCodeLength; ++l) + { + double tmp = 0; + + for (int k =l + 1; k <= _maxCodeLength; ++k) + tmp += countTmp[k]; + + tmp /= (double)(2 << (_maxCodeLength - l)); + + base[l] = (Int64)ceil (tmp); + } + + delete [] countTmp; + } + + // + // Compute offset - these are the positions of the first + // id (not symbol) that has length [i] + // + + offset[_maxCodeLength] = 0; + + for (int i= _maxCodeLength - 1; i >= _minCodeLength; i--) + offset[i] = offset[i + 1] + codeCount[i + 1]; + + // + // Allocate and fill the symbol-to-id mapping. Smaller Ids should be + // mapped to less-frequent symbols (which have longer codes). Use + // the offset table to tell us where the id's for a given code + // length start off. + // + + _idToSymbol = new int[_numSymbols]; + + Int64 mapping[MAX_CODE_LEN + 1]; + for (int i = 0; i < MAX_CODE_LEN + 1; ++i) + mapping[i] = -1; + for (int i = _minCodeLength; i <= _maxCodeLength; ++i) + mapping[i] = offset[i]; + + for (std::vector::const_iterator i = symbols.begin(); + i != symbols.end(); + ++i) + { + int codeLen = *i & 63; + int symbol = *i >> 6; + + if (mapping[codeLen] >= _numSymbols) + throw Iex::InputExc ("Huffman decode error " + "(Invalid symbol in header)."); + + _idToSymbol[mapping[codeLen]] = symbol; + mapping[codeLen]++; + } + + buildTables(base, offset); +} + + +FastHufDecoder::~FastHufDecoder() +{ + delete[] _idToSymbol; +} + + +// +// Static check if the decoder is enabled. +// +// ATM, I only have access to little endian hardware for testing, +// so I'm not entirely sure that we are reading fom the bit stream +// properly on BE. +// +// If you happen to have more obscure hardware, check that the +// byte swapping in refill() is happening sensable, add an endian +// check if needed, and fix the preprocessor magic here. +// + +#define READ64(c) \ + ((Int64)(c)[0] << 56) | ((Int64)(c)[1] << 48) | ((Int64)(c)[2] << 40) | \ + ((Int64)(c)[3] << 32) | ((Int64)(c)[4] << 24) | ((Int64)(c)[5] << 16) | \ + ((Int64)(c)[6] << 8) | ((Int64)(c)[7] ) + +#ifdef __INTEL_COMPILER // ICC built-in swap for LE hosts + #if defined (__i386__) || defined(__x86_64__) + #undef READ64 + #define READ64(c) _bswap64 (*(const Int64*)(c)) + #endif +#endif + + +bool +FastHufDecoder::enabled() +{ + #if defined(__INTEL_COMPILER) || defined(__GNUC__) + + // + // Enabled for ICC, GCC: + // __i386__ -> x86 + // __x86_64__ -> 64-bit x86 + // + + #if defined (__i386__) || defined(__x86_64__) + return true; + #else + return false; + #endif + + #elif defined (_MSC_VER) + + // + // Enabled for Visual Studio: + // _M_IX86 -> x86 + // _M_X64 -> 64bit x86 + + #if defined (_M_IX86) || defined(_M_X64) + return true; + #else + return false; + #endif + + #else + + // + // Unknown compiler - Be safe and disable. + // + return false; + #endif +} + +// +// +// Built the acceleration tables for lookups on the upper bits +// as well as the 'LJ' tables. +// + +void +FastHufDecoder::buildTables (Int64 *base, Int64 *offset) +{ + // + // Build the 'left justified' base table, by shifting base left.. + // + + for (int i = 0; i <= MAX_CODE_LEN; ++i) + { + if (base[i] != 0xffffffffffffffffL) + { + _ljBase[i] = base[i] << (64 - i); + } + else + { + // + // Unused code length - insert dummy values + // + + _ljBase[i] = 0xffffffffffffffffL; + } + } + + // + // Combine some terms into a big fat constant, which for + // lack of a better term we'll call the 'left justified' + // offset table (because it serves the same function + // as 'offset', when using the left justified base table. + // + + for (int i = 0; i <= MAX_CODE_LEN; ++i) + _ljOffset[i] = offset[i] - (_ljBase[i] >> (64 - i)); + + // + // Build the acceleration tables for the lookups of + // short codes ( <= TABLE_LOOKUP_BITS long) + // + + for (Int64 i = 0; i < 1 << TABLE_LOOKUP_BITS; ++i) + { + Int64 value = i << (64 - TABLE_LOOKUP_BITS); + + _tableSymbol[i] = 0xffff; + _tableCodeLen[i] = 0; + + for (int codeLen = _minCodeLength; codeLen <= _maxCodeLength; ++codeLen) + { + if (_ljBase[codeLen] <= value) + { + _tableCodeLen[i] = codeLen; + + Int64 id = _ljOffset[codeLen] + (value >> (64 - codeLen)); + if (id < _numSymbols) + { + _tableSymbol[i] = _idToSymbol[id]; + } + else + { + throw Iex::InputExc ("Huffman decode error " + "(Overrun)."); + } + break; + } + } + } + + // + // Store the smallest value in the table that points to real data. + // This should be the entry for the largest length that has + // valid data (in our case, non-dummy _ljBase) + // + + int minIdx = TABLE_LOOKUP_BITS; + + while (minIdx > 0 && _ljBase[minIdx] == 0xffffffffffffffffL) + minIdx--; + + if (minIdx < 0) + { + // + // Error, no codes with lengths 0-TABLE_LOOKUP_BITS used. + // Set the min value such that the table is never tested. + // + + _tableMin = 0xffffffffffffffffL; + } + else + { + _tableMin = _ljBase[minIdx]; + } +} + + +// +// For decoding, we're holding onto 2 Int64's. +// +// The first (buffer), holds the next bits from the bitstream to be +// decoded. For certain paths in the decoder, we only need TABLE_LOOKUP_BITS +// valid bits to decode the next symbol. For other paths, we need a full +// 64-bits to decode a symbol. +// +// When we need to refill 'buffer', we could pull bits straight from +// the bitstream. But this is very slow and requires lots of book keeping +// (what's the next bit in the next byte?). Instead, we keep another Int64 +// around that we use to refill from. While this doesn't cut down on the +// book keeping (still need to know how many valid bits), it does cut +// down on some of the bit shifting crazy and byte access. +// +// The refill Int64 (bufferBack) gets left-shifted after we've pulled +// off bits. If we run out of bits in the input bit stream, we just +// shift in 0's to bufferBack. +// +// The refill act takes numBits from the top of bufferBack and sticks +// them in the bottom of buffer. If there arn't enough bits in bufferBack, +// it gets refilled (to 64-bits) from the input bitstream. +// + +inline void +FastHufDecoder::refill + (Int64 &buffer, + int numBits, // number of bits to refill + Int64 &bufferBack, // the next 64-bits, to refill from + int &bufferBackNumBits, // number of bits left in bufferBack + const unsigned char *&currByte, // current byte in the bitstream + int &currBitsLeft) // number of bits left in the bitsream +{ + // + // Refill bits into the bottom of buffer, from the top of bufferBack. + // Always top up buffer to be completely full. + // + + buffer |= bufferBack >> (64 - numBits); + + if (bufferBackNumBits < numBits) + { + numBits -= bufferBackNumBits; + + // + // Refill all of bufferBack from the bitstream. Either grab + // a full 64-bit chunk, or whatever bytes are left. If we + // don't have 64-bits left, pad with 0's. + // + + if (currBitsLeft >= 64) + { + bufferBack = READ64 (currByte); + bufferBackNumBits = 64; + currByte += sizeof (Int64); + currBitsLeft -= 8 * sizeof (Int64); + + } + else + { + bufferBack = 0; + bufferBackNumBits = 64; + + Int64 shift = 56; + + while (currBitsLeft > 0) + { + bufferBack |= ((Int64)(*currByte)) << shift; + + currByte++; + shift -= 8; + currBitsLeft -= 8; + } + + // + // At this point, currBitsLeft might be negative, just because + // we're subtracting whole bytes. To keep anyone from freaking + // out, zero the counter. + // + + if (currBitsLeft < 0) + currBitsLeft = 0; + } + + buffer |= bufferBack >> (64 - numBits); + } + + bufferBack = bufferBack << numBits; + bufferBackNumBits -= numBits; + + // + // We can have cases where the previous shift of bufferBack is << 64 - + // in which case no shift occurs. The bit count math still works though, + // so if we don't have any bits left, zero out bufferBack. + // + + if (bufferBackNumBits == 0) + bufferBack = 0; +} + +// +// Read the next few bits out of a bitstream. Will be given a backing buffer +// (buffer) that may still have data left over from previous reads +// (bufferNumBits). Bitstream pointer (currByte) will be advanced when needed. +// + +inline Int64 +FastHufDecoder::readBits + (int numBits, + Int64 &buffer, // c + int &bufferNumBits, // lc + const char *&currByte) // in +{ + while (bufferNumBits < numBits) + { + buffer = (buffer << 8) | *(unsigned char*)(currByte++); + bufferNumBits += 8; + } + + bufferNumBits -= numBits; + return (buffer >> bufferNumBits) & ((1 << numBits) - 1); +} + + +// +// Decode using a the 'One-Shift' strategy for decoding, with a +// small-ish table to accelerate decoding of short codes. +// +// If possible, try looking up codes into the acceleration table. +// This has a few benifits - there's no search involved; We don't +// need an additional lookup to map id to symbol; we don't need +// a full 64-bits (so less refilling). +// + +void +FastHufDecoder::decode + (const unsigned char *src, + int numSrcBits, + unsigned short *dst, + int numDstElems) +{ + if (numSrcBits < 128) + throw Iex::InputExc ("Error choosing Huffman decoder implementation " + "(insufficient number of bits)."); + + // + // Current position (byte/bit) in the src data stream + // (after the first buffer fill) + // + + const unsigned char *currByte = src + 2 * sizeof (Int64); + + numSrcBits -= 8 * 2 * sizeof (Int64); + + // + // 64-bit buffer holding the current bits in the stream + // + + Int64 buffer = READ64 (src); + int bufferNumBits = 64; + + // + // 64-bit buffer holding the next bits in the stream + // + + Int64 bufferBack = READ64 ((src + sizeof (Int64))); + int bufferBackNumBits = 64; + + int dstIdx = 0; + + while (dstIdx < numDstElems) + { + int codeLen; + int symbol; + + // + // Test if we can be table accelerated. If so, directly + // lookup the output symbol. Otherwise, we need to fall + // back to searching for the code. + // + // If we're doing table lookups, we don't really need + // a re-filled buffer, so long as we have TABLE_LOOKUP_BITS + // left. But for a search, we do need a refilled table. + // + + if (_tableMin <= buffer) + { + int tableIdx = buffer >> (64 - TABLE_LOOKUP_BITS); + + // + // For invalid codes, _tableCodeLen[] should return 0. This + // will cause the decoder to get stuck in the current spot + // until we run out of elements, then barf that the codestream + // is bad. So we don't need to stick a condition like + // if (codeLen > _maxCodeLength) in this inner. + // + + codeLen = _tableCodeLen[tableIdx]; + symbol = _tableSymbol[tableIdx]; + } + else + { + if (bufferNumBits < 64) + { + refill (buffer, + 64 - bufferNumBits, + bufferBack, + bufferBackNumBits, + currByte, + numSrcBits); + + bufferNumBits = 64; + } + + // + // Brute force search: + // Find the smallest length where _ljBase[length] <= buffer + // + + codeLen = TABLE_LOOKUP_BITS + 1; + + while (_ljBase[codeLen] > buffer && codeLen <= _maxCodeLength) + codeLen++; + + if (codeLen > _maxCodeLength) + { + throw Iex::InputExc ("Huffman decode error " + "(Decoded an invalid symbol)."); + } + + Int64 id = _ljOffset[codeLen] + (buffer >> (64 - codeLen)); + if (id < _numSymbols) + { + symbol = _idToSymbol[id]; + } + else + { + throw Iex::InputExc ("Huffman decode error " + "(Decoded an invalid symbol)."); + } + } + + // + // Shift over bit stream, and update the bit count in the buffer + // + + buffer = buffer << codeLen; + bufferNumBits -= codeLen; + + // + // If we recieved a RLE symbol (_rleSymbol), then we need + // to read ahead 8 bits to know how many times to repeat + // the previous symbol. Need to ensure we at least have + // 8 bits of data in the buffer + // + + if (symbol == _rleSymbol) + { + if (bufferNumBits < 8) + { + refill (buffer, + 64 - bufferNumBits, + bufferBack, + bufferBackNumBits, + currByte, + numSrcBits); + + bufferNumBits = 64; + } + + int rleCount = buffer >> 56; + + if (dstIdx < 1) + { + throw Iex::InputExc ("Huffman decode error (RLE code " + "with no previous symbol)."); + } + + if (dstIdx + rleCount > numDstElems) + { + throw Iex::InputExc ("Huffman decode error (Symbol run " + "beyond expected output buffer length)."); + } + + if (rleCount <= 0) + { + throw Iex::InputExc("Huffman decode error" + " (Invalid RLE length)"); + } + + for (int i = 0; i < rleCount; ++i) + dst[dstIdx + i] = dst[dstIdx - 1]; + + dstIdx += rleCount; + + buffer = buffer << 8; + bufferNumBits -= 8; + } + else + { + dst[dstIdx] = symbol; + dstIdx++; + } + + // + // refill bit stream buffer if we're below the number of + // bits needed for a table lookup + // + + if (bufferNumBits < TABLE_LOOKUP_BITS) + { + refill (buffer, + 64 - bufferNumBits, + bufferBack, + bufferBackNumBits, + currByte, + numSrcBits); + + bufferNumBits = 64; + } + } + + if (numSrcBits != 0) + { + throw Iex::InputExc ("Huffman decode error (Compressed data remains " + "after filling expected output buffer)."); + } +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfFastHuf.h b/IlmImf/ImfFastHuf.h new file mode 100644 index 0000000..ce7fd3f --- /dev/null +++ b/IlmImf/ImfFastHuf.h @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FAST_HUF_H +#define INCLUDED_IMF_FAST_HUF_H + +#include "ImfInt64.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +// +// Alternative Canonical Huffman decoder: +// +// Canonical Huffman decoder based on 'On the Implementation of Minimum +// Redundancy Prefix Codes' by Moffat and Turpin - highly recommended +// reading as a good description of the problem space, as well as +// a fast decoding algorithm. +// +// The premise is that instead of working directly with the coded +// symbols, we create a new ordering based on the frequency of symbols. +// Less frequent symbols (and thus longer codes) are ordered earler. +// We're calling the values in this ordering 'Ids', as oppsed to +// 'Symbols' - which are the short values we eventually want decoded. +// +// With this new ordering, a few small tables can be derived ('base' +// and 'offset') which drive the decoding. To cut down on the +// linear scanning of these tables, you can add a small table +// to directly look up short codes (as you might in a traditional +// lookup-table driven decoder). +// +// The decoder is meant to be compatible with the encoder (and decoder) +// in ImfHuf.cpp, just faster. For ease of implementation, this decoder +// should only be used on compressed bitstreams >= 128 bits long. +// + +class FastHufDecoder +{ + public: + + // + // Longest compressed code length that ImfHuf supports (58 bits) + // + + static const int MAX_CODE_LEN = 58; + + // + // Number of bits in our acceleration table. Should match all + // codes up to TABLE_LOOKUP_BITS in length. + // + + static const int TABLE_LOOKUP_BITS = 12; + + FastHufDecoder (const char*& table, + int numBytes, + int minSymbol, + int maxSymbol, + int rleSymbol); + + ~FastHufDecoder (); + + static bool enabled (); + + void decode (const unsigned char *src, + int numSrcBits, + unsigned short *dst, + int numDstElems); + + private: + + void buildTables (Int64*, Int64*); + void refill (Int64&, int, Int64&, int&, const unsigned char *&, int&); + Int64 readBits (int, Int64&, int&, const char *&); + + int _rleSymbol; // RLE symbol written by the encoder. + // This could be 65536, so beware + // when you use shorts to hold things. + + int _numSymbols; // Number of symbols in the codebook. + + unsigned char _minCodeLength; // Minimum code length, in bits. + unsigned char _maxCodeLength; // Maximum code length, in bits. + + int *_idToSymbol; // Maps Ids to symbols. Ids are a symbol + // ordering sorted first in terms of + // code length, and by code within + // the same length. Ids run from 0 + // to mNumSymbols-1. + + Int64 _ljBase[MAX_CODE_LEN + 1]; // the 'left justified base' table. + // Takes base[i] (i = code length) + // and 'left justifies' it into an Int64 + + Int64 _ljOffset[MAX_CODE_LEN +1 ]; // There are some other terms that can + // be folded into constants when taking + // the 'left justified' decode path. This + // holds those constants, indexed by + // code length + + // + // We can accelerate the 'left justified' processing by running the + // top TABLE_LOOKUP_BITS through a LUT, to find the symbol and code + // length. These are those acceleration tables. + // + // Even though our evental 'symbols' are ushort's, the encoder adds + // a symbol to indicate RLE. So with a dense code book, we could + // have 2^16+1 codes, so both mIdToSymbol and mTableSymbol need + // to be bigger than 16 bits. + // + + int _tableSymbol[1 << TABLE_LOOKUP_BITS]; + unsigned char _tableCodeLen[1 << TABLE_LOOKUP_BITS]; + Int64 _tableMin; +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfFloatAttribute.cpp b/IlmImf/ImfFloatAttribute.cpp new file mode 100644 index 0000000..4e22e90 --- /dev/null +++ b/IlmImf/ImfFloatAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class FloatAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +template <> +const char * +FloatAttribute::staticTypeName () +{ + return "float"; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfFloatAttribute.h b/IlmImf/ImfFloatAttribute.h new file mode 100644 index 0000000..7370721 --- /dev/null +++ b/IlmImf/ImfFloatAttribute.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_FLOAT_ATTRIBUTE_H +#define INCLUDED_IMF_FLOAT_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class FloatAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute FloatAttribute; +template <> IMF_EXPORT const char *FloatAttribute::staticTypeName (); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfFloatVectorAttribute.cpp b/IlmImf/ImfFloatVectorAttribute.cpp new file mode 100644 index 0000000..49eda90 --- /dev/null +++ b/IlmImf/ImfFloatVectorAttribute.cpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class FloatVectorAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + + +template <> +const char * +FloatVectorAttribute::staticTypeName () +{ + return "floatvector"; +} + + +template <> +void +FloatVectorAttribute::writeValueTo + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + int n = _value.size(); + + for (int i = 0; i < n; ++i) + Xdr::write (os, _value[i]); +} + + +template <> +void +FloatVectorAttribute::readValueFrom + (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + int n = size / Xdr::size(); + _value.resize (n); + + for (int i = 0; i < n; ++i) + Xdr::read (is, _value[i]); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfFloatVectorAttribute.h b/IlmImf/ImfFloatVectorAttribute.h new file mode 100644 index 0000000..66e7642 --- /dev/null +++ b/IlmImf/ImfFloatVectorAttribute.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_FLOATVECTOR_ATTRIBUTE_H +#define INCLUDED_IMF_FLOATVECTOR_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class FloatVectorAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfNamespace.h" + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +typedef std::vector + FloatVector; + +typedef TypedAttribute + FloatVectorAttribute; + +template <> +IMF_EXPORT +const char *FloatVectorAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void FloatVectorAttribute::writeValueTo + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; + +template <> +IMF_EXPORT +void FloatVectorAttribute::readValueFrom + (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfForward.h b/IlmImf/ImfForward.h new file mode 100644 index 0000000..ea51c24 --- /dev/null +++ b/IlmImf/ImfForward.h @@ -0,0 +1,127 @@ + + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012 Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FORWARD_H +#define INCLUDED_IMF_FORWARD_H + +//////////////////////////////////////////////////////////////////// +// +// Forward declarations for OpenEXR - correctly declares namespace +// +//////////////////////////////////////////////////////////////////// + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// classes for basic types; +template class Array; +template class Array2D; +struct Channel; +class ChannelList; +struct Chromaticities; + +// attributes used in headers are TypedAttributes +class Attribute; + +class Header; + +// file handling classes +class OutputFile; +class TiledInputFile; +class ScanLineInputFile; +class InputFile; +class TiledOutputFile; +class DeepScanLineInputFile; +class DeepScanLineOutputFile; +class DeepTiledInputFile; +class DeepTiledOutputFile; +class AcesInputFile; +class AcesOutputFile; +class TiledInputPart; +class TiledInputFile; +class TileOffsets; + +// multipart file handling +class GenericInputFile; +class GenericOutputFile; +class MultiPartInputFile; +class MultiPartOutputFile; + +class InputPart; +class TiledInputPart; +class DeepScanLineInputPart; +class DeepTiledInputPart; + +class OutputPart; +class ScanLineOutputPart; +class TiledOutputPart; +class DeepScanLineOutputPart; +class DeepTiledOutputPart; + + +// internal use only +struct InputPartData; +struct OutputStreamMutex; +struct OutputPartData; +struct InputStreamMutex; + +// frame buffers + +class FrameBuffer; +class DeepFrameBuffer; +struct DeepSlice; + +// compositing +class DeepCompositing; +class CompositeDeepScanLine; + +// preview image +class PreviewImage; +struct PreviewRgba; + +// streams +class OStream; +class IStream; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif // include guard diff --git a/IlmImf/ImfFrameBuffer.cpp b/IlmImf/ImfFrameBuffer.cpp new file mode 100644 index 0000000..bced3b1 --- /dev/null +++ b/IlmImf/ImfFrameBuffer.cpp @@ -0,0 +1,228 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Slice +// class FrameBuffer +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" + + +using namespace std; + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +Slice::Slice (PixelType t, + char *b, + size_t xst, + size_t yst, + int xsm, + int ysm, + double fv, + bool xtc, + bool ytc) +: + type (t), + base (b), + xStride (xst), + yStride (yst), + xSampling (xsm), + ySampling (ysm), + fillValue (fv), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +void +FrameBuffer::insert (const char name[], const Slice &slice) +{ + if (name[0] == 0) + { + THROW (IEX_NAMESPACE::ArgExc, + "Frame buffer slice name cannot be an empty string."); + } + + _map[name] = slice; +} + + +void +FrameBuffer::insert (const string &name, const Slice &slice) +{ + insert (name.c_str(), slice); +} + + +Slice & +FrameBuffer::operator [] (const char name[]) +{ + SliceMap::iterator i = _map.find (name); + + if (i == _map.end()) + { + THROW (IEX_NAMESPACE::ArgExc, + "Cannot find frame buffer slice \"" << name << "\"."); + } + + return i->second; +} + + +const Slice & +FrameBuffer::operator [] (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + { + THROW (IEX_NAMESPACE::ArgExc, + "Cannot find frame buffer slice \"" << name << "\"."); + } + + return i->second; +} + + +Slice & +FrameBuffer::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Slice & +FrameBuffer::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Slice * +FrameBuffer::findSlice (const char name[]) +{ + SliceMap::iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +const Slice * +FrameBuffer::findSlice (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +Slice * +FrameBuffer::findSlice (const string &name) +{ + return findSlice (name.c_str()); +} + + +const Slice * +FrameBuffer::findSlice (const string &name) const +{ + return findSlice (name.c_str()); +} + + +FrameBuffer::Iterator +FrameBuffer::begin () +{ + return _map.begin(); +} + + +FrameBuffer::ConstIterator +FrameBuffer::begin () const +{ + return _map.begin(); +} + + +FrameBuffer::Iterator +FrameBuffer::end () +{ + return _map.end(); +} + + +FrameBuffer::ConstIterator +FrameBuffer::end () const +{ + return _map.end(); +} + + +FrameBuffer::Iterator +FrameBuffer::find (const char name[]) +{ + return _map.find (name); +} + + +FrameBuffer::ConstIterator +FrameBuffer::find (const char name[]) const +{ + return _map.find (name); +} + + +FrameBuffer::Iterator +FrameBuffer::find (const string &name) +{ + return find (name.c_str()); +} + + +FrameBuffer::ConstIterator +FrameBuffer::find (const string &name) const +{ + return find (name.c_str()); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfFrameBuffer.h b/IlmImf/ImfFrameBuffer.h new file mode 100644 index 0000000..a810cfa --- /dev/null +++ b/IlmImf/ImfFrameBuffer.h @@ -0,0 +1,386 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_FRAME_BUFFER_H +#define INCLUDED_IMF_FRAME_BUFFER_H + +//----------------------------------------------------------------------------- +// +// class Slice +// class FrameBuffer +// +//----------------------------------------------------------------------------- + +#include "ImfName.h" +#include "ImfPixelType.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +//------------------------------------------------------- +// Description of a single slice of the frame buffer: +// +// Note -- terminology: as part of a file, a component of +// an image (e.g. red, green, blue, depth etc.) is called +// a "channel". As part of a frame buffer, an image +// component is called a "slice". +//------------------------------------------------------- + +struct IMF_EXPORT Slice +{ + //------------------------------ + // Data type; see ImfPixelType.h + //------------------------------ + + PixelType type; + + + //--------------------------------------------------------------------- + // Memory layout: The address of pixel (x, y) is + // + // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride + // + // where xp and yp are computed as follows: + // + // * If we are reading or writing a scanline-based file: + // + // xp = x + // yp = y + // + // * If we are reading a tile whose upper left coorner is at (xt, yt): + // + // if xTileCoords is true then xp = x - xt, else xp = x + // if yTileCoords is true then yp = y - yt, else yp = y + // + //--------------------------------------------------------------------- + + char * base; + size_t xStride; + size_t yStride; + + + //-------------------------------------------- + // Subsampling: pixel (x, y) is present in the + // slice only if + // + // x % xSampling == 0 && y % ySampling == 0 + // + //-------------------------------------------- + + int xSampling; + int ySampling; + + + //---------------------------------------------------------- + // Default value, used to fill the slice when a file without + // a channel that corresponds to this slice is read. + //---------------------------------------------------------- + + double fillValue; + + + //------------------------------------------------------- + // For tiled files, the xTileCoords and yTileCoords flags + // determine whether pixel addressing is performed using + // absolute coordinates or coordinates relative to a + // tile's upper left corner. (See the comment on base, + // xStride and yStride, above.) + // + // For scanline-based files these flags have no effect; + // pixel addressing is always done using absolute + // coordinates. + //------------------------------------------------------- + + bool xTileCoords; + bool yTileCoords; + + + //------------ + // Constructor + //------------ + + Slice (PixelType type = HALF, + char * base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + double fillValue = 0.0, + bool xTileCoords = false, + bool yTileCoords = false); +}; + + +class IMF_EXPORT FrameBuffer +{ + public: + + //------------ + // Add a slice + //------------ + + void insert (const char name[], + const Slice &slice); + + void insert (const std::string &name, + const Slice &slice); + + //---------------------------------------------------------------- + // Access to existing slices: + // + // [n] Returns a reference to the slice with name n. + // If no slice with name n exists, an IEX_NAMESPACE::ArgExc + // is thrown. + // + // findSlice(n) Returns a pointer to the slice with name n, + // or 0 if no slice with name n exists. + // + //---------------------------------------------------------------- + + Slice & operator [] (const char name[]); + const Slice & operator [] (const char name[]) const; + + Slice & operator [] (const std::string &name); + const Slice & operator [] (const std::string &name) const; + + Slice * findSlice (const char name[]); + const Slice * findSlice (const char name[]) const; + + Slice * findSlice (const std::string &name); + const Slice * findSlice (const std::string &name) const; + + + //----------------------------------------- + // Iterator-style access to existing slices + //----------------------------------------- + + typedef std::map SliceMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + private: + + SliceMap _map; +}; + + +//---------- +// Iterators +//---------- + +class FrameBuffer::Iterator +{ + public: + + Iterator (); + Iterator (const FrameBuffer::SliceMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Slice & slice () const; + + private: + + friend class FrameBuffer::ConstIterator; + + FrameBuffer::SliceMap::iterator _i; +}; + + +class FrameBuffer::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const FrameBuffer::SliceMap::const_iterator &i); + ConstIterator (const FrameBuffer::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Slice & slice () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + FrameBuffer::SliceMap::const_iterator _i; +}; + + +//----------------- +// Inline Functions +//----------------- + +inline +FrameBuffer::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +FrameBuffer::Iterator::Iterator (const FrameBuffer::SliceMap::iterator &i): + _i (i) +{ + // empty +} + + +inline FrameBuffer::Iterator & +FrameBuffer::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FrameBuffer::Iterator +FrameBuffer::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +FrameBuffer::Iterator::name () const +{ + return *_i->first; +} + + +inline Slice & +FrameBuffer::Iterator::slice () const +{ + return _i->second; +} + + +inline +FrameBuffer::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +FrameBuffer::ConstIterator::ConstIterator + (const FrameBuffer::SliceMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +FrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::Iterator &other): + _i (other._i) +{ + // empty +} + +inline FrameBuffer::ConstIterator & +FrameBuffer::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FrameBuffer::ConstIterator +FrameBuffer::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +FrameBuffer::ConstIterator::name () const +{ + return *_i->first; +} + +inline const Slice & +FrameBuffer::ConstIterator::slice () const +{ + return _i->second; +} + + +inline bool +operator == (const FrameBuffer::ConstIterator &x, + const FrameBuffer::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const FrameBuffer::ConstIterator &x, + const FrameBuffer::ConstIterator &y) +{ + return !(x == y); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfFramesPerSecond.cpp b/IlmImf/ImfFramesPerSecond.cpp new file mode 100644 index 0000000..b56f948 --- /dev/null +++ b/IlmImf/ImfFramesPerSecond.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Convenience functions related to the framesPerSecond attribute +// +//----------------------------------------------------------------------------- + +#include +#include "ImathFun.h" + +using namespace IMATH_NAMESPACE; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +Rational +guessExactFps (double fps) +{ + return guessExactFps (Rational (fps)); +} + + +Rational +guessExactFps (const Rational &fps) +{ + const double e = 0.002; + + if (abs (double (fps) - double (fps_23_976())) < e) + return fps_23_976(); + + if (abs (double (fps) - double (fps_29_97())) < e) + return fps_29_97(); + + if (abs (double (fps) - double (fps_47_952())) < e) + return fps_47_952(); + + if (abs (double (fps) - double (fps_59_94())) < e) + return fps_59_94(); + + return fps; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfFramesPerSecond.h b/IlmImf/ImfFramesPerSecond.h new file mode 100644 index 0000000..59ab4cb --- /dev/null +++ b/IlmImf/ImfFramesPerSecond.h @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_FRAMES_PER_SECOND_H +#define INCLUDED_IMF_FRAMES_PER_SECOND_H + +//----------------------------------------------------------------------------- +// +// Convenience functions related to the framesPerSecond attribute +// +// Functions that return the exact values for commonly used frame rates: +// +// name frames per second +// +// fps_23_976() 23.976023... +// fps_24() 24.0 35mm film frames +// fps_25() 25.0 PAL video frames +// fps_29_97() 29.970029... NTSC video frames +// fps_30() 30.0 60Hz HDTV frames +// fps_47_952() 47.952047... +// fps_48() 48.0 +// fps_50() 50.0 PAL video fields +// fps_59_94() 59.940059... NTSC video fields +// fps_60() 60.0 60Hz HDTV fields +// +// Functions that try to convert inexact frame rates into exact ones: +// +// Given a frame rate, fps, that is close to one of the pre-defined +// frame rates fps_23_976(), fps_29_97(), fps_47_952() or fps_59_94(), +// guessExactFps(fps) returns the corresponding pre-defined frame +// rate. If fps is not close to one of the pre-defined frame rates, +// then guessExactFps(fps) returns Rational(fps). +// +//----------------------------------------------------------------------------- + +#include "ImfRational.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +inline Rational fps_23_976 () {return Rational (24000, 1001);} +inline Rational fps_24 () {return Rational (24, 1);} +inline Rational fps_25 () {return Rational (25, 1);} +inline Rational fps_29_97 () {return Rational (30000, 1001);} +inline Rational fps_30 () {return Rational (30, 1);} +inline Rational fps_47_952 () {return Rational (48000, 1001);} +inline Rational fps_48 () {return Rational (48, 1);} +inline Rational fps_50 () {return Rational (50, 1);} +inline Rational fps_59_94 () {return Rational (60000, 1001);} +inline Rational fps_60 () {return Rational (60, 1);} + +IMF_EXPORT Rational guessExactFps (double fps); +IMF_EXPORT Rational guessExactFps (const Rational &fps); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfGenericInputFile.cpp b/IlmImf/ImfGenericInputFile.cpp new file mode 100644 index 0000000..0096a0a --- /dev/null +++ b/IlmImf/ImfGenericInputFile.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfGenericInputFile.h" + +#include +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +void GenericInputFile::readMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int& version) +{ + // + // Read the magic number and the file format version number. + // Then check if we can read the rest of this file. + // + + int magic; + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, magic); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, version); + + if (magic != MAGIC) + { + throw IEX_NAMESPACE::InputExc ("File is not an image file."); + } + + if (getVersion (version) != EXR_VERSION) + { + THROW (IEX_NAMESPACE::InputExc, "Cannot read " + "version " << getVersion (version) << " " + "image files. Current file format version " + "is " << EXR_VERSION << "."); + } + + if (!supportsFlags (getFlags (version))) + { + THROW (IEX_NAMESPACE::InputExc, "The file format version number's flag field " + "contains unrecognized flags."); + } +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfGenericInputFile.h b/IlmImf/ImfGenericInputFile.h new file mode 100644 index 0000000..78b32ba --- /dev/null +++ b/IlmImf/ImfGenericInputFile.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFGENERICINPUTFILE_H_ +#define IMFGENERICINPUTFILE_H_ + +#include "ImfIO.h" +#include "ImfHeader.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class IMF_EXPORT GenericInputFile +{ + public: + virtual ~GenericInputFile() {} + + protected: + GenericInputFile() {} + void readMagicNumberAndVersionField(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int& version); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif /* IMFGENERICINPUTFILE_H_ */ diff --git a/IlmImf/ImfGenericOutputFile.cpp b/IlmImf/ImfGenericOutputFile.cpp new file mode 100644 index 0000000..8ec707b --- /dev/null +++ b/IlmImf/ImfGenericOutputFile.cpp @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfGenericOutputFile.h" + +#include +#include +#include +#include + +#include +#include + +#include "ImfNamespace.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using namespace std; + + + +void +GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, + const Header& header) +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, MAGIC); + + int version = EXR_VERSION; + + if (header.hasType() && isDeepData(header.type())) + { + version |= NON_IMAGE_FLAG; + } + else + { + // (TODO) we may want to check something else in function signature + // instead of hasTileDescription()? + if (header.hasTileDescription()) + version |= TILED_FLAG; + } + + if (usesLongNames (header)) + version |= LONG_NAMES_FLAG; + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, version); +} + +void +GenericOutputFile::writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, + const Header * headers, + int parts) +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, MAGIC); + + int version = EXR_VERSION; + + if (parts == 1) + { + if (headers[0].type() == TILEDIMAGE) + version |= TILED_FLAG; + } + else + { + version |= MULTI_PART_FILE_FLAG; + } + + for (int i = 0; i < parts; i++) + { + if (usesLongNames (headers[i])) + version |= LONG_NAMES_FLAG; + + if (headers[i].hasType() && isImage(headers[i].type()) == false) + version |= NON_IMAGE_FLAG; + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, version); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfGenericOutputFile.h b/IlmImf/ImfGenericOutputFile.h new file mode 100644 index 0000000..6b37f2a --- /dev/null +++ b/IlmImf/ImfGenericOutputFile.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFGENERICOUTPUTFILE_H_ +#define IMFGENERICOUTPUTFILE_H_ + +#include "ImfVersion.h" +#include "ImfIO.h" +#include "ImfXdr.h" +#include "ImfHeader.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT GenericOutputFile +{ + public: + virtual ~GenericOutputFile() {} + + protected: + GenericOutputFile() {} + void writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header& header); + void writeMagicNumberAndVersionField (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os, const Header * headers, int parts); + +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* GENERICOUTPUTFILE_H_ */ diff --git a/IlmImf/ImfHeader.cpp b/IlmImf/ImfHeader.cpp new file mode 100644 index 0000000..d6b55f3 --- /dev/null +++ b/IlmImf/ImfHeader.cpp @@ -0,0 +1,1283 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Header +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace std; +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using IMATH_NAMESPACE::V2f; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; + + +namespace { + +int maxImageWidth = 0; +int maxImageHeight = 0; +int maxTileWidth = 0; +int maxTileHeight = 0; + + +void +initialize (Header &header, + const Box2i &displayWindow, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +{ + header.insert ("displayWindow", Box2iAttribute (displayWindow)); + header.insert ("dataWindow", Box2iAttribute (dataWindow)); + header.insert ("pixelAspectRatio", FloatAttribute (pixelAspectRatio)); + header.insert ("screenWindowCenter", V2fAttribute (screenWindowCenter)); + header.insert ("screenWindowWidth", FloatAttribute (screenWindowWidth)); + header.insert ("lineOrder", LineOrderAttribute (lineOrder)); + header.insert ("compression", CompressionAttribute (compression)); + header.insert ("channels", ChannelListAttribute ()); +} + +template +void checkIsNullTerminated (const char (&str)[N], const char *what) +{ + for (size_t i = 0; i < N; ++i) { + if (str[i] == '\0') + return; + } + std::stringstream s; + s << "Invalid " << what << ": it is more than " << (N - 1) + << " characters long."; + throw IEX_NAMESPACE::InputExc(s); +} + +} // namespace + + +Header::Header (int width, + int height, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); + + initialize (*this, + displayWindow, + displayWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (int width, + int height, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); + + initialize (*this, + displayWindow, + dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (const Box2i &displayWindow, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + initialize (*this, + displayWindow, + dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (const Header &other): _map() +{ + for (AttributeMap::const_iterator i = other._map.begin(); + i != other._map.end(); + ++i) + { + insert (*i->first, *i->second); + } +} + + +Header::~Header () +{ + for (AttributeMap::iterator i = _map.begin(); + i != _map.end(); + ++i) + { + delete i->second; + } +} + + +Header & +Header::operator = (const Header &other) +{ + if (this != &other) + { + for (AttributeMap::iterator i = _map.begin(); + i != _map.end(); + ++i) + { + delete i->second; + } + + _map.erase (_map.begin(), _map.end()); + + for (AttributeMap::const_iterator i = other._map.begin(); + i != other._map.end(); + ++i) + { + insert (*i->first, *i->second); + } + } + + return *this; +} + + +void +Header::erase (const char name[]) +{ + if (name[0] == 0) + THROW (IEX_NAMESPACE::ArgExc, "Image attribute name cannot be an empty string."); + + + AttributeMap::iterator i = _map.find (name); + if (i != _map.end()) + _map.erase (i); + +} + + +void +Header::erase (const string &name) +{ + erase (name.c_str()); +} + + +void +Header::insert (const char name[], const Attribute &attribute) +{ + if (name[0] == 0) + THROW (IEX_NAMESPACE::ArgExc, "Image attribute name cannot be an empty string."); + + AttributeMap::iterator i = _map.find (name); + + if (i == _map.end()) + { + Attribute *tmp = attribute.copy(); + + try + { + _map[name] = tmp; + } + catch (...) + { + delete tmp; + throw; + } + } + else + { + if (strcmp (i->second->typeName(), attribute.typeName())) + THROW (IEX_NAMESPACE::TypeExc, "Cannot assign a value of " + "type \"" << attribute.typeName() << "\" " + "to image attribute \"" << name << "\" of " + "type \"" << i->second->typeName() << "\"."); + + Attribute *tmp = attribute.copy(); + delete i->second; + i->second = tmp; + } +} + + +void +Header::insert (const string &name, const Attribute &attribute) +{ + insert (name.c_str(), attribute); +} + + +Attribute & +Header::operator [] (const char name[]) +{ + AttributeMap::iterator i = _map.find (name); + + if (i == _map.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot find image attribute \"" << name << "\"."); + + return *i->second; +} + + +const Attribute & +Header::operator [] (const char name[]) const +{ + AttributeMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot find image attribute \"" << name << "\"."); + + return *i->second; +} + + +Attribute & +Header::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Attribute & +Header::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Header::Iterator +Header::begin () +{ + return _map.begin(); +} + + +Header::ConstIterator +Header::begin () const +{ + return _map.begin(); +} + + +Header::Iterator +Header::end () +{ + return _map.end(); +} + + +Header::ConstIterator +Header::end () const +{ + return _map.end(); +} + + +Header::Iterator +Header::find (const char name[]) +{ + return _map.find (name); +} + + +Header::ConstIterator +Header::find (const char name[]) const +{ + return _map.find (name); +} + + +Header::Iterator +Header::find (const string &name) +{ + return find (name.c_str()); +} + + +Header::ConstIterator +Header::find (const string &name) const +{ + return find (name.c_str()); +} + + +IMATH_NAMESPACE::Box2i & +Header::displayWindow () +{ + return static_cast + ((*this)["displayWindow"]).value(); +} + + +const IMATH_NAMESPACE::Box2i & +Header::displayWindow () const +{ + return static_cast + ((*this)["displayWindow"]).value(); +} + + +IMATH_NAMESPACE::Box2i & +Header::dataWindow () +{ + return static_cast + ((*this)["dataWindow"]).value(); +} + + +const IMATH_NAMESPACE::Box2i & +Header::dataWindow () const +{ + return static_cast + ((*this)["dataWindow"]).value(); +} + + +float & +Header::pixelAspectRatio () +{ + return static_cast + ((*this)["pixelAspectRatio"]).value(); +} + + +const float & +Header::pixelAspectRatio () const +{ + return static_cast + ((*this)["pixelAspectRatio"]).value(); +} + + +IMATH_NAMESPACE::V2f & +Header::screenWindowCenter () +{ + return static_cast + ((*this)["screenWindowCenter"]).value(); +} + + +const IMATH_NAMESPACE::V2f & +Header::screenWindowCenter () const +{ + return static_cast + ((*this)["screenWindowCenter"]).value(); +} + + +float & +Header::screenWindowWidth () +{ + return static_cast + ((*this)["screenWindowWidth"]).value(); +} + + +const float & +Header::screenWindowWidth () const +{ + return static_cast + ((*this)["screenWindowWidth"]).value(); +} + + +ChannelList & +Header::channels () +{ + return static_cast + ((*this)["channels"]).value(); +} + + +const ChannelList & +Header::channels () const +{ + return static_cast + ((*this)["channels"]).value(); +} + + +LineOrder & +Header::lineOrder () +{ + return static_cast + ((*this)["lineOrder"]).value(); +} + + +const LineOrder & +Header::lineOrder () const +{ + return static_cast + ((*this)["lineOrder"]).value(); +} + + +Compression & +Header::compression () +{ + return static_cast + ((*this)["compression"]).value(); +} + + +const Compression & +Header::compression () const +{ + return static_cast + ((*this)["compression"]).value(); +} + + +void +Header::setName(const string& name) +{ + insert ("name", StringAttribute (name)); +} + + +bool +Header::hasName() const +{ + return findTypedAttribute ("name") != 0; +} + + +string & +Header::name() +{ + return typedAttribute ("name").value(); +} + + +const string & +Header::name() const +{ + return typedAttribute ("name").value(); +} + + +void +Header::setType(const string& type) +{ + if (isSupportedType(type) == false) + { + throw IEX_NAMESPACE::ArgExc (type + "is not a supported image type." + + "The following are supported: " + + SCANLINEIMAGE + ", " + + TILEDIMAGE + ", " + + DEEPSCANLINE + " or " + + DEEPTILE + "."); + } + + insert ("type", StringAttribute (type)); + + // (TODO) Should we do it here? + if (isDeepData(type) && hasVersion() == false) + { + setVersion(1); + } +} + + +bool +Header::hasType() const +{ + return findTypedAttribute ("type") != 0; +} + + +string & +Header::type() +{ + return typedAttribute ("type").value(); +} + + +const string & +Header::type() const +{ + return typedAttribute ("type").value(); +} + + +void +Header::setView(const string& view) +{ + insert ("view", StringAttribute (view)); +} + + +bool +Header::hasView() const +{ + return findTypedAttribute ("view") != 0; +} + + +string & +Header::view() +{ + return typedAttribute ("view").value(); +} + + +const string & +Header::view() const +{ + return typedAttribute ("view").value(); +} + + +void +Header::setVersion(const int version) +{ + if (version != 1) + { + throw IEX_NAMESPACE::ArgExc ("We can only process version 1"); + } + + insert ("version", IntAttribute (version)); +} + + +bool +Header::hasVersion() const +{ + return findTypedAttribute ("version") != 0; +} + + +int & +Header::version() +{ + return typedAttribute ("version").value(); +} + + +const int & +Header::version() const +{ + return typedAttribute ("version").value(); +} + +void +Header::setChunkCount(int chunks) +{ + insert("chunkCount",IntAttribute(chunks)); +} + +bool +Header::hasChunkCount() const +{ + return findTypedAttribute("chunkCount") != 0; +} + +int& +Header::chunkCount() +{ + return typedAttribute ("chunkCount").value(); +} + +const int& +Header::chunkCount() const +{ + return typedAttribute ("chunkCount").value(); +} + +void +Header::setTileDescription(const TileDescription& td) +{ + insert ("tiles", TileDescriptionAttribute (td)); +} + + +bool +Header::hasTileDescription() const +{ + return findTypedAttribute ("tiles") != 0; +} + + +TileDescription & +Header::tileDescription () +{ + return typedAttribute ("tiles").value(); +} + + +const TileDescription & +Header::tileDescription () const +{ + return typedAttribute ("tiles").value(); +} + +void +Header::setPreviewImage (const PreviewImage &pi) +{ + insert ("preview", PreviewImageAttribute (pi)); +} + + +PreviewImage & +Header::previewImage () +{ + return typedAttribute ("preview").value(); +} + + +const PreviewImage & +Header::previewImage () const +{ + return typedAttribute ("preview").value(); +} + + +bool +Header::hasPreviewImage () const +{ + return findTypedAttribute ("preview") != 0; +} + + +void +Header::sanityCheck (bool isTiled, bool isMultipartFile) const +{ + // + // The display window and the data window must each + // contain at least one pixel. In addition, the + // coordinates of the window corners must be small + // enough to keep expressions like max-min+1 or + // max+min from overflowing. + // + + const Box2i &displayWindow = this->displayWindow(); + + if (displayWindow.min.x > displayWindow.max.x || + displayWindow.min.y > displayWindow.max.y || + displayWindow.min.x <= -(INT_MAX / 2) || + displayWindow.min.y <= -(INT_MAX / 2) || + displayWindow.max.x >= (INT_MAX / 2) || + displayWindow.max.y >= (INT_MAX / 2)) + { + throw IEX_NAMESPACE::ArgExc ("Invalid display window in image header."); + } + + const Box2i &dataWindow = this->dataWindow(); + + if (dataWindow.min.x > dataWindow.max.x || + dataWindow.min.y > dataWindow.max.y || + dataWindow.min.x <= -(INT_MAX / 2) || + dataWindow.min.y <= -(INT_MAX / 2) || + dataWindow.max.x >= (INT_MAX / 2) || + dataWindow.max.y >= (INT_MAX / 2)) + { + throw IEX_NAMESPACE::ArgExc ("Invalid data window in image header."); + } + + if (maxImageWidth > 0 && + maxImageWidth < (dataWindow.max.x - dataWindow.min.x + 1)) + { + THROW (IEX_NAMESPACE::ArgExc, "The width of the data window exceeds the " + "maximum width of " << maxImageWidth << "pixels."); + } + + if (maxImageHeight > 0 && + maxImageHeight < dataWindow.max.y - dataWindow.min.y + 1) + { + THROW (IEX_NAMESPACE::ArgExc, "The width of the data window exceeds the " + "maximum width of " << maxImageHeight << "pixels."); + } + + // chunk table must be smaller than the maximum image area + // (only reachable for unknown types or damaged files: will have thrown earlier + // for regular image types) + if( maxImageHeight>0 && maxImageWidth>0 && + hasChunkCount() && chunkCount()>Int64(maxImageWidth)*Int64(maxImageHeight)) + { + THROW (IEX_NAMESPACE::ArgExc, "chunkCount exceeds maximum area of " + << Int64(maxImageWidth)*Int64(maxImageHeight) << " pixels." ); + + } + + + // + // The pixel aspect ratio must be greater than 0. + // In applications, numbers like the the display or + // data window dimensions are likely to be multiplied + // or divided by the pixel aspect ratio; to avoid + // arithmetic exceptions, we limit the pixel aspect + // ratio to a range that is smaller than theoretically + // possible (real aspect ratios are likely to be close + // to 1.0 anyway). + // + + float pixelAspectRatio = this->pixelAspectRatio(); + + const float MIN_PIXEL_ASPECT_RATIO = 1e-6f; + const float MAX_PIXEL_ASPECT_RATIO = 1e+6f; + + if (pixelAspectRatio < MIN_PIXEL_ASPECT_RATIO || + pixelAspectRatio > MAX_PIXEL_ASPECT_RATIO) + { + throw IEX_NAMESPACE::ArgExc ("Invalid pixel aspect ratio in image header."); + } + + // + // The screen window width must not be less than 0. + // The size of the screen window can vary over a wide + // range (fish-eye lens to astronomical telescope), + // so we can't limit the screen window width to a + // small range. + // + + float screenWindowWidth = this->screenWindowWidth(); + + if (screenWindowWidth < 0) + throw IEX_NAMESPACE::ArgExc ("Invalid screen window width in image header."); + + // + // If the file has multiple parts, verify that each header has attribute + // name and type. + // (TODO) We may want to check more stuff here. + // + + if (isMultipartFile) + { + if (!hasName()) + { + throw IEX_NAMESPACE::ArgExc ("Headers in a multipart file should" + " have name attribute."); + } + + if (!hasType()) + { + throw IEX_NAMESPACE::ArgExc ("Headers in a multipart file should" + " have type attribute."); + } + + } + + const std::string & part_type=hasType() ? type() : ""; + + if(part_type!="" && !isSupportedType(part_type)) + { + // + // skip remaining sanity checks with unsupported types - they may not hold + // + return; + } + + + // + // If the file is tiled, verify that the tile description has reasonable + // values and check to see if the lineOrder is one of the predefined 3. + // If the file is not tiled, then the lineOrder can only be INCREASING_Y + // or DECREASING_Y. + // + + LineOrder lineOrder = this->lineOrder(); + + if (isTiled) + { + if (!hasTileDescription()) + { + throw IEX_NAMESPACE::ArgExc ("Tiled image has no tile " + "description attribute."); + } + + const TileDescription &tileDesc = tileDescription(); + + if (tileDesc.xSize <= 0 || tileDesc.ySize <= 0) + throw IEX_NAMESPACE::ArgExc ("Invalid tile size in image header."); + + if (maxTileWidth > 0 && + maxTileWidth < int(tileDesc.xSize)) + { + THROW (IEX_NAMESPACE::ArgExc, "The width of the tiles exceeds the maximum " + "width of " << maxTileWidth << "pixels."); + } + + if (maxTileHeight > 0 && + maxTileHeight < int(tileDesc.ySize)) + { + THROW (IEX_NAMESPACE::ArgExc, "The width of the tiles exceeds the maximum " + "width of " << maxTileHeight << "pixels."); + } + + if (tileDesc.mode != ONE_LEVEL && + tileDesc.mode != MIPMAP_LEVELS && + tileDesc.mode != RIPMAP_LEVELS) + throw IEX_NAMESPACE::ArgExc ("Invalid level mode in image header."); + + if (tileDesc.roundingMode != ROUND_UP && + tileDesc.roundingMode != ROUND_DOWN) + throw IEX_NAMESPACE::ArgExc ("Invalid level rounding mode in image header."); + + if (lineOrder != INCREASING_Y && + lineOrder != DECREASING_Y && + lineOrder != RANDOM_Y) + throw IEX_NAMESPACE::ArgExc ("Invalid line order in image header."); + } + else + { + if (lineOrder != INCREASING_Y && + lineOrder != DECREASING_Y) + throw IEX_NAMESPACE::ArgExc ("Invalid line order in image header."); + + + } + + // + // The compression method must be one of the predefined values. + // + + if (!isValidCompression (this->compression())) + throw IEX_NAMESPACE::ArgExc ("Unknown compression type in image header."); + + if(isDeepData(part_type)) + { + if (!isValidDeepCompression (this->compression())) + throw IEX_NAMESPACE::ArgExc ("Compression type in header not valid for deep data"); + } + + // + // Check the channel list: + // + // If the file is tiled then for each channel, the type must be one of the + // predefined values, and the x and y sampling must both be 1. + // + // If the file is not tiled then for each channel, the type must be one + // of the predefined values, the x and y coordinates of the data window's + // upper left corner must be divisible by the x and y subsampling factors, + // and the width and height of the data window must be divisible by the + // x and y subsampling factors. + // + + const ChannelList &channels = this->channels(); + + if (isTiled) + { + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::UINT && + i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF && + i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) + { + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" " + "image channel is invalid."); + } + + if (i.channel().xSampling != 1) + { + THROW (IEX_NAMESPACE::ArgExc, "The x subsampling factor for the " + "\"" << i.name() << "\" channel " + "is not 1."); + } + + if (i.channel().ySampling != 1) + { + THROW (IEX_NAMESPACE::ArgExc, "The y subsampling factor for the " + "\"" << i.name() << "\" channel " + "is not 1."); + } + } + } + else + { + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::UINT && + i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF && + i.channel().type != OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT) + { + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" " + "image channel is invalid."); + } + + if (i.channel().xSampling < 1) + { + THROW (IEX_NAMESPACE::ArgExc, "The x subsampling factor for the " + "\"" << i.name() << "\" channel " + "is invalid."); + } + + if (i.channel().ySampling < 1) + { + THROW (IEX_NAMESPACE::ArgExc, "The y subsampling factor for the " + "\"" << i.name() << "\" channel " + "is invalid."); + } + + if (dataWindow.min.x % i.channel().xSampling) + { + THROW (IEX_NAMESPACE::ArgExc, "The minimum x coordinate of the " + "image's data window is not a multiple " + "of the x subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if (dataWindow.min.y % i.channel().ySampling) + { + THROW (IEX_NAMESPACE::ArgExc, "The minimum y coordinate of the " + "image's data window is not a multiple " + "of the y subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if ((dataWindow.max.x - dataWindow.min.x + 1) % + i.channel().xSampling) + { + THROW (IEX_NAMESPACE::ArgExc, "Number of pixels per row in the " + "image's data window is not a multiple " + "of the x subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if ((dataWindow.max.y - dataWindow.min.y + 1) % + i.channel().ySampling) + { + THROW (IEX_NAMESPACE::ArgExc, "Number of pixels per column in the " + "image's data window is not a multiple " + "of the y subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + } + } +} + + +void +Header::setMaxImageSize (int maxWidth, int maxHeight) +{ + maxImageWidth = maxWidth; + maxImageHeight = maxHeight; +} + + +void +Header::setMaxTileSize (int maxWidth, int maxHeight) +{ + maxTileWidth = maxWidth; + maxTileHeight = maxHeight; +} + + +bool +Header::readsNothing() +{ + return _readsNothing; +} + + +Int64 +Header::writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, bool isTiled) const +{ + // + // Write a "magic number" to identify the file as an image file. + // Write the current file format version number. + // + + int version = EXR_VERSION; + + // + // Write all attributes. If we have a preview image attribute, + // keep track of its position in the file. + // + + Int64 previewPosition = 0; + + const Attribute *preview = + findTypedAttribute ("preview"); + + for (ConstIterator i = begin(); i != end(); ++i) + { + // + // Write the attribute's name and type. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, i.name()); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, i.attribute().typeName()); + + // + // Write the size of the attribute value, + // and the value itself. + // + + StdOSStream oss; + i.attribute().writeValueTo (oss, version); + + std::string s = oss.str(); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, (int) s.length()); + + if (&i.attribute() == preview) + previewPosition = os.tellp(); + + os.write (s.data(), int(s.length())); + } + + // + // Write zero-length attribute name to mark the end of the header. + // + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, ""); + + return previewPosition; +} + + +void +Header::readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int &version) +{ + // + // Read all attributes. + // + + int attrCount = 0; + + while (true) + { + // + // Read the name of the attribute. + // A zero-length attribute name indicates the end of the header. + // + + char name[Name::SIZE]; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, Name::MAX_LENGTH, name); + + if (name[0] == 0) + { + if (attrCount == 0) _readsNothing = true; + else _readsNothing = false; + break; + } + + attrCount++; + + checkIsNullTerminated (name, "attribute name"); + + // + // Read the attribute type and the size of the attribute value. + // + + char typeName[Name::SIZE]; + int size; + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, Name::MAX_LENGTH, typeName); + checkIsNullTerminated (typeName, "attribute type name"); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, size); + + AttributeMap::iterator i = _map.find (name); + + if (i != _map.end()) + { + // + // The attribute already exists (for example, + // because it is a predefined attribute). + // Read the attribute's new value from the file. + // + + if (strncmp (i->second->typeName(), typeName, sizeof (typeName))) + THROW (IEX_NAMESPACE::InputExc, "Unexpected type for image attribute " + "\"" << name << "\"."); + + i->second->readValueFrom (is, size, version); + } + else + { + // + // The new attribute does not exist yet. + // If the attribute type is of a known type, + // read the attribute value. If the attribute + // is of an unknown type, read its value and + // store it as an OpaqueAttribute. + // + + Attribute *attr; + + if (Attribute::knownType (typeName)) + attr = Attribute::newAttribute (typeName); + else + attr = new OpaqueAttribute (typeName); + + try + { + attr->readValueFrom (is, size, version); + _map[name] = attr; + } + catch (...) + { + delete attr; + throw; + } + } + } +} + + +void +staticInitialize () +{ + static Mutex criticalSection; + Lock lock (criticalSection); + + static bool initialized = false; + + if (!initialized) + { + // + // One-time initialization -- register + // some predefined attribute types. + // + + Box2fAttribute::registerAttributeType(); + Box2iAttribute::registerAttributeType(); + ChannelListAttribute::registerAttributeType(); + CompressionAttribute::registerAttributeType(); + ChromaticitiesAttribute::registerAttributeType(); + DeepImageStateAttribute::registerAttributeType(); + DoubleAttribute::registerAttributeType(); + EnvmapAttribute::registerAttributeType(); + FloatAttribute::registerAttributeType(); + FloatVectorAttribute::registerAttributeType(); + IntAttribute::registerAttributeType(); + KeyCodeAttribute::registerAttributeType(); + LineOrderAttribute::registerAttributeType(); + M33dAttribute::registerAttributeType(); + M33fAttribute::registerAttributeType(); + M44dAttribute::registerAttributeType(); + M44fAttribute::registerAttributeType(); + PreviewImageAttribute::registerAttributeType(); + RationalAttribute::registerAttributeType(); + StringAttribute::registerAttributeType(); + StringVectorAttribute::registerAttributeType(); + TileDescriptionAttribute::registerAttributeType(); + TimeCodeAttribute::registerAttributeType(); + V2dAttribute::registerAttributeType(); + V2fAttribute::registerAttributeType(); + V2iAttribute::registerAttributeType(); + V3dAttribute::registerAttributeType(); + V3fAttribute::registerAttributeType(); + V3iAttribute::registerAttributeType(); + DwaCompressor::initializeFuncs(); + + initialized = true; + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfHeader.h b/IlmImf/ImfHeader.h new file mode 100644 index 0000000..756a62e --- /dev/null +++ b/IlmImf/ImfHeader.h @@ -0,0 +1,699 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_HEADER_H +#define INCLUDED_IMF_HEADER_H + +//----------------------------------------------------------------------------- +// +// class Header +// +//----------------------------------------------------------------------------- + +#include "ImfLineOrder.h" +#include "ImfCompression.h" +#include "ImfName.h" +#include "ImfTileDescription.h" +#include "ImfInt64.h" +#include "ImathVec.h" +#include "ImathBox.h" +#include "IexBaseExc.h" + +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +#include +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +using std::string; + + +class IMF_EXPORT Header +{ + public: + + //---------------------------------------------------------------- + // Default constructor -- the display window and the data window + // are both set to Box2i (V2i (0, 0), V2i (width-1, height-1). + //---------------------------------------------------------------- + + Header (int width = 64, + int height = 64, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //-------------------------------------------------------------------- + // Constructor -- the data window is specified explicitly; the display + // window is set to Box2i (V2i (0, 0), V2i (width-1, height-1). + //-------------------------------------------------------------------- + + Header (int width, + int height, + const IMATH_NAMESPACE::Box2i &dataWindow, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //---------------------------------------------------------- + // Constructor -- the display window and the data window are + // both specified explicitly. + //---------------------------------------------------------- + + Header (const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //----------------- + // Copy constructor + //----------------- + + Header (const Header &other); + + + //----------- + // Destructor + //----------- + + ~Header (); + + + //----------- + // Assignment + //----------- + + Header & operator = (const Header &other); + + + //--------------------------------------------------------------- + // Add an attribute: + // + // insert(n,attr) If no attribute with name n exists, a new + // attribute with name n, and the same type as + // attr, is added, and the value of attr is + // copied into the new attribute. + // + // If an attribute with name n exists, and its + // type is the same as attr, the value of attr + // is copied into this attribute. + // + // If an attribute with name n exists, and its + // type is different from attr, an IEX_NAMESPACE::TypeExc + // is thrown. + // + //--------------------------------------------------------------- + + void insert (const char name[], + const Attribute &attribute); + + void insert (const std::string &name, + const Attribute &attribute); + + //--------------------------------------------------------------- + // Remove an attribute: + // + // remove(n) If an attribute with name n exists, then it + // is removed from the map of present attributes. + // + // If no attribute with name n exists, then this + // functions becomes a 'no-op' + // + //--------------------------------------------------------------- + void erase (const char name[]); + void erase (const std::string &name); + + + + //------------------------------------------------------------------ + // Access to existing attributes: + // + // [n] Returns a reference to the attribute + // with name n. If no attribute with + // name n exists, an IEX_NAMESPACE::ArgExc is thrown. + // + // typedAttribute(n) Returns a reference to the attribute + // with name n and type T. If no attribute + // with name n exists, an IEX_NAMESPACE::ArgExc is + // thrown. If an attribute with name n + // exists, but its type is not T, an + // IEX_NAMESPACE::TypeExc is thrown. + // + // findTypedAttribute(n) Returns a pointer to the attribute with + // name n and type T, or 0 if no attribute + // with name n and type T exists. + // + //------------------------------------------------------------------ + + Attribute & operator [] (const char name[]); + const Attribute & operator [] (const char name[]) const; + + Attribute & operator [] (const std::string &name); + const Attribute & operator [] (const std::string &name) const; + + template T& typedAttribute (const char name[]); + template const T& typedAttribute (const char name[]) const; + + template T& typedAttribute (const std::string &name); + template const T& typedAttribute (const std::string &name) const; + + template T* findTypedAttribute (const char name[]); + template const T* findTypedAttribute (const char name[]) const; + + template T* findTypedAttribute (const std::string &name); + template const T* findTypedAttribute (const std::string &name) + const; + + //--------------------------------------------- + // Iterator-style access to existing attributes + //--------------------------------------------- + + typedef std::map AttributeMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + + //-------------------------------- + // Access to predefined attributes + //-------------------------------- + + IMATH_NAMESPACE::Box2i & displayWindow (); + const IMATH_NAMESPACE::Box2i & displayWindow () const; + + IMATH_NAMESPACE::Box2i & dataWindow (); + const IMATH_NAMESPACE::Box2i & dataWindow () const; + + float & pixelAspectRatio (); + const float & pixelAspectRatio () const; + + IMATH_NAMESPACE::V2f & screenWindowCenter (); + const IMATH_NAMESPACE::V2f & screenWindowCenter () const; + + float & screenWindowWidth (); + const float & screenWindowWidth () const; + + ChannelList & channels (); + const ChannelList & channels () const; + + LineOrder & lineOrder (); + const LineOrder & lineOrder () const; + + Compression & compression (); + const Compression & compression () const; + + + //----------------------------------------------------- + // Access to required attributes for multipart files + // They are optional to non-multipart files and mandatory + // for multipart files. + //----------------------------------------------------- + void setName (const string& name); + + string& name(); + const string& name() const; + + bool hasName() const; + + void setType (const string& Type); + + string& type(); + const string& type() const; + + bool hasType() const; + + void setVersion (const int version); + + int& version(); + const int& version() const; + + bool hasVersion() const; + + // + // the chunkCount attribute is set automatically when a file is written. + // There is no need to set it manually + // + void setChunkCount(int chunks); + bool hasChunkCount() const; + const int & chunkCount() const; + int & chunkCount(); + + + // + // for multipart files, return whether the file has a view string attribute + // (for the deprecated single part multiview format EXR, see ImfMultiView.h) + // + void setView(const string & view); + bool hasView() const; + string & view(); + const string & view() const; + + + //---------------------------------------------------------------------- + // Tile Description: + // + // The tile description is a TileDescriptionAttribute whose name + // is "tiles". The "tiles" attribute must be present in any tiled + // image file. When present, it describes various properties of the + // tiles that make up the file. + // + // Convenience functions: + // + // setTileDescription(td) + // calls insert ("tiles", TileDescriptionAttribute (td)) + // + // tileDescription() + // returns typedAttribute("tiles").value() + // + // hasTileDescription() + // return findTypedAttribute("tiles") != 0 + // + //---------------------------------------------------------------------- + + void setTileDescription (const TileDescription & td); + + TileDescription & tileDescription (); + const TileDescription & tileDescription () const; + + bool hasTileDescription() const; + + + //---------------------------------------------------------------------- + // Preview image: + // + // The preview image is a PreviewImageAttribute whose name is "preview". + // This attribute is special -- while an image file is being written, + // the pixels of the preview image can be changed repeatedly by calling + // OutputFile::updatePreviewImage(). + // + // Convenience functions: + // + // setPreviewImage(p) + // calls insert ("preview", PreviewImageAttribute (p)) + // + // previewImage() + // returns typedAttribute("preview").value() + // + // hasPreviewImage() + // return findTypedAttribute("preview") != 0 + // + //---------------------------------------------------------------------- + + void setPreviewImage (const PreviewImage &p); + + PreviewImage & previewImage (); + const PreviewImage & previewImage () const; + + bool hasPreviewImage () const; + + + //------------------------------------------------------------- + // Sanity check -- examines the header, and throws an exception + // if it finds something wrong (empty display window, negative + // pixel aspect ratio, unknown compression sceme etc.) + // + // set isTiled to true if you are checking a tiled/multi-res + // header + //------------------------------------------------------------- + + void sanityCheck (bool isTiled = false, + bool isMultipartFile = false) const; + + + //---------------------------------------------------------------- + // Maximum image size and maximim tile size: + // + // sanityCheck() will throw an exception if the width or height of + // the data window exceeds the maximum image width or height, or + // if the size of a tile exceeds the maximum tile width or height. + // + // At program startup the maximum image and tile width and height + // are set to zero, meaning that width and height are unlimited. + // + // Limiting image and tile width and height limits how much memory + // will be allocated when a file is opened. This can help protect + // applications from running out of memory while trying to read + // a damaged image file. + //---------------------------------------------------------------- + + static void setMaxImageSize (int maxWidth, int maxHeight); + static void setMaxTileSize (int maxWidth, int maxHeight); + + // + // Check if the header reads nothing. + // + bool readsNothing(); + + + //------------------------------------------------------------------ + // Input and output: + // + // If the header contains a preview image attribute, then writeTo() + // returns the position of that attribute in the output stream; this + // information is used by OutputFile::updatePreviewImage(). + // If the header contains no preview image attribute, then writeTo() + // returns 0. + //------------------------------------------------------------------ + + + Int64 writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + bool isTiled = false) const; + + void readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int &version); + + + private: + + AttributeMap _map; + + bool _readsNothing; +}; + + +//---------- +// Iterators +//---------- + +class Header::Iterator +{ + public: + + Iterator (); + Iterator (const Header::AttributeMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Attribute & attribute () const; + + private: + + friend class Header::ConstIterator; + + Header::AttributeMap::iterator _i; +}; + + +class Header::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const Header::AttributeMap::const_iterator &i); + ConstIterator (const Header::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Attribute & attribute () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + Header::AttributeMap::const_iterator _i; +}; + + +//------------------------------------------------------------------------ +// Library initialization: +// +// In a multithreaded program, staticInitialize() must be called once +// during startup, before the program accesses any other functions or +// classes in the IlmImf library. Calling staticInitialize() in this +// way avoids races during initialization of the library's global +// variables. +// +// Single-threaded programs are not required to call staticInitialize(); +// initialization of the library's global variables happens automatically. +// +//------------------------------------------------------------------------ + +void staticInitialize (); + + +//----------------- +// Inline Functions +//----------------- + + +inline +Header::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +Header::Iterator::Iterator (const Header::AttributeMap::iterator &i): _i (i) +{ + // empty +} + + +inline Header::Iterator & +Header::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline Header::Iterator +Header::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +Header::Iterator::name () const +{ + return *_i->first; +} + + +inline Attribute & +Header::Iterator::attribute () const +{ + return *_i->second; +} + + +inline +Header::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +Header::ConstIterator::ConstIterator + (const Header::AttributeMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +Header::ConstIterator::ConstIterator (const Header::Iterator &other): + _i (other._i) +{ + // empty +} + +inline Header::ConstIterator & +Header::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline Header::ConstIterator +Header::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +Header::ConstIterator::name () const +{ + return *_i->first; +} + + +inline const Attribute & +Header::ConstIterator::attribute () const +{ + return *_i->second; +} + + +inline bool +operator == (const Header::ConstIterator &x, const Header::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const Header::ConstIterator &x, const Header::ConstIterator &y) +{ + return !(x == y); +} + + +//--------------------- +// Template definitions +//--------------------- + +template +T & +Header::typedAttribute (const char name[]) +{ + Attribute *attr = &(*this)[name]; + T *tattr = dynamic_cast (attr); + + if (tattr == 0) + throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); + + return *tattr; +} + + +template +const T & +Header::typedAttribute (const char name[]) const +{ + const Attribute *attr = &(*this)[name]; + const T *tattr = dynamic_cast (attr); + + if (tattr == 0) + throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type."); + + return *tattr; +} + + +template +T & +Header::typedAttribute (const std::string &name) +{ + return typedAttribute (name.c_str()); +} + + +template +const T & +Header::typedAttribute (const std::string &name) const +{ + return typedAttribute (name.c_str()); +} + + +template +T * +Header::findTypedAttribute (const char name[]) +{ + AttributeMap::iterator i = _map.find (name); + return (i == _map.end())? 0: dynamic_cast (i->second); +} + + +template +const T * +Header::findTypedAttribute (const char name[]) const +{ + AttributeMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: dynamic_cast (i->second); +} + + +template +T * +Header::findTypedAttribute (const std::string &name) +{ + return findTypedAttribute (name.c_str()); +} + + +template +const T * +Header::findTypedAttribute (const std::string &name) const +{ + return findTypedAttribute (name.c_str()); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfHuf.cpp b/IlmImf/ImfHuf.cpp new file mode 100644 index 0000000..a375d05 --- /dev/null +++ b/IlmImf/ImfHuf.cpp @@ -0,0 +1,1114 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//----------------------------------------------------------------------------- +// +// 16-bit Huffman compression and decompression. +// +// The source code in this file is derived from the 8-bit +// Huffman compression and decompression routines written +// by Christian Rouet for his PIZ image file format. +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImfAutoArray.h" +#include "ImfFastHuf.h" +#include "Iex.h" +#include +#include +#include + + +using namespace std; +using namespace IEX_NAMESPACE; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + + +const int HUF_ENCBITS = 16; // literal (value) bit length +const int HUF_DECBITS = 14; // decoding bit size (>= 8) + +const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size +const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size +const int HUF_DECMASK = HUF_DECSIZE - 1; + + +struct HufDec +{ // short code long code + //------------------------------- + int len:8; // code length 0 + int lit:24; // lit p size + int * p; // 0 lits +}; + + +void +invalidNBits () +{ + throw InputExc ("Error in header for Huffman-encoded data " + "(invalid number of bits)."); +} + + +void +tooMuchData () +{ + throw InputExc ("Error in Huffman-encoded data " + "(decoded data are longer than expected)."); +} + + +void +notEnoughData () +{ + throw InputExc ("Error in Huffman-encoded data " + "(decoded data are shorter than expected)."); +} + + +void +invalidCode () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code)."); +} + + +void +invalidTableSize () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code table size)."); +} + + +void +unexpectedEndOfTable () +{ + throw InputExc ("Error in Huffman-encoded data " + "(unexpected end of code table data)."); +} + + +void +tableTooLong () +{ + throw InputExc ("Error in Huffman-encoded data " + "(code table is longer than expected)."); +} + + +void +invalidTableEntry () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code table entry)."); +} + + +inline Int64 +hufLength (Int64 code) +{ + return code & 63; +} + + +inline Int64 +hufCode (Int64 code) +{ + return code >> 6; +} + + +inline void +outputBits (int nBits, Int64 bits, Int64 &c, int &lc, char *&out) +{ + c <<= nBits; + lc += nBits; + + c |= bits; + + while (lc >= 8) + *out++ = (c >> (lc -= 8)); +} + + +inline Int64 +getBits (int nBits, Int64 &c, int &lc, const char *&in) +{ + while (lc < nBits) + { + c = (c << 8) | *(unsigned char *)(in++); + lc += 8; + } + + lc -= nBits; + return (c >> lc) & ((1 << nBits) - 1); +} + + +// +// ENCODING TABLE BUILDING & (UN)PACKING +// + +// +// Build a "canonical" Huffman code table: +// - for each (uncompressed) symbol, hcode contains the length +// of the corresponding code (in the compressed data) +// - canonical codes are computed and stored in hcode +// - the rules for constructing canonical codes are as follows: +// * shorter codes (if filled with zeroes to the right) +// have a numerically higher value than longer codes +// * for codes with the same length, numerical values +// increase with numerical symbol values +// - because the canonical code table can be constructed from +// symbol lengths alone, the code table can be transmitted +// without sending the actual code values +// - see http://www.compressconsult.com/huffman/ +// + +void +hufCanonicalCodeTable (Int64 hcode[HUF_ENCSIZE]) +{ + Int64 n[59]; + + // + // For each i from 0 through 58, count the + // number of different codes of length i, and + // store the count in n[i]. + // + + for (int i = 0; i <= 58; ++i) + n[i] = 0; + + for (int i = 0; i < HUF_ENCSIZE; ++i) + n[hcode[i]] += 1; + + // + // For each i from 58 through 1, compute the + // numerically lowest code with length i, and + // store that code in n[i]. + // + + Int64 c = 0; + + for (int i = 58; i > 0; --i) + { + Int64 nc = ((c + n[i]) >> 1); + n[i] = c; + c = nc; + } + + // + // hcode[i] contains the length, l, of the + // code for symbol i. Assign the next available + // code of length l to the symbol and store both + // l and the code in hcode[i]. + // + + for (int i = 0; i < HUF_ENCSIZE; ++i) + { + int l = hcode[i]; + + if (l > 0) + hcode[i] = l | (n[l]++ << 6); + } +} + + +// +// Compute Huffman codes (based on frq input) and store them in frq: +// - code structure is : [63:lsb - 6:msb] | [5-0: bit length]; +// - max code length is 58 bits; +// - codes outside the range [im-iM] have a null length (unused values); +// - original frequencies are destroyed; +// - encoding tables are used by hufEncode() and hufBuildDecTable(); +// + + +struct FHeapCompare +{ + bool operator () (Int64 *a, Int64 *b) {return *a > *b;} +}; + + +void +hufBuildEncTable + (Int64* frq, // io: input frequencies [HUF_ENCSIZE], output table + int* im, // o: min frq index + int* iM) // o: max frq index +{ + // + // This function assumes that when it is called, array frq + // indicates the frequency of all possible symbols in the data + // that are to be Huffman-encoded. (frq[i] contains the number + // of occurrences of symbol i in the data.) + // + // The loop below does three things: + // + // 1) Finds the minimum and maximum indices that point + // to non-zero entries in frq: + // + // frq[im] != 0, and frq[i] == 0 for all i < im + // frq[iM] != 0, and frq[i] == 0 for all i > iM + // + // 2) Fills array fHeap with pointers to all non-zero + // entries in frq. + // + // 3) Initializes array hlink such that hlink[i] == i + // for all array entries. + // + + AutoArray hlink; + AutoArray fHeap; + + *im = 0; + + while (!frq[*im]) + (*im)++; + + int nf = 0; + + for (int i = *im; i < HUF_ENCSIZE; i++) + { + hlink[i] = i; + + if (frq[i]) + { + fHeap[nf] = &frq[i]; + nf++; + *iM = i; + } + } + + // + // Add a pseudo-symbol, with a frequency count of 1, to frq; + // adjust the fHeap and hlink array accordingly. Function + // hufEncode() uses the pseudo-symbol for run-length encoding. + // + + (*iM)++; + frq[*iM] = 1; + fHeap[nf] = &frq[*iM]; + nf++; + + // + // Build an array, scode, such that scode[i] contains the number + // of bits assigned to symbol i. Conceptually this is done by + // constructing a tree whose leaves are the symbols with non-zero + // frequency: + // + // Make a heap that contains all symbols with a non-zero frequency, + // with the least frequent symbol on top. + // + // Repeat until only one symbol is left on the heap: + // + // Take the two least frequent symbols off the top of the heap. + // Create a new node that has first two nodes as children, and + // whose frequency is the sum of the frequencies of the first + // two nodes. Put the new node back into the heap. + // + // The last node left on the heap is the root of the tree. For each + // leaf node, the distance between the root and the leaf is the length + // of the code for the corresponding symbol. + // + // The loop below doesn't actually build the tree; instead we compute + // the distances of the leaves from the root on the fly. When a new + // node is added to the heap, then that node's descendants are linked + // into a single linear list that starts at the new node, and the code + // lengths of the descendants (that is, their distance from the root + // of the tree) are incremented by one. + // + + make_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + AutoArray scode; + memset (scode, 0, sizeof (Int64) * HUF_ENCSIZE); + + while (nf > 1) + { + // + // Find the indices, mm and m, of the two smallest non-zero frq + // values in fHeap, add the smallest frq to the second-smallest + // frq, and remove the smallest frq value from fHeap. + // + + int mm = fHeap[0] - frq; + pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + --nf; + + int m = fHeap[0] - frq; + pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + frq[m ] += frq[mm]; + push_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + // + // The entries in scode are linked into lists with the + // entries in hlink serving as "next" pointers and with + // the end of a list marked by hlink[j] == j. + // + // Traverse the lists that start at scode[m] and scode[mm]. + // For each element visited, increment the length of the + // corresponding code by one bit. (If we visit scode[j] + // during the traversal, then the code for symbol j becomes + // one bit longer.) + // + // Merge the lists that start at scode[m] and scode[mm] + // into a single list that starts at scode[m]. + // + + // + // Add a bit to all codes in the first list. + // + + for (int j = m; true; j = hlink[j]) + { + scode[j]++; + + assert (scode[j] <= 58); + + if (hlink[j] == j) + { + // + // Merge the two lists. + // + + hlink[j] = mm; + break; + } + } + + // + // Add a bit to all codes in the second list + // + + for (int j = mm; true; j = hlink[j]) + { + scode[j]++; + + assert (scode[j] <= 58); + + if (hlink[j] == j) + break; + } + } + + // + // Build a canonical Huffman code table, replacing the code + // lengths in scode with (code, code length) pairs. Copy the + // code table from scode into frq. + // + + hufCanonicalCodeTable (scode); + memcpy (frq, scode, sizeof (Int64) * HUF_ENCSIZE); +} + + +// +// Pack an encoding table: +// - only code lengths, not actual codes, are stored +// - runs of zeroes are compressed as follows: +// +// unpacked packed +// -------------------------------- +// 1 zero 0 (6 bits) +// 2 zeroes 59 +// 3 zeroes 60 +// 4 zeroes 61 +// 5 zeroes 62 +// n zeroes (6 or more) 63 n-6 (6 + 8 bits) +// + +const int SHORT_ZEROCODE_RUN = 59; +const int LONG_ZEROCODE_RUN = 63; +const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; +const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN; + + +void +hufPackEncTable + (const Int64* hcode, // i : encoding table [HUF_ENCSIZE] + int im, // i : min hcode index + int iM, // i : max hcode index + char** pcode) // o: ptr to packed table (updated) +{ + char *p = *pcode; + Int64 c = 0; + int lc = 0; + + for (; im <= iM; im++) + { + int l = hufLength (hcode[im]); + + if (l == 0) + { + int zerun = 1; + + while ((im < iM) && (zerun < LONGEST_LONG_RUN)) + { + if (hufLength (hcode[im+1]) > 0 ) + break; + im++; + zerun++; + } + + if (zerun >= 2) + { + if (zerun >= SHORTEST_LONG_RUN) + { + outputBits (6, LONG_ZEROCODE_RUN, c, lc, p); + outputBits (8, zerun - SHORTEST_LONG_RUN, c, lc, p); + } + else + { + outputBits (6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p); + } + continue; + } + } + + outputBits (6, l, c, lc, p); + } + + if (lc > 0) + *p++ = (unsigned char) (c << (8 - lc)); + + *pcode = p; +} + + +// +// Unpack an encoding table packed by hufPackEncTable(): +// + +void +hufUnpackEncTable + (const char** pcode, // io: ptr to packed table (updated) + int ni, // i : input size (in bytes) + int im, // i : min hcode index + int iM, // i : max hcode index + Int64* hcode) // o: encoding table [HUF_ENCSIZE] +{ + memset (hcode, 0, sizeof (Int64) * HUF_ENCSIZE); + + const char *p = *pcode; + Int64 c = 0; + int lc = 0; + + for (; im <= iM; im++) + { + if (p - *pcode > ni) + unexpectedEndOfTable(); + + Int64 l = hcode[im] = getBits (6, c, lc, p); // code length + + if (l == (Int64) LONG_ZEROCODE_RUN) + { + if (p - *pcode > ni) + unexpectedEndOfTable(); + + int zerun = getBits (8, c, lc, p) + SHORTEST_LONG_RUN; + + if (im + zerun > iM + 1) + tableTooLong(); + + while (zerun--) + hcode[im++] = 0; + + im--; + } + else if (l >= (Int64) SHORT_ZEROCODE_RUN) + { + int zerun = l - SHORT_ZEROCODE_RUN + 2; + + if (im + zerun > iM + 1) + tableTooLong(); + + while (zerun--) + hcode[im++] = 0; + + im--; + } + } + + *pcode = const_cast(p); + + hufCanonicalCodeTable (hcode); +} + + +// +// DECODING TABLE BUILDING +// + +// +// Clear a newly allocated decoding table so that it contains only zeroes. +// + +void +hufClearDecTable + (HufDec * hdecod) // io: (allocated by caller) + // decoding table [HUF_DECSIZE] +{ + memset (hdecod, 0, sizeof (HufDec) * HUF_DECSIZE); +} + + +// +// Build a decoding hash table based on the encoding table hcode: +// - short codes (<= HUF_DECBITS) are resolved with a single table access; +// - long code entry allocations are not optimized, because long codes are +// unfrequent; +// - decoding tables are used by hufDecode(); +// + +void +hufBuildDecTable + (const Int64* hcode, // i : encoding table + int im, // i : min index in hcode + int iM, // i : max index in hcode + HufDec * hdecod) // o: (allocated by caller) + // decoding table [HUF_DECSIZE] +{ + // + // Init hashtable & loop on all codes. + // Assumes that hufClearDecTable(hdecod) has already been called. + // + + for (; im <= iM; im++) + { + Int64 c = hufCode (hcode[im]); + int l = hufLength (hcode[im]); + + if (c >> l) + { + // + // Error: c is supposed to be an l-bit code, + // but c contains a value that is greater + // than the largest l-bit number. + // + + invalidTableEntry(); + } + + if (l > HUF_DECBITS) + { + // + // Long code: add a secondary entry + // + + HufDec *pl = hdecod + (c >> (l - HUF_DECBITS)); + + if (pl->len) + { + // + // Error: a short code has already + // been stored in table entry *pl. + // + + invalidTableEntry(); + } + + pl->lit++; + + if (pl->p) + { + int *p = pl->p; + pl->p = new int [pl->lit]; + + for (int i = 0; i < pl->lit - 1; ++i) + pl->p[i] = p[i]; + + delete [] p; + } + else + { + pl->p = new int [1]; + } + + pl->p[pl->lit - 1]= im; + } + else if (l) + { + // + // Short code: init all primary entries + // + + HufDec *pl = hdecod + (c << (HUF_DECBITS - l)); + + for (Int64 i = 1 << (HUF_DECBITS - l); i > 0; i--, pl++) + { + if (pl->len || pl->p) + { + // + // Error: a short code or a long code has + // already been stored in table entry *pl. + // + + invalidTableEntry(); + } + + pl->len = l; + pl->lit = im; + } + } + } +} + + +// +// Free the long code entries of a decoding table built by hufBuildDecTable() +// + +void +hufFreeDecTable (HufDec *hdecod) // io: Decoding table +{ + for (int i = 0; i < HUF_DECSIZE; i++) + { + if (hdecod[i].p) + { + delete [] hdecod[i].p; + hdecod[i].p = 0; + } + } +} + + +// +// ENCODING +// + +inline void +outputCode (Int64 code, Int64 &c, int &lc, char *&out) +{ + outputBits (hufLength (code), hufCode (code), c, lc, out); +} + + +inline void +sendCode (Int64 sCode, int runCount, Int64 runCode, + Int64 &c, int &lc, char *&out) +{ + // + // Output a run of runCount instances of the symbol sCount. + // Output the symbols explicitly, or if that is shorter, output + // the sCode symbol once followed by a runCode symbol and runCount + // expressed as an 8-bit number. + // + + if (hufLength (sCode) + hufLength (runCode) + 8 < + hufLength (sCode) * runCount) + { + outputCode (sCode, c, lc, out); + outputCode (runCode, c, lc, out); + outputBits (8, runCount, c, lc, out); + } + else + { + while (runCount-- >= 0) + outputCode (sCode, c, lc, out); + } +} + + +// +// Encode (compress) ni values based on the Huffman encoding table hcode: +// + +int +hufEncode // return: output size (in bits) + (const Int64* hcode, // i : encoding table + const unsigned short* in, // i : uncompressed input buffer + const int ni, // i : input buffer size (in bytes) + int rlc, // i : rl code + char* out) // o: compressed output buffer +{ + char *outStart = out; + Int64 c = 0; // bits not yet written to out + int lc = 0; // number of valid bits in c (LSB) + int s = in[0]; + int cs = 0; + + // + // Loop on input values + // + + for (int i = 1; i < ni; i++) + { + // + // Count same values or send code + // + + if (s == in[i] && cs < 255) + { + cs++; + } + else + { + sendCode (hcode[s], cs, hcode[rlc], c, lc, out); + cs=0; + } + + s = in[i]; + } + + // + // Send remaining code + // + + sendCode (hcode[s], cs, hcode[rlc], c, lc, out); + + if (lc) + *out = (c << (8 - lc)) & 0xff; + + return (out - outStart) * 8 + lc; +} + + +// +// DECODING +// + +// +// In order to force the compiler to inline them, +// getChar() and getCode() are implemented as macros +// instead of "inline" functions. +// + +#define getChar(c, lc, in) \ +{ \ + c = (c << 8) | *(unsigned char *)(in++); \ + lc += 8; \ +} + + +#define getCode(po, rlc, c, lc, in, out, oe) \ +{ \ + if (po == rlc) \ + { \ + if (lc < 8) \ + getChar(c, lc, in); \ + \ + lc -= 8; \ + \ + unsigned char cs = (c >> lc); \ + \ + if (out + cs > oe) \ + tooMuchData(); \ + \ + unsigned short s = out[-1]; \ + \ + while (cs-- > 0) \ + *out++ = s; \ + } \ + else if (out < oe) \ + { \ + *out++ = po; \ + } \ + else \ + { \ + tooMuchData(); \ + } \ +} + + +// +// Decode (uncompress) ni bits based on encoding & decoding tables: +// + +void +hufDecode + (const Int64 * hcode, // i : encoding table + const HufDec * hdecod, // i : decoding table + const char* in, // i : compressed input buffer + int ni, // i : input size (in bits) + int rlc, // i : run-length code + int no, // i : expected output size (in bytes) + unsigned short* out) // o: uncompressed output buffer +{ + Int64 c = 0; + int lc = 0; + unsigned short * outb = out; + unsigned short * oe = out + no; + const char * ie = in + (ni + 7) / 8; // input byte size + + // + // Loop on input bytes + // + + while (in < ie) + { + getChar (c, lc, in); + + // + // Access decoding table + // + + while (lc >= HUF_DECBITS) + { + const HufDec pl = hdecod[(c >> (lc-HUF_DECBITS)) & HUF_DECMASK]; + + if (pl.len) + { + // + // Get short code + // + + lc -= pl.len; + getCode (pl.lit, rlc, c, lc, in, out, oe); + } + else + { + if (!pl.p) + invalidCode(); // wrong code + + // + // Search long code + // + + int j; + + for (j = 0; j < pl.lit; j++) + { + int l = hufLength (hcode[pl.p[j]]); + + while (lc < l && in < ie) // get more bits + getChar (c, lc, in); + + if (lc >= l) + { + if (hufCode (hcode[pl.p[j]]) == + ((c >> (lc - l)) & ((Int64(1) << l) - 1))) + { + // + // Found : get long code + // + + lc -= l; + getCode (pl.p[j], rlc, c, lc, in, out, oe); + break; + } + } + } + + if (j == pl.lit) + invalidCode(); // Not found + } + } + } + + // + // Get remaining (short) codes + // + + int i = (8 - ni) & 7; + c >>= i; + lc -= i; + + while (lc > 0) + { + const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK]; + + if (pl.len) + { + lc -= pl.len; + getCode (pl.lit, rlc, c, lc, in, out, oe); + } + else + { + invalidCode(); // wrong (long) code + } + } + + if (out - outb != no) + notEnoughData (); +} + + +void +countFrequencies (Int64 freq[HUF_ENCSIZE], + const unsigned short data[/*n*/], + int n) +{ + for (int i = 0; i < HUF_ENCSIZE; ++i) + freq[i] = 0; + + for (int i = 0; i < n; ++i) + ++freq[data[i]]; +} + + +void +writeUInt (char buf[4], unsigned int i) +{ + unsigned char *b = (unsigned char *) buf; + + b[0] = i; + b[1] = i >> 8; + b[2] = i >> 16; + b[3] = i >> 24; +} + + +unsigned int +readUInt (const char buf[4]) +{ + const unsigned char *b = (const unsigned char *) buf; + + return ( b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + ((b[3] << 24) & 0xff000000); +} + +} // namespace + + +// +// EXTERNAL INTERFACE +// + + +int +hufCompress (const unsigned short raw[], + int nRaw, + char compressed[]) +{ + if (nRaw == 0) + return 0; + + AutoArray freq; + + countFrequencies (freq, raw, nRaw); + + int im = 0; + int iM = 0; + hufBuildEncTable (freq, &im, &iM); + + char *tableStart = compressed + 20; + char *tableEnd = tableStart; + hufPackEncTable (freq, im, iM, &tableEnd); + int tableLength = tableEnd - tableStart; + + char *dataStart = tableEnd; + int nBits = hufEncode (freq, raw, nRaw, iM, dataStart); + int dataLength = (nBits + 7) / 8; + + writeUInt (compressed, im); + writeUInt (compressed + 4, iM); + writeUInt (compressed + 8, tableLength); + writeUInt (compressed + 12, nBits); + writeUInt (compressed + 16, 0); // room for future extensions + + return dataStart + dataLength - compressed; +} + + +void +hufUncompress (const char compressed[], + int nCompressed, + unsigned short raw[], + int nRaw) +{ + if (nCompressed == 0) + { + if (nRaw != 0) + notEnoughData(); + + return; + } + + int im = readUInt (compressed); + int iM = readUInt (compressed + 4); + // int tableLength = readUInt (compressed + 8); + int nBits = readUInt (compressed + 12); + + if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) + invalidTableSize(); + + const char *ptr = compressed + 20; + + // + // Fast decoder needs at least 2x64-bits of compressed data, and + // needs to be run-able on this platform. Otherwise, fall back + // to the original decoder + // + + if (FastHufDecoder::enabled() && nBits > 128) + { + FastHufDecoder fhd (ptr, nCompressed - (ptr - compressed), im, iM, iM); + fhd.decode ((unsigned char*)ptr, nBits, raw, nRaw); + } + else + { + AutoArray freq; + AutoArray hdec; + + hufClearDecTable (hdec); + + hufUnpackEncTable (&ptr, + nCompressed - (ptr - compressed), + im, + iM, + freq); + + try + { + if (nBits > 8 * (nCompressed - (ptr - compressed))) + invalidNBits(); + + hufBuildDecTable (freq, im, iM, hdec); + hufDecode (freq, hdec, ptr, nBits, iM, nRaw, raw); + } + catch (...) + { + hufFreeDecTable (hdec); + throw; + } + + hufFreeDecTable (hdec); + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfHuf.h b/IlmImf/ImfHuf.h new file mode 100644 index 0000000..fa89604 --- /dev/null +++ b/IlmImf/ImfHuf.h @@ -0,0 +1,82 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_HUF_H +#define INCLUDED_IMF_HUF_H + +#include "ImfExport.h" +#include "ImfNamespace.h" + +//----------------------------------------------------------------------------- +// +// 16-bit Huffman compression and decompression: +// +// hufCompress (r, nr, c) +// +// Compresses the contents of array r (of length nr), +// stores the compressed data in array c, and returns +// the size of the compressed data (in bytes). +// +// To avoid buffer overflows, the size of array c should +// be at least 2 * nr + 65536. +// +// hufUncompress (c, nc, r, nr) +// +// Uncompresses the data in array c (with length nc), +// and stores the results in array r (with length nr). +// +//----------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +IMF_EXPORT +int +hufCompress (const unsigned short raw[/*nRaw*/], + int nRaw, + char compressed[/*2 * nRaw + 65536*/]); + +IMF_EXPORT +void +hufUncompress (const char compressed[/*nCompressed*/], + int nCompressed, + unsigned short raw[/*nRaw*/], + int nRaw); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfIO.cpp b/IlmImf/ImfIO.cpp new file mode 100644 index 0000000..c52fc54 --- /dev/null +++ b/IlmImf/ImfIO.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR. +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +IStream::IStream (const char fileName[]): _fileName (fileName) +{ + // empty +} + + +IStream::~IStream () +{ + // empty +} + + +bool +IStream::isMemoryMapped () const +{ + return false; +} + + +char * +IStream::readMemoryMapped (int n) +{ + throw IEX_NAMESPACE::InputExc ("Attempt to perform a memory-mapped read " + "on a file that is not memory mapped."); + return 0; +} + + +void +IStream::clear () +{ + // empty +} + + +const char * +IStream::fileName () const +{ + return _fileName.c_str(); +} + + +OStream::OStream (const char fileName[]): _fileName (fileName) +{ + // empty +} + + +OStream::~OStream () +{ + // empty +} + + +const char * +OStream::fileName () const +{ + return _fileName.c_str(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfIO.h b/IlmImf/ImfIO.h new file mode 100644 index 0000000..4416d17 --- /dev/null +++ b/IlmImf/ImfIO.h @@ -0,0 +1,255 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_IO_H +#define INCLUDED_IMF_IO_H + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR. +// +//----------------------------------------------------------------------------- + +#include "ImfInt64.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//----------------------------------------------------------- +// class IStream -- an abstract base class for input streams. +//----------------------------------------------------------- + +class IMF_EXPORT IStream +{ + public: + + //----------- + // Destructor + //----------- + + virtual ~IStream (); + + + //------------------------------------------------- + // Does this input stream support memory-mapped IO? + // + // Memory-mapped streams can avoid an extra copy; + // memory-mapped read operations return a pointer + // to an internal buffer instead of copying data + // into a buffer supplied by the caller. + //------------------------------------------------- + + virtual bool isMemoryMapped () const; + + + //------------------------------------------------------ + // Read from the stream: + // + // read(c,n) reads n bytes from the stream, and stores + // them in array c. If the stream contains less than n + // bytes, or if an I/O error occurs, read(c,n) throws + // an exception. If read(c,n) reads the last byte from + // the file it returns false, otherwise it returns true. + //------------------------------------------------------ + + virtual bool read (char c[/*n*/], int n) = 0; + + + //--------------------------------------------------- + // Read from a memory-mapped stream: + // + // readMemoryMapped(n) reads n bytes from the stream + // and returns a pointer to the first byte. The + // returned pointer remains valid until the stream + // is closed. If there are less than n byte left to + // read in the stream or if the stream is not memory- + // mapped, readMemoryMapped(n) throws an exception. + //--------------------------------------------------- + + virtual char * readMemoryMapped (int n); + + + //-------------------------------------------------------- + // Get the current reading position, in bytes from the + // beginning of the file. If the next call to read() will + // read the first byte in the file, tellg() returns 0. + //-------------------------------------------------------- + + virtual Int64 tellg () = 0; + + + //------------------------------------------- + // Set the current reading position. + // After calling seekg(i), tellg() returns i. + //------------------------------------------- + + virtual void seekg (Int64 pos) = 0; + + + //------------------------------------------------------ + // Clear error conditions after an operation has failed. + //------------------------------------------------------ + + virtual void clear (); + + + //------------------------------------------------------ + // Get the name of the file associated with this stream. + //------------------------------------------------------ + + const char * fileName () const; + + protected: + + IStream (const char fileName[]); + + private: + + IStream (const IStream &); // not implemented + IStream & operator = (const IStream &); // not implemented + + std::string _fileName; +}; + + +//----------------------------------------------------------- +// class OStream -- an abstract base class for output streams +//----------------------------------------------------------- + +class IMF_EXPORT OStream +{ + public: + + //----------- + // Destructor + //----------- + + virtual ~OStream (); + + + //---------------------------------------------------------- + // Write to the stream: + // + // write(c,n) takes n bytes from array c, and stores them + // in the stream. If an I/O error occurs, write(c,n) throws + // an exception. + //---------------------------------------------------------- + + virtual void write (const char c[/*n*/], int n) = 0; + + + //--------------------------------------------------------- + // Get the current writing position, in bytes from the + // beginning of the file. If the next call to write() will + // start writing at the beginning of the file, tellp() + // returns 0. + //--------------------------------------------------------- + + virtual Int64 tellp () = 0; + + + //------------------------------------------- + // Set the current writing position. + // After calling seekp(i), tellp() returns i. + //------------------------------------------- + + virtual void seekp (Int64 pos) = 0; + + + //------------------------------------------------------ + // Get the name of the file associated with this stream. + //------------------------------------------------------ + + const char * fileName () const; + + protected: + + OStream (const char fileName[]); + + private: + + OStream (const OStream &); // not implemented + OStream & operator = (const OStream &); // not implemented + + std::string _fileName; +}; + + +//----------------------- +// Helper classes for Xdr +//----------------------- + +struct StreamIO +{ + static void + writeChars (OStream &os, const char c[/*n*/], int n) + { + os.write (c, n); + } + + static bool + readChars (IStream &is, char c[/*n*/], int n) + { + return is.read (c, n); + } +}; + + +struct CharPtrIO +{ + static void + writeChars (char *&op, const char c[/*n*/], int n) + { + while (n--) + *op++ = *c++; + } + + static bool + readChars (const char *&ip, char c[/*n*/], int n) + { + while (n--) + *c++ = *ip++; + + return true; + } +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfInputFile.cpp b/IlmImf/ImfInputFile.cpp new file mode 100644 index 0000000..3f4f861 --- /dev/null +++ b/IlmImf/ImfInputFile.cpp @@ -0,0 +1,895 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class InputFile +// +//----------------------------------------------------------------------------- + +#include "ImfInputFile.h" +#include "ImfScanLineInputFile.h" +#include "ImfTiledInputFile.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfStdIO.h" +#include "ImfVersion.h" +#include "ImfPartType.h" +#include "ImfInputPartData.h" +#include "ImfMultiPartInputFile.h" + +#include +#include + +#include "ImathFun.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include "half.h" + +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; + + +// +// Struct InputFile::Data stores things that will be +// needed between calls to readPixels +// + +struct InputFile::Data : public Mutex +{ + Header header; + int version; + bool isTiled; + + TiledInputFile * tFile; + ScanLineInputFile * sFile; + DeepScanLineInputFile * dsFile; + + LineOrder lineOrder; // the file's lineorder + int minY; // data window's min y coord + int maxY; // data window's max x coord + + FrameBuffer tFileBuffer; + FrameBuffer * cachedBuffer; + CompositeDeepScanLine * compositor; // for loading deep files + + int cachedTileY; + int offset; + + int numThreads; + + int partNumber; + InputPartData* part; + + bool multiPartBackwardSupport; + MultiPartInputFile* multiPartFile; + InputStreamMutex * _streamData; + bool _deleteStream; + + Data (int numThreads); + ~Data (); + + void deleteCachedBuffer(); +}; + + +InputFile::Data::Data (int numThreads): + isTiled (false), + tFile (0), + sFile (0), + dsFile(0), + cachedBuffer (0), + compositor(0), + cachedTileY (-1), + numThreads (numThreads), + partNumber (-1), + part(NULL), + multiPartBackwardSupport (false), + multiPartFile (0), + _streamData(0), + _deleteStream(false) + +{ + // empty +} + + +InputFile::Data::~Data () +{ + if (tFile) + delete tFile; + if (sFile) + delete sFile; + if (dsFile) + delete dsFile; + if (compositor) + delete compositor; + + deleteCachedBuffer(); + + if (multiPartBackwardSupport && multiPartFile) + delete multiPartFile; +} + + +void +InputFile::Data::deleteCachedBuffer() +{ + // + // Delete the cached frame buffer, and all memory + // allocated for the slices in the cached frameBuffer. + // + + if (cachedBuffer) + { + for (FrameBuffer::Iterator k = cachedBuffer->begin(); + k != cachedBuffer->end(); + ++k) + { + Slice &s = k.slice(); + + switch (s.type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + delete [] (((unsigned int *)s.base) + offset); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + delete [] ((half *)s.base + offset); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + delete [] (((float *)s.base) + offset); + break; + case NUM_PIXELTYPES : + throw(IEX_NAMESPACE::ArgExc("Invalid pixel type")); + } + } + + // + // delete the cached frame buffer + // + + delete cachedBuffer; + cachedBuffer = 0; + } +} + + +namespace { + +void +bufferedReadPixels (InputFile::Data* ifd, int scanLine1, int scanLine2) +{ + // + // bufferedReadPixels reads each row of tiles that intersect the + // scan-line range (scanLine1 to scanLine2). The previous row of + // tiles is cached in order to prevent redundent tile reads when + // accessing scanlines sequentially. + // + + int minY = std::min (scanLine1, scanLine2); + int maxY = std::max (scanLine1, scanLine2); + + if (minY < ifd->minY || maxY > ifd->maxY) + { + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + } + + // + // The minimum and maximum y tile coordinates that intersect this + // scanline range + // + + int minDy = (minY - ifd->minY) / ifd->tFile->tileYSize(); + int maxDy = (maxY - ifd->minY) / ifd->tFile->tileYSize(); + + // + // Figure out which one is first in the file so we can read without seeking + // + + int yStart, yEnd, yStep; + + if (ifd->lineOrder == DECREASING_Y) + { + yStart = maxDy; + yEnd = minDy - 1; + yStep = -1; + } + else + { + yStart = minDy; + yEnd = maxDy + 1; + yStep = 1; + } + + // + // the number of pixels in a row of tiles + // + + Box2i levelRange = ifd->tFile->dataWindowForLevel(0); + + // + // Read the tiles into our temporary framebuffer and copy them into + // the user's buffer + // + + for (int j = yStart; j != yEnd; j += yStep) + { + Box2i tileRange = ifd->tFile->dataWindowForTile (0, j, 0); + + int minYThisRow = std::max (minY, tileRange.min.y); + int maxYThisRow = std::min (maxY, tileRange.max.y); + + if (j != ifd->cachedTileY) + { + // + // We don't have any valid buffered info, so we need to read in + // from the file. + // + + ifd->tFile->readTiles (0, ifd->tFile->numXTiles (0) - 1, j, j); + ifd->cachedTileY = j; + } + + // + // Copy the data from our cached framebuffer into the user's + // framebuffer. + // + + for (FrameBuffer::ConstIterator k = ifd->cachedBuffer->begin(); + k != ifd->cachedBuffer->end(); + ++k) + { + Slice fromSlice = k.slice(); // slice to write from + Slice toSlice = ifd->tFileBuffer[k.name()]; // slice to write to + + char *fromPtr, *toPtr; + int size = pixelTypeSize (toSlice.type); + + int xStart = levelRange.min.x; + int yStart = minYThisRow; + + while (modp (xStart, toSlice.xSampling) != 0) + ++xStart; + + while (modp (yStart, toSlice.ySampling) != 0) + ++yStart; + + for (int y = yStart; + y <= maxYThisRow; + y += toSlice.ySampling) + { + // + // Set the pointers to the start of the y scanline in + // this row of tiles + // + + fromPtr = fromSlice.base + + (y - tileRange.min.y) * fromSlice.yStride + + xStart * fromSlice.xStride; + + toPtr = toSlice.base + + divp (y, toSlice.ySampling) * toSlice.yStride + + divp (xStart, toSlice.xSampling) * toSlice.xStride; + + // + // Copy all pixels for the scanline in this row of tiles + // + + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + for (int i = 0; i < size; ++i) + toPtr[i] = fromPtr[i]; + + fromPtr += fromSlice.xStride * toSlice.xSampling; + toPtr += toSlice.xStride; + } + } + } + } +} + +} // namespace + + + +InputFile::InputFile (const char fileName[], int numThreads): + _data (new Data (numThreads)) +{ + _data->_streamData = NULL; + _data->_deleteStream=true; + + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0; + try + { + is = new StdIFStream (fileName); + readMagicNumberAndVersionField(*is, _data->version); + + // + // compatibility to read multipart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(*is); + } + else + { + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + + // fix type attribute in single part regular image types + // (may be wrong if an old version of OpenEXR converts + // a tiled image to scanline or vice versa) + if(!isNonImage(_data->version) && + !isMultiPart(_data->version) && + _data->header.hasType()) + { + _data->header.setType(isTiled(_data->version) ? TILEDIMAGE : SCANLINEIMAGE); + } + + _data->header.sanityCheck (isTiled (_data->version)); + + initialize(); + } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (is) delete is; + + if ( _data && !_data->multiPartBackwardSupport && _data->_streamData) + { + delete _data->_streamData; + _data->_streamData=NULL; + } + + if (_data) delete _data; + _data=NULL; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if (is) delete is; + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) + { + delete _data->_streamData; + } + if (_data) delete _data; + + throw; + } +} + + +InputFile::InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): + _data (new Data (numThreads)) +{ + _data->_streamData=NULL; + _data->_deleteStream=false; + try + { + readMagicNumberAndVersionField(is, _data->version); + + // + // Backward compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(is); + } + else + { + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = &is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + + // fix type attribute in single part regular image types + // (may be wrong if an old version of OpenEXR converts + // a tiled image to scanline or vice versa) + if(!isNonImage(_data->version) && + !isMultiPart(_data->version) && + _data->header.hasType()) + { + _data->header.setType(isTiled(_data->version) ? TILEDIMAGE : SCANLINEIMAGE); + } + + _data->header.sanityCheck (isTiled (_data->version)); + + initialize(); + } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + _data=NULL; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + _data=NULL; + throw; + } +} + + +InputFile::InputFile (InputPartData* part) : + _data (new Data (part->numThreads)) +{ + _data->_deleteStream=false; + multiPartInitialize (part); +} + + +void +InputFile::compatibilityInitialize (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) +{ + is.seekg(0); + + // + // Construct a MultiPartInputFile, initialize InputFile + // with the part 0 data. + // (TODO) may want to have a way to set the reconstruction flag. + // + _data->multiPartBackwardSupport = true; + _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); + InputPartData* part = _data->multiPartFile->getPart(0); + + multiPartInitialize (part); +} + + +void +InputFile::multiPartInitialize (InputPartData* part) +{ + _data->_streamData = part->mutex; + _data->version = part->version; + _data->header = part->header; + _data->partNumber = part->partNumber; + _data->part = part; + + initialize(); +} + + +void +InputFile::initialize () +{ + if (!_data->part) + { + if(_data->header.hasType() && _data->header.type()==DEEPSCANLINE) + { + _data->isTiled=false; + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->dsFile = new DeepScanLineInputFile (_data->header, + _data->_streamData->is, + _data->version, + _data->numThreads); + _data->compositor = new CompositeDeepScanLine; + _data->compositor->addSource(_data->dsFile); + } + + else if (isTiled (_data->version)) + { + _data->isTiled = true; + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->tFile = new TiledInputFile (_data->header, + _data->_streamData->is, + _data->version, + _data->numThreads); + } + + else if(!_data->header.hasType() || _data->header.type()==SCANLINEIMAGE) + { + _data->sFile = new ScanLineInputFile (_data->header, + _data->_streamData->is, + _data->numThreads); + }else{ + // type set but not recognised + + THROW(IEX_NAMESPACE::ArgExc, "InputFile cannot handle parts of type " << _data->header.type()); + } + } + else + { + if(_data->header.hasType() && _data->header.type()==DEEPSCANLINE) + { + _data->isTiled=false; + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->dsFile = new DeepScanLineInputFile (_data->part); + _data->compositor = new CompositeDeepScanLine; + _data->compositor->addSource(_data->dsFile); + } + else if (isTiled (_data->header.type())) + { + _data->isTiled = true; + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->tFile = new TiledInputFile (_data->part); + } + else if(!_data->header.hasType() || _data->header.type()==SCANLINEIMAGE) + { + _data->sFile = new ScanLineInputFile (_data->part); + }else{ + THROW(IEX_NAMESPACE::ArgExc, "InputFile cannot handle parts of type " << _data->header.type()); + + } + } +} + +#include +InputFile::~InputFile () +{ + if (_data->_deleteStream) + delete _data->_streamData->is; + + // unless this file was opened via the multipart API, + // delete the streamData object too + if (_data->partNumber==-1 && _data->_streamData) + delete _data->_streamData; + + if (_data) delete _data; +} + +const char * +InputFile::fileName () const +{ + return _data->_streamData->is->fileName(); +} + + +const Header & +InputFile::header () const +{ + return _data->header; +} + + +int +InputFile::version () const +{ + return _data->version; +} + + +void +InputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + if (_data->isTiled) + { + Lock lock (*_data); + + // + // We must invalidate the cached buffer if the new frame + // buffer has a different set of channels than the old + // frame buffer, or if the type of a channel has changed. + // + + const FrameBuffer &oldFrameBuffer = _data->tFileBuffer; + + FrameBuffer::ConstIterator i = oldFrameBuffer.begin(); + FrameBuffer::ConstIterator j = frameBuffer.begin(); + + while (i != oldFrameBuffer.end() && j != frameBuffer.end()) + { + if (strcmp (i.name(), j.name()) || i.slice().type != j.slice().type) + break; + + ++i; + ++j; + } + + if (i != oldFrameBuffer.end() || j != frameBuffer.end()) + { + // + // Invalidate the cached buffer. + // + + _data->deleteCachedBuffer (); + _data->cachedTileY = -1; + + // + // Create new a cached frame buffer. It can hold a single + // row of tiles. The cached buffer can be reused for each + // row of tiles because we set the yTileCoords parameter of + // each Slice to true. + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->cachedBuffer = new FrameBuffer(); + _data->offset = dataWindow.min.x; + + int tileRowSize = (dataWindow.max.x - dataWindow.min.x + 1) * + _data->tFile->tileYSize(); + + for (FrameBuffer::ConstIterator k = frameBuffer.begin(); + k != frameBuffer.end(); + ++k) + { + Slice s = k.slice(); + + switch (s.type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + _data->cachedBuffer->insert + (k.name(), + Slice (UINT, + (char *)(new unsigned int[tileRowSize] - + _data->offset), + sizeof (unsigned int), + sizeof (unsigned int) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + _data->cachedBuffer->insert + (k.name(), + Slice (HALF, + (char *)(new half[tileRowSize] - + _data->offset), + sizeof (half), + sizeof (half) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + _data->cachedBuffer->insert + (k.name(), + Slice (OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT, + (char *)(new float[tileRowSize] - + _data->offset), + sizeof(float), + sizeof(float) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + + _data->tFile->setFrameBuffer (*_data->cachedBuffer); + } + + _data->tFileBuffer = frameBuffer; + } + else if(_data->compositor) + { + _data->compositor->setFrameBuffer(frameBuffer); + }else { + _data->sFile->setFrameBuffer(frameBuffer); + _data->tFileBuffer = frameBuffer; + } +} + + +const FrameBuffer & +InputFile::frameBuffer () const +{ + if(_data->compositor) + { + return _data->compositor->frameBuffer(); + } + else if(_data->isTiled) + { + Lock lock (*_data); + return _data->tFileBuffer; + } + else + { + return _data->sFile->frameBuffer(); + } +} + + +bool +InputFile::isComplete () const +{ + if (_data->dsFile) + return _data->dsFile->isComplete(); + else if (_data->isTiled) + return _data->tFile->isComplete(); + else + return _data->sFile->isComplete(); +} + +bool +InputFile::isOptimizationEnabled() const +{ + if(_data->sFile) + { + return _data->sFile->isOptimizationEnabled(); + }else{ + return false; + } +} + + +void +InputFile::readPixels (int scanLine1, int scanLine2) +{ + if (_data->compositor) + { + _data->compositor->readPixels(scanLine1,scanLine2); + } + else if (_data->isTiled) + { + Lock lock (*_data); + bufferedReadPixels (_data, scanLine1, scanLine2); + } + else + { + _data->sFile->readPixels (scanLine1, scanLine2); + } +} + + +void +InputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +void +InputFile::rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + if (_data->dsFile) + { + throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " + "from a deep image."); + } + + else if (_data->isTiled) + { + throw IEX_NAMESPACE::ArgExc ("Tried to read a raw scanline " + "from a tiled image."); + } + + _data->sFile->rawPixelData (firstScanLine, pixelData, pixelDataSize); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +InputFile::rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + if (!_data->isTiled) + { + throw IEX_NAMESPACE::ArgExc ("Tried to read a raw tile " + "from a scanline-based image."); + } + + _data->tFile->rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading tile data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +TiledInputFile* +InputFile::tFile() +{ + if (!_data->isTiled) + { + throw IEX_NAMESPACE::ArgExc ("Cannot get a TiledInputFile pointer " + "from an InputFile that is not tiled."); + } + + return _data->tFile; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfInputFile.h b/IlmImf/ImfInputFile.h new file mode 100644 index 0000000..42c6352 --- /dev/null +++ b/IlmImf/ImfInputFile.h @@ -0,0 +1,240 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_INPUT_FILE_H +#define INCLUDED_IMF_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class InputFile -- a scanline-based interface that can be used +// to read both scanline-based and tiled OpenEXR image files. +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImfTiledOutputFile.h" +#include "ImfThreading.h" +#include "ImfGenericInputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT InputFile : public GenericInputFile +{ + public: + + //----------------------------------------------------------- + // A constructor that opens the file with the specified name. + // Destroying the InputFile object will close the file. + // + // numThreads determines the number of threads that will be + // used to read the file (see ImfThreading.h). + //----------------------------------------------------------- + + InputFile (const char fileName[], int numThreads = globalThreadCount()); + + + //------------------------------------------------------------- + // A constructor that attaches the new InputFile object to a + // file that has already been opened. Destroying the InputFile + // object will not close the file. + // + // numThreads determines the number of threads that will be + // used to read the file (see ImfThreading.h). + //------------------------------------------------------------- + + InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~InputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + //--------------------------------------------------------------- + // Check if SSE optimization is enabled + // + // Call after setFrameBuffer() to query whether optimized file decoding + // is available - decode times will be faster if returns true + // + // Optimization depends on: + // the file type (only scanline data is supported), + // the framebuffer channels (RGB/RGBA mono or stereo) + // the framebuffer channel types (all channels half-float format only) + // the file channels (RGB/RGBA mono or stereo) + // the file channel types (all channel half-float format only) + // whether SSE2 instruction support was detected at compile time + // + // Calling isOptimizationEnabled before setFrameBuffer will throw an exception + // + //--------------------------------------------------------------- + + bool isOptimizationEnabled () const; + + + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header().dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize); + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + InputFile (InputPartData* part); + InputFile (const InputFile &); // not implemented + InputFile & operator = (const InputFile &); // not implemented + + void initialize (); + void multiPartInitialize(InputPartData* part); + void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); + TiledInputFile * tFile (); + + friend void TiledOutputFile::copyPixels (InputFile &); + + Data * _data; + + + friend class MultiPartInputFile; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfInputPart.cpp b/IlmImf/ImfInputPart.cpp new file mode 100644 index 0000000..7cfce0f --- /dev/null +++ b/IlmImf/ImfInputPart.cpp @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfInputPart.h" +#include "ImfNamespace.h" + +#include "ImfMultiPartInputFile.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +InputPart::InputPart(MultiPartInputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getInputPart(partNumber); +} + +const char * +InputPart::fileName () const +{ + return file->fileName(); +} + +const Header & +InputPart::header () const +{ + return file->header(); +} + +int +InputPart::version () const +{ + return file->version(); +} + +void +InputPart::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + +const FrameBuffer & +InputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + +bool +InputPart::isComplete () const +{ + return file->isComplete(); +} + +bool +InputPart::isOptimizationEnabled() const +{ + return file->isOptimizationEnabled(); +} + +void +InputPart::readPixels (int scanLine1, int scanLine2) +{ + file->readPixels(scanLine1, scanLine2); +} + +void +InputPart::readPixels (int scanLine) +{ + file->readPixels(scanLine); +} + +void +InputPart::rawPixelData (int firstScanLine, const char *&pixelData, int &pixelDataSize) +{ + file->rawPixelData(firstScanLine, pixelData, pixelDataSize); +} + +void +InputPart::rawTileData (int &dx, int &dy, int &lx, int &ly, + const char *&pixelData, int &pixelDataSize) +{ + file->rawTileData(dx, dy, lx, ly, pixelData, pixelDataSize); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfInputPart.h b/IlmImf/ImfInputPart.h new file mode 100644 index 0000000..bfc30e3 --- /dev/null +++ b/IlmImf/ImfInputPart.h @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFINPUTPART_H_ +#define IMFINPUTPART_H_ + +#include "ImfInputFile.h" +#include "ImfOutputPart.h" +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//------------------------------------------------------------------- +// class InputPart: +// +// Same interface as InputFile. Please refer to InputFile. +//------------------------------------------------------------------- + +class IMF_EXPORT InputPart +{ + public: + InputPart(MultiPartInputFile& multiPartFile, int partNumber); + + const char * fileName () const; + const Header & header () const; + int version () const; + void setFrameBuffer (const FrameBuffer &frameBuffer); + const FrameBuffer & frameBuffer () const; + bool isComplete () const; + bool isOptimizationEnabled () const; + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + void rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize); + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + private: + InputFile* file; + // for internal use - give OutputFile and TiledOutputFile access to file for copyPixels + friend void OutputFile::copyPixels(InputPart&); + friend void TiledOutputFile::copyPixels(InputPart&); + +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFINPUTPART_H_ */ diff --git a/IlmImf/ImfInputPartData.cpp b/IlmImf/ImfInputPartData.cpp new file mode 100644 index 0000000..d241aed --- /dev/null +++ b/IlmImf/ImfInputPartData.cpp @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfInputPartData.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +InputPartData::InputPartData(InputStreamMutex* mutex, const Header &header, + int partNumber, int numThreads, int version): + header(header), + numThreads(numThreads), + partNumber(partNumber), + version(version), + mutex(mutex), + completed(false) +{ +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfInputPartData.h b/IlmImf/ImfInputPartData.h new file mode 100644 index 0000000..e03952b --- /dev/null +++ b/IlmImf/ImfInputPartData.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFINPUTPARTDATA_H_ +#define IMFINPUTPARTDATA_H_ + +#include + +#include "ImfInputStreamMutex.h" +#include "ImfHeader.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct InputPartData +{ + Header header; + int numThreads; + int partNumber; + int version; + InputStreamMutex* mutex; + std::vector chunkOffsets; + bool completed; + + InputPartData(InputStreamMutex* mutex, const Header &header, + int partNumber, int numThreads, int version); + +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif /* IMFINPUTPARTDATA_H_ */ diff --git a/IlmImf/ImfInputStreamMutex.h b/IlmImf/ImfInputStreamMutex.h new file mode 100644 index 0000000..c491dbe --- /dev/null +++ b/IlmImf/ImfInputStreamMutex.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFINPUTSTREAMMUTEX_H_ +#define IMFINPUTSTREAMMUTEX_H_ + +#include "ImfIO.h" +#include "IlmThreadMutex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +using ILMTHREAD_NAMESPACE::Mutex; + +// +// Used to wrap OPENEXR_IMF_INTERNAL_NAMESPACE::IStream as a Mutex. +// +struct InputStreamMutex : public Mutex +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is; + Int64 currentPosition; + + InputStreamMutex() + { + is = 0; + currentPosition = 0; + } +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif /* IMFINPUTSTREAMMUTEX_H_ */ diff --git a/IlmImf/ImfInt64.h b/IlmImf/ImfInt64.h new file mode 100644 index 0000000..761557d --- /dev/null +++ b/IlmImf/ImfInt64.h @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_INT64_H +#define INCLUDED_IMF_INT64_H + +//---------------------------------------------------------------------------- +// +// Int64 -- unsigned 64-bit integers, imported from namespace Imath +// +//---------------------------------------------------------------------------- + +#include "ImathInt64.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +using IMATH_NAMESPACE::Int64; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + +#endif // INCLUDED_IMF_INT64_H diff --git a/IlmImf/ImfIntAttribute.cpp b/IlmImf/ImfIntAttribute.cpp new file mode 100644 index 0000000..7486a2e --- /dev/null +++ b/IlmImf/ImfIntAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class IntAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +template <> +const char * +IntAttribute::staticTypeName () +{ + return "int"; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfIntAttribute.h b/IlmImf/ImfIntAttribute.h new file mode 100644 index 0000000..3d271ca --- /dev/null +++ b/IlmImf/ImfIntAttribute.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_INT_ATTRIBUTE_H +#define INCLUDED_IMF_INT_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class IntAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute IntAttribute; +template <> IMF_EXPORT const char *IntAttribute::staticTypeName (); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfKeyCode.cpp b/IlmImf/ImfKeyCode.cpp new file mode 100644 index 0000000..f90e433 --- /dev/null +++ b/IlmImf/ImfKeyCode.cpp @@ -0,0 +1,217 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class KeyCode +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +KeyCode::KeyCode (int filmMfcCode, + int filmType, + int prefix, + int count, + int perfOffset, + int perfsPerFrame, + int perfsPerCount) +{ + setFilmMfcCode (filmMfcCode); + setFilmType (filmType); + setPrefix (prefix); + setCount (count); + setPerfOffset (perfOffset); + setPerfsPerFrame (perfsPerFrame); + setPerfsPerCount (perfsPerCount); +} + + +KeyCode::KeyCode (const KeyCode &other) +{ + _filmMfcCode = other._filmMfcCode; + _filmType = other._filmType; + _prefix = other._prefix; + _count = other._count; + _perfOffset = other._perfOffset; + _perfsPerFrame = other._perfsPerFrame; + _perfsPerCount = other._perfsPerCount; +} + + +KeyCode & +KeyCode::operator = (const KeyCode &other) +{ + _filmMfcCode = other._filmMfcCode; + _filmType = other._filmType; + _prefix = other._prefix; + _count = other._count; + _perfOffset = other._perfOffset; + _perfsPerFrame = other._perfsPerFrame; + _perfsPerCount = other._perfsPerCount; + + return *this; +} + + +int +KeyCode::filmMfcCode () const +{ + return _filmMfcCode; +} + + +void +KeyCode::setFilmMfcCode (int filmMfcCode) +{ + if (filmMfcCode < 0 || filmMfcCode > 99) + throw IEX_NAMESPACE::ArgExc ("Invalid key code film manufacturer code " + "(must be between 0 and 99)."); + + _filmMfcCode = filmMfcCode; +} + +int +KeyCode::filmType () const +{ + return _filmType; +} + + +void +KeyCode::setFilmType (int filmType) +{ + if (filmType < 0 || filmType > 99) + throw IEX_NAMESPACE::ArgExc ("Invalid key code film type " + "(must be between 0 and 99)."); + + _filmType = filmType; +} + +int +KeyCode::prefix () const +{ + return _prefix; +} + + +void +KeyCode::setPrefix (int prefix) +{ + if (prefix < 0 || prefix > 999999) + throw IEX_NAMESPACE::ArgExc ("Invalid key code prefix " + "(must be between 0 and 999999)."); + + _prefix = prefix; +} + + +int +KeyCode::count () const +{ + return _count; +} + + +void +KeyCode::setCount (int count) +{ + if (count < 0 || count > 9999) + throw IEX_NAMESPACE::ArgExc ("Invalid key code count " + "(must be between 0 and 9999)."); + + _count = count; +} + + +int +KeyCode::perfOffset () const +{ + return _perfOffset; +} + + +void +KeyCode::setPerfOffset (int perfOffset) +{ + if (perfOffset < 0 || perfOffset > 119) + throw IEX_NAMESPACE::ArgExc ("Invalid key code perforation offset " + "(must be between 0 and 119)."); + + _perfOffset = perfOffset; +} + + +int +KeyCode::perfsPerFrame () const +{ + return _perfsPerFrame; +} + + +void +KeyCode::setPerfsPerFrame (int perfsPerFrame) +{ + if (perfsPerFrame < 1 || perfsPerFrame > 15) + throw IEX_NAMESPACE::ArgExc ("Invalid key code number of perforations per frame " + "(must be between 1 and 15)."); + + _perfsPerFrame = perfsPerFrame; +} + + +int +KeyCode::perfsPerCount () const +{ + return _perfsPerCount; +} + + +void +KeyCode::setPerfsPerCount (int perfsPerCount) +{ + if (perfsPerCount < 20 || perfsPerCount > 120) + throw IEX_NAMESPACE::ArgExc ("Invalid key code number of perforations per count " + "(must be between 20 and 120)."); + + _perfsPerCount = perfsPerCount; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfKeyCode.h b/IlmImf/ImfKeyCode.h new file mode 100644 index 0000000..2146101 --- /dev/null +++ b/IlmImf/ImfKeyCode.h @@ -0,0 +1,167 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_KEY_CODE_H +#define INCLUDED_IMF_KEY_CODE_H + +//----------------------------------------------------------------------------- +// +// class KeyCode +// +// A KeyCode object uniquely identifies a motion picture film frame. +// The following fields specifiy film manufacturer, film type, film +// roll and the frame's position within the roll: +// +// filmMfcCode film manufacturer code +// range: 0 - 99 +// +// filmType film type code +// range: 0 - 99 +// +// prefix prefix to identify film roll +// range: 0 - 999999 +// +// count count, increments once every perfsPerCount +// perforations (see below) +// range: 0 - 9999 +// +// perfOffset offset of frame, in perforations from +// zero-frame reference mark +// range: 0 - 119 +// +// perfsPerFrame number of perforations per frame +// range: 1 - 15 +// +// typical values: +// +// 1 for 16mm film +// 3, 4, or 8 for 35mm film +// 5, 8 or 15 for 65mm film +// +// perfsPerCount number of perforations per count +// range: 20 - 120 +// +// typical values: +// +// 20 for 16mm film +// 64 for 35mm film +// 80 or 120 for 65mm film +// +// For more information about the interpretation of those fields see +// the following standards and recommended practice publications: +// +// SMPTE 254 Motion-Picture Film (35-mm) - Manufacturer-Printed +// Latent Image Identification Information +// +// SMPTE 268M File Format for Digital Moving-Picture Exchange (DPX) +// (section 6.1) +// +// SMPTE 270 Motion-Picture Film (65-mm) - Manufacturer- Printed +// Latent Image Identification Information +// +// SMPTE 271 Motion-Picture Film (16-mm) - Manufacturer- Printed +// Latent Image Identification Information +// +//----------------------------------------------------------------------------- +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT KeyCode +{ + public: + + //------------------------------------- + // Constructors and assignment operator + //------------------------------------- + + KeyCode (int filmMfcCode = 0, + int filmType = 0, + int prefix = 0, + int count = 0, + int perfOffset = 0, + int perfsPerFrame = 4, + int perfsPerCount = 64); + + KeyCode (const KeyCode &other); + KeyCode & operator = (const KeyCode &other); + + + //---------------------------- + // Access to individual fields + //---------------------------- + + int filmMfcCode () const; + void setFilmMfcCode (int filmMfcCode); + + int filmType () const; + void setFilmType (int filmType); + + int prefix () const; + void setPrefix (int prefix); + + int count () const; + void setCount (int count); + + int perfOffset () const; + void setPerfOffset (int perfOffset); + + int perfsPerFrame () const; + void setPerfsPerFrame (int perfsPerFrame); + + int perfsPerCount () const; + void setPerfsPerCount (int perfsPerCount); + + private: + + int _filmMfcCode; + int _filmType; + int _prefix; + int _count; + int _perfOffset; + int _perfsPerFrame; + int _perfsPerCount; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfKeyCodeAttribute.cpp b/IlmImf/ImfKeyCodeAttribute.cpp new file mode 100644 index 0000000..06c666b --- /dev/null +++ b/IlmImf/ImfKeyCodeAttribute.cpp @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class KeyCodeAttribute +// +//----------------------------------------------------------------------------- + +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +KeyCodeAttribute::staticTypeName () +{ + return "keycode"; +} + + +template <> +void +KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.filmMfcCode()); + Xdr::write (os, _value.filmType()); + Xdr::write (os, _value.prefix()); + Xdr::write (os, _value.count()); + Xdr::write (os, _value.perfOffset()); + Xdr::write (os, _value.perfsPerFrame()); + Xdr::write (os, _value.perfsPerCount()); +} + + +template <> +void +KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + int tmp; + + Xdr::read (is, tmp); + _value.setFilmMfcCode (tmp); + + Xdr::read (is, tmp); + _value.setFilmType (tmp); + + Xdr::read (is, tmp); + _value.setPrefix (tmp); + + Xdr::read (is, tmp); + _value.setCount (tmp); + + Xdr::read (is, tmp); + _value.setPerfOffset (tmp); + + Xdr::read (is, tmp); + _value.setPerfsPerFrame (tmp); + + Xdr::read (is, tmp); + _value.setPerfsPerCount (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfKeyCodeAttribute.h b/IlmImf/ImfKeyCodeAttribute.h new file mode 100644 index 0000000..00d4ece --- /dev/null +++ b/IlmImf/ImfKeyCodeAttribute.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H +#define INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class KeyCodeAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfKeyCode.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute KeyCodeAttribute; + +template <> +IMF_EXPORT +const char *KeyCodeAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void KeyCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void KeyCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfLineOrder.h b/IlmImf/ImfLineOrder.h new file mode 100644 index 0000000..8f30bed --- /dev/null +++ b/IlmImf/ImfLineOrder.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_LINE_ORDER_H +#define INCLUDED_IMF_LINE_ORDER_H + +//----------------------------------------------------------------------------- +// +// enum LineOrder +// +//----------------------------------------------------------------------------- +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +enum LineOrder +{ + INCREASING_Y = 0, // first scan line has lowest y coordinate + + DECREASING_Y = 1, // first scan line has highest y coordinate + + RANDOM_Y = 2, // only for tiled files; tiles are written + // in random order + + NUM_LINEORDERS // number of different line orders +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfLineOrderAttribute.cpp b/IlmImf/ImfLineOrderAttribute.cpp new file mode 100644 index 0000000..aebbac7 --- /dev/null +++ b/IlmImf/ImfLineOrderAttribute.cpp @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//----------------------------------------------------------------------------- +// +// class LineOrderAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfLineOrderAttribute.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +LineOrderAttribute::staticTypeName () +{ + return "lineOrder"; +} + + +template <> +void +LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = LineOrder (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfLineOrderAttribute.h b/IlmImf/ImfLineOrderAttribute.h new file mode 100644 index 0000000..342c3d0 --- /dev/null +++ b/IlmImf/ImfLineOrderAttribute.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H +#define INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class LineOrderAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfLineOrder.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute LineOrderAttribute; + +template <> +IMF_EXPORT +const char *LineOrderAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void LineOrderAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void LineOrderAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfLut.cpp b/IlmImf/ImfLut.cpp new file mode 100644 index 0000000..3209abc --- /dev/null +++ b/IlmImf/ImfLut.cpp @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Lookup tables for efficient application +// of half --> half functions to pixel data, +// and some commonly applied functions. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +void +HalfLut::apply (half *data, int nData, int stride) const +{ + while (nData) + { + *data = _lut (*data); + data += stride; + nData -= 1; + } +} + + +void +HalfLut::apply (const Slice &data, const IMATH_NAMESPACE::Box2i &dataWindow) const +{ + assert (data.type == HALF); + assert (dataWindow.min.x % data.xSampling == 0); + assert (dataWindow.min.y % data.ySampling == 0); + assert ((dataWindow.max.x - dataWindow.min.x + 1) % data.xSampling == 0); + assert ((dataWindow.max.y - dataWindow.min.y + 1) % data.ySampling == 0); + + char *base = data.base + data.yStride * + (dataWindow.min.y / data.ySampling); + + for (int y = dataWindow.min.y; + y <= dataWindow.max.y; + y += data.ySampling) + { + char *pixel = base + data.xStride * + (dataWindow.min.x / data.xSampling); + + for (int x = dataWindow.min.x; + x <= dataWindow.max.x; + x += data.xSampling) + { + *(half *)pixel = _lut (*(half *)pixel); + pixel += data.xStride; + } + + base += data.yStride; + } +} + + +void +RgbaLut::apply (Rgba *data, int nData, int stride) const +{ + while (nData) + { + if (_chn & WRITE_R) + data->r = _lut (data->r); + + if (_chn & WRITE_G) + data->g = _lut (data->g); + + if (_chn & WRITE_B) + data->b = _lut (data->b); + + if (_chn & WRITE_A) + data->a = _lut (data->a); + + data += stride; + nData -= 1; + } +} + + +void +RgbaLut::apply (Rgba *base, + int xStride, int yStride, + const IMATH_NAMESPACE::Box2i &dataWindow) const +{ + base += dataWindow.min.y * yStride; + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; ++y) + { + Rgba *pixel = base + dataWindow.min.x * xStride; + + for (int x = dataWindow.min.x; x <= dataWindow.max.x; ++x) + { + if (_chn & WRITE_R) + pixel->r = _lut (pixel->r); + + if (_chn & WRITE_G) + pixel->g = _lut (pixel->g); + + if (_chn & WRITE_B) + pixel->b = _lut (pixel->b); + + if (_chn & WRITE_A) + pixel->a = _lut (pixel->a); + + pixel += xStride; + } + + base += yStride; + } +} + + +half +round12log (half x) +{ + const float middleval = pow (2.0, -2.5); + int int12log; + + if (x <= 0) + { + return 0; + } + else + { + int12log = int (2000.5 + 200.0 * log (x / middleval) / log (2.0)); + + if (int12log > 4095) + int12log = 4095; + + if (int12log < 1) + int12log = 1; + } + + return middleval * pow (2.0, (int12log - 2000.0) / 200.0); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + diff --git a/IlmImf/ImfLut.h b/IlmImf/ImfLut.h new file mode 100644 index 0000000..b9ccc4c --- /dev/null +++ b/IlmImf/ImfLut.h @@ -0,0 +1,188 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_LUT_H +#define INCLUDED_IMF_LUT_H + +//----------------------------------------------------------------------------- +// +// Lookup tables for efficient application +// of half --> half functions to pixel data, +// and some commonly applied functions. +// +//----------------------------------------------------------------------------- + +#include "ImfRgbaFile.h" +#include "ImfFrameBuffer.h" +#include "ImathBox.h" +#include "halfFunction.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +// +// Lookup table for individual half channels. +// + +class IMF_EXPORT HalfLut +{ + public: + + //------------ + // Constructor + //------------ + + template + HalfLut (Function f); + + + //---------------------------------------------------------------------- + // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] + //---------------------------------------------------------------------- + + void apply (half *data, + int nData, + int stride = 1) const; + + + //--------------------------------------------------------------- + // Apply the table to a frame buffer slice (see ImfFrameBuffer.h) + //--------------------------------------------------------------- + + void apply (const Slice &data, + const IMATH_NAMESPACE::Box2i &dataWindow) const; + + private: + + halfFunction _lut; +}; + + +// +// Lookup table for combined RGBA data. +// + +class IMF_EXPORT RgbaLut +{ + public: + + //------------ + // Constructor + //------------ + + template + RgbaLut (Function f, RgbaChannels chn = WRITE_RGB); + + + //---------------------------------------------------------------------- + // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] + //---------------------------------------------------------------------- + + void apply (Rgba *data, + int nData, + int stride = 1) const; + + + //----------------------------------------------------------------------- + // Apply the table to a frame buffer (see RgbaOutpuFile.setFrameBuffer()) + //----------------------------------------------------------------------- + + void apply (Rgba *base, + int xStride, + int yStride, + const IMATH_NAMESPACE::Box2i &dataWindow) const; + + private: + + halfFunction _lut; + RgbaChannels _chn; +}; + + +// +// 12bit log rounding reduces data to 20 stops with 200 steps per stop. +// That makes 4000 numbers. An extra 96 just come along for the ride. +// Zero explicitly remains zero. The first non-zero half will map to 1 +// in the 0-4095 12log space. A nice power of two number is placed at +// the center [2000] and that number is near 0.18. +// + +IMF_EXPORT +half round12log (half x); + + +// +// Round to n-bit precision (n should be between 0 and 10). +// After rounding, the significand's 10-n least significant +// bits will be zero. +// + +struct roundNBit +{ + roundNBit (int n): n(n) {} + half operator () (half x) {return x.round(n);} + int n; +}; + + +// +// Template definitions +// + + +template +HalfLut::HalfLut (Function f): + _lut(f, -HALF_MAX, HALF_MAX, half (0), + half::posInf(), half::negInf(), half::qNan()) +{ + // empty +} + + +template +RgbaLut::RgbaLut (Function f, RgbaChannels chn): + _lut(f, -HALF_MAX, HALF_MAX, half (0), + half::posInf(), half::negInf(), half::qNan()), + _chn(chn) +{ + // empty +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfMatrixAttribute.cpp b/IlmImf/ImfMatrixAttribute.cpp new file mode 100644 index 0000000..84efe7e --- /dev/null +++ b/IlmImf/ImfMatrixAttribute.cpp @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class M33fAttribute +// class M33dAttribute +// class M44fAttribute +// class M44dAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + + +template <> +const char * +M33fAttribute::staticTypeName () +{ + return "m33f"; +} + + +template <> +void +M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); +} + + +template <> +void +M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); +} + + +template <> +const char * +M33dAttribute::staticTypeName () +{ + return "m33d"; +} + + +template <> +void +M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); +} + + +template <> +void +M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); +} + + +template <> +const char * +M44fAttribute::staticTypeName () +{ + return "m44f"; +} + + +template <> +void +M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + Xdr::write (os, _value[0][3]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + Xdr::write (os, _value[1][3]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); + Xdr::write (os, _value[2][3]); + + Xdr::write (os, _value[3][0]); + Xdr::write (os, _value[3][1]); + Xdr::write (os, _value[3][2]); + Xdr::write (os, _value[3][3]); +} + + +template <> +void +M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + Xdr::read (is, _value[0][3]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + Xdr::read (is, _value[1][3]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); + Xdr::read (is, _value[2][3]); + + Xdr::read (is, _value[3][0]); + Xdr::read (is, _value[3][1]); + Xdr::read (is, _value[3][2]); + Xdr::read (is, _value[3][3]); +} + + +template <> +const char * +M44dAttribute::staticTypeName () +{ + return "m44d"; +} + + +template <> +void +M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + Xdr::write (os, _value[0][3]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + Xdr::write (os, _value[1][3]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); + Xdr::write (os, _value[2][3]); + + Xdr::write (os, _value[3][0]); + Xdr::write (os, _value[3][1]); + Xdr::write (os, _value[3][2]); + Xdr::write (os, _value[3][3]); +} + + +template <> +void +M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + Xdr::read (is, _value[0][3]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + Xdr::read (is, _value[1][3]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); + Xdr::read (is, _value[2][3]); + + Xdr::read (is, _value[3][0]); + Xdr::read (is, _value[3][1]); + Xdr::read (is, _value[3][2]); + Xdr::read (is, _value[3][3]); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfMatrixAttribute.h b/IlmImf/ImfMatrixAttribute.h new file mode 100644 index 0000000..31f1466 --- /dev/null +++ b/IlmImf/ImfMatrixAttribute.h @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_MATRIX_ATTRIBUTE_H +#define INCLUDED_IMF_MATRIX_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class M33fAttribute +// class M33dAttribute +// class M44fAttribute +// class M44dAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImathMatrix.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute M33fAttribute; +template <> IMF_EXPORT const char *M33fAttribute::staticTypeName (); +template <> IMF_EXPORT void M33fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void M33fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute M33dAttribute; +template <> IMF_EXPORT const char *M33dAttribute::staticTypeName (); +template <> IMF_EXPORT void M33dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void M33dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute M44fAttribute; +template <> IMF_EXPORT const char *M44fAttribute::staticTypeName (); +template <> IMF_EXPORT void M44fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void M44fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute M44dAttribute; +template <> IMF_EXPORT const char *M44dAttribute::staticTypeName (); +template <> IMF_EXPORT void M44dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void M44dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfMisc.cpp b/IlmImf/ImfMisc.cpp new file mode 100644 index 0000000..37a6281 --- /dev/null +++ b/IlmImf/ImfMisc.cpp @@ -0,0 +1,1872 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Miscellaneous helper functions for OpenEXR image file I/O +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using std::vector; + +int +pixelTypeSize (PixelType type) +{ + int size; + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + size = Xdr::size (); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + size = Xdr::size (); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + size = Xdr::size (); + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel type."); + } + + return size; +} + + +int +numSamples (int s, int a, int b) +{ + int a1 = divp (a, s); + int b1 = divp (b, s); + return b1 - a1 + ((a1 * s < a)? 0: 1); +} + + +size_t +bytesPerLineTable (const Header &header, + vector &bytesPerLine) +{ + const Box2i &dataWindow = header.dataWindow(); + const ChannelList &channels = header.channels(); + + bytesPerLine.resize (dataWindow.max.y - dataWindow.min.y + 1); + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + int nBytes = pixelTypeSize (c.channel().type) * + (dataWindow.max.x - dataWindow.min.x + 1) / + c.channel().xSampling; + + for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) + if (modp (y, c.channel().ySampling) == 0) + bytesPerLine[i] += nBytes; + } + + size_t maxBytesPerLine = 0; + + for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) + if (maxBytesPerLine < bytesPerLine[i]) + maxBytesPerLine = bytesPerLine[i]; + + return maxBytesPerLine; +} + + +const int& +sampleCount(const char* base, int xStride, int yStride, int x, int y) +{ + const char* ptr = base + y * yStride + x * xStride; + int* intPtr = (int*) ptr; + + return *intPtr; +} + +int& +sampleCount(char* base, int xStride, int yStride, int x, int y) +{ + char* ptr = base + y * yStride + x * xStride; + int* intPtr = (int*) ptr; + + return *intPtr; +} + + +size_t +bytesPerDeepLineTable (const Header &header, + int minY, int maxY, + const char* base, + int xStride, + int yStride, + vector &bytesPerLine) +{ + const Box2i &dataWindow = header.dataWindow(); + const ChannelList &channels = header.channels(); + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + for (int y = minY; y <= maxY; ++y) + if (modp (y, c.channel().ySampling) == 0) + { + int nBytes = 0; + for (int x = dataWindow.min.x; x <= dataWindow.max.x; x++) + { + if (modp (x, c.channel().xSampling) == 0) + nBytes += pixelTypeSize (c.channel().type) * + sampleCount(base, xStride, yStride, x, y); + } + bytesPerLine[y - dataWindow.min.y] += nBytes; + } + } + + size_t maxBytesPerLine = 0; + + for (int y = minY; y <= maxY; ++y) + if (maxBytesPerLine < bytesPerLine[y - dataWindow.min.y]) + maxBytesPerLine = bytesPerLine[y - dataWindow.min.y]; + + return maxBytesPerLine; +} + + +size_t +bytesPerDeepLineTable (const Header &header, + char* base, + int xStride, + int yStride, + vector &bytesPerLine) +{ + return bytesPerDeepLineTable(header, + header.dataWindow().min.y, + header.dataWindow().max.y, + base, + xStride, + yStride, + bytesPerLine); +} + + +void +offsetInLineBufferTable (const vector &bytesPerLine, + int scanline1, int scanline2, + int linesInLineBuffer, + vector &offsetInLineBuffer) +{ + offsetInLineBuffer.resize (bytesPerLine.size()); + + size_t offset = 0; + + for (int i = scanline1; i <= scanline2; ++i) + { + if (i % linesInLineBuffer == 0) + offset = 0; + + offsetInLineBuffer[i] = offset; + offset += bytesPerLine[i]; + } +} + + +void +offsetInLineBufferTable (const vector &bytesPerLine, + int linesInLineBuffer, + vector &offsetInLineBuffer) +{ + offsetInLineBufferTable (bytesPerLine, + 0, bytesPerLine.size() - 1, + linesInLineBuffer, + offsetInLineBuffer); +} + + +int +lineBufferMinY (int y, int minY, int linesInLineBuffer) +{ + return ((y - minY) / linesInLineBuffer) * linesInLineBuffer + minY; +} + + +int +lineBufferMaxY (int y, int minY, int linesInLineBuffer) +{ + return lineBufferMinY (y, minY, linesInLineBuffer) + linesInLineBuffer - 1; +} + + +Compressor::Format +defaultFormat (Compressor * compressor) +{ + return compressor? compressor->format(): Compressor::XDR; +} + + +int +numLinesInBuffer (Compressor * compressor) +{ + return compressor? compressor->numScanLines(): 1; +} + + +void +copyIntoFrameBuffer (const char *& readPtr, + char * writePtr, + char * endPtr, + size_t xStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile) +{ + // + // Copy a horizontal row of pixels from an input + // file's line or tile buffer to a frame buffer. + // + + if (fill) + { + // + // The file contains no data for this channel. + // Store a default value in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + { + unsigned int fillVal = (unsigned int) (fillValue); + + while (writePtr <= endPtr) + { + *(unsigned int *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + { + half fillVal = half (fillValue); + + while (writePtr <= endPtr) + { + *(half *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + { + float fillVal = float (fillValue); + + while (writePtr <= endPtr) + { + *(float *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + // Convert the pixels from the file's machine- + // independent representation, and store the + // results in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(unsigned int *) writePtr); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (writePtr <= endPtr) + { + half h; + Xdr::read (readPtr, h); + *(unsigned int *) writePtr = halfToUint (h); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + float f; + Xdr::read (readPtr, f); + *(unsigned int *)writePtr = floatToUint (f); + writePtr += xStride; + } + break; + + default: + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(half *) writePtr = uintToHalf (ui); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(half *) writePtr); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + float f; + Xdr::read (readPtr, f); + *(half *) writePtr = floatToHalf (f); + writePtr += xStride; + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(float *) writePtr = float (ui); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (writePtr <= endPtr) + { + half h; + Xdr::read (readPtr, h); + *(float *) writePtr = float (h); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(float *) writePtr); + writePtr += xStride; + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // Copy the results into the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + for (size_t i = 0; i < sizeof (unsigned int); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (writePtr <= endPtr) + { + half h = *(half *) readPtr; + *(unsigned int *) writePtr = halfToUint (h); + readPtr += sizeof (half); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(unsigned int *)writePtr = floatToUint (f); + readPtr += sizeof (float); + writePtr += xStride; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(half *) writePtr = uintToHalf (ui); + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + // If we're tightly packed, just memcpy + if (xStride == sizeof(half)) { + int numBytes = endPtr-writePtr+sizeof(half); + memcpy(writePtr, readPtr, numBytes); + readPtr += numBytes; + writePtr += numBytes; + } else { + while (writePtr <= endPtr) + { + *(half *) writePtr = *(half *)readPtr; + readPtr += sizeof (half); + writePtr += xStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(half *) writePtr = floatToHalf (f); + readPtr += sizeof (float); + writePtr += xStride; + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(float *) writePtr = float (ui); + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (writePtr <= endPtr) + { + half h = *(half *) readPtr; + *(float *) writePtr = float (h); + readPtr += sizeof (half); + writePtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (writePtr <= endPtr) + { + for (size_t i = 0; i < sizeof (float); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (float); + writePtr += xStride; + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } +} + +void +copyIntoDeepFrameBuffer (const char *& readPtr, + char * base, + const char* sampleCountBase, + ptrdiff_t sampleCountXStride, + ptrdiff_t sampleCountYStride, + int y, int minX, int maxX, + int xOffsetForSampleCount, + int yOffsetForSampleCount, + int xOffsetForData, + int yOffsetForData, + ptrdiff_t sampleStride, + ptrdiff_t xPointerStride, + ptrdiff_t yPointerStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile) +{ + // + // Copy a horizontal row of pixels from an input + // file's line or tile buffer to a frame buffer. + // + + if (fill) + { + // + // The file contains no data for this channel. + // Store a default value in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + { + unsigned int fillVal = (unsigned int) (fillValue); + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + if(writePtr) + { + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + for (int i = 0; i < count; i++) + { + *(unsigned int *) writePtr = fillVal; + writePtr += sampleStride; + } + } + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + { + half fillVal = half (fillValue); + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + if(writePtr) + { + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + for (int i = 0; i < count; i++) + { + *(half *) writePtr = fillVal; + writePtr += sampleStride; + } + } + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + { + float fillVal = float (fillValue); + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + if(writePtr) + { + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + for (int i = 0; i < count; i++) + { + *(float *) writePtr = fillVal; + writePtr += sampleStride; + } + } + } + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + // Convert the pixels from the file's machine- + // independent representation, and store the + // results in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + Xdr::read (readPtr, *(unsigned int *) writePtr); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + half h; + Xdr::read (readPtr, h); + *(unsigned int *) writePtr = halfToUint (h); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + float f; + Xdr::read (readPtr, f); + *(unsigned int *)writePtr = floatToUint (f); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + + } + break; + default: + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(half *) writePtr = uintToHalf (ui); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + Xdr::read (readPtr, *(half *) writePtr); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **) (base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + for (int i = 0; i < count; i++) + { + float f; + Xdr::read (readPtr, f); + *(half *) writePtr = floatToHalf (f); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + for (int i = 0; i < count; i++) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(float *) writePtr = float (ui); + writePtr += sampleStride; + } + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + half h; + Xdr::read (readPtr, h); + *(float *) writePtr = float (h); + writePtr += sampleStride; + } + + }else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + Xdr::read (readPtr, *(float *) writePtr); + writePtr += sampleStride; + } + } else{ + Xdr::skip (readPtr,count*Xdr::size()); + } + + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // Copy the results into the frame buffer. + // + + switch (typeInFrameBuffer) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + for (size_t i = 0; i < sizeof (unsigned int); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (unsigned int); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(unsigned int)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + half h = *(half *) readPtr; + *(unsigned int *) writePtr = halfToUint (h); + readPtr += sizeof (half); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(half)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + + for (int i = 0; i < count; i++) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(unsigned int *)writePtr = floatToUint (f); + readPtr += sizeof (float); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(float)*count; + } + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(half *) writePtr = uintToHalf (ui); + readPtr += sizeof (unsigned int); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(unsigned int)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + *(half *) writePtr = *(half *)readPtr; + readPtr += sizeof (half); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(half)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(half *) writePtr = floatToHalf (f); + readPtr += sizeof (float); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(float)*count; + } + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(float *) writePtr = float (ui); + readPtr += sizeof (unsigned int); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(unsigned int)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + half h = *(half *) readPtr; + *(float *) writePtr = float (h); + readPtr += sizeof (half); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(half)*count; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = minX; x <= maxX; x++) + { + char* writePtr = *(char **)(base+(y-yOffsetForData)*yPointerStride + (x-xOffsetForData)*xPointerStride); + + int count = sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + if(writePtr) + { + for (int i = 0; i < count; i++) + { + for (size_t i = 0; i < sizeof (float); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (float); + writePtr += sampleStride; + } + }else{ + readPtr+=sizeof(float)*count; + } + } + break; + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } +} + + +void +skipChannel (const char *& readPtr, + PixelType typeInFile, + size_t xSize) +{ + switch (typeInFile) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } +} + + +void +convertInPlace (char *& writePtr, + const char *& readPtr, + PixelType type, + size_t numPixels) +{ + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (size_t j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const unsigned int *) readPtr); + readPtr += sizeof(unsigned int); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (size_t j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const half *) readPtr); + readPtr += sizeof(half); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (size_t j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const float *) readPtr); + readPtr += sizeof(float); + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } +} + + +void +copyFromFrameBuffer (char *& writePtr, + const char *& readPtr, + const char * endPtr, + size_t xStride, + Compressor::Format format, + PixelType type) +{ + // + // Copy a horizontal row of pixels from a frame + // buffer to an output file's line or tile buffer. + // + + if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, + *(const unsigned int *) readPtr); + readPtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, *(const half *) readPtr); + readPtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, *(const float *) readPtr); + readPtr += xStride; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + while (readPtr <= endPtr) + { + for (size_t i = 0; i < sizeof (unsigned int); ++i) + *writePtr++ = readPtr[i]; + + readPtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + while (readPtr <= endPtr) + { + *(half *) writePtr = *(const half *) readPtr; + writePtr += sizeof (half); + readPtr += xStride; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + while (readPtr <= endPtr) + { + for (size_t i = 0; i < sizeof (float); ++i) + *writePtr++ = readPtr[i]; + + readPtr += xStride; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } +} + +void +copyFromDeepFrameBuffer (char *& writePtr, + const char * base, + char* sampleCountBase, + ptrdiff_t sampleCountXStride, + ptrdiff_t sampleCountYStride, + int y, int xMin, int xMax, + int xOffsetForSampleCount, + int yOffsetForSampleCount, + int xOffsetForData, + int yOffsetForData, + ptrdiff_t sampleStride, + ptrdiff_t dataXStride, + ptrdiff_t dataYStride, + Compressor::Format format, + PixelType type) +{ + // + // Copy a horizontal row of pixels from a frame + // buffer to an output file's line or tile buffer. + // + + if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + Xdr::write (writePtr, + *(const unsigned int *) readPtr); + readPtr += sampleStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + Xdr::write (writePtr, *(const half *) readPtr); + readPtr += sampleStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + Xdr::write (writePtr, *(const float *) readPtr); + readPtr += sampleStride; + } + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + for (size_t j = 0; j < sizeof (unsigned int); ++j) + *writePtr++ = readPtr[j]; + + readPtr += sampleStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + *(half *) writePtr = *(const half *) readPtr; + writePtr += sizeof (half); + readPtr += sampleStride; + } + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (int x = xMin; x <= xMax; x++) + { + unsigned int count = + sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x - xOffsetForSampleCount, + y - yOffsetForSampleCount); + + const char* ptr = base + (y-yOffsetForData) * dataYStride + (x-xOffsetForData) * dataXStride; + const char* readPtr = ((const char**) ptr)[0]; + for (unsigned int i = 0; i < count; i++) + { + for (size_t j = 0; j < sizeof (float); ++j) + *writePtr++ = readPtr[j]; + + readPtr += sampleStride; + } + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } +} + + +void +fillChannelWithZeroes (char *& writePtr, + Compressor::Format format, + PixelType type, + size_t xSize) +{ + if (format == Compressor::XDR) + { + // + // Fill with data in XDR format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (size_t j = 0; j < xSize; ++j) + Xdr::write (writePtr, (unsigned int) 0); + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (size_t j = 0; j < xSize; ++j) + Xdr::write (writePtr, (half) 0); + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (size_t j = 0; j < xSize; ++j) + Xdr::write (writePtr, (float) 0); + + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // Fill with data in NATIVE format. + // + + switch (type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + for (size_t j = 0; j < xSize; ++j) + { + static const unsigned int ui = 0; + + for (size_t i = 0; i < sizeof (ui); ++i) + *writePtr++ = ((char *) &ui)[i]; + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + for (size_t j = 0; j < xSize; ++j) + { + *(half *) writePtr = half (0); + writePtr += sizeof (half); + } + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + for (size_t j = 0; j < xSize; ++j) + { + static const float f = 0; + + for (size_t i = 0; i < sizeof (f); ++i) + *writePtr++ = ((char *) &f)[i]; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown pixel data type."); + } + } +} + +bool +usesLongNames (const Header &header) +{ + // + // If an OpenEXR file contains any attribute names, attribute type names + // or channel names longer than 31 characters, then the file cannot be + // read by older versions of the IlmImf library (up to OpenEXR 1.6.1). + // Before writing the file header, we check if the header contains + // any names longer than 31 characters; if it does, then we set the + // LONG_NAMES_FLAG in the file version number. Older versions of the + // IlmImf library will refuse to read files that have the LONG_NAMES_FLAG + // set. Without the flag, older versions of the library would mis- + // interpret the file as broken. + // + + for (Header::ConstIterator i = header.begin(); + i != header.end(); + ++i) + { + if (strlen (i.name()) >= 32 || strlen (i.attribute().typeName()) >= 32) + return true; + } + + const ChannelList &channels = header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (strlen (i.name()) >= 32) + return true; + } + + return false; +} + +int +getScanlineChunkOffsetTableSize(const Header& header) +{ + const Box2i &dataWindow = header.dataWindow(); + + vector bytesPerLine; + size_t maxBytesPerLine = bytesPerLineTable (header, + bytesPerLine); + + Compressor* compressor = newCompressor(header.compression(), + maxBytesPerLine, + header); + + int linesInBuffer = numLinesInBuffer (compressor); + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + linesInBuffer) / linesInBuffer; + + delete compressor; + + return lineOffsetSize; +} + +// +// Located in ImfTiledMisc.cpp +// +int +getTiledChunkOffsetTableSize(const Header& header); + +int +getChunkOffsetTableSize(const Header& header,bool ignore_attribute) +{ + if(!ignore_attribute && header.hasChunkCount()) + { + return header.chunkCount(); + } + + if(header.hasType() && !isSupportedType(header.type())) + { + throw IEX_NAMESPACE::ArgExc ("unsupported header type to " + "get chunk offset table size"); + } + if (isTiled(header.type()) == false) + return getScanlineChunkOffsetTableSize(header); + else + return getTiledChunkOffsetTableSize(header); + +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfMisc.h b/IlmImf/ImfMisc.h new file mode 100644 index 0000000..cc697e2 --- /dev/null +++ b/IlmImf/ImfMisc.h @@ -0,0 +1,466 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_MISC_H +#define INCLUDED_IMF_MISC_H + +//----------------------------------------------------------------------------- +// +// Miscellaneous helper functions for OpenEXR image file I/O +// +//----------------------------------------------------------------------------- + +#include "ImfPixelType.h" +#include "ImfCompressor.h" +#include "ImfArray.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// Return the size of a single value of the indicated type, +// in the machine's native format. +// + +IMF_EXPORT +int pixelTypeSize (PixelType type); + + +// +// Return the number of samples a channel with subsampling rate +// s has in the interval [a, b]. For example, a channel with +// subsampling rate 2 (and samples at 0, 2, 4, 6, 8, etc.) has +// 2 samples in the interval [1, 5] and three samples in the +// interval [2, 6]. +// + +IMF_EXPORT +int numSamples (int s, int a, int b); + + +// +// Build a table that lists, for each scanline in a file's +// data window, how many bytes are required to store all +// pixels in all channels in that scanline (assuming that +// the pixel data are tightly packed). +// + +IMF_EXPORT +size_t bytesPerLineTable (const Header &header, + std::vector &bytesPerLine); + + +// +// Get the sample count for pixel (x, y) using the array base +// pointer, xStride and yStride. +// + +IMF_EXPORT +int& +sampleCount(char* base, int xStride, int yStride, int x, int y); + + +IMF_EXPORT +const int& +sampleCount(const char* base, int xStride, int yStride, int x, int y); + +// +// Build a table that lists, for each scanline in a DEEP file's +// data window, how many bytes are required to store all +// pixels in all channels in scanlines ranged in [minY, maxY] +// (assuming that the pixel data are tightly packed). +// + +IMF_EXPORT +size_t bytesPerDeepLineTable (const Header &header, + int minY, int maxY, + const char* base, + int xStride, + int yStride, + std::vector &bytesPerLine); + + +// +// Build a table that lists, for each scanline in a DEEP file's +// data window, how many bytes are required to store all +// pixels in all channels in every scanline (assuming that +// the pixel data are tightly packed). +// + +IMF_EXPORT +size_t bytesPerDeepLineTable (const Header &header, + char* base, + int xStride, + int yStride, + std::vector &bytesPerLine); + + +// +// For scanline-based files, pixels are read or written in +// in multi-scanline blocks. Internally, class OutputFile +// and class ScanLineInputFile store a block of scan lines +// in a "line buffer". Function offsetInLineBufferTable() +// builds a table that lists, scanlines within range +// [scanline1, scanline2], the location of the pixel data +// for the scanline relative to the beginning of the line buffer, +// where scanline1 = 0 represents the first line in the DATA WINDOW. +// The one without specifying the range will make scanline1 = 0 +// and scanline2 = bytesPerLine.size(). +// + +IMF_EXPORT +void offsetInLineBufferTable (const std::vector &bytesPerLine, + int scanline1, int scanline2, + int linesInLineBuffer, + std::vector &offsetInLineBuffer); + +IMF_EXPORT +void offsetInLineBufferTable (const std::vector &bytesPerLine, + int linesInLineBuffer, + std::vector &offsetInLineBuffer); + +// +// For a scanline-based file, compute the range of scanlines +// that occupy the same line buffer as a given scanline, y. +// (minY is the minimum y coordinate of the file's data window.) +// + +IMF_EXPORT int lineBufferMinY (int y, int minY, int linesInLineBuffer); +IMF_EXPORT int lineBufferMaxY (int y, int minY, int linesInLineBuffer); + + +// +// Return a compressor's data format (Compressor::NATIVE or Compressor::XDR). +// If compressor is 0, return Compressor::XDR. +// + +IMF_EXPORT +Compressor::Format defaultFormat (Compressor *compressor); + + +// +// Return the number of scan lines a compressor wants to compress +// or uncompress at once. If compressor is 0, return 1. +// + +IMF_EXPORT +int numLinesInBuffer (Compressor *compressor); + + +// +// Copy a single channel of a horizontal row of pixels from an +// input file's internal line buffer or tile buffer into a +// frame buffer slice. If necessary, perform on-the-fly data +// type conversion. +// +// readPtr initially points to the beginning of the +// data in the line or tile buffer. readPtr +// is advanced as the pixel data are copied; +// when copyIntoFrameBuffer() returns, +// readPtr points just past the end of the +// copied data. +// +// writePtr, endPtr point to the lefmost and rightmost pixels +// in the frame buffer slice +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// typeInFrameBuffer the pixel data type of the frame buffer slice +// +// typeInFile the pixel data type in the input file's channel +// + +IMF_EXPORT +void copyIntoFrameBuffer (const char *&readPtr, + char *writePtr, + char *endPtr, + size_t xStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile); + + +// +// Copy a single channel of a horizontal row of pixels from an +// input file's internal line buffer or tile buffer into a +// frame buffer slice. If necessary, perform on-the-fly data +// type conversion. +// +// readPtr initially points to the beginning of the +// data in the line or tile buffer. readPtr +// is advanced as the pixel data are copied; +// when copyIntoFrameBuffer() returns, +// readPtr points just past the end of the +// copied data. +// +// base point to each pixel in the framebuffer +// +// sampleCountBase, provide the number of samples in each pixel +// sampleCountXStride, +// sampleCountYStride +// +// y the scanline to copy. The coordinate is +// relative to the datawindow.min.y. +// +// minX, maxX used to indicate which pixels in the scanline +// will be copied. +// +// xOffsetForSampleCount, used to offset the sample count array +// yOffsetForSampleCount, and the base array. +// xOffsetForData, +// yOffsetForData +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// typeInFrameBuffer the pixel data type of the frame buffer slice +// +// typeInFile the pixel data type in the input file's channel +// + +IMF_EXPORT +void copyIntoDeepFrameBuffer (const char *& readPtr, + char * base, + const char* sampleCountBase, + ptrdiff_t sampleCountXStride, + ptrdiff_t sampleCountYStride, + int y, int minX, int maxX, + int xOffsetForSampleCount, + int yOffsetForSampleCount, + int xOffsetForData, + int yOffsetForData, + ptrdiff_t xStride, + ptrdiff_t xPointerStride, + ptrdiff_t yPointerStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile); + + +// +// Given a pointer into a an input file's line buffer or tile buffer, +// skip over the data for xSize pixels of type typeInFile. +// readPtr initially points to the beginning of the data to be skipped; +// when skipChannel() returns, readPtr points just past the end of the +// skipped data. +// + +IMF_EXPORT +void skipChannel (const char *&readPtr, + PixelType typeInFile, + size_t xSize); + +// +// Convert an array of pixel data from the machine's native +// representation to XDR format. +// +// toPtr, fromPtr initially point to the beginning of the input +// and output pixel data arrays; when convertInPlace() +// returns, toPtr and fromPtr point just past the +// end of the input and output arrays. +// If the native representation of the data has the +// same size as the XDR data, then the conversion +// can take in place, without an intermediate +// temporary buffer (toPtr and fromPtr can point +// to the same location). +// +// type the pixel data type +// +// numPixels number of pixels in the input and output arrays +// + +IMF_EXPORT +void convertInPlace (char *&toPtr, + const char *&fromPtr, + PixelType type, + size_t numPixels); + +// +// Copy a single channel of a horizontal row of pixels from a +// a frame buffer into an output file's internal line buffer or +// tile buffer. +// +// writePtr initially points to the beginning of the +// data in the line or tile buffer. writePtr +// is advanced as the pixel data are copied; +// when copyFromFrameBuffer() returns, +// writePtr points just past the end of the +// copied data. +// +// readPtr, endPtr point to the lefmost and rightmost pixels +// in the frame buffer slice +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// type the pixel data type in the frame buffer +// and in the output file's channel (function +// copyFromFrameBuffer() doesn't do on-the-fly +// data type conversion) +// + +IMF_EXPORT +void copyFromFrameBuffer (char *&writePtr, + const char *&readPtr, + const char *endPtr, + size_t xStride, + Compressor::Format format, + PixelType type); + +// +// Copy a single channel of a horizontal row of pixels from a +// a frame buffer in a deep data file into an output file's +// internal line buffer or tile buffer. +// +// writePtr initially points to the beginning of the +// data in the line or tile buffer. writePtr +// is advanced as the pixel data are copied; +// when copyFromDeepFrameBuffer() returns, +// writePtr points just past the end of the +// copied data. +// +// base the start pointer of each pixel in this channel. +// It points to the real data in FrameBuffer. +// It is different for different channels. +// dataWindowMinX and dataWindowMinY are involved in +// locating for base. +// +// sampleCountBase, used to locate the position to get +// sampleCountXStride, the number of samples for each pixel. +// sampleCountYStride Used to determine how far we should +// read based on the pointer provided by base. +// +// y the scanline to copy. If we are dealing +// with a tiled deep file, then probably a portion +// of the scanline is copied. +// +// xMin, xMax used to indicate which pixels in the scanline +// will be copied. +// +// xOffsetForSampleCount, used to offset the sample count array +// yOffsetForSampleCount, and the base array. +// xOffsetForData, +// yOffsetForData +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// type the pixel data type in the frame buffer +// and in the output file's channel (function +// copyFromFrameBuffer() doesn't do on-the-fly +// data type conversion) +// + +IMF_EXPORT +void copyFromDeepFrameBuffer (char *& writePtr, + const char * base, + char* sampleCountBase, + ptrdiff_t sampleCountXStride, + ptrdiff_t sampleCountYStride, + int y, int xMin, int xMax, + int xOffsetForSampleCount, + int yOffsetForSampleCount, + int xOffsetForData, + int yOffsetForData, + ptrdiff_t sampleStride, + ptrdiff_t xStrideForData, + ptrdiff_t yStrideForData, + Compressor::Format format, + PixelType type); + +// +// Fill part of an output file's line buffer or tile buffer with +// zeroes. This routine is called when an output file contains +// a channel for which the frame buffer contains no corresponding +// slice. +// +// writePtr initially points to the beginning of the +// data in the line or tile buffer. When +// fillChannelWithZeroes() returns, writePtr +// points just past the end of the zeroed +// data. +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// type the pixel data type in the line or frame buffer. +// +// xSize number of pixels to be filled with zeroes. +// + +IMF_EXPORT +void fillChannelWithZeroes (char *&writePtr, + Compressor::Format format, + PixelType type, + size_t xSize); + +IMF_EXPORT +bool usesLongNames (const Header &header); + + +// +// compute size of chunk offset table - if ignore_attribute set to true +// will compute from the image size and layout, rather than the attribute +// The default behaviour is to read the attribute +// + +IMF_EXPORT +int getChunkOffsetTableSize(const Header& header,bool ignore_attribute=false); + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfMultiPartInputFile.cpp b/IlmImf/ImfMultiPartInputFile.cpp new file mode 100644 index 0000000..81ccf6b --- /dev/null +++ b/IlmImf/ImfMultiPartInputFile.cpp @@ -0,0 +1,783 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfMultiPartInputFile.h" + +#include "ImfTimeCodeAttribute.h" +#include "ImfChromaticitiesAttribute.h" +#include "ImfBoxAttribute.h" +#include "ImfFloatAttribute.h" +#include "ImfStdIO.h" +#include "ImfTileOffsets.h" +#include "ImfMisc.h" +#include "ImfTiledMisc.h" +#include "ImfInputStreamMutex.h" +#include "ImfInputPartData.h" +#include "ImfPartType.h" +#include "ImfInputFile.h" +#include "ImfScanLineInputFile.h" +#include "ImfTiledInputFile.h" +#include "ImfDeepScanLineInputFile.h" +#include "ImfDeepTiledInputFile.h" +#include "ImfVersion.h" + +#include +#include +#include + +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using IMATH_NAMESPACE::Box2i; + +using std::vector; +using std::map; +using std::set; +using std::string; + +namespace +{ + // Controls whether we error out in the event of shared attribute + // inconsistency in the input file + static const bool strictSharedAttribute = true; +} + +struct MultiPartInputFile::Data: public InputStreamMutex +{ + int version; // Version of this file. + bool deleteStream; // If we should delete the stream during destruction. + vector parts; // Data to initialize Output files. + int numThreads; // Number of threads + bool reconstructChunkOffsetTable; // If we should reconstruct + // the offset table if it's broken. + std::map _inputFiles; + std::vector
_headers; + + + void chunkOffsetReconstruction(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, const std::vector& parts); + + void readChunkOffsetTables(bool reconstructChunkOffsetTable); + + bool checkSharedAttributesValues(const Header & src, + const Header & dst, + std::vector & conflictingAttributes) const; + + TileOffsets* createTileOffsets(const Header& header); + + InputPartData* getPart(int partNumber); + + Data (bool deleteStream, int numThreads, bool reconstructChunkOffsetTable): + InputStreamMutex(), + deleteStream (deleteStream), + numThreads (numThreads), + reconstructChunkOffsetTable(reconstructChunkOffsetTable) + { + } + + ~Data() + { + if (deleteStream) delete is; + + for (size_t i = 0; i < parts.size(); i++) + delete parts[i]; + } + + template + T* createInputPartT(int partNumber) + { + + } +}; + +MultiPartInputFile::MultiPartInputFile(const char fileName[], + int numThreads, + bool reconstructChunkOffsetTable): + _data(new Data(true, numThreads, reconstructChunkOffsetTable)) +{ + try + { + _data->is = new StdIFStream (fileName); + initialize(); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + +MultiPartInputFile::MultiPartInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, + int numThreads, + bool reconstructChunkOffsetTable): + _data(new Data(false, numThreads, reconstructChunkOffsetTable)) +{ + try + { + _data->is = &is; + initialize(); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + +template +T* +MultiPartInputFile::getInputPart(int partNumber) +{ + Lock lock(*_data); + if (_data->_inputFiles.find(partNumber) == _data->_inputFiles.end()) + { + T* file = new T(_data->getPart(partNumber)); + _data->_inputFiles.insert(std::make_pair(partNumber, (GenericInputFile*) file)); + return file; + } + else return (T*) _data->_inputFiles[partNumber]; +} + + +template InputFile* MultiPartInputFile::getInputPart(int); +template TiledInputFile* MultiPartInputFile::getInputPart(int); +template DeepScanLineInputFile* MultiPartInputFile::getInputPart(int); +template DeepTiledInputFile* MultiPartInputFile::getInputPart(int); + +InputPartData* +MultiPartInputFile::getPart(int partNumber) +{ + return _data->getPart(partNumber); +} + + + +const Header & + MultiPartInputFile::header(int n) const +{ + return _data->_headers[n]; +} + + + +MultiPartInputFile::~MultiPartInputFile() +{ + for (map::iterator it = _data->_inputFiles.begin(); + it != _data->_inputFiles.end(); it++) + { + delete it->second; + } + + delete _data; +} + + +bool +MultiPartInputFile::Data::checkSharedAttributesValues(const Header & src, + const Header & dst, + vector & conflictingAttributes) const +{ + conflictingAttributes.clear(); + + bool conflict = false; + + // + // Display Window + // + if (src.displayWindow() != dst.displayWindow()) + { + conflict = true; + conflictingAttributes.push_back ("displayWindow"); + } + + + // + // Pixel Aspect Ratio + // + if (src.pixelAspectRatio() != dst.pixelAspectRatio()) + { + conflict = true; + conflictingAttributes.push_back ("pixelAspectRatio"); + } + + + // + // Timecode + // + const TimeCodeAttribute * srcTimeCode = src.findTypedAttribute< + TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); + const TimeCodeAttribute * dstTimeCode = dst.findTypedAttribute< + TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); + + if (dstTimeCode) + { + if ( (srcTimeCode && (srcTimeCode->value() != dstTimeCode->value())) || + (!srcTimeCode)) + { + conflict = true; + conflictingAttributes.push_back (TimeCodeAttribute::staticTypeName()); + } + } + + // + // Chromaticities + // + const ChromaticitiesAttribute * srcChrom = src.findTypedAttribute< + ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); + const ChromaticitiesAttribute * dstChrom = dst.findTypedAttribute< + ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); + + if (dstChrom) + { + if ( (srcChrom && (srcChrom->value() != dstChrom->value())) || + (!srcChrom)) + { + conflict = true; + conflictingAttributes.push_back (ChromaticitiesAttribute::staticTypeName()); + } + } + + + return conflict; +} + + +void +MultiPartInputFile::initialize() +{ + readMagicNumberAndVersionField(*_data->is, _data->version); + + bool multipart = isMultiPart(_data->version); + bool tiled = isTiled(_data->version); + + // + // Multipart files don't have and shouldn't have the tiled bit set. + // + + if (tiled && multipart) + throw IEX_NAMESPACE::InputExc ("Multipart files cannot have the tiled bit set"); + + + int pos = 0; + while (true) + { + Header header; + header.readFrom(*_data->is, _data->version); + + // + // If we read nothing then we stop reading. + // + + if (header.readsNothing()) + { + pos++; + break; + } + + _data->_headers.push_back(header); + + if(multipart == false) + break; + } + + // + // Perform usual check on headers. + // + + for (size_t i = 0; i < _data->_headers.size(); i++) + { + // + // Silently invent a type if the file is a single part regular image. + // + + if( _data->_headers[i].hasType() == false ) + { + if(multipart) + + throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a type"); + + _data->_headers[i].setType(tiled ? TILEDIMAGE : SCANLINEIMAGE); + } + else + { + + // + // Silently fix the header type if it's wrong + // (happens when a regular Image file written by EXR_2.0 is rewritten by an older library, + // so doesn't effect deep image types) + // + + if(!multipart && !isNonImage(_data->version)) + { + _data->_headers[i].setType(tiled ? TILEDIMAGE : SCANLINEIMAGE); + } + } + + + + if( _data->_headers[i].hasName() == false ) + { + if(multipart) + throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a name"); + } + + if (isTiled(_data->_headers[i].type())) + _data->_headers[i].sanityCheck(true, multipart); + else + _data->_headers[i].sanityCheck(false, multipart); + } + + // + // Check name uniqueness. + // + + if (multipart) + { + set names; + for (size_t i = 0; i < _data->_headers.size(); i++) + { + + if (names.find(_data->_headers[i].name()) != names.end()) + { + throw IEX_NAMESPACE::InputExc ("Header name " + _data->_headers[i].name() + + " is not a unique name."); + } + names.insert(_data->_headers[i].name()); + } + } + + // + // Check shared attributes compliance. + // + + if (multipart && strictSharedAttribute) + { + for (size_t i = 1; i < _data->_headers.size(); i++) + { + vector attrs; + if (_data->checkSharedAttributesValues (_data->_headers[0], _data->_headers[i], attrs)) + { + string attrNames; + for (size_t j=0; j_headers[i].name() + + " has non-conforming shared attributes: "+ + attrNames); + } + } + } + + // + // Create InputParts and read chunk offset tables. + // + + for (size_t i = 0; i < _data->_headers.size(); i++) + _data->parts.push_back( + new InputPartData(_data, _data->_headers[i], i, _data->numThreads, _data->version)); + + _data->readChunkOffsetTables(_data->reconstructChunkOffsetTable); +} + +TileOffsets* +MultiPartInputFile::Data::createTileOffsets(const Header& header) +{ + // + // Get the dataWindow information + // + + const Box2i &dataWindow = header.dataWindow(); + int minX = dataWindow.min.x; + int maxX = dataWindow.max.x; + int minY = dataWindow.min.y; + int maxY = dataWindow.max.y; + + // + // Precompute level and tile information + // + + int* numXTiles; + int* numYTiles; + int numXLevels, numYLevels; + TileDescription tileDesc = header.tileDescription(); + precalculateTileInfo (tileDesc, + minX, maxX, + minY, maxY, + numXTiles, numYTiles, + numXLevels, numYLevels); + + TileOffsets* tileOffsets = new TileOffsets (tileDesc.mode, + numXLevels, + numYLevels, + numXTiles, + numYTiles); + delete [] numXTiles; + delete [] numYTiles; + + return tileOffsets; +} + + +void +MultiPartInputFile::Data::chunkOffsetReconstruction(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, const vector& parts) +{ + // + // Reconstruct broken chunk offset tables. Stop once we received any exception. + // + + Int64 position = is.tellg(); + + + // + // check we understand all the parts available: if not, we cannot continue + // exceptions thrown here should trickle back up to the constructor + // + + for (size_t i = 0; i < parts.size(); i++) + { + Header& header=parts[i]->header; + + // + // do we have a valid type entry? + // we only need them for true multipart files or single part non-image (deep) files + // + if(!header.hasType() && (isMultiPart(version) || isNonImage(version))) + { + throw IEX_NAMESPACE::ArgExc("cannot reconstruct incomplete file: part with missing type"); + } + if(!isSupportedType(header.type())) + { + throw IEX_NAMESPACE::ArgExc("cannot reconstruct incomplete file: part with unknown type "+header.type()); + } + } + + + // how many chunks should we read? We should stop when we reach the end + size_t total_chunks = 0; + + // for tiled-based parts, array of (pointers to) tileOffsets objects + // to create mapping between tile coordinates and chunk table indices + + + vector tileOffsets(parts.size()); + + // for scanline-based parts, number of scanlines in each part + vector rowsizes(parts.size()); + + for(size_t i = 0 ; i < parts.size() ; i++) + { + total_chunks += parts[i]->chunkOffsets.size(); + if (isTiled(parts[i]->header.type())) + { + tileOffsets[i] = createTileOffsets(parts[i]->header); + }else{ + tileOffsets[i] = NULL; + // (TODO) fix this so that it doesn't need to be revised for future compression types. + switch(parts[i]->header.compression()) + { + case DWAB_COMPRESSION : + rowsizes[i] = 256; + break; + case PIZ_COMPRESSION : + case B44_COMPRESSION : + case B44A_COMPRESSION : + case DWAA_COMPRESSION : + rowsizes[i]=32; + break; + case ZIP_COMPRESSION : + case PXR24_COMPRESSION : + rowsizes[i]=16; + break; + case ZIPS_COMPRESSION : + case RLE_COMPRESSION : + case NO_COMPRESSION : + rowsizes[i]=1; + break; + default : + throw(IEX_NAMESPACE::ArgExc("Unknown compression method in chunk offset reconstruction")); + } + } + } + + try + { + + // + // + // + + Int64 chunk_start = position; + for (size_t i = 0; i < total_chunks ; i++) + { + // + // do we have a part number? + // + + int partNumber = 0; + if(isMultiPart(version)) + { + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, partNumber); + } + + + + if(partNumber<0 || partNumber>int(parts.size())) + { + // bail here - bad part number + throw int(); + } + + Header& header = parts[partNumber]->header; + + // size of chunk NOT including multipart field + + Int64 size_of_chunk=0; + + if (isTiled(header.type())) + { + // + // + // + int tilex,tiley,levelx,levely; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tilex); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tiley); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelx); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levely); + + //std::cout << "chunk_start for " << tilex <<',' << tiley << ',' << levelx << ' ' << levely << ':' << chunk_start << std::endl; + + + if(!tileOffsets[partNumber]) + { + // this shouldn't actually happen - we should have allocated a valid + // tileOffsets for any part which isTiled + throw int(); + + } + + if(!tileOffsets[partNumber]->isValidTile(tilex,tiley,levelx,levely)) + { + //std::cout << "invalid tile : aborting\n"; + throw int(); + } + + (*tileOffsets[partNumber])(tilex,tiley,levelx,levely)=chunk_start; + + // compute chunk sizes - different procedure for deep tiles and regular + // ones + if(header.type()==DEEPTILE) + { + Int64 packed_offset; + Int64 packed_sample; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); + + //add 40 byte header to packed sizes (tile coordinates, packed sizes, unpacked size) + size_of_chunk=packed_offset+packed_sample+40; + } + else + { + + // regular image has 20 bytes of header, 4 byte chunksize; + int chunksize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, chunksize); + size_of_chunk=chunksize+20; + } + } + else + { + int y_coordinate; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y_coordinate); + + y_coordinate -= header.dataWindow().min.y; + y_coordinate /= rowsizes[partNumber]; + + if(y_coordinate < 0 || y_coordinate >= int(parts[partNumber]->chunkOffsets.size())) + { + //std::cout << "aborting reconstruction: bad data " << y_coordinate << endl; + //bail to exception catcher: broken scanline + throw int(); + } + + parts[partNumber]->chunkOffsets[y_coordinate]=chunk_start; + //std::cout << "chunk_start for " << y_coordinate << ':' << chunk_start << std::endl; + + if(header.type()==DEEPSCANLINE) + { + Int64 packed_offset; + Int64 packed_sample; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample); + + + size_of_chunk=packed_offset+packed_sample+28; + } + else + { + int chunksize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, chunksize); + size_of_chunk=chunksize+8; + } + + } + + if(isMultiPart(version)) + { + chunk_start+=4; + } + + chunk_start+=size_of_chunk; + + //std::cout << " next chunk +"<header,false); + parts[i]->chunkOffsets.resize(chunkOffsetTableSize); + + for (int j = 0; j < chunkOffsetTableSize; j++) + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*is, parts[i]->chunkOffsets[j]); + + // + // Check chunk offsets, reconstruct if broken. + // At first we assume the table is complete. + // + parts[i]->completed = true; + for (int j = 0; j < chunkOffsetTableSize; j++) + { + if (parts[i]->chunkOffsets[j] <= 0) + { + brokenPartsExist = true; + parts[i]->completed = false; + break; + } + } + } + + if (brokenPartsExist && reconstructChunkOffsetTable) + chunkOffsetReconstruction(*is, parts); +} + +int +MultiPartInputFile::version() const +{ + return _data->version; +} + +bool +MultiPartInputFile::partComplete(int part) const +{ + return _data->parts[part]->completed; +} + +int +MultiPartInputFile::parts() const +{ + return int(_data->_headers.size()); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfMultiPartInputFile.h b/IlmImf/ImfMultiPartInputFile.h new file mode 100644 index 0000000..51ef9d3 --- /dev/null +++ b/IlmImf/ImfMultiPartInputFile.h @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFMULTIPARTINPUTFILE_H_ +#define IMFMULTIPARTINPUTFILE_H_ + +#include "ImfGenericInputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfThreading.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT MultiPartInputFile : public GenericInputFile +{ + public: + MultiPartInputFile(const char fileName[], + int numThreads = globalThreadCount(), + bool reconstructChunkOffsetTable = true); + + MultiPartInputFile(IStream& is, + int numThreads = globalThreadCount(), + bool reconstructChunkOffsetTable = true); + + virtual ~MultiPartInputFile(); + + // ---------------------- + // Count of number of parts in file + // --------------------- + int parts() const; + + + //---------------------- + // Access to the headers + //---------------------- + + const Header & header(int n) const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + // =---------------------------------------- + // Check whether the entire chunk offset + // table for the part is written correctly + // ----------------------------------------- + bool partComplete(int part) const; + + + + struct Data; + + + private: + Data* _data; + + MultiPartInputFile(const MultiPartInputFile &); // not implemented + + + // + // used internally by 'Part' types to access individual parts of the multipart file + // + template T* getInputPart(int partNumber); + InputPartData* getPart(int); + + void initialize(); + + + + + friend class InputPart; + friend class ScanLineInputPart; + friend class TiledInputPart; + friend class DeepScanLineInputPart; + friend class DeepTiledInputPart; + + // + // For backward compatibility. + // + + friend class InputFile; + friend class TiledInputFile; + friend class ScanLineInputFile; + friend class DeepScanLineInputFile; + friend class DeepTiledInputFile; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFMULTIPARTINPUTFILE_H_ */ diff --git a/IlmImf/ImfMultiPartOutputFile.cpp b/IlmImf/ImfMultiPartOutputFile.cpp new file mode 100644 index 0000000..32b2ae1 --- /dev/null +++ b/IlmImf/ImfMultiPartOutputFile.cpp @@ -0,0 +1,519 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfMultiPartOutputFile.h" +#include "ImfBoxAttribute.h" +#include "ImfFloatAttribute.h" +#include "ImfTimeCodeAttribute.h" +#include "ImfChromaticitiesAttribute.h" +#include "ImfOutputPartData.h" +#include "ImfPartType.h" +#include "ImfOutputFile.h" +#include "ImfTiledOutputFile.h" +#include "ImfThreading.h" +#include "IlmThreadMutex.h" +#include "ImfMisc.h" +#include "ImfStdIO.h" +#include "ImfDeepScanLineOutputFile.h" +#include "ImfDeepTiledOutputFile.h" +#include "ImfOutputStreamMutex.h" + +#include "ImfNamespace.h" +#include + + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using ILMTHREAD_NAMESPACE::Lock; + + +using std::vector; +using std::map; +using std::set; + + +struct MultiPartOutputFile::Data: public OutputStreamMutex +{ + vector parts; // Contains data to initialize Output files. + bool deleteStream; // If we should delete the stream when destruction. + int numThreads; // The number of threads. + std::map _outputFiles; + std::vector
_headers; + + + void headerNameUniquenessCheck (const std::vector
&headers); + + void writeHeadersToFile (const std::vector
&headers); + + void writeChunkTableOffsets (std::vector &parts); + + + //------------------------------------- + // ensure that _headers is valid: called by constructors + //------------------------------------- + void do_header_sanity_checks(bool overrideSharedAttributes); + + // ------------------------------------------------ + // Given a source header, we copy over all the 'shared attributes' to + // the destination header and remove any conflicting ones. + // ------------------------------------------------ + void overrideSharedAttributesValues (const Header & src, + Header & dst); + + // ------------------------------------------------ + // Given a source header, we check the destination header for any + // attributes that are part of the shared attribute set. For attributes + // present in both we check the values. For attribute present in + // destination but absent in source we return false. + // For attributes present in src but missing from dst we return false + // and add the attribute to dst. + // We return false for all other cases. + // If we return true then we also populate the conflictingAttributes + // vector with the names of the attributes that failed the above. + // ------------------------------------------------ + bool checkSharedAttributesValues (const Header & src, + const Header & dst, + std::vector & conflictingAttributes) const; + Data (bool deleteStream, int numThreads): + OutputStreamMutex(), + deleteStream (deleteStream), + numThreads (numThreads) + { + } + + + ~Data() + { + if (deleteStream) delete os; + + for (size_t i = 0; i < parts.size(); i++) + delete parts[i]; + } +}; + +void +MultiPartOutputFile::Data::do_header_sanity_checks(bool overrideSharedAttributes) +{ + size_t parts = _headers.size(); + if (parts == 0) + throw IEX_NAMESPACE::ArgExc ("Empty header list."); + + bool isMultiPart = (parts > 1); + + // + // Do part 0 checks first. + // + + _headers[0].sanityCheck (_headers[0].hasTileDescription(), isMultiPart); + + + if (isMultiPart) + { + // multipart files must contain a chunkCount attribute + _headers[0].setChunkCount(getChunkOffsetTableSize(_headers[0],true)); + + for (size_t i = 1; i < parts; i++) + { + if (_headers[i].hasType() == false) + throw IEX_NAMESPACE::ArgExc ("Every header in a multipart file should have a type"); + + + _headers[i].setChunkCount(getChunkOffsetTableSize(_headers[i],true)); + _headers[i].sanityCheck (_headers[i].hasTileDescription(), isMultiPart); + + + if (overrideSharedAttributes) + overrideSharedAttributesValues(_headers[0],_headers[i]); + else + { + std::vector conflictingAttributes; + bool valid =checkSharedAttributesValues (_headers[0], + _headers[i], + conflictingAttributes); + if (valid) + { + string excMsg("Conflicting attributes found for header :: "); + excMsg += _headers[i].name(); + for (size_t i=0; i_headers.resize(parts); + + for(int i=0;i_headers[i]=headers[i]; + } + try + { + + _data->do_header_sanity_checks(overrideSharedAttributes); + + // + // Build parts and write headers and offset tables to file. + // + + _data->os = new StdOFStream (fileName); + for (size_t i = 0; i < _data->_headers.size(); i++) + _data->parts.push_back( new OutputPartData(_data, _data->_headers[i], i, numThreads, parts>1 ) ); + + writeMagicNumberAndVersionField(*_data->os, &_data->_headers[0],_data->_headers.size()); + _data->writeHeadersToFile(_data->_headers); + _data->writeChunkTableOffsets(_data->parts); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + +MultiPartOutputFile::MultiPartOutputFile(OStream& os, + const Header* headers, + int parts, + bool overrideSharedAttributes, + int numThreads): + _data(new Data(false,numThreads)) +{ + // grab headers + _data->_headers.resize(parts); + _data->os=&os; + + for(int i=0;i_headers[i]=headers[i]; + } + try + { + + _data->do_header_sanity_checks(overrideSharedAttributes); + + // + // Build parts and write headers and offset tables to file. + // + + for (size_t i = 0; i < _data->_headers.size(); i++) + _data->parts.push_back( new OutputPartData(_data, _data->_headers[i], i, numThreads, parts>1 ) ); + + writeMagicNumberAndVersionField(*_data->os, &_data->_headers[0],_data->_headers.size()); + _data->writeHeadersToFile(_data->_headers); + _data->writeChunkTableOffsets(_data->parts); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image stream " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +const Header & +MultiPartOutputFile::header(int n) const +{ + if(n<0 || n>int(_data->_headers.size())) + { + throw IEX_NAMESPACE::ArgExc("MultiPartOutputFile::header called with invalid part number"); + } + return _data->_headers[n]; +} + +int +MultiPartOutputFile::parts() const +{ + return _data->_headers.size(); +} + + +MultiPartOutputFile::~MultiPartOutputFile () +{ + for (map::iterator it = _data->_outputFiles.begin(); + it != _data->_outputFiles.end(); it++) + { + delete it->second; + } + + delete _data; +} + +template +T* +MultiPartOutputFile::getOutputPart(int partNumber) +{ + Lock lock(*_data); + if (_data->_outputFiles.find(partNumber) == _data->_outputFiles.end()) + { + T* file = new T(_data->parts[partNumber]); + _data->_outputFiles.insert(std::make_pair(partNumber, (GenericOutputFile*) file)); + return file; + } + else return (T*) _data->_outputFiles[partNumber]; +} + +// instance above function for all four types +template OutputFile* MultiPartOutputFile::getOutputPart(int); +template TiledOutputFile * MultiPartOutputFile::getOutputPart(int); +template DeepScanLineOutputFile * MultiPartOutputFile::getOutputPart (int); +template DeepTiledOutputFile * MultiPartOutputFile::getOutputPart (int); + + + +void +MultiPartOutputFile::Data::overrideSharedAttributesValues(const Header & src, Header & dst) +{ + // + // Display Window + // + const Box2iAttribute * displayWindow = + src.findTypedAttribute ("displayWindow"); + + if (displayWindow) + dst.insert ("displayWindow", *displayWindow); + else + dst.erase ("displayWindow"); + + + // + // Pixel Aspect Ratio + // + const FloatAttribute * pixelAspectRatio = + src.findTypedAttribute ("pixelAspectRatio"); + + if (pixelAspectRatio) + dst.insert ("pixelAspectRatio", *pixelAspectRatio); + else + dst.erase ("pixelAspectRatio"); + + + // + // Timecode + // + const TimeCodeAttribute * timeCode = + src.findTypedAttribute ("timecode"); + + if (timeCode) + dst.insert ("timecode", *timeCode); + else + dst.erase ("timecode"); + + + // + // Chromaticities + // + const ChromaticitiesAttribute * chromaticities = + src.findTypedAttribute ("chromaticities"); + + if (chromaticities) + dst.insert ("chromaticities", *chromaticities); + else + dst.erase ("chromaticities"); + +} + + +bool +MultiPartOutputFile::Data::checkSharedAttributesValues(const Header & src, + const Header & dst, + vector & conflictingAttributes) const +{ + bool conflict = false; + + // + // Display Window + // + if (src.displayWindow() != dst.displayWindow()) + { + conflict = true; + conflictingAttributes.push_back ("displayWindow"); + } + + + // + // Pixel Aspect Ratio + // + if (src.pixelAspectRatio() != dst.pixelAspectRatio()) + { + conflict = true; + conflictingAttributes.push_back ("pixelAspectRatio"); + } + + + // + // Timecode + // + const TimeCodeAttribute * srcTimeCode = src.findTypedAttribute< + TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); + const TimeCodeAttribute * dstTimeCode = dst.findTypedAttribute< + TimeCodeAttribute> (TimeCodeAttribute::staticTypeName()); + + if (dstTimeCode) + { + if ((srcTimeCode && (srcTimeCode->value() != dstTimeCode->value())) || + (!srcTimeCode)) + { + conflict = true; + conflictingAttributes.push_back (TimeCodeAttribute::staticTypeName()); + } + } + + // + // Chromaticities + // + const ChromaticitiesAttribute * srcChrom = src.findTypedAttribute< + ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); + const ChromaticitiesAttribute * dstChrom = dst.findTypedAttribute< + ChromaticitiesAttribute> (ChromaticitiesAttribute::staticTypeName()); + + if (dstChrom) + { + if ( (srcChrom && (srcChrom->value() != dstChrom->value())) || + (!srcChrom)) + { + conflict = true; + conflictingAttributes.push_back (ChromaticitiesAttribute::staticTypeName()); + } + } + + return conflict; +} + + +void +MultiPartOutputFile::Data::headerNameUniquenessCheck (const vector
&headers) +{ + set names; + for (size_t i = 0; i < headers.size(); i++) + { + if (names.find(headers[i].name()) != names.end()) + throw IEX_NAMESPACE::ArgExc ("Each part should have a unique name."); + names.insert(headers[i].name()); + } +} + +void +MultiPartOutputFile::Data::writeHeadersToFile (const vector
&headers) +{ + for (size_t i = 0; i < headers.size(); i++) + { + + // (TODO) consider deep files' preview images here. + if (headers[i].type() == TILEDIMAGE) + parts[i]->previewPosition = headers[i].writeTo(*os, true); + else + parts[i]->previewPosition = headers[i].writeTo(*os, false); + } + + // + // If a multipart file, write zero-length attribute name to mark the end of all headers. + // + + if (headers.size() !=1) + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*os, ""); +} + +void +MultiPartOutputFile::Data::writeChunkTableOffsets (vector &parts) +{ + for (size_t i = 0; i < parts.size(); i++) + { + int chunkTableSize = getChunkOffsetTableSize(parts[i]->header,false); + + Int64 pos = os->tellp(); + + if (pos == -1) + IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); + + parts[i]->chunkOffsetTablePosition = os->tellp(); + + // + // Fill in empty data for now. We'll write actual offsets during destruction. + // + + for (int j = 0; j < chunkTableSize; j++) + { + Int64 empty = 0; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*os, empty); + } + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfMultiPartOutputFile.h b/IlmImf/ImfMultiPartOutputFile.h new file mode 100644 index 0000000..d5d6bfc --- /dev/null +++ b/IlmImf/ImfMultiPartOutputFile.h @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012 Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef MULTIPARTOUTPUTFILE_H_ +#define MULTIPARTOUTPUTFILE_H_ + +#include "ImfHeader.h" +#include "ImfGenericOutputFile.h" +#include "ImfForward.h" +#include "ImfThreading.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// Class responsible for handling the writing of multipart images. +// +// Note: Certain attributes are 'common' to all parts. Notably: +// * Display Window +// * Pixel Aspect Ratio +// * Time Code +// * Chromaticities +// The first header forms the basis for the set of attributes that are shared +// across the constituent parts. +// +// Parameters +// headers - pointer to array of headers; one for each part of the image file +// parts - count of number of parts +// overrideSharedAttributes - toggle for the handling of shared attributes. +// set false to check for inconsistencies, true +// to copy the values over from the first header. +// numThreads - number of threads that should be used in encoding the data. +// + +class IMF_EXPORT MultiPartOutputFile : public GenericOutputFile +{ + public: + MultiPartOutputFile(const char fileName[], + const Header * headers, + int parts, + bool overrideSharedAttributes = false, + int numThreads = globalThreadCount()); + + MultiPartOutputFile(OStream & os, + const Header * headers, + int parts, + bool overrideSharedAttributes = false, + int numThreads = globalThreadCount()); + + // + // return number of parts in file + // + int parts() const ; + + + // + // return header for part n + // (note: may have additional attributes compared to that passed to constructor) + // + const Header & header(int n) const; + + ~MultiPartOutputFile(); + + struct Data; + + private: + Data* _data; + + MultiPartOutputFile(const MultiPartOutputFile &); // not implemented + + template T* getOutputPart(int partNumber); + + + friend class OutputPart; + friend class TiledOutputPart; + friend class DeepScanLineOutputPart; + friend class DeepTiledOutputPart; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* MULTIPARTOUTPUTFILE_H_ */ diff --git a/IlmImf/ImfMultiView.cpp b/IlmImf/ImfMultiView.cpp new file mode 100644 index 0000000..acca3fe --- /dev/null +++ b/IlmImf/ImfMultiView.cpp @@ -0,0 +1,435 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Functions related to accessing channels +// and views in multi-view OpenEXR files. +// +//----------------------------------------------------------------------------- + +#include + +using namespace std; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +StringVector +parseString (string name, char c = '.') +{ + // + // Turn name into a list of strings, separating + // on char 'c' with whitespace stripped. + // + + StringVector r; + + while (name.size() > 0) + { + size_t s = name.find (c); + string sec = name.substr (0, s); + + // + // Strip spaces from beginning + // + + while (sec.size() > 0 && sec[0] == ' ') + sec.erase (0, 1); + + // + // Strip spaces from end + // + + while (sec.size() > 0 && sec[sec.size() - 1] == ' ') + sec.erase (sec.size() - 1); + + r.push_back (sec); + + // + // Strip off name including ending 'c' + // + + if (s == name.npos) + name = ""; + else + name = name.substr (s + 1); + } + + return r; +} + + +int +viewNum (const string &view, const StringVector &multiView) +{ + // + // returns which view number is called 'view' + // returns -1 if no member of multiView is 'view' + // (i.e. if viewNum() returns -1, 'view' isn't a view name + // if viewNum() returns 0, 'view' is the default view + // otherwise, it's some other (valid) view + // + + for (size_t i = 0; i < multiView.size(); ++i) + { + if (multiView[i] == view) + return i; + } + + return -1; +} + +} // namespace + + +string +defaultViewName (const StringVector &multiView) +{ + if (multiView.size() > 0) + return multiView[0]; + else + return ""; +} + + +string +viewFromChannelName (const string &channel, + const StringVector &multiView) +{ + // + // Given the name of a channel, return the name of the view to + // which it belongs. + // + + // + // View name is penultimate section of name separated by periods ('.'s) + // + + StringVector s = parseString (channel, '.'); + + if (s.size() == 0) + return ""; // nothing in, nothing out + + if (s.size() == 1) + { + // + // Return default view name. + // The rules say ALL channels with no periods + // in the name belong to the default view. + // + + return multiView[0]; + } + else + { + // + // size >= 2 - the last part is the channel name, + // the next-to-last part is the view name. + // Check if that part of the name really is + // a valid view and, if it is, return it. + // + + const string &viewName = s[s.size() - 2]; + + if (viewNum (viewName, multiView) >= 0) + return viewName; + else + return ""; // not associated with any particular view + } +} + + +ChannelList +channelsInView (const string & viewName, + const ChannelList & channelList, + const StringVector & multiView) +{ + // + // Return a list of all channels belonging to view viewName. + // + + ChannelList q; + + for (ChannelList::ConstIterator i = channelList.begin(); + i != channelList.end(); + ++i) + { + // + // Get view name for this channel + // + + string view = viewFromChannelName (i.name(), multiView); + + + // + // Insert channel into q if it's a member of view viewName + // + + if (view == viewName) + q.insert (i.name(), i.channel()); + } + + return q; +} + + +ChannelList +channelsInNoView (const ChannelList &channelList, + const StringVector &multiView) +{ + // + // Return a list of channels not associated with any named view. + // + + return channelsInView ("", channelList, multiView); +} + + + +bool +areCounterparts (const string &channel1, + const string &channel2, + const StringVector &multiView) +{ + // + // Given two channels, return true if they are the same + // channel in two different views. + // + + StringVector chan1 = parseString (channel1); + size_t size1 = chan1.size(); // number of SECTIONS in string + // name (not string length) + + StringVector chan2 = parseString (channel2); + size_t size2 = chan2.size(); + + if (size1 == 0 || size2 == 0) + return false; + + // + // channel1 and channel2 can't be counterparts + // if either channel is in no view. + // + + if (size1 > 1 && viewNum (chan1[size1 - 2], multiView) == -1) + return false; + + if (size2 > 1 && viewNum (chan2[size2 - 2], multiView) == -1) + return false; + + if (viewFromChannelName (channel1, multiView) == + viewFromChannelName (channel2, multiView)) + { + // + // channel1 and channel2 are not counterparts + // if they are in the same view. + // + + return false; + } + + if (size1 == 1) + { + // + // channel1 is a default channel - the channels will only be + // counterparts if channel2 is of the form . + // + + return size2 == 2 && chan1[0] == chan2[1]; + } + + if (size2 == 1) + { + // + // channel2 is a default channel - the channels will only be + // counterparts if channel1 is of the form . + // + + return size1 == 2 && chan2[0] == chan1[1]; + } + + // + // Neither channel is a default channel. To be counterparts both + // channel names must have the same number of components, and + // all components except the penultimate one must be the same. + // + + if (size1 != size2) + return false; + + for(size_t i = 0; i < size1; ++i) + { + if (i != size1 - 2 && chan1[i] != chan2[i]) + return false; + } + + return true; +} + + +ChannelList +channelInAllViews (const string &channelName, + const ChannelList &channelList, + const StringVector &multiView) +{ + // + // Given the name of a channel, return a + // list of the same channel in all views. + // + + ChannelList q; + + for (ChannelList::ConstIterator i=channelList.begin(); + i != channelList.end(); + ++i) + { + if (i.name() == channelName || + areCounterparts (i.name(), channelName, multiView)) + { + q.insert (i.name(), i.channel()); + } + } + + return q; +} + + +string +channelInOtherView (const string &channelName, + const ChannelList &channelList, + const StringVector &multiView, + const string &otherViewName) +{ + // + // Given the name of a channel in one view, return the + // corresponding channel name for view otherViewName. + // + + for (ChannelList::ConstIterator i=channelList.begin(); + i != channelList.end(); + ++i) + { + if (viewFromChannelName (i.name(), multiView) == otherViewName && + areCounterparts (i.name(), channelName, multiView)) + { + return i.name(); + } + } + + return ""; +} + + +string +insertViewName (const string &channel, + const StringVector &multiView, + int i) +{ + // + // Insert multiView[i] into the channel name if appropriate. + // + + StringVector s = parseString (channel, '.'); + + if (s.size() == 0) + return ""; // nothing in, nothing out + + if (s.size() == 1 && i == 0) + { + // + // Channel in the default view, with no periods in its name. + // Do not insert view name. + // + + return channel; + } + + // + // View name becomes penultimate section of new channel name. + // + + string newName; + + for (size_t j = 0; j < s.size(); ++j) + { + if (j < s.size() - 1) + newName += s[j] + "."; + else + newName += multiView[i] + "." + s[j]; + } + + return newName; +} + + +string +removeViewName(const string & channel,const string & view) +{ + StringVector s = parseString (channel, '.'); + + if (s.size() == 0) + return ""; // nothing in, nothing out + + if (s.size() == 1) + { + // + // Channel in the default view, since no periods in its name. + // No viewname to remove + // + + return channel; + } + + string newName; + for( size_t j = 0 ; j < s.size() ; ++j) + { + // only add the penultimate string part + // if it doesn't match the view name + if(j+2!=s.size() || s[j]!=view) + { + newName += s[j]; + if(j+1!=s.size()) + { + newName += "."; + } + } + } + + return newName; + +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfMultiView.h b/IlmImf/ImfMultiView.h new file mode 100644 index 0000000..127f97d --- /dev/null +++ b/IlmImf/ImfMultiView.h @@ -0,0 +1,187 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_MULTIVIEW_H +#define INCLUDED_IMF_MULTIVIEW_H + +#include "ImfChannelList.h" +#include "ImfStringVectorAttribute.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +//----------------------------------------------------------------------------- +// +// Functions related to accessing channels and views in multi-view +// OpenEXR files. +// +// A multi-view image file contains two or more views of the same +// scene, as seen from different viewpoints, for example, a left-eye +// and a right-eye view for stereo displays. Each view has its own +// set of image channels. A naming convention identifies the channels +// that belong to a given view. +// +// A "multiView" attribute in the file header lists the names of the +// views in an image (see ImfStandardAttributes.h), and channel names +// of the form +// +// layer.view.channel +// +// allow channels to be matched with views. +// +// For compatibility with singe-view images, the first view listed in +// the multiView attribute is the "default view", and channels that +// have no periods in their names are considered part of the default +// view. +// +// For example, if a file's multiView attribute lists the views +// "left" and "right", in that order, then "left" is the default +// view. Channels +// +// "R", "left.Z", "diffuse.left.R" +// +// are part of the "left" view; channels +// +// "right.R", "right.Z", "diffuse.right.R" +// +// are part of the "right" view; and channels +// +// "tmp.R", "right.diffuse.R", "diffuse.tmp.R" +// +// belong to no view at all. +// +//----------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +// +// Return the name of the default view given a multi-view string vector, +// that is, return the first element of the string vector. If the string +// vector is empty, return "". +// + +IMF_EXPORT +std::string defaultViewName (const StringVector &multiView); + + +// +// Given the name of a channel, return the name of the view to +// which it belongs. Returns the empty string ("") if the channel +// is not a member of any named view. +// + +IMF_EXPORT +std::string viewFromChannelName (const std::string &channel, + const StringVector &multiView); + + +// +// Return whether channel1 and channel2 are the same channel but +// viewed in different views. (Return false if either channel +// belongs to no view or if both channels belong to the same view.) +// + +IMF_EXPORT +bool areCounterparts (const std::string &channel1, + const std::string &channel2, + const StringVector &multiView); + +// +// Return a list of all channels belonging to view viewName. +// + +IMF_EXPORT +ChannelList channelsInView (const std::string &viewName, + const ChannelList &channelList, + const StringVector &multiView); + +// +// Return a list of channels not associated with any view. +// + +IMF_EXPORT +ChannelList channelsInNoView (const ChannelList &channelList, + const StringVector &multiView); + +// +// Given the name of a channel, return a list of the same channel +// in all views (for example, given X.left.Y return X.left.Y, +// X.right.Y, X.centre.Y, etc.). +// + +IMF_EXPORT +ChannelList channelInAllViews (const std::string &channame, + const ChannelList &channelList, + const StringVector &multiView); + +// +// Given the name of a channel in one view, return the corresponding +// channel name for view otherViewName. Return "" if no corresponding +// channel exists in view otherViewName, or if view otherViewName doesn't +// exist. +// + +IMF_EXPORT +std::string channelInOtherView (const std::string &channel, + const ChannelList &channelList, + const StringVector &multiView, + const std::string &otherViewName); + +// +// Given a channel name that does not include a view name, insert +// multiView[i] into the channel name at the appropriate location. +// If i is zero and the channel name contains no periods, then do +// not insert the view name. +// + +IMF_EXPORT +std::string insertViewName (const std::string &channel, + const StringVector &multiView, + int i); + +// +// Given a channel name that does may include a view name, return +// string without the view name. If the string does not contain +// the view name, return the string unaltered. +// (Will only remove the viewname if it is in the correct position +// in the string) +// + +IMF_EXPORT +std::string removeViewName (const std::string &channel, + const std::string &view); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfName.h b/IlmImf/ImfName.h new file mode 100644 index 0000000..4d4f25a --- /dev/null +++ b/IlmImf/ImfName.h @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_NAME_H +#define INCLUDED_IMF_NAME_H + +//----------------------------------------------------------------------------- +// +// class ImfName -- a zero-terminated string +// with a fixed, small maximum length +// +//----------------------------------------------------------------------------- + +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class Name +{ + public: + + //------------- + // Constructors + //------------- + + Name (); + Name (const char text[]); + + + //-------------------- + // Assignment operator + //-------------------- + + Name & operator = (const char text[]); + + + //--------------------- + // Access to the string + //--------------------- + + const char * text () const {return _text;} + const char * operator * () const {return _text;} + + //--------------- + // Maximum length + //--------------- + + static const int SIZE = 256; + static const int MAX_LENGTH = SIZE - 1; + + private: + + char _text[SIZE]; +}; + + +bool operator == (const Name &x, const Name &y); +bool operator != (const Name &x, const Name &y); +bool operator < (const Name &x, const Name &y); + + +//----------------- +// Inline functions +//----------------- + +inline Name & +Name::operator = (const char text[]) +{ + strncpy (_text, text, MAX_LENGTH); + return *this; +} + + +inline +Name::Name () +{ + _text[0] = 0; +} + + +inline +Name::Name (const char text[]) +{ + *this = text; + _text [MAX_LENGTH] = 0; +} + + +inline bool +operator == (const Name &x, const Name &y) +{ + return strcmp (*x, *y) == 0; +} + + +inline bool +operator != (const Name &x, const Name &y) +{ + return !(x == y); +} + + +inline bool +operator < (const Name &x, const Name &y) +{ + return strcmp (*x, *y) < 0; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + +#endif diff --git a/IlmImf/ImfNamespace.h b/IlmImf/ImfNamespace.h new file mode 100644 index 0000000..c36a31e --- /dev/null +++ b/IlmImf/ImfNamespace.h @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMFNAMESPACE_H +#define INCLUDED_IMFNAMESPACE_H + +// +// The purpose of this file is to have all of the Imath symbols defined within +// the OPENEXR_IMF_INTERNAL_NAMESPACE namespace rather than the standard Imath +// namespace. Those symbols are made available to client code through the +// OPENEXR_IMF_NAMESPACE in addition to the OPENEXR_IMF_INTERNAL_NAMESPACE. +// +// To ensure source code compatibility, the OPENEXR_IMF_NAMESPACE defaults to +// Imath and then "using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;" brings all +// of the declarations from the OPENEXR_IMF_INTERNAL_NAMESPACE into the +// OPENEXR_IMF_NAMESPACE. +// This means that client code can continue to use syntax like +// Imf::Header, but at link time it will resolve to a +// mangled symbol based on the OPENEXR_IMF_INTERNAL_NAMESPACE. +// +// As an example, if one needed to build against a newer version of Imath and +// have it run alongside an older version in the same application, it is now +// possible to use an internal namespace to prevent collisions between the +// older versions of Imath symbols and the newer ones. To do this, the +// following could be defined at build time: +// +// OPENEXR_IMF_INTERNAL_NAMESPACE = Imf_v2 +// +// This means that declarations inside Imath headers look like this (after +// the preprocessor has done its work): +// +// namespace Imf_v2 { +// ... +// class declarations +// ... +// } +// +// namespace Imf { +// using namespace IMF_NAMESPACE_v2; +// } +// + +// +// Open Source version of this file pulls in the OpenEXRConfig.h file +// for the configure time options. +// +#include "OpenEXRConfig.h" + + +#ifndef OPENEXR_IMF_NAMESPACE +#define OPENEXR_IMF_NAMESPACE Imf +#endif + +#ifndef OPENEXR_IMF_INTERNAL_NAMESPACE +#define OPENEXR_IMF_INTERNAL_NAMESPACE OPENEXR_IMF_NAMESPACE +#endif + +// +// We need to be sure that we import the internal namespace into the public one. +// To do this, we use the small bit of code below which initially defines +// OPENEXR_IMF_INTERNAL_NAMESPACE (so it can be referenced) and then defines +// OPENEXR_IMF_NAMESPACE and pulls the internal symbols into the public +// namespace. +// + +namespace OPENEXR_IMF_INTERNAL_NAMESPACE {} +namespace OPENEXR_IMF_NAMESPACE { + using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; +} + +// +// There are identical pairs of HEADER/SOURCE ENTER/EXIT macros so that +// future extension to the namespace mechanism is possible without changing +// project source code. +// + +#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER namespace OPENEXR_IMF_INTERNAL_NAMESPACE { +#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT } + +#define OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER namespace OPENEXR_IMF_INTERNAL_NAMESPACE { +#define OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT } + + +#endif /* INCLUDED_IMFNAMESPACE_H */ diff --git a/IlmImf/ImfOpaqueAttribute.cpp b/IlmImf/ImfOpaqueAttribute.cpp new file mode 100644 index 0000000..4a473ef --- /dev/null +++ b/IlmImf/ImfOpaqueAttribute.cpp @@ -0,0 +1,126 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class OpaqueAttribute +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +OpaqueAttribute::OpaqueAttribute (const char typeName[]): + _typeName (strlen (typeName) + 1), + _dataSize (0) +{ + strcpy (_typeName, typeName); +} + + +OpaqueAttribute::OpaqueAttribute (const OpaqueAttribute &other): + _typeName (strlen (other._typeName) + 1), + _dataSize (other._dataSize), + _data (other._dataSize) +{ + strcpy (_typeName, other._typeName); + _data.resizeErase (other._dataSize); + memcpy ((char *) _data, (const char *) other._data, other._dataSize); +} + + +OpaqueAttribute::~OpaqueAttribute () +{ + // empty +} + + +const char * +OpaqueAttribute::typeName () const +{ + return _typeName; +} + + +Attribute * +OpaqueAttribute::copy () const +{ + return new OpaqueAttribute (*this); +} + + +void +OpaqueAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _data, _dataSize); +} + + +void +OpaqueAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + _data.resizeErase (size); + _dataSize = size; + Xdr::read (is, _data, size); +} + + +void +OpaqueAttribute::copyValueFrom (const Attribute &other) +{ + const OpaqueAttribute *oa = dynamic_cast (&other); + + if (oa == 0 || strcmp (_typeName, oa->_typeName)) + { + THROW (IEX_NAMESPACE::TypeExc, "Cannot copy the value of an " + "image file attribute of type " + "\"" << other.typeName() << "\" " + "to an attribute of type " + "\"" << _typeName << "\"."); + } + + _data.resizeErase (oa->_dataSize); + _dataSize = oa->_dataSize; + memcpy ((char *) _data, (const char *) oa->_data, oa->_dataSize); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfOpaqueAttribute.h b/IlmImf/ImfOpaqueAttribute.h new file mode 100644 index 0000000..1682bfd --- /dev/null +++ b/IlmImf/ImfOpaqueAttribute.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_OPAQUE_ATTRIBUTE_H +#define INCLUDED_IMF_OPAQUE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class OpaqueAttribute +// +// When an image file is read, OpqaqueAttribute objects are used +// to hold the values of attributes whose types are not recognized +// by the reading program. OpaqueAttribute objects can be read +// from an image file, copied, and written back to to another image +// file, but their values are inaccessible. +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfArray.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT OpaqueAttribute: public Attribute +{ + public: + + //---------------------------- + // Constructors and destructor + //---------------------------- + + OpaqueAttribute (const char typeName[]); + OpaqueAttribute (const OpaqueAttribute &other); + virtual ~OpaqueAttribute (); + + + //------------------------------- + // Get this attribute's type name + //------------------------------- + + virtual const char * typeName () const; + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const; + + + //---------------- + // I/O and copying + //---------------- + + virtual void writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + int version) const; + + virtual void readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version); + + virtual void copyValueFrom (const Attribute &other); + + + private: + + Array _typeName; + long _dataSize; + Array _data; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfOptimizedPixelReading.h b/IlmImf/ImfOptimizedPixelReading.h new file mode 100644 index 0000000..1c83497 --- /dev/null +++ b/IlmImf/ImfOptimizedPixelReading.h @@ -0,0 +1,646 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Autodesk, Inc. +// +// All rights reserved. +// +// Implementation of IIF-specific file format and speed optimizations +// provided by Innobec Technologies inc on behalf of Autodesk. +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#pragma once + +#ifndef INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H +#define INCLUDED_IMF_OPTIMIZED_PIXEL_READING_H + +#include "ImfSimd.h" +#include "ImfSystemSpecific.h" +#include +#include "ImfChannelList.h" +#include "ImfFrameBuffer.h" +#include "ImfStringVectorAttribute.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class OptimizationMode +{ +public: + + + bool _optimizable; + int _ySampling; + OptimizationMode() : _optimizable(false) {} + +}; + + +#if IMF_HAVE_SSE2 + + +//------------------------------------------------------------------------ +// Test for SSE pointer alignemnt +//------------------------------------------------------------------------ +EXR_FORCEINLINE +bool +isPointerSSEAligned (const void* EXR_RESTRICT pPointer) +{ + unsigned long trailingBits = ((unsigned long)pPointer) & 15; + return trailingBits == 0; +} + +//------------------------------------------------------------------------ +// Load SSE from address into register +//------------------------------------------------------------------------ +template +EXR_FORCEINLINE +__m128i loadSSE (__m128i*& loadAddress) +{ + // throw exception :: this is not accepted + return _mm_loadu_si128 (loadAddress); +} + +template<> +EXR_FORCEINLINE +__m128i loadSSE (__m128i*& loadAddress) +{ + return _mm_loadu_si128 (loadAddress); +} + +template<> +EXR_FORCEINLINE +__m128i loadSSE (__m128i*& loadAddress) +{ + return _mm_load_si128 (loadAddress); +} + +//------------------------------------------------------------------------ +// Store SSE from register into address +//------------------------------------------------------------------------ +template +EXR_FORCEINLINE +void storeSSE (__m128i*& storeAddress, __m128i& dataToStore) +{ + +} + +template<> +EXR_FORCEINLINE +void +storeSSE (__m128i*& storeAddress, __m128i& dataToStore) +{ + _mm_storeu_si128 (storeAddress, dataToStore); +} + +template<> +EXR_FORCEINLINE +void +storeSSE (__m128i*& storeAddress, __m128i& dataToStore) +{ + _mm_stream_si128 (storeAddress, dataToStore); +} + + + +//------------------------------------------------------------------------ +// +// Write to RGBA +// +//------------------------------------------------------------------------ + +// +// Using SSE intrinsics +// +template +EXR_FORCEINLINE +void writeToRGBASSETemplate + (__m128i*& readPtrSSERed, + __m128i*& readPtrSSEGreen, + __m128i*& readPtrSSEBlue, + __m128i*& readPtrSSEAlpha, + __m128i*& writePtrSSE, + const size_t& lPixelsToCopySSE) +{ + for (size_t i = 0; i < lPixelsToCopySSE; ++i) + { + __m128i redRegister = loadSSE (readPtrSSERed); + __m128i greenRegister = loadSSE (readPtrSSEGreen); + __m128i blueRegister = loadSSE (readPtrSSEBlue); + __m128i alphaRegister = loadSSE (readPtrSSEAlpha); + + __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, + greenRegister); + __m128i blueAlphaRegister = _mm_unpacklo_epi16 (blueRegister, + alphaRegister); + + __m128i pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, + blueAlphaRegister); + __m128i pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, + blueAlphaRegister); + + storeSSE (writePtrSSE, pixel12Register); + ++writePtrSSE; + + storeSSE (writePtrSSE, pixel34Register); + ++writePtrSSE; + + redGreenRegister = _mm_unpackhi_epi16 (redRegister, greenRegister); + blueAlphaRegister = _mm_unpackhi_epi16 (blueRegister, alphaRegister); + + pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, + blueAlphaRegister); + pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, + blueAlphaRegister); + + storeSSE (writePtrSSE, pixel12Register); + ++writePtrSSE; + + storeSSE (writePtrSSE, pixel34Register); + ++writePtrSSE; + + ++readPtrSSEAlpha; + ++readPtrSSEBlue; + ++readPtrSSEGreen; + ++readPtrSSERed; + } +} + +// +// Not using SSE intrinsics. This is still faster than the alternative +// because we have multiple read pointers and therefore we are able to +// take advantage of data locality for write operations. +// +EXR_FORCEINLINE +void writeToRGBANormal (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + unsigned short*& readPtrAlpha, + unsigned short*& writePtr, + const size_t& lPixelsToCopy) +{ + for (size_t i = 0; i < lPixelsToCopy; ++i) + { + *(writePtr++) = *(readPtrRed++); + *(writePtr++) = *(readPtrGreen++); + *(writePtr++) = *(readPtrBlue++); + *(writePtr++) = *(readPtrAlpha++); + } +} + +// +// Determine which (template) version to use by checking whether pointers +// are aligned +// +EXR_FORCEINLINE +void optimizedWriteToRGBA (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + unsigned short*& readPtrAlpha, + unsigned short*& writePtr, + const size_t& pixelsToCopySSE, + const size_t& pixelsToCopyNormal) +{ + bool readPtrAreAligned = true; + + readPtrAreAligned &= isPointerSSEAligned(readPtrRed); + readPtrAreAligned &= isPointerSSEAligned(readPtrGreen); + readPtrAreAligned &= isPointerSSEAligned(readPtrBlue); + readPtrAreAligned &= isPointerSSEAligned(readPtrAlpha); + + bool writePtrIsAligned = isPointerSSEAligned(writePtr); + + if (!readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)readPtrAlpha, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (!readPtrAreAligned && writePtrIsAligned) + { + writeToRGBASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)readPtrAlpha, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)readPtrAlpha, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if(readPtrAreAligned && writePtrIsAligned) + { + writeToRGBASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)readPtrAlpha, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + + writeToRGBANormal (readPtrRed, readPtrGreen, readPtrBlue, readPtrAlpha, + writePtr, pixelsToCopyNormal); +} + + + +//------------------------------------------------------------------------ +// +// Write to RGBA Fill A +// +//------------------------------------------------------------------------ + +// +// Using SSE intrinsics +// +template +EXR_FORCEINLINE +void +writeToRGBAFillASSETemplate (__m128i*& readPtrSSERed, + __m128i*& readPtrSSEGreen, + __m128i*& readPtrSSEBlue, + const unsigned short& alphaFillValue, + __m128i*& writePtrSSE, + const size_t& pixelsToCopySSE) +{ + const __m128i dummyAlphaRegister = _mm_set_epi16 (alphaFillValue, + alphaFillValue, + alphaFillValue, + alphaFillValue, + alphaFillValue, + alphaFillValue, + alphaFillValue, + alphaFillValue); + + for (size_t pixelCounter = 0; pixelCounter < pixelsToCopySSE; ++pixelCounter) + { + __m128i redRegister = loadSSE (readPtrSSERed); + __m128i greenRegister = loadSSE (readPtrSSEGreen); + __m128i blueRegister = loadSSE (readPtrSSEBlue); + + __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, + greenRegister); + __m128i blueAlphaRegister = _mm_unpacklo_epi16 (blueRegister, + dummyAlphaRegister); + + __m128i pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, + blueAlphaRegister); + __m128i pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, + blueAlphaRegister); + + storeSSE (writePtrSSE, pixel12Register); + ++writePtrSSE; + + storeSSE (writePtrSSE, pixel34Register); + ++writePtrSSE; + + redGreenRegister = _mm_unpackhi_epi16 (redRegister, + greenRegister); + blueAlphaRegister = _mm_unpackhi_epi16 (blueRegister, + dummyAlphaRegister); + + pixel12Register = _mm_unpacklo_epi32 (redGreenRegister, + blueAlphaRegister); + pixel34Register = _mm_unpackhi_epi32 (redGreenRegister, + blueAlphaRegister); + + storeSSE (writePtrSSE, pixel12Register); + ++writePtrSSE; + + storeSSE (writePtrSSE, pixel34Register); + ++writePtrSSE; + + ++readPtrSSEBlue; + ++readPtrSSEGreen; + ++readPtrSSERed; + } +} + +// +// Not using SSE intrinsics. This is still faster than the alternative +// because we have multiple read pointers and therefore we are able to +// take advantage of data locality for write operations. +// +EXR_FORCEINLINE +void +writeToRGBAFillANormal (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + const unsigned short& alphaFillValue, + unsigned short*& writePtr, + const size_t& pixelsToCopy) +{ + for (size_t i = 0; i < pixelsToCopy; ++i) + { + *(writePtr++) = *(readPtrRed++); + *(writePtr++) = *(readPtrGreen++); + *(writePtr++) = *(readPtrBlue++); + *(writePtr++) = alphaFillValue; + } +} + +// +// Determine which (template) version to use by checking whether pointers +// are aligned. +// +EXR_FORCEINLINE +void +optimizedWriteToRGBAFillA (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + const unsigned short& alphaFillValue, + unsigned short*& writePtr, + const size_t& pixelsToCopySSE, + const size_t& pixelsToCopyNormal) +{ + bool readPtrAreAligned = true; + + readPtrAreAligned &= isPointerSSEAligned (readPtrRed); + readPtrAreAligned &= isPointerSSEAligned (readPtrGreen); + readPtrAreAligned &= isPointerSSEAligned (readPtrBlue); + + bool writePtrIsAligned = isPointerSSEAligned (writePtr); + + if (!readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + alphaFillValue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (!readPtrAreAligned && writePtrIsAligned) + { + writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + alphaFillValue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + alphaFillValue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (readPtrAreAligned && writePtrIsAligned) + { + writeToRGBAFillASSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + alphaFillValue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + + writeToRGBAFillANormal (readPtrRed, + readPtrGreen, readPtrBlue, alphaFillValue, + writePtr, pixelsToCopyNormal); +} + + + +//------------------------------------------------------------------------ +// +// Write to RGB +// +//------------------------------------------------------------------------ + +// +// Using SSE intrinsics +// +template +EXR_FORCEINLINE +void +writeToRGBSSETemplate (__m128i*& readPtrSSERed, + __m128i*& readPtrSSEGreen, + __m128i*& readPtrSSEBlue, + __m128i*& writePtrSSE, + const size_t& pixelsToCopySSE) +{ + + for (size_t pixelCounter = 0; pixelCounter < pixelsToCopySSE; ++pixelCounter) + { + // + // Need to shuffle and unpack pointers to obtain my first register + // We must save 8 pixels at a time, so we must have the following three registers at the end: + // 1) R1 G1 B1 R2 G2 B2 R3 G3 + // 2) B3 R4 G4 B4 R5 G5 B5 R6 + // 3) G6 B6 R7 G7 B7 R8 G8 B8 + // + __m128i redRegister = loadSSE (readPtrSSERed); + __m128i greenRegister = loadSSE (readPtrSSEGreen); + __m128i blueRegister = loadSSE (readPtrSSEBlue); + + // + // First register: R1 G1 B1 R2 G2 B2 R3 G3 + // Construct 2 registers and then unpack them to obtain our final result: + // + __m128i redGreenRegister = _mm_unpacklo_epi16 (redRegister, + greenRegister); + __m128i redBlueRegister = _mm_unpacklo_epi16 (redRegister, + blueRegister); + __m128i greenBlueRegister = _mm_unpacklo_epi16 (greenRegister, + blueRegister); + + // Left Part (R1 G1 B1 R2) + __m128i quarterRight = _mm_shufflelo_epi16 (redBlueRegister, + _MM_SHUFFLE(3,0,2,1)); + __m128i halfLeft = _mm_unpacklo_epi32 (redGreenRegister, + quarterRight); + + // Right Part (G2 B2 R3 G3) + __m128i quarterLeft = _mm_shuffle_epi32 (greenBlueRegister, + _MM_SHUFFLE(3,2,0,1)); + quarterRight = _mm_shuffle_epi32 (redGreenRegister, + _MM_SHUFFLE(3,0,1,2)); + __m128i halfRight = _mm_unpacklo_epi32 (quarterLeft, quarterRight); + + __m128i fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); + storeSSE (writePtrSSE, fullRegister); + ++writePtrSSE; + + // + // Second register: B3 R4 G4 B4 R5 G5 B5 R6 + // + + // Left Part (B3, R4, G4, B4) + quarterLeft = _mm_shufflehi_epi16 (redBlueRegister, + _MM_SHUFFLE(0, 3, 2, 1)); + quarterRight = _mm_shufflehi_epi16 (greenBlueRegister, + _MM_SHUFFLE(1, 0, 3, 2)); + halfLeft = _mm_unpackhi_epi32 (quarterLeft, quarterRight); + + // Update the registers + redGreenRegister = _mm_unpackhi_epi16 (redRegister, greenRegister); + redBlueRegister = _mm_unpackhi_epi16 (redRegister, blueRegister); + greenBlueRegister = _mm_unpackhi_epi16 (greenRegister, blueRegister); + + // Right Part (R5 G5 B5 R6) + quarterRight = _mm_shufflelo_epi16 (redBlueRegister, + _MM_SHUFFLE(3,0,2,1)); + halfRight = _mm_unpacklo_epi32 (redGreenRegister, quarterRight); + + fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); + storeSSE (writePtrSSE, fullRegister); + ++writePtrSSE; + + // + // Third register: G6 B6 R7 G7 B7 R8 G8 B8 + // + + // Left part (G6 B6 R7 G7) + quarterLeft = _mm_shuffle_epi32 (greenBlueRegister, + _MM_SHUFFLE(3,2,0,1)); + quarterRight = _mm_shuffle_epi32 (redGreenRegister, + _MM_SHUFFLE(3,0,1,2)); + halfLeft = _mm_unpacklo_epi32 (quarterLeft, quarterRight); + + // Right part (B7 R8 G8 B8) + quarterLeft = _mm_shufflehi_epi16 (redBlueRegister, + _MM_SHUFFLE(0, 3, 2, 1)); + quarterRight = _mm_shufflehi_epi16 (greenBlueRegister, + _MM_SHUFFLE(1, 0, 3, 2)); + halfRight = _mm_unpackhi_epi32 (quarterLeft, quarterRight); + + fullRegister = _mm_unpacklo_epi64 (halfLeft, halfRight); + storeSSE (writePtrSSE, fullRegister); + ++writePtrSSE; + + // + // Increment read pointers + // + ++readPtrSSEBlue; + ++readPtrSSEGreen; + ++readPtrSSERed; + } +} + +// +// Not using SSE intrinsics. This is still faster than the alternative +// because we have multiple read pointers and therefore we are able to +// take advantage of data locality for write operations. +// +EXR_FORCEINLINE +void +writeToRGBNormal (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + unsigned short*& writePtr, + const size_t& pixelsToCopy) +{ + for (size_t i = 0; i < pixelsToCopy; ++i) + { + *(writePtr++) = *(readPtrRed++); + *(writePtr++) = *(readPtrGreen++); + *(writePtr++) = *(readPtrBlue++); + } +} + +// +// Determine which (template) version to use by checking whether pointers +// are aligned +// +EXR_FORCEINLINE +void optimizedWriteToRGB (unsigned short*& readPtrRed, + unsigned short*& readPtrGreen, + unsigned short*& readPtrBlue, + unsigned short*& writePtr, + const size_t& pixelsToCopySSE, + const size_t& pixelsToCopyNormal) +{ + bool readPtrAreAligned = true; + + readPtrAreAligned &= isPointerSSEAligned(readPtrRed); + readPtrAreAligned &= isPointerSSEAligned(readPtrGreen); + readPtrAreAligned &= isPointerSSEAligned(readPtrBlue); + + bool writePtrIsAligned = isPointerSSEAligned(writePtr); + + if (!readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBSSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (!readPtrAreAligned && writePtrIsAligned) + { + writeToRGBSSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (readPtrAreAligned && !writePtrIsAligned) + { + writeToRGBSSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + else if (readPtrAreAligned && writePtrIsAligned) + { + writeToRGBSSETemplate ((__m128i*&)readPtrRed, + (__m128i*&)readPtrGreen, + (__m128i*&)readPtrBlue, + (__m128i*&)writePtr, + pixelsToCopySSE); + } + + + writeToRGBNormal (readPtrRed, readPtrGreen, readPtrBlue, + writePtr, pixelsToCopyNormal); +} + + + + +#else // ! defined IMF_HAVE_SSE2 + +#endif // defined IMF_HAVE_SSE2 + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfOutputFile.cpp b/IlmImf/ImfOutputFile.cpp new file mode 100644 index 0000000..2619d9c --- /dev/null +++ b/IlmImf/ImfOutputFile.cpp @@ -0,0 +1,1378 @@ +// +///\todo: version needs fixing! +// + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class OutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include "ImathFun.h" +#include +#include "ImfXdr.h" +#include +#include +#include "IlmThreadPool.h" +#include "ImfOutputStreamMutex.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include "ImfInputPart.h" +#include "ImfNamespace.h" +#include "ImfOutputPartData.h" + +#include +#include +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using std::string; +using std::vector; +using std::ofstream; +using std::min; +using std::max; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + + +namespace { + + +struct OutSliceInfo +{ + PixelType type; + const char * base; + size_t xStride; + size_t yStride; + int xSampling; + int ySampling; + bool zero; + + OutSliceInfo (PixelType type = HALF, + const char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + bool zero = false); + +}; + + +OutSliceInfo::OutSliceInfo (PixelType t, + const char *b, + size_t xs, size_t ys, + int xsm, int ysm, + bool z) +: + type (t), + base (b), + xStride (xs), + yStride (ys), + xSampling (xsm), + ySampling (ysm), + zero (z) +{ + // empty +} + + +struct LineBuffer +{ + Array buffer; + const char * dataPtr; + int dataSize; + char * endOfLineBufferData; + int minY; + int maxY; + int scanLineMin; + int scanLineMax; + Compressor * compressor; + bool partiallyFull; // has incomplete data + bool hasException; + string exception; + + LineBuffer (Compressor *comp); + ~LineBuffer (); + + void wait () {_sem.wait();} + void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (Compressor *comp) : + dataPtr (0), + dataSize (0), + compressor (comp), + partiallyFull (false), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +LineBuffer::~LineBuffer () +{ + delete compressor; +} + +} // namespace + +struct OutputFile::Data +{ + Header header; // the image header + bool multiPart; // is the file multipart? + int version; // version attribute \todo NOT BEING WRITTEN PROPERLY + Int64 previewPosition; // file position for preview + FrameBuffer frameBuffer; // framebuffer to write into + int currentScanLine; // next scanline to be written + int missingScanLines; // number of lines to write + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each scanline + vector bytesPerLine; // combined size of a line over + // all channels + vector offsetInLineBuffer; // offset for each scanline in + // its linebuffer + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + Int64 lineOffsetsPosition; // file position for line + // offset table + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each + // buffer holds + size_t lineBufferSize; // size of the line buffer + + int partNumber; // the output part number + OutputStreamMutex * _streamData; + bool _deleteStream; + Data (int numThreads); + ~Data (); + + + inline LineBuffer * getLineBuffer (int number); // hash function from line + // buffer indices into our + // vector of line buffers +}; + + +OutputFile::Data::Data (int numThreads): + lineOffsetsPosition (0), + partNumber (-1), + _streamData(0), + _deleteStream(false) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers. + // + + lineBuffers.resize (max (1, 2 * numThreads)); +} + + +OutputFile::Data::~Data () +{ + for (size_t i = 0; i < lineBuffers.size(); i++) + delete lineBuffers[i]; +} + + +LineBuffer* +OutputFile::Data::getLineBuffer (int number) +{ + return lineBuffers[number % lineBuffers.size()]; +} + +namespace { + +Int64 +writeLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const vector &lineOffsets) +{ + Int64 pos = os.tellp(); + + if (pos == -1) + IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + Xdr::write (os, lineOffsets[i]); + + return pos; +} + + +void +writePixelData (OutputStreamMutex *filedata, + OutputFile::Data *partdata, + int lineBufferMinY, + const char pixelData[], + int pixelDataSize) +{ + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = filedata->currentPosition; + filedata->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = filedata->os->tellp(); + + partdata->lineOffsets[(partdata->currentScanLine - partdata->minY) / partdata->linesInBuffer] = + currentPosition; + + #ifdef DEBUG + + assert (filedata->os->tellp() == currentPosition); + + #endif + + + + if (partdata->multiPart) + { + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, partdata->partNumber); + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, lineBufferMinY); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (*filedata->os, pixelDataSize); + filedata->os->write (pixelData, pixelDataSize); + + filedata->currentPosition = currentPosition + + Xdr::size() + + Xdr::size() + + pixelDataSize; + + if (partdata->multiPart) + { + filedata->currentPosition += Xdr::size(); + } +} + + +inline void +writePixelData (OutputStreamMutex* filedata, + OutputFile::Data *partdata, + const LineBuffer *lineBuffer) +{ + writePixelData (filedata, partdata, + lineBuffer->minY, + lineBuffer->dataPtr, + lineBuffer->dataSize); +} + + +void +convertToXdr (OutputFile::Data *ofd, + Array &lineBuffer, + int lineBufferMinY, + int lineBufferMaxY, + int inSize) +{ + // + // Convert the contents of a lineBuffer from the machine's native + // representation to Xdr format. This function is called by + // CompressLineBuffer::execute(), below, if the compressor wanted + // its input pixel data in the machine's native format, but then + // failed to compress the data (most compressors will expand rather + // than compress random input data). + // + // Note that this routine assumes that the machine's native + // representation of the pixel data has the same size as the + // Xdr representation. This makes it possible to convert the + // pixel data in place, without an intermediate temporary buffer. + // + + // + // Iterate over all scanlines in the lineBuffer to convert. + // + + char *writePtr = &lineBuffer[0]; + for (int y = lineBufferMinY; y <= lineBufferMaxY; y++) + { + // + // Set these to point to the start of line y. + // We will write to writePtr from readPtr. + // + + const char *readPtr = writePtr; + + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel is + // contains any data (the scan line contains + // data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the number of sampled pixels, dMaxX-dMinX+1, for + // slice i in scan line y (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (ofd->minX, slice.xSampling); + int dMaxX = divp (ofd->maxX, slice.xSampling); + + // + // Convert the samples in place. + // + + convertInPlace (writePtr, readPtr, slice.type, dMaxX - dMinX + 1); + } + } +} + + +// +// A LineBufferTask encapsulates the task of copying a set of scanlines +// from the user's frame buffer into a LineBuffer object, compressing +// the data if necessary. +// + +class LineBufferTask: public Task +{ + public: + + LineBufferTask (TaskGroup *group, + OutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + OutputFile::Data * _ofd; + LineBuffer * _lineBuffer; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + OutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax) +: + Task (group), + _ofd (ofd), + _lineBuffer (_ofd->getLineBuffer(number)) +{ + // + // Wait for the lineBuffer to become available + // + + _lineBuffer->wait (); + + // + // Initialize the lineBuffer data if necessary + // + + if (!_lineBuffer->partiallyFull) + { + _lineBuffer->endOfLineBufferData = _lineBuffer->buffer; + + _lineBuffer->minY = _ofd->minY + number * _ofd->linesInBuffer; + + _lineBuffer->maxY = min (_lineBuffer->minY + _ofd->linesInBuffer - 1, + _ofd->maxY); + + _lineBuffer->partiallyFull = true; + } + + _lineBuffer->scanLineMin = max (_lineBuffer->minY, scanLineMin); + _lineBuffer->scanLineMax = min (_lineBuffer->maxY, scanLineMax); +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the + // frame buffer into the line buffer + // + + int yStart, yStop, dy; + + if (_ofd->lineOrder == INCREASING_Y) + { + yStart = _lineBuffer->scanLineMin; + yStop = _lineBuffer->scanLineMax + 1; + dy = 1; + } + else + { + yStart = _lineBuffer->scanLineMax; + yStop = _lineBuffer->scanLineMin - 1; + dy = -1; + } + + int y; + + for (y = yStart; y != yStop; y += dy) + { + // + // Gather one scan line's worth of pixel data and store + // them in _ofd->lineBuffer. + // + + char *writePtr = _lineBuffer->buffer + + _ofd->offsetInLineBuffer[y - _ofd->minY]; + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = _ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the x coordinates of the leftmost and rightmost + // sampled pixels (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (_ofd->minX, slice.xSampling); + int dMaxX = divp (_ofd->maxX, slice.xSampling); + + // + // Fill the line buffer with with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _lineBuffer->buffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + dMaxX - dMinX + 1); + } + else + { + // + // If necessary, convert the pixel data to Xdr format. + // Then store the pixel data in _ofd->lineBuffer. + // + + const char *linePtr = slice.base + + divp (y, slice.ySampling) * + slice.yStride; + + const char *readPtr = linePtr + dMinX * slice.xStride; + const char *endPtr = linePtr + dMaxX * slice.xStride; + + copyFromFrameBuffer (writePtr, readPtr, endPtr, + slice.xStride, _ofd->format, + slice.type); + } + } + + if (_lineBuffer->endOfLineBufferData < writePtr) + _lineBuffer->endOfLineBufferData = writePtr; + + #ifdef DEBUG + + assert (writePtr - (_lineBuffer->buffer + + _ofd->offsetInLineBuffer[y - _ofd->minY]) == + (int) _ofd->bytesPerLine[y - _ofd->minY]); + + #endif + + } + + // + // If the next scanline isn't past the bounds of the lineBuffer + // then we are done, otherwise compress the linebuffer + // + + if (y >= _lineBuffer->minY && y <= _lineBuffer->maxY) + return; + + _lineBuffer->dataPtr = _lineBuffer->buffer; + + _lineBuffer->dataSize = _lineBuffer->endOfLineBufferData - + _lineBuffer->buffer; + + // + // Compress the data + // + + Compressor *compressor = _lineBuffer->compressor; + + if (compressor) + { + const char *compPtr; + + int compSize = compressor->compress (_lineBuffer->dataPtr, + _lineBuffer->dataSize, + _lineBuffer->minY, compPtr); + + if (compSize < _lineBuffer->dataSize) + { + _lineBuffer->dataSize = compSize; + _lineBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using the machine's + // native format, so we need to convert the lineBuffer + // to Xdr. + // + + convertToXdr (_ofd, _lineBuffer->buffer, _lineBuffer->minY, + _lineBuffer->maxY, _lineBuffer->dataSize); + } + } + + _lineBuffer->partiallyFull = false; + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what (); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + +} // namespace + + +OutputFile::OutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) + +{ + _data->_streamData=new OutputStreamMutex (); + _data->_deleteStream=true; + try + { + header.sanityCheck(); + _data->_streamData->os = new StdOFStream (fileName); + _data->multiPart=false; // only one header, not multipart + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = + _data->header.writeTo (*_data->_streamData->os); + _data->lineOffsetsPosition = + writeLineOffsets (*_data->_streamData->os,_data->lineOffsets); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + + +OutputFile::OutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (numThreads)) +{ + + _data->_streamData=new OutputStreamMutex (); + _data->_deleteStream=false; + try + { + header.sanityCheck(); + _data->_streamData->os = &os; + _data->multiPart=false; + initialize (header); + _data->_streamData->currentPosition = _data->_streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header); + _data->previewPosition = + _data->header.writeTo (*_data->_streamData->os); + _data->lineOffsetsPosition = + writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + if (_data && _data->_streamData) delete _data->_streamData; + if (_data) delete _data; + + throw; + } +} + +OutputFile::OutputFile(const OutputPartData* part) : _data(NULL) +{ + try + { + if (part->header.type() != SCANLINEIMAGE) + throw IEX_NAMESPACE::ArgExc("Can't build a OutputFile from a type-mismatched part."); + + _data = new Data (part->numThreads); + _data->_streamData = part->mutex; + _data->_deleteStream=false; + _data->multiPart=part->multipart; + + initialize (part->header); + _data->partNumber = part->partNumber; + _data->lineOffsetsPosition = part->chunkOffsetTablePosition; + _data->previewPosition = part->previewPosition; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data) delete _data; + + REPLACE_EXC (e, "Cannot initialize output part " + "\"" << part->partNumber << "\". " << e); + throw; + } + catch (...) + { + if (_data) delete _data; + + throw; + } +} + +void +OutputFile::initialize (const Header &header) +{ + _data->header = header; + + // "fix" the type if it happens to be set incorrectly + // (attribute is optional, but ensure it is correct if it exists) + if(_data->header.hasType()) + { + _data->header.setType(SCANLINEIMAGE); + } + + const Box2i &dataWindow = header.dataWindow(); + + _data->currentScanLine = (header.lineOrder() == INCREASING_Y)? + dataWindow.min.y: dataWindow.max.y; + + _data->missingScanLines = dataWindow.max.y - dataWindow.min.y + 1; + _data->lineOrder = header.lineOrder(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + size_t maxBytesPerLine = bytesPerLineTable (_data->header, + _data->bytesPerLine); + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + _data->lineBuffers[i] = + new LineBuffer (newCompressor (_data->header.compression(), + maxBytesPerLine, + _data->header)); + } + + LineBuffer *lineBuffer = _data->lineBuffers[0]; + _data->format = defaultFormat (lineBuffer->compressor); + _data->linesInBuffer = numLinesInBuffer (lineBuffer->compressor); + _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; + + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + _data->lineBuffers[i]->buffer.resizeErase(_data->lineBufferSize); + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + _data->linesInBuffer) / _data->linesInBuffer; + + _data->lineOffsets.resize (lineOffsetSize); + + + offsetInLineBufferTable (_data->bytesPerLine, + _data->linesInBuffer, + _data->offsetInLineBuffer); +} + + +OutputFile::~OutputFile () +{ + if (_data) + { + { + Lock lock(*_data->_streamData); + Int64 originalPosition = _data->_streamData->os->tellp(); + + if (_data->lineOffsetsPosition > 0) + { + try + { + _data->_streamData->os->seekp (_data->lineOffsetsPosition); + writeLineOffsets (*_data->_streamData->os, _data->lineOffsets); + + // + // Restore the original position. + // + _data->_streamData->os->seekp (originalPosition); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + if (_data->_deleteStream && _data->_streamData) + delete _data->_streamData->os; + + if (_data->partNumber == -1 && _data->_streamData) + delete _data->_streamData; + + delete _data; + } + +} + + +const char * +OutputFile::fileName () const +{ + return _data->_streamData->os->fileName(); +} + + +const Header & +OutputFile::header () const +{ + return _data->header; +} + + +void +OutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + { + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + } + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + { + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + } + + // + // Initialize slice table for writePixels(). + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (OutSliceInfo (i.channel().type, + 0, // base + 0, // xStride, + 0, // yStride, + i.channel().xSampling, + i.channel().ySampling, + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (OutSliceInfo (j.slice().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + j.slice().xSampling, + j.slice().ySampling, + false)); // zero + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +OutputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +void +OutputFile::writePixels (int numScanLines) +{ + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data source."); + + // + // Maintain two iterators: + // nextWriteBuffer: next linebuffer to be written to the file + // nextCompressBuffer: next linebuffer to compress + // + + int first = (_data->currentScanLine - _data->minY) / + _data->linesInBuffer; + + int nextWriteBuffer = first; + int nextCompressBuffer; + int stop; + int step; + int scanLineMin; + int scanLineMax; + + { + // + // Create a task group for all line buffer tasks. When the + // taskgroup goes out of scope, the destructor waits until + // all tasks are complete. + // + + TaskGroup taskGroup; + + // + // Determine the range of lineBuffers that intersect the scan + // line range. Then add the initial compression tasks to the + // thread pool. We always add in at least one task but the + // individual task might not do anything if numScanLines == 0. + // + + if (_data->lineOrder == INCREASING_Y) + { + int last = (_data->currentScanLine + (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMin = _data->currentScanLine; + scanLineMax = _data->currentScanLine + numScanLines - 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + last - first + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first + i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first + numTasks; + stop = last + 1; + step = 1; + } + else + { + int last = (_data->currentScanLine - (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMax = _data->currentScanLine; + scanLineMin = _data->currentScanLine - numScanLines + 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + first - last + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first - i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first - numTasks; + stop = last - 1; + step = -1; + } + + while (true) + { + if (_data->missingScanLines <= 0) + { + throw IEX_NAMESPACE::ArgExc ("Tried to write more scan lines " + "than specified by the data window."); + } + + // + // Wait until the next line buffer is ready to be written + // + + LineBuffer *writeBuffer = + _data->getLineBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + int numLines = writeBuffer->scanLineMax - + writeBuffer->scanLineMin + 1; + + _data->missingScanLines -= numLines; + + // + // If the line buffer is only partially full, then it is + // not complete and we cannot write it to disk yet. + // + + if (writeBuffer->partiallyFull) + { + _data->currentScanLine = _data->currentScanLine + + step * numLines; + writeBuffer->post(); + + return; + } + + // + // Write the line buffer + // + + writePixelData (_data->_streamData, _data, writeBuffer); + nextWriteBuffer += step; + + _data->currentScanLine = _data->currentScanLine + + step * numLines; + + #ifdef DEBUG + + assert (_data->currentScanLine == + ((_data->lineOrder == INCREASING_Y) ? + writeBuffer->scanLineMax + 1: + writeBuffer->scanLineMin - 1)); + + #endif + + // + // Release the lock on the line buffer + // + + writeBuffer->post(); + + // + // If this was the last line buffer in the scanline range + // + + if (nextWriteBuffer == stop) + break; + + // + // If there are no more line buffers to compress, + // then only continue to write out remaining lineBuffers + // + + if (nextCompressBuffer == stop) + continue; + + // + // Add nextCompressBuffer as a compression task + // + + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, nextCompressBuffer, + scanLineMin, scanLineMax)); + + // + // Update the next line buffer we need to compress + // + + nextCompressBuffer += step; + } + + // + // Finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to OutputFile::writePixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +OutputFile::currentScanLine () const +{ + Lock lock (*_data->_streamData); + return _data->currentScanLine; +} + + +void +OutputFile::copyPixels (InputFile &in) +{ + Lock lock (*_data->_streamData); + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + if (inHdr.find("tiles") != inHdr.end()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". " + "The input file is tiled, but the output file is " + "not. Try using TiledOutputFile::copyPixels " + "instead."); + + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". " + "The files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different channel lists."); + + // + // Verify that no pixel data have been written to this file yet. + // + + const Box2i &dataWindow = hdr.dataWindow(); + + if (_data->missingScanLines != dataWindow.max.y - dataWindow.min.y + 1) + THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "\"" << fileName() << "\" already contains " + "pixel data."); + + // + // Copy the pixel data. + // + + while (_data->missingScanLines > 0) + { + const char *pixelData; + int pixelDataSize; + + in.rawPixelData (_data->currentScanLine, pixelData, pixelDataSize); + + writePixelData (_data->_streamData, _data, lineBufferMinY (_data->currentScanLine, + _data->minY, + _data->linesInBuffer), + pixelData, pixelDataSize); + + _data->currentScanLine += (_data->lineOrder == INCREASING_Y)? + _data->linesInBuffer: -_data->linesInBuffer; + + _data->missingScanLines -= _data->linesInBuffer; + } +} + + +void +OutputFile::copyPixels( InputPart & in) +{ + copyPixels(*in.file); +} + + + +void +OutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_data->_streamData); + + if (_data->previewPosition <= 0) + THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _data->_streamData->os->tellp(); + + try + { + _data->_streamData->os->seekp (_data->previewPosition); + pia.writeValueTo (*_data->_streamData->os, _data->version); + _data->_streamData->os->seekp (savedPosition); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +OutputFile::breakScanLine (int y, int offset, int length, char c) +{ + Lock lock (*_data->_streamData); + + Int64 position = + _data->lineOffsets[(y - _data->minY) / _data->linesInBuffer]; + + if (!position) + THROW (IEX_NAMESPACE::ArgExc, "Cannot overwrite scan line " << y << ". " + "The scan line has not yet been stored in " + "file \"" << fileName() << "\"."); + + _data->_streamData->currentPosition = 0; + _data->_streamData->os->seekp (position + offset); + + for (int i = 0; i < length; ++i) + _data->_streamData->os->write (&c, 1); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfOutputFile.h b/IlmImf/ImfOutputFile.h new file mode 100644 index 0000000..00f9f80 --- /dev/null +++ b/IlmImf/ImfOutputFile.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_OUTPUT_FILE_H +#define INCLUDED_IMF_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class OutputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImfThreading.h" +#include "ImfGenericOutputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT OutputFile : public GenericOutputFile +{ + public: + + //----------------------------------------------------------- + // Constructor -- opens the file and writes the file header. + // The file header is also copied into the OutputFile object, + // and can later be accessed via the header() method. + // Destroying this OutputFile object automatically closes + // the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //----------------------------------------------------------- + + OutputFile (const char fileName[], const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------------------ + // Constructor -- attaches the new OutputFile object to a file + // that has already been opened, and writes the file header. + // The file header is also copied into the OutputFile object, + // and can later be accessed via the header() method. + // Destroying this OutputFile object does not automatically + // close the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //------------------------------------------------------------ + + OutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------- + // Destructor + // + // Destroying the OutputFile object before writing + // all scan lines within the data window results in + // an incomplete file. + //------------------------------------------------- + + virtual ~OutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the OutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writePixels() is + // called. The current frame buffer can be changed + // after each call to writePixels. + //------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------------- + // Write pixel data: + // + // writePixels(n) retrieves the next n scan lines worth of data from + // the current frame buffer, starting with the scan line indicated by + // currentScanLine(), and stores the data in the output file, and + // progressing in the direction indicated by header.lineOrder(). + // + // To produce a complete and correct file, exactly m scan lines must + // be written, where m is equal to + // header().dataWindow().max.y - header().dataWindow().min.y + 1. + //------------------------------------------------------------------- + + void writePixels (int numScanLines = 1); + + + //------------------------------------------------------------------ + // Access to the current scan line: + // + // currentScanLine() returns the y coordinate of the first scan line + // that will be read from the current frame buffer during the next + // call to writePixels(). + // + // If header.lineOrder() == INCREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().min.y. After writing each scan line, + // the current scan line is incremented by 1. + // + // If header.lineOrder() == DECREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().max.y. After writing each scan line, + // the current scan line is decremented by 1. + // + //------------------------------------------------------------------ + + int currentScanLine () const; + + + //-------------------------------------------------------------- + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder" and "channels" attributes must be the same. + //-------------------------------------------------------------- + + void copyPixels (InputFile &in); + + //------------------------------------------------------------- + // Shortcut to copy all pixels from an InputPart into this file + // - equivalent to copyPixel(InputFile &in) but for multipart files + //--------------------------------------------------------------- + + void copyPixels (InputPart &in); + + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few scan lines at a + // time, while the image is being generated. Since the preview + // image is an attribute in the file's header, it gets stored in + // the file as soon as the file is opened, but we may not know + // what the preview image should look like until we have written + // the last scan line of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //--------------------------------------------------------- + // Break a scan line -- for testing and debugging only: + // + // breakScanLine(y,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the pixel data block that + // contains scan line y. + // + // Warning: Calling this function usually results in a + // broken image file. The file or parts of it may not + // be readable, or the file may contain bad data. + // + //--------------------------------------------------------- + + void breakScanLine (int y, int offset, int length, char c); + + + struct Data; + + private: + + //------------------------------------------------------------ + // Constructor -- attaches the OutputStreamMutex to the + // given one from MultiPartOutputFile. Set the previewPosition + // and lineOffsetsPosition which have been acquired from + // the constructor of MultiPartOutputFile as well. + //------------------------------------------------------------ + OutputFile (const OutputPartData* part); + + OutputFile (const OutputFile &); // not implemented + OutputFile & operator = (const OutputFile &); // not implemented + + void initialize (const Header &header); + + Data * _data; + + + friend class MultiPartOutputFile; + +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif diff --git a/IlmImf/ImfOutputPart.cpp b/IlmImf/ImfOutputPart.cpp new file mode 100644 index 0000000..920b4d3 --- /dev/null +++ b/IlmImf/ImfOutputPart.cpp @@ -0,0 +1,105 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfOutputPart.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +OutputPart::OutputPart(MultiPartOutputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getOutputPart(partNumber); +} + +const char * +OutputPart::fileName () const +{ + return file->fileName(); +} + +const Header & +OutputPart::header () const +{ + return file->header(); +} + +void +OutputPart::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + +const FrameBuffer & +OutputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + +void +OutputPart::writePixels (int numScanLines) +{ + file->writePixels(numScanLines); +} + +int +OutputPart::currentScanLine () const +{ + return file->currentScanLine(); +} + +void +OutputPart::copyPixels (InputFile &in) +{ + file->copyPixels(in); +} + +void +OutputPart::copyPixels (InputPart &in) +{ + file->copyPixels(in); +} + +void +OutputPart::updatePreviewImage (const PreviewRgba newPixels[]) +{ + file->updatePreviewImage(newPixels); +} + +void +OutputPart::breakScanLine (int y, int offset, int length, char c) +{ + file->breakScanLine(y, offset, length, c); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfOutputPart.h b/IlmImf/ImfOutputPart.h new file mode 100644 index 0000000..41f3cf3 --- /dev/null +++ b/IlmImf/ImfOutputPart.h @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFOUTPUTPART_H_ +#define IMFOUTPUTPART_H_ + +#include "ImfMultiPartOutputFile.h" +#include "ImfOutputFile.h" +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +//--------------------------------------------------------------------- +// class OutputPart: +// +// Same interface as OutputFile. Please refer to OutputFile. +//--------------------------------------------------------------------- + +class IMF_EXPORT OutputPart +{ + public: + OutputPart(MultiPartOutputFile& multiPartFile, int partNumber); + + const char * fileName () const; + const Header & header () const; + void setFrameBuffer (const FrameBuffer &frameBuffer); + const FrameBuffer & frameBuffer () const; + void writePixels (int numScanLines = 1); + int currentScanLine () const; + void copyPixels (InputFile &in); + void copyPixels (InputPart &in); + + void updatePreviewImage (const PreviewRgba newPixels[]); + void breakScanLine (int y, int offset, int length, char c); + + private: + OutputFile* file; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFOUTPUTPART_H_ */ diff --git a/IlmImf/ImfOutputPartData.cpp b/IlmImf/ImfOutputPartData.cpp new file mode 100644 index 0000000..b517a47 --- /dev/null +++ b/IlmImf/ImfOutputPartData.cpp @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfOutputPartData.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +OutputPartData::OutputPartData(OutputStreamMutex* mutex, const Header &header, + int partNumber, int numThreads, bool multipart): + header(header), + numThreads(numThreads), + partNumber(partNumber), + multipart(multipart), + mutex(mutex) +{ +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfOutputPartData.h b/IlmImf/ImfOutputPartData.h new file mode 100644 index 0000000..ac8159a --- /dev/null +++ b/IlmImf/ImfOutputPartData.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFOUTPUTPARTDATA_H_ +#define IMFOUTPUTPARTDATA_H_ + +#include "ImfHeader.h" +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +struct IMF_EXPORT OutputPartData +{ + Header header; + Int64 chunkOffsetTablePosition; + Int64 previewPosition; + int numThreads; + int partNumber; + bool multipart; + OutputStreamMutex* mutex; + + OutputPartData(OutputStreamMutex* mutex, const Header &header, + int partNumber, int numThreads, bool multipart); + +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFOUTPUTPARTDATA_H_ */ diff --git a/IlmImf/ImfOutputStreamMutex.h b/IlmImf/ImfOutputStreamMutex.h new file mode 100644 index 0000000..bf5e1c3 --- /dev/null +++ b/IlmImf/ImfOutputStreamMutex.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFOUTPUTSTREAMMUTEX_H_ +#define IMFOUTPUTSTREAMMUTEX_H_ + +#include + +#include "ImfIO.h" +#include "IlmThreadMutex.h" +#include "ImfGenericOutputFile.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +using ILMTHREAD_NAMESPACE::Mutex; + +// +// Used to wrap OPENEXR_IMF_INTERNAL_NAMESPACE::OStream as a Mutex. +// +struct OutputStreamMutex : public Mutex +{ + OPENEXR_IMF_INTERNAL_NAMESPACE::OStream* os; + Int64 currentPosition; + + OutputStreamMutex() + { + os = 0; + currentPosition = 0; + } +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif /* IMFOUTPUTSTREAMMUTEX_H_ */ diff --git a/IlmImf/ImfPartHelper.h b/IlmImf/ImfPartHelper.h new file mode 100644 index 0000000..d55cc7b --- /dev/null +++ b/IlmImf/ImfPartHelper.h @@ -0,0 +1,262 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_PARTHELPER_H +#define INCLUDED_IMF_PARTHELPER_H + +//----------------------------------------------------------------------------- +// +// Functions to help split channels into separate parts: provide a list of +// channels, with desired views. call SplitChannels to assign a part to each +// layer, or correct the name of the channel. +// Also can enumerate the parts in a file and list which parts channels are in +// +// This is a good way to offer a 'create Multipart file' checkbox to the user in a +// write dialog box: Populate a list of MultiViewChannelName objects, +// call SplitChannels with whether single or multipart files are required. +// Then write the number of parts it specifies, using internal_name for the channel +// names in the ChannelList and FrameBuffer objects. There should be no need +// for different codepaths for single part and multipart files +// +// Similarly, on reading a file as a MultiPartInputFile, use GetChannelsInMultiPartFile to +// enumerate all channels in the file, using internal_name in FrameBuffer objects +// to read the channel +// +// +//----------------------------------------------------------------------------- + +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfMultiPartInputFile.h" +#include "ImfChannelList.h" +#include "ImfStringVectorAttribute.h" +#include "ImfStandardAttributes.h" +#include "ImfMultiView.h" + +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +struct MultiViewChannelName{ + +public: + std::string name; ///< name of channel + std::string view; ///< view for channel + + int part_number; ///< part number: updated by SplitChannels + std::string internal_name;///< name used in headers: in singlepart mode, may contain viewname + + virtual ~MultiViewChannelName() {} + + //return layer for this channel, or "" if no layer + std::string getLayer() const + { + std::size_t q=name.rfind('.'); + if( q==name.npos ) + { + return ""; + } + return name.substr(0,q); + + } + + std::string getSuffix() const + { + std::size_t q=name.rfind('.'); + if( q==name.npos ) + { + return name; + } + return name.substr(q+1); + + } + +}; + + + +// +///\brief assigns individual channels to different parts based on their layer and view name +/// input is an array, list, vector etc of MultiViewChannelName objects +/// on entry, each MultiViewChannelName name/view must be set (view can be empty if not multiview) +/// +/// if singlepart set, then on exit part_number will be zero, and internal_name will have view name inserted +/// otherwise, each channel will be assigned to a different part based on its layer name and view name +/// +/// @param begin pointer to first MultiViewChannelName item +/// @param end pointer to end of MultiViewChannelName item array +/// @return total number of parts required +// + +template int +SplitChannels(const T & begin,const T & end,bool multipart=true,const std::string & heroView="") +{ + if(!multipart) + { + for(T i=begin;i!=end;i++) + { + i->part_number=0; + + //does this have a view name set? + if(i->view=="") + { + i->internal_name=i->name; + }else{ + + std::string lname = i->getLayer(); + + // no layer, only non-hero views get view name in layer name + + + if(lname=="") + { + if(i->view==heroView) + { + i->internal_name = i->name; + }else{ + i->internal_name = i->view+"."+i->name; + } + }else{ + i->internal_name = lname+"."+i->view+"."+i->getSuffix(); + } + } + } + // single part created + return 1; + }else{ + // step 1: extract individual layers and parts + // for each layer, enumerate which views are active + + std::map< std::string , std::set< std::string > > viewsInLayers; + for(T i=begin;i!=end;i++) + { + viewsInLayers[i->getLayer()].insert(i->view); + } + + // step 2: assign a part number to each layer/view + + std::map< std::pair , int > layerToPart; + + int partCount=0; + + for(std::map< std::string , std::set< std::string > >::const_iterator layer=viewsInLayers.begin(); + layer!=viewsInLayers.end();layer++) + { + // if this layer has a heroView, insert that first + bool layer_has_hero = layer->second.find(heroView)!=layer->second.end(); + if( layer_has_hero ) + { + layerToPart[ std::make_pair(layer->first,heroView) ] = partCount++; + } + + + // insert other layers which aren't the hero view + for(std::set< std::string >::const_iterator view=layer->second.begin(); + view!=layer->second.end();view++) + { + if(*view!=heroView) + { + layerToPart[ std::make_pair(layer->first,*view) ] = partCount++; + } + } + + } + + // step 3: update part number of each provided channel + + for( T i=begin;i!=end;i++) + { + i->internal_name=i->name; + i->part_number = layerToPart[ std::make_pair(i->getLayer(),i->view) ]; + } + + + // return number of parts created + return partCount; + } +} + +// +// populate the chans vector with a list of channels in the file +// and their corresponding part number +// +template void +GetChannelsInMultiPartFile(const MultiPartInputFile & file,T & chans) +{ + bool has_multiview=false; + StringVector mview; + if(file.parts()==1) + { + if(hasMultiView(file.header(0))) + { + mview=multiView(file.header(0)); + has_multiview=true; + } + } + + for(int p=0;p +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using std::string; + +bool isImage(const string& name) +{ + return (name == SCANLINEIMAGE || name == TILEDIMAGE); +} + +bool isTiled(const string& name) +{ + return (name == TILEDIMAGE || name == DEEPTILE); +} + +bool isDeepData(const string& name) +{ + return (name == DEEPTILE || name == DEEPSCANLINE); +} + +bool isSupportedType(const string& name) +{ + return (name == SCANLINEIMAGE || name == TILEDIMAGE || + name == DEEPSCANLINE || name == DEEPTILE); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfPartType.h b/IlmImf/ImfPartType.h new file mode 100644 index 0000000..423bce0 --- /dev/null +++ b/IlmImf/ImfPartType.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFPARTTYPE_H_ +#define IMFPARTTYPE_H_ + +#include +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +const std::string SCANLINEIMAGE = "scanlineimage"; +const std::string TILEDIMAGE = "tiledimage"; +const std::string DEEPSCANLINE = "deepscanline"; +const std::string DEEPTILE = "deeptile"; + +IMF_EXPORT bool isImage(const std::string& name); + +IMF_EXPORT bool isTiled(const std::string& name); + +IMF_EXPORT bool isDeepData(const std::string& name); + +IMF_EXPORT bool isSupportedType(const std::string& name); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif /* IMFPARTTYPE_H_ */ diff --git a/IlmImf/ImfPixelType.h b/IlmImf/ImfPixelType.h new file mode 100644 index 0000000..4b8005e --- /dev/null +++ b/IlmImf/ImfPixelType.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_PIXEL_TYPE_H +#define INCLUDED_IMF_PIXEL_TYPE_H + +//----------------------------------------------------------------------------- +// +// enum PixelType +// +//----------------------------------------------------------------------------- + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +enum PixelType +{ + UINT = 0, // unsigned int (32 bit) + HALF = 1, // half (16 bit floating point) + FLOAT = 2, // float (32 bit floating point) + + NUM_PIXELTYPES // number of different pixel types +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfPizCompressor.cpp b/IlmImf/ImfPizCompressor.cpp new file mode 100644 index 0000000..46c6fba --- /dev/null +++ b/IlmImf/ImfPizCompressor.cpp @@ -0,0 +1,667 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PizCompressor +// +//----------------------------------------------------------------------------- + +#include "ImfPizCompressor.h" +#include "ImfHeader.h" +#include "ImfChannelList.h" +#include "ImfHuf.h" +#include "ImfWav.h" +#include "ImfMisc.h" +#include "ImfCheckedArithmetic.h" +#include +#include +#include +#include "ImfIO.h" +#include "ImfXdr.h" +#include "ImfAutoArray.h" +#include +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using IEX_NAMESPACE::InputExc; + +namespace { + +// +// Functions to compress the range of values in the pixel data +// + +const int USHORT_RANGE = (1 << 16); +const int BITMAP_SIZE = (USHORT_RANGE >> 3); + +void +bitmapFromData (const unsigned short data[/*nData*/], + int nData, + unsigned char bitmap[BITMAP_SIZE], + unsigned short &minNonZero, + unsigned short &maxNonZero) +{ + for (int i = 0; i < BITMAP_SIZE; ++i) + bitmap[i] = 0; + + for (int i = 0; i < nData; ++i) + bitmap[data[i] >> 3] |= (1 << (data[i] & 7)); + + bitmap[0] &= ~1; // zero is not explicitly stored in + // the bitmap; we assume that the + // data always contain zeroes + minNonZero = BITMAP_SIZE - 1; + maxNonZero = 0; + + for (int i = 0; i < BITMAP_SIZE; ++i) + { + if (bitmap[i]) + { + if (minNonZero > i) + minNonZero = i; + if (maxNonZero < i) + maxNonZero = i; + } + } +} + + +unsigned short +forwardLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], + unsigned short lut[USHORT_RANGE]) +{ + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) + { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) + lut[i] = k++; + else + lut[i] = 0; + } + + return k - 1; // maximum value stored in lut[], +} // i.e. number of ones in bitmap minus 1 + + +unsigned short +reverseLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], + unsigned short lut[USHORT_RANGE]) +{ + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) + { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) + lut[k++] = i; + } + + int n = k - 1; + + while (k < USHORT_RANGE) + lut[k++] = 0; + + return n; // maximum k where lut[k] is non-zero, +} // i.e. number of ones in bitmap minus 1 + + +void +applyLut (const unsigned short lut[USHORT_RANGE], + unsigned short data[/*nData*/], + int nData) +{ + for (int i = 0; i < nData; ++i) + data[i] = lut[data[i]]; +} + + +} // namespace + + +struct PizCompressor::ChannelData +{ + unsigned short * start; + unsigned short * end; + int nx; + int ny; + int ys; + int size; +}; + + +PizCompressor::PizCompressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _format (XDR), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _numChans (0), + _channels (hdr.channels()), + _channelData (0) +{ + size_t tmpBufferSize = + uiMult (maxScanLineSize, numScanLines) / 2; + + size_t outBufferSize = + uiAdd (uiMult (maxScanLineSize, numScanLines), + size_t (65536 + 8192)); + + _tmpBuffer = new unsigned short + [checkArraySize (tmpBufferSize, sizeof (unsigned short))]; + + _outBuffer = new char [outBufferSize]; + + const ChannelList &channels = header().channels(); + bool onlyHalfChannels = true; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + _numChans++; + + assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); + + if (c.channel().type != HALF) + onlyHalfChannels = false; + } + + _channelData = new ChannelData[_numChans]; + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; + + // + // We can support uncompressed data in the machine's native format + // if all image channels are of type HALF, and if the Xdr and the + // native represenations of a half have the same size. + // + + if (onlyHalfChannels && (sizeof (half) == pixelTypeSize (HALF))) + _format = NATIVE; +} + + +PizCompressor::~PizCompressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; + delete [] _channelData; +} + + +int +PizCompressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +PizCompressor::format () const +{ + return _format; +} + + +int +PizCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +PizCompressor::compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +PizCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +PizCompressor::uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +PizCompressor::compress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + // + // This is the compress function which is used by both the tiled and + // scanline compression routines. + // + + // + // Special case �- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Rearrange the pixel data so that the wavelet + // and Huffman encoders can process them easily. + // + // The wavelet and Huffman encoders both handle only + // 16-bit data, so 32-bit data must be split into smaller + // pieces. We treat each 32-bit channel (UINT, FLOAT) as + // two interleaved 16-bit channels. + // + + int minX = range.min.x; + int maxX = range.max.x; + int minY = range.min.y; + int maxY = range.max.y; + + if (maxY > _maxY) + maxY = _maxY; + + if (maxX > _maxX) + maxX = _maxX; + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + cd.ys = c.channel().ySampling; + + cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + if (_format == XDR) + { + // + // Machine-independent (Xdr) data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + for (int x = cd.nx * cd.size; x > 0; --x) + { + Xdr::read (inPtr, *cd.end); + ++cd.end; + } + } + } + } + else + { + // + // Native, machine-dependent data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + // + // Compress the range of the pixel data + // + + AutoArray bitmap; + unsigned short minNonZero; + unsigned short maxNonZero; + + bitmapFromData (_tmpBuffer, + tmpBufferEnd - _tmpBuffer, + bitmap, + minNonZero, maxNonZero); + + AutoArray lut; + unsigned short maxValue = forwardLutFromBitmap (bitmap, lut); + applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Store range compression info in _outBuffer + // + + char *buf = _outBuffer; + + Xdr::write (buf, minNonZero); + Xdr::write (buf, maxNonZero); + + if (minNonZero <= maxNonZero) + { + Xdr::write (buf, (char *) &bitmap[0] + minNonZero, + maxNonZero - minNonZero + 1); + } + + // + // Apply wavelet encoding + // + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + for (int j = 0; j < cd.size; ++j) + { + wav2Encode (cd.start + j, + cd.nx, cd.size, + cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Apply Huffman encoding; append the result to _outBuffer + // + + char *lengthPtr = buf; + Xdr::write (buf, int(0)); + + int length = hufCompress (_tmpBuffer, tmpBufferEnd - _tmpBuffer, buf); + Xdr::write (lengthPtr, length); + + outPtr = _outBuffer; + return buf - _outBuffer + length; +} + + +int +PizCompressor::uncompress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr) +{ + // + // This is the cunompress function which is used by both the tiled and + // scanline decompression routines. + // + + // + // Special case - empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Determine the layout of the compressed pixel data + // + + int minX = range.min.x; + int maxX = range.max.x; + int minY = range.min.y; + int maxY = range.max.y; + + if (maxY > _maxY) + maxY = _maxY; + + if (maxX > _maxX) + maxX = _maxX; + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + cd.ys = c.channel().ySampling; + + cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + // + // Read range compression data + // + + unsigned short minNonZero; + unsigned short maxNonZero; + + AutoArray bitmap; + memset (bitmap, 0, sizeof (unsigned char) * BITMAP_SIZE); + + Xdr::read (inPtr, minNonZero); + Xdr::read (inPtr, maxNonZero); + + if (maxNonZero >= BITMAP_SIZE) + { + throw InputExc ("Error in header for PIZ-compressed data " + "(invalid bitmap size)."); + } + + if (minNonZero <= maxNonZero) + { + Xdr::read (inPtr, (char *) &bitmap[0] + minNonZero, + maxNonZero - minNonZero + 1); + } + + AutoArray lut; + unsigned short maxValue = reverseLutFromBitmap (bitmap, lut); + + // + // Huffman decoding + // + + int length; + Xdr::read (inPtr, length); + + hufUncompress (inPtr, length, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Wavelet decoding + // + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + for (int j = 0; j < cd.size; ++j) + { + wav2Decode (cd.start + j, + cd.nx, cd.size, + cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Expand the pixel data to their original range + // + + applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Rearrange the pixel data into the format expected by the caller. + // + + char *outEnd = _outBuffer; + + if (_format == XDR) + { + // + // Machine-independent (Xdr) data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + for (int x = cd.nx * cd.size; x > 0; --x) + { + Xdr::write (outEnd, *cd.end); + ++cd.end; + } + } + } + } + else + { + // + // Native, machine-dependent data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + outPtr = _outBuffer; + return outEnd - _outBuffer; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfPizCompressor.h b/IlmImf/ImfPizCompressor.h new file mode 100644 index 0000000..fb3086b --- /dev/null +++ b/IlmImf/ImfPizCompressor.h @@ -0,0 +1,117 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_PIZ_COMPRESSOR_H +#define INCLUDED_IMF_PIZ_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class PizCompressor -- uses Wavelet and Huffman encoding. +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT PizCompressor: public Compressor +{ + public: + + PizCompressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~PizCompressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + private: + + struct ChannelData; + + int compress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + Format _format; + int _numScanLines; + unsigned short * _tmpBuffer; + char * _outBuffer; + int _numChans; + const ChannelList & _channels; + ChannelData * _channelData; + int _minX; + int _maxX; + int _maxY; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfPreviewImage.cpp b/IlmImf/ImfPreviewImage.cpp new file mode 100644 index 0000000..8027d0f --- /dev/null +++ b/IlmImf/ImfPreviewImage.cpp @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PreviewImage +// +//----------------------------------------------------------------------------- + +#include "ImfPreviewImage.h" +#include "ImfCheckedArithmetic.h" +#include "Iex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +PreviewImage::PreviewImage (unsigned int width, + unsigned int height, + const PreviewRgba pixels[]) +{ + _width = width; + _height = height; + _pixels = new PreviewRgba + [checkArraySize (uiMult (_width, _height), sizeof (PreviewRgba))]; + + if (pixels) + { + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = pixels[i]; + } + else + { + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = PreviewRgba(); + } +} + + +PreviewImage::PreviewImage (const PreviewImage &other): + _width (other._width), + _height (other._height), + _pixels (new PreviewRgba [other._width * other._height]) +{ + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = other._pixels[i]; +} + + +PreviewImage::~PreviewImage () +{ + delete [] _pixels; +} + + +PreviewImage & +PreviewImage::operator = (const PreviewImage &other) +{ + delete [] _pixels; + + _width = other._width; + _height = other._height; + _pixels = new PreviewRgba [other._width * other._height]; + + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = other._pixels[i]; + + return *this; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfPreviewImage.h b/IlmImf/ImfPreviewImage.h new file mode 100644 index 0000000..dcd2ebe --- /dev/null +++ b/IlmImf/ImfPreviewImage.h @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_PREVIEW_IMAGE_H +#define INCLUDED_IMF_PREVIEW_IMAGE_H + +#include "ImfNamespace.h" +#include "ImfExport.h" + +//----------------------------------------------------------------------------- +// +// class PreviewImage -- a usually small, low-dynamic range image, +// that is intended to be stored in an image file's header. +// +// struct PreviewRgba -- holds the value of a PreviewImage pixel. +// +//----------------------------------------------------------------------------- + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct IMF_EXPORT PreviewRgba +{ + unsigned char r; // Red, green and blue components of + unsigned char g; // the pixel's color; intensity is + unsigned char b; // proportional to pow (x/255, 2.2), + // where x is r, g, or b. + + unsigned char a; // The pixel's alpha; 0 == transparent, + // 255 == opaque. + + PreviewRgba (unsigned char r = 0, + unsigned char g = 0, + unsigned char b = 0, + unsigned char a = 255) + : r(r), g(g), b(b), a(a) {} +}; + + +class IMF_EXPORT PreviewImage +{ + public: + + //-------------------------------------------------------------------- + // Constructor: + // + // PreviewImage(w,h,p) constructs a preview image with w by h pixels + // whose initial values are specified in pixel array p. The x and y + // coordinates of the pixels in p go from 0 to w-1, and from 0 to h-1. + // The pixel with coordinates (x, y) is at address p + y*w + x. + // Pixel (0, 0) is in the upper left corner of the preview image. + // If p is zero, the pixels in the preview image are initialized with + // (r = 0, b = 0, g = 0, a = 255). + // + //-------------------------------------------------------------------- + + PreviewImage (unsigned int width = 0, + unsigned int height = 0, + const PreviewRgba pixels[] = 0); + + //----------------------------------------------------- + // Copy constructor, destructor and assignment operator + //----------------------------------------------------- + + PreviewImage (const PreviewImage &other); + ~PreviewImage (); + + PreviewImage & operator = (const PreviewImage &other); + + + //----------------------------------------------- + // Access to width, height and to the pixel array + //----------------------------------------------- + + unsigned int width () const {return _width;} + unsigned int height () const {return _height;} + + PreviewRgba * pixels () {return _pixels;} + const PreviewRgba * pixels () const {return _pixels;} + + + //---------------------------- + // Access to individual pixels + //---------------------------- + + PreviewRgba & pixel (unsigned int x, unsigned int y) + {return _pixels[y * _width + x];} + + const PreviewRgba & pixel (unsigned int x, unsigned int y) const + {return _pixels[y * _width + x];} + + private: + + unsigned int _width; + unsigned int _height; + PreviewRgba * _pixels; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfPreviewImageAttribute.cpp b/IlmImf/ImfPreviewImageAttribute.cpp new file mode 100644 index 0000000..8729f88 --- /dev/null +++ b/IlmImf/ImfPreviewImageAttribute.cpp @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PreviewImageAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +PreviewImageAttribute::staticTypeName () +{ + return "preview"; +} + + +template <> +void +PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.width()); + Xdr::write (os, _value.height()); + + int numPixels = _value.width() * _value.height(); + const PreviewRgba *pixels = _value.pixels(); + + for (int i = 0; i < numPixels; ++i) + { + Xdr::write (os, pixels[i].r); + Xdr::write (os, pixels[i].g); + Xdr::write (os, pixels[i].b); + Xdr::write (os, pixels[i].a); + } +} + + +template <> +void +PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + int width, height; + + Xdr::read (is, width); + Xdr::read (is, height); + + PreviewImage p (width, height); + + int numPixels = p.width() * p.height(); + PreviewRgba *pixels = p.pixels(); + + for (int i = 0; i < numPixels; ++i) + { + Xdr::read (is, pixels[i].r); + Xdr::read (is, pixels[i].g); + Xdr::read (is, pixels[i].b); + Xdr::read (is, pixels[i].a); + } + + _value = p; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfPreviewImageAttribute.h b/IlmImf/ImfPreviewImageAttribute.h new file mode 100644 index 0000000..160e409 --- /dev/null +++ b/IlmImf/ImfPreviewImageAttribute.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H +#define INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class PreviewImageAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfPreviewImage.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute PreviewImageAttribute; + +template <> +IMF_EXPORT +const char *PreviewImageAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void PreviewImageAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void PreviewImageAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfPxr24Compressor.cpp b/IlmImf/ImfPxr24Compressor.cpp new file mode 100644 index 0000000..6489576 --- /dev/null +++ b/IlmImf/ImfPxr24Compressor.cpp @@ -0,0 +1,553 @@ +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Pixar Animation Studios +// +// 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 Pixar Animation Studios 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. +// +///////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Pxr24Compressor +// +// This compressor is based on source code that was contributed to +// OpenEXR by Pixar Animation Studios. The compression method was +// developed by Loren Carpenter. +// +// The compressor preprocesses the pixel data to reduce entropy, +// and then calls zlib. +// +// Compression of HALF and UINT channels is lossless, but compressing +// FLOAT channels is lossy: 32-bit floating-point numbers are converted +// to 24 bits by rounding the significand to 15 bits. +// +// When the compressor is invoked, the caller has already arranged +// the pixel data so that the values for each channel appear in a +// contiguous block of memory. The compressor converts the pixel +// values to unsigned integers: For UINT, this is a no-op. HALF +// values are simply re-interpreted as 16-bit integers. FLOAT +// values are converted to 24 bits, and the resulting bit patterns +// are interpreted as integers. The compressor then replaces each +// value with the difference between the value and its left neighbor. +// This turns flat fields in the image into zeroes, and ramps into +// strings of similar values. Next, each difference is split into +// 2, 3 or 4 bytes, and the bytes are transposed so that all the +// most significant bytes end up in a contiguous block, followed +// by the second most significant bytes, and so on. The resulting +// string of bytes is compressed with zlib. +// +//----------------------------------------------------------------------------- + +#include "ImfPxr24Compressor.h" +#include "ImfHeader.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfCheckedArithmetic.h" +#include "ImfNamespace.h" + +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace IMATH_NAMESPACE; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +// +// Conversion from 32-bit to 24-bit floating-point numbers. +// Conversion back to 32 bits is simply an 8-bit shift to the left. +// + +inline unsigned int +floatToFloat24 (float f) +{ + union + { + float f; + unsigned int i; + } u; + + u.f = f; + + // + // Disassemble the 32-bit floating point number, f, + // into sign, s, exponent, e, and significand, m. + // + + unsigned int s = u.i & 0x80000000; + unsigned int e = u.i & 0x7f800000; + unsigned int m = u.i & 0x007fffff; + unsigned int i; + + if (e == 0x7f800000) + { + if (m) + { + // + // F is a NAN; we preserve the sign bit and + // the 15 leftmost bits of the significand, + // with one exception: If the 15 leftmost + // bits are all zero, the NAN would turn + // into an infinity, so we have to set at + // least one bit in the significand. + // + + m >>= 8; + i = (e >> 8) | m | (m == 0); + } + else + { + // + // F is an infinity. + // + + i = e >> 8; + } + } + else + { + // + // F is finite, round the significand to 15 bits. + // + + i = ((e | m) + (m & 0x00000080)) >> 8; + + if (i >= 0x7f8000) + { + // + // F was close to FLT_MAX, and the significand was + // rounded up, resulting in an exponent overflow. + // Avoid the overflow by truncating the significand + // instead of rounding it. + // + + i = (e | m) >> 8; + } + } + + return (s >> 8) | i; +} + + +void +notEnoughData () +{ + throw IEX_NAMESPACE::InputExc ("Error decompressing data " + "(input data are shorter than expected)."); +} + + +void +tooMuchData () +{ + throw IEX_NAMESPACE::InputExc ("Error decompressing data " + "(input data are longer than expected)."); +} + +} // namespace + + +Pxr24Compressor::Pxr24Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _channels (hdr.channels()) +{ + size_t maxInBytes = + uiMult (maxScanLineSize, numScanLines); + + size_t maxOutBytes = + uiAdd (uiAdd (maxInBytes, + size_t (ceil (maxInBytes * 0.01))), + size_t (100)); + + _tmpBuffer = new unsigned char [maxInBytes]; + _outBuffer = new char [maxOutBytes]; + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; +} + + +Pxr24Compressor::~Pxr24Compressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; +} + + +int +Pxr24Compressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +Pxr24Compressor::format () const +{ + return NATIVE; +} + + +int +Pxr24Compressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + _numScanLines - 1)), + outPtr); +} + + +int +Pxr24Compressor::compressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +Pxr24Compressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + _numScanLines - 1)), + outPtr); +} + + +int +Pxr24Compressor::uncompressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +Pxr24Compressor::compress (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned char *tmpBufferEnd = _tmpBuffer; + + for (int y = minY; y <= maxY; ++y) + { + for (ChannelList::ConstIterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + const Channel &c = i.channel(); + + if (modp (y, c.ySampling) != 0) + continue; + + int n = numSamples (c.xSampling, minX, maxX); + + unsigned char *ptr[4]; + unsigned int previousPixel = 0; + + switch (c.type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + ptr[3] = ptr[2] + n; + tmpBufferEnd = ptr[3] + n; + + for (int j = 0; j < n; ++j) + { + unsigned int pixel; + char *pPtr = (char *) &pixel; + + for (size_t k = 0; k < sizeof (pixel); ++k) + *pPtr++ = *inPtr++; + + unsigned int diff = pixel - previousPixel; + previousPixel = pixel; + + *(ptr[0]++) = diff >> 24; + *(ptr[1]++) = diff >> 16; + *(ptr[2]++) = diff >> 8; + *(ptr[3]++) = diff; + } + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + tmpBufferEnd = ptr[1] + n; + + for (int j = 0; j < n; ++j) + { + half pixel; + + pixel = *(const half *) inPtr; + inPtr += sizeof (half); + + unsigned int diff = pixel.bits() - previousPixel; + previousPixel = pixel.bits(); + + *(ptr[0]++) = diff >> 8; + *(ptr[1]++) = diff; + } + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + tmpBufferEnd = ptr[2] + n; + + for (int j = 0; j < n; ++j) + { + float pixel; + char *pPtr = (char *) &pixel; + + for (size_t k = 0; k < sizeof (pixel); ++k) + *pPtr++ = *inPtr++; + + unsigned int pixel24 = floatToFloat24 (pixel); + unsigned int diff = pixel24 - previousPixel; + previousPixel = pixel24; + + *(ptr[0]++) = diff >> 16; + *(ptr[1]++) = diff >> 8; + *(ptr[2]++) = diff; + } + + break; + + default: + + assert (false); + } + } + } + + uLongf outSize = int (ceil ((tmpBufferEnd - _tmpBuffer) * 1.01)) + 100; + + if (Z_OK != ::compress ((Bytef *) _outBuffer, + &outSize, + (const Bytef *) _tmpBuffer, + tmpBufferEnd - _tmpBuffer)) + { + throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed."); + } + + outPtr = _outBuffer; + return outSize; +} + + +int +Pxr24Compressor::uncompress (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + uLongf tmpSize = _maxScanLineSize * _numScanLines; + + if (Z_OK != ::uncompress ((Bytef *)_tmpBuffer, + &tmpSize, + (const Bytef *) inPtr, + inSize)) + { + throw IEX_NAMESPACE::InputExc ("Data decompression (zlib) failed."); + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + const unsigned char *tmpBufferEnd = _tmpBuffer; + char *writePtr = _outBuffer; + + for (int y = minY; y <= maxY; ++y) + { + for (ChannelList::ConstIterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + const Channel &c = i.channel(); + + if (modp (y, c.ySampling) != 0) + continue; + + int n = numSamples (c.xSampling, minX, maxX); + + const unsigned char *ptr[4]; + unsigned int pixel = 0; + + switch (c.type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + ptr[3] = ptr[2] + n; + tmpBufferEnd = ptr[3] + n; + + if ( (uLongf)(tmpBufferEnd - _tmpBuffer) > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 24) | + (*(ptr[1]++) << 16) | + (*(ptr[2]++) << 8) | + *(ptr[3]++); + + pixel += diff; + + char *pPtr = (char *) &pixel; + + for (size_t k = 0; k < sizeof (pixel); ++k) + *writePtr++ = *pPtr++; + } + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + tmpBufferEnd = ptr[1] + n; + + if ( (uLongf)(tmpBufferEnd - _tmpBuffer) > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 8) | + *(ptr[1]++); + + pixel += diff; + + half * hPtr = (half *) writePtr; + hPtr->setBits ((unsigned short) pixel); + writePtr += sizeof (half); + } + + break; + + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + tmpBufferEnd = ptr[2] + n; + + if ( (uLongf) (tmpBufferEnd - _tmpBuffer) > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 24) | + (*(ptr[1]++) << 16) | + (*(ptr[2]++) << 8); + pixel += diff; + + char *pPtr = (char *) &pixel; + + for (size_t k = 0; k < sizeof (pixel); ++k) + *writePtr++ = *pPtr++; + } + + break; + + default: + + assert (false); + } + } + } + + if ((uLongf) (tmpBufferEnd - _tmpBuffer) < tmpSize) + tooMuchData(); + + outPtr = _outBuffer; + return writePtr - _outBuffer; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfPxr24Compressor.h b/IlmImf/ImfPxr24Compressor.h new file mode 100644 index 0000000..026e926 --- /dev/null +++ b/IlmImf/ImfPxr24Compressor.h @@ -0,0 +1,109 @@ +#ifndef INCLUDED_IMF_PXR24_COMPRESSOR_H +#define INCLUDED_IMF_PXR24_COMPRESSOR_H + +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Pixar Animation Studios +// +// 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 Pixar Animation Studios 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. +// +///////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Pxr24Compressor -- Loren Carpenter's 24-bit float compressor +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfNamespace.h" +#include "ImfExport.h" +#include "ImfForward.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT Pxr24Compressor: public Compressor +{ + public: + + Pxr24Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~Pxr24Compressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + private: + + int compress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + IMATH_NAMESPACE::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + int _numScanLines; + unsigned char * _tmpBuffer; + char * _outBuffer; + const ChannelList & _channels; + int _minX; + int _maxX; + int _maxY; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfRational.cpp b/IlmImf/ImfRational.cpp new file mode 100644 index 0000000..fda7fc9 --- /dev/null +++ b/IlmImf/ImfRational.cpp @@ -0,0 +1,127 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Rational numbers +// +// The double-to-Rational conversion code below +// was contributed to OpenEXR by Greg Ward. +// +//----------------------------------------------------------------------------- + +#include +#include + +using namespace std; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +double +frac (double x, double e) +{ + return x - floor (x + e); +} + + +double +square (double x) +{ + return x * x; +} + + +double +denom (double x, double e) +{ + if (e > frac (x, e)) + { + return 1; + } + else + { + double r = frac (1 / x, e); + + if (e > r) + { + return floor (1 / x + e); + } + else + { + return denom (frac (1 / r, e), e / square (x * r)) + + floor (1 / x + e) * denom (frac (1 / x, e), e / square (x)); + } + } +} + +} // namespace + + +Rational::Rational (double x) +{ + int sign; + + if (x >= 0) + { + sign = 1; // positive + } + else if (x < 0) + { + sign = -1; // negative + x = -x; + } + else + { + n = 0; // NaN + d = 0; + return; + } + + if (x >= (1U << 31) - 0.5) + { + n = sign; // infinity + d = 0; + return; + } + + double e = (x < 1? 1: x) / (1U << 30); + d = (unsigned int) denom (x, e); + n = sign * (int) floor (x * d + 0.5); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRational.h b/IlmImf/ImfRational.h new file mode 100644 index 0000000..ba62b6b --- /dev/null +++ b/IlmImf/ImfRational.h @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_RATIONAL_H +#define INCLUDED_IMF_RATIONAL_H + +#include "ImfExport.h" +#include "ImfNamespace.h" + +//----------------------------------------------------------------------------- +// +// Rational numbers +// +// A rational number is represented as pair of integers, n and d. +// The value of of the rational number is +// +// n/d for d > 0 +// positive infinity for n > 0, d == 0 +// negative infinity for n < 0, d == 0 +// not a number (NaN) for n == 0, d == 0 +// +//----------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT Rational +{ + public: + + int n; // numerator + unsigned int d; // denominator + + + //---------------------------------------- + // Default constructor, sets value to zero + //---------------------------------------- + + Rational (): n (0), d (1) {} + + + //------------------------------------- + // Constructor, explicitly sets n and d + //------------------------------------- + + Rational (int n, int d): n (n), d (d) {} + + + //---------------------------- + // Constructor, approximates x + //---------------------------- + + explicit Rational (double x); + + + //--------------------------------- + // Approximate conversion to double + //--------------------------------- + + operator double () const {return double (n) / double (d);} +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfRationalAttribute.cpp b/IlmImf/ImfRationalAttribute.cpp new file mode 100644 index 0000000..a416468 --- /dev/null +++ b/IlmImf/ImfRationalAttribute.cpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class RationalAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +RationalAttribute::staticTypeName () +{ + return "rational"; +} + + +template <> +void +RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.n); + Xdr::write (os, _value.d); +} + + +template <> +void +RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.n); + Xdr::read (is, _value.d); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRationalAttribute.h b/IlmImf/ImfRationalAttribute.h new file mode 100644 index 0000000..988fe01 --- /dev/null +++ b/IlmImf/ImfRationalAttribute.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_RATIONAL_ATTRIBUTE_H +#define INCLUDED_IMF_RATIONAL_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class RationalAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfRational.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute RationalAttribute; + +template <> +IMF_EXPORT +const char *RationalAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void RationalAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void RationalAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfRgba.h b/IlmImf/ImfRgba.h new file mode 100644 index 0000000..dccba9f --- /dev/null +++ b/IlmImf/ImfRgba.h @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_RGBA_H +#define INCLUDED_IMF_RGBA_H + +//----------------------------------------------------------------------------- +// +// class Rgba +// +//----------------------------------------------------------------------------- + +#include "half.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// RGBA pixel +// + +struct Rgba +{ + half r; + half g; + half b; + half a; + + Rgba () {} + Rgba (half r, half g, half b, half a = 1.f): r (r), g (g), b (b), a (a) {} + + Rgba & operator = (const Rgba &other) + { + r = other.r; + g = other.g; + b = other.b; + a = other.a; + + return *this; + } +}; + + +// +// Channels in an RGBA file +// + +enum RgbaChannels +{ + WRITE_R = 0x01, // Red + WRITE_G = 0x02, // Green + WRITE_B = 0x04, // Blue + WRITE_A = 0x08, // Alpha + + WRITE_Y = 0x10, // Luminance, for black-and-white images, + // or in combination with chroma + + WRITE_C = 0x20, // Chroma (two subsampled channels, RY and BY, + // supported only for scanline-based files) + + WRITE_RGB = 0x07, // Red, green, blue + WRITE_RGBA = 0x0f, // Red, green, blue, alpha + + WRITE_YC = 0x30, // Luminance, chroma + WRITE_YA = 0x18, // Luminance, alpha + WRITE_YCA = 0x38 // Luminance, chroma, alpha +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfRgbaFile.cpp b/IlmImf/ImfRgbaFile.cpp new file mode 100644 index 0000000..c2b604a --- /dev/null +++ b/IlmImf/ImfRgbaFile.cpp @@ -0,0 +1,1405 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class RgbaOutputFile +// class RgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace RgbaYca; +using namespace ILMTHREAD_NAMESPACE; + +namespace { + +void +insertChannels (Header &header, RgbaChannels rgbaChannels) +{ + ChannelList ch; + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + { + if (rgbaChannels & WRITE_Y) + { + ch.insert ("Y", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_C) + { + ch.insert ("RY", Channel (HALF, 2, 2, true)); + ch.insert ("BY", Channel (HALF, 2, 2, true)); + } + } + else + { + if (rgbaChannels & WRITE_R) + ch.insert ("R", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_G) + ch.insert ("G", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_B) + ch.insert ("B", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_A) + ch.insert ("A", Channel (HALF, 1, 1)); + + header.channels() = ch; +} + + +RgbaChannels +rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") +{ + int i = 0; + + if (ch.findChannel (channelNamePrefix + "R")) + i |= WRITE_R; + + if (ch.findChannel (channelNamePrefix + "G")) + i |= WRITE_G; + + if (ch.findChannel (channelNamePrefix + "B")) + i |= WRITE_B; + + if (ch.findChannel (channelNamePrefix + "A")) + i |= WRITE_A; + + if (ch.findChannel (channelNamePrefix + "Y")) + i |= WRITE_Y; + + if (ch.findChannel (channelNamePrefix + "RY") || + ch.findChannel (channelNamePrefix + "BY")) + i |= WRITE_C; + + return RgbaChannels (i); +} + + +string +prefixFromLayerName (const string &layerName, const Header &header) +{ + if (layerName.empty()) + return ""; + + if (hasMultiView (header) && multiView(header)[0] == layerName) + return ""; + + return layerName + "."; +} + + +V3f +ywFromHeader (const Header &header) +{ + Chromaticities cr; + + if (hasChromaticities (header)) + cr = chromaticities (header); + + return computeYw (cr); +} + + +ptrdiff_t +cachePadding (ptrdiff_t size) +{ + // + // Some of the buffers that are allocated by classes ToYca and + // FromYca, below, may need to be padded to avoid cache thrashing. + // If the difference between the buffer size and the nearest power + // of two is less than CACHE_LINE_SIZE, then we add an appropriate + // amount of padding. + // + // CACHE_LINE_SIZE must be a power of two, and it must be at + // least as big as the true size of a cache line on the machine + // we are running on. (It is ok if CACHE_LINE_SIZE is larger + // than a real cache line.) + // + + static int LOG2_CACHE_LINE_SIZE = 8; + static const ptrdiff_t CACHE_LINE_SIZE = (1 << LOG2_CACHE_LINE_SIZE); + + int i = LOG2_CACHE_LINE_SIZE + 2; + + while ((size >> i) > 1) + ++i; + + if (size > (1 << (i + 1)) - 64) + return 64 + ((1 << (i + 1)) - size); + + if (size < (1 << i) + 64) + return 64 + ((1 << i) - size); + + return 0; +} + +} // namespace + + +class RgbaOutputFile::ToYca: public Mutex +{ + public: + + ToYca (OutputFile &outputFile, RgbaChannels rgbaChannels); + ~ToYca (); + + void setYCRounding (unsigned int roundY, + unsigned int roundC); + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + void writePixels (int numScanLines); + int currentScanLine () const; + + private: + + void padTmpBuf (); + void rotateBuffers (); + void duplicateLastBuffer (); + void duplicateSecondToLastBuffer (); + void decimateChromaVertAndWriteScanLine (); + + OutputFile & _outputFile; + bool _writeY; + bool _writeC; + bool _writeA; + int _xMin; + int _width; + int _height; + int _linesConverted; + LineOrder _lineOrder; + int _currentScanLine; + V3f _yw; + Rgba * _bufBase; + Rgba * _buf[N]; + Rgba * _tmpBuf; + const Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; + int _roundY; + int _roundC; +}; + + +RgbaOutputFile::ToYca::ToYca (OutputFile &outputFile, + RgbaChannels rgbaChannels) +: + _outputFile (outputFile) +{ + _writeY = (rgbaChannels & WRITE_Y)? true: false; + _writeC = (rgbaChannels & WRITE_C)? true: false; + _writeA = (rgbaChannels & WRITE_A)? true: false; + + const Box2i dw = _outputFile.header().dataWindow(); + + _xMin = dw.min.x; + _width = dw.max.x - dw.min.x + 1; + _height = dw.max.y - dw.min.y + 1; + + _linesConverted = 0; + _lineOrder = _outputFile.header().lineOrder(); + + if (_lineOrder == INCREASING_Y) + _currentScanLine = dw.min.y; + else + _currentScanLine = dw.max.y; + + _yw = ywFromHeader (_outputFile.header()); + + ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); + + _bufBase = new Rgba[(_width + pad) * N]; + + for (int i = 0; i < N; ++i) + _buf[i] = _bufBase + (i * (_width + pad)); + + _tmpBuf = new Rgba[_width + N - 1]; + + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; + + _roundY = 7; + _roundC = 5; +} + + +RgbaOutputFile::ToYca::~ToYca () +{ + delete [] _bufBase; + delete [] _tmpBuf; +} + + +void +RgbaOutputFile::ToYca::setYCRounding (unsigned int roundY, + unsigned int roundC) +{ + _roundY = roundY; + _roundC = roundC; +} + + +void +RgbaOutputFile::ToYca::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_fbBase == 0) + { + FrameBuffer fb; + + if (_writeY) + { + fb.insert ("Y", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].g, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1)); // ySampling + } + + if (_writeC) + { + fb.insert ("RY", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].r, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2)); // ySampling + + fb.insert ("BY", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].b, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2)); // ySampling + } + + if (_writeA) + { + fb.insert ("A", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].a, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1)); // ySampling + } + + _outputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +RgbaOutputFile::ToYca::writePixels (int numScanLines) +{ + if (_fbBase == 0) + { + THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " + "pixel data source for image file " + "\"" << _outputFile.fileName() << "\"."); + } + + if (_writeY && !_writeC) + { + // + // We are writing only luminance; filtering + // and subsampling are not necessary. + // + + for (int i = 0; i < numScanLines; ++i) + { + // + // Copy the next scan line from the caller's + // frame buffer into _tmpBuf. + // + + for (int j = 0; j < _width; ++j) + { + _tmpBuf[j] = _fbBase[_fbYStride * _currentScanLine + + _fbXStride * (j + _xMin)]; + } + + // + // Convert the scan line from RGB to luminance/chroma, + // and store the result in the output file. + // + + RGBAtoYCA (_yw, _width, _writeA, _tmpBuf, _tmpBuf); + _outputFile.writePixels (1); + + ++_linesConverted; + + if (_lineOrder == INCREASING_Y) + ++_currentScanLine; + else + --_currentScanLine; + } + } + else + { + // + // We are writing chroma; the pixels must be filtered and subsampled. + // + + for (int i = 0; i < numScanLines; ++i) + { + // + // Copy the next scan line from the caller's + // frame buffer into _tmpBuf. + // + + for (int j = 0; j < _width; ++j) + { + _tmpBuf[j + N2] = _fbBase[_fbYStride * _currentScanLine + + _fbXStride * (j + _xMin)]; + } + + // + // Convert the scan line from RGB to luminance/chroma. + // + + RGBAtoYCA (_yw, _width, _writeA, _tmpBuf + N2, _tmpBuf + N2); + + // + // Append N2 copies of the first and last pixel to the + // beginning and end of the scan line. + // + + padTmpBuf (); + + // + // Filter and subsample the scan line's chroma channels + // horizontally; store the result in _buf. + // + + rotateBuffers(); + decimateChromaHoriz (_width, _tmpBuf, _buf[N - 1]); + + // + // If this is the first scan line in the image, + // store N2 more copies of the scan line in _buf. + // + + if (_linesConverted == 0) + { + for (int j = 0; j < N2; ++j) + duplicateLastBuffer(); + } + + ++_linesConverted; + + // + // If we have have converted at least N2 scan lines from + // RGBA to luminance/chroma, then we can start to filter + // and subsample vertically, and store pixels in the + // output file. + // + + if (_linesConverted > N2) + decimateChromaVertAndWriteScanLine(); + + // + // If we have already converted the last scan line in + // the image to luminance/chroma, filter, subsample and + // store the remaining scan lines in _buf. + // + + if (_linesConverted >= _height) + { + for (int j = 0; j < N2 - _height; ++j) + duplicateLastBuffer(); + + duplicateSecondToLastBuffer(); + ++_linesConverted; + decimateChromaVertAndWriteScanLine(); + + for (int j = 1; j < min (_height, N2); ++j) + { + duplicateLastBuffer(); + ++_linesConverted; + decimateChromaVertAndWriteScanLine(); + } + } + + if (_lineOrder == INCREASING_Y) + ++_currentScanLine; + else + --_currentScanLine; + } + } +} + + +int +RgbaOutputFile::ToYca::currentScanLine () const +{ + return _currentScanLine; +} + + +void +RgbaOutputFile::ToYca::padTmpBuf () +{ + for (int i = 0; i < N2; ++i) + { + _tmpBuf[i] = _tmpBuf[N2]; + _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; + } +} + + +void +RgbaOutputFile::ToYca::rotateBuffers () +{ + Rgba *tmp = _buf[0]; + + for (int i = 0; i < N - 1; ++i) + _buf[i] = _buf[i + 1]; + + _buf[N - 1] = tmp; +} + + +void +RgbaOutputFile::ToYca::duplicateLastBuffer () +{ + rotateBuffers(); + memcpy (_buf[N - 1], _buf[N - 2], _width * sizeof (Rgba)); +} + + +void +RgbaOutputFile::ToYca::duplicateSecondToLastBuffer () +{ + rotateBuffers(); + memcpy (_buf[N - 1], _buf[N - 3], _width * sizeof (Rgba)); +} + + +void +RgbaOutputFile::ToYca::decimateChromaVertAndWriteScanLine () +{ + if (_linesConverted & 1) + memcpy (_tmpBuf, _buf[N2], _width * sizeof (Rgba)); + else + decimateChromaVert (_width, _buf, _tmpBuf); + + if (_writeY && _writeC) + roundYCA (_width, _roundY, _roundC, _tmpBuf, _tmpBuf); + + _outputFile.writePixels (1); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (os, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + int width, + int height, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::~RgbaOutputFile () +{ + delete _toYca; + delete _outputFile; +} + + +void +RgbaOutputFile::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->setFrameBuffer (base, xStride, yStride); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); + fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); + fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); + fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); + + _outputFile->setFrameBuffer (fb); + } +} + + +void +RgbaOutputFile::writePixels (int numScanLines) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->writePixels (numScanLines); + } + else + { + _outputFile->writePixels (numScanLines); + } +} + + +int +RgbaOutputFile::currentScanLine () const +{ + if (_toYca) + { + Lock lock (*_toYca); + return _toYca->currentScanLine(); + } + else + { + return _outputFile->currentScanLine(); + } +} + + +const Header & +RgbaOutputFile::header () const +{ + return _outputFile->header(); +} + + +const FrameBuffer & +RgbaOutputFile::frameBuffer () const +{ + return _outputFile->frameBuffer(); +} + + +const IMATH_NAMESPACE::Box2i & +RgbaOutputFile::displayWindow () const +{ + return _outputFile->header().displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +RgbaOutputFile::dataWindow () const +{ + return _outputFile->header().dataWindow(); +} + + +float +RgbaOutputFile::pixelAspectRatio () const +{ + return _outputFile->header().pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +RgbaOutputFile::screenWindowCenter () const +{ + return _outputFile->header().screenWindowCenter(); +} + + +float +RgbaOutputFile::screenWindowWidth () const +{ + return _outputFile->header().screenWindowWidth(); +} + + +LineOrder +RgbaOutputFile::lineOrder () const +{ + return _outputFile->header().lineOrder(); +} + + +Compression +RgbaOutputFile::compression () const +{ + return _outputFile->header().compression(); +} + + +RgbaChannels +RgbaOutputFile::channels () const +{ + return rgbaChannels (_outputFile->header().channels()); +} + + +void +RgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + _outputFile->updatePreviewImage (newPixels); +} + + +void +RgbaOutputFile::setYCRounding (unsigned int roundY, unsigned int roundC) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->setYCRounding (roundY, roundC); + } +} + + +void +RgbaOutputFile::breakScanLine (int y, int offset, int length, char c) +{ + _outputFile->breakScanLine (y, offset, length, c); +} + + +class RgbaInputFile::FromYca: public Mutex +{ + public: + + FromYca (InputFile &inputFile, RgbaChannels rgbaChannels); + ~FromYca (); + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix); + + void readPixels (int scanLine1, int scanLine2); + + private: + + void readPixels (int scanLine); + void rotateBuf1 (int d); + void rotateBuf2 (int d); + void readYCAScanLine (int y, Rgba buf[]); + void padTmpBuf (); + + InputFile & _inputFile; + bool _readC; + int _xMin; + int _yMin; + int _yMax; + int _width; + int _height; + int _currentScanLine; + LineOrder _lineOrder; + V3f _yw; + Rgba * _bufBase; + Rgba * _buf1[N + 2]; + Rgba * _buf2[3]; + Rgba * _tmpBuf; + Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +RgbaInputFile::FromYca::FromYca (InputFile &inputFile, + RgbaChannels rgbaChannels) +: + _inputFile (inputFile) +{ + _readC = (rgbaChannels & WRITE_C)? true: false; + + const Box2i dw = _inputFile.header().dataWindow(); + + _xMin = dw.min.x; + _yMin = dw.min.y; + _yMax = dw.max.y; + _width = dw.max.x - dw.min.x + 1; + _height = dw.max.y - dw.min.y + 1; + _currentScanLine = dw.min.y - N - 2; + _lineOrder = _inputFile.header().lineOrder(); + _yw = ywFromHeader (_inputFile.header()); + + ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); + + _bufBase = new Rgba[(_width + pad) * (N + 2 + 3)]; + + for (int i = 0; i < N + 2; ++i) + _buf1[i] = _bufBase + (i * (_width + pad)); + + for (int i = 0; i < 3; ++i) + _buf2[i] = _bufBase + ((i + N + 2) * (_width + pad)); + + _tmpBuf = new Rgba[_width + N - 1]; + + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +RgbaInputFile::FromYca::~FromYca () +{ + delete [] _bufBase; + delete [] _tmpBuf; +} + + +void +RgbaInputFile::FromYca::setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix) +{ + if (_fbBase == 0) + { + FrameBuffer fb; + + fb.insert (channelNamePrefix + "Y", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].g, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1, // ySampling + 0.5)); // fillValue + + if (_readC) + { + fb.insert (channelNamePrefix + "RY", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].r, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2, // ySampling + 0.0)); // fillValue + + fb.insert (channelNamePrefix + "BY", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].b, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2, // ySampling + 0.0)); // fillValue + } + + fb.insert (channelNamePrefix + "A", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].a, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1, // ySampling + 1.0)); // fillValue + + _inputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +RgbaInputFile::FromYca::readPixels (int scanLine1, int scanLine2) +{ + int minY = min (scanLine1, scanLine2); + int maxY = max (scanLine1, scanLine2); + + if (_lineOrder == INCREASING_Y) + { + for (int y = minY; y <= maxY; ++y) + readPixels (y); + } + else + { + for (int y = maxY; y >= minY; --y) + readPixels (y); + } +} + + +void +RgbaInputFile::FromYca::readPixels (int scanLine) +{ + if (_fbBase == 0) + { + THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " + "pixel data destination for image file " + "\"" << _inputFile.fileName() << "\"."); + } + + // + // In order to convert one scan line to RGB format, we need that + // scan line plus N2+1 extra scan lines above and N2+1 scan lines + // below in luminance/chroma format. + // + // We allow random access to scan lines, but we buffer partially + // processed luminance/chroma data in order to make reading pixels + // in increasing y or decreasing y order reasonably efficient: + // + // _currentScanLine holds the y coordinate of the scan line + // that was most recently read. + // + // _buf1 contains scan lines _currentScanLine-N2-1 + // through _currentScanLine+N2+1 in + // luminance/chroma format. Odd-numbered + // lines contain no chroma data. Even-numbered + // lines have valid chroma data for all pixels. + // + // _buf2 contains scan lines _currentScanLine-1 + // through _currentScanLine+1, in RGB format. + // Super-saturated pixels (see ImfRgbaYca.h) + // have not yet been eliminated. + // + // If the scan line we are trying to read now is close enough to + // _currentScanLine, we don't have to recompute the contents of _buf1 + // and _buf2 from scratch. We can rotate _buf1 and _buf2, and fill + // in the missing data. + // + + int dy = scanLine - _currentScanLine; + + if (abs (dy) < N + 2) + rotateBuf1 (dy); + + if (abs (dy) < 3) + rotateBuf2 (dy); + + if (dy < 0) + { + { + int n = min (-dy, N + 2); + int yMin = scanLine - N2 - 1; + + for (int i = n - 1; i >= 0; --i) + readYCAScanLine (yMin + i, _buf1[i]); + } + + { + int n = min (-dy, 3); + + for (int i = 0; i < n; ++i) + { + if ((scanLine + i) & 1) + { + YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); + } + else + { + reconstructChromaVert (_width, _buf1 + i, _buf2[i]); + YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); + } + } + } + } + else + { + { + int n = min (dy, N + 2); + int yMax = scanLine + N2 + 1; + + for (int i = n - 1; i >= 0; --i) + readYCAScanLine (yMax - i, _buf1[N + 1 - i]); + } + + { + int n = min (dy, 3); + + for (int i = 2; i > 2 - n; --i) + { + if ((scanLine + i) & 1) + { + YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); + } + else + { + reconstructChromaVert (_width, _buf1 + i, _buf2[i]); + YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); + } + } + } + } + + fixSaturation (_yw, _width, _buf2, _tmpBuf); + + for (int i = 0; i < _width; ++i) + _fbBase[_fbYStride * scanLine + _fbXStride * (i + _xMin)] = _tmpBuf[i]; + + _currentScanLine = scanLine; +} + + +void +RgbaInputFile::FromYca::rotateBuf1 (int d) +{ + d = modp (d, N + 2); + + Rgba *tmp[N + 2]; + + for (int i = 0; i < N + 2; ++i) + tmp[i] = _buf1[i]; + + for (int i = 0; i < N + 2; ++i) + _buf1[i] = tmp[(i + d) % (N + 2)]; +} + + +void +RgbaInputFile::FromYca::rotateBuf2 (int d) +{ + d = modp (d, 3); + + Rgba *tmp[3]; + + for (int i = 0; i < 3; ++i) + tmp[i] = _buf2[i]; + + for (int i = 0; i < 3; ++i) + _buf2[i] = tmp[(i + d) % 3]; +} + + +void +RgbaInputFile::FromYca::readYCAScanLine (int y, Rgba *buf) +{ + // + // Clamp y. + // + + if (y < _yMin) + y = _yMin; + else if (y > _yMax) + y = _yMax - 1; + + // + // Read scan line y into _tmpBuf. + // + + _inputFile.readPixels (y); + + // + // Reconstruct missing chroma samples and copy + // the scan line into buf. + // + + if (!_readC) + { + for (int i = 0; i < _width; ++i) + { + _tmpBuf[i + N2].r = 0; + _tmpBuf[i + N2].b = 0; + } + } + + if (y & 1) + { + memcpy (buf, _tmpBuf + N2, _width * sizeof (Rgba)); + } + else + { + padTmpBuf(); + reconstructChromaHoriz (_width, _tmpBuf, buf); + } +} + + +void +RgbaInputFile::FromYca::padTmpBuf () +{ + for (int i = 0; i < N2; ++i) + { + _tmpBuf[i] = _tmpBuf[N2]; + _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; + } +} + + +RgbaInputFile::RgbaInputFile (const char name[], int numThreads): + _inputFile (new InputFile (name, numThreads)), + _fromYca (0), + _channelNamePrefix ("") +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): + _inputFile (new InputFile (is, numThreads)), + _fromYca (0), + _channelNamePrefix ("") +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (const char name[], + const string &layerName, + int numThreads) +: + _inputFile (new InputFile (name, numThreads)), + _fromYca (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + const string &layerName, + int numThreads) +: + _inputFile (new InputFile (is, numThreads)), + _fromYca (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::~RgbaInputFile () +{ + delete _inputFile; + delete _fromYca; +} + + +void +RgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + if (_fromYca) + { + Lock lock (*_fromYca); + _fromYca->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert (_channelNamePrefix + "R", + Slice (HALF, + (char *) &base[0].r, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "G", + Slice (HALF, + (char *) &base[0].g, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "B", + Slice (HALF, + (char *) &base[0].b, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "A", + Slice (HALF, + (char *) &base[0].a, + xs, ys, + 1, 1, // xSampling, ySampling + 1.0)); // fillValue + + _inputFile->setFrameBuffer (fb); + } +} + + +void +RgbaInputFile::setLayerName (const string &layerName) +{ + delete _fromYca; + _fromYca = 0; + + _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); + + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); + + FrameBuffer fb; + _inputFile->setFrameBuffer (fb); +} + + +void +RgbaInputFile::readPixels (int scanLine1, int scanLine2) +{ + if (_fromYca) + { + Lock lock (*_fromYca); + _fromYca->readPixels (scanLine1, scanLine2); + } + else + { + _inputFile->readPixels (scanLine1, scanLine2); + } +} + + +void +RgbaInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +bool +RgbaInputFile::isComplete () const +{ + return _inputFile->isComplete(); +} + + +const Header & +RgbaInputFile::header () const +{ + return _inputFile->header(); +} + + +const char * +RgbaInputFile::fileName () const +{ + return _inputFile->fileName(); +} + + +const FrameBuffer & +RgbaInputFile::frameBuffer () const +{ + return _inputFile->frameBuffer(); +} + + +const IMATH_NAMESPACE::Box2i & +RgbaInputFile::displayWindow () const +{ + return _inputFile->header().displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +RgbaInputFile::dataWindow () const +{ + return _inputFile->header().dataWindow(); +} + + +float +RgbaInputFile::pixelAspectRatio () const +{ + return _inputFile->header().pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +RgbaInputFile::screenWindowCenter () const +{ + return _inputFile->header().screenWindowCenter(); +} + + +float +RgbaInputFile::screenWindowWidth () const +{ + return _inputFile->header().screenWindowWidth(); +} + + +LineOrder +RgbaInputFile::lineOrder () const +{ + return _inputFile->header().lineOrder(); +} + + +Compression +RgbaInputFile::compression () const +{ + return _inputFile->header().compression(); +} + + +RgbaChannels +RgbaInputFile::channels () const +{ + return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); +} + + +int +RgbaInputFile::version () const +{ + return _inputFile->version(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRgbaFile.h b/IlmImf/ImfRgbaFile.h new file mode 100644 index 0000000..10a74a0 --- /dev/null +++ b/IlmImf/ImfRgbaFile.h @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_RGBA_FILE_H +#define INCLUDED_IMF_RGBA_FILE_H + + +//----------------------------------------------------------------------------- +// +// Simplified RGBA image I/O +// +// class RgbaOutputFile +// class RgbaInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImfRgba.h" +#include "ImathVec.h" +#include "ImathBox.h" +#include "half.h" +#include "ImfThreading.h" +#include +#include "ImfNamespace.h" +#include "ImfForward.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// RGBA output file. +// + +class IMF_EXPORT RgbaOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- header is constructed by the caller + //--------------------------------------------------- + + RgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------- + // Constructor -- header is constructed by the caller, + // file is opened by the caller, destructor will not + // automatically close the file. + //---------------------------------------------------- + + RgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------------------- + // Constructor -- header data are explicitly specified as function + // call arguments (empty dataWindow means "same as displayWindow") + //---------------------------------------------------------------- + + RgbaOutputFile (const char name[], + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + RgbaOutputFile (const char name[], + int width, + int height, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~RgbaOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + + //--------------------------------------------- + // Write pixel data (see class Imf::OutputFile) + //--------------------------------------------- + + void writePixels (int numScanLines = 1); + int currentScanLine () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + // -------------------------------------------------------------------- + // Update the preview image (see Imf::OutputFile::updatePreviewImage()) + // -------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + //----------------------------------------------------------------------- + // Rounding control for luminance/chroma images: + // + // If the output file contains luminance and chroma channels (WRITE_YC + // or WRITE_YCA), then the the significands of the luminance and + // chroma values are rounded to roundY and roundC bits respectively (see + // function half::round()). Rounding improves compression with minimal + // image degradation, usually much less than the degradation caused by + // chroma subsampling. By default, roundY is 7, and roundC is 5. + // + // If the output file contains RGB channels or a luminance channel, + // without chroma, then no rounding is performed. + //----------------------------------------------------------------------- + + void setYCRounding (unsigned int roundY, + unsigned int roundC); + + + //---------------------------------------------------- + // Break a scan line -- for testing and debugging only + // (see Imf::OutputFile::updatePreviewImage() + // + // Warning: Calling this function usually results in a + // broken image file. The file or parts of it may not + // be readable, or the file may contain bad data. + // + //---------------------------------------------------- + + void breakScanLine (int y, + int offset, + int length, + char c); + private: + + RgbaOutputFile (const RgbaOutputFile &); // not implemented + RgbaOutputFile & operator = (const RgbaOutputFile &); // not implemented + + class ToYca; + + OutputFile * _outputFile; + ToYca * _toYca; +}; + + +// +// RGBA input file +// + +class IMF_EXPORT RgbaInputFile +{ + public: + + //------------------------------------------------------- + // Constructor -- opens the file with the specified name, + // destructor will automatically close the file. + //------------------------------------------------------- + + RgbaInputFile (const char name[], int numThreads = globalThreadCount()); + + + //----------------------------------------------------------- + // Constructor -- attaches the new RgbaInputFile object to a + // file that has already been opened by the caller. + // Destroying the RgbaInputFile object will not automatically + // close the file. + //----------------------------------------------------------- + + RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount()); + + + //-------------------------------------------------------------- + // Constructors -- the same as the previous two, but the names + // of the red, green, blue, alpha, luminance and chroma channels + // are expected to be layerName.R, layerName.G, etc. + //-------------------------------------------------------------- + + RgbaInputFile (const char name[], + const std::string &layerName, + int numThreads = globalThreadCount()); + + RgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + const std::string &layerName, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~RgbaInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + + //---------------------------------------------------------------- + // Switch to a different layer -- subsequent calls to readPixels() + // will read channels layerName.R, layerName.G, etc. + // After each call to setLayerName(), setFrameBuffer() must be + // called at least once before the next call to readPixels(). + //---------------------------------------------------------------- + + void setLayerName (const std::string &layerName); + + + //------------------------------------------- + // Read pixel data (see class Imf::InputFile) + //------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + private: + + RgbaInputFile (const RgbaInputFile &); // not implemented + RgbaInputFile & operator = (const RgbaInputFile &); // not implemented + + class FromYca; + + InputFile * _inputFile; + FromYca * _fromYca; + std::string _channelNamePrefix; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfRgbaYca.cpp b/IlmImf/ImfRgbaYca.cpp new file mode 100644 index 0000000..c6212f3 --- /dev/null +++ b/IlmImf/ImfRgbaYca.cpp @@ -0,0 +1,497 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software 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. +// +////////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Conversion between RGBA and YCA data. +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace std; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace RgbaYca { + + +V3f +computeYw (const Chromaticities &cr) +{ + M44f m = RGBtoXYZ (cr, 1); + return V3f (m[0][1], m[1][1], m[2][1]) / (m[0][1] + m[1][1] + m[2][1]); +} + + +void +RGBAtoYCA (const V3f &yw, + int n, + bool aIsValid, + const Rgba rgbaIn[/*n*/], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + Rgba in = rgbaIn[i]; + Rgba &out = ycaOut[i]; + + // + // Conversion to YCA and subsequent chroma subsampling + // work only if R, G and B are finite and non-negative. + // + + if (!in.r.isFinite() || in.r < 0) + in.r = 0; + + if (!in.g.isFinite() || in.g < 0) + in.g = 0; + + if (!in.b.isFinite() || in.b < 0) + in.b = 0; + + if (in.r == in.g && in.g == in.b) + { + // + // Special case -- R, G and B are equal. To avoid rounding + // errors, we explicitly set the output luminance channel + // to G, and the chroma channels to 0. + // + // The special cases here and in YCAtoRGBA() ensure that + // converting black-and white images from RGBA to YCA and + // back is lossless. + // + + out.r = 0; + out.g = in.g; + out.b = 0; + } + else + { + out.g = in.r * yw.x + in.g * yw.y + in.b * yw.z; + + float Y = out.g; + + if (abs (in.r - Y) < HALF_MAX * Y) + out.r = (in.r - Y) / Y; + else + out.r = 0; + + if (abs (in.b - Y) < HALF_MAX * Y) + out.b = (in.b - Y) / Y; + else + out.b = 0; + } + + if (aIsValid) + out.a = in.a; + else + out.a = 1; + } +} + + +void +decimateChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]) +{ + #ifdef DEBUG + assert (ycaIn != ycaOut); + #endif + + int begin = N2; + int end = begin + n; + + for (int i = begin, j = 0; i < end; ++i, ++j) + { + if ((j & 1) == 0) + { + ycaOut[j].r = ycaIn[i - 13].r * 0.001064f + + ycaIn[i - 11].r * -0.003771f + + ycaIn[i - 9].r * 0.009801f + + ycaIn[i - 7].r * -0.021586f + + ycaIn[i - 5].r * 0.043978f + + ycaIn[i - 3].r * -0.093067f + + ycaIn[i - 1].r * 0.313659f + + ycaIn[i ].r * 0.499846f + + ycaIn[i + 1].r * 0.313659f + + ycaIn[i + 3].r * -0.093067f + + ycaIn[i + 5].r * 0.043978f + + ycaIn[i + 7].r * -0.021586f + + ycaIn[i + 9].r * 0.009801f + + ycaIn[i + 11].r * -0.003771f + + ycaIn[i + 13].r * 0.001064f; + + ycaOut[j].b = ycaIn[i - 13].b * 0.001064f + + ycaIn[i - 11].b * -0.003771f + + ycaIn[i - 9].b * 0.009801f + + ycaIn[i - 7].b * -0.021586f + + ycaIn[i - 5].b * 0.043978f + + ycaIn[i - 3].b * -0.093067f + + ycaIn[i - 1].b * 0.313659f + + ycaIn[i ].b * 0.499846f + + ycaIn[i + 1].b * 0.313659f + + ycaIn[i + 3].b * -0.093067f + + ycaIn[i + 5].b * 0.043978f + + ycaIn[i + 7].b * -0.021586f + + ycaIn[i + 9].b * 0.009801f + + ycaIn[i + 11].b * -0.003771f + + ycaIn[i + 13].b * 0.001064f; + } + + ycaOut[j].g = ycaIn[i].g; + ycaOut[j].a = ycaIn[i].a; + } +} + + +void +decimateChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + if ((i & 1) == 0) + { + ycaOut[i].r = ycaIn[ 0][i].r * 0.001064f + + ycaIn[ 2][i].r * -0.003771f + + ycaIn[ 4][i].r * 0.009801f + + ycaIn[ 6][i].r * -0.021586f + + ycaIn[ 8][i].r * 0.043978f + + ycaIn[10][i].r * -0.093067f + + ycaIn[12][i].r * 0.313659f + + ycaIn[13][i].r * 0.499846f + + ycaIn[14][i].r * 0.313659f + + ycaIn[16][i].r * -0.093067f + + ycaIn[18][i].r * 0.043978f + + ycaIn[20][i].r * -0.021586f + + ycaIn[22][i].r * 0.009801f + + ycaIn[24][i].r * -0.003771f + + ycaIn[26][i].r * 0.001064f; + + ycaOut[i].b = ycaIn[ 0][i].b * 0.001064f + + ycaIn[ 2][i].b * -0.003771f + + ycaIn[ 4][i].b * 0.009801f + + ycaIn[ 6][i].b * -0.021586f + + ycaIn[ 8][i].b * 0.043978f + + ycaIn[10][i].b * -0.093067f + + ycaIn[12][i].b * 0.313659f + + ycaIn[13][i].b * 0.499846f + + ycaIn[14][i].b * 0.313659f + + ycaIn[16][i].b * -0.093067f + + ycaIn[18][i].b * 0.043978f + + ycaIn[20][i].b * -0.021586f + + ycaIn[22][i].b * 0.009801f + + ycaIn[24][i].b * -0.003771f + + ycaIn[26][i].b * 0.001064f; + } + + ycaOut[i].g = ycaIn[13][i].g; + ycaOut[i].a = ycaIn[13][i].a; + } +} + + +void +roundYCA (int n, + unsigned int roundY, + unsigned int roundC, + const Rgba ycaIn[/*n*/], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + ycaOut[i].g = ycaIn[i].g.round (roundY); + ycaOut[i].a = ycaIn[i].a; + + if ((i & 1) == 0) + { + ycaOut[i].r = ycaIn[i].r.round (roundC); + ycaOut[i].b = ycaIn[i].b.round (roundC); + } + } +} + + +void +reconstructChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]) +{ + #ifdef DEBUG + assert (ycaIn != ycaOut); + #endif + + int begin = N2; + int end = begin + n; + + for (int i = begin, j = 0; i < end; ++i, ++j) + { + if (j & 1) + { + ycaOut[j].r = ycaIn[i - 13].r * 0.002128f + + ycaIn[i - 11].r * -0.007540f + + ycaIn[i - 9].r * 0.019597f + + ycaIn[i - 7].r * -0.043159f + + ycaIn[i - 5].r * 0.087929f + + ycaIn[i - 3].r * -0.186077f + + ycaIn[i - 1].r * 0.627123f + + ycaIn[i + 1].r * 0.627123f + + ycaIn[i + 3].r * -0.186077f + + ycaIn[i + 5].r * 0.087929f + + ycaIn[i + 7].r * -0.043159f + + ycaIn[i + 9].r * 0.019597f + + ycaIn[i + 11].r * -0.007540f + + ycaIn[i + 13].r * 0.002128f; + + ycaOut[j].b = ycaIn[i - 13].b * 0.002128f + + ycaIn[i - 11].b * -0.007540f + + ycaIn[i - 9].b * 0.019597f + + ycaIn[i - 7].b * -0.043159f + + ycaIn[i - 5].b * 0.087929f + + ycaIn[i - 3].b * -0.186077f + + ycaIn[i - 1].b * 0.627123f + + ycaIn[i + 1].b * 0.627123f + + ycaIn[i + 3].b * -0.186077f + + ycaIn[i + 5].b * 0.087929f + + ycaIn[i + 7].b * -0.043159f + + ycaIn[i + 9].b * 0.019597f + + ycaIn[i + 11].b * -0.007540f + + ycaIn[i + 13].b * 0.002128f; + } + else + { + ycaOut[j].r = ycaIn[i].r; + ycaOut[j].b = ycaIn[i].b; + } + + ycaOut[j].g = ycaIn[i].g; + ycaOut[j].a = ycaIn[i].a; + } +} + + +void +reconstructChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + ycaOut[i].r = ycaIn[ 0][i].r * 0.002128f + + ycaIn[ 2][i].r * -0.007540f + + ycaIn[ 4][i].r * 0.019597f + + ycaIn[ 6][i].r * -0.043159f + + ycaIn[ 8][i].r * 0.087929f + + ycaIn[10][i].r * -0.186077f + + ycaIn[12][i].r * 0.627123f + + ycaIn[14][i].r * 0.627123f + + ycaIn[16][i].r * -0.186077f + + ycaIn[18][i].r * 0.087929f + + ycaIn[20][i].r * -0.043159f + + ycaIn[22][i].r * 0.019597f + + ycaIn[24][i].r * -0.007540f + + ycaIn[26][i].r * 0.002128f; + + ycaOut[i].b = ycaIn[ 0][i].b * 0.002128f + + ycaIn[ 2][i].b * -0.007540f + + ycaIn[ 4][i].b * 0.019597f + + ycaIn[ 6][i].b * -0.043159f + + ycaIn[ 8][i].b * 0.087929f + + ycaIn[10][i].b * -0.186077f + + ycaIn[12][i].b * 0.627123f + + ycaIn[14][i].b * 0.627123f + + ycaIn[16][i].b * -0.186077f + + ycaIn[18][i].b * 0.087929f + + ycaIn[20][i].b * -0.043159f + + ycaIn[22][i].b * 0.019597f + + ycaIn[24][i].b * -0.007540f + + ycaIn[26][i].b * 0.002128f; + + ycaOut[i].g = ycaIn[13][i].g; + ycaOut[i].a = ycaIn[13][i].a; + } +} + + +void +YCAtoRGBA (const IMATH_NAMESPACE::V3f &yw, + int n, + const Rgba ycaIn[/*n*/], + Rgba rgbaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + const Rgba &in = ycaIn[i]; + Rgba &out = rgbaOut[i]; + + if (in.r == 0 && in.b == 0) + { + // + // Special case -- both chroma channels are 0. To avoid + // rounding errors, we explicitly set the output R, G and B + // channels equal to the input luminance. + // + // The special cases here and in RGBAtoYCA() ensure that + // converting black-and white images from RGBA to YCA and + // back is lossless. + // + + out.r = in.g; + out.g = in.g; + out.b = in.g; + out.a = in.a; + } + else + { + float Y = in.g; + float r = (in.r + 1) * Y; + float b = (in.b + 1) * Y; + float g = (Y - r * yw.x - b * yw.z) / yw.y; + + out.r = r; + out.g = g; + out.b = b; + out.a = in.a; + } + } +} + + +namespace { + +inline float +saturation (const Rgba &in) +{ + float rgbMax = max (in.r, max (in.g, in.b)); + float rgbMin = min (in.r, min (in.g, in.b)); + + if (rgbMax > 0) + return 1 - rgbMin / rgbMax; + else + return 0; +} + + +void +desaturate (const Rgba &in, float f, const V3f &yw, Rgba &out) +{ + float rgbMax = max (in.r, max (in.g, in.b)); + + out.r = max (float (rgbMax - (rgbMax - in.r) * f), 0.0f); + out.g = max (float (rgbMax - (rgbMax - in.g) * f), 0.0f); + out.b = max (float (rgbMax - (rgbMax - in.b) * f), 0.0f); + out.a = in.a; + + float Yin = in.r * yw.x + in.g * yw.y + in.b * yw.z; + float Yout = out.r * yw.x + out.g * yw.y + out.b * yw.z; + + if (Yout > 0) + { + out.r *= Yin / Yout; + out.g *= Yin / Yout; + out.b *= Yin / Yout; + } +} + +} // namespace + + +void +fixSaturation (const IMATH_NAMESPACE::V3f &yw, + int n, + const Rgba * const rgbaIn[3], + Rgba rgbaOut[/*n*/]) +{ + float neighborA2 = saturation (rgbaIn[0][0]); + float neighborA1 = neighborA2; + + float neighborB2 = saturation (rgbaIn[2][0]); + float neighborB1 = neighborB2; + + for (int i = 0; i < n; ++i) + { + float neighborA0 = neighborA1; + neighborA1 = neighborA2; + + float neighborB0 = neighborB1; + neighborB1 = neighborB2; + + if (i < n - 1) + { + neighborA2 = saturation (rgbaIn[0][i + 1]); + neighborB2 = saturation (rgbaIn[2][i + 1]); + } + + // + // A0 A1 A2 + // rgbaOut[i] + // B0 B1 B2 + // + + float sMean = min (1.0f, 0.25f * (neighborA0 + neighborA2 + + neighborB0 + neighborB2)); + + const Rgba &in = rgbaIn[1][i]; + Rgba &out = rgbaOut[i]; + + float s = saturation (in); + + if (s > sMean) + { + float sMax = min (1.0f, 1 - (1 - sMean) * 0.25f); + + if (s > sMax) + { + desaturate (in, sMax / s, yw, out); + continue; + } + } + + out = in; + } +} + +} // namespace RgbaYca +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRgbaYca.h b/IlmImf/ImfRgbaYca.h new file mode 100644 index 0000000..c4c6775 --- /dev/null +++ b/IlmImf/ImfRgbaYca.h @@ -0,0 +1,259 @@ +#ifndef INCLUDED_IMF_RGBA_YCA_H +#define INCLUDED_IMF_RGBA_YCA_H + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software 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. +// +////////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Conversion between RGBA (red, green, blue alpha) +// and YCA (luminance, subsampled chroma, alpha) data: +// +// Luminance, Y, is computed as a weighted sum of R, G, and B: +// +// Y = yw.x * R + yw.y * G + yw.z * B +// +// Function computeYw() computes a set of RGB-to-Y weights, yw, +// from a set of primary and white point chromaticities. +// +// Chroma, C, consists of two components, RY and BY: +// +// RY = (R - Y) / Y +// BY = (B - Y) / Y +// +// For efficiency, the x and y subsampling rates for chroma are +// hardwired to 2, and the chroma subsampling and reconstruction +// filters are fixed 27-pixel wide windowed sinc functions. +// +// Starting with an image that has RGBA data for all pixels, +// +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// ... +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// +// function RGBAtoYCA() converts the pixels to YCA format: +// +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// ... +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// +// Next, decimateChomaHoriz() eliminates the chroma values from +// the odd-numbered pixels in every scan line: +// +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// ... +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// +// decimateChromaVert() eliminates all chroma values from the +// odd-numbered scan lines: +// +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// ... +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// +// Finally, roundYCA() reduces the precision of the luminance +// and chroma values so that the pixel data shrink more when +// they are saved in a compressed file. +// +// The output of roundYCA() can be converted back to a set +// of RGBA pixel data that is visually very similar to the +// original RGBA image, by calling reconstructChromaHoriz(), +// reconstructChromaVert(), YCAtoRGBA(), and finally +// fixSaturation(). +// +//----------------------------------------------------------------------------- + +#include "ImfRgba.h" +#include "ImfChromaticities.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +namespace RgbaYca { + + +// +// Width of the chroma subsampling and reconstruction filters +// + +static const int N = 27; +static const int N2 = N / 2; + + +// +// Convert a set of primary chromaticities into a set of weighting +// factors for computing a pixels's luminance, Y, from R, G and B +// + +IMF_EXPORT +IMATH_NAMESPACE::V3f computeYw (const Chromaticities &cr); + + +// +// Convert an array of n RGBA pixels, rgbaIn, to YCA (luminance/chroma/alpha): +// +// ycaOut[i].g = Y (rgbaIn[i]); +// ycaOut[i].r = RY (rgbaIn[i]); +// ycaOut[i].b = BY (rgbaIn[i]); +// ycaOut[i].a = aIsValid? rgbaIn[i].a: 1 +// +// yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). +// + +IMF_EXPORT +void RGBAtoYCA (const IMATH_NAMESPACE::V3f &yw, + int n, + bool aIsValid, + const Rgba rgbaIn[/*n*/], + Rgba ycaOut[/*n*/]); + +// +// Perform horizontal low-pass filtering and subsampling of +// the chroma channels of an array of n pixels. In order +// to avoid indexing off the ends of the input array during +// low-pass filtering, ycaIn must have N2 extra pixels at +// both ends. Before calling decimateChromaHoriz(), the extra +// pixels should be filled with copies of the first and last +// "real" input pixel. +// + +IMF_EXPORT +void decimateChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]); + +// +// Perform vertical chroma channel low-pass filtering and subsampling. +// N scan lines of input pixels are combined into a single scan line +// of output pixels. +// + +IMF_EXPORT +void decimateChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]); + +// +// Round the luminance and chroma channels of an array of YCA +// pixels that has already been filtered and subsampled. +// The signifcands of the pixels' luminance and chroma values +// are rounded to roundY and roundC bits respectively. +// + +IMF_EXPORT +void roundYCA (int n, + unsigned int roundY, + unsigned int roundC, + const Rgba ycaIn[/*n*/], + Rgba ycaOut[/*n*/]); + +// +// For a scan line that has valid chroma data only for every other pixel, +// reconstruct the missing chroma values. +// + +IMF_EXPORT +void reconstructChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]); + +// +// For a scan line that has only luminance and no valid chroma data, +// reconstruct chroma from the surronding N scan lines. +// + +IMF_EXPORT +void reconstructChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]); + +// +// Convert an array of n YCA (luminance/chroma/alpha) pixels to RGBA. +// This function is the inverse of RGBAtoYCA(). +// yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). +// + +IMF_EXPORT +void YCAtoRGBA (const IMATH_NAMESPACE::V3f &yw, + int n, + const Rgba ycaIn[/*n*/], + Rgba rgbaOut[/*n*/]); + +// +// Eliminate super-saturated pixels: +// +// Converting an image from RGBA to YCA, low-pass filtering chroma, +// and converting the result back to RGBA can produce pixels with +// super-saturated colors, where one or two of the RGB components +// become zero or negative. (The low-pass and reconstruction filters +// introduce some amount of ringing into the chroma components. +// This can lead to negative RGB values near high-contrast edges.) +// +// The fixSaturation() function finds super-saturated pixels and +// corrects them by desaturating their colors while maintaining +// their luminance. fixSaturation() takes three adjacent input +// scan lines, rgbaIn[0], rgbaIn[1], rgbaIn[2], adjusts the +// saturation of rgbaIn[1], and stores the result in rgbaOut. +// + +IMF_EXPORT +void fixSaturation (const IMATH_NAMESPACE::V3f &yw, + int n, + const Rgba * const rgbaIn[3], + Rgba rgbaOut[/*n*/]); + +} // namespace RgbaYca +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfRle.cpp b/IlmImf/ImfRle.cpp new file mode 100644 index 0000000..7be6ac4 --- /dev/null +++ b/IlmImf/ImfRle.cpp @@ -0,0 +1,157 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include "ImfRle.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +const int MIN_RUN_LENGTH = 3; +const int MAX_RUN_LENGTH = 127; + +} + +// +// Compress an array of bytes, using run-length encoding, +// and return the length of the compressed data. +// + +int +rleCompress (int inLength, const char in[], signed char out[]) +{ + const char *inEnd = in + inLength; + const char *runStart = in; + const char *runEnd = in + 1; + signed char *outWrite = out; + + while (runStart < inEnd) + { + while (runEnd < inEnd && + *runStart == *runEnd && + runEnd - runStart - 1 < MAX_RUN_LENGTH) + { + ++runEnd; + } + + if (runEnd - runStart >= MIN_RUN_LENGTH) + { + // + // Compressable run + // + + *outWrite++ = (runEnd - runStart) - 1; + *outWrite++ = *(signed char *) runStart; + runStart = runEnd; + } + else + { + // + // Uncompressable run + // + + while (runEnd < inEnd && + ((runEnd + 1 >= inEnd || + *runEnd != *(runEnd + 1)) || + (runEnd + 2 >= inEnd || + *(runEnd + 1) != *(runEnd + 2))) && + runEnd - runStart < MAX_RUN_LENGTH) + { + ++runEnd; + } + + *outWrite++ = runStart - runEnd; + + while (runStart < runEnd) + { + *outWrite++ = *(signed char *) (runStart++); + } + } + + ++runEnd; + } + + return outWrite - out; +} + + +// +// Uncompress an array of bytes compressed with rleCompress(). +// Returns the length of the oncompressed data, or 0 if the +// length of the uncompressed data would be more than maxLength. +// + +int +rleUncompress (int inLength, int maxLength, const signed char in[], char out[]) +{ + char *outStart = out; + + while (inLength > 0) + { + if (*in < 0) + { + int count = -((int)*in++); + inLength -= count + 1; + + if (0 > (maxLength -= count)) + return 0; + + memcpy(out, in, count); + out += count; + in += count; + } + else + { + int count = *in++; + inLength -= 2; + + if (0 > (maxLength -= count + 1)) + return 0; + + memset(out, *(char*)in, count+1); + out += count+1; + + in++; + } + } + + return out - outStart; +} + + + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRle.h b/IlmImf/ImfRle.h new file mode 100644 index 0000000..0def336 --- /dev/null +++ b/IlmImf/ImfRle.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_RLE_H_ +#define INCLUDED_IMF_RLE_H_ + +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +// +// Compress an array of bytes, using run-length encoding, +// and return the length of the compressed data. +// + +IMF_EXPORT +int rleCompress (int inLength, const char in[], signed char out[]); + +// +// Uncompress an array of bytes compressed with rleCompress(). +// Returns the length of the uncompressed data, or 0 if the +// length of the uncompressed data would be more than maxLength. +// + +IMF_EXPORT +int rleUncompress (int inLength, int maxLength, + const signed char in[], char out[]); + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfRleCompressor.cpp b/IlmImf/ImfRleCompressor.cpp new file mode 100644 index 0000000..33914e8 --- /dev/null +++ b/IlmImf/ImfRleCompressor.cpp @@ -0,0 +1,220 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class RleCompressor +// +//----------------------------------------------------------------------------- + +#include "ImfRleCompressor.h" +#include "ImfCheckedArithmetic.h" +#include "ImfRle.h" +#include "Iex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +RleCompressor::RleCompressor (const Header &hdr, size_t maxScanLineSize): + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _tmpBuffer (0), + _outBuffer (0) +{ + _tmpBuffer = new char [maxScanLineSize]; + _outBuffer = new char [uiMult (maxScanLineSize, size_t (3)) / 2]; +} + + +RleCompressor::~RleCompressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; +} + + +int +RleCompressor::numScanLines () const +{ + // + // This compressor compresses individual scan lines. + // + + return 1; +} + + +int +RleCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case �- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Reorder the pixel data. + // + + { + char *t1 = _tmpBuffer; + char *t2 = _tmpBuffer + (inSize + 1) / 2; + const char *stop = inPtr + inSize; + + while (true) + { + if (inPtr < stop) + *(t1++) = *(inPtr++); + else + break; + + if (inPtr < stop) + *(t2++) = *(inPtr++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + inSize; + int p = t[-1]; + + while (t < stop) + { + int d = int (t[0]) - p + (128 + 256); + p = t[0]; + t[0] = d; + ++t; + } + } + + // + // Run-length encode the data. + // + + outPtr = _outBuffer; + return rleCompress (inSize, _tmpBuffer, (signed char *) _outBuffer); +} + + +int +RleCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case �- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Decode the run-length encoded data + // + + int outSize; + + if (0 == (outSize = rleUncompress (inSize, _maxScanLineSize, + (const signed char *) inPtr, + _tmpBuffer))) + { + throw IEX_NAMESPACE::InputExc ("Data decoding (rle) failed."); + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; + + while (t < stop) + { + int d = int (t[-1]) + int (t[0]) - 128; + t[0] = d; + ++t; + } + } + + // + // Reorder the pixel data. + // + + { + const char *t1 = _tmpBuffer; + const char *t2 = _tmpBuffer + (outSize + 1) / 2; + char *s = _outBuffer; + char *stop = s + outSize; + + while (true) + { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + outPtr = _outBuffer; + return outSize; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfRleCompressor.h b/IlmImf/ImfRleCompressor.h new file mode 100644 index 0000000..af3d30e --- /dev/null +++ b/IlmImf/ImfRleCompressor.h @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_RLE_COMPRESSOR_H +#define INCLUDED_IMF_RLE_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class RleCompressor -- performs run-length encoding +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT RleCompressor: public Compressor +{ + public: + + RleCompressor (const Header &hdr, size_t maxScanLineSize); + virtual ~RleCompressor (); + + virtual int numScanLines () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + private: + + int _maxScanLineSize; + char * _tmpBuffer; + char * _outBuffer; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfScanLineInputFile.cpp b/IlmImf/ImfScanLineInputFile.cpp new file mode 100644 index 0000000..9e13b9f --- /dev/null +++ b/IlmImf/ImfScanLineInputFile.cpp @@ -0,0 +1,1702 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class ScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfScanLineInputFile.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfStdIO.h" +#include "ImfCompressor.h" +#include "ImathBox.h" +#include "ImathFun.h" +#include +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include "ImfVersion.h" +#include "ImfOptimizedPixelReading.h" +#include "ImfNamespace.h" +#include "ImfStandardAttributes.h" + +#include +#include +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::divp; +using IMATH_NAMESPACE::modp; +using std::string; +using std::vector; +using std::ifstream; +using std::min; +using std::max; +using std::sort; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct InSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char * base; + size_t xStride; + size_t yStride; + int xSampling; + int ySampling; + bool fill; + bool skip; + double fillValue; + + InSliceInfo (PixelType typeInFrameBuffer = HALF, + PixelType typeInFile = HALF, + char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + bool fill = false, + bool skip = false, + double fillValue = 0.0); +}; + + +InSliceInfo::InSliceInfo (PixelType tifb, + PixelType tifl, + char *b, + size_t xs, size_t ys, + int xsm, int ysm, + bool f, bool s, + double fv) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + base (b), + xStride (xs), + yStride (ys), + xSampling (xsm), + ySampling (ysm), + fill (f), + skip (s), + fillValue (fv) +{ + // empty +} + + +struct LineBuffer +{ + const char * uncompressedData; + char * buffer; + int dataSize; + int minY; + int maxY; + Compressor * compressor; + Compressor::Format format; + int number; + bool hasException; + string exception; + + LineBuffer (Compressor * const comp); + ~LineBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (Compressor *comp): + uncompressedData (0), + buffer (0), + dataSize (0), + compressor (comp), + format (defaultFormat(compressor)), + number (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +LineBuffer::~LineBuffer () +{ + delete compressor; +} + +/// helper struct used to detect the order that the channels are stored + +struct sliceOptimizationData +{ + const char * base; ///< pointer to pixel data + bool fill; ///< is this channel being filled with constant, instead of read? + half fillValue; ///< if filling, the value to use + size_t offset; ///< position this channel will be in the read buffer, accounting for previous channels, as well as their type + PixelType type; ///< type of channel + size_t xStride; ///< x-stride of channel in buffer (must be set to cause channels to interleave) + size_t yStride; ///< y-stride of channel in buffer (must be same in all channels, else order will change, which is bad) + int xSampling; ///< channel x sampling + int ySampling; ///< channel y sampling + + + /// we need to keep the list sorted in the order they'll be written to memory + bool operator<(const sliceOptimizationData& other ) const + { + return base < other.base; + } +}; + + +} // namespace + + +struct ScanLineInputFile::Data: public Mutex +{ + Header header; // the image header + int version; // file's version + FrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // order of the scanlines in file + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each line + bool fileIsComplete; // True if no scanlines are missing + // in the file + int nextLineBufferMinY; // minimum y of the next linebuffer + vector bytesPerLine; // combined size of a line over all + // channels + vector offsetInLineBuffer; // offset for each scanline in its + // linebuffer + vector slices; // info about channels in file + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each buffer + // holds + size_t lineBufferSize; // size of the line buffer + int partNumber; // part number + + bool memoryMapped; // if the stream is memory mapped + OptimizationMode optimizationMode; // optimizibility of the input file + vector optimizationData; ///< channel ordering for optimized reading + + Data (int numThreads); + ~Data (); + + inline LineBuffer * getLineBuffer (int number); // hash function from line + // buffer indices into our + // vector of line buffers + + +}; + + +ScanLineInputFile::Data::Data (int numThreads): + partNumber(-1), + memoryMapped(false) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers + // + + lineBuffers.resize (max (1, 2 * numThreads)); +} + + +ScanLineInputFile::Data::~Data () +{ + for (size_t i = 0; i < lineBuffers.size(); i++) + delete lineBuffers[i]; +} + + +inline LineBuffer * +ScanLineInputFile::Data::getLineBuffer (int lineBufferNumber) +{ + return lineBuffers[lineBufferNumber % lineBuffers.size()]; +} + + +namespace { + + +void +reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + LineOrder lineOrder, + vector &lineOffsets) +{ + Int64 position = is.tellg(); + + try + { + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + Int64 lineOffset = is.tellg(); + + int y; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, y); + + int dataSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, dataSize); + + Xdr::skip (is, dataSize); + + if (lineOrder == INCREASING_Y) + lineOffsets[i] = lineOffset; + else + lineOffsets[lineOffsets.size() - i - 1] = lineOffset; + } + } + catch (...) + { + // + // Suppress all exceptions. This functions is + // called only to reconstruct the line offset + // table for incomplete files, and exceptions + // are likely. + // + } + + is.clear(); + is.seekg (position); +} + + +void +readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + LineOrder lineOrder, + vector &lineOffsets, + bool &complete) +{ + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, lineOffsets[i]); + } + + complete = true; + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + if (lineOffsets[i] <= 0) + { + // + // Invalid data in the line offset table mean that + // the file is probably incomplete (the table is + // the last thing written to the file). Either + // some process is still busy writing the file, + // or writing the file was aborted. + // + // We should still be able to read the existing + // parts of the file. In order to do this, we + // have to make a sequential scan over the scan + // line data to reconstruct the line offset table. + // + + complete = false; + reconstructLineOffsets (is, lineOrder, lineOffsets); + break; + } + } +} + + +void +readPixelData (InputStreamMutex *streamData, + ScanLineInputFile::Data *ifd, + int minY, + char *&buffer, + int &dataSize) +{ + // + // Read a single line buffer from the input file. + // + // If the input file is not memory-mapped, we copy the pixel data into + // into the array pointed to by buffer. If the file is memory-mapped, + // then we change where buffer points to instead of writing into the + // array (hence buffer needs to be a reference to a char *). + // + + int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer; + + Int64 lineOffset = ifd->lineOffsets[lineBufferNumber]; + + if (lineOffset == 0) + THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing."); + + // + // Seek to the start of the scan line in the file, + // if necessary. + // + + if ( !isMultiPart(ifd->version) ) + { + if (ifd->nextLineBufferMinY != minY) + streamData->is->seekg (lineOffset); + } + else + { + // + // In a multi-part file, the file pointer may have been moved by + // other parts, so we have to ask tellg() where we are. + // + if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber]) + streamData->is->seekg (lineOffset); + } + + // + // Read the data block's header. + // + + int yInFile; + + // + // Read the part number when we are dealing with a multi-part file. + // + if (isMultiPart(ifd->version)) + { + int partNumber; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, partNumber); + if (partNumber != ifd->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << ifd->partNumber << "."); + } + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, yInFile); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, dataSize); + + if (yInFile != minY) + throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate."); + + if (dataSize > (int) ifd->lineBufferSize) + throw IEX_NAMESPACE::InputExc ("Unexpected data block length."); + + // + // Read the pixel data. + // + + if (streamData->is->isMemoryMapped ()) + buffer = streamData->is->readMemoryMapped (dataSize); + else + streamData->is->read (buffer, dataSize); + + // + // Keep track of which scan line is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + if (ifd->lineOrder == INCREASING_Y) + ifd->nextLineBufferMinY = minY + ifd->linesInBuffer; + else + ifd->nextLineBufferMinY = minY - ifd->linesInBuffer; +} + + + +// +// A LineBufferTask encapsulates the task uncompressing a set of +// scanlines (line buffer) and copying them into the frame buffer. +// + +class LineBufferTask : public Task +{ + public: + + LineBufferTask (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax, + OptimizationMode optimizationMode); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + ScanLineInputFile::Data * _ifd; + LineBuffer * _lineBuffer; + int _scanLineMin; + int _scanLineMax; + OptimizationMode _optimizationMode; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax,OptimizationMode optimizationMode) +: + Task (group), + _ifd (ifd), + _lineBuffer (lineBuffer), + _scanLineMin (scanLineMin), + _scanLineMax (scanLineMax), + _optimizationMode(optimizationMode) +{ + // empty +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // Uncompress the data, if necessary + // + + if (_lineBuffer->uncompressedData == 0) + { + int uncompressedSize = 0; + int maxY = min (_lineBuffer->maxY, _ifd->maxY); + + for (int i = _lineBuffer->minY - _ifd->minY; + i <= maxY - _ifd->minY; + ++i) + { + uncompressedSize += (int) _ifd->bytesPerLine[i]; + } + + if (_lineBuffer->compressor && + _lineBuffer->dataSize < uncompressedSize) + { + _lineBuffer->format = _lineBuffer->compressor->format(); + + _lineBuffer->dataSize = _lineBuffer->compressor->uncompress + (_lineBuffer->buffer, + _lineBuffer->dataSize, + _lineBuffer->minY, + _lineBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _lineBuffer->format = Compressor::XDR; + _lineBuffer->uncompressedData = _lineBuffer->buffer; + } + } + + int yStart, yStop, dy; + + if (_ifd->lineOrder == INCREASING_Y) + { + yStart = _scanLineMin; + yStop = _scanLineMax + 1; + dy = 1; + } + else + { + yStart = _scanLineMax; + yStop = _scanLineMin - 1; + dy = -1; + } + + for (int y = yStart; y != yStop; y += dy) + { + // + // Convert one scan line's worth of pixel data back + // from the machine-independent representation, and + // store the result in the frame buffer. + // + + const char *readPtr = _lineBuffer->uncompressedData + + _ifd->offsetInLineBuffer[y - _ifd->minY]; + + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + const InSliceInfo &slice = _ifd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the x coordinates of the leftmost and rightmost + // sampled pixels (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (_ifd->minX, slice.xSampling); + int dMaxX = divp (_ifd->maxX, slice.xSampling); + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, dMaxX - dMinX + 1); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + char *linePtr = slice.base + + divp (y, slice.ySampling) * + slice.yStride; + + char *writePtr = linePtr + dMinX * slice.xStride; + char *endPtr = linePtr + dMaxX * slice.xStride; + + copyIntoFrameBuffer (readPtr, writePtr, endPtr, + slice.xStride, slice.fill, + slice.fillValue, _lineBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what(); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + + +#ifdef IMF_HAVE_SSE2 +// +// IIF format is more restricted than a perfectly generic one, +// so it is possible to perform some optimizations. +// +class LineBufferTaskIIF : public Task +{ + public: + + LineBufferTaskIIF (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax, + OptimizationMode optimizationMode); + + virtual ~LineBufferTaskIIF (); + + virtual void execute (); + + template + void getWritePointer (int y, + unsigned short*& pOutWritePointerRight, + size_t& outPixelsToCopySSE, + size_t& outPixelsToCopyNormal,int bank=0) const; + + template + void getWritePointerStereo (int y, + unsigned short*& outWritePointerRight, + unsigned short*& outWritePointerLeft, + size_t& outPixelsToCopySSE, + size_t& outPixelsToCopyNormal) const; + + private: + + ScanLineInputFile::Data * _ifd; + LineBuffer * _lineBuffer; + int _scanLineMin; + int _scanLineMax; + OptimizationMode _optimizationMode; + +}; + +LineBufferTaskIIF::LineBufferTaskIIF + (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax, + OptimizationMode optimizationMode + ) + : + Task (group), + _ifd (ifd), + _lineBuffer (lineBuffer), + _scanLineMin (scanLineMin), + _scanLineMax (scanLineMax), + _optimizationMode (optimizationMode) +{ + /* + // + // indicates the optimised path has been taken + // + static bool could_optimise=false; + if(could_optimise==false) + { + std::cerr << " optimised path\n"; + could_optimise=true; + } + */ +} + +LineBufferTaskIIF::~LineBufferTaskIIF () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + +// Return 0 if we are to skip because of sampling +// channelBank is 0 for the first group of channels, 1 for the second +template +void LineBufferTaskIIF::getWritePointer + (int y, + unsigned short*& outWritePointerRight, + size_t& outPixelsToCopySSE, + size_t& outPixelsToCopyNormal, + int channelBank + ) const +{ + // Channels are saved alphabetically, so the order is B G R. + // The last slice (R) will give us the location of our write pointer. + // The only slice that we support skipping is alpha, i.e. the first one. + // This does not impact the write pointer or the pixels to copy at all. + + size_t nbSlicesInBank = _ifd->optimizationData.size(); + + int sizeOfSingleValue = sizeof(TYPE); + + if(_ifd->optimizationData.size()>4) + { + // there are two banks - we only copy one at once + nbSlicesInBank/=2; + } + + + size_t firstChannel = 0; + if(channelBank==1) + { + firstChannel = _ifd->optimizationData.size()/2; + } + + sliceOptimizationData& firstSlice = _ifd->optimizationData[firstChannel]; + + if (modp (y, firstSlice.ySampling) != 0) + { + outPixelsToCopySSE = 0; + outPixelsToCopyNormal = 0; + outWritePointerRight = 0; + } + + const char* linePtr1 = firstSlice.base + + divp (y, firstSlice.ySampling) * + firstSlice.yStride; + + int dMinX1 = divp (_ifd->minX, firstSlice.xSampling); + int dMaxX1 = divp (_ifd->maxX, firstSlice.xSampling); + + // Construct the writePtr so that we start writing at + // linePtr + Min offset in the line. + outWritePointerRight = (unsigned short*)(linePtr1 + + dMinX1 * firstSlice.xStride ); + + size_t bytesToCopy = ((linePtr1 + dMaxX1 * firstSlice.xStride ) - + (linePtr1 + dMinX1 * firstSlice.xStride )) + 2; + size_t shortsToCopy = bytesToCopy / sizeOfSingleValue; + size_t pixelsToCopy = (shortsToCopy / nbSlicesInBank ) + 1; + + // We only support writing to SSE if we have no pixels to copy normally + outPixelsToCopySSE = pixelsToCopy / 8; + outPixelsToCopyNormal = pixelsToCopy % 8; + +} + + +template +void LineBufferTaskIIF::getWritePointerStereo + (int y, + unsigned short*& outWritePointerRight, + unsigned short*& outWritePointerLeft, + size_t& outPixelsToCopySSE, + size_t& outPixelsToCopyNormal) const +{ + getWritePointer(y,outWritePointerRight,outPixelsToCopySSE,outPixelsToCopyNormal,0); + + + if(outWritePointerRight) + { + getWritePointer(y,outWritePointerLeft,outPixelsToCopySSE,outPixelsToCopyNormal,1); + } + +} + +void +LineBufferTaskIIF::execute() +{ + try + { + // + // Uncompress the data, if necessary + // + + if (_lineBuffer->uncompressedData == 0) + { + int uncompressedSize = 0; + int maxY = min (_lineBuffer->maxY, _ifd->maxY); + + for (int i = _lineBuffer->minY - _ifd->minY; + i <= maxY - _ifd->minY; + ++i) + { + uncompressedSize += (int) _ifd->bytesPerLine[i]; + } + + if (_lineBuffer->compressor && + _lineBuffer->dataSize < uncompressedSize) + { + _lineBuffer->format = _lineBuffer->compressor->format(); + + _lineBuffer->dataSize = + _lineBuffer->compressor->uncompress (_lineBuffer->buffer, + _lineBuffer->dataSize, + _lineBuffer->minY, + _lineBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _lineBuffer->format = Compressor::XDR; + _lineBuffer->uncompressedData = _lineBuffer->buffer; + } + } + + int yStart, yStop, dy; + + if (_ifd->lineOrder == INCREASING_Y) + { + yStart = _scanLineMin; + yStop = _scanLineMax + 1; + dy = 1; + } + else + { + yStart = _scanLineMax; + yStop = _scanLineMin - 1; + dy = -1; + } + + for (int y = yStart; y != yStop; y += dy) + { + if (modp (y, _optimizationMode._ySampling) != 0) + continue; + + // + // Convert one scan line's worth of pixel data back + // from the machine-independent representation, and + // store the result in the frame buffer. + // + + // Set the readPtr to read at the start of uncompressedData + // but with an offet based on calculated array. + // _ifd->offsetInLineBuffer contains offsets based on which + // line we are currently processing. + // Stride will be taken into consideration later. + + + const char* readPtr = _lineBuffer->uncompressedData + + _ifd->offsetInLineBuffer[y - _ifd->minY]; + + size_t pixelsToCopySSE = 0; + size_t pixelsToCopyNormal = 0; + + unsigned short* writePtrLeft = 0; + unsigned short* writePtrRight = 0; + + size_t channels = _ifd->optimizationData.size(); + + if(channels>4) + { + getWritePointerStereo(y, writePtrRight, writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); + } + else + { + getWritePointer(y, writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); + } + + if (writePtrRight == 0 && pixelsToCopySSE == 0 && pixelsToCopyNormal == 0) + { + continue; + } + + + // + // support reading up to eight channels + // + unsigned short* readPointers[8]; + + for (size_t i = 0; i < channels ; ++i) + { + readPointers[i] = (unsigned short*)readPtr + (_ifd->optimizationData[i].offset * (pixelsToCopySSE * 8 + pixelsToCopyNormal)); + } + + //RGB only + if(channels==3 || channels == 6 ) + { + optimizedWriteToRGB(readPointers[0], readPointers[1], readPointers[2], writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); + + //stereo RGB + if( channels == 6) + { + optimizedWriteToRGB(readPointers[3], readPointers[4], readPointers[5], writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); + } + //RGBA + }else if(channels==4 || channels==8) + { + + if(_ifd->optimizationData[3].fill) + { + optimizedWriteToRGBAFillA(readPointers[0], readPointers[1], readPointers[2], _ifd->optimizationData[3].fillValue.bits() , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); + }else{ + optimizedWriteToRGBA(readPointers[0], readPointers[1], readPointers[2], readPointers[3] , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal); + } + + //stereo RGBA + if( channels == 8) + { + if(_ifd->optimizationData[7].fill) + { + optimizedWriteToRGBAFillA(readPointers[4], readPointers[5], readPointers[6], _ifd->optimizationData[7].fillValue.bits() , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); + }else{ + optimizedWriteToRGBA(readPointers[4], readPointers[5], readPointers[6], readPointers[7] , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal); + } + } + } + else { + throw(IEX_NAMESPACE::LogicExc("IIF mode called with incorrect channel pattern")); + } + + // If we are in NO_OPTIMIZATION mode, this class will never + // get instantiated, so no need to check for it and duplicate + // the code. + } + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what(); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} +#endif + + +Task * +newLineBufferTask (TaskGroup *group, + InputStreamMutex *streamData, + ScanLineInputFile::Data *ifd, + int number, + int scanLineMin, + int scanLineMax, + OptimizationMode optimizationMode) +{ + // + // Wait for a line buffer to become available, fill the line + // buffer with raw data from the file if necessary, and create + // a new LineBufferTask whose execute() method will uncompress + // the contents of the buffer and copy the pixels into the + // frame buffer. + // + + LineBuffer *lineBuffer = ifd->getLineBuffer (number); + + try + { + lineBuffer->wait (); + + if (lineBuffer->number != number) + { + lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer; + lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1; + + lineBuffer->number = number; + lineBuffer->uncompressedData = 0; + + readPixelData (streamData, ifd, lineBuffer->minY, + lineBuffer->buffer, + lineBuffer->dataSize); + } + } + catch (std::exception &e) + { + if (!lineBuffer->hasException) + { + lineBuffer->exception = e.what(); + lineBuffer->hasException = true; + } + lineBuffer->number = -1; + lineBuffer->post(); + throw; + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the line buffer is free, and + // re-throw the exception. + // + + lineBuffer->exception = "unrecognized exception"; + lineBuffer->hasException = true; + lineBuffer->number = -1; + lineBuffer->post(); + throw; + } + + scanLineMin = max (lineBuffer->minY, scanLineMin); + scanLineMax = min (lineBuffer->maxY, scanLineMax); + + + Task* retTask = 0; + +#ifdef IMF_HAVE_SSE2 + if (optimizationMode._optimizable) + { + + retTask = new LineBufferTaskIIF (group, ifd, lineBuffer, + scanLineMin, scanLineMax, + optimizationMode); + + } + else +#endif + { + retTask = new LineBufferTask (group, ifd, lineBuffer, + scanLineMin, scanLineMax, + optimizationMode); + } + + return retTask; + + } + + + + +} // namespace + + +void ScanLineInputFile::initialize(const Header& header) +{ + try + { + _data->header = header; + + _data->lineOrder = _data->header.lineOrder(); + + const Box2i &dataWindow = _data->header.dataWindow(); + + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + size_t maxBytesPerLine = bytesPerLineTable (_data->header, + _data->bytesPerLine); + + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + { + _data->lineBuffers[i] = new LineBuffer (newCompressor + (_data->header.compression(), + maxBytesPerLine, + _data->header)); + } + + _data->linesInBuffer = + numLinesInBuffer (_data->lineBuffers[0]->compressor); + + _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; + + if (!_streamData->is->isMemoryMapped()) + { + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + { + _data->lineBuffers[i]->buffer = (char *) EXRAllocAligned(_data->lineBufferSize*sizeof(char),16); + } + } + _data->nextLineBufferMinY = _data->minY - 1; + + offsetInLineBufferTable (_data->bytesPerLine, + _data->linesInBuffer, + _data->offsetInLineBuffer); + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + _data->linesInBuffer) / _data->linesInBuffer; + + _data->lineOffsets.resize (lineOffsetSize); + } + catch (...) + { + delete _data; + _data=NULL; + throw; + } +} + + +ScanLineInputFile::ScanLineInputFile(InputPartData* part) +{ + if (part->header.type() != SCANLINEIMAGE) + throw IEX_NAMESPACE::ArgExc("Can't build a ScanLineInputFile from a type-mismatched part."); + + _data = new Data(part->numThreads); + _streamData = part->mutex; + _data->memoryMapped = _streamData->is->isMemoryMapped(); + + _data->version = part->version; + + initialize(part->header); + + _data->lineOffsets = part->chunkOffsets; + + _data->partNumber = part->partNumber; + // + // (TODO) change this code later. + // The completeness of the file should be detected in MultiPartInputFile. + // + _data->fileIsComplete = true; +} + + +ScanLineInputFile::ScanLineInputFile + (const Header &header, + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int numThreads) +: + _data (new Data (numThreads)), + _streamData (new InputStreamMutex()) +{ + _streamData->is = is; + _data->memoryMapped = is->isMemoryMapped(); + + initialize(header); + + // + // (TODO) this is nasty - we need a better way of working out what type of file has been used. + // in any case I believe this constructor only gets used with single part files + // and 'version' currently only tracks multipart state, so setting to 0 (not multipart) works for us + // + + _data->version=0; + readLineOffsets (*_streamData->is, + _data->lineOrder, + _data->lineOffsets, + _data->fileIsComplete); +} + + +ScanLineInputFile::~ScanLineInputFile () +{ + if (!_data->memoryMapped) + { + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + { + EXRFreeAligned(_data->lineBuffers[i]->buffer); + } + } + + + // + // ScanLineInputFile should never delete the stream, + // because it does not own the stream. + // We just delete the Mutex here. + // + if (_data->partNumber == -1) + delete _streamData; + + delete _data; +} + + +const char * +ScanLineInputFile::fileName () const +{ + return _streamData->is->fileName(); +} + + +const Header & +ScanLineInputFile::header () const +{ + return _data->header; +} + + +int +ScanLineInputFile::version () const +{ + return _data->version; +} + + +namespace +{ + + +// returns the optimization state for the given arrangement of frame bufers +// this assumes: +// both the file and framebuffer are half float data +// both the file and framebuffer have xSampling and ySampling=1 +// entries in optData are sorted into their interleave order (i.e. by base address) +// These tests are done by SetFrameBuffer as it is building optData +// +OptimizationMode +detectOptimizationMode (const vector& optData) +{ + OptimizationMode w; + + // need to be compiled with SSE optimisations: if not, just returns false +#if IMF_HAVE_SSE2 + + + // only handle reading 3,4,6 or 8 channels + switch(optData.size()) + { + case 3 : break; + case 4 : break; + case 6 : break; + case 8 : break; + default : + return w; + } + + // + // the point at which data switches between the primary and secondary bank + // + size_t bankSize = optData.size()>4 ? optData.size()/2 : optData.size(); + + for(size_t i=0;iheader.channels(); + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // optimization is possible if this is a little endian system + // and both inputs and outputs are half floats + // + bool optimizationPossible = true; + + if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) + { + optimizationPossible =false; + } + + vector optData; + + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + // current offset of channel: pixel data starts at offset*width into the + // decompressed scanline buffer + size_t offset = 0; + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (InSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + i.channel().xSampling, + i.channel().ySampling, + false, // fill + true, // skip + 0.0)); // fillValue + + switch(i.channel().type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : + offset++; + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : + offset+=2; + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : + offset+=2; + break; + } + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (InSliceInfo (j.slice().type, + fill? j.slice().type: + i.channel().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + j.slice().xSampling, + j.slice().ySampling, + fill, + false, // skip + j.slice().fillValue)); + + if(!fill && i.channel().type!=OPENEXR_IMF_INTERNAL_NAMESPACE::HALF) + { + optimizationPossible = false; + } + + if(j.slice().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF) + { + optimizationPossible = false; + } + if(j.slice().xSampling!=1 || j.slice().ySampling!=1) + { + optimizationPossible = false; + } + + + if(optimizationPossible) + { + sliceOptimizationData dat; + dat.base = j.slice().base; + dat.fill = fill; + dat.fillValue = j.slice().fillValue; + dat.offset = offset; + dat.xStride = j.slice().xStride; + dat.yStride = j.slice().yStride; + dat.xSampling = j.slice().xSampling; + dat.ySampling = j.slice().ySampling; + optData.push_back(dat); + } + + if(!fill) + { + switch(i.channel().type) + { + case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF : + offset++; + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT : + offset+=2; + break; + case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT : + offset+=2; + break; + } + } + + + + if (i != channels.end() && !fill) + ++i; + } + + + if(optimizationPossible) + { + // + // check optimisibility + // based on channel ordering and fill channel positions + // + sort(optData.begin(),optData.end()); + _data->optimizationMode = detectOptimizationMode(optData); + } + + if(!optimizationPossible || _data->optimizationMode._optimizable==false) + { + optData = vector(); + _data->optimizationMode._optimizable=false; + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; + _data->optimizationData = optData; +} + + +const FrameBuffer & +ScanLineInputFile::frameBuffer () const +{ + Lock lock (*_streamData); + return _data->frameBuffer; +} + + +bool +ScanLineInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + +bool ScanLineInputFile::isOptimizationEnabled() const +{ + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + return _data->optimizationMode._optimizable; +} + + +void +ScanLineInputFile::readPixels (int scanLine1, int scanLine2) +{ + try + { + Lock lock (*_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + int scanLineMin = min (scanLine1, scanLine2); + int scanLineMax = max (scanLine1, scanLine2); + + if (scanLineMin < _data->minY || scanLineMax > _data->maxY) + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + + // + // We impose a numbering scheme on the lineBuffers where the first + // scanline is contained in lineBuffer 1. + // + // Determine the first and last lineBuffer numbers in this scanline + // range. We always attempt to read the scanlines in the order that + // they are stored in the file. + // + + int start, stop, dl; + + if (_data->lineOrder == INCREASING_Y) + { + start = (scanLineMin - _data->minY) / _data->linesInBuffer; + stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1; + dl = 1; + } + else + { + start = (scanLineMax - _data->minY) / _data->linesInBuffer; + stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1; + dl = -1; + } + + // + // Create a task group for all line buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add the line buffer tasks. + // + // The tasks will execute in the order that they are created + // because we lock the line buffers during construction and the + // constructors are called by the main thread. Hence, in order + // for a successive task to execute the previous task which + // used that line buffer must have completed already. + // + + for (int l = start; l != stop; l += dl) + { + ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup, + _streamData, + _data, l, + scanLineMin, + scanLineMax, + _data->optimizationMode)); + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to ScanLineInputFile::readPixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +ScanLineInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +void +ScanLineInputFile::rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + Lock lock (*_streamData); + + if (firstScanLine < _data->minY || firstScanLine > _data->maxY) + { + throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + } + + int minY = lineBufferMinY + (firstScanLine, _data->minY, _data->linesInBuffer); + + readPixelData + (_streamData, _data, minY, _data->lineBuffers[0]->buffer, pixelDataSize); + + pixelData = _data->lineBuffers[0]->buffer; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfScanLineInputFile.h b/IlmImf/ImfScanLineInputFile.h new file mode 100644 index 0000000..4f5e2da --- /dev/null +++ b/IlmImf/ImfScanLineInputFile.h @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H +#define INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class ScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImfThreading.h" +#include "ImfInputStreamMutex.h" +#include "ImfInputPartData.h" +#include "ImfGenericInputFile.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT ScanLineInputFile : public GenericInputFile +{ + public: + + //------------ + // Constructor + //------------ + + ScanLineInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int numThreads = globalThreadCount()); + + + //----------------------------------------- + // Destructor -- deallocates internal data + // structures, but does not close the file. + //----------------------------------------- + + virtual ~ScanLineInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + + //--------------------------------------------------------------- + // Check if SSE optimisation is enabled + // + // Call after setFrameBuffer() to query whether optimised file decoding + // is available - decode times will be faster if returns true + // + // Optimisation depends on the framebuffer channels and channel types + // as well as the file/part channels and channel types, as well as + // whether SSE2 instruction support was detected at compile time + // + // Calling before setFrameBuffer will throw an exception + // + //--------------------------------------------------------------- + + bool isOptimizationEnabled () const; + + + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + // If threading is enabled, readPixels (s1, s2) tries to perform + // decopmression of multiple scanlines in parallel. + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + Data * _data; + + InputStreamMutex* _streamData; + + ScanLineInputFile (InputPartData* part); + + void initialize(const Header& header); + + friend class MultiPartInputFile; + friend class InputFile; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfSimd.h b/IlmImf/ImfSimd.h new file mode 100644 index 0000000..09b1042 --- /dev/null +++ b/IlmImf/ImfSimd.h @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Autodesk, Inc. +// +// All rights reserved. +// +// Implementation of IIF-specific file format and speed optimizations +// provided by Innobec Technologies inc on behalf of Autodesk. +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_SIMD_H +#define INCLUDED_IMF_SIMD_H + +// +// Compile time SSE detection: +// IMF_HAVE_SSE2 - Defined if it's safe to compile SSE2 optimizations +// + + +// GCC and Visual Studio SSE2 compiler flags +#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) + #define IMF_HAVE_SSE2 1 +#endif + +extern "C" +{ +#if IMF_HAVE_SSE2 + #include + #include +#endif +} + +#endif diff --git a/IlmImf/ImfStandardAttributes.cpp b/IlmImf/ImfStandardAttributes.cpp new file mode 100644 index 0000000..df952c2 --- /dev/null +++ b/IlmImf/ImfStandardAttributes.cpp @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Optional Standard Attributes +// +//----------------------------------------------------------------------------- + +#include + + +#define IMF_STRING(name) #name + +#define IMF_STD_ATTRIBUTE_IMP(name,suffix,type) \ + \ + void \ + add##suffix (Header &header, const type &value) \ + { \ + header.insert (IMF_STRING (name), TypedAttribute (value)); \ + } \ + \ + bool \ + has##suffix (const Header &header) \ + { \ + return header.findTypedAttribute > \ + (IMF_STRING (name)) != 0; \ + } \ + \ + const TypedAttribute & \ + name##Attribute (const Header &header) \ + { \ + return header.typedAttribute > \ + (IMF_STRING (name)); \ + } \ + \ + TypedAttribute & \ + name##Attribute (Header &header) \ + { \ + return header.typedAttribute > \ + (IMF_STRING (name)); \ + } \ + \ + const type & \ + name (const Header &header) \ + { \ + return name##Attribute(header).value(); \ + } \ + \ + type & \ + name (Header &header) \ + { \ + return name##Attribute(header).value(); \ + } + +#include "ImfNamespace.h" + +using namespace IMATH_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +IMF_STD_ATTRIBUTE_IMP (chromaticities, Chromaticities, Chromaticities) +IMF_STD_ATTRIBUTE_IMP (whiteLuminance, WhiteLuminance, float) +IMF_STD_ATTRIBUTE_IMP (adoptedNeutral, AdoptedNeutral, V2f) +IMF_STD_ATTRIBUTE_IMP (renderingTransform, RenderingTransform, string) +IMF_STD_ATTRIBUTE_IMP (lookModTransform, LookModTransform, string) +IMF_STD_ATTRIBUTE_IMP (xDensity, XDensity, float) +IMF_STD_ATTRIBUTE_IMP (owner, Owner, string) +IMF_STD_ATTRIBUTE_IMP (comments, Comments, string) +IMF_STD_ATTRIBUTE_IMP (capDate, CapDate, string) +IMF_STD_ATTRIBUTE_IMP (utcOffset, UtcOffset, float) +IMF_STD_ATTRIBUTE_IMP (longitude, Longitude, float) +IMF_STD_ATTRIBUTE_IMP (latitude, Latitude, float) +IMF_STD_ATTRIBUTE_IMP (altitude, Altitude, float) +IMF_STD_ATTRIBUTE_IMP (focus, Focus, float) +IMF_STD_ATTRIBUTE_IMP (expTime, ExpTime, float) +IMF_STD_ATTRIBUTE_IMP (aperture, Aperture, float) +IMF_STD_ATTRIBUTE_IMP (isoSpeed, IsoSpeed, float) +IMF_STD_ATTRIBUTE_IMP (envmap, Envmap, Envmap) +IMF_STD_ATTRIBUTE_IMP (keyCode, KeyCode, KeyCode) +IMF_STD_ATTRIBUTE_IMP (timeCode, TimeCode, TimeCode) +IMF_STD_ATTRIBUTE_IMP (wrapmodes, Wrapmodes, string) +IMF_STD_ATTRIBUTE_IMP (framesPerSecond, FramesPerSecond, Rational) +IMF_STD_ATTRIBUTE_IMP (multiView, MultiView, StringVector) +IMF_STD_ATTRIBUTE_IMP (worldToCamera, WorldToCamera, M44f) +IMF_STD_ATTRIBUTE_IMP (worldToNDC, WorldToNDC, M44f) +IMF_STD_ATTRIBUTE_IMP (deepImageState, DeepImageState, DeepImageState) +IMF_STD_ATTRIBUTE_IMP (originalDataWindow, OriginalDataWindow, Box2i) +IMF_STD_ATTRIBUTE_IMP (dwaCompressionLevel, DwaCompressionLevel, float) + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfStandardAttributes.h b/IlmImf/ImfStandardAttributes.h new file mode 100644 index 0000000..4280ac4 --- /dev/null +++ b/IlmImf/ImfStandardAttributes.h @@ -0,0 +1,382 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_STANDARD_ATTRIBUTES_H +#define INCLUDED_IMF_STANDARD_ATTRIBUTES_H + +//----------------------------------------------------------------------------- +// +// Optional Standard Attributes -- these attributes are "optional" +// because not every image file header has them, but they define a +// "standard" way to represent commonly used data in the file header. +// +// For each attribute, with name "foo", and type "T", the following +// functions are automatically generated via macros: +// +// void addFoo (Header &header, const T &value); +// bool hasFoo (const Header &header); +// const TypedAttribute & fooAttribute (const Header &header); +// TypedAttribute & fooAttribute (Header &header); +// const T & foo (const Header &Header); +// T & foo (Header &Header); +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfBoxAttribute.h" +#include "ImfChromaticitiesAttribute.h" +#include "ImfEnvmapAttribute.h" +#include "ImfDeepImageStateAttribute.h" +#include "ImfFloatAttribute.h" +#include "ImfKeyCodeAttribute.h" +#include "ImfMatrixAttribute.h" +#include "ImfRationalAttribute.h" +#include "ImfStringAttribute.h" +#include "ImfStringVectorAttribute.h" +#include "ImfTimeCodeAttribute.h" +#include "ImfVecAttribute.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +#define IMF_STD_ATTRIBUTE_DEF(name,suffix,object) \ + \ + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER \ + IMF_EXPORT void add##suffix (Header &header, const object &v); \ + IMF_EXPORT bool has##suffix (const Header &header); \ + IMF_EXPORT const TypedAttribute & \ + name##Attribute (const Header &header); \ + IMF_EXPORT TypedAttribute & \ + name##Attribute (Header &header); \ + IMF_EXPORT const object & \ + name (const Header &header); \ + IMF_EXPORT object & name (Header &header); \ + OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT \ + +// +// chromaticities -- for RGB images, specifies the CIE (x,y) +// chromaticities of the primaries and the white point +// + +IMF_STD_ATTRIBUTE_DEF (chromaticities, Chromaticities, Chromaticities) + + +// +// whiteLuminance -- for RGB images, defines the luminance, in Nits +// (candelas per square meter) of the RGB value (1.0, 1.0, 1.0). +// +// If the chromaticities and the whiteLuminance of an RGB image are +// known, then it is possible to convert the image's pixels from RGB +// to CIE XYZ tristimulus values (see function RGBtoXYZ() in header +// file ImfChromaticities.h). +// +// + +IMF_STD_ATTRIBUTE_DEF (whiteLuminance, WhiteLuminance, float) + + +// +// adoptedNeutral -- specifies the CIE (x,y) coordinates that should +// be considered neutral during color rendering. Pixels in the image +// file whose (x,y) coordinates match the adoptedNeutral value should +// be mapped to neutral values on the display. +// + +IMF_STD_ATTRIBUTE_DEF (adoptedNeutral, AdoptedNeutral, IMATH_NAMESPACE::V2f) + + +// +// renderingTransform, lookModTransform -- specify the names of the +// CTL functions that implements the intended color rendering and look +// modification transforms for this image. +// + +IMF_STD_ATTRIBUTE_DEF (renderingTransform, RenderingTransform, std::string) +IMF_STD_ATTRIBUTE_DEF (lookModTransform, LookModTransform, std::string) + + +// +// xDensity -- horizontal output density, in pixels per inch. +// The image's vertical output density is xDensity * pixelAspectRatio. +// + +IMF_STD_ATTRIBUTE_DEF (xDensity, XDensity, float) + + +// +// owner -- name of the owner of the image +// + +IMF_STD_ATTRIBUTE_DEF (owner, Owner, std::string) + + +// +// comments -- additional image information in human-readable +// form, for example a verbal description of the image +// + +IMF_STD_ATTRIBUTE_DEF (comments, Comments, std::string) + + +// +// capDate -- the date when the image was created or captured, +// in local time, and formatted as +// +// YYYY:MM:DD hh:mm:ss +// +// where YYYY is the year (4 digits, e.g. 2003), MM is the month +// (2 digits, 01, 02, ... 12), DD is the day of the month (2 digits, +// 01, 02, ... 31), hh is the hour (2 digits, 00, 01, ... 23), mm +// is the minute, and ss is the second (2 digits, 00, 01, ... 59). +// +// + +IMF_STD_ATTRIBUTE_DEF (capDate, CapDate, std::string) + + +// +// utcOffset -- offset of local time at capDate from +// Universal Coordinated Time (UTC), in seconds: +// +// UTC == local time + utcOffset +// + +IMF_STD_ATTRIBUTE_DEF (utcOffset, UtcOffset, float) + + +// +// longitude, latitude, altitude -- for images of real objects, the +// location where the image was recorded. Longitude and latitude are +// in degrees east of Greenwich and north of the equator. Altitude +// is in meters above sea level. For example, Kathmandu, Nepal is +// at longitude 85.317, latitude 27.717, altitude 1305. +// + +IMF_STD_ATTRIBUTE_DEF (longitude, Longitude, float) +IMF_STD_ATTRIBUTE_DEF (latitude, Latitude, float) +IMF_STD_ATTRIBUTE_DEF (altitude, Altitude, float) + + +// +// focus -- the camera's focus distance, in meters +// + +IMF_STD_ATTRIBUTE_DEF (focus, Focus, float) + + +// +// exposure -- exposure time, in seconds +// + +IMF_STD_ATTRIBUTE_DEF (expTime, ExpTime, float) + + +// +// aperture -- the camera's lens aperture, in f-stops (focal length +// of the lens divided by the diameter of the iris opening) +// + +IMF_STD_ATTRIBUTE_DEF (aperture, Aperture, float) + + +// +// isoSpeed -- the ISO speed of the film or image sensor +// that was used to record the image +// + +IMF_STD_ATTRIBUTE_DEF (isoSpeed, IsoSpeed, float) + + +// +// envmap -- if this attribute is present, the image represents +// an environment map. The attribute's value defines how 3D +// directions are mapped to 2D pixel locations. For details +// see header file ImfEnvmap.h +// + +IMF_STD_ATTRIBUTE_DEF (envmap, Envmap, Envmap) + + +// +// keyCode -- for motion picture film frames. Identifies film +// manufacturer, film type, film roll and frame position within +// the roll. +// + +IMF_STD_ATTRIBUTE_DEF (keyCode, KeyCode, KeyCode) + + +// +// timeCode -- time and control code +// + +IMF_STD_ATTRIBUTE_DEF (timeCode, TimeCode, TimeCode) + + +// +// wrapmodes -- determines how texture map images are extrapolated. +// If an OpenEXR file is used as a texture map for 3D rendering, +// texture coordinates (0.0, 0.0) and (1.0, 1.0) correspond to +// the upper left and lower right corners of the data window. +// If the image is mapped onto a surface with texture coordinates +// outside the zero-to-one range, then the image must be extrapolated. +// This attribute tells the renderer how to do this extrapolation. +// The attribute contains either a pair of comma-separated keywords, +// to specify separate extrapolation modes for the horizontal and +// vertical directions; or a single keyword, to specify extrapolation +// in both directions (e.g. "clamp,periodic" or "clamp"). Extra white +// space surrounding the keywords is allowed, but should be ignored +// by the renderer ("clamp, black " is equivalent to "clamp,black"). +// The keywords listed below are predefined; some renderers may support +// additional extrapolation modes: +// +// black pixels outside the zero-to-one range are black +// +// clamp texture coordinates less than 0.0 and greater +// than 1.0 are clamped to 0.0 and 1.0 respectively +// +// periodic the texture image repeats periodically +// +// mirror the texture image repeats periodically, but +// every other instance is mirrored +// + +IMF_STD_ATTRIBUTE_DEF (wrapmodes, Wrapmodes, std::string) + + +// +// framesPerSecond -- defines the nominal playback frame rate for image +// sequences, in frames per second. Every image in a sequence should +// have a framesPerSecond attribute, and the attribute value should be +// the same for all images in the sequence. If an image sequence has +// no framesPerSecond attribute, playback software should assume that +// the frame rate for the sequence is 24 frames per second. +// +// In order to allow exact representation of NTSC frame and field rates, +// framesPerSecond is stored as a rational number. A rational number is +// a pair of integers, n and d, that represents the value n/d. +// +// For the exact values of commonly used frame rates, please see header +// file ImfFramesPerSecond.h. +// + +IMF_STD_ATTRIBUTE_DEF (framesPerSecond, FramesPerSecond, Rational) + + +// +// multiView -- defines the view names for multi-view image files. +// A multi-view image contains two or more views of the same scene, +// as seen from different viewpoints, for example a left-eye and +// a right-eye view for stereo displays. The multiView attribute +// lists the names of the views in an image, and a naming convention +// identifies the channels that belong to each view. +// +// For details, please see header file ImfMultiView.h +// + +IMF_STD_ATTRIBUTE_DEF (multiView , MultiView, StringVector) + + +// +// worldToCamera -- for images generated by 3D computer graphics rendering, +// a matrix that transforms 3D points from the world to the camera coordinate +// space of the renderer. +// +// The camera coordinate space is left-handed. Its origin indicates the +// location of the camera. The positive x and y axes correspond to the +// "right" and "up" directions in the rendered image. The positive z +// axis indicates the camera's viewing direction. (Objects in front of +// the camera have positive z coordinates.) +// +// Camera coordinate space in OpenEXR is the same as in Pixar's Renderman. +// + +IMF_STD_ATTRIBUTE_DEF (worldToCamera, WorldToCamera, IMATH_NAMESPACE::M44f) + + +// +// worldToNDC -- for images generated by 3D computer graphics rendering, a +// matrix that transforms 3D points from the world to the Normalized Device +// Coordinate (NDC) space of the renderer. +// +// NDC is a 2D coordinate space that corresponds to the image plane, with +// positive x and pointing to the right and y positive pointing down. The +// coordinates (0, 0) and (1, 1) correspond to the upper left and lower right +// corners of the OpenEXR display window. +// +// To transform a 3D point in word space into a 2D point in NDC space, +// multiply the 3D point by the worldToNDC matrix and discard the z +// coordinate. +// +// NDC space in OpenEXR is the same as in Pixar's Renderman. +// + +IMF_STD_ATTRIBUTE_DEF (worldToNDC, WorldToNDC, IMATH_NAMESPACE::M44f) + + +// +// deepImageState -- specifies whether the pixels in a deep image are +// sorted and non-overlapping. +// +// Note: this attribute can be set by application code that writes a file +// in order to tell applications that read the file whether the pixel data +// must be cleaned up prior to image processing operations such as flattening. +// The IlmImf library does not verify that the attribute is consistent with +// the actual state of the pixels. Application software may assume that the +// attribute is valid, as long as the software will not crash or lock up if +// any pixels are inconsistent with the deepImageState attribute. +// + +IMF_STD_ATTRIBUTE_DEF (deepImageState, DeepImageState, DeepImageState) + + +// +// originalDataWindow -- if application software crops an image, then it +// should save the data window of the original, un-cropped image in the +// originalDataWindow attribute. +// + +IMF_STD_ATTRIBUTE_DEF + (originalDataWindow, OriginalDataWindow, IMATH_NAMESPACE::Box2i) + + +// +// dwaCompressionLevel -- sets the quality level for images compressed +// with the DWAA or DWAB method. +// + +IMF_STD_ATTRIBUTE_DEF (dwaCompressionLevel, DwaCompressionLevel, float) + + +#endif diff --git a/IlmImf/ImfStdIO.cpp b/IlmImf/ImfStdIO.cpp new file mode 100644 index 0000000..1839a94 --- /dev/null +++ b/IlmImf/ImfStdIO.cpp @@ -0,0 +1,242 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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.67 +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR +// based on C++ standard iostreams. +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include + +using namespace std; +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +void +clearError () +{ + errno = 0; +} + + +bool +checkError (istream &is, streamsize expected = 0) +{ + if (!is) + { + if (errno) + IEX_NAMESPACE::throwErrnoExc(); + + if (is.gcount() < expected) + { + THROW (IEX_NAMESPACE::InputExc, "Early end of file: read " << is.gcount() + << " out of " << expected << " requested bytes."); + } + return false; + } + + return true; +} + + +void +checkError (ostream &os) +{ + if (!os) + { + if (errno) + IEX_NAMESPACE::throwErrnoExc(); + + throw IEX_NAMESPACE::ErrnoExc ("File output failed."); + } +} + +} // namespace + + +StdIFStream::StdIFStream (const char fileName[]): + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName), + _is (new ifstream (fileName, ios_base::binary)), + _deleteStream (true) +{ + if (!*_is) + { + delete _is; + IEX_NAMESPACE::throwErrnoExc(); + } +} + + +StdIFStream::StdIFStream (ifstream &is, const char fileName[]): + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName), + _is (&is), + _deleteStream (false) +{ + // empty +} + + +StdIFStream::~StdIFStream () +{ + if (_deleteStream) + delete _is; +} + + +bool +StdIFStream::read (char c[/*n*/], int n) +{ + if (!*_is) + throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); + + clearError(); + _is->read (c, n); + return checkError (*_is, n); +} + + +Int64 +StdIFStream::tellg () +{ + return std::streamoff (_is->tellg()); +} + + +void +StdIFStream::seekg (Int64 pos) +{ + _is->seekg (pos); + checkError (*_is); +} + + +void +StdIFStream::clear () +{ + _is->clear(); +} + + +StdOFStream::StdOFStream (const char fileName[]): + OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName), + _os (new ofstream (fileName, ios_base::binary)), + _deleteStream (true) +{ + if (!*_os) + { + delete _os; + IEX_NAMESPACE::throwErrnoExc(); + } +} + + +StdOFStream::StdOFStream (ofstream &os, const char fileName[]): + OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName), + _os (&os), + _deleteStream (false) +{ + // empty +} + + +StdOFStream::~StdOFStream () +{ + if (_deleteStream) + delete _os; +} + + +void +StdOFStream::write (const char c[/*n*/], int n) +{ + clearError(); + _os->write (c, n); + checkError (*_os); +} + + +Int64 +StdOFStream::tellp () +{ + return std::streamoff (_os->tellp()); +} + + +void +StdOFStream::seekp (Int64 pos) +{ + _os->seekp (pos); + checkError (*_os); +} + + +StdOSStream::StdOSStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::OStream ("(string)") +{ + // empty +} + + +void +StdOSStream::write (const char c[/*n*/], int n) +{ + clearError(); + _os.write (c, n); + checkError (_os); +} + + +Int64 +StdOSStream::tellp () +{ + return std::streamoff (_os.tellp()); +} + + +void +StdOSStream::seekp (Int64 pos) +{ + _os.seekp (pos); + checkError (_os); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfStdIO.h b/IlmImf/ImfStdIO.h new file mode 100644 index 0000000..56ea4e2 --- /dev/null +++ b/IlmImf/ImfStdIO.h @@ -0,0 +1,160 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_STD_IO_H +#define INCLUDED_IMF_STD_IO_H + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR +// based on C++ standard iostreams. +// +//----------------------------------------------------------------------------- + +#include "ImfIO.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//------------------------------------------- +// class StdIFStream -- an implementation of +// class OPENEXR_IMF_INTERNAL_NAMESPACE::IStream based on class std::ifstream +//------------------------------------------- + +class IMF_EXPORT StdIFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::IStream +{ + public: + + //------------------------------------------------------- + // A constructor that opens the file with the given name. + // The destructor will close the file. + //------------------------------------------------------- + + StdIFStream (const char fileName[]); + + + //--------------------------------------------------------- + // A constructor that uses a std::ifstream that has already + // been opened by the caller. The StdIFStream's destructor + // will not close the std::ifstream. + //--------------------------------------------------------- + + StdIFStream (std::ifstream &is, const char fileName[]); + + + virtual ~StdIFStream (); + + virtual bool read (char c[/*n*/], int n); + virtual Int64 tellg (); + virtual void seekg (Int64 pos); + virtual void clear (); + + private: + + std::ifstream * _is; + bool _deleteStream; +}; + + +//------------------------------------------- +// class StdOFStream -- an implementation of +// class OPENEXR_IMF_INTERNAL_NAMESPACE::OStream based on class std::ofstream +//------------------------------------------- + +class IMF_EXPORT StdOFStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +{ + public: + + //------------------------------------------------------- + // A constructor that opens the file with the given name. + // The destructor will close the file. + //------------------------------------------------------- + + StdOFStream (const char fileName[]); + + + //--------------------------------------------------------- + // A constructor that uses a std::ofstream that has already + // been opened by the caller. The StdOFStream's destructor + // will not close the std::ofstream. + //--------------------------------------------------------- + + StdOFStream (std::ofstream &os, const char fileName[]); + + + virtual ~StdOFStream (); + + virtual void write (const char c[/*n*/], int n); + virtual Int64 tellp (); + virtual void seekp (Int64 pos); + + private: + + std::ofstream * _os; + bool _deleteStream; +}; + + +//------------------------------------------------ +// class StdOSStream -- an implementation of class +// OPENEXR_IMF_INTERNAL_NAMESPACE::OStream, based on class std::ostringstream +//------------------------------------------------ + +class IMF_EXPORT StdOSStream: public OPENEXR_IMF_INTERNAL_NAMESPACE::OStream +{ + public: + + StdOSStream (); + + virtual void write (const char c[/*n*/], int n); + virtual Int64 tellp (); + virtual void seekp (Int64 pos); + + std::string str () const {return _os.str();} + + private: + + std::ostringstream _os; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfStringAttribute.cpp b/IlmImf/ImfStringAttribute.cpp new file mode 100644 index 0000000..cd241ba --- /dev/null +++ b/IlmImf/ImfStringAttribute.cpp @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class StringAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +StringAttribute::staticTypeName () +{ + return "string"; +} + + +template <> +void +StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + int size = _value.size(); + + for (int i = 0; i < size; i++) + Xdr::write (os, _value[i]); +} + + +template <> +void +StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + _value.resize (size); + + for (int i = 0; i < size; i++) + Xdr::read (is, _value[i]); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfStringAttribute.h b/IlmImf/ImfStringAttribute.h new file mode 100644 index 0000000..f5d62d7 --- /dev/null +++ b/IlmImf/ImfStringAttribute.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_STRING_ATTRIBUTE_H +#define INCLUDED_IMF_STRING_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class StringAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute StringAttribute; + +template <> +IMF_EXPORT +const char *StringAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void StringAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void StringAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfStringVectorAttribute.cpp b/IlmImf/ImfStringVectorAttribute.cpp new file mode 100644 index 0000000..88fdf8e --- /dev/null +++ b/IlmImf/ImfStringVectorAttribute.cpp @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class StringVectorAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + + +template <> +const char * +StringVectorAttribute::staticTypeName () +{ + return "stringvector"; +} + + +template <> +void +StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + int size = _value.size(); + + for (int i = 0; i < size; i++) + { + int strSize = _value[i].size(); + Xdr::write (os, strSize); + Xdr::write (os, &_value[i][0], strSize); + } +} + + +template <> +void +StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + int read = 0; + + while (read < size) + { + int strSize; + Xdr::read (is, strSize); + read += Xdr::size(); + + std::string str; + str.resize (strSize); + + if( strSize>0 ) + { + Xdr::read (is, &str[0], strSize); + } + + read += strSize; + + _value.push_back (str); + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfStringVectorAttribute.h b/IlmImf/ImfStringVectorAttribute.h new file mode 100644 index 0000000..d13ef96 --- /dev/null +++ b/IlmImf/ImfStringVectorAttribute.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H +#define INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class StringVectorAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfNamespace.h" + +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +typedef std::vector StringVector; +typedef TypedAttribute StringVectorAttribute; + +template <> +IMF_EXPORT +const char *StringVectorAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void StringVectorAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void StringVectorAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfSystemSpecific.cpp b/IlmImf/ImfSystemSpecific.cpp new file mode 100644 index 0000000..d10f9bc --- /dev/null +++ b/IlmImf/ImfSystemSpecific.cpp @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfSimd.h" +#include "ImfSystemSpecific.h" +#include "ImfNamespace.h" +#include "OpenEXRConfig.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { +#if defined(IMF_HAVE_SSE2) && defined(__GNUC__) + + // Helper functions for gcc + SSE enabled + void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx) + { + __asm__ __volatile__ ( + "cpuid" + : /* Output */ "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) + : /* Input */ "a"(n) + : /* Clobber */); + } + +#else // IMF_HAVE_SSE2 && __GNUC__ + + // Helper functions for generic compiler - all disabled + void cpuid(int n, int &eax, int &ebx, int &ecx, int &edx) + { + eax = ebx = ecx = edx = 0; + } + +#endif // IMF_HAVE_SSE2 && __GNUC__ + + +#ifdef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX + + void xgetbv(int n, int &eax, int &edx) + { + __asm__ __volatile__ ( + "xgetbv" + : /* Output */ "=a"(eax), "=d"(edx) + : /* Input */ "c"(n) + : /* Clobber */); + } + +#else // OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX + + void xgetbv(int n, int &eax, int &edx) + { + eax = edx = 0; + } + +#endif // OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX + +} // namespace + +CpuId::CpuId(): + sse2(false), + sse3(false), + ssse3(false), + sse4_1(false), + sse4_2(false), + avx(false), + f16c(false) +{ + bool osxsave = false; + int max = 0; + int eax, ebx, ecx, edx; + + cpuid(0, max, ebx, ecx, edx); + if (max > 0) + { + cpuid(1, eax, ebx, ecx, edx); + sse2 = ( edx & (1<<26) ); + sse3 = ( ecx & (1<< 0) ); + ssse3 = ( ecx & (1<< 9) ); + sse4_1 = ( ecx & (1<<19) ); + sse4_2 = ( ecx & (1<<20) ); + osxsave = ( ecx & (1<<27) ); + avx = ( ecx & (1<<28) ); + f16c = ( ecx & (1<<29) ); + + if (!osxsave) + { + avx = f16c = false; + } + else + { + xgetbv(0, eax, edx); + // eax bit 1 - SSE managed, bit 2 - AVX managed + if ((eax & 6) != 6) + { + avx = f16c = false; + } + } + } +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfSystemSpecific.h b/IlmImf/ImfSystemSpecific.h new file mode 100644 index 0000000..c0261a7 --- /dev/null +++ b/IlmImf/ImfSystemSpecific.h @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_COMPILER_SPECIFIC_H +#define INCLUDED_IMF_COMPILER_SPECIFIC_H + +#include +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +static unsigned long systemEndianCheckValue = 0x12345678; +static unsigned long* systemEndianCheckPointer = &systemEndianCheckValue; + +// EXR files are little endian - check processor architecture is too +// (optimisation currently not supported for big endian machines) +static bool GLOBAL_SYSTEM_LITTLE_ENDIAN = + (*(unsigned char*)systemEndianCheckPointer == 0x78 ? true : false); + + +#ifdef IMF_HAVE_SSE2 + +#ifdef __GNUC__ +// Causes issues on certain gcc versions +//#define EXR_FORCEINLINE inline __attribute__((always_inline)) +#define EXR_FORCEINLINE inline +#define EXR_RESTRICT __restrict + +static void* EXRAllocAligned(size_t size, size_t alignment) +{ + void* ptr = 0; + posix_memalign(&ptr, alignment, size); + return ptr; +} + + +static void EXRFreeAligned(void* ptr) +{ + free(ptr); +} + +#elif defined _MSC_VER + +#define EXR_FORCEINLINE __forceinline +#define EXR_RESTRICT __restrict + +static void* EXRAllocAligned(size_t size, size_t alignment) +{ + return _aligned_malloc(size, alignment); +} + + +static void EXRFreeAligned(void* ptr) +{ + _aligned_free(ptr); +} + +#elif defined (__INTEL_COMPILER) || \ + defined(__ICL) || \ + defined(__ICC) || \ + defined(__ECC) + +#define EXR_FORCEINLINE inline +#define EXR_RESTRICT restrict + +static void* EXRAllocAligned(size_t size, size_t alignment) +{ + return _mm_malloc(size, alignment); +} + + +static void EXRFreeAligned(void* ptr) +{ + _mm_free(ptr); +} + +#else + +// generic compiler +#define EXR_FORCEINLINE inline +#define EXR_RESTRICT + +static void* EXRAllocAligned(size_t size, size_t alignment) +{ + return malloc(size); +} + + +static void EXRFreeAligned(void* ptr) +{ + free(ptr); +} + +#endif // compiler switch + + +#else // IMF_HAVE_SSE2 + + +#define EXR_FORCEINLINE inline +#define EXR_RESTRICT + +static void* EXRAllocAligned(size_t size, size_t alignment) +{ + return malloc(size); +} + + +static void EXRFreeAligned(void* ptr) +{ + free(ptr); +} + + +#endif // IMF_HAVE_SSE2 + +// +// Simple CPUID based runtime detection of various capabilities +// +class IMF_EXPORT CpuId +{ + public: + CpuId(); + + bool sse2; + bool sse3; + bool ssse3; + bool sse4_1; + bool sse4_2; + bool avx; + bool f16c; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#endif //include guard diff --git a/IlmImf/ImfTestFile.cpp b/IlmImf/ImfTestFile.cpp new file mode 100644 index 0000000..198a4d5 --- /dev/null +++ b/IlmImf/ImfTestFile.cpp @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Utility routines to test quickly if a given +// file is an OpenEXR file, and whether the +// file is scanline-based or tiled. +// +//----------------------------------------------------------------------------- + + +#include +#include +#include +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +bool +isOpenExrFile + (const char fileName[], + bool &tiled, + bool &deep, + bool &multiPart) +{ + try + { + StdIFStream is (fileName); + + int magic, version; + Xdr::read (is, magic); + Xdr::read (is, version); + + tiled = isTiled (version); + deep = isNonImage (version); + multiPart = isMultiPart (version); + return magic == MAGIC; + } + catch (...) + { + tiled = false; + return false; + } +} + + +bool +isOpenExrFile (const char fileName[], bool &tiled, bool &deep) +{ + bool multiPart; + return isOpenExrFile (fileName, tiled, deep, multiPart); +} + + +bool +isOpenExrFile (const char fileName[], bool &tiled) +{ + bool deep, multiPart; + return isOpenExrFile (fileName, tiled, deep, multiPart); +} + + +bool +isOpenExrFile (const char fileName[]) +{ + bool tiled, deep, multiPart; + return isOpenExrFile (fileName, tiled, deep, multiPart); +} + + +bool +isTiledOpenExrFile (const char fileName[]) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (fileName, tiled, deep, multiPart); + return exr && tiled; +} + + +bool +isDeepOpenExrFile (const char fileName[]) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (fileName, tiled, deep, multiPart); + return exr && deep; +} + + +bool +isMultiPartOpenExrFile (const char fileName[]) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (fileName, tiled, deep, multiPart); + return exr && multiPart; +} + + +bool +isOpenExrFile + (IStream &is, + bool &tiled, + bool &deep, + bool &multiPart) +{ + try + { + Int64 pos = is.tellg(); + + if (pos != 0) + is.seekg (0); + + int magic, version; + Xdr::read (is, magic); + Xdr::read (is, version); + + is.seekg (pos); + + tiled = isTiled (version); + deep = isNonImage (version); + multiPart = isMultiPart (version); + return magic == MAGIC; + } + catch (...) + { + is.clear(); + tiled = false; + return false; + } +} + + +bool +isOpenExrFile (IStream &is, bool &tiled, bool &deep) +{ + bool multiPart; + return isOpenExrFile (is, tiled, deep, multiPart); +} + + +bool +isOpenExrFile (IStream &is, bool &tiled) +{ + bool deep, multiPart; + return isOpenExrFile (is, tiled, deep, multiPart); +} + + +bool +isOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) +{ + bool tiled, deep, multiPart; + return isOpenExrFile (is, tiled, deep, multiPart); +} + + +bool +isTiledOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (is, tiled, deep, multiPart); + return exr && tiled; +} + + +bool +isDeepOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (is, tiled, deep, multiPart); + return exr && deep; +} + + +bool +isMultiPartOpenExrFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is) +{ + bool exr, tiled, deep, multiPart; + exr = isOpenExrFile (is, tiled, deep, multiPart); + return exr && multiPart; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTestFile.h b/IlmImf/ImfTestFile.h new file mode 100644 index 0000000..d02d3bc --- /dev/null +++ b/IlmImf/ImfTestFile.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TEST_FILE_H +#define INCLUDED_IMF_TEST_FILE_H + +//----------------------------------------------------------------------------- +// +// Utility routines to test quickly if a given +// file is an OpenEXR file, and whether the +// file is scanline-based or tiled. +// +//----------------------------------------------------------------------------- + +#include "ImfForward.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +IMF_EXPORT bool isOpenExrFile (const char fileName[]); + +IMF_EXPORT bool isOpenExrFile (const char fileName[], + bool &isTiled); + +IMF_EXPORT bool isOpenExrFile (const char fileName[], + bool &isTiled, + bool &isDeep); + +IMF_EXPORT bool isOpenExrFile (const char fileName[], + bool &isTiled, + bool &isDeep, + bool &isMultiPart); + +IMF_EXPORT bool isTiledOpenExrFile (const char fileName[]); + +IMF_EXPORT bool isDeepOpenExrFile (const char fileName[]); + +IMF_EXPORT bool isMultiPartOpenExrFile (const char fileName[]); + +IMF_EXPORT bool isOpenExrFile (IStream &is); + +IMF_EXPORT bool isOpenExrFile (IStream &is, + bool &isTiled); + +IMF_EXPORT bool isOpenExrFile (IStream &is, + bool &isTiled, + bool &isDeep); + +IMF_EXPORT bool isOpenExrFile (IStream &is, + bool &isTiled, + bool &isDeep, + bool &isMultiPart); + +IMF_EXPORT bool isTiledOpenExrFile (IStream &is); + +IMF_EXPORT bool isDeepOpenExrFile (IStream &is); + +IMF_EXPORT bool isMultiPartOpenExrFile (IStream &is); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfThreading.cpp b/IlmImf/ImfThreading.cpp new file mode 100644 index 0000000..a3cf383 --- /dev/null +++ b/IlmImf/ImfThreading.cpp @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Threading support for the IlmImf library +// +//----------------------------------------------------------------------------- + +#include "ImfThreading.h" +#include "IlmThreadPool.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +int +globalThreadCount () +{ + return ILMTHREAD_NAMESPACE::ThreadPool::globalThreadPool().numThreads(); +} + + +void +setGlobalThreadCount (int count) +{ + ILMTHREAD_NAMESPACE::ThreadPool::globalThreadPool().setNumThreads (count); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfThreading.h b/IlmImf/ImfThreading.h new file mode 100644 index 0000000..4d1db04 --- /dev/null +++ b/IlmImf/ImfThreading.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_THREADING_H +#define INCLUDED_IMF_THREADING_H + +#include "ImfExport.h" +#include "ImfNamespace.h" + +//----------------------------------------------------------------------------- +// +// Threading support for the IlmImf library +// +// The IlmImf library uses threads to perform reading and writing +// of OpenEXR files in parallel. The thread that calls the library +// always performs the actual file IO (this is usually the main +// application thread) whereas a several worker threads perform +// data compression and decompression. The number of worker +// threads can be any non-negative value (a value of zero reverts +// to single-threaded operation). As long as there is at least +// one worker thread, file IO and compression can potentially be +// done concurrently through pinelining. If there are two or more +// worker threads, then pipelining as well as concurrent compression +// of multiple blocks can be performed. +// +// Threading in the Imf library is controllable at two granularities: +// +// * The functions in this file query and control the total number +// of worker threads, which will be created globally for the whole +// library. Regardless of how many input or output files are +// opened simultaneously, the library will use at most this number +// of worker threads to perform all work. The default number of +// global worker threads is zero (i.e. single-threaded operation; +// everything happens in the thread that calls the library). +// +// * Furthermore, it is possible to set the number of threads that +// each input or output file should keep busy. This number can +// be explicitly set for each file. The default behavior is for +// each file to try to occupy all worker threads in the library's +// thread pool. +// +//----------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +//----------------------------------------------------------------------------- +// Return the number of Imf-global worker threads used for parallel +// compression and decompression of OpenEXR files. +//----------------------------------------------------------------------------- + +IMF_EXPORT int globalThreadCount (); + + +//----------------------------------------------------------------------------- +// Change the number of Imf-global worker threads +//----------------------------------------------------------------------------- + +IMF_EXPORT void setGlobalThreadCount (int count); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfTileDescription.h b/IlmImf/ImfTileDescription.h new file mode 100644 index 0000000..7b219c8 --- /dev/null +++ b/IlmImf/ImfTileDescription.h @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILE_DESCRIPTION_H +#define INCLUDED_IMF_TILE_DESCRIPTION_H + +//----------------------------------------------------------------------------- +// +// class TileDescription and enum LevelMode +// +//----------------------------------------------------------------------------- +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +enum LevelMode +{ + ONE_LEVEL = 0, + MIPMAP_LEVELS = 1, + RIPMAP_LEVELS = 2, + + NUM_LEVELMODES // number of different level modes +}; + + +enum LevelRoundingMode +{ + ROUND_DOWN = 0, + ROUND_UP = 1, + + NUM_ROUNDINGMODES // number of different rounding modes +}; + + +class TileDescription +{ + public: + + unsigned int xSize; // size of a tile in the x dimension + unsigned int ySize; // size of a tile in the y dimension + LevelMode mode; + LevelRoundingMode roundingMode; + + TileDescription (unsigned int xs = 32, + unsigned int ys = 32, + LevelMode m = ONE_LEVEL, + LevelRoundingMode r = ROUND_DOWN) + : + xSize (xs), + ySize (ys), + mode (m), + roundingMode (r) + { + // empty + } + + bool + operator == (const TileDescription &other) const + { + return xSize == other.xSize && + ySize == other.ySize && + mode == other.mode && + roundingMode == other.roundingMode; + } +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfTileDescriptionAttribute.cpp b/IlmImf/ImfTileDescriptionAttribute.cpp new file mode 100644 index 0000000..18aead5 --- /dev/null +++ b/IlmImf/ImfTileDescriptionAttribute.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TileDescriptionAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +TileDescriptionAttribute::staticTypeName () +{ + return "tiledesc"; +} + + +template <> +void +TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.xSize); + Xdr::write (os, _value.ySize); + + unsigned char tmp = _value.mode | (_value.roundingMode << 4); + Xdr::write (os, tmp); +} + + +template <> +void +TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + int size, + int version) +{ + Xdr::read (is, _value.xSize); + Xdr::read (is, _value.ySize); + + unsigned char tmp; + Xdr::read (is, tmp); + _value.mode = LevelMode (tmp & 0x0f); + _value.roundingMode = LevelRoundingMode ((tmp >> 4) & 0x0f); + +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTileDescriptionAttribute.h b/IlmImf/ImfTileDescriptionAttribute.h new file mode 100644 index 0000000..a8b69b9 --- /dev/null +++ b/IlmImf/ImfTileDescriptionAttribute.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H +#define INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class TileDescriptionAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfTileDescription.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +typedef TypedAttribute TileDescriptionAttribute; + +template <> +IMF_EXPORT +const char * +TileDescriptionAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void +TileDescriptionAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void +TileDescriptionAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfTileOffsets.cpp b/IlmImf/ImfTileOffsets.cpp new file mode 100644 index 0000000..b0b40f6 --- /dev/null +++ b/IlmImf/ImfTileOffsets.cpp @@ -0,0 +1,552 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TileOffsets +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "Iex.h" +#include "ImfNamespace.h" +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +TileOffsets::TileOffsets (LevelMode mode, + int numXLevels, int numYLevels, + const int *numXTiles, const int *numYTiles) +: + _mode (mode), + _numXLevels (numXLevels), + _numYLevels (numYLevels) +{ + switch (_mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + _offsets.resize (_numXLevels); + + for (unsigned int l = 0; l < _offsets.size(); ++l) + { + _offsets[l].resize (numYTiles[l]); + + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + { + _offsets[l][dy].resize (numXTiles[l]); + } + } + break; + + case RIPMAP_LEVELS: + + _offsets.resize (_numXLevels * _numYLevels); + + for (int ly = 0; ly < _numYLevels; ++ly) + { + for (int lx = 0; lx < _numXLevels; ++lx) + { + int l = ly * _numXLevels + lx; + _offsets[l].resize (numYTiles[ly]); + + for (size_t dy = 0; dy < _offsets[l].size(); ++dy) + { + _offsets[l][dy].resize (numXTiles[lx]); + } + } + } + break; + + case NUM_LEVELMODES : + throw IEX_NAMESPACE::ArgExc("Bad initialisation of TileOffsets object"); + } +} + + +bool +TileOffsets::anyOffsetsAreInvalid () const +{ + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + if (_offsets[l][dy][dx] <= 0) + return true; + + return false; +} + + +void +TileOffsets::findTiles (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool isMultiPartFile, bool isDeep, bool skipOnly) +{ + for (unsigned int l = 0; l < _offsets.size(); ++l) + { + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + { + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + { + Int64 tileOffset = is.tellg(); + + if (isMultiPartFile) + { + int partNumber; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, partNumber); + } + + int tileX; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tileX); + + int tileY; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, tileY); + + int levelX; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelX); + + int levelY; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, levelY); + + if(isDeep) + { + Int64 packed_offset_table_size; + Int64 packed_sample_size; + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_offset_table_size); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, packed_sample_size); + + // next Int64 is unpacked sample size - skip that too + Xdr::skip (is, packed_offset_table_size+packed_sample_size+8); + + }else{ + + int dataSize; + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, dataSize); + + Xdr::skip (is, dataSize); + } + if (skipOnly) continue; + + if (!isValidTile(tileX, tileY, levelX, levelY)) + return; + + operator () (tileX, tileY, levelX, levelY) = tileOffset; + } + } + } +} + + +void +TileOffsets::reconstructFromFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,bool isMultiPart,bool isDeep) +{ + // + // Try to reconstruct a missing tile offset table by sequentially + // scanning through the file, and recording the offsets in the file + // of the tiles we find. + // + + Int64 position = is.tellg(); + + try + { + findTiles (is,isMultiPart,isDeep,false); + } + catch (...) + { + // + // Suppress all exceptions. This function is called only to + // reconstruct the tile offset table for incomplete files, + // and exceptions are likely. + // + } + + is.clear(); + is.seekg (position); +} + + +void +TileOffsets::readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool &complete,bool isMultiPartFile, bool isDeep) +{ + // + // Read in the tile offsets from the file's tile offset table + // + + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (is, _offsets[l][dy][dx]); + + // + // Check if any tile offsets are invalid. + // + // Invalid offsets mean that the file is probably incomplete + // (the offset table is the last thing written to the file). + // Either some process is still busy writing the file, or + // writing the file was aborted. + // + // We should still be able to read the existing parts of the + // file. In order to do this, we have to make a sequential + // scan over the scan tile to reconstruct the tile offset + // table. + // + + if (anyOffsetsAreInvalid()) + { + complete = false; + reconstructFromFile (is,isMultiPartFile,isDeep); + } + else + { + complete = true; + } + +} + + +void +TileOffsets::readFrom (std::vector chunkOffsets,bool &complete) +{ + size_t totalSize = 0; + + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + totalSize += _offsets[l][dy].size(); + + if (chunkOffsets.size() != totalSize) + throw IEX_NAMESPACE::ArgExc ("Wrong offset count, not able to read from this array"); + + + + int pos = 0; + for (size_t l = 0; l < _offsets.size(); ++l) + for (size_t dy = 0; dy < _offsets[l].size(); ++dy) + for (size_t dx = 0; dx < _offsets[l][dy].size(); ++dx) + { + _offsets[l][dy][dx] = chunkOffsets[pos]; + pos++; + } + + complete = !anyOffsetsAreInvalid(); + +} + + +Int64 +TileOffsets::writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os) const +{ + // + // Write the tile offset table to the file, and + // return the position of the start of the table + // in the file. + // + + Int64 pos = os.tellp(); + + if (pos == -1) + IEX_NAMESPACE::throwErrnoExc ("Cannot determine current file position (%T)."); + + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write (os, _offsets[l][dy][dx]); + + return pos; +} + +namespace { +struct tilepos{ + Int64 filePos; + int dx; + int dy; + int l; + bool operator <(const tilepos & other) const + { + return filePos < other.filePos; + } +}; +} +//------------------------------------- +// fill array with tile coordinates in the order they appear in the file +// +// each input array must be of size (totalTiles) +// +// +// if the tile order is not RANDOM_Y, it is more efficient to compute the +// tile ordering rather than using this function +// +//------------------------------------- +void TileOffsets::getTileOrder(int dx_table[],int dy_table[],int lx_table[],int ly_table[]) const +{ + // + // helper class + // + + // how many entries? + size_t entries=0; + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + entries+=_offsets[l][dy].size(); + + std::vector table(entries); + + size_t i = 0; + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + { + table[i].filePos = _offsets[l][dy][dx]; + table[i].dx = dx; + table[i].dy = dy; + table[i].l = l; + + ++i; + + } + + std::sort(table.begin(),table.end()); + + // + // write out the values + // + + // pass 1: write out dx and dy, since these are independent of level mode + + for(size_t i=0;i 0 && + int(_offsets[0].size()) > dy && + int(_offsets[0][dy].size()) > dx) + { + return true; + } + + break; + + case MIPMAP_LEVELS: + + if (lx < _numXLevels && + ly < _numYLevels && + int(_offsets.size()) > lx && + int(_offsets[lx].size()) > dy && + int(_offsets[lx][dy].size()) > dx) + { + return true; + } + + break; + + case RIPMAP_LEVELS: + + if (lx < _numXLevels && + ly < _numYLevels && + (_offsets.size() > (size_t) lx+ ly * (size_t) _numXLevels) && + int(_offsets[lx + ly * _numXLevels].size()) > dy && + int(_offsets[lx + ly * _numXLevels][dy].size()) > dx) + { + return true; + } + + break; + + default: + + return false; + } + + return false; +} + + +Int64 & +TileOffsets::operator () (int dx, int dy, int lx, int ly) +{ + // + // Looks up the value of the tile with tile coordinate (dx, dy) + // and level number (lx, ly) in the _offsets array, and returns + // the cooresponding offset. + // + + switch (_mode) + { + case ONE_LEVEL: + + return _offsets[0][dy][dx]; + break; + + case MIPMAP_LEVELS: + + return _offsets[lx][dy][dx]; + break; + + case RIPMAP_LEVELS: + + return _offsets[lx + ly * _numXLevels][dy][dx]; + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } +} + + +Int64 & +TileOffsets::operator () (int dx, int dy, int l) +{ + return operator () (dx, dy, l, l); +} + + +const Int64 & +TileOffsets::operator () (int dx, int dy, int lx, int ly) const +{ + // + // Looks up the value of the tile with tile coordinate (dx, dy) + // and level number (lx, ly) in the _offsets array, and returns + // the cooresponding offset. + // + + switch (_mode) + { + case ONE_LEVEL: + + return _offsets[0][dy][dx]; + break; + + case MIPMAP_LEVELS: + + return _offsets[lx][dy][dx]; + break; + + case RIPMAP_LEVELS: + + return _offsets[lx + ly * _numXLevels][dy][dx]; + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } +} + + +const Int64 & +TileOffsets::operator () (int dx, int dy, int l) const +{ + return operator () (dx, dy, l, l); +} + +const std::vector > >& +TileOffsets::getOffsets() const +{ + return _offsets; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTileOffsets.h b/IlmImf/ImfTileOffsets.h new file mode 100644 index 0000000..d8c151e --- /dev/null +++ b/IlmImf/ImfTileOffsets.h @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILE_OFFSETS_H +#define INCLUDED_IMF_TILE_OFFSETS_H + +//----------------------------------------------------------------------------- +// +// class TileOffsets +// +//----------------------------------------------------------------------------- + +#include "ImfTileDescription.h" +#include "ImfInt64.h" +#include +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT TileOffsets +{ + public: + + TileOffsets (LevelMode mode = ONE_LEVEL, + int numXLevels = 0, + int numYLevels = 0, + const int *numXTiles = 0, + const int *numYTiles = 0); + + // -------- + // File I/O + // -------- + + void readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool &complete,bool isMultiPart,bool isDeep); + void readFrom (std::vector chunkOffsets,bool &complete); + Int64 writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os) const; + + + //----------------------------------------------------------- + // Test if the tileOffsets array is empty (all entries are 0) + //----------------------------------------------------------- + + bool isEmpty () const; + + + + //----------------------------------------------------------- + // populate 'list' with tiles coordinates in the order they appear + // in the offset table (assumes full table! + // each array myst be at leat totalTiles long + //----------------------------------------------------------- + void getTileOrder(int dx_table[], int dy_table[], int lx_table[], int ly_table[]) const; + + + //----------------------- + // Access to the elements + //----------------------- + + Int64 & operator () (int dx, int dy, int lx, int ly); + Int64 & operator () (int dx, int dy, int l); + const Int64 & operator () (int dx, int dy, int lx, int ly) const; + const Int64 & operator () (int dx, int dy, int l) const; + bool isValidTile (int dx, int dy, int lx, int ly) const; + const std::vector > >& getOffsets() const; + + private: + + void findTiles (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, bool isMultiPartFile, + bool isDeep, + bool skipOnly); + void reconstructFromFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,bool isMultiPartFile,bool isDeep); + bool readTile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is); + bool anyOffsetsAreInvalid () const; + + LevelMode _mode; + int _numXLevels; + int _numYLevels; + + std::vector > > _offsets; + +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfTiledInputFile.cpp b/IlmImf/ImfTiledInputFile.cpp new file mode 100644 index 0000000..cd244cc --- /dev/null +++ b/IlmImf/ImfTiledInputFile.cpp @@ -0,0 +1,1533 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfTiledInputFile.h" +#include "ImfTileDescriptionAttribute.h" +#include "ImfChannelList.h" +#include "ImfMisc.h" +#include "ImfTiledMisc.h" +#include "ImfStdIO.h" +#include "ImfCompressor.h" +#include "ImfXdr.h" +#include "ImfConvert.h" +#include "ImfVersion.h" +#include "ImfTileOffsets.h" +#include "ImfThreading.h" +#include "ImfPartType.h" +#include "ImfMultiPartInputFile.h" +#include "ImfInputStreamMutex.h" +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "ImathVec.h" +#include "Iex.h" +#include +#include +#include +#include +#include "ImfInputPartData.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using std::string; +using std::vector; +using std::min; +using std::max; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct TInSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char * base; + size_t xStride; + size_t yStride; + bool fill; + bool skip; + double fillValue; + int xTileCoords; + int yTileCoords; + + TInSliceInfo (PixelType typeInFrameBuffer = HALF, + PixelType typeInFile = HALF, + char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + bool fill = false, + bool skip = false, + double fillValue = 0.0, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TInSliceInfo::TInSliceInfo (PixelType tifb, + PixelType tifl, + char *b, + size_t xs, size_t ys, + bool f, bool s, + double fv, + int xtc, + int ytc) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + base (b), + xStride (xs), + yStride (ys), + fill (f), + skip (s), + fillValue (fv), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileBuffer +{ + const char * uncompressedData; + char * buffer; + int dataSize; + Compressor * compressor; + Compressor::Format format; + int dx; + int dy; + int lx; + int ly; + bool hasException; + string exception; + + TileBuffer (Compressor * const comp); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (Compressor *comp): + uncompressedData (0), + buffer (0), + dataSize (0), + compressor (comp), + format (defaultFormat (compressor)), + dx (-1), + dy (-1), + lx (-1), + ly (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + delete compressor; +} + +} // namespace + + +class MultiPartInputFile; + + +// +// struct TiledInputFile::Data stores things that will be +// needed between calls to readTile() +// + +struct TiledInputFile::Data: public Mutex +{ + Header header; // the image header + TileDescription tileDesc; // describes the tile layout + int version; // file's version + FrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + bool fileIsComplete; // True if no tiles are missing + // in the file + + vector slices; // info about channels in file + + size_t bytesPerPixel; // size of an uncompressed pixel + + size_t maxBytesPerTileLine; // combined size of a line + // over all channels + + int partNumber; // part number + + bool multiPartBackwardSupport; // if we are reading a multipart file + // using OpenEXR 1.7 API + + int numThreads; // number of threads + + MultiPartInputFile* multiPartFile; // the MultiPartInputFile used to + // support backward compatibility + + vector tileBuffers; // each holds a single tile + size_t tileBufferSize; // size of the tile buffers + + bool memoryMapped; // if the stream is memory mapped + + InputStreamMutex * _streamData; + bool _deleteStream; + + Data (int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile indices + // into our vector of tile buffers +}; + + +TiledInputFile::Data::Data (int numThreads): + numXTiles (0), + numYTiles (0), + partNumber (-1), + multiPartBackwardSupport(false), + numThreads(numThreads), + memoryMapped(false), + _streamData(NULL), + _deleteStream(false) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); +} + + +TiledInputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + for (size_t i = 0; i < tileBuffers.size(); i++) + delete tileBuffers[i]; + + if (multiPartBackwardSupport) + delete multiPartFile; +} + + +TileBuffer* +TiledInputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +namespace { + +void +readTileData (InputStreamMutex *streamData, + TiledInputFile::Data *ifd, + int dx, int dy, + int lx, int ly, + char *&buffer, + int &dataSize) +{ + // + // Read a single tile block from the file and into the array pointed + // to by buffer. If the file is memory-mapped, then we change where + // buffer points instead of writing into the array (hence buffer needs + // to be a reference to a char *). + // + + // + // Look up the location for this tile in the Index and + // seek to that position if necessary + // + + Int64 tileOffset = ifd->tileOffsets (dx, dy, lx, ly); + + if (tileOffset == 0) + { + THROW (IEX_NAMESPACE::InputExc, "Tile (" << dx << ", " << dy << ", " << + lx << ", " << ly << ") is missing."); + } + + + // + // In a multi-part file, the next chunk does not need to + // belong to the same part, so we have to compare the + // offset here. + // + + if (!isMultiPart(ifd->version)) + { + if (streamData->currentPosition != tileOffset) + streamData->is->seekg (tileOffset); + } + else + { + // + // In a multi-part file, the file pointer may be moved by other + // parts, so we have to ask tellg() where we are. + // + if (streamData->is->tellg() != tileOffset) + streamData->is->seekg (tileOffset); + } + + // + // Read the first few bytes of the tile (the header). + // Verify that the tile coordinates and the level number + // are correct. + // + + int tileXCoord, tileYCoord, levelX, levelY; + + if (isMultiPart(ifd->version)) + { + int partNumber; + Xdr::read (*streamData->is, partNumber); + if (partNumber != ifd->partNumber) + { + THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber + << ", should be " << ifd->partNumber << "."); + } + } + + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, tileXCoord); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, tileYCoord); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, levelX); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, levelY); + OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read (*streamData->is, dataSize); + + if (tileXCoord != dx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x coordinate."); + + if (tileYCoord != dy) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y coordinate."); + + if (levelX != lx) + throw IEX_NAMESPACE::InputExc ("Unexpected tile x level number coordinate."); + + if (levelY != ly) + throw IEX_NAMESPACE::InputExc ("Unexpected tile y level number coordinate."); + + if (dataSize > (int) ifd->tileBufferSize) + throw IEX_NAMESPACE::InputExc ("Unexpected tile block length."); + + // + // Read the pixel data. + // + + if (streamData->is->isMemoryMapped ()) + buffer = streamData->is->readMemoryMapped (dataSize); + else + streamData->is->read (buffer, dataSize); + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + streamData->currentPosition = tileOffset + 5 * Xdr::size() + dataSize; +} + + +void +readNextTileData (InputStreamMutex *streamData, + TiledInputFile::Data *ifd, + int &dx, int &dy, + int &lx, int &ly, + char * & buffer, + int &dataSize) +{ + // + // Read the next tile block from the file + // + + if(isMultiPart(ifd->version)) + { + int part; + Xdr::read (*streamData->is, part); + if(part!=ifd->partNumber) + { + throw IEX_NAMESPACE::InputExc("Unexpected part number in readNextTileData"); + } + } + + // + // Read the first few bytes of the tile (the header). + // + + Xdr::read (*streamData->is, dx); + Xdr::read (*streamData->is, dy); + Xdr::read (*streamData->is, lx); + Xdr::read (*streamData->is, ly); + Xdr::read (*streamData->is, dataSize); + + if (dataSize > (int) ifd->tileBufferSize) + throw IEX_NAMESPACE::InputExc ("Unexpected tile block length."); + + // + // Read the pixel data. + // + + streamData->is->read (buffer, dataSize); + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + streamData->currentPosition += 5 * Xdr::size() + dataSize; +} + + +// +// A TileBufferTask encapsulates the task of uncompressing +// a single tile and copying it into the frame buffer. +// + +class TileBufferTask : public Task +{ + public: + + TileBufferTask (TaskGroup *group, + TiledInputFile::Data *ifd, + TileBuffer *tileBuffer); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + TiledInputFile::Data * _ifd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + TiledInputFile::Data *ifd, + TileBuffer *tileBuffer) +: + Task (group), + _ifd (ifd), + _tileBuffer (tileBuffer) +{ + // empty +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // Calculate information about the tile + // + + Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _ifd->tileDesc, + _ifd->minX, _ifd->maxX, + _ifd->minY, _ifd->maxY, + _tileBuffer->dx, + _tileBuffer->dy, + _tileBuffer->lx, + _tileBuffer->ly); + + int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; + + int numPixelsInTile = numPixelsPerScanLine * + (tileRange.max.y - tileRange.min.y + 1); + + int sizeOfTile = _ifd->bytesPerPixel * numPixelsInTile; + + + // + // Uncompress the data, if necessary + // + + if (_tileBuffer->compressor && _tileBuffer->dataSize < sizeOfTile) + { + _tileBuffer->format = _tileBuffer->compressor->format(); + + _tileBuffer->dataSize = _tileBuffer->compressor->uncompressTile + (_tileBuffer->buffer, _tileBuffer->dataSize, + tileRange, _tileBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _tileBuffer->format = Compressor::XDR; + _tileBuffer->uncompressedData = _tileBuffer->buffer; + } + + // + // Convert the tile of pixel data back from the machine-independent + // representation, and store the result in the frame buffer. + // + + const char *readPtr = _tileBuffer->uncompressedData; + // points to where we + // read from in the + // tile block + + // + // Iterate over the scan lines in the tile. + // + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + const TInSliceInfo &slice = _ifd->slices[i]; + + // + // These offsets are used to facilitate both + // absolute and tile-relative pixel coordinates. + // + + int xOffset = slice.xTileCoords * tileRange.min.x; + int yOffset = slice.yTileCoords * tileRange.min.y; + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, + numPixelsPerScanLine); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + char *writePtr = slice.base + + (y - yOffset) * slice.yStride + + (tileRange.min.x - xOffset) * + slice.xStride; + + char *endPtr = writePtr + + (numPixelsPerScanLine - 1) * slice.xStride; + + copyIntoFrameBuffer (readPtr, writePtr, endPtr, + slice.xStride, + slice.fill, slice.fillValue, + _tileBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + + +TileBufferTask * +newTileBufferTask + (TaskGroup *group, + InputStreamMutex *streamData, + TiledInputFile::Data *ifd, + int number, + int dx, int dy, + int lx, int ly) +{ + // + // Wait for a tile buffer to become available, + // fill the buffer with raw data from the file, + // and create a new TileBufferTask whose execute() + // method will uncompress the tile and copy the + // tile's pixels into the frame buffer. + // + + TileBuffer *tileBuffer = ifd->getTileBuffer (number); + + try + { + tileBuffer->wait(); + + tileBuffer->dx = dx; + tileBuffer->dy = dy; + tileBuffer->lx = lx; + tileBuffer->ly = ly; + + tileBuffer->uncompressedData = 0; + + readTileData (streamData, ifd, dx, dy, lx, ly, + tileBuffer->buffer, + tileBuffer->dataSize); + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the tile buffer is free, and + // re-throw the exception. + // + + tileBuffer->post(); + throw; + } + + return new TileBufferTask (group, ifd, tileBuffer); +} + + +} // namespace + + +TiledInputFile::TiledInputFile (const char fileName[], int numThreads): + _data (new Data (numThreads)) +{ + _data->_streamData=NULL; + _data->_deleteStream=true; + + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + + IStream* is = 0; + try + { + is = new StdIFStream (fileName); + readMagicNumberAndVersionField(*is, _data->version); + + // + // Backward compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(*is); + return; + } + + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + initialize(); + //read tile offsets - we are not multipart or deep + _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,false); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (_data->_streamData != 0) + { + if (_data->_streamData->is != 0) + { + delete _data->_streamData->is; + _data->_streamData->is = is = 0; + } + + delete _data->_streamData; + } + + if (is != 0) + delete is; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + if ( _data->_streamData != 0) + { + if ( _data->_streamData->is != 0) + { + delete _data->_streamData->is; + _data->_streamData->is = is = 0; + } + + delete _data->_streamData; + } + + if (is != 0) + delete is; + throw; + } +} + + +TiledInputFile::TiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): + _data (new Data (numThreads)) +{ + _data->_deleteStream=false; + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + bool streamDataCreated = false; + + try + { + readMagicNumberAndVersionField(is, _data->version); + + // + // Backward compatibility to read multpart file. + // + if (isMultiPart(_data->version)) + { + compatibilityInitialize(is); + return; + } + + streamDataCreated = true; + _data->_streamData = new InputStreamMutex(); + _data->_streamData->is = &is; + _data->header.readFrom (*_data->_streamData->is, _data->version); + initialize(); + // file is guaranteed to be single part, regular image + _data->tileOffsets.readFrom (*(_data->_streamData->is), _data->fileIsComplete,false,false); + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + if (streamDataCreated) delete _data->_streamData; + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + if (streamDataCreated) delete _data->_streamData; + delete _data; + throw; + } +} + + +TiledInputFile::TiledInputFile (const Header &header, + OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, + int version, + int numThreads) : + _data (new Data (numThreads)) +{ + _data->_deleteStream=false; + _data->_streamData = new InputStreamMutex(); + // + // This constructor called by class Imf::InputFile + // when a user wants to just read an image file, and + // doesn't care or know if the file is tiled. + // No need to have backward compatibility here, because + // we have somehow got the header. + // + + _data->_streamData->is = is; + _data->header = header; + _data->version = version; + initialize(); + _data->tileOffsets.readFrom (*(_data->_streamData->is),_data->fileIsComplete,false,false); + _data->memoryMapped = is->isMemoryMapped(); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); +} + + +TiledInputFile::TiledInputFile (InputPartData* part) +{ + _data = new Data (part->numThreads); + _data->_deleteStream=false; + multiPartInitialize(part); +} + + +void +TiledInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is) +{ + is.seekg(0); + // + // Construct a MultiPartInputFile, initialize TiledInputFile + // with the part 0 data. + // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later. + // + _data->multiPartBackwardSupport = true; + _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads); + InputPartData* part = _data->multiPartFile->getPart(0); + + multiPartInitialize(part); +} + + +void +TiledInputFile::multiPartInitialize(InputPartData* part) +{ + if (part->header.type() != TILEDIMAGE) + throw IEX_NAMESPACE::ArgExc("Can't build a TiledInputFile from a type-mismatched part."); + + _data->_streamData = part->mutex; + _data->header = part->header; + _data->version = part->version; + _data->partNumber = part->partNumber; + _data->memoryMapped = _data->_streamData->is->isMemoryMapped(); + initialize(); + _data->tileOffsets.readFrom(part->chunkOffsets,_data->fileIsComplete); + _data->_streamData->currentPosition = _data->_streamData->is->tellg(); +} + + +void +TiledInputFile::initialize () +{ + // fix bad types in header (arises when a tool built against an older version of + // OpenEXR converts a scanline image to tiled) + // only applies when file is a single part, regular image, tiled file + // + if(!isMultiPart(_data->version) && + !isNonImage(_data->version) && + isTiled(_data->version) && + _data->header.hasType() ) + { + _data->header.setType(TILEDIMAGE); + } + + if (_data->partNumber == -1) + { + if (!isTiled (_data->version)) + throw IEX_NAMESPACE::ArgExc ("Expected a tiled file but the file is not tiled."); + + } + else + { + if(_data->header.hasType() && _data->header.type()!=TILEDIMAGE) + { + throw IEX_NAMESPACE::ArgExc ("TiledInputFile used for non-tiledimage part."); + } + } + + _data->header.sanityCheck (true); + + _data->tileDesc = _data->header.tileDescription(); + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + _data->bytesPerPixel = calculateBytesPerPixel (_data->header); + + _data->maxBytesPerTileLine = _data->bytesPerPixel * _data->tileDesc.xSize; + + _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; + + // + // Create all the TileBuffers and allocate their internal buffers + // + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + { + _data->tileBuffers[i] = new TileBuffer (newTileCompressor + (_data->header.compression(), + _data->maxBytesPerTileLine, + _data->tileDesc.ySize, + _data->header)); + + if (!_data->_streamData->is->isMemoryMapped ()) + _data->tileBuffers[i]->buffer = new char [_data->tileBufferSize]; + } + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); +} + + +TiledInputFile::~TiledInputFile () +{ + if (!_data->memoryMapped) + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + delete [] _data->tileBuffers[i]->buffer; + + if (_data->_deleteStream) + delete _data->_streamData->is; + + if (_data->partNumber == -1) + delete _data->_streamData; + + delete _data; +} + + +const char * +TiledInputFile::fileName () const +{ + return _data->_streamData->is->fileName(); +} + + +const Header & +TiledInputFile::header () const +{ + return _data->header; +} + + +int +TiledInputFile::version () const +{ + return _data->version; +} + + +void +TiledInputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data->_streamData); + + // + // Set the frame buffer + // + + // + // Check if the new frame buffer descriptor is + // compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (TInSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (TInSliceInfo (j.slice().type, + fill? j.slice().type: i.channel().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + fill, + false, // skip + j.slice().fillValue, + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + + if (i != channels.end() && !fill) + ++i; + } + + while (i != channels.end()) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (TInSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +TiledInputFile::frameBuffer () const +{ + Lock lock (*_data->_streamData); + return _data->frameBuffer; +} + + +bool +TiledInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + + +void +TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) +{ + // + // Read a range of tiles from the file into the framebuffer + // + + try + { + Lock lock (*_data->_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + if (!isValidLevel (lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Level coordinate " + "(" << lx << ", " << ly << ") " + "is invalid."); + + // + // Determine the first and last tile coordinates in both dimensions. + // We always attempt to read the range of tiles in the order that + // they are stored in the file. + // + + if (dx1 > dx2) + std::swap (dx1, dx2); + + if (dy1 > dy2) + std::swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + int tileNumber = 0; + + for (int dy = dyStart; dy != dyStop; dy += dY) + { + for (int dx = dx1; dx <= dx2; dx++) + { + if (!isValidTile (dx, dy, lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Tile (" << dx << ", " << dy << ", " << + lx << "," << ly << ") is not a valid tile."); + + ThreadPool::addGlobalTask (newTileBufferTask (&taskGroup, + _data->_streamData, + _data, + tileNumber++, + dx, dy, + lx, ly)); + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledInputFile::readTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int l) +{ + readTiles (dx1, dx2, dy1, dy2, l, l); +} + + +void +TiledInputFile::readTile (int dx, int dy, int lx, int ly) +{ + readTiles (dx, dx, dy, dy, lx, ly); +} + + +void +TiledInputFile::readTile (int dx, int dy, int l) +{ + readTile (dx, dy, l, l); +} + + +void +TiledInputFile::rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + Lock lock (*_data->_streamData); + + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Tried to read a tile outside " + "the image file's data window."); + + TileBuffer *tileBuffer = _data->getTileBuffer (0); + + // + // if file is a multipart file, we have to seek to the required tile + // since we don't know where the file pointer is + // + int old_dx=dx; + int old_dy=dy; + int old_lx=lx; + int old_ly=ly; + if(isMultiPart(version())) + { + _data->_streamData->is->seekg(_data->tileOffsets(dx,dy,lx,ly)); + } + readNextTileData (_data->_streamData, _data, dx, dy, lx, ly, + tileBuffer->buffer, + pixelDataSize); + if(isMultiPart(version())) + { + if (old_dx!=dx || old_dy !=dy || old_lx!=lx || old_ly!=ly) + { + throw IEX_NAMESPACE::ArgExc ("rawTileData read the wrong tile"); + } + } + pixelData = tileBuffer->buffer; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +unsigned int +TiledInputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +TiledInputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +TiledInputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +TiledInputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +TiledInputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for files " + "with RIPMAP level mode)."); + + return _data->numXLevels; +} + + +int +TiledInputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +TiledInputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +TiledInputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +TiledInputFile::levelWidth (int lx) const +{ + try + { + return levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledInputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledInputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + { + THROW (IEX_NAMESPACE::ArgExc, "Error calling numXTiles() on image " + "file \"" << _data->_streamData->is->fileName() << "\" " + "(Argument is not in valid range)."); + + } + + return _data->numXTiles[lx]; +} + + +int +TiledInputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + { + THROW (IEX_NAMESPACE::ArgExc, "Error calling numYTiles() on image " + "file \"" << _data->_streamData->is->fileName() << "\" " + "(Argument is not in valid range)."); + } + + return _data->numYTiles[ly]; +} + + +Box2i +TiledInputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +TiledInputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +TiledInputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +TiledInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); + + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +TiledInputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + +void TiledInputFile::tileOrder(int dx[], int dy[], int lx[], int ly[]) const +{ + return _data->tileOffsets.getTileOrder(dx,dy,lx,ly); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledInputFile.h b/IlmImf/ImfTiledInputFile.h new file mode 100644 index 0000000..108ec7a --- /dev/null +++ b/IlmImf/ImfTiledInputFile.h @@ -0,0 +1,401 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILED_INPUT_FILE_H +#define INCLUDED_IMF_TILED_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class TiledInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImathBox.h" +#include "ImfTileDescription.h" +#include "ImfThreading.h" +#include "ImfGenericInputFile.h" +#include "ImfTiledOutputFile.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT TiledInputFile : public GenericInputFile +{ + public: + + //-------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // reads the file header. The constructor throws an IEX_NAMESPACE::ArgExc + // exception if the file is not tiled. + // The numThreads parameter specifies how many worker threads this + // file will try to keep busy when decompressing individual tiles. + // Destroying TiledInputFile objects constructed with this constructor + // automatically closes the corresponding files. + //-------------------------------------------------------------------- + + TiledInputFile (const char fileName[], + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------- + // A constructor that attaches the new TiledInputFile object + // to a file that has already been opened. + // Destroying TiledInputFile objects constructed with this + // constructor does not automatically close the corresponding + // files. + // ---------------------------------------------------------- + + TiledInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); + + + //----------- + // Destructor + //----------- + + virtual ~TiledInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledInputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readTile() is called. + // The current frame buffer can be changed after each call + // to readTile(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------ + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window + // (in all levels) are present in the input file, or false if + // any pixels are missing. (Another program may still be busy + // writing the file, or file writing may have been aborted + // prematurely.) + //------------------------------------------------------------ + + bool isComplete () const; + + + //-------------------------------------------------- + // Utility functions: + //-------------------------------------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with + // MIPMAP_LEVELS files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //---------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //---------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //-------------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //-------------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional region of + // valid pixel coordinates for a level with level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------ + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // the multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //------------------------------------------------------------ + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + // + // for single part files, reads the next tile in the file + // for multipart files, reads the tile specified by dx,dy,lx,ly + // + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + friend class InputFile; + friend class MultiPartInputFile; + + TiledInputFile (InputPartData* part); + + TiledInputFile (const TiledInputFile &); // not implemented + TiledInputFile & operator = (const TiledInputFile &); // not implemented + + TiledInputFile (const Header &header, OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is, int version, + int numThreads); + + void initialize (); + void multiPartInitialize(InputPartData* part); + void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + void tileOrder(int dx[],int dy[],int lx[],int ly[]) const; + Data * _data; + + friend void TiledOutputFile::copyPixels(TiledInputFile &); +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfTiledInputPart.cpp b/IlmImf/ImfTiledInputPart.cpp new file mode 100644 index 0000000..3f89d95 --- /dev/null +++ b/IlmImf/ImfTiledInputPart.cpp @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfTiledInputPart.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +TiledInputPart::TiledInputPart(MultiPartInputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getInputPart(partNumber); +} + +const char * +TiledInputPart::fileName () const +{ + return file->fileName(); +} + +const Header & +TiledInputPart::header () const +{ + return file->header(); +} + +int +TiledInputPart::version () const +{ + return file->version(); +} + +void +TiledInputPart::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + +const FrameBuffer & +TiledInputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + +bool +TiledInputPart::isComplete () const +{ + return file->isComplete(); +} + +unsigned int +TiledInputPart::tileXSize () const +{ + return file->tileXSize(); +} + +unsigned int +TiledInputPart::tileYSize () const +{ + return file->tileYSize(); +} + +LevelMode +TiledInputPart::levelMode () const +{ + return file->levelMode(); +} + +LevelRoundingMode +TiledInputPart::levelRoundingMode () const +{ + return file->levelRoundingMode(); +} + +int +TiledInputPart::numLevels () const +{ + return file->numLevels(); +} + +int +TiledInputPart::numXLevels () const +{ + return file->numXLevels(); +} + +int +TiledInputPart::numYLevels () const +{ + return file->numYLevels(); +} + +bool +TiledInputPart::isValidLevel (int lx, int ly) const +{ + return file->isValidLevel(lx, ly); +} + +int +TiledInputPart::levelWidth (int lx) const +{ + return file->levelWidth(lx); +} + +int +TiledInputPart::levelHeight (int ly) const +{ + return file->levelHeight(ly); +} + +int +TiledInputPart::numXTiles (int lx) const +{ + return file->numXTiles(lx); +} + +int +TiledInputPart::numYTiles (int ly) const +{ + return file->numYTiles(ly); +} + +IMATH_NAMESPACE::Box2i +TiledInputPart::dataWindowForLevel (int l) const +{ + return file->dataWindowForLevel(l); +} + +IMATH_NAMESPACE::Box2i +TiledInputPart::dataWindowForLevel (int lx, int ly) const +{ + return file->dataWindowForLevel(lx, ly); +} + +IMATH_NAMESPACE::Box2i +TiledInputPart::dataWindowForTile (int dx, int dy, int l) const +{ + return file->dataWindowForTile(dx, dy, l); +} + +IMATH_NAMESPACE::Box2i +TiledInputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return file->dataWindowForTile(dx, dy, lx, ly); +} + +void +TiledInputPart::readTile (int dx, int dy, int l) +{ + file->readTile(dx, dy, l); +} + +void +TiledInputPart::readTile (int dx, int dy, int lx, int ly) +{ + file->readTile(dx, dy, lx, ly); +} + +void +TiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) +{ + file->readTiles(dx1, dx2, dy1, dy2, lx, ly); +} + +void +TiledInputPart::readTiles (int dx1, int dx2, int dy1, int dy2, int l) +{ + file->readTiles(dx1, dx2, dy1, dy2, l); +} + +void +TiledInputPart::rawTileData (int &dx, int &dy, int &lx, int &ly, + const char *&pixelData, int &pixelDataSize) +{ + file->rawTileData(dx, dy, lx, ly, pixelData, pixelDataSize); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledInputPart.h b/IlmImf/ImfTiledInputPart.h new file mode 100644 index 0000000..ea44c02 --- /dev/null +++ b/IlmImf/ImfTiledInputPart.h @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFTILEDINPUTPART_H_ +#define IMFTILEDINPUTPART_H_ + +#include "ImfMultiPartInputFile.h" +#include "ImfTiledInputFile.h" +#include "ImfNamespace.h" +#include "ImfForward.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//----------------------------------------------------------------------------- +// class TiledInputPart: +// +// Same interface as TiledInputFile. Please have a reference to TiledInputFile. +//----------------------------------------------------------------------------- + +class IMF_EXPORT TiledInputPart +{ + public: + TiledInputPart(MultiPartInputFile& multiPartFile, int partNumber); + + const char * fileName () const; + const Header & header () const; + int version () const; + void setFrameBuffer (const FrameBuffer &frameBuffer); + const FrameBuffer & frameBuffer () const; + bool isComplete () const; + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + int levelWidth (int lx) const; + int levelHeight (int ly) const; + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + void readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + void readTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + private: + TiledInputFile* file; + // for internal use - allow TiledOutputFile access to file for copyPixels + friend class TiledOutputFile; + +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFTILEDINPUTPART_H_ */ diff --git a/IlmImf/ImfTiledMisc.cpp b/IlmImf/ImfTiledMisc.cpp new file mode 100644 index 0000000..d72d823 --- /dev/null +++ b/IlmImf/ImfTiledMisc.cpp @@ -0,0 +1,389 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Miscellaneous stuff related to tiled files +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include +#include +#include +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; + + +int +levelSize (int min, int max, int l, LevelRoundingMode rmode) +{ + if (l < 0) + throw IEX_NAMESPACE::ArgExc ("Argument not in valid range."); + + int a = max - min + 1; + int b = (1 << l); + int size = a / b; + + if (rmode == ROUND_UP && size * b < a) + size += 1; + + return std::max (size, 1); +} + + +Box2i +dataWindowForLevel (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int lx, int ly) +{ + V2i levelMin = V2i (minX, minY); + + V2i levelMax = levelMin + + V2i (levelSize (minX, maxX, lx, tileDesc.roundingMode) - 1, + levelSize (minY, maxY, ly, tileDesc.roundingMode) - 1); + + return Box2i(levelMin, levelMax); +} + + +Box2i +dataWindowForTile (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int dx, int dy, + int lx, int ly) +{ + V2i tileMin = V2i (minX + dx * tileDesc.xSize, + minY + dy * tileDesc.ySize); + + V2i tileMax = tileMin + V2i (tileDesc.xSize - 1, tileDesc.ySize - 1); + + V2i levelMax = dataWindowForLevel + (tileDesc, minX, maxX, minY, maxY, lx, ly).max; + + tileMax = V2i (std::min (tileMax[0], levelMax[0]), + std::min (tileMax[1], levelMax[1])); + + return Box2i (tileMin, tileMax); +} + + +size_t +calculateBytesPerPixel (const Header &header) +{ + const ChannelList &channels = header.channels(); + + size_t bytesPerPixel = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + bytesPerPixel += pixelTypeSize (c.channel().type); + } + + return bytesPerPixel; +} + + +void +calculateBytesPerLine (const Header &header, + char* sampleCountBase, + int sampleCountXStride, + int sampleCountYStride, + int minX, int maxX, + int minY, int maxY, + std::vector& xOffsets, + std::vector& yOffsets, + std::vector& bytesPerLine) +{ + const ChannelList &channels = header.channels(); + + int pos = 0; + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c, ++pos) + { + int xOffset = xOffsets[pos]; + int yOffset = yOffsets[pos]; + int i = 0; + for (int y = minY - yOffset; y <= maxY - yOffset; y++, i++) + for (int x = minX - xOffset; x <= maxX - xOffset; x++) + { + bytesPerLine[i] += sampleCount(sampleCountBase, + sampleCountXStride, + sampleCountYStride, + x, y) + * pixelTypeSize (c.channel().type); + } + } +} + + +namespace { + +int +floorLog2 (int x) +{ + // + // For x > 0, floorLog2(y) returns floor(log(x)/log(2)). + // + + int y = 0; + + while (x > 1) + { + y += 1; + x >>= 1; + } + + return y; +} + + +int +ceilLog2 (int x) +{ + // + // For x > 0, ceilLog2(y) returns ceil(log(x)/log(2)). + // + + int y = 0; + int r = 0; + + while (x > 1) + { + if (x & 1) + r = 1; + + y += 1; + x >>= 1; + } + + return y + r; +} + + +int +roundLog2 (int x, LevelRoundingMode rmode) +{ + return (rmode == ROUND_DOWN)? floorLog2 (x): ceilLog2 (x); +} + + +int +calculateNumXLevels (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY) +{ + int num = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + + num = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + int h = maxY - minY + 1; + num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + num = roundLog2 (w, tileDesc.roundingMode) + 1; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } + + return num; +} + + +int +calculateNumYLevels (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY) +{ + int num = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + + num = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + int h = maxY - minY + 1; + num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int h = maxY - minY + 1; + num = roundLog2 (h, tileDesc.roundingMode) + 1; + } + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } + + return num; +} + + +void +calculateNumTiles (int *numTiles, + int numLevels, + int min, int max, + int size, + LevelRoundingMode rmode) +{ + for (int i = 0; i < numLevels; i++) + { + numTiles[i] = (levelSize (min, max, i, rmode) + size - 1) / size; + } +} + +} // namespace + + +void +precalculateTileInfo (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY, + int *&numXTiles, int *&numYTiles, + int &numXLevels, int &numYLevels) +{ + numXLevels = calculateNumXLevels(tileDesc, minX, maxX, minY, maxY); + numYLevels = calculateNumYLevels(tileDesc, minX, maxX, minY, maxY); + + numXTiles = new int[numXLevels]; + numYTiles = new int[numYLevels]; + + calculateNumTiles (numXTiles, + numXLevels, + minX, maxX, + tileDesc.xSize, + tileDesc.roundingMode); + + calculateNumTiles (numYTiles, + numYLevels, + minY, maxY, + tileDesc.ySize, + tileDesc.roundingMode); +} + + +int +getTiledChunkOffsetTableSize(const Header& header) +{ + // + // Save the dataWindow information + // + + const Box2i &dataWindow = header.dataWindow(); + + // + // Precompute level and tile information. + // + + int* numXTiles; + int* numYTiles; + int numXLevels; + int numYLevels; + precalculateTileInfo (header.tileDescription(), + dataWindow.min.x, dataWindow.max.x, + dataWindow.min.y, dataWindow.max.y, + numXTiles, numYTiles, + numXLevels, numYLevels); + + // + // Calculate lineOffsetSize. + // + int lineOffsetSize = 0; + const TileDescription &desc = header.tileDescription(); + switch (desc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + for (int i = 0; i < numXLevels; i++) + lineOffsetSize += numXTiles[i] * numYTiles[i]; + break; + case RIPMAP_LEVELS: + for (int i = 0; i < numXLevels; i++) + for (int j = 0; j < numYLevels; j++) + lineOffsetSize += numXTiles[i] * numYTiles[j]; + break; + case NUM_LEVELMODES : + throw IEX_NAMESPACE::LogicExc("Bad level mode getting chunk offset table size"); + } + + delete[] numXTiles; + delete[] numYTiles; + + return lineOffsetSize; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledMisc.h b/IlmImf/ImfTiledMisc.h new file mode 100644 index 0000000..2696663 --- /dev/null +++ b/IlmImf/ImfTiledMisc.h @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILED_MISC_H +#define INCLUDED_IMF_TILED_MISC_H + +//----------------------------------------------------------------------------- +// +// Miscellaneous stuff related to tiled files +// +//----------------------------------------------------------------------------- + +#include "ImathBox.h" +#include "ImfHeader.h" +#include "ImfNamespace.h" + +#include +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +IMF_EXPORT +int levelSize (int min, int max, int l, LevelRoundingMode rmode); + +IMF_EXPORT +IMATH_NAMESPACE::Box2i dataWindowForLevel (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int lx, int ly); + +IMF_EXPORT +IMATH_NAMESPACE::Box2i dataWindowForTile (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int dx, int dy, + int lx, int ly); + +IMF_EXPORT +size_t calculateBytesPerPixel (const Header &header); + +// +// Calculate the count of bytes for each lines in range [minY, maxY], +// and pixels in range [minX, maxX]. +// Data will be saved in bytesPerLine. +// sampleCountBase, sampleCountXStride and sampleCountYStride are +// used to get the sample count values. +// + +IMF_EXPORT +void calculateBytesPerLine (const Header &header, + char* sampleCountBase, + int sampleCountXStride, + int sampleCountYStride, + int minX, int maxX, + int minY, int maxY, + std::vector& xOffsets, + std::vector& yOffsets, + std::vector& bytesPerLine); + +IMF_EXPORT +void precalculateTileInfo (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY, + int *&numXTiles, int *&numYTiles, + int &numXLevels, int &numYLevels); + +IMF_EXPORT +int getTiledChunkOffsetTableSize(const Header& header); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfTiledOutputFile.cpp b/IlmImf/ImfTiledOutputFile.cpp new file mode 100644 index 0000000..3a17561 --- /dev/null +++ b/IlmImf/ImfTiledOutputFile.cpp @@ -0,0 +1,1841 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledOutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include +#include +#include +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "ImfOutputStreamMutex.h" +#include "ImfOutputPartData.h" +#include "Iex.h" +#include +#include +#include +#include +#include +#include + +#include "ImfNamespace.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using IMATH_NAMESPACE::Box2i; +using IMATH_NAMESPACE::V2i; +using std::string; +using std::vector; +using std::ofstream; +using std::map; +using std::min; +using std::max; +using std::swap; +using ILMTHREAD_NAMESPACE::Mutex; +using ILMTHREAD_NAMESPACE::Lock; +using ILMTHREAD_NAMESPACE::Semaphore; +using ILMTHREAD_NAMESPACE::Task; +using ILMTHREAD_NAMESPACE::TaskGroup; +using ILMTHREAD_NAMESPACE::ThreadPool; + +namespace { + +struct TOutSliceInfo +{ + PixelType type; + const char * base; + size_t xStride; + size_t yStride; + bool zero; + int xTileCoords; + int yTileCoords; + + TOutSliceInfo (PixelType type = HALF, + const char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + bool zero = false, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TOutSliceInfo::TOutSliceInfo (PixelType t, + const char *b, + size_t xs, size_t ys, + bool z, + int xtc, + int ytc) +: + type (t), + base (b), + xStride (xs), + yStride (ys), + zero (z), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileCoord +{ + int dx; + int dy; + int lx; + int ly; + + + TileCoord (int xTile = 0, int yTile = 0, + int xLevel = 0, int yLevel = 0) + : + dx (xTile), dy (yTile), + lx (xLevel), ly (yLevel) + { + // empty + } + + + bool + operator < (const TileCoord &other) const + { + return (ly < other.ly) || + (ly == other.ly && lx < other.lx) || + ((ly == other.ly && lx == other.lx) && + ((dy < other.dy) || (dy == other.dy && dx < other.dx))); + } + + + bool + operator == (const TileCoord &other) const + { + return lx == other.lx && + ly == other.ly && + dx == other.dx && + dy == other.dy; + } +}; + + +struct BufferedTile +{ + char * pixelData; + int pixelDataSize; + + BufferedTile (const char *data, int size): + pixelData (0), + pixelDataSize(size) + { + pixelData = new char[pixelDataSize]; + memcpy (pixelData, data, pixelDataSize); + } + + ~BufferedTile() + { + delete [] pixelData; + } +}; + + +typedef map TileMap; + + +struct TileBuffer +{ + Array buffer; + const char * dataPtr; + int dataSize; + Compressor * compressor; + TileCoord tileCoord; + bool hasException; + string exception; + + TileBuffer (Compressor *comp); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (Compressor *comp): + dataPtr (0), + dataSize (0), + compressor (comp), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + delete compressor; +} + + +} // namespace + + +struct TiledOutputFile::Data +{ + Header header; // the image header + int version; // file format version + bool multipart; // part came from a multipart file + TileDescription tileDesc; // describes the tile layout + FrameBuffer frameBuffer; // framebuffer to write into + Int64 previewPosition; + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + + size_t maxBytesPerTileLine; // combined size of a tile line + // over all channels + + + vector tileBuffers; + size_t tileBufferSize; // size of a tile buffer + + Int64 tileOffsetsPosition; // position of the tile index + + TileMap tileMap; + TileCoord nextTileToWrite; + + int partNumber; // the output part number + + Data (int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile + // buffer coords into our + // vector of tile buffers + + TileCoord nextTileCoord (const TileCoord &a); +}; + + +TiledOutputFile::Data::Data (int numThreads): + multipart(false), + numXTiles(0), + numYTiles(0), + tileOffsetsPosition (0), + partNumber(-1) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); +} + + +TiledOutputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + // + // Delete all the tile buffers, if any still happen to exist + // + + for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i) + delete i->second; + + for (size_t i = 0; i < tileBuffers.size(); i++) + delete tileBuffers[i]; +} + + +TileBuffer* +TiledOutputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +TileCoord +TiledOutputFile::Data::nextTileCoord (const TileCoord &a) +{ + TileCoord b = a; + + if (lineOrder == INCREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy++; + + if (b.dy >= numYTiles[b.ly]) + { + // + // the next tile is in the next level + // + + b.dy = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + case NUM_LEVELMODES: + throw(IEX_NAMESPACE::ArgExc("Invalid tile description")); + + } + } + } + } + else if (lineOrder == DECREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy--; + + if (b.dy < 0) + { + // + // the next tile is in the next level + // + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + case NUM_LEVELMODES: + throw(IEX_NAMESPACE::ArgExc("Invalid tile description")); + + } + + if (b.ly < numYLevels) + b.dy = numYTiles[b.ly] - 1; + } + } + } + + return b; +} + + +namespace { + +void +writeTileData (OutputStreamMutex *streamData, + TiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + int pixelDataSize) +{ + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file, + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = streamData->currentPosition; + streamData->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = streamData->os->tellp(); + + ofd->tileOffsets (dx, dy, lx, ly) = currentPosition; + + #ifdef DEBUG + assert (streamData->os->tellp() == currentPosition); + #endif + + // + // Write the tile header. + // + + if (ofd->multipart) + { + Xdr::write (*streamData->os, ofd->partNumber); + } + Xdr::write (*streamData->os, dx); + Xdr::write (*streamData->os, dy); + Xdr::write (*streamData->os, lx); + Xdr::write (*streamData->os, ly); + Xdr::write (*streamData->os, pixelDataSize); + + streamData->os->write (pixelData, pixelDataSize); + + // + // Keep current position in the file so that we can avoid + // redundant seekg() operations (seekg() can be fairly expensive). + // + + streamData->currentPosition = currentPosition + + 5 * Xdr::size() + + pixelDataSize; + + if (ofd->multipart) + { + streamData->currentPosition += Xdr::size(); + } +} + + + +void +bufferedTileWrite (OutputStreamMutex *streamData, + TiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + int pixelDataSize) +{ + // + // Check if a tile with coordinates (dx,dy,lx,ly) has already been written. + // + + if (ofd->tileOffsets (dx, dy, lx, ly)) + { + THROW (IEX_NAMESPACE::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " + "more than once."); + } + + // + // If tiles can be written in random order, then don't buffer anything. + // + + if (ofd->lineOrder == RANDOM_Y) + { + writeTileData (streamData, ofd, dx, dy, lx, ly, pixelData, pixelDataSize); + return; + } + + // + // If the tiles cannot be written in random order, then check if a + // tile with coordinates (dx,dy,lx,ly) has already been buffered. + // + + TileCoord currentTile = TileCoord(dx, dy, lx, ly); + + if (ofd->tileMap.find (currentTile) != ofd->tileMap.end()) + { + THROW (IEX_NAMESPACE::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") " + "more than once."); + } + + // + // If all the tiles before this one have already been written to the file, + // then write this tile immediately and check if we have buffered tiles + // that can be written after this tile. + // + // Otherwise, buffer the tile so it can be written to file later. + // + + if (ofd->nextTileToWrite == currentTile) + { + writeTileData (streamData, ofd, dx, dy, lx, ly, pixelData, pixelDataSize); + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + + TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite); + + // + // Step through the tiles and write all successive buffered tiles after + // the current one. + // + + while(i != ofd->tileMap.end()) + { + // + // Write the tile, and then delete the tile's buffered data + // + + writeTileData (streamData, + ofd, + i->first.dx, i->first.dy, + i->first.lx, i->first.ly, + i->second->pixelData, + i->second->pixelDataSize); + + delete i->second; + ofd->tileMap.erase (i); + + // + // Proceed to the next tile + // + + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + i = ofd->tileMap.find (ofd->nextTileToWrite); + } + } + else + { + // + // Create a new BufferedTile, copy the pixelData into it, and + // insert it into the tileMap. + // + + ofd->tileMap[currentTile] = + new BufferedTile ((const char *)pixelData, pixelDataSize); + } +} + + +void +convertToXdr (TiledOutputFile::Data *ofd, + Array& tileBuffer, + int numScanLines, + int numPixelsPerScanLine) +{ + // + // Convert the contents of a TiledOutputFile's tileBuffer from the + // machine's native representation to Xdr format. This function is called + // by writeTile(), below, if the compressor wanted its input pixel data + // in the machine's native format, but then failed to compress the data + // (most compressors will expand rather than compress random input data). + // + // Note that this routine assumes that the machine's native representation + // of the pixel data has the same size as the Xdr representation. This + // makes it possible to convert the pixel data in place, without an + // intermediate temporary buffer. + // + + // + // Set these to point to the start of the tile. + // We will write to toPtr, and read from fromPtr. + // + + char *writePtr = tileBuffer; + const char *readPtr = writePtr; + + // + // Iterate over all scan lines in the tile. + // + + for (int y = 0; y < numScanLines; ++y) + { + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = ofd->slices[i]; + + // + // Convert the samples in place. + // + + convertInPlace (writePtr, readPtr, slice.type, + numPixelsPerScanLine); + } + } + + #ifdef DEBUG + + assert (writePtr == readPtr); + + #endif +} + + +// +// A TileBufferTask encapsulates the task of copying a tile from +// the user's framebuffer into a LineBuffer and compressing the data +// if necessary. +// + +class TileBufferTask: public Task +{ + public: + + TileBufferTask (TaskGroup *group, + TiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + TiledOutputFile::Data * _ofd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + TiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly) +: + Task (group), + _ofd (ofd), + _tileBuffer (_ofd->getTileBuffer (number)) +{ + // + // Wait for the tileBuffer to become available + // + + _tileBuffer->wait (); + _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly); +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the frame buffer + // into the tile buffer + // + // Convert one tile's worth of pixel data to + // a machine-independent representation, and store + // the result in _tileBuffer->buffer. + // + + char *writePtr = _tileBuffer->buffer; + + Box2i tileRange = dataWindowForTile (_ofd->tileDesc, + _ofd->minX, _ofd->maxX, + _ofd->minY, _ofd->maxY, + _tileBuffer->tileCoord.dx, + _tileBuffer->tileCoord.dy, + _tileBuffer->tileCoord.lx, + _tileBuffer->tileCoord.ly); + + int numScanLines = tileRange.max.y - tileRange.min.y + 1; + int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; + + // + // Iterate over the scan lines in the tile. + // + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = _ofd->slices[i]; + + // + // These offsets are used to facilitate both absolute + // and tile-relative pixel coordinates. + // + + int xOffset = slice.xTileCoords * tileRange.min.x; + int yOffset = slice.yTileCoords * tileRange.min.y; + + // + // Fill the tile buffer with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _data->tileBuffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + numPixelsPerScanLine); + } + else + { + // + // The frame buffer contains data for this channel. + // + + const char *readPtr = slice.base + + (y - yOffset) * slice.yStride + + (tileRange.min.x - xOffset) * + slice.xStride; + + const char *endPtr = readPtr + + (numPixelsPerScanLine - 1) * + slice.xStride; + + copyFromFrameBuffer (writePtr, readPtr, endPtr, + slice.xStride, _ofd->format, + slice.type); + } + } + } + + // + // Compress the contents of the tileBuffer, + // and store the compressed data in the output file. + // + + _tileBuffer->dataSize = writePtr - _tileBuffer->buffer; + _tileBuffer->dataPtr = _tileBuffer->buffer; + + if (_tileBuffer->compressor) + { + const char *compPtr; + + int compSize = _tileBuffer->compressor->compressTile + (_tileBuffer->dataPtr, + _tileBuffer->dataSize, + tileRange, compPtr); + + if (compSize < _tileBuffer->dataSize) + { + _tileBuffer->dataSize = compSize; + _tileBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using native format, + // so we need to convert the lineBuffer to Xdr. + // + + convertToXdr (_ofd, _tileBuffer->buffer, numScanLines, + numPixelsPerScanLine); + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + +} // namespace + + +TiledOutputFile::TiledOutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (numThreads)), + _streamData (new OutputStreamMutex()), + _deleteStream (true) +{ + try + { + header.sanityCheck (true); + _streamData->os = new StdOFStream (fileName); + _data->multipart=false; // since we opened with one header we can't be multipart + initialize (header); + _streamData->currentPosition = _streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_streamData->os, _data->header); + _data->previewPosition = _data->header.writeTo (*_streamData->os, true); + _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_streamData->os); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _streamData; + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _streamData; + delete _data; + throw; + } +} + + +TiledOutputFile::TiledOutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (numThreads)), + _streamData (new OutputStreamMutex()), + _deleteStream (false) +{ + try + { + header.sanityCheck(true); + _streamData->os = &os; + _data->multipart=false; // since we opened with one header we can't be multipart + initialize (header); + _streamData->currentPosition = _streamData->os->tellp(); + + // Write header and empty offset table to the file. + writeMagicNumberAndVersionField(*_streamData->os, _data->header); + _data->previewPosition = _data->header.writeTo (*_streamData->os, true); + _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_streamData->os); + + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _streamData; + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _streamData; + delete _data; + throw; + } +} + +TiledOutputFile::TiledOutputFile(const OutputPartData* part) : + _deleteStream (false) +{ + try + { + if (part->header.type() != TILEDIMAGE) + throw IEX_NAMESPACE::ArgExc("Can't build a TiledOutputFile from a type-mismatched part."); + + _streamData = part->mutex; + _data = new Data(part->numThreads); + _data->multipart=part->multipart; + initialize(part->header); + _data->partNumber = part->partNumber; + _data->tileOffsetsPosition = part->chunkOffsetTablePosition; + _data->previewPosition = part->previewPosition; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot initialize output part " + "\"" << part->partNumber << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + +void +TiledOutputFile::initialize (const Header &header) +{ + _data->header = header; + _data->lineOrder = _data->header.lineOrder(); + + + + // + // Check that the file is indeed tiled + // + + _data->tileDesc = _data->header.tileDescription(); + + + // + // 'Fix' the type attribute if it exists but is incorrectly set + // (attribute is optional, but ensure it is correct if it exists) + // + if(_data->header.hasType()) + { + _data->header.setType(TILEDIMAGE); + } + + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + // + // Determine the first tile coordinate that we will be writing + // if the file is not RANDOM_Y. + // + + _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)? + TileCoord (0, 0, 0, 0): + TileCoord (0, _data->numYTiles[0] - 1, 0, 0); + + _data->maxBytesPerTileLine = + calculateBytesPerPixel (_data->header) * _data->tileDesc.xSize; + + _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; + + // + // Create all the TileBuffers and allocate their internal buffers + // + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + { + _data->tileBuffers[i] = new TileBuffer (newTileCompressor + (_data->header.compression(), + _data->maxBytesPerTileLine, + _data->tileDesc.ySize, + _data->header)); + + _data->tileBuffers[i]->buffer.resizeErase(_data->tileBufferSize); + } + + _data->format = defaultFormat (_data->tileBuffers[0]->compressor); + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); +} + + +TiledOutputFile::~TiledOutputFile () +{ + if (_data) + { + { + Lock lock(*_streamData); + Int64 originalPosition = _streamData->os->tellp(); + + if (_data->tileOffsetsPosition > 0) + { + try + { + _streamData->os->seekp (_data->tileOffsetsPosition); + _data->tileOffsets.writeTo (*_streamData->os); + + // + // Restore the original position. + // + _streamData->os->seekp (originalPosition); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + if (_deleteStream && _streamData) + delete _streamData->os; + + if (_data->partNumber == -1) + delete _streamData; + + delete _data; + } +} + + +const char * +TiledOutputFile::fileName () const +{ + return _streamData->os->fileName(); +} + + +const Header & +TiledOutputFile::header () const +{ + return _data->header; +} + + +void +TiledOutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_streamData); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + + if (j.slice().xSampling != 1 || j.slice().ySampling != 1) + THROW (IEX_NAMESPACE::ArgExc, "All channels in a tiled file must have" + "sampling (1,1)."); + } + + // + // Initialize slice table for writePixels(). + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (TOutSliceInfo (i.channel().type, + 0, // base + 0, // xStride, + 0, // yStride, + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (TOutSliceInfo (j.slice().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + false, // zero + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +TiledOutputFile::frameBuffer () const +{ + Lock lock (*_streamData); + return _data->frameBuffer; +} + + +void +TiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly) +{ + try + { + Lock lock (*_streamData); + + if (_data->slices.size() == 0) + throw IEX_NAMESPACE::ArgExc ("No frame buffer specified " + "as pixel data source."); + + if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Tile coordinates are invalid."); + + if (!isValidLevel (lx, ly)) + THROW (IEX_NAMESPACE::ArgExc, + "Level coordinate " + "(" << lx << ", " << ly << ") " + "is invalid."); + // + // Determine the first and last tile coordinates in both dimensions + // based on the file's lineOrder + // + + if (dx1 > dx2) + swap (dx1, dx2); + + if (dy1 > dy2) + swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); + int numTasks = min ((int)_data->tileBuffers.size(), numTiles); + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add in the initial compression tasks to the thread pool + // + + int nextCompBuffer = 0; + int dxComp = dx1; + int dyComp = dyStart; + + while (nextCompBuffer < numTasks) + { + ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer++, + dxComp, dyComp, + lx, ly)); + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // Write the compressed buffers and add in more compression + // tasks until done + // + + int nextWriteBuffer = 0; + int dxWrite = dx1; + int dyWrite = dyStart; + + while (nextWriteBuffer < numTiles) + { + // + // Wait until the nextWriteBuffer is ready to be written + // + + TileBuffer* writeBuffer = + _data->getTileBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + // + // Write the tilebuffer + // + + bufferedTileWrite (_streamData, _data, dxWrite, dyWrite, lx, ly, + writeBuffer->dataPtr, + writeBuffer->dataSize); + + // + // Release the lock on nextWriteBuffer + // + + writeBuffer->post(); + + // + // If there are no more tileBuffers to compress, then + // only continue to write out remaining tileBuffers, + // otherwise keep adding compression tasks. + // + + if (nextCompBuffer < numTiles) + { + // + // add nextCompBuffer as a compression Task + // + + ThreadPool::addGlobalTask + (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer, + dxComp, dyComp, + lx, ly)); + } + + nextWriteBuffer++; + dxWrite++; + + if (dxWrite > dx2) + { + dxWrite = dx1; + dyWrite += dY; + } + + nextCompBuffer++; + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledOutputFile::writeTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (size_t i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw IEX_NAMESPACE::IoExc (*exception); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l) +{ + writeTiles (dx1, dxMax, dyMin, dyMax, l, l); +} + + +void +TiledOutputFile::writeTile (int dx, int dy, int lx, int ly) +{ + writeTiles (dx, dx, dy, dy, lx, ly); +} + + +void +TiledOutputFile::writeTile (int dx, int dy, int l) +{ + writeTile(dx, dy, l, l); +} + + +void +TiledOutputFile::copyPixels (TiledInputFile &in) +{ + Lock lock (*_streamData); + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + if (!hdr.hasTileDescription() || !inHdr.hasTileDescription()) + THROW (IEX_NAMESPACE::ArgExc, "Cannot perform a quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". The " + "output file is tiled, but the input file is not. " + "Try using OutputFile::copyPixels() instead."); + + if (!(hdr.tileDescription() == inHdr.tileDescription())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different tile descriptions."); + + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". The " + "files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" " + "failed. The files have different channel " + "lists."); + + // + // Verify that no pixel data have been written to this file yet. + // + + if (!_data->tileOffsets.isEmpty()) + THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << _streamData->os->fileName() << "\" " + "failed. \"" << fileName() << "\" " + "already contains pixel data."); + + // + // Calculate the total number of tiles in the file + // + + int numAllTiles = 0; + + switch (levelMode ()) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + for (int i_l = 0; i_l < numLevels (); ++i_l) + numAllTiles += numXTiles (i_l) * numYTiles (i_l); + + break; + + case RIPMAP_LEVELS: + + for (int i_ly = 0; i_ly < numYLevels (); ++i_ly) + for (int i_lx = 0; i_lx < numXLevels (); ++i_lx) + numAllTiles += numXTiles (i_lx) * numYTiles (i_ly); + + break; + + default: + + throw IEX_NAMESPACE::ArgExc ("Unknown LevelMode format."); + } + + bool random_y = _data->lineOrder==RANDOM_Y; + + std::vector dx_table(random_y ? numAllTiles : 1); + std::vector dy_table(random_y ? numAllTiles : 1); + std::vector lx_table(random_y ? numAllTiles : 1); + std::vector ly_table(random_y ? numAllTiles : 1); + + if(random_y) + { + in.tileOrder(&dx_table[0],&dy_table[0],&lx_table[0],&ly_table[0]); + _data->nextTileToWrite.dx=dx_table[0]; + _data->nextTileToWrite.dy=dy_table[0]; + _data->nextTileToWrite.lx=lx_table[0]; + _data->nextTileToWrite.ly=ly_table[0]; + } + + for (int i = 0; i < numAllTiles; ++i) + { + const char *pixelData; + int pixelDataSize; + + int dx = _data->nextTileToWrite.dx; + int dy = _data->nextTileToWrite.dy; + int lx = _data->nextTileToWrite.lx; + int ly = _data->nextTileToWrite.ly; + + + in.rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); + writeTileData (_streamData, _data, dx, dy, lx, ly, pixelData, pixelDataSize); + + if(random_y) + { + if(inextTileToWrite.dx=dx_table[i+1]; + _data->nextTileToWrite.dy=dy_table[i+1]; + _data->nextTileToWrite.lx=lx_table[i+1]; + _data->nextTileToWrite.ly=ly_table[i+1]; + } + }else{ + _data->nextTileToWrite=_data->nextTileCoord(_data->nextTileToWrite); + } + } +} + + +void +TiledOutputFile::copyPixels (InputFile &in) +{ + copyPixels (*in.tFile()); +} + + +void +TiledOutputFile::copyPixels (InputPart &in) +{ + copyPixels (*in.file); +} + +void +TiledOutputFile::copyPixels (TiledInputPart &in) +{ + copyPixels (*in.file); +} + + + +unsigned int +TiledOutputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +TiledOutputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +TiledOutputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +TiledOutputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +TiledOutputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for RIPMAPs)."); + return _data->numXLevels; +} + + +int +TiledOutputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +TiledOutputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +TiledOutputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +TiledOutputFile::levelWidth (int lx) const +{ + try + { + int retVal = levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + + return retVal; + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledOutputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledOutputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " + "file \"" << _streamData->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numXTiles[lx]; +} + + +int +TiledOutputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image " + "file \"" << _streamData->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numYTiles[ly]; +} + + +Box2i +TiledOutputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +TiledOutputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +TiledOutputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +TiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range."); + + return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile ( + _data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, + lx, ly); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +TiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + + +void +TiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_streamData); + + if (_data->previewPosition <= 0) + THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _streamData->os->tellp(); + + try + { + _streamData->os->seekp (_data->previewPosition); + pia.writeValueTo (*_streamData->os, _data->version); + _streamData->os->seekp (savedPosition); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledOutputFile::breakTile + (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c) +{ + Lock lock (*_streamData); + + Int64 position = _data->tileOffsets (dx, dy, lx, ly); + + if (!position) + THROW (IEX_NAMESPACE::ArgExc, + "Cannot overwrite tile " + "(" << dx << ", " << dy << ", " << lx << "," << ly << "). " + "The tile has not yet been stored in " + "file \"" << fileName() << "\"."); + + _streamData->currentPosition = 0; + _streamData->os->seekp (position + offset); + + for (int i = 0; i < length; ++i) + _streamData->os->write (&c, 1); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledOutputFile.h b/IlmImf/ImfTiledOutputFile.h new file mode 100644 index 0000000..bfd6bea --- /dev/null +++ b/IlmImf/ImfTiledOutputFile.h @@ -0,0 +1,495 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILED_OUTPUT_FILE_H +#define INCLUDED_IMF_TILED_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class TiledOutputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImathBox.h" +#include "ImfTileDescription.h" +#include "ImfThreading.h" +#include "ImfGenericOutputFile.h" +#include "ImfForward.h" +#include "ImfNamespace.h" +#include "ImfExport.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +struct PreviewRgba; + + +class IMF_EXPORT TiledOutputFile : public GenericOutputFile +{ + public: + + //------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // writes the file header. The file header is also copied into the + // TiledOutputFile object, and can later be accessed via the header() + // method. + // + // Destroying TiledOutputFile constructed with this constructor + // automatically closes the corresponding files. + // + // The header must contain a TileDescriptionAttribute called "tiles". + // + // The x and y subsampling factors for all image channels must be 1; + // subsampling is not supported. + // + // Tiles can be written to the file in arbitrary order. The line + // order attribute can be used to cause the tiles to be sorted in + // the file. When the file is read later, reading the tiles in the + // same order as they are in the file tends to be significantly + // faster than reading the tiles in random order (see writeTile, + // below). + //------------------------------------------------------------------- + + TiledOutputFile (const char fileName[], + const Header &header, + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------------- + // A constructor that attaches the new TiledOutputFile object to + // a file that has already been opened. Destroying TiledOutputFile + // objects constructed with this constructor does not automatically + // close the corresponding files. + // ---------------------------------------------------------------- + + TiledOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + int numThreads = globalThreadCount ()); + + + //----------------------------------------------------- + // Destructor + // + // Destroying a TiledOutputFile object before all tiles + // have been written results in an incomplete file. + //----------------------------------------------------- + + virtual ~TiledOutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledOutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writeTile() is + // called. The current frame buffer can be changed + // after each call to writeTile(). + //------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------- + // Utility functions: + //------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with MIPMAP_LEVELS + // files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an IEX_NAMESPACE::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //--------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //--------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //---------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //---------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a level with + // level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx) - 1] + // dy must lie in the interval [0, numYTiles(ly) - 1] + // + // lx must lie in the interval [0, numXLevels() - 1] + // ly must lie in the inverval [0, numYLevels() - 1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. The tile coordinates, + // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile + // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the + // tiles are always written in the order specified by the line + // order attribute. Hence, it is not possible to specify an + // "invalid" or empty tile range. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + // The file's line order attribute determines the order of the tiles + // in the file: + // + // INCREASING_Y In the file, the tiles for each level are stored + // in a contiguous block. The levels are ordered + // like this: + // + // (0, 0) (1, 0) ... (nx-1, 0) + // (0, 1) (1, 1) ... (nx-1, 1) + // ... + // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) + // + // where nx = numXLevels(), and ny = numYLevels(). + // In an individual level, (lx, ly), the tiles + // are stored in the following order: + // + // (0, 0) (1, 0) ... (tx-1, 0) + // (0, 1) (1, 1) ... (tx-1, 1) + // ... + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // + // where tx = numXTiles(lx), + // and ty = numYTiles(ly). + // + // DECREASING_Y As for INCREASING_Y, the tiles for each level + // are stored in a contiguous block. The levels + // are ordered the same way as for INCREASING_Y, + // but within an individual level, the tiles + // are stored in this order: + // + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // ... + // (0, 1) (1, 1) ... (tx-1, 1) + // (0, 0) (1, 0) ... (tx-1, 0) + // + // + // RANDOM_Y The order of the calls to writeTile() determines + // the order of the tiles in the file. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from a TiledInputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the TiledInputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + //------------------------------------------------------------------ + + void copyPixels (TiledInputFile &in); + void copyPixels (TiledInputPart &in); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + // + // To use this function, the InputFile must be tiled. + //------------------------------------------------------------------ + + void copyPixels (InputFile &in); + void copyPixels (InputPart &in); + + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an IEX_NAMESPACE::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few tiles at a time, + // while the image is being generated. Since the preview image + // is an attribute in the file's header, it gets stored in the + // file as soon as the file is opened, but we may not know what + // the preview image should look like until we have written the + // last tile of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //------------------------------------------------------------- + // Break a tile -- for testing and debugging only: + // + // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the tile with tile coordinates + // (dx, dy) and level number (lx, ly). + // + // Warning: Calling this function usually results in a broken + // image file. The file or parts of it may not be readable, + // or the file may contain bad data. + // + //------------------------------------------------------------- + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + struct Data; + + private: + + // ---------------------------------------------------------------- + // A constructor attaches the OutputStreamMutex to the + // given one from MultiPartOutputFile. Set the previewPosition + // and lineOffsetsPosition which have been acquired from + // the constructor of MultiPartOutputFile as well. + // ---------------------------------------------------------------- + TiledOutputFile (const OutputPartData* part); + + TiledOutputFile (const TiledOutputFile &); // not implemented + TiledOutputFile & operator = (const TiledOutputFile &); // not implemented + + void initialize (const Header &header); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + Data * _data; + + OutputStreamMutex* _streamData; + bool _deleteStream; + + friend class MultiPartOutputFile; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfTiledOutputPart.cpp b/IlmImf/ImfTiledOutputPart.cpp new file mode 100644 index 0000000..cfa0e78 --- /dev/null +++ b/IlmImf/ImfTiledOutputPart.cpp @@ -0,0 +1,228 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfTiledOutputPart.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +TiledOutputPart::TiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber) +{ + file = multiPartFile.getOutputPart(partNumber); +} + +const char * +TiledOutputPart::fileName () const +{ + return file->fileName(); +} + +const Header & +TiledOutputPart::header () const +{ + return file->header(); +} + +void +TiledOutputPart::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + file->setFrameBuffer(frameBuffer); +} + +const FrameBuffer & +TiledOutputPart::frameBuffer () const +{ + return file->frameBuffer(); +} + +unsigned int +TiledOutputPart::tileXSize () const +{ + return file->tileXSize(); +} + +unsigned int +TiledOutputPart::tileYSize () const +{ + return file->tileYSize(); +} + +LevelMode +TiledOutputPart::levelMode () const +{ + return file->levelMode(); +} + +LevelRoundingMode +TiledOutputPart::levelRoundingMode () const +{ + return file->levelRoundingMode(); +} + +int +TiledOutputPart::numLevels () const +{ + return file->numLevels(); +} + +int +TiledOutputPart::numXLevels () const +{ + return file->numXLevels(); +} + +int +TiledOutputPart::numYLevels () const +{ + return file->numYLevels(); +} + +bool +TiledOutputPart::isValidLevel (int lx, int ly) const +{ + return file->isValidLevel(lx, ly); +} + +int +TiledOutputPart::levelWidth (int lx) const +{ + return file->levelWidth(lx); +} + +int +TiledOutputPart::levelHeight (int ly) const +{ + return file->levelHeight(ly); +} + +int +TiledOutputPart::numXTiles (int lx) const +{ + return file->numXTiles(lx); +} + +int +TiledOutputPart::numYTiles (int ly) const +{ + return file->numYTiles(ly); +} + +IMATH_NAMESPACE::Box2i +TiledOutputPart::dataWindowForLevel (int l) const +{ + return file->dataWindowForLevel(l); +} + +IMATH_NAMESPACE::Box2i +TiledOutputPart::dataWindowForLevel (int lx, int ly) const +{ + return file->dataWindowForLevel(lx, ly); +} + +IMATH_NAMESPACE::Box2i +TiledOutputPart::dataWindowForTile (int dx, int dy, int l) const +{ + return file->dataWindowForTile(dx, dy, l); +} + +IMATH_NAMESPACE::Box2i +TiledOutputPart::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return file->dataWindowForTile(dx, dy, lx, ly); +} + +void +TiledOutputPart::writeTile (int dx, int dy, int l) +{ + file->writeTile(dx, dy, l); +} + +void +TiledOutputPart::writeTile (int dx, int dy, int lx, int ly) +{ + file->writeTile(dx, dy, lx, ly); +} + +void +TiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) +{ + file->writeTiles(dx1, dx2, dy1, dy2, lx, ly); +} + +void +TiledOutputPart::writeTiles (int dx1, int dx2, int dy1, int dy2, int l) +{ + file->writeTiles(dx1, dx2, dy1, dy2, l); +} + +void +TiledOutputPart::copyPixels (TiledInputFile &in) +{ + file->copyPixels(in); +} + +void +TiledOutputPart::copyPixels (InputFile &in) +{ + file->copyPixels(in); +} + +void +TiledOutputPart::copyPixels (TiledInputPart &in) +{ + file->copyPixels(in); +} + +void +TiledOutputPart::copyPixels (InputPart &in) +{ + file->copyPixels(in); +} + + + +void +TiledOutputPart::updatePreviewImage (const PreviewRgba newPixels[]) +{ + file->updatePreviewImage(newPixels); +} + +void +TiledOutputPart::breakTile (int dx, int dy, int lx, int ly, int offset, int length, char c) +{ + file->breakTile(dx, dy, lx, ly, offset, length, c); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledOutputPart.h b/IlmImf/ImfTiledOutputPart.h new file mode 100644 index 0000000..1af84be --- /dev/null +++ b/IlmImf/ImfTiledOutputPart.h @@ -0,0 +1,105 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef IMFTILEDOUTPUTPART_H_ +#define IMFTILEDOUTPUTPART_H_ + +#include "ImfMultiPartOutputFile.h" +#include "ImfTiledOutputFile.h" +#include "ImfForward.h" +#include "ImfExport.h" +#include "ImfNamespace.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +//------------------------------------------------------------------------------- +// class TiledOutputPart: +// +// Same interface as TiledOutputFile. Please have a reference to TiledOutputFile. +//------------------------------------------------------------------------------- + +class IMF_EXPORT TiledOutputPart +{ + public: + TiledOutputPart(MultiPartOutputFile& multiPartFile, int partNumber); + + const char * fileName () const; + const Header & header () const; + void setFrameBuffer (const FrameBuffer &frameBuffer); + const FrameBuffer & frameBuffer () const; + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + int levelWidth (int lx) const; + int levelHeight (int ly) const; + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + void copyPixels (TiledInputFile &in); + void copyPixels (InputFile &in); + void copyPixels (TiledInputPart &in); + void copyPixels (InputPart &in); + + + void updatePreviewImage (const PreviewRgba newPixels[]); + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + + private: + TiledOutputFile* file; +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif /* IMFTILEDOUTPUTPART_H_ */ diff --git a/IlmImf/ImfTiledRgbaFile.cpp b/IlmImf/ImfTiledRgbaFile.cpp new file mode 100644 index 0000000..157aec0 --- /dev/null +++ b/IlmImf/ImfTiledRgbaFile.cpp @@ -0,0 +1,1163 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledRgbaOutputFile +// class TiledRgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IlmThreadMutex.h" +#include "Iex.h" + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace RgbaYca; +using namespace ILMTHREAD_NAMESPACE; + +namespace { + +void +insertChannels (Header &header, + RgbaChannels rgbaChannels, + const char fileName[]) +{ + ChannelList ch; + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + { + if (rgbaChannels & WRITE_Y) + { + ch.insert ("Y", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_C) + { + THROW (IEX_NAMESPACE::ArgExc, "Cannot open file \"" << fileName << "\" " + "for writing. Tiled image files do not " + "support subsampled chroma channels."); + } + } + else + { + if (rgbaChannels & WRITE_R) + ch.insert ("R", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_G) + ch.insert ("G", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_B) + ch.insert ("B", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_A) + ch.insert ("A", Channel (HALF, 1, 1)); + + header.channels() = ch; +} + + +RgbaChannels +rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") +{ + int i = 0; + + if (ch.findChannel (channelNamePrefix + "R")) + i |= WRITE_R; + + if (ch.findChannel (channelNamePrefix + "G")) + i |= WRITE_G; + + if (ch.findChannel (channelNamePrefix + "B")) + i |= WRITE_B; + + if (ch.findChannel (channelNamePrefix + "A")) + i |= WRITE_A; + + if (ch.findChannel (channelNamePrefix + "Y")) + i |= WRITE_Y; + + return RgbaChannels (i); +} + + +string +prefixFromLayerName (const string &layerName, const Header &header) +{ + if (layerName.empty()) + return ""; + + if (hasMultiView (header) && multiView(header)[0] == layerName) + return ""; + + return layerName + "."; +} + + +V3f +ywFromHeader (const Header &header) +{ + Chromaticities cr; + + if (hasChromaticities (header)) + cr = chromaticities (header); + + return computeYw (cr); +} + +} // namespace + + +class TiledRgbaOutputFile::ToYa: public Mutex +{ + public: + + ToYa (TiledOutputFile &outputFile, RgbaChannels rgbaChannels); + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + void writeTile (int dx, int dy, int lx, int ly); + + private: + + TiledOutputFile & _outputFile; + bool _writeA; + unsigned int _tileXSize; + unsigned int _tileYSize; + V3f _yw; + Array2D _buf; + const Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +TiledRgbaOutputFile::ToYa::ToYa (TiledOutputFile &outputFile, + RgbaChannels rgbaChannels) +: + _outputFile (outputFile) +{ + _writeA = (rgbaChannels & WRITE_A)? true: false; + + const TileDescription &td = outputFile.header().tileDescription(); + + _tileXSize = td.xSize; + _tileYSize = td.ySize; + _yw = ywFromHeader (_outputFile.header()); + _buf.resizeErase (_tileYSize, _tileXSize); + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +void +TiledRgbaOutputFile::ToYa::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +TiledRgbaOutputFile::ToYa::writeTile (int dx, int dy, int lx, int ly) +{ + if (_fbBase == 0) + { + THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " + "pixel data source for image file " + "\"" << _outputFile.fileName() << "\"."); + } + + // + // Copy the tile's RGBA pixels into _buf and convert + // them to luminance/alpha format + // + + Box2i dw = _outputFile.dataWindowForTile (dx, dy, lx, ly); + int width = dw.max.x - dw.min.x + 1; + + for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) + { + for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) + _buf[y1][x1] = _fbBase[x * _fbXStride + y * _fbYStride]; + + RGBAtoYCA (_yw, width, _writeA, _buf[y1], _buf[y1]); + } + + // + // Store the contents of _buf in the output file + // + + FrameBuffer fb; + + fb.insert ("Y", Slice (HALF, // type + (char *) &_buf[-dw.min.y][-dw.min.x].g, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize)); // yStride + + fb.insert ("A", Slice (HALF, // type + (char *) &_buf[-dw.min.y][-dw.min.x].a, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize)); // yStride + + _outputFile.setFrameBuffer (fb); + _outputFile.writeTile (dx, dy, lx, ly); +} + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels, os.fileName()); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (os, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + int width, + int height, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const IMATH_NAMESPACE::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + +TiledRgbaOutputFile::~TiledRgbaOutputFile () +{ + delete _outputFile; + delete _toYa; +} + + +void +TiledRgbaOutputFile::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->setFrameBuffer (base, xStride, yStride); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); + fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); + fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); + fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); + + _outputFile->setFrameBuffer (fb); + } +} + + +const Header & +TiledRgbaOutputFile::header () const +{ + return _outputFile->header(); +} + + +const FrameBuffer & +TiledRgbaOutputFile::frameBuffer () const +{ + return _outputFile->frameBuffer(); +} + + +const IMATH_NAMESPACE::Box2i & +TiledRgbaOutputFile::displayWindow () const +{ + return _outputFile->header().displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +TiledRgbaOutputFile::dataWindow () const +{ + return _outputFile->header().dataWindow(); +} + + +float +TiledRgbaOutputFile::pixelAspectRatio () const +{ + return _outputFile->header().pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +TiledRgbaOutputFile::screenWindowCenter () const +{ + return _outputFile->header().screenWindowCenter(); +} + + +float +TiledRgbaOutputFile::screenWindowWidth () const +{ + return _outputFile->header().screenWindowWidth(); +} + + +LineOrder +TiledRgbaOutputFile::lineOrder () const +{ + return _outputFile->header().lineOrder(); +} + + +Compression +TiledRgbaOutputFile::compression () const +{ + return _outputFile->header().compression(); +} + + +RgbaChannels +TiledRgbaOutputFile::channels () const +{ + return rgbaChannels (_outputFile->header().channels()); +} + + +unsigned int +TiledRgbaOutputFile::tileXSize () const +{ + return _outputFile->tileXSize(); +} + + +unsigned int +TiledRgbaOutputFile::tileYSize () const +{ + return _outputFile->tileYSize(); +} + + +LevelMode +TiledRgbaOutputFile::levelMode () const +{ + return _outputFile->levelMode(); +} + + +LevelRoundingMode +TiledRgbaOutputFile::levelRoundingMode () const +{ + return _outputFile->levelRoundingMode(); +} + + +int +TiledRgbaOutputFile::numLevels () const +{ + return _outputFile->numLevels(); +} + + +int +TiledRgbaOutputFile::numXLevels () const +{ + return _outputFile->numXLevels(); +} + + +int +TiledRgbaOutputFile::numYLevels () const +{ + return _outputFile->numYLevels(); +} + + +bool +TiledRgbaOutputFile::isValidLevel (int lx, int ly) const +{ + return _outputFile->isValidLevel (lx, ly); +} + + +int +TiledRgbaOutputFile::levelWidth (int lx) const +{ + return _outputFile->levelWidth (lx); +} + + +int +TiledRgbaOutputFile::levelHeight (int ly) const +{ + return _outputFile->levelHeight (ly); +} + + +int +TiledRgbaOutputFile::numXTiles (int lx) const +{ + return _outputFile->numXTiles (lx); +} + + +int +TiledRgbaOutputFile::numYTiles (int ly) const +{ + return _outputFile->numYTiles (ly); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaOutputFile::dataWindowForLevel (int l) const +{ + return _outputFile->dataWindowForLevel (l); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaOutputFile::dataWindowForLevel (int lx, int ly) const +{ + return _outputFile->dataWindowForLevel (lx, ly); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return _outputFile->dataWindowForTile (dx, dy, l); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return _outputFile->dataWindowForTile (dx, dy, lx, ly); +} + + +void +TiledRgbaOutputFile::writeTile (int dx, int dy, int l) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->writeTile (dx, dy, l, l); + } + else + { + _outputFile->writeTile (dx, dy, l); + } +} + + +void +TiledRgbaOutputFile::writeTile (int dx, int dy, int lx, int ly) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->writeTile (dx, dy, lx, ly); + } + else + { + _outputFile->writeTile (dx, dy, lx, ly); + } +} + + +void +TiledRgbaOutputFile::writeTiles + (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) +{ + if (_toYa) + { + Lock lock (*_toYa); + + for (int dy = dyMin; dy <= dyMax; dy++) + for (int dx = dxMin; dx <= dxMax; dx++) + _toYa->writeTile (dx, dy, lx, ly); + } + else + { + _outputFile->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + } +} + +void +TiledRgbaOutputFile::writeTiles + (int dxMin, int dxMax, int dyMin, int dyMax, int l) +{ + writeTiles (dxMin, dxMax, dyMin, dyMax, l, l); +} + + +class TiledRgbaInputFile::FromYa: public Mutex +{ + public: + + FromYa (TiledInputFile &inputFile); + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix); + + void readTile (int dx, int dy, int lx, int ly); + + private: + + TiledInputFile & _inputFile; + unsigned int _tileXSize; + unsigned int _tileYSize; + V3f _yw; + Array2D _buf; + Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +TiledRgbaInputFile::FromYa::FromYa (TiledInputFile &inputFile) +: + _inputFile (inputFile) +{ + const TileDescription &td = inputFile.header().tileDescription(); + + _tileXSize = td.xSize; + _tileYSize = td.ySize; + _yw = ywFromHeader (_inputFile.header()); + _buf.resizeErase (_tileYSize, _tileXSize); + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +void +TiledRgbaInputFile::FromYa::setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix) +{ + if (_fbBase == 0) +{ + FrameBuffer fb; + + fb.insert (channelNamePrefix + "Y", + Slice (HALF, // type + (char *) &_buf[0][0].g, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize, // yStride + 1, 1, // sampling + 0.0, // fillValue + true, true)); // tileCoordinates + + fb.insert (channelNamePrefix + "A", + Slice (HALF, // type + (char *) &_buf[0][0].a, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize, // yStride + 1, 1, // sampling + 1.0, // fillValue + true, true)); // tileCoordinates + + _inputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +TiledRgbaInputFile::FromYa::readTile (int dx, int dy, int lx, int ly) +{ + if (_fbBase == 0) + { + THROW (IEX_NAMESPACE::ArgExc, "No frame buffer was specified as the " + "pixel data destination for image file " + "\"" << _inputFile.fileName() << "\"."); + } + + // + // Read the tile requested by the caller into _buf. + // + + _inputFile.readTile (dx, dy, lx, ly); + + // + // Convert the luminance/alpha pixels to RGBA + // and copy them into the caller's frame buffer. + // + + Box2i dw = _inputFile.dataWindowForTile (dx, dy, lx, ly); + int width = dw.max.x - dw.min.x + 1; + + for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) + { + for (int x1 = 0; x1 < width; ++x1) + { + _buf[y1][x1].r = 0; + _buf[y1][x1].b = 0; + } + + YCAtoRGBA (_yw, width, _buf[y1], _buf[y1]); + + for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) + { + _fbBase[x * _fbXStride + y * _fbYStride] = _buf[y1][x1]; + } + } +} + + +TiledRgbaInputFile::TiledRgbaInputFile (const char name[], int numThreads): + _inputFile (new TiledInputFile (name, numThreads)), + _fromYa (0), + _channelNamePrefix ("") +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): + _inputFile (new TiledInputFile (is, numThreads)), + _fromYa (0), + _channelNamePrefix ("") +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (const char name[], + const string &layerName, + int numThreads) +: + _inputFile (new TiledInputFile (name, numThreads)), + _fromYa (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + const string &layerName, + int numThreads) +: + _inputFile (new TiledInputFile (is, numThreads)), + _fromYa (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::~TiledRgbaInputFile () +{ + delete _inputFile; + delete _fromYa; +} + + +void +TiledRgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert (_channelNamePrefix + "R", + Slice (HALF, + (char *) &base[0].r, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "G", + Slice (HALF, + (char *) &base[0].g, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "B", + Slice (HALF, + (char *) &base[0].b, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "A", + Slice (HALF, + (char *) &base[0].a, + xs, ys, + 1, 1, // xSampling, ySampling + 1.0)); // fillValue + + _inputFile->setFrameBuffer (fb); + } +} + + +void +TiledRgbaInputFile::setLayerName (const std::string &layerName) +{ + delete _fromYa; + _fromYa = 0; + + _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); + + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); + + FrameBuffer fb; + _inputFile->setFrameBuffer (fb); +} + + +const Header & +TiledRgbaInputFile::header () const +{ + return _inputFile->header(); +} + + +const char * +TiledRgbaInputFile::fileName () const +{ + return _inputFile->fileName(); +} + + +const FrameBuffer & +TiledRgbaInputFile::frameBuffer () const +{ + return _inputFile->frameBuffer(); +} + + +const IMATH_NAMESPACE::Box2i & +TiledRgbaInputFile::displayWindow () const +{ + return _inputFile->header().displayWindow(); +} + + +const IMATH_NAMESPACE::Box2i & +TiledRgbaInputFile::dataWindow () const +{ + return _inputFile->header().dataWindow(); +} + + +float +TiledRgbaInputFile::pixelAspectRatio () const +{ + return _inputFile->header().pixelAspectRatio(); +} + + +const IMATH_NAMESPACE::V2f +TiledRgbaInputFile::screenWindowCenter () const +{ + return _inputFile->header().screenWindowCenter(); +} + + +float +TiledRgbaInputFile::screenWindowWidth () const +{ + return _inputFile->header().screenWindowWidth(); +} + + +LineOrder +TiledRgbaInputFile::lineOrder () const +{ + return _inputFile->header().lineOrder(); +} + + +Compression +TiledRgbaInputFile::compression () const +{ + return _inputFile->header().compression(); +} + + +RgbaChannels +TiledRgbaInputFile::channels () const +{ + return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); +} + + +int +TiledRgbaInputFile::version () const +{ + return _inputFile->version(); +} + + +bool +TiledRgbaInputFile::isComplete () const +{ + return _inputFile->isComplete(); +} + + +unsigned int +TiledRgbaInputFile::tileXSize () const +{ + return _inputFile->tileXSize(); +} + + +unsigned int +TiledRgbaInputFile::tileYSize () const +{ + return _inputFile->tileYSize(); +} + + +LevelMode +TiledRgbaInputFile::levelMode () const +{ + return _inputFile->levelMode(); +} + + +LevelRoundingMode +TiledRgbaInputFile::levelRoundingMode () const +{ + return _inputFile->levelRoundingMode(); +} + + +int +TiledRgbaInputFile::numLevels () const +{ + return _inputFile->numLevels(); +} + + +int +TiledRgbaInputFile::numXLevels () const +{ + return _inputFile->numXLevels(); +} + + +int +TiledRgbaInputFile::numYLevels () const +{ + return _inputFile->numYLevels(); +} + + +bool +TiledRgbaInputFile::isValidLevel (int lx, int ly) const +{ + return _inputFile->isValidLevel (lx, ly); +} + + +int +TiledRgbaInputFile::levelWidth (int lx) const +{ + return _inputFile->levelWidth (lx); +} + + +int +TiledRgbaInputFile::levelHeight (int ly) const +{ + return _inputFile->levelHeight (ly); +} + + +int +TiledRgbaInputFile::numXTiles (int lx) const +{ + return _inputFile->numXTiles(lx); +} + + +int +TiledRgbaInputFile::numYTiles (int ly) const +{ + return _inputFile->numYTiles(ly); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaInputFile::dataWindowForLevel (int l) const +{ + return _inputFile->dataWindowForLevel (l); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaInputFile::dataWindowForLevel (int lx, int ly) const +{ + return _inputFile->dataWindowForLevel (lx, ly); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return _inputFile->dataWindowForTile (dx, dy, l); +} + + +IMATH_NAMESPACE::Box2i +TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return _inputFile->dataWindowForTile (dx, dy, lx, ly); +} + + +void +TiledRgbaInputFile::readTile (int dx, int dy, int l) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->readTile (dx, dy, l, l); + } + else + { + _inputFile->readTile (dx, dy, l); + } +} + + +void +TiledRgbaInputFile::readTile (int dx, int dy, int lx, int ly) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->readTile (dx, dy, lx, ly); + } + else + { + _inputFile->readTile (dx, dy, lx, ly); + } +} + + +void +TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int lx, int ly) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + + for (int dy = dyMin; dy <= dyMax; dy++) + for (int dx = dxMin; dx <= dxMax; dx++) + _fromYa->readTile (dx, dy, lx, ly); + } + else + { + _inputFile->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + } +} + +void +TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int l) +{ + readTiles (dxMin, dxMax, dyMin, dyMax, l, l); +} + + +void +TiledRgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + _outputFile->updatePreviewImage (newPixels); +} + + +void +TiledRgbaOutputFile::breakTile (int dx, int dy, int lx, int ly, + int offset, int length, char c) +{ + _outputFile->breakTile (dx, dy, lx, ly, offset, length, c); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTiledRgbaFile.h b/IlmImf/ImfTiledRgbaFile.h new file mode 100644 index 0000000..978ba36 --- /dev/null +++ b/IlmImf/ImfTiledRgbaFile.h @@ -0,0 +1,482 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TILED_RGBA_FILE_H +#define INCLUDED_IMF_TILED_RGBA_FILE_H + +//----------------------------------------------------------------------------- +// +// Simplified RGBA image I/O for tiled files +// +// class TiledRgbaOutputFile +// class TiledRgbaInputFile +// +//----------------------------------------------------------------------------- + +#include "ImfHeader.h" +#include "ImfFrameBuffer.h" +#include "ImathVec.h" +#include "ImathBox.h" +#include "half.h" +#include "ImfTileDescription.h" +#include "ImfRgba.h" +#include "ImfThreading.h" +#include +#include "ImfNamespace.h" +#include "ImfForward.h" + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// Tiled RGBA output file. +// + +class IMF_EXPORT TiledRgbaOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- rgbaChannels, tileXSize, tileYSize, + // levelMode, and levelRoundingMode overwrite the + // channel list and tile description attribute in the + // header that is passed as an argument to the + // constructor. + //--------------------------------------------------- + + TiledRgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + int numThreads = globalThreadCount ()); + + + //--------------------------------------------------- + // Constructor -- like the previous one, but the new + // TiledRgbaOutputFile is attached to a file that has + // already been opened by the caller. Destroying + // TiledRgbaOutputFileObjects constructed with this + // constructor does not automatically close the + // corresponding files. + //--------------------------------------------------- + + TiledRgbaOutputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + int numThreads = globalThreadCount ()); + + + //------------------------------------------------------ + // Constructor -- header data are explicitly specified + // as function call arguments (an empty dataWindow means + // "same as displayWindow") + //------------------------------------------------------ + + TiledRgbaOutputFile (const char name[], + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + const IMATH_NAMESPACE::Box2i &displayWindow, + const IMATH_NAMESPACE::Box2i &dataWindow = IMATH_NAMESPACE::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = + IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = ZIP_COMPRESSION, + int numThreads = globalThreadCount ()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + TiledRgbaOutputFile (const char name[], + int width, + int height, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const IMATH_NAMESPACE::V2f screenWindowCenter = + IMATH_NAMESPACE::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = ZIP_COMPRESSION, + int numThreads = globalThreadCount ()); + + + virtual ~TiledRgbaOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + //---------------------------------------------------- + // Utility functions (same as in Imf::TiledOutputFile) + //---------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int lx, int ly); + + void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int l = 0); + + + // ------------------------------------------------------------------------- + // Update the preview image (see Imf::TiledOutputFile::updatePreviewImage()) + // ------------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + //------------------------------------------------ + // Break a tile -- for testing and debugging only + // (see Imf::TiledOutputFile::breakTile()) + // + // Warning: Calling this function usually results + // in a broken image file. The file or parts of + // it may not be readable, or the file may contain + // bad data. + // + //------------------------------------------------ + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + private: + + // + // Copy constructor and assignment are not implemented + // + + TiledRgbaOutputFile (const TiledRgbaOutputFile &); + TiledRgbaOutputFile & operator = (const TiledRgbaOutputFile &); + + class ToYa; + + TiledOutputFile * _outputFile; + ToYa * _toYa; +}; + + + +// +// Tiled RGBA input file +// + +class IMF_EXPORT TiledRgbaInputFile +{ + public: + + //-------------------------------------------------------- + // Constructor -- opens the file with the specified name. + // Destroying TiledRgbaInputFile objects constructed with + // this constructor automatically closes the corresponding + // files. + //-------------------------------------------------------- + + TiledRgbaInputFile (const char name[], + int numThreads = globalThreadCount ()); + + + //------------------------------------------------------- + // Constructor -- attaches the new TiledRgbaInputFile + // object to a file that has already been opened by the + // caller. + // Destroying TiledRgbaInputFile objects constructed with + // this constructor does not automatically close the + // corresponding files. + //------------------------------------------------------- + + TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount ()); + + + //------------------------------------------------------------ + // Constructors -- the same as the previous two, but the names + // of the red, green, blue, alpha, and luminance channels are + // expected to be layerName.R, layerName.G, etc. + //------------------------------------------------------------ + + TiledRgbaInputFile (const char name[], + const std::string &layerName, + int numThreads = globalThreadCount()); + + TiledRgbaInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, + const std::string &layerName, + int numThreads = globalThreadCount()); + + //----------- + // Destructor + //----------- + + virtual ~TiledRgbaInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + //------------------------------------------------------------------- + // Switch to a different layer -- subsequent calls to readTile() + // and readTiles() will read channels layerName.R, layerName.G, etc. + // After each call to setLayerName(), setFrameBuffer() must be called + // at least once before the next call to readTile() or readTiles(). + //------------------------------------------------------------------- + + void setLayerName (const std::string &layerName); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const IMATH_NAMESPACE::Box2i & displayWindow () const; + const IMATH_NAMESPACE::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const IMATH_NAMESPACE::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //--------------------------------------------------- + // Utility functions (same as in Imf::TiledInputFile) + //--------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForLevel (int l = 0) const; + IMATH_NAMESPACE::Box2i dataWindowForLevel (int lx, int ly) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + IMATH_NAMESPACE::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + + //---------------------------------------------------------------- + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //---------------------------------------------------------------- + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dxMin, int dxMax, + int dyMin, int dyMax, int lx, int ly); + + void readTiles (int dxMin, int dxMax, + int dyMin, int dyMax, int l = 0); + + private: + + // + // Copy constructor and assignment are not implemented + // + + TiledRgbaInputFile (const TiledRgbaInputFile &); + TiledRgbaInputFile & operator = (const TiledRgbaInputFile &); + + class FromYa; + + TiledInputFile * _inputFile; + FromYa * _fromYa; + std::string _channelNamePrefix; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfTimeCode.cpp b/IlmImf/ImfTimeCode.cpp new file mode 100644 index 0000000..88b9d1c --- /dev/null +++ b/IlmImf/ImfTimeCode.cpp @@ -0,0 +1,431 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TimeCode +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +TimeCode::TimeCode () +{ + _time = 0; + _user = 0; +} + + +TimeCode::TimeCode + (int hours, + int minutes, + int seconds, + int frame, + bool dropFrame, + bool colorFrame, + bool fieldPhase, + bool bgf0, + bool bgf1, + bool bgf2, + int binaryGroup1, + int binaryGroup2, + int binaryGroup3, + int binaryGroup4, + int binaryGroup5, + int binaryGroup6, + int binaryGroup7, + int binaryGroup8) +{ + setHours (hours); + setMinutes (minutes); + setSeconds (seconds); + setFrame (frame); + setDropFrame (dropFrame); + setColorFrame (colorFrame); + setFieldPhase (fieldPhase); + setBgf0 (bgf0); + setBgf1 (bgf1); + setBgf2 (bgf2); + setBinaryGroup (1, binaryGroup1); + setBinaryGroup (2, binaryGroup2); + setBinaryGroup (3, binaryGroup3); + setBinaryGroup (4, binaryGroup4); + setBinaryGroup (5, binaryGroup5); + setBinaryGroup (6, binaryGroup6); + setBinaryGroup (7, binaryGroup7); + setBinaryGroup (8, binaryGroup8); +} + + +TimeCode::TimeCode + (unsigned int timeAndFlags, + unsigned int userData, + Packing packing) +{ + setTimeAndFlags (timeAndFlags, packing); + setUserData (userData); +} + + +TimeCode::TimeCode (const TimeCode &other) +{ + _time = other._time; + _user = other._user; +} + + +TimeCode & +TimeCode::operator = (const TimeCode &other) +{ + _time = other._time; + _user = other._user; + return *this; +} + + +bool +TimeCode::operator == (const TimeCode & c) const +{ + return (_time == c._time && _user == c._user); +} + + +bool +TimeCode::operator != (const TimeCode & c) const +{ + return (_time != c._time || _user != c._user); +} + + + +namespace { + +unsigned int +bitField (unsigned int value, int minBit, int maxBit) +{ + int shift = minBit; + unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); + return (value & mask) >> shift; +} + + +void +setBitField (unsigned int &value, int minBit, int maxBit, unsigned int field) +{ + int shift = minBit; + unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); + value = ((value & ~mask) | ((field << shift) & mask)); +} + + +int +bcdToBinary (unsigned int bcd) +{ + return int ((bcd & 0x0f) + 10 * ((bcd >> 4) & 0x0f)); +} + + +unsigned int +binaryToBcd (int binary) +{ + int units = binary % 10; + int tens = (binary / 10) % 10; + return (unsigned int) (units | (tens << 4)); +} + + +} // namespace + + +int +TimeCode::hours () const +{ + return bcdToBinary (bitField (_time, 24, 29)); +} + + +void +TimeCode::setHours (int value) +{ + if (value < 0 || value > 23) + throw IEX_NAMESPACE::ArgExc ("Cannot set hours field in time code. " + "New value is out of range."); + + setBitField (_time, 24, 29, binaryToBcd (value)); +} + + +int +TimeCode::minutes () const +{ + return bcdToBinary (bitField (_time, 16, 22)); +} + + +void +TimeCode::setMinutes (int value) +{ + if (value < 0 || value > 59) + throw IEX_NAMESPACE::ArgExc ("Cannot set minutes field in time code. " + "New value is out of range."); + + setBitField (_time, 16, 22, binaryToBcd (value)); +} + + +int +TimeCode::seconds () const +{ + return bcdToBinary (bitField (_time, 8, 14)); +} + + +void +TimeCode::setSeconds (int value) +{ + if (value < 0 || value > 59) + throw IEX_NAMESPACE::ArgExc ("Cannot set seconds field in time code. " + "New value is out of range."); + + setBitField (_time, 8, 14, binaryToBcd (value)); +} + + +int +TimeCode::frame () const +{ + return bcdToBinary (bitField (_time, 0, 5)); +} + + +void +TimeCode::setFrame (int value) +{ + if (value < 0 || value > 59) + throw IEX_NAMESPACE::ArgExc ("Cannot set frame field in time code. " + "New value is out of range."); + + setBitField (_time, 0, 5, binaryToBcd (value)); +} + + +bool +TimeCode::dropFrame () const +{ + return !!bitField (_time, 6, 6); +} + + +void +TimeCode::setDropFrame (bool value) +{ + setBitField (_time, 6, 6, (unsigned int) !!value); +} + + +bool +TimeCode::colorFrame () const +{ + return !!bitField (_time, 7, 7); +} + + +void +TimeCode::setColorFrame (bool value) +{ + setBitField (_time, 7, 7, (unsigned int) !!value); +} + + +bool +TimeCode::fieldPhase () const +{ + return !!bitField (_time, 15, 15); +} + + +void +TimeCode::setFieldPhase (bool value) +{ + setBitField (_time, 15, 15, (unsigned int) !!value); +} + + +bool +TimeCode::bgf0 () const +{ + return !!bitField (_time, 23, 23); +} + + +void +TimeCode::setBgf0 (bool value) +{ + setBitField (_time, 23, 23, (unsigned int) !!value); +} + + +bool +TimeCode::bgf1 () const +{ + return!!bitField (_time, 30, 30); +} + + +void +TimeCode::setBgf1 (bool value) +{ + setBitField (_time, 30, 30, (unsigned int) !!value); +} + + +bool +TimeCode::bgf2 () const +{ + return !!bitField (_time, 31, 31); +} + + +void +TimeCode::setBgf2 (bool value) +{ + setBitField (_time, 31, 31, (unsigned int) !!value); +} + + +int +TimeCode::binaryGroup (int group) const +{ + if (group < 1 || group > 8) + throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code " + "user data. Group number is out of range."); + + int minBit = 4 * (group - 1); + int maxBit = minBit + 3; + return int (bitField (_user, minBit, maxBit)); +} + + +void +TimeCode::setBinaryGroup (int group, int value) +{ + if (group < 1 || group > 8) + throw IEX_NAMESPACE::ArgExc ("Cannot extract binary group from time code " + "user data. Group number is out of range."); + + int minBit = 4 * (group - 1); + int maxBit = minBit + 3; + setBitField (_user, minBit, maxBit, (unsigned int) value); +} + + +unsigned int +TimeCode::timeAndFlags (Packing packing) const +{ + if (packing == TV50_PACKING) + { + unsigned int t = _time; + + t &= ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); + + t |= ((unsigned int) bgf0() << 15); + t |= ((unsigned int) bgf2() << 23); + t |= ((unsigned int) bgf1() << 30); + t |= ((unsigned int) fieldPhase() << 31); + + return t; + } + if (packing == FILM24_PACKING) + { + return _time & ~((1 << 6) | (1 << 7)); + } + else // packing == TV60_PACKING + { + return _time; + } +} + + +void +TimeCode::setTimeAndFlags (unsigned int value, Packing packing) +{ + if (packing == TV50_PACKING) + { + _time = value & + ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); + + if (value & (1 << 15)) + setBgf0 (true); + + if (value & (1 << 23)) + setBgf2 (true); + + if (value & (1 << 30)) + setBgf1 (true); + + if (value & (1 << 31)) + setFieldPhase (true); + } + else if (packing == FILM24_PACKING) + { + _time = value & ~((1 << 6) | (1 << 7)); + } + else // packing == TV60_PACKING + { + _time = value; + } +} + + +unsigned int +TimeCode::userData () const +{ + return _user; +} + + +void +TimeCode::setUserData (unsigned int value) +{ + _user = value; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTimeCode.h b/IlmImf/ImfTimeCode.h new file mode 100644 index 0000000..751c416 --- /dev/null +++ b/IlmImf/ImfTimeCode.h @@ -0,0 +1,242 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TIME_CODE_H +#define INCLUDED_IMF_TIME_CODE_H + +#include "ImfExport.h" +#include "ImfNamespace.h" + +//----------------------------------------------------------------------------- +// +// class TimeCode +// +// A TimeCode object stores time and control codes as described +// in SMPTE standard 12M-1999. A TimeCode object contains the +// following fields: +// +// Time Address: +// +// hours integer, range 0 - 23 +// minutes integer, range 0 - 59 +// seconds integer, range 0 - 59 +// frame integer, range 0 - 29 +// +// Flags: +// +// drop frame flag boolean +// color frame flag boolean +// field/phase flag boolean +// bgf0 boolean +// bgf1 boolean +// bgf2 boolean +// +// Binary groups for user-defined data and control codes: +// +// binary group 1 integer, range 0 - 15 +// binary group 2 integer, range 0 - 15 +// ... +// binary group 8 integer, range 0 - 15 +// +// Class TimeCode contains methods to convert between the fields +// listed above and a more compact representation where the fields +// are packed into two unsigned 32-bit integers. In the packed +// integer representations, bit 0 is the least significant bit, +// and bit 31 is the most significant bit of the integer value. +// +// The time address and flags fields can be packed in three +// different ways: +// +// bits packing for packing for packing for +// 24-frame 60-field 50-field +// film television television +// +// 0 - 3 frame units frame units frame units +// 4 - 5 frame tens frame tens frame tens +// 6 unused, set to 0 drop frame flag unused, set to 0 +// 7 unused, set to 0 color frame flag color frame flag +// 8 - 11 seconds units seconds units seconds units +// 12 - 14 seconds tens seconds tens seconds tens +// 15 phase flag field/phase flag bgf0 +// 16 - 19 minutes units minutes units minutes units +// 20 - 22 minutes tens minutes tens minutes tens +// 23 bgf0 bgf0 bgf2 +// 24 - 27 hours units hours units hours units +// 28 - 29 hours tens hours tens hours tens +// 30 bgf1 bgf1 bgf1 +// 31 bgf2 bgf2 field/phase flag +// +// User-defined data and control codes are packed as follows: +// +// bits field +// +// 0 - 3 binary group 1 +// 4 - 7 binary group 2 +// 8 - 11 binary group 3 +// 12 - 15 binary group 4 +// 16 - 19 binary group 5 +// 20 - 23 binary group 6 +// 24 - 27 binary group 7 +// 28 - 31 binary group 8 +// +//----------------------------------------------------------------------------- + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT TimeCode +{ + public: + + //--------------------- + // Bit packing variants + //--------------------- + + enum Packing + { + TV60_PACKING, // packing for 60-field television + TV50_PACKING, // packing for 50-field television + FILM24_PACKING // packing for 24-frame film + }; + + + //------------------------------------- + // Constructors and assignment operator + //------------------------------------- + + TimeCode (); // all fields set to 0 or false + + TimeCode (int hours, + int minutes, + int seconds, + int frame, + bool dropFrame = false, + bool colorFrame = false, + bool fieldPhase = false, + bool bgf0 = false, + bool bgf1 = false, + bool bgf2 = false, + int binaryGroup1 = 0, + int binaryGroup2 = 0, + int binaryGroup3 = 0, + int binaryGroup4 = 0, + int binaryGroup5 = 0, + int binaryGroup6 = 0, + int binaryGroup7 = 0, + int binaryGroup8 = 0); + + TimeCode (unsigned int timeAndFlags, + unsigned int userData = 0, + Packing packing = TV60_PACKING); + + TimeCode (const TimeCode &other); + + TimeCode & operator = (const TimeCode &other); + + + //---------------------------- + // Access to individual fields + //---------------------------- + + int hours () const; + void setHours (int value); + + int minutes () const; + void setMinutes (int value); + + int seconds () const; + void setSeconds (int value); + + int frame () const; + void setFrame (int value); + + bool dropFrame () const; + void setDropFrame (bool value); + + bool colorFrame () const; + void setColorFrame (bool value); + + bool fieldPhase () const; + void setFieldPhase (bool value); + + bool bgf0 () const; + void setBgf0 (bool value); + + bool bgf1 () const; + void setBgf1 (bool value); + + bool bgf2 () const; + void setBgf2 (bool value); + + int binaryGroup (int group) const; // group must be between 1 and 8 + void setBinaryGroup (int group, int value); + + + //--------------------------------- + // Access to packed representations + //--------------------------------- + + unsigned int timeAndFlags (Packing packing = TV60_PACKING) const; + + void setTimeAndFlags (unsigned int value, + Packing packing = TV60_PACKING); + + unsigned int userData () const; + + void setUserData (unsigned int value); + + + //--------- + // Equality + //--------- + + bool operator == (const TimeCode &v) const; + bool operator != (const TimeCode &v) const; + + private: + + unsigned int _time; + unsigned int _user; +}; + + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfTimeCodeAttribute.cpp b/IlmImf/ImfTimeCodeAttribute.cpp new file mode 100644 index 0000000..5e7ea59 --- /dev/null +++ b/IlmImf/ImfTimeCodeAttribute.cpp @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TimeCodeAttribute +// +//----------------------------------------------------------------------------- + +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +TimeCodeAttribute::staticTypeName () +{ + return "timecode"; +} + + +template <> +void +TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.timeAndFlags()); + Xdr::write (os, _value.userData()); +} + + +template <> +void +TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + unsigned int tmp; + + Xdr::read (is, tmp); + _value.setTimeAndFlags (tmp); + + Xdr::read (is, tmp); + _value.setUserData (tmp); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfTimeCodeAttribute.h b/IlmImf/ImfTimeCodeAttribute.h new file mode 100644 index 0000000..ccd893a --- /dev/null +++ b/IlmImf/ImfTimeCodeAttribute.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H +#define INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class TimeCodeAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImfTimeCode.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +typedef TypedAttribute TimeCodeAttribute; + +template <> +IMF_EXPORT +const char *TimeCodeAttribute::staticTypeName (); + +template <> +IMF_EXPORT +void TimeCodeAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, + int) const; + +template <> +IMF_EXPORT +void TimeCodeAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, + int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + +#endif diff --git a/IlmImf/ImfVecAttribute.cpp b/IlmImf/ImfVecAttribute.cpp new file mode 100644 index 0000000..7d51904 --- /dev/null +++ b/IlmImf/ImfVecAttribute.cpp @@ -0,0 +1,217 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class V2iAttribute +// class V2fAttribute +// class V2dAttribute +// class V3iAttribute +// class V3fAttribute +// class V3dAttribute +// +//----------------------------------------------------------------------------- + +#include + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; + +template <> +const char * +V2iAttribute::staticTypeName () +{ + return "v2i"; +} + + +template <> +void +V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V2fAttribute::staticTypeName () +{ + return "v2f"; +} + + +template <> +void +V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V2dAttribute::staticTypeName () +{ + return "v2d"; +} + + +template <> +void +V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V3iAttribute::staticTypeName () +{ + return "v3i"; +} + + +template <> +void +V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +template <> +const char * +V3fAttribute::staticTypeName () +{ + return "v3f"; +} + + +template <> +void +V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +template <> +const char * +V3dAttribute::staticTypeName () +{ + return "v3d"; +} + + +template <> +void +V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfVecAttribute.h b/IlmImf/ImfVecAttribute.h new file mode 100644 index 0000000..8480fe6 --- /dev/null +++ b/IlmImf/ImfVecAttribute.h @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_VEC_ATTRIBUTE_H +#define INCLUDED_IMF_VEC_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class V2iAttribute +// class V2fAttribute +// class V2dAttribute +// class V3iAttribute +// class V3fAttribute +// class V3dAttribute +// +//----------------------------------------------------------------------------- + +#include "ImfAttribute.h" +#include "ImathVec.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +typedef TypedAttribute V2iAttribute; +template <> IMF_EXPORT const char *V2iAttribute::staticTypeName (); +template <> IMF_EXPORT void V2iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V2iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute V2fAttribute; +template <> IMF_EXPORT const char *V2fAttribute::staticTypeName (); +template <> IMF_EXPORT void V2fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V2fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute V2dAttribute; +template <> IMF_EXPORT const char *V2dAttribute::staticTypeName (); +template <> IMF_EXPORT void V2dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V2dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute V3iAttribute; +template <> IMF_EXPORT const char *V3iAttribute::staticTypeName (); +template <> IMF_EXPORT void V3iAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V3iAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute V3fAttribute; +template <> IMF_EXPORT const char *V3fAttribute::staticTypeName (); +template <> IMF_EXPORT void V3fAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V3fAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +typedef TypedAttribute V3dAttribute; +template <> IMF_EXPORT const char *V3dAttribute::staticTypeName (); +template <> IMF_EXPORT void V3dAttribute::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &, int) const; +template <> IMF_EXPORT void V3dAttribute::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &, int, int); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#if defined (OPENEXR_IMF_INTERNAL_NAMESPACE_AUTO_EXPOSE) +namespace Imf { using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; } + +#endif + +#endif diff --git a/IlmImf/ImfVersion.cpp b/IlmImf/ImfVersion.cpp new file mode 100644 index 0000000..4f49aa0 --- /dev/null +++ b/IlmImf/ImfVersion.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Magic and version number. +// +//----------------------------------------------------------------------------- + + +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +bool +isImfMagic (const char bytes[4]) +{ + return bytes[0] == ((MAGIC >> 0) & 0x00ff) && + bytes[1] == ((MAGIC >> 8) & 0x00ff) && + bytes[2] == ((MAGIC >> 16) & 0x00ff) && + bytes[3] == ((MAGIC >> 24) & 0x00ff); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + diff --git a/IlmImf/ImfVersion.h b/IlmImf/ImfVersion.h new file mode 100644 index 0000000..de2577f --- /dev/null +++ b/IlmImf/ImfVersion.h @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_VERSION_H +#define INCLUDED_IMF_VERSION_H + +//----------------------------------------------------------------------------- +// +// Magic and version number. +// +//----------------------------------------------------------------------------- + +#include "ImfExport.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +// +// The MAGIC number is stored in the first four bytes of every +// OpenEXR image file. This can be used to quickly test whether +// a given file is an OpenEXR image file (see isImfMagic(), below). +// + +const int MAGIC = 20000630; + + +// +// The second item in each OpenEXR image file, right after the +// magic number, is a four-byte file version identifier. Depending +// on a file's version identifier, a file reader can enable various +// backwards-compatibility switches, or it can quickly reject files +// that it cannot read. +// +// The version identifier is split into an 8-bit version number, +// and a 24-bit flags field. +// + +const int VERSION_NUMBER_FIELD = 0x000000ff; +const int VERSION_FLAGS_FIELD = 0xffffff00; + + +// +// Value that goes into VERSION_NUMBER_FIELD. +// + +const int EXR_VERSION = 2; + + +// +// Flags that can go into VERSION_FLAGS_FIELD. +// Flags can only occupy the 1 bits in VERSION_FLAGS_FIELD. +// + +const int TILED_FLAG = 0x00000200; // File is tiled + +const int LONG_NAMES_FLAG = 0x00000400; // File contains long + // attribute or channel + // names + +const int NON_IMAGE_FLAG = 0x00000800; // File has at least one part + // which is not a regular + // scanline image or regular tiled image + // (that is, it is a deep format) + +const int MULTI_PART_FILE_FLAG = 0x00001000; // File has multiple parts + +// +// Bitwise OR of all known flags. +// + +const int ALL_FLAGS = TILED_FLAG | LONG_NAMES_FLAG | + NON_IMAGE_FLAG | MULTI_PART_FILE_FLAG; + + +// +// Utility functions +// + +inline bool isTiled (int version) {return !!(version & TILED_FLAG);} +inline bool isMultiPart (int version) {return version & MULTI_PART_FILE_FLAG; } +inline bool isNonImage(int version) {return version & NON_IMAGE_FLAG; } +inline int makeTiled (int version) {return version | TILED_FLAG;} +inline int makeNotTiled (int version) {return version & ~TILED_FLAG;} +inline int getVersion (int version) {return version & VERSION_NUMBER_FIELD;} +inline int getFlags (int version) {return version & VERSION_FLAGS_FIELD;} +inline bool supportsFlags (int flags) {return !(flags & ~ALL_FLAGS);} + + +// +// Given the first four bytes of a file, returns true if the +// file is probably an OpenEXR image file, false if not. +// + +IMF_EXPORT +bool isImfMagic (const char bytes[4]); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfWav.cpp b/IlmImf/ImfWav.cpp new file mode 100644 index 0000000..5d71d56 --- /dev/null +++ b/IlmImf/ImfWav.cpp @@ -0,0 +1,391 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// 16-bit Haar Wavelet encoding and decoding +// +// The source code in this file is derived from the encoding +// and decoding routines written by Christian Rouet for his +// PIZ image file format. +// +//----------------------------------------------------------------------------- + + +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER +namespace { + + +// +// Wavelet basis functions without modulo arithmetic; they produce +// the best compression ratios when the wavelet-transformed data are +// Huffman-encoded, but the wavelet transform works only for 14-bit +// data (untransformed data values must be less than (1 << 14)). +// + +inline void +wenc14 (unsigned short a, unsigned short b, + unsigned short &l, unsigned short &h) +{ + short as = a; + short bs = b; + + short ms = (as + bs) >> 1; + short ds = as - bs; + + l = ms; + h = ds; +} + + +inline void +wdec14 (unsigned short l, unsigned short h, + unsigned short &a, unsigned short &b) +{ + short ls = l; + short hs = h; + + int hi = hs; + int ai = ls + (hi & 1) + (hi >> 1); + + short as = ai; + short bs = ai - hi; + + a = as; + b = bs; +} + + +// +// Wavelet basis functions with modulo arithmetic; they work with full +// 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't +// compress the data quite as well. +// + +const int NBITS = 16; +const int A_OFFSET = 1 << (NBITS - 1); +const int M_OFFSET = 1 << (NBITS - 1); +const int MOD_MASK = (1 << NBITS) - 1; + + +inline void +wenc16 (unsigned short a, unsigned short b, + unsigned short &l, unsigned short &h) +{ + int ao = (a + A_OFFSET) & MOD_MASK; + int m = ((ao + b) >> 1); + int d = ao - b; + + if (d < 0) + m = (m + M_OFFSET) & MOD_MASK; + + d &= MOD_MASK; + + l = m; + h = d; +} + + +inline void +wdec16 (unsigned short l, unsigned short h, + unsigned short &a, unsigned short &b) +{ + int m = l; + int d = h; + int bb = (m - (d >> 1)) & MOD_MASK; + int aa = (d + bb - A_OFFSET) & MOD_MASK; + b = bb; + a = aa; +} + +} // namespace + + +// +// 2D Wavelet encoding: +// + +void +wav2Encode + (unsigned short* in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny)? ny: nx; + int p = 1; // == 1 << level + int p2 = 2; // == 1 << (level+1) + + // + // Hierachical loop on smaller dimension n + // + + while (p2 <= n) + { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00,i01,i10,i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet encoding + // + + if (w14) + { + wenc14 (*px, *p01, i00, i01); + wenc14 (*p10, *p11, i10, i11); + wenc14 (i00, i10, *px, *p10); + wenc14 (i01, i11, *p01, *p11); + } + else + { + wenc16 (*px, *p01, i00, i01); + wenc16 (*p10, *p11, i10, i11); + wenc16 (i00, i10, *px, *p10); + wenc16 (i01, i11, *p01, *p11); + } + } + + // + // Encode (1D) odd column (still in Y loop) + // + + if (nx & p) + { + unsigned short *p10 = px + oy1; + + if (w14) + wenc14 (*px, *p10, i00, *p10); + else + wenc16 (*px, *p10, i00, *p10); + + *px= i00; + } + } + + // + // Encode (1D) odd line (must loop in X) + // + + if (ny & p) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + + if (w14) + wenc14 (*px, *p01, i00, *p01); + else + wenc16 (*px, *p01, i00, *p01); + + *px= i00; + } + } + + // + // Next level + // + + p = p2; + p2 <<= 1; + } +} + + +// +// 2D Wavelet decoding: +// + +void +wav2Decode + (unsigned short* in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny)? ny: nx; + int p = 1; + int p2; + + // + // Search max level + // + + while (p <= n) + p <<= 1; + + p >>= 1; + p2 = p; + p >>= 1; + + // + // Hierarchical loop on smaller dimension n + // + + while (p >= 1) + { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00,i01,i10,i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet decoding + // + + if (w14) + { + wdec14 (*px, *p10, i00, i10); + wdec14 (*p01, *p11, i01, i11); + wdec14 (i00, i01, *px, *p01); + wdec14 (i10, i11, *p10, *p11); + } + else + { + wdec16 (*px, *p10, i00, i10); + wdec16 (*p01, *p11, i01, i11); + wdec16 (i00, i01, *px, *p01); + wdec16 (i10, i11, *p10, *p11); + } + } + + // + // Decode (1D) odd column (still in Y loop) + // + + if (nx & p) + { + unsigned short *p10 = px + oy1; + + if (w14) + wdec14 (*px, *p10, i00, *p10); + else + wdec16 (*px, *p10, i00, *p10); + + *px= i00; + } + } + + // + // Decode (1D) odd line (must loop in X) + // + + if (ny & p) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + + if (w14) + wdec14 (*px, *p01, i00, *p01); + else + wdec16 (*px, *p01, i00, *p01); + + *px= i00; + } + } + + // + // Next level + // + + p2 = p; + p >>= 1; + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfWav.h b/IlmImf/ImfWav.h new file mode 100644 index 0000000..9751433 --- /dev/null +++ b/IlmImf/ImfWav.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_WAV_H +#define INCLUDED_IMF_WAV_H + +//----------------------------------------------------------------------------- +// +// 16-bit Haar Wavelet encoding and decoding +// +//----------------------------------------------------------------------------- +#include "ImfNamespace.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +IMF_EXPORT +void +wav2Encode + (unsigned short *in, // io: values in[y][x] are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx); // i : maximum in[x][y] value + +IMF_EXPORT +void +wav2Decode + (unsigned short *in, // io: values in[y][x] are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx); // i : maximum in[x][y] value + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/ImfXdr.h b/IlmImf/ImfXdr.h new file mode 100644 index 0000000..0af6f67 --- /dev/null +++ b/IlmImf/ImfXdr.h @@ -0,0 +1,927 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_XDR_H +#define INCLUDED_IMF_XDR_H + + +//---------------------------------------------------------------------------- +// +// Xdr -- routines to convert data between the machine's native +// format and a machine-independent external data representation: +// +// write (T &o, S v); converts a value, v, of type S +// into a machine-independent +// representation and stores the +// result in an output buffer, o. +// +// read (T &i, S &v); reads the machine-independent +// representation of a value of type +// S from input buffer i, converts +// the value into the machine's native +// representation, and stores the result +// in v. +// +// size(); returns the size, in bytes, of the +// machine-independent representation +// of an object of type S. +// +// The write() and read() routines are templates; data can be written +// to and read from any output or input buffer type T for which a helper +// class, R, exits. Class R must define a method to store a char array +// in a T, and a method to read a char array from a T: +// +// struct R +// { +// static void +// writeChars (T &o, const char c[/*n*/], int n) +// { +// ... // Write c[0], c[1] ... c[n-1] to output buffer o. +// } +// +// static void +// readChars (T &i, char c[/*n*/], int n) +// { +// ... // Read n characters from input buffer i +// // and copy them to c[0], c[1] ... c[n-1]. +// } +// }; +// +// Example - writing to and reading from iostreams: +// +// struct CharStreamIO +// { +// static void +// writeChars (ostream &os, const char c[], int n) +// { +// os.write (c, n); +// } +// +// static void +// readChars (istream &is, char c[], int n) +// { +// is.read (c, n); +// } +// }; +// +// ... +// +// Xdr::write (os, 3); +// Xdr::write (os, 5.0); +// +//---------------------------------------------------------------------------- + +#include "ImfInt64.h" +#include "IexMathExc.h" +#include "half.h" +#include + +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +namespace Xdr { + + +//------------------------------- +// Write data to an output stream +//------------------------------- + +template +void +write (T &out, bool v); + +template +void +write (T &out, char v); + +template +void +write (T &out, signed char v); + +template +void +write (T &out, unsigned char v); + +template +void +write (T &out, signed short v); + +template +void +write (T &out, unsigned short v); + +template +void +write (T &out, signed int v); + +template +void +write (T &out, unsigned int v); + +template +void +write (T &out, signed long v); + +template +void +write (T &out, unsigned long v); + +#if ULONG_MAX != 18446744073709551615LU + + template + void + write (T &out, Int64 v); + +#endif + +template +void +write (T &out, float v); + +template +void +write (T &out, double v); + +template +void +write (T &out, half v); + +template +void +write (T &out, const char v[/*n*/], int n); // fixed-size char array + +template +void +write (T &out, const char v[]); // zero-terminated string + + +//----------------------------------------- +// Append padding bytes to an output stream +//----------------------------------------- + +template +void +pad (T &out, int n); // write n padding bytes + + + +//------------------------------- +// Read data from an input stream +//------------------------------- + +template +void +read (T &in, bool &v); + +template +void +read (T &in, char &v); + +template +void +read (T &in, signed char &v); + +template +void +read (T &in, unsigned char &v); + +template +void +read (T &in, signed short &v); + +template +void +read (T &in, unsigned short &v); + +template +void +read (T &in, signed int &v); + +template +void +read (T &in, unsigned int &v); + +template +void +read (T &in, signed long &v); + +template +void +read (T &in, unsigned long &v); + +#if ULONG_MAX != 18446744073709551615LU + + template + void + read (T &in, Int64 &v); + +#endif + +template +void +read (T &in, float &v); + +template +void +read (T &in, double &v); + +template +void +read (T &in, half &v); + +template +void +read (T &in, char v[/*n*/], int n); // fixed-size char array + +template +void +read (T &in, int n, char v[/*n*/]); // zero-terminated string + + +//------------------------------------------- +// Skip over padding bytes in an input stream +//------------------------------------------- + +template +void +skip (T &in, int n); // skip n padding bytes + + + +//-------------------------------------- +// Size of the machine-independent +// representation of an object of type S +//-------------------------------------- + +template +int +size (); + + +//--------------- +// Implementation +//--------------- + +template +inline void +writeSignedChars (T &out, const signed char c[], int n) +{ + S::writeChars (out, (const char *) c, n); +} + + +template +inline void +writeUnsignedChars (T &out, const unsigned char c[], int n) +{ + S::writeChars (out, (const char *) c, n); +} + + +template +inline void +readSignedChars (T &in, signed char c[], int n) +{ + S::readChars (in, (char *) c, n); +} + + +template +inline void +readUnsignedChars (T &in, unsigned char c[], int n) +{ + S::readChars (in, (char *) c, n); +} + + +template +inline void +write (T &out, bool v) +{ + char c = !!v; + S::writeChars (out, &c, 1); +} + + +template +inline void +write (T &out, char v) +{ + S::writeChars (out, &v, 1); +} + + +template +inline void +write (T &out, signed char v) +{ + writeSignedChars (out, &v, 1); +} + + +template +inline void +write (T &out, unsigned char v) +{ + writeUnsignedChars (out, &v, 1); +} + + +template +void +write (T &out, signed short v) +{ + signed char b[2]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + + writeSignedChars (out, b, 2); +} + + +template +void +write (T &out, unsigned short v) +{ + unsigned char b[2]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + + writeUnsignedChars (out, b, 2); +} + + +template +void +write (T &out, signed int v) +{ + signed char b[4]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + b[2] = (signed char) (v >> 16); + b[3] = (signed char) (v >> 24); + + writeSignedChars (out, b, 4); +} + + +template +void +write (T &out, unsigned int v) +{ + unsigned char b[4]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + + writeUnsignedChars (out, b, 4); +} + + +template +void +write (T &out, signed long v) +{ + signed char b[8]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + b[2] = (signed char) (v >> 16); + b[3] = (signed char) (v >> 24); + + #if LONG_MAX == 2147483647 + + if (v >= 0) + { + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + } + else + { + b[4] = ~0; + b[5] = ~0; + b[6] = ~0; + b[7] = ~0; + } + + #elif LONG_MAX == 9223372036854775807L + + b[4] = (signed char) (v >> 32); + b[5] = (signed char) (v >> 40); + b[6] = (signed char) (v >> 48); + b[7] = (signed char) (v >> 56); + + #else + + #error write (T &out, signed long v) not implemented + + #endif + + writeSignedChars (out, b, 8); +} + + +template +void +write (T &out, unsigned long v) +{ + unsigned char b[8]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + + #if ULONG_MAX == 4294967295U + + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + + #elif ULONG_MAX == 18446744073709551615LU + + b[4] = (unsigned char) (v >> 32); + b[5] = (unsigned char) (v >> 40); + b[6] = (unsigned char) (v >> 48); + b[7] = (unsigned char) (v >> 56); + + #else + + #error write (T &out, unsigned long v) not implemented + + #endif + + writeUnsignedChars (out, b, 8); +} + + +#if ULONG_MAX != 18446744073709551615LU + + template + void + write (T &out, Int64 v) + { + unsigned char b[8]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + b[4] = (unsigned char) (v >> 32); + b[5] = (unsigned char) (v >> 40); + b[6] = (unsigned char) (v >> 48); + b[7] = (unsigned char) (v >> 56); + + writeUnsignedChars (out, b, 8); + } + +#endif + + +template +void +write (T &out, float v) +{ + union {unsigned int i; float f;} u; + u.f = v; + + unsigned char b[4]; + + b[0] = (unsigned char) (u.i); + b[1] = (unsigned char) (u.i >> 8); + b[2] = (unsigned char) (u.i >> 16); + b[3] = (unsigned char) (u.i >> 24); + + writeUnsignedChars (out, b, 4); +} + + +template +void +write (T &out, double v) +{ + union {Int64 i; double d;} u; + u.d = v; + + unsigned char b[8]; + + b[0] = (unsigned char) (u.i); + b[1] = (unsigned char) (u.i >> 8); + b[2] = (unsigned char) (u.i >> 16); + b[3] = (unsigned char) (u.i >> 24); + b[4] = (unsigned char) (u.i >> 32); + b[5] = (unsigned char) (u.i >> 40); + b[6] = (unsigned char) (u.i >> 48); + b[7] = (unsigned char) (u.i >> 56); + + writeUnsignedChars (out, b, 8); +} + + +template +inline void +write (T &out, half v) +{ + unsigned char b[2]; + + b[0] = (unsigned char) (v.bits()); + b[1] = (unsigned char) (v.bits() >> 8); + + writeUnsignedChars (out, b, 2); +} + + +template +inline void +write (T &out, const char v[], int n) // fixed-size char array +{ + S::writeChars (out, v, n); +} + + +template +void +write (T &out, const char v[]) // zero-terminated string +{ + while (*v) + { + S::writeChars (out, v, 1); + ++v; + } + + S::writeChars (out, v, 1); +} + + +template +void +pad (T &out, int n) // add n padding bytes +{ + for (int i = 0; i < n; i++) + { + const char c = 0; + S::writeChars (out, &c, 1); + } +} + + +template +inline void +read (T &in, bool &v) +{ + char c; + + S::readChars (in, &c, 1); + v = !!c; +} + + +template +inline void +read (T &in, char &v) +{ + S::readChars (in, &v, 1); +} + + +template +inline void +read (T &in, signed char &v) +{ + readSignedChars (in, &v, 1); +} + + +template +inline void +read (T &in, unsigned char &v) +{ + readUnsignedChars (in, &v, 1); +} + + +template +void +read (T &in, signed short &v) +{ + signed char b[2]; + + readSignedChars (in, b, 2); + + v = (b[0] & 0x00ff) | + (b[1] << 8); +} + + +template +void +read (T &in, unsigned short &v) +{ + unsigned char b[2]; + + readUnsignedChars (in, b, 2); + + v = (b[0] & 0x00ff) | + (b[1] << 8); +} + + +template +void +read (T &in, signed int &v) +{ + signed char b[4]; + + readSignedChars (in, b, 4); + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); +} + + +template +void +read (T &in, unsigned int &v) +{ + unsigned char b[4]; + + readUnsignedChars (in, b, 4); + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); +} + + +template +void +read (T &in, signed long &v) +{ + signed char b[8]; + + readSignedChars (in, b, 8); + + #if LONG_MAX == 2147483647 + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + if (( b[4] || b[5] || b[6] || b[7]) && + (~b[4] || ~b[5] || ~b[6] || ~b[7])) + { + throw IEX_NAMESPACE::OverflowExc ("Long int overflow - read a large " + "64-bit integer in a 32-bit process."); + } + + #elif LONG_MAX == 9223372036854775807L + + v = ((long) b[0] & 0x00000000000000ff) | + (((long) b[1] << 8) & 0x000000000000ff00) | + (((long) b[2] << 16) & 0x0000000000ff0000) | + (((long) b[3] << 24) & 0x00000000ff000000) | + (((long) b[4] << 32) & 0x000000ff00000000) | + (((long) b[5] << 40) & 0x0000ff0000000000) | + (((long) b[6] << 48) & 0x00ff000000000000) | + ((long) b[7] << 56); + + #else + + #error read (T &in, signed long &v) not implemented + + #endif +} + + +template +void +read (T &in, unsigned long &v) +{ + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + #if ULONG_MAX == 4294967295U + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + if (b[4] || b[5] || b[6] || b[7]) + { + throw IEX_NAMESPACE::OverflowExc ("Long int overflow - read a large " + "64-bit integer in a 32-bit process."); + } + + #elif ULONG_MAX == 18446744073709551615LU + + v = ((unsigned long) b[0] & 0x00000000000000ff) | + (((unsigned long) b[1] << 8) & 0x000000000000ff00) | + (((unsigned long) b[2] << 16) & 0x0000000000ff0000) | + (((unsigned long) b[3] << 24) & 0x00000000ff000000) | + (((unsigned long) b[4] << 32) & 0x000000ff00000000) | + (((unsigned long) b[5] << 40) & 0x0000ff0000000000) | + (((unsigned long) b[6] << 48) & 0x00ff000000000000) | + ((unsigned long) b[7] << 56); + + #else + + #error read (T &in, unsigned long &v) not implemented + + #endif +} + + +#if ULONG_MAX != 18446744073709551615LU + + template + void + read (T &in, Int64 &v) + { + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + v = ((Int64) b[0] & 0x00000000000000ffLL) | + (((Int64) b[1] << 8) & 0x000000000000ff00LL) | + (((Int64) b[2] << 16) & 0x0000000000ff0000LL) | + (((Int64) b[3] << 24) & 0x00000000ff000000LL) | + (((Int64) b[4] << 32) & 0x000000ff00000000LL) | + (((Int64) b[5] << 40) & 0x0000ff0000000000LL) | + (((Int64) b[6] << 48) & 0x00ff000000000000LL) | + ((Int64) b[7] << 56); + } + +#endif + + +template +void +read (T &in, float &v) +{ + unsigned char b[4]; + + readUnsignedChars (in, b, 4); + + union {unsigned int i; float f;} u; + + u.i = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + v = u.f; +} + + +template +void +read (T &in, double &v) +{ + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + union {Int64 i; double d;} u; + + u.i = ((Int64) b[0] & 0x00000000000000ffULL) | + (((Int64) b[1] << 8) & 0x000000000000ff00ULL) | + (((Int64) b[2] << 16) & 0x0000000000ff0000ULL) | + (((Int64) b[3] << 24) & 0x00000000ff000000ULL) | + (((Int64) b[4] << 32) & 0x000000ff00000000ULL) | + (((Int64) b[5] << 40) & 0x0000ff0000000000ULL) | + (((Int64) b[6] << 48) & 0x00ff000000000000ULL) | + ((Int64) b[7] << 56); + + v = u.d; +} + + +template +inline void +read (T &in, half &v) +{ + unsigned char b[2]; + + readUnsignedChars (in, b, 2); + + v.setBits ((b[0] & 0x00ff) | (b[1] << 8)); +} + + +template +inline void +read (T &in, char v[], int n) // fixed-size char array +{ + S::readChars (in, v, n); +} + + +template +void +read (T &in, int n, char v[]) // zero-terminated string +{ + while (n >= 0) + { + S::readChars (in, v, 1); + + if (*v == 0) + break; + + --n; + ++v; + } +} + + +template +void +skip (T &in, int n) // skip n padding bytes +{ + char c[1024]; + + while (n >= (int) sizeof (c)) + { + if (!S::readChars (in, c, sizeof (c))) + return; + + n -= sizeof (c); + } + + if (n >= 1) + S::readChars (in, c, n); +} + + +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 2;} +template <> inline int size () {return 2;} +template <> inline int size () {return 4;} +template <> inline int size () {return 4;} +template <> inline int size () {return 8;} +template <> inline int size () {return 8;} +template <> inline int size () {return 8;} +template <> inline int size () {return 4;} +template <> inline int size () {return 8;} +template <> inline int size () {return 2;} + + +} // namespace Xdr +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + +#if defined (OPENEXR_IMF_INTERNAL_NAMESPACE_AUTO_EXPOSE) +namespace Imf{using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;} +#endif + + +#endif diff --git a/IlmImf/ImfZip.cpp b/IlmImf/ImfZip.cpp new file mode 100644 index 0000000..93d625e --- /dev/null +++ b/IlmImf/ImfZip.cpp @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfZip.h" +#include "ImfCheckedArithmetic.h" +#include "ImfNamespace.h" +#include "Iex.h" + +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +Imf::Zip::Zip(size_t maxRawSize): + _maxRawSize(maxRawSize), + _tmpBuffer(0) +{ + _tmpBuffer = new char[_maxRawSize]; +} + +Imf::Zip::Zip(size_t maxScanLineSize, size_t numScanLines): + _maxRawSize(0), + _tmpBuffer(0) +{ + _maxRawSize = uiMult (maxScanLineSize, numScanLines); + _tmpBuffer = new char[_maxRawSize]; +} + +Imf::Zip::~Zip() +{ + if (_tmpBuffer) delete[] _tmpBuffer; +} + +size_t +Imf::Zip::maxRawSize() +{ + return _maxRawSize; +} + +size_t +Imf::Zip::maxCompressedSize() +{ + return uiAdd (uiAdd (_maxRawSize, + size_t (ceil (_maxRawSize * 0.01))), + size_t (100)); +} + +int +Imf::Zip::compress(const char *raw, int rawSize, char *compressed) +{ + // + // Reorder the pixel data. + // + + { + char *t1 = _tmpBuffer; + char *t2 = _tmpBuffer + (rawSize + 1) / 2; + const char *stop = raw + rawSize; + + while (true) + { + if (raw < stop) + *(t1++) = *(raw++); + else + break; + + if (raw < stop) + *(t2++) = *(raw++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + rawSize; + int p = t[-1]; + + while (t < stop) + { + int d = int (t[0]) - p + (128 + 256); + p = t[0]; + t[0] = d; + ++t; + } + } + + // + // Compress the data using zlib + // + + uLongf outSize = int(ceil(rawSize * 1.01)) + 100; + + if (Z_OK != ::compress ((Bytef *)compressed, &outSize, + (const Bytef *) _tmpBuffer, rawSize)) + { + throw Iex::BaseExc ("Data compression (zlib) failed."); + } + + return outSize; +} + +int +Imf::Zip::uncompress(const char *compressed, int compressedSize, + char *raw) +{ + // + // Decompress the data using zlib + // + + uLongf outSize = _maxRawSize; + + if (Z_OK != ::uncompress ((Bytef *)_tmpBuffer, &outSize, + (const Bytef *) compressed, compressedSize)) + { + throw Iex::InputExc ("Data decompression (zlib) failed."); + } + + // + // Predictor. + // + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; + + while (t < stop) + { + int d = int (t[-1]) + int (t[0]) - 128; + t[0] = d; + ++t; + } + } + + // + // Reorder the pixel data. + // + + { + const char *t1 = _tmpBuffer; + const char *t2 = _tmpBuffer + (outSize + 1) / 2; + char *s = raw; + char *stop = s + outSize; + + while (true) + { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + return outSize; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImf/ImfZip.h b/IlmImf/ImfZip.h new file mode 100644 index 0000000..03f2c5e --- /dev/null +++ b/IlmImf/ImfZip.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_IMF_ZIP_H +#define INCLUDED_IMF_ZIP_H + +#include "ImfNamespace.h" + +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class Zip +{ + public: + explicit Zip(size_t rawMaxSize); + Zip(size_t maxScanlineSize, size_t numScanLines); + ~Zip(); + + size_t maxRawSize(); + size_t maxCompressedSize(); + + // + // Compress the raw data into the provided buffer. + // Returns the amount of compressed data. + // + int compress(const char *raw, int rawSize, char *compressed); + + // + // Uncompress the compressed data into the provided + // buffer. Returns the amount of raw data actually decoded. + // + int uncompress(const char *compressed, int compressedSize, + char *raw); + + private: + size_t _maxRawSize; + char *_tmpBuffer; + + Zip(); + Zip(const Zip&); +}; + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImf/ImfZipCompressor.cpp b/IlmImf/ImfZipCompressor.cpp new file mode 100644 index 0000000..b0d6989 --- /dev/null +++ b/IlmImf/ImfZipCompressor.cpp @@ -0,0 +1,127 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class ZipCompressor +// +//----------------------------------------------------------------------------- + +#include "ImfZipCompressor.h" +#include "ImfCheckedArithmetic.h" +#include "Iex.h" +#include +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +ZipCompressor::ZipCompressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _numScanLines (numScanLines), + _outBuffer (0), + _zip(maxScanLineSize, numScanLines) +{ + _outBuffer = new char[_zip.maxCompressedSize()]; +} + + +ZipCompressor::~ZipCompressor () +{ + delete [] _outBuffer; +} + + +int +ZipCompressor::numScanLines () const +{ + return _numScanLines; +} + + +int +ZipCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case �- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + int outSize = _zip.compress(inPtr, inSize, _outBuffer); + + outPtr = _outBuffer; + return outSize; +} + + +int +ZipCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case �- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + int outSize = _zip.uncompress(inPtr, inSize, _outBuffer); + + outPtr = _outBuffer; + return outSize; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + diff --git a/IlmImf/ImfZipCompressor.h b/IlmImf/ImfZipCompressor.h new file mode 100644 index 0000000..03a88e8 --- /dev/null +++ b/IlmImf/ImfZipCompressor.h @@ -0,0 +1,89 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef INCLUDED_IMF_ZIP_COMPRESSOR_H +#define INCLUDED_IMF_ZIP_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class ZipCompressor -- performs zlib-style compression +// +//----------------------------------------------------------------------------- + +#include "ImfCompressor.h" +#include "ImfZip.h" +#include "ImfNamespace.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class ZipCompressor: public Compressor +{ + public: + + ZipCompressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~ZipCompressor (); + + virtual int numScanLines () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + private: + + int _maxScanLineSize; + int _numScanLines; + char * _outBuffer; + Zip _zip; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + + + + + +#endif diff --git a/IlmImf/Makefile.am b/IlmImf/Makefile.am new file mode 100644 index 0000000..f537ba1 --- /dev/null +++ b/IlmImf/Makefile.am @@ -0,0 +1,211 @@ +## Process this file with automake to produce Makefile.in + +lib_LTLIBRARIES = libIlmImf.la + +libIlmImf_la_SOURCES = ImfForward.h ImfAttribute.cpp ImfBoxAttribute.cpp ImfCRgbaFile.cpp \ + ImfChannelList.cpp ImfChannelListAttribute.cpp \ + ImfFloatAttribute.cpp ImfFrameBuffer.cpp \ + ImfHeader.cpp ImfIO.cpp ImfInputFile.cpp \ + ImfIntAttribute.cpp ImfLineOrderAttribute.cpp \ + ImfMatrixAttribute.cpp ImfOpaqueAttribute.cpp \ + ImfOutputFile.cpp ImfRgbaFile.cpp \ + ImfStringAttribute.cpp ImfVecAttribute.cpp ImfHuf.cpp \ + ImfThreading.cpp \ + ImfWav.cpp ImfLut.cpp ImfCompressor.cpp \ + ImfRleCompressor.cpp ImfZipCompressor.cpp \ + ImfPizCompressor.cpp ImfB44Compressor.cpp \ + ImfDwaCompressor.cpp ImfMisc.cpp \ + ImfCompressionAttribute.cpp ImfDoubleAttribute.cpp \ + ImfAttribute.h ImfBoxAttribute.h \ + ImfCRgbaFile.h ImfChannelList.h \ + ImfChannelListAttribute.h \ + ImfCompressionAttribute.h \ + ImfDoubleAttribute.h ImfFloatAttribute.h \ + ImfFrameBuffer.h ImfHeader.h ImfIO.h \ + ImfInputFile.h ImfIntAttribute.h \ + ImfLineOrderAttribute.h ImfMatrixAttribute.h \ + ImfOpaqueAttribute.h ImfOutputFile.h \ + ImfRgbaFile.h ImfStringAttribute.h \ + ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ + ImfArray.h ImfCompression.h ImfLineOrder.h \ + ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ + ImfCompressor.h ImfRleCompressor.h ImfZipCompressor.h \ + ImfPizCompressor.h ImfDwaCompressor.h \ + ImfDwaCompressorSimd.h ImfMisc.h ImfAutoArray.h \ + ImfConvert.cpp ImfConvert.h ImfPreviewImage.cpp \ + ImfPreviewImage.h ImfPreviewImageAttribute.cpp \ + ImfPreviewImageAttribute.h ImfVersion.cpp \ + ImfChromaticities.cpp ImfChromaticities.h \ + ImfChromaticitiesAttribute.cpp \ + ImfChromaticitiesAttribute.h \ + ImfKeyCode.cpp ImfKeyCode.h \ + ImfKeyCodeAttribute.cpp ImfKeyCodeAttribute.h \ + ImfTimeCode.cpp ImfTimeCode.h \ + ImfTimeCodeAttribute.cpp ImfTimeCodeAttribute.h \ + ImfRational.cpp ImfRational.h \ + ImfRationalAttribute.cpp ImfRationalAttribute.h \ + ImfFramesPerSecond.cpp ImfFramesPerSecond.h \ + ImfStandardAttributes.cpp ImfStandardAttributes.h \ + ImfStdIO.cpp ImfStdIO.h ImfEnvmap.cpp ImfEnvmap.h \ + ImfEnvmapAttribute.cpp ImfEnvmapAttribute.h \ + ImfInt64.h ImfRgba.h ImfScanLineInputFile.cpp \ + ImfScanLineInputFile.h ImfTiledInputFile.cpp \ + ImfTiledMisc.cpp ImfTiledOutputFile.cpp \ + ImfTiledRgbaFile.cpp ImfTileDescriptionAttribute.cpp \ + ImfTileOffsets.cpp ImfTileDescription.h \ + ImfTileDescriptionAttribute.h ImfTileOffsets.h \ + ImfTiledInputFile.h ImfTiledMisc.h \ + ImfTiledOutputFile.h ImfTiledRgbaFile.h \ + ImfRgbaYca.cpp ImfRgbaYca.h \ + ImfPxr24Compressor.cpp ImfPxr24Compressor.h \ + ImfTestFile.cpp ImfTestFile.h ImfThreading.h \ + ImfStringVectorAttribute.cpp ImfStringVectorAttribute.h \ + ImfMultiView.cpp ImfMultiView.h \ + ImfAcesFile.cpp ImfAcesFile.h \ + ImfCheckedArithmetic.h \ + ImfMultiPartOutputFile.cpp ImfMultiPartOutputFile.h \ + ImfGenericOutputFile.cpp ImfGenericOutputFile.h \ + ImfOutputStreamMutex.h ImfInputStreamMutex.h\ + ImfOutputPartData.h ImfOutputPartData.cpp \ + ImfMultiPartInputFile.cpp ImfMultiPartInputFile.h \ + ImfGenericInputFile.cpp ImfGenericInputFile.h \ + ImfPartType.cpp ImfPartType.h \ + ImfInputPartData.cpp ImfInputPartData.h \ + ImfOutputPart.cpp ImfOutputPart.h \ + ImfTiledOutputPart.cpp ImfTiledOutputPart.h \ + ImfInputPart.cpp ImfInputPart.h \ + ImfTiledInputPart.cpp ImfTiledInputPart.h \ + ImfDeepScanLineInputPart.h ImfDeepScanLineInputPart.cpp \ + ImfDeepScanLineOutputPart.cpp ImfDeepScanLineOutputPart.h \ + ImfDeepScanLineInputFile.cpp ImfDeepScanLineInputFile.h \ + ImfDeepScanLineOutputFile.cpp ImfDeepScanLineOutputFile.h \ + ImfDeepTiledInputPart.h ImfDeepTiledInputPart.cpp \ + ImfDeepTiledOutputPart.h ImfDeepTiledOutputPart.cpp \ + ImfDeepTiledInputFile.h ImfDeepTiledInputFile.cpp \ + ImfDeepTiledOutputFile.h ImfDeepTiledOutputFile.cpp \ + ImfDeepFrameBuffer.cpp ImfDeepFrameBuffer.h \ + ImfDeepCompositing.h ImfDeepCompositing.cpp \ + ImfCompositeDeepScanLine.h ImfCompositeDeepScanLine.cpp \ + ImfDeepImageStateAttribute.h ImfDeepImageStateAttribute.cpp \ + ImfFastHuf.h ImfFastHuf.cpp \ + ImfFloatVectorAttribute.h ImfFloatVectorAttribute.cpp \ + ImfRle.h ImfRle.cpp ImfSimd.h \ + ImfSystemSpecific.cpp ImfZip.h ImfZip.cpp + + +libIlmImf_la_LDFLAGS = @ILMBASE_LDFLAGS@ -version-info @LIBTOOL_VERSION@ \ + -no-undefined + + +if LIB_SUFFIX_EXISTS +libIlmImf_la_LDFLAGS += -release @LIB_SUFFIX@ +endif + + +libIlmImf_la_LIBADD = -lz @ILMBASE_LIBS@ + +libIlmImfincludedir = $(includedir)/OpenEXR + +libIlmImfinclude_HEADERS = ImfForward.h ImfAttribute.h ImfBoxAttribute.h \ + ImfCRgbaFile.h ImfChannelList.h \ + ImfChannelListAttribute.h \ + ImfCompressionAttribute.h \ + ImfDoubleAttribute.h ImfFloatAttribute.h \ + ImfFrameBuffer.h ImfHeader.h ImfIO.h \ + ImfInputFile.h ImfIntAttribute.h \ + ImfLineOrderAttribute.h ImfMatrixAttribute.h \ + ImfOpaqueAttribute.h ImfOutputFile.h \ + ImfRgbaFile.h ImfStringAttribute.h \ + ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ + ImfArray.h ImfCompression.h ImfLineOrder.h \ + ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ + ImfConvert.h ImfPreviewImage.h \ + ImfPreviewImageAttribute.h ImfChromaticities.h \ + ImfChromaticitiesAttribute.h \ + ImfKeyCode.h ImfKeyCodeAttribute.h \ + ImfTimeCode.h ImfTimeCodeAttribute.h \ + ImfRational.h ImfRationalAttribute.h \ + ImfFramesPerSecond.h \ + ImfStandardAttributes.h \ + ImfEnvmap.h \ + ImfEnvmapAttribute.h \ + ImfInt64.h ImfRgba.h \ + ImfTileDescription.h \ + ImfTileDescriptionAttribute.h \ + ImfTiledInputFile.h \ + ImfTiledOutputFile.h ImfTiledRgbaFile.h \ + ImfRgbaYca.h \ + ImfTestFile.h ImfThreading.h \ + ImfB44Compressor.h ImfStringVectorAttribute.h \ + ImfMultiView.h \ + ImfAcesFile.h \ + ImfMultiPartOutputFile.h \ + ImfGenericOutputFile.h \ + ImfMultiPartInputFile.h \ + ImfGenericInputFile.h \ + ImfPartType.h \ + ImfOutputPart.h \ + ImfTiledOutputPart.h \ + ImfInputPart.h \ + ImfTiledInputPart.h \ + ImfDeepScanLineOutputFile.h \ + ImfDeepScanLineOutputPart.h \ + ImfDeepScanLineInputFile.h \ + ImfDeepScanLineInputPart.h \ + ImfDeepTiledInputFile.h \ + ImfDeepTiledInputPart.h \ + ImfDeepTiledOutputFile.h \ + ImfDeepTiledOutputPart.h \ + ImfDeepFrameBuffer.h \ + ImfDeepCompositing.h ImfCompositeDeepScanLine.h \ + ImfNamespace.h ImfForward.h ImfExport.h \ + ImfMisc.h \ + ImfPartHelper.h \ + ImfDeepImageState.h \ + ImfDeepImageStateAttribute.h + +noinst_HEADERS = ImfCompressor.h \ + ImfRleCompressor.h \ + ImfZipCompressor.h \ + ImfPizCompressor.h \ + ImfDwaCompressor.h \ + ImfDwaCompressorSimd.h \ + ImfAutoArray.h \ + ImfTiledMisc.h \ + ImfTileOffsets.h \ + ImfScanLineInputFile.h \ + ImfPxr24Compressor.h \ + ImfCheckedArithmetic.h \ + ImfInputStreamMutex.h \ + ImfOutputStreamMutex.h \ + ImfInputPartData.h \ + ImfOutputPartData.h \ + ImfScanLineInputFile.h \ + ImfSystemSpecific.h \ + ImfOptimizedPixelReading.h + + +EXTRA_DIST = $(noinst_HEADERS) b44ExpLogTable.cpp b44ExpLogTable.h dwaLookups.cpp dwaLookups.h CMakeLists.txt + + +INCLUDES = @ILMBASE_CXXFLAGS@ \ + -I$(top_builddir) \ + -I$(top_srcdir)/config + +CLEANFILES = b44ExpLogTable b44ExpLogTable.h dwaLookups dwaLookups.h + +b44ExpLogTable_SOURCES = b44ExpLogTable.cpp +b44ExpLogTable_LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ + +b44ExpLogTable.h: b44ExpLogTable + ./b44ExpLogTable > b44ExpLogTable.h + +dwaLookups_SOURCES = dwaLookups.cpp +dwaLookups_LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ + +dwaLookups.h: dwaLookups + ./dwaLookups > dwaLookups.h + +BUILT_SOURCES = b44ExpLogTable.h dwaLookups.h + +noinst_PROGRAMS = b44ExpLogTable dwaLookups diff --git a/IlmImf/Makefile.in b/IlmImf/Makefile.in new file mode 100644 index 0000000..06880a2 --- /dev/null +++ b/IlmImf/Makefile.in @@ -0,0 +1,917 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@LIB_SUFFIX_EXISTS_TRUE@am__append_1 = -release @LIB_SUFFIX@ +noinst_PROGRAMS = b44ExpLogTable$(EXEEXT) dwaLookups$(EXEEXT) +subdir = IlmImf +DIST_COMMON = $(libIlmImfinclude_HEADERS) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libIlmImfincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libIlmImf_la_DEPENDENCIES = +am_libIlmImf_la_OBJECTS = ImfAttribute.lo ImfBoxAttribute.lo \ + ImfCRgbaFile.lo ImfChannelList.lo ImfChannelListAttribute.lo \ + ImfFloatAttribute.lo ImfFrameBuffer.lo ImfHeader.lo ImfIO.lo \ + ImfInputFile.lo ImfIntAttribute.lo ImfLineOrderAttribute.lo \ + ImfMatrixAttribute.lo ImfOpaqueAttribute.lo ImfOutputFile.lo \ + ImfRgbaFile.lo ImfStringAttribute.lo ImfVecAttribute.lo \ + ImfHuf.lo ImfThreading.lo ImfWav.lo ImfLut.lo ImfCompressor.lo \ + ImfRleCompressor.lo ImfZipCompressor.lo ImfPizCompressor.lo \ + ImfB44Compressor.lo ImfDwaCompressor.lo ImfMisc.lo \ + ImfCompressionAttribute.lo ImfDoubleAttribute.lo ImfConvert.lo \ + ImfPreviewImage.lo ImfPreviewImageAttribute.lo ImfVersion.lo \ + ImfChromaticities.lo ImfChromaticitiesAttribute.lo \ + ImfKeyCode.lo ImfKeyCodeAttribute.lo ImfTimeCode.lo \ + ImfTimeCodeAttribute.lo ImfRational.lo ImfRationalAttribute.lo \ + ImfFramesPerSecond.lo ImfStandardAttributes.lo ImfStdIO.lo \ + ImfEnvmap.lo ImfEnvmapAttribute.lo ImfScanLineInputFile.lo \ + ImfTiledInputFile.lo ImfTiledMisc.lo ImfTiledOutputFile.lo \ + ImfTiledRgbaFile.lo ImfTileDescriptionAttribute.lo \ + ImfTileOffsets.lo ImfRgbaYca.lo ImfPxr24Compressor.lo \ + ImfTestFile.lo ImfStringVectorAttribute.lo ImfMultiView.lo \ + ImfAcesFile.lo ImfMultiPartOutputFile.lo \ + ImfGenericOutputFile.lo ImfOutputPartData.lo \ + ImfMultiPartInputFile.lo ImfGenericInputFile.lo ImfPartType.lo \ + ImfInputPartData.lo ImfOutputPart.lo ImfTiledOutputPart.lo \ + ImfInputPart.lo ImfTiledInputPart.lo \ + ImfDeepScanLineInputPart.lo ImfDeepScanLineOutputPart.lo \ + ImfDeepScanLineInputFile.lo ImfDeepScanLineOutputFile.lo \ + ImfDeepTiledInputPart.lo ImfDeepTiledOutputPart.lo \ + ImfDeepTiledInputFile.lo ImfDeepTiledOutputFile.lo \ + ImfDeepFrameBuffer.lo ImfDeepCompositing.lo \ + ImfCompositeDeepScanLine.lo ImfDeepImageStateAttribute.lo \ + ImfFastHuf.lo ImfFloatVectorAttribute.lo ImfRle.lo \ + ImfSystemSpecific.lo ImfZip.lo +libIlmImf_la_OBJECTS = $(am_libIlmImf_la_OBJECTS) +libIlmImf_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libIlmImf_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(noinst_PROGRAMS) +am_b44ExpLogTable_OBJECTS = b44ExpLogTable.$(OBJEXT) +b44ExpLogTable_OBJECTS = $(am_b44ExpLogTable_OBJECTS) +b44ExpLogTable_DEPENDENCIES = +am_dwaLookups_OBJECTS = dwaLookups.$(OBJEXT) +dwaLookups_OBJECTS = $(am_dwaLookups_OBJECTS) +dwaLookups_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libIlmImf_la_SOURCES) $(b44ExpLogTable_SOURCES) \ + $(dwaLookups_SOURCES) +DIST_SOURCES = $(libIlmImf_la_SOURCES) $(b44ExpLogTable_SOURCES) \ + $(dwaLookups_SOURCES) +HEADERS = $(libIlmImfinclude_HEADERS) $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +lib_LTLIBRARIES = libIlmImf.la +libIlmImf_la_SOURCES = ImfForward.h ImfAttribute.cpp ImfBoxAttribute.cpp ImfCRgbaFile.cpp \ + ImfChannelList.cpp ImfChannelListAttribute.cpp \ + ImfFloatAttribute.cpp ImfFrameBuffer.cpp \ + ImfHeader.cpp ImfIO.cpp ImfInputFile.cpp \ + ImfIntAttribute.cpp ImfLineOrderAttribute.cpp \ + ImfMatrixAttribute.cpp ImfOpaqueAttribute.cpp \ + ImfOutputFile.cpp ImfRgbaFile.cpp \ + ImfStringAttribute.cpp ImfVecAttribute.cpp ImfHuf.cpp \ + ImfThreading.cpp \ + ImfWav.cpp ImfLut.cpp ImfCompressor.cpp \ + ImfRleCompressor.cpp ImfZipCompressor.cpp \ + ImfPizCompressor.cpp ImfB44Compressor.cpp \ + ImfDwaCompressor.cpp ImfMisc.cpp \ + ImfCompressionAttribute.cpp ImfDoubleAttribute.cpp \ + ImfAttribute.h ImfBoxAttribute.h \ + ImfCRgbaFile.h ImfChannelList.h \ + ImfChannelListAttribute.h \ + ImfCompressionAttribute.h \ + ImfDoubleAttribute.h ImfFloatAttribute.h \ + ImfFrameBuffer.h ImfHeader.h ImfIO.h \ + ImfInputFile.h ImfIntAttribute.h \ + ImfLineOrderAttribute.h ImfMatrixAttribute.h \ + ImfOpaqueAttribute.h ImfOutputFile.h \ + ImfRgbaFile.h ImfStringAttribute.h \ + ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ + ImfArray.h ImfCompression.h ImfLineOrder.h \ + ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ + ImfCompressor.h ImfRleCompressor.h ImfZipCompressor.h \ + ImfPizCompressor.h ImfDwaCompressor.h \ + ImfDwaCompressorSimd.h ImfMisc.h ImfAutoArray.h \ + ImfConvert.cpp ImfConvert.h ImfPreviewImage.cpp \ + ImfPreviewImage.h ImfPreviewImageAttribute.cpp \ + ImfPreviewImageAttribute.h ImfVersion.cpp \ + ImfChromaticities.cpp ImfChromaticities.h \ + ImfChromaticitiesAttribute.cpp \ + ImfChromaticitiesAttribute.h \ + ImfKeyCode.cpp ImfKeyCode.h \ + ImfKeyCodeAttribute.cpp ImfKeyCodeAttribute.h \ + ImfTimeCode.cpp ImfTimeCode.h \ + ImfTimeCodeAttribute.cpp ImfTimeCodeAttribute.h \ + ImfRational.cpp ImfRational.h \ + ImfRationalAttribute.cpp ImfRationalAttribute.h \ + ImfFramesPerSecond.cpp ImfFramesPerSecond.h \ + ImfStandardAttributes.cpp ImfStandardAttributes.h \ + ImfStdIO.cpp ImfStdIO.h ImfEnvmap.cpp ImfEnvmap.h \ + ImfEnvmapAttribute.cpp ImfEnvmapAttribute.h \ + ImfInt64.h ImfRgba.h ImfScanLineInputFile.cpp \ + ImfScanLineInputFile.h ImfTiledInputFile.cpp \ + ImfTiledMisc.cpp ImfTiledOutputFile.cpp \ + ImfTiledRgbaFile.cpp ImfTileDescriptionAttribute.cpp \ + ImfTileOffsets.cpp ImfTileDescription.h \ + ImfTileDescriptionAttribute.h ImfTileOffsets.h \ + ImfTiledInputFile.h ImfTiledMisc.h \ + ImfTiledOutputFile.h ImfTiledRgbaFile.h \ + ImfRgbaYca.cpp ImfRgbaYca.h \ + ImfPxr24Compressor.cpp ImfPxr24Compressor.h \ + ImfTestFile.cpp ImfTestFile.h ImfThreading.h \ + ImfStringVectorAttribute.cpp ImfStringVectorAttribute.h \ + ImfMultiView.cpp ImfMultiView.h \ + ImfAcesFile.cpp ImfAcesFile.h \ + ImfCheckedArithmetic.h \ + ImfMultiPartOutputFile.cpp ImfMultiPartOutputFile.h \ + ImfGenericOutputFile.cpp ImfGenericOutputFile.h \ + ImfOutputStreamMutex.h ImfInputStreamMutex.h\ + ImfOutputPartData.h ImfOutputPartData.cpp \ + ImfMultiPartInputFile.cpp ImfMultiPartInputFile.h \ + ImfGenericInputFile.cpp ImfGenericInputFile.h \ + ImfPartType.cpp ImfPartType.h \ + ImfInputPartData.cpp ImfInputPartData.h \ + ImfOutputPart.cpp ImfOutputPart.h \ + ImfTiledOutputPart.cpp ImfTiledOutputPart.h \ + ImfInputPart.cpp ImfInputPart.h \ + ImfTiledInputPart.cpp ImfTiledInputPart.h \ + ImfDeepScanLineInputPart.h ImfDeepScanLineInputPart.cpp \ + ImfDeepScanLineOutputPart.cpp ImfDeepScanLineOutputPart.h \ + ImfDeepScanLineInputFile.cpp ImfDeepScanLineInputFile.h \ + ImfDeepScanLineOutputFile.cpp ImfDeepScanLineOutputFile.h \ + ImfDeepTiledInputPart.h ImfDeepTiledInputPart.cpp \ + ImfDeepTiledOutputPart.h ImfDeepTiledOutputPart.cpp \ + ImfDeepTiledInputFile.h ImfDeepTiledInputFile.cpp \ + ImfDeepTiledOutputFile.h ImfDeepTiledOutputFile.cpp \ + ImfDeepFrameBuffer.cpp ImfDeepFrameBuffer.h \ + ImfDeepCompositing.h ImfDeepCompositing.cpp \ + ImfCompositeDeepScanLine.h ImfCompositeDeepScanLine.cpp \ + ImfDeepImageStateAttribute.h ImfDeepImageStateAttribute.cpp \ + ImfFastHuf.h ImfFastHuf.cpp \ + ImfFloatVectorAttribute.h ImfFloatVectorAttribute.cpp \ + ImfRle.h ImfRle.cpp ImfSimd.h \ + ImfSystemSpecific.cpp ImfZip.h ImfZip.cpp + +libIlmImf_la_LDFLAGS = @ILMBASE_LDFLAGS@ -version-info \ + @LIBTOOL_VERSION@ -no-undefined $(am__append_1) +libIlmImf_la_LIBADD = -lz @ILMBASE_LIBS@ +libIlmImfincludedir = $(includedir)/OpenEXR +libIlmImfinclude_HEADERS = ImfForward.h ImfAttribute.h ImfBoxAttribute.h \ + ImfCRgbaFile.h ImfChannelList.h \ + ImfChannelListAttribute.h \ + ImfCompressionAttribute.h \ + ImfDoubleAttribute.h ImfFloatAttribute.h \ + ImfFrameBuffer.h ImfHeader.h ImfIO.h \ + ImfInputFile.h ImfIntAttribute.h \ + ImfLineOrderAttribute.h ImfMatrixAttribute.h \ + ImfOpaqueAttribute.h ImfOutputFile.h \ + ImfRgbaFile.h ImfStringAttribute.h \ + ImfVecAttribute.h ImfHuf.h ImfWav.h ImfLut.h \ + ImfArray.h ImfCompression.h ImfLineOrder.h \ + ImfName.h ImfPixelType.h ImfVersion.h ImfXdr.h \ + ImfConvert.h ImfPreviewImage.h \ + ImfPreviewImageAttribute.h ImfChromaticities.h \ + ImfChromaticitiesAttribute.h \ + ImfKeyCode.h ImfKeyCodeAttribute.h \ + ImfTimeCode.h ImfTimeCodeAttribute.h \ + ImfRational.h ImfRationalAttribute.h \ + ImfFramesPerSecond.h \ + ImfStandardAttributes.h \ + ImfEnvmap.h \ + ImfEnvmapAttribute.h \ + ImfInt64.h ImfRgba.h \ + ImfTileDescription.h \ + ImfTileDescriptionAttribute.h \ + ImfTiledInputFile.h \ + ImfTiledOutputFile.h ImfTiledRgbaFile.h \ + ImfRgbaYca.h \ + ImfTestFile.h ImfThreading.h \ + ImfB44Compressor.h ImfStringVectorAttribute.h \ + ImfMultiView.h \ + ImfAcesFile.h \ + ImfMultiPartOutputFile.h \ + ImfGenericOutputFile.h \ + ImfMultiPartInputFile.h \ + ImfGenericInputFile.h \ + ImfPartType.h \ + ImfOutputPart.h \ + ImfTiledOutputPart.h \ + ImfInputPart.h \ + ImfTiledInputPart.h \ + ImfDeepScanLineOutputFile.h \ + ImfDeepScanLineOutputPart.h \ + ImfDeepScanLineInputFile.h \ + ImfDeepScanLineInputPart.h \ + ImfDeepTiledInputFile.h \ + ImfDeepTiledInputPart.h \ + ImfDeepTiledOutputFile.h \ + ImfDeepTiledOutputPart.h \ + ImfDeepFrameBuffer.h \ + ImfDeepCompositing.h ImfCompositeDeepScanLine.h \ + ImfNamespace.h ImfForward.h ImfExport.h \ + ImfMisc.h \ + ImfPartHelper.h \ + ImfDeepImageState.h \ + ImfDeepImageStateAttribute.h + +noinst_HEADERS = ImfCompressor.h \ + ImfRleCompressor.h \ + ImfZipCompressor.h \ + ImfPizCompressor.h \ + ImfDwaCompressor.h \ + ImfDwaCompressorSimd.h \ + ImfAutoArray.h \ + ImfTiledMisc.h \ + ImfTileOffsets.h \ + ImfScanLineInputFile.h \ + ImfPxr24Compressor.h \ + ImfCheckedArithmetic.h \ + ImfInputStreamMutex.h \ + ImfOutputStreamMutex.h \ + ImfInputPartData.h \ + ImfOutputPartData.h \ + ImfScanLineInputFile.h \ + ImfSystemSpecific.h \ + ImfOptimizedPixelReading.h + +EXTRA_DIST = $(noinst_HEADERS) b44ExpLogTable.cpp b44ExpLogTable.h dwaLookups.cpp dwaLookups.h CMakeLists.txt +INCLUDES = @ILMBASE_CXXFLAGS@ \ + -I$(top_builddir) \ + -I$(top_srcdir)/config + +CLEANFILES = b44ExpLogTable b44ExpLogTable.h dwaLookups dwaLookups.h +b44ExpLogTable_SOURCES = b44ExpLogTable.cpp +b44ExpLogTable_LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ +dwaLookups_SOURCES = dwaLookups.cpp +dwaLookups_LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ +BUILT_SOURCES = b44ExpLogTable.h dwaLookups.h +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libIlmImf.la: $(libIlmImf_la_OBJECTS) $(libIlmImf_la_DEPENDENCIES) + $(libIlmImf_la_LINK) -rpath $(libdir) $(libIlmImf_la_OBJECTS) $(libIlmImf_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +b44ExpLogTable$(EXEEXT): $(b44ExpLogTable_OBJECTS) $(b44ExpLogTable_DEPENDENCIES) + @rm -f b44ExpLogTable$(EXEEXT) + $(CXXLINK) $(b44ExpLogTable_OBJECTS) $(b44ExpLogTable_LDADD) $(LIBS) +dwaLookups$(EXEEXT): $(dwaLookups_OBJECTS) $(dwaLookups_DEPENDENCIES) + @rm -f dwaLookups$(EXEEXT) + $(CXXLINK) $(dwaLookups_OBJECTS) $(dwaLookups_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfAcesFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfB44Compressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfBoxAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfCRgbaFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfChannelList.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfChannelListAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfChromaticities.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfChromaticitiesAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfCompositeDeepScanLine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfCompressionAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfCompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfConvert.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepCompositing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepFrameBuffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepImageStateAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepScanLineInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepScanLineInputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepScanLineOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepScanLineOutputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepTiledInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepTiledInputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepTiledOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepTiledOutputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDoubleAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDwaCompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfEnvmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfEnvmapAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFastHuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFloatAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFloatVectorAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFrameBuffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFramesPerSecond.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfGenericInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfGenericOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfHeader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfHuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfIO.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfInputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfInputPartData.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfIntAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfKeyCode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfKeyCodeAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfLineOrderAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfLut.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfMatrixAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfMisc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfMultiPartInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfMultiPartOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfMultiView.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfOpaqueAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfOutputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfOutputPartData.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfPartType.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfPizCompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfPreviewImage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfPreviewImageAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfPxr24Compressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRational.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRationalAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRgbaFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRgbaYca.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRle.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfRleCompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfScanLineInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfStandardAttributes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfStdIO.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfStringAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfStringVectorAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfSystemSpecific.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTestFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfThreading.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTileDescriptionAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTileOffsets.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledInputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledInputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledMisc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledOutputFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledOutputPart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTiledRgbaFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTimeCode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfTimeCodeAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfVecAttribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfVersion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfWav.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfZip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfZipCompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/b44ExpLogTable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwaLookups.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libIlmImfincludeHEADERS: $(libIlmImfinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libIlmImfincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libIlmImfincludedir)" + @list='$(libIlmImfinclude_HEADERS)'; test -n "$(libIlmImfincludedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libIlmImfincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libIlmImfincludedir)" || exit $$?; \ + done + +uninstall-libIlmImfincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libIlmImfinclude_HEADERS)'; test -n "$(libIlmImfincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libIlmImfincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libIlmImfincludedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libIlmImfincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-libIlmImfincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libIlmImfincludeHEADERS \ + uninstall-libLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libIlmImfincludeHEADERS \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libIlmImfincludeHEADERS \ + uninstall-libLTLIBRARIES + + +b44ExpLogTable.h: b44ExpLogTable + ./b44ExpLogTable > b44ExpLogTable.h + +dwaLookups.h: dwaLookups + ./dwaLookups > dwaLookups.h + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImf/b44ExpLogTable.cpp b/IlmImf/b44ExpLogTable.cpp new file mode 100644 index 0000000..24e35fb --- /dev/null +++ b/IlmImf/b44ExpLogTable.cpp @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//--------------------------------------------------------------------------- +// +// b44ExpLogTable +// +// A program to generate lookup tables for +// +// y = exp (x / 8) +// +// and +// x = 8 * log (x); +// +// where x and y are 16-bit floating-point numbers +// +// The tables are used by class B44Compressor. +// +//--------------------------------------------------------------------------- + +#include +#include +#include +#include + +using namespace std; + +//--------------------------------------------- +// Main - prints the half-to-float lookup table +//--------------------------------------------- + +int +main () +{ +#ifndef HAVE_IOS_BASE + cout.setf (ios::hex, ios::basefield); +#else + cout.setf (ios_base::hex, ios_base::basefield); +#endif + + cout << "//\n" + "// This is an automatically generated file.\n" + "// Do not edit.\n" + "//\n\n"; + + const int iMax = (1 << 16); + + cout << "const unsigned short expTable[] =\n" + "{\n" + " "; + + for (int i = 0; i < iMax; i++) + { + half h; + h.setBits (i); + + if (!h.isFinite()) + h = 0; + else if (h >= 8 * log (HALF_MAX)) + h = HALF_MAX; + else + h = exp (h / 8); + + cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; + + if (i % 8 == 7) + { + cout << "\n"; + + if (i < iMax - 1) + cout << " "; + } + } + + cout << "};\n\n"; + + cout << "const unsigned short logTable[] =\n" + "{\n" + " "; + + for (int i = 0; i < iMax; i++) + { + half h; + h.setBits (i); + + if (!h.isFinite() || h < 0) + h = 0; + else + h = 8 * log (h); + + cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; + + if (i % 8 == 7) + { + cout << "\n"; + + if (i < iMax - 1) + cout << " "; + } + } + + cout << "};\n"; + + return 0; +} diff --git a/IlmImf/b44ExpLogTable.h b/IlmImf/b44ExpLogTable.h new file mode 100644 index 0000000..c13d16c --- /dev/null +++ b/IlmImf/b44ExpLogTable.h @@ -0,0 +1,16396 @@ +// +// This is an automatically generated file. +// Do not edit. +// + +const unsigned short expTable[] = +{ + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c43, + 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, + 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c44, 0x3c44, + 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, + 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c45, 0x3c45, 0x3c45, + 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, + 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c46, 0x3c46, 0x3c46, 0x3c46, + 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, + 0x3c46, 0x3c46, 0x3c46, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, + 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, + 0x3c47, 0x3c47, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, + 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, + 0x3c48, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, + 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, + 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, + 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4b, + 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, + 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4c, 0x3c4c, + 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, + 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4d, 0x3c4d, 0x3c4d, + 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, + 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, + 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, + 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, + 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, + 0x3c4f, 0x3c4f, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, + 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, + 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, + 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c52, + 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, + 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c53, 0x3c53, + 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, + 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c54, 0x3c54, 0x3c54, + 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, + 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c55, 0x3c55, 0x3c55, 0x3c55, + 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, + 0x3c55, 0x3c55, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, + 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, + 0x3c56, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, + 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, + 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, + 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c59, + 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, + 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c5a, 0x3c5a, 0x3c5a, + 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, + 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, + 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, + 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, + 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, + 0x3c5c, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, + 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, + 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, + 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5f, + 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, + 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c60, 0x3c60, 0x3c60, + 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, + 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c61, 0x3c61, 0x3c61, 0x3c61, + 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, + 0x3c61, 0x3c61, 0x3c61, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, + 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, + 0x3c62, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, + 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, + 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, + 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c65, 0x3c65, + 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, + 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c66, 0x3c66, 0x3c66, + 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, + 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c67, 0x3c67, 0x3c67, 0x3c67, + 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, + 0x3c67, 0x3c67, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, + 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, + 0x3c68, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, + 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c6a, + 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, + 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6b, 0x3c6b, + 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, + 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, + 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, + 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, + 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, + 0x3c6d, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, + 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6f, + 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, + 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c70, 0x3c70, + 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, + 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c71, 0x3c71, 0x3c71, 0x3c71, + 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, + 0x3c71, 0x3c71, 0x3c71, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, + 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, + 0x3c72, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, + 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, + 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, + 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c75, 0x3c75, + 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, + 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c76, 0x3c76, 0x3c76, 0x3c76, + 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, + 0x3c76, 0x3c76, 0x3c76, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, + 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, + 0x3c77, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, + 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c79, + 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, + 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c7a, 0x3c7a, + 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, + 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, + 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, + 0x3c7b, 0x3c7b, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, + 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, + 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, + 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7e, + 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, + 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7f, 0x3c7f, 0x3c7f, + 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, + 0x3c7f, 0x3c7f, 0x3c7f, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, + 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, + 0x3c80, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, + 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, + 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, + 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c83, 0x3c83, + 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, + 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c84, 0x3c84, 0x3c84, 0x3c84, + 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, + 0x3c84, 0x3c84, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, + 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, + 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, + 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c87, 0x3c87, + 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, + 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c88, 0x3c88, 0x3c88, + 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, + 0x3c88, 0x3c88, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, + 0x3c89, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, + 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8c, + 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8d, 0x3c8d, + 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8e, 0x3c8e, 0x3c8e, + 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, + 0x3c8f, 0x3c8f, 0x3c8f, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c90, + 0x3c90, 0x3c90, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, + 0x3c91, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, + 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c94, + 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c95, 0x3c95, + 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c96, 0x3c96, 0x3c96, + 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c97, 0x3c97, 0x3c97, 0x3c97, + 0x3c97, 0x3c97, 0x3c97, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c98, + 0x3c98, 0x3c98, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, + 0x3c99, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, + 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9c, + 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9d, 0x3c9d, + 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9e, 0x3c9e, 0x3c9e, + 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, + 0x3c9f, 0x3c9f, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, + 0x3ca0, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, + 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca3, + 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca4, 0x3ca4, + 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca5, 0x3ca5, 0x3ca5, + 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, + 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, + 0x3ca7, 0x3ca7, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, + 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3caa, + 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3cab, 0x3cab, + 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cac, 0x3cac, 0x3cac, + 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cad, 0x3cad, 0x3cad, 0x3cad, + 0x3cad, 0x3cad, 0x3cad, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3cae, + 0x3cae, 0x3cae, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, + 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb1, + 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb2, 0x3cb2, + 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb3, 0x3cb3, 0x3cb3, + 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, + 0x3cb4, 0x3cb4, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, + 0x3cb5, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, + 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb8, + 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb9, 0x3cb9, + 0x3cb9, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cba, 0x3cba, 0x3cba, 0x3cba, + 0x3cba, 0x3cba, 0x3cba, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, + 0x3cbb, 0x3cbb, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, + 0x3cbc, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbe, + 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbf, 0x3cbf, + 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cc0, 0x3cc0, 0x3cc0, + 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc1, + 0x3cc1, 0x3cc1, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, + 0x3cc2, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, + 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc5, + 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc6, 0x3cc6, 0x3cc6, + 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, + 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, + 0x3cc8, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, + 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3ccb, + 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccc, 0x3ccc, 0x3ccc, + 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, + 0x3ccd, 0x3ccd, 0x3ccd, 0x3cce, 0x3cce, 0x3cce, 0x3cce, 0x3cce, + 0x3cce, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, + 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd1, + 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd2, 0x3cd2, 0x3cd2, + 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, + 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, + 0x3cd4, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, + 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd7, 0x3cd7, + 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd8, 0x3cd8, 0x3cd8, + 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cd9, + 0x3cd9, 0x3cd9, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, + 0x3cda, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdc, + 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdd, 0x3cdd, + 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cde, 0x3cde, 0x3cde, + 0x3cde, 0x3cde, 0x3cde, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, + 0x3cdf, 0x3cdf, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, + 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce2, + 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce3, 0x3ce3, 0x3ce3, + 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, + 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, + 0x3ce5, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, + 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce8, 0x3ce8, + 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce9, 0x3ce9, 0x3ce9, + 0x3ce9, 0x3ce9, 0x3ce9, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3cea, + 0x3cea, 0x3cea, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, + 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3ced, + 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3cee, 0x3cee, 0x3cee, + 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cef, 0x3cef, 0x3cef, 0x3cef, + 0x3cef, 0x3cef, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, + 0x3cf0, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf2, + 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf3, 0x3cf3, + 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, + 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, + 0x3cf5, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf7, + 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf8, 0x3cf8, + 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, + 0x3cf9, 0x3cf9, 0x3cf9, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, + 0x3cfa, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, + 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfd, 0x3cfd, + 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, + 0x3cfe, 0x3cfe, 0x3cfe, 0x3cff, 0x3cff, 0x3cff, 0x3cff, 0x3cff, + 0x3cff, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, + 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d02, 0x3d02, + 0x3d02, 0x3d02, 0x3d02, 0x3d02, 0x3d03, 0x3d03, 0x3d03, 0x3d03, + 0x3d03, 0x3d03, 0x3d03, 0x3d04, 0x3d04, 0x3d04, 0x3d04, 0x3d04, + 0x3d04, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, + 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d07, 0x3d07, + 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d08, 0x3d08, 0x3d08, 0x3d08, + 0x3d08, 0x3d08, 0x3d08, 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d09, + 0x3d09, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0b, + 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0c, 0x3d0c, + 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, + 0x3d0d, 0x3d0d, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, + 0x3d0e, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d10, + 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d11, 0x3d11, 0x3d11, + 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d12, 0x3d12, 0x3d12, 0x3d12, + 0x3d12, 0x3d12, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, + 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d15, + 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d16, 0x3d16, 0x3d16, + 0x3d16, 0x3d16, 0x3d16, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d17, + 0x3d17, 0x3d17, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, + 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d1a, 0x3d1a, + 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, + 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, + 0x3d1c, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1e, + 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1f, 0x3d1f, 0x3d1f, + 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d20, 0x3d20, 0x3d20, 0x3d20, + 0x3d20, 0x3d20, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, + 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d23, 0x3d23, + 0x3d23, 0x3d23, 0x3d23, 0x3d24, 0x3d24, 0x3d24, 0x3d25, 0x3d25, + 0x3d25, 0x3d26, 0x3d26, 0x3d26, 0x3d27, 0x3d27, 0x3d27, 0x3d28, + 0x3d28, 0x3d28, 0x3d29, 0x3d29, 0x3d29, 0x3d2a, 0x3d2a, 0x3d2a, + 0x3d2b, 0x3d2b, 0x3d2b, 0x3d2c, 0x3d2c, 0x3d2c, 0x3d2d, 0x3d2d, + 0x3d2d, 0x3d2d, 0x3d2e, 0x3d2e, 0x3d2e, 0x3d2f, 0x3d2f, 0x3d2f, + 0x3d30, 0x3d30, 0x3d30, 0x3d31, 0x3d31, 0x3d31, 0x3d32, 0x3d32, + 0x3d32, 0x3d33, 0x3d33, 0x3d33, 0x3d34, 0x3d34, 0x3d34, 0x3d35, + 0x3d35, 0x3d35, 0x3d36, 0x3d36, 0x3d36, 0x3d37, 0x3d37, 0x3d37, + 0x3d38, 0x3d38, 0x3d38, 0x3d39, 0x3d39, 0x3d39, 0x3d3a, 0x3d3a, + 0x3d3a, 0x3d3a, 0x3d3b, 0x3d3b, 0x3d3b, 0x3d3c, 0x3d3c, 0x3d3c, + 0x3d3d, 0x3d3d, 0x3d3d, 0x3d3e, 0x3d3e, 0x3d3e, 0x3d3f, 0x3d3f, + 0x3d3f, 0x3d40, 0x3d40, 0x3d40, 0x3d41, 0x3d41, 0x3d41, 0x3d42, + 0x3d42, 0x3d42, 0x3d43, 0x3d43, 0x3d43, 0x3d44, 0x3d44, 0x3d44, + 0x3d45, 0x3d45, 0x3d45, 0x3d46, 0x3d46, 0x3d46, 0x3d47, 0x3d47, + 0x3d47, 0x3d48, 0x3d48, 0x3d48, 0x3d49, 0x3d49, 0x3d49, 0x3d4a, + 0x3d4a, 0x3d4a, 0x3d4b, 0x3d4b, 0x3d4b, 0x3d4c, 0x3d4c, 0x3d4c, + 0x3d4d, 0x3d4d, 0x3d4d, 0x3d4e, 0x3d4e, 0x3d4e, 0x3d4f, 0x3d4f, + 0x3d4f, 0x3d50, 0x3d50, 0x3d50, 0x3d51, 0x3d51, 0x3d51, 0x3d52, + 0x3d52, 0x3d52, 0x3d53, 0x3d53, 0x3d53, 0x3d54, 0x3d54, 0x3d54, + 0x3d55, 0x3d55, 0x3d55, 0x3d56, 0x3d56, 0x3d56, 0x3d57, 0x3d57, + 0x3d57, 0x3d58, 0x3d58, 0x3d58, 0x3d59, 0x3d59, 0x3d59, 0x3d5a, + 0x3d5a, 0x3d5a, 0x3d5b, 0x3d5b, 0x3d5b, 0x3d5c, 0x3d5c, 0x3d5c, + 0x3d5d, 0x3d5d, 0x3d5d, 0x3d5e, 0x3d5e, 0x3d5e, 0x3d5f, 0x3d5f, + 0x3d5f, 0x3d60, 0x3d60, 0x3d60, 0x3d61, 0x3d61, 0x3d61, 0x3d62, + 0x3d62, 0x3d62, 0x3d63, 0x3d63, 0x3d63, 0x3d64, 0x3d64, 0x3d64, + 0x3d65, 0x3d65, 0x3d65, 0x3d66, 0x3d66, 0x3d66, 0x3d67, 0x3d67, + 0x3d67, 0x3d68, 0x3d68, 0x3d68, 0x3d69, 0x3d69, 0x3d69, 0x3d6a, + 0x3d6a, 0x3d6a, 0x3d6b, 0x3d6b, 0x3d6b, 0x3d6c, 0x3d6c, 0x3d6c, + 0x3d6d, 0x3d6d, 0x3d6d, 0x3d6e, 0x3d6e, 0x3d6e, 0x3d6f, 0x3d6f, + 0x3d6f, 0x3d70, 0x3d70, 0x3d70, 0x3d71, 0x3d71, 0x3d72, 0x3d72, + 0x3d72, 0x3d73, 0x3d73, 0x3d73, 0x3d74, 0x3d74, 0x3d74, 0x3d75, + 0x3d75, 0x3d75, 0x3d76, 0x3d76, 0x3d76, 0x3d77, 0x3d77, 0x3d77, + 0x3d78, 0x3d78, 0x3d78, 0x3d79, 0x3d79, 0x3d79, 0x3d7a, 0x3d7a, + 0x3d7a, 0x3d7b, 0x3d7b, 0x3d7b, 0x3d7c, 0x3d7c, 0x3d7c, 0x3d7d, + 0x3d7d, 0x3d7d, 0x3d7e, 0x3d7e, 0x3d7e, 0x3d7f, 0x3d7f, 0x3d80, + 0x3d80, 0x3d80, 0x3d81, 0x3d81, 0x3d81, 0x3d82, 0x3d82, 0x3d82, + 0x3d83, 0x3d83, 0x3d83, 0x3d84, 0x3d84, 0x3d84, 0x3d85, 0x3d85, + 0x3d85, 0x3d86, 0x3d86, 0x3d86, 0x3d87, 0x3d87, 0x3d87, 0x3d88, + 0x3d88, 0x3d88, 0x3d89, 0x3d89, 0x3d8a, 0x3d8a, 0x3d8a, 0x3d8b, + 0x3d8b, 0x3d8b, 0x3d8c, 0x3d8c, 0x3d8c, 0x3d8d, 0x3d8d, 0x3d8d, + 0x3d8e, 0x3d8e, 0x3d8e, 0x3d8f, 0x3d8f, 0x3d8f, 0x3d90, 0x3d90, + 0x3d90, 0x3d91, 0x3d91, 0x3d92, 0x3d92, 0x3d92, 0x3d93, 0x3d93, + 0x3d93, 0x3d94, 0x3d94, 0x3d94, 0x3d95, 0x3d95, 0x3d95, 0x3d96, + 0x3d96, 0x3d96, 0x3d97, 0x3d97, 0x3d97, 0x3d98, 0x3d98, 0x3d98, + 0x3d99, 0x3d99, 0x3d9a, 0x3d9a, 0x3d9a, 0x3d9b, 0x3d9b, 0x3d9b, + 0x3d9c, 0x3d9c, 0x3d9c, 0x3d9d, 0x3d9d, 0x3d9d, 0x3d9e, 0x3d9e, + 0x3d9e, 0x3d9f, 0x3d9f, 0x3d9f, 0x3da0, 0x3da0, 0x3da1, 0x3da1, + 0x3da1, 0x3da2, 0x3da2, 0x3da2, 0x3da3, 0x3da3, 0x3da3, 0x3da4, + 0x3da4, 0x3da4, 0x3da5, 0x3da5, 0x3da5, 0x3da6, 0x3da6, 0x3da7, + 0x3da7, 0x3da7, 0x3da8, 0x3da8, 0x3da8, 0x3da9, 0x3da9, 0x3da9, + 0x3daa, 0x3daa, 0x3daa, 0x3dab, 0x3dab, 0x3dab, 0x3dac, 0x3dac, + 0x3dad, 0x3dad, 0x3dad, 0x3dae, 0x3dae, 0x3dae, 0x3daf, 0x3daf, + 0x3daf, 0x3db0, 0x3db0, 0x3db0, 0x3db1, 0x3db1, 0x3db2, 0x3db2, + 0x3db2, 0x3db3, 0x3db3, 0x3db3, 0x3db4, 0x3db4, 0x3db4, 0x3db5, + 0x3db5, 0x3db5, 0x3db6, 0x3db6, 0x3db7, 0x3db7, 0x3db7, 0x3db8, + 0x3db8, 0x3db8, 0x3db9, 0x3db9, 0x3db9, 0x3dba, 0x3dba, 0x3dba, + 0x3dbb, 0x3dbb, 0x3dbc, 0x3dbc, 0x3dbc, 0x3dbd, 0x3dbd, 0x3dbd, + 0x3dbe, 0x3dbe, 0x3dbe, 0x3dbf, 0x3dbf, 0x3dbf, 0x3dc0, 0x3dc0, + 0x3dc1, 0x3dc1, 0x3dc1, 0x3dc2, 0x3dc2, 0x3dc2, 0x3dc3, 0x3dc3, + 0x3dc3, 0x3dc4, 0x3dc4, 0x3dc5, 0x3dc5, 0x3dc5, 0x3dc6, 0x3dc6, + 0x3dc6, 0x3dc7, 0x3dc7, 0x3dc7, 0x3dc8, 0x3dc8, 0x3dc8, 0x3dc9, + 0x3dc9, 0x3dca, 0x3dca, 0x3dca, 0x3dcb, 0x3dcb, 0x3dcb, 0x3dcc, + 0x3dcc, 0x3dcc, 0x3dcd, 0x3dcd, 0x3dce, 0x3dce, 0x3dce, 0x3dcf, + 0x3dcf, 0x3dcf, 0x3dd0, 0x3dd0, 0x3dd0, 0x3dd1, 0x3dd1, 0x3dd2, + 0x3dd2, 0x3dd2, 0x3dd3, 0x3dd3, 0x3dd3, 0x3dd4, 0x3dd4, 0x3dd4, + 0x3dd5, 0x3dd5, 0x3dd6, 0x3dd6, 0x3dd6, 0x3dd7, 0x3dd7, 0x3dd7, + 0x3dd8, 0x3dd8, 0x3dd8, 0x3dd9, 0x3dd9, 0x3dda, 0x3dda, 0x3dda, + 0x3ddb, 0x3ddb, 0x3ddb, 0x3ddc, 0x3ddc, 0x3ddc, 0x3ddd, 0x3ddd, + 0x3dde, 0x3dde, 0x3dde, 0x3ddf, 0x3ddf, 0x3ddf, 0x3de0, 0x3de0, + 0x3de1, 0x3de1, 0x3de1, 0x3de2, 0x3de2, 0x3de2, 0x3de3, 0x3de3, + 0x3de3, 0x3de4, 0x3de4, 0x3de5, 0x3de5, 0x3de5, 0x3de6, 0x3de6, + 0x3de6, 0x3de7, 0x3de7, 0x3de8, 0x3de8, 0x3de8, 0x3de9, 0x3de9, + 0x3de9, 0x3dea, 0x3dea, 0x3dea, 0x3deb, 0x3deb, 0x3dec, 0x3dec, + 0x3dec, 0x3ded, 0x3ded, 0x3ded, 0x3dee, 0x3dee, 0x3def, 0x3def, + 0x3def, 0x3df0, 0x3df0, 0x3df0, 0x3df1, 0x3df1, 0x3df2, 0x3df2, + 0x3df2, 0x3df3, 0x3df3, 0x3df3, 0x3df4, 0x3df4, 0x3df4, 0x3df5, + 0x3df5, 0x3df6, 0x3df6, 0x3df6, 0x3df7, 0x3df7, 0x3df7, 0x3df8, + 0x3df8, 0x3df9, 0x3df9, 0x3df9, 0x3dfa, 0x3dfa, 0x3dfa, 0x3dfb, + 0x3dfb, 0x3dfc, 0x3dfc, 0x3dfc, 0x3dfd, 0x3dfd, 0x3dfd, 0x3dfe, + 0x3dfe, 0x3dff, 0x3dff, 0x3dff, 0x3e00, 0x3e00, 0x3e00, 0x3e01, + 0x3e01, 0x3e02, 0x3e02, 0x3e02, 0x3e03, 0x3e03, 0x3e03, 0x3e04, + 0x3e04, 0x3e05, 0x3e05, 0x3e05, 0x3e06, 0x3e06, 0x3e06, 0x3e07, + 0x3e07, 0x3e08, 0x3e08, 0x3e08, 0x3e09, 0x3e09, 0x3e09, 0x3e0a, + 0x3e0a, 0x3e0b, 0x3e0b, 0x3e0b, 0x3e0c, 0x3e0c, 0x3e0d, 0x3e0d, + 0x3e0d, 0x3e0e, 0x3e0e, 0x3e0e, 0x3e0f, 0x3e0f, 0x3e10, 0x3e10, + 0x3e10, 0x3e11, 0x3e11, 0x3e11, 0x3e12, 0x3e12, 0x3e13, 0x3e13, + 0x3e13, 0x3e14, 0x3e14, 0x3e14, 0x3e15, 0x3e15, 0x3e16, 0x3e16, + 0x3e16, 0x3e17, 0x3e17, 0x3e18, 0x3e18, 0x3e18, 0x3e19, 0x3e19, + 0x3e19, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x3e1b, 0x3e1c, 0x3e1c, + 0x3e1c, 0x3e1d, 0x3e1d, 0x3e1e, 0x3e1e, 0x3e1e, 0x3e1f, 0x3e1f, + 0x3e20, 0x3e20, 0x3e20, 0x3e21, 0x3e21, 0x3e21, 0x3e22, 0x3e22, + 0x3e23, 0x3e23, 0x3e23, 0x3e24, 0x3e24, 0x3e25, 0x3e25, 0x3e25, + 0x3e26, 0x3e26, 0x3e26, 0x3e27, 0x3e27, 0x3e28, 0x3e28, 0x3e28, + 0x3e29, 0x3e29, 0x3e2a, 0x3e2a, 0x3e2a, 0x3e2b, 0x3e2b, 0x3e2b, + 0x3e2c, 0x3e2c, 0x3e2d, 0x3e2d, 0x3e2d, 0x3e2e, 0x3e2e, 0x3e2f, + 0x3e2f, 0x3e2f, 0x3e30, 0x3e30, 0x3e30, 0x3e31, 0x3e31, 0x3e32, + 0x3e32, 0x3e32, 0x3e33, 0x3e33, 0x3e34, 0x3e34, 0x3e34, 0x3e35, + 0x3e35, 0x3e35, 0x3e36, 0x3e36, 0x3e37, 0x3e37, 0x3e37, 0x3e38, + 0x3e38, 0x3e39, 0x3e39, 0x3e39, 0x3e3a, 0x3e3a, 0x3e3b, 0x3e3b, + 0x3e3b, 0x3e3c, 0x3e3c, 0x3e3c, 0x3e3d, 0x3e3d, 0x3e3e, 0x3e3e, + 0x3e3e, 0x3e3f, 0x3e3f, 0x3e40, 0x3e40, 0x3e40, 0x3e41, 0x3e41, + 0x3e42, 0x3e42, 0x3e42, 0x3e43, 0x3e43, 0x3e44, 0x3e44, 0x3e44, + 0x3e45, 0x3e45, 0x3e45, 0x3e46, 0x3e46, 0x3e47, 0x3e47, 0x3e47, + 0x3e48, 0x3e48, 0x3e49, 0x3e49, 0x3e49, 0x3e4a, 0x3e4a, 0x3e4b, + 0x3e4b, 0x3e4b, 0x3e4c, 0x3e4c, 0x3e4d, 0x3e4d, 0x3e4d, 0x3e4e, + 0x3e4e, 0x3e4f, 0x3e4f, 0x3e4f, 0x3e50, 0x3e50, 0x3e50, 0x3e51, + 0x3e51, 0x3e52, 0x3e52, 0x3e52, 0x3e53, 0x3e53, 0x3e54, 0x3e54, + 0x3e54, 0x3e55, 0x3e55, 0x3e56, 0x3e56, 0x3e56, 0x3e57, 0x3e57, + 0x3e58, 0x3e58, 0x3e58, 0x3e59, 0x3e59, 0x3e5a, 0x3e5a, 0x3e5a, + 0x3e5b, 0x3e5b, 0x3e5c, 0x3e5c, 0x3e5c, 0x3e5d, 0x3e5d, 0x3e5e, + 0x3e5e, 0x3e5e, 0x3e5f, 0x3e5f, 0x3e60, 0x3e60, 0x3e60, 0x3e61, + 0x3e61, 0x3e62, 0x3e62, 0x3e62, 0x3e63, 0x3e63, 0x3e64, 0x3e64, + 0x3e64, 0x3e65, 0x3e65, 0x3e66, 0x3e66, 0x3e66, 0x3e67, 0x3e67, + 0x3e68, 0x3e68, 0x3e68, 0x3e69, 0x3e69, 0x3e6a, 0x3e6a, 0x3e6a, + 0x3e6b, 0x3e6b, 0x3e6c, 0x3e6c, 0x3e6c, 0x3e6d, 0x3e6d, 0x3e6e, + 0x3e6e, 0x3e6e, 0x3e6f, 0x3e6f, 0x3e70, 0x3e70, 0x3e70, 0x3e71, + 0x3e71, 0x3e72, 0x3e72, 0x3e72, 0x3e73, 0x3e73, 0x3e74, 0x3e74, + 0x3e74, 0x3e75, 0x3e75, 0x3e76, 0x3e76, 0x3e76, 0x3e77, 0x3e77, + 0x3e78, 0x3e78, 0x3e78, 0x3e79, 0x3e79, 0x3e7a, 0x3e7a, 0x3e7a, + 0x3e7b, 0x3e7b, 0x3e7c, 0x3e7c, 0x3e7c, 0x3e7d, 0x3e7d, 0x3e7e, + 0x3e7e, 0x3e7f, 0x3e7f, 0x3e7f, 0x3e80, 0x3e80, 0x3e81, 0x3e81, + 0x3e81, 0x3e82, 0x3e82, 0x3e83, 0x3e83, 0x3e83, 0x3e84, 0x3e84, + 0x3e85, 0x3e85, 0x3e85, 0x3e86, 0x3e86, 0x3e87, 0x3e87, 0x3e87, + 0x3e88, 0x3e88, 0x3e89, 0x3e89, 0x3e8a, 0x3e8a, 0x3e8a, 0x3e8b, + 0x3e8b, 0x3e8c, 0x3e8c, 0x3e8c, 0x3e8d, 0x3e8d, 0x3e8e, 0x3e8e, + 0x3e8e, 0x3e8f, 0x3e8f, 0x3e90, 0x3e90, 0x3e90, 0x3e91, 0x3e91, + 0x3e92, 0x3e92, 0x3e93, 0x3e93, 0x3e93, 0x3e94, 0x3e94, 0x3e95, + 0x3e95, 0x3e95, 0x3e96, 0x3e96, 0x3e97, 0x3e97, 0x3e97, 0x3e98, + 0x3e98, 0x3e99, 0x3e9a, 0x3e9b, 0x3e9c, 0x3e9c, 0x3e9d, 0x3e9e, + 0x3e9f, 0x3ea0, 0x3ea1, 0x3ea1, 0x3ea2, 0x3ea3, 0x3ea4, 0x3ea5, + 0x3ea6, 0x3ea6, 0x3ea7, 0x3ea8, 0x3ea9, 0x3eaa, 0x3eab, 0x3eab, + 0x3eac, 0x3ead, 0x3eae, 0x3eaf, 0x3eb0, 0x3eb0, 0x3eb1, 0x3eb2, + 0x3eb3, 0x3eb4, 0x3eb5, 0x3eb5, 0x3eb6, 0x3eb7, 0x3eb8, 0x3eb9, + 0x3eba, 0x3eba, 0x3ebb, 0x3ebc, 0x3ebd, 0x3ebe, 0x3ebf, 0x3ebf, + 0x3ec0, 0x3ec1, 0x3ec2, 0x3ec3, 0x3ec4, 0x3ec5, 0x3ec5, 0x3ec6, + 0x3ec7, 0x3ec8, 0x3ec9, 0x3eca, 0x3eca, 0x3ecb, 0x3ecc, 0x3ecd, + 0x3ece, 0x3ecf, 0x3ed0, 0x3ed0, 0x3ed1, 0x3ed2, 0x3ed3, 0x3ed4, + 0x3ed5, 0x3ed6, 0x3ed6, 0x3ed7, 0x3ed8, 0x3ed9, 0x3eda, 0x3edb, + 0x3edc, 0x3edc, 0x3edd, 0x3ede, 0x3edf, 0x3ee0, 0x3ee1, 0x3ee2, + 0x3ee2, 0x3ee3, 0x3ee4, 0x3ee5, 0x3ee6, 0x3ee7, 0x3ee8, 0x3ee8, + 0x3ee9, 0x3eea, 0x3eeb, 0x3eec, 0x3eed, 0x3eee, 0x3eef, 0x3eef, + 0x3ef0, 0x3ef1, 0x3ef2, 0x3ef3, 0x3ef4, 0x3ef5, 0x3ef5, 0x3ef6, + 0x3ef7, 0x3ef8, 0x3ef9, 0x3efa, 0x3efb, 0x3efc, 0x3efc, 0x3efd, + 0x3efe, 0x3eff, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f03, 0x3f04, + 0x3f05, 0x3f06, 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0a, 0x3f0b, + 0x3f0c, 0x3f0d, 0x3f0e, 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f12, + 0x3f13, 0x3f14, 0x3f15, 0x3f16, 0x3f17, 0x3f18, 0x3f19, 0x3f19, + 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, 0x3f1f, 0x3f20, 0x3f21, + 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, + 0x3f29, 0x3f2a, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, + 0x3f30, 0x3f31, 0x3f32, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, + 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3c, 0x3f3d, + 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, + 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, + 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f50, 0x3f51, 0x3f52, 0x3f53, + 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, + 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, + 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f66, 0x3f67, 0x3f68, 0x3f69, + 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, + 0x3f72, 0x3f73, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, + 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, 0x3f80, + 0x3f81, 0x3f82, 0x3f82, 0x3f83, 0x3f84, 0x3f85, 0x3f86, 0x3f87, + 0x3f88, 0x3f89, 0x3f8a, 0x3f8b, 0x3f8c, 0x3f8d, 0x3f8e, 0x3f8f, + 0x3f90, 0x3f91, 0x3f92, 0x3f92, 0x3f93, 0x3f94, 0x3f95, 0x3f96, + 0x3f97, 0x3f98, 0x3f99, 0x3f9a, 0x3f9b, 0x3f9c, 0x3f9d, 0x3f9e, + 0x3f9f, 0x3fa0, 0x3fa1, 0x3fa2, 0x3fa3, 0x3fa4, 0x3fa5, 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, 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, 0x3ff0, 0x3ff1, 0x3ff2, 0x3ff3, + 0x3ff4, 0x3ff5, 0x3ff6, 0x3ff7, 0x3ff8, 0x3ff9, 0x3ffa, 0x3ffb, + 0x3ffc, 0x3ffd, 0x3ffe, 0x3fff, 0x4000, 0x4001, 0x4001, 0x4002, + 0x4002, 0x4003, 0x4003, 0x4004, 0x4004, 0x4005, 0x4005, 0x4006, + 0x4006, 0x4007, 0x4007, 0x4008, 0x4008, 0x4009, 0x4009, 0x400a, + 0x400a, 0x400b, 0x400b, 0x400c, 0x400c, 0x400d, 0x400d, 0x400e, + 0x400e, 0x400f, 0x400f, 0x4010, 0x4010, 0x4011, 0x4011, 0x4012, + 0x4012, 0x4013, 0x4013, 0x4014, 0x4014, 0x4015, 0x4015, 0x4016, + 0x4016, 0x4017, 0x4017, 0x4018, 0x4019, 0x4019, 0x401a, 0x401a, + 0x401b, 0x401b, 0x401c, 0x401c, 0x401d, 0x401d, 0x401e, 0x401e, + 0x401f, 0x401f, 0x4020, 0x4020, 0x4021, 0x4021, 0x4022, 0x4022, + 0x4023, 0x4023, 0x4024, 0x4024, 0x4025, 0x4025, 0x4026, 0x4026, + 0x4027, 0x4027, 0x4028, 0x4028, 0x4029, 0x402a, 0x402a, 0x402b, + 0x402b, 0x402c, 0x402c, 0x402d, 0x402d, 0x402e, 0x402e, 0x402f, + 0x402f, 0x4030, 0x4030, 0x4031, 0x4031, 0x4032, 0x4032, 0x4033, + 0x4033, 0x4034, 0x4035, 0x4035, 0x4036, 0x4036, 0x4037, 0x4037, + 0x4038, 0x4038, 0x4039, 0x4039, 0x403a, 0x403a, 0x403b, 0x403b, + 0x403c, 0x403c, 0x403d, 0x403d, 0x403e, 0x403f, 0x403f, 0x4040, + 0x4040, 0x4041, 0x4041, 0x4042, 0x4042, 0x4043, 0x4043, 0x4044, + 0x4044, 0x4045, 0x4045, 0x4046, 0x4047, 0x4047, 0x4048, 0x4048, + 0x4049, 0x4049, 0x404a, 0x404a, 0x404b, 0x404b, 0x404c, 0x404c, + 0x404d, 0x404e, 0x404e, 0x404f, 0x404f, 0x4050, 0x4050, 0x4051, + 0x4051, 0x4052, 0x4052, 0x4053, 0x4053, 0x4054, 0x4055, 0x4055, + 0x4056, 0x4056, 0x4057, 0x4057, 0x4058, 0x4058, 0x4059, 0x4059, + 0x405a, 0x405a, 0x405b, 0x405c, 0x405c, 0x405d, 0x405d, 0x405e, + 0x405e, 0x405f, 0x405f, 0x4060, 0x4060, 0x4061, 0x4062, 0x4062, + 0x4063, 0x4063, 0x4064, 0x4064, 0x4065, 0x4065, 0x4066, 0x4067, + 0x4067, 0x4068, 0x4068, 0x4069, 0x4069, 0x406a, 0x406a, 0x406b, + 0x406b, 0x406c, 0x406d, 0x406d, 0x406e, 0x406e, 0x406f, 0x406f, + 0x4070, 0x4070, 0x4071, 0x4072, 0x4072, 0x4073, 0x4073, 0x4074, + 0x4074, 0x4075, 0x4075, 0x4076, 0x4077, 0x4077, 0x4078, 0x4078, + 0x4079, 0x4079, 0x407a, 0x407b, 0x407b, 0x407c, 0x407c, 0x407d, + 0x407d, 0x407e, 0x407e, 0x407f, 0x4080, 0x4080, 0x4081, 0x4081, + 0x4082, 0x4082, 0x4083, 0x4084, 0x4084, 0x4085, 0x4085, 0x4086, + 0x4086, 0x4087, 0x4087, 0x4088, 0x4089, 0x4089, 0x408a, 0x408a, + 0x408b, 0x408b, 0x408c, 0x408d, 0x408d, 0x408e, 0x408e, 0x408f, + 0x408f, 0x4090, 0x4091, 0x4091, 0x4092, 0x4092, 0x4093, 0x4093, + 0x4094, 0x4095, 0x4095, 0x4096, 0x4096, 0x4097, 0x4097, 0x4098, + 0x4099, 0x4099, 0x409a, 0x409a, 0x409b, 0x409b, 0x409c, 0x409d, + 0x409d, 0x409e, 0x409e, 0x409f, 0x409f, 0x40a0, 0x40a1, 0x40a1, + 0x40a2, 0x40a2, 0x40a3, 0x40a4, 0x40a4, 0x40a5, 0x40a5, 0x40a6, + 0x40a6, 0x40a7, 0x40a8, 0x40a8, 0x40a9, 0x40a9, 0x40aa, 0x40ab, + 0x40ab, 0x40ac, 0x40ac, 0x40ad, 0x40ad, 0x40ae, 0x40af, 0x40af, + 0x40b0, 0x40b0, 0x40b1, 0x40b2, 0x40b2, 0x40b3, 0x40b3, 0x40b4, + 0x40b4, 0x40b5, 0x40b6, 0x40b6, 0x40b7, 0x40b7, 0x40b8, 0x40b9, + 0x40b9, 0x40ba, 0x40ba, 0x40bb, 0x40bc, 0x40bc, 0x40bd, 0x40bd, + 0x40be, 0x40bf, 0x40bf, 0x40c0, 0x40c0, 0x40c1, 0x40c1, 0x40c2, + 0x40c3, 0x40c3, 0x40c4, 0x40c4, 0x40c5, 0x40c6, 0x40c6, 0x40c7, + 0x40c7, 0x40c8, 0x40c9, 0x40c9, 0x40ca, 0x40ca, 0x40cb, 0x40cc, + 0x40cc, 0x40cd, 0x40cd, 0x40ce, 0x40cf, 0x40cf, 0x40d0, 0x40d0, + 0x40d1, 0x40d2, 0x40d2, 0x40d3, 0x40d3, 0x40d4, 0x40d5, 0x40d5, + 0x40d6, 0x40d6, 0x40d7, 0x40d8, 0x40d8, 0x40d9, 0x40d9, 0x40da, + 0x40db, 0x40db, 0x40dc, 0x40dd, 0x40dd, 0x40de, 0x40de, 0x40df, + 0x40e0, 0x40e0, 0x40e1, 0x40e1, 0x40e2, 0x40e3, 0x40e3, 0x40e4, + 0x40e4, 0x40e5, 0x40e6, 0x40e6, 0x40e7, 0x40e8, 0x40e8, 0x40e9, + 0x40e9, 0x40ea, 0x40eb, 0x40eb, 0x40ec, 0x40ec, 0x40ed, 0x40ee, + 0x40ee, 0x40ef, 0x40f0, 0x40f0, 0x40f1, 0x40f1, 0x40f2, 0x40f3, + 0x40f3, 0x40f4, 0x40f4, 0x40f5, 0x40f6, 0x40f6, 0x40f7, 0x40f8, + 0x40f8, 0x40f9, 0x40f9, 0x40fa, 0x40fb, 0x40fb, 0x40fc, 0x40fd, + 0x40fd, 0x40fe, 0x40fe, 0x40ff, 0x4100, 0x4100, 0x4101, 0x4102, + 0x4102, 0x4103, 0x4103, 0x4104, 0x4105, 0x4105, 0x4106, 0x4107, + 0x4107, 0x4108, 0x4108, 0x4109, 0x410a, 0x410a, 0x410b, 0x410c, + 0x410c, 0x410d, 0x410d, 0x410e, 0x410f, 0x410f, 0x4110, 0x4111, + 0x4111, 0x4112, 0x4113, 0x4113, 0x4114, 0x4114, 0x4115, 0x4116, + 0x4116, 0x4117, 0x4118, 0x4118, 0x4119, 0x411a, 0x411a, 0x411b, + 0x411b, 0x411c, 0x411d, 0x411d, 0x411e, 0x411f, 0x411f, 0x4120, + 0x4121, 0x4121, 0x4122, 0x4122, 0x4123, 0x4124, 0x4124, 0x4125, + 0x4126, 0x4126, 0x4127, 0x4128, 0x4128, 0x4129, 0x412a, 0x412a, + 0x412b, 0x412b, 0x412c, 0x412d, 0x412d, 0x412e, 0x412f, 0x412f, + 0x4130, 0x4131, 0x4131, 0x4132, 0x4133, 0x4133, 0x4134, 0x4135, + 0x4135, 0x4136, 0x4137, 0x4137, 0x4138, 0x4138, 0x4139, 0x413a, + 0x413a, 0x413b, 0x413c, 0x413c, 0x413d, 0x413e, 0x413e, 0x413f, + 0x4140, 0x4140, 0x4141, 0x4142, 0x4142, 0x4143, 0x4144, 0x4144, + 0x4145, 0x4146, 0x4146, 0x4147, 0x4148, 0x4148, 0x4149, 0x414a, + 0x414a, 0x414b, 0x414c, 0x414c, 0x414d, 0x414e, 0x414e, 0x414f, + 0x4150, 0x4150, 0x4151, 0x4152, 0x4152, 0x4153, 0x4154, 0x4154, + 0x4155, 0x4156, 0x4156, 0x4157, 0x4158, 0x4158, 0x4159, 0x415a, + 0x415a, 0x415b, 0x415c, 0x415c, 0x415d, 0x415e, 0x415e, 0x415f, + 0x4160, 0x4160, 0x4161, 0x4162, 0x4162, 0x4163, 0x4164, 0x4164, + 0x4165, 0x4166, 0x4166, 0x4167, 0x4168, 0x4168, 0x4169, 0x416a, + 0x416a, 0x416b, 0x416c, 0x416c, 0x416d, 0x416e, 0x416e, 0x416f, + 0x4170, 0x4171, 0x4172, 0x4174, 0x4175, 0x4177, 0x4178, 0x4179, + 0x417b, 0x417c, 0x417d, 0x417f, 0x4180, 0x4182, 0x4183, 0x4184, + 0x4186, 0x4187, 0x4188, 0x418a, 0x418b, 0x418d, 0x418e, 0x418f, + 0x4191, 0x4192, 0x4194, 0x4195, 0x4196, 0x4198, 0x4199, 0x419b, + 0x419c, 0x419d, 0x419f, 0x41a0, 0x41a2, 0x41a3, 0x41a4, 0x41a6, + 0x41a7, 0x41a9, 0x41aa, 0x41ab, 0x41ad, 0x41ae, 0x41b0, 0x41b1, + 0x41b3, 0x41b4, 0x41b5, 0x41b7, 0x41b8, 0x41ba, 0x41bb, 0x41bd, + 0x41be, 0x41bf, 0x41c1, 0x41c2, 0x41c4, 0x41c5, 0x41c7, 0x41c8, + 0x41ca, 0x41cb, 0x41cc, 0x41ce, 0x41cf, 0x41d1, 0x41d2, 0x41d4, + 0x41d5, 0x41d7, 0x41d8, 0x41da, 0x41db, 0x41dc, 0x41de, 0x41df, + 0x41e1, 0x41e2, 0x41e4, 0x41e5, 0x41e7, 0x41e8, 0x41ea, 0x41eb, + 0x41ed, 0x41ee, 0x41f0, 0x41f1, 0x41f3, 0x41f4, 0x41f6, 0x41f7, + 0x41f9, 0x41fa, 0x41fc, 0x41fd, 0x41ff, 0x4200, 0x4202, 0x4203, + 0x4205, 0x4206, 0x4208, 0x4209, 0x420b, 0x420c, 0x420e, 0x420f, + 0x4211, 0x4212, 0x4214, 0x4215, 0x4217, 0x4218, 0x421a, 0x421b, + 0x421d, 0x421e, 0x4220, 0x4221, 0x4223, 0x4224, 0x4226, 0x4228, + 0x4229, 0x422b, 0x422c, 0x422e, 0x422f, 0x4231, 0x4232, 0x4234, + 0x4235, 0x4237, 0x4239, 0x423a, 0x423c, 0x423d, 0x423f, 0x4240, + 0x4242, 0x4243, 0x4245, 0x4247, 0x4248, 0x424a, 0x424b, 0x424d, + 0x424e, 0x4250, 0x4252, 0x4253, 0x4255, 0x4256, 0x4258, 0x425a, + 0x425b, 0x425d, 0x425e, 0x4260, 0x4262, 0x4263, 0x4265, 0x4266, + 0x4268, 0x4269, 0x426b, 0x426d, 0x426e, 0x4270, 0x4272, 0x4273, + 0x4275, 0x4276, 0x4278, 0x427a, 0x427b, 0x427d, 0x427e, 0x4280, + 0x4282, 0x4283, 0x4285, 0x4287, 0x4288, 0x428a, 0x428c, 0x428d, + 0x428f, 0x4290, 0x4292, 0x4294, 0x4295, 0x4297, 0x4299, 0x429a, + 0x429c, 0x429e, 0x429f, 0x42a1, 0x42a3, 0x42a4, 0x42a6, 0x42a8, + 0x42a9, 0x42ab, 0x42ad, 0x42ae, 0x42b0, 0x42b2, 0x42b3, 0x42b5, + 0x42b7, 0x42b8, 0x42ba, 0x42bc, 0x42bd, 0x42bf, 0x42c1, 0x42c2, + 0x42c4, 0x42c6, 0x42c7, 0x42c9, 0x42cb, 0x42cd, 0x42ce, 0x42d0, + 0x42d2, 0x42d3, 0x42d5, 0x42d7, 0x42d8, 0x42da, 0x42dc, 0x42de, + 0x42df, 0x42e1, 0x42e3, 0x42e5, 0x42e6, 0x42e8, 0x42ea, 0x42eb, + 0x42ed, 0x42ef, 0x42f1, 0x42f2, 0x42f4, 0x42f6, 0x42f8, 0x42f9, + 0x42fb, 0x42fd, 0x42ff, 0x4300, 0x4302, 0x4304, 0x4306, 0x4307, + 0x4309, 0x430b, 0x430d, 0x430e, 0x4310, 0x4312, 0x4314, 0x4315, + 0x4317, 0x4319, 0x431b, 0x431d, 0x431e, 0x4320, 0x4322, 0x4324, + 0x4325, 0x4327, 0x4329, 0x432b, 0x432d, 0x432e, 0x4330, 0x4332, + 0x4334, 0x4336, 0x4337, 0x4339, 0x433b, 0x433d, 0x433f, 0x4340, + 0x4342, 0x4344, 0x4346, 0x4348, 0x434a, 0x434b, 0x434d, 0x434f, + 0x4351, 0x4353, 0x4354, 0x4356, 0x4358, 0x435a, 0x435c, 0x435e, + 0x4360, 0x4361, 0x4363, 0x4365, 0x4367, 0x4369, 0x436b, 0x436c, + 0x436e, 0x4370, 0x4372, 0x4374, 0x4376, 0x4378, 0x4379, 0x437b, + 0x437d, 0x437f, 0x4381, 0x4383, 0x4385, 0x4387, 0x4388, 0x438a, + 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396, 0x4398, 0x439a, + 0x439b, 0x439d, 0x439f, 0x43a1, 0x43a3, 0x43a5, 0x43a7, 0x43a9, + 0x43ab, 0x43ad, 0x43af, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, + 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4, 0x43c6, 0x43c8, + 0x43ca, 0x43cc, 0x43ce, 0x43cf, 0x43d1, 0x43d3, 0x43d5, 0x43d7, + 0x43d9, 0x43db, 0x43dd, 0x43df, 0x43e1, 0x43e3, 0x43e5, 0x43e7, + 0x43e9, 0x43eb, 0x43ed, 0x43ef, 0x43f1, 0x43f3, 0x43f5, 0x43f7, + 0x43f9, 0x43fb, 0x43fd, 0x43ff, 0x4400, 0x4401, 0x4402, 0x4403, + 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440a, 0x440b, + 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, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, + 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, + 0x443e, 0x443f, 0x4440, 0x4441, 0x4443, 0x4444, 0x4445, 0x4446, + 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, + 0x444f, 0x4450, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, + 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445f, 0x4460, + 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, + 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, + 0x4472, 0x4473, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, + 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, 0x4483, + 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, 0x448c, + 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, + 0x4497, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, 0x449f, + 0x44a0, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a6, 0x44a7, 0x44a8, + 0x44a9, 0x44aa, 0x44ab, 0x44ad, 0x44ae, 0x44af, 0x44b0, 0x44b1, + 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, 0x44b9, 0x44bb, + 0x44bc, 0x44bd, 0x44be, 0x44bf, 0x44c1, 0x44c2, 0x44c3, 0x44c4, + 0x44c5, 0x44c7, 0x44c8, 0x44c9, 0x44ca, 0x44cb, 0x44cc, 0x44ce, + 0x44cf, 0x44d0, 0x44d1, 0x44d2, 0x44d4, 0x44d5, 0x44d6, 0x44d7, + 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44df, 0x44e0, 0x44e1, + 0x44e2, 0x44e3, 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44ea, 0x44eb, + 0x44ec, 0x44ed, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f5, + 0x44f6, 0x44f7, 0x44f8, 0x44fa, 0x44fb, 0x44fc, 0x44fd, 0x44ff, + 0x4500, 0x4501, 0x4502, 0x4504, 0x4505, 0x4506, 0x4507, 0x4509, + 0x450a, 0x450b, 0x450c, 0x450e, 0x450f, 0x4510, 0x4512, 0x4513, + 0x4514, 0x4515, 0x4517, 0x4518, 0x4519, 0x451a, 0x451c, 0x451d, + 0x451e, 0x4520, 0x4521, 0x4522, 0x4523, 0x4525, 0x4526, 0x4527, + 0x4529, 0x452a, 0x452b, 0x452c, 0x452e, 0x452f, 0x4530, 0x4532, + 0x4533, 0x4534, 0x4536, 0x4537, 0x4538, 0x4539, 0x453b, 0x453c, + 0x453d, 0x453f, 0x4540, 0x4541, 0x4543, 0x4544, 0x4545, 0x4547, + 0x4548, 0x4549, 0x454b, 0x454c, 0x454d, 0x454e, 0x4550, 0x4551, + 0x4552, 0x4554, 0x4555, 0x4556, 0x4558, 0x4559, 0x455a, 0x455c, + 0x455d, 0x455e, 0x4560, 0x4561, 0x4563, 0x4564, 0x4565, 0x4567, + 0x4568, 0x4569, 0x456b, 0x456c, 0x456d, 0x456f, 0x4570, 0x4571, + 0x4573, 0x4574, 0x4576, 0x4577, 0x4578, 0x457a, 0x457b, 0x457c, + 0x457e, 0x457f, 0x4580, 0x4582, 0x4583, 0x4585, 0x4586, 0x4587, + 0x4589, 0x458a, 0x458c, 0x458d, 0x458e, 0x4590, 0x4591, 0x4592, + 0x4594, 0x4595, 0x4597, 0x4598, 0x4599, 0x459b, 0x459c, 0x459e, + 0x459f, 0x45a0, 0x45a2, 0x45a3, 0x45a5, 0x45a6, 0x45a8, 0x45a9, + 0x45aa, 0x45ac, 0x45ad, 0x45af, 0x45b0, 0x45b1, 0x45b3, 0x45b4, + 0x45b6, 0x45b7, 0x45b9, 0x45ba, 0x45bb, 0x45bd, 0x45be, 0x45c0, + 0x45c1, 0x45c3, 0x45c4, 0x45c6, 0x45c7, 0x45c8, 0x45ca, 0x45cb, + 0x45cd, 0x45ce, 0x45d0, 0x45d1, 0x45d3, 0x45d4, 0x45d5, 0x45d7, + 0x45d8, 0x45da, 0x45db, 0x45dd, 0x45de, 0x45e0, 0x45e1, 0x45e3, + 0x45e4, 0x45e6, 0x45e7, 0x45e9, 0x45ea, 0x45eb, 0x45ed, 0x45ee, + 0x45f0, 0x45f1, 0x45f3, 0x45f4, 0x45f6, 0x45f7, 0x45f9, 0x45fa, + 0x45fc, 0x45fd, 0x45ff, 0x4600, 0x4602, 0x4603, 0x4605, 0x4606, + 0x4608, 0x4609, 0x460b, 0x460c, 0x460e, 0x460f, 0x4611, 0x4612, + 0x4614, 0x4616, 0x4617, 0x4619, 0x461a, 0x461c, 0x461d, 0x461f, + 0x4620, 0x4622, 0x4623, 0x4625, 0x4626, 0x4628, 0x4629, 0x462b, + 0x462c, 0x462e, 0x4630, 0x4631, 0x4633, 0x4634, 0x4636, 0x4637, + 0x4639, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, 0x4642, 0x4644, + 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464d, 0x464f, 0x4650, + 0x4652, 0x4654, 0x4655, 0x4657, 0x4658, 0x465a, 0x465b, 0x465d, + 0x465f, 0x4660, 0x4662, 0x4663, 0x4665, 0x4667, 0x4668, 0x466a, + 0x466b, 0x466d, 0x466f, 0x4670, 0x4672, 0x4673, 0x4675, 0x4677, + 0x4678, 0x467a, 0x467c, 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, + 0x4685, 0x4687, 0x4689, 0x468a, 0x468c, 0x468e, 0x468f, 0x4691, + 0x4692, 0x4694, 0x4696, 0x4697, 0x4699, 0x469b, 0x469c, 0x469e, + 0x46a0, 0x46a1, 0x46a3, 0x46a5, 0x46a6, 0x46a8, 0x46aa, 0x46ab, + 0x46ad, 0x46af, 0x46b0, 0x46b2, 0x46b4, 0x46b5, 0x46b7, 0x46b9, + 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, 0x46c3, 0x46c4, 0x46c6, + 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, 0x46d0, 0x46d2, 0x46d4, + 0x46d5, 0x46d7, 0x46d9, 0x46db, 0x46dc, 0x46de, 0x46e0, 0x46e1, + 0x46e3, 0x46e5, 0x46e7, 0x46e8, 0x46ea, 0x46ec, 0x46ee, 0x46ef, + 0x46f1, 0x46f3, 0x46f4, 0x46f6, 0x46f8, 0x46fa, 0x46fb, 0x46fd, + 0x46ff, 0x4701, 0x4702, 0x4704, 0x4706, 0x4708, 0x4709, 0x470b, + 0x470d, 0x470f, 0x4711, 0x4712, 0x4714, 0x4716, 0x4718, 0x4719, + 0x471b, 0x471d, 0x471f, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, + 0x4729, 0x472b, 0x472d, 0x472f, 0x4731, 0x4732, 0x4734, 0x4736, + 0x4738, 0x473a, 0x473b, 0x473d, 0x473f, 0x4741, 0x4743, 0x4744, + 0x4746, 0x4748, 0x474a, 0x474c, 0x474e, 0x474f, 0x4751, 0x4753, + 0x4755, 0x4757, 0x4759, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, + 0x4764, 0x4767, 0x476b, 0x476f, 0x4772, 0x4776, 0x477a, 0x477e, + 0x4781, 0x4785, 0x4789, 0x478d, 0x4790, 0x4794, 0x4798, 0x479c, + 0x47a0, 0x47a3, 0x47a7, 0x47ab, 0x47af, 0x47b3, 0x47b7, 0x47bb, + 0x47be, 0x47c2, 0x47c6, 0x47ca, 0x47ce, 0x47d2, 0x47d6, 0x47da, + 0x47de, 0x47e2, 0x47e5, 0x47e9, 0x47ed, 0x47f1, 0x47f5, 0x47f9, + 0x47fd, 0x4801, 0x4803, 0x4805, 0x4807, 0x4809, 0x480b, 0x480d, + 0x480f, 0x4811, 0x4813, 0x4815, 0x4817, 0x4819, 0x481b, 0x481d, + 0x481f, 0x4821, 0x4823, 0x4825, 0x4827, 0x4829, 0x482c, 0x482e, + 0x4830, 0x4832, 0x4834, 0x4836, 0x4838, 0x483a, 0x483c, 0x483e, + 0x4841, 0x4843, 0x4845, 0x4847, 0x4849, 0x484b, 0x484d, 0x4850, + 0x4852, 0x4854, 0x4856, 0x4858, 0x485a, 0x485d, 0x485f, 0x4861, + 0x4863, 0x4865, 0x4868, 0x486a, 0x486c, 0x486e, 0x4870, 0x4873, + 0x4875, 0x4877, 0x4879, 0x487c, 0x487e, 0x4880, 0x4882, 0x4885, + 0x4887, 0x4889, 0x488b, 0x488e, 0x4890, 0x4892, 0x4894, 0x4897, + 0x4899, 0x489b, 0x489e, 0x48a0, 0x48a2, 0x48a5, 0x48a7, 0x48a9, + 0x48ac, 0x48ae, 0x48b0, 0x48b3, 0x48b5, 0x48b7, 0x48ba, 0x48bc, + 0x48be, 0x48c1, 0x48c3, 0x48c6, 0x48c8, 0x48ca, 0x48cd, 0x48cf, + 0x48d2, 0x48d4, 0x48d6, 0x48d9, 0x48db, 0x48de, 0x48e0, 0x48e3, + 0x48e5, 0x48e7, 0x48ea, 0x48ec, 0x48ef, 0x48f1, 0x48f4, 0x48f6, + 0x48f9, 0x48fb, 0x48fe, 0x4900, 0x4903, 0x4905, 0x4908, 0x490a, + 0x490d, 0x490f, 0x4912, 0x4914, 0x4917, 0x4919, 0x491c, 0x491f, + 0x4921, 0x4924, 0x4926, 0x4929, 0x492b, 0x492e, 0x4931, 0x4933, + 0x4936, 0x4938, 0x493b, 0x493e, 0x4940, 0x4943, 0x4946, 0x4948, + 0x494b, 0x494d, 0x4950, 0x4953, 0x4955, 0x4958, 0x495b, 0x495d, + 0x4960, 0x4963, 0x4966, 0x4968, 0x496b, 0x496e, 0x4970, 0x4973, + 0x4976, 0x4979, 0x497b, 0x497e, 0x4981, 0x4984, 0x4986, 0x4989, + 0x498c, 0x498f, 0x4991, 0x4994, 0x4997, 0x499a, 0x499d, 0x499f, + 0x49a2, 0x49a5, 0x49a8, 0x49ab, 0x49ad, 0x49b0, 0x49b3, 0x49b6, + 0x49b9, 0x49bc, 0x49bf, 0x49c1, 0x49c4, 0x49c7, 0x49ca, 0x49cd, + 0x49d0, 0x49d3, 0x49d6, 0x49d9, 0x49dc, 0x49df, 0x49e1, 0x49e4, + 0x49e7, 0x49ea, 0x49ed, 0x49f0, 0x49f3, 0x49f6, 0x49f9, 0x49fc, + 0x49ff, 0x4a02, 0x4a05, 0x4a08, 0x4a0b, 0x4a0e, 0x4a11, 0x4a14, + 0x4a17, 0x4a1a, 0x4a1d, 0x4a21, 0x4a24, 0x4a27, 0x4a2a, 0x4a2d, + 0x4a30, 0x4a33, 0x4a36, 0x4a39, 0x4a3c, 0x4a3f, 0x4a43, 0x4a46, + 0x4a49, 0x4a4c, 0x4a4f, 0x4a52, 0x4a55, 0x4a59, 0x4a5c, 0x4a5f, + 0x4a62, 0x4a65, 0x4a69, 0x4a6c, 0x4a6f, 0x4a72, 0x4a75, 0x4a79, + 0x4a7c, 0x4a7f, 0x4a82, 0x4a86, 0x4a89, 0x4a8c, 0x4a8f, 0x4a93, + 0x4a96, 0x4a99, 0x4a9d, 0x4aa0, 0x4aa3, 0x4aa7, 0x4aaa, 0x4aad, + 0x4ab1, 0x4ab4, 0x4ab7, 0x4abb, 0x4abe, 0x4ac1, 0x4ac5, 0x4ac8, + 0x4acc, 0x4acf, 0x4ad2, 0x4ad6, 0x4ad9, 0x4add, 0x4ae0, 0x4ae4, + 0x4ae7, 0x4aea, 0x4aee, 0x4af1, 0x4af5, 0x4af8, 0x4afc, 0x4aff, + 0x4b03, 0x4b06, 0x4b0a, 0x4b0d, 0x4b11, 0x4b14, 0x4b18, 0x4b1c, + 0x4b1f, 0x4b23, 0x4b26, 0x4b2a, 0x4b2d, 0x4b31, 0x4b35, 0x4b38, + 0x4b3c, 0x4b3f, 0x4b43, 0x4b47, 0x4b4a, 0x4b4e, 0x4b52, 0x4b55, + 0x4b59, 0x4b5d, 0x4b60, 0x4b64, 0x4b68, 0x4b6b, 0x4b6f, 0x4b73, + 0x4b77, 0x4b7a, 0x4b7e, 0x4b82, 0x4b86, 0x4b89, 0x4b8d, 0x4b91, + 0x4b95, 0x4b98, 0x4b9c, 0x4ba0, 0x4ba4, 0x4ba8, 0x4bac, 0x4baf, + 0x4bb3, 0x4bb7, 0x4bbb, 0x4bbf, 0x4bc3, 0x4bc7, 0x4bca, 0x4bce, + 0x4bd2, 0x4bd6, 0x4bda, 0x4bde, 0x4be2, 0x4be6, 0x4bea, 0x4bee, + 0x4bf2, 0x4bf6, 0x4bfa, 0x4bfe, 0x4c01, 0x4c03, 0x4c05, 0x4c07, + 0x4c09, 0x4c0b, 0x4c0d, 0x4c0f, 0x4c11, 0x4c13, 0x4c15, 0x4c17, + 0x4c19, 0x4c1b, 0x4c1d, 0x4c1f, 0x4c21, 0x4c23, 0x4c26, 0x4c28, + 0x4c2a, 0x4c2c, 0x4c2e, 0x4c30, 0x4c32, 0x4c34, 0x4c36, 0x4c38, + 0x4c3a, 0x4c3d, 0x4c3f, 0x4c41, 0x4c43, 0x4c45, 0x4c47, 0x4c49, + 0x4c4c, 0x4c4e, 0x4c50, 0x4c52, 0x4c54, 0x4c56, 0x4c58, 0x4c5b, + 0x4c5d, 0x4c5f, 0x4c61, 0x4c63, 0x4c66, 0x4c68, 0x4c6a, 0x4c6c, + 0x4c6e, 0x4c71, 0x4c73, 0x4c75, 0x4c77, 0x4c7a, 0x4c7c, 0x4c7e, + 0x4c80, 0x4c83, 0x4c85, 0x4c87, 0x4c89, 0x4c8c, 0x4c8e, 0x4c90, + 0x4c92, 0x4c95, 0x4c97, 0x4c99, 0x4c9c, 0x4c9e, 0x4ca0, 0x4ca3, + 0x4ca5, 0x4ca7, 0x4caa, 0x4cac, 0x4cae, 0x4cb1, 0x4cb3, 0x4cb5, + 0x4cb8, 0x4cba, 0x4cbc, 0x4cbf, 0x4cc1, 0x4cc3, 0x4cc6, 0x4cc8, + 0x4ccb, 0x4ccd, 0x4ccf, 0x4cd2, 0x4cd4, 0x4cd7, 0x4cd9, 0x4cdb, + 0x4cde, 0x4ce0, 0x4ce3, 0x4ce5, 0x4ce8, 0x4cea, 0x4ced, 0x4cef, + 0x4cf2, 0x4cf4, 0x4cf6, 0x4cf9, 0x4cfb, 0x4cfe, 0x4d00, 0x4d03, + 0x4d05, 0x4d08, 0x4d0b, 0x4d0d, 0x4d10, 0x4d12, 0x4d15, 0x4d17, + 0x4d1a, 0x4d1c, 0x4d1f, 0x4d21, 0x4d24, 0x4d27, 0x4d29, 0x4d2c, + 0x4d2e, 0x4d31, 0x4d33, 0x4d36, 0x4d39, 0x4d3b, 0x4d3e, 0x4d41, + 0x4d43, 0x4d46, 0x4d48, 0x4d4b, 0x4d4e, 0x4d50, 0x4d53, 0x4d56, + 0x4d58, 0x4d5b, 0x4d5e, 0x4d60, 0x4d63, 0x4d66, 0x4d69, 0x4d6b, + 0x4d6e, 0x4d71, 0x4d73, 0x4d76, 0x4d79, 0x4d7c, 0x4d7e, 0x4d81, + 0x4d84, 0x4d87, 0x4d89, 0x4d8c, 0x4d8f, 0x4d92, 0x4d94, 0x4d97, + 0x4d9a, 0x4d9d, 0x4da0, 0x4da2, 0x4da5, 0x4da8, 0x4dab, 0x4dae, + 0x4db1, 0x4db3, 0x4db6, 0x4db9, 0x4dbc, 0x4dbf, 0x4dc2, 0x4dc5, + 0x4dc8, 0x4dca, 0x4dcd, 0x4dd0, 0x4dd3, 0x4dd6, 0x4dd9, 0x4ddc, + 0x4ddf, 0x4de2, 0x4de5, 0x4de8, 0x4deb, 0x4dee, 0x4df1, 0x4df4, + 0x4df7, 0x4dfa, 0x4dfd, 0x4e00, 0x4e03, 0x4e06, 0x4e09, 0x4e0c, + 0x4e0f, 0x4e12, 0x4e15, 0x4e18, 0x4e1b, 0x4e1e, 0x4e21, 0x4e24, + 0x4e27, 0x4e2a, 0x4e2d, 0x4e30, 0x4e33, 0x4e36, 0x4e3a, 0x4e3d, + 0x4e40, 0x4e43, 0x4e46, 0x4e49, 0x4e4c, 0x4e4f, 0x4e53, 0x4e56, + 0x4e59, 0x4e5c, 0x4e5f, 0x4e63, 0x4e66, 0x4e69, 0x4e6c, 0x4e6f, + 0x4e73, 0x4e76, 0x4e79, 0x4e7c, 0x4e80, 0x4e83, 0x4e86, 0x4e89, + 0x4e8d, 0x4e90, 0x4e93, 0x4e96, 0x4e9a, 0x4e9d, 0x4ea0, 0x4ea4, + 0x4ea7, 0x4eaa, 0x4eae, 0x4eb1, 0x4eb4, 0x4eb8, 0x4ebb, 0x4ebe, + 0x4ec2, 0x4ec5, 0x4ec9, 0x4ecc, 0x4ecf, 0x4ed3, 0x4ed6, 0x4eda, + 0x4edd, 0x4ee0, 0x4ee4, 0x4ee7, 0x4eeb, 0x4eee, 0x4ef2, 0x4ef5, + 0x4ef9, 0x4efc, 0x4f00, 0x4f03, 0x4f07, 0x4f0a, 0x4f0e, 0x4f11, + 0x4f15, 0x4f18, 0x4f1c, 0x4f1f, 0x4f23, 0x4f27, 0x4f2a, 0x4f2e, + 0x4f31, 0x4f35, 0x4f39, 0x4f3c, 0x4f40, 0x4f43, 0x4f47, 0x4f4b, + 0x4f4e, 0x4f52, 0x4f56, 0x4f59, 0x4f5d, 0x4f61, 0x4f64, 0x4f68, + 0x4f6c, 0x4f70, 0x4f73, 0x4f77, 0x4f7b, 0x4f7e, 0x4f82, 0x4f86, + 0x4f8a, 0x4f8d, 0x4f91, 0x4f95, 0x4f99, 0x4f9d, 0x4fa0, 0x4fa4, + 0x4fa8, 0x4fac, 0x4fb0, 0x4fb4, 0x4fb7, 0x4fbb, 0x4fbf, 0x4fc3, + 0x4fc7, 0x4fcb, 0x4fcf, 0x4fd3, 0x4fd7, 0x4fdb, 0x4fde, 0x4fe2, + 0x4fe6, 0x4fea, 0x4fee, 0x4ff2, 0x4ff6, 0x4ffa, 0x4ffe, 0x5001, + 0x5003, 0x5005, 0x5007, 0x5009, 0x500b, 0x500d, 0x500f, 0x5011, + 0x5013, 0x5015, 0x5017, 0x5019, 0x501b, 0x501e, 0x5020, 0x5022, + 0x5024, 0x5026, 0x5028, 0x502a, 0x502c, 0x502e, 0x5030, 0x5032, + 0x5034, 0x5036, 0x5039, 0x503b, 0x503d, 0x503f, 0x5041, 0x5043, + 0x5045, 0x5047, 0x504a, 0x504c, 0x504e, 0x5050, 0x5052, 0x5054, + 0x5057, 0x5059, 0x505b, 0x505d, 0x505f, 0x5061, 0x5064, 0x5066, + 0x5068, 0x506a, 0x506c, 0x506f, 0x5071, 0x5073, 0x5075, 0x5078, + 0x507a, 0x507c, 0x507e, 0x5081, 0x5083, 0x5085, 0x5087, 0x508a, + 0x508c, 0x508e, 0x5090, 0x5093, 0x5095, 0x5097, 0x509a, 0x509c, + 0x509e, 0x50a0, 0x50a3, 0x50a5, 0x50a7, 0x50aa, 0x50ac, 0x50ae, + 0x50b1, 0x50b3, 0x50b5, 0x50b8, 0x50ba, 0x50bd, 0x50bf, 0x50c1, + 0x50c4, 0x50c6, 0x50c8, 0x50cb, 0x50cd, 0x50d0, 0x50d2, 0x50d4, + 0x50d7, 0x50d9, 0x50dc, 0x50de, 0x50e1, 0x50e3, 0x50e6, 0x50e8, + 0x50ea, 0x50ed, 0x50ef, 0x50f2, 0x50f4, 0x50f7, 0x50f9, 0x50fc, + 0x50fe, 0x5101, 0x5103, 0x5106, 0x5108, 0x510b, 0x510d, 0x5110, + 0x5112, 0x5115, 0x5117, 0x511a, 0x511d, 0x511f, 0x5122, 0x5124, + 0x5127, 0x5129, 0x512c, 0x512f, 0x5131, 0x5134, 0x5136, 0x5139, + 0x513c, 0x513e, 0x5141, 0x5143, 0x5146, 0x5149, 0x514b, 0x514e, + 0x5151, 0x5153, 0x5156, 0x5159, 0x515b, 0x515e, 0x5161, 0x5163, + 0x5166, 0x5169, 0x516c, 0x516e, 0x5171, 0x5174, 0x5176, 0x5179, + 0x517c, 0x517f, 0x5181, 0x5184, 0x5187, 0x518a, 0x518c, 0x518f, + 0x5192, 0x5195, 0x5198, 0x519a, 0x519d, 0x51a0, 0x51a3, 0x51a6, + 0x51a8, 0x51ab, 0x51ae, 0x51b1, 0x51b4, 0x51b7, 0x51ba, 0x51bc, + 0x51bf, 0x51c2, 0x51c5, 0x51c8, 0x51cb, 0x51ce, 0x51d1, 0x51d3, + 0x51d6, 0x51d9, 0x51dc, 0x51df, 0x51e2, 0x51e5, 0x51e8, 0x51eb, + 0x51ee, 0x51f1, 0x51f4, 0x51f7, 0x51fa, 0x51fd, 0x5200, 0x5203, + 0x5206, 0x5209, 0x520c, 0x520f, 0x5212, 0x5215, 0x5218, 0x521b, + 0x521e, 0x5221, 0x5224, 0x5227, 0x522a, 0x522d, 0x5231, 0x5234, + 0x5237, 0x523a, 0x523d, 0x5240, 0x5243, 0x5246, 0x524a, 0x524d, + 0x5250, 0x5253, 0x5256, 0x5259, 0x525d, 0x5260, 0x5263, 0x5266, + 0x5269, 0x526c, 0x5270, 0x5273, 0x5276, 0x5279, 0x527d, 0x5280, + 0x5283, 0x5286, 0x528a, 0x528d, 0x5290, 0x5293, 0x5297, 0x529a, + 0x529d, 0x52a1, 0x52a4, 0x52a7, 0x52ab, 0x52ae, 0x52b1, 0x52b5, + 0x52b8, 0x52bb, 0x52bf, 0x52c2, 0x52c6, 0x52c9, 0x52cc, 0x52d0, + 0x52d3, 0x52da, 0x52e1, 0x52e8, 0x52ef, 0x52f6, 0x52fd, 0x5304, + 0x530b, 0x5312, 0x5319, 0x5320, 0x5327, 0x532e, 0x5335, 0x533d, + 0x5344, 0x534b, 0x5352, 0x535a, 0x5361, 0x5369, 0x5370, 0x5377, + 0x537f, 0x5386, 0x538e, 0x5395, 0x539d, 0x53a5, 0x53ac, 0x53b4, + 0x53bc, 0x53c4, 0x53cb, 0x53d3, 0x53db, 0x53e3, 0x53eb, 0x53f3, + 0x53fb, 0x5401, 0x5405, 0x5409, 0x540d, 0x5411, 0x5416, 0x541a, + 0x541e, 0x5422, 0x5426, 0x542a, 0x542e, 0x5433, 0x5437, 0x543b, + 0x543f, 0x5443, 0x5448, 0x544c, 0x5450, 0x5455, 0x5459, 0x545d, + 0x5462, 0x5466, 0x546a, 0x546f, 0x5473, 0x5478, 0x547c, 0x5481, + 0x5485, 0x548a, 0x548e, 0x5493, 0x5498, 0x549c, 0x54a1, 0x54a5, + 0x54aa, 0x54af, 0x54b3, 0x54b8, 0x54bd, 0x54c2, 0x54c6, 0x54cb, + 0x54d0, 0x54d5, 0x54da, 0x54de, 0x54e3, 0x54e8, 0x54ed, 0x54f2, + 0x54f7, 0x54fc, 0x5501, 0x5506, 0x550b, 0x5510, 0x5515, 0x551a, + 0x551f, 0x5525, 0x552a, 0x552f, 0x5534, 0x5539, 0x553e, 0x5544, + 0x5549, 0x554e, 0x5554, 0x5559, 0x555e, 0x5564, 0x5569, 0x556f, + 0x5574, 0x5579, 0x557f, 0x5584, 0x558a, 0x558f, 0x5595, 0x559b, + 0x55a0, 0x55a6, 0x55ac, 0x55b1, 0x55b7, 0x55bd, 0x55c2, 0x55c8, + 0x55ce, 0x55d4, 0x55da, 0x55e0, 0x55e5, 0x55eb, 0x55f1, 0x55f7, + 0x55fd, 0x5603, 0x5609, 0x560f, 0x5615, 0x561b, 0x5622, 0x5628, + 0x562e, 0x5634, 0x563a, 0x5640, 0x5647, 0x564d, 0x5653, 0x565a, + 0x5660, 0x5666, 0x566d, 0x5673, 0x567a, 0x5680, 0x5687, 0x568d, + 0x5694, 0x569a, 0x56a1, 0x56a8, 0x56ae, 0x56b5, 0x56bc, 0x56c3, + 0x56c9, 0x56d0, 0x56d7, 0x56de, 0x56e5, 0x56ec, 0x56f3, 0x56f9, + 0x5700, 0x5707, 0x570f, 0x5716, 0x571d, 0x5724, 0x572b, 0x5732, + 0x5739, 0x5741, 0x5748, 0x574f, 0x5756, 0x575e, 0x5765, 0x576d, + 0x5774, 0x577c, 0x5783, 0x578b, 0x5792, 0x579a, 0x57a1, 0x57a9, + 0x57b1, 0x57b8, 0x57c0, 0x57c8, 0x57d0, 0x57d7, 0x57df, 0x57e7, + 0x57ef, 0x57f7, 0x57ff, 0x5804, 0x5808, 0x580c, 0x5810, 0x5814, + 0x5818, 0x581c, 0x5820, 0x5824, 0x5828, 0x582c, 0x5831, 0x5835, + 0x5839, 0x583d, 0x5842, 0x5846, 0x584a, 0x584e, 0x5853, 0x5857, + 0x585b, 0x5860, 0x5864, 0x5869, 0x586d, 0x5871, 0x5876, 0x587a, + 0x587f, 0x5883, 0x5888, 0x588c, 0x5891, 0x5895, 0x589a, 0x589f, + 0x58a3, 0x58a8, 0x58ad, 0x58b1, 0x58b6, 0x58bb, 0x58bf, 0x58c4, + 0x58c9, 0x58ce, 0x58d3, 0x58d7, 0x58dc, 0x58e1, 0x58e6, 0x58eb, + 0x58f0, 0x58f5, 0x58fa, 0x58ff, 0x5904, 0x5909, 0x590e, 0x5913, + 0x5918, 0x591d, 0x5922, 0x5927, 0x592d, 0x5932, 0x5937, 0x593c, + 0x5941, 0x5947, 0x594c, 0x5951, 0x5957, 0x595c, 0x5961, 0x5967, + 0x596c, 0x5972, 0x5977, 0x597c, 0x5982, 0x5987, 0x598d, 0x5993, + 0x5998, 0x599e, 0x59a3, 0x59a9, 0x59af, 0x59b4, 0x59ba, 0x59c0, + 0x59c6, 0x59cb, 0x59d1, 0x59d7, 0x59dd, 0x59e3, 0x59e9, 0x59ef, + 0x59f5, 0x59fa, 0x5a00, 0x5a07, 0x5a0d, 0x5a13, 0x5a19, 0x5a1f, + 0x5a25, 0x5a2b, 0x5a31, 0x5a37, 0x5a3e, 0x5a44, 0x5a4a, 0x5a51, + 0x5a57, 0x5a5d, 0x5a64, 0x5a6a, 0x5a70, 0x5a77, 0x5a7d, 0x5a84, + 0x5a8a, 0x5a91, 0x5a98, 0x5a9e, 0x5aa5, 0x5aab, 0x5ab2, 0x5ab9, + 0x5ac0, 0x5ac6, 0x5acd, 0x5ad4, 0x5adb, 0x5ae2, 0x5ae8, 0x5aef, + 0x5af6, 0x5afd, 0x5b04, 0x5b0b, 0x5b12, 0x5b1a, 0x5b21, 0x5b28, + 0x5b2f, 0x5b36, 0x5b3d, 0x5b45, 0x5b4c, 0x5b53, 0x5b5b, 0x5b62, + 0x5b69, 0x5b71, 0x5b78, 0x5b80, 0x5b87, 0x5b8f, 0x5b96, 0x5b9e, + 0x5ba6, 0x5bad, 0x5bb5, 0x5bbd, 0x5bc4, 0x5bcc, 0x5bd4, 0x5bdc, + 0x5be4, 0x5bec, 0x5bf4, 0x5bfb, 0x5c02, 0x5c06, 0x5c0a, 0x5c0e, + 0x5c12, 0x5c16, 0x5c1a, 0x5c1e, 0x5c22, 0x5c26, 0x5c2b, 0x5c2f, + 0x5c33, 0x5c37, 0x5c3b, 0x5c40, 0x5c44, 0x5c48, 0x5c4c, 0x5c51, + 0x5c55, 0x5c59, 0x5c5e, 0x5c62, 0x5c67, 0x5c6b, 0x5c6f, 0x5c74, + 0x5c78, 0x5c7d, 0x5c81, 0x5c86, 0x5c8a, 0x5c8f, 0x5c93, 0x5c98, + 0x5c9d, 0x5ca1, 0x5ca6, 0x5cab, 0x5caf, 0x5cb4, 0x5cb9, 0x5cbd, + 0x5cc2, 0x5cc7, 0x5ccc, 0x5cd0, 0x5cd5, 0x5cda, 0x5cdf, 0x5ce4, + 0x5ce9, 0x5cee, 0x5cf3, 0x5cf8, 0x5cfd, 0x5d02, 0x5d07, 0x5d0c, + 0x5d11, 0x5d16, 0x5d1b, 0x5d20, 0x5d25, 0x5d2a, 0x5d2f, 0x5d35, + 0x5d3a, 0x5d3f, 0x5d44, 0x5d4a, 0x5d4f, 0x5d54, 0x5d5a, 0x5d5f, + 0x5d64, 0x5d6a, 0x5d6f, 0x5d75, 0x5d7a, 0x5d80, 0x5d85, 0x5d8b, + 0x5d90, 0x5d96, 0x5d9b, 0x5da1, 0x5da7, 0x5dac, 0x5db2, 0x5db8, + 0x5dbd, 0x5dc3, 0x5dc9, 0x5dcf, 0x5dd4, 0x5dda, 0x5de0, 0x5de6, + 0x5dec, 0x5df2, 0x5df8, 0x5dfe, 0x5e04, 0x5e0a, 0x5e10, 0x5e16, + 0x5e1c, 0x5e22, 0x5e28, 0x5e2f, 0x5e35, 0x5e3b, 0x5e41, 0x5e47, + 0x5e4e, 0x5e54, 0x5e5a, 0x5e61, 0x5e67, 0x5e6e, 0x5e74, 0x5e7a, + 0x5e81, 0x5e87, 0x5e8e, 0x5e95, 0x5e9b, 0x5ea2, 0x5ea8, 0x5eaf, + 0x5eb6, 0x5ebd, 0x5ec3, 0x5eca, 0x5ed1, 0x5ed8, 0x5edf, 0x5ee5, + 0x5eec, 0x5ef3, 0x5efa, 0x5f01, 0x5f08, 0x5f0f, 0x5f16, 0x5f1d, + 0x5f25, 0x5f2c, 0x5f33, 0x5f3a, 0x5f41, 0x5f49, 0x5f50, 0x5f57, + 0x5f5f, 0x5f66, 0x5f6d, 0x5f75, 0x5f7c, 0x5f84, 0x5f8b, 0x5f93, + 0x5f9b, 0x5fa2, 0x5faa, 0x5fb1, 0x5fb9, 0x5fc1, 0x5fc9, 0x5fd0, + 0x5fd8, 0x5fe0, 0x5fe8, 0x5ff0, 0x5ff8, 0x6000, 0x6004, 0x6008, + 0x600c, 0x6010, 0x6014, 0x6018, 0x601c, 0x6020, 0x6025, 0x6029, + 0x602d, 0x6031, 0x6035, 0x603a, 0x603e, 0x6042, 0x6046, 0x604b, + 0x604f, 0x6053, 0x6057, 0x605c, 0x6060, 0x6065, 0x6069, 0x606d, + 0x6072, 0x6076, 0x607b, 0x607f, 0x6084, 0x6088, 0x608d, 0x6091, + 0x6096, 0x609b, 0x609f, 0x60a4, 0x60a8, 0x60ad, 0x60b2, 0x60b7, + 0x60bb, 0x60c0, 0x60c5, 0x60ca, 0x60ce, 0x60d3, 0x60d8, 0x60dd, + 0x60e2, 0x60e7, 0x60eb, 0x60f0, 0x60f5, 0x60fa, 0x60ff, 0x6104, + 0x6109, 0x610e, 0x6113, 0x6119, 0x611e, 0x6123, 0x6128, 0x612d, + 0x6132, 0x6137, 0x613d, 0x6142, 0x6147, 0x614d, 0x6152, 0x6157, + 0x615d, 0x6162, 0x6167, 0x616d, 0x6172, 0x6178, 0x617d, 0x6183, + 0x6188, 0x618e, 0x6193, 0x6199, 0x619e, 0x61a4, 0x61aa, 0x61af, + 0x61b5, 0x61bb, 0x61c0, 0x61c6, 0x61cc, 0x61d2, 0x61d8, 0x61de, + 0x61e3, 0x61e9, 0x61ef, 0x61f5, 0x61fb, 0x6201, 0x6207, 0x620d, + 0x6213, 0x6219, 0x621f, 0x6226, 0x622c, 0x6232, 0x6238, 0x623e, + 0x6245, 0x624b, 0x6251, 0x6258, 0x625e, 0x6264, 0x626b, 0x6271, + 0x6278, 0x627e, 0x6285, 0x628b, 0x6292, 0x6298, 0x629f, 0x62a5, + 0x62ac, 0x62b3, 0x62ba, 0x62c0, 0x62c7, 0x62ce, 0x62d5, 0x62db, + 0x62e2, 0x62e9, 0x62f0, 0x62f7, 0x62fe, 0x6305, 0x630c, 0x6313, + 0x631a, 0x6321, 0x6329, 0x6330, 0x6337, 0x633e, 0x6345, 0x634d, + 0x6354, 0x635b, 0x6363, 0x636a, 0x6372, 0x6379, 0x6380, 0x6388, + 0x6390, 0x6397, 0x639f, 0x63a6, 0x63ae, 0x63b6, 0x63bd, 0x63c5, + 0x63cd, 0x63d5, 0x63dd, 0x63e5, 0x63ec, 0x63f4, 0x63fc, 0x6402, + 0x6406, 0x640a, 0x640e, 0x6412, 0x6416, 0x641b, 0x641f, 0x6423, + 0x6427, 0x642b, 0x642f, 0x6433, 0x6438, 0x643c, 0x6440, 0x6444, + 0x6449, 0x644d, 0x6451, 0x6456, 0x645a, 0x645e, 0x6463, 0x6467, + 0x646b, 0x6470, 0x6474, 0x6479, 0x647d, 0x6482, 0x6486, 0x648b, + 0x648f, 0x6494, 0x6499, 0x649d, 0x64a2, 0x64a6, 0x64ab, 0x64b0, + 0x64b4, 0x64b9, 0x64be, 0x64c3, 0x64c7, 0x64cc, 0x64d1, 0x64d6, + 0x64db, 0x64e0, 0x64e4, 0x64e9, 0x64ee, 0x64f3, 0x64f8, 0x64fd, + 0x6502, 0x6507, 0x650c, 0x6511, 0x6516, 0x651b, 0x6520, 0x6526, + 0x652b, 0x6530, 0x6535, 0x653a, 0x6540, 0x6545, 0x654a, 0x654f, + 0x6555, 0x655a, 0x655f, 0x6565, 0x656a, 0x6570, 0x6575, 0x657b, + 0x6580, 0x6586, 0x658b, 0x6591, 0x6596, 0x659c, 0x65a1, 0x65a7, + 0x65ad, 0x65b2, 0x65b8, 0x65be, 0x65c4, 0x65c9, 0x65cf, 0x65d5, + 0x65db, 0x65e1, 0x65e7, 0x65ed, 0x65f3, 0x65f8, 0x65fe, 0x6604, + 0x660b, 0x6611, 0x6617, 0x661d, 0x6623, 0x6629, 0x662f, 0x6635, + 0x663c, 0x6642, 0x6648, 0x664e, 0x6655, 0x665b, 0x6661, 0x6668, + 0x666e, 0x6675, 0x667b, 0x6682, 0x6688, 0x668f, 0x6695, 0x669c, + 0x66a2, 0x66a9, 0x66b0, 0x66b7, 0x66bd, 0x66c4, 0x66cb, 0x66d2, + 0x66d8, 0x66df, 0x66e6, 0x66ed, 0x66f4, 0x66fb, 0x6702, 0x6709, + 0x6710, 0x6717, 0x671e, 0x6725, 0x672d, 0x6734, 0x673b, 0x6742, + 0x6749, 0x6751, 0x6758, 0x675f, 0x6767, 0x676e, 0x6776, 0x677d, + 0x6785, 0x678c, 0x6794, 0x679b, 0x67a3, 0x67ab, 0x67b2, 0x67ba, + 0x67c2, 0x67ca, 0x67d1, 0x67d9, 0x67e1, 0x67e9, 0x67f1, 0x67f9, + 0x6800, 0x6804, 0x6808, 0x680c, 0x6811, 0x6815, 0x6819, 0x681d, + 0x6821, 0x6825, 0x6829, 0x682d, 0x6832, 0x6836, 0x683a, 0x683e, + 0x6842, 0x6847, 0x684b, 0x684f, 0x6854, 0x6858, 0x685c, 0x6861, + 0x6865, 0x6869, 0x686e, 0x6872, 0x6877, 0x687b, 0x6880, 0x6884, + 0x6889, 0x688d, 0x6892, 0x6896, 0x689b, 0x68a0, 0x68a4, 0x68a9, + 0x68ae, 0x68b2, 0x68b7, 0x68bc, 0x68c0, 0x68c5, 0x68ca, 0x68cf, + 0x68d4, 0x68d8, 0x68dd, 0x68e2, 0x68e7, 0x68ec, 0x68f1, 0x68f6, + 0x68fb, 0x6900, 0x6905, 0x690a, 0x690f, 0x6914, 0x6919, 0x691e, + 0x6923, 0x6928, 0x692e, 0x6933, 0x6938, 0x693d, 0x6943, 0x6948, + 0x694d, 0x6952, 0x6958, 0x695d, 0x6962, 0x6968, 0x696d, 0x6973, + 0x6978, 0x697e, 0x6983, 0x6989, 0x698e, 0x6994, 0x6999, 0x699f, + 0x69a5, 0x69aa, 0x69b0, 0x69b6, 0x69bb, 0x69c1, 0x69c7, 0x69cd, + 0x69d2, 0x69de, 0x69ea, 0x69f6, 0x6a02, 0x6a0e, 0x6a1a, 0x6a26, + 0x6a33, 0x6a3f, 0x6a4c, 0x6a58, 0x6a65, 0x6a72, 0x6a7f, 0x6a8c, + 0x6a99, 0x6aa6, 0x6ab4, 0x6ac1, 0x6acf, 0x6adc, 0x6aea, 0x6af8, + 0x6b06, 0x6b14, 0x6b22, 0x6b30, 0x6b3f, 0x6b4d, 0x6b5c, 0x6b6b, + 0x6b7a, 0x6b89, 0x6b98, 0x6ba7, 0x6bb7, 0x6bc6, 0x6bd6, 0x6be5, + 0x6bf5, 0x6c03, 0x6c0b, 0x6c13, 0x6c1b, 0x6c23, 0x6c2c, 0x6c34, + 0x6c3c, 0x6c45, 0x6c4d, 0x6c56, 0x6c5f, 0x6c68, 0x6c70, 0x6c79, + 0x6c82, 0x6c8b, 0x6c94, 0x6c9e, 0x6ca7, 0x6cb0, 0x6cba, 0x6cc3, + 0x6ccd, 0x6cd6, 0x6ce0, 0x6cea, 0x6cf4, 0x6cfe, 0x6d08, 0x6d12, + 0x6d1c, 0x6d26, 0x6d31, 0x6d3b, 0x6d45, 0x6d50, 0x6d5b, 0x6d65, + 0x6d70, 0x6d7b, 0x6d86, 0x6d91, 0x6d9c, 0x6da8, 0x6db3, 0x6dbf, + 0x6dca, 0x6dd6, 0x6de1, 0x6ded, 0x6df9, 0x6e05, 0x6e11, 0x6e1d, + 0x6e2a, 0x6e36, 0x6e43, 0x6e4f, 0x6e5c, 0x6e69, 0x6e75, 0x6e82, + 0x6e8f, 0x6e9d, 0x6eaa, 0x6eb7, 0x6ec5, 0x6ed2, 0x6ee0, 0x6eee, + 0x6efc, 0x6f0a, 0x6f18, 0x6f26, 0x6f34, 0x6f43, 0x6f52, 0x6f60, + 0x6f6f, 0x6f7e, 0x6f8d, 0x6f9c, 0x6fab, 0x6fbb, 0x6fca, 0x6fda, + 0x6fea, 0x6ffa, 0x7005, 0x700d, 0x7015, 0x701d, 0x7025, 0x702e, + 0x7036, 0x703f, 0x7047, 0x7050, 0x7058, 0x7061, 0x706a, 0x7073, + 0x707c, 0x7085, 0x708e, 0x7097, 0x70a0, 0x70a9, 0x70b3, 0x70bc, + 0x70c6, 0x70cf, 0x70d9, 0x70e3, 0x70ed, 0x70f6, 0x7100, 0x710a, + 0x7115, 0x711f, 0x7129, 0x7133, 0x713e, 0x7148, 0x7153, 0x715e, + 0x7168, 0x7173, 0x717e, 0x7189, 0x7194, 0x71a0, 0x71ab, 0x71b6, + 0x71c2, 0x71cd, 0x71d9, 0x71e5, 0x71f1, 0x71fc, 0x7208, 0x7215, + 0x7221, 0x722d, 0x7239, 0x7246, 0x7253, 0x725f, 0x726c, 0x7279, + 0x7286, 0x7293, 0x72a0, 0x72ae, 0x72bb, 0x72c8, 0x72d6, 0x72e4, + 0x72f2, 0x7300, 0x730e, 0x731c, 0x732a, 0x7338, 0x7347, 0x7356, + 0x7364, 0x7373, 0x7382, 0x7391, 0x73a0, 0x73b0, 0x73bf, 0x73cf, + 0x73de, 0x73ee, 0x73fe, 0x7407, 0x740f, 0x7417, 0x7420, 0x7428, + 0x7430, 0x7439, 0x7441, 0x744a, 0x7452, 0x745b, 0x7464, 0x746c, + 0x7475, 0x747e, 0x7487, 0x7490, 0x749a, 0x74a3, 0x74ac, 0x74b5, + 0x74bf, 0x74c8, 0x74d2, 0x74dc, 0x74e5, 0x74ef, 0x74f9, 0x7503, + 0x750d, 0x7517, 0x7522, 0x752c, 0x7536, 0x7541, 0x754b, 0x7556, + 0x7561, 0x756b, 0x7576, 0x7581, 0x758c, 0x7597, 0x75a3, 0x75ae, + 0x75b9, 0x75c5, 0x75d1, 0x75dc, 0x75e8, 0x75f4, 0x7600, 0x760c, + 0x7618, 0x7624, 0x7631, 0x763d, 0x7649, 0x7656, 0x7663, 0x7670, + 0x767d, 0x768a, 0x7697, 0x76a4, 0x76b1, 0x76bf, 0x76cc, 0x76da, + 0x76e8, 0x76f6, 0x7703, 0x7712, 0x7720, 0x772e, 0x773c, 0x774b, + 0x775a, 0x7768, 0x7777, 0x7786, 0x7795, 0x77a5, 0x77b4, 0x77c3, + 0x77d3, 0x77e3, 0x77f3, 0x7801, 0x7809, 0x7811, 0x781a, 0x7822, + 0x782a, 0x7832, 0x783b, 0x7843, 0x784c, 0x7855, 0x785d, 0x7866, + 0x786f, 0x7878, 0x7881, 0x788a, 0x7893, 0x789c, 0x78a5, 0x78af, + 0x78b8, 0x78c2, 0x78cb, 0x78d5, 0x78de, 0x78e8, 0x78f2, 0x78fc, + 0x7906, 0x7910, 0x791a, 0x7924, 0x792f, 0x7939, 0x7944, 0x794e, + 0x7959, 0x7964, 0x796e, 0x7979, 0x7984, 0x798f, 0x799b, 0x79a6, + 0x79b1, 0x79bd, 0x79c8, 0x79d4, 0x79df, 0x79eb, 0x79f7, 0x7a03, + 0x7a0f, 0x7a1b, 0x7a28, 0x7a34, 0x7a40, 0x7a4d, 0x7a5a, 0x7a66, + 0x7a73, 0x7a80, 0x7a8d, 0x7a9a, 0x7aa8, 0x7ab5, 0x7ac2, 0x7ad0, + 0x7ade, 0x7aeb, 0x7af9, 0x7b07, 0x7b16, 0x7b24, 0x7b32, 0x7b41, + 0x7b4f, 0x7b5e, 0x7b6d, 0x7b7b, 0x7b8a, 0x7b9a, 0x7ba9, 0x7bb8, + 0x7bc8, 0x7bd7, 0x7be7, 0x7bf7, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, + 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, + 0x3bc0, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, + 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, + 0x3bbf, 0x3bbf, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, + 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, + 0x3bbe, 0x3bbe, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, + 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, + 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, + 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, + 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, + 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, + 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bba, 0x3bba, 0x3bba, 0x3bba, + 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, + 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, + 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, + 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb8, 0x3bb8, 0x3bb8, + 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, + 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb7, 0x3bb7, + 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, + 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb6, 0x3bb6, + 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, + 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb5, + 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, + 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb4, + 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, + 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, + 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, + 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, + 0x3bb3, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, + 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, + 0x3bb2, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, + 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, + 0x3bb1, 0x3bb1, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, + 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, + 0x3bb0, 0x3bb0, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, + 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, + 0x3baf, 0x3baf, 0x3baf, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, + 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, + 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bad, 0x3bad, 0x3bad, 0x3bad, + 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, + 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bac, 0x3bac, 0x3bac, 0x3bac, + 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, + 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bab, 0x3bab, 0x3bab, + 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, + 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3baa, 0x3baa, + 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, + 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3ba9, + 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, + 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba8, + 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, + 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, + 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, + 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, + 0x3ba7, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, + 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, + 0x3ba6, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, + 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, + 0x3ba5, 0x3ba5, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, + 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, + 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, + 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, + 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, + 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, + 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, + 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, + 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba0, 0x3ba0, 0x3ba0, + 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, + 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3b9f, 0x3b9f, + 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, + 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9e, + 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, + 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, + 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, + 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, + 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, + 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, + 0x3b9c, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, + 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, + 0x3b9b, 0x3b9b, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, + 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, + 0x3b9a, 0x3b9a, 0x3b9a, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, + 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, + 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b98, 0x3b98, 0x3b98, 0x3b98, + 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, + 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b97, 0x3b97, 0x3b97, + 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, + 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b96, 0x3b96, + 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, + 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b95, 0x3b95, + 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, + 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b94, + 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, + 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, + 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, + 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, + 0x3b93, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, + 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, + 0x3b92, 0x3b92, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, + 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, + 0x3b91, 0x3b91, 0x3b91, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, + 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, + 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, + 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, + 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8e, 0x3b8e, 0x3b8e, + 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, + 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8d, 0x3b8d, + 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, + 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8c, + 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, + 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, + 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, + 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, + 0x3b8b, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, + 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, + 0x3b8a, 0x3b8a, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, + 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, + 0x3b89, 0x3b89, 0x3b89, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, + 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, + 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b87, 0x3b87, 0x3b87, 0x3b87, + 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, + 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b86, 0x3b86, 0x3b86, + 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, + 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b85, 0x3b85, + 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, + 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b84, + 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, + 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b83, 0x3b83, 0x3b83, 0x3b83, + 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b82, 0x3b82, 0x3b82, + 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b81, 0x3b81, 0x3b81, + 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b80, 0x3b80, + 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b7f, 0x3b7f, + 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7e, + 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7d, + 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, + 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, + 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, + 0x3b7b, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, + 0x3b7a, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, + 0x3b79, 0x3b79, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, + 0x3b78, 0x3b78, 0x3b78, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, + 0x3b77, 0x3b77, 0x3b77, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, + 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b75, 0x3b75, 0x3b75, 0x3b75, + 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b74, 0x3b74, 0x3b74, 0x3b74, + 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b73, 0x3b73, 0x3b73, + 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b72, 0x3b72, + 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b71, 0x3b71, + 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b70, + 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b6f, + 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, + 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, + 0x3b6e, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, + 0x3b6d, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, + 0x3b6c, 0x3b6c, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, + 0x3b6b, 0x3b6b, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, + 0x3b6a, 0x3b6a, 0x3b6a, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, + 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b68, 0x3b68, 0x3b68, 0x3b68, + 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b67, 0x3b67, 0x3b67, 0x3b67, + 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b66, 0x3b66, 0x3b66, + 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b65, 0x3b65, + 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b64, 0x3b64, + 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b63, + 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, + 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, + 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, + 0x3b61, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, + 0x3b60, 0x3b60, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, + 0x3b5f, 0x3b5f, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, + 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, + 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, + 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, + 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5a, 0x3b5a, 0x3b5a, + 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b59, 0x3b59, + 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b58, 0x3b58, + 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b57, + 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, + 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, + 0x3b56, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, + 0x3b55, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, + 0x3b54, 0x3b54, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, + 0x3b53, 0x3b53, 0x3b53, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, + 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b51, 0x3b51, 0x3b51, 0x3b51, + 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b50, 0x3b50, 0x3b50, 0x3b50, + 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b4f, 0x3b4f, 0x3b4f, + 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4e, 0x3b4e, + 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4d, + 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4c, + 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, + 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, + 0x3b4b, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, + 0x3b4a, 0x3b4a, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, + 0x3b49, 0x3b49, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, + 0x3b48, 0x3b48, 0x3b48, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, + 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b46, 0x3b46, 0x3b46, 0x3b46, + 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b45, 0x3b45, 0x3b45, + 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b44, 0x3b44, + 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b43, 0x3b43, + 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b42, + 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, + 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, + 0x3b41, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, + 0x3b40, 0x3b40, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, + 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, + 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, + 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, + 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3b, 0x3b3b, 0x3b3b, + 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3a, 0x3b3a, + 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b39, + 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, + 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, + 0x3b38, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, + 0x3b37, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, + 0x3b36, 0x3b36, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, + 0x3b35, 0x3b35, 0x3b35, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, + 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b33, 0x3b33, 0x3b33, 0x3b33, + 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b32, 0x3b32, 0x3b32, + 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b31, 0x3b31, + 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b30, + 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, + 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, + 0x3b2f, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, + 0x3b2e, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, + 0x3b2d, 0x3b2d, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, + 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, + 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, + 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b29, 0x3b29, 0x3b29, + 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b28, 0x3b28, + 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b27, + 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, + 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, + 0x3b26, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, + 0x3b25, 0x3b25, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, + 0x3b24, 0x3b24, 0x3b24, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, + 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b22, 0x3b22, 0x3b22, 0x3b22, + 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b21, 0x3b21, 0x3b21, + 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b20, 0x3b20, + 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b1f, + 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, + 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, + 0x3b1e, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, + 0x3b1d, 0x3b1d, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, + 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, + 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, + 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b19, 0x3b19, 0x3b19, + 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b18, 0x3b18, + 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b17, + 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, + 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, + 0x3b16, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, + 0x3b15, 0x3b15, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, + 0x3b14, 0x3b14, 0x3b14, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, + 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b12, 0x3b12, 0x3b12, 0x3b12, + 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b11, 0x3b11, 0x3b11, + 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b10, 0x3b10, + 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b0f, + 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0e, 0x3b0e, 0x3b0e, 0x3b0e, + 0x3b0e, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0c, 0x3b0c, 0x3b0c, + 0x3b0c, 0x3b0c, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0a, + 0x3b0a, 0x3b0a, 0x3b0a, 0x3b09, 0x3b09, 0x3b09, 0x3b09, 0x3b09, + 0x3b08, 0x3b08, 0x3b08, 0x3b08, 0x3b07, 0x3b07, 0x3b07, 0x3b07, + 0x3b07, 0x3b06, 0x3b06, 0x3b06, 0x3b06, 0x3b05, 0x3b05, 0x3b05, + 0x3b05, 0x3b05, 0x3b04, 0x3b04, 0x3b04, 0x3b04, 0x3b03, 0x3b03, + 0x3b03, 0x3b03, 0x3b03, 0x3b02, 0x3b02, 0x3b02, 0x3b02, 0x3b02, + 0x3b01, 0x3b01, 0x3b01, 0x3b01, 0x3b00, 0x3b00, 0x3b00, 0x3b00, + 0x3b00, 0x3aff, 0x3aff, 0x3aff, 0x3aff, 0x3afe, 0x3afe, 0x3afe, + 0x3afe, 0x3afe, 0x3afd, 0x3afd, 0x3afd, 0x3afd, 0x3afc, 0x3afc, + 0x3afc, 0x3afc, 0x3afc, 0x3afb, 0x3afb, 0x3afb, 0x3afb, 0x3afb, + 0x3afa, 0x3afa, 0x3afa, 0x3afa, 0x3af9, 0x3af9, 0x3af9, 0x3af9, + 0x3af9, 0x3af8, 0x3af8, 0x3af8, 0x3af8, 0x3af7, 0x3af7, 0x3af7, + 0x3af7, 0x3af7, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af5, + 0x3af5, 0x3af5, 0x3af5, 0x3af4, 0x3af4, 0x3af4, 0x3af4, 0x3af4, + 0x3af3, 0x3af3, 0x3af3, 0x3af3, 0x3af2, 0x3af2, 0x3af2, 0x3af2, + 0x3af2, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af0, 0x3af0, + 0x3af0, 0x3af0, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aee, + 0x3aee, 0x3aee, 0x3aee, 0x3aed, 0x3aed, 0x3aed, 0x3aed, 0x3aed, + 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aeb, 0x3aeb, 0x3aeb, + 0x3aeb, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3ae9, 0x3ae9, + 0x3ae9, 0x3ae9, 0x3ae9, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae7, + 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae6, 0x3ae6, 0x3ae6, 0x3ae6, + 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae4, 0x3ae4, 0x3ae4, + 0x3ae4, 0x3ae4, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae2, 0x3ae2, + 0x3ae2, 0x3ae2, 0x3ae2, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, + 0x3ae0, 0x3ae0, 0x3ae0, 0x3ae0, 0x3adf, 0x3adf, 0x3adf, 0x3adf, + 0x3adf, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3add, 0x3add, + 0x3add, 0x3add, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adb, + 0x3adb, 0x3adb, 0x3adb, 0x3adb, 0x3ada, 0x3ada, 0x3ada, 0x3ada, + 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad8, 0x3ad8, 0x3ad8, + 0x3ad8, 0x3ad8, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad6, 0x3ad6, + 0x3ad6, 0x3ad6, 0x3ad6, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, + 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad3, 0x3ad3, 0x3ad3, 0x3ad3, + 0x3ad3, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad1, 0x3ad1, + 0x3ad1, 0x3ad1, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3acf, + 0x3acf, 0x3acf, 0x3acf, 0x3acf, 0x3ace, 0x3ace, 0x3ace, 0x3ace, + 0x3ace, 0x3acd, 0x3acd, 0x3acd, 0x3acd, 0x3acc, 0x3acc, 0x3acc, + 0x3acc, 0x3acc, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3aca, + 0x3aca, 0x3aca, 0x3aca, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, + 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac7, 0x3ac7, 0x3ac7, + 0x3ac7, 0x3ac7, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac5, 0x3ac5, + 0x3ac5, 0x3ac5, 0x3ac5, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, + 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac2, 0x3ac2, 0x3ac2, 0x3ac2, + 0x3ac2, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac0, 0x3ac0, + 0x3ac0, 0x3ac0, 0x3ac0, 0x3abf, 0x3abf, 0x3abf, 0x3abf, 0x3abe, + 0x3abe, 0x3abe, 0x3abe, 0x3abe, 0x3abd, 0x3abd, 0x3abd, 0x3abd, + 0x3abd, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abb, 0x3abb, + 0x3abb, 0x3abb, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3ab9, + 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab8, 0x3ab8, 0x3ab8, 0x3ab8, + 0x3ab8, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab6, 0x3ab6, 0x3ab6, + 0x3ab6, 0x3ab6, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab4, + 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab3, 0x3ab3, 0x3ab3, 0x3ab3, + 0x3ab3, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab1, 0x3ab1, 0x3ab1, + 0x3ab1, 0x3ab1, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3aaf, + 0x3aaf, 0x3aaf, 0x3aaf, 0x3aaf, 0x3aae, 0x3aae, 0x3aae, 0x3aae, + 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aac, 0x3aac, 0x3aac, + 0x3aac, 0x3aac, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aaa, + 0x3aaa, 0x3aaa, 0x3aaa, 0x3aaa, 0x3aa9, 0x3aa9, 0x3aa9, 0x3aa9, + 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa7, 0x3aa7, 0x3aa7, + 0x3aa7, 0x3aa7, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa5, + 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa4, 0x3aa4, 0x3aa4, 0x3aa4, + 0x3aa4, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa2, 0x3aa2, 0x3aa2, + 0x3aa2, 0x3aa2, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa0, + 0x3aa0, 0x3aa0, 0x3aa0, 0x3aa0, 0x3a9f, 0x3a9f, 0x3a9f, 0x3a9f, + 0x3a9f, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9d, 0x3a9d, + 0x3a9d, 0x3a9d, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9b, + 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9a, 0x3a9a, 0x3a9a, 0x3a9a, + 0x3a9a, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a98, 0x3a98, + 0x3a98, 0x3a98, 0x3a98, 0x3a97, 0x3a97, 0x3a97, 0x3a97, 0x3a96, + 0x3a96, 0x3a96, 0x3a96, 0x3a96, 0x3a95, 0x3a95, 0x3a95, 0x3a95, + 0x3a95, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a93, 0x3a93, + 0x3a93, 0x3a93, 0x3a93, 0x3a92, 0x3a92, 0x3a92, 0x3a92, 0x3a92, + 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a90, 0x3a90, 0x3a90, + 0x3a90, 0x3a90, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8e, 0x3a8e, + 0x3a8e, 0x3a8e, 0x3a8e, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, + 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8b, 0x3a8b, 0x3a8b, + 0x3a8b, 0x3a8b, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a89, + 0x3a89, 0x3a89, 0x3a89, 0x3a89, 0x3a88, 0x3a88, 0x3a88, 0x3a88, + 0x3a88, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a86, 0x3a86, + 0x3a86, 0x3a86, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a84, + 0x3a84, 0x3a84, 0x3a84, 0x3a84, 0x3a83, 0x3a83, 0x3a83, 0x3a83, + 0x3a83, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a81, 0x3a81, + 0x3a81, 0x3a81, 0x3a81, 0x3a80, 0x3a80, 0x3a80, 0x3a80, 0x3a80, + 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7e, 0x3a7e, 0x3a7e, + 0x3a7e, 0x3a7e, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7c, + 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7b, 0x3a7b, 0x3a7b, 0x3a7b, + 0x3a7b, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a79, 0x3a79, + 0x3a79, 0x3a79, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a77, + 0x3a77, 0x3a77, 0x3a77, 0x3a77, 0x3a76, 0x3a76, 0x3a76, 0x3a76, + 0x3a76, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a74, 0x3a74, + 0x3a74, 0x3a74, 0x3a74, 0x3a73, 0x3a73, 0x3a73, 0x3a73, 0x3a73, + 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a71, 0x3a71, 0x3a71, + 0x3a71, 0x3a71, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a6f, + 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6e, 0x3a6e, 0x3a6e, 0x3a6e, + 0x3a6e, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6c, 0x3a6c, + 0x3a6c, 0x3a6c, 0x3a6c, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, + 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a69, 0x3a69, 0x3a69, + 0x3a69, 0x3a69, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a67, + 0x3a67, 0x3a67, 0x3a67, 0x3a67, 0x3a66, 0x3a66, 0x3a66, 0x3a66, + 0x3a66, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a64, 0x3a64, + 0x3a64, 0x3a64, 0x3a64, 0x3a63, 0x3a63, 0x3a63, 0x3a63, 0x3a63, + 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a61, 0x3a61, 0x3a61, + 0x3a61, 0x3a61, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a5f, + 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5e, 0x3a5e, 0x3a5e, 0x3a5e, + 0x3a5e, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5c, 0x3a5c, + 0x3a5c, 0x3a5c, 0x3a5c, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, + 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a59, 0x3a59, 0x3a59, + 0x3a59, 0x3a59, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a57, + 0x3a57, 0x3a57, 0x3a57, 0x3a57, 0x3a56, 0x3a56, 0x3a56, 0x3a56, + 0x3a56, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a54, 0x3a54, + 0x3a54, 0x3a54, 0x3a54, 0x3a54, 0x3a53, 0x3a53, 0x3a53, 0x3a53, + 0x3a53, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a51, 0x3a51, + 0x3a51, 0x3a51, 0x3a51, 0x3a50, 0x3a50, 0x3a50, 0x3a50, 0x3a50, + 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4e, 0x3a4e, 0x3a4e, + 0x3a4e, 0x3a4e, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4c, + 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4b, 0x3a4b, 0x3a4b, 0x3a4b, + 0x3a4b, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a49, 0x3a49, + 0x3a49, 0x3a49, 0x3a49, 0x3a48, 0x3a48, 0x3a48, 0x3a48, 0x3a48, + 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a46, 0x3a46, + 0x3a46, 0x3a46, 0x3a46, 0x3a45, 0x3a45, 0x3a45, 0x3a45, 0x3a45, + 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a43, 0x3a43, 0x3a43, + 0x3a43, 0x3a43, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a41, + 0x3a41, 0x3a41, 0x3a41, 0x3a41, 0x3a40, 0x3a40, 0x3a40, 0x3a40, + 0x3a40, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3e, 0x3a3e, + 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3d, 0x3a3d, 0x3a3d, 0x3a3d, + 0x3a3d, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3b, 0x3a3b, + 0x3a3b, 0x3a3b, 0x3a3a, 0x3a3a, 0x3a39, 0x3a39, 0x3a39, 0x3a38, + 0x3a38, 0x3a37, 0x3a37, 0x3a37, 0x3a36, 0x3a36, 0x3a36, 0x3a35, + 0x3a35, 0x3a34, 0x3a34, 0x3a34, 0x3a33, 0x3a33, 0x3a32, 0x3a32, + 0x3a32, 0x3a31, 0x3a31, 0x3a31, 0x3a30, 0x3a30, 0x3a2f, 0x3a2f, + 0x3a2f, 0x3a2e, 0x3a2e, 0x3a2d, 0x3a2d, 0x3a2d, 0x3a2c, 0x3a2c, + 0x3a2b, 0x3a2b, 0x3a2b, 0x3a2a, 0x3a2a, 0x3a2a, 0x3a29, 0x3a29, + 0x3a28, 0x3a28, 0x3a28, 0x3a27, 0x3a27, 0x3a26, 0x3a26, 0x3a26, + 0x3a25, 0x3a25, 0x3a25, 0x3a24, 0x3a24, 0x3a23, 0x3a23, 0x3a23, + 0x3a22, 0x3a22, 0x3a21, 0x3a21, 0x3a21, 0x3a20, 0x3a20, 0x3a20, + 0x3a1f, 0x3a1f, 0x3a1e, 0x3a1e, 0x3a1e, 0x3a1d, 0x3a1d, 0x3a1d, + 0x3a1c, 0x3a1c, 0x3a1b, 0x3a1b, 0x3a1b, 0x3a1a, 0x3a1a, 0x3a19, + 0x3a19, 0x3a19, 0x3a18, 0x3a18, 0x3a18, 0x3a17, 0x3a17, 0x3a16, + 0x3a16, 0x3a16, 0x3a15, 0x3a15, 0x3a15, 0x3a14, 0x3a14, 0x3a13, + 0x3a13, 0x3a13, 0x3a12, 0x3a12, 0x3a11, 0x3a11, 0x3a11, 0x3a10, + 0x3a10, 0x3a10, 0x3a0f, 0x3a0f, 0x3a0e, 0x3a0e, 0x3a0e, 0x3a0d, + 0x3a0d, 0x3a0d, 0x3a0c, 0x3a0c, 0x3a0b, 0x3a0b, 0x3a0b, 0x3a0a, + 0x3a0a, 0x3a0a, 0x3a09, 0x3a09, 0x3a08, 0x3a08, 0x3a08, 0x3a07, + 0x3a07, 0x3a07, 0x3a06, 0x3a06, 0x3a05, 0x3a05, 0x3a05, 0x3a04, + 0x3a04, 0x3a04, 0x3a03, 0x3a03, 0x3a02, 0x3a02, 0x3a02, 0x3a01, + 0x3a01, 0x3a01, 0x3a00, 0x3a00, 0x39ff, 0x39ff, 0x39ff, 0x39fe, + 0x39fe, 0x39fe, 0x39fd, 0x39fd, 0x39fc, 0x39fc, 0x39fc, 0x39fb, + 0x39fb, 0x39fb, 0x39fa, 0x39fa, 0x39f9, 0x39f9, 0x39f9, 0x39f8, + 0x39f8, 0x39f8, 0x39f7, 0x39f7, 0x39f6, 0x39f6, 0x39f6, 0x39f5, + 0x39f5, 0x39f5, 0x39f4, 0x39f4, 0x39f3, 0x39f3, 0x39f3, 0x39f2, + 0x39f2, 0x39f2, 0x39f1, 0x39f1, 0x39f0, 0x39f0, 0x39f0, 0x39ef, + 0x39ef, 0x39ef, 0x39ee, 0x39ee, 0x39ed, 0x39ed, 0x39ed, 0x39ec, + 0x39ec, 0x39ec, 0x39eb, 0x39eb, 0x39eb, 0x39ea, 0x39ea, 0x39e9, + 0x39e9, 0x39e9, 0x39e8, 0x39e8, 0x39e8, 0x39e7, 0x39e7, 0x39e6, + 0x39e6, 0x39e6, 0x39e5, 0x39e5, 0x39e5, 0x39e4, 0x39e4, 0x39e4, + 0x39e3, 0x39e3, 0x39e2, 0x39e2, 0x39e2, 0x39e1, 0x39e1, 0x39e1, + 0x39e0, 0x39e0, 0x39df, 0x39df, 0x39df, 0x39de, 0x39de, 0x39de, + 0x39dd, 0x39dd, 0x39dd, 0x39dc, 0x39dc, 0x39db, 0x39db, 0x39db, + 0x39da, 0x39da, 0x39da, 0x39d9, 0x39d9, 0x39d9, 0x39d8, 0x39d8, + 0x39d7, 0x39d7, 0x39d7, 0x39d6, 0x39d6, 0x39d6, 0x39d5, 0x39d5, + 0x39d5, 0x39d4, 0x39d4, 0x39d3, 0x39d3, 0x39d3, 0x39d2, 0x39d2, + 0x39d2, 0x39d1, 0x39d1, 0x39d1, 0x39d0, 0x39d0, 0x39cf, 0x39cf, + 0x39cf, 0x39ce, 0x39ce, 0x39ce, 0x39cd, 0x39cd, 0x39cd, 0x39cc, + 0x39cc, 0x39cb, 0x39cb, 0x39cb, 0x39ca, 0x39ca, 0x39ca, 0x39c9, + 0x39c9, 0x39c9, 0x39c8, 0x39c8, 0x39c7, 0x39c7, 0x39c7, 0x39c6, + 0x39c6, 0x39c6, 0x39c5, 0x39c5, 0x39c5, 0x39c4, 0x39c4, 0x39c3, + 0x39c3, 0x39c3, 0x39c2, 0x39c2, 0x39c2, 0x39c1, 0x39c1, 0x39c1, + 0x39c0, 0x39c0, 0x39c0, 0x39bf, 0x39bf, 0x39be, 0x39be, 0x39be, + 0x39bd, 0x39bd, 0x39bd, 0x39bc, 0x39bc, 0x39bc, 0x39bb, 0x39bb, + 0x39bb, 0x39ba, 0x39ba, 0x39b9, 0x39b9, 0x39b9, 0x39b8, 0x39b8, + 0x39b8, 0x39b7, 0x39b7, 0x39b7, 0x39b6, 0x39b6, 0x39b5, 0x39b5, + 0x39b5, 0x39b4, 0x39b4, 0x39b4, 0x39b3, 0x39b3, 0x39b3, 0x39b2, + 0x39b2, 0x39b2, 0x39b1, 0x39b1, 0x39b1, 0x39b0, 0x39b0, 0x39af, + 0x39af, 0x39af, 0x39ae, 0x39ae, 0x39ae, 0x39ad, 0x39ad, 0x39ad, + 0x39ac, 0x39ac, 0x39ac, 0x39ab, 0x39ab, 0x39aa, 0x39aa, 0x39aa, + 0x39a9, 0x39a9, 0x39a9, 0x39a8, 0x39a8, 0x39a8, 0x39a7, 0x39a7, + 0x39a7, 0x39a6, 0x39a6, 0x39a6, 0x39a5, 0x39a5, 0x39a4, 0x39a4, + 0x39a4, 0x39a3, 0x39a3, 0x39a3, 0x39a2, 0x39a2, 0x39a2, 0x39a1, + 0x39a1, 0x39a1, 0x39a0, 0x39a0, 0x39a0, 0x399f, 0x399f, 0x399e, + 0x399e, 0x399e, 0x399d, 0x399d, 0x399d, 0x399c, 0x399c, 0x399c, + 0x399b, 0x399b, 0x399b, 0x399a, 0x399a, 0x399a, 0x3999, 0x3999, + 0x3999, 0x3998, 0x3998, 0x3997, 0x3997, 0x3997, 0x3996, 0x3996, + 0x3996, 0x3995, 0x3995, 0x3995, 0x3994, 0x3994, 0x3994, 0x3993, + 0x3993, 0x3993, 0x3992, 0x3992, 0x3992, 0x3991, 0x3991, 0x3991, + 0x3990, 0x3990, 0x398f, 0x398f, 0x398f, 0x398e, 0x398e, 0x398e, + 0x398d, 0x398d, 0x398d, 0x398c, 0x398c, 0x398c, 0x398b, 0x398b, + 0x398b, 0x398a, 0x398a, 0x398a, 0x3989, 0x3989, 0x3989, 0x3988, + 0x3988, 0x3987, 0x3987, 0x3987, 0x3986, 0x3986, 0x3986, 0x3985, + 0x3985, 0x3985, 0x3984, 0x3984, 0x3984, 0x3983, 0x3983, 0x3983, + 0x3982, 0x3982, 0x3982, 0x3981, 0x3981, 0x3981, 0x3980, 0x3980, + 0x3980, 0x397f, 0x397f, 0x397f, 0x397e, 0x397e, 0x397e, 0x397d, + 0x397d, 0x397c, 0x397c, 0x397c, 0x397b, 0x397b, 0x397b, 0x397a, + 0x397a, 0x397a, 0x3979, 0x3979, 0x3979, 0x3978, 0x3978, 0x3978, + 0x3977, 0x3977, 0x3977, 0x3976, 0x3976, 0x3976, 0x3975, 0x3975, + 0x3975, 0x3974, 0x3974, 0x3974, 0x3973, 0x3973, 0x3973, 0x3972, + 0x3972, 0x3972, 0x3971, 0x3971, 0x3971, 0x3970, 0x3970, 0x3970, + 0x396f, 0x396f, 0x396e, 0x396e, 0x396e, 0x396d, 0x396d, 0x396d, + 0x396c, 0x396c, 0x396c, 0x396b, 0x396b, 0x396b, 0x396a, 0x396a, + 0x396a, 0x3969, 0x3969, 0x3969, 0x3968, 0x3968, 0x3968, 0x3967, + 0x3967, 0x3967, 0x3966, 0x3966, 0x3966, 0x3965, 0x3965, 0x3965, + 0x3964, 0x3964, 0x3964, 0x3963, 0x3963, 0x3963, 0x3962, 0x3962, + 0x3962, 0x3961, 0x3961, 0x3961, 0x3960, 0x3960, 0x3960, 0x395f, + 0x395f, 0x395f, 0x395e, 0x395e, 0x395e, 0x395d, 0x395d, 0x395d, + 0x395c, 0x395c, 0x395c, 0x395b, 0x395b, 0x395b, 0x395a, 0x395a, + 0x395a, 0x3959, 0x3959, 0x3959, 0x3958, 0x3958, 0x3958, 0x3957, + 0x3957, 0x3957, 0x3956, 0x3956, 0x3956, 0x3955, 0x3955, 0x3955, + 0x3954, 0x3954, 0x3954, 0x3953, 0x3953, 0x3953, 0x3952, 0x3952, + 0x3952, 0x3951, 0x3951, 0x3951, 0x3950, 0x3950, 0x3950, 0x394f, + 0x394f, 0x394f, 0x394e, 0x394e, 0x394e, 0x394d, 0x394d, 0x394d, + 0x394c, 0x394c, 0x394c, 0x394b, 0x394b, 0x394b, 0x394a, 0x394a, + 0x394a, 0x3949, 0x3949, 0x3949, 0x3948, 0x3948, 0x3948, 0x3947, + 0x3947, 0x3947, 0x3946, 0x3946, 0x3946, 0x3945, 0x3945, 0x3945, + 0x3944, 0x3944, 0x3944, 0x3943, 0x3943, 0x3943, 0x3942, 0x3942, + 0x3942, 0x3941, 0x3941, 0x3941, 0x3940, 0x3940, 0x3940, 0x393f, + 0x393f, 0x393f, 0x393e, 0x393e, 0x393e, 0x393d, 0x393d, 0x393d, + 0x393c, 0x393c, 0x393c, 0x393c, 0x393b, 0x393b, 0x393b, 0x393a, + 0x393a, 0x393a, 0x3939, 0x3939, 0x3939, 0x3938, 0x3938, 0x3938, + 0x3937, 0x3937, 0x3937, 0x3936, 0x3936, 0x3936, 0x3935, 0x3935, + 0x3935, 0x3934, 0x3934, 0x3934, 0x3933, 0x3933, 0x3933, 0x3932, + 0x3932, 0x3932, 0x3931, 0x3931, 0x3931, 0x3930, 0x3930, 0x3930, + 0x392f, 0x392f, 0x392f, 0x392e, 0x392e, 0x392e, 0x392e, 0x392d, + 0x392d, 0x392d, 0x392c, 0x392c, 0x392c, 0x392b, 0x392b, 0x392b, + 0x392a, 0x392a, 0x392a, 0x3929, 0x3929, 0x3929, 0x3928, 0x3928, + 0x3928, 0x3927, 0x3927, 0x3927, 0x3926, 0x3926, 0x3926, 0x3925, + 0x3925, 0x3925, 0x3924, 0x3924, 0x3924, 0x3924, 0x3923, 0x3923, + 0x3923, 0x3922, 0x3922, 0x3922, 0x3921, 0x3921, 0x3921, 0x3920, + 0x3920, 0x3920, 0x391f, 0x391f, 0x391f, 0x391e, 0x391e, 0x391e, + 0x391d, 0x391d, 0x391d, 0x391c, 0x391c, 0x391c, 0x391c, 0x391b, + 0x391b, 0x391b, 0x391a, 0x391a, 0x391a, 0x3919, 0x3919, 0x3919, + 0x3918, 0x3918, 0x3918, 0x3917, 0x3917, 0x3917, 0x3916, 0x3916, + 0x3916, 0x3915, 0x3915, 0x3915, 0x3915, 0x3914, 0x3914, 0x3914, + 0x3913, 0x3913, 0x3913, 0x3912, 0x3912, 0x3912, 0x3911, 0x3911, + 0x3911, 0x3910, 0x3910, 0x3910, 0x390f, 0x390f, 0x390f, 0x390e, + 0x390e, 0x390e, 0x390e, 0x390d, 0x390d, 0x390d, 0x390c, 0x390c, + 0x390c, 0x390b, 0x390b, 0x390b, 0x390a, 0x390a, 0x390a, 0x3909, + 0x3909, 0x3909, 0x3909, 0x3908, 0x3908, 0x3908, 0x3907, 0x3907, + 0x3907, 0x3906, 0x3906, 0x3906, 0x3905, 0x3905, 0x3905, 0x3904, + 0x3904, 0x3904, 0x3903, 0x3903, 0x3903, 0x3903, 0x3902, 0x3902, + 0x3902, 0x3901, 0x3901, 0x3901, 0x3900, 0x3900, 0x3900, 0x38ff, + 0x38ff, 0x38ff, 0x38fe, 0x38fe, 0x38fe, 0x38fe, 0x38fd, 0x38fd, + 0x38fd, 0x38fc, 0x38fc, 0x38fc, 0x38fb, 0x38fb, 0x38fb, 0x38fa, + 0x38fa, 0x38fa, 0x38f9, 0x38f9, 0x38f9, 0x38f9, 0x38f8, 0x38f8, + 0x38f8, 0x38f7, 0x38f7, 0x38f7, 0x38f6, 0x38f6, 0x38f6, 0x38f5, + 0x38f5, 0x38f5, 0x38f5, 0x38f4, 0x38f4, 0x38f4, 0x38f3, 0x38f3, + 0x38f3, 0x38f2, 0x38f2, 0x38f2, 0x38f1, 0x38f1, 0x38f1, 0x38f1, + 0x38f0, 0x38f0, 0x38f0, 0x38ef, 0x38ef, 0x38ef, 0x38ee, 0x38ee, + 0x38ee, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ec, 0x38ec, 0x38ec, + 0x38eb, 0x38eb, 0x38eb, 0x38ea, 0x38ea, 0x38ea, 0x38e9, 0x38e9, + 0x38e9, 0x38e9, 0x38e8, 0x38e8, 0x38e8, 0x38e7, 0x38e7, 0x38e7, + 0x38e6, 0x38e6, 0x38e6, 0x38e5, 0x38e5, 0x38e5, 0x38e5, 0x38e4, + 0x38e4, 0x38e4, 0x38e3, 0x38e3, 0x38e3, 0x38e2, 0x38e2, 0x38e2, + 0x38e1, 0x38e1, 0x38e1, 0x38e1, 0x38e0, 0x38e0, 0x38e0, 0x38df, + 0x38df, 0x38df, 0x38de, 0x38de, 0x38de, 0x38de, 0x38dd, 0x38dd, + 0x38dd, 0x38dc, 0x38dc, 0x38dc, 0x38db, 0x38db, 0x38db, 0x38da, + 0x38da, 0x38da, 0x38d9, 0x38d8, 0x38d8, 0x38d7, 0x38d7, 0x38d6, + 0x38d5, 0x38d5, 0x38d4, 0x38d4, 0x38d3, 0x38d2, 0x38d2, 0x38d1, + 0x38d1, 0x38d0, 0x38cf, 0x38cf, 0x38ce, 0x38ce, 0x38cd, 0x38cc, + 0x38cc, 0x38cb, 0x38cb, 0x38ca, 0x38c9, 0x38c9, 0x38c8, 0x38c8, + 0x38c7, 0x38c6, 0x38c6, 0x38c5, 0x38c5, 0x38c4, 0x38c3, 0x38c3, + 0x38c2, 0x38c2, 0x38c1, 0x38c0, 0x38c0, 0x38bf, 0x38bf, 0x38be, + 0x38bd, 0x38bd, 0x38bc, 0x38bc, 0x38bb, 0x38ba, 0x38ba, 0x38b9, + 0x38b9, 0x38b8, 0x38b7, 0x38b7, 0x38b6, 0x38b6, 0x38b5, 0x38b5, + 0x38b4, 0x38b3, 0x38b3, 0x38b2, 0x38b2, 0x38b1, 0x38b0, 0x38b0, + 0x38af, 0x38af, 0x38ae, 0x38ae, 0x38ad, 0x38ac, 0x38ac, 0x38ab, + 0x38ab, 0x38aa, 0x38a9, 0x38a9, 0x38a8, 0x38a8, 0x38a7, 0x38a7, + 0x38a6, 0x38a5, 0x38a5, 0x38a4, 0x38a4, 0x38a3, 0x38a2, 0x38a2, + 0x38a1, 0x38a1, 0x38a0, 0x38a0, 0x389f, 0x389e, 0x389e, 0x389d, + 0x389d, 0x389c, 0x389c, 0x389b, 0x389a, 0x389a, 0x3899, 0x3899, + 0x3898, 0x3897, 0x3897, 0x3896, 0x3896, 0x3895, 0x3895, 0x3894, + 0x3893, 0x3893, 0x3892, 0x3892, 0x3891, 0x3891, 0x3890, 0x388f, + 0x388f, 0x388e, 0x388e, 0x388d, 0x388d, 0x388c, 0x388c, 0x388b, + 0x388a, 0x388a, 0x3889, 0x3889, 0x3888, 0x3888, 0x3887, 0x3886, + 0x3886, 0x3885, 0x3885, 0x3884, 0x3884, 0x3883, 0x3882, 0x3882, + 0x3881, 0x3881, 0x3880, 0x3880, 0x387f, 0x387f, 0x387e, 0x387d, + 0x387d, 0x387c, 0x387c, 0x387b, 0x387b, 0x387a, 0x3879, 0x3879, + 0x3878, 0x3878, 0x3877, 0x3877, 0x3876, 0x3876, 0x3875, 0x3874, + 0x3874, 0x3873, 0x3873, 0x3872, 0x3872, 0x3871, 0x3871, 0x3870, + 0x386f, 0x386f, 0x386e, 0x386e, 0x386d, 0x386d, 0x386c, 0x386c, + 0x386b, 0x386a, 0x386a, 0x3869, 0x3869, 0x3868, 0x3868, 0x3867, + 0x3867, 0x3866, 0x3866, 0x3865, 0x3864, 0x3864, 0x3863, 0x3863, + 0x3862, 0x3862, 0x3861, 0x3861, 0x3860, 0x385f, 0x385f, 0x385e, + 0x385e, 0x385d, 0x385d, 0x385c, 0x385c, 0x385b, 0x385b, 0x385a, + 0x3859, 0x3859, 0x3858, 0x3858, 0x3857, 0x3857, 0x3856, 0x3856, + 0x3855, 0x3855, 0x3854, 0x3854, 0x3853, 0x3852, 0x3852, 0x3851, + 0x3851, 0x3850, 0x3850, 0x384f, 0x384f, 0x384e, 0x384e, 0x384d, + 0x384d, 0x384c, 0x384b, 0x384b, 0x384a, 0x384a, 0x3849, 0x3849, + 0x3848, 0x3848, 0x3847, 0x3847, 0x3846, 0x3846, 0x3845, 0x3844, + 0x3844, 0x3843, 0x3843, 0x3842, 0x3842, 0x3841, 0x3841, 0x3840, + 0x3840, 0x383f, 0x383f, 0x383e, 0x383e, 0x383d, 0x383d, 0x383c, + 0x383b, 0x383b, 0x383a, 0x383a, 0x3839, 0x3839, 0x3838, 0x3838, + 0x3837, 0x3837, 0x3836, 0x3836, 0x3835, 0x3835, 0x3834, 0x3834, + 0x3833, 0x3832, 0x3832, 0x3831, 0x3831, 0x3830, 0x3830, 0x382f, + 0x382f, 0x382e, 0x382e, 0x382d, 0x382d, 0x382c, 0x382c, 0x382b, + 0x382b, 0x382a, 0x382a, 0x3829, 0x3829, 0x3828, 0x3828, 0x3827, + 0x3826, 0x3826, 0x3825, 0x3825, 0x3824, 0x3824, 0x3823, 0x3823, + 0x3822, 0x3822, 0x3821, 0x3821, 0x3820, 0x3820, 0x381f, 0x381f, + 0x381e, 0x381e, 0x381d, 0x381d, 0x381c, 0x381c, 0x381b, 0x381b, + 0x381a, 0x381a, 0x3819, 0x3819, 0x3818, 0x3818, 0x3817, 0x3817, + 0x3816, 0x3816, 0x3815, 0x3814, 0x3814, 0x3813, 0x3813, 0x3812, + 0x3812, 0x3811, 0x3811, 0x3810, 0x3810, 0x380f, 0x380f, 0x380e, + 0x380e, 0x380d, 0x380d, 0x380c, 0x380c, 0x380b, 0x380b, 0x380a, + 0x380a, 0x3809, 0x3809, 0x3808, 0x3808, 0x3807, 0x3807, 0x3806, + 0x3806, 0x3805, 0x3805, 0x3804, 0x3804, 0x3803, 0x3803, 0x3802, + 0x3802, 0x3801, 0x3801, 0x3800, 0x3800, 0x37ff, 0x37fe, 0x37fd, + 0x37fc, 0x37fb, 0x37fa, 0x37f9, 0x37f8, 0x37f7, 0x37f6, 0x37f5, + 0x37f4, 0x37f3, 0x37f2, 0x37f1, 0x37f0, 0x37ef, 0x37ee, 0x37ed, + 0x37ec, 0x37eb, 0x37ea, 0x37e9, 0x37e8, 0x37e7, 0x37e6, 0x37e5, + 0x37e4, 0x37e3, 0x37e2, 0x37e1, 0x37e0, 0x37df, 0x37de, 0x37dd, + 0x37dc, 0x37db, 0x37da, 0x37d9, 0x37d8, 0x37d7, 0x37d6, 0x37d5, + 0x37d4, 0x37d3, 0x37d2, 0x37d1, 0x37d0, 0x37cf, 0x37ce, 0x37cd, + 0x37cc, 0x37cb, 0x37ca, 0x37c9, 0x37c8, 0x37c7, 0x37c6, 0x37c5, + 0x37c4, 0x37c3, 0x37c3, 0x37c2, 0x37c1, 0x37c0, 0x37bf, 0x37be, + 0x37bd, 0x37bc, 0x37bb, 0x37ba, 0x37b9, 0x37b8, 0x37b7, 0x37b6, + 0x37b5, 0x37b4, 0x37b3, 0x37b2, 0x37b1, 0x37b0, 0x37af, 0x37ae, + 0x37ad, 0x37ac, 0x37ab, 0x37aa, 0x37a9, 0x37a8, 0x37a8, 0x37a7, + 0x37a6, 0x37a5, 0x37a4, 0x37a3, 0x37a2, 0x37a1, 0x37a0, 0x379f, + 0x379e, 0x379d, 0x379c, 0x379b, 0x379a, 0x3799, 0x3798, 0x3797, + 0x3796, 0x3795, 0x3794, 0x3794, 0x3793, 0x3792, 0x3791, 0x3790, + 0x378f, 0x378e, 0x378d, 0x378c, 0x378b, 0x378a, 0x3789, 0x3788, + 0x3787, 0x3786, 0x3785, 0x3784, 0x3784, 0x3783, 0x3782, 0x3781, + 0x3780, 0x377f, 0x377e, 0x377d, 0x377c, 0x377b, 0x377a, 0x3779, + 0x3778, 0x3777, 0x3776, 0x3775, 0x3775, 0x3774, 0x3773, 0x3772, + 0x3771, 0x3770, 0x376f, 0x376e, 0x376d, 0x376c, 0x376b, 0x376a, + 0x3769, 0x3768, 0x3768, 0x3767, 0x3766, 0x3765, 0x3764, 0x3763, + 0x3762, 0x3761, 0x3760, 0x375f, 0x375e, 0x375d, 0x375c, 0x375c, + 0x375b, 0x375a, 0x3759, 0x3758, 0x3757, 0x3756, 0x3755, 0x3754, + 0x3753, 0x3752, 0x3751, 0x3751, 0x3750, 0x374f, 0x374e, 0x374d, + 0x374c, 0x374b, 0x374a, 0x3749, 0x3748, 0x3747, 0x3747, 0x3746, + 0x3745, 0x3744, 0x3743, 0x3742, 0x3741, 0x3740, 0x373f, 0x373e, + 0x373d, 0x373d, 0x373c, 0x373b, 0x373a, 0x3739, 0x3738, 0x3737, + 0x3736, 0x3735, 0x3734, 0x3734, 0x3733, 0x3732, 0x3731, 0x3730, + 0x372f, 0x372e, 0x372d, 0x372c, 0x372b, 0x372b, 0x372a, 0x3729, + 0x3728, 0x3727, 0x3726, 0x3725, 0x3724, 0x3723, 0x3722, 0x3722, + 0x3721, 0x3720, 0x371f, 0x371e, 0x371d, 0x371c, 0x371b, 0x371a, + 0x371a, 0x3719, 0x3718, 0x3717, 0x3716, 0x3715, 0x3714, 0x3713, + 0x3713, 0x3712, 0x3711, 0x3710, 0x370f, 0x370e, 0x370d, 0x370c, + 0x370b, 0x370b, 0x370a, 0x3709, 0x3708, 0x3707, 0x3706, 0x3705, + 0x3704, 0x3704, 0x3703, 0x3702, 0x3701, 0x3700, 0x36ff, 0x36fe, + 0x36fd, 0x36fd, 0x36fc, 0x36fb, 0x36fa, 0x36f9, 0x36f8, 0x36f7, + 0x36f6, 0x36f6, 0x36f5, 0x36f4, 0x36f3, 0x36f2, 0x36f1, 0x36f0, + 0x36ef, 0x36ef, 0x36ee, 0x36ed, 0x36ec, 0x36eb, 0x36ea, 0x36e9, + 0x36e9, 0x36e8, 0x36e7, 0x36e6, 0x36e5, 0x36e4, 0x36e3, 0x36e3, + 0x36e2, 0x36e1, 0x36e0, 0x36df, 0x36de, 0x36dd, 0x36dd, 0x36dc, + 0x36db, 0x36da, 0x36d9, 0x36d8, 0x36d7, 0x36d7, 0x36d6, 0x36d5, + 0x36d4, 0x36d3, 0x36d2, 0x36d1, 0x36d1, 0x36d0, 0x36cf, 0x36ce, + 0x36cd, 0x36cc, 0x36cb, 0x36cb, 0x36ca, 0x36c9, 0x36c8, 0x36c7, + 0x36c6, 0x36c6, 0x36c5, 0x36c4, 0x36c3, 0x36c2, 0x36c1, 0x36c0, + 0x36c0, 0x36bf, 0x36be, 0x36bd, 0x36bc, 0x36bb, 0x36bb, 0x36ba, + 0x36b9, 0x36b8, 0x36b7, 0x36b6, 0x36b6, 0x36b5, 0x36b4, 0x36b3, + 0x36b2, 0x36b1, 0x36b0, 0x36b0, 0x36af, 0x36ae, 0x36ad, 0x36ac, + 0x36ab, 0x36ab, 0x36aa, 0x36a9, 0x36a8, 0x36a7, 0x36a6, 0x36a6, + 0x36a5, 0x36a4, 0x36a3, 0x36a2, 0x36a1, 0x36a1, 0x36a0, 0x369f, + 0x369e, 0x369d, 0x369d, 0x369c, 0x369b, 0x369a, 0x3699, 0x3698, + 0x3698, 0x3697, 0x3696, 0x3695, 0x3694, 0x3693, 0x3693, 0x3692, + 0x3691, 0x3690, 0x368f, 0x368f, 0x368e, 0x368d, 0x368c, 0x368b, + 0x368a, 0x368a, 0x3689, 0x3688, 0x3687, 0x3686, 0x3686, 0x3685, + 0x3684, 0x3683, 0x3682, 0x3681, 0x3681, 0x3680, 0x367f, 0x367e, + 0x367d, 0x367d, 0x367c, 0x367b, 0x367a, 0x3679, 0x3679, 0x3678, + 0x3677, 0x3676, 0x3675, 0x3675, 0x3674, 0x3673, 0x3672, 0x3671, + 0x3670, 0x3670, 0x366f, 0x366e, 0x366d, 0x366c, 0x366c, 0x366b, + 0x366a, 0x3669, 0x3668, 0x3668, 0x3667, 0x3666, 0x3665, 0x3664, + 0x3664, 0x3663, 0x3662, 0x3661, 0x3660, 0x3660, 0x365f, 0x365e, + 0x365d, 0x365c, 0x365c, 0x365b, 0x365a, 0x3659, 0x3659, 0x3658, + 0x3657, 0x3656, 0x3655, 0x3655, 0x3654, 0x3653, 0x3652, 0x3651, + 0x3651, 0x3650, 0x364f, 0x364e, 0x364d, 0x364d, 0x364c, 0x364b, + 0x364a, 0x364a, 0x3649, 0x3648, 0x3647, 0x3646, 0x3646, 0x3645, + 0x3644, 0x3643, 0x3642, 0x3642, 0x3641, 0x3640, 0x363f, 0x363f, + 0x363e, 0x363d, 0x363c, 0x363b, 0x363b, 0x363a, 0x3639, 0x3638, + 0x3638, 0x3637, 0x3636, 0x3635, 0x3634, 0x3634, 0x3633, 0x3632, + 0x3631, 0x3631, 0x3630, 0x362f, 0x362e, 0x362d, 0x362d, 0x362c, + 0x362b, 0x362a, 0x362a, 0x3629, 0x3628, 0x3627, 0x3627, 0x3626, + 0x3625, 0x3624, 0x3623, 0x3623, 0x3622, 0x3621, 0x3620, 0x3620, + 0x361f, 0x361e, 0x361d, 0x361d, 0x361c, 0x361b, 0x361a, 0x361a, + 0x3619, 0x3618, 0x3617, 0x3616, 0x3616, 0x3615, 0x3614, 0x3613, + 0x3613, 0x3612, 0x3611, 0x3610, 0x3610, 0x360f, 0x360e, 0x360d, + 0x360d, 0x360c, 0x360b, 0x360a, 0x360a, 0x3609, 0x3608, 0x3607, + 0x3607, 0x3606, 0x3605, 0x3604, 0x3604, 0x3603, 0x3602, 0x3601, + 0x3601, 0x3600, 0x35ff, 0x35fe, 0x35fe, 0x35fd, 0x35fc, 0x35fb, + 0x35fb, 0x35fa, 0x35f9, 0x35f8, 0x35f8, 0x35f7, 0x35f6, 0x35f5, + 0x35f5, 0x35f4, 0x35f3, 0x35f2, 0x35f2, 0x35f1, 0x35f0, 0x35ef, + 0x35ef, 0x35ee, 0x35ed, 0x35ec, 0x35ec, 0x35eb, 0x35ea, 0x35e9, + 0x35e9, 0x35e8, 0x35e7, 0x35e7, 0x35e6, 0x35e5, 0x35e4, 0x35e4, + 0x35e3, 0x35e1, 0x35e0, 0x35de, 0x35dd, 0x35db, 0x35da, 0x35d9, + 0x35d7, 0x35d6, 0x35d4, 0x35d3, 0x35d1, 0x35d0, 0x35ce, 0x35cd, + 0x35cb, 0x35ca, 0x35c9, 0x35c7, 0x35c6, 0x35c4, 0x35c3, 0x35c1, + 0x35c0, 0x35be, 0x35bd, 0x35bc, 0x35ba, 0x35b9, 0x35b7, 0x35b6, + 0x35b4, 0x35b3, 0x35b2, 0x35b0, 0x35af, 0x35ad, 0x35ac, 0x35ab, + 0x35a9, 0x35a8, 0x35a6, 0x35a5, 0x35a3, 0x35a2, 0x35a1, 0x359f, + 0x359e, 0x359c, 0x359b, 0x359a, 0x3598, 0x3597, 0x3595, 0x3594, + 0x3593, 0x3591, 0x3590, 0x358e, 0x358d, 0x358c, 0x358a, 0x3589, + 0x3588, 0x3586, 0x3585, 0x3583, 0x3582, 0x3581, 0x357f, 0x357e, + 0x357d, 0x357b, 0x357a, 0x3578, 0x3577, 0x3576, 0x3574, 0x3573, + 0x3572, 0x3570, 0x356f, 0x356e, 0x356c, 0x356b, 0x3569, 0x3568, + 0x3567, 0x3565, 0x3564, 0x3563, 0x3561, 0x3560, 0x355f, 0x355d, + 0x355c, 0x355b, 0x3559, 0x3558, 0x3557, 0x3555, 0x3554, 0x3553, + 0x3551, 0x3550, 0x354f, 0x354d, 0x354c, 0x354b, 0x3549, 0x3548, + 0x3547, 0x3545, 0x3544, 0x3543, 0x3541, 0x3540, 0x353f, 0x353e, + 0x353c, 0x353b, 0x353a, 0x3538, 0x3537, 0x3536, 0x3534, 0x3533, + 0x3532, 0x3530, 0x352f, 0x352e, 0x352d, 0x352b, 0x352a, 0x3529, + 0x3527, 0x3526, 0x3525, 0x3524, 0x3522, 0x3521, 0x3520, 0x351e, + 0x351d, 0x351c, 0x351b, 0x3519, 0x3518, 0x3517, 0x3516, 0x3514, + 0x3513, 0x3512, 0x3510, 0x350f, 0x350e, 0x350d, 0x350b, 0x350a, + 0x3509, 0x3508, 0x3506, 0x3505, 0x3504, 0x3503, 0x3501, 0x3500, + 0x34ff, 0x34fe, 0x34fc, 0x34fb, 0x34fa, 0x34f9, 0x34f7, 0x34f6, + 0x34f5, 0x34f4, 0x34f2, 0x34f1, 0x34f0, 0x34ef, 0x34ed, 0x34ec, + 0x34eb, 0x34ea, 0x34e9, 0x34e7, 0x34e6, 0x34e5, 0x34e4, 0x34e2, + 0x34e1, 0x34e0, 0x34df, 0x34de, 0x34dc, 0x34db, 0x34da, 0x34d9, + 0x34d7, 0x34d6, 0x34d5, 0x34d4, 0x34d3, 0x34d1, 0x34d0, 0x34cf, + 0x34ce, 0x34cd, 0x34cb, 0x34ca, 0x34c9, 0x34c8, 0x34c7, 0x34c5, + 0x34c4, 0x34c3, 0x34c2, 0x34c1, 0x34c0, 0x34be, 0x34bd, 0x34bc, + 0x34bb, 0x34ba, 0x34b8, 0x34b7, 0x34b6, 0x34b5, 0x34b4, 0x34b3, + 0x34b1, 0x34b0, 0x34af, 0x34ae, 0x34ad, 0x34ac, 0x34aa, 0x34a9, + 0x34a8, 0x34a7, 0x34a6, 0x34a5, 0x34a3, 0x34a2, 0x34a1, 0x34a0, + 0x349f, 0x349e, 0x349c, 0x349b, 0x349a, 0x3499, 0x3498, 0x3497, + 0x3496, 0x3494, 0x3493, 0x3492, 0x3491, 0x3490, 0x348f, 0x348e, + 0x348c, 0x348b, 0x348a, 0x3489, 0x3488, 0x3487, 0x3486, 0x3484, + 0x3483, 0x3482, 0x3481, 0x3480, 0x347f, 0x347e, 0x347d, 0x347b, + 0x347a, 0x3479, 0x3478, 0x3477, 0x3476, 0x3475, 0x3474, 0x3473, + 0x3471, 0x3470, 0x346f, 0x346e, 0x346d, 0x346c, 0x346b, 0x346a, + 0x3469, 0x3467, 0x3466, 0x3465, 0x3464, 0x3463, 0x3462, 0x3461, + 0x3460, 0x345f, 0x345e, 0x345d, 0x345b, 0x345a, 0x3459, 0x3458, + 0x3457, 0x3456, 0x3455, 0x3454, 0x3453, 0x3452, 0x3451, 0x3450, + 0x344e, 0x344d, 0x344c, 0x344b, 0x344a, 0x3449, 0x3448, 0x3447, + 0x3446, 0x3445, 0x3444, 0x3443, 0x3442, 0x3441, 0x343f, 0x343e, + 0x343d, 0x343c, 0x343b, 0x343a, 0x3439, 0x3438, 0x3437, 0x3436, + 0x3435, 0x3434, 0x3433, 0x3432, 0x3431, 0x3430, 0x342f, 0x342e, + 0x342d, 0x342b, 0x342a, 0x3429, 0x3428, 0x3427, 0x3426, 0x3425, + 0x3424, 0x3423, 0x3422, 0x3421, 0x3420, 0x341f, 0x341e, 0x341d, + 0x341c, 0x341b, 0x341a, 0x3419, 0x3418, 0x3417, 0x3416, 0x3415, + 0x3414, 0x3413, 0x3412, 0x3411, 0x3410, 0x340f, 0x340e, 0x340d, + 0x340c, 0x340b, 0x340a, 0x3409, 0x3408, 0x3407, 0x3406, 0x3405, + 0x3404, 0x3403, 0x3402, 0x3401, 0x33ff, 0x33fd, 0x33fb, 0x33f9, + 0x33f7, 0x33f5, 0x33f3, 0x33f1, 0x33ef, 0x33ed, 0x33eb, 0x33e9, + 0x33e7, 0x33e5, 0x33e3, 0x33e1, 0x33df, 0x33dd, 0x33db, 0x33d9, + 0x33d8, 0x33d6, 0x33d4, 0x33d2, 0x33d0, 0x33ce, 0x33cc, 0x33ca, + 0x33c8, 0x33c6, 0x33c4, 0x33c2, 0x33c0, 0x33be, 0x33bc, 0x33ba, + 0x33b8, 0x33b6, 0x33b5, 0x33b3, 0x33b1, 0x33af, 0x33ad, 0x33ab, + 0x33a9, 0x33a7, 0x33a5, 0x33a3, 0x33a1, 0x339f, 0x339e, 0x339c, + 0x339a, 0x3398, 0x3396, 0x3394, 0x3392, 0x3390, 0x338e, 0x338d, + 0x338b, 0x3389, 0x3387, 0x3385, 0x3383, 0x3381, 0x337f, 0x337d, + 0x337c, 0x337a, 0x3378, 0x3376, 0x3374, 0x3372, 0x3370, 0x336f, + 0x336d, 0x336b, 0x3369, 0x3367, 0x3365, 0x3363, 0x3362, 0x3360, + 0x335e, 0x335c, 0x335a, 0x3358, 0x3357, 0x3355, 0x3353, 0x3351, + 0x334f, 0x334d, 0x334c, 0x334a, 0x3348, 0x3346, 0x3344, 0x3342, + 0x3341, 0x333f, 0x333d, 0x333b, 0x3339, 0x3338, 0x3336, 0x3334, + 0x3332, 0x3330, 0x332f, 0x332d, 0x332b, 0x3329, 0x3327, 0x3326, + 0x3324, 0x3322, 0x3320, 0x331f, 0x331d, 0x331b, 0x3319, 0x3317, + 0x3316, 0x3314, 0x3312, 0x3310, 0x330f, 0x330d, 0x330b, 0x3309, + 0x3308, 0x3306, 0x3304, 0x3302, 0x3301, 0x32ff, 0x32fd, 0x32fb, + 0x32fa, 0x32f8, 0x32f6, 0x32f4, 0x32f3, 0x32f1, 0x32ef, 0x32ed, + 0x32ec, 0x32ea, 0x32e8, 0x32e6, 0x32e5, 0x32e3, 0x32e1, 0x32e0, + 0x32de, 0x32dc, 0x32da, 0x32d9, 0x32d7, 0x32d5, 0x32d4, 0x32d2, + 0x32d0, 0x32ce, 0x32cd, 0x32cb, 0x32c9, 0x32c8, 0x32c6, 0x32c4, + 0x32c3, 0x32c1, 0x32bf, 0x32be, 0x32bc, 0x32ba, 0x32b8, 0x32b7, + 0x32b5, 0x32b3, 0x32b2, 0x32b0, 0x32ae, 0x32ad, 0x32ab, 0x32a9, + 0x32a8, 0x32a6, 0x32a4, 0x32a3, 0x32a1, 0x329f, 0x329e, 0x329c, + 0x329b, 0x3299, 0x3297, 0x3296, 0x3294, 0x3292, 0x3291, 0x328f, + 0x328d, 0x328c, 0x328a, 0x3288, 0x3287, 0x3285, 0x3284, 0x3282, + 0x3280, 0x327f, 0x327d, 0x327b, 0x327a, 0x3278, 0x3277, 0x3275, + 0x3273, 0x3272, 0x3270, 0x326f, 0x326d, 0x326b, 0x326a, 0x3268, + 0x3267, 0x3265, 0x3263, 0x3262, 0x3260, 0x325f, 0x325d, 0x325b, + 0x325a, 0x3258, 0x3257, 0x3255, 0x3253, 0x3252, 0x3250, 0x324f, + 0x324d, 0x324c, 0x324a, 0x3248, 0x3247, 0x3245, 0x3244, 0x3242, + 0x3241, 0x323f, 0x323d, 0x323c, 0x323a, 0x3239, 0x3237, 0x3236, + 0x3234, 0x3233, 0x3231, 0x322f, 0x322e, 0x322c, 0x322b, 0x3229, + 0x3228, 0x3226, 0x3225, 0x3223, 0x3222, 0x3220, 0x321f, 0x321d, + 0x321b, 0x321a, 0x3218, 0x3217, 0x3215, 0x3214, 0x3212, 0x3211, + 0x320f, 0x320e, 0x320c, 0x320b, 0x3209, 0x3208, 0x3206, 0x3205, + 0x3203, 0x3202, 0x3200, 0x31ff, 0x31fd, 0x31fc, 0x31fa, 0x31f9, + 0x31f7, 0x31f6, 0x31f4, 0x31f3, 0x31f1, 0x31f0, 0x31ee, 0x31ed, + 0x31eb, 0x31ea, 0x31e8, 0x31e7, 0x31e5, 0x31e4, 0x31e3, 0x31e1, + 0x31e0, 0x31de, 0x31dd, 0x31db, 0x31da, 0x31d8, 0x31d7, 0x31d5, + 0x31d4, 0x31d2, 0x31d1, 0x31d0, 0x31ce, 0x31cd, 0x31cb, 0x31ca, + 0x31c8, 0x31c7, 0x31c5, 0x31c4, 0x31c2, 0x31c1, 0x31c0, 0x31be, + 0x31bd, 0x31bb, 0x31ba, 0x31b8, 0x31b7, 0x31b6, 0x31b4, 0x31b3, + 0x31b1, 0x31b0, 0x31ae, 0x31ad, 0x31ac, 0x31aa, 0x31a9, 0x31a7, + 0x31a6, 0x31a5, 0x31a3, 0x31a2, 0x31a0, 0x319f, 0x319e, 0x319c, + 0x319b, 0x3199, 0x3198, 0x3197, 0x3195, 0x3194, 0x3192, 0x3191, + 0x3190, 0x318e, 0x318d, 0x318b, 0x318a, 0x3189, 0x3187, 0x3186, + 0x3184, 0x3183, 0x3182, 0x3180, 0x317f, 0x317e, 0x317c, 0x317b, + 0x3179, 0x3178, 0x3177, 0x3175, 0x3174, 0x3173, 0x3171, 0x3170, + 0x316f, 0x316d, 0x316c, 0x316b, 0x3169, 0x3168, 0x3166, 0x3165, + 0x3164, 0x3162, 0x3161, 0x3160, 0x315e, 0x315d, 0x315c, 0x315a, + 0x3159, 0x3158, 0x3156, 0x3155, 0x3154, 0x3152, 0x3151, 0x3150, + 0x314e, 0x314d, 0x314c, 0x314a, 0x3149, 0x3148, 0x3146, 0x3145, + 0x3144, 0x3142, 0x3141, 0x3140, 0x313f, 0x313d, 0x313c, 0x313b, + 0x3139, 0x3138, 0x3137, 0x3135, 0x3134, 0x3133, 0x3131, 0x3130, + 0x312f, 0x312e, 0x312c, 0x312b, 0x312a, 0x3128, 0x3127, 0x3126, + 0x3125, 0x3123, 0x3122, 0x3121, 0x311f, 0x311e, 0x311d, 0x311c, + 0x311a, 0x3119, 0x3118, 0x3117, 0x3115, 0x3114, 0x3113, 0x3111, + 0x3110, 0x310f, 0x310e, 0x310c, 0x310b, 0x310a, 0x3109, 0x3107, + 0x3106, 0x3105, 0x3104, 0x3102, 0x3101, 0x3100, 0x30ff, 0x30fd, + 0x30fc, 0x30fb, 0x30fa, 0x30f8, 0x30f7, 0x30f6, 0x30f5, 0x30f3, + 0x30f2, 0x30f1, 0x30f0, 0x30ee, 0x30ed, 0x30ec, 0x30eb, 0x30ea, + 0x30e8, 0x30e7, 0x30e6, 0x30e5, 0x30e3, 0x30e2, 0x30e1, 0x30e0, + 0x30df, 0x30dd, 0x30dc, 0x30db, 0x30da, 0x30d8, 0x30d7, 0x30d6, + 0x30d5, 0x30d4, 0x30d2, 0x30d1, 0x30d0, 0x30cf, 0x30ce, 0x30cc, + 0x30cb, 0x30ca, 0x30c9, 0x30c8, 0x30c6, 0x30c5, 0x30c4, 0x30c3, + 0x30c2, 0x30c0, 0x30bf, 0x30be, 0x30bd, 0x30bc, 0x30bb, 0x30b9, + 0x30b8, 0x30b7, 0x30b6, 0x30b5, 0x30b3, 0x30b2, 0x30b1, 0x30b0, + 0x30af, 0x30ae, 0x30ac, 0x30ab, 0x30aa, 0x30a9, 0x30a8, 0x30a7, + 0x30a5, 0x30a4, 0x30a3, 0x30a2, 0x30a1, 0x30a0, 0x309e, 0x309d, + 0x309c, 0x309b, 0x309a, 0x3099, 0x3098, 0x3096, 0x3095, 0x3094, + 0x3093, 0x3092, 0x3091, 0x3090, 0x308e, 0x308d, 0x308c, 0x308b, + 0x308a, 0x3089, 0x3088, 0x3086, 0x3085, 0x3084, 0x3083, 0x3082, + 0x3081, 0x3080, 0x307f, 0x307d, 0x307c, 0x307b, 0x307a, 0x3079, + 0x3078, 0x3077, 0x3076, 0x3075, 0x3073, 0x3072, 0x3071, 0x3070, + 0x306f, 0x306e, 0x306d, 0x306c, 0x306b, 0x3069, 0x3068, 0x3067, + 0x3066, 0x3065, 0x3064, 0x3063, 0x3062, 0x3061, 0x3060, 0x305e, + 0x305d, 0x305c, 0x305b, 0x305a, 0x3059, 0x3058, 0x3057, 0x3056, + 0x3055, 0x3053, 0x3050, 0x304e, 0x304c, 0x304a, 0x3048, 0x3046, + 0x3043, 0x3041, 0x303f, 0x303d, 0x303b, 0x3039, 0x3037, 0x3035, + 0x3033, 0x3030, 0x302e, 0x302c, 0x302a, 0x3028, 0x3026, 0x3024, + 0x3022, 0x3020, 0x301e, 0x301c, 0x301a, 0x3018, 0x3016, 0x3014, + 0x3011, 0x300f, 0x300d, 0x300b, 0x3009, 0x3007, 0x3005, 0x3003, + 0x3001, 0x2fff, 0x2ffb, 0x2ff7, 0x2ff3, 0x2fef, 0x2feb, 0x2fe7, + 0x2fe3, 0x2fdf, 0x2fdb, 0x2fd7, 0x2fd3, 0x2fcf, 0x2fcb, 0x2fc7, + 0x2fc4, 0x2fc0, 0x2fbc, 0x2fb8, 0x2fb4, 0x2fb0, 0x2fac, 0x2fa9, + 0x2fa5, 0x2fa1, 0x2f9d, 0x2f99, 0x2f96, 0x2f92, 0x2f8e, 0x2f8a, + 0x2f86, 0x2f83, 0x2f7f, 0x2f7b, 0x2f77, 0x2f74, 0x2f70, 0x2f6c, + 0x2f69, 0x2f65, 0x2f61, 0x2f5e, 0x2f5a, 0x2f56, 0x2f52, 0x2f4f, + 0x2f4b, 0x2f48, 0x2f44, 0x2f40, 0x2f3d, 0x2f39, 0x2f35, 0x2f32, + 0x2f2e, 0x2f2b, 0x2f27, 0x2f23, 0x2f20, 0x2f1c, 0x2f19, 0x2f15, + 0x2f12, 0x2f0e, 0x2f0b, 0x2f07, 0x2f04, 0x2f00, 0x2efd, 0x2ef9, + 0x2ef6, 0x2ef2, 0x2eef, 0x2eeb, 0x2ee8, 0x2ee4, 0x2ee1, 0x2edd, + 0x2eda, 0x2ed7, 0x2ed3, 0x2ed0, 0x2ecc, 0x2ec9, 0x2ec6, 0x2ec2, + 0x2ebf, 0x2ebb, 0x2eb8, 0x2eb5, 0x2eb1, 0x2eae, 0x2eab, 0x2ea7, + 0x2ea4, 0x2ea1, 0x2e9d, 0x2e9a, 0x2e97, 0x2e94, 0x2e90, 0x2e8d, + 0x2e8a, 0x2e86, 0x2e83, 0x2e80, 0x2e7d, 0x2e79, 0x2e76, 0x2e73, + 0x2e70, 0x2e6d, 0x2e69, 0x2e66, 0x2e63, 0x2e60, 0x2e5d, 0x2e59, + 0x2e56, 0x2e53, 0x2e50, 0x2e4d, 0x2e4a, 0x2e46, 0x2e43, 0x2e40, + 0x2e3d, 0x2e3a, 0x2e37, 0x2e34, 0x2e31, 0x2e2e, 0x2e2a, 0x2e27, + 0x2e24, 0x2e21, 0x2e1e, 0x2e1b, 0x2e18, 0x2e15, 0x2e12, 0x2e0f, + 0x2e0c, 0x2e09, 0x2e06, 0x2e03, 0x2e00, 0x2dfd, 0x2dfa, 0x2df7, + 0x2df4, 0x2df1, 0x2dee, 0x2deb, 0x2de8, 0x2de5, 0x2de2, 0x2ddf, + 0x2ddc, 0x2dd9, 0x2dd6, 0x2dd4, 0x2dd1, 0x2dce, 0x2dcb, 0x2dc8, + 0x2dc5, 0x2dc2, 0x2dbf, 0x2dbc, 0x2dba, 0x2db7, 0x2db4, 0x2db1, + 0x2dae, 0x2dab, 0x2da8, 0x2da6, 0x2da3, 0x2da0, 0x2d9d, 0x2d9a, + 0x2d98, 0x2d95, 0x2d92, 0x2d8f, 0x2d8c, 0x2d8a, 0x2d87, 0x2d84, + 0x2d81, 0x2d7f, 0x2d7c, 0x2d79, 0x2d76, 0x2d74, 0x2d71, 0x2d6e, + 0x2d6c, 0x2d69, 0x2d66, 0x2d63, 0x2d61, 0x2d5e, 0x2d5b, 0x2d59, + 0x2d56, 0x2d53, 0x2d51, 0x2d4e, 0x2d4b, 0x2d49, 0x2d46, 0x2d44, + 0x2d41, 0x2d3e, 0x2d3c, 0x2d39, 0x2d36, 0x2d34, 0x2d31, 0x2d2f, + 0x2d2c, 0x2d29, 0x2d27, 0x2d24, 0x2d22, 0x2d1f, 0x2d1d, 0x2d1a, + 0x2d18, 0x2d15, 0x2d12, 0x2d10, 0x2d0d, 0x2d0b, 0x2d08, 0x2d06, + 0x2d03, 0x2d01, 0x2cfe, 0x2cfc, 0x2cf9, 0x2cf7, 0x2cf4, 0x2cf2, + 0x2cef, 0x2ced, 0x2cea, 0x2ce8, 0x2ce6, 0x2ce3, 0x2ce1, 0x2cde, + 0x2cdc, 0x2cd9, 0x2cd7, 0x2cd5, 0x2cd2, 0x2cd0, 0x2ccd, 0x2ccb, + 0x2cc9, 0x2cc6, 0x2cc4, 0x2cc1, 0x2cbf, 0x2cbd, 0x2cba, 0x2cb8, + 0x2cb6, 0x2cb3, 0x2cb1, 0x2caf, 0x2cac, 0x2caa, 0x2ca7, 0x2ca5, + 0x2ca3, 0x2ca1, 0x2c9e, 0x2c9c, 0x2c9a, 0x2c97, 0x2c95, 0x2c93, + 0x2c90, 0x2c8e, 0x2c8c, 0x2c8a, 0x2c87, 0x2c85, 0x2c83, 0x2c81, + 0x2c7e, 0x2c7c, 0x2c7a, 0x2c78, 0x2c75, 0x2c73, 0x2c71, 0x2c6f, + 0x2c6d, 0x2c6a, 0x2c68, 0x2c66, 0x2c64, 0x2c61, 0x2c5f, 0x2c5d, + 0x2c5b, 0x2c59, 0x2c57, 0x2c54, 0x2c52, 0x2c50, 0x2c4e, 0x2c4c, + 0x2c4a, 0x2c48, 0x2c45, 0x2c43, 0x2c41, 0x2c3f, 0x2c3d, 0x2c3b, + 0x2c39, 0x2c37, 0x2c34, 0x2c32, 0x2c30, 0x2c2e, 0x2c2c, 0x2c2a, + 0x2c28, 0x2c26, 0x2c24, 0x2c22, 0x2c20, 0x2c1e, 0x2c1b, 0x2c19, + 0x2c17, 0x2c15, 0x2c13, 0x2c11, 0x2c0f, 0x2c0d, 0x2c0b, 0x2c09, + 0x2c07, 0x2c05, 0x2c03, 0x2c01, 0x2bfe, 0x2bfa, 0x2bf6, 0x2bf2, + 0x2bee, 0x2bea, 0x2be6, 0x2be2, 0x2bdf, 0x2bdb, 0x2bd7, 0x2bd3, + 0x2bcf, 0x2bcb, 0x2bc7, 0x2bc3, 0x2bbf, 0x2bbb, 0x2bb8, 0x2bb4, + 0x2bb0, 0x2bac, 0x2ba8, 0x2ba4, 0x2ba1, 0x2b9d, 0x2b99, 0x2b95, + 0x2b91, 0x2b8e, 0x2b8a, 0x2b86, 0x2b82, 0x2b7f, 0x2b7b, 0x2b77, + 0x2b73, 0x2b70, 0x2b6c, 0x2b68, 0x2b64, 0x2b61, 0x2b5d, 0x2b59, + 0x2b56, 0x2b52, 0x2b4e, 0x2b4b, 0x2b47, 0x2b44, 0x2b40, 0x2b3c, + 0x2b39, 0x2b35, 0x2b31, 0x2b2e, 0x2b2a, 0x2b27, 0x2b23, 0x2b20, + 0x2b1c, 0x2b18, 0x2b15, 0x2b11, 0x2b0e, 0x2b0a, 0x2b07, 0x2b03, + 0x2b00, 0x2afc, 0x2af9, 0x2af5, 0x2af2, 0x2aee, 0x2aeb, 0x2ae7, + 0x2ae4, 0x2ae1, 0x2add, 0x2ada, 0x2ad6, 0x2ad3, 0x2acf, 0x2acc, + 0x2ac9, 0x2ac5, 0x2ac2, 0x2abe, 0x2abb, 0x2ab8, 0x2ab4, 0x2ab1, + 0x2aae, 0x2aaa, 0x2aa7, 0x2aa4, 0x2aa0, 0x2a9d, 0x2a9a, 0x2a97, + 0x2a93, 0x2a90, 0x2a8d, 0x2a89, 0x2a86, 0x2a83, 0x2a80, 0x2a7c, + 0x2a79, 0x2a76, 0x2a73, 0x2a6f, 0x2a6c, 0x2a69, 0x2a66, 0x2a63, + 0x2a5f, 0x2a5c, 0x2a59, 0x2a56, 0x2a53, 0x2a50, 0x2a4c, 0x2a49, + 0x2a46, 0x2a43, 0x2a40, 0x2a3d, 0x2a3a, 0x2a37, 0x2a33, 0x2a30, + 0x2a2d, 0x2a2a, 0x2a27, 0x2a24, 0x2a21, 0x2a1e, 0x2a1b, 0x2a18, + 0x2a15, 0x2a12, 0x2a0f, 0x2a0c, 0x2a09, 0x2a06, 0x2a03, 0x2a00, + 0x29fd, 0x29fa, 0x29f7, 0x29f4, 0x29f1, 0x29ee, 0x29eb, 0x29e8, + 0x29e5, 0x29e2, 0x29df, 0x29dc, 0x29d9, 0x29d6, 0x29d3, 0x29d0, + 0x29cd, 0x29cb, 0x29c8, 0x29c5, 0x29c2, 0x29bf, 0x29bc, 0x29b9, + 0x29b6, 0x29b4, 0x29b1, 0x29ae, 0x29ab, 0x29a8, 0x29a5, 0x29a3, + 0x29a0, 0x299d, 0x299a, 0x2997, 0x2995, 0x2992, 0x298f, 0x298c, + 0x2989, 0x2987, 0x2984, 0x2981, 0x297e, 0x297c, 0x2979, 0x2976, + 0x2973, 0x2971, 0x296e, 0x296b, 0x2969, 0x2966, 0x2963, 0x2960, + 0x295e, 0x295b, 0x2958, 0x2956, 0x2953, 0x2950, 0x294e, 0x294b, + 0x2948, 0x2946, 0x2943, 0x2941, 0x293e, 0x293b, 0x2939, 0x2936, + 0x2934, 0x2931, 0x292e, 0x292c, 0x2929, 0x2927, 0x2924, 0x2921, + 0x291f, 0x291c, 0x291a, 0x2917, 0x2915, 0x2912, 0x2910, 0x290d, + 0x290b, 0x2908, 0x2906, 0x2903, 0x2901, 0x28fe, 0x28fc, 0x28f9, + 0x28f7, 0x28f4, 0x28f2, 0x28ef, 0x28ed, 0x28ea, 0x28e8, 0x28e5, + 0x28e3, 0x28e0, 0x28de, 0x28dc, 0x28d9, 0x28d7, 0x28d4, 0x28d2, + 0x28cf, 0x28cd, 0x28cb, 0x28c8, 0x28c6, 0x28c3, 0x28c1, 0x28bf, + 0x28bc, 0x28ba, 0x28b8, 0x28b5, 0x28b3, 0x28b1, 0x28ae, 0x28ac, + 0x28aa, 0x28a7, 0x28a5, 0x28a3, 0x28a0, 0x289e, 0x289c, 0x2899, + 0x2897, 0x2895, 0x2892, 0x2890, 0x288e, 0x288c, 0x2889, 0x2887, + 0x2885, 0x2883, 0x2880, 0x287e, 0x287c, 0x287a, 0x2877, 0x2875, + 0x2873, 0x2871, 0x286e, 0x286c, 0x286a, 0x2868, 0x2866, 0x2863, + 0x2861, 0x285f, 0x285d, 0x285b, 0x2859, 0x2856, 0x2854, 0x2852, + 0x2850, 0x284e, 0x284c, 0x2849, 0x2847, 0x2845, 0x2843, 0x2841, + 0x283f, 0x283d, 0x283b, 0x2838, 0x2836, 0x2834, 0x2832, 0x2830, + 0x282e, 0x282c, 0x282a, 0x2828, 0x2826, 0x2824, 0x2821, 0x281f, + 0x281d, 0x281b, 0x2819, 0x2817, 0x2815, 0x2813, 0x2811, 0x280f, + 0x280d, 0x280b, 0x2809, 0x2807, 0x2805, 0x2803, 0x2801, 0x27fe, + 0x27fa, 0x27f6, 0x27f2, 0x27ee, 0x27ea, 0x27e6, 0x27e2, 0x27de, + 0x27da, 0x27d6, 0x27d2, 0x27ce, 0x27cb, 0x27c7, 0x27c3, 0x27bf, + 0x27bb, 0x27b7, 0x27b3, 0x27af, 0x27ac, 0x27a8, 0x27a4, 0x27a0, + 0x279c, 0x2799, 0x2795, 0x2791, 0x278d, 0x2789, 0x2786, 0x2782, + 0x277e, 0x277a, 0x2777, 0x2773, 0x276f, 0x276b, 0x2768, 0x2764, + 0x2760, 0x275d, 0x2759, 0x2755, 0x2752, 0x274e, 0x274a, 0x2747, + 0x2743, 0x273f, 0x273c, 0x2738, 0x2735, 0x2731, 0x272d, 0x272a, + 0x2726, 0x2723, 0x271f, 0x271c, 0x2718, 0x2715, 0x2711, 0x270d, + 0x270a, 0x2706, 0x2703, 0x26ff, 0x26fc, 0x26f8, 0x26f5, 0x26f1, + 0x26ee, 0x26eb, 0x26e7, 0x26e4, 0x26e0, 0x26dd, 0x26d9, 0x26d6, + 0x26d2, 0x26cf, 0x26cc, 0x26c8, 0x26c5, 0x26c2, 0x26be, 0x26bb, + 0x26b7, 0x26b4, 0x26b1, 0x26ad, 0x26aa, 0x26a7, 0x26a3, 0x26a0, + 0x269d, 0x2699, 0x2696, 0x2693, 0x2690, 0x268c, 0x2689, 0x2686, + 0x2682, 0x267f, 0x267c, 0x2679, 0x2676, 0x2672, 0x266f, 0x266c, + 0x2669, 0x2665, 0x2662, 0x265f, 0x265c, 0x2659, 0x2656, 0x2652, + 0x264f, 0x264c, 0x2649, 0x2646, 0x2643, 0x2640, 0x263c, 0x2639, + 0x2636, 0x2633, 0x2630, 0x262d, 0x262a, 0x2627, 0x2624, 0x2621, + 0x261e, 0x261a, 0x2617, 0x2614, 0x2611, 0x260e, 0x260b, 0x2608, + 0x2605, 0x2602, 0x25ff, 0x25fc, 0x25f9, 0x25f6, 0x25f3, 0x25f0, + 0x25ed, 0x25ea, 0x25e7, 0x25e4, 0x25e2, 0x25df, 0x25dc, 0x25d9, + 0x25d6, 0x25d3, 0x25d0, 0x25cd, 0x25ca, 0x25c7, 0x25c4, 0x25c2, + 0x25bf, 0x25bc, 0x25b9, 0x25b6, 0x25b3, 0x25b0, 0x25ae, 0x25ab, + 0x25a8, 0x25a5, 0x25a2, 0x259f, 0x259d, 0x259a, 0x2597, 0x2594, + 0x2591, 0x258f, 0x258c, 0x2589, 0x2586, 0x2584, 0x2581, 0x257e, + 0x257b, 0x2579, 0x2576, 0x2573, 0x2570, 0x256e, 0x256b, 0x2568, + 0x2566, 0x2563, 0x2560, 0x255e, 0x255b, 0x2558, 0x2555, 0x2553, + 0x2550, 0x254e, 0x254b, 0x2548, 0x2546, 0x2543, 0x2540, 0x253e, + 0x253b, 0x2538, 0x2536, 0x2533, 0x2531, 0x252e, 0x252b, 0x2529, + 0x2526, 0x2524, 0x2521, 0x251f, 0x251c, 0x2519, 0x2517, 0x2514, + 0x2512, 0x250f, 0x250d, 0x250a, 0x2508, 0x2505, 0x2503, 0x2500, + 0x24fe, 0x24fb, 0x24f9, 0x24f6, 0x24f4, 0x24f1, 0x24ef, 0x24ec, + 0x24ea, 0x24e7, 0x24e5, 0x24e3, 0x24e0, 0x24de, 0x24db, 0x24d9, + 0x24d6, 0x24d4, 0x24d2, 0x24cf, 0x24cd, 0x24ca, 0x24c8, 0x24c6, + 0x24c3, 0x24c1, 0x24be, 0x24bc, 0x24ba, 0x24b7, 0x24b5, 0x24b3, + 0x24b0, 0x24ac, 0x24a7, 0x24a2, 0x249e, 0x2499, 0x2495, 0x2490, + 0x248b, 0x2487, 0x2482, 0x247e, 0x2479, 0x2475, 0x2470, 0x246c, + 0x2468, 0x2463, 0x245f, 0x245a, 0x2456, 0x2452, 0x244d, 0x2449, + 0x2445, 0x2441, 0x243c, 0x2438, 0x2434, 0x2430, 0x242c, 0x2427, + 0x2423, 0x241f, 0x241b, 0x2417, 0x2413, 0x240f, 0x240b, 0x2407, + 0x2403, 0x23fd, 0x23f5, 0x23ed, 0x23e6, 0x23de, 0x23d6, 0x23ce, + 0x23c6, 0x23be, 0x23b7, 0x23af, 0x23a7, 0x23a0, 0x2398, 0x2391, + 0x2389, 0x2381, 0x237a, 0x2373, 0x236b, 0x2364, 0x235c, 0x2355, + 0x234e, 0x2346, 0x233f, 0x2338, 0x2331, 0x2329, 0x2322, 0x231b, + 0x2314, 0x230d, 0x2306, 0x22ff, 0x22f8, 0x22f1, 0x22ea, 0x22e3, + 0x22dc, 0x22d6, 0x22cf, 0x22c8, 0x22c1, 0x22ba, 0x22b4, 0x22ad, + 0x22a6, 0x22a0, 0x2299, 0x2292, 0x228c, 0x2285, 0x227f, 0x2278, + 0x2272, 0x226c, 0x2265, 0x225f, 0x2258, 0x2252, 0x224c, 0x2245, + 0x223f, 0x2239, 0x2233, 0x222d, 0x2226, 0x2220, 0x221a, 0x2214, + 0x220e, 0x2208, 0x2202, 0x21fc, 0x21f6, 0x21f0, 0x21ea, 0x21e4, + 0x21de, 0x21d8, 0x21d3, 0x21cd, 0x21c7, 0x21c1, 0x21bb, 0x21b6, + 0x21b0, 0x21aa, 0x21a5, 0x219f, 0x219a, 0x2194, 0x218e, 0x2189, + 0x2183, 0x217e, 0x2178, 0x2173, 0x216d, 0x2168, 0x2163, 0x215d, + 0x2158, 0x2153, 0x214d, 0x2148, 0x2143, 0x213d, 0x2138, 0x2133, + 0x212e, 0x2129, 0x2123, 0x211e, 0x2119, 0x2114, 0x210f, 0x210a, + 0x2105, 0x2100, 0x20fb, 0x20f6, 0x20f1, 0x20ec, 0x20e7, 0x20e2, + 0x20dd, 0x20d9, 0x20d4, 0x20cf, 0x20ca, 0x20c5, 0x20c1, 0x20bc, + 0x20b7, 0x20b2, 0x20ae, 0x20a9, 0x20a4, 0x20a0, 0x209b, 0x2097, + 0x2092, 0x208d, 0x2089, 0x2084, 0x2080, 0x207b, 0x2077, 0x2072, + 0x206e, 0x206a, 0x2065, 0x2061, 0x205c, 0x2058, 0x2054, 0x204f, + 0x204b, 0x2047, 0x2043, 0x203e, 0x203a, 0x2036, 0x2032, 0x202d, + 0x2029, 0x2025, 0x2021, 0x201d, 0x2019, 0x2015, 0x2011, 0x200d, + 0x2009, 0x2004, 0x2000, 0x1ff9, 0x1ff1, 0x1fe9, 0x1fe1, 0x1fd9, + 0x1fd1, 0x1fca, 0x1fc2, 0x1fba, 0x1fb2, 0x1fab, 0x1fa3, 0x1f9c, + 0x1f94, 0x1f8c, 0x1f85, 0x1f7d, 0x1f76, 0x1f6e, 0x1f67, 0x1f60, + 0x1f58, 0x1f51, 0x1f4a, 0x1f42, 0x1f3b, 0x1f34, 0x1f2d, 0x1f26, + 0x1f1e, 0x1f17, 0x1f10, 0x1f09, 0x1f02, 0x1efb, 0x1ef4, 0x1eed, + 0x1ee6, 0x1edf, 0x1ed9, 0x1ed2, 0x1ecb, 0x1ec4, 0x1ebd, 0x1eb7, + 0x1eb0, 0x1ea9, 0x1ea3, 0x1e9c, 0x1e95, 0x1e8f, 0x1e88, 0x1e82, + 0x1e7b, 0x1e75, 0x1e6e, 0x1e68, 0x1e62, 0x1e5b, 0x1e55, 0x1e4f, + 0x1e48, 0x1e42, 0x1e3c, 0x1e36, 0x1e2f, 0x1e29, 0x1e23, 0x1e1d, + 0x1e17, 0x1e11, 0x1e0b, 0x1e05, 0x1dff, 0x1df9, 0x1df3, 0x1ded, + 0x1de7, 0x1de1, 0x1ddb, 0x1dd5, 0x1dcf, 0x1dca, 0x1dc4, 0x1dbe, + 0x1db8, 0x1db3, 0x1dad, 0x1da7, 0x1da2, 0x1d9c, 0x1d96, 0x1d91, + 0x1d8b, 0x1d86, 0x1d80, 0x1d7b, 0x1d75, 0x1d70, 0x1d6a, 0x1d65, + 0x1d60, 0x1d5a, 0x1d55, 0x1d50, 0x1d4a, 0x1d45, 0x1d40, 0x1d3b, + 0x1d35, 0x1d30, 0x1d2b, 0x1d26, 0x1d21, 0x1d1b, 0x1d16, 0x1d11, + 0x1d0c, 0x1d07, 0x1d02, 0x1cfd, 0x1cf8, 0x1cf3, 0x1cee, 0x1ce9, + 0x1ce5, 0x1ce0, 0x1cdb, 0x1cd6, 0x1cd1, 0x1ccc, 0x1cc7, 0x1cc3, + 0x1cbe, 0x1cb9, 0x1cb5, 0x1cb0, 0x1cab, 0x1ca6, 0x1ca2, 0x1c9d, + 0x1c99, 0x1c94, 0x1c8f, 0x1c8b, 0x1c86, 0x1c82, 0x1c7d, 0x1c79, + 0x1c74, 0x1c70, 0x1c6c, 0x1c67, 0x1c63, 0x1c5e, 0x1c5a, 0x1c56, + 0x1c51, 0x1c4d, 0x1c49, 0x1c44, 0x1c40, 0x1c3c, 0x1c38, 0x1c34, + 0x1c2f, 0x1c2b, 0x1c27, 0x1c23, 0x1c1f, 0x1c1b, 0x1c17, 0x1c12, + 0x1c0e, 0x1c0a, 0x1c06, 0x1c02, 0x1bfd, 0x1bf5, 0x1bed, 0x1be5, + 0x1bdd, 0x1bd5, 0x1bcd, 0x1bc5, 0x1bbe, 0x1bb6, 0x1bae, 0x1ba7, + 0x1b9f, 0x1b97, 0x1b90, 0x1b88, 0x1b81, 0x1b79, 0x1b72, 0x1b6a, + 0x1b63, 0x1b5c, 0x1b54, 0x1b4d, 0x1b46, 0x1b3e, 0x1b37, 0x1b30, + 0x1b29, 0x1b22, 0x1b1a, 0x1b13, 0x1b0c, 0x1b05, 0x1afe, 0x1af7, + 0x1af0, 0x1ae9, 0x1ae2, 0x1adc, 0x1ad5, 0x1ace, 0x1ac7, 0x1ac0, + 0x1aba, 0x1ab3, 0x1aac, 0x1aa6, 0x1a9f, 0x1a98, 0x1a92, 0x1a8b, + 0x1a85, 0x1a7e, 0x1a78, 0x1a71, 0x1a6b, 0x1a64, 0x1a5e, 0x1a58, + 0x1a51, 0x1a4b, 0x1a45, 0x1a3f, 0x1a38, 0x1a32, 0x1a2c, 0x1a26, + 0x1a20, 0x1a19, 0x1a13, 0x1a0d, 0x1a07, 0x1a01, 0x19fb, 0x19f5, + 0x19ef, 0x19e9, 0x19e4, 0x19de, 0x19d8, 0x19d2, 0x19cc, 0x19c6, + 0x19c1, 0x19bb, 0x19b5, 0x19af, 0x19aa, 0x19a4, 0x199f, 0x1999, + 0x1993, 0x198e, 0x1988, 0x1983, 0x197d, 0x1978, 0x1972, 0x196d, + 0x1967, 0x1962, 0x195d, 0x1957, 0x1952, 0x194d, 0x1947, 0x1942, + 0x193d, 0x1938, 0x1932, 0x192d, 0x1928, 0x1923, 0x191e, 0x1919, + 0x1914, 0x190f, 0x1909, 0x1904, 0x18ff, 0x18fa, 0x18f5, 0x18f1, + 0x18ec, 0x18e7, 0x18e2, 0x18dd, 0x18d8, 0x18d3, 0x18ce, 0x18ca, + 0x18c5, 0x18c0, 0x18bb, 0x18b7, 0x18b2, 0x18ad, 0x18a9, 0x18a4, + 0x189f, 0x189b, 0x1896, 0x1891, 0x188d, 0x1888, 0x1884, 0x187f, + 0x187b, 0x1876, 0x1872, 0x186e, 0x1869, 0x1865, 0x1860, 0x185c, + 0x1858, 0x1853, 0x184f, 0x184b, 0x1846, 0x1842, 0x183e, 0x183a, + 0x1835, 0x1831, 0x182d, 0x1829, 0x1825, 0x1821, 0x181c, 0x1818, + 0x1814, 0x1810, 0x180c, 0x1808, 0x1804, 0x1800, 0x17f8, 0x17f0, + 0x17e8, 0x17e0, 0x17d8, 0x17d1, 0x17c9, 0x17c1, 0x17b9, 0x17b2, + 0x17aa, 0x17a2, 0x179b, 0x1793, 0x178c, 0x1784, 0x177d, 0x1775, + 0x176e, 0x1766, 0x175f, 0x1757, 0x1750, 0x1749, 0x1742, 0x173a, + 0x1733, 0x172c, 0x1725, 0x171e, 0x1717, 0x170f, 0x1708, 0x1701, + 0x16fa, 0x16f3, 0x16ec, 0x16e6, 0x16df, 0x16d8, 0x16d1, 0x16ca, + 0x16c3, 0x16bd, 0x16b6, 0x16af, 0x16a9, 0x16a2, 0x169b, 0x1695, + 0x168e, 0x1688, 0x1681, 0x167b, 0x1674, 0x166e, 0x1667, 0x1661, + 0x165b, 0x1654, 0x164e, 0x1648, 0x1641, 0x163b, 0x1635, 0x162f, + 0x1628, 0x1622, 0x161c, 0x1616, 0x1610, 0x160a, 0x1604, 0x15fe, + 0x15f8, 0x15f2, 0x15ec, 0x15e6, 0x15e0, 0x15da, 0x15d5, 0x15cf, + 0x15c9, 0x15c3, 0x15bd, 0x15b8, 0x15b2, 0x15ac, 0x15a7, 0x15a1, + 0x159b, 0x1596, 0x1590, 0x158b, 0x1585, 0x1580, 0x157a, 0x1575, + 0x156f, 0x156a, 0x1564, 0x155f, 0x155a, 0x1554, 0x154f, 0x154a, + 0x1544, 0x153f, 0x153a, 0x1535, 0x1530, 0x152a, 0x1525, 0x1520, + 0x151b, 0x1516, 0x1511, 0x150c, 0x1507, 0x1502, 0x14fd, 0x14f8, + 0x14f3, 0x14ee, 0x14e9, 0x14e4, 0x14df, 0x14da, 0x14d5, 0x14d1, + 0x14cc, 0x14c7, 0x14c2, 0x14bd, 0x14b9, 0x14b4, 0x14af, 0x14ab, + 0x14a6, 0x14a1, 0x149d, 0x1498, 0x1494, 0x148f, 0x148a, 0x1486, + 0x1481, 0x147d, 0x1478, 0x1474, 0x146f, 0x146b, 0x1467, 0x1462, + 0x145e, 0x145a, 0x1455, 0x1451, 0x144d, 0x1448, 0x1444, 0x1440, + 0x143b, 0x1437, 0x1433, 0x142f, 0x142b, 0x1427, 0x1422, 0x141e, + 0x141a, 0x1416, 0x1412, 0x140e, 0x140a, 0x1406, 0x1402, 0x13fc, + 0x13f4, 0x13ec, 0x13e4, 0x13dc, 0x13d4, 0x13cc, 0x13c5, 0x13bd, + 0x13b5, 0x13ad, 0x13a6, 0x139e, 0x1396, 0x138f, 0x1387, 0x1380, + 0x1378, 0x1371, 0x1369, 0x1362, 0x135b, 0x1353, 0x134c, 0x1345, + 0x133e, 0x1336, 0x132f, 0x1328, 0x1321, 0x131a, 0x1313, 0x130c, + 0x1304, 0x12fd, 0x12f7, 0x12f0, 0x12e9, 0x12e2, 0x12db, 0x12d4, + 0x12cd, 0x12c6, 0x12c0, 0x12b9, 0x12b2, 0x12ac, 0x12a5, 0x129e, + 0x1298, 0x1291, 0x128b, 0x1284, 0x127d, 0x1277, 0x1271, 0x126a, + 0x1264, 0x125d, 0x1257, 0x1251, 0x124a, 0x1244, 0x123e, 0x1238, + 0x1231, 0x122b, 0x1225, 0x121f, 0x1219, 0x1213, 0x120d, 0x1207, + 0x1201, 0x11fb, 0x11f5, 0x11ef, 0x11e9, 0x11e3, 0x11dd, 0x11d7, + 0x11d1, 0x11cc, 0x11c6, 0x11c0, 0x11ba, 0x11b5, 0x11af, 0x11a9, + 0x11a4, 0x119e, 0x1198, 0x1193, 0x118d, 0x1188, 0x1182, 0x117d, + 0x1177, 0x1172, 0x116c, 0x1167, 0x1161, 0x115c, 0x1157, 0x1151, + 0x114c, 0x1147, 0x1142, 0x113c, 0x1137, 0x1132, 0x112d, 0x1127, + 0x1122, 0x111d, 0x1118, 0x1113, 0x110e, 0x1109, 0x1104, 0x10ff, + 0x10fa, 0x10f5, 0x10f0, 0x10eb, 0x10e6, 0x10e1, 0x10dc, 0x10d8, + 0x10d3, 0x10ce, 0x10c9, 0x10c4, 0x10c0, 0x10bb, 0x10b6, 0x10b1, + 0x10ad, 0x10a8, 0x10a3, 0x109f, 0x109a, 0x1096, 0x1091, 0x108c, + 0x1088, 0x1083, 0x107f, 0x107a, 0x1076, 0x1071, 0x106d, 0x1069, + 0x1064, 0x1060, 0x105b, 0x1057, 0x1053, 0x104e, 0x104a, 0x1046, + 0x1042, 0x103d, 0x1039, 0x1035, 0x1031, 0x102d, 0x1028, 0x1024, + 0x1020, 0x101c, 0x1018, 0x1014, 0x1010, 0x100c, 0x1008, 0x1004, + 0x0fff, 0x0ff7, 0x0fef, 0x0fe7, 0x0fdf, 0x0fd8, 0x0fd0, 0x0fc8, + 0x0fc0, 0x0fb8, 0x0fb1, 0x0fa9, 0x0fa1, 0x0f9a, 0x0f92, 0x0f8b, + 0x0f83, 0x0f7c, 0x0f74, 0x0f6d, 0x0f65, 0x0f5e, 0x0f57, 0x0f4f, + 0x0f48, 0x0f41, 0x0f3a, 0x0f32, 0x0f2b, 0x0f24, 0x0f1d, 0x0f16, + 0x0f0f, 0x0f08, 0x0f01, 0x0efa, 0x0ef3, 0x0eec, 0x0ee5, 0x0ede, + 0x0ed7, 0x0ed0, 0x0ec9, 0x0ec3, 0x0ebc, 0x0eb5, 0x0eaf, 0x0ea8, + 0x0ea1, 0x0e9b, 0x0e94, 0x0e8d, 0x0e87, 0x0e80, 0x0e7a, 0x0e73, + 0x0e6d, 0x0e67, 0x0e60, 0x0e5a, 0x0e53, 0x0e4d, 0x0e47, 0x0e41, + 0x0e3a, 0x0e34, 0x0e2e, 0x0e28, 0x0e22, 0x0e1c, 0x0e15, 0x0e0f, + 0x0e09, 0x0e03, 0x0dfd, 0x0df7, 0x0df1, 0x0deb, 0x0de6, 0x0de0, + 0x0dda, 0x0dd4, 0x0dce, 0x0dc8, 0x0dc3, 0x0dbd, 0x0db7, 0x0db1, + 0x0dac, 0x0da6, 0x0da0, 0x0d9b, 0x0d95, 0x0d90, 0x0d8a, 0x0d85, + 0x0d7f, 0x0d74, 0x0d69, 0x0d5e, 0x0d54, 0x0d49, 0x0d3f, 0x0d34, + 0x0d2a, 0x0d1f, 0x0d15, 0x0d0b, 0x0d01, 0x0cf7, 0x0ced, 0x0ce3, + 0x0cda, 0x0cd0, 0x0cc6, 0x0cbd, 0x0cb3, 0x0caa, 0x0ca1, 0x0c98, + 0x0c8e, 0x0c85, 0x0c7c, 0x0c73, 0x0c6b, 0x0c62, 0x0c59, 0x0c50, + 0x0c48, 0x0c3f, 0x0c37, 0x0c2e, 0x0c26, 0x0c1e, 0x0c16, 0x0c0d, + 0x0c05, 0x0bfb, 0x0beb, 0x0bdb, 0x0bcb, 0x0bbc, 0x0bad, 0x0b9d, + 0x0b8e, 0x0b7f, 0x0b70, 0x0b61, 0x0b53, 0x0b44, 0x0b36, 0x0b27, + 0x0b19, 0x0b0b, 0x0afd, 0x0aef, 0x0ae1, 0x0ad3, 0x0ac6, 0x0ab8, + 0x0aab, 0x0a9e, 0x0a90, 0x0a83, 0x0a76, 0x0a69, 0x0a5d, 0x0a50, + 0x0a43, 0x0a37, 0x0a2b, 0x0a1e, 0x0a12, 0x0a06, 0x09fa, 0x09ee, + 0x09e2, 0x09d7, 0x09cb, 0x09bf, 0x09b4, 0x09a9, 0x099d, 0x0992, + 0x0987, 0x097c, 0x0971, 0x0966, 0x095b, 0x0951, 0x0946, 0x093c, + 0x0931, 0x0927, 0x091d, 0x0912, 0x0908, 0x08fe, 0x08f4, 0x08eb, + 0x08e1, 0x08d7, 0x08cd, 0x08c4, 0x08ba, 0x08b1, 0x08a8, 0x089e, + 0x0895, 0x088c, 0x0883, 0x087a, 0x0871, 0x0868, 0x085f, 0x0857, + 0x084e, 0x0845, 0x083d, 0x0834, 0x082c, 0x0824, 0x081c, 0x0813, + 0x080b, 0x0803, 0x07f6, 0x07e7, 0x07d7, 0x07c7, 0x07b8, 0x07a8, + 0x0799, 0x078a, 0x077b, 0x076c, 0x075d, 0x074f, 0x0740, 0x0732, + 0x0723, 0x0715, 0x0707, 0x06f9, 0x06eb, 0x06dd, 0x06d0, 0x06c2, + 0x06b4, 0x06a7, 0x069a, 0x068d, 0x0680, 0x0673, 0x0666, 0x0659, + 0x064c, 0x0640, 0x0633, 0x0627, 0x061b, 0x060f, 0x0603, 0x05f7, + 0x05eb, 0x05df, 0x05d3, 0x05c8, 0x05bc, 0x05b1, 0x05a5, 0x059a, + 0x058f, 0x0584, 0x0579, 0x056e, 0x0563, 0x0558, 0x054e, 0x0543, + 0x0539, 0x052e, 0x0524, 0x051a, 0x0510, 0x0506, 0x04fc, 0x04f2, + 0x04e8, 0x04de, 0x04d4, 0x04cb, 0x04c1, 0x04b8, 0x04ae, 0x04a5, + 0x049c, 0x0493, 0x0489, 0x0480, 0x0477, 0x046f, 0x0466, 0x045d, + 0x0454, 0x044c, 0x0443, 0x043b, 0x0432, 0x042a, 0x0421, 0x0419, + 0x0411, 0x0409, 0x0401, 0x03f9, 0x03f1, 0x03e9, 0x03e1, 0x03da, + 0x03d2, 0x03ca, 0x03c3, 0x03bb, 0x03b4, 0x03ad, 0x03a5, 0x039e, + 0x0397, 0x0390, 0x0389, 0x0381, 0x037a, 0x0374, 0x036d, 0x0366, + 0x035f, 0x0358, 0x0352, 0x034b, 0x0345, 0x033e, 0x0338, 0x0331, + 0x032b, 0x0324, 0x031e, 0x0318, 0x0312, 0x030c, 0x0306, 0x0300, + 0x02fa, 0x02f4, 0x02ee, 0x02e8, 0x02e2, 0x02dd, 0x02d7, 0x02d1, + 0x02cc, 0x02c6, 0x02c0, 0x02bb, 0x02b6, 0x02b0, 0x02ab, 0x02a5, + 0x02a0, 0x029b, 0x0296, 0x0291, 0x028c, 0x0286, 0x0281, 0x027c, + 0x0277, 0x0273, 0x026e, 0x0269, 0x0264, 0x025f, 0x025b, 0x0256, + 0x0251, 0x024d, 0x0248, 0x0243, 0x023f, 0x023a, 0x0236, 0x0232, + 0x022d, 0x0229, 0x0225, 0x0220, 0x021c, 0x0218, 0x0214, 0x0210, + 0x020b, 0x0207, 0x0203, 0x01ff, 0x01fb, 0x01f7, 0x01f4, 0x01f0, + 0x01ec, 0x01e8, 0x01e4, 0x01e0, 0x01dd, 0x01d9, 0x01d5, 0x01d2, + 0x01ce, 0x01ca, 0x01c7, 0x01c3, 0x01c0, 0x01bc, 0x01b9, 0x01b5, + 0x01b2, 0x01af, 0x01ab, 0x01a8, 0x01a5, 0x01a1, 0x019e, 0x019b, + 0x0198, 0x0195, 0x0191, 0x018e, 0x018b, 0x0188, 0x0185, 0x0182, + 0x017f, 0x017c, 0x0179, 0x0176, 0x0173, 0x0170, 0x016d, 0x016b, + 0x0168, 0x0165, 0x0162, 0x015f, 0x015d, 0x015a, 0x0157, 0x0155, + 0x0152, 0x014f, 0x014d, 0x014a, 0x0148, 0x0145, 0x0143, 0x0140, + 0x013e, 0x013b, 0x0139, 0x0136, 0x0134, 0x0131, 0x012f, 0x012d, + 0x012a, 0x0128, 0x0126, 0x0123, 0x0121, 0x011f, 0x011d, 0x011a, + 0x0118, 0x0116, 0x0114, 0x0112, 0x0110, 0x010d, 0x010b, 0x0109, + 0x0107, 0x0105, 0x0103, 0x0101, 0x00ff, 0x00fd, 0x00fb, 0x00f9, + 0x00f7, 0x00f5, 0x00f3, 0x00f2, 0x00f0, 0x00ee, 0x00ec, 0x00ea, + 0x00e8, 0x00e6, 0x00e5, 0x00e3, 0x00e1, 0x00df, 0x00de, 0x00dc, + 0x00da, 0x00d9, 0x00d7, 0x00d5, 0x00d4, 0x00d2, 0x00d0, 0x00cf, + 0x00cd, 0x00cb, 0x00ca, 0x00c8, 0x00c7, 0x00c5, 0x00c4, 0x00c2, + 0x00c1, 0x00bf, 0x00be, 0x00bc, 0x00bb, 0x00b9, 0x00b8, 0x00b6, + 0x00b5, 0x00b4, 0x00b2, 0x00b1, 0x00af, 0x00ae, 0x00ad, 0x00ab, + 0x00aa, 0x00a9, 0x00a7, 0x00a6, 0x00a5, 0x00a3, 0x00a2, 0x00a1, + 0x00a0, 0x009e, 0x009d, 0x009c, 0x009b, 0x009a, 0x0098, 0x0097, + 0x0096, 0x0095, 0x0094, 0x0093, 0x0091, 0x0090, 0x008f, 0x008e, + 0x008d, 0x008c, 0x008b, 0x008a, 0x0089, 0x0087, 0x0086, 0x0085, + 0x0084, 0x0083, 0x0082, 0x0081, 0x0080, 0x007f, 0x007e, 0x007d, + 0x007c, 0x007b, 0x007a, 0x0079, 0x0079, 0x0078, 0x0077, 0x0076, + 0x0075, 0x0074, 0x0073, 0x0072, 0x0071, 0x0070, 0x006f, 0x006f, + 0x006e, 0x006d, 0x006c, 0x006b, 0x006a, 0x006a, 0x0069, 0x0068, + 0x0067, 0x0066, 0x0065, 0x0065, 0x0064, 0x0063, 0x0062, 0x0062, + 0x0061, 0x0060, 0x005f, 0x005f, 0x005e, 0x005d, 0x005c, 0x005c, + 0x005b, 0x005a, 0x005a, 0x0059, 0x0058, 0x0057, 0x0057, 0x0056, + 0x0055, 0x0055, 0x0054, 0x0053, 0x0053, 0x0052, 0x0052, 0x0051, + 0x0050, 0x0050, 0x004f, 0x004e, 0x004e, 0x004d, 0x004d, 0x004c, + 0x004b, 0x004b, 0x004a, 0x004a, 0x0049, 0x0049, 0x0048, 0x0047, + 0x0047, 0x0046, 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, + 0x0043, 0x0042, 0x0042, 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, + 0x003f, 0x003e, 0x003e, 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, + 0x003b, 0x003a, 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, + 0x0037, 0x0037, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, + 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0031, 0x0031, + 0x0031, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, 0x002e, 0x002e, + 0x002e, 0x002d, 0x002d, 0x002d, 0x002c, 0x002c, 0x002c, 0x002b, + 0x002b, 0x002b, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0027, 0x0027, 0x0027, 0x0027, 0x0026, + 0x0026, 0x0026, 0x0025, 0x0025, 0x0025, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0023, 0x0023, 0x0023, 0x0023, 0x0022, 0x0022, 0x0022, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0020, 0x0020, 0x0020, 0x0020, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001d, 0x001d, 0x001d, 0x001d, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001b, 0x001b, 0x001b, 0x001b, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +const unsigned short logTable[] = +{ + 0xfc00, 0xd829, 0xd7f9, 0xd7c5, 0xd7a0, 0xd783, 0xd76c, 0xd758, + 0xd747, 0xd738, 0xd72b, 0xd71e, 0xd713, 0xd709, 0xd700, 0xd6f7, + 0xd6ee, 0xd6e7, 0xd6df, 0xd6d8, 0xd6d2, 0xd6cc, 0xd6c6, 0xd6c0, + 0xd6bb, 0xd6b5, 0xd6b0, 0xd6ab, 0xd6a7, 0xd6a2, 0xd69e, 0xd69a, + 0xd696, 0xd692, 0xd68e, 0xd68a, 0xd687, 0xd683, 0xd680, 0xd67c, + 0xd679, 0xd676, 0xd673, 0xd670, 0xd66d, 0xd66a, 0xd667, 0xd665, + 0xd662, 0xd65f, 0xd65d, 0xd65a, 0xd658, 0xd655, 0xd653, 0xd650, + 0xd64e, 0xd64c, 0xd64a, 0xd647, 0xd645, 0xd643, 0xd641, 0xd63f, + 0xd63d, 0xd63b, 0xd639, 0xd637, 0xd635, 0xd633, 0xd632, 0xd630, + 0xd62e, 0xd62c, 0xd62a, 0xd629, 0xd627, 0xd625, 0xd624, 0xd622, + 0xd620, 0xd61f, 0xd61d, 0xd61c, 0xd61a, 0xd619, 0xd617, 0xd616, + 0xd614, 0xd613, 0xd611, 0xd610, 0xd60f, 0xd60d, 0xd60c, 0xd60a, + 0xd609, 0xd608, 0xd606, 0xd605, 0xd604, 0xd603, 0xd601, 0xd600, + 0xd5ff, 0xd5fe, 0xd5fc, 0xd5fb, 0xd5fa, 0xd5f9, 0xd5f8, 0xd5f7, + 0xd5f5, 0xd5f4, 0xd5f3, 0xd5f2, 0xd5f1, 0xd5f0, 0xd5ef, 0xd5ee, + 0xd5ed, 0xd5eb, 0xd5ea, 0xd5e9, 0xd5e8, 0xd5e7, 0xd5e6, 0xd5e5, + 0xd5e4, 0xd5e3, 0xd5e2, 0xd5e1, 0xd5e0, 0xd5df, 0xd5de, 0xd5dd, + 0xd5dd, 0xd5dc, 0xd5db, 0xd5da, 0xd5d9, 0xd5d8, 0xd5d7, 0xd5d6, + 0xd5d5, 0xd5d4, 0xd5d3, 0xd5d3, 0xd5d2, 0xd5d1, 0xd5d0, 0xd5cf, + 0xd5ce, 0xd5cd, 0xd5cd, 0xd5cc, 0xd5cb, 0xd5ca, 0xd5c9, 0xd5c9, + 0xd5c8, 0xd5c7, 0xd5c6, 0xd5c5, 0xd5c5, 0xd5c4, 0xd5c3, 0xd5c2, + 0xd5c1, 0xd5c1, 0xd5c0, 0xd5bf, 0xd5be, 0xd5be, 0xd5bd, 0xd5bc, + 0xd5bc, 0xd5bb, 0xd5ba, 0xd5b9, 0xd5b9, 0xd5b8, 0xd5b7, 0xd5b7, + 0xd5b6, 0xd5b5, 0xd5b4, 0xd5b4, 0xd5b3, 0xd5b2, 0xd5b2, 0xd5b1, + 0xd5b0, 0xd5b0, 0xd5af, 0xd5ae, 0xd5ae, 0xd5ad, 0xd5ac, 0xd5ac, + 0xd5ab, 0xd5ab, 0xd5aa, 0xd5a9, 0xd5a9, 0xd5a8, 0xd5a7, 0xd5a7, + 0xd5a6, 0xd5a6, 0xd5a5, 0xd5a4, 0xd5a4, 0xd5a3, 0xd5a3, 0xd5a2, + 0xd5a1, 0xd5a1, 0xd5a0, 0xd5a0, 0xd59f, 0xd59e, 0xd59e, 0xd59d, + 0xd59d, 0xd59c, 0xd59c, 0xd59b, 0xd59a, 0xd59a, 0xd599, 0xd599, + 0xd598, 0xd598, 0xd597, 0xd597, 0xd596, 0xd595, 0xd595, 0xd594, + 0xd594, 0xd593, 0xd593, 0xd592, 0xd592, 0xd591, 0xd591, 0xd590, + 0xd590, 0xd58f, 0xd58f, 0xd58e, 0xd58e, 0xd58d, 0xd58d, 0xd58c, + 0xd58c, 0xd58b, 0xd58b, 0xd58a, 0xd58a, 0xd589, 0xd589, 0xd588, + 0xd588, 0xd587, 0xd587, 0xd586, 0xd586, 0xd585, 0xd585, 0xd584, + 0xd584, 0xd583, 0xd583, 0xd582, 0xd582, 0xd581, 0xd581, 0xd581, + 0xd580, 0xd580, 0xd57f, 0xd57f, 0xd57e, 0xd57e, 0xd57d, 0xd57d, + 0xd57c, 0xd57c, 0xd57c, 0xd57b, 0xd57b, 0xd57a, 0xd57a, 0xd579, + 0xd579, 0xd579, 0xd578, 0xd578, 0xd577, 0xd577, 0xd576, 0xd576, + 0xd576, 0xd575, 0xd575, 0xd574, 0xd574, 0xd573, 0xd573, 0xd573, + 0xd572, 0xd572, 0xd571, 0xd571, 0xd571, 0xd570, 0xd570, 0xd56f, + 0xd56f, 0xd56f, 0xd56e, 0xd56e, 0xd56d, 0xd56d, 0xd56d, 0xd56c, + 0xd56c, 0xd56b, 0xd56b, 0xd56b, 0xd56a, 0xd56a, 0xd56a, 0xd569, + 0xd569, 0xd568, 0xd568, 0xd568, 0xd567, 0xd567, 0xd566, 0xd566, + 0xd566, 0xd565, 0xd565, 0xd565, 0xd564, 0xd564, 0xd564, 0xd563, + 0xd563, 0xd562, 0xd562, 0xd562, 0xd561, 0xd561, 0xd561, 0xd560, + 0xd560, 0xd560, 0xd55f, 0xd55f, 0xd55f, 0xd55e, 0xd55e, 0xd55d, + 0xd55d, 0xd55d, 0xd55c, 0xd55c, 0xd55c, 0xd55b, 0xd55b, 0xd55b, + 0xd55a, 0xd55a, 0xd55a, 0xd559, 0xd559, 0xd559, 0xd558, 0xd558, + 0xd558, 0xd557, 0xd557, 0xd557, 0xd556, 0xd556, 0xd556, 0xd555, + 0xd555, 0xd555, 0xd554, 0xd554, 0xd554, 0xd553, 0xd553, 0xd553, + 0xd552, 0xd552, 0xd552, 0xd551, 0xd551, 0xd551, 0xd551, 0xd550, + 0xd550, 0xd550, 0xd54f, 0xd54f, 0xd54f, 0xd54e, 0xd54e, 0xd54e, + 0xd54d, 0xd54d, 0xd54d, 0xd54d, 0xd54c, 0xd54c, 0xd54c, 0xd54b, + 0xd54b, 0xd54b, 0xd54a, 0xd54a, 0xd54a, 0xd549, 0xd549, 0xd549, + 0xd549, 0xd548, 0xd548, 0xd548, 0xd547, 0xd547, 0xd547, 0xd547, + 0xd546, 0xd546, 0xd546, 0xd545, 0xd545, 0xd545, 0xd545, 0xd544, + 0xd544, 0xd544, 0xd543, 0xd543, 0xd543, 0xd543, 0xd542, 0xd542, + 0xd542, 0xd541, 0xd541, 0xd541, 0xd541, 0xd540, 0xd540, 0xd540, + 0xd53f, 0xd53f, 0xd53f, 0xd53f, 0xd53e, 0xd53e, 0xd53e, 0xd53e, + 0xd53d, 0xd53d, 0xd53d, 0xd53c, 0xd53c, 0xd53c, 0xd53c, 0xd53b, + 0xd53b, 0xd53b, 0xd53b, 0xd53a, 0xd53a, 0xd53a, 0xd53a, 0xd539, + 0xd539, 0xd539, 0xd538, 0xd538, 0xd538, 0xd538, 0xd537, 0xd537, + 0xd537, 0xd537, 0xd536, 0xd536, 0xd536, 0xd536, 0xd535, 0xd535, + 0xd535, 0xd535, 0xd534, 0xd534, 0xd534, 0xd534, 0xd533, 0xd533, + 0xd533, 0xd533, 0xd532, 0xd532, 0xd532, 0xd532, 0xd531, 0xd531, + 0xd531, 0xd531, 0xd530, 0xd530, 0xd530, 0xd530, 0xd52f, 0xd52f, + 0xd52f, 0xd52f, 0xd52e, 0xd52e, 0xd52e, 0xd52e, 0xd52d, 0xd52d, + 0xd52d, 0xd52d, 0xd52d, 0xd52c, 0xd52c, 0xd52c, 0xd52c, 0xd52b, + 0xd52b, 0xd52b, 0xd52b, 0xd52a, 0xd52a, 0xd52a, 0xd52a, 0xd529, + 0xd529, 0xd529, 0xd529, 0xd529, 0xd528, 0xd528, 0xd528, 0xd528, + 0xd527, 0xd527, 0xd527, 0xd527, 0xd526, 0xd526, 0xd526, 0xd526, + 0xd526, 0xd525, 0xd525, 0xd525, 0xd525, 0xd524, 0xd524, 0xd524, + 0xd524, 0xd524, 0xd523, 0xd523, 0xd523, 0xd523, 0xd522, 0xd522, + 0xd522, 0xd522, 0xd522, 0xd521, 0xd521, 0xd521, 0xd521, 0xd520, + 0xd520, 0xd520, 0xd520, 0xd520, 0xd51f, 0xd51f, 0xd51f, 0xd51f, + 0xd51f, 0xd51e, 0xd51e, 0xd51e, 0xd51e, 0xd51d, 0xd51d, 0xd51d, + 0xd51d, 0xd51d, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51b, + 0xd51b, 0xd51b, 0xd51b, 0xd51b, 0xd51a, 0xd51a, 0xd51a, 0xd51a, + 0xd51a, 0xd519, 0xd519, 0xd519, 0xd519, 0xd518, 0xd518, 0xd518, + 0xd518, 0xd518, 0xd517, 0xd517, 0xd517, 0xd517, 0xd517, 0xd516, + 0xd516, 0xd516, 0xd516, 0xd516, 0xd515, 0xd515, 0xd515, 0xd515, + 0xd515, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd513, + 0xd513, 0xd513, 0xd513, 0xd513, 0xd512, 0xd512, 0xd512, 0xd512, + 0xd512, 0xd511, 0xd511, 0xd511, 0xd511, 0xd511, 0xd510, 0xd510, + 0xd510, 0xd510, 0xd510, 0xd50f, 0xd50f, 0xd50f, 0xd50f, 0xd50f, + 0xd50f, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50d, 0xd50d, + 0xd50d, 0xd50d, 0xd50d, 0xd50c, 0xd50c, 0xd50c, 0xd50c, 0xd50c, + 0xd50c, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50a, 0xd50a, + 0xd50a, 0xd50a, 0xd50a, 0xd50a, 0xd509, 0xd509, 0xd509, 0xd509, + 0xd509, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd507, + 0xd507, 0xd507, 0xd507, 0xd507, 0xd506, 0xd506, 0xd506, 0xd506, + 0xd506, 0xd506, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, + 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd503, 0xd503, + 0xd503, 0xd503, 0xd503, 0xd502, 0xd502, 0xd502, 0xd502, 0xd502, + 0xd502, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd500, + 0xd500, 0xd500, 0xd500, 0xd500, 0xd500, 0xd4ff, 0xd4ff, 0xd4ff, + 0xd4ff, 0xd4ff, 0xd4ff, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, + 0xd4fe, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fc, + 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fb, 0xd4fb, 0xd4fb, + 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4fa, + 0xd4fa, 0xd4fa, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, + 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f7, 0xd4f7, + 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f6, 0xd4f6, 0xd4f6, + 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, + 0xd4f5, 0xd4f5, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, + 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f2, + 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f1, 0xd4f1, + 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, + 0xd4f0, 0xd4f0, 0xd4f0, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, + 0xd4ef, 0xd4ef, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, + 0xd4ee, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, + 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4eb, 0xd4eb, + 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4ea, 0xd4ea, 0xd4ea, + 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4e9, 0xd4e9, 0xd4e9, + 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, + 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, + 0xd4e7, 0xd4e7, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, + 0xd4e6, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, + 0xd4e5, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, + 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, + 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e1, + 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e0, + 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4df, 0xd4df, + 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4de, 0xd4de, + 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4dd, 0xd4dd, + 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dc, 0xd4dc, + 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4db, 0xd4db, + 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4da, 0xd4da, 0xd4da, + 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4d9, 0xd4d9, 0xd4d9, + 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d8, 0xd4d8, + 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d7, 0xd4d7, + 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d6, 0xd4d6, + 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d5, 0xd4d5, + 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d4, 0xd4d4, + 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d3, + 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d2, + 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, + 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, + 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, + 0xd4d0, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, + 0xd4cf, 0xd4cf, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, + 0xd4ce, 0xd4ce, 0xd4ce, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, + 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, + 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, + 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4ca, 0xd4ca, 0xd4ca, + 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4c9, 0xd4c9, + 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, + 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, + 0xd4c8, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, + 0xd4c7, 0xd4c7, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, + 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, + 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c4, 0xd4c4, 0xd4c4, + 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c3, 0xd4c3, + 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, + 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, + 0xd4c2, 0xd4c2, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, + 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, + 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4bf, 0xd4bf, 0xd4bf, + 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4be, + 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, + 0xd4be, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, + 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, + 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bb, 0xd4bb, 0xd4bb, + 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4ba, + 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, + 0xd4ba, 0xd4ba, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, + 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, + 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b7, + 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, + 0xd4b7, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, + 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, + 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b4, 0xd4b4, + 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, + 0xd4b4, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, + 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, + 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b1, + 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, + 0xd4b1, 0xd4b1, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, + 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4af, 0xd4af, 0xd4af, + 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, + 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, + 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, + 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ac, + 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, + 0xd4ac, 0xd4ac, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, + 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4aa, 0xd4aa, + 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, + 0xd4aa, 0xd4aa, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, + 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a8, 0xd4a8, 0xd4a8, + 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, + 0xd4a8, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, + 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a6, 0xd4a6, 0xd4a6, + 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, + 0xd4a6, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, + 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a4, 0xd4a4, 0xd4a4, + 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, + 0xd4a4, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, + 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a2, 0xd4a2, + 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, + 0xd4a2, 0xd4a2, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, + 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a0, + 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, + 0xd4a0, 0xd4a0, 0xd4a0, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, + 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, + 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, + 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49d, 0xd49d, 0xd49d, + 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, + 0xd49d, 0xd49d, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, + 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49b, + 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, + 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49a, 0xd49a, 0xd49a, 0xd49a, + 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, + 0xd49a, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, + 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd498, 0xd498, + 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, + 0xd498, 0xd498, 0xd498, 0xd498, 0xd497, 0xd497, 0xd497, 0xd497, + 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, + 0xd497, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, + 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd495, + 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, + 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd494, 0xd494, 0xd494, + 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, + 0xd494, 0xd494, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, + 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, + 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, + 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd491, 0xd491, + 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, + 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd490, 0xd490, 0xd490, + 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, + 0xd490, 0xd490, 0xd490, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, + 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, + 0xd48f, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, + 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, + 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, + 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48c, 0xd48c, + 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, + 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48b, 0xd48b, 0xd48b, + 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, + 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48a, 0xd48a, 0xd48a, 0xd48a, + 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, + 0xd48a, 0xd48a, 0xd48a, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, + 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, + 0xd489, 0xd489, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, + 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, + 0xd488, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, + 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, + 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, + 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, + 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, + 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd484, + 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, + 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd483, + 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, + 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd482, + 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, + 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd481, + 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, + 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, + 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, + 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, + 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, + 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, + 0xd47c, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, + 0xd47b, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, + 0xd47a, 0xd47a, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, + 0xd479, 0xd479, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, + 0xd478, 0xd478, 0xd478, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, + 0xd477, 0xd477, 0xd477, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, + 0xd476, 0xd476, 0xd476, 0xd476, 0xd475, 0xd475, 0xd475, 0xd475, + 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd474, 0xd474, 0xd474, + 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd473, 0xd473, + 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd472, + 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, + 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, + 0xd471, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, + 0xd470, 0xd470, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, + 0xd46f, 0xd46f, 0xd46f, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, + 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46d, 0xd46d, 0xd46d, + 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46c, 0xd46c, + 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, + 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, + 0xd46b, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, + 0xd46a, 0xd46a, 0xd46a, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, + 0xd469, 0xd469, 0xd469, 0xd469, 0xd468, 0xd468, 0xd468, 0xd468, + 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd467, 0xd467, + 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, + 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, + 0xd466, 0xd466, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, + 0xd465, 0xd465, 0xd465, 0xd465, 0xd464, 0xd464, 0xd464, 0xd464, + 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd463, 0xd463, + 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, + 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, + 0xd462, 0xd462, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, + 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd460, 0xd460, 0xd460, + 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd45f, + 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, + 0xd45f, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, + 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45d, 0xd45d, 0xd45d, 0xd45d, + 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45c, + 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, + 0xd45c, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, + 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45a, 0xd45a, 0xd45a, 0xd45a, + 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd459, + 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, + 0xd459, 0xd459, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, + 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd457, 0xd457, 0xd457, + 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, + 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, + 0xd456, 0xd456, 0xd456, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, + 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd454, + 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, + 0xd454, 0xd454, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, + 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd452, 0xd452, + 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, + 0xd452, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, + 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd450, 0xd450, 0xd450, + 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, + 0xd450, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, + 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44e, 0xd44e, 0xd44e, + 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, + 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, + 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, + 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44a, 0xd44a, 0xd44a, + 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, + 0xd44a, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, + 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd448, 0xd448, + 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, + 0xd448, 0xd448, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, + 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd446, + 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, + 0xd446, 0xd446, 0xd446, 0xd446, 0xd445, 0xd445, 0xd445, 0xd445, + 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, + 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, + 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd443, 0xd443, 0xd443, + 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, + 0xd443, 0xd443, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, + 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd441, + 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, + 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd440, 0xd440, 0xd440, + 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, + 0xd440, 0xd440, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, + 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43e, + 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, + 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43d, 0xd43d, 0xd43d, + 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, + 0xd43d, 0xd43d, 0xd43d, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, + 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, + 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, + 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43a, 0xd43a, + 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, + 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd439, 0xd439, 0xd439, 0xd439, + 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, + 0xd439, 0xd439, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, + 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, + 0xd438, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, + 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd436, + 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, + 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd435, 0xd435, 0xd435, + 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, + 0xd435, 0xd435, 0xd435, 0xd435, 0xd434, 0xd434, 0xd434, 0xd434, + 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, + 0xd434, 0xd434, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, + 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, + 0xd433, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, + 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, + 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, + 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd430, + 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, + 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd42f, 0xd42f, + 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, + 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42e, 0xd42e, 0xd42e, + 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, + 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42d, 0xd42d, 0xd42d, + 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, + 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42c, 0xd42c, 0xd42c, 0xd42c, + 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, + 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42b, 0xd42b, 0xd42b, 0xd42b, + 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, + 0xd42b, 0xd42b, 0xd42b, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, + 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, + 0xd42a, 0xd42a, 0xd42a, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, + 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, + 0xd429, 0xd429, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, + 0xd428, 0xd428, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, + 0xd427, 0xd427, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, + 0xd426, 0xd426, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, + 0xd425, 0xd425, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, + 0xd424, 0xd424, 0xd424, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, + 0xd423, 0xd423, 0xd423, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, + 0xd422, 0xd422, 0xd422, 0xd422, 0xd421, 0xd421, 0xd421, 0xd421, + 0xd421, 0xd421, 0xd421, 0xd421, 0xd420, 0xd420, 0xd420, 0xd420, + 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd41f, 0xd41f, 0xd41f, + 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41e, 0xd41e, 0xd41e, + 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41d, 0xd41d, + 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41c, + 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, + 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, + 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, + 0xd41a, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, + 0xd419, 0xd419, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, + 0xd418, 0xd418, 0xd418, 0xd418, 0xd417, 0xd417, 0xd417, 0xd417, + 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd416, 0xd416, 0xd416, + 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd415, 0xd415, + 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd414, + 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, + 0xd414, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, + 0xd413, 0xd413, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, + 0xd412, 0xd412, 0xd412, 0xd412, 0xd411, 0xd411, 0xd411, 0xd411, + 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd410, 0xd410, 0xd410, + 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd40f, + 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, + 0xd40f, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, + 0xd40e, 0xd40e, 0xd40e, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, + 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40c, 0xd40c, 0xd40c, + 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40b, + 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, + 0xd40b, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, + 0xd40a, 0xd40a, 0xd40a, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, + 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd408, 0xd408, 0xd408, + 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd407, + 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, + 0xd407, 0xd407, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, + 0xd406, 0xd406, 0xd406, 0xd406, 0xd405, 0xd405, 0xd405, 0xd405, + 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd404, + 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, + 0xd404, 0xd404, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, + 0xd403, 0xd403, 0xd403, 0xd403, 0xd402, 0xd402, 0xd402, 0xd402, + 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd401, + 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, + 0xd401, 0xd401, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, + 0xd400, 0xd400, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, + 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fd, 0xd3fd, 0xd3fd, + 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, + 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fa, 0xd3fa, + 0xd3fa, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3f9, 0xd3f9, 0xd3f9, 0xd3f9, + 0xd3f9, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f7, + 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f6, 0xd3f6, 0xd3f6, + 0xd3f6, 0xd3f6, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, + 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f3, 0xd3f3, + 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f2, + 0xd3f2, 0xd3f2, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f0, + 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3ef, 0xd3ef, 0xd3ef, + 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, + 0xd3ee, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ec, + 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3eb, 0xd3eb, 0xd3eb, + 0xd3eb, 0xd3eb, 0xd3eb, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, + 0xd3ea, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e8, + 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e7, 0xd3e7, 0xd3e7, + 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, + 0xd3e6, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e4, + 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e3, 0xd3e3, 0xd3e3, + 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, + 0xd3e2, 0xd3e2, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, + 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3df, 0xd3df, + 0xd3df, 0xd3df, 0xd3df, 0xd3df, 0xd3de, 0xd3de, 0xd3de, 0xd3de, + 0xd3de, 0xd3de, 0xd3de, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, + 0xd3dd, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3db, + 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3da, 0xd3da, + 0xd3da, 0xd3da, 0xd3da, 0xd3da, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d9, + 0xd3d9, 0xd3d9, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, + 0xd3d8, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d6, + 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d5, 0xd3d5, + 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, + 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, + 0xd3d3, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, + 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d0, 0xd3d0, + 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3cf, 0xd3cf, 0xd3cf, + 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3ce, + 0xd3ce, 0xd3ce, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, + 0xd3cd, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, + 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3ca, + 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3c9, 0xd3c9, 0xd3c9, + 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, + 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, + 0xd3c7, 0xd3c7, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, + 0xd3c6, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, + 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c3, + 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c2, 0xd3c2, + 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c1, 0xd3c1, 0xd3c1, + 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, + 0xd3c0, 0xd3c0, 0xd3c0, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, + 0xd3bf, 0xd3bf, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, + 0xd3be, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, + 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bb, + 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3ba, 0xd3ba, + 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3b9, 0xd3b9, + 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b8, 0xd3b8, 0xd3b8, + 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, + 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, + 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, + 0xd3b5, 0xd3b5, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, + 0xd3b4, 0xd3b4, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, + 0xd3b3, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, + 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, + 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3af, + 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3ae, + 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ad, + 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ac, 0xd3ac, + 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ab, 0xd3ab, + 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3aa, 0xd3aa, 0xd3aa, + 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3a9, 0xd3a9, 0xd3a9, + 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a8, 0xd3a8, 0xd3a8, + 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a7, 0xd3a7, 0xd3a7, + 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, + 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, + 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, + 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, + 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, + 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, + 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a0, 0xd3a0, 0xd3a0, 0xd3a0, + 0xd3a0, 0xd3a0, 0xd39f, 0xd39f, 0xd39f, 0xd39f, 0xd39e, 0xd39e, + 0xd39e, 0xd39e, 0xd39d, 0xd39d, 0xd39d, 0xd39d, 0xd39c, 0xd39c, + 0xd39c, 0xd39c, 0xd39b, 0xd39b, 0xd39b, 0xd39b, 0xd39a, 0xd39a, + 0xd39a, 0xd39a, 0xd399, 0xd399, 0xd399, 0xd399, 0xd399, 0xd398, + 0xd398, 0xd398, 0xd398, 0xd397, 0xd397, 0xd397, 0xd397, 0xd396, + 0xd396, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd394, + 0xd394, 0xd394, 0xd394, 0xd393, 0xd393, 0xd393, 0xd393, 0xd393, + 0xd392, 0xd392, 0xd392, 0xd392, 0xd391, 0xd391, 0xd391, 0xd391, + 0xd390, 0xd390, 0xd390, 0xd390, 0xd38f, 0xd38f, 0xd38f, 0xd38f, + 0xd38f, 0xd38e, 0xd38e, 0xd38e, 0xd38e, 0xd38d, 0xd38d, 0xd38d, + 0xd38d, 0xd38c, 0xd38c, 0xd38c, 0xd38c, 0xd38b, 0xd38b, 0xd38b, + 0xd38b, 0xd38b, 0xd38a, 0xd38a, 0xd38a, 0xd38a, 0xd389, 0xd389, + 0xd389, 0xd389, 0xd389, 0xd388, 0xd388, 0xd388, 0xd388, 0xd387, + 0xd387, 0xd387, 0xd387, 0xd386, 0xd386, 0xd386, 0xd386, 0xd386, + 0xd385, 0xd385, 0xd385, 0xd385, 0xd384, 0xd384, 0xd384, 0xd384, + 0xd384, 0xd383, 0xd383, 0xd383, 0xd383, 0xd382, 0xd382, 0xd382, + 0xd382, 0xd382, 0xd381, 0xd381, 0xd381, 0xd381, 0xd380, 0xd380, + 0xd380, 0xd380, 0xd380, 0xd37f, 0xd37f, 0xd37f, 0xd37f, 0xd37e, + 0xd37e, 0xd37e, 0xd37e, 0xd37e, 0xd37d, 0xd37d, 0xd37d, 0xd37d, + 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37b, 0xd37b, 0xd37b, + 0xd37b, 0xd37b, 0xd37a, 0xd37a, 0xd37a, 0xd37a, 0xd379, 0xd379, + 0xd379, 0xd379, 0xd379, 0xd378, 0xd378, 0xd378, 0xd378, 0xd378, + 0xd377, 0xd377, 0xd377, 0xd377, 0xd376, 0xd376, 0xd376, 0xd376, + 0xd376, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd374, + 0xd374, 0xd374, 0xd373, 0xd373, 0xd373, 0xd373, 0xd373, 0xd372, + 0xd372, 0xd372, 0xd372, 0xd372, 0xd371, 0xd371, 0xd371, 0xd371, + 0xd371, 0xd370, 0xd370, 0xd370, 0xd370, 0xd370, 0xd36f, 0xd36f, + 0xd36f, 0xd36f, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36d, + 0xd36d, 0xd36d, 0xd36d, 0xd36d, 0xd36c, 0xd36c, 0xd36c, 0xd36c, + 0xd36c, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36a, 0xd36a, + 0xd36a, 0xd36a, 0xd36a, 0xd369, 0xd369, 0xd369, 0xd369, 0xd369, + 0xd368, 0xd368, 0xd368, 0xd368, 0xd368, 0xd367, 0xd367, 0xd367, + 0xd367, 0xd367, 0xd366, 0xd366, 0xd366, 0xd366, 0xd366, 0xd365, + 0xd365, 0xd365, 0xd365, 0xd365, 0xd364, 0xd364, 0xd364, 0xd364, + 0xd364, 0xd363, 0xd363, 0xd363, 0xd363, 0xd363, 0xd362, 0xd362, + 0xd362, 0xd362, 0xd362, 0xd361, 0xd361, 0xd361, 0xd361, 0xd361, + 0xd360, 0xd360, 0xd360, 0xd360, 0xd360, 0xd35f, 0xd35f, 0xd35f, + 0xd35f, 0xd35f, 0xd35f, 0xd35e, 0xd35e, 0xd35e, 0xd35e, 0xd35e, + 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35c, 0xd35c, 0xd35c, + 0xd35c, 0xd35c, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35a, + 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd359, 0xd359, 0xd359, + 0xd359, 0xd359, 0xd358, 0xd358, 0xd358, 0xd358, 0xd358, 0xd357, + 0xd357, 0xd357, 0xd357, 0xd357, 0xd357, 0xd356, 0xd356, 0xd356, + 0xd356, 0xd356, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, + 0xd354, 0xd354, 0xd354, 0xd354, 0xd354, 0xd353, 0xd353, 0xd353, + 0xd353, 0xd353, 0xd352, 0xd352, 0xd352, 0xd352, 0xd352, 0xd351, + 0xd351, 0xd351, 0xd351, 0xd351, 0xd351, 0xd350, 0xd350, 0xd350, + 0xd350, 0xd350, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, + 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34d, 0xd34d, 0xd34d, + 0xd34d, 0xd34d, 0xd34d, 0xd34c, 0xd34c, 0xd34c, 0xd34c, 0xd34c, + 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34a, 0xd34a, + 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd349, 0xd349, 0xd349, 0xd349, + 0xd349, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd347, + 0xd347, 0xd347, 0xd347, 0xd347, 0xd347, 0xd346, 0xd346, 0xd346, + 0xd346, 0xd346, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, + 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd343, 0xd343, + 0xd343, 0xd343, 0xd343, 0xd342, 0xd342, 0xd342, 0xd342, 0xd342, + 0xd342, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd340, + 0xd340, 0xd340, 0xd340, 0xd340, 0xd340, 0xd33f, 0xd33f, 0xd33f, + 0xd33f, 0xd33f, 0xd33f, 0xd33e, 0xd33e, 0xd33e, 0xd33e, 0xd33e, + 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33c, 0xd33c, + 0xd33c, 0xd33c, 0xd33c, 0xd33c, 0xd33b, 0xd33b, 0xd33b, 0xd33b, + 0xd33b, 0xd33b, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, + 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd338, 0xd338, + 0xd338, 0xd338, 0xd338, 0xd338, 0xd337, 0xd337, 0xd337, 0xd337, + 0xd337, 0xd337, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, + 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd334, + 0xd334, 0xd334, 0xd334, 0xd334, 0xd333, 0xd333, 0xd333, 0xd333, + 0xd333, 0xd333, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, + 0xd332, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd330, + 0xd330, 0xd330, 0xd330, 0xd330, 0xd330, 0xd32f, 0xd32f, 0xd32f, + 0xd32f, 0xd32f, 0xd32f, 0xd32e, 0xd32e, 0xd32e, 0xd32e, 0xd32e, + 0xd32e, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, + 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32b, 0xd32b, + 0xd32b, 0xd32b, 0xd32b, 0xd32b, 0xd32a, 0xd32a, 0xd32a, 0xd32a, + 0xd32a, 0xd32a, 0xd32a, 0xd329, 0xd329, 0xd329, 0xd329, 0xd329, + 0xd329, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd327, + 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd326, 0xd326, + 0xd326, 0xd326, 0xd326, 0xd326, 0xd325, 0xd325, 0xd325, 0xd325, + 0xd325, 0xd325, 0xd325, 0xd324, 0xd324, 0xd324, 0xd324, 0xd324, + 0xd324, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, + 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd321, 0xd321, + 0xd321, 0xd321, 0xd321, 0xd321, 0xd321, 0xd320, 0xd320, 0xd320, + 0xd320, 0xd320, 0xd320, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31f, + 0xd31f, 0xd31f, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, + 0xd31e, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31c, + 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31b, 0xd31b, + 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31a, 0xd31a, 0xd31a, + 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd319, 0xd319, 0xd319, 0xd319, + 0xd319, 0xd319, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, + 0xd318, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, + 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd315, + 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, + 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd313, 0xd313, 0xd313, + 0xd313, 0xd313, 0xd313, 0xd313, 0xd312, 0xd312, 0xd312, 0xd312, + 0xd312, 0xd312, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, + 0xd311, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, + 0xd310, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, + 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30d, + 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30c, 0xd30c, + 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30b, 0xd30b, 0xd30b, + 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30a, 0xd30a, 0xd30a, 0xd30a, + 0xd30a, 0xd30a, 0xd30a, 0xd309, 0xd309, 0xd309, 0xd309, 0xd309, + 0xd309, 0xd309, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, + 0xd308, 0xd308, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, + 0xd307, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, + 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, + 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd303, + 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd302, 0xd302, + 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd301, 0xd301, + 0xd301, 0xd301, 0xd301, 0xd301, 0xd301, 0xd300, 0xd300, 0xd300, + 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd2ff, 0xd2ff, 0xd2ff, + 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, + 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, + 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, + 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, + 0xd2fb, 0xd2fb, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, + 0xd2fa, 0xd2fa, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, + 0xd2f9, 0xd2f9, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, + 0xd2f8, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, + 0xd2f7, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, + 0xd2f6, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, + 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, + 0xd2f4, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, + 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, + 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, + 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, + 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, + 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ed, 0xd2ed, 0xd2ed, 0xd2ed, + 0xd2ec, 0xd2ec, 0xd2ec, 0xd2ec, 0xd2eb, 0xd2eb, 0xd2eb, 0xd2eb, + 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2e9, 0xd2e9, 0xd2e9, + 0xd2e9, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e7, 0xd2e7, 0xd2e7, + 0xd2e7, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e5, 0xd2e5, 0xd2e5, + 0xd2e5, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e3, 0xd2e3, 0xd2e3, + 0xd2e3, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e1, 0xd2e1, + 0xd2e1, 0xd2e1, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2df, 0xd2df, + 0xd2df, 0xd2df, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2dd, + 0xd2dd, 0xd2dd, 0xd2dd, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2db, + 0xd2db, 0xd2db, 0xd2db, 0xd2db, 0xd2da, 0xd2da, 0xd2da, 0xd2da, + 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, + 0xd2d8, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d6, 0xd2d6, 0xd2d6, + 0xd2d6, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d4, 0xd2d4, + 0xd2d4, 0xd2d4, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d2, + 0xd2d2, 0xd2d2, 0xd2d2, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, + 0xd2d0, 0xd2d0, 0xd2d0, 0xd2d0, 0xd2cf, 0xd2cf, 0xd2cf, 0xd2cf, + 0xd2cf, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2cd, 0xd2cd, 0xd2cd, + 0xd2cd, 0xd2cd, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cb, 0xd2cb, + 0xd2cb, 0xd2cb, 0xd2cb, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, + 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c8, 0xd2c8, 0xd2c8, 0xd2c8, + 0xd2c8, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c6, 0xd2c6, 0xd2c6, + 0xd2c6, 0xd2c6, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c4, + 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c3, 0xd2c3, 0xd2c3, 0xd2c3, + 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c1, 0xd2c1, 0xd2c1, + 0xd2c1, 0xd2c1, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2bf, + 0xd2bf, 0xd2bf, 0xd2bf, 0xd2be, 0xd2be, 0xd2be, 0xd2be, 0xd2be, + 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bc, 0xd2bc, 0xd2bc, + 0xd2bc, 0xd2bc, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2ba, + 0xd2ba, 0xd2ba, 0xd2ba, 0xd2ba, 0xd2b9, 0xd2b9, 0xd2b9, 0xd2b9, + 0xd2b9, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b7, 0xd2b7, + 0xd2b7, 0xd2b7, 0xd2b7, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, + 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b4, 0xd2b4, 0xd2b4, + 0xd2b4, 0xd2b4, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b2, + 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b1, 0xd2b1, 0xd2b1, 0xd2b1, + 0xd2b1, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2af, 0xd2af, + 0xd2af, 0xd2af, 0xd2af, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, + 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ac, 0xd2ac, 0xd2ac, + 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, + 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2a9, 0xd2a9, 0xd2a9, + 0xd2a9, 0xd2a9, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, + 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a6, 0xd2a6, 0xd2a6, + 0xd2a6, 0xd2a6, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a4, + 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a3, 0xd2a3, 0xd2a3, + 0xd2a3, 0xd2a3, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, + 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a0, 0xd2a0, 0xd2a0, + 0xd2a0, 0xd2a0, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, + 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29d, 0xd29d, 0xd29d, + 0xd29d, 0xd29d, 0xd29d, 0xd29c, 0xd29c, 0xd29c, 0xd29c, 0xd29c, + 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29a, 0xd29a, + 0xd29a, 0xd29a, 0xd29a, 0xd29a, 0xd299, 0xd299, 0xd299, 0xd299, + 0xd299, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd297, + 0xd297, 0xd297, 0xd297, 0xd297, 0xd296, 0xd296, 0xd296, 0xd296, + 0xd296, 0xd296, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, + 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd293, 0xd293, 0xd293, + 0xd293, 0xd293, 0xd293, 0xd292, 0xd292, 0xd292, 0xd292, 0xd292, + 0xd292, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd290, + 0xd290, 0xd290, 0xd290, 0xd290, 0xd28f, 0xd28f, 0xd28f, 0xd28f, + 0xd28f, 0xd28f, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, + 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28c, 0xd28c, + 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xd28b, 0xd28b, 0xd28b, 0xd28b, + 0xd28b, 0xd28b, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, + 0xd289, 0xd289, 0xd289, 0xd289, 0xd289, 0xd288, 0xd288, 0xd288, + 0xd288, 0xd288, 0xd288, 0xd287, 0xd287, 0xd287, 0xd287, 0xd287, + 0xd287, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd285, + 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd284, 0xd284, + 0xd284, 0xd284, 0xd284, 0xd284, 0xd283, 0xd283, 0xd283, 0xd283, + 0xd283, 0xd283, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, + 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd280, 0xd280, + 0xd280, 0xd280, 0xd280, 0xd280, 0xd27f, 0xd27f, 0xd27f, 0xd27f, + 0xd27f, 0xd27f, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, + 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27c, + 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27b, 0xd27b, 0xd27b, + 0xd27b, 0xd27b, 0xd27b, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd27a, + 0xd27a, 0xd27a, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, + 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd277, 0xd277, + 0xd277, 0xd277, 0xd277, 0xd277, 0xd277, 0xd276, 0xd276, 0xd276, + 0xd276, 0xd276, 0xd276, 0xd275, 0xd275, 0xd275, 0xd275, 0xd275, + 0xd275, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, + 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd272, 0xd272, + 0xd272, 0xd272, 0xd272, 0xd272, 0xd272, 0xd271, 0xd271, 0xd271, + 0xd271, 0xd271, 0xd271, 0xd270, 0xd270, 0xd270, 0xd270, 0xd270, + 0xd270, 0xd270, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, + 0xd26f, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26d, + 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26c, 0xd26c, + 0xd26c, 0xd26c, 0xd26c, 0xd26c, 0xd26b, 0xd26b, 0xd26b, 0xd26b, + 0xd26b, 0xd26b, 0xd26b, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd26a, + 0xd26a, 0xd26a, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, + 0xd269, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd267, + 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd266, 0xd266, + 0xd266, 0xd266, 0xd266, 0xd266, 0xd266, 0xd265, 0xd265, 0xd265, + 0xd265, 0xd265, 0xd265, 0xd265, 0xd264, 0xd264, 0xd264, 0xd264, + 0xd264, 0xd264, 0xd264, 0xd263, 0xd263, 0xd263, 0xd263, 0xd263, + 0xd263, 0xd263, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, + 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd260, + 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd25f, 0xd25f, + 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25e, 0xd25e, 0xd25e, + 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25d, 0xd25d, 0xd25d, 0xd25d, + 0xd25d, 0xd25d, 0xd25d, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, + 0xd25c, 0xd25c, 0xd25c, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25b, + 0xd25b, 0xd25b, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, + 0xd25a, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, + 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd257, + 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd256, 0xd256, + 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd255, 0xd255, + 0xd255, 0xd255, 0xd255, 0xd255, 0xd255, 0xd254, 0xd254, 0xd254, + 0xd254, 0xd254, 0xd254, 0xd254, 0xd253, 0xd253, 0xd253, 0xd253, + 0xd253, 0xd253, 0xd253, 0xd253, 0xd252, 0xd252, 0xd252, 0xd252, + 0xd252, 0xd252, 0xd252, 0xd251, 0xd251, 0xd251, 0xd251, 0xd251, + 0xd251, 0xd251, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, + 0xd250, 0xd250, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, + 0xd24f, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, + 0xd24e, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, + 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, + 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24a, + 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd249, + 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd248, + 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd247, 0xd247, + 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd246, 0xd246, + 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd245, 0xd245, + 0xd245, 0xd245, 0xd245, 0xd245, 0xd245, 0xd244, 0xd244, 0xd244, + 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd243, 0xd243, 0xd243, + 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd242, 0xd242, 0xd242, + 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd241, 0xd241, 0xd241, + 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd240, 0xd240, 0xd240, + 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd23f, 0xd23f, 0xd23f, + 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23e, 0xd23e, 0xd23e, + 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23d, 0xd23d, 0xd23d, + 0xd23d, 0xd23d, 0xd23d, 0xd23c, 0xd23c, 0xd23c, 0xd23c, 0xd23b, + 0xd23b, 0xd23b, 0xd23b, 0xd23a, 0xd23a, 0xd23a, 0xd23a, 0xd239, + 0xd239, 0xd239, 0xd239, 0xd238, 0xd238, 0xd238, 0xd238, 0xd237, + 0xd237, 0xd237, 0xd237, 0xd236, 0xd236, 0xd236, 0xd236, 0xd235, + 0xd235, 0xd235, 0xd235, 0xd234, 0xd234, 0xd234, 0xd234, 0xd233, + 0xd233, 0xd233, 0xd233, 0xd232, 0xd232, 0xd232, 0xd232, 0xd232, + 0xd231, 0xd231, 0xd231, 0xd231, 0xd230, 0xd230, 0xd230, 0xd230, + 0xd22f, 0xd22f, 0xd22f, 0xd22f, 0xd22e, 0xd22e, 0xd22e, 0xd22e, + 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22c, 0xd22c, 0xd22c, + 0xd22c, 0xd22b, 0xd22b, 0xd22b, 0xd22b, 0xd22a, 0xd22a, 0xd22a, + 0xd22a, 0xd22a, 0xd229, 0xd229, 0xd229, 0xd229, 0xd228, 0xd228, + 0xd228, 0xd228, 0xd227, 0xd227, 0xd227, 0xd227, 0xd227, 0xd226, + 0xd226, 0xd226, 0xd226, 0xd225, 0xd225, 0xd225, 0xd225, 0xd224, + 0xd224, 0xd224, 0xd224, 0xd224, 0xd223, 0xd223, 0xd223, 0xd223, + 0xd222, 0xd222, 0xd222, 0xd222, 0xd222, 0xd221, 0xd221, 0xd221, + 0xd221, 0xd220, 0xd220, 0xd220, 0xd220, 0xd220, 0xd21f, 0xd21f, + 0xd21f, 0xd21f, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21d, + 0xd21d, 0xd21d, 0xd21d, 0xd21c, 0xd21c, 0xd21c, 0xd21c, 0xd21c, + 0xd21b, 0xd21b, 0xd21b, 0xd21b, 0xd21a, 0xd21a, 0xd21a, 0xd21a, + 0xd21a, 0xd219, 0xd219, 0xd219, 0xd219, 0xd218, 0xd218, 0xd218, + 0xd218, 0xd218, 0xd217, 0xd217, 0xd217, 0xd217, 0xd217, 0xd216, + 0xd216, 0xd216, 0xd216, 0xd215, 0xd215, 0xd215, 0xd215, 0xd215, + 0xd214, 0xd214, 0xd214, 0xd214, 0xd214, 0xd213, 0xd213, 0xd213, + 0xd213, 0xd212, 0xd212, 0xd212, 0xd212, 0xd212, 0xd211, 0xd211, + 0xd211, 0xd211, 0xd211, 0xd210, 0xd210, 0xd210, 0xd210, 0xd210, + 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20e, 0xd20e, 0xd20e, + 0xd20e, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20c, 0xd20c, + 0xd20c, 0xd20c, 0xd20c, 0xd20b, 0xd20b, 0xd20b, 0xd20b, 0xd20b, + 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd209, 0xd209, 0xd209, + 0xd209, 0xd209, 0xd208, 0xd208, 0xd208, 0xd208, 0xd208, 0xd207, + 0xd207, 0xd207, 0xd207, 0xd206, 0xd206, 0xd206, 0xd206, 0xd206, + 0xd205, 0xd205, 0xd205, 0xd205, 0xd205, 0xd204, 0xd204, 0xd204, + 0xd204, 0xd204, 0xd203, 0xd203, 0xd203, 0xd203, 0xd203, 0xd202, + 0xd202, 0xd202, 0xd202, 0xd202, 0xd201, 0xd201, 0xd201, 0xd201, + 0xd201, 0xd201, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd1ff, + 0xd1ff, 0xd1ff, 0xd1ff, 0xd1ff, 0xd1fe, 0xd1fe, 0xd1fe, 0xd1fe, + 0xd1fe, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fc, 0xd1fc, + 0xd1fc, 0xd1fc, 0xd1fc, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, + 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1f9, 0xd1f9, 0xd1f9, + 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, + 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f6, 0xd1f6, 0xd1f6, + 0xd1f6, 0xd1f6, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, + 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f3, 0xd1f3, 0xd1f3, + 0xd1f3, 0xd1f3, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, + 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f0, 0xd1f0, 0xd1f0, + 0xd1f0, 0xd1f0, 0xd1f0, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, + 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ed, 0xd1ed, 0xd1ed, + 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, + 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1ea, 0xd1ea, + 0xd1ea, 0xd1ea, 0xd1ea, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, + 0xd1e9, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e7, + 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e6, + 0xd1e6, 0xd1e6, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e4, + 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e3, 0xd1e3, 0xd1e3, + 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, + 0xd1e2, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e0, 0xd1e0, + 0xd1e0, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1df, 0xd1df, 0xd1df, 0xd1df, + 0xd1df, 0xd1df, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, + 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dc, 0xd1dc, 0xd1dc, + 0xd1dc, 0xd1dc, 0xd1dc, 0xd1db, 0xd1db, 0xd1db, 0xd1db, 0xd1db, + 0xd1db, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1d9, + 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d8, 0xd1d8, 0xd1d8, + 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, + 0xd1d7, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d5, + 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d4, 0xd1d4, 0xd1d4, + 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, + 0xd1d3, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d1, + 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d0, 0xd1d0, 0xd1d0, + 0xd1d0, 0xd1d0, 0xd1d0, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, + 0xd1cf, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1cd, + 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cc, 0xd1cc, + 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1cb, + 0xd1cb, 0xd1cb, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, + 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c8, + 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c7, 0xd1c7, 0xd1c7, + 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, + 0xd1c6, 0xd1c6, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, + 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c3, + 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c2, 0xd1c2, 0xd1c2, + 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, + 0xd1c1, 0xd1c1, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, + 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1be, + 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1bd, 0xd1bd, + 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, + 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, + 0xd1bb, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, + 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b8, + 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b7, 0xd1b7, + 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, + 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, + 0xd1b5, 0xd1b5, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, + 0xd1b4, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, + 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b1, 0xd1b1, + 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b0, 0xd1b0, 0xd1b0, + 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1af, 0xd1af, 0xd1af, 0xd1af, + 0xd1af, 0xd1af, 0xd1af, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, + 0xd1ae, 0xd1ae, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, + 0xd1ad, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, + 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1aa, + 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1a9, 0xd1a9, + 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a8, 0xd1a8, + 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a7, 0xd1a7, 0xd1a7, + 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, + 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, + 0xd1a5, 0xd1a5, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, + 0xd1a4, 0xd1a4, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, + 0xd1a3, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, + 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, + 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd19f, + 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19e, 0xd19e, + 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19d, 0xd19d, + 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19c, 0xd19c, 0xd19c, + 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19b, 0xd19b, 0xd19b, + 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19a, 0xd19a, 0xd19a, 0xd19a, + 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd199, 0xd199, 0xd199, 0xd199, + 0xd199, 0xd199, 0xd199, 0xd199, 0xd198, 0xd198, 0xd198, 0xd198, + 0xd198, 0xd198, 0xd198, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, + 0xd197, 0xd197, 0xd197, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, + 0xd196, 0xd196, 0xd196, 0xd195, 0xd195, 0xd195, 0xd195, 0xd195, + 0xd195, 0xd195, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, + 0xd194, 0xd194, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, + 0xd193, 0xd193, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, + 0xd192, 0xd192, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, + 0xd191, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, + 0xd190, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, + 0xd18f, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, + 0xd18e, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, + 0xd18d, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, + 0xd18c, 0xd18b, 0xd18b, 0xd18b, 0xd18b, 0xd18a, 0xd18a, 0xd18a, + 0xd18a, 0xd189, 0xd189, 0xd189, 0xd189, 0xd188, 0xd188, 0xd188, + 0xd188, 0xd187, 0xd187, 0xd187, 0xd187, 0xd186, 0xd186, 0xd186, + 0xd186, 0xd185, 0xd185, 0xd185, 0xd185, 0xd184, 0xd184, 0xd184, + 0xd184, 0xd183, 0xd183, 0xd183, 0xd183, 0xd182, 0xd182, 0xd182, + 0xd182, 0xd182, 0xd181, 0xd181, 0xd181, 0xd181, 0xd180, 0xd180, + 0xd180, 0xd180, 0xd17f, 0xd17f, 0xd17f, 0xd17f, 0xd17e, 0xd17e, + 0xd17e, 0xd17e, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17c, + 0xd17c, 0xd17c, 0xd17c, 0xd17b, 0xd17b, 0xd17b, 0xd17b, 0xd17a, + 0xd17a, 0xd17a, 0xd17a, 0xd179, 0xd179, 0xd179, 0xd179, 0xd179, + 0xd178, 0xd178, 0xd178, 0xd178, 0xd177, 0xd177, 0xd177, 0xd177, + 0xd176, 0xd176, 0xd176, 0xd176, 0xd176, 0xd175, 0xd175, 0xd175, + 0xd175, 0xd174, 0xd174, 0xd174, 0xd174, 0xd173, 0xd173, 0xd173, + 0xd173, 0xd173, 0xd172, 0xd172, 0xd172, 0xd172, 0xd171, 0xd171, + 0xd171, 0xd171, 0xd171, 0xd170, 0xd170, 0xd170, 0xd170, 0xd16f, + 0xd16f, 0xd16f, 0xd16f, 0xd16f, 0xd16e, 0xd16e, 0xd16e, 0xd16e, + 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16c, 0xd16c, 0xd16c, + 0xd16c, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16a, 0xd16a, + 0xd16a, 0xd16a, 0xd169, 0xd169, 0xd169, 0xd169, 0xd169, 0xd168, + 0xd168, 0xd168, 0xd168, 0xd167, 0xd167, 0xd167, 0xd167, 0xd167, + 0xd166, 0xd166, 0xd166, 0xd166, 0xd166, 0xd165, 0xd165, 0xd165, + 0xd165, 0xd164, 0xd164, 0xd164, 0xd164, 0xd164, 0xd163, 0xd163, + 0xd163, 0xd163, 0xd163, 0xd162, 0xd162, 0xd162, 0xd162, 0xd161, + 0xd161, 0xd161, 0xd161, 0xd161, 0xd160, 0xd160, 0xd160, 0xd160, + 0xd160, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15e, 0xd15e, + 0xd15e, 0xd15e, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15c, + 0xd15c, 0xd15c, 0xd15c, 0xd15c, 0xd15b, 0xd15b, 0xd15b, 0xd15b, + 0xd15b, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd159, 0xd159, + 0xd159, 0xd159, 0xd159, 0xd158, 0xd158, 0xd158, 0xd158, 0xd157, + 0xd157, 0xd157, 0xd157, 0xd157, 0xd156, 0xd156, 0xd156, 0xd156, + 0xd156, 0xd155, 0xd155, 0xd155, 0xd155, 0xd155, 0xd154, 0xd154, + 0xd154, 0xd154, 0xd154, 0xd153, 0xd153, 0xd153, 0xd153, 0xd153, + 0xd152, 0xd152, 0xd152, 0xd152, 0xd152, 0xd151, 0xd151, 0xd151, + 0xd151, 0xd151, 0xd150, 0xd150, 0xd150, 0xd150, 0xd150, 0xd14f, + 0xd14f, 0xd14f, 0xd14f, 0xd14f, 0xd14e, 0xd14e, 0xd14e, 0xd14e, + 0xd14e, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14c, + 0xd14c, 0xd14c, 0xd14c, 0xd14c, 0xd14b, 0xd14b, 0xd14b, 0xd14b, + 0xd14b, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd149, 0xd149, + 0xd149, 0xd149, 0xd149, 0xd148, 0xd148, 0xd148, 0xd148, 0xd148, + 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd146, 0xd146, + 0xd146, 0xd146, 0xd146, 0xd145, 0xd145, 0xd145, 0xd145, 0xd145, + 0xd144, 0xd144, 0xd144, 0xd144, 0xd144, 0xd143, 0xd143, 0xd143, + 0xd143, 0xd143, 0xd143, 0xd142, 0xd142, 0xd142, 0xd142, 0xd142, + 0xd141, 0xd141, 0xd141, 0xd141, 0xd141, 0xd140, 0xd140, 0xd140, + 0xd140, 0xd140, 0xd140, 0xd13f, 0xd13f, 0xd13f, 0xd13f, 0xd13f, + 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13d, 0xd13d, + 0xd13d, 0xd13d, 0xd13d, 0xd13c, 0xd13c, 0xd13c, 0xd13c, 0xd13c, + 0xd13c, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13a, 0xd13a, + 0xd13a, 0xd13a, 0xd13a, 0xd139, 0xd139, 0xd139, 0xd139, 0xd139, + 0xd139, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd137, + 0xd137, 0xd137, 0xd137, 0xd137, 0xd136, 0xd136, 0xd136, 0xd136, + 0xd136, 0xd136, 0xd135, 0xd135, 0xd135, 0xd135, 0xd135, 0xd134, + 0xd134, 0xd134, 0xd134, 0xd134, 0xd134, 0xd133, 0xd133, 0xd133, + 0xd133, 0xd133, 0xd133, 0xd132, 0xd132, 0xd132, 0xd132, 0xd132, + 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd130, 0xd130, + 0xd130, 0xd130, 0xd130, 0xd130, 0xd12f, 0xd12f, 0xd12f, 0xd12f, + 0xd12f, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12d, + 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12c, 0xd12c, 0xd12c, + 0xd12c, 0xd12c, 0xd12c, 0xd12b, 0xd12b, 0xd12b, 0xd12b, 0xd12b, + 0xd12b, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd129, 0xd129, + 0xd129, 0xd129, 0xd129, 0xd129, 0xd128, 0xd128, 0xd128, 0xd128, + 0xd128, 0xd128, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, + 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd125, 0xd125, + 0xd125, 0xd125, 0xd125, 0xd125, 0xd124, 0xd124, 0xd124, 0xd124, + 0xd124, 0xd124, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, + 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd121, 0xd121, + 0xd121, 0xd121, 0xd121, 0xd121, 0xd120, 0xd120, 0xd120, 0xd120, + 0xd120, 0xd120, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, + 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11d, + 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11c, 0xd11c, 0xd11c, + 0xd11c, 0xd11c, 0xd11c, 0xd11b, 0xd11b, 0xd11b, 0xd11b, 0xd11b, + 0xd11b, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd119, + 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd118, 0xd118, + 0xd118, 0xd118, 0xd118, 0xd118, 0xd117, 0xd117, 0xd117, 0xd117, + 0xd117, 0xd117, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, + 0xd116, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd114, + 0xd114, 0xd114, 0xd114, 0xd114, 0xd114, 0xd113, 0xd113, 0xd113, + 0xd113, 0xd113, 0xd113, 0xd113, 0xd112, 0xd112, 0xd112, 0xd112, + 0xd112, 0xd112, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, + 0xd111, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd10f, + 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10e, 0xd10e, + 0xd10e, 0xd10e, 0xd10e, 0xd10e, 0xd10d, 0xd10d, 0xd10d, 0xd10d, + 0xd10d, 0xd10d, 0xd10d, 0xd10c, 0xd10c, 0xd10c, 0xd10c, 0xd10c, + 0xd10c, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, + 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd109, 0xd109, + 0xd109, 0xd109, 0xd109, 0xd109, 0xd109, 0xd108, 0xd108, 0xd108, + 0xd108, 0xd108, 0xd108, 0xd108, 0xd107, 0xd107, 0xd107, 0xd107, + 0xd107, 0xd107, 0xd107, 0xd106, 0xd106, 0xd106, 0xd106, 0xd106, + 0xd106, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, + 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd103, + 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd102, 0xd102, + 0xd102, 0xd102, 0xd102, 0xd102, 0xd101, 0xd101, 0xd101, 0xd101, + 0xd101, 0xd101, 0xd101, 0xd100, 0xd100, 0xd100, 0xd100, 0xd100, + 0xd100, 0xd100, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, + 0xd0ff, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, + 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fc, + 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fb, 0xd0fb, + 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fa, 0xd0fa, 0xd0fa, + 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, + 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, + 0xd0f8, 0xd0f8, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, + 0xd0f7, 0xd0f7, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, + 0xd0f6, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, + 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f3, + 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f2, 0xd0f2, + 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f1, 0xd0f1, + 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f0, 0xd0f0, 0xd0f0, + 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, + 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, + 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, + 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, + 0xd0ec, 0xd0ec, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, + 0xd0eb, 0xd0eb, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, + 0xd0ea, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, + 0xd0e9, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, + 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, + 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e5, + 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e4, + 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e3, + 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e2, + 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e1, 0xd0e1, + 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e0, 0xd0e0, + 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0df, 0xd0df, + 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0de, 0xd0de, + 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0dd, 0xd0dd, + 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dc, 0xd0dc, + 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0db, 0xd0db, 0xd0db, + 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0da, 0xd0da, 0xd0da, + 0xd0da, 0xd0da, 0xd0da, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d8, + 0xd0d8, 0xd0d8, 0xd0d8, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d6, + 0xd0d6, 0xd0d6, 0xd0d6, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d4, + 0xd0d4, 0xd0d4, 0xd0d4, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d2, + 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d1, 0xd0d1, 0xd0d1, 0xd0d1, + 0xd0d0, 0xd0d0, 0xd0d0, 0xd0d0, 0xd0cf, 0xd0cf, 0xd0cf, 0xd0cf, + 0xd0ce, 0xd0ce, 0xd0ce, 0xd0ce, 0xd0cd, 0xd0cd, 0xd0cd, 0xd0cd, + 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cb, 0xd0cb, 0xd0cb, + 0xd0cb, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0c9, 0xd0c9, 0xd0c9, + 0xd0c9, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c7, 0xd0c7, + 0xd0c7, 0xd0c7, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c5, 0xd0c5, + 0xd0c5, 0xd0c5, 0xd0c5, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c3, + 0xd0c3, 0xd0c3, 0xd0c3, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, + 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c0, 0xd0c0, 0xd0c0, 0xd0c0, + 0xd0c0, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0be, 0xd0be, 0xd0be, + 0xd0be, 0xd0be, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bc, 0xd0bc, + 0xd0bc, 0xd0bc, 0xd0bc, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0ba, + 0xd0ba, 0xd0ba, 0xd0ba, 0xd0ba, 0xd0b9, 0xd0b9, 0xd0b9, 0xd0b9, + 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b7, 0xd0b7, 0xd0b7, + 0xd0b7, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b5, 0xd0b5, + 0xd0b5, 0xd0b5, 0xd0b5, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b3, + 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, + 0xd0b2, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b0, 0xd0b0, 0xd0b0, + 0xd0b0, 0xd0b0, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0ae, + 0xd0ae, 0xd0ae, 0xd0ae, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, + 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ab, 0xd0ab, 0xd0ab, + 0xd0ab, 0xd0ab, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0a9, + 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a8, 0xd0a8, 0xd0a8, 0xd0a8, + 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a6, 0xd0a6, 0xd0a6, + 0xd0a6, 0xd0a6, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a4, + 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, + 0xd0a3, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a1, 0xd0a1, + 0xd0a1, 0xd0a1, 0xd0a1, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, + 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09e, 0xd09e, 0xd09e, + 0xd09e, 0xd09e, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09c, + 0xd09c, 0xd09c, 0xd09c, 0xd09c, 0xd09b, 0xd09b, 0xd09b, 0xd09b, + 0xd09b, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd099, + 0xd099, 0xd099, 0xd099, 0xd099, 0xd098, 0xd098, 0xd098, 0xd098, + 0xd098, 0xd097, 0xd097, 0xd097, 0xd097, 0xd097, 0xd096, 0xd096, + 0xd096, 0xd096, 0xd096, 0xd095, 0xd095, 0xd095, 0xd095, 0xd095, + 0xd095, 0xd094, 0xd094, 0xd094, 0xd094, 0xd094, 0xd093, 0xd093, + 0xd093, 0xd093, 0xd093, 0xd092, 0xd092, 0xd092, 0xd092, 0xd092, + 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd090, 0xd090, + 0xd090, 0xd090, 0xd090, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, + 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08d, 0xd08d, + 0xd08d, 0xd08d, 0xd08d, 0xd08c, 0xd08c, 0xd08c, 0xd08c, 0xd08c, + 0xd08c, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08a, 0xd08a, + 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd089, 0xd089, 0xd089, 0xd089, + 0xd089, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd087, + 0xd087, 0xd087, 0xd087, 0xd087, 0xd086, 0xd086, 0xd086, 0xd086, + 0xd086, 0xd086, 0xd085, 0xd085, 0xd085, 0xd085, 0xd085, 0xd084, + 0xd084, 0xd084, 0xd084, 0xd084, 0xd084, 0xd083, 0xd083, 0xd083, + 0xd083, 0xd083, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, + 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd080, 0xd080, + 0xd080, 0xd080, 0xd080, 0xd07f, 0xd07f, 0xd07f, 0xd07f, 0xd07f, + 0xd07f, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07d, + 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07c, 0xd07c, 0xd07c, + 0xd07c, 0xd07c, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, + 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd079, 0xd079, + 0xd079, 0xd079, 0xd079, 0xd079, 0xd078, 0xd078, 0xd078, 0xd078, + 0xd078, 0xd078, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, + 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd075, 0xd075, + 0xd075, 0xd075, 0xd075, 0xd074, 0xd074, 0xd074, 0xd074, 0xd074, + 0xd074, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd072, + 0xd072, 0xd072, 0xd072, 0xd072, 0xd072, 0xd071, 0xd071, 0xd071, + 0xd071, 0xd071, 0xd071, 0xd070, 0xd070, 0xd070, 0xd070, 0xd070, + 0xd070, 0xd070, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, + 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06d, 0xd06d, + 0xd06d, 0xd06d, 0xd06d, 0xd06d, 0xd06c, 0xd06c, 0xd06c, 0xd06c, + 0xd06c, 0xd06c, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, + 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd069, 0xd069, + 0xd069, 0xd069, 0xd069, 0xd069, 0xd069, 0xd068, 0xd068, 0xd068, + 0xd068, 0xd068, 0xd068, 0xd067, 0xd067, 0xd067, 0xd067, 0xd067, + 0xd067, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd065, + 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd064, 0xd064, + 0xd064, 0xd064, 0xd064, 0xd064, 0xd063, 0xd063, 0xd063, 0xd063, + 0xd063, 0xd063, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, + 0xd062, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd060, + 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd05f, 0xd05f, + 0xd05f, 0xd05f, 0xd05f, 0xd05f, 0xd05e, 0xd05e, 0xd05e, 0xd05e, + 0xd05e, 0xd05e, 0xd05e, 0xd05d, 0xd05d, 0xd05d, 0xd05d, 0xd05d, + 0xd05d, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, + 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05a, 0xd05a, + 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd059, 0xd059, 0xd059, + 0xd059, 0xd059, 0xd059, 0xd059, 0xd058, 0xd058, 0xd058, 0xd058, + 0xd058, 0xd058, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, + 0xd057, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, + 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd054, 0xd054, + 0xd054, 0xd054, 0xd054, 0xd054, 0xd054, 0xd053, 0xd053, 0xd053, + 0xd053, 0xd053, 0xd053, 0xd053, 0xd052, 0xd052, 0xd052, 0xd052, + 0xd052, 0xd052, 0xd052, 0xd051, 0xd051, 0xd051, 0xd051, 0xd051, + 0xd051, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, + 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04e, + 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04d, 0xd04d, + 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04c, 0xd04c, 0xd04c, + 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04b, 0xd04b, 0xd04b, 0xd04b, + 0xd04b, 0xd04b, 0xd04b, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd04a, + 0xd04a, 0xd04a, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, + 0xd049, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, + 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd046, + 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd045, 0xd045, + 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd044, 0xd044, + 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd043, 0xd043, 0xd043, + 0xd043, 0xd043, 0xd043, 0xd043, 0xd042, 0xd042, 0xd042, 0xd042, + 0xd042, 0xd042, 0xd042, 0xd041, 0xd041, 0xd041, 0xd041, 0xd041, + 0xd041, 0xd041, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, + 0xd040, 0xd040, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, + 0xd03f, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, + 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, + 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03b, + 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03a, + 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd039, 0xd039, + 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd038, 0xd038, + 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd037, 0xd037, 0xd037, + 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd036, 0xd036, 0xd036, + 0xd036, 0xd036, 0xd036, 0xd036, 0xd035, 0xd035, 0xd035, 0xd035, + 0xd035, 0xd035, 0xd035, 0xd035, 0xd034, 0xd034, 0xd034, 0xd034, + 0xd034, 0xd034, 0xd034, 0xd034, 0xd033, 0xd033, 0xd033, 0xd033, + 0xd033, 0xd033, 0xd033, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, + 0xd032, 0xd032, 0xd032, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, + 0xd031, 0xd031, 0xd031, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, + 0xd030, 0xd030, 0xd030, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02f, + 0xd02f, 0xd02f, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, + 0xd02e, 0xd02e, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, + 0xd02d, 0xd02d, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, + 0xd02c, 0xd02c, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, + 0xd02b, 0xd02b, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, + 0xd02a, 0xd02a, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, + 0xd029, 0xd028, 0xd028, 0xd028, 0xd028, 0xd027, 0xd027, 0xd027, + 0xd027, 0xd026, 0xd026, 0xd026, 0xd026, 0xd025, 0xd025, 0xd025, + 0xd025, 0xd024, 0xd024, 0xd024, 0xd024, 0xd023, 0xd023, 0xd023, + 0xd023, 0xd022, 0xd022, 0xd022, 0xd022, 0xd022, 0xd021, 0xd021, + 0xd021, 0xd021, 0xd020, 0xd020, 0xd020, 0xd020, 0xd01f, 0xd01f, + 0xd01f, 0xd01f, 0xd01e, 0xd01e, 0xd01e, 0xd01e, 0xd01d, 0xd01d, + 0xd01d, 0xd01d, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01b, + 0xd01b, 0xd01b, 0xd01b, 0xd01a, 0xd01a, 0xd01a, 0xd01a, 0xd019, + 0xd019, 0xd019, 0xd019, 0xd018, 0xd018, 0xd018, 0xd018, 0xd018, + 0xd017, 0xd017, 0xd017, 0xd017, 0xd016, 0xd016, 0xd016, 0xd016, + 0xd015, 0xd015, 0xd015, 0xd015, 0xd014, 0xd014, 0xd014, 0xd014, + 0xd014, 0xd013, 0xd013, 0xd013, 0xd013, 0xd012, 0xd012, 0xd012, + 0xd012, 0xd012, 0xd011, 0xd011, 0xd011, 0xd011, 0xd010, 0xd010, + 0xd010, 0xd010, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00e, + 0xd00e, 0xd00e, 0xd00e, 0xd00d, 0xd00d, 0xd00d, 0xd00d, 0xd00d, + 0xd00c, 0xd00c, 0xd00c, 0xd00c, 0xd00b, 0xd00b, 0xd00b, 0xd00b, + 0xd00b, 0xd00a, 0xd00a, 0xd00a, 0xd00a, 0xd009, 0xd009, 0xd009, + 0xd009, 0xd009, 0xd008, 0xd008, 0xd008, 0xd008, 0xd007, 0xd007, + 0xd007, 0xd007, 0xd007, 0xd006, 0xd006, 0xd006, 0xd006, 0xd005, + 0xd005, 0xd005, 0xd005, 0xd005, 0xd004, 0xd004, 0xd004, 0xd004, + 0xd004, 0xd003, 0xd003, 0xd003, 0xd003, 0xd002, 0xd002, 0xd002, + 0xd002, 0xd002, 0xd001, 0xd001, 0xd001, 0xd001, 0xd000, 0xd000, + 0xd000, 0xd000, 0xcfff, 0xcfff, 0xcffe, 0xcffe, 0xcffe, 0xcffd, + 0xcffd, 0xcffc, 0xcffc, 0xcffb, 0xcffb, 0xcffb, 0xcffa, 0xcffa, + 0xcff9, 0xcff9, 0xcff9, 0xcff8, 0xcff8, 0xcff7, 0xcff7, 0xcff6, + 0xcff6, 0xcff6, 0xcff5, 0xcff5, 0xcff4, 0xcff4, 0xcff3, 0xcff3, + 0xcff3, 0xcff2, 0xcff2, 0xcff1, 0xcff1, 0xcff1, 0xcff0, 0xcff0, + 0xcfef, 0xcfef, 0xcfef, 0xcfee, 0xcfee, 0xcfed, 0xcfed, 0xcfec, + 0xcfec, 0xcfec, 0xcfeb, 0xcfeb, 0xcfea, 0xcfea, 0xcfea, 0xcfe9, + 0xcfe9, 0xcfe8, 0xcfe8, 0xcfe8, 0xcfe7, 0xcfe7, 0xcfe6, 0xcfe6, + 0xcfe6, 0xcfe5, 0xcfe5, 0xcfe4, 0xcfe4, 0xcfe4, 0xcfe3, 0xcfe3, + 0xcfe2, 0xcfe2, 0xcfe2, 0xcfe1, 0xcfe1, 0xcfe0, 0xcfe0, 0xcfdf, + 0xcfdf, 0xcfdf, 0xcfde, 0xcfde, 0xcfde, 0xcfdd, 0xcfdd, 0xcfdc, + 0xcfdc, 0xcfdc, 0xcfdb, 0xcfdb, 0xcfda, 0xcfda, 0xcfda, 0xcfd9, + 0xcfd9, 0xcfd8, 0xcfd8, 0xcfd8, 0xcfd7, 0xcfd7, 0xcfd6, 0xcfd6, + 0xcfd6, 0xcfd5, 0xcfd5, 0xcfd4, 0xcfd4, 0xcfd4, 0xcfd3, 0xcfd3, + 0xcfd2, 0xcfd2, 0xcfd2, 0xcfd1, 0xcfd1, 0xcfd1, 0xcfd0, 0xcfd0, + 0xcfcf, 0xcfcf, 0xcfcf, 0xcfce, 0xcfce, 0xcfcd, 0xcfcd, 0xcfcd, + 0xcfcc, 0xcfcc, 0xcfcb, 0xcfcb, 0xcfcb, 0xcfca, 0xcfca, 0xcfca, + 0xcfc9, 0xcfc9, 0xcfc8, 0xcfc8, 0xcfc8, 0xcfc7, 0xcfc7, 0xcfc6, + 0xcfc6, 0xcfc6, 0xcfc5, 0xcfc5, 0xcfc5, 0xcfc4, 0xcfc4, 0xcfc3, + 0xcfc3, 0xcfc3, 0xcfc2, 0xcfc2, 0xcfc2, 0xcfc1, 0xcfc1, 0xcfc0, + 0xcfc0, 0xcfc0, 0xcfbf, 0xcfbf, 0xcfbf, 0xcfbe, 0xcfbe, 0xcfbd, + 0xcfbd, 0xcfbd, 0xcfbc, 0xcfbc, 0xcfbc, 0xcfbb, 0xcfbb, 0xcfba, + 0xcfba, 0xcfba, 0xcfb9, 0xcfb9, 0xcfb9, 0xcfb8, 0xcfb8, 0xcfb7, + 0xcfb7, 0xcfb7, 0xcfb6, 0xcfb6, 0xcfb6, 0xcfb5, 0xcfb5, 0xcfb5, + 0xcfb4, 0xcfb4, 0xcfb3, 0xcfb3, 0xcfb3, 0xcfb2, 0xcfb2, 0xcfb2, + 0xcfb1, 0xcfb1, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfaf, 0xcfaf, 0xcfaf, + 0xcfae, 0xcfae, 0xcfae, 0xcfad, 0xcfad, 0xcfac, 0xcfac, 0xcfac, + 0xcfab, 0xcfab, 0xcfab, 0xcfaa, 0xcfaa, 0xcfaa, 0xcfa9, 0xcfa9, + 0xcfa9, 0xcfa8, 0xcfa8, 0xcfa7, 0xcfa7, 0xcfa7, 0xcfa6, 0xcfa6, + 0xcfa6, 0xcfa5, 0xcfa5, 0xcfa5, 0xcfa4, 0xcfa4, 0xcfa4, 0xcfa3, + 0xcfa3, 0xcfa2, 0xcfa2, 0xcfa2, 0xcfa1, 0xcfa1, 0xcfa1, 0xcfa0, + 0xcfa0, 0xcfa0, 0xcf9f, 0xcf9f, 0xcf9f, 0xcf9e, 0xcf9e, 0xcf9d, + 0xcf9d, 0xcf9d, 0xcf9c, 0xcf9c, 0xcf9c, 0xcf9b, 0xcf9b, 0xcf9b, + 0xcf9a, 0xcf9a, 0xcf9a, 0xcf99, 0xcf99, 0xcf99, 0xcf98, 0xcf98, + 0xcf98, 0xcf97, 0xcf97, 0xcf96, 0xcf96, 0xcf96, 0xcf95, 0xcf95, + 0xcf95, 0xcf94, 0xcf94, 0xcf94, 0xcf93, 0xcf93, 0xcf93, 0xcf92, + 0xcf92, 0xcf92, 0xcf91, 0xcf91, 0xcf91, 0xcf90, 0xcf90, 0xcf90, + 0xcf8f, 0xcf8f, 0xcf8f, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8d, 0xcf8d, + 0xcf8d, 0xcf8c, 0xcf8c, 0xcf8c, 0xcf8b, 0xcf8b, 0xcf8a, 0xcf8a, + 0xcf8a, 0xcf89, 0xcf89, 0xcf89, 0xcf88, 0xcf88, 0xcf88, 0xcf87, + 0xcf87, 0xcf87, 0xcf86, 0xcf86, 0xcf86, 0xcf85, 0xcf85, 0xcf85, + 0xcf84, 0xcf84, 0xcf84, 0xcf83, 0xcf83, 0xcf83, 0xcf82, 0xcf82, + 0xcf82, 0xcf81, 0xcf81, 0xcf81, 0xcf80, 0xcf80, 0xcf80, 0xcf7f, + 0xcf7f, 0xcf7f, 0xcf7e, 0xcf7e, 0xcf7e, 0xcf7d, 0xcf7d, 0xcf7d, + 0xcf7c, 0xcf7c, 0xcf7c, 0xcf7b, 0xcf7b, 0xcf7b, 0xcf7a, 0xcf7a, + 0xcf7a, 0xcf79, 0xcf79, 0xcf79, 0xcf79, 0xcf78, 0xcf78, 0xcf78, + 0xcf77, 0xcf77, 0xcf77, 0xcf76, 0xcf76, 0xcf76, 0xcf75, 0xcf75, + 0xcf75, 0xcf74, 0xcf74, 0xcf74, 0xcf73, 0xcf73, 0xcf73, 0xcf72, + 0xcf72, 0xcf72, 0xcf71, 0xcf71, 0xcf71, 0xcf70, 0xcf70, 0xcf70, + 0xcf6f, 0xcf6f, 0xcf6f, 0xcf6e, 0xcf6e, 0xcf6e, 0xcf6d, 0xcf6d, + 0xcf6d, 0xcf6d, 0xcf6c, 0xcf6c, 0xcf6c, 0xcf6b, 0xcf6b, 0xcf6b, + 0xcf6a, 0xcf6a, 0xcf6a, 0xcf69, 0xcf69, 0xcf69, 0xcf68, 0xcf68, + 0xcf68, 0xcf67, 0xcf67, 0xcf67, 0xcf66, 0xcf66, 0xcf66, 0xcf66, + 0xcf65, 0xcf65, 0xcf65, 0xcf64, 0xcf64, 0xcf64, 0xcf63, 0xcf63, + 0xcf63, 0xcf62, 0xcf62, 0xcf62, 0xcf61, 0xcf61, 0xcf61, 0xcf61, + 0xcf60, 0xcf60, 0xcf60, 0xcf5f, 0xcf5f, 0xcf5f, 0xcf5e, 0xcf5e, + 0xcf5e, 0xcf5d, 0xcf5d, 0xcf5d, 0xcf5c, 0xcf5c, 0xcf5c, 0xcf5c, + 0xcf5b, 0xcf5b, 0xcf5b, 0xcf5a, 0xcf5a, 0xcf5a, 0xcf59, 0xcf59, + 0xcf59, 0xcf58, 0xcf58, 0xcf58, 0xcf58, 0xcf57, 0xcf57, 0xcf57, + 0xcf56, 0xcf56, 0xcf56, 0xcf55, 0xcf55, 0xcf55, 0xcf54, 0xcf54, + 0xcf54, 0xcf54, 0xcf53, 0xcf53, 0xcf53, 0xcf52, 0xcf52, 0xcf52, + 0xcf51, 0xcf51, 0xcf51, 0xcf51, 0xcf50, 0xcf50, 0xcf50, 0xcf4f, + 0xcf4f, 0xcf4f, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4d, 0xcf4d, + 0xcf4d, 0xcf4c, 0xcf4c, 0xcf4c, 0xcf4b, 0xcf4b, 0xcf4b, 0xcf4b, + 0xcf4a, 0xcf4a, 0xcf4a, 0xcf49, 0xcf49, 0xcf49, 0xcf48, 0xcf48, + 0xcf48, 0xcf48, 0xcf47, 0xcf47, 0xcf47, 0xcf46, 0xcf46, 0xcf46, + 0xcf45, 0xcf45, 0xcf45, 0xcf45, 0xcf44, 0xcf44, 0xcf44, 0xcf43, + 0xcf43, 0xcf43, 0xcf42, 0xcf42, 0xcf42, 0xcf42, 0xcf41, 0xcf41, + 0xcf41, 0xcf40, 0xcf40, 0xcf40, 0xcf40, 0xcf3f, 0xcf3f, 0xcf3f, + 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3d, 0xcf3d, 0xcf3d, 0xcf3c, + 0xcf3c, 0xcf3c, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3a, 0xcf3a, + 0xcf3a, 0xcf39, 0xcf39, 0xcf39, 0xcf39, 0xcf38, 0xcf38, 0xcf38, + 0xcf37, 0xcf37, 0xcf37, 0xcf37, 0xcf36, 0xcf36, 0xcf36, 0xcf35, + 0xcf35, 0xcf35, 0xcf35, 0xcf34, 0xcf34, 0xcf34, 0xcf33, 0xcf33, + 0xcf33, 0xcf33, 0xcf32, 0xcf32, 0xcf32, 0xcf31, 0xcf31, 0xcf31, + 0xcf31, 0xcf30, 0xcf30, 0xcf30, 0xcf2f, 0xcf2f, 0xcf2f, 0xcf2f, + 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2c, + 0xcf2c, 0xcf2c, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2a, 0xcf2a, + 0xcf2a, 0xcf29, 0xcf29, 0xcf29, 0xcf29, 0xcf28, 0xcf28, 0xcf28, + 0xcf28, 0xcf27, 0xcf27, 0xcf27, 0xcf26, 0xcf26, 0xcf26, 0xcf26, + 0xcf25, 0xcf25, 0xcf25, 0xcf24, 0xcf24, 0xcf24, 0xcf24, 0xcf23, + 0xcf23, 0xcf23, 0xcf23, 0xcf22, 0xcf22, 0xcf22, 0xcf21, 0xcf21, + 0xcf21, 0xcf21, 0xcf20, 0xcf20, 0xcf20, 0xcf1f, 0xcf1f, 0xcf1f, + 0xcf1f, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1d, 0xcf1d, 0xcf1d, + 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, + 0xcf1a, 0xcf1a, 0xcf1a, 0xcf19, 0xcf19, 0xcf19, 0xcf19, 0xcf18, + 0xcf18, 0xcf18, 0xcf18, 0xcf17, 0xcf17, 0xcf17, 0xcf16, 0xcf16, + 0xcf16, 0xcf16, 0xcf15, 0xcf15, 0xcf15, 0xcf15, 0xcf14, 0xcf14, + 0xcf14, 0xcf14, 0xcf13, 0xcf13, 0xcf13, 0xcf12, 0xcf12, 0xcf12, + 0xcf12, 0xcf11, 0xcf11, 0xcf11, 0xcf11, 0xcf10, 0xcf10, 0xcf10, + 0xcf10, 0xcf0f, 0xcf0f, 0xcf0f, 0xcf0e, 0xcf0e, 0xcf0e, 0xcf0e, + 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0c, 0xcf0c, 0xcf0c, 0xcf0c, + 0xcf0b, 0xcf0b, 0xcf0b, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf09, + 0xcf09, 0xcf09, 0xcf09, 0xcf08, 0xcf08, 0xcf08, 0xcf08, 0xcf07, + 0xcf07, 0xcf07, 0xcf07, 0xcf06, 0xcf06, 0xcf06, 0xcf05, 0xcf05, + 0xcf05, 0xcf05, 0xcf04, 0xcf04, 0xcf04, 0xcf04, 0xcf03, 0xcf03, + 0xcf03, 0xcf03, 0xcf02, 0xcf02, 0xcf02, 0xcf02, 0xcf01, 0xcf01, + 0xcf01, 0xcf01, 0xcf00, 0xcf00, 0xcf00, 0xceff, 0xceff, 0xceff, + 0xceff, 0xcefe, 0xcefe, 0xcefe, 0xcefe, 0xcefd, 0xcefd, 0xcefd, + 0xcefd, 0xcefc, 0xcefc, 0xcefc, 0xcefc, 0xcefb, 0xcefb, 0xcefb, + 0xcefb, 0xcefa, 0xcefa, 0xcefa, 0xcefa, 0xcef9, 0xcef9, 0xcef9, + 0xcef9, 0xcef8, 0xcef8, 0xcef8, 0xcef8, 0xcef7, 0xcef7, 0xcef7, + 0xcef7, 0xcef6, 0xcef6, 0xcef6, 0xcef6, 0xcef5, 0xcef5, 0xcef5, + 0xcef4, 0xcef4, 0xcef4, 0xcef4, 0xcef3, 0xcef3, 0xcef3, 0xcef3, + 0xcef2, 0xcef2, 0xcef2, 0xcef2, 0xcef1, 0xcef1, 0xcef1, 0xcef1, + 0xcef0, 0xcef0, 0xcef0, 0xcef0, 0xceef, 0xceef, 0xceef, 0xceef, + 0xceee, 0xceee, 0xceed, 0xceed, 0xceec, 0xceec, 0xceeb, 0xceeb, + 0xceea, 0xceea, 0xcee9, 0xcee9, 0xcee8, 0xcee8, 0xcee8, 0xcee7, + 0xcee7, 0xcee6, 0xcee6, 0xcee5, 0xcee5, 0xcee4, 0xcee4, 0xcee3, + 0xcee3, 0xcee2, 0xcee2, 0xcee1, 0xcee1, 0xcee0, 0xcee0, 0xcedf, + 0xcedf, 0xcede, 0xcede, 0xcedd, 0xcedd, 0xcedc, 0xcedc, 0xcedb, + 0xcedb, 0xceda, 0xceda, 0xced9, 0xced9, 0xced8, 0xced8, 0xced7, + 0xced7, 0xced7, 0xced6, 0xced6, 0xced5, 0xced5, 0xced4, 0xced4, + 0xced3, 0xced3, 0xced2, 0xced2, 0xced1, 0xced1, 0xced0, 0xced0, + 0xcecf, 0xcecf, 0xcece, 0xcece, 0xcece, 0xcecd, 0xcecd, 0xcecc, + 0xcecc, 0xcecb, 0xcecb, 0xceca, 0xceca, 0xcec9, 0xcec9, 0xcec8, + 0xcec8, 0xcec7, 0xcec7, 0xcec7, 0xcec6, 0xcec6, 0xcec5, 0xcec5, + 0xcec4, 0xcec4, 0xcec3, 0xcec3, 0xcec2, 0xcec2, 0xcec1, 0xcec1, + 0xcec1, 0xcec0, 0xcec0, 0xcebf, 0xcebf, 0xcebe, 0xcebe, 0xcebd, + 0xcebd, 0xcebc, 0xcebc, 0xcebc, 0xcebb, 0xcebb, 0xceba, 0xceba, + 0xceb9, 0xceb9, 0xceb8, 0xceb8, 0xceb8, 0xceb7, 0xceb7, 0xceb6, + 0xceb6, 0xceb5, 0xceb5, 0xceb4, 0xceb4, 0xceb3, 0xceb3, 0xceb3, + 0xceb2, 0xceb2, 0xceb1, 0xceb1, 0xceb0, 0xceb0, 0xceaf, 0xceaf, + 0xceaf, 0xceae, 0xceae, 0xcead, 0xcead, 0xceac, 0xceac, 0xceac, + 0xceab, 0xceab, 0xceaa, 0xceaa, 0xcea9, 0xcea9, 0xcea8, 0xcea8, + 0xcea8, 0xcea7, 0xcea7, 0xcea6, 0xcea6, 0xcea5, 0xcea5, 0xcea5, + 0xcea4, 0xcea4, 0xcea3, 0xcea3, 0xcea2, 0xcea2, 0xcea2, 0xcea1, + 0xcea1, 0xcea0, 0xcea0, 0xce9f, 0xce9f, 0xce9f, 0xce9e, 0xce9e, + 0xce9d, 0xce9d, 0xce9c, 0xce9c, 0xce9c, 0xce9b, 0xce9b, 0xce9a, + 0xce9a, 0xce99, 0xce99, 0xce99, 0xce98, 0xce98, 0xce97, 0xce97, + 0xce96, 0xce96, 0xce96, 0xce95, 0xce95, 0xce94, 0xce94, 0xce94, + 0xce93, 0xce93, 0xce92, 0xce92, 0xce91, 0xce91, 0xce91, 0xce90, + 0xce90, 0xce8f, 0xce8f, 0xce8f, 0xce8e, 0xce8e, 0xce8d, 0xce8d, + 0xce8c, 0xce8c, 0xce8c, 0xce8b, 0xce8b, 0xce8a, 0xce8a, 0xce8a, + 0xce89, 0xce89, 0xce88, 0xce88, 0xce88, 0xce87, 0xce87, 0xce86, + 0xce86, 0xce85, 0xce85, 0xce85, 0xce84, 0xce84, 0xce83, 0xce83, + 0xce83, 0xce82, 0xce82, 0xce81, 0xce81, 0xce81, 0xce80, 0xce80, + 0xce7f, 0xce7f, 0xce7f, 0xce7e, 0xce7e, 0xce7d, 0xce7d, 0xce7d, + 0xce7c, 0xce7c, 0xce7b, 0xce7b, 0xce7b, 0xce7a, 0xce7a, 0xce79, + 0xce79, 0xce79, 0xce78, 0xce78, 0xce77, 0xce77, 0xce77, 0xce76, + 0xce76, 0xce75, 0xce75, 0xce75, 0xce74, 0xce74, 0xce73, 0xce73, + 0xce73, 0xce72, 0xce72, 0xce72, 0xce71, 0xce71, 0xce70, 0xce70, + 0xce70, 0xce6f, 0xce6f, 0xce6e, 0xce6e, 0xce6e, 0xce6d, 0xce6d, + 0xce6c, 0xce6c, 0xce6c, 0xce6b, 0xce6b, 0xce6b, 0xce6a, 0xce6a, + 0xce69, 0xce69, 0xce69, 0xce68, 0xce68, 0xce67, 0xce67, 0xce67, + 0xce66, 0xce66, 0xce66, 0xce65, 0xce65, 0xce64, 0xce64, 0xce64, + 0xce63, 0xce63, 0xce62, 0xce62, 0xce62, 0xce61, 0xce61, 0xce61, + 0xce60, 0xce60, 0xce5f, 0xce5f, 0xce5f, 0xce5e, 0xce5e, 0xce5e, + 0xce5d, 0xce5d, 0xce5c, 0xce5c, 0xce5c, 0xce5b, 0xce5b, 0xce5b, + 0xce5a, 0xce5a, 0xce59, 0xce59, 0xce59, 0xce58, 0xce58, 0xce58, + 0xce57, 0xce57, 0xce56, 0xce56, 0xce56, 0xce55, 0xce55, 0xce55, + 0xce54, 0xce54, 0xce53, 0xce53, 0xce53, 0xce52, 0xce52, 0xce52, + 0xce51, 0xce51, 0xce51, 0xce50, 0xce50, 0xce4f, 0xce4f, 0xce4f, + 0xce4e, 0xce4e, 0xce4e, 0xce4d, 0xce4d, 0xce4d, 0xce4c, 0xce4c, + 0xce4b, 0xce4b, 0xce4b, 0xce4a, 0xce4a, 0xce4a, 0xce49, 0xce49, + 0xce49, 0xce48, 0xce48, 0xce47, 0xce47, 0xce47, 0xce46, 0xce46, + 0xce46, 0xce45, 0xce45, 0xce45, 0xce44, 0xce44, 0xce43, 0xce43, + 0xce43, 0xce42, 0xce42, 0xce42, 0xce41, 0xce41, 0xce41, 0xce40, + 0xce40, 0xce40, 0xce3f, 0xce3f, 0xce3e, 0xce3e, 0xce3e, 0xce3d, + 0xce3d, 0xce3d, 0xce3c, 0xce3c, 0xce3c, 0xce3b, 0xce3b, 0xce3b, + 0xce3a, 0xce3a, 0xce3a, 0xce39, 0xce39, 0xce38, 0xce38, 0xce38, + 0xce37, 0xce37, 0xce37, 0xce36, 0xce36, 0xce36, 0xce35, 0xce35, + 0xce35, 0xce34, 0xce34, 0xce34, 0xce33, 0xce33, 0xce33, 0xce32, + 0xce32, 0xce32, 0xce31, 0xce31, 0xce30, 0xce30, 0xce30, 0xce2f, + 0xce2f, 0xce2f, 0xce2e, 0xce2e, 0xce2e, 0xce2d, 0xce2d, 0xce2d, + 0xce2c, 0xce2c, 0xce2c, 0xce2b, 0xce2b, 0xce2b, 0xce2a, 0xce2a, + 0xce2a, 0xce29, 0xce29, 0xce29, 0xce28, 0xce28, 0xce28, 0xce27, + 0xce27, 0xce27, 0xce26, 0xce26, 0xce26, 0xce25, 0xce25, 0xce25, + 0xce24, 0xce24, 0xce24, 0xce23, 0xce23, 0xce23, 0xce22, 0xce22, + 0xce22, 0xce21, 0xce21, 0xce21, 0xce20, 0xce20, 0xce20, 0xce1f, + 0xce1f, 0xce1f, 0xce1e, 0xce1e, 0xce1e, 0xce1d, 0xce1d, 0xce1d, + 0xce1c, 0xce1c, 0xce1c, 0xce1b, 0xce1b, 0xce1b, 0xce1a, 0xce1a, + 0xce1a, 0xce19, 0xce19, 0xce19, 0xce18, 0xce18, 0xce18, 0xce17, + 0xce17, 0xce17, 0xce16, 0xce16, 0xce16, 0xce15, 0xce15, 0xce15, + 0xce14, 0xce14, 0xce14, 0xce13, 0xce13, 0xce13, 0xce12, 0xce12, + 0xce12, 0xce11, 0xce11, 0xce11, 0xce10, 0xce10, 0xce10, 0xce0f, + 0xce0f, 0xce0f, 0xce0e, 0xce0e, 0xce0e, 0xce0d, 0xce0d, 0xce0d, + 0xce0d, 0xce0c, 0xce0c, 0xce0c, 0xce0b, 0xce0b, 0xce0b, 0xce0a, + 0xce0a, 0xce0a, 0xce09, 0xce09, 0xce09, 0xce08, 0xce08, 0xce08, + 0xce07, 0xce07, 0xce07, 0xce06, 0xce06, 0xce06, 0xce05, 0xce05, + 0xce05, 0xce05, 0xce04, 0xce04, 0xce04, 0xce03, 0xce03, 0xce03, + 0xce02, 0xce02, 0xce02, 0xce01, 0xce01, 0xce01, 0xce00, 0xce00, + 0xce00, 0xce00, 0xcdff, 0xcdff, 0xcdff, 0xcdfe, 0xcdfe, 0xcdfe, + 0xcdfd, 0xcdfd, 0xcdfd, 0xcdfc, 0xcdfc, 0xcdfc, 0xcdfb, 0xcdfb, + 0xcdfb, 0xcdfb, 0xcdfa, 0xcdfa, 0xcdfa, 0xcdf9, 0xcdf9, 0xcdf9, + 0xcdf8, 0xcdf8, 0xcdf8, 0xcdf7, 0xcdf7, 0xcdf7, 0xcdf6, 0xcdf6, + 0xcdf6, 0xcdf6, 0xcdf5, 0xcdf5, 0xcdf5, 0xcdf4, 0xcdf4, 0xcdf4, + 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf2, 0xcdf2, 0xcdf2, 0xcdf1, + 0xcdf1, 0xcdf1, 0xcdf0, 0xcdf0, 0xcdf0, 0xcdef, 0xcdef, 0xcdef, + 0xcdef, 0xcdee, 0xcdee, 0xcdee, 0xcded, 0xcded, 0xcded, 0xcdec, + 0xcdec, 0xcdec, 0xcdec, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdea, 0xcdea, + 0xcdea, 0xcde9, 0xcde9, 0xcde9, 0xcde9, 0xcde8, 0xcde8, 0xcde8, + 0xcde7, 0xcde7, 0xcde7, 0xcde6, 0xcde6, 0xcde6, 0xcde6, 0xcde5, + 0xcde5, 0xcde5, 0xcde4, 0xcde4, 0xcde4, 0xcde3, 0xcde3, 0xcde3, + 0xcde3, 0xcde2, 0xcde2, 0xcde2, 0xcde1, 0xcde1, 0xcde1, 0xcde0, + 0xcde0, 0xcde0, 0xcde0, 0xcddf, 0xcddf, 0xcddf, 0xcdde, 0xcdde, + 0xcdde, 0xcdde, 0xcddd, 0xcddd, 0xcddd, 0xcddc, 0xcddc, 0xcddc, + 0xcddb, 0xcddb, 0xcddb, 0xcddb, 0xcdda, 0xcdda, 0xcdda, 0xcdd9, + 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd8, 0xcdd8, 0xcdd8, 0xcdd7, 0xcdd7, + 0xcdd7, 0xcdd7, 0xcdd6, 0xcdd6, 0xcdd6, 0xcdd5, 0xcdd5, 0xcdd5, + 0xcdd5, 0xcdd4, 0xcdd4, 0xcdd4, 0xcdd3, 0xcdd3, 0xcdd3, 0xcdd3, + 0xcdd2, 0xcdd2, 0xcdd2, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd0, + 0xcdd0, 0xcdd0, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdce, 0xcdce, + 0xcdce, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcc, 0xcdcc, 0xcdcc, + 0xcdcb, 0xcdcb, 0xcdcb, 0xcdcb, 0xcdca, 0xcdca, 0xcdca, 0xcdc9, + 0xcdc9, 0xcdc9, 0xcdc9, 0xcdc8, 0xcdc8, 0xcdc8, 0xcdc7, 0xcdc7, + 0xcdc7, 0xcdc7, 0xcdc6, 0xcdc6, 0xcdc6, 0xcdc5, 0xcdc5, 0xcdc5, + 0xcdc5, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc3, 0xcdc3, 0xcdc3, + 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc1, 0xcdc1, 0xcdc1, 0xcdc0, + 0xcdc0, 0xcdc0, 0xcdc0, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbe, + 0xcdbe, 0xcdbe, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbc, 0xcdbc, + 0xcdbc, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdba, 0xcdba, 0xcdba, + 0xcdba, 0xcdb9, 0xcdb9, 0xcdb9, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, + 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb6, 0xcdb6, 0xcdb6, 0xcdb5, + 0xcdb5, 0xcdb5, 0xcdb5, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb3, + 0xcdb3, 0xcdb3, 0xcdb3, 0xcdb2, 0xcdb2, 0xcdb2, 0xcdb1, 0xcdb1, + 0xcdb1, 0xcdb1, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdaf, 0xcdaf, + 0xcdaf, 0xcdae, 0xcdae, 0xcdae, 0xcdae, 0xcdad, 0xcdad, 0xcdad, + 0xcdad, 0xcdac, 0xcdac, 0xcdac, 0xcdac, 0xcdab, 0xcdab, 0xcdab, + 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, 0xcda9, 0xcda9, 0xcda9, 0xcda9, + 0xcda8, 0xcda8, 0xcda8, 0xcda8, 0xcda7, 0xcda7, 0xcda7, 0xcda7, + 0xcda6, 0xcda6, 0xcda6, 0xcda5, 0xcda5, 0xcda5, 0xcda5, 0xcda4, + 0xcda4, 0xcda4, 0xcda4, 0xcda3, 0xcda3, 0xcda3, 0xcda3, 0xcda2, + 0xcda2, 0xcda2, 0xcda2, 0xcda1, 0xcda1, 0xcda1, 0xcda0, 0xcda0, + 0xcda0, 0xcda0, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9e, 0xcd9e, + 0xcd9e, 0xcd9e, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9c, 0xcd9c, + 0xcd9c, 0xcd9c, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9a, 0xcd9a, + 0xcd9a, 0xcd9a, 0xcd99, 0xcd99, 0xcd99, 0xcd98, 0xcd98, 0xcd98, + 0xcd98, 0xcd97, 0xcd97, 0xcd97, 0xcd97, 0xcd96, 0xcd96, 0xcd96, + 0xcd96, 0xcd95, 0xcd95, 0xcd95, 0xcd95, 0xcd94, 0xcd94, 0xcd94, + 0xcd94, 0xcd93, 0xcd93, 0xcd93, 0xcd93, 0xcd92, 0xcd92, 0xcd92, + 0xcd92, 0xcd91, 0xcd91, 0xcd91, 0xcd91, 0xcd90, 0xcd90, 0xcd90, + 0xcd90, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8e, 0xcd8e, 0xcd8e, + 0xcd8e, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8c, 0xcd8c, 0xcd8c, + 0xcd8c, 0xcd8b, 0xcd8b, 0xcd8a, 0xcd8a, 0xcd89, 0xcd89, 0xcd88, + 0xcd88, 0xcd87, 0xcd87, 0xcd86, 0xcd86, 0xcd85, 0xcd85, 0xcd84, + 0xcd84, 0xcd83, 0xcd83, 0xcd82, 0xcd82, 0xcd81, 0xcd81, 0xcd80, + 0xcd80, 0xcd7f, 0xcd7f, 0xcd7e, 0xcd7e, 0xcd7d, 0xcd7d, 0xcd7c, + 0xcd7c, 0xcd7b, 0xcd7b, 0xcd7a, 0xcd7a, 0xcd79, 0xcd79, 0xcd78, + 0xcd78, 0xcd77, 0xcd77, 0xcd77, 0xcd76, 0xcd76, 0xcd75, 0xcd75, + 0xcd74, 0xcd74, 0xcd73, 0xcd73, 0xcd72, 0xcd72, 0xcd71, 0xcd71, + 0xcd70, 0xcd70, 0xcd6f, 0xcd6f, 0xcd6e, 0xcd6e, 0xcd6d, 0xcd6d, + 0xcd6d, 0xcd6c, 0xcd6c, 0xcd6b, 0xcd6b, 0xcd6a, 0xcd6a, 0xcd69, + 0xcd69, 0xcd68, 0xcd68, 0xcd67, 0xcd67, 0xcd66, 0xcd66, 0xcd66, + 0xcd65, 0xcd65, 0xcd64, 0xcd64, 0xcd63, 0xcd63, 0xcd62, 0xcd62, + 0xcd61, 0xcd61, 0xcd60, 0xcd60, 0xcd60, 0xcd5f, 0xcd5f, 0xcd5e, + 0xcd5e, 0xcd5d, 0xcd5d, 0xcd5c, 0xcd5c, 0xcd5b, 0xcd5b, 0xcd5a, + 0xcd5a, 0xcd5a, 0xcd59, 0xcd59, 0xcd58, 0xcd58, 0xcd57, 0xcd57, + 0xcd56, 0xcd56, 0xcd56, 0xcd55, 0xcd55, 0xcd54, 0xcd54, 0xcd53, + 0xcd53, 0xcd52, 0xcd52, 0xcd51, 0xcd51, 0xcd51, 0xcd50, 0xcd50, + 0xcd4f, 0xcd4f, 0xcd4e, 0xcd4e, 0xcd4d, 0xcd4d, 0xcd4d, 0xcd4c, + 0xcd4c, 0xcd4b, 0xcd4b, 0xcd4a, 0xcd4a, 0xcd4a, 0xcd49, 0xcd49, + 0xcd48, 0xcd48, 0xcd47, 0xcd47, 0xcd46, 0xcd46, 0xcd46, 0xcd45, + 0xcd45, 0xcd44, 0xcd44, 0xcd43, 0xcd43, 0xcd43, 0xcd42, 0xcd42, + 0xcd41, 0xcd41, 0xcd40, 0xcd40, 0xcd40, 0xcd3f, 0xcd3f, 0xcd3e, + 0xcd3e, 0xcd3d, 0xcd3d, 0xcd3c, 0xcd3c, 0xcd3c, 0xcd3b, 0xcd3b, + 0xcd3a, 0xcd3a, 0xcd3a, 0xcd39, 0xcd39, 0xcd38, 0xcd38, 0xcd37, + 0xcd37, 0xcd37, 0xcd36, 0xcd36, 0xcd35, 0xcd35, 0xcd34, 0xcd34, + 0xcd34, 0xcd33, 0xcd33, 0xcd32, 0xcd32, 0xcd31, 0xcd31, 0xcd31, + 0xcd30, 0xcd30, 0xcd2f, 0xcd2f, 0xcd2f, 0xcd2e, 0xcd2e, 0xcd2d, + 0xcd2d, 0xcd2c, 0xcd2c, 0xcd2c, 0xcd2b, 0xcd2b, 0xcd2a, 0xcd2a, + 0xcd2a, 0xcd29, 0xcd29, 0xcd28, 0xcd28, 0xcd28, 0xcd27, 0xcd27, + 0xcd26, 0xcd26, 0xcd25, 0xcd25, 0xcd25, 0xcd24, 0xcd24, 0xcd23, + 0xcd23, 0xcd23, 0xcd22, 0xcd22, 0xcd21, 0xcd21, 0xcd21, 0xcd20, + 0xcd20, 0xcd1f, 0xcd1f, 0xcd1f, 0xcd1e, 0xcd1e, 0xcd1d, 0xcd1d, + 0xcd1d, 0xcd1c, 0xcd1c, 0xcd1b, 0xcd1b, 0xcd1b, 0xcd1a, 0xcd1a, + 0xcd19, 0xcd19, 0xcd19, 0xcd18, 0xcd18, 0xcd17, 0xcd17, 0xcd17, + 0xcd16, 0xcd16, 0xcd15, 0xcd15, 0xcd15, 0xcd14, 0xcd14, 0xcd13, + 0xcd13, 0xcd13, 0xcd12, 0xcd12, 0xcd11, 0xcd11, 0xcd11, 0xcd10, + 0xcd10, 0xcd0f, 0xcd0f, 0xcd0f, 0xcd0e, 0xcd0e, 0xcd0d, 0xcd0d, + 0xcd0d, 0xcd0c, 0xcd0c, 0xcd0c, 0xcd0b, 0xcd0b, 0xcd0a, 0xcd0a, + 0xcd0a, 0xcd09, 0xcd09, 0xcd08, 0xcd08, 0xcd08, 0xcd07, 0xcd07, + 0xcd06, 0xcd06, 0xcd06, 0xcd05, 0xcd05, 0xcd05, 0xcd04, 0xcd04, + 0xcd03, 0xcd03, 0xcd03, 0xcd02, 0xcd02, 0xcd01, 0xcd01, 0xcd01, + 0xcd00, 0xcd00, 0xcd00, 0xccff, 0xccff, 0xccfe, 0xccfe, 0xccfe, + 0xccfd, 0xccfd, 0xccfd, 0xccfc, 0xccfc, 0xccfb, 0xccfb, 0xccfb, + 0xccfa, 0xccfa, 0xccfa, 0xccf9, 0xccf9, 0xccf8, 0xccf8, 0xccf8, + 0xccf7, 0xccf7, 0xccf7, 0xccf6, 0xccf6, 0xccf5, 0xccf5, 0xccf5, + 0xccf4, 0xccf4, 0xccf4, 0xccf3, 0xccf3, 0xccf2, 0xccf2, 0xccf2, + 0xccf1, 0xccf1, 0xccf1, 0xccf0, 0xccf0, 0xccef, 0xccef, 0xccef, + 0xccee, 0xccee, 0xccee, 0xcced, 0xcced, 0xcced, 0xccec, 0xccec, + 0xcceb, 0xcceb, 0xcceb, 0xccea, 0xccea, 0xccea, 0xcce9, 0xcce9, + 0xcce9, 0xcce8, 0xcce8, 0xcce7, 0xcce7, 0xcce7, 0xcce6, 0xcce6, + 0xcce6, 0xcce5, 0xcce5, 0xcce5, 0xcce4, 0xcce4, 0xcce3, 0xcce3, + 0xcce3, 0xcce2, 0xcce2, 0xcce2, 0xcce1, 0xcce1, 0xcce1, 0xcce0, + 0xcce0, 0xcce0, 0xccdf, 0xccdf, 0xccde, 0xccde, 0xccde, 0xccdd, + 0xccdd, 0xccdd, 0xccdc, 0xccdc, 0xccdc, 0xccdb, 0xccdb, 0xccdb, + 0xccda, 0xccda, 0xccd9, 0xccd9, 0xccd9, 0xccd8, 0xccd8, 0xccd8, + 0xccd7, 0xccd7, 0xccd7, 0xccd6, 0xccd6, 0xccd6, 0xccd5, 0xccd5, + 0xccd5, 0xccd4, 0xccd4, 0xccd3, 0xccd3, 0xccd3, 0xccd2, 0xccd2, + 0xccd2, 0xccd1, 0xccd1, 0xccd1, 0xccd0, 0xccd0, 0xccd0, 0xcccf, + 0xcccf, 0xcccf, 0xccce, 0xccce, 0xccce, 0xcccd, 0xcccd, 0xcccd, + 0xcccc, 0xcccc, 0xcccc, 0xcccb, 0xcccb, 0xcccb, 0xccca, 0xccca, + 0xccc9, 0xccc9, 0xccc9, 0xccc8, 0xccc8, 0xccc8, 0xccc7, 0xccc7, + 0xccc7, 0xccc6, 0xccc6, 0xccc6, 0xccc5, 0xccc5, 0xccc5, 0xccc4, + 0xccc4, 0xccc4, 0xccc3, 0xccc3, 0xccc3, 0xccc2, 0xccc2, 0xccc2, + 0xccc1, 0xccc1, 0xccc1, 0xccc0, 0xccc0, 0xccc0, 0xccbf, 0xccbf, + 0xccbf, 0xccbe, 0xccbe, 0xccbe, 0xccbd, 0xccbd, 0xccbd, 0xccbc, + 0xccbc, 0xccbc, 0xccbb, 0xccbb, 0xccbb, 0xccba, 0xccba, 0xccba, + 0xccb9, 0xccb9, 0xccb9, 0xccb8, 0xccb8, 0xccb8, 0xccb7, 0xccb7, + 0xccb7, 0xccb6, 0xccb6, 0xccb6, 0xccb5, 0xccb5, 0xccb5, 0xccb4, + 0xccb4, 0xccb4, 0xccb3, 0xccb3, 0xccb3, 0xccb2, 0xccb2, 0xccb2, + 0xccb1, 0xccb1, 0xccb1, 0xccb0, 0xccb0, 0xccb0, 0xccaf, 0xccaf, + 0xccaf, 0xccae, 0xccae, 0xccae, 0xccae, 0xccad, 0xccad, 0xccad, + 0xccac, 0xccac, 0xccac, 0xccab, 0xccab, 0xccab, 0xccaa, 0xccaa, + 0xccaa, 0xcca9, 0xcca9, 0xcca9, 0xcca8, 0xcca8, 0xcca8, 0xcca7, + 0xcca7, 0xcca7, 0xcca6, 0xcca6, 0xcca6, 0xcca5, 0xcca5, 0xcca5, + 0xcca5, 0xcca4, 0xcca4, 0xcca4, 0xcca3, 0xcca3, 0xcca3, 0xcca2, + 0xcca2, 0xcca2, 0xcca1, 0xcca1, 0xcca1, 0xcca0, 0xcca0, 0xcca0, + 0xcc9f, 0xcc9f, 0xcc9f, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9d, + 0xcc9d, 0xcc9d, 0xcc9c, 0xcc9c, 0xcc9c, 0xcc9b, 0xcc9b, 0xcc9b, + 0xcc9a, 0xcc9a, 0xcc9a, 0xcc99, 0xcc99, 0xcc99, 0xcc99, 0xcc98, + 0xcc98, 0xcc98, 0xcc97, 0xcc97, 0xcc97, 0xcc96, 0xcc96, 0xcc96, + 0xcc95, 0xcc95, 0xcc95, 0xcc95, 0xcc94, 0xcc94, 0xcc94, 0xcc93, + 0xcc93, 0xcc93, 0xcc92, 0xcc92, 0xcc92, 0xcc91, 0xcc91, 0xcc91, + 0xcc91, 0xcc90, 0xcc90, 0xcc90, 0xcc8f, 0xcc8f, 0xcc8f, 0xcc8e, + 0xcc8e, 0xcc8e, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8c, 0xcc8c, + 0xcc8c, 0xcc8b, 0xcc8b, 0xcc8b, 0xcc8a, 0xcc8a, 0xcc8a, 0xcc8a, + 0xcc89, 0xcc89, 0xcc89, 0xcc88, 0xcc88, 0xcc88, 0xcc87, 0xcc87, + 0xcc87, 0xcc87, 0xcc86, 0xcc86, 0xcc86, 0xcc85, 0xcc85, 0xcc85, + 0xcc84, 0xcc84, 0xcc84, 0xcc84, 0xcc83, 0xcc83, 0xcc83, 0xcc82, + 0xcc82, 0xcc82, 0xcc81, 0xcc81, 0xcc81, 0xcc81, 0xcc80, 0xcc80, + 0xcc80, 0xcc7f, 0xcc7f, 0xcc7f, 0xcc7e, 0xcc7e, 0xcc7e, 0xcc7e, + 0xcc7d, 0xcc7d, 0xcc7d, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7b, + 0xcc7b, 0xcc7b, 0xcc7a, 0xcc7a, 0xcc7a, 0xcc79, 0xcc79, 0xcc79, + 0xcc79, 0xcc78, 0xcc78, 0xcc78, 0xcc77, 0xcc77, 0xcc77, 0xcc77, + 0xcc76, 0xcc76, 0xcc76, 0xcc75, 0xcc75, 0xcc75, 0xcc75, 0xcc74, + 0xcc74, 0xcc74, 0xcc73, 0xcc73, 0xcc73, 0xcc72, 0xcc72, 0xcc72, + 0xcc72, 0xcc71, 0xcc71, 0xcc71, 0xcc70, 0xcc70, 0xcc70, 0xcc70, + 0xcc6f, 0xcc6f, 0xcc6f, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6d, + 0xcc6d, 0xcc6d, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6b, 0xcc6b, + 0xcc6b, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc69, 0xcc69, 0xcc69, + 0xcc68, 0xcc68, 0xcc68, 0xcc68, 0xcc67, 0xcc67, 0xcc67, 0xcc67, + 0xcc66, 0xcc66, 0xcc66, 0xcc65, 0xcc65, 0xcc65, 0xcc65, 0xcc64, + 0xcc64, 0xcc64, 0xcc63, 0xcc63, 0xcc63, 0xcc63, 0xcc62, 0xcc62, + 0xcc62, 0xcc61, 0xcc61, 0xcc61, 0xcc61, 0xcc60, 0xcc60, 0xcc60, + 0xcc60, 0xcc5f, 0xcc5f, 0xcc5f, 0xcc5e, 0xcc5e, 0xcc5e, 0xcc5e, + 0xcc5d, 0xcc5d, 0xcc5d, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5b, + 0xcc5b, 0xcc5b, 0xcc5b, 0xcc5a, 0xcc5a, 0xcc5a, 0xcc59, 0xcc59, + 0xcc59, 0xcc59, 0xcc58, 0xcc58, 0xcc58, 0xcc58, 0xcc57, 0xcc57, + 0xcc57, 0xcc56, 0xcc56, 0xcc56, 0xcc56, 0xcc55, 0xcc55, 0xcc55, + 0xcc54, 0xcc54, 0xcc54, 0xcc54, 0xcc53, 0xcc53, 0xcc53, 0xcc53, + 0xcc52, 0xcc52, 0xcc52, 0xcc52, 0xcc51, 0xcc51, 0xcc51, 0xcc50, + 0xcc50, 0xcc50, 0xcc50, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4e, + 0xcc4e, 0xcc4e, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4c, 0xcc4c, + 0xcc4c, 0xcc4c, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4a, 0xcc4a, + 0xcc4a, 0xcc49, 0xcc49, 0xcc49, 0xcc49, 0xcc48, 0xcc48, 0xcc48, + 0xcc48, 0xcc47, 0xcc47, 0xcc47, 0xcc47, 0xcc46, 0xcc46, 0xcc46, + 0xcc45, 0xcc45, 0xcc45, 0xcc45, 0xcc44, 0xcc44, 0xcc44, 0xcc44, + 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc42, 0xcc42, 0xcc42, 0xcc42, + 0xcc41, 0xcc41, 0xcc41, 0xcc40, 0xcc40, 0xcc40, 0xcc40, 0xcc3f, + 0xcc3f, 0xcc3f, 0xcc3f, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3d, + 0xcc3d, 0xcc3d, 0xcc3d, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3b, + 0xcc3b, 0xcc3b, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc39, 0xcc39, + 0xcc39, 0xcc39, 0xcc38, 0xcc38, 0xcc38, 0xcc38, 0xcc37, 0xcc37, + 0xcc37, 0xcc37, 0xcc36, 0xcc36, 0xcc36, 0xcc36, 0xcc35, 0xcc35, + 0xcc35, 0xcc35, 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0xcc33, 0xcc33, + 0xcc33, 0xcc33, 0xcc32, 0xcc32, 0xcc32, 0xcc31, 0xcc31, 0xcc31, + 0xcc31, 0xcc30, 0xcc30, 0xcc30, 0xcc30, 0xcc2f, 0xcc2f, 0xcc2f, + 0xcc2f, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2d, 0xcc2d, 0xcc2d, + 0xcc2d, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2b, 0xcc2b, 0xcc2b, + 0xcc2b, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc29, 0xcc29, 0xcc29, + 0xcc29, 0xcc28, 0xcc28, 0xcc27, 0xcc27, 0xcc26, 0xcc26, 0xcc25, + 0xcc25, 0xcc24, 0xcc24, 0xcc23, 0xcc23, 0xcc22, 0xcc22, 0xcc21, + 0xcc21, 0xcc20, 0xcc20, 0xcc1f, 0xcc1f, 0xcc1e, 0xcc1e, 0xcc1d, + 0xcc1d, 0xcc1c, 0xcc1c, 0xcc1b, 0xcc1b, 0xcc1a, 0xcc1a, 0xcc19, + 0xcc19, 0xcc18, 0xcc18, 0xcc17, 0xcc17, 0xcc17, 0xcc16, 0xcc16, + 0xcc15, 0xcc15, 0xcc14, 0xcc14, 0xcc13, 0xcc13, 0xcc12, 0xcc12, + 0xcc11, 0xcc11, 0xcc10, 0xcc10, 0xcc0f, 0xcc0f, 0xcc0e, 0xcc0e, + 0xcc0d, 0xcc0d, 0xcc0c, 0xcc0c, 0xcc0c, 0xcc0b, 0xcc0b, 0xcc0a, + 0xcc0a, 0xcc09, 0xcc09, 0xcc08, 0xcc08, 0xcc07, 0xcc07, 0xcc06, + 0xcc06, 0xcc05, 0xcc05, 0xcc04, 0xcc04, 0xcc04, 0xcc03, 0xcc03, + 0xcc02, 0xcc02, 0xcc01, 0xcc01, 0xcc00, 0xcc00, 0xcbff, 0xcbfe, + 0xcbfd, 0xcbfc, 0xcbfb, 0xcbfa, 0xcbf9, 0xcbf8, 0xcbf7, 0xcbf6, + 0xcbf6, 0xcbf5, 0xcbf4, 0xcbf3, 0xcbf2, 0xcbf1, 0xcbf0, 0xcbef, + 0xcbee, 0xcbed, 0xcbec, 0xcbec, 0xcbeb, 0xcbea, 0xcbe9, 0xcbe8, + 0xcbe7, 0xcbe6, 0xcbe5, 0xcbe4, 0xcbe3, 0xcbe3, 0xcbe2, 0xcbe1, + 0xcbe0, 0xcbdf, 0xcbde, 0xcbdd, 0xcbdc, 0xcbdb, 0xcbdb, 0xcbda, + 0xcbd9, 0xcbd8, 0xcbd7, 0xcbd6, 0xcbd5, 0xcbd4, 0xcbd3, 0xcbd3, + 0xcbd2, 0xcbd1, 0xcbd0, 0xcbcf, 0xcbce, 0xcbcd, 0xcbcc, 0xcbcb, + 0xcbcb, 0xcbca, 0xcbc9, 0xcbc8, 0xcbc7, 0xcbc6, 0xcbc5, 0xcbc4, + 0xcbc4, 0xcbc3, 0xcbc2, 0xcbc1, 0xcbc0, 0xcbbf, 0xcbbe, 0xcbbe, + 0xcbbd, 0xcbbc, 0xcbbb, 0xcbba, 0xcbb9, 0xcbb8, 0xcbb8, 0xcbb7, + 0xcbb6, 0xcbb5, 0xcbb4, 0xcbb3, 0xcbb2, 0xcbb1, 0xcbb1, 0xcbb0, + 0xcbaf, 0xcbae, 0xcbad, 0xcbac, 0xcbac, 0xcbab, 0xcbaa, 0xcba9, + 0xcba8, 0xcba7, 0xcba6, 0xcba6, 0xcba5, 0xcba4, 0xcba3, 0xcba2, + 0xcba1, 0xcba1, 0xcba0, 0xcb9f, 0xcb9e, 0xcb9d, 0xcb9c, 0xcb9b, + 0xcb9b, 0xcb9a, 0xcb99, 0xcb98, 0xcb97, 0xcb96, 0xcb96, 0xcb95, + 0xcb94, 0xcb93, 0xcb92, 0xcb91, 0xcb91, 0xcb90, 0xcb8f, 0xcb8e, + 0xcb8d, 0xcb8d, 0xcb8c, 0xcb8b, 0xcb8a, 0xcb89, 0xcb88, 0xcb88, + 0xcb87, 0xcb86, 0xcb85, 0xcb84, 0xcb83, 0xcb83, 0xcb82, 0xcb81, + 0xcb80, 0xcb7f, 0xcb7f, 0xcb7e, 0xcb7d, 0xcb7c, 0xcb7b, 0xcb7b, + 0xcb7a, 0xcb79, 0xcb78, 0xcb77, 0xcb76, 0xcb76, 0xcb75, 0xcb74, + 0xcb73, 0xcb72, 0xcb72, 0xcb71, 0xcb70, 0xcb6f, 0xcb6e, 0xcb6e, + 0xcb6d, 0xcb6c, 0xcb6b, 0xcb6a, 0xcb6a, 0xcb69, 0xcb68, 0xcb67, + 0xcb66, 0xcb66, 0xcb65, 0xcb64, 0xcb63, 0xcb63, 0xcb62, 0xcb61, + 0xcb60, 0xcb5f, 0xcb5f, 0xcb5e, 0xcb5d, 0xcb5c, 0xcb5b, 0xcb5b, + 0xcb5a, 0xcb59, 0xcb58, 0xcb57, 0xcb57, 0xcb56, 0xcb55, 0xcb54, + 0xcb54, 0xcb53, 0xcb52, 0xcb51, 0xcb50, 0xcb50, 0xcb4f, 0xcb4e, + 0xcb4d, 0xcb4d, 0xcb4c, 0xcb4b, 0xcb4a, 0xcb49, 0xcb49, 0xcb48, + 0xcb47, 0xcb46, 0xcb46, 0xcb45, 0xcb44, 0xcb43, 0xcb43, 0xcb42, + 0xcb41, 0xcb40, 0xcb3f, 0xcb3f, 0xcb3e, 0xcb3d, 0xcb3c, 0xcb3c, + 0xcb3b, 0xcb3a, 0xcb39, 0xcb39, 0xcb38, 0xcb37, 0xcb36, 0xcb36, + 0xcb35, 0xcb34, 0xcb33, 0xcb33, 0xcb32, 0xcb31, 0xcb30, 0xcb30, + 0xcb2f, 0xcb2e, 0xcb2d, 0xcb2d, 0xcb2c, 0xcb2b, 0xcb2a, 0xcb2a, + 0xcb29, 0xcb28, 0xcb27, 0xcb27, 0xcb26, 0xcb25, 0xcb24, 0xcb24, + 0xcb23, 0xcb22, 0xcb21, 0xcb21, 0xcb20, 0xcb1f, 0xcb1e, 0xcb1e, + 0xcb1d, 0xcb1c, 0xcb1b, 0xcb1b, 0xcb1a, 0xcb19, 0xcb18, 0xcb18, + 0xcb17, 0xcb16, 0xcb15, 0xcb15, 0xcb14, 0xcb13, 0xcb13, 0xcb12, + 0xcb11, 0xcb10, 0xcb10, 0xcb0f, 0xcb0e, 0xcb0d, 0xcb0d, 0xcb0c, + 0xcb0b, 0xcb0b, 0xcb0a, 0xcb09, 0xcb08, 0xcb08, 0xcb07, 0xcb06, + 0xcb05, 0xcb05, 0xcb04, 0xcb03, 0xcb03, 0xcb02, 0xcb01, 0xcb00, + 0xcb00, 0xcaff, 0xcafe, 0xcafe, 0xcafd, 0xcafc, 0xcafb, 0xcafb, + 0xcafa, 0xcaf9, 0xcaf9, 0xcaf8, 0xcaf7, 0xcaf6, 0xcaf6, 0xcaf5, + 0xcaf4, 0xcaf4, 0xcaf3, 0xcaf2, 0xcaf1, 0xcaf1, 0xcaf0, 0xcaef, + 0xcaef, 0xcaee, 0xcaed, 0xcaec, 0xcaec, 0xcaeb, 0xcaea, 0xcaea, + 0xcae9, 0xcae8, 0xcae8, 0xcae7, 0xcae6, 0xcae5, 0xcae5, 0xcae4, + 0xcae3, 0xcae3, 0xcae2, 0xcae1, 0xcae1, 0xcae0, 0xcadf, 0xcade, + 0xcade, 0xcadd, 0xcadc, 0xcadc, 0xcadb, 0xcada, 0xcada, 0xcad9, + 0xcad8, 0xcad7, 0xcad7, 0xcad6, 0xcad5, 0xcad5, 0xcad4, 0xcad3, + 0xcad3, 0xcad2, 0xcad1, 0xcad1, 0xcad0, 0xcacf, 0xcacf, 0xcace, + 0xcacd, 0xcacc, 0xcacc, 0xcacb, 0xcaca, 0xcaca, 0xcac9, 0xcac8, + 0xcac8, 0xcac7, 0xcac6, 0xcac6, 0xcac5, 0xcac4, 0xcac4, 0xcac3, + 0xcac2, 0xcac2, 0xcac1, 0xcac0, 0xcac0, 0xcabf, 0xcabe, 0xcabe, + 0xcabd, 0xcabc, 0xcabc, 0xcabb, 0xcaba, 0xcaba, 0xcab9, 0xcab8, + 0xcab7, 0xcab7, 0xcab6, 0xcab5, 0xcab5, 0xcab4, 0xcab3, 0xcab3, + 0xcab2, 0xcab1, 0xcab1, 0xcab0, 0xcaaf, 0xcaaf, 0xcaae, 0xcaad, + 0xcaad, 0xcaac, 0xcaac, 0xcaab, 0xcaaa, 0xcaaa, 0xcaa9, 0xcaa8, + 0xcaa8, 0xcaa7, 0xcaa6, 0xcaa6, 0xcaa5, 0xcaa4, 0xcaa4, 0xcaa3, + 0xcaa2, 0xcaa2, 0xcaa1, 0xcaa0, 0xcaa0, 0xca9f, 0xca9e, 0xca9e, + 0xca9d, 0xca9c, 0xca9c, 0xca9b, 0xca9a, 0xca9a, 0xca99, 0xca98, + 0xca98, 0xca97, 0xca97, 0xca96, 0xca95, 0xca95, 0xca94, 0xca93, + 0xca93, 0xca92, 0xca91, 0xca91, 0xca90, 0xca8f, 0xca8f, 0xca8e, + 0xca8d, 0xca8d, 0xca8c, 0xca8c, 0xca8b, 0xca8a, 0xca8a, 0xca89, + 0xca88, 0xca88, 0xca87, 0xca86, 0xca86, 0xca85, 0xca85, 0xca84, + 0xca83, 0xca83, 0xca82, 0xca81, 0xca81, 0xca80, 0xca7f, 0xca7f, + 0xca7e, 0xca7e, 0xca7d, 0xca7c, 0xca7c, 0xca7b, 0xca7a, 0xca7a, + 0xca79, 0xca78, 0xca78, 0xca77, 0xca77, 0xca76, 0xca75, 0xca75, + 0xca74, 0xca73, 0xca73, 0xca72, 0xca72, 0xca71, 0xca70, 0xca70, + 0xca6f, 0xca6e, 0xca6e, 0xca6d, 0xca6d, 0xca6c, 0xca6b, 0xca6b, + 0xca6a, 0xca69, 0xca69, 0xca68, 0xca68, 0xca67, 0xca66, 0xca66, + 0xca65, 0xca65, 0xca64, 0xca63, 0xca63, 0xca62, 0xca61, 0xca61, + 0xca60, 0xca60, 0xca5f, 0xca5e, 0xca5e, 0xca5d, 0xca5d, 0xca5c, + 0xca5b, 0xca5b, 0xca5a, 0xca59, 0xca59, 0xca58, 0xca58, 0xca57, + 0xca56, 0xca56, 0xca55, 0xca55, 0xca54, 0xca53, 0xca53, 0xca52, + 0xca52, 0xca51, 0xca50, 0xca50, 0xca4f, 0xca4e, 0xca4e, 0xca4d, + 0xca4d, 0xca4c, 0xca4b, 0xca4b, 0xca4a, 0xca4a, 0xca49, 0xca48, + 0xca48, 0xca47, 0xca47, 0xca46, 0xca45, 0xca45, 0xca44, 0xca44, + 0xca43, 0xca42, 0xca42, 0xca41, 0xca41, 0xca40, 0xca3f, 0xca3f, + 0xca3e, 0xca3e, 0xca3d, 0xca3d, 0xca3c, 0xca3b, 0xca3b, 0xca3a, + 0xca3a, 0xca39, 0xca38, 0xca38, 0xca37, 0xca37, 0xca36, 0xca35, + 0xca35, 0xca34, 0xca34, 0xca33, 0xca32, 0xca32, 0xca31, 0xca31, + 0xca30, 0xca30, 0xca2f, 0xca2e, 0xca2e, 0xca2d, 0xca2d, 0xca2c, + 0xca2b, 0xca2b, 0xca2a, 0xca2a, 0xca29, 0xca28, 0xca28, 0xca27, + 0xca27, 0xca26, 0xca26, 0xca25, 0xca24, 0xca24, 0xca23, 0xca23, + 0xca22, 0xca22, 0xca21, 0xca20, 0xca20, 0xca1f, 0xca1f, 0xca1e, + 0xca1d, 0xca1d, 0xca1c, 0xca1c, 0xca1b, 0xca1b, 0xca1a, 0xca19, + 0xca19, 0xca18, 0xca18, 0xca17, 0xca17, 0xca16, 0xca15, 0xca15, + 0xca14, 0xca14, 0xca13, 0xca13, 0xca12, 0xca11, 0xca11, 0xca10, + 0xca10, 0xca0f, 0xca0f, 0xca0e, 0xca0d, 0xca0d, 0xca0c, 0xca0c, + 0xca0b, 0xca0b, 0xca0a, 0xca0a, 0xca09, 0xca08, 0xca08, 0xca07, + 0xca07, 0xca06, 0xca06, 0xca05, 0xca04, 0xca04, 0xca03, 0xca03, + 0xca02, 0xca02, 0xca01, 0xca00, 0xca00, 0xc9ff, 0xc9ff, 0xc9fe, + 0xc9fe, 0xc9fd, 0xc9fd, 0xc9fc, 0xc9fb, 0xc9fb, 0xc9fa, 0xc9fa, + 0xc9f9, 0xc9f9, 0xc9f8, 0xc9f8, 0xc9f7, 0xc9f6, 0xc9f6, 0xc9f5, + 0xc9f5, 0xc9f4, 0xc9f4, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f1, 0xc9f1, + 0xc9f0, 0xc9f0, 0xc9ef, 0xc9ef, 0xc9ee, 0xc9ee, 0xc9ed, 0xc9ed, + 0xc9ec, 0xc9eb, 0xc9eb, 0xc9ea, 0xc9ea, 0xc9e9, 0xc9e9, 0xc9e8, + 0xc9e8, 0xc9e7, 0xc9e6, 0xc9e6, 0xc9e5, 0xc9e5, 0xc9e4, 0xc9e4, + 0xc9e3, 0xc9e3, 0xc9e2, 0xc9e2, 0xc9e1, 0xc9e0, 0xc9e0, 0xc9df, + 0xc9df, 0xc9de, 0xc9de, 0xc9dd, 0xc9dd, 0xc9dc, 0xc9dc, 0xc9db, + 0xc9db, 0xc9da, 0xc9d9, 0xc9d9, 0xc9d8, 0xc9d8, 0xc9d7, 0xc9d7, + 0xc9d6, 0xc9d6, 0xc9d5, 0xc9d5, 0xc9d4, 0xc9d4, 0xc9d3, 0xc9d2, + 0xc9d2, 0xc9d1, 0xc9d1, 0xc9d0, 0xc9d0, 0xc9cf, 0xc9cf, 0xc9ce, + 0xc9ce, 0xc9cd, 0xc9cd, 0xc9cc, 0xc9cc, 0xc9cb, 0xc9ca, 0xc9ca, + 0xc9c9, 0xc9c9, 0xc9c8, 0xc9c8, 0xc9c7, 0xc9c7, 0xc9c6, 0xc9c6, + 0xc9c5, 0xc9c5, 0xc9c4, 0xc9c4, 0xc9c3, 0xc9c3, 0xc9c2, 0xc9c1, + 0xc9c1, 0xc9c0, 0xc9c0, 0xc9bf, 0xc9bf, 0xc9be, 0xc9be, 0xc9bd, + 0xc9bd, 0xc9bc, 0xc9bc, 0xc9bb, 0xc9bb, 0xc9ba, 0xc9ba, 0xc9b9, + 0xc9b9, 0xc9b8, 0xc9b7, 0xc9b7, 0xc9b6, 0xc9b6, 0xc9b5, 0xc9b5, + 0xc9b4, 0xc9b4, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9b1, 0xc9b1, + 0xc9b0, 0xc9b0, 0xc9af, 0xc9af, 0xc9ae, 0xc9ae, 0xc9ad, 0xc9ad, + 0xc9ac, 0xc9ac, 0xc9ab, 0xc9ab, 0xc9aa, 0xc9a9, 0xc9a9, 0xc9a8, + 0xc9a8, 0xc9a7, 0xc9a7, 0xc9a6, 0xc9a6, 0xc9a5, 0xc9a5, 0xc9a4, + 0xc9a4, 0xc9a3, 0xc9a3, 0xc9a2, 0xc9a2, 0xc9a1, 0xc9a1, 0xc9a0, + 0xc9a0, 0xc99f, 0xc99f, 0xc99e, 0xc99e, 0xc99d, 0xc99d, 0xc99c, + 0xc99c, 0xc99b, 0xc99b, 0xc99a, 0xc99a, 0xc999, 0xc999, 0xc998, + 0xc998, 0xc997, 0xc997, 0xc996, 0xc996, 0xc995, 0xc995, 0xc994, + 0xc994, 0xc993, 0xc993, 0xc992, 0xc992, 0xc991, 0xc991, 0xc990, + 0xc990, 0xc98f, 0xc98f, 0xc98e, 0xc98e, 0xc98d, 0xc98d, 0xc98c, + 0xc98c, 0xc98b, 0xc98a, 0xc989, 0xc988, 0xc987, 0xc986, 0xc985, + 0xc984, 0xc983, 0xc982, 0xc981, 0xc980, 0xc97f, 0xc97e, 0xc97d, + 0xc97c, 0xc97b, 0xc97a, 0xc979, 0xc978, 0xc977, 0xc976, 0xc975, + 0xc974, 0xc973, 0xc972, 0xc971, 0xc970, 0xc96f, 0xc96e, 0xc96d, + 0xc96c, 0xc96b, 0xc96a, 0xc969, 0xc968, 0xc967, 0xc966, 0xc965, + 0xc964, 0xc963, 0xc962, 0xc961, 0xc960, 0xc960, 0xc95f, 0xc95e, + 0xc95d, 0xc95c, 0xc95b, 0xc95a, 0xc959, 0xc958, 0xc957, 0xc956, + 0xc955, 0xc954, 0xc953, 0xc952, 0xc951, 0xc950, 0xc94f, 0xc94e, + 0xc94d, 0xc94d, 0xc94c, 0xc94b, 0xc94a, 0xc949, 0xc948, 0xc947, + 0xc946, 0xc945, 0xc944, 0xc943, 0xc942, 0xc941, 0xc940, 0xc93f, + 0xc93f, 0xc93e, 0xc93d, 0xc93c, 0xc93b, 0xc93a, 0xc939, 0xc938, + 0xc937, 0xc936, 0xc935, 0xc934, 0xc933, 0xc933, 0xc932, 0xc931, + 0xc930, 0xc92f, 0xc92e, 0xc92d, 0xc92c, 0xc92b, 0xc92a, 0xc929, + 0xc929, 0xc928, 0xc927, 0xc926, 0xc925, 0xc924, 0xc923, 0xc922, + 0xc921, 0xc920, 0xc91f, 0xc91f, 0xc91e, 0xc91d, 0xc91c, 0xc91b, + 0xc91a, 0xc919, 0xc918, 0xc917, 0xc917, 0xc916, 0xc915, 0xc914, + 0xc913, 0xc912, 0xc911, 0xc910, 0xc90f, 0xc90f, 0xc90e, 0xc90d, + 0xc90c, 0xc90b, 0xc90a, 0xc909, 0xc908, 0xc907, 0xc907, 0xc906, + 0xc905, 0xc904, 0xc903, 0xc902, 0xc901, 0xc900, 0xc900, 0xc8ff, + 0xc8fe, 0xc8fd, 0xc8fc, 0xc8fb, 0xc8fa, 0xc8f9, 0xc8f9, 0xc8f8, + 0xc8f7, 0xc8f6, 0xc8f5, 0xc8f4, 0xc8f3, 0xc8f3, 0xc8f2, 0xc8f1, + 0xc8f0, 0xc8ef, 0xc8ee, 0xc8ed, 0xc8ed, 0xc8ec, 0xc8eb, 0xc8ea, + 0xc8e9, 0xc8e8, 0xc8e7, 0xc8e7, 0xc8e6, 0xc8e5, 0xc8e4, 0xc8e3, + 0xc8e2, 0xc8e2, 0xc8e1, 0xc8e0, 0xc8df, 0xc8de, 0xc8dd, 0xc8dc, + 0xc8dc, 0xc8db, 0xc8da, 0xc8d9, 0xc8d8, 0xc8d7, 0xc8d7, 0xc8d6, + 0xc8d5, 0xc8d4, 0xc8d3, 0xc8d2, 0xc8d2, 0xc8d1, 0xc8d0, 0xc8cf, + 0xc8ce, 0xc8cd, 0xc8cd, 0xc8cc, 0xc8cb, 0xc8ca, 0xc8c9, 0xc8c8, + 0xc8c8, 0xc8c7, 0xc8c6, 0xc8c5, 0xc8c4, 0xc8c3, 0xc8c3, 0xc8c2, + 0xc8c1, 0xc8c0, 0xc8bf, 0xc8bf, 0xc8be, 0xc8bd, 0xc8bc, 0xc8bb, + 0xc8ba, 0xc8ba, 0xc8b9, 0xc8b8, 0xc8b7, 0xc8b6, 0xc8b6, 0xc8b5, + 0xc8b4, 0xc8b3, 0xc8b2, 0xc8b2, 0xc8b1, 0xc8b0, 0xc8af, 0xc8ae, + 0xc8ad, 0xc8ad, 0xc8ac, 0xc8ab, 0xc8aa, 0xc8a9, 0xc8a9, 0xc8a8, + 0xc8a7, 0xc8a6, 0xc8a5, 0xc8a5, 0xc8a4, 0xc8a3, 0xc8a2, 0xc8a1, + 0xc8a1, 0xc8a0, 0xc89f, 0xc89e, 0xc89e, 0xc89d, 0xc89c, 0xc89b, + 0xc89a, 0xc89a, 0xc899, 0xc898, 0xc897, 0xc896, 0xc896, 0xc895, + 0xc894, 0xc893, 0xc892, 0xc892, 0xc891, 0xc890, 0xc88f, 0xc88f, + 0xc88e, 0xc88d, 0xc88c, 0xc88b, 0xc88b, 0xc88a, 0xc889, 0xc888, + 0xc888, 0xc887, 0xc886, 0xc885, 0xc884, 0xc884, 0xc883, 0xc882, + 0xc881, 0xc881, 0xc880, 0xc87f, 0xc87e, 0xc87e, 0xc87d, 0xc87c, + 0xc87b, 0xc87a, 0xc87a, 0xc879, 0xc878, 0xc877, 0xc877, 0xc876, + 0xc875, 0xc874, 0xc874, 0xc873, 0xc872, 0xc871, 0xc871, 0xc870, + 0xc86f, 0xc86e, 0xc86e, 0xc86d, 0xc86c, 0xc86b, 0xc86a, 0xc86a, + 0xc869, 0xc868, 0xc867, 0xc867, 0xc866, 0xc865, 0xc864, 0xc864, + 0xc863, 0xc862, 0xc861, 0xc861, 0xc860, 0xc85f, 0xc85e, 0xc85e, + 0xc85d, 0xc85c, 0xc85c, 0xc85b, 0xc85a, 0xc859, 0xc859, 0xc858, + 0xc857, 0xc856, 0xc856, 0xc855, 0xc854, 0xc853, 0xc853, 0xc852, + 0xc851, 0xc850, 0xc850, 0xc84f, 0xc84e, 0xc84e, 0xc84d, 0xc84c, + 0xc84b, 0xc84b, 0xc84a, 0xc849, 0xc848, 0xc848, 0xc847, 0xc846, + 0xc845, 0xc845, 0xc844, 0xc843, 0xc843, 0xc842, 0xc841, 0xc840, + 0xc840, 0xc83f, 0xc83e, 0xc83d, 0xc83d, 0xc83c, 0xc83b, 0xc83b, + 0xc83a, 0xc839, 0xc838, 0xc838, 0xc837, 0xc836, 0xc836, 0xc835, + 0xc834, 0xc833, 0xc833, 0xc832, 0xc831, 0xc831, 0xc830, 0xc82f, + 0xc82e, 0xc82e, 0xc82d, 0xc82c, 0xc82c, 0xc82b, 0xc82a, 0xc829, + 0xc829, 0xc828, 0xc827, 0xc827, 0xc826, 0xc825, 0xc825, 0xc824, + 0xc823, 0xc822, 0xc822, 0xc821, 0xc820, 0xc820, 0xc81f, 0xc81e, + 0xc81e, 0xc81d, 0xc81c, 0xc81b, 0xc81b, 0xc81a, 0xc819, 0xc819, + 0xc818, 0xc817, 0xc817, 0xc816, 0xc815, 0xc814, 0xc814, 0xc813, + 0xc812, 0xc812, 0xc811, 0xc810, 0xc810, 0xc80f, 0xc80e, 0xc80e, + 0xc80d, 0xc80c, 0xc80c, 0xc80b, 0xc80a, 0xc809, 0xc809, 0xc808, + 0xc807, 0xc807, 0xc806, 0xc805, 0xc805, 0xc804, 0xc803, 0xc803, + 0xc802, 0xc801, 0xc801, 0xc800, 0xc7fe, 0xc7fd, 0xc7fc, 0xc7fa, + 0xc7f9, 0xc7f8, 0xc7f6, 0xc7f5, 0xc7f4, 0xc7f2, 0xc7f1, 0xc7f0, + 0xc7ee, 0xc7ed, 0xc7eb, 0xc7ea, 0xc7e9, 0xc7e7, 0xc7e6, 0xc7e5, + 0xc7e3, 0xc7e2, 0xc7e1, 0xc7df, 0xc7de, 0xc7dd, 0xc7db, 0xc7da, + 0xc7d9, 0xc7d7, 0xc7d6, 0xc7d5, 0xc7d3, 0xc7d2, 0xc7d1, 0xc7cf, + 0xc7ce, 0xc7cd, 0xc7cb, 0xc7ca, 0xc7c9, 0xc7c7, 0xc7c6, 0xc7c5, + 0xc7c4, 0xc7c2, 0xc7c1, 0xc7c0, 0xc7be, 0xc7bd, 0xc7bc, 0xc7ba, + 0xc7b9, 0xc7b8, 0xc7b6, 0xc7b5, 0xc7b4, 0xc7b2, 0xc7b1, 0xc7b0, + 0xc7af, 0xc7ad, 0xc7ac, 0xc7ab, 0xc7a9, 0xc7a8, 0xc7a7, 0xc7a5, + 0xc7a4, 0xc7a3, 0xc7a1, 0xc7a0, 0xc79f, 0xc79e, 0xc79c, 0xc79b, + 0xc79a, 0xc798, 0xc797, 0xc796, 0xc795, 0xc793, 0xc792, 0xc791, + 0xc78f, 0xc78e, 0xc78d, 0xc78c, 0xc78a, 0xc789, 0xc788, 0xc786, + 0xc785, 0xc784, 0xc783, 0xc781, 0xc780, 0xc77f, 0xc77d, 0xc77c, + 0xc77b, 0xc77a, 0xc778, 0xc777, 0xc776, 0xc775, 0xc773, 0xc772, + 0xc771, 0xc76f, 0xc76e, 0xc76d, 0xc76c, 0xc76a, 0xc769, 0xc768, + 0xc767, 0xc765, 0xc764, 0xc763, 0xc762, 0xc760, 0xc75f, 0xc75e, + 0xc75d, 0xc75b, 0xc75a, 0xc759, 0xc758, 0xc756, 0xc755, 0xc754, + 0xc753, 0xc751, 0xc750, 0xc74f, 0xc74e, 0xc74c, 0xc74b, 0xc74a, + 0xc749, 0xc747, 0xc746, 0xc745, 0xc744, 0xc742, 0xc741, 0xc740, + 0xc73f, 0xc73d, 0xc73c, 0xc73b, 0xc73a, 0xc739, 0xc737, 0xc736, + 0xc735, 0xc734, 0xc732, 0xc731, 0xc730, 0xc72f, 0xc72d, 0xc72c, + 0xc72b, 0xc72a, 0xc729, 0xc727, 0xc726, 0xc725, 0xc724, 0xc722, + 0xc721, 0xc720, 0xc71f, 0xc71e, 0xc71c, 0xc71b, 0xc71a, 0xc719, + 0xc717, 0xc716, 0xc715, 0xc714, 0xc713, 0xc711, 0xc710, 0xc70f, + 0xc70e, 0xc70d, 0xc70b, 0xc70a, 0xc709, 0xc708, 0xc707, 0xc705, + 0xc704, 0xc703, 0xc702, 0xc701, 0xc6ff, 0xc6fe, 0xc6fd, 0xc6fc, + 0xc6fb, 0xc6f9, 0xc6f8, 0xc6f7, 0xc6f6, 0xc6f5, 0xc6f3, 0xc6f2, + 0xc6f1, 0xc6f0, 0xc6ef, 0xc6ed, 0xc6ec, 0xc6eb, 0xc6ea, 0xc6e9, + 0xc6e8, 0xc6e6, 0xc6e5, 0xc6e4, 0xc6e3, 0xc6e2, 0xc6e0, 0xc6df, + 0xc6de, 0xc6dd, 0xc6dc, 0xc6db, 0xc6d9, 0xc6d8, 0xc6d7, 0xc6d6, + 0xc6d5, 0xc6d3, 0xc6d2, 0xc6d1, 0xc6d0, 0xc6cf, 0xc6ce, 0xc6cc, + 0xc6cb, 0xc6ca, 0xc6c9, 0xc6c8, 0xc6c7, 0xc6c5, 0xc6c4, 0xc6c3, + 0xc6c2, 0xc6c1, 0xc6c0, 0xc6be, 0xc6bd, 0xc6bc, 0xc6bb, 0xc6ba, + 0xc6b9, 0xc6b7, 0xc6b6, 0xc6b5, 0xc6b4, 0xc6b3, 0xc6b2, 0xc6b1, + 0xc6af, 0xc6ae, 0xc6ad, 0xc6ac, 0xc6ab, 0xc6aa, 0xc6a8, 0xc6a7, + 0xc6a6, 0xc6a5, 0xc6a4, 0xc6a3, 0xc6a2, 0xc6a0, 0xc69f, 0xc69e, + 0xc69d, 0xc69c, 0xc69b, 0xc69a, 0xc698, 0xc697, 0xc696, 0xc695, + 0xc694, 0xc693, 0xc692, 0xc691, 0xc68f, 0xc68e, 0xc68d, 0xc68c, + 0xc68b, 0xc68a, 0xc689, 0xc687, 0xc686, 0xc685, 0xc684, 0xc683, + 0xc682, 0xc681, 0xc680, 0xc67e, 0xc67d, 0xc67c, 0xc67b, 0xc67a, + 0xc679, 0xc678, 0xc677, 0xc675, 0xc674, 0xc673, 0xc672, 0xc671, + 0xc670, 0xc66f, 0xc66e, 0xc66c, 0xc66b, 0xc66a, 0xc669, 0xc668, + 0xc667, 0xc666, 0xc665, 0xc664, 0xc662, 0xc661, 0xc660, 0xc65f, + 0xc65e, 0xc65d, 0xc65c, 0xc65b, 0xc65a, 0xc658, 0xc657, 0xc656, + 0xc655, 0xc654, 0xc653, 0xc652, 0xc651, 0xc650, 0xc64f, 0xc64d, + 0xc64c, 0xc64b, 0xc64a, 0xc649, 0xc648, 0xc647, 0xc646, 0xc645, + 0xc644, 0xc642, 0xc641, 0xc640, 0xc63f, 0xc63e, 0xc63d, 0xc63c, + 0xc63b, 0xc63a, 0xc639, 0xc638, 0xc637, 0xc635, 0xc634, 0xc633, + 0xc632, 0xc631, 0xc630, 0xc62f, 0xc62e, 0xc62d, 0xc62c, 0xc62b, + 0xc62a, 0xc628, 0xc627, 0xc626, 0xc625, 0xc624, 0xc623, 0xc622, + 0xc621, 0xc620, 0xc61f, 0xc61e, 0xc61d, 0xc61c, 0xc61a, 0xc619, + 0xc618, 0xc617, 0xc616, 0xc615, 0xc614, 0xc613, 0xc612, 0xc611, + 0xc610, 0xc60f, 0xc60e, 0xc60d, 0xc60b, 0xc60a, 0xc609, 0xc608, + 0xc607, 0xc606, 0xc605, 0xc604, 0xc603, 0xc602, 0xc601, 0xc600, + 0xc5ff, 0xc5fe, 0xc5fd, 0xc5fc, 0xc5fb, 0xc5f9, 0xc5f8, 0xc5f7, + 0xc5f6, 0xc5f5, 0xc5f4, 0xc5f3, 0xc5f2, 0xc5f1, 0xc5f0, 0xc5ef, + 0xc5ee, 0xc5ed, 0xc5ec, 0xc5eb, 0xc5ea, 0xc5e9, 0xc5e8, 0xc5e7, + 0xc5e6, 0xc5e4, 0xc5e3, 0xc5e2, 0xc5e1, 0xc5e0, 0xc5df, 0xc5de, + 0xc5dd, 0xc5dc, 0xc5db, 0xc5da, 0xc5d9, 0xc5d8, 0xc5d7, 0xc5d6, + 0xc5d5, 0xc5d4, 0xc5d3, 0xc5d2, 0xc5d1, 0xc5d0, 0xc5cf, 0xc5ce, + 0xc5cd, 0xc5cc, 0xc5cb, 0xc5c9, 0xc5c8, 0xc5c7, 0xc5c6, 0xc5c5, + 0xc5c4, 0xc5c3, 0xc5c2, 0xc5c1, 0xc5c0, 0xc5bf, 0xc5be, 0xc5bd, + 0xc5bc, 0xc5bb, 0xc5ba, 0xc5b9, 0xc5b8, 0xc5b7, 0xc5b6, 0xc5b5, + 0xc5b4, 0xc5b3, 0xc5b2, 0xc5b1, 0xc5b0, 0xc5af, 0xc5ae, 0xc5ad, + 0xc5ac, 0xc5ab, 0xc5aa, 0xc5a9, 0xc5a8, 0xc5a7, 0xc5a6, 0xc5a5, + 0xc5a4, 0xc5a3, 0xc5a2, 0xc5a1, 0xc5a0, 0xc59f, 0xc59e, 0xc59d, + 0xc59c, 0xc59b, 0xc59a, 0xc599, 0xc598, 0xc597, 0xc596, 0xc595, + 0xc594, 0xc593, 0xc592, 0xc591, 0xc590, 0xc58f, 0xc58e, 0xc58d, + 0xc58c, 0xc58a, 0xc588, 0xc586, 0xc584, 0xc582, 0xc580, 0xc57e, + 0xc57c, 0xc57a, 0xc578, 0xc576, 0xc574, 0xc572, 0xc570, 0xc56e, + 0xc56c, 0xc56a, 0xc568, 0xc566, 0xc564, 0xc562, 0xc560, 0xc55e, + 0xc55c, 0xc55a, 0xc558, 0xc556, 0xc554, 0xc552, 0xc550, 0xc54e, + 0xc54d, 0xc54b, 0xc549, 0xc547, 0xc545, 0xc543, 0xc541, 0xc53f, + 0xc53d, 0xc53b, 0xc539, 0xc537, 0xc535, 0xc533, 0xc532, 0xc530, + 0xc52e, 0xc52c, 0xc52a, 0xc528, 0xc526, 0xc524, 0xc522, 0xc520, + 0xc51f, 0xc51d, 0xc51b, 0xc519, 0xc517, 0xc515, 0xc513, 0xc511, + 0xc50f, 0xc50e, 0xc50c, 0xc50a, 0xc508, 0xc506, 0xc504, 0xc502, + 0xc500, 0xc4ff, 0xc4fd, 0xc4fb, 0xc4f9, 0xc4f7, 0xc4f5, 0xc4f3, + 0xc4f2, 0xc4f0, 0xc4ee, 0xc4ec, 0xc4ea, 0xc4e8, 0xc4e6, 0xc4e5, + 0xc4e3, 0xc4e1, 0xc4df, 0xc4dd, 0xc4db, 0xc4da, 0xc4d8, 0xc4d6, + 0xc4d4, 0xc4d2, 0xc4d0, 0xc4cf, 0xc4cd, 0xc4cb, 0xc4c9, 0xc4c7, + 0xc4c5, 0xc4c4, 0xc4c2, 0xc4c0, 0xc4be, 0xc4bc, 0xc4bb, 0xc4b9, + 0xc4b7, 0xc4b5, 0xc4b3, 0xc4b2, 0xc4b0, 0xc4ae, 0xc4ac, 0xc4aa, + 0xc4a9, 0xc4a7, 0xc4a5, 0xc4a3, 0xc4a1, 0xc4a0, 0xc49e, 0xc49c, + 0xc49a, 0xc499, 0xc497, 0xc495, 0xc493, 0xc491, 0xc490, 0xc48e, + 0xc48c, 0xc48a, 0xc489, 0xc487, 0xc485, 0xc483, 0xc482, 0xc480, + 0xc47e, 0xc47c, 0xc47b, 0xc479, 0xc477, 0xc475, 0xc474, 0xc472, + 0xc470, 0xc46e, 0xc46d, 0xc46b, 0xc469, 0xc467, 0xc466, 0xc464, + 0xc462, 0xc461, 0xc45f, 0xc45d, 0xc45b, 0xc45a, 0xc458, 0xc456, + 0xc454, 0xc453, 0xc451, 0xc44f, 0xc44e, 0xc44c, 0xc44a, 0xc448, + 0xc447, 0xc445, 0xc443, 0xc442, 0xc440, 0xc43e, 0xc43d, 0xc43b, + 0xc439, 0xc437, 0xc436, 0xc434, 0xc432, 0xc431, 0xc42f, 0xc42d, + 0xc42c, 0xc42a, 0xc428, 0xc427, 0xc425, 0xc423, 0xc422, 0xc420, + 0xc41e, 0xc41d, 0xc41b, 0xc419, 0xc418, 0xc416, 0xc414, 0xc413, + 0xc411, 0xc40f, 0xc40e, 0xc40c, 0xc40a, 0xc409, 0xc407, 0xc405, + 0xc404, 0xc402, 0xc400, 0xc3fd, 0xc3fa, 0xc3f7, 0xc3f3, 0xc3f0, + 0xc3ed, 0xc3ea, 0xc3e6, 0xc3e3, 0xc3e0, 0xc3dc, 0xc3d9, 0xc3d6, + 0xc3d3, 0xc3cf, 0xc3cc, 0xc3c9, 0xc3c6, 0xc3c2, 0xc3bf, 0xc3bc, + 0xc3b9, 0xc3b5, 0xc3b2, 0xc3af, 0xc3ac, 0xc3a8, 0xc3a5, 0xc3a2, + 0xc39f, 0xc39c, 0xc398, 0xc395, 0xc392, 0xc38f, 0xc38c, 0xc388, + 0xc385, 0xc382, 0xc37f, 0xc37c, 0xc378, 0xc375, 0xc372, 0xc36f, + 0xc36c, 0xc368, 0xc365, 0xc362, 0xc35f, 0xc35c, 0xc359, 0xc355, + 0xc352, 0xc34f, 0xc34c, 0xc349, 0xc346, 0xc342, 0xc33f, 0xc33c, + 0xc339, 0xc336, 0xc333, 0xc330, 0xc32d, 0xc329, 0xc326, 0xc323, + 0xc320, 0xc31d, 0xc31a, 0xc317, 0xc314, 0xc310, 0xc30d, 0xc30a, + 0xc307, 0xc304, 0xc301, 0xc2fe, 0xc2fb, 0xc2f8, 0xc2f5, 0xc2f1, + 0xc2ee, 0xc2eb, 0xc2e8, 0xc2e5, 0xc2e2, 0xc2df, 0xc2dc, 0xc2d9, + 0xc2d6, 0xc2d3, 0xc2d0, 0xc2cd, 0xc2c9, 0xc2c6, 0xc2c3, 0xc2c0, + 0xc2bd, 0xc2ba, 0xc2b7, 0xc2b4, 0xc2b1, 0xc2ae, 0xc2ab, 0xc2a8, + 0xc2a5, 0xc2a2, 0xc29f, 0xc29c, 0xc299, 0xc296, 0xc293, 0xc290, + 0xc28d, 0xc28a, 0xc287, 0xc284, 0xc281, 0xc27e, 0xc27b, 0xc278, + 0xc275, 0xc272, 0xc26f, 0xc26c, 0xc269, 0xc266, 0xc263, 0xc260, + 0xc25d, 0xc25a, 0xc257, 0xc254, 0xc251, 0xc24e, 0xc24b, 0xc248, + 0xc245, 0xc242, 0xc23f, 0xc23c, 0xc239, 0xc236, 0xc233, 0xc230, + 0xc22e, 0xc22b, 0xc228, 0xc225, 0xc222, 0xc21f, 0xc21c, 0xc219, + 0xc216, 0xc213, 0xc210, 0xc20d, 0xc20a, 0xc207, 0xc205, 0xc202, + 0xc1ff, 0xc1fc, 0xc1f9, 0xc1f6, 0xc1f3, 0xc1f0, 0xc1ed, 0xc1ea, + 0xc1e8, 0xc1e5, 0xc1e2, 0xc1df, 0xc1dc, 0xc1d9, 0xc1d6, 0xc1d3, + 0xc1d0, 0xc1ce, 0xc1cb, 0xc1c8, 0xc1c5, 0xc1c2, 0xc1bf, 0xc1bc, + 0xc1ba, 0xc1b7, 0xc1b4, 0xc1b1, 0xc1ae, 0xc1ab, 0xc1a8, 0xc1a6, + 0xc1a3, 0xc1a0, 0xc19d, 0xc19a, 0xc197, 0xc194, 0xc192, 0xc18f, + 0xc18c, 0xc189, 0xc186, 0xc184, 0xc181, 0xc17e, 0xc17b, 0xc178, + 0xc175, 0xc173, 0xc170, 0xc16d, 0xc16a, 0xc167, 0xc165, 0xc162, + 0xc15f, 0xc15c, 0xc159, 0xc157, 0xc154, 0xc151, 0xc14e, 0xc14b, + 0xc149, 0xc146, 0xc143, 0xc140, 0xc13e, 0xc13b, 0xc138, 0xc135, + 0xc132, 0xc130, 0xc12d, 0xc12a, 0xc127, 0xc125, 0xc122, 0xc11f, + 0xc11c, 0xc11a, 0xc117, 0xc114, 0xc111, 0xc10f, 0xc10c, 0xc109, + 0xc106, 0xc104, 0xc101, 0xc0fe, 0xc0fb, 0xc0f9, 0xc0f6, 0xc0f3, + 0xc0f1, 0xc0ee, 0xc0eb, 0xc0e8, 0xc0e6, 0xc0e3, 0xc0e0, 0xc0de, + 0xc0db, 0xc0d8, 0xc0d5, 0xc0d3, 0xc0d0, 0xc0cd, 0xc0cb, 0xc0c8, + 0xc0c5, 0xc0c3, 0xc0c0, 0xc0bd, 0xc0ba, 0xc0b8, 0xc0b5, 0xc0b2, + 0xc0b0, 0xc0ad, 0xc0aa, 0xc0a8, 0xc0a5, 0xc0a2, 0xc0a0, 0xc09d, + 0xc09a, 0xc098, 0xc095, 0xc092, 0xc090, 0xc08d, 0xc08a, 0xc088, + 0xc085, 0xc082, 0xc080, 0xc07d, 0xc07a, 0xc078, 0xc075, 0xc073, + 0xc070, 0xc06d, 0xc06b, 0xc068, 0xc065, 0xc063, 0xc060, 0xc05d, + 0xc05b, 0xc058, 0xc056, 0xc053, 0xc050, 0xc04e, 0xc04b, 0xc049, + 0xc046, 0xc043, 0xc041, 0xc03e, 0xc03b, 0xc039, 0xc036, 0xc034, + 0xc031, 0xc02e, 0xc02c, 0xc029, 0xc027, 0xc024, 0xc021, 0xc01f, + 0xc01c, 0xc01a, 0xc017, 0xc015, 0xc012, 0xc00f, 0xc00d, 0xc00a, + 0xc008, 0xc005, 0xc003, 0xc000, 0xbffb, 0xbff6, 0xbff1, 0xbfeb, + 0xbfe6, 0xbfe1, 0xbfdc, 0xbfd7, 0xbfd2, 0xbfcd, 0xbfc8, 0xbfc3, + 0xbfbd, 0xbfb8, 0xbfb3, 0xbfae, 0xbfa9, 0xbfa4, 0xbf9f, 0xbf9a, + 0xbf95, 0xbf90, 0xbf8b, 0xbf86, 0xbf81, 0xbf7b, 0xbf76, 0xbf71, + 0xbf6c, 0xbf67, 0xbf62, 0xbf5d, 0xbf58, 0xbf53, 0xbf4e, 0xbf49, + 0xbf44, 0xbf3f, 0xbf3a, 0xbf35, 0xbf30, 0xbf2b, 0xbf26, 0xbf21, + 0xbf1c, 0xbf17, 0xbf12, 0xbf0d, 0xbf08, 0xbf03, 0xbefe, 0xbef9, + 0xbef4, 0xbeef, 0xbeea, 0xbee5, 0xbee0, 0xbedb, 0xbed6, 0xbed1, + 0xbecc, 0xbec8, 0xbec3, 0xbebe, 0xbeb9, 0xbeb4, 0xbeaf, 0xbeaa, + 0xbea5, 0xbea0, 0xbe9b, 0xbe96, 0xbe91, 0xbe8c, 0xbe87, 0xbe83, + 0xbe7e, 0xbe79, 0xbe74, 0xbe6f, 0xbe6a, 0xbe65, 0xbe60, 0xbe5b, + 0xbe57, 0xbe52, 0xbe4d, 0xbe48, 0xbe43, 0xbe3e, 0xbe39, 0xbe35, + 0xbe30, 0xbe2b, 0xbe26, 0xbe21, 0xbe1c, 0xbe17, 0xbe13, 0xbe0e, + 0xbe09, 0xbe04, 0xbdff, 0xbdfa, 0xbdf6, 0xbdf1, 0xbdec, 0xbde7, + 0xbde2, 0xbdde, 0xbdd9, 0xbdd4, 0xbdcf, 0xbdca, 0xbdc6, 0xbdc1, + 0xbdbc, 0xbdb7, 0xbdb2, 0xbdae, 0xbda9, 0xbda4, 0xbd9f, 0xbd9b, + 0xbd96, 0xbd91, 0xbd8c, 0xbd88, 0xbd83, 0xbd7e, 0xbd79, 0xbd75, + 0xbd70, 0xbd6b, 0xbd66, 0xbd62, 0xbd5d, 0xbd58, 0xbd53, 0xbd4f, + 0xbd4a, 0xbd45, 0xbd41, 0xbd3c, 0xbd37, 0xbd32, 0xbd2e, 0xbd29, + 0xbd24, 0xbd20, 0xbd1b, 0xbd16, 0xbd12, 0xbd0d, 0xbd08, 0xbd03, + 0xbcff, 0xbcfa, 0xbcf5, 0xbcf1, 0xbcec, 0xbce7, 0xbce3, 0xbcde, + 0xbcd9, 0xbcd5, 0xbcd0, 0xbccc, 0xbcc7, 0xbcc2, 0xbcbe, 0xbcb9, + 0xbcb4, 0xbcb0, 0xbcab, 0xbca6, 0xbca2, 0xbc9d, 0xbc99, 0xbc94, + 0xbc8f, 0xbc8b, 0xbc86, 0xbc82, 0xbc7d, 0xbc78, 0xbc74, 0xbc6f, + 0xbc6b, 0xbc66, 0xbc61, 0xbc5d, 0xbc58, 0xbc54, 0xbc4f, 0xbc4a, + 0xbc46, 0xbc41, 0xbc3d, 0xbc38, 0xbc34, 0xbc2f, 0xbc2b, 0xbc26, + 0xbc21, 0xbc1d, 0xbc18, 0xbc14, 0xbc0f, 0xbc0b, 0xbc06, 0xbc02, + 0xbbfa, 0xbbf1, 0xbbe8, 0xbbdf, 0xbbd6, 0xbbcd, 0xbbc4, 0xbbbb, + 0xbbb2, 0xbba9, 0xbba0, 0xbb97, 0xbb8e, 0xbb85, 0xbb7c, 0xbb73, + 0xbb6a, 0xbb61, 0xbb58, 0xbb4f, 0xbb46, 0xbb3d, 0xbb34, 0xbb2b, + 0xbb22, 0xbb19, 0xbb10, 0xbb07, 0xbafe, 0xbaf5, 0xbaed, 0xbae4, + 0xbadb, 0xbad2, 0xbac9, 0xbac0, 0xbab7, 0xbaae, 0xbaa5, 0xba9c, + 0xba94, 0xba8b, 0xba82, 0xba79, 0xba70, 0xba67, 0xba5f, 0xba56, + 0xba4d, 0xba44, 0xba3b, 0xba32, 0xba2a, 0xba21, 0xba18, 0xba0f, + 0xba06, 0xb9fe, 0xb9f5, 0xb9ec, 0xb9e3, 0xb9da, 0xb9d2, 0xb9c9, + 0xb9c0, 0xb9b7, 0xb9af, 0xb9a6, 0xb99d, 0xb995, 0xb98c, 0xb983, + 0xb97a, 0xb972, 0xb969, 0xb960, 0xb958, 0xb94f, 0xb946, 0xb93d, + 0xb935, 0xb92c, 0xb923, 0xb91b, 0xb912, 0xb909, 0xb901, 0xb8f8, + 0xb8ef, 0xb8e7, 0xb8de, 0xb8d6, 0xb8cd, 0xb8c4, 0xb8bc, 0xb8b3, + 0xb8ab, 0xb8a2, 0xb899, 0xb891, 0xb888, 0xb880, 0xb877, 0xb86e, + 0xb866, 0xb85d, 0xb855, 0xb84c, 0xb844, 0xb83b, 0xb832, 0xb82a, + 0xb821, 0xb819, 0xb810, 0xb808, 0xb7ff, 0xb7ee, 0xb7dd, 0xb7cc, + 0xb7bb, 0xb7aa, 0xb799, 0xb788, 0xb777, 0xb766, 0xb755, 0xb744, + 0xb733, 0xb722, 0xb711, 0xb700, 0xb6ef, 0xb6de, 0xb6cd, 0xb6bd, + 0xb6ac, 0xb69b, 0xb68a, 0xb679, 0xb668, 0xb658, 0xb647, 0xb636, + 0xb625, 0xb614, 0xb604, 0xb5f3, 0xb5e2, 0xb5d1, 0xb5c1, 0xb5b0, + 0xb59f, 0xb58e, 0xb57e, 0xb56d, 0xb55c, 0xb54c, 0xb53b, 0xb52a, + 0xb51a, 0xb509, 0xb4f8, 0xb4e8, 0xb4d7, 0xb4c7, 0xb4b6, 0xb4a5, + 0xb495, 0xb484, 0xb474, 0xb463, 0xb452, 0xb442, 0xb431, 0xb421, + 0xb410, 0xb400, 0xb3df, 0xb3be, 0xb39d, 0xb37c, 0xb35b, 0xb33a, + 0xb319, 0xb2f8, 0xb2d7, 0xb2b6, 0xb295, 0xb275, 0xb254, 0xb233, + 0xb212, 0xb1f2, 0xb1d1, 0xb1b0, 0xb18f, 0xb16f, 0xb14e, 0xb12d, + 0xb10d, 0xb0ec, 0xb0cb, 0xb0ab, 0xb08a, 0xb06a, 0xb049, 0xb029, + 0xb008, 0xafcf, 0xaf8e, 0xaf4d, 0xaf0c, 0xaecb, 0xae8b, 0xae4a, + 0xae09, 0xadc8, 0xad88, 0xad47, 0xad06, 0xacc6, 0xac85, 0xac45, + 0xac04, 0xab87, 0xab06, 0xaa85, 0xaa05, 0xa984, 0xa903, 0xa883, + 0xa802, 0xa703, 0xa602, 0xa502, 0xa401, 0xa201, 0xa001, 0x9c00, + 0x0000, 0x1fff, 0x23fe, 0x25fe, 0x27fc, 0x28fd, 0x29fc, 0x2afa, + 0x2bf8, 0x2c7b, 0x2cfa, 0x2d78, 0x2df7, 0x2e76, 0x2ef4, 0x2f72, + 0x2ff0, 0x3037, 0x3076, 0x30b5, 0x30f4, 0x3132, 0x3171, 0x31b0, + 0x31ee, 0x322d, 0x326b, 0x32aa, 0x32e8, 0x3326, 0x3364, 0x33a3, + 0x33e1, 0x340f, 0x342e, 0x344d, 0x346c, 0x348b, 0x34aa, 0x34c9, + 0x34e8, 0x3506, 0x3525, 0x3544, 0x3563, 0x3581, 0x35a0, 0x35bf, + 0x35dd, 0x35fc, 0x361a, 0x3639, 0x3657, 0x3676, 0x3694, 0x36b2, + 0x36d1, 0x36ef, 0x370d, 0x372c, 0x374a, 0x3768, 0x3786, 0x37a4, + 0x37c3, 0x37e1, 0x37ff, 0x380e, 0x381d, 0x382c, 0x383b, 0x384a, + 0x3859, 0x3868, 0x3877, 0x3886, 0x3895, 0x38a4, 0x38b3, 0x38c2, + 0x38d0, 0x38df, 0x38ee, 0x38fd, 0x390c, 0x391a, 0x3929, 0x3938, + 0x3947, 0x3955, 0x3964, 0x3973, 0x3982, 0x3990, 0x399f, 0x39ae, + 0x39bc, 0x39cb, 0x39d9, 0x39e8, 0x39f7, 0x3a05, 0x3a14, 0x3a22, + 0x3a31, 0x3a3f, 0x3a4e, 0x3a5c, 0x3a6b, 0x3a79, 0x3a88, 0x3a96, + 0x3aa5, 0x3ab3, 0x3ac1, 0x3ad0, 0x3ade, 0x3aed, 0x3afb, 0x3b09, + 0x3b18, 0x3b26, 0x3b34, 0x3b42, 0x3b51, 0x3b5f, 0x3b6d, 0x3b7c, + 0x3b8a, 0x3b98, 0x3ba6, 0x3bb4, 0x3bc3, 0x3bd1, 0x3bdf, 0x3bed, + 0x3bfb, 0x3c05, 0x3c0c, 0x3c13, 0x3c1a, 0x3c21, 0x3c28, 0x3c2f, + 0x3c36, 0x3c3d, 0x3c44, 0x3c4b, 0x3c52, 0x3c59, 0x3c60, 0x3c67, + 0x3c6e, 0x3c75, 0x3c7c, 0x3c83, 0x3c8a, 0x3c91, 0x3c97, 0x3c9e, + 0x3ca5, 0x3cac, 0x3cb3, 0x3cba, 0x3cc1, 0x3cc8, 0x3ccf, 0x3cd6, + 0x3cdc, 0x3ce3, 0x3cea, 0x3cf1, 0x3cf8, 0x3cff, 0x3d06, 0x3d0c, + 0x3d13, 0x3d1a, 0x3d21, 0x3d28, 0x3d2f, 0x3d35, 0x3d3c, 0x3d43, + 0x3d4a, 0x3d51, 0x3d57, 0x3d5e, 0x3d65, 0x3d6c, 0x3d72, 0x3d79, + 0x3d80, 0x3d87, 0x3d8d, 0x3d94, 0x3d9b, 0x3da1, 0x3da8, 0x3daf, + 0x3db6, 0x3dbc, 0x3dc3, 0x3dca, 0x3dd0, 0x3dd7, 0x3dde, 0x3de4, + 0x3deb, 0x3df2, 0x3df8, 0x3dff, 0x3e05, 0x3e0c, 0x3e13, 0x3e19, + 0x3e20, 0x3e27, 0x3e2d, 0x3e34, 0x3e3a, 0x3e41, 0x3e47, 0x3e4e, + 0x3e55, 0x3e5b, 0x3e62, 0x3e68, 0x3e6f, 0x3e75, 0x3e7c, 0x3e82, + 0x3e89, 0x3e8f, 0x3e96, 0x3e9c, 0x3ea3, 0x3ea9, 0x3eb0, 0x3eb6, + 0x3ebd, 0x3ec3, 0x3eca, 0x3ed0, 0x3ed7, 0x3edd, 0x3ee4, 0x3eea, + 0x3ef1, 0x3ef7, 0x3efe, 0x3f04, 0x3f0a, 0x3f11, 0x3f17, 0x3f1e, + 0x3f24, 0x3f2a, 0x3f31, 0x3f37, 0x3f3e, 0x3f44, 0x3f4a, 0x3f51, + 0x3f57, 0x3f5d, 0x3f64, 0x3f6a, 0x3f70, 0x3f77, 0x3f7d, 0x3f83, + 0x3f8a, 0x3f90, 0x3f96, 0x3f9d, 0x3fa3, 0x3fa9, 0x3fb0, 0x3fb6, + 0x3fbc, 0x3fc2, 0x3fc9, 0x3fcf, 0x3fd5, 0x3fdc, 0x3fe2, 0x3fe8, + 0x3fee, 0x3ff5, 0x3ffb, 0x4000, 0x4004, 0x4007, 0x400a, 0x400d, + 0x4010, 0x4013, 0x4016, 0x4019, 0x401c, 0x4020, 0x4023, 0x4026, + 0x4029, 0x402c, 0x402f, 0x4032, 0x4035, 0x4038, 0x403b, 0x403e, + 0x4041, 0x4044, 0x4048, 0x404b, 0x404e, 0x4051, 0x4054, 0x4057, + 0x405a, 0x405d, 0x4060, 0x4063, 0x4066, 0x4069, 0x406c, 0x406f, + 0x4072, 0x4075, 0x4078, 0x407b, 0x407e, 0x4081, 0x4084, 0x4087, + 0x408a, 0x408d, 0x4090, 0x4093, 0x4096, 0x4099, 0x409c, 0x409f, + 0x40a2, 0x40a5, 0x40a8, 0x40ab, 0x40ae, 0x40b1, 0x40b4, 0x40b7, + 0x40ba, 0x40bd, 0x40c0, 0x40c3, 0x40c6, 0x40c9, 0x40cc, 0x40cf, + 0x40d2, 0x40d5, 0x40d8, 0x40db, 0x40de, 0x40e1, 0x40e4, 0x40e7, + 0x40ea, 0x40ed, 0x40ef, 0x40f2, 0x40f5, 0x40f8, 0x40fb, 0x40fe, + 0x4101, 0x4104, 0x4107, 0x410a, 0x410d, 0x4110, 0x4113, 0x4115, + 0x4118, 0x411b, 0x411e, 0x4121, 0x4124, 0x4127, 0x412a, 0x412d, + 0x4130, 0x4132, 0x4135, 0x4138, 0x413b, 0x413e, 0x4141, 0x4144, + 0x4147, 0x414a, 0x414c, 0x414f, 0x4152, 0x4155, 0x4158, 0x415b, + 0x415e, 0x4160, 0x4163, 0x4166, 0x4169, 0x416c, 0x416f, 0x4172, + 0x4174, 0x4177, 0x417a, 0x417d, 0x4180, 0x4183, 0x4185, 0x4188, + 0x418b, 0x418e, 0x4191, 0x4194, 0x4196, 0x4199, 0x419c, 0x419f, + 0x41a2, 0x41a5, 0x41a7, 0x41aa, 0x41ad, 0x41b0, 0x41b3, 0x41b5, + 0x41b8, 0x41bb, 0x41be, 0x41c1, 0x41c3, 0x41c6, 0x41c9, 0x41cc, + 0x41ce, 0x41d1, 0x41d4, 0x41d7, 0x41da, 0x41dc, 0x41df, 0x41e2, + 0x41e5, 0x41e7, 0x41ea, 0x41ed, 0x41f0, 0x41f2, 0x41f5, 0x41f8, + 0x41fb, 0x41fd, 0x4200, 0x4203, 0x4206, 0x4208, 0x420b, 0x420e, + 0x4211, 0x4213, 0x4216, 0x4219, 0x421c, 0x421e, 0x4221, 0x4224, + 0x4227, 0x4229, 0x422c, 0x422f, 0x4231, 0x4234, 0x4237, 0x423a, + 0x423c, 0x423f, 0x4242, 0x4244, 0x4247, 0x424a, 0x424d, 0x424f, + 0x4252, 0x4255, 0x4257, 0x425a, 0x425d, 0x425f, 0x4262, 0x4265, + 0x4267, 0x426a, 0x426d, 0x426f, 0x4272, 0x4275, 0x4277, 0x427a, + 0x427d, 0x427f, 0x4282, 0x4285, 0x4287, 0x428a, 0x428d, 0x428f, + 0x4292, 0x4295, 0x4297, 0x429a, 0x429d, 0x429f, 0x42a2, 0x42a5, + 0x42a7, 0x42aa, 0x42ad, 0x42af, 0x42b2, 0x42b4, 0x42b7, 0x42ba, + 0x42bc, 0x42bf, 0x42c2, 0x42c4, 0x42c7, 0x42c9, 0x42cc, 0x42cf, + 0x42d1, 0x42d4, 0x42d6, 0x42d9, 0x42dc, 0x42de, 0x42e1, 0x42e3, + 0x42e6, 0x42e9, 0x42eb, 0x42ee, 0x42f0, 0x42f3, 0x42f6, 0x42f8, + 0x42fb, 0x42fd, 0x4300, 0x4303, 0x4305, 0x4308, 0x430a, 0x430d, + 0x430f, 0x4312, 0x4315, 0x4317, 0x431a, 0x431c, 0x431f, 0x4321, + 0x4324, 0x4327, 0x4329, 0x432c, 0x432e, 0x4331, 0x4333, 0x4336, + 0x4338, 0x433b, 0x433e, 0x4340, 0x4343, 0x4345, 0x4348, 0x434a, + 0x434d, 0x434f, 0x4352, 0x4354, 0x4357, 0x4359, 0x435c, 0x435e, + 0x4361, 0x4363, 0x4366, 0x4369, 0x436b, 0x436e, 0x4370, 0x4373, + 0x4375, 0x4378, 0x437a, 0x437d, 0x437f, 0x4382, 0x4384, 0x4387, + 0x4389, 0x438c, 0x438e, 0x4391, 0x4393, 0x4396, 0x4398, 0x439b, + 0x439d, 0x43a0, 0x43a2, 0x43a5, 0x43a7, 0x43a9, 0x43ac, 0x43ae, + 0x43b1, 0x43b3, 0x43b6, 0x43b8, 0x43bb, 0x43bd, 0x43c0, 0x43c2, + 0x43c5, 0x43c7, 0x43ca, 0x43cc, 0x43ce, 0x43d1, 0x43d3, 0x43d6, + 0x43d8, 0x43db, 0x43dd, 0x43e0, 0x43e2, 0x43e5, 0x43e7, 0x43e9, + 0x43ec, 0x43ee, 0x43f1, 0x43f3, 0x43f6, 0x43f8, 0x43fa, 0x43fd, + 0x43ff, 0x4401, 0x4402, 0x4403, 0x4404, 0x4406, 0x4407, 0x4408, + 0x4409, 0x440b, 0x440c, 0x440d, 0x440e, 0x440f, 0x4411, 0x4412, + 0x4413, 0x4414, 0x4415, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, + 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4423, 0x4424, 0x4425, + 0x4426, 0x4427, 0x4428, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, + 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4436, 0x4437, 0x4438, + 0x4439, 0x443a, 0x443b, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, + 0x4442, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x444a, 0x444b, + 0x444c, 0x444d, 0x444e, 0x444f, 0x4451, 0x4452, 0x4453, 0x4454, + 0x4455, 0x4456, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, + 0x445e, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4467, + 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446f, 0x4470, + 0x4471, 0x4472, 0x4473, 0x4474, 0x4476, 0x4477, 0x4478, 0x4479, + 0x447a, 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, + 0x4483, 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, + 0x448c, 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, + 0x4495, 0x4496, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, + 0x449e, 0x449f, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a5, 0x44a6, + 0x44a7, 0x44a8, 0x44aa, 0x44ab, 0x44ac, 0x44ad, 0x44ae, 0x44af, + 0x44b0, 0x44b1, 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, + 0x44b9, 0x44ba, 0x44bb, 0x44bc, 0x44be, 0x44bf, 0x44c0, 0x44c1, + 0x44c2, 0x44c3, 0x44c4, 0x44c5, 0x44c6, 0x44c7, 0x44c9, 0x44ca, + 0x44cb, 0x44cc, 0x44cd, 0x44ce, 0x44cf, 0x44d0, 0x44d1, 0x44d2, + 0x44d4, 0x44d5, 0x44d6, 0x44d7, 0x44d8, 0x44d9, 0x44da, 0x44db, + 0x44dc, 0x44dd, 0x44de, 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e4, + 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44e9, 0x44ea, 0x44eb, 0x44ed, + 0x44ee, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f4, 0x44f5, + 0x44f6, 0x44f7, 0x44f8, 0x44f9, 0x44fb, 0x44fc, 0x44fd, 0x44fe, + 0x44ff, 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, 0x4505, 0x4506, + 0x4507, 0x4508, 0x450a, 0x450b, 0x450c, 0x450d, 0x450e, 0x450f, + 0x4510, 0x4511, 0x4512, 0x4513, 0x4514, 0x4515, 0x4516, 0x4517, + 0x4518, 0x4519, 0x451b, 0x451c, 0x451d, 0x451e, 0x451f, 0x4520, + 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, + 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 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, 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, + 0x457c, 0x457d, 0x457e, 0x457f, 0x4580, 0x4581, 0x4582, 0x4583, + 0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458a, 0x458b, + 0x458c, 0x458e, 0x4590, 0x4592, 0x4594, 0x4596, 0x4598, 0x459a, + 0x459c, 0x459d, 0x459f, 0x45a1, 0x45a3, 0x45a5, 0x45a7, 0x45a9, + 0x45ab, 0x45ad, 0x45af, 0x45b1, 0x45b3, 0x45b5, 0x45b7, 0x45b9, + 0x45bb, 0x45bd, 0x45bf, 0x45c1, 0x45c3, 0x45c5, 0x45c7, 0x45c9, + 0x45cb, 0x45cd, 0x45ce, 0x45d0, 0x45d2, 0x45d4, 0x45d6, 0x45d8, + 0x45da, 0x45dc, 0x45de, 0x45e0, 0x45e2, 0x45e4, 0x45e6, 0x45e7, + 0x45e9, 0x45eb, 0x45ed, 0x45ef, 0x45f1, 0x45f3, 0x45f5, 0x45f7, + 0x45f9, 0x45fb, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, 0x4606, + 0x4608, 0x460a, 0x460b, 0x460d, 0x460f, 0x4611, 0x4613, 0x4615, + 0x4617, 0x4619, 0x461a, 0x461c, 0x461e, 0x4620, 0x4622, 0x4624, + 0x4626, 0x4627, 0x4629, 0x462b, 0x462d, 0x462f, 0x4631, 0x4633, + 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, + 0x4643, 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464e, 0x4650, + 0x4652, 0x4653, 0x4655, 0x4657, 0x4659, 0x465b, 0x465d, 0x465e, + 0x4660, 0x4662, 0x4664, 0x4666, 0x4667, 0x4669, 0x466b, 0x466d, + 0x466f, 0x4670, 0x4672, 0x4674, 0x4676, 0x4677, 0x4679, 0x467b, + 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, 0x4686, 0x4687, 0x4689, + 0x468b, 0x468d, 0x468e, 0x4690, 0x4692, 0x4694, 0x4696, 0x4697, + 0x4699, 0x469b, 0x469d, 0x469e, 0x46a0, 0x46a2, 0x46a4, 0x46a5, + 0x46a7, 0x46a9, 0x46aa, 0x46ac, 0x46ae, 0x46b0, 0x46b1, 0x46b3, + 0x46b5, 0x46b7, 0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, + 0x46c3, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, + 0x46d0, 0x46d2, 0x46d4, 0x46d6, 0x46d7, 0x46d9, 0x46db, 0x46dc, + 0x46de, 0x46e0, 0x46e1, 0x46e3, 0x46e5, 0x46e6, 0x46e8, 0x46ea, + 0x46ec, 0x46ed, 0x46ef, 0x46f1, 0x46f2, 0x46f4, 0x46f6, 0x46f7, + 0x46f9, 0x46fb, 0x46fc, 0x46fe, 0x4700, 0x4701, 0x4703, 0x4705, + 0x4706, 0x4708, 0x470a, 0x470b, 0x470d, 0x470f, 0x4710, 0x4712, + 0x4714, 0x4715, 0x4717, 0x4718, 0x471a, 0x471c, 0x471d, 0x471f, + 0x4721, 0x4722, 0x4724, 0x4726, 0x4727, 0x4729, 0x472b, 0x472c, + 0x472e, 0x472f, 0x4731, 0x4733, 0x4734, 0x4736, 0x4738, 0x4739, + 0x473b, 0x473c, 0x473e, 0x4740, 0x4741, 0x4743, 0x4745, 0x4746, + 0x4748, 0x4749, 0x474b, 0x474d, 0x474e, 0x4750, 0x4751, 0x4753, + 0x4755, 0x4756, 0x4758, 0x4759, 0x475b, 0x475d, 0x475e, 0x4760, + 0x4761, 0x4763, 0x4765, 0x4766, 0x4768, 0x4769, 0x476b, 0x476c, + 0x476e, 0x4770, 0x4771, 0x4773, 0x4774, 0x4776, 0x4777, 0x4779, + 0x477b, 0x477c, 0x477e, 0x477f, 0x4781, 0x4782, 0x4784, 0x4786, + 0x4787, 0x4789, 0x478a, 0x478c, 0x478d, 0x478f, 0x4790, 0x4792, + 0x4794, 0x4795, 0x4797, 0x4798, 0x479a, 0x479b, 0x479d, 0x479e, + 0x47a0, 0x47a2, 0x47a3, 0x47a5, 0x47a6, 0x47a8, 0x47a9, 0x47ab, + 0x47ac, 0x47ae, 0x47af, 0x47b1, 0x47b2, 0x47b4, 0x47b5, 0x47b7, + 0x47b8, 0x47ba, 0x47bc, 0x47bd, 0x47bf, 0x47c0, 0x47c2, 0x47c3, + 0x47c5, 0x47c6, 0x47c8, 0x47c9, 0x47cb, 0x47cc, 0x47ce, 0x47cf, + 0x47d1, 0x47d2, 0x47d4, 0x47d5, 0x47d7, 0x47d8, 0x47da, 0x47db, + 0x47dd, 0x47de, 0x47e0, 0x47e1, 0x47e3, 0x47e4, 0x47e6, 0x47e7, + 0x47e9, 0x47ea, 0x47ec, 0x47ed, 0x47ef, 0x47f0, 0x47f2, 0x47f3, + 0x47f5, 0x47f6, 0x47f8, 0x47f9, 0x47fa, 0x47fc, 0x47fd, 0x47ff, + 0x4800, 0x4801, 0x4802, 0x4802, 0x4803, 0x4804, 0x4805, 0x4805, + 0x4806, 0x4807, 0x4808, 0x4808, 0x4809, 0x480a, 0x480a, 0x480b, + 0x480c, 0x480d, 0x480d, 0x480e, 0x480f, 0x4810, 0x4810, 0x4811, + 0x4812, 0x4812, 0x4813, 0x4814, 0x4815, 0x4815, 0x4816, 0x4817, + 0x4817, 0x4818, 0x4819, 0x481a, 0x481a, 0x481b, 0x481c, 0x481c, + 0x481d, 0x481e, 0x481f, 0x481f, 0x4820, 0x4821, 0x4821, 0x4822, + 0x4823, 0x4824, 0x4824, 0x4825, 0x4826, 0x4826, 0x4827, 0x4828, + 0x4829, 0x4829, 0x482a, 0x482b, 0x482b, 0x482c, 0x482d, 0x482e, + 0x482e, 0x482f, 0x4830, 0x4830, 0x4831, 0x4832, 0x4832, 0x4833, + 0x4834, 0x4835, 0x4835, 0x4836, 0x4837, 0x4837, 0x4838, 0x4839, + 0x4839, 0x483a, 0x483b, 0x483b, 0x483c, 0x483d, 0x483e, 0x483e, + 0x483f, 0x4840, 0x4840, 0x4841, 0x4842, 0x4842, 0x4843, 0x4844, + 0x4844, 0x4845, 0x4846, 0x4847, 0x4847, 0x4848, 0x4849, 0x4849, + 0x484a, 0x484b, 0x484b, 0x484c, 0x484d, 0x484d, 0x484e, 0x484f, + 0x484f, 0x4850, 0x4851, 0x4851, 0x4852, 0x4853, 0x4853, 0x4854, + 0x4855, 0x4856, 0x4856, 0x4857, 0x4858, 0x4858, 0x4859, 0x485a, + 0x485a, 0x485b, 0x485c, 0x485c, 0x485d, 0x485e, 0x485e, 0x485f, + 0x4860, 0x4860, 0x4861, 0x4862, 0x4862, 0x4863, 0x4864, 0x4864, + 0x4865, 0x4866, 0x4866, 0x4867, 0x4868, 0x4868, 0x4869, 0x486a, + 0x486a, 0x486b, 0x486c, 0x486c, 0x486d, 0x486e, 0x486e, 0x486f, + 0x4870, 0x4870, 0x4871, 0x4872, 0x4872, 0x4873, 0x4874, 0x4874, + 0x4875, 0x4876, 0x4876, 0x4877, 0x4877, 0x4878, 0x4879, 0x4879, + 0x487a, 0x487b, 0x487b, 0x487c, 0x487d, 0x487d, 0x487e, 0x487f, + 0x487f, 0x4880, 0x4881, 0x4881, 0x4882, 0x4883, 0x4883, 0x4884, + 0x4884, 0x4885, 0x4886, 0x4886, 0x4887, 0x4888, 0x4888, 0x4889, + 0x488a, 0x488a, 0x488b, 0x488c, 0x488c, 0x488d, 0x488d, 0x488e, + 0x488f, 0x488f, 0x4890, 0x4891, 0x4891, 0x4892, 0x4893, 0x4893, + 0x4894, 0x4895, 0x4895, 0x4896, 0x4896, 0x4897, 0x4898, 0x4898, + 0x4899, 0x489a, 0x489a, 0x489b, 0x489c, 0x489c, 0x489d, 0x489d, + 0x489e, 0x489f, 0x489f, 0x48a0, 0x48a1, 0x48a1, 0x48a2, 0x48a2, + 0x48a3, 0x48a4, 0x48a4, 0x48a5, 0x48a6, 0x48a6, 0x48a7, 0x48a7, + 0x48a8, 0x48a9, 0x48a9, 0x48aa, 0x48ab, 0x48ab, 0x48ac, 0x48ac, + 0x48ad, 0x48ae, 0x48ae, 0x48af, 0x48b0, 0x48b0, 0x48b1, 0x48b1, + 0x48b2, 0x48b3, 0x48b3, 0x48b4, 0x48b4, 0x48b5, 0x48b6, 0x48b6, + 0x48b7, 0x48b8, 0x48b8, 0x48b9, 0x48b9, 0x48ba, 0x48bb, 0x48bb, + 0x48bc, 0x48bc, 0x48bd, 0x48be, 0x48be, 0x48bf, 0x48c0, 0x48c0, + 0x48c1, 0x48c1, 0x48c2, 0x48c3, 0x48c3, 0x48c4, 0x48c4, 0x48c5, + 0x48c6, 0x48c6, 0x48c7, 0x48c7, 0x48c8, 0x48c9, 0x48c9, 0x48ca, + 0x48ca, 0x48cb, 0x48cc, 0x48cc, 0x48cd, 0x48cd, 0x48ce, 0x48cf, + 0x48cf, 0x48d0, 0x48d0, 0x48d1, 0x48d2, 0x48d2, 0x48d3, 0x48d3, + 0x48d4, 0x48d5, 0x48d5, 0x48d6, 0x48d6, 0x48d7, 0x48d8, 0x48d8, + 0x48d9, 0x48d9, 0x48da, 0x48db, 0x48db, 0x48dc, 0x48dc, 0x48dd, + 0x48de, 0x48de, 0x48df, 0x48df, 0x48e0, 0x48e1, 0x48e1, 0x48e2, + 0x48e2, 0x48e3, 0x48e3, 0x48e4, 0x48e5, 0x48e5, 0x48e6, 0x48e6, + 0x48e7, 0x48e8, 0x48e8, 0x48e9, 0x48e9, 0x48ea, 0x48eb, 0x48eb, + 0x48ec, 0x48ec, 0x48ed, 0x48ed, 0x48ee, 0x48ef, 0x48ef, 0x48f0, + 0x48f0, 0x48f1, 0x48f2, 0x48f2, 0x48f3, 0x48f3, 0x48f4, 0x48f4, + 0x48f5, 0x48f6, 0x48f6, 0x48f7, 0x48f7, 0x48f8, 0x48f8, 0x48f9, + 0x48fa, 0x48fa, 0x48fb, 0x48fb, 0x48fc, 0x48fd, 0x48fd, 0x48fe, + 0x48fe, 0x48ff, 0x48ff, 0x4900, 0x4901, 0x4901, 0x4902, 0x4902, + 0x4903, 0x4903, 0x4904, 0x4905, 0x4905, 0x4906, 0x4906, 0x4907, + 0x4907, 0x4908, 0x4909, 0x4909, 0x490a, 0x490a, 0x490b, 0x490b, + 0x490c, 0x490c, 0x490d, 0x490e, 0x490e, 0x490f, 0x490f, 0x4910, + 0x4910, 0x4911, 0x4912, 0x4912, 0x4913, 0x4913, 0x4914, 0x4914, + 0x4915, 0x4916, 0x4916, 0x4917, 0x4917, 0x4918, 0x4918, 0x4919, + 0x4919, 0x491a, 0x491b, 0x491b, 0x491c, 0x491c, 0x491d, 0x491d, + 0x491e, 0x491e, 0x491f, 0x4920, 0x4920, 0x4921, 0x4921, 0x4922, + 0x4922, 0x4923, 0x4923, 0x4924, 0x4925, 0x4925, 0x4926, 0x4926, + 0x4927, 0x4927, 0x4928, 0x4928, 0x4929, 0x492a, 0x492a, 0x492b, + 0x492b, 0x492c, 0x492c, 0x492d, 0x492d, 0x492e, 0x492e, 0x492f, + 0x4930, 0x4930, 0x4931, 0x4931, 0x4932, 0x4932, 0x4933, 0x4933, + 0x4934, 0x4934, 0x4935, 0x4936, 0x4936, 0x4937, 0x4937, 0x4938, + 0x4938, 0x4939, 0x4939, 0x493a, 0x493a, 0x493b, 0x493c, 0x493c, + 0x493d, 0x493d, 0x493e, 0x493e, 0x493f, 0x493f, 0x4940, 0x4940, + 0x4941, 0x4941, 0x4942, 0x4943, 0x4943, 0x4944, 0x4944, 0x4945, + 0x4945, 0x4946, 0x4946, 0x4947, 0x4947, 0x4948, 0x4948, 0x4949, + 0x4949, 0x494a, 0x494b, 0x494b, 0x494c, 0x494c, 0x494d, 0x494d, + 0x494e, 0x494e, 0x494f, 0x494f, 0x4950, 0x4950, 0x4951, 0x4951, + 0x4952, 0x4953, 0x4953, 0x4954, 0x4954, 0x4955, 0x4955, 0x4956, + 0x4956, 0x4957, 0x4957, 0x4958, 0x4958, 0x4959, 0x4959, 0x495a, + 0x495a, 0x495b, 0x495b, 0x495c, 0x495d, 0x495d, 0x495e, 0x495e, + 0x495f, 0x495f, 0x4960, 0x4960, 0x4961, 0x4961, 0x4962, 0x4962, + 0x4963, 0x4963, 0x4964, 0x4964, 0x4965, 0x4965, 0x4966, 0x4966, + 0x4967, 0x4967, 0x4968, 0x4968, 0x4969, 0x496a, 0x496a, 0x496b, + 0x496b, 0x496c, 0x496c, 0x496d, 0x496d, 0x496e, 0x496e, 0x496f, + 0x496f, 0x4970, 0x4970, 0x4971, 0x4971, 0x4972, 0x4972, 0x4973, + 0x4973, 0x4974, 0x4974, 0x4975, 0x4975, 0x4976, 0x4976, 0x4977, + 0x4977, 0x4978, 0x4978, 0x4979, 0x4979, 0x497a, 0x497a, 0x497b, + 0x497b, 0x497c, 0x497c, 0x497d, 0x497d, 0x497e, 0x497e, 0x497f, + 0x497f, 0x4980, 0x4981, 0x4981, 0x4982, 0x4982, 0x4983, 0x4983, + 0x4984, 0x4984, 0x4985, 0x4985, 0x4986, 0x4986, 0x4987, 0x4987, + 0x4988, 0x4988, 0x4989, 0x4989, 0x498a, 0x498a, 0x498b, 0x498b, + 0x498c, 0x498d, 0x498e, 0x498f, 0x4990, 0x4991, 0x4992, 0x4993, + 0x4994, 0x4995, 0x4996, 0x4997, 0x4997, 0x4998, 0x4999, 0x499a, + 0x499b, 0x499c, 0x499d, 0x499e, 0x499f, 0x49a0, 0x49a1, 0x49a2, + 0x49a3, 0x49a4, 0x49a5, 0x49a6, 0x49a7, 0x49a8, 0x49a9, 0x49aa, + 0x49ab, 0x49ac, 0x49ad, 0x49ae, 0x49af, 0x49b0, 0x49b1, 0x49b2, + 0x49b3, 0x49b4, 0x49b5, 0x49b6, 0x49b7, 0x49b8, 0x49b9, 0x49ba, + 0x49ba, 0x49bb, 0x49bc, 0x49bd, 0x49be, 0x49bf, 0x49c0, 0x49c1, + 0x49c2, 0x49c3, 0x49c4, 0x49c5, 0x49c6, 0x49c7, 0x49c8, 0x49c9, + 0x49ca, 0x49cb, 0x49cc, 0x49cc, 0x49cd, 0x49ce, 0x49cf, 0x49d0, + 0x49d1, 0x49d2, 0x49d3, 0x49d4, 0x49d5, 0x49d6, 0x49d7, 0x49d8, + 0x49d9, 0x49da, 0x49da, 0x49db, 0x49dc, 0x49dd, 0x49de, 0x49df, + 0x49e0, 0x49e1, 0x49e2, 0x49e3, 0x49e4, 0x49e5, 0x49e5, 0x49e6, + 0x49e7, 0x49e8, 0x49e9, 0x49ea, 0x49eb, 0x49ec, 0x49ed, 0x49ee, + 0x49ef, 0x49f0, 0x49f0, 0x49f1, 0x49f2, 0x49f3, 0x49f4, 0x49f5, + 0x49f6, 0x49f7, 0x49f8, 0x49f9, 0x49f9, 0x49fa, 0x49fb, 0x49fc, + 0x49fd, 0x49fe, 0x49ff, 0x4a00, 0x4a01, 0x4a02, 0x4a02, 0x4a03, + 0x4a04, 0x4a05, 0x4a06, 0x4a07, 0x4a08, 0x4a09, 0x4a09, 0x4a0a, + 0x4a0b, 0x4a0c, 0x4a0d, 0x4a0e, 0x4a0f, 0x4a10, 0x4a11, 0x4a11, + 0x4a12, 0x4a13, 0x4a14, 0x4a15, 0x4a16, 0x4a17, 0x4a18, 0x4a18, + 0x4a19, 0x4a1a, 0x4a1b, 0x4a1c, 0x4a1d, 0x4a1e, 0x4a1f, 0x4a1f, + 0x4a20, 0x4a21, 0x4a22, 0x4a23, 0x4a24, 0x4a25, 0x4a25, 0x4a26, + 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, 0x4a2b, 0x4a2c, 0x4a2d, + 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a31, 0x4a32, 0x4a33, 0x4a34, + 0x4a35, 0x4a36, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, + 0x4a3c, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a41, + 0x4a42, 0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a46, 0x4a47, 0x4a48, + 0x4a49, 0x4a4a, 0x4a4b, 0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, + 0x4a50, 0x4a50, 0x4a51, 0x4a52, 0x4a53, 0x4a54, 0x4a54, 0x4a55, + 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a59, 0x4a5a, 0x4a5b, 0x4a5c, + 0x4a5d, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a62, + 0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a66, 0x4a67, 0x4a68, 0x4a69, + 0x4a6a, 0x4a6a, 0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6e, 0x4a6f, + 0x4a70, 0x4a71, 0x4a72, 0x4a72, 0x4a73, 0x4a74, 0x4a75, 0x4a76, + 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7a, 0x4a7b, 0x4a7c, + 0x4a7d, 0x4a7e, 0x4a7e, 0x4a7f, 0x4a80, 0x4a81, 0x4a82, 0x4a82, + 0x4a83, 0x4a84, 0x4a85, 0x4a85, 0x4a86, 0x4a87, 0x4a88, 0x4a89, + 0x4a89, 0x4a8a, 0x4a8b, 0x4a8c, 0x4a8c, 0x4a8d, 0x4a8e, 0x4a8f, + 0x4a90, 0x4a90, 0x4a91, 0x4a92, 0x4a93, 0x4a93, 0x4a94, 0x4a95, + 0x4a96, 0x4a97, 0x4a97, 0x4a98, 0x4a99, 0x4a9a, 0x4a9a, 0x4a9b, + 0x4a9c, 0x4a9d, 0x4a9d, 0x4a9e, 0x4a9f, 0x4aa0, 0x4aa1, 0x4aa1, + 0x4aa2, 0x4aa3, 0x4aa4, 0x4aa4, 0x4aa5, 0x4aa6, 0x4aa7, 0x4aa7, + 0x4aa8, 0x4aa9, 0x4aaa, 0x4aaa, 0x4aab, 0x4aac, 0x4aad, 0x4aad, + 0x4aae, 0x4aaf, 0x4ab0, 0x4ab0, 0x4ab1, 0x4ab2, 0x4ab3, 0x4ab3, + 0x4ab4, 0x4ab5, 0x4ab6, 0x4ab6, 0x4ab7, 0x4ab8, 0x4ab9, 0x4ab9, + 0x4aba, 0x4abb, 0x4abc, 0x4abc, 0x4abd, 0x4abe, 0x4abf, 0x4abf, + 0x4ac0, 0x4ac1, 0x4ac2, 0x4ac2, 0x4ac3, 0x4ac4, 0x4ac4, 0x4ac5, + 0x4ac6, 0x4ac7, 0x4ac7, 0x4ac8, 0x4ac9, 0x4aca, 0x4aca, 0x4acb, + 0x4acc, 0x4acd, 0x4acd, 0x4ace, 0x4acf, 0x4acf, 0x4ad0, 0x4ad1, + 0x4ad2, 0x4ad2, 0x4ad3, 0x4ad4, 0x4ad5, 0x4ad5, 0x4ad6, 0x4ad7, + 0x4ad7, 0x4ad8, 0x4ad9, 0x4ada, 0x4ada, 0x4adb, 0x4adc, 0x4add, + 0x4add, 0x4ade, 0x4adf, 0x4adf, 0x4ae0, 0x4ae1, 0x4ae2, 0x4ae2, + 0x4ae3, 0x4ae4, 0x4ae4, 0x4ae5, 0x4ae6, 0x4ae7, 0x4ae7, 0x4ae8, + 0x4ae9, 0x4ae9, 0x4aea, 0x4aeb, 0x4aec, 0x4aec, 0x4aed, 0x4aee, + 0x4aee, 0x4aef, 0x4af0, 0x4af0, 0x4af1, 0x4af2, 0x4af3, 0x4af3, + 0x4af4, 0x4af5, 0x4af5, 0x4af6, 0x4af7, 0x4af7, 0x4af8, 0x4af9, + 0x4afa, 0x4afa, 0x4afb, 0x4afc, 0x4afc, 0x4afd, 0x4afe, 0x4afe, + 0x4aff, 0x4b00, 0x4b01, 0x4b01, 0x4b02, 0x4b03, 0x4b03, 0x4b04, + 0x4b05, 0x4b05, 0x4b06, 0x4b07, 0x4b07, 0x4b08, 0x4b09, 0x4b0a, + 0x4b0a, 0x4b0b, 0x4b0c, 0x4b0c, 0x4b0d, 0x4b0e, 0x4b0e, 0x4b0f, + 0x4b10, 0x4b10, 0x4b11, 0x4b12, 0x4b12, 0x4b13, 0x4b14, 0x4b15, + 0x4b15, 0x4b16, 0x4b17, 0x4b17, 0x4b18, 0x4b19, 0x4b19, 0x4b1a, + 0x4b1b, 0x4b1b, 0x4b1c, 0x4b1d, 0x4b1d, 0x4b1e, 0x4b1f, 0x4b1f, + 0x4b20, 0x4b21, 0x4b21, 0x4b22, 0x4b23, 0x4b23, 0x4b24, 0x4b25, + 0x4b25, 0x4b26, 0x4b27, 0x4b27, 0x4b28, 0x4b29, 0x4b29, 0x4b2a, + 0x4b2b, 0x4b2b, 0x4b2c, 0x4b2d, 0x4b2d, 0x4b2e, 0x4b2f, 0x4b2f, + 0x4b30, 0x4b31, 0x4b31, 0x4b32, 0x4b33, 0x4b33, 0x4b34, 0x4b35, + 0x4b35, 0x4b36, 0x4b37, 0x4b37, 0x4b38, 0x4b39, 0x4b39, 0x4b3a, + 0x4b3b, 0x4b3b, 0x4b3c, 0x4b3d, 0x4b3d, 0x4b3e, 0x4b3f, 0x4b3f, + 0x4b40, 0x4b41, 0x4b41, 0x4b42, 0x4b42, 0x4b43, 0x4b44, 0x4b44, + 0x4b45, 0x4b46, 0x4b46, 0x4b47, 0x4b48, 0x4b48, 0x4b49, 0x4b4a, + 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4c, 0x4b4d, 0x4b4d, 0x4b4e, 0x4b4f, + 0x4b4f, 0x4b50, 0x4b51, 0x4b51, 0x4b52, 0x4b53, 0x4b53, 0x4b54, + 0x4b55, 0x4b55, 0x4b56, 0x4b56, 0x4b57, 0x4b58, 0x4b58, 0x4b59, + 0x4b5a, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5c, 0x4b5d, 0x4b5d, 0x4b5e, + 0x4b5f, 0x4b5f, 0x4b60, 0x4b61, 0x4b61, 0x4b62, 0x4b63, 0x4b63, + 0x4b64, 0x4b64, 0x4b65, 0x4b66, 0x4b66, 0x4b67, 0x4b68, 0x4b68, + 0x4b69, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6b, 0x4b6c, 0x4b6d, 0x4b6d, + 0x4b6e, 0x4b6e, 0x4b6f, 0x4b70, 0x4b70, 0x4b71, 0x4b72, 0x4b72, + 0x4b73, 0x4b73, 0x4b74, 0x4b75, 0x4b75, 0x4b76, 0x4b77, 0x4b77, + 0x4b78, 0x4b78, 0x4b79, 0x4b7a, 0x4b7a, 0x4b7b, 0x4b7b, 0x4b7c, + 0x4b7d, 0x4b7d, 0x4b7e, 0x4b7f, 0x4b7f, 0x4b80, 0x4b80, 0x4b81, + 0x4b82, 0x4b82, 0x4b83, 0x4b83, 0x4b84, 0x4b85, 0x4b85, 0x4b86, + 0x4b87, 0x4b87, 0x4b88, 0x4b88, 0x4b89, 0x4b8a, 0x4b8a, 0x4b8b, + 0x4b8b, 0x4b8c, 0x4b8d, 0x4b8d, 0x4b8e, 0x4b8e, 0x4b8f, 0x4b90, + 0x4b90, 0x4b91, 0x4b91, 0x4b92, 0x4b93, 0x4b93, 0x4b94, 0x4b94, + 0x4b95, 0x4b96, 0x4b96, 0x4b97, 0x4b97, 0x4b98, 0x4b99, 0x4b99, + 0x4b9a, 0x4b9a, 0x4b9b, 0x4b9c, 0x4b9c, 0x4b9d, 0x4b9d, 0x4b9e, + 0x4b9f, 0x4b9f, 0x4ba0, 0x4ba0, 0x4ba1, 0x4ba2, 0x4ba2, 0x4ba3, + 0x4ba3, 0x4ba4, 0x4ba5, 0x4ba5, 0x4ba6, 0x4ba6, 0x4ba7, 0x4ba8, + 0x4ba8, 0x4ba9, 0x4ba9, 0x4baa, 0x4baa, 0x4bab, 0x4bac, 0x4bac, + 0x4bad, 0x4bad, 0x4bae, 0x4baf, 0x4baf, 0x4bb0, 0x4bb0, 0x4bb1, + 0x4bb1, 0x4bb2, 0x4bb3, 0x4bb3, 0x4bb4, 0x4bb4, 0x4bb5, 0x4bb6, + 0x4bb6, 0x4bb7, 0x4bb7, 0x4bb8, 0x4bb8, 0x4bb9, 0x4bba, 0x4bba, + 0x4bbb, 0x4bbb, 0x4bbc, 0x4bbd, 0x4bbd, 0x4bbe, 0x4bbe, 0x4bbf, + 0x4bbf, 0x4bc0, 0x4bc1, 0x4bc1, 0x4bc2, 0x4bc2, 0x4bc3, 0x4bc3, + 0x4bc4, 0x4bc5, 0x4bc5, 0x4bc6, 0x4bc6, 0x4bc7, 0x4bc7, 0x4bc8, + 0x4bc9, 0x4bc9, 0x4bca, 0x4bca, 0x4bcb, 0x4bcb, 0x4bcc, 0x4bcd, + 0x4bcd, 0x4bce, 0x4bce, 0x4bcf, 0x4bcf, 0x4bd0, 0x4bd1, 0x4bd1, + 0x4bd2, 0x4bd2, 0x4bd3, 0x4bd3, 0x4bd4, 0x4bd5, 0x4bd5, 0x4bd6, + 0x4bd6, 0x4bd7, 0x4bd7, 0x4bd8, 0x4bd8, 0x4bd9, 0x4bda, 0x4bda, + 0x4bdb, 0x4bdb, 0x4bdc, 0x4bdc, 0x4bdd, 0x4bde, 0x4bde, 0x4bdf, + 0x4bdf, 0x4be0, 0x4be0, 0x4be1, 0x4be1, 0x4be2, 0x4be3, 0x4be3, + 0x4be4, 0x4be4, 0x4be5, 0x4be5, 0x4be6, 0x4be6, 0x4be7, 0x4be8, + 0x4be8, 0x4be9, 0x4be9, 0x4bea, 0x4bea, 0x4beb, 0x4beb, 0x4bec, + 0x4bed, 0x4bed, 0x4bee, 0x4bee, 0x4bef, 0x4bef, 0x4bf0, 0x4bf0, + 0x4bf1, 0x4bf1, 0x4bf2, 0x4bf3, 0x4bf3, 0x4bf4, 0x4bf4, 0x4bf5, + 0x4bf5, 0x4bf6, 0x4bf6, 0x4bf7, 0x4bf8, 0x4bf8, 0x4bf9, 0x4bf9, + 0x4bfa, 0x4bfa, 0x4bfb, 0x4bfb, 0x4bfc, 0x4bfc, 0x4bfd, 0x4bfe, + 0x4bfe, 0x4bff, 0x4bff, 0x4c00, 0x4c00, 0x4c00, 0x4c01, 0x4c01, + 0x4c01, 0x4c01, 0x4c02, 0x4c02, 0x4c02, 0x4c03, 0x4c03, 0x4c03, + 0x4c03, 0x4c04, 0x4c04, 0x4c04, 0x4c04, 0x4c05, 0x4c05, 0x4c05, + 0x4c05, 0x4c06, 0x4c06, 0x4c06, 0x4c07, 0x4c07, 0x4c07, 0x4c07, + 0x4c08, 0x4c08, 0x4c08, 0x4c08, 0x4c09, 0x4c09, 0x4c09, 0x4c09, + 0x4c0a, 0x4c0a, 0x4c0a, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0c, + 0x4c0c, 0x4c0c, 0x4c0c, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0e, + 0x4c0e, 0x4c0e, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c10, 0x4c10, + 0x4c10, 0x4c10, 0x4c11, 0x4c11, 0x4c11, 0x4c11, 0x4c12, 0x4c12, + 0x4c12, 0x4c12, 0x4c13, 0x4c13, 0x4c13, 0x4c13, 0x4c14, 0x4c14, + 0x4c14, 0x4c15, 0x4c15, 0x4c15, 0x4c15, 0x4c16, 0x4c16, 0x4c16, + 0x4c16, 0x4c17, 0x4c17, 0x4c17, 0x4c17, 0x4c18, 0x4c18, 0x4c18, + 0x4c18, 0x4c19, 0x4c19, 0x4c19, 0x4c19, 0x4c1a, 0x4c1a, 0x4c1a, + 0x4c1a, 0x4c1b, 0x4c1b, 0x4c1b, 0x4c1c, 0x4c1c, 0x4c1c, 0x4c1c, + 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1e, 0x4c1e, 0x4c1e, 0x4c1e, + 0x4c1f, 0x4c1f, 0x4c1f, 0x4c1f, 0x4c20, 0x4c20, 0x4c20, 0x4c20, + 0x4c21, 0x4c21, 0x4c21, 0x4c21, 0x4c22, 0x4c22, 0x4c22, 0x4c22, + 0x4c23, 0x4c23, 0x4c23, 0x4c23, 0x4c24, 0x4c24, 0x4c24, 0x4c24, + 0x4c25, 0x4c25, 0x4c25, 0x4c25, 0x4c26, 0x4c26, 0x4c26, 0x4c26, + 0x4c27, 0x4c27, 0x4c27, 0x4c27, 0x4c28, 0x4c28, 0x4c28, 0x4c28, + 0x4c29, 0x4c29, 0x4c2a, 0x4c2a, 0x4c2b, 0x4c2b, 0x4c2c, 0x4c2c, + 0x4c2d, 0x4c2d, 0x4c2e, 0x4c2e, 0x4c2f, 0x4c2f, 0x4c30, 0x4c30, + 0x4c31, 0x4c31, 0x4c32, 0x4c32, 0x4c33, 0x4c33, 0x4c34, 0x4c34, + 0x4c35, 0x4c35, 0x4c36, 0x4c36, 0x4c36, 0x4c37, 0x4c37, 0x4c38, + 0x4c38, 0x4c39, 0x4c39, 0x4c3a, 0x4c3a, 0x4c3b, 0x4c3b, 0x4c3c, + 0x4c3c, 0x4c3d, 0x4c3d, 0x4c3e, 0x4c3e, 0x4c3f, 0x4c3f, 0x4c40, + 0x4c40, 0x4c41, 0x4c41, 0x4c42, 0x4c42, 0x4c43, 0x4c43, 0x4c43, + 0x4c44, 0x4c44, 0x4c45, 0x4c45, 0x4c46, 0x4c46, 0x4c47, 0x4c47, + 0x4c48, 0x4c48, 0x4c49, 0x4c49, 0x4c4a, 0x4c4a, 0x4c4b, 0x4c4b, + 0x4c4b, 0x4c4c, 0x4c4c, 0x4c4d, 0x4c4d, 0x4c4e, 0x4c4e, 0x4c4f, + 0x4c4f, 0x4c50, 0x4c50, 0x4c51, 0x4c51, 0x4c52, 0x4c52, 0x4c52, + 0x4c53, 0x4c53, 0x4c54, 0x4c54, 0x4c55, 0x4c55, 0x4c56, 0x4c56, + 0x4c57, 0x4c57, 0x4c57, 0x4c58, 0x4c58, 0x4c59, 0x4c59, 0x4c5a, + 0x4c5a, 0x4c5b, 0x4c5b, 0x4c5c, 0x4c5c, 0x4c5c, 0x4c5d, 0x4c5d, + 0x4c5e, 0x4c5e, 0x4c5f, 0x4c5f, 0x4c60, 0x4c60, 0x4c61, 0x4c61, + 0x4c61, 0x4c62, 0x4c62, 0x4c63, 0x4c63, 0x4c64, 0x4c64, 0x4c65, + 0x4c65, 0x4c65, 0x4c66, 0x4c66, 0x4c67, 0x4c67, 0x4c68, 0x4c68, + 0x4c69, 0x4c69, 0x4c69, 0x4c6a, 0x4c6a, 0x4c6b, 0x4c6b, 0x4c6c, + 0x4c6c, 0x4c6c, 0x4c6d, 0x4c6d, 0x4c6e, 0x4c6e, 0x4c6f, 0x4c6f, + 0x4c70, 0x4c70, 0x4c70, 0x4c71, 0x4c71, 0x4c72, 0x4c72, 0x4c73, + 0x4c73, 0x4c73, 0x4c74, 0x4c74, 0x4c75, 0x4c75, 0x4c76, 0x4c76, + 0x4c76, 0x4c77, 0x4c77, 0x4c78, 0x4c78, 0x4c79, 0x4c79, 0x4c79, + 0x4c7a, 0x4c7a, 0x4c7b, 0x4c7b, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c7d, + 0x4c7d, 0x4c7e, 0x4c7e, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c80, 0x4c80, + 0x4c81, 0x4c81, 0x4c82, 0x4c82, 0x4c82, 0x4c83, 0x4c83, 0x4c84, + 0x4c84, 0x4c84, 0x4c85, 0x4c85, 0x4c86, 0x4c86, 0x4c87, 0x4c87, + 0x4c87, 0x4c88, 0x4c88, 0x4c89, 0x4c89, 0x4c89, 0x4c8a, 0x4c8a, + 0x4c8b, 0x4c8b, 0x4c8b, 0x4c8c, 0x4c8c, 0x4c8d, 0x4c8d, 0x4c8e, + 0x4c8e, 0x4c8e, 0x4c8f, 0x4c8f, 0x4c90, 0x4c90, 0x4c90, 0x4c91, + 0x4c91, 0x4c92, 0x4c92, 0x4c92, 0x4c93, 0x4c93, 0x4c94, 0x4c94, + 0x4c94, 0x4c95, 0x4c95, 0x4c96, 0x4c96, 0x4c97, 0x4c97, 0x4c97, + 0x4c98, 0x4c98, 0x4c99, 0x4c99, 0x4c99, 0x4c9a, 0x4c9a, 0x4c9b, + 0x4c9b, 0x4c9b, 0x4c9c, 0x4c9c, 0x4c9d, 0x4c9d, 0x4c9d, 0x4c9e, + 0x4c9e, 0x4c9f, 0x4c9f, 0x4c9f, 0x4ca0, 0x4ca0, 0x4ca0, 0x4ca1, + 0x4ca1, 0x4ca2, 0x4ca2, 0x4ca2, 0x4ca3, 0x4ca3, 0x4ca4, 0x4ca4, + 0x4ca4, 0x4ca5, 0x4ca5, 0x4ca6, 0x4ca6, 0x4ca6, 0x4ca7, 0x4ca7, + 0x4ca8, 0x4ca8, 0x4ca8, 0x4ca9, 0x4ca9, 0x4caa, 0x4caa, 0x4caa, + 0x4cab, 0x4cab, 0x4cab, 0x4cac, 0x4cac, 0x4cad, 0x4cad, 0x4cad, + 0x4cae, 0x4cae, 0x4caf, 0x4caf, 0x4caf, 0x4cb0, 0x4cb0, 0x4cb0, + 0x4cb1, 0x4cb1, 0x4cb2, 0x4cb2, 0x4cb2, 0x4cb3, 0x4cb3, 0x4cb4, + 0x4cb4, 0x4cb4, 0x4cb5, 0x4cb5, 0x4cb5, 0x4cb6, 0x4cb6, 0x4cb7, + 0x4cb7, 0x4cb7, 0x4cb8, 0x4cb8, 0x4cb8, 0x4cb9, 0x4cb9, 0x4cba, + 0x4cba, 0x4cba, 0x4cbb, 0x4cbb, 0x4cbb, 0x4cbc, 0x4cbc, 0x4cbd, + 0x4cbd, 0x4cbd, 0x4cbe, 0x4cbe, 0x4cbe, 0x4cbf, 0x4cbf, 0x4cc0, + 0x4cc0, 0x4cc0, 0x4cc1, 0x4cc1, 0x4cc1, 0x4cc2, 0x4cc2, 0x4cc3, + 0x4cc3, 0x4cc3, 0x4cc4, 0x4cc4, 0x4cc4, 0x4cc5, 0x4cc5, 0x4cc6, + 0x4cc6, 0x4cc6, 0x4cc7, 0x4cc7, 0x4cc7, 0x4cc8, 0x4cc8, 0x4cc8, + 0x4cc9, 0x4cc9, 0x4cca, 0x4cca, 0x4cca, 0x4ccb, 0x4ccb, 0x4ccb, + 0x4ccc, 0x4ccc, 0x4ccc, 0x4ccd, 0x4ccd, 0x4cce, 0x4cce, 0x4cce, + 0x4ccf, 0x4ccf, 0x4ccf, 0x4cd0, 0x4cd0, 0x4cd0, 0x4cd1, 0x4cd1, + 0x4cd2, 0x4cd2, 0x4cd2, 0x4cd3, 0x4cd3, 0x4cd3, 0x4cd4, 0x4cd4, + 0x4cd4, 0x4cd5, 0x4cd5, 0x4cd5, 0x4cd6, 0x4cd6, 0x4cd7, 0x4cd7, + 0x4cd7, 0x4cd8, 0x4cd8, 0x4cd8, 0x4cd9, 0x4cd9, 0x4cd9, 0x4cda, + 0x4cda, 0x4cda, 0x4cdb, 0x4cdb, 0x4cdb, 0x4cdc, 0x4cdc, 0x4cdd, + 0x4cdd, 0x4cdd, 0x4cde, 0x4cde, 0x4cde, 0x4cdf, 0x4cdf, 0x4cdf, + 0x4ce0, 0x4ce0, 0x4ce0, 0x4ce1, 0x4ce1, 0x4ce1, 0x4ce2, 0x4ce2, + 0x4ce2, 0x4ce3, 0x4ce3, 0x4ce4, 0x4ce4, 0x4ce4, 0x4ce5, 0x4ce5, + 0x4ce5, 0x4ce6, 0x4ce6, 0x4ce6, 0x4ce7, 0x4ce7, 0x4ce7, 0x4ce8, + 0x4ce8, 0x4ce8, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cea, 0x4cea, 0x4cea, + 0x4ceb, 0x4ceb, 0x4ceb, 0x4cec, 0x4cec, 0x4cec, 0x4ced, 0x4ced, + 0x4ced, 0x4cee, 0x4cee, 0x4cef, 0x4cef, 0x4cef, 0x4cf0, 0x4cf0, + 0x4cf0, 0x4cf1, 0x4cf1, 0x4cf1, 0x4cf2, 0x4cf2, 0x4cf2, 0x4cf3, + 0x4cf3, 0x4cf3, 0x4cf4, 0x4cf4, 0x4cf4, 0x4cf5, 0x4cf5, 0x4cf5, + 0x4cf6, 0x4cf6, 0x4cf6, 0x4cf7, 0x4cf7, 0x4cf7, 0x4cf8, 0x4cf8, + 0x4cf8, 0x4cf9, 0x4cf9, 0x4cf9, 0x4cfa, 0x4cfa, 0x4cfa, 0x4cfb, + 0x4cfb, 0x4cfb, 0x4cfc, 0x4cfc, 0x4cfc, 0x4cfd, 0x4cfd, 0x4cfd, + 0x4cfe, 0x4cfe, 0x4cfe, 0x4cff, 0x4cff, 0x4cff, 0x4d00, 0x4d00, + 0x4d00, 0x4d01, 0x4d01, 0x4d01, 0x4d02, 0x4d02, 0x4d02, 0x4d03, + 0x4d03, 0x4d03, 0x4d03, 0x4d04, 0x4d04, 0x4d04, 0x4d05, 0x4d05, + 0x4d05, 0x4d06, 0x4d06, 0x4d06, 0x4d07, 0x4d07, 0x4d07, 0x4d08, + 0x4d08, 0x4d08, 0x4d09, 0x4d09, 0x4d09, 0x4d0a, 0x4d0a, 0x4d0a, + 0x4d0b, 0x4d0b, 0x4d0b, 0x4d0c, 0x4d0c, 0x4d0c, 0x4d0d, 0x4d0d, + 0x4d0d, 0x4d0d, 0x4d0e, 0x4d0e, 0x4d0e, 0x4d0f, 0x4d0f, 0x4d0f, + 0x4d10, 0x4d10, 0x4d10, 0x4d11, 0x4d11, 0x4d11, 0x4d12, 0x4d12, + 0x4d12, 0x4d13, 0x4d13, 0x4d13, 0x4d14, 0x4d14, 0x4d14, 0x4d14, + 0x4d15, 0x4d15, 0x4d15, 0x4d16, 0x4d16, 0x4d16, 0x4d17, 0x4d17, + 0x4d17, 0x4d18, 0x4d18, 0x4d18, 0x4d19, 0x4d19, 0x4d19, 0x4d1a, + 0x4d1a, 0x4d1a, 0x4d1a, 0x4d1b, 0x4d1b, 0x4d1b, 0x4d1c, 0x4d1c, + 0x4d1c, 0x4d1d, 0x4d1d, 0x4d1d, 0x4d1e, 0x4d1e, 0x4d1e, 0x4d1e, + 0x4d1f, 0x4d1f, 0x4d1f, 0x4d20, 0x4d20, 0x4d20, 0x4d21, 0x4d21, + 0x4d21, 0x4d22, 0x4d22, 0x4d22, 0x4d22, 0x4d23, 0x4d23, 0x4d23, + 0x4d24, 0x4d24, 0x4d24, 0x4d25, 0x4d25, 0x4d25, 0x4d26, 0x4d26, + 0x4d26, 0x4d26, 0x4d27, 0x4d27, 0x4d27, 0x4d28, 0x4d28, 0x4d28, + 0x4d29, 0x4d29, 0x4d29, 0x4d29, 0x4d2a, 0x4d2a, 0x4d2a, 0x4d2b, + 0x4d2b, 0x4d2b, 0x4d2c, 0x4d2c, 0x4d2c, 0x4d2d, 0x4d2d, 0x4d2d, + 0x4d2d, 0x4d2e, 0x4d2e, 0x4d2e, 0x4d2f, 0x4d2f, 0x4d2f, 0x4d30, + 0x4d30, 0x4d30, 0x4d30, 0x4d31, 0x4d31, 0x4d31, 0x4d32, 0x4d32, + 0x4d32, 0x4d32, 0x4d33, 0x4d33, 0x4d33, 0x4d34, 0x4d34, 0x4d34, + 0x4d35, 0x4d35, 0x4d35, 0x4d35, 0x4d36, 0x4d36, 0x4d36, 0x4d37, + 0x4d37, 0x4d37, 0x4d38, 0x4d38, 0x4d38, 0x4d38, 0x4d39, 0x4d39, + 0x4d39, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3b, 0x4d3b, 0x4d3b, + 0x4d3c, 0x4d3c, 0x4d3c, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3e, + 0x4d3e, 0x4d3e, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d40, 0x4d40, + 0x4d40, 0x4d41, 0x4d41, 0x4d41, 0x4d41, 0x4d42, 0x4d42, 0x4d42, + 0x4d43, 0x4d43, 0x4d43, 0x4d43, 0x4d44, 0x4d44, 0x4d44, 0x4d45, + 0x4d45, 0x4d45, 0x4d45, 0x4d46, 0x4d46, 0x4d46, 0x4d47, 0x4d47, + 0x4d47, 0x4d47, 0x4d48, 0x4d48, 0x4d48, 0x4d49, 0x4d49, 0x4d49, + 0x4d49, 0x4d4a, 0x4d4a, 0x4d4a, 0x4d4b, 0x4d4b, 0x4d4b, 0x4d4b, + 0x4d4c, 0x4d4c, 0x4d4c, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4e, + 0x4d4e, 0x4d4e, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d50, 0x4d50, + 0x4d50, 0x4d51, 0x4d51, 0x4d51, 0x4d51, 0x4d52, 0x4d52, 0x4d52, + 0x4d53, 0x4d53, 0x4d53, 0x4d53, 0x4d54, 0x4d54, 0x4d54, 0x4d54, + 0x4d55, 0x4d55, 0x4d55, 0x4d56, 0x4d56, 0x4d56, 0x4d56, 0x4d57, + 0x4d57, 0x4d57, 0x4d58, 0x4d58, 0x4d58, 0x4d58, 0x4d59, 0x4d59, + 0x4d59, 0x4d59, 0x4d5a, 0x4d5a, 0x4d5a, 0x4d5b, 0x4d5b, 0x4d5b, + 0x4d5b, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5d, 0x4d5d, 0x4d5d, + 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5f, 0x4d5f, 0x4d5f, 0x4d5f, + 0x4d60, 0x4d60, 0x4d60, 0x4d61, 0x4d61, 0x4d61, 0x4d61, 0x4d62, + 0x4d62, 0x4d62, 0x4d62, 0x4d63, 0x4d63, 0x4d63, 0x4d64, 0x4d64, + 0x4d64, 0x4d64, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d66, 0x4d66, + 0x4d66, 0x4d67, 0x4d67, 0x4d67, 0x4d67, 0x4d68, 0x4d68, 0x4d68, + 0x4d68, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, + 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6c, 0x4d6c, 0x4d6c, 0x4d6c, + 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6e, 0x4d6e, 0x4d6e, 0x4d6f, + 0x4d6f, 0x4d6f, 0x4d6f, 0x4d70, 0x4d70, 0x4d70, 0x4d70, 0x4d71, + 0x4d71, 0x4d71, 0x4d71, 0x4d72, 0x4d72, 0x4d72, 0x4d72, 0x4d73, + 0x4d73, 0x4d73, 0x4d74, 0x4d74, 0x4d74, 0x4d74, 0x4d75, 0x4d75, + 0x4d75, 0x4d75, 0x4d76, 0x4d76, 0x4d76, 0x4d76, 0x4d77, 0x4d77, + 0x4d77, 0x4d77, 0x4d78, 0x4d78, 0x4d78, 0x4d78, 0x4d79, 0x4d79, + 0x4d79, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7b, 0x4d7b, 0x4d7b, + 0x4d7b, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7d, 0x4d7d, 0x4d7d, + 0x4d7d, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7f, 0x4d7f, 0x4d7f, + 0x4d7f, 0x4d80, 0x4d80, 0x4d80, 0x4d80, 0x4d81, 0x4d81, 0x4d81, + 0x4d81, 0x4d82, 0x4d82, 0x4d82, 0x4d82, 0x4d83, 0x4d83, 0x4d83, + 0x4d84, 0x4d84, 0x4d84, 0x4d84, 0x4d85, 0x4d85, 0x4d85, 0x4d85, + 0x4d86, 0x4d86, 0x4d86, 0x4d86, 0x4d87, 0x4d87, 0x4d87, 0x4d87, + 0x4d88, 0x4d88, 0x4d88, 0x4d88, 0x4d89, 0x4d89, 0x4d89, 0x4d89, + 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8b, 0x4d8b, 0x4d8b, 0x4d8b, + 0x4d8c, 0x4d8c, 0x4d8d, 0x4d8d, 0x4d8e, 0x4d8e, 0x4d8f, 0x4d8f, + 0x4d90, 0x4d90, 0x4d91, 0x4d91, 0x4d92, 0x4d92, 0x4d93, 0x4d93, + 0x4d94, 0x4d94, 0x4d94, 0x4d95, 0x4d95, 0x4d96, 0x4d96, 0x4d97, + 0x4d97, 0x4d98, 0x4d98, 0x4d99, 0x4d99, 0x4d9a, 0x4d9a, 0x4d9b, + 0x4d9b, 0x4d9c, 0x4d9c, 0x4d9d, 0x4d9d, 0x4d9e, 0x4d9e, 0x4d9f, + 0x4d9f, 0x4da0, 0x4da0, 0x4da1, 0x4da1, 0x4da2, 0x4da2, 0x4da3, + 0x4da3, 0x4da3, 0x4da4, 0x4da4, 0x4da5, 0x4da5, 0x4da6, 0x4da6, + 0x4da7, 0x4da7, 0x4da8, 0x4da8, 0x4da9, 0x4da9, 0x4daa, 0x4daa, + 0x4dab, 0x4dab, 0x4dac, 0x4dac, 0x4dac, 0x4dad, 0x4dad, 0x4dae, + 0x4dae, 0x4daf, 0x4daf, 0x4db0, 0x4db0, 0x4db1, 0x4db1, 0x4db2, + 0x4db2, 0x4db3, 0x4db3, 0x4db3, 0x4db4, 0x4db4, 0x4db5, 0x4db5, + 0x4db6, 0x4db6, 0x4db7, 0x4db7, 0x4db8, 0x4db8, 0x4db9, 0x4db9, + 0x4db9, 0x4dba, 0x4dba, 0x4dbb, 0x4dbb, 0x4dbc, 0x4dbc, 0x4dbd, + 0x4dbd, 0x4dbe, 0x4dbe, 0x4dbe, 0x4dbf, 0x4dbf, 0x4dc0, 0x4dc0, + 0x4dc1, 0x4dc1, 0x4dc2, 0x4dc2, 0x4dc3, 0x4dc3, 0x4dc3, 0x4dc4, + 0x4dc4, 0x4dc5, 0x4dc5, 0x4dc6, 0x4dc6, 0x4dc7, 0x4dc7, 0x4dc7, + 0x4dc8, 0x4dc8, 0x4dc9, 0x4dc9, 0x4dca, 0x4dca, 0x4dcb, 0x4dcb, + 0x4dcb, 0x4dcc, 0x4dcc, 0x4dcd, 0x4dcd, 0x4dce, 0x4dce, 0x4dce, + 0x4dcf, 0x4dcf, 0x4dd0, 0x4dd0, 0x4dd1, 0x4dd1, 0x4dd2, 0x4dd2, + 0x4dd2, 0x4dd3, 0x4dd3, 0x4dd4, 0x4dd4, 0x4dd5, 0x4dd5, 0x4dd5, + 0x4dd6, 0x4dd6, 0x4dd7, 0x4dd7, 0x4dd8, 0x4dd8, 0x4dd8, 0x4dd9, + 0x4dd9, 0x4dda, 0x4dda, 0x4ddb, 0x4ddb, 0x4ddb, 0x4ddc, 0x4ddc, + 0x4ddd, 0x4ddd, 0x4dde, 0x4dde, 0x4dde, 0x4ddf, 0x4ddf, 0x4de0, + 0x4de0, 0x4de1, 0x4de1, 0x4de1, 0x4de2, 0x4de2, 0x4de3, 0x4de3, + 0x4de4, 0x4de4, 0x4de4, 0x4de5, 0x4de5, 0x4de6, 0x4de6, 0x4de6, + 0x4de7, 0x4de7, 0x4de8, 0x4de8, 0x4de9, 0x4de9, 0x4de9, 0x4dea, + 0x4dea, 0x4deb, 0x4deb, 0x4deb, 0x4dec, 0x4dec, 0x4ded, 0x4ded, + 0x4dee, 0x4dee, 0x4dee, 0x4def, 0x4def, 0x4df0, 0x4df0, 0x4df0, + 0x4df1, 0x4df1, 0x4df2, 0x4df2, 0x4df2, 0x4df3, 0x4df3, 0x4df4, + 0x4df4, 0x4df5, 0x4df5, 0x4df5, 0x4df6, 0x4df6, 0x4df7, 0x4df7, + 0x4df7, 0x4df8, 0x4df8, 0x4df9, 0x4df9, 0x4df9, 0x4dfa, 0x4dfa, + 0x4dfb, 0x4dfb, 0x4dfb, 0x4dfc, 0x4dfc, 0x4dfd, 0x4dfd, 0x4dfd, + 0x4dfe, 0x4dfe, 0x4dff, 0x4dff, 0x4dff, 0x4e00, 0x4e00, 0x4e01, + 0x4e01, 0x4e01, 0x4e02, 0x4e02, 0x4e03, 0x4e03, 0x4e03, 0x4e04, + 0x4e04, 0x4e05, 0x4e05, 0x4e05, 0x4e06, 0x4e06, 0x4e07, 0x4e07, + 0x4e07, 0x4e08, 0x4e08, 0x4e09, 0x4e09, 0x4e09, 0x4e0a, 0x4e0a, + 0x4e0a, 0x4e0b, 0x4e0b, 0x4e0c, 0x4e0c, 0x4e0c, 0x4e0d, 0x4e0d, + 0x4e0e, 0x4e0e, 0x4e0e, 0x4e0f, 0x4e0f, 0x4e10, 0x4e10, 0x4e10, + 0x4e11, 0x4e11, 0x4e11, 0x4e12, 0x4e12, 0x4e13, 0x4e13, 0x4e13, + 0x4e14, 0x4e14, 0x4e15, 0x4e15, 0x4e15, 0x4e16, 0x4e16, 0x4e16, + 0x4e17, 0x4e17, 0x4e18, 0x4e18, 0x4e18, 0x4e19, 0x4e19, 0x4e19, + 0x4e1a, 0x4e1a, 0x4e1b, 0x4e1b, 0x4e1b, 0x4e1c, 0x4e1c, 0x4e1c, + 0x4e1d, 0x4e1d, 0x4e1e, 0x4e1e, 0x4e1e, 0x4e1f, 0x4e1f, 0x4e1f, + 0x4e20, 0x4e20, 0x4e21, 0x4e21, 0x4e21, 0x4e22, 0x4e22, 0x4e22, + 0x4e23, 0x4e23, 0x4e24, 0x4e24, 0x4e24, 0x4e25, 0x4e25, 0x4e25, + 0x4e26, 0x4e26, 0x4e27, 0x4e27, 0x4e27, 0x4e28, 0x4e28, 0x4e28, + 0x4e29, 0x4e29, 0x4e29, 0x4e2a, 0x4e2a, 0x4e2b, 0x4e2b, 0x4e2b, + 0x4e2c, 0x4e2c, 0x4e2c, 0x4e2d, 0x4e2d, 0x4e2e, 0x4e2e, 0x4e2e, + 0x4e2f, 0x4e2f, 0x4e2f, 0x4e30, 0x4e30, 0x4e30, 0x4e31, 0x4e31, + 0x4e32, 0x4e32, 0x4e32, 0x4e33, 0x4e33, 0x4e33, 0x4e34, 0x4e34, + 0x4e34, 0x4e35, 0x4e35, 0x4e35, 0x4e36, 0x4e36, 0x4e37, 0x4e37, + 0x4e37, 0x4e38, 0x4e38, 0x4e38, 0x4e39, 0x4e39, 0x4e39, 0x4e3a, + 0x4e3a, 0x4e3a, 0x4e3b, 0x4e3b, 0x4e3c, 0x4e3c, 0x4e3c, 0x4e3d, + 0x4e3d, 0x4e3d, 0x4e3e, 0x4e3e, 0x4e3e, 0x4e3f, 0x4e3f, 0x4e3f, + 0x4e40, 0x4e40, 0x4e40, 0x4e41, 0x4e41, 0x4e42, 0x4e42, 0x4e42, + 0x4e43, 0x4e43, 0x4e43, 0x4e44, 0x4e44, 0x4e44, 0x4e45, 0x4e45, + 0x4e45, 0x4e46, 0x4e46, 0x4e46, 0x4e47, 0x4e47, 0x4e47, 0x4e48, + 0x4e48, 0x4e48, 0x4e49, 0x4e49, 0x4e4a, 0x4e4a, 0x4e4a, 0x4e4b, + 0x4e4b, 0x4e4b, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e4d, 0x4e4d, 0x4e4d, + 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4f, 0x4e4f, 0x4e4f, 0x4e50, 0x4e50, + 0x4e50, 0x4e51, 0x4e51, 0x4e51, 0x4e52, 0x4e52, 0x4e52, 0x4e53, + 0x4e53, 0x4e53, 0x4e54, 0x4e54, 0x4e54, 0x4e55, 0x4e55, 0x4e55, + 0x4e56, 0x4e56, 0x4e56, 0x4e57, 0x4e57, 0x4e57, 0x4e58, 0x4e58, + 0x4e58, 0x4e59, 0x4e59, 0x4e59, 0x4e5a, 0x4e5a, 0x4e5a, 0x4e5b, + 0x4e5b, 0x4e5b, 0x4e5c, 0x4e5c, 0x4e5c, 0x4e5d, 0x4e5d, 0x4e5d, + 0x4e5e, 0x4e5e, 0x4e5e, 0x4e5f, 0x4e5f, 0x4e5f, 0x4e60, 0x4e60, + 0x4e60, 0x4e61, 0x4e61, 0x4e61, 0x4e62, 0x4e62, 0x4e62, 0x4e63, + 0x4e63, 0x4e63, 0x4e64, 0x4e64, 0x4e64, 0x4e65, 0x4e65, 0x4e65, + 0x4e66, 0x4e66, 0x4e66, 0x4e67, 0x4e67, 0x4e67, 0x4e68, 0x4e68, + 0x4e68, 0x4e69, 0x4e69, 0x4e69, 0x4e6a, 0x4e6a, 0x4e6a, 0x4e6b, + 0x4e6b, 0x4e6b, 0x4e6c, 0x4e6c, 0x4e6c, 0x4e6d, 0x4e6d, 0x4e6d, + 0x4e6d, 0x4e6e, 0x4e6e, 0x4e6e, 0x4e6f, 0x4e6f, 0x4e6f, 0x4e70, + 0x4e70, 0x4e70, 0x4e71, 0x4e71, 0x4e71, 0x4e72, 0x4e72, 0x4e72, + 0x4e73, 0x4e73, 0x4e73, 0x4e74, 0x4e74, 0x4e74, 0x4e75, 0x4e75, + 0x4e75, 0x4e75, 0x4e76, 0x4e76, 0x4e76, 0x4e77, 0x4e77, 0x4e77, + 0x4e78, 0x4e78, 0x4e78, 0x4e79, 0x4e79, 0x4e79, 0x4e7a, 0x4e7a, + 0x4e7a, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7c, 0x4e7c, 0x4e7c, + 0x4e7d, 0x4e7d, 0x4e7d, 0x4e7e, 0x4e7e, 0x4e7e, 0x4e7f, 0x4e7f, + 0x4e7f, 0x4e80, 0x4e80, 0x4e80, 0x4e80, 0x4e81, 0x4e81, 0x4e81, + 0x4e82, 0x4e82, 0x4e82, 0x4e83, 0x4e83, 0x4e83, 0x4e84, 0x4e84, + 0x4e84, 0x4e84, 0x4e85, 0x4e85, 0x4e85, 0x4e86, 0x4e86, 0x4e86, + 0x4e87, 0x4e87, 0x4e87, 0x4e88, 0x4e88, 0x4e88, 0x4e88, 0x4e89, + 0x4e89, 0x4e89, 0x4e8a, 0x4e8a, 0x4e8a, 0x4e8b, 0x4e8b, 0x4e8b, + 0x4e8b, 0x4e8c, 0x4e8c, 0x4e8c, 0x4e8d, 0x4e8d, 0x4e8d, 0x4e8e, + 0x4e8e, 0x4e8e, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e90, 0x4e90, + 0x4e90, 0x4e91, 0x4e91, 0x4e91, 0x4e92, 0x4e92, 0x4e92, 0x4e92, + 0x4e93, 0x4e93, 0x4e93, 0x4e94, 0x4e94, 0x4e94, 0x4e94, 0x4e95, + 0x4e95, 0x4e95, 0x4e96, 0x4e96, 0x4e96, 0x4e97, 0x4e97, 0x4e97, + 0x4e97, 0x4e98, 0x4e98, 0x4e98, 0x4e99, 0x4e99, 0x4e99, 0x4e9a, + 0x4e9a, 0x4e9a, 0x4e9a, 0x4e9b, 0x4e9b, 0x4e9b, 0x4e9c, 0x4e9c, + 0x4e9c, 0x4e9c, 0x4e9d, 0x4e9d, 0x4e9d, 0x4e9e, 0x4e9e, 0x4e9e, + 0x4e9f, 0x4e9f, 0x4e9f, 0x4e9f, 0x4ea0, 0x4ea0, 0x4ea0, 0x4ea1, + 0x4ea1, 0x4ea1, 0x4ea1, 0x4ea2, 0x4ea2, 0x4ea2, 0x4ea3, 0x4ea3, + 0x4ea3, 0x4ea3, 0x4ea4, 0x4ea4, 0x4ea4, 0x4ea5, 0x4ea5, 0x4ea5, + 0x4ea5, 0x4ea6, 0x4ea6, 0x4ea6, 0x4ea7, 0x4ea7, 0x4ea7, 0x4ea8, + 0x4ea8, 0x4ea8, 0x4ea8, 0x4ea9, 0x4ea9, 0x4ea9, 0x4eaa, 0x4eaa, + 0x4eaa, 0x4eaa, 0x4eab, 0x4eab, 0x4eab, 0x4eac, 0x4eac, 0x4eac, + 0x4eac, 0x4ead, 0x4ead, 0x4ead, 0x4eae, 0x4eae, 0x4eae, 0x4eae, + 0x4eaf, 0x4eaf, 0x4eaf, 0x4eaf, 0x4eb0, 0x4eb0, 0x4eb0, 0x4eb1, + 0x4eb1, 0x4eb1, 0x4eb1, 0x4eb2, 0x4eb2, 0x4eb2, 0x4eb3, 0x4eb3, + 0x4eb3, 0x4eb3, 0x4eb4, 0x4eb4, 0x4eb4, 0x4eb5, 0x4eb5, 0x4eb5, + 0x4eb5, 0x4eb6, 0x4eb6, 0x4eb6, 0x4eb7, 0x4eb7, 0x4eb7, 0x4eb7, + 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb9, 0x4eb9, 0x4eb9, 0x4eba, + 0x4eba, 0x4eba, 0x4eba, 0x4ebb, 0x4ebb, 0x4ebb, 0x4ebc, 0x4ebc, + 0x4ebc, 0x4ebc, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebe, 0x4ebe, + 0x4ebe, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ec0, 0x4ec0, 0x4ec0, + 0x4ec0, 0x4ec1, 0x4ec1, 0x4ec1, 0x4ec2, 0x4ec2, 0x4ec2, 0x4ec2, + 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec4, 0x4ec4, 0x4ec4, 0x4ec5, + 0x4ec5, 0x4ec5, 0x4ec5, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec7, + 0x4ec7, 0x4ec7, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec9, 0x4ec9, + 0x4ec9, 0x4ec9, 0x4eca, 0x4eca, 0x4eca, 0x4eca, 0x4ecb, 0x4ecb, + 0x4ecb, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecd, 0x4ecd, 0x4ecd, + 0x4ecd, 0x4ece, 0x4ece, 0x4ece, 0x4ece, 0x4ecf, 0x4ecf, 0x4ecf, + 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed1, 0x4ed1, 0x4ed1, 0x4ed1, + 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed3, 0x4ed3, 0x4ed3, 0x4ed4, + 0x4ed4, 0x4ed4, 0x4ed4, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed6, + 0x4ed6, 0x4ed6, 0x4ed6, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed8, + 0x4ed8, 0x4ed8, 0x4ed8, 0x4ed9, 0x4ed9, 0x4ed9, 0x4eda, 0x4eda, + 0x4eda, 0x4eda, 0x4edb, 0x4edb, 0x4edb, 0x4edb, 0x4edc, 0x4edc, + 0x4edc, 0x4edc, 0x4edd, 0x4edd, 0x4edd, 0x4edd, 0x4ede, 0x4ede, + 0x4ede, 0x4ede, 0x4edf, 0x4edf, 0x4edf, 0x4edf, 0x4ee0, 0x4ee0, + 0x4ee0, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee2, 0x4ee2, 0x4ee2, + 0x4ee2, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee4, 0x4ee4, 0x4ee4, + 0x4ee4, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee6, 0x4ee6, 0x4ee6, + 0x4ee6, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee8, 0x4ee8, 0x4ee8, + 0x4ee8, 0x4ee9, 0x4ee9, 0x4ee9, 0x4ee9, 0x4eea, 0x4eea, 0x4eea, + 0x4eea, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eec, 0x4eec, 0x4eec, + 0x4eec, 0x4eed, 0x4eed, 0x4eed, 0x4eed, 0x4eee, 0x4eee, 0x4eee, + 0x4eee, 0x4eef, 0x4eef, 0x4ef0, 0x4ef0, 0x4ef1, 0x4ef1, 0x4ef2, + 0x4ef2, 0x4ef3, 0x4ef3, 0x4ef4, 0x4ef4, 0x4ef5, 0x4ef5, 0x4ef6, + 0x4ef6, 0x4ef7, 0x4ef7, 0x4ef8, 0x4ef8, 0x4ef9, 0x4ef9, 0x4efa, + 0x4efa, 0x4efb, 0x4efb, 0x4efc, 0x4efc, 0x4efd, 0x4efd, 0x4efe, + 0x4efe, 0x4eff, 0x4eff, 0x4f00, 0x4f00, 0x4f01, 0x4f01, 0x4f02, + 0x4f02, 0x4f03, 0x4f03, 0x4f04, 0x4f04, 0x4f04, 0x4f05, 0x4f05, + 0x4f06, 0x4f06, 0x4f07, 0x4f07, 0x4f08, 0x4f08, 0x4f09, 0x4f09, + 0x4f0a, 0x4f0a, 0x4f0b, 0x4f0b, 0x4f0c, 0x4f0c, 0x4f0d, 0x4f0d, + 0x4f0d, 0x4f0e, 0x4f0e, 0x4f0f, 0x4f0f, 0x4f10, 0x4f10, 0x4f11, + 0x4f11, 0x4f12, 0x4f12, 0x4f13, 0x4f13, 0x4f14, 0x4f14, 0x4f15, + 0x4f15, 0x4f15, 0x4f16, 0x4f16, 0x4f17, 0x4f17, 0x4f18, 0x4f18, + 0x4f19, 0x4f19, 0x4f1a, 0x4f1a, 0x4f1b, 0x4f1b, 0x4f1b, 0x4f1c, + 0x4f1c, 0x4f1d, 0x4f1d, 0x4f1e, 0x4f1e, 0x4f1f, 0x4f1f, 0x4f20, + 0x4f20, 0x4f20, 0x4f21, 0x4f21, 0x4f22, 0x4f22, 0x4f23, 0x4f23, + 0x4f24, 0x4f24, 0x4f25, 0x4f25, 0x4f25, 0x4f26, 0x4f26, 0x4f27, + 0x4f27, 0x4f28, 0x4f28, 0x4f29, 0x4f29, 0x4f29, 0x4f2a, 0x4f2a, + 0x4f2b, 0x4f2b, 0x4f2c, 0x4f2c, 0x4f2d, 0x4f2d, 0x4f2d, 0x4f2e, + 0x4f2e, 0x4f2f, 0x4f2f, 0x4f30, 0x4f30, 0x4f31, 0x4f31, 0x4f31, + 0x4f32, 0x4f32, 0x4f33, 0x4f33, 0x4f34, 0x4f34, 0x4f34, 0x4f35, + 0x4f35, 0x4f36, 0x4f36, 0x4f37, 0x4f37, 0x4f37, 0x4f38, 0x4f38, + 0x4f39, 0x4f39, 0x4f3a, 0x4f3a, 0x4f3b, 0x4f3b, 0x4f3b, 0x4f3c, + 0x4f3c, 0x4f3d, 0x4f3d, 0x4f3e, 0x4f3e, 0x4f3e, 0x4f3f, 0x4f3f, + 0x4f40, 0x4f40, 0x4f41, 0x4f41, 0x4f41, 0x4f42, 0x4f42, 0x4f43, + 0x4f43, 0x4f43, 0x4f44, 0x4f44, 0x4f45, 0x4f45, 0x4f46, 0x4f46, + 0x4f46, 0x4f47, 0x4f47, 0x4f48, 0x4f48, 0x4f49, 0x4f49, 0x4f49, + 0x4f4a, 0x4f4a, 0x4f4b, 0x4f4b, 0x4f4b, 0x4f4c, 0x4f4c, 0x4f4d, + 0x4f4d, 0x4f4e, 0x4f4e, 0x4f4e, 0x4f4f, 0x4f4f, 0x4f50, 0x4f50, + 0x4f50, 0x4f51, 0x4f51, 0x4f52, 0x4f52, 0x4f53, 0x4f53, 0x4f53, + 0x4f54, 0x4f54, 0x4f55, 0x4f55, 0x4f55, 0x4f56, 0x4f56, 0x4f57, + 0x4f57, 0x4f57, 0x4f58, 0x4f58, 0x4f59, 0x4f59, 0x4f59, 0x4f5a, + 0x4f5a, 0x4f5b, 0x4f5b, 0x4f5b, 0x4f5c, 0x4f5c, 0x4f5d, 0x4f5d, + 0x4f5d, 0x4f5e, 0x4f5e, 0x4f5f, 0x4f5f, 0x4f60, 0x4f60, 0x4f60, + 0x4f61, 0x4f61, 0x4f62, 0x4f62, 0x4f62, 0x4f63, 0x4f63, 0x4f63, + 0x4f64, 0x4f64, 0x4f65, 0x4f65, 0x4f65, 0x4f66, 0x4f66, 0x4f67, + 0x4f67, 0x4f67, 0x4f68, 0x4f68, 0x4f69, 0x4f69, 0x4f69, 0x4f6a, + 0x4f6a, 0x4f6b, 0x4f6b, 0x4f6b, 0x4f6c, 0x4f6c, 0x4f6d, 0x4f6d, + 0x4f6d, 0x4f6e, 0x4f6e, 0x4f6f, 0x4f6f, 0x4f6f, 0x4f70, 0x4f70, + 0x4f70, 0x4f71, 0x4f71, 0x4f72, 0x4f72, 0x4f72, 0x4f73, 0x4f73, + 0x4f74, 0x4f74, 0x4f74, 0x4f75, 0x4f75, 0x4f75, 0x4f76, 0x4f76, + 0x4f77, 0x4f77, 0x4f77, 0x4f78, 0x4f78, 0x4f79, 0x4f79, 0x4f79, + 0x4f7a, 0x4f7a, 0x4f7a, 0x4f7b, 0x4f7b, 0x4f7c, 0x4f7c, 0x4f7c, + 0x4f7d, 0x4f7d, 0x4f7d, 0x4f7e, 0x4f7e, 0x4f7f, 0x4f7f, 0x4f7f, + 0x4f80, 0x4f80, 0x4f80, 0x4f81, 0x4f81, 0x4f82, 0x4f82, 0x4f82, + 0x4f83, 0x4f83, 0x4f83, 0x4f84, 0x4f84, 0x4f85, 0x4f85, 0x4f85, + 0x4f86, 0x4f86, 0x4f86, 0x4f87, 0x4f87, 0x4f88, 0x4f88, 0x4f88, + 0x4f89, 0x4f89, 0x4f89, 0x4f8a, 0x4f8a, 0x4f8b, 0x4f8b, 0x4f8b, + 0x4f8c, 0x4f8c, 0x4f8c, 0x4f8d, 0x4f8d, 0x4f8d, 0x4f8e, 0x4f8e, + 0x4f8f, 0x4f8f, 0x4f8f, 0x4f90, 0x4f90, 0x4f90, 0x4f91, 0x4f91, + 0x4f92, 0x4f92, 0x4f92, 0x4f93, 0x4f93, 0x4f93, 0x4f94, 0x4f94, + 0x4f94, 0x4f95, 0x4f95, 0x4f95, 0x4f96, 0x4f96, 0x4f97, 0x4f97, + 0x4f97, 0x4f98, 0x4f98, 0x4f98, 0x4f99, 0x4f99, 0x4f99, 0x4f9a, + 0x4f9a, 0x4f9b, 0x4f9b, 0x4f9b, 0x4f9c, 0x4f9c, 0x4f9c, 0x4f9d, + 0x4f9d, 0x4f9d, 0x4f9e, 0x4f9e, 0x4f9e, 0x4f9f, 0x4f9f, 0x4f9f, + 0x4fa0, 0x4fa0, 0x4fa1, 0x4fa1, 0x4fa1, 0x4fa2, 0x4fa2, 0x4fa2, + 0x4fa3, 0x4fa3, 0x4fa3, 0x4fa4, 0x4fa4, 0x4fa4, 0x4fa5, 0x4fa5, + 0x4fa5, 0x4fa6, 0x4fa6, 0x4fa7, 0x4fa7, 0x4fa7, 0x4fa8, 0x4fa8, + 0x4fa8, 0x4fa9, 0x4fa9, 0x4fa9, 0x4faa, 0x4faa, 0x4faa, 0x4fab, + 0x4fab, 0x4fab, 0x4fac, 0x4fac, 0x4fac, 0x4fad, 0x4fad, 0x4fad, + 0x4fae, 0x4fae, 0x4fae, 0x4faf, 0x4faf, 0x4fb0, 0x4fb0, 0x4fb0, + 0x4fb1, 0x4fb1, 0x4fb1, 0x4fb2, 0x4fb2, 0x4fb2, 0x4fb3, 0x4fb3, + 0x4fb3, 0x4fb4, 0x4fb4, 0x4fb4, 0x4fb5, 0x4fb5, 0x4fb5, 0x4fb6, + 0x4fb6, 0x4fb6, 0x4fb7, 0x4fb7, 0x4fb7, 0x4fb8, 0x4fb8, 0x4fb8, + 0x4fb9, 0x4fb9, 0x4fb9, 0x4fba, 0x4fba, 0x4fba, 0x4fbb, 0x4fbb, + 0x4fbb, 0x4fbc, 0x4fbc, 0x4fbc, 0x4fbd, 0x4fbd, 0x4fbd, 0x4fbe, + 0x4fbe, 0x4fbe, 0x4fbf, 0x4fbf, 0x4fbf, 0x4fc0, 0x4fc0, 0x4fc0, + 0x4fc1, 0x4fc1, 0x4fc1, 0x4fc2, 0x4fc2, 0x4fc2, 0x4fc3, 0x4fc3, + 0x4fc3, 0x4fc4, 0x4fc4, 0x4fc4, 0x4fc5, 0x4fc5, 0x4fc5, 0x4fc6, + 0x4fc6, 0x4fc6, 0x4fc7, 0x4fc7, 0x4fc7, 0x4fc8, 0x4fc8, 0x4fc8, + 0x4fc9, 0x4fc9, 0x4fc9, 0x4fca, 0x4fca, 0x4fca, 0x4fcb, 0x4fcb, + 0x4fcb, 0x4fcc, 0x4fcc, 0x4fcc, 0x4fcd, 0x4fcd, 0x4fcd, 0x4fcd, + 0x4fce, 0x4fce, 0x4fce, 0x4fcf, 0x4fcf, 0x4fcf, 0x4fd0, 0x4fd0, + 0x4fd0, 0x4fd1, 0x4fd1, 0x4fd1, 0x4fd2, 0x4fd2, 0x4fd2, 0x4fd3, + 0x4fd3, 0x4fd3, 0x4fd4, 0x4fd4, 0x4fd4, 0x4fd5, 0x4fd5, 0x4fd5, + 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd7, 0x4fd7, 0x4fd7, 0x4fd8, + 0x4fd8, 0x4fd8, 0x4fd9, 0x4fd9, 0x4fd9, 0x4fda, 0x4fda, 0x4fda, + 0x4fdb, 0x4fdb, 0x4fdb, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdd, + 0x4fdd, 0x4fdd, 0x4fde, 0x4fde, 0x4fde, 0x4fdf, 0x4fdf, 0x4fdf, + 0x4fe0, 0x4fe0, 0x4fe0, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe2, + 0x4fe2, 0x4fe2, 0x4fe3, 0x4fe3, 0x4fe3, 0x4fe4, 0x4fe4, 0x4fe4, + 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe6, 0x4fe6, 0x4fe6, 0x4fe7, + 0x4fe7, 0x4fe7, 0x4fe8, 0x4fe8, 0x4fe8, 0x4fe9, 0x4fe9, 0x4fe9, + 0x4fe9, 0x4fea, 0x4fea, 0x4fea, 0x4feb, 0x4feb, 0x4feb, 0x4fec, + 0x4fec, 0x4fec, 0x4fed, 0x4fed, 0x4fed, 0x4fed, 0x4fee, 0x4fee, + 0x4fee, 0x4fef, 0x4fef, 0x4fef, 0x4ff0, 0x4ff0, 0x4ff0, 0x4ff0, + 0x4ff1, 0x4ff1, 0x4ff1, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff3, 0x4ff3, + 0x4ff3, 0x4ff3, 0x4ff4, 0x4ff4, 0x4ff4, 0x4ff5, 0x4ff5, 0x4ff5, + 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff7, 0x4ff7, 0x4ff7, 0x4ff8, + 0x4ff8, 0x4ff8, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ffa, 0x4ffa, + 0x4ffa, 0x4ffb, 0x4ffb, 0x4ffb, 0x4ffc, 0x4ffc, 0x4ffc, 0x4ffc, + 0x4ffd, 0x4ffd, 0x4ffd, 0x4ffe, 0x4ffe, 0x4ffe, 0x4ffe, 0x4fff, + 0x4fff, 0x4fff, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5001, + 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5002, 0x5002, + 0x5002, 0x5002, 0x5002, 0x5002, 0x5002, 0x5003, 0x5003, 0x5003, + 0x5003, 0x5003, 0x5003, 0x5003, 0x5004, 0x5004, 0x5004, 0x5004, + 0x5004, 0x5004, 0x5004, 0x5005, 0x5005, 0x5005, 0x5005, 0x5005, + 0x5005, 0x5005, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, + 0x5006, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, + 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5009, + 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x500a, 0x500a, + 0x500a, 0x500a, 0x500a, 0x500a, 0x500a, 0x500b, 0x500b, 0x500b, + 0x500b, 0x500b, 0x500b, 0x500b, 0x500c, 0x500c, 0x500c, 0x500c, + 0x500c, 0x500c, 0x500c, 0x500d, 0x500d, 0x500d, 0x500d, 0x500d, + 0x500d, 0x500d, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, + 0x500e, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, + 0x500f, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, + 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5012, + 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5013, + 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5014, 0x5014, + 0x5014, 0x5014, 0x5014, 0x5014, 0x5014, 0x5015, 0x5015, 0x5015, + 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5016, 0x5016, 0x5016, + 0x5016, 0x5016, 0x5016, 0x5016, 0x5017, 0x5017, 0x5017, 0x5017, + 0x5017, 0x5017, 0x5017, 0x5017, 0x5018, 0x5018, 0x5018, 0x5018, + 0x5018, 0x5018, 0x5018, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, + 0x5019, 0x5019, 0x5019, 0x501a, 0x501a, 0x501a, 0x501a, 0x501a, + 0x501a, 0x501a, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, + 0x501b, 0x501b, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, + 0x501c, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, + 0x501d, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, + 0x501e, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, + 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, + 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, + 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, + 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, + 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5025, + 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5026, + 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5027, + 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5028, + 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5029, + 0x5029, 0x5029, 0x5029, 0x5029, 0x502a, 0x502a, 0x502a, 0x502a, + 0x502b, 0x502b, 0x502b, 0x502b, 0x502c, 0x502c, 0x502c, 0x502c, + 0x502d, 0x502d, 0x502d, 0x502d, 0x502e, 0x502e, 0x502e, 0x502e, + 0x502f, 0x502f, 0x502f, 0x502f, 0x5030, 0x5030, 0x5030, 0x5030, + 0x5031, 0x5031, 0x5031, 0x5031, 0x5032, 0x5032, 0x5032, 0x5032, + 0x5032, 0x5033, 0x5033, 0x5033, 0x5033, 0x5034, 0x5034, 0x5034, + 0x5034, 0x5035, 0x5035, 0x5035, 0x5035, 0x5036, 0x5036, 0x5036, + 0x5036, 0x5037, 0x5037, 0x5037, 0x5037, 0x5037, 0x5038, 0x5038, + 0x5038, 0x5038, 0x5039, 0x5039, 0x5039, 0x5039, 0x503a, 0x503a, + 0x503a, 0x503a, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503c, + 0x503c, 0x503c, 0x503c, 0x503d, 0x503d, 0x503d, 0x503d, 0x503e, + 0x503e, 0x503e, 0x503e, 0x503e, 0x503f, 0x503f, 0x503f, 0x503f, + 0x5040, 0x5040, 0x5040, 0x5040, 0x5041, 0x5041, 0x5041, 0x5041, + 0x5041, 0x5042, 0x5042, 0x5042, 0x5042, 0x5043, 0x5043, 0x5043, + 0x5043, 0x5043, 0x5044, 0x5044, 0x5044, 0x5044, 0x5045, 0x5045, + 0x5045, 0x5045, 0x5045, 0x5046, 0x5046, 0x5046, 0x5046, 0x5047, + 0x5047, 0x5047, 0x5047, 0x5047, 0x5048, 0x5048, 0x5048, 0x5048, + 0x5049, 0x5049, 0x5049, 0x5049, 0x5049, 0x504a, 0x504a, 0x504a, + 0x504a, 0x504b, 0x504b, 0x504b, 0x504b, 0x504b, 0x504c, 0x504c, + 0x504c, 0x504c, 0x504d, 0x504d, 0x504d, 0x504d, 0x504d, 0x504e, + 0x504e, 0x504e, 0x504e, 0x504e, 0x504f, 0x504f, 0x504f, 0x504f, + 0x5050, 0x5050, 0x5050, 0x5050, 0x5050, 0x5051, 0x5051, 0x5051, + 0x5051, 0x5051, 0x5052, 0x5052, 0x5052, 0x5052, 0x5053, 0x5053, + 0x5053, 0x5053, 0x5053, 0x5054, 0x5054, 0x5054, 0x5054, 0x5054, + 0x5055, 0x5055, 0x5055, 0x5055, 0x5056, 0x5056, 0x5056, 0x5056, + 0x5056, 0x5057, 0x5057, 0x5057, 0x5057, 0x5057, 0x5058, 0x5058, + 0x5058, 0x5058, 0x5058, 0x5059, 0x5059, 0x5059, 0x5059, 0x5059, + 0x505a, 0x505a, 0x505a, 0x505a, 0x505a, 0x505b, 0x505b, 0x505b, + 0x505b, 0x505c, 0x505c, 0x505c, 0x505c, 0x505c, 0x505d, 0x505d, + 0x505d, 0x505d, 0x505d, 0x505e, 0x505e, 0x505e, 0x505e, 0x505e, + 0x505f, 0x505f, 0x505f, 0x505f, 0x505f, 0x5060, 0x5060, 0x5060, + 0x5060, 0x5060, 0x5061, 0x5061, 0x5061, 0x5061, 0x5061, 0x5062, + 0x5062, 0x5062, 0x5062, 0x5062, 0x5063, 0x5063, 0x5063, 0x5063, + 0x5063, 0x5064, 0x5064, 0x5064, 0x5064, 0x5064, 0x5065, 0x5065, + 0x5065, 0x5065, 0x5065, 0x5066, 0x5066, 0x5066, 0x5066, 0x5066, + 0x5067, 0x5067, 0x5067, 0x5067, 0x5067, 0x5068, 0x5068, 0x5068, + 0x5068, 0x5068, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, + 0x506a, 0x506a, 0x506a, 0x506a, 0x506a, 0x506b, 0x506b, 0x506b, + 0x506b, 0x506b, 0x506c, 0x506c, 0x506c, 0x506c, 0x506c, 0x506d, + 0x506d, 0x506d, 0x506d, 0x506d, 0x506e, 0x506e, 0x506e, 0x506e, + 0x506e, 0x506e, 0x506f, 0x506f, 0x506f, 0x506f, 0x506f, 0x5070, + 0x5070, 0x5070, 0x5070, 0x5070, 0x5071, 0x5071, 0x5071, 0x5071, + 0x5071, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5073, + 0x5073, 0x5073, 0x5073, 0x5073, 0x5074, 0x5074, 0x5074, 0x5074, + 0x5074, 0x5074, 0x5075, 0x5075, 0x5075, 0x5075, 0x5075, 0x5076, + 0x5076, 0x5076, 0x5076, 0x5076, 0x5077, 0x5077, 0x5077, 0x5077, + 0x5077, 0x5077, 0x5078, 0x5078, 0x5078, 0x5078, 0x5078, 0x5079, + 0x5079, 0x5079, 0x5079, 0x5079, 0x5079, 0x507a, 0x507a, 0x507a, + 0x507a, 0x507a, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, + 0x507c, 0x507c, 0x507c, 0x507c, 0x507c, 0x507d, 0x507d, 0x507d, + 0x507d, 0x507d, 0x507d, 0x507e, 0x507e, 0x507e, 0x507e, 0x507e, + 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x5080, 0x5080, + 0x5080, 0x5080, 0x5080, 0x5080, 0x5081, 0x5081, 0x5081, 0x5081, + 0x5081, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5083, + 0x5083, 0x5083, 0x5083, 0x5083, 0x5083, 0x5084, 0x5084, 0x5084, + 0x5084, 0x5084, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, + 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5087, 0x5087, + 0x5087, 0x5087, 0x5087, 0x5087, 0x5088, 0x5088, 0x5088, 0x5088, + 0x5088, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x508a, + 0x508a, 0x508a, 0x508a, 0x508a, 0x508a, 0x508b, 0x508b, 0x508b, + 0x508b, 0x508b, 0x508b, 0x508c, 0x508c, 0x508c, 0x508c, 0x508c, + 0x508c, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508e, + 0x508e, 0x508e, 0x508e, 0x508e, 0x508e, 0x508f, 0x508f, 0x508f, + 0x508f, 0x508f, 0x508f, 0x5090, 0x5090, 0x5090, 0x5090, 0x5090, + 0x5090, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5092, + 0x5092, 0x5092, 0x5092, 0x5092, 0x5092, 0x5093, 0x5093, 0x5093, + 0x5093, 0x5093, 0x5093, 0x5094, 0x5094, 0x5094, 0x5094, 0x5094, + 0x5094, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5096, + 0x5096, 0x5096, 0x5096, 0x5096, 0x5096, 0x5097, 0x5097, 0x5097, + 0x5097, 0x5097, 0x5097, 0x5098, 0x5098, 0x5098, 0x5098, 0x5098, + 0x5098, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, + 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509b, 0x509b, + 0x509b, 0x509b, 0x509b, 0x509b, 0x509c, 0x509c, 0x509c, 0x509c, + 0x509c, 0x509c, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, + 0x509d, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509f, + 0x509f, 0x509f, 0x509f, 0x509f, 0x509f, 0x50a0, 0x50a0, 0x50a0, + 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a1, 0x50a1, 0x50a1, 0x50a1, + 0x50a1, 0x50a1, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, + 0x50a2, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a4, + 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a5, 0x50a5, 0x50a5, + 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a6, 0x50a6, 0x50a6, 0x50a6, + 0x50a6, 0x50a6, 0x50a6, 0x50a7, 0x50a7, 0x50a7, 0x50a7, 0x50a7, + 0x50a7, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, + 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50aa, 0x50aa, + 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50ab, 0x50ab, 0x50ab, + 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ac, 0x50ac, 0x50ac, 0x50ac, + 0x50ac, 0x50ac, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, + 0x50ad, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, + 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50b0, 0x50b0, + 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b1, 0x50b1, 0x50b1, + 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b2, 0x50b2, 0x50b2, 0x50b2, + 0x50b2, 0x50b2, 0x50b2, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b3, + 0x50b3, 0x50b3, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, + 0x50b4, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, + 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b7, 0x50b7, + 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b8, 0x50b8, 0x50b8, + 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b9, 0x50b9, 0x50b9, 0x50b9, + 0x50b9, 0x50b9, 0x50b9, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, + 0x50ba, 0x50ba, 0x50ba, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bb, + 0x50bb, 0x50bb, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, + 0x50bc, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, + 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50bf, + 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50c0, 0x50c0, + 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c1, 0x50c1, 0x50c1, + 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c2, 0x50c2, 0x50c2, + 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c3, 0x50c3, 0x50c3, 0x50c3, + 0x50c3, 0x50c3, 0x50c3, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, + 0x50c4, 0x50c4, 0x50c4, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c5, + 0x50c5, 0x50c5, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, + 0x50c6, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, + 0x50c7, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, + 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, + 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50cb, + 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cc, + 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cd, 0x50cd, + 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50ce, 0x50ce, + 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50cf, 0x50cf, + 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50d0, 0x50d0, 0x50d0, + 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d1, 0x50d1, 0x50d1, + 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d2, 0x50d2, 0x50d2, + 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d3, 0x50d3, 0x50d3, 0x50d3, + 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d4, 0x50d4, 0x50d4, 0x50d4, + 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d5, 0x50d5, 0x50d5, 0x50d5, + 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d6, 0x50d6, 0x50d6, 0x50d6, + 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d7, 0x50d7, 0x50d7, 0x50d7, + 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d8, 0x50d8, 0x50d8, 0x50d8, + 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d9, 0x50d9, 0x50d9, 0x50d9, + 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50da, 0x50da, 0x50da, 0x50da, + 0x50da, 0x50da, 0x50db, 0x50db, 0x50db, 0x50db, 0x50dc, 0x50dc, + 0x50dc, 0x50dc, 0x50dd, 0x50dd, 0x50dd, 0x50dd, 0x50de, 0x50de, + 0x50de, 0x50de, 0x50df, 0x50df, 0x50df, 0x50df, 0x50e0, 0x50e0, + 0x50e0, 0x50e0, 0x50e1, 0x50e1, 0x50e1, 0x50e1, 0x50e2, 0x50e2, + 0x50e2, 0x50e2, 0x50e2, 0x50e3, 0x50e3, 0x50e3, 0x50e3, 0x50e4, + 0x50e4, 0x50e4, 0x50e4, 0x50e5, 0x50e5, 0x50e5, 0x50e5, 0x50e6, + 0x50e6, 0x50e6, 0x50e6, 0x50e7, 0x50e7, 0x50e7, 0x50e7, 0x50e8, + 0x50e8, 0x50e8, 0x50e8, 0x50e8, 0x50e9, 0x50e9, 0x50e9, 0x50e9, + 0x50ea, 0x50ea, 0x50ea, 0x50ea, 0x50eb, 0x50eb, 0x50eb, 0x50eb, + 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ed, 0x50ed, 0x50ed, + 0x50ed, 0x50ee, 0x50ee, 0x50ee, 0x50ee, 0x50ef, 0x50ef, 0x50ef, + 0x50ef, 0x50ef, 0x50f0, 0x50f0, 0x50f0, 0x50f0, 0x50f1, 0x50f1, + 0x50f1, 0x50f1, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f3, + 0x50f3, 0x50f3, 0x50f3, 0x50f4, 0x50f4, 0x50f4, 0x50f4, 0x50f4, + 0x50f5, 0x50f5, 0x50f5, 0x50f5, 0x50f6, 0x50f6, 0x50f6, 0x50f6, + 0x50f6, 0x50f7, 0x50f7, 0x50f7, 0x50f7, 0x50f8, 0x50f8, 0x50f8, + 0x50f8, 0x50f8, 0x50f9, 0x50f9, 0x50f9, 0x50f9, 0x50fa, 0x50fa, + 0x50fa, 0x50fa, 0x50fa, 0x50fb, 0x50fb, 0x50fb, 0x50fb, 0x50fc, + 0x50fc, 0x50fc, 0x50fc, 0x50fc, 0x50fd, 0x50fd, 0x50fd, 0x50fd, + 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50ff, 0x50ff, 0x50ff, + 0x50ff, 0x5100, 0x5100, 0x5100, 0x5100, 0x5100, 0x5101, 0x5101, + 0x5101, 0x5101, 0x5101, 0x5102, 0x5102, 0x5102, 0x5102, 0x5103, + 0x5103, 0x5103, 0x5103, 0x5103, 0x5104, 0x5104, 0x5104, 0x5104, + 0x5104, 0x5105, 0x5105, 0x5105, 0x5105, 0x5105, 0x5106, 0x5106, + 0x5106, 0x5106, 0x5107, 0x5107, 0x5107, 0x5107, 0x5107, 0x5108, + 0x5108, 0x5108, 0x5108, 0x5108, 0x5109, 0x5109, 0x5109, 0x5109, + 0x5109, 0x510a, 0x510a, 0x510a, 0x510a, 0x510a, 0x510b, 0x510b, + 0x510b, 0x510b, 0x510c, 0x510c, 0x510c, 0x510c, 0x510c, 0x510d, + 0x510d, 0x510d, 0x510d, 0x510d, 0x510e, 0x510e, 0x510e, 0x510e, + 0x510e, 0x510f, 0x510f, 0x510f, 0x510f, 0x510f, 0x5110, 0x5110, + 0x5110, 0x5110, 0x5110, 0x5111, 0x5111, 0x5111, 0x5111, 0x5111, + 0x5112, 0x5112, 0x5112, 0x5112, 0x5112, 0x5113, 0x5113, 0x5113, + 0x5113, 0x5113, 0x5114, 0x5114, 0x5114, 0x5114, 0x5114, 0x5115, + 0x5115, 0x5115, 0x5115, 0x5115, 0x5116, 0x5116, 0x5116, 0x5116, + 0x5116, 0x5117, 0x5117, 0x5117, 0x5117, 0x5117, 0x5118, 0x5118, + 0x5118, 0x5118, 0x5118, 0x5119, 0x5119, 0x5119, 0x5119, 0x5119, + 0x511a, 0x511a, 0x511a, 0x511a, 0x511a, 0x511b, 0x511b, 0x511b, + 0x511b, 0x511b, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, + 0x511d, 0x511d, 0x511d, 0x511d, 0x511d, 0x511e, 0x511e, 0x511e, + 0x511e, 0x511e, 0x511f, 0x511f, 0x511f, 0x511f, 0x511f, 0x5120, + 0x5120, 0x5120, 0x5120, 0x5120, 0x5120, 0x5121, 0x5121, 0x5121, + 0x5121, 0x5121, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5123, + 0x5123, 0x5123, 0x5123, 0x5123, 0x5124, 0x5124, 0x5124, 0x5124, + 0x5124, 0x5124, 0x5125, 0x5125, 0x5125, 0x5125, 0x5125, 0x5126, + 0x5126, 0x5126, 0x5126, 0x5126, 0x5127, 0x5127, 0x5127, 0x5127, + 0x5127, 0x5127, 0x5128, 0x5128, 0x5128, 0x5128, 0x5128, 0x5129, + 0x5129, 0x5129, 0x5129, 0x5129, 0x5129, 0x512a, 0x512a, 0x512a, + 0x512a, 0x512a, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, + 0x512c, 0x512c, 0x512c, 0x512c, 0x512c, 0x512d, 0x512d, 0x512d, + 0x512d, 0x512d, 0x512d, 0x512e, 0x512e, 0x512e, 0x512e, 0x512e, + 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x5130, 0x5130, + 0x5130, 0x5130, 0x5130, 0x5131, 0x5131, 0x5131, 0x5131, 0x5131, + 0x5131, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5133, + 0x5133, 0x5133, 0x5133, 0x5133, 0x5134, 0x5134, 0x5134, 0x5134, + 0x5134, 0x5134, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, + 0x5136, 0x5136, 0x5136, 0x5136, 0x5136, 0x5137, 0x5137, 0x5137, + 0x5137, 0x5137, 0x5137, 0x5138, 0x5138, 0x5138, 0x5138, 0x5138, + 0x5138, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x513a, + 0x513a, 0x513a, 0x513a, 0x513a, 0x513a, 0x513b, 0x513b, 0x513b, + 0x513b, 0x513b, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, + 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513e, 0x513e, + 0x513e, 0x513e, 0x513e, 0x513e, 0x513f, 0x513f, 0x513f, 0x513f, + 0x513f, 0x513f, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, + 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5142, 0x5142, + 0x5142, 0x5142, 0x5142, 0x5142, 0x5143, 0x5143, 0x5143, 0x5143, + 0x5143, 0x5143, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, + 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5146, 0x5146, + 0x5146, 0x5146, 0x5146, 0x5146, 0x5147, 0x5147, 0x5147, 0x5147, + 0x5147, 0x5147, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, + 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x514a, + 0x514a, 0x514a, 0x514a, 0x514a, 0x514a, 0x514b, 0x514b, 0x514b, + 0x514b, 0x514b, 0x514b, 0x514c, 0x514c, 0x514c, 0x514c, 0x514c, + 0x514c, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, + 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514f, 0x514f, + 0x514f, 0x514f, 0x514f, 0x514f, 0x5150, 0x5150, 0x5150, 0x5150, + 0x5150, 0x5150, 0x5150, 0x5151, 0x5151, 0x5151, 0x5151, 0x5151, + 0x5151, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5153, + 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5154, 0x5154, + 0x5154, 0x5154, 0x5154, 0x5154, 0x5155, 0x5155, 0x5155, 0x5155, + 0x5155, 0x5155, 0x5155, 0x5156, 0x5156, 0x5156, 0x5156, 0x5156, + 0x5156, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, + 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5159, 0x5159, + 0x5159, 0x5159, 0x5159, 0x5159, 0x5159, 0x515a, 0x515a, 0x515a, + 0x515a, 0x515a, 0x515a, 0x515b, 0x515b, 0x515b, 0x515b, 0x515b, + 0x515b, 0x515b, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, + 0x515c, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515e, + 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515f, 0x515f, + 0x515f, 0x515f, 0x515f, 0x515f, 0x515f, 0x5160, 0x5160, 0x5160, + 0x5160, 0x5160, 0x5160, 0x5161, 0x5161, 0x5161, 0x5161, 0x5161, + 0x5161, 0x5161, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, + 0x5162, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, + 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5165, + 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5166, 0x5166, + 0x5166, 0x5166, 0x5166, 0x5166, 0x5167, 0x5167, 0x5167, 0x5167, + 0x5167, 0x5167, 0x5167, 0x5168, 0x5168, 0x5168, 0x5168, 0x5168, + 0x5168, 0x5168, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, + 0x5169, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, + 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516c, + 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516d, 0x516d, + 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516e, 0x516e, + 0x516e, 0x516e, 0x516e, 0x516e, 0x516e, 0x516f, 0x516f, 0x516f, + 0x516f, 0x516f, 0x516f, 0x516f, 0x5170, 0x5170, 0x5170, 0x5170, + 0x5170, 0x5170, 0x5170, 0x5171, 0x5171, 0x5171, 0x5171, 0x5171, + 0x5171, 0x5171, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, + 0x5172, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, + 0x5173, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, + 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5176, + 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5177, + 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5178, 0x5178, + 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5179, 0x5179, + 0x5179, 0x5179, 0x5179, 0x5179, 0x5179, 0x517a, 0x517a, 0x517a, + 0x517a, 0x517a, 0x517a, 0x517a, 0x517b, 0x517b, 0x517b, 0x517b, + 0x517b, 0x517b, 0x517b, 0x517b, 0x517c, 0x517c, 0x517c, 0x517c, + 0x517c, 0x517c, 0x517c, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, + 0x517d, 0x517d, 0x517d, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, + 0x517e, 0x517e, 0x517e, 0x517f, 0x517f, 0x517f, 0x517f, 0x517f, + 0x517f, 0x517f, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, + 0x5180, 0x5180, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, + 0x5181, 0x5181, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, + 0x5182, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, + 0x5183, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, + 0x5184, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, + 0x5185, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, + 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, + 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, + 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, + 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, + 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, + 0x518c, 0x518c, 0x518c, 0x518c, 0x518d, 0x518d, 0x518d, 0x518d, + 0x518e, 0x518e, 0x518e, 0x518e, 0x518f, 0x518f, 0x518f, 0x518f, + 0x5190, 0x5190, 0x5190, 0x5190, 0x5191, 0x5191, 0x5191, 0x5191, + 0x5191, 0x5192, 0x5192, 0x5192, 0x5192, 0x5193, 0x5193, 0x5193, + 0x5193, 0x5194, 0x5194, 0x5194, 0x5194, 0x5195, 0x5195, 0x5195, + 0x5195, 0x5196, 0x5196, 0x5196, 0x5196, 0x5197, 0x5197, 0x5197, + 0x5197, 0x5198, 0x5198, 0x5198, 0x5198, 0x5198, 0x5199, 0x5199, + 0x5199, 0x5199, 0x519a, 0x519a, 0x519a, 0x519a, 0x519b, 0x519b, + 0x519b, 0x519b, 0x519c, 0x519c, 0x519c, 0x519c, 0x519c, 0x519d, + 0x519d, 0x519d, 0x519d, 0x519e, 0x519e, 0x519e, 0x519e, 0x519f, + 0x519f, 0x519f, 0x519f, 0x51a0, 0x51a0, 0x51a0, 0x51a0, 0x51a0, + 0x51a1, 0x51a1, 0x51a1, 0x51a1, 0x51a2, 0x51a2, 0x51a2, 0x51a2, + 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a4, 0x51a4, 0x51a4, + 0x51a4, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a6, 0x51a6, + 0x51a6, 0x51a6, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a8, + 0x51a8, 0x51a8, 0x51a8, 0x51a9, 0x51a9, 0x51a9, 0x51a9, 0x51a9, + 0x51aa, 0x51aa, 0x51aa, 0x51aa, 0x51ab, 0x51ab, 0x51ab, 0x51ab, + 0x51ab, 0x51ac, 0x51ac, 0x51ac, 0x51ac, 0x51ad, 0x51ad, 0x51ad, + 0x51ad, 0x51ad, 0x51ae, 0x51ae, 0x51ae, 0x51ae, 0x51af, 0x51af, + 0x51af, 0x51af, 0x51af, 0x51b0, 0x51b0, 0x51b0, 0x51b0, 0x51b1, + 0x51b1, 0x51b1, 0x51b1, 0x51b1, 0x51b2, 0x51b2, 0x51b2, 0x51b2, + 0x51b2, 0x51b3, 0x51b3, 0x51b3, 0x51b3, 0x51b4, 0x51b4, 0x51b4, + 0x51b4, 0x51b4, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b6, + 0x51b6, 0x51b6, 0x51b6, 0x51b7, 0x51b7, 0x51b7, 0x51b7, 0x51b7, + 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b9, 0x51b9, 0x51b9, + 0x51b9, 0x51b9, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51bb, + 0x51bb, 0x51bb, 0x51bb, 0x51bc, 0x51bc, 0x51bc, 0x51bc, 0x51bc, + 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51be, 0x51be, 0x51be, + 0x51be, 0x51be, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51c0, + 0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x51c1, 0x51c1, 0x51c1, 0x51c1, + 0x51c1, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c3, 0x51c3, + 0x51c3, 0x51c3, 0x51c3, 0x51c4, 0x51c4, 0x51c4, 0x51c4, 0x51c4, + 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c6, 0x51c6, 0x51c6, + 0x51c6, 0x51c6, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c8, + 0x51c8, 0x51c8, 0x51c8, 0x51c8, 0x51c9, 0x51c9, 0x51c9, 0x51c9, + 0x51c9, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51cb, 0x51cb, + 0x51cb, 0x51cb, 0x51cb, 0x51cc, 0x51cc, 0x51cc, 0x51cc, 0x51cc, + 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51ce, 0x51ce, 0x51ce, + 0x51ce, 0x51ce, 0x51ce, 0x51cf, 0x51cf, 0x51cf, 0x51cf, 0x51cf, + 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d1, 0x51d1, 0x51d1, + 0x51d1, 0x51d1, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d3, + 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d4, 0x51d4, 0x51d4, + 0x51d4, 0x51d4, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d6, + 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d7, 0x51d7, 0x51d7, + 0x51d7, 0x51d7, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d9, + 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51da, 0x51da, 0x51da, + 0x51da, 0x51da, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, + 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dd, 0x51dd, 0x51dd, + 0x51dd, 0x51dd, 0x51dd, 0x51de, 0x51de, 0x51de, 0x51de, 0x51de, + 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51e0, 0x51e0, + 0x51e0, 0x51e0, 0x51e0, 0x51e1, 0x51e1, 0x51e1, 0x51e1, 0x51e1, + 0x51e1, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e3, + 0x51e3, 0x51e3, 0x51e3, 0x51e3, 0x51e4, 0x51e4, 0x51e4, 0x51e4, + 0x51e4, 0x51e4, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, + 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e7, 0x51e7, 0x51e7, + 0x51e7, 0x51e7, 0x51e7, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x51e8, + 0x51e8, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51ea, 0x51ea, + 0x51ea, 0x51ea, 0x51ea, 0x51ea, 0x51eb, 0x51eb, 0x51eb, 0x51eb, + 0x51eb, 0x51eb, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, + 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ee, 0x51ee, + 0x51ee, 0x51ee, 0x51ee, 0x51ee, 0x51ef, 0x51ef, 0x51ef, 0x51ef, + 0x51ef, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f1, + 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f2, 0x51f2, 0x51f2, + 0x51f2, 0x51f2, 0x51f2, 0x51f3, 0x51f3, 0x51f3, 0x51f3, 0x51f3, + 0x51f3, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f5, + 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f6, 0x51f6, 0x51f6, + 0x51f6, 0x51f6, 0x51f6, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f7, + 0x51f7, 0x51f7, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, + 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51fa, 0x51fa, + 0x51fa, 0x51fa, 0x51fa, 0x51fa, 0x51fb, 0x51fb, 0x51fb, 0x51fb, + 0x51fb, 0x51fb, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, + 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fe, + 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51ff, 0x51ff, 0x51ff, + 0x51ff, 0x51ff, 0x51ff, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, + 0x5200, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, + 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5203, 0x5203, + 0x5203, 0x5203, 0x5203, 0x5203, 0x5204, 0x5204, 0x5204, 0x5204, + 0x5204, 0x5204, 0x5204, 0x5205, 0x5205, 0x5205, 0x5205, 0x5205, + 0x5205, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, + 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5208, 0x5208, + 0x5208, 0x5208, 0x5208, 0x5208, 0x5208, 0x5209, 0x5209, 0x5209, + 0x5209, 0x5209, 0x5209, 0x520a, 0x520a, 0x520a, 0x520a, 0x520a, + 0x520a, 0x520a, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, + 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520d, + 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520e, 0x520e, + 0x520e, 0x520e, 0x520e, 0x520e, 0x520f, 0x520f, 0x520f, 0x520f, + 0x520f, 0x520f, 0x520f, 0x5210, 0x5210, 0x5210, 0x5210, 0x5210, + 0x5210, 0x5210, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, + 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5213, + 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5214, 0x5214, + 0x5214, 0x5214, 0x5214, 0x5214, 0x5214, 0x5215, 0x5215, 0x5215, + 0x5215, 0x5215, 0x5215, 0x5215, 0x5216, 0x5216, 0x5216, 0x5216, + 0x5216, 0x5216, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, + 0x5217, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, + 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x521a, + 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521b, 0x521b, + 0x521b, 0x521b, 0x521b, 0x521b, 0x521b, 0x521c, 0x521c, 0x521c, + 0x521c, 0x521c, 0x521c, 0x521c, 0x521d, 0x521d, 0x521d, 0x521d, + 0x521d, 0x521d, 0x521d, 0x521e, 0x521e, 0x521e, 0x521e, 0x521e, + 0x521e, 0x521e, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, + 0x521f, 0x521f, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, + 0x5220, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, + 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5223, + 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5224, 0x5224, + 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5225, 0x5225, + 0x5225, 0x5225, 0x5225, 0x5225, 0x5225, 0x5226, 0x5226, 0x5226, + 0x5226, 0x5226, 0x5226, 0x5226, 0x5227, 0x5227, 0x5227, 0x5227, + 0x5227, 0x5227, 0x5227, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, + 0x5228, 0x5228, 0x5228, 0x5229, 0x5229, 0x5229, 0x5229, 0x5229, + 0x5229, 0x5229, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, + 0x522a, 0x522a, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, + 0x522b, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, + 0x522c, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, + 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, + 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x5230, + 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5231, + 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5232, 0x5232, + 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5233, 0x5233, + 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5234, 0x5234, + 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5235, 0x5235, + 0x5235, 0x5235, 0x5235, 0x5235, 0x5235, 0x5236, 0x5236, 0x5236, + 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5237, 0x5237, 0x5237, + 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5238, 0x5238, 0x5238, + 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5239, 0x5239, 0x5239, + 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x523a, 0x523a, 0x523a, + 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523b, 0x523b, 0x523b, + 0x523b, 0x523b, 0x523b, 0x523b, 0x523c, 0x523c, 0x523c, 0x523c, + 0x523c, 0x523c, 0x523c, 0x523c, 0x523d, 0x523d, 0x523d, 0x523d, + 0x523d, 0x523d, 0x523e, 0x523e, 0x523e, 0x523e, 0x523f, 0x523f, + 0x523f, 0x523f, 0x523f, 0x5240, 0x5240, 0x5240, 0x5240, 0x5241, + 0x5241, 0x5241, 0x5241, 0x5242, 0x5242, 0x5242, 0x5242, 0x5243, + 0x5243, 0x5243, 0x5243, 0x5244, 0x5244, 0x5244, 0x5244, 0x5245, + 0x5245, 0x5245, 0x5245, 0x5246, 0x5246, 0x5246, 0x5246, 0x5247, + 0x5247, 0x5247, 0x5247, 0x5248, 0x5248, 0x5248, 0x5248, 0x5248, + 0x5249, 0x5249, 0x5249, 0x5249, 0x524a, 0x524a, 0x524a, 0x524a, + 0x524b, 0x524b, 0x524b, 0x524b, 0x524c, 0x524c, 0x524c, 0x524c, + 0x524d, 0x524d, 0x524d, 0x524d, 0x524d, 0x524e, 0x524e, 0x524e, + 0x524e, 0x524f, 0x524f, 0x524f, 0x524f, 0x5250, 0x5250, 0x5250, + 0x5250, 0x5251, 0x5251, 0x5251, 0x5251, 0x5251, 0x5252, 0x5252, + 0x5252, 0x5252, 0x5253, 0x5253, 0x5253, 0x5253, 0x5253, 0x5254, + 0x5254, 0x5254, 0x5254, 0x5255, 0x5255, 0x5255, 0x5255, 0x5256, + 0x5256, 0x5256, 0x5256, 0x5256, 0x5257, 0x5257, 0x5257, 0x5257, + 0x5258, 0x5258, 0x5258, 0x5258, 0x5258, 0x5259, 0x5259, 0x5259, + 0x5259, 0x525a, 0x525a, 0x525a, 0x525a, 0x525a, 0x525b, 0x525b, + 0x525b, 0x525b, 0x525c, 0x525c, 0x525c, 0x525c, 0x525c, 0x525d, + 0x525d, 0x525d, 0x525d, 0x525e, 0x525e, 0x525e, 0x525e, 0x525e, + 0x525f, 0x525f, 0x525f, 0x525f, 0x5260, 0x5260, 0x5260, 0x5260, + 0x5260, 0x5261, 0x5261, 0x5261, 0x5261, 0x5262, 0x5262, 0x5262, + 0x5262, 0x5262, 0x5263, 0x5263, 0x5263, 0x5263, 0x5263, 0x5264, + 0x5264, 0x5264, 0x5264, 0x5265, 0x5265, 0x5265, 0x5265, 0x5265, + 0x5266, 0x5266, 0x5266, 0x5266, 0x5266, 0x5267, 0x5267, 0x5267, + 0x5267, 0x5268, 0x5268, 0x5268, 0x5268, 0x5268, 0x5269, 0x5269, + 0x5269, 0x5269, 0x5269, 0x526a, 0x526a, 0x526a, 0x526a, 0x526a, + 0x526b, 0x526b, 0x526b, 0x526b, 0x526c, 0x526c, 0x526c, 0x526c, + 0x526c, 0x526d, 0x526d, 0x526d, 0x526d, 0x526d, 0x526e, 0x526e, + 0x526e, 0x526e, 0x526e, 0x526f, 0x526f, 0x526f, 0x526f, 0x526f, + 0x5270, 0x5270, 0x5270, 0x5270, 0x5270, 0x5271, 0x5271, 0x5271, + 0x5271, 0x5271, 0x5272, 0x5272, 0x5272, 0x5272, 0x5273, 0x5273, + 0x5273, 0x5273, 0x5273, 0x5274, 0x5274, 0x5274, 0x5274, 0x5274, + 0x5275, 0x5275, 0x5275, 0x5275, 0x5275, 0x5276, 0x5276, 0x5276, + 0x5276, 0x5276, 0x5277, 0x5277, 0x5277, 0x5277, 0x5277, 0x5278, + 0x5278, 0x5278, 0x5278, 0x5278, 0x5279, 0x5279, 0x5279, 0x5279, + 0x5279, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527b, + 0x527b, 0x527b, 0x527b, 0x527b, 0x527c, 0x527c, 0x527c, 0x527c, + 0x527c, 0x527d, 0x527d, 0x527d, 0x527d, 0x527d, 0x527e, 0x527e, + 0x527e, 0x527e, 0x527e, 0x527f, 0x527f, 0x527f, 0x527f, 0x527f, + 0x5280, 0x5280, 0x5280, 0x5280, 0x5280, 0x5281, 0x5281, 0x5281, + 0x5281, 0x5281, 0x5281, 0x5282, 0x5282, 0x5282, 0x5282, 0x5282, + 0x5283, 0x5283, 0x5283, 0x5283, 0x5283, 0x5284, 0x5284, 0x5284, + 0x5284, 0x5284, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, + 0x5286, 0x5286, 0x5286, 0x5286, 0x5286, 0x5287, 0x5287, 0x5287, + 0x5287, 0x5287, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, + 0x5289, 0x5289, 0x5289, 0x5289, 0x5289, 0x528a, 0x528a, 0x528a, + 0x528a, 0x528a, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, + 0x528c, 0x528c, 0x528c, 0x528c, 0x528c, 0x528d, 0x528d, 0x528d, + 0x528d, 0x528d, 0x528d, 0x528e, 0x528e, 0x528e, 0x528e, 0x528e, + 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x5290, 0x5290, + 0x5290, 0x5290, 0x5290, 0x5291, 0x5291, 0x5291, 0x5291, 0x5291, + 0x5291, 0x5292, 0x5292, 0x5292, 0x5292, 0x5292, 0x5293, 0x5293, + 0x5293, 0x5293, 0x5293, 0x5293, 0x5294, 0x5294, 0x5294, 0x5294, + 0x5294, 0x5294, 0x5295, 0x5295, 0x5295, 0x5295, 0x5295, 0x5296, + 0x5296, 0x5296, 0x5296, 0x5296, 0x5296, 0x5297, 0x5297, 0x5297, + 0x5297, 0x5297, 0x5297, 0x5298, 0x5298, 0x5298, 0x5298, 0x5298, + 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x529a, 0x529a, + 0x529a, 0x529a, 0x529a, 0x529a, 0x529b, 0x529b, 0x529b, 0x529b, + 0x529b, 0x529b, 0x529c, 0x529c, 0x529c, 0x529c, 0x529c, 0x529d, + 0x529d, 0x529d, 0x529d, 0x529d, 0x529d, 0x529e, 0x529e, 0x529e, + 0x529e, 0x529e, 0x529e, 0x529f, 0x529f, 0x529f, 0x529f, 0x529f, + 0x529f, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a1, + 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a2, 0x52a2, 0x52a2, + 0x52a2, 0x52a2, 0x52a2, 0x52a3, 0x52a3, 0x52a3, 0x52a3, 0x52a3, + 0x52a3, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a5, + 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a6, 0x52a6, 0x52a6, + 0x52a6, 0x52a6, 0x52a6, 0x52a7, 0x52a7, 0x52a7, 0x52a7, 0x52a7, + 0x52a7, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a9, + 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52aa, 0x52aa, 0x52aa, + 0x52aa, 0x52aa, 0x52aa, 0x52ab, 0x52ab, 0x52ab, 0x52ab, 0x52ab, + 0x52ab, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ad, + 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ae, 0x52ae, + 0x52ae, 0x52ae, 0x52ae, 0x52ae, 0x52af, 0x52af, 0x52af, 0x52af, + 0x52af, 0x52af, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, + 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b2, + 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b3, 0x52b3, 0x52b3, + 0x52b3, 0x52b3, 0x52b3, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b4, + 0x52b4, 0x52b4, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, + 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b7, 0x52b7, + 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b8, 0x52b8, 0x52b8, + 0x52b8, 0x52b8, 0x52b8, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52b9, + 0x52b9, 0x52b9, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, + 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bc, + 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bd, 0x52bd, 0x52bd, + 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52be, 0x52be, 0x52be, 0x52be, + 0x52be, 0x52be, 0x52be, 0x52bf, 0x52bf, 0x52bf, 0x52bf, 0x52bf, + 0x52bf, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, + 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c2, + 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c3, 0x52c3, 0x52c3, + 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c4, 0x52c4, 0x52c4, 0x52c4, + 0x52c4, 0x52c4, 0x52c4, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c5, + 0x52c5, 0x52c5, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, + 0x52c6, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c8, + 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c9, 0x52c9, + 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52ca, 0x52ca, 0x52ca, + 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52cb, 0x52cb, 0x52cb, 0x52cb, + 0x52cb, 0x52cb, 0x52cb, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cc, + 0x52cc, 0x52cc, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, + 0x52cd, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, + 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52d0, + 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d1, 0x52d1, + 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d2, 0x52d2, 0x52d2, + 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d3, 0x52d3, 0x52d3, + 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d4, 0x52d4, 0x52d4, 0x52d4, + 0x52d4, 0x52d4, 0x52d4, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d5, + 0x52d5, 0x52d5, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, + 0x52d6, 0x52d6, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, + 0x52d7, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, + 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, + 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52db, + 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52dc, 0x52dc, + 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dd, 0x52dd, + 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52de, 0x52de, 0x52de, + 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52df, 0x52df, 0x52df, + 0x52df, 0x52df, 0x52df, 0x52df, 0x52e0, 0x52e0, 0x52e0, 0x52e0, + 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e1, 0x52e1, 0x52e1, 0x52e1, + 0x52e1, 0x52e1, 0x52e1, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, + 0x52e2, 0x52e2, 0x52e2, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, + 0x52e3, 0x52e3, 0x52e3, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e4, + 0x52e4, 0x52e4, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, + 0x52e5, 0x52e5, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, + 0x52e6, 0x52e6, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, + 0x52e7, 0x52e7, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, + 0x52e8, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, + 0x52e9, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, + 0x52ea, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, + 0x52eb, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, + 0x52ec, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, + 0x52ed, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, + 0x52ee, 0x52ef, 0x52ef, 0x52ef, 0x52ef, 0x52f0, 0x52f0, 0x52f0, + 0x52f0, 0x52f1, 0x52f1, 0x52f1, 0x52f1, 0x52f2, 0x52f2, 0x52f2, + 0x52f2, 0x52f3, 0x52f3, 0x52f3, 0x52f3, 0x52f4, 0x52f4, 0x52f4, + 0x52f4, 0x52f5, 0x52f5, 0x52f5, 0x52f5, 0x52f6, 0x52f6, 0x52f6, + 0x52f6, 0x52f7, 0x52f7, 0x52f7, 0x52f7, 0x52f8, 0x52f8, 0x52f8, + 0x52f8, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52fa, 0x52fa, + 0x52fa, 0x52fa, 0x52fb, 0x52fb, 0x52fb, 0x52fb, 0x52fc, 0x52fc, + 0x52fc, 0x52fc, 0x52fd, 0x52fd, 0x52fd, 0x52fd, 0x52fe, 0x52fe, + 0x52fe, 0x52fe, 0x52fe, 0x52ff, 0x52ff, 0x52ff, 0x52ff, 0x5300, + 0x5300, 0x5300, 0x5300, 0x5301, 0x5301, 0x5301, 0x5301, 0x5301, + 0x5302, 0x5302, 0x5302, 0x5302, 0x5303, 0x5303, 0x5303, 0x5303, + 0x5304, 0x5304, 0x5304, 0x5304, 0x5304, 0x5305, 0x5305, 0x5305, + 0x5305, 0x5306, 0x5306, 0x5306, 0x5306, 0x5307, 0x5307, 0x5307, + 0x5307, 0x5307, 0x5308, 0x5308, 0x5308, 0x5308, 0x5309, 0x5309, + 0x5309, 0x5309, 0x5309, 0x530a, 0x530a, 0x530a, 0x530a, 0x530b, + 0x530b, 0x530b, 0x530b, 0x530b, 0x530c, 0x530c, 0x530c, 0x530c, + 0x530d, 0x530d, 0x530d, 0x530d, 0x530d, 0x530e, 0x530e, 0x530e, + 0x530e, 0x530f, 0x530f, 0x530f, 0x530f, 0x530f, 0x5310, 0x5310, + 0x5310, 0x5310, 0x5311, 0x5311, 0x5311, 0x5311, 0x5311, 0x5312, + 0x5312, 0x5312, 0x5312, 0x5313, 0x5313, 0x5313, 0x5313, 0x5313, + 0x5314, 0x5314, 0x5314, 0x5314, 0x5314, 0x5315, 0x5315, 0x5315, + 0x5315, 0x5316, 0x5316, 0x5316, 0x5316, 0x5316, 0x5317, 0x5317, + 0x5317, 0x5317, 0x5317, 0x5318, 0x5318, 0x5318, 0x5318, 0x5319, + 0x5319, 0x5319, 0x5319, 0x5319, 0x531a, 0x531a, 0x531a, 0x531a, + 0x531a, 0x531b, 0x531b, 0x531b, 0x531b, 0x531c, 0x531c, 0x531c, + 0x531c, 0x531c, 0x531d, 0x531d, 0x531d, 0x531d, 0x531d, 0x531e, + 0x531e, 0x531e, 0x531e, 0x531e, 0x531f, 0x531f, 0x531f, 0x531f, + 0x531f, 0x5320, 0x5320, 0x5320, 0x5320, 0x5320, 0x5321, 0x5321, + 0x5321, 0x5321, 0x5322, 0x5322, 0x5322, 0x5322, 0x5322, 0x5323, + 0x5323, 0x5323, 0x5323, 0x5323, 0x5324, 0x5324, 0x5324, 0x5324, + 0x5324, 0x5325, 0x5325, 0x5325, 0x5325, 0x5325, 0x5326, 0x5326, + 0x5326, 0x5326, 0x5326, 0x5327, 0x5327, 0x5327, 0x5327, 0x5327, + 0x5328, 0x5328, 0x5328, 0x5328, 0x5328, 0x5329, 0x5329, 0x5329, + 0x5329, 0x5329, 0x532a, 0x532a, 0x532a, 0x532a, 0x532a, 0x532b, + 0x532b, 0x532b, 0x532b, 0x532b, 0x532c, 0x532c, 0x532c, 0x532c, + 0x532c, 0x532d, 0x532d, 0x532d, 0x532d, 0x532d, 0x532e, 0x532e, + 0x532e, 0x532e, 0x532e, 0x532e, 0x532f, 0x532f, 0x532f, 0x532f, + 0x532f, 0x5330, 0x5330, 0x5330, 0x5330, 0x5330, 0x5331, 0x5331, + 0x5331, 0x5331, 0x5331, 0x5332, 0x5332, 0x5332, 0x5332, 0x5332, + 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5334, 0x5334, + 0x5334, 0x5334, 0x5334, 0x5335, 0x5335, 0x5335, 0x5335, 0x5335, + 0x5336, 0x5336, 0x5336, 0x5336, 0x5336, 0x5337, 0x5337, 0x5337, + 0x5337, 0x5337, 0x5337, 0x5338, 0x5338, 0x5338, 0x5338, 0x5338, + 0x5339, 0x5339, 0x5339, 0x5339, 0x5339, 0x533a, 0x533a, 0x533a, + 0x533a, 0x533a, 0x533a, 0x533b, 0x533b, 0x533b, 0x533b, 0x533b, + 0x533c, 0x533c, 0x533c, 0x533c, 0x533c, 0x533d, 0x533d, 0x533d, + 0x533d, 0x533d, 0x533d, 0x533e, 0x533e, 0x533e, 0x533e, 0x533e, + 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x5340, 0x5340, + 0x5340, 0x5340, 0x5340, 0x5341, 0x5341, 0x5341, 0x5341, 0x5341, + 0x5341, 0x5342, 0x5342, 0x5342, 0x5342, 0x5342, 0x5343, 0x5343, + 0x5343, 0x5343, 0x5343, 0x5343, 0x5344, 0x5344, 0x5344, 0x5344, + 0x5344, 0x5344, 0x5345, 0x5345, 0x5345, 0x5345, 0x5345, 0x5346, + 0x5346, 0x5346, 0x5346, 0x5346, 0x5346, 0x5347, 0x5347, 0x5347, + 0x5347, 0x5347, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, + 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x534a, 0x534a, + 0x534a, 0x534a, 0x534a, 0x534a, 0x534b, 0x534b, 0x534b, 0x534b, + 0x534b, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534d, + 0x534d, 0x534d, 0x534d, 0x534d, 0x534d, 0x534e, 0x534e, 0x534e, + 0x534e, 0x534e, 0x534e, 0x534f, 0x534f, 0x534f, 0x534f, 0x534f, + 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5351, 0x5351, + 0x5351, 0x5351, 0x5351, 0x5351, 0x5352, 0x5352, 0x5352, 0x5352, + 0x5352, 0x5352, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, + 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5355, 0x5355, + 0x5355, 0x5355, 0x5355, 0x5355, 0x5356, 0x5356, 0x5356, 0x5356, + 0x5356, 0x5356, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, + 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5359, 0x5359, + 0x5359, 0x5359, 0x5359, 0x5359, 0x535a, 0x535a, 0x535a, 0x535a, + 0x535a, 0x535a, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, + 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535d, 0x535d, + 0x535d, 0x535d, 0x535d, 0x535d, 0x535d, 0x535e, 0x535e, 0x535e, + 0x535e, 0x535e, 0x535e, 0x535f, 0x535f, 0x535f, 0x535f, 0x535f, + 0x535f, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5361, + 0x5361, 0x5361, 0x5361, 0x5361, 0x5361, 0x5362, 0x5362, 0x5362, + 0x5362, 0x5362, 0x5362, 0x5362, 0x5363, 0x5363, 0x5363, 0x5363, + 0x5363, 0x5363, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, + 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5366, + 0x5366, 0x5366, 0x5366, 0x5366, 0x5366, 0x5367, 0x5367, 0x5367, + 0x5367, 0x5367, 0x5367, 0x5367, 0x5368, 0x5368, 0x5368, 0x5368, + 0x5368, 0x5368, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, + 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536b, + 0x536b, 0x536b, 0x536b, 0x536b, 0x536b, 0x536c, 0x536c, 0x536c, + 0x536c, 0x536c, 0x536c, 0x536c, 0x536d, 0x536d, 0x536d, 0x536d, + 0x536d, 0x536d, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, + 0x536e, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, + 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5371, 0x5371, + 0x5371, 0x5371, 0x5371, 0x5371, 0x5371, 0x5372, 0x5372, 0x5372, + 0x5372, 0x5372, 0x5372, 0x5372, 0x5373, 0x5373, 0x5373, 0x5373, + 0x5373, 0x5373, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, + 0x5374, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, + 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5377, + 0x5377, 0x5377, 0x5377, 0x5377, 0x5377, 0x5378, 0x5378, 0x5378, + 0x5378, 0x5378, 0x5378, 0x5378, 0x5379, 0x5379, 0x5379, 0x5379, + 0x5379, 0x5379, 0x5379, 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, + 0x537a, 0x537a, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, + 0x537b, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, + 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537e, + 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537f, 0x537f, + 0x537f, 0x537f, 0x537f, 0x537f, 0x537f, 0x5380, 0x5380, 0x5380, + 0x5380, 0x5380, 0x5380, 0x5380, 0x5381, 0x5381, 0x5381, 0x5381, + 0x5381, 0x5381, 0x5381, 0x5382, 0x5382, 0x5382, 0x5382, 0x5382, + 0x5382, 0x5382, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, + 0x5383, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, + 0x5384, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, + 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5387, + 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5388, 0x5388, + 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5389, 0x5389, + 0x5389, 0x5389, 0x5389, 0x5389, 0x5389, 0x538a, 0x538a, 0x538a, + 0x538a, 0x538a, 0x538a, 0x538a, 0x538b, 0x538b, 0x538b, 0x538b, + 0x538b, 0x538b, 0x538b, 0x538b, 0x538c, 0x538c, 0x538c, 0x538c, + 0x538c, 0x538c, 0x538c, 0x538d, 0x538d, 0x538d, 0x538d, 0x538d, + 0x538d, 0x538d, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, + 0x538e, 0x538e, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, + 0x538f, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, + 0x5390, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, + 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, + 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, + 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5395, + 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5396, + 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5397, + 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5398, 0x5398, + 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5399, 0x5399, + 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x539a, 0x539a, + 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539b, 0x539b, + 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539c, 0x539c, + 0x539c, 0x539c, 0x539c, 0x539c, 0x539c, 0x539d, 0x539d, 0x539d, + 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539e, 0x539e, 0x539e, + 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539f, 0x539f, 0x539f, + 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x53a0, 0x53a0, 0x53a0, + 0x53a0, 0x53a0, 0x53a0, 0x53a1, 0x53a1, 0x53a1, 0x53a1, 0x53a2, + 0x53a2, 0x53a2, 0x53a2, 0x53a3, 0x53a3, 0x53a3, 0x53a3, 0x53a4, + 0x53a4, 0x53a4, 0x53a4, 0x53a5, 0x53a5, 0x53a5, 0x53a5, 0x53a6, + 0x53a6, 0x53a6, 0x53a6, 0x53a7, 0x53a7, 0x53a7, 0x53a7, 0x53a8, + 0x53a8, 0x53a8, 0x53a8, 0x53a9, 0x53a9, 0x53a9, 0x53a9, 0x53a9, + 0x53aa, 0x53aa, 0x53aa, 0x53aa, 0x53ab, 0x53ab, 0x53ab, 0x53ab, + 0x53ac, 0x53ac, 0x53ac, 0x53ac, 0x53ad, 0x53ad, 0x53ad, 0x53ad, + 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53af, 0x53af, 0x53af, + 0x53af, 0x53b0, 0x53b0, 0x53b0, 0x53b0, 0x53b1, 0x53b1, 0x53b1, + 0x53b1, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b3, 0x53b3, + 0x53b3, 0x53b3, 0x53b4, 0x53b4, 0x53b4, 0x53b4, 0x53b5, 0x53b5, + 0x53b5, 0x53b5, 0x53b5, 0x53b6, 0x53b6, 0x53b6, 0x53b6, 0x53b7, + 0x53b7, 0x53b7, 0x53b7, 0x53b8, 0x53b8, 0x53b8, 0x53b8, 0x53b8, + 0x53b9, 0x53b9, 0x53b9, 0x53b9, 0x53ba, 0x53ba, 0x53ba, 0x53ba, + 0x53ba, 0x53bb, 0x53bb, 0x53bb, 0x53bb, 0x53bc, 0x53bc, 0x53bc, + 0x53bc, 0x53bc, 0x53bd, 0x53bd, 0x53bd, 0x53bd, 0x53be, 0x53be, + 0x53be, 0x53be, 0x53be, 0x53bf, 0x53bf, 0x53bf, 0x53bf, 0x53c0, + 0x53c0, 0x53c0, 0x53c0, 0x53c0, 0x53c1, 0x53c1, 0x53c1, 0x53c1, + 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c3, 0x53c3, 0x53c3, + 0x53c3, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c5, 0x53c5, + 0x53c5, 0x53c5, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c7, + 0x53c7, 0x53c7, 0x53c7, 0x53c7, 0x53c8, 0x53c8, 0x53c8, 0x53c8, + 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53ca, 0x53ca, 0x53ca, + 0x53ca, 0x53ca, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cc, + 0x53cc, 0x53cc, 0x53cc, 0x53cd, 0x53cd, 0x53cd, 0x53cd, 0x53cd, + 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53cf, 0x53cf, 0x53cf, + 0x53cf, 0x53cf, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d1, + 0x53d1, 0x53d1, 0x53d1, 0x53d2, 0x53d2, 0x53d2, 0x53d2, 0x53d2, + 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d4, 0x53d4, 0x53d4, + 0x53d4, 0x53d4, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d6, + 0x53d6, 0x53d6, 0x53d6, 0x53d6, 0x53d7, 0x53d7, 0x53d7, 0x53d7, + 0x53d7, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d9, 0x53d9, + 0x53d9, 0x53d9, 0x53d9, 0x53da, 0x53da, 0x53da, 0x53da, 0x53da, + 0x53db, 0x53db, 0x53db, 0x53db, 0x53db, 0x53dc, 0x53dc, 0x53dc, + 0x53dc, 0x53dc, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53de, + 0x53de, 0x53de, 0x53de, 0x53de, 0x53df, 0x53df, 0x53df, 0x53df, + 0x53df, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e1, 0x53e1, + 0x53e1, 0x53e1, 0x53e1, 0x53e1, 0x53e2, 0x53e2, 0x53e2, 0x53e2, + 0x53e2, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e4, 0x53e4, + 0x53e4, 0x53e4, 0x53e4, 0x53e5, 0x53e5, 0x53e5, 0x53e5, 0x53e5, + 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e7, 0x53e7, + 0x53e7, 0x53e7, 0x53e7, 0x53e8, 0x53e8, 0x53e8, 0x53e8, 0x53e8, + 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53ea, 0x53ea, + 0x53ea, 0x53ea, 0x53ea, 0x53eb, 0x53eb, 0x53eb, 0x53eb, 0x53eb, + 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ed, 0x53ed, + 0x53ed, 0x53ed, 0x53ed, 0x53ee, 0x53ee, 0x53ee, 0x53ee, 0x53ee, + 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53f0, 0x53f0, + 0x53f0, 0x53f0, 0x53f0, 0x53f1, 0x53f1, 0x53f1, 0x53f1, 0x53f1, + 0x53f1, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f3, 0x53f3, + 0x53f3, 0x53f3, 0x53f3, 0x53f3, 0x53f4, 0x53f4, 0x53f4, 0x53f4, + 0x53f4, 0x53f4, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f6, + 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f7, 0x53f7, 0x53f7, + 0x53f7, 0x53f7, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, + 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53fa, 0x53fa, + 0x53fa, 0x53fa, 0x53fa, 0x53fb, 0x53fb, 0x53fb, 0x53fb, 0x53fb, + 0x53fb, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fd, + 0x53fd, 0x53fd, 0x53fd, 0x53fd, 0x53fe, 0x53fe, 0x53fe, 0x53fe, + 0x53fe, 0x53fe, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, + 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, + 0x5400, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, + 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5402, 0x5402, 0x5402, + 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, + 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, + 0x5403, 0x5403, 0x5403, 0x5403, 0x5404, 0x5404, 0x5404, 0x5404, + 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, + 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, + 0x5405, 0x5405, 0x5405, 0x5405, 0x5406, 0x5406, 0x5406, 0x5406, + 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, + 0x5406, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, + 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5408, 0x5408, 0x5408, + 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, + 0x5408, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, + 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x540a, 0x540a, + 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, + 0x540a, 0x540a, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, + 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540c, + 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, + 0x540c, 0x540c, 0x540c, 0x540c, 0x540d, 0x540d, 0x540d, 0x540d, + 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, + 0x540d, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, + 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540f, 0x540f, + 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, + 0x540f, 0x540f, 0x540f, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, + 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, + 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, + 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5412, 0x5412, 0x5412, + 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, + 0x5412, 0x5412, 0x5412, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, + 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, + 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, + 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5415, 0x5415, + 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, + 0x5415, 0x5415, 0x5415, 0x5415, 0x5416, 0x5416, 0x5416, 0x5416, + 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, + 0x5416, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, + 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5418, + 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, + 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5419, 0x5419, 0x5419, + 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, + 0x5419, 0x5419, 0x5419, 0x5419, 0x541a, 0x541a, 0x541a, 0x541a, + 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, + 0x541a, 0x541a, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, + 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, + 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, + 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541d, + 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, + 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541e, 0x541e, 0x541e, + 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, + 0x541e, 0x541e, 0x541e, 0x541e, 0x541f, 0x541f, 0x541f, 0x541f, + 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, + 0x541f, 0x541f, 0x541f, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, + 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, + 0x5420, 0x5420, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, + 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, + 0x5421, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, + 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, + 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, + 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5424, + 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, + 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5425, + 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, + 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5426, 0x5426, + 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, + 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5427, 0x5427, + 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, + 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5428, 0x5428, + 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, + 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5429, 0x5429, + 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x542a, + 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542b, + 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542c, + 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, + 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, + 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, + 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, + 0x542f, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, + 0x5430, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, + 0x5431, 0x5431, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, + 0x5432, 0x5432, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, + 0x5433, 0x5433, 0x5433, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, + 0x5434, 0x5434, 0x5434, 0x5434, 0x5435, 0x5435, 0x5435, 0x5435, + 0x5435, 0x5435, 0x5435, 0x5435, 0x5436, 0x5436, 0x5436, 0x5436, + 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5437, 0x5437, 0x5437, + 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5438, 0x5438, + 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5439, + 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, + 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, + 0x543a, 0x543a, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, + 0x543b, 0x543b, 0x543b, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, + 0x543c, 0x543c, 0x543c, 0x543c, 0x543d, 0x543d, 0x543d, 0x543d, + 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543e, 0x543e, 0x543e, + 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543f, + 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, + 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, + 0x5440, 0x5440, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, + 0x5441, 0x5441, 0x5441, 0x5441, 0x5442, 0x5442, 0x5442, 0x5442, + 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5443, 0x5443, 0x5443, + 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5444, + 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, + 0x5444, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, + 0x5445, 0x5445, 0x5445, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, + 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5447, 0x5447, 0x5447, + 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5448, + 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, + 0x5448, 0x5448, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, + 0x5449, 0x5449, 0x5449, 0x5449, 0x544a, 0x544a, 0x544a, 0x544a, + 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544b, 0x544b, + 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, + 0x544b, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, + 0x544c, 0x544c, 0x544c, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, + 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544e, 0x544e, + 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, + 0x544e, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, + 0x544f, 0x544f, 0x544f, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, + 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5451, 0x5451, + 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, + 0x5451, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, + 0x5452, 0x5452, 0x5452, 0x5452, 0x5453, 0x5453, 0x5453, 0x5453, + 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5454, + 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, + 0x5454, 0x5454, 0x5454, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, + 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5456, 0x5456, + 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, + 0x5456, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, + 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5458, 0x5458, 0x5458, + 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, + 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, + 0x5459, 0x5459, 0x5459, 0x5459, 0x545a, 0x545a, 0x545a, 0x545a, + 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, + 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, + 0x545b, 0x545b, 0x545b, 0x545b, 0x545c, 0x545c, 0x545c, 0x545c, + 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, + 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, + 0x545d, 0x545d, 0x545d, 0x545d, 0x545e, 0x545e, 0x545e, 0x545e, + 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, + 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, + 0x545f, 0x545f, 0x545f, 0x545f, 0x5460, 0x5460, 0x5460, 0x5460, + 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, + 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, + 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5462, 0x5462, 0x5462, + 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, + 0x5462, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, + 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5464, 0x5464, + 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, + 0x5464, 0x5464, 0x5464, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, + 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5466, + 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, + 0x5466, 0x5466, 0x5466, 0x5466, 0x5467, 0x5467, 0x5467, 0x5467, + 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, + 0x5467, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, + 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5469, 0x5469, + 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, + 0x5469, 0x5469, 0x5469, 0x5469, 0x546a, 0x546a, 0x546a, 0x546a, + 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, + 0x546a, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, + 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546c, 0x546c, + 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, + 0x546c, 0x546c, 0x546c, 0x546c, 0x546d, 0x546d, 0x546d, 0x546d, + 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, + 0x546d, 0x546d, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, + 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546f, + 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, + 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x5470, 0x5470, 0x5470, + 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, + 0x5470, 0x5470, 0x5470, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, + 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, + 0x5471, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, + 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5473, + 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, + 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5474, 0x5474, + 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, + 0x5474, 0x5474, 0x5474, 0x5474, 0x5475, 0x5475, 0x5475, 0x5475, + 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, + 0x5475, 0x5475, 0x5475, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, + 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, + 0x5476, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, + 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, + 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, + 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5479, + 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, + 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x547a, 0x547a, + 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, + 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547b, 0x547b, 0x547b, + 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, + 0x547b, 0x547b, 0x547b, 0x547b, 0x547c, 0x547c, 0x547c, 0x547c, + 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, + 0x547c, 0x547c, 0x547c, 0x547c, 0x547d, 0x547d, 0x547d, 0x547d, + 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, + 0x547d, 0x547d, 0x547d, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, + 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, + 0x547e, 0x547e, 0x547e, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, + 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, + 0x547f, 0x547f, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, + 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, + 0x5480, 0x5480, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, + 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, + 0x5481, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, + 0x5482, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, + 0x5483, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, + 0x5484, 0x5484, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, + 0x5485, 0x5485, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, + 0x5486, 0x5486, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, + 0x5487, 0x5487, 0x5487, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, + 0x5488, 0x5488, 0x5488, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, + 0x5489, 0x5489, 0x5489, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, + 0x548a, 0x548a, 0x548a, 0x548a, 0x548b, 0x548b, 0x548b, 0x548b, + 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548c, 0x548c, 0x548c, + 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548d, 0x548d, 0x548d, + 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548e, 0x548e, + 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548f, + 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, + 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, + 0x5490, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, + 0x5491, 0x5491, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, + 0x5492, 0x5492, 0x5492, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, + 0x5493, 0x5493, 0x5493, 0x5493, 0x5494, 0x5494, 0x5494, 0x5494, + 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5495, 0x5495, 0x5495, + 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5496, + 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, + 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, + 0x5497, 0x5497, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, + 0x5498, 0x5498, 0x5498, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, + 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x549a, 0x549a, 0x549a, + 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549b, 0x549b, + 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, + 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, + 0x549c, 0x549c, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, + 0x549d, 0x549d, 0x549d, 0x549d, 0x549e, 0x549e, 0x549e, 0x549e, + 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549f, 0x549f, + 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, + 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, + 0x54a0, 0x54a0, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, + 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a2, 0x54a2, 0x54a2, 0x54a2, + 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a3, + 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, + 0x54a3, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, + 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a5, 0x54a5, 0x54a5, 0x54a5, + 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a6, 0x54a6, + 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, + 0x54a6, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, + 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a8, 0x54a8, 0x54a8, 0x54a8, + 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a9, 0x54a9, + 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, + 0x54a9, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, + 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54ab, 0x54ab, 0x54ab, 0x54ab, + 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ac, + 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, + 0x54ac, 0x54ac, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, + 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ae, 0x54ae, + 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, + 0x54ae, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, + 0x54af, 0x54af, 0x54af, 0x54af, 0x54b0, 0x54b0, 0x54b0, 0x54b0, + 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, + 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, + 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b2, 0x54b2, 0x54b2, 0x54b2, + 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b3, + 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, + 0x54b3, 0x54b3, 0x54b3, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, + 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b5, + 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, + 0x54b5, 0x54b5, 0x54b5, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, + 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b7, + 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, + 0x54b7, 0x54b7, 0x54b7, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, + 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b9, + 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, + 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54ba, 0x54ba, 0x54ba, 0x54ba, + 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, + 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, + 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bc, 0x54bc, 0x54bc, + 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, + 0x54bc, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, + 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54be, 0x54be, + 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, + 0x54be, 0x54be, 0x54be, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, + 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, + 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, + 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c1, 0x54c1, 0x54c1, + 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, + 0x54c1, 0x54c1, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, + 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c3, + 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, + 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c4, 0x54c4, 0x54c4, + 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, + 0x54c4, 0x54c4, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, + 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, + 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, + 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c7, 0x54c7, 0x54c7, + 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, + 0x54c7, 0x54c7, 0x54c7, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, + 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, + 0x54c8, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, + 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54ca, + 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, + 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54cb, 0x54cb, 0x54cb, + 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, + 0x54cb, 0x54cb, 0x54cb, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, + 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, + 0x54cc, 0x54cc, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, + 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, + 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, + 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54cf, + 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, + 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54d0, 0x54d0, 0x54d0, + 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, + 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d1, 0x54d1, 0x54d1, 0x54d1, + 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, + 0x54d1, 0x54d1, 0x54d1, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, + 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, + 0x54d2, 0x54d2, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, + 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, + 0x54d3, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, + 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, + 0x54d4, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, + 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, + 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, + 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d7, + 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, + 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d8, + 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, + 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d9, + 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, + 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54da, + 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, + 0x54da, 0x54da, 0x54da, 0x54da, 0x54db, 0x54db, 0x54db, 0x54db, + 0x54db, 0x54db, 0x54db, 0x54db, 0x54dc, 0x54dc, 0x54dc, 0x54dc, + 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dd, 0x54dd, 0x54dd, 0x54dd, + 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54de, 0x54de, 0x54de, 0x54de, + 0x54de, 0x54de, 0x54de, 0x54de, 0x54df, 0x54df, 0x54df, 0x54df, + 0x54df, 0x54df, 0x54df, 0x54df, 0x54e0, 0x54e0, 0x54e0, 0x54e0, + 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e1, 0x54e1, 0x54e1, + 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e2, 0x54e2, 0x54e2, + 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e3, 0x54e3, + 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e4, 0x54e4, + 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e5, + 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, + 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, + 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, + 0x54e7, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, + 0x54e8, 0x54e8, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, + 0x54e9, 0x54e9, 0x54e9, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, + 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54eb, 0x54eb, 0x54eb, 0x54eb, + 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54ec, 0x54ec, 0x54ec, + 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ed, + 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, + 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, + 0x54ee, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, + 0x54ef, 0x54ef, 0x54ef, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, + 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f1, 0x54f1, 0x54f1, 0x54f1, + 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f2, 0x54f2, + 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f3, + 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, + 0x54f3, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, + 0x54f4, 0x54f4, 0x54f4, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, + 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f6, 0x54f6, 0x54f6, + 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f7, + 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, + 0x54f7, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, + 0x54f8, 0x54f8, 0x54f8, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, + 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54fa, 0x54fa, 0x54fa, + 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fb, + 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, + 0x54fb, 0x54fb, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, + 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fd, 0x54fd, 0x54fd, 0x54fd, + 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fe, + 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, + 0x54fe, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, + 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x5500, 0x5500, 0x5500, 0x5500, + 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5501, + 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, + 0x5501, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, + 0x5502, 0x5502, 0x5502, 0x5502, 0x5503, 0x5503, 0x5503, 0x5503, + 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5504, + 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, + 0x5504, 0x5504, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, + 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5506, 0x5506, + 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, + 0x5506, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, + 0x5507, 0x5507, 0x5507, 0x5507, 0x5508, 0x5508, 0x5508, 0x5508, + 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, + 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, + 0x5509, 0x5509, 0x5509, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, + 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550b, + 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, + 0x550b, 0x550b, 0x550b, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, + 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550d, 0x550d, + 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, + 0x550d, 0x550d, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, + 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550f, 0x550f, + 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, + 0x550f, 0x550f, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, + 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5511, + 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, + 0x5511, 0x5511, 0x5511, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, + 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5513, + 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, + 0x5513, 0x5513, 0x5513, 0x5513, 0x5514, 0x5514, 0x5514, 0x5514, + 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, + 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, + 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5516, 0x5516, 0x5516, + 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, + 0x5516, 0x5516, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, + 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5518, + 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, + 0x5518, 0x5518, 0x5518, 0x5518, 0x5519, 0x5519, 0x5519, 0x5519, + 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, + 0x5519, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, + 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551b, 0x551b, + 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, + 0x551b, 0x551b, 0x551b, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, + 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, + 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, + 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551e, 0x551e, + 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, + 0x551e, 0x551e, 0x551e, 0x551e, 0x551f, 0x551f, 0x551f, 0x551f, + 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, + 0x551f, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, + 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5521, + 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, + 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5522, 0x5522, 0x5522, + 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, + 0x5522, 0x5522, 0x5522, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, + 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, + 0x5523, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, + 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5525, + 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, + 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5526, 0x5526, + 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, + 0x5526, 0x5526, 0x5526, 0x5526, 0x5527, 0x5527, 0x5527, 0x5527, + 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, + 0x5527, 0x5527, 0x5527, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, + 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, + 0x5528, 0x5528, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, + 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, + 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, + 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552b, + 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, + 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552c, 0x552c, + 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, + 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552d, 0x552d, 0x552d, + 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, + 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552e, 0x552e, 0x552e, + 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, + 0x552e, 0x552e, 0x552e, 0x552e, 0x552f, 0x552f, 0x552f, 0x552f, + 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, + 0x552f, 0x552f, 0x552f, 0x552f, 0x5530, 0x5530, 0x5530, 0x5530, + 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, + 0x5530, 0x5530, 0x5530, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, + 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, + 0x5531, 0x5531, 0x5531, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, + 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, + 0x5532, 0x5532, 0x5532, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, + 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5534, 0x5534, + 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5535, 0x5535, + 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5536, 0x5536, + 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5537, 0x5537, + 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5538, 0x5538, + 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5539, + 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x553a, + 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, + 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, + 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, + 0x553c, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, + 0x553d, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, + 0x553e, 0x553e, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, + 0x553f, 0x553f, 0x553f, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, + 0x5540, 0x5540, 0x5540, 0x5540, 0x5541, 0x5541, 0x5541, 0x5541, + 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5542, 0x5542, 0x5542, + 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5543, 0x5543, + 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5544, + 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, + 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, + 0x5545, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, + 0x5546, 0x5546, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, + 0x5547, 0x5547, 0x5547, 0x5547, 0x5548, 0x5548, 0x5548, 0x5548, + 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5549, 0x5549, 0x5549, + 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x554a, + 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, + 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, + 0x554b, 0x554b, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, + 0x554c, 0x554c, 0x554c, 0x554c, 0x554d, 0x554d, 0x554d, 0x554d, + 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554e, 0x554e, + 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554f, + 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, + 0x554f, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, + 0x5550, 0x5550, 0x5550, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, + 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5552, 0x5552, + 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, + 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, + 0x5553, 0x5553, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, + 0x5554, 0x5554, 0x5554, 0x5554, 0x5555, 0x5555, 0x5555, 0x5555, + 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5556, + 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, + 0x5556, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, + 0x5557, 0x5557, 0x5557, 0x5557, 0x5558, 0x5558, 0x5558, 0x5558, + 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5559, + 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, + 0x5559, 0x5559, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, + 0x555a, 0x555a, 0x555a, 0x555a, 0x555b, 0x555b, 0x555b, 0x555b, + 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555c, + 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, + 0x555c, 0x555c, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, + 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555e, 0x555e, + 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, + 0x555e, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, + 0x555f, 0x555f, 0x555f, 0x555f, 0x5560, 0x5560, 0x5560, 0x5560, + 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5561, + 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, + 0x5561, 0x5561, 0x5561, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, + 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5563, 0x5563, + 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, + 0x5563, 0x5563, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, + 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5565, 0x5565, + 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, + 0x5565, 0x5565, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, + 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5567, 0x5567, + 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, + 0x5567, 0x5567, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, + 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5569, 0x5569, + 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, + 0x5569, 0x5569, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, + 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556b, 0x556b, + 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, + 0x556b, 0x556b, 0x556b, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, + 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556d, + 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, + 0x556d, 0x556d, 0x556d, 0x556d, 0x556e, 0x556e, 0x556e, 0x556e, + 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, + 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, + 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x5570, 0x5570, 0x5570, + 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, + 0x5570, 0x5570, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, + 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5572, + 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, + 0x5572, 0x5572, 0x5572, 0x5572, 0x5573, 0x5573, 0x5573, 0x5573, + 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, + 0x5573, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, + 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5575, + 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, + 0x5575, 0x5575, 0x5575, 0x5575, 0x5576, 0x5576, 0x5576, 0x5576, + 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, + 0x5576, 0x5576, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, + 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5578, + 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, + 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5579, 0x5579, 0x5579, + 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, + 0x5579, 0x5579, 0x5579, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, + 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, + 0x557a, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, + 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557c, + 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, + 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557d, 0x557d, 0x557d, + 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, + 0x557d, 0x557d, 0x557d, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, + 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, + 0x557e, 0x557e, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, + 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, + 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, + 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5581, + 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, + 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5582, 0x5582, + 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, + 0x5582, 0x5582, 0x5582, 0x5582, 0x5583, 0x5583, 0x5583, 0x5583, + 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, + 0x5583, 0x5583, 0x5583, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, + 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, + 0x5584, 0x5584, 0x5584, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, + 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, + 0x5585, 0x5585, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, + 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, + 0x5586, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, + 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, + 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, + 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, + 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, + 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, + 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, + 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, + 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, + 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558c, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfc00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; diff --git a/IlmImf/dwaLookups.cpp b/IlmImf/dwaLookups.cpp new file mode 100644 index 0000000..19ec831 --- /dev/null +++ b/IlmImf/dwaLookups.cpp @@ -0,0 +1,573 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +// +// A program to generate various acceleration lookup tables +// for Imf::DwaCompressor +// + +#include +#include +#include +#include +#include + +#include + +#ifdef OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN +#include +#endif + +#include +#include +#include +#include +#include +#include "ImfNamespace.h" + +using namespace OPENEXR_IMF_NAMESPACE; + +namespace { + + class LutHeaderWorker + { + public: + class Runner : public IlmThread::Thread + { + public: + Runner(LutHeaderWorker &worker, bool output): + IlmThread::Thread(), + _worker(worker), + _output(output) + { + start(); + } + + virtual ~Runner() + { + _semaphore.wait(); + } + + virtual void run() + { + _semaphore.post(); + _worker.run(_output); + } + + private: + LutHeaderWorker &_worker; + bool _output; + IlmThread::Semaphore _semaphore; + + }; // class LutHeaderWorker::Runner + + + LutHeaderWorker(size_t startValue, + size_t endValue): + _lastCandidateCount(0), + _startValue(startValue), + _endValue(endValue), + _numElements(0), + _offset(new size_t[numValues()]), + _elements(new unsigned short[1024*1024*2]) + { + } + + ~LutHeaderWorker() + { + delete[] _offset; + delete[] _elements; + } + + size_t lastCandidateCount() const + { + return _lastCandidateCount; + } + + size_t numValues() const + { + return _endValue - _startValue; + } + + size_t numElements() const + { + return _numElements; + } + + const size_t* offset() const + { + return _offset; + } + + const unsigned short* elements() const + { + return _elements; + } + + void run(bool outputProgress) + { + half candidate[16]; + int candidateCount = 0; + + for (size_t input=_startValue; input<_endValue; ++input) { + + if (outputProgress) { +#ifdef __GNUC__ + if (input % 100 == 0) { + fprintf(stderr, + " Building acceleration for DwaCompressor, %.2f %% %c", + 100.*(float)input/(float)numValues(), 13); + } +#else + if (input % 1000 == 0) { + fprintf(stderr, + " Building acceleration for DwaCompressor, %.2f %%\n", + 100.*(float)input/(float)numValues()); + } +#endif + } + + + int numSetBits = countSetBits(input); + half inputHalf, closestHalf; + + inputHalf.setBits(input); + + _offset[input - _startValue] = _numElements; + + // Gather candidates + candidateCount = 0; + for (int targetNumSetBits=numSetBits-1; targetNumSetBits>=0; + --targetNumSetBits) { + bool valueFound = false; + + for (int i=0; i<65536; ++i) { + if (countSetBits(i) != targetNumSetBits) continue; + + if (!valueFound) { + closestHalf.setBits(i); + valueFound = true; + } else { + half tmpHalf; + + tmpHalf.setBits(i); + + if (fabs((float)inputHalf - (float)tmpHalf) < + fabs((float)inputHalf - (float)closestHalf)) { + closestHalf = tmpHalf; + } + } + } + + if (valueFound == false) { + fprintf(stderr, "bork bork bork!\n"); + } + + candidate[candidateCount] = closestHalf; + candidateCount++; + } + + // Sort candidates by increasing number of bits set + for (int i=0; i> 8]; + } + + }; // class LutHeaderWorker + +} // namespace + + +// +// Generate a no-op LUT, to cut down in conditional branches +// +void +generateNoop() +{ + printf("const unsigned short dwaCompressorNoOp[] = \n"); + printf("{"); + for (int i=0; i<65536; ++i) { + + if (i % 8 == 0) { + printf("\n "); + } + + unsigned short dst; + char *tmp = (char *)(&dst); + + unsigned short src = (unsigned short)i; + Xdr::write (tmp, src); + + printf("0x%04x, ", dst); + } + printf("\n};\n"); +} + +// +// Nonlinearly encode luminance. For values below 1.0, we want +// to use a gamma 2.2 function to match what is fairly common +// for storing output referred. However, > 1, gamma functions blow up, +// and log functions are much better behaved. We could use a log +// function everywhere, but it tends to over-sample dark +// regions and undersample the brighter regions, when +// compared to the way real devices reproduce values. +// +// So, above 1, use a log function which is a smooth blend +// into the gamma function. +// +// Nonlinear(linear) = +// +// linear^(1./2.2) / linear <= 1.0 +// | +// ln(linear)/ln(e^2.2) + 1 \ otherwise +// +// +// toNonlinear[] needs to take in XDR format half float values, +// and output NATIVE format float. +// +// toLinear[] does the opposite - takes in NATIVE half and +// outputs XDR half values. +// + +void +generateToLinear() +{ + unsigned short toLinear[65536]; + + toLinear[0] = 0; + + for (int i=1; i<65536; ++i) { + half h; + float sign = 1; + float logBase = pow(2.7182818, 2.2); + + // map NaN and inf to 0 + if ((i & 0x7c00) == 0x7c00) { + toLinear[i] = 0; + continue; + } + + // + // _toLinear - assume i is NATIVE, but our output needs + // to get flipped to XDR + // + h.setBits(i); + sign = 1; + if ((float)h < 0) { + sign = -1; + } + + if ( fabs( (float)h) <= 1.0 ) { + h = (half)(sign * pow((float)fabs((float)h), 2.2f)); + } else { + h = (half)(sign * pow(logBase, (float)(fabs((float)h) - 1.0))); + } + + { + char *tmp = (char *)(&toLinear[i]); + + Xdr::write ( tmp, h.bits()); + } + } + + printf("const unsigned short dwaCompressorToLinear[] = \n"); + printf("{"); + for (int i=0; i<65536; ++i) { + if (i % 8 == 0) { + printf("\n "); + } + printf("0x%04x, ", toLinear[i]); + } + printf("\n};\n"); +} + + +void +generateToNonlinear() +{ + unsigned short toNonlinear[65536]; + + toNonlinear[0] = 0; + + for (int i=1; i<65536; ++i) { + unsigned short usNative, usXdr; + half h; + float sign = 1; + float logBase = pow(2.7182818, 2.2); + + usXdr = i; + + { + const char *tmp = (char *)(&usXdr); + + Xdr::read(tmp, usNative); + } + + // map NaN and inf to 0 + if ((usNative & 0x7c00) == 0x7c00) { + toNonlinear[i] = 0; + continue; + } + + // + // toNonlinear - assume i is XDR + // + h.setBits(usNative); + sign = 1; + if ((float)h < 0) { + sign = -1; + } + + if ( fabs( (float)h ) <= 1.0) { + h = (half)(sign * pow(fabs((float)h), 1.f/2.2f)); + } else { + h = (half)(sign * ( log(fabs((float)h)) / log(logBase) + 1.0) ); + } + toNonlinear[i] = h.bits(); + } + + printf("const unsigned short dwaCompressorToNonlinear[] = \n"); + printf("{"); + for (int i=0; i<65536; ++i) { + if (i % 8 == 0) { + printf("\n "); + } + printf("0x%04x, ", toNonlinear[i]); + } + printf("\n};\n"); +} + +// +// Attempt to get available CPUs in a somewhat portable way. +// + +int +cpuCount() +{ + if (!IlmThread::supportsThreads()) return 1; + + int cpuCount = 1; + +#if defined (OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN) + + cpuCount = sysconf(_SC_NPROCESSORS_ONLN); + +#elif defined (_WIN32) + + SYSTEM_INFO sysinfo; + GetSystemInfo( &sysinfo ); + cpuCount = sysinfo.dwNumberOfProcessors; + +#endif + + if (cpuCount < 1) cpuCount = 1; + return cpuCount; +} + +// +// Generate acceleration luts for the quantization. +// +// For each possible input value, we want to find the closest numbers +// which have one fewer bits set than before. +// +// This gives us num_bits(input)-1 values per input. If we alloc +// space for everything, that's like a 2MB table. We can do better +// by compressing all the values to be contigious and using offset +// pointers. +// +// After we've found the candidates with fewer bits set, sort them +// based on increasing numbers of bits set. This way, on quantize(), +// we can scan through the list and halt once we find the first +// candidate within the error range. For small values that can +// be quantized to 0, 0 is the first value tested and the search +// can exit fairly quickly. +// + +void +generateLutHeader() +{ + std::vector workers; + + size_t numWorkers = cpuCount(); + size_t workerInterval = 65536 / numWorkers; + + for (size_t i=0; i runners; + for (size_t i=0; irun(i == 0); + } + } + + printf("static unsigned int closestDataOffset[] = {\n"); + int offsetIdx = 0; + int offsetPrev = 0; + for (size_t i=0; inumValues(); ++value) { + if (offsetIdx % 8 == 0) { + printf(" "); + } + printf("%6lu, ", workers[i]->offset()[value] + offsetPrev); + if (offsetIdx % 8 == 7) { + printf("\n"); + } + offsetIdx++; + } + offsetPrev += workers[i]->offset()[workers[i]->numValues()-1] + + workers[i]->lastCandidateCount(); + } + printf("};\n\n\n"); + + + printf("static unsigned short closestData[] = {\n"); + int elementIdx = 0; + for (size_t i=0; inumElements(); ++element) { + if (elementIdx % 8 == 0) { + printf(" "); + } + printf("%5d, ", workers[i]->elements()[element]); + if (elementIdx % 8 == 7) { + printf("\n"); + } + elementIdx++; + } + } + printf("};\n\n\n"); + + for (size_t i=0; i\n"); + printf("\n\n\n"); + + generateNoop(); + + printf("\n\n\n"); + + generateToLinear(); + + printf("\n\n\n"); + + generateToNonlinear(); + + printf("\n\n\n"); + + generateLutHeader(); + + return 0; +} diff --git a/IlmImf/dwaLookups.h b/IlmImf/dwaLookups.h new file mode 100644 index 0000000..63c0d3d --- /dev/null +++ b/IlmImf/dwaLookups.h @@ -0,0 +1,98334 @@ +#include + + + +const unsigned short dwaCompressorNoOp[] = +{ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, + 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, + 0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f, + 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, + 0x0118, 0x0119, 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f, + 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, + 0x0128, 0x0129, 0x012a, 0x012b, 0x012c, 0x012d, 0x012e, 0x012f, + 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, + 0x0138, 0x0139, 0x013a, 0x013b, 0x013c, 0x013d, 0x013e, 0x013f, + 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, + 0x0148, 0x0149, 0x014a, 0x014b, 0x014c, 0x014d, 0x014e, 0x014f, + 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, + 0x0158, 0x0159, 0x015a, 0x015b, 0x015c, 0x015d, 0x015e, 0x015f, + 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, + 0x0168, 0x0169, 0x016a, 0x016b, 0x016c, 0x016d, 0x016e, 0x016f, + 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, + 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x017e, 0x017f, + 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, + 0x0188, 0x0189, 0x018a, 0x018b, 0x018c, 0x018d, 0x018e, 0x018f, + 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, + 0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e, 0x019f, + 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4, 0x01a5, 0x01a6, 0x01a7, + 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x01af, + 0x01b0, 0x01b1, 0x01b2, 0x01b3, 0x01b4, 0x01b5, 0x01b6, 0x01b7, + 0x01b8, 0x01b9, 0x01ba, 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf, + 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c4, 0x01c5, 0x01c6, 0x01c7, + 0x01c8, 0x01c9, 0x01ca, 0x01cb, 0x01cc, 0x01cd, 0x01ce, 0x01cf, + 0x01d0, 0x01d1, 0x01d2, 0x01d3, 0x01d4, 0x01d5, 0x01d6, 0x01d7, + 0x01d8, 0x01d9, 0x01da, 0x01db, 0x01dc, 0x01dd, 0x01de, 0x01df, + 0x01e0, 0x01e1, 0x01e2, 0x01e3, 0x01e4, 0x01e5, 0x01e6, 0x01e7, + 0x01e8, 0x01e9, 0x01ea, 0x01eb, 0x01ec, 0x01ed, 0x01ee, 0x01ef, + 0x01f0, 0x01f1, 0x01f2, 0x01f3, 0x01f4, 0x01f5, 0x01f6, 0x01f7, + 0x01f8, 0x01f9, 0x01fa, 0x01fb, 0x01fc, 0x01fd, 0x01fe, 0x01ff, + 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, + 0x0208, 0x0209, 0x020a, 0x020b, 0x020c, 0x020d, 0x020e, 0x020f, + 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, + 0x0218, 0x0219, 0x021a, 0x021b, 0x021c, 0x021d, 0x021e, 0x021f, + 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, + 0x0228, 0x0229, 0x022a, 0x022b, 0x022c, 0x022d, 0x022e, 0x022f, + 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, + 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, + 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, + 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, + 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, + 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, + 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, + 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, + 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, + 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, + 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, + 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, + 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, + 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, + 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, + 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, + 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, + 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, + 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, + 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, + 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, + 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, + 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, + 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, + 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, + 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, + 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, + 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, + 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, + 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, + 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, + 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x037f, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, + 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e, 0x038f, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x03a2, 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, 0x03cf, + 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, + 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, + 0x03e0, 0x03e1, 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x03e7, + 0x03e8, 0x03e9, 0x03ea, 0x03eb, 0x03ec, 0x03ed, 0x03ee, 0x03ef, + 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03f4, 0x03f5, 0x03f6, 0x03f7, + 0x03f8, 0x03f9, 0x03fa, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff, + 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, + 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, + 0x0468, 0x0469, 0x046a, 0x046b, 0x046c, 0x046d, 0x046e, 0x046f, + 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0476, 0x0477, + 0x0478, 0x0479, 0x047a, 0x047b, 0x047c, 0x047d, 0x047e, 0x047f, + 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048a, 0x048b, 0x048c, 0x048d, 0x048e, 0x048f, + 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, + 0x0498, 0x0499, 0x049a, 0x049b, 0x049c, 0x049d, 0x049e, 0x049f, + 0x04a0, 0x04a1, 0x04a2, 0x04a3, 0x04a4, 0x04a5, 0x04a6, 0x04a7, + 0x04a8, 0x04a9, 0x04aa, 0x04ab, 0x04ac, 0x04ad, 0x04ae, 0x04af, + 0x04b0, 0x04b1, 0x04b2, 0x04b3, 0x04b4, 0x04b5, 0x04b6, 0x04b7, + 0x04b8, 0x04b9, 0x04ba, 0x04bb, 0x04bc, 0x04bd, 0x04be, 0x04bf, + 0x04c0, 0x04c1, 0x04c2, 0x04c3, 0x04c4, 0x04c5, 0x04c6, 0x04c7, + 0x04c8, 0x04c9, 0x04ca, 0x04cb, 0x04cc, 0x04cd, 0x04ce, 0x04cf, + 0x04d0, 0x04d1, 0x04d2, 0x04d3, 0x04d4, 0x04d5, 0x04d6, 0x04d7, + 0x04d8, 0x04d9, 0x04da, 0x04db, 0x04dc, 0x04dd, 0x04de, 0x04df, + 0x04e0, 0x04e1, 0x04e2, 0x04e3, 0x04e4, 0x04e5, 0x04e6, 0x04e7, + 0x04e8, 0x04e9, 0x04ea, 0x04eb, 0x04ec, 0x04ed, 0x04ee, 0x04ef, + 0x04f0, 0x04f1, 0x04f2, 0x04f3, 0x04f4, 0x04f5, 0x04f6, 0x04f7, + 0x04f8, 0x04f9, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff, + 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, + 0x0508, 0x0509, 0x050a, 0x050b, 0x050c, 0x050d, 0x050e, 0x050f, + 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, + 0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f, + 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, + 0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f, + 0x0530, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, + 0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f, + 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547, + 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f, + 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0x0557, + 0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, + 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, + 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, + 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, + 0x0588, 0x0589, 0x058a, 0x058b, 0x058c, 0x058d, 0x058e, 0x058f, + 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, + 0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f, + 0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7, + 0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af, + 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, + 0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, + 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, + 0x05c8, 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, + 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, 0x05eb, 0x05ec, 0x05ed, 0x05ee, 0x05ef, + 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x05f5, 0x05f6, 0x05f7, + 0x05f8, 0x05f9, 0x05fa, 0x05fb, 0x05fc, 0x05fd, 0x05fe, 0x05ff, + 0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x0606, 0x0607, + 0x0608, 0x0609, 0x060a, 0x060b, 0x060c, 0x060d, 0x060e, 0x060f, + 0x0610, 0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616, 0x0617, + 0x0618, 0x0619, 0x061a, 0x061b, 0x061c, 0x061d, 0x061e, 0x061f, + 0x0620, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0x063b, 0x063c, 0x063d, 0x063e, 0x063f, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0656, 0x0657, + 0x0658, 0x0659, 0x065a, 0x065b, 0x065c, 0x065d, 0x065e, 0x065f, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0x066a, 0x066b, 0x066c, 0x066d, 0x066e, 0x066f, + 0x0670, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, + 0x0678, 0x0679, 0x067a, 0x067b, 0x067c, 0x067d, 0x067e, 0x067f, + 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, + 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x068d, 0x068e, 0x068f, + 0x0690, 0x0691, 0x0692, 0x0693, 0x0694, 0x0695, 0x0696, 0x0697, + 0x0698, 0x0699, 0x069a, 0x069b, 0x069c, 0x069d, 0x069e, 0x069f, + 0x06a0, 0x06a1, 0x06a2, 0x06a3, 0x06a4, 0x06a5, 0x06a6, 0x06a7, + 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ad, 0x06ae, 0x06af, + 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5, 0x06b6, 0x06b7, + 0x06b8, 0x06b9, 0x06ba, 0x06bb, 0x06bc, 0x06bd, 0x06be, 0x06bf, + 0x06c0, 0x06c1, 0x06c2, 0x06c3, 0x06c4, 0x06c5, 0x06c6, 0x06c7, + 0x06c8, 0x06c9, 0x06ca, 0x06cb, 0x06cc, 0x06cd, 0x06ce, 0x06cf, + 0x06d0, 0x06d1, 0x06d2, 0x06d3, 0x06d4, 0x06d5, 0x06d6, 0x06d7, + 0x06d8, 0x06d9, 0x06da, 0x06db, 0x06dc, 0x06dd, 0x06de, 0x06df, + 0x06e0, 0x06e1, 0x06e2, 0x06e3, 0x06e4, 0x06e5, 0x06e6, 0x06e7, + 0x06e8, 0x06e9, 0x06ea, 0x06eb, 0x06ec, 0x06ed, 0x06ee, 0x06ef, + 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, + 0x06f8, 0x06f9, 0x06fa, 0x06fb, 0x06fc, 0x06fd, 0x06fe, 0x06ff, + 0x0700, 0x0701, 0x0702, 0x0703, 0x0704, 0x0705, 0x0706, 0x0707, + 0x0708, 0x0709, 0x070a, 0x070b, 0x070c, 0x070d, 0x070e, 0x070f, + 0x0710, 0x0711, 0x0712, 0x0713, 0x0714, 0x0715, 0x0716, 0x0717, + 0x0718, 0x0719, 0x071a, 0x071b, 0x071c, 0x071d, 0x071e, 0x071f, + 0x0720, 0x0721, 0x0722, 0x0723, 0x0724, 0x0725, 0x0726, 0x0727, + 0x0728, 0x0729, 0x072a, 0x072b, 0x072c, 0x072d, 0x072e, 0x072f, + 0x0730, 0x0731, 0x0732, 0x0733, 0x0734, 0x0735, 0x0736, 0x0737, + 0x0738, 0x0739, 0x073a, 0x073b, 0x073c, 0x073d, 0x073e, 0x073f, + 0x0740, 0x0741, 0x0742, 0x0743, 0x0744, 0x0745, 0x0746, 0x0747, + 0x0748, 0x0749, 0x074a, 0x074b, 0x074c, 0x074d, 0x074e, 0x074f, + 0x0750, 0x0751, 0x0752, 0x0753, 0x0754, 0x0755, 0x0756, 0x0757, + 0x0758, 0x0759, 0x075a, 0x075b, 0x075c, 0x075d, 0x075e, 0x075f, + 0x0760, 0x0761, 0x0762, 0x0763, 0x0764, 0x0765, 0x0766, 0x0767, + 0x0768, 0x0769, 0x076a, 0x076b, 0x076c, 0x076d, 0x076e, 0x076f, + 0x0770, 0x0771, 0x0772, 0x0773, 0x0774, 0x0775, 0x0776, 0x0777, + 0x0778, 0x0779, 0x077a, 0x077b, 0x077c, 0x077d, 0x077e, 0x077f, + 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786, 0x0787, + 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x078e, 0x078f, + 0x0790, 0x0791, 0x0792, 0x0793, 0x0794, 0x0795, 0x0796, 0x0797, + 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 0x079e, 0x079f, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a6, 0x07a7, + 0x07a8, 0x07a9, 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07ae, 0x07af, + 0x07b0, 0x07b1, 0x07b2, 0x07b3, 0x07b4, 0x07b5, 0x07b6, 0x07b7, + 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bc, 0x07bd, 0x07be, 0x07bf, + 0x07c0, 0x07c1, 0x07c2, 0x07c3, 0x07c4, 0x07c5, 0x07c6, 0x07c7, + 0x07c8, 0x07c9, 0x07ca, 0x07cb, 0x07cc, 0x07cd, 0x07ce, 0x07cf, + 0x07d0, 0x07d1, 0x07d2, 0x07d3, 0x07d4, 0x07d5, 0x07d6, 0x07d7, + 0x07d8, 0x07d9, 0x07da, 0x07db, 0x07dc, 0x07dd, 0x07de, 0x07df, + 0x07e0, 0x07e1, 0x07e2, 0x07e3, 0x07e4, 0x07e5, 0x07e6, 0x07e7, + 0x07e8, 0x07e9, 0x07ea, 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, + 0x07f0, 0x07f1, 0x07f2, 0x07f3, 0x07f4, 0x07f5, 0x07f6, 0x07f7, + 0x07f8, 0x07f9, 0x07fa, 0x07fb, 0x07fc, 0x07fd, 0x07fe, 0x07ff, + 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, + 0x0808, 0x0809, 0x080a, 0x080b, 0x080c, 0x080d, 0x080e, 0x080f, + 0x0810, 0x0811, 0x0812, 0x0813, 0x0814, 0x0815, 0x0816, 0x0817, + 0x0818, 0x0819, 0x081a, 0x081b, 0x081c, 0x081d, 0x081e, 0x081f, + 0x0820, 0x0821, 0x0822, 0x0823, 0x0824, 0x0825, 0x0826, 0x0827, + 0x0828, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d, 0x082e, 0x082f, + 0x0830, 0x0831, 0x0832, 0x0833, 0x0834, 0x0835, 0x0836, 0x0837, + 0x0838, 0x0839, 0x083a, 0x083b, 0x083c, 0x083d, 0x083e, 0x083f, + 0x0840, 0x0841, 0x0842, 0x0843, 0x0844, 0x0845, 0x0846, 0x0847, + 0x0848, 0x0849, 0x084a, 0x084b, 0x084c, 0x084d, 0x084e, 0x084f, + 0x0850, 0x0851, 0x0852, 0x0853, 0x0854, 0x0855, 0x0856, 0x0857, + 0x0858, 0x0859, 0x085a, 0x085b, 0x085c, 0x085d, 0x085e, 0x085f, + 0x0860, 0x0861, 0x0862, 0x0863, 0x0864, 0x0865, 0x0866, 0x0867, + 0x0868, 0x0869, 0x086a, 0x086b, 0x086c, 0x086d, 0x086e, 0x086f, + 0x0870, 0x0871, 0x0872, 0x0873, 0x0874, 0x0875, 0x0876, 0x0877, + 0x0878, 0x0879, 0x087a, 0x087b, 0x087c, 0x087d, 0x087e, 0x087f, + 0x0880, 0x0881, 0x0882, 0x0883, 0x0884, 0x0885, 0x0886, 0x0887, + 0x0888, 0x0889, 0x088a, 0x088b, 0x088c, 0x088d, 0x088e, 0x088f, + 0x0890, 0x0891, 0x0892, 0x0893, 0x0894, 0x0895, 0x0896, 0x0897, + 0x0898, 0x0899, 0x089a, 0x089b, 0x089c, 0x089d, 0x089e, 0x089f, + 0x08a0, 0x08a1, 0x08a2, 0x08a3, 0x08a4, 0x08a5, 0x08a6, 0x08a7, + 0x08a8, 0x08a9, 0x08aa, 0x08ab, 0x08ac, 0x08ad, 0x08ae, 0x08af, + 0x08b0, 0x08b1, 0x08b2, 0x08b3, 0x08b4, 0x08b5, 0x08b6, 0x08b7, + 0x08b8, 0x08b9, 0x08ba, 0x08bb, 0x08bc, 0x08bd, 0x08be, 0x08bf, + 0x08c0, 0x08c1, 0x08c2, 0x08c3, 0x08c4, 0x08c5, 0x08c6, 0x08c7, + 0x08c8, 0x08c9, 0x08ca, 0x08cb, 0x08cc, 0x08cd, 0x08ce, 0x08cf, + 0x08d0, 0x08d1, 0x08d2, 0x08d3, 0x08d4, 0x08d5, 0x08d6, 0x08d7, + 0x08d8, 0x08d9, 0x08da, 0x08db, 0x08dc, 0x08dd, 0x08de, 0x08df, + 0x08e0, 0x08e1, 0x08e2, 0x08e3, 0x08e4, 0x08e5, 0x08e6, 0x08e7, + 0x08e8, 0x08e9, 0x08ea, 0x08eb, 0x08ec, 0x08ed, 0x08ee, 0x08ef, + 0x08f0, 0x08f1, 0x08f2, 0x08f3, 0x08f4, 0x08f5, 0x08f6, 0x08f7, + 0x08f8, 0x08f9, 0x08fa, 0x08fb, 0x08fc, 0x08fd, 0x08fe, 0x08ff, + 0x0900, 0x0901, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x0907, + 0x0908, 0x0909, 0x090a, 0x090b, 0x090c, 0x090d, 0x090e, 0x090f, + 0x0910, 0x0911, 0x0912, 0x0913, 0x0914, 0x0915, 0x0916, 0x0917, + 0x0918, 0x0919, 0x091a, 0x091b, 0x091c, 0x091d, 0x091e, 0x091f, + 0x0920, 0x0921, 0x0922, 0x0923, 0x0924, 0x0925, 0x0926, 0x0927, + 0x0928, 0x0929, 0x092a, 0x092b, 0x092c, 0x092d, 0x092e, 0x092f, + 0x0930, 0x0931, 0x0932, 0x0933, 0x0934, 0x0935, 0x0936, 0x0937, + 0x0938, 0x0939, 0x093a, 0x093b, 0x093c, 0x093d, 0x093e, 0x093f, + 0x0940, 0x0941, 0x0942, 0x0943, 0x0944, 0x0945, 0x0946, 0x0947, + 0x0948, 0x0949, 0x094a, 0x094b, 0x094c, 0x094d, 0x094e, 0x094f, + 0x0950, 0x0951, 0x0952, 0x0953, 0x0954, 0x0955, 0x0956, 0x0957, + 0x0958, 0x0959, 0x095a, 0x095b, 0x095c, 0x095d, 0x095e, 0x095f, + 0x0960, 0x0961, 0x0962, 0x0963, 0x0964, 0x0965, 0x0966, 0x0967, + 0x0968, 0x0969, 0x096a, 0x096b, 0x096c, 0x096d, 0x096e, 0x096f, + 0x0970, 0x0971, 0x0972, 0x0973, 0x0974, 0x0975, 0x0976, 0x0977, + 0x0978, 0x0979, 0x097a, 0x097b, 0x097c, 0x097d, 0x097e, 0x097f, + 0x0980, 0x0981, 0x0982, 0x0983, 0x0984, 0x0985, 0x0986, 0x0987, + 0x0988, 0x0989, 0x098a, 0x098b, 0x098c, 0x098d, 0x098e, 0x098f, + 0x0990, 0x0991, 0x0992, 0x0993, 0x0994, 0x0995, 0x0996, 0x0997, + 0x0998, 0x0999, 0x099a, 0x099b, 0x099c, 0x099d, 0x099e, 0x099f, + 0x09a0, 0x09a1, 0x09a2, 0x09a3, 0x09a4, 0x09a5, 0x09a6, 0x09a7, + 0x09a8, 0x09a9, 0x09aa, 0x09ab, 0x09ac, 0x09ad, 0x09ae, 0x09af, + 0x09b0, 0x09b1, 0x09b2, 0x09b3, 0x09b4, 0x09b5, 0x09b6, 0x09b7, + 0x09b8, 0x09b9, 0x09ba, 0x09bb, 0x09bc, 0x09bd, 0x09be, 0x09bf, + 0x09c0, 0x09c1, 0x09c2, 0x09c3, 0x09c4, 0x09c5, 0x09c6, 0x09c7, + 0x09c8, 0x09c9, 0x09ca, 0x09cb, 0x09cc, 0x09cd, 0x09ce, 0x09cf, + 0x09d0, 0x09d1, 0x09d2, 0x09d3, 0x09d4, 0x09d5, 0x09d6, 0x09d7, + 0x09d8, 0x09d9, 0x09da, 0x09db, 0x09dc, 0x09dd, 0x09de, 0x09df, + 0x09e0, 0x09e1, 0x09e2, 0x09e3, 0x09e4, 0x09e5, 0x09e6, 0x09e7, + 0x09e8, 0x09e9, 0x09ea, 0x09eb, 0x09ec, 0x09ed, 0x09ee, 0x09ef, + 0x09f0, 0x09f1, 0x09f2, 0x09f3, 0x09f4, 0x09f5, 0x09f6, 0x09f7, + 0x09f8, 0x09f9, 0x09fa, 0x09fb, 0x09fc, 0x09fd, 0x09fe, 0x09ff, + 0x0a00, 0x0a01, 0x0a02, 0x0a03, 0x0a04, 0x0a05, 0x0a06, 0x0a07, + 0x0a08, 0x0a09, 0x0a0a, 0x0a0b, 0x0a0c, 0x0a0d, 0x0a0e, 0x0a0f, + 0x0a10, 0x0a11, 0x0a12, 0x0a13, 0x0a14, 0x0a15, 0x0a16, 0x0a17, + 0x0a18, 0x0a19, 0x0a1a, 0x0a1b, 0x0a1c, 0x0a1d, 0x0a1e, 0x0a1f, + 0x0a20, 0x0a21, 0x0a22, 0x0a23, 0x0a24, 0x0a25, 0x0a26, 0x0a27, + 0x0a28, 0x0a29, 0x0a2a, 0x0a2b, 0x0a2c, 0x0a2d, 0x0a2e, 0x0a2f, + 0x0a30, 0x0a31, 0x0a32, 0x0a33, 0x0a34, 0x0a35, 0x0a36, 0x0a37, + 0x0a38, 0x0a39, 0x0a3a, 0x0a3b, 0x0a3c, 0x0a3d, 0x0a3e, 0x0a3f, + 0x0a40, 0x0a41, 0x0a42, 0x0a43, 0x0a44, 0x0a45, 0x0a46, 0x0a47, + 0x0a48, 0x0a49, 0x0a4a, 0x0a4b, 0x0a4c, 0x0a4d, 0x0a4e, 0x0a4f, + 0x0a50, 0x0a51, 0x0a52, 0x0a53, 0x0a54, 0x0a55, 0x0a56, 0x0a57, + 0x0a58, 0x0a59, 0x0a5a, 0x0a5b, 0x0a5c, 0x0a5d, 0x0a5e, 0x0a5f, + 0x0a60, 0x0a61, 0x0a62, 0x0a63, 0x0a64, 0x0a65, 0x0a66, 0x0a67, + 0x0a68, 0x0a69, 0x0a6a, 0x0a6b, 0x0a6c, 0x0a6d, 0x0a6e, 0x0a6f, + 0x0a70, 0x0a71, 0x0a72, 0x0a73, 0x0a74, 0x0a75, 0x0a76, 0x0a77, + 0x0a78, 0x0a79, 0x0a7a, 0x0a7b, 0x0a7c, 0x0a7d, 0x0a7e, 0x0a7f, + 0x0a80, 0x0a81, 0x0a82, 0x0a83, 0x0a84, 0x0a85, 0x0a86, 0x0a87, + 0x0a88, 0x0a89, 0x0a8a, 0x0a8b, 0x0a8c, 0x0a8d, 0x0a8e, 0x0a8f, + 0x0a90, 0x0a91, 0x0a92, 0x0a93, 0x0a94, 0x0a95, 0x0a96, 0x0a97, + 0x0a98, 0x0a99, 0x0a9a, 0x0a9b, 0x0a9c, 0x0a9d, 0x0a9e, 0x0a9f, + 0x0aa0, 0x0aa1, 0x0aa2, 0x0aa3, 0x0aa4, 0x0aa5, 0x0aa6, 0x0aa7, + 0x0aa8, 0x0aa9, 0x0aaa, 0x0aab, 0x0aac, 0x0aad, 0x0aae, 0x0aaf, + 0x0ab0, 0x0ab1, 0x0ab2, 0x0ab3, 0x0ab4, 0x0ab5, 0x0ab6, 0x0ab7, + 0x0ab8, 0x0ab9, 0x0aba, 0x0abb, 0x0abc, 0x0abd, 0x0abe, 0x0abf, + 0x0ac0, 0x0ac1, 0x0ac2, 0x0ac3, 0x0ac4, 0x0ac5, 0x0ac6, 0x0ac7, + 0x0ac8, 0x0ac9, 0x0aca, 0x0acb, 0x0acc, 0x0acd, 0x0ace, 0x0acf, + 0x0ad0, 0x0ad1, 0x0ad2, 0x0ad3, 0x0ad4, 0x0ad5, 0x0ad6, 0x0ad7, + 0x0ad8, 0x0ad9, 0x0ada, 0x0adb, 0x0adc, 0x0add, 0x0ade, 0x0adf, + 0x0ae0, 0x0ae1, 0x0ae2, 0x0ae3, 0x0ae4, 0x0ae5, 0x0ae6, 0x0ae7, + 0x0ae8, 0x0ae9, 0x0aea, 0x0aeb, 0x0aec, 0x0aed, 0x0aee, 0x0aef, + 0x0af0, 0x0af1, 0x0af2, 0x0af3, 0x0af4, 0x0af5, 0x0af6, 0x0af7, + 0x0af8, 0x0af9, 0x0afa, 0x0afb, 0x0afc, 0x0afd, 0x0afe, 0x0aff, + 0x0b00, 0x0b01, 0x0b02, 0x0b03, 0x0b04, 0x0b05, 0x0b06, 0x0b07, + 0x0b08, 0x0b09, 0x0b0a, 0x0b0b, 0x0b0c, 0x0b0d, 0x0b0e, 0x0b0f, + 0x0b10, 0x0b11, 0x0b12, 0x0b13, 0x0b14, 0x0b15, 0x0b16, 0x0b17, + 0x0b18, 0x0b19, 0x0b1a, 0x0b1b, 0x0b1c, 0x0b1d, 0x0b1e, 0x0b1f, + 0x0b20, 0x0b21, 0x0b22, 0x0b23, 0x0b24, 0x0b25, 0x0b26, 0x0b27, + 0x0b28, 0x0b29, 0x0b2a, 0x0b2b, 0x0b2c, 0x0b2d, 0x0b2e, 0x0b2f, + 0x0b30, 0x0b31, 0x0b32, 0x0b33, 0x0b34, 0x0b35, 0x0b36, 0x0b37, + 0x0b38, 0x0b39, 0x0b3a, 0x0b3b, 0x0b3c, 0x0b3d, 0x0b3e, 0x0b3f, + 0x0b40, 0x0b41, 0x0b42, 0x0b43, 0x0b44, 0x0b45, 0x0b46, 0x0b47, + 0x0b48, 0x0b49, 0x0b4a, 0x0b4b, 0x0b4c, 0x0b4d, 0x0b4e, 0x0b4f, + 0x0b50, 0x0b51, 0x0b52, 0x0b53, 0x0b54, 0x0b55, 0x0b56, 0x0b57, + 0x0b58, 0x0b59, 0x0b5a, 0x0b5b, 0x0b5c, 0x0b5d, 0x0b5e, 0x0b5f, + 0x0b60, 0x0b61, 0x0b62, 0x0b63, 0x0b64, 0x0b65, 0x0b66, 0x0b67, + 0x0b68, 0x0b69, 0x0b6a, 0x0b6b, 0x0b6c, 0x0b6d, 0x0b6e, 0x0b6f, + 0x0b70, 0x0b71, 0x0b72, 0x0b73, 0x0b74, 0x0b75, 0x0b76, 0x0b77, + 0x0b78, 0x0b79, 0x0b7a, 0x0b7b, 0x0b7c, 0x0b7d, 0x0b7e, 0x0b7f, + 0x0b80, 0x0b81, 0x0b82, 0x0b83, 0x0b84, 0x0b85, 0x0b86, 0x0b87, + 0x0b88, 0x0b89, 0x0b8a, 0x0b8b, 0x0b8c, 0x0b8d, 0x0b8e, 0x0b8f, + 0x0b90, 0x0b91, 0x0b92, 0x0b93, 0x0b94, 0x0b95, 0x0b96, 0x0b97, + 0x0b98, 0x0b99, 0x0b9a, 0x0b9b, 0x0b9c, 0x0b9d, 0x0b9e, 0x0b9f, + 0x0ba0, 0x0ba1, 0x0ba2, 0x0ba3, 0x0ba4, 0x0ba5, 0x0ba6, 0x0ba7, + 0x0ba8, 0x0ba9, 0x0baa, 0x0bab, 0x0bac, 0x0bad, 0x0bae, 0x0baf, + 0x0bb0, 0x0bb1, 0x0bb2, 0x0bb3, 0x0bb4, 0x0bb5, 0x0bb6, 0x0bb7, + 0x0bb8, 0x0bb9, 0x0bba, 0x0bbb, 0x0bbc, 0x0bbd, 0x0bbe, 0x0bbf, + 0x0bc0, 0x0bc1, 0x0bc2, 0x0bc3, 0x0bc4, 0x0bc5, 0x0bc6, 0x0bc7, + 0x0bc8, 0x0bc9, 0x0bca, 0x0bcb, 0x0bcc, 0x0bcd, 0x0bce, 0x0bcf, + 0x0bd0, 0x0bd1, 0x0bd2, 0x0bd3, 0x0bd4, 0x0bd5, 0x0bd6, 0x0bd7, + 0x0bd8, 0x0bd9, 0x0bda, 0x0bdb, 0x0bdc, 0x0bdd, 0x0bde, 0x0bdf, + 0x0be0, 0x0be1, 0x0be2, 0x0be3, 0x0be4, 0x0be5, 0x0be6, 0x0be7, + 0x0be8, 0x0be9, 0x0bea, 0x0beb, 0x0bec, 0x0bed, 0x0bee, 0x0bef, + 0x0bf0, 0x0bf1, 0x0bf2, 0x0bf3, 0x0bf4, 0x0bf5, 0x0bf6, 0x0bf7, + 0x0bf8, 0x0bf9, 0x0bfa, 0x0bfb, 0x0bfc, 0x0bfd, 0x0bfe, 0x0bff, + 0x0c00, 0x0c01, 0x0c02, 0x0c03, 0x0c04, 0x0c05, 0x0c06, 0x0c07, + 0x0c08, 0x0c09, 0x0c0a, 0x0c0b, 0x0c0c, 0x0c0d, 0x0c0e, 0x0c0f, + 0x0c10, 0x0c11, 0x0c12, 0x0c13, 0x0c14, 0x0c15, 0x0c16, 0x0c17, + 0x0c18, 0x0c19, 0x0c1a, 0x0c1b, 0x0c1c, 0x0c1d, 0x0c1e, 0x0c1f, + 0x0c20, 0x0c21, 0x0c22, 0x0c23, 0x0c24, 0x0c25, 0x0c26, 0x0c27, + 0x0c28, 0x0c29, 0x0c2a, 0x0c2b, 0x0c2c, 0x0c2d, 0x0c2e, 0x0c2f, + 0x0c30, 0x0c31, 0x0c32, 0x0c33, 0x0c34, 0x0c35, 0x0c36, 0x0c37, + 0x0c38, 0x0c39, 0x0c3a, 0x0c3b, 0x0c3c, 0x0c3d, 0x0c3e, 0x0c3f, + 0x0c40, 0x0c41, 0x0c42, 0x0c43, 0x0c44, 0x0c45, 0x0c46, 0x0c47, + 0x0c48, 0x0c49, 0x0c4a, 0x0c4b, 0x0c4c, 0x0c4d, 0x0c4e, 0x0c4f, + 0x0c50, 0x0c51, 0x0c52, 0x0c53, 0x0c54, 0x0c55, 0x0c56, 0x0c57, + 0x0c58, 0x0c59, 0x0c5a, 0x0c5b, 0x0c5c, 0x0c5d, 0x0c5e, 0x0c5f, + 0x0c60, 0x0c61, 0x0c62, 0x0c63, 0x0c64, 0x0c65, 0x0c66, 0x0c67, + 0x0c68, 0x0c69, 0x0c6a, 0x0c6b, 0x0c6c, 0x0c6d, 0x0c6e, 0x0c6f, + 0x0c70, 0x0c71, 0x0c72, 0x0c73, 0x0c74, 0x0c75, 0x0c76, 0x0c77, + 0x0c78, 0x0c79, 0x0c7a, 0x0c7b, 0x0c7c, 0x0c7d, 0x0c7e, 0x0c7f, + 0x0c80, 0x0c81, 0x0c82, 0x0c83, 0x0c84, 0x0c85, 0x0c86, 0x0c87, + 0x0c88, 0x0c89, 0x0c8a, 0x0c8b, 0x0c8c, 0x0c8d, 0x0c8e, 0x0c8f, + 0x0c90, 0x0c91, 0x0c92, 0x0c93, 0x0c94, 0x0c95, 0x0c96, 0x0c97, + 0x0c98, 0x0c99, 0x0c9a, 0x0c9b, 0x0c9c, 0x0c9d, 0x0c9e, 0x0c9f, + 0x0ca0, 0x0ca1, 0x0ca2, 0x0ca3, 0x0ca4, 0x0ca5, 0x0ca6, 0x0ca7, + 0x0ca8, 0x0ca9, 0x0caa, 0x0cab, 0x0cac, 0x0cad, 0x0cae, 0x0caf, + 0x0cb0, 0x0cb1, 0x0cb2, 0x0cb3, 0x0cb4, 0x0cb5, 0x0cb6, 0x0cb7, + 0x0cb8, 0x0cb9, 0x0cba, 0x0cbb, 0x0cbc, 0x0cbd, 0x0cbe, 0x0cbf, + 0x0cc0, 0x0cc1, 0x0cc2, 0x0cc3, 0x0cc4, 0x0cc5, 0x0cc6, 0x0cc7, + 0x0cc8, 0x0cc9, 0x0cca, 0x0ccb, 0x0ccc, 0x0ccd, 0x0cce, 0x0ccf, + 0x0cd0, 0x0cd1, 0x0cd2, 0x0cd3, 0x0cd4, 0x0cd5, 0x0cd6, 0x0cd7, + 0x0cd8, 0x0cd9, 0x0cda, 0x0cdb, 0x0cdc, 0x0cdd, 0x0cde, 0x0cdf, + 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0ce4, 0x0ce5, 0x0ce6, 0x0ce7, + 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x0cef, + 0x0cf0, 0x0cf1, 0x0cf2, 0x0cf3, 0x0cf4, 0x0cf5, 0x0cf6, 0x0cf7, + 0x0cf8, 0x0cf9, 0x0cfa, 0x0cfb, 0x0cfc, 0x0cfd, 0x0cfe, 0x0cff, + 0x0d00, 0x0d01, 0x0d02, 0x0d03, 0x0d04, 0x0d05, 0x0d06, 0x0d07, + 0x0d08, 0x0d09, 0x0d0a, 0x0d0b, 0x0d0c, 0x0d0d, 0x0d0e, 0x0d0f, + 0x0d10, 0x0d11, 0x0d12, 0x0d13, 0x0d14, 0x0d15, 0x0d16, 0x0d17, + 0x0d18, 0x0d19, 0x0d1a, 0x0d1b, 0x0d1c, 0x0d1d, 0x0d1e, 0x0d1f, + 0x0d20, 0x0d21, 0x0d22, 0x0d23, 0x0d24, 0x0d25, 0x0d26, 0x0d27, + 0x0d28, 0x0d29, 0x0d2a, 0x0d2b, 0x0d2c, 0x0d2d, 0x0d2e, 0x0d2f, + 0x0d30, 0x0d31, 0x0d32, 0x0d33, 0x0d34, 0x0d35, 0x0d36, 0x0d37, + 0x0d38, 0x0d39, 0x0d3a, 0x0d3b, 0x0d3c, 0x0d3d, 0x0d3e, 0x0d3f, + 0x0d40, 0x0d41, 0x0d42, 0x0d43, 0x0d44, 0x0d45, 0x0d46, 0x0d47, + 0x0d48, 0x0d49, 0x0d4a, 0x0d4b, 0x0d4c, 0x0d4d, 0x0d4e, 0x0d4f, + 0x0d50, 0x0d51, 0x0d52, 0x0d53, 0x0d54, 0x0d55, 0x0d56, 0x0d57, + 0x0d58, 0x0d59, 0x0d5a, 0x0d5b, 0x0d5c, 0x0d5d, 0x0d5e, 0x0d5f, + 0x0d60, 0x0d61, 0x0d62, 0x0d63, 0x0d64, 0x0d65, 0x0d66, 0x0d67, + 0x0d68, 0x0d69, 0x0d6a, 0x0d6b, 0x0d6c, 0x0d6d, 0x0d6e, 0x0d6f, + 0x0d70, 0x0d71, 0x0d72, 0x0d73, 0x0d74, 0x0d75, 0x0d76, 0x0d77, + 0x0d78, 0x0d79, 0x0d7a, 0x0d7b, 0x0d7c, 0x0d7d, 0x0d7e, 0x0d7f, + 0x0d80, 0x0d81, 0x0d82, 0x0d83, 0x0d84, 0x0d85, 0x0d86, 0x0d87, + 0x0d88, 0x0d89, 0x0d8a, 0x0d8b, 0x0d8c, 0x0d8d, 0x0d8e, 0x0d8f, + 0x0d90, 0x0d91, 0x0d92, 0x0d93, 0x0d94, 0x0d95, 0x0d96, 0x0d97, + 0x0d98, 0x0d99, 0x0d9a, 0x0d9b, 0x0d9c, 0x0d9d, 0x0d9e, 0x0d9f, + 0x0da0, 0x0da1, 0x0da2, 0x0da3, 0x0da4, 0x0da5, 0x0da6, 0x0da7, + 0x0da8, 0x0da9, 0x0daa, 0x0dab, 0x0dac, 0x0dad, 0x0dae, 0x0daf, + 0x0db0, 0x0db1, 0x0db2, 0x0db3, 0x0db4, 0x0db5, 0x0db6, 0x0db7, + 0x0db8, 0x0db9, 0x0dba, 0x0dbb, 0x0dbc, 0x0dbd, 0x0dbe, 0x0dbf, + 0x0dc0, 0x0dc1, 0x0dc2, 0x0dc3, 0x0dc4, 0x0dc5, 0x0dc6, 0x0dc7, + 0x0dc8, 0x0dc9, 0x0dca, 0x0dcb, 0x0dcc, 0x0dcd, 0x0dce, 0x0dcf, + 0x0dd0, 0x0dd1, 0x0dd2, 0x0dd3, 0x0dd4, 0x0dd5, 0x0dd6, 0x0dd7, + 0x0dd8, 0x0dd9, 0x0dda, 0x0ddb, 0x0ddc, 0x0ddd, 0x0dde, 0x0ddf, + 0x0de0, 0x0de1, 0x0de2, 0x0de3, 0x0de4, 0x0de5, 0x0de6, 0x0de7, + 0x0de8, 0x0de9, 0x0dea, 0x0deb, 0x0dec, 0x0ded, 0x0dee, 0x0def, + 0x0df0, 0x0df1, 0x0df2, 0x0df3, 0x0df4, 0x0df5, 0x0df6, 0x0df7, + 0x0df8, 0x0df9, 0x0dfa, 0x0dfb, 0x0dfc, 0x0dfd, 0x0dfe, 0x0dff, + 0x0e00, 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, 0x0e3b, 0x0e3c, 0x0e3d, 0x0e3e, 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, 0x0e5c, 0x0e5d, 0x0e5e, 0x0e5f, + 0x0e60, 0x0e61, 0x0e62, 0x0e63, 0x0e64, 0x0e65, 0x0e66, 0x0e67, + 0x0e68, 0x0e69, 0x0e6a, 0x0e6b, 0x0e6c, 0x0e6d, 0x0e6e, 0x0e6f, + 0x0e70, 0x0e71, 0x0e72, 0x0e73, 0x0e74, 0x0e75, 0x0e76, 0x0e77, + 0x0e78, 0x0e79, 0x0e7a, 0x0e7b, 0x0e7c, 0x0e7d, 0x0e7e, 0x0e7f, + 0x0e80, 0x0e81, 0x0e82, 0x0e83, 0x0e84, 0x0e85, 0x0e86, 0x0e87, + 0x0e88, 0x0e89, 0x0e8a, 0x0e8b, 0x0e8c, 0x0e8d, 0x0e8e, 0x0e8f, + 0x0e90, 0x0e91, 0x0e92, 0x0e93, 0x0e94, 0x0e95, 0x0e96, 0x0e97, + 0x0e98, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, + 0x0ea0, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea4, 0x0ea5, 0x0ea6, 0x0ea7, + 0x0ea8, 0x0ea9, 0x0eaa, 0x0eab, 0x0eac, 0x0ead, 0x0eae, 0x0eaf, + 0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, + 0x0eb8, 0x0eb9, 0x0eba, 0x0ebb, 0x0ebc, 0x0ebd, 0x0ebe, 0x0ebf, + 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec5, 0x0ec6, 0x0ec7, + 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0x0ece, 0x0ecf, + 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, + 0x0ed8, 0x0ed9, 0x0eda, 0x0edb, 0x0edc, 0x0edd, 0x0ede, 0x0edf, + 0x0ee0, 0x0ee1, 0x0ee2, 0x0ee3, 0x0ee4, 0x0ee5, 0x0ee6, 0x0ee7, + 0x0ee8, 0x0ee9, 0x0eea, 0x0eeb, 0x0eec, 0x0eed, 0x0eee, 0x0eef, + 0x0ef0, 0x0ef1, 0x0ef2, 0x0ef3, 0x0ef4, 0x0ef5, 0x0ef6, 0x0ef7, + 0x0ef8, 0x0ef9, 0x0efa, 0x0efb, 0x0efc, 0x0efd, 0x0efe, 0x0eff, + 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, 0x0f07, + 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, 0x0f0f, + 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16, 0x0f17, + 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e, 0x0f1f, + 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26, 0x0f27, + 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e, 0x0f2f, + 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36, 0x0f37, + 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e, 0x0f3f, + 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47, + 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f, + 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57, + 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f, + 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67, + 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f, + 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77, + 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, + 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86, 0x0f87, + 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e, 0x0f8f, + 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96, 0x0f97, + 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e, 0x0f9f, + 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7, + 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf, + 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7, + 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf, + 0x0fc0, 0x0fc1, 0x0fc2, 0x0fc3, 0x0fc4, 0x0fc5, 0x0fc6, 0x0fc7, + 0x0fc8, 0x0fc9, 0x0fca, 0x0fcb, 0x0fcc, 0x0fcd, 0x0fce, 0x0fcf, + 0x0fd0, 0x0fd1, 0x0fd2, 0x0fd3, 0x0fd4, 0x0fd5, 0x0fd6, 0x0fd7, + 0x0fd8, 0x0fd9, 0x0fda, 0x0fdb, 0x0fdc, 0x0fdd, 0x0fde, 0x0fdf, + 0x0fe0, 0x0fe1, 0x0fe2, 0x0fe3, 0x0fe4, 0x0fe5, 0x0fe6, 0x0fe7, + 0x0fe8, 0x0fe9, 0x0fea, 0x0feb, 0x0fec, 0x0fed, 0x0fee, 0x0fef, + 0x0ff0, 0x0ff1, 0x0ff2, 0x0ff3, 0x0ff4, 0x0ff5, 0x0ff6, 0x0ff7, + 0x0ff8, 0x0ff9, 0x0ffa, 0x0ffb, 0x0ffc, 0x0ffd, 0x0ffe, 0x0fff, + 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, + 0x1008, 0x1009, 0x100a, 0x100b, 0x100c, 0x100d, 0x100e, 0x100f, + 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, + 0x1018, 0x1019, 0x101a, 0x101b, 0x101c, 0x101d, 0x101e, 0x101f, + 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, + 0x1028, 0x1029, 0x102a, 0x102b, 0x102c, 0x102d, 0x102e, 0x102f, + 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, + 0x1038, 0x1039, 0x103a, 0x103b, 0x103c, 0x103d, 0x103e, 0x103f, + 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, + 0x1048, 0x1049, 0x104a, 0x104b, 0x104c, 0x104d, 0x104e, 0x104f, + 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, + 0x1058, 0x1059, 0x105a, 0x105b, 0x105c, 0x105d, 0x105e, 0x105f, + 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, + 0x1068, 0x1069, 0x106a, 0x106b, 0x106c, 0x106d, 0x106e, 0x106f, + 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, + 0x1078, 0x1079, 0x107a, 0x107b, 0x107c, 0x107d, 0x107e, 0x107f, + 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, + 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d, 0x108e, 0x108f, + 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, + 0x1098, 0x1099, 0x109a, 0x109b, 0x109c, 0x109d, 0x109e, 0x109f, + 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, + 0x10a8, 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, + 0x10b0, 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, + 0x10b8, 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, + 0x10c0, 0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, 0x10c6, 0x10c7, + 0x10c8, 0x10c9, 0x10ca, 0x10cb, 0x10cc, 0x10cd, 0x10ce, 0x10cf, + 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, + 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, + 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, + 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, + 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, + 0x10f8, 0x10f9, 0x10fa, 0x10fb, 0x10fc, 0x10fd, 0x10fe, 0x10ff, + 0x1100, 0x1101, 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107, + 0x1108, 0x1109, 0x110a, 0x110b, 0x110c, 0x110d, 0x110e, 0x110f, + 0x1110, 0x1111, 0x1112, 0x1113, 0x1114, 0x1115, 0x1116, 0x1117, + 0x1118, 0x1119, 0x111a, 0x111b, 0x111c, 0x111d, 0x111e, 0x111f, + 0x1120, 0x1121, 0x1122, 0x1123, 0x1124, 0x1125, 0x1126, 0x1127, + 0x1128, 0x1129, 0x112a, 0x112b, 0x112c, 0x112d, 0x112e, 0x112f, + 0x1130, 0x1131, 0x1132, 0x1133, 0x1134, 0x1135, 0x1136, 0x1137, + 0x1138, 0x1139, 0x113a, 0x113b, 0x113c, 0x113d, 0x113e, 0x113f, + 0x1140, 0x1141, 0x1142, 0x1143, 0x1144, 0x1145, 0x1146, 0x1147, + 0x1148, 0x1149, 0x114a, 0x114b, 0x114c, 0x114d, 0x114e, 0x114f, + 0x1150, 0x1151, 0x1152, 0x1153, 0x1154, 0x1155, 0x1156, 0x1157, + 0x1158, 0x1159, 0x115a, 0x115b, 0x115c, 0x115d, 0x115e, 0x115f, + 0x1160, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, + 0x1168, 0x1169, 0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, + 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1176, 0x1177, + 0x1178, 0x1179, 0x117a, 0x117b, 0x117c, 0x117d, 0x117e, 0x117f, + 0x1180, 0x1181, 0x1182, 0x1183, 0x1184, 0x1185, 0x1186, 0x1187, + 0x1188, 0x1189, 0x118a, 0x118b, 0x118c, 0x118d, 0x118e, 0x118f, + 0x1190, 0x1191, 0x1192, 0x1193, 0x1194, 0x1195, 0x1196, 0x1197, + 0x1198, 0x1199, 0x119a, 0x119b, 0x119c, 0x119d, 0x119e, 0x119f, + 0x11a0, 0x11a1, 0x11a2, 0x11a3, 0x11a4, 0x11a5, 0x11a6, 0x11a7, + 0x11a8, 0x11a9, 0x11aa, 0x11ab, 0x11ac, 0x11ad, 0x11ae, 0x11af, + 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, 0x11b6, 0x11b7, + 0x11b8, 0x11b9, 0x11ba, 0x11bb, 0x11bc, 0x11bd, 0x11be, 0x11bf, + 0x11c0, 0x11c1, 0x11c2, 0x11c3, 0x11c4, 0x11c5, 0x11c6, 0x11c7, + 0x11c8, 0x11c9, 0x11ca, 0x11cb, 0x11cc, 0x11cd, 0x11ce, 0x11cf, + 0x11d0, 0x11d1, 0x11d2, 0x11d3, 0x11d4, 0x11d5, 0x11d6, 0x11d7, + 0x11d8, 0x11d9, 0x11da, 0x11db, 0x11dc, 0x11dd, 0x11de, 0x11df, + 0x11e0, 0x11e1, 0x11e2, 0x11e3, 0x11e4, 0x11e5, 0x11e6, 0x11e7, + 0x11e8, 0x11e9, 0x11ea, 0x11eb, 0x11ec, 0x11ed, 0x11ee, 0x11ef, + 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, 0x11f7, + 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, 0x11ff, + 0x1200, 0x1201, 0x1202, 0x1203, 0x1204, 0x1205, 0x1206, 0x1207, + 0x1208, 0x1209, 0x120a, 0x120b, 0x120c, 0x120d, 0x120e, 0x120f, + 0x1210, 0x1211, 0x1212, 0x1213, 0x1214, 0x1215, 0x1216, 0x1217, + 0x1218, 0x1219, 0x121a, 0x121b, 0x121c, 0x121d, 0x121e, 0x121f, + 0x1220, 0x1221, 0x1222, 0x1223, 0x1224, 0x1225, 0x1226, 0x1227, + 0x1228, 0x1229, 0x122a, 0x122b, 0x122c, 0x122d, 0x122e, 0x122f, + 0x1230, 0x1231, 0x1232, 0x1233, 0x1234, 0x1235, 0x1236, 0x1237, + 0x1238, 0x1239, 0x123a, 0x123b, 0x123c, 0x123d, 0x123e, 0x123f, + 0x1240, 0x1241, 0x1242, 0x1243, 0x1244, 0x1245, 0x1246, 0x1247, + 0x1248, 0x1249, 0x124a, 0x124b, 0x124c, 0x124d, 0x124e, 0x124f, + 0x1250, 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, 0x1256, 0x1257, + 0x1258, 0x1259, 0x125a, 0x125b, 0x125c, 0x125d, 0x125e, 0x125f, + 0x1260, 0x1261, 0x1262, 0x1263, 0x1264, 0x1265, 0x1266, 0x1267, + 0x1268, 0x1269, 0x126a, 0x126b, 0x126c, 0x126d, 0x126e, 0x126f, + 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1276, 0x1277, + 0x1278, 0x1279, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, 0x127f, + 0x1280, 0x1281, 0x1282, 0x1283, 0x1284, 0x1285, 0x1286, 0x1287, + 0x1288, 0x1289, 0x128a, 0x128b, 0x128c, 0x128d, 0x128e, 0x128f, + 0x1290, 0x1291, 0x1292, 0x1293, 0x1294, 0x1295, 0x1296, 0x1297, + 0x1298, 0x1299, 0x129a, 0x129b, 0x129c, 0x129d, 0x129e, 0x129f, + 0x12a0, 0x12a1, 0x12a2, 0x12a3, 0x12a4, 0x12a5, 0x12a6, 0x12a7, + 0x12a8, 0x12a9, 0x12aa, 0x12ab, 0x12ac, 0x12ad, 0x12ae, 0x12af, + 0x12b0, 0x12b1, 0x12b2, 0x12b3, 0x12b4, 0x12b5, 0x12b6, 0x12b7, + 0x12b8, 0x12b9, 0x12ba, 0x12bb, 0x12bc, 0x12bd, 0x12be, 0x12bf, + 0x12c0, 0x12c1, 0x12c2, 0x12c3, 0x12c4, 0x12c5, 0x12c6, 0x12c7, + 0x12c8, 0x12c9, 0x12ca, 0x12cb, 0x12cc, 0x12cd, 0x12ce, 0x12cf, + 0x12d0, 0x12d1, 0x12d2, 0x12d3, 0x12d4, 0x12d5, 0x12d6, 0x12d7, + 0x12d8, 0x12d9, 0x12da, 0x12db, 0x12dc, 0x12dd, 0x12de, 0x12df, + 0x12e0, 0x12e1, 0x12e2, 0x12e3, 0x12e4, 0x12e5, 0x12e6, 0x12e7, + 0x12e8, 0x12e9, 0x12ea, 0x12eb, 0x12ec, 0x12ed, 0x12ee, 0x12ef, + 0x12f0, 0x12f1, 0x12f2, 0x12f3, 0x12f4, 0x12f5, 0x12f6, 0x12f7, + 0x12f8, 0x12f9, 0x12fa, 0x12fb, 0x12fc, 0x12fd, 0x12fe, 0x12ff, + 0x1300, 0x1301, 0x1302, 0x1303, 0x1304, 0x1305, 0x1306, 0x1307, + 0x1308, 0x1309, 0x130a, 0x130b, 0x130c, 0x130d, 0x130e, 0x130f, + 0x1310, 0x1311, 0x1312, 0x1313, 0x1314, 0x1315, 0x1316, 0x1317, + 0x1318, 0x1319, 0x131a, 0x131b, 0x131c, 0x131d, 0x131e, 0x131f, + 0x1320, 0x1321, 0x1322, 0x1323, 0x1324, 0x1325, 0x1326, 0x1327, + 0x1328, 0x1329, 0x132a, 0x132b, 0x132c, 0x132d, 0x132e, 0x132f, + 0x1330, 0x1331, 0x1332, 0x1333, 0x1334, 0x1335, 0x1336, 0x1337, + 0x1338, 0x1339, 0x133a, 0x133b, 0x133c, 0x133d, 0x133e, 0x133f, + 0x1340, 0x1341, 0x1342, 0x1343, 0x1344, 0x1345, 0x1346, 0x1347, + 0x1348, 0x1349, 0x134a, 0x134b, 0x134c, 0x134d, 0x134e, 0x134f, + 0x1350, 0x1351, 0x1352, 0x1353, 0x1354, 0x1355, 0x1356, 0x1357, + 0x1358, 0x1359, 0x135a, 0x135b, 0x135c, 0x135d, 0x135e, 0x135f, + 0x1360, 0x1361, 0x1362, 0x1363, 0x1364, 0x1365, 0x1366, 0x1367, + 0x1368, 0x1369, 0x136a, 0x136b, 0x136c, 0x136d, 0x136e, 0x136f, + 0x1370, 0x1371, 0x1372, 0x1373, 0x1374, 0x1375, 0x1376, 0x1377, + 0x1378, 0x1379, 0x137a, 0x137b, 0x137c, 0x137d, 0x137e, 0x137f, + 0x1380, 0x1381, 0x1382, 0x1383, 0x1384, 0x1385, 0x1386, 0x1387, + 0x1388, 0x1389, 0x138a, 0x138b, 0x138c, 0x138d, 0x138e, 0x138f, + 0x1390, 0x1391, 0x1392, 0x1393, 0x1394, 0x1395, 0x1396, 0x1397, + 0x1398, 0x1399, 0x139a, 0x139b, 0x139c, 0x139d, 0x139e, 0x139f, + 0x13a0, 0x13a1, 0x13a2, 0x13a3, 0x13a4, 0x13a5, 0x13a6, 0x13a7, + 0x13a8, 0x13a9, 0x13aa, 0x13ab, 0x13ac, 0x13ad, 0x13ae, 0x13af, + 0x13b0, 0x13b1, 0x13b2, 0x13b3, 0x13b4, 0x13b5, 0x13b6, 0x13b7, + 0x13b8, 0x13b9, 0x13ba, 0x13bb, 0x13bc, 0x13bd, 0x13be, 0x13bf, + 0x13c0, 0x13c1, 0x13c2, 0x13c3, 0x13c4, 0x13c5, 0x13c6, 0x13c7, + 0x13c8, 0x13c9, 0x13ca, 0x13cb, 0x13cc, 0x13cd, 0x13ce, 0x13cf, + 0x13d0, 0x13d1, 0x13d2, 0x13d3, 0x13d4, 0x13d5, 0x13d6, 0x13d7, + 0x13d8, 0x13d9, 0x13da, 0x13db, 0x13dc, 0x13dd, 0x13de, 0x13df, + 0x13e0, 0x13e1, 0x13e2, 0x13e3, 0x13e4, 0x13e5, 0x13e6, 0x13e7, + 0x13e8, 0x13e9, 0x13ea, 0x13eb, 0x13ec, 0x13ed, 0x13ee, 0x13ef, + 0x13f0, 0x13f1, 0x13f2, 0x13f3, 0x13f4, 0x13f5, 0x13f6, 0x13f7, + 0x13f8, 0x13f9, 0x13fa, 0x13fb, 0x13fc, 0x13fd, 0x13fe, 0x13ff, + 0x1400, 0x1401, 0x1402, 0x1403, 0x1404, 0x1405, 0x1406, 0x1407, + 0x1408, 0x1409, 0x140a, 0x140b, 0x140c, 0x140d, 0x140e, 0x140f, + 0x1410, 0x1411, 0x1412, 0x1413, 0x1414, 0x1415, 0x1416, 0x1417, + 0x1418, 0x1419, 0x141a, 0x141b, 0x141c, 0x141d, 0x141e, 0x141f, + 0x1420, 0x1421, 0x1422, 0x1423, 0x1424, 0x1425, 0x1426, 0x1427, + 0x1428, 0x1429, 0x142a, 0x142b, 0x142c, 0x142d, 0x142e, 0x142f, + 0x1430, 0x1431, 0x1432, 0x1433, 0x1434, 0x1435, 0x1436, 0x1437, + 0x1438, 0x1439, 0x143a, 0x143b, 0x143c, 0x143d, 0x143e, 0x143f, + 0x1440, 0x1441, 0x1442, 0x1443, 0x1444, 0x1445, 0x1446, 0x1447, + 0x1448, 0x1449, 0x144a, 0x144b, 0x144c, 0x144d, 0x144e, 0x144f, + 0x1450, 0x1451, 0x1452, 0x1453, 0x1454, 0x1455, 0x1456, 0x1457, + 0x1458, 0x1459, 0x145a, 0x145b, 0x145c, 0x145d, 0x145e, 0x145f, + 0x1460, 0x1461, 0x1462, 0x1463, 0x1464, 0x1465, 0x1466, 0x1467, + 0x1468, 0x1469, 0x146a, 0x146b, 0x146c, 0x146d, 0x146e, 0x146f, + 0x1470, 0x1471, 0x1472, 0x1473, 0x1474, 0x1475, 0x1476, 0x1477, + 0x1478, 0x1479, 0x147a, 0x147b, 0x147c, 0x147d, 0x147e, 0x147f, + 0x1480, 0x1481, 0x1482, 0x1483, 0x1484, 0x1485, 0x1486, 0x1487, + 0x1488, 0x1489, 0x148a, 0x148b, 0x148c, 0x148d, 0x148e, 0x148f, + 0x1490, 0x1491, 0x1492, 0x1493, 0x1494, 0x1495, 0x1496, 0x1497, + 0x1498, 0x1499, 0x149a, 0x149b, 0x149c, 0x149d, 0x149e, 0x149f, + 0x14a0, 0x14a1, 0x14a2, 0x14a3, 0x14a4, 0x14a5, 0x14a6, 0x14a7, + 0x14a8, 0x14a9, 0x14aa, 0x14ab, 0x14ac, 0x14ad, 0x14ae, 0x14af, + 0x14b0, 0x14b1, 0x14b2, 0x14b3, 0x14b4, 0x14b5, 0x14b6, 0x14b7, + 0x14b8, 0x14b9, 0x14ba, 0x14bb, 0x14bc, 0x14bd, 0x14be, 0x14bf, + 0x14c0, 0x14c1, 0x14c2, 0x14c3, 0x14c4, 0x14c5, 0x14c6, 0x14c7, + 0x14c8, 0x14c9, 0x14ca, 0x14cb, 0x14cc, 0x14cd, 0x14ce, 0x14cf, + 0x14d0, 0x14d1, 0x14d2, 0x14d3, 0x14d4, 0x14d5, 0x14d6, 0x14d7, + 0x14d8, 0x14d9, 0x14da, 0x14db, 0x14dc, 0x14dd, 0x14de, 0x14df, + 0x14e0, 0x14e1, 0x14e2, 0x14e3, 0x14e4, 0x14e5, 0x14e6, 0x14e7, + 0x14e8, 0x14e9, 0x14ea, 0x14eb, 0x14ec, 0x14ed, 0x14ee, 0x14ef, + 0x14f0, 0x14f1, 0x14f2, 0x14f3, 0x14f4, 0x14f5, 0x14f6, 0x14f7, + 0x14f8, 0x14f9, 0x14fa, 0x14fb, 0x14fc, 0x14fd, 0x14fe, 0x14ff, + 0x1500, 0x1501, 0x1502, 0x1503, 0x1504, 0x1505, 0x1506, 0x1507, + 0x1508, 0x1509, 0x150a, 0x150b, 0x150c, 0x150d, 0x150e, 0x150f, + 0x1510, 0x1511, 0x1512, 0x1513, 0x1514, 0x1515, 0x1516, 0x1517, + 0x1518, 0x1519, 0x151a, 0x151b, 0x151c, 0x151d, 0x151e, 0x151f, + 0x1520, 0x1521, 0x1522, 0x1523, 0x1524, 0x1525, 0x1526, 0x1527, + 0x1528, 0x1529, 0x152a, 0x152b, 0x152c, 0x152d, 0x152e, 0x152f, + 0x1530, 0x1531, 0x1532, 0x1533, 0x1534, 0x1535, 0x1536, 0x1537, + 0x1538, 0x1539, 0x153a, 0x153b, 0x153c, 0x153d, 0x153e, 0x153f, + 0x1540, 0x1541, 0x1542, 0x1543, 0x1544, 0x1545, 0x1546, 0x1547, + 0x1548, 0x1549, 0x154a, 0x154b, 0x154c, 0x154d, 0x154e, 0x154f, + 0x1550, 0x1551, 0x1552, 0x1553, 0x1554, 0x1555, 0x1556, 0x1557, + 0x1558, 0x1559, 0x155a, 0x155b, 0x155c, 0x155d, 0x155e, 0x155f, + 0x1560, 0x1561, 0x1562, 0x1563, 0x1564, 0x1565, 0x1566, 0x1567, + 0x1568, 0x1569, 0x156a, 0x156b, 0x156c, 0x156d, 0x156e, 0x156f, + 0x1570, 0x1571, 0x1572, 0x1573, 0x1574, 0x1575, 0x1576, 0x1577, + 0x1578, 0x1579, 0x157a, 0x157b, 0x157c, 0x157d, 0x157e, 0x157f, + 0x1580, 0x1581, 0x1582, 0x1583, 0x1584, 0x1585, 0x1586, 0x1587, + 0x1588, 0x1589, 0x158a, 0x158b, 0x158c, 0x158d, 0x158e, 0x158f, + 0x1590, 0x1591, 0x1592, 0x1593, 0x1594, 0x1595, 0x1596, 0x1597, + 0x1598, 0x1599, 0x159a, 0x159b, 0x159c, 0x159d, 0x159e, 0x159f, + 0x15a0, 0x15a1, 0x15a2, 0x15a3, 0x15a4, 0x15a5, 0x15a6, 0x15a7, + 0x15a8, 0x15a9, 0x15aa, 0x15ab, 0x15ac, 0x15ad, 0x15ae, 0x15af, + 0x15b0, 0x15b1, 0x15b2, 0x15b3, 0x15b4, 0x15b5, 0x15b6, 0x15b7, + 0x15b8, 0x15b9, 0x15ba, 0x15bb, 0x15bc, 0x15bd, 0x15be, 0x15bf, + 0x15c0, 0x15c1, 0x15c2, 0x15c3, 0x15c4, 0x15c5, 0x15c6, 0x15c7, + 0x15c8, 0x15c9, 0x15ca, 0x15cb, 0x15cc, 0x15cd, 0x15ce, 0x15cf, + 0x15d0, 0x15d1, 0x15d2, 0x15d3, 0x15d4, 0x15d5, 0x15d6, 0x15d7, + 0x15d8, 0x15d9, 0x15da, 0x15db, 0x15dc, 0x15dd, 0x15de, 0x15df, + 0x15e0, 0x15e1, 0x15e2, 0x15e3, 0x15e4, 0x15e5, 0x15e6, 0x15e7, + 0x15e8, 0x15e9, 0x15ea, 0x15eb, 0x15ec, 0x15ed, 0x15ee, 0x15ef, + 0x15f0, 0x15f1, 0x15f2, 0x15f3, 0x15f4, 0x15f5, 0x15f6, 0x15f7, + 0x15f8, 0x15f9, 0x15fa, 0x15fb, 0x15fc, 0x15fd, 0x15fe, 0x15ff, + 0x1600, 0x1601, 0x1602, 0x1603, 0x1604, 0x1605, 0x1606, 0x1607, + 0x1608, 0x1609, 0x160a, 0x160b, 0x160c, 0x160d, 0x160e, 0x160f, + 0x1610, 0x1611, 0x1612, 0x1613, 0x1614, 0x1615, 0x1616, 0x1617, + 0x1618, 0x1619, 0x161a, 0x161b, 0x161c, 0x161d, 0x161e, 0x161f, + 0x1620, 0x1621, 0x1622, 0x1623, 0x1624, 0x1625, 0x1626, 0x1627, + 0x1628, 0x1629, 0x162a, 0x162b, 0x162c, 0x162d, 0x162e, 0x162f, + 0x1630, 0x1631, 0x1632, 0x1633, 0x1634, 0x1635, 0x1636, 0x1637, + 0x1638, 0x1639, 0x163a, 0x163b, 0x163c, 0x163d, 0x163e, 0x163f, + 0x1640, 0x1641, 0x1642, 0x1643, 0x1644, 0x1645, 0x1646, 0x1647, + 0x1648, 0x1649, 0x164a, 0x164b, 0x164c, 0x164d, 0x164e, 0x164f, + 0x1650, 0x1651, 0x1652, 0x1653, 0x1654, 0x1655, 0x1656, 0x1657, + 0x1658, 0x1659, 0x165a, 0x165b, 0x165c, 0x165d, 0x165e, 0x165f, + 0x1660, 0x1661, 0x1662, 0x1663, 0x1664, 0x1665, 0x1666, 0x1667, + 0x1668, 0x1669, 0x166a, 0x166b, 0x166c, 0x166d, 0x166e, 0x166f, + 0x1670, 0x1671, 0x1672, 0x1673, 0x1674, 0x1675, 0x1676, 0x1677, + 0x1678, 0x1679, 0x167a, 0x167b, 0x167c, 0x167d, 0x167e, 0x167f, + 0x1680, 0x1681, 0x1682, 0x1683, 0x1684, 0x1685, 0x1686, 0x1687, + 0x1688, 0x1689, 0x168a, 0x168b, 0x168c, 0x168d, 0x168e, 0x168f, + 0x1690, 0x1691, 0x1692, 0x1693, 0x1694, 0x1695, 0x1696, 0x1697, + 0x1698, 0x1699, 0x169a, 0x169b, 0x169c, 0x169d, 0x169e, 0x169f, + 0x16a0, 0x16a1, 0x16a2, 0x16a3, 0x16a4, 0x16a5, 0x16a6, 0x16a7, + 0x16a8, 0x16a9, 0x16aa, 0x16ab, 0x16ac, 0x16ad, 0x16ae, 0x16af, + 0x16b0, 0x16b1, 0x16b2, 0x16b3, 0x16b4, 0x16b5, 0x16b6, 0x16b7, + 0x16b8, 0x16b9, 0x16ba, 0x16bb, 0x16bc, 0x16bd, 0x16be, 0x16bf, + 0x16c0, 0x16c1, 0x16c2, 0x16c3, 0x16c4, 0x16c5, 0x16c6, 0x16c7, + 0x16c8, 0x16c9, 0x16ca, 0x16cb, 0x16cc, 0x16cd, 0x16ce, 0x16cf, + 0x16d0, 0x16d1, 0x16d2, 0x16d3, 0x16d4, 0x16d5, 0x16d6, 0x16d7, + 0x16d8, 0x16d9, 0x16da, 0x16db, 0x16dc, 0x16dd, 0x16de, 0x16df, + 0x16e0, 0x16e1, 0x16e2, 0x16e3, 0x16e4, 0x16e5, 0x16e6, 0x16e7, + 0x16e8, 0x16e9, 0x16ea, 0x16eb, 0x16ec, 0x16ed, 0x16ee, 0x16ef, + 0x16f0, 0x16f1, 0x16f2, 0x16f3, 0x16f4, 0x16f5, 0x16f6, 0x16f7, + 0x16f8, 0x16f9, 0x16fa, 0x16fb, 0x16fc, 0x16fd, 0x16fe, 0x16ff, + 0x1700, 0x1701, 0x1702, 0x1703, 0x1704, 0x1705, 0x1706, 0x1707, + 0x1708, 0x1709, 0x170a, 0x170b, 0x170c, 0x170d, 0x170e, 0x170f, + 0x1710, 0x1711, 0x1712, 0x1713, 0x1714, 0x1715, 0x1716, 0x1717, + 0x1718, 0x1719, 0x171a, 0x171b, 0x171c, 0x171d, 0x171e, 0x171f, + 0x1720, 0x1721, 0x1722, 0x1723, 0x1724, 0x1725, 0x1726, 0x1727, + 0x1728, 0x1729, 0x172a, 0x172b, 0x172c, 0x172d, 0x172e, 0x172f, + 0x1730, 0x1731, 0x1732, 0x1733, 0x1734, 0x1735, 0x1736, 0x1737, + 0x1738, 0x1739, 0x173a, 0x173b, 0x173c, 0x173d, 0x173e, 0x173f, + 0x1740, 0x1741, 0x1742, 0x1743, 0x1744, 0x1745, 0x1746, 0x1747, + 0x1748, 0x1749, 0x174a, 0x174b, 0x174c, 0x174d, 0x174e, 0x174f, + 0x1750, 0x1751, 0x1752, 0x1753, 0x1754, 0x1755, 0x1756, 0x1757, + 0x1758, 0x1759, 0x175a, 0x175b, 0x175c, 0x175d, 0x175e, 0x175f, + 0x1760, 0x1761, 0x1762, 0x1763, 0x1764, 0x1765, 0x1766, 0x1767, + 0x1768, 0x1769, 0x176a, 0x176b, 0x176c, 0x176d, 0x176e, 0x176f, + 0x1770, 0x1771, 0x1772, 0x1773, 0x1774, 0x1775, 0x1776, 0x1777, + 0x1778, 0x1779, 0x177a, 0x177b, 0x177c, 0x177d, 0x177e, 0x177f, + 0x1780, 0x1781, 0x1782, 0x1783, 0x1784, 0x1785, 0x1786, 0x1787, + 0x1788, 0x1789, 0x178a, 0x178b, 0x178c, 0x178d, 0x178e, 0x178f, + 0x1790, 0x1791, 0x1792, 0x1793, 0x1794, 0x1795, 0x1796, 0x1797, + 0x1798, 0x1799, 0x179a, 0x179b, 0x179c, 0x179d, 0x179e, 0x179f, + 0x17a0, 0x17a1, 0x17a2, 0x17a3, 0x17a4, 0x17a5, 0x17a6, 0x17a7, + 0x17a8, 0x17a9, 0x17aa, 0x17ab, 0x17ac, 0x17ad, 0x17ae, 0x17af, + 0x17b0, 0x17b1, 0x17b2, 0x17b3, 0x17b4, 0x17b5, 0x17b6, 0x17b7, + 0x17b8, 0x17b9, 0x17ba, 0x17bb, 0x17bc, 0x17bd, 0x17be, 0x17bf, + 0x17c0, 0x17c1, 0x17c2, 0x17c3, 0x17c4, 0x17c5, 0x17c6, 0x17c7, + 0x17c8, 0x17c9, 0x17ca, 0x17cb, 0x17cc, 0x17cd, 0x17ce, 0x17cf, + 0x17d0, 0x17d1, 0x17d2, 0x17d3, 0x17d4, 0x17d5, 0x17d6, 0x17d7, + 0x17d8, 0x17d9, 0x17da, 0x17db, 0x17dc, 0x17dd, 0x17de, 0x17df, + 0x17e0, 0x17e1, 0x17e2, 0x17e3, 0x17e4, 0x17e5, 0x17e6, 0x17e7, + 0x17e8, 0x17e9, 0x17ea, 0x17eb, 0x17ec, 0x17ed, 0x17ee, 0x17ef, + 0x17f0, 0x17f1, 0x17f2, 0x17f3, 0x17f4, 0x17f5, 0x17f6, 0x17f7, + 0x17f8, 0x17f9, 0x17fa, 0x17fb, 0x17fc, 0x17fd, 0x17fe, 0x17ff, + 0x1800, 0x1801, 0x1802, 0x1803, 0x1804, 0x1805, 0x1806, 0x1807, + 0x1808, 0x1809, 0x180a, 0x180b, 0x180c, 0x180d, 0x180e, 0x180f, + 0x1810, 0x1811, 0x1812, 0x1813, 0x1814, 0x1815, 0x1816, 0x1817, + 0x1818, 0x1819, 0x181a, 0x181b, 0x181c, 0x181d, 0x181e, 0x181f, + 0x1820, 0x1821, 0x1822, 0x1823, 0x1824, 0x1825, 0x1826, 0x1827, + 0x1828, 0x1829, 0x182a, 0x182b, 0x182c, 0x182d, 0x182e, 0x182f, + 0x1830, 0x1831, 0x1832, 0x1833, 0x1834, 0x1835, 0x1836, 0x1837, + 0x1838, 0x1839, 0x183a, 0x183b, 0x183c, 0x183d, 0x183e, 0x183f, + 0x1840, 0x1841, 0x1842, 0x1843, 0x1844, 0x1845, 0x1846, 0x1847, + 0x1848, 0x1849, 0x184a, 0x184b, 0x184c, 0x184d, 0x184e, 0x184f, + 0x1850, 0x1851, 0x1852, 0x1853, 0x1854, 0x1855, 0x1856, 0x1857, + 0x1858, 0x1859, 0x185a, 0x185b, 0x185c, 0x185d, 0x185e, 0x185f, + 0x1860, 0x1861, 0x1862, 0x1863, 0x1864, 0x1865, 0x1866, 0x1867, + 0x1868, 0x1869, 0x186a, 0x186b, 0x186c, 0x186d, 0x186e, 0x186f, + 0x1870, 0x1871, 0x1872, 0x1873, 0x1874, 0x1875, 0x1876, 0x1877, + 0x1878, 0x1879, 0x187a, 0x187b, 0x187c, 0x187d, 0x187e, 0x187f, + 0x1880, 0x1881, 0x1882, 0x1883, 0x1884, 0x1885, 0x1886, 0x1887, + 0x1888, 0x1889, 0x188a, 0x188b, 0x188c, 0x188d, 0x188e, 0x188f, + 0x1890, 0x1891, 0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897, + 0x1898, 0x1899, 0x189a, 0x189b, 0x189c, 0x189d, 0x189e, 0x189f, + 0x18a0, 0x18a1, 0x18a2, 0x18a3, 0x18a4, 0x18a5, 0x18a6, 0x18a7, + 0x18a8, 0x18a9, 0x18aa, 0x18ab, 0x18ac, 0x18ad, 0x18ae, 0x18af, + 0x18b0, 0x18b1, 0x18b2, 0x18b3, 0x18b4, 0x18b5, 0x18b6, 0x18b7, + 0x18b8, 0x18b9, 0x18ba, 0x18bb, 0x18bc, 0x18bd, 0x18be, 0x18bf, + 0x18c0, 0x18c1, 0x18c2, 0x18c3, 0x18c4, 0x18c5, 0x18c6, 0x18c7, + 0x18c8, 0x18c9, 0x18ca, 0x18cb, 0x18cc, 0x18cd, 0x18ce, 0x18cf, + 0x18d0, 0x18d1, 0x18d2, 0x18d3, 0x18d4, 0x18d5, 0x18d6, 0x18d7, + 0x18d8, 0x18d9, 0x18da, 0x18db, 0x18dc, 0x18dd, 0x18de, 0x18df, + 0x18e0, 0x18e1, 0x18e2, 0x18e3, 0x18e4, 0x18e5, 0x18e6, 0x18e7, + 0x18e8, 0x18e9, 0x18ea, 0x18eb, 0x18ec, 0x18ed, 0x18ee, 0x18ef, + 0x18f0, 0x18f1, 0x18f2, 0x18f3, 0x18f4, 0x18f5, 0x18f6, 0x18f7, + 0x18f8, 0x18f9, 0x18fa, 0x18fb, 0x18fc, 0x18fd, 0x18fe, 0x18ff, + 0x1900, 0x1901, 0x1902, 0x1903, 0x1904, 0x1905, 0x1906, 0x1907, + 0x1908, 0x1909, 0x190a, 0x190b, 0x190c, 0x190d, 0x190e, 0x190f, + 0x1910, 0x1911, 0x1912, 0x1913, 0x1914, 0x1915, 0x1916, 0x1917, + 0x1918, 0x1919, 0x191a, 0x191b, 0x191c, 0x191d, 0x191e, 0x191f, + 0x1920, 0x1921, 0x1922, 0x1923, 0x1924, 0x1925, 0x1926, 0x1927, + 0x1928, 0x1929, 0x192a, 0x192b, 0x192c, 0x192d, 0x192e, 0x192f, + 0x1930, 0x1931, 0x1932, 0x1933, 0x1934, 0x1935, 0x1936, 0x1937, + 0x1938, 0x1939, 0x193a, 0x193b, 0x193c, 0x193d, 0x193e, 0x193f, + 0x1940, 0x1941, 0x1942, 0x1943, 0x1944, 0x1945, 0x1946, 0x1947, + 0x1948, 0x1949, 0x194a, 0x194b, 0x194c, 0x194d, 0x194e, 0x194f, + 0x1950, 0x1951, 0x1952, 0x1953, 0x1954, 0x1955, 0x1956, 0x1957, + 0x1958, 0x1959, 0x195a, 0x195b, 0x195c, 0x195d, 0x195e, 0x195f, + 0x1960, 0x1961, 0x1962, 0x1963, 0x1964, 0x1965, 0x1966, 0x1967, + 0x1968, 0x1969, 0x196a, 0x196b, 0x196c, 0x196d, 0x196e, 0x196f, + 0x1970, 0x1971, 0x1972, 0x1973, 0x1974, 0x1975, 0x1976, 0x1977, + 0x1978, 0x1979, 0x197a, 0x197b, 0x197c, 0x197d, 0x197e, 0x197f, + 0x1980, 0x1981, 0x1982, 0x1983, 0x1984, 0x1985, 0x1986, 0x1987, + 0x1988, 0x1989, 0x198a, 0x198b, 0x198c, 0x198d, 0x198e, 0x198f, + 0x1990, 0x1991, 0x1992, 0x1993, 0x1994, 0x1995, 0x1996, 0x1997, + 0x1998, 0x1999, 0x199a, 0x199b, 0x199c, 0x199d, 0x199e, 0x199f, + 0x19a0, 0x19a1, 0x19a2, 0x19a3, 0x19a4, 0x19a5, 0x19a6, 0x19a7, + 0x19a8, 0x19a9, 0x19aa, 0x19ab, 0x19ac, 0x19ad, 0x19ae, 0x19af, + 0x19b0, 0x19b1, 0x19b2, 0x19b3, 0x19b4, 0x19b5, 0x19b6, 0x19b7, + 0x19b8, 0x19b9, 0x19ba, 0x19bb, 0x19bc, 0x19bd, 0x19be, 0x19bf, + 0x19c0, 0x19c1, 0x19c2, 0x19c3, 0x19c4, 0x19c5, 0x19c6, 0x19c7, + 0x19c8, 0x19c9, 0x19ca, 0x19cb, 0x19cc, 0x19cd, 0x19ce, 0x19cf, + 0x19d0, 0x19d1, 0x19d2, 0x19d3, 0x19d4, 0x19d5, 0x19d6, 0x19d7, + 0x19d8, 0x19d9, 0x19da, 0x19db, 0x19dc, 0x19dd, 0x19de, 0x19df, + 0x19e0, 0x19e1, 0x19e2, 0x19e3, 0x19e4, 0x19e5, 0x19e6, 0x19e7, + 0x19e8, 0x19e9, 0x19ea, 0x19eb, 0x19ec, 0x19ed, 0x19ee, 0x19ef, + 0x19f0, 0x19f1, 0x19f2, 0x19f3, 0x19f4, 0x19f5, 0x19f6, 0x19f7, + 0x19f8, 0x19f9, 0x19fa, 0x19fb, 0x19fc, 0x19fd, 0x19fe, 0x19ff, + 0x1a00, 0x1a01, 0x1a02, 0x1a03, 0x1a04, 0x1a05, 0x1a06, 0x1a07, + 0x1a08, 0x1a09, 0x1a0a, 0x1a0b, 0x1a0c, 0x1a0d, 0x1a0e, 0x1a0f, + 0x1a10, 0x1a11, 0x1a12, 0x1a13, 0x1a14, 0x1a15, 0x1a16, 0x1a17, + 0x1a18, 0x1a19, 0x1a1a, 0x1a1b, 0x1a1c, 0x1a1d, 0x1a1e, 0x1a1f, + 0x1a20, 0x1a21, 0x1a22, 0x1a23, 0x1a24, 0x1a25, 0x1a26, 0x1a27, + 0x1a28, 0x1a29, 0x1a2a, 0x1a2b, 0x1a2c, 0x1a2d, 0x1a2e, 0x1a2f, + 0x1a30, 0x1a31, 0x1a32, 0x1a33, 0x1a34, 0x1a35, 0x1a36, 0x1a37, + 0x1a38, 0x1a39, 0x1a3a, 0x1a3b, 0x1a3c, 0x1a3d, 0x1a3e, 0x1a3f, + 0x1a40, 0x1a41, 0x1a42, 0x1a43, 0x1a44, 0x1a45, 0x1a46, 0x1a47, + 0x1a48, 0x1a49, 0x1a4a, 0x1a4b, 0x1a4c, 0x1a4d, 0x1a4e, 0x1a4f, + 0x1a50, 0x1a51, 0x1a52, 0x1a53, 0x1a54, 0x1a55, 0x1a56, 0x1a57, + 0x1a58, 0x1a59, 0x1a5a, 0x1a5b, 0x1a5c, 0x1a5d, 0x1a5e, 0x1a5f, + 0x1a60, 0x1a61, 0x1a62, 0x1a63, 0x1a64, 0x1a65, 0x1a66, 0x1a67, + 0x1a68, 0x1a69, 0x1a6a, 0x1a6b, 0x1a6c, 0x1a6d, 0x1a6e, 0x1a6f, + 0x1a70, 0x1a71, 0x1a72, 0x1a73, 0x1a74, 0x1a75, 0x1a76, 0x1a77, + 0x1a78, 0x1a79, 0x1a7a, 0x1a7b, 0x1a7c, 0x1a7d, 0x1a7e, 0x1a7f, + 0x1a80, 0x1a81, 0x1a82, 0x1a83, 0x1a84, 0x1a85, 0x1a86, 0x1a87, + 0x1a88, 0x1a89, 0x1a8a, 0x1a8b, 0x1a8c, 0x1a8d, 0x1a8e, 0x1a8f, + 0x1a90, 0x1a91, 0x1a92, 0x1a93, 0x1a94, 0x1a95, 0x1a96, 0x1a97, + 0x1a98, 0x1a99, 0x1a9a, 0x1a9b, 0x1a9c, 0x1a9d, 0x1a9e, 0x1a9f, + 0x1aa0, 0x1aa1, 0x1aa2, 0x1aa3, 0x1aa4, 0x1aa5, 0x1aa6, 0x1aa7, + 0x1aa8, 0x1aa9, 0x1aaa, 0x1aab, 0x1aac, 0x1aad, 0x1aae, 0x1aaf, + 0x1ab0, 0x1ab1, 0x1ab2, 0x1ab3, 0x1ab4, 0x1ab5, 0x1ab6, 0x1ab7, + 0x1ab8, 0x1ab9, 0x1aba, 0x1abb, 0x1abc, 0x1abd, 0x1abe, 0x1abf, + 0x1ac0, 0x1ac1, 0x1ac2, 0x1ac3, 0x1ac4, 0x1ac5, 0x1ac6, 0x1ac7, + 0x1ac8, 0x1ac9, 0x1aca, 0x1acb, 0x1acc, 0x1acd, 0x1ace, 0x1acf, + 0x1ad0, 0x1ad1, 0x1ad2, 0x1ad3, 0x1ad4, 0x1ad5, 0x1ad6, 0x1ad7, + 0x1ad8, 0x1ad9, 0x1ada, 0x1adb, 0x1adc, 0x1add, 0x1ade, 0x1adf, + 0x1ae0, 0x1ae1, 0x1ae2, 0x1ae3, 0x1ae4, 0x1ae5, 0x1ae6, 0x1ae7, + 0x1ae8, 0x1ae9, 0x1aea, 0x1aeb, 0x1aec, 0x1aed, 0x1aee, 0x1aef, + 0x1af0, 0x1af1, 0x1af2, 0x1af3, 0x1af4, 0x1af5, 0x1af6, 0x1af7, + 0x1af8, 0x1af9, 0x1afa, 0x1afb, 0x1afc, 0x1afd, 0x1afe, 0x1aff, + 0x1b00, 0x1b01, 0x1b02, 0x1b03, 0x1b04, 0x1b05, 0x1b06, 0x1b07, + 0x1b08, 0x1b09, 0x1b0a, 0x1b0b, 0x1b0c, 0x1b0d, 0x1b0e, 0x1b0f, + 0x1b10, 0x1b11, 0x1b12, 0x1b13, 0x1b14, 0x1b15, 0x1b16, 0x1b17, + 0x1b18, 0x1b19, 0x1b1a, 0x1b1b, 0x1b1c, 0x1b1d, 0x1b1e, 0x1b1f, + 0x1b20, 0x1b21, 0x1b22, 0x1b23, 0x1b24, 0x1b25, 0x1b26, 0x1b27, + 0x1b28, 0x1b29, 0x1b2a, 0x1b2b, 0x1b2c, 0x1b2d, 0x1b2e, 0x1b2f, + 0x1b30, 0x1b31, 0x1b32, 0x1b33, 0x1b34, 0x1b35, 0x1b36, 0x1b37, + 0x1b38, 0x1b39, 0x1b3a, 0x1b3b, 0x1b3c, 0x1b3d, 0x1b3e, 0x1b3f, + 0x1b40, 0x1b41, 0x1b42, 0x1b43, 0x1b44, 0x1b45, 0x1b46, 0x1b47, + 0x1b48, 0x1b49, 0x1b4a, 0x1b4b, 0x1b4c, 0x1b4d, 0x1b4e, 0x1b4f, + 0x1b50, 0x1b51, 0x1b52, 0x1b53, 0x1b54, 0x1b55, 0x1b56, 0x1b57, + 0x1b58, 0x1b59, 0x1b5a, 0x1b5b, 0x1b5c, 0x1b5d, 0x1b5e, 0x1b5f, + 0x1b60, 0x1b61, 0x1b62, 0x1b63, 0x1b64, 0x1b65, 0x1b66, 0x1b67, + 0x1b68, 0x1b69, 0x1b6a, 0x1b6b, 0x1b6c, 0x1b6d, 0x1b6e, 0x1b6f, + 0x1b70, 0x1b71, 0x1b72, 0x1b73, 0x1b74, 0x1b75, 0x1b76, 0x1b77, + 0x1b78, 0x1b79, 0x1b7a, 0x1b7b, 0x1b7c, 0x1b7d, 0x1b7e, 0x1b7f, + 0x1b80, 0x1b81, 0x1b82, 0x1b83, 0x1b84, 0x1b85, 0x1b86, 0x1b87, + 0x1b88, 0x1b89, 0x1b8a, 0x1b8b, 0x1b8c, 0x1b8d, 0x1b8e, 0x1b8f, + 0x1b90, 0x1b91, 0x1b92, 0x1b93, 0x1b94, 0x1b95, 0x1b96, 0x1b97, + 0x1b98, 0x1b99, 0x1b9a, 0x1b9b, 0x1b9c, 0x1b9d, 0x1b9e, 0x1b9f, + 0x1ba0, 0x1ba1, 0x1ba2, 0x1ba3, 0x1ba4, 0x1ba5, 0x1ba6, 0x1ba7, + 0x1ba8, 0x1ba9, 0x1baa, 0x1bab, 0x1bac, 0x1bad, 0x1bae, 0x1baf, + 0x1bb0, 0x1bb1, 0x1bb2, 0x1bb3, 0x1bb4, 0x1bb5, 0x1bb6, 0x1bb7, + 0x1bb8, 0x1bb9, 0x1bba, 0x1bbb, 0x1bbc, 0x1bbd, 0x1bbe, 0x1bbf, + 0x1bc0, 0x1bc1, 0x1bc2, 0x1bc3, 0x1bc4, 0x1bc5, 0x1bc6, 0x1bc7, + 0x1bc8, 0x1bc9, 0x1bca, 0x1bcb, 0x1bcc, 0x1bcd, 0x1bce, 0x1bcf, + 0x1bd0, 0x1bd1, 0x1bd2, 0x1bd3, 0x1bd4, 0x1bd5, 0x1bd6, 0x1bd7, + 0x1bd8, 0x1bd9, 0x1bda, 0x1bdb, 0x1bdc, 0x1bdd, 0x1bde, 0x1bdf, + 0x1be0, 0x1be1, 0x1be2, 0x1be3, 0x1be4, 0x1be5, 0x1be6, 0x1be7, + 0x1be8, 0x1be9, 0x1bea, 0x1beb, 0x1bec, 0x1bed, 0x1bee, 0x1bef, + 0x1bf0, 0x1bf1, 0x1bf2, 0x1bf3, 0x1bf4, 0x1bf5, 0x1bf6, 0x1bf7, + 0x1bf8, 0x1bf9, 0x1bfa, 0x1bfb, 0x1bfc, 0x1bfd, 0x1bfe, 0x1bff, + 0x1c00, 0x1c01, 0x1c02, 0x1c03, 0x1c04, 0x1c05, 0x1c06, 0x1c07, + 0x1c08, 0x1c09, 0x1c0a, 0x1c0b, 0x1c0c, 0x1c0d, 0x1c0e, 0x1c0f, + 0x1c10, 0x1c11, 0x1c12, 0x1c13, 0x1c14, 0x1c15, 0x1c16, 0x1c17, + 0x1c18, 0x1c19, 0x1c1a, 0x1c1b, 0x1c1c, 0x1c1d, 0x1c1e, 0x1c1f, + 0x1c20, 0x1c21, 0x1c22, 0x1c23, 0x1c24, 0x1c25, 0x1c26, 0x1c27, + 0x1c28, 0x1c29, 0x1c2a, 0x1c2b, 0x1c2c, 0x1c2d, 0x1c2e, 0x1c2f, + 0x1c30, 0x1c31, 0x1c32, 0x1c33, 0x1c34, 0x1c35, 0x1c36, 0x1c37, + 0x1c38, 0x1c39, 0x1c3a, 0x1c3b, 0x1c3c, 0x1c3d, 0x1c3e, 0x1c3f, + 0x1c40, 0x1c41, 0x1c42, 0x1c43, 0x1c44, 0x1c45, 0x1c46, 0x1c47, + 0x1c48, 0x1c49, 0x1c4a, 0x1c4b, 0x1c4c, 0x1c4d, 0x1c4e, 0x1c4f, + 0x1c50, 0x1c51, 0x1c52, 0x1c53, 0x1c54, 0x1c55, 0x1c56, 0x1c57, + 0x1c58, 0x1c59, 0x1c5a, 0x1c5b, 0x1c5c, 0x1c5d, 0x1c5e, 0x1c5f, + 0x1c60, 0x1c61, 0x1c62, 0x1c63, 0x1c64, 0x1c65, 0x1c66, 0x1c67, + 0x1c68, 0x1c69, 0x1c6a, 0x1c6b, 0x1c6c, 0x1c6d, 0x1c6e, 0x1c6f, + 0x1c70, 0x1c71, 0x1c72, 0x1c73, 0x1c74, 0x1c75, 0x1c76, 0x1c77, + 0x1c78, 0x1c79, 0x1c7a, 0x1c7b, 0x1c7c, 0x1c7d, 0x1c7e, 0x1c7f, + 0x1c80, 0x1c81, 0x1c82, 0x1c83, 0x1c84, 0x1c85, 0x1c86, 0x1c87, + 0x1c88, 0x1c89, 0x1c8a, 0x1c8b, 0x1c8c, 0x1c8d, 0x1c8e, 0x1c8f, + 0x1c90, 0x1c91, 0x1c92, 0x1c93, 0x1c94, 0x1c95, 0x1c96, 0x1c97, + 0x1c98, 0x1c99, 0x1c9a, 0x1c9b, 0x1c9c, 0x1c9d, 0x1c9e, 0x1c9f, + 0x1ca0, 0x1ca1, 0x1ca2, 0x1ca3, 0x1ca4, 0x1ca5, 0x1ca6, 0x1ca7, + 0x1ca8, 0x1ca9, 0x1caa, 0x1cab, 0x1cac, 0x1cad, 0x1cae, 0x1caf, + 0x1cb0, 0x1cb1, 0x1cb2, 0x1cb3, 0x1cb4, 0x1cb5, 0x1cb6, 0x1cb7, + 0x1cb8, 0x1cb9, 0x1cba, 0x1cbb, 0x1cbc, 0x1cbd, 0x1cbe, 0x1cbf, + 0x1cc0, 0x1cc1, 0x1cc2, 0x1cc3, 0x1cc4, 0x1cc5, 0x1cc6, 0x1cc7, + 0x1cc8, 0x1cc9, 0x1cca, 0x1ccb, 0x1ccc, 0x1ccd, 0x1cce, 0x1ccf, + 0x1cd0, 0x1cd1, 0x1cd2, 0x1cd3, 0x1cd4, 0x1cd5, 0x1cd6, 0x1cd7, + 0x1cd8, 0x1cd9, 0x1cda, 0x1cdb, 0x1cdc, 0x1cdd, 0x1cde, 0x1cdf, + 0x1ce0, 0x1ce1, 0x1ce2, 0x1ce3, 0x1ce4, 0x1ce5, 0x1ce6, 0x1ce7, + 0x1ce8, 0x1ce9, 0x1cea, 0x1ceb, 0x1cec, 0x1ced, 0x1cee, 0x1cef, + 0x1cf0, 0x1cf1, 0x1cf2, 0x1cf3, 0x1cf4, 0x1cf5, 0x1cf6, 0x1cf7, + 0x1cf8, 0x1cf9, 0x1cfa, 0x1cfb, 0x1cfc, 0x1cfd, 0x1cfe, 0x1cff, + 0x1d00, 0x1d01, 0x1d02, 0x1d03, 0x1d04, 0x1d05, 0x1d06, 0x1d07, + 0x1d08, 0x1d09, 0x1d0a, 0x1d0b, 0x1d0c, 0x1d0d, 0x1d0e, 0x1d0f, + 0x1d10, 0x1d11, 0x1d12, 0x1d13, 0x1d14, 0x1d15, 0x1d16, 0x1d17, + 0x1d18, 0x1d19, 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1d, 0x1d1e, 0x1d1f, + 0x1d20, 0x1d21, 0x1d22, 0x1d23, 0x1d24, 0x1d25, 0x1d26, 0x1d27, + 0x1d28, 0x1d29, 0x1d2a, 0x1d2b, 0x1d2c, 0x1d2d, 0x1d2e, 0x1d2f, + 0x1d30, 0x1d31, 0x1d32, 0x1d33, 0x1d34, 0x1d35, 0x1d36, 0x1d37, + 0x1d38, 0x1d39, 0x1d3a, 0x1d3b, 0x1d3c, 0x1d3d, 0x1d3e, 0x1d3f, + 0x1d40, 0x1d41, 0x1d42, 0x1d43, 0x1d44, 0x1d45, 0x1d46, 0x1d47, + 0x1d48, 0x1d49, 0x1d4a, 0x1d4b, 0x1d4c, 0x1d4d, 0x1d4e, 0x1d4f, + 0x1d50, 0x1d51, 0x1d52, 0x1d53, 0x1d54, 0x1d55, 0x1d56, 0x1d57, + 0x1d58, 0x1d59, 0x1d5a, 0x1d5b, 0x1d5c, 0x1d5d, 0x1d5e, 0x1d5f, + 0x1d60, 0x1d61, 0x1d62, 0x1d63, 0x1d64, 0x1d65, 0x1d66, 0x1d67, + 0x1d68, 0x1d69, 0x1d6a, 0x1d6b, 0x1d6c, 0x1d6d, 0x1d6e, 0x1d6f, + 0x1d70, 0x1d71, 0x1d72, 0x1d73, 0x1d74, 0x1d75, 0x1d76, 0x1d77, + 0x1d78, 0x1d79, 0x1d7a, 0x1d7b, 0x1d7c, 0x1d7d, 0x1d7e, 0x1d7f, + 0x1d80, 0x1d81, 0x1d82, 0x1d83, 0x1d84, 0x1d85, 0x1d86, 0x1d87, + 0x1d88, 0x1d89, 0x1d8a, 0x1d8b, 0x1d8c, 0x1d8d, 0x1d8e, 0x1d8f, + 0x1d90, 0x1d91, 0x1d92, 0x1d93, 0x1d94, 0x1d95, 0x1d96, 0x1d97, + 0x1d98, 0x1d99, 0x1d9a, 0x1d9b, 0x1d9c, 0x1d9d, 0x1d9e, 0x1d9f, + 0x1da0, 0x1da1, 0x1da2, 0x1da3, 0x1da4, 0x1da5, 0x1da6, 0x1da7, + 0x1da8, 0x1da9, 0x1daa, 0x1dab, 0x1dac, 0x1dad, 0x1dae, 0x1daf, + 0x1db0, 0x1db1, 0x1db2, 0x1db3, 0x1db4, 0x1db5, 0x1db6, 0x1db7, + 0x1db8, 0x1db9, 0x1dba, 0x1dbb, 0x1dbc, 0x1dbd, 0x1dbe, 0x1dbf, + 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3, 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, + 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb, 0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, + 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3, 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, + 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, 0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, + 0x1de0, 0x1de1, 0x1de2, 0x1de3, 0x1de4, 0x1de5, 0x1de6, 0x1de7, + 0x1de8, 0x1de9, 0x1dea, 0x1deb, 0x1dec, 0x1ded, 0x1dee, 0x1def, + 0x1df0, 0x1df1, 0x1df2, 0x1df3, 0x1df4, 0x1df5, 0x1df6, 0x1df7, + 0x1df8, 0x1df9, 0x1dfa, 0x1dfb, 0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, + 0x1e00, 0x1e01, 0x1e02, 0x1e03, 0x1e04, 0x1e05, 0x1e06, 0x1e07, + 0x1e08, 0x1e09, 0x1e0a, 0x1e0b, 0x1e0c, 0x1e0d, 0x1e0e, 0x1e0f, + 0x1e10, 0x1e11, 0x1e12, 0x1e13, 0x1e14, 0x1e15, 0x1e16, 0x1e17, + 0x1e18, 0x1e19, 0x1e1a, 0x1e1b, 0x1e1c, 0x1e1d, 0x1e1e, 0x1e1f, + 0x1e20, 0x1e21, 0x1e22, 0x1e23, 0x1e24, 0x1e25, 0x1e26, 0x1e27, + 0x1e28, 0x1e29, 0x1e2a, 0x1e2b, 0x1e2c, 0x1e2d, 0x1e2e, 0x1e2f, + 0x1e30, 0x1e31, 0x1e32, 0x1e33, 0x1e34, 0x1e35, 0x1e36, 0x1e37, + 0x1e38, 0x1e39, 0x1e3a, 0x1e3b, 0x1e3c, 0x1e3d, 0x1e3e, 0x1e3f, + 0x1e40, 0x1e41, 0x1e42, 0x1e43, 0x1e44, 0x1e45, 0x1e46, 0x1e47, + 0x1e48, 0x1e49, 0x1e4a, 0x1e4b, 0x1e4c, 0x1e4d, 0x1e4e, 0x1e4f, + 0x1e50, 0x1e51, 0x1e52, 0x1e53, 0x1e54, 0x1e55, 0x1e56, 0x1e57, + 0x1e58, 0x1e59, 0x1e5a, 0x1e5b, 0x1e5c, 0x1e5d, 0x1e5e, 0x1e5f, + 0x1e60, 0x1e61, 0x1e62, 0x1e63, 0x1e64, 0x1e65, 0x1e66, 0x1e67, + 0x1e68, 0x1e69, 0x1e6a, 0x1e6b, 0x1e6c, 0x1e6d, 0x1e6e, 0x1e6f, + 0x1e70, 0x1e71, 0x1e72, 0x1e73, 0x1e74, 0x1e75, 0x1e76, 0x1e77, + 0x1e78, 0x1e79, 0x1e7a, 0x1e7b, 0x1e7c, 0x1e7d, 0x1e7e, 0x1e7f, + 0x1e80, 0x1e81, 0x1e82, 0x1e83, 0x1e84, 0x1e85, 0x1e86, 0x1e87, + 0x1e88, 0x1e89, 0x1e8a, 0x1e8b, 0x1e8c, 0x1e8d, 0x1e8e, 0x1e8f, + 0x1e90, 0x1e91, 0x1e92, 0x1e93, 0x1e94, 0x1e95, 0x1e96, 0x1e97, + 0x1e98, 0x1e99, 0x1e9a, 0x1e9b, 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, + 0x1ea0, 0x1ea1, 0x1ea2, 0x1ea3, 0x1ea4, 0x1ea5, 0x1ea6, 0x1ea7, + 0x1ea8, 0x1ea9, 0x1eaa, 0x1eab, 0x1eac, 0x1ead, 0x1eae, 0x1eaf, + 0x1eb0, 0x1eb1, 0x1eb2, 0x1eb3, 0x1eb4, 0x1eb5, 0x1eb6, 0x1eb7, + 0x1eb8, 0x1eb9, 0x1eba, 0x1ebb, 0x1ebc, 0x1ebd, 0x1ebe, 0x1ebf, + 0x1ec0, 0x1ec1, 0x1ec2, 0x1ec3, 0x1ec4, 0x1ec5, 0x1ec6, 0x1ec7, + 0x1ec8, 0x1ec9, 0x1eca, 0x1ecb, 0x1ecc, 0x1ecd, 0x1ece, 0x1ecf, + 0x1ed0, 0x1ed1, 0x1ed2, 0x1ed3, 0x1ed4, 0x1ed5, 0x1ed6, 0x1ed7, + 0x1ed8, 0x1ed9, 0x1eda, 0x1edb, 0x1edc, 0x1edd, 0x1ede, 0x1edf, + 0x1ee0, 0x1ee1, 0x1ee2, 0x1ee3, 0x1ee4, 0x1ee5, 0x1ee6, 0x1ee7, + 0x1ee8, 0x1ee9, 0x1eea, 0x1eeb, 0x1eec, 0x1eed, 0x1eee, 0x1eef, + 0x1ef0, 0x1ef1, 0x1ef2, 0x1ef3, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, + 0x1ef8, 0x1ef9, 0x1efa, 0x1efb, 0x1efc, 0x1efd, 0x1efe, 0x1eff, + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, + 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f16, 0x1f17, + 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x1f1e, 0x1f1f, + 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, + 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, + 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, + 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f46, 0x1f47, + 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x1f4e, 0x1f4f, + 0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57, + 0x1f58, 0x1f59, 0x1f5a, 0x1f5b, 0x1f5c, 0x1f5d, 0x1f5e, 0x1f5f, + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, + 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, + 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77, + 0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x1f7e, 0x1f7f, + 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, + 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, + 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, + 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, + 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, + 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf, + 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, + 0x1fb8, 0x1fb9, 0x1fba, 0x1fbb, 0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf, + 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, + 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fcc, 0x1fcd, 0x1fce, 0x1fcf, + 0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, + 0x1fd8, 0x1fd9, 0x1fda, 0x1fdb, 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, + 0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7, + 0x1fe8, 0x1fe9, 0x1fea, 0x1feb, 0x1fec, 0x1fed, 0x1fee, 0x1fef, + 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, + 0x1ff8, 0x1ff9, 0x1ffa, 0x1ffb, 0x1ffc, 0x1ffd, 0x1ffe, 0x1fff, + 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, + 0x2008, 0x2009, 0x200a, 0x200b, 0x200c, 0x200d, 0x200e, 0x200f, + 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, + 0x2018, 0x2019, 0x201a, 0x201b, 0x201c, 0x201d, 0x201e, 0x201f, + 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, + 0x2028, 0x2029, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x202f, + 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, + 0x2038, 0x2039, 0x203a, 0x203b, 0x203c, 0x203d, 0x203e, 0x203f, + 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, + 0x2048, 0x2049, 0x204a, 0x204b, 0x204c, 0x204d, 0x204e, 0x204f, + 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, + 0x2058, 0x2059, 0x205a, 0x205b, 0x205c, 0x205d, 0x205e, 0x205f, + 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, + 0x2068, 0x2069, 0x206a, 0x206b, 0x206c, 0x206d, 0x206e, 0x206f, + 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, + 0x2078, 0x2079, 0x207a, 0x207b, 0x207c, 0x207d, 0x207e, 0x207f, + 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, + 0x2088, 0x2089, 0x208a, 0x208b, 0x208c, 0x208d, 0x208e, 0x208f, + 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, + 0x2098, 0x2099, 0x209a, 0x209b, 0x209c, 0x209d, 0x209e, 0x209f, + 0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, + 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac, 0x20ad, 0x20ae, 0x20af, + 0x20b0, 0x20b1, 0x20b2, 0x20b3, 0x20b4, 0x20b5, 0x20b6, 0x20b7, + 0x20b8, 0x20b9, 0x20ba, 0x20bb, 0x20bc, 0x20bd, 0x20be, 0x20bf, + 0x20c0, 0x20c1, 0x20c2, 0x20c3, 0x20c4, 0x20c5, 0x20c6, 0x20c7, + 0x20c8, 0x20c9, 0x20ca, 0x20cb, 0x20cc, 0x20cd, 0x20ce, 0x20cf, + 0x20d0, 0x20d1, 0x20d2, 0x20d3, 0x20d4, 0x20d5, 0x20d6, 0x20d7, + 0x20d8, 0x20d9, 0x20da, 0x20db, 0x20dc, 0x20dd, 0x20de, 0x20df, + 0x20e0, 0x20e1, 0x20e2, 0x20e3, 0x20e4, 0x20e5, 0x20e6, 0x20e7, + 0x20e8, 0x20e9, 0x20ea, 0x20eb, 0x20ec, 0x20ed, 0x20ee, 0x20ef, + 0x20f0, 0x20f1, 0x20f2, 0x20f3, 0x20f4, 0x20f5, 0x20f6, 0x20f7, + 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x20fc, 0x20fd, 0x20fe, 0x20ff, + 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, + 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f, + 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, + 0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, + 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, + 0x2128, 0x2129, 0x212a, 0x212b, 0x212c, 0x212d, 0x212e, 0x212f, + 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f, + 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, + 0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f, + 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, + 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, + 0x2168, 0x2169, 0x216a, 0x216b, 0x216c, 0x216d, 0x216e, 0x216f, + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, + 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, + 0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218d, 0x218e, 0x218f, + 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, + 0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f, + 0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7, + 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af, + 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7, + 0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf, + 0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7, + 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf, + 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7, + 0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, + 0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7, + 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef, + 0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7, + 0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff, + 0x2200, 0x2201, 0x2202, 0x2203, 0x2204, 0x2205, 0x2206, 0x2207, + 0x2208, 0x2209, 0x220a, 0x220b, 0x220c, 0x220d, 0x220e, 0x220f, + 0x2210, 0x2211, 0x2212, 0x2213, 0x2214, 0x2215, 0x2216, 0x2217, + 0x2218, 0x2219, 0x221a, 0x221b, 0x221c, 0x221d, 0x221e, 0x221f, + 0x2220, 0x2221, 0x2222, 0x2223, 0x2224, 0x2225, 0x2226, 0x2227, + 0x2228, 0x2229, 0x222a, 0x222b, 0x222c, 0x222d, 0x222e, 0x222f, + 0x2230, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, + 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, + 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2245, 0x2246, 0x2247, + 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, + 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, + 0x2258, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, + 0x2260, 0x2261, 0x2262, 0x2263, 0x2264, 0x2265, 0x2266, 0x2267, + 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x226f, + 0x2270, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, + 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x227d, 0x227e, 0x227f, + 0x2280, 0x2281, 0x2282, 0x2283, 0x2284, 0x2285, 0x2286, 0x2287, + 0x2288, 0x2289, 0x228a, 0x228b, 0x228c, 0x228d, 0x228e, 0x228f, + 0x2290, 0x2291, 0x2292, 0x2293, 0x2294, 0x2295, 0x2296, 0x2297, + 0x2298, 0x2299, 0x229a, 0x229b, 0x229c, 0x229d, 0x229e, 0x229f, + 0x22a0, 0x22a1, 0x22a2, 0x22a3, 0x22a4, 0x22a5, 0x22a6, 0x22a7, + 0x22a8, 0x22a9, 0x22aa, 0x22ab, 0x22ac, 0x22ad, 0x22ae, 0x22af, + 0x22b0, 0x22b1, 0x22b2, 0x22b3, 0x22b4, 0x22b5, 0x22b6, 0x22b7, + 0x22b8, 0x22b9, 0x22ba, 0x22bb, 0x22bc, 0x22bd, 0x22be, 0x22bf, + 0x22c0, 0x22c1, 0x22c2, 0x22c3, 0x22c4, 0x22c5, 0x22c6, 0x22c7, + 0x22c8, 0x22c9, 0x22ca, 0x22cb, 0x22cc, 0x22cd, 0x22ce, 0x22cf, + 0x22d0, 0x22d1, 0x22d2, 0x22d3, 0x22d4, 0x22d5, 0x22d6, 0x22d7, + 0x22d8, 0x22d9, 0x22da, 0x22db, 0x22dc, 0x22dd, 0x22de, 0x22df, + 0x22e0, 0x22e1, 0x22e2, 0x22e3, 0x22e4, 0x22e5, 0x22e6, 0x22e7, + 0x22e8, 0x22e9, 0x22ea, 0x22eb, 0x22ec, 0x22ed, 0x22ee, 0x22ef, + 0x22f0, 0x22f1, 0x22f2, 0x22f3, 0x22f4, 0x22f5, 0x22f6, 0x22f7, + 0x22f8, 0x22f9, 0x22fa, 0x22fb, 0x22fc, 0x22fd, 0x22fe, 0x22ff, + 0x2300, 0x2301, 0x2302, 0x2303, 0x2304, 0x2305, 0x2306, 0x2307, + 0x2308, 0x2309, 0x230a, 0x230b, 0x230c, 0x230d, 0x230e, 0x230f, + 0x2310, 0x2311, 0x2312, 0x2313, 0x2314, 0x2315, 0x2316, 0x2317, + 0x2318, 0x2319, 0x231a, 0x231b, 0x231c, 0x231d, 0x231e, 0x231f, + 0x2320, 0x2321, 0x2322, 0x2323, 0x2324, 0x2325, 0x2326, 0x2327, + 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, + 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, + 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, + 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, + 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, + 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, + 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, + 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, + 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, + 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, + 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, 0x237e, 0x237f, + 0x2380, 0x2381, 0x2382, 0x2383, 0x2384, 0x2385, 0x2386, 0x2387, + 0x2388, 0x2389, 0x238a, 0x238b, 0x238c, 0x238d, 0x238e, 0x238f, + 0x2390, 0x2391, 0x2392, 0x2393, 0x2394, 0x2395, 0x2396, 0x2397, + 0x2398, 0x2399, 0x239a, 0x239b, 0x239c, 0x239d, 0x239e, 0x239f, + 0x23a0, 0x23a1, 0x23a2, 0x23a3, 0x23a4, 0x23a5, 0x23a6, 0x23a7, + 0x23a8, 0x23a9, 0x23aa, 0x23ab, 0x23ac, 0x23ad, 0x23ae, 0x23af, + 0x23b0, 0x23b1, 0x23b2, 0x23b3, 0x23b4, 0x23b5, 0x23b6, 0x23b7, + 0x23b8, 0x23b9, 0x23ba, 0x23bb, 0x23bc, 0x23bd, 0x23be, 0x23bf, + 0x23c0, 0x23c1, 0x23c2, 0x23c3, 0x23c4, 0x23c5, 0x23c6, 0x23c7, + 0x23c8, 0x23c9, 0x23ca, 0x23cb, 0x23cc, 0x23cd, 0x23ce, 0x23cf, + 0x23d0, 0x23d1, 0x23d2, 0x23d3, 0x23d4, 0x23d5, 0x23d6, 0x23d7, + 0x23d8, 0x23d9, 0x23da, 0x23db, 0x23dc, 0x23dd, 0x23de, 0x23df, + 0x23e0, 0x23e1, 0x23e2, 0x23e3, 0x23e4, 0x23e5, 0x23e6, 0x23e7, + 0x23e8, 0x23e9, 0x23ea, 0x23eb, 0x23ec, 0x23ed, 0x23ee, 0x23ef, + 0x23f0, 0x23f1, 0x23f2, 0x23f3, 0x23f4, 0x23f5, 0x23f6, 0x23f7, + 0x23f8, 0x23f9, 0x23fa, 0x23fb, 0x23fc, 0x23fd, 0x23fe, 0x23ff, + 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, + 0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, + 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, + 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, + 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, + 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, + 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, + 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, + 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, + 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, + 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, + 0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f, + 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, + 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, + 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 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, + 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, + 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, + 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, + 0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef, + 0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7, + 0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff, + 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, + 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, 0x254c, 0x254d, 0x254e, 0x254f, + 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, + 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, + 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, + 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, + 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, + 0x2578, 0x2579, 0x257a, 0x257b, 0x257c, 0x257d, 0x257e, 0x257f, + 0x2580, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, + 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, + 0x2590, 0x2591, 0x2592, 0x2593, 0x2594, 0x2595, 0x2596, 0x2597, + 0x2598, 0x2599, 0x259a, 0x259b, 0x259c, 0x259d, 0x259e, 0x259f, + 0x25a0, 0x25a1, 0x25a2, 0x25a3, 0x25a4, 0x25a5, 0x25a6, 0x25a7, + 0x25a8, 0x25a9, 0x25aa, 0x25ab, 0x25ac, 0x25ad, 0x25ae, 0x25af, + 0x25b0, 0x25b1, 0x25b2, 0x25b3, 0x25b4, 0x25b5, 0x25b6, 0x25b7, + 0x25b8, 0x25b9, 0x25ba, 0x25bb, 0x25bc, 0x25bd, 0x25be, 0x25bf, + 0x25c0, 0x25c1, 0x25c2, 0x25c3, 0x25c4, 0x25c5, 0x25c6, 0x25c7, + 0x25c8, 0x25c9, 0x25ca, 0x25cb, 0x25cc, 0x25cd, 0x25ce, 0x25cf, + 0x25d0, 0x25d1, 0x25d2, 0x25d3, 0x25d4, 0x25d5, 0x25d6, 0x25d7, + 0x25d8, 0x25d9, 0x25da, 0x25db, 0x25dc, 0x25dd, 0x25de, 0x25df, + 0x25e0, 0x25e1, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x25e6, 0x25e7, + 0x25e8, 0x25e9, 0x25ea, 0x25eb, 0x25ec, 0x25ed, 0x25ee, 0x25ef, + 0x25f0, 0x25f1, 0x25f2, 0x25f3, 0x25f4, 0x25f5, 0x25f6, 0x25f7, + 0x25f8, 0x25f9, 0x25fa, 0x25fb, 0x25fc, 0x25fd, 0x25fe, 0x25ff, + 0x2600, 0x2601, 0x2602, 0x2603, 0x2604, 0x2605, 0x2606, 0x2607, + 0x2608, 0x2609, 0x260a, 0x260b, 0x260c, 0x260d, 0x260e, 0x260f, + 0x2610, 0x2611, 0x2612, 0x2613, 0x2614, 0x2615, 0x2616, 0x2617, + 0x2618, 0x2619, 0x261a, 0x261b, 0x261c, 0x261d, 0x261e, 0x261f, + 0x2620, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, + 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, + 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, + 0x2638, 0x2639, 0x263a, 0x263b, 0x263c, 0x263d, 0x263e, 0x263f, + 0x2640, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, + 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, + 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, + 0x2658, 0x2659, 0x265a, 0x265b, 0x265c, 0x265d, 0x265e, 0x265f, + 0x2660, 0x2661, 0x2662, 0x2663, 0x2664, 0x2665, 0x2666, 0x2667, + 0x2668, 0x2669, 0x266a, 0x266b, 0x266c, 0x266d, 0x266e, 0x266f, + 0x2670, 0x2671, 0x2672, 0x2673, 0x2674, 0x2675, 0x2676, 0x2677, + 0x2678, 0x2679, 0x267a, 0x267b, 0x267c, 0x267d, 0x267e, 0x267f, + 0x2680, 0x2681, 0x2682, 0x2683, 0x2684, 0x2685, 0x2686, 0x2687, + 0x2688, 0x2689, 0x268a, 0x268b, 0x268c, 0x268d, 0x268e, 0x268f, + 0x2690, 0x2691, 0x2692, 0x2693, 0x2694, 0x2695, 0x2696, 0x2697, + 0x2698, 0x2699, 0x269a, 0x269b, 0x269c, 0x269d, 0x269e, 0x269f, + 0x26a0, 0x26a1, 0x26a2, 0x26a3, 0x26a4, 0x26a5, 0x26a6, 0x26a7, + 0x26a8, 0x26a9, 0x26aa, 0x26ab, 0x26ac, 0x26ad, 0x26ae, 0x26af, + 0x26b0, 0x26b1, 0x26b2, 0x26b3, 0x26b4, 0x26b5, 0x26b6, 0x26b7, + 0x26b8, 0x26b9, 0x26ba, 0x26bb, 0x26bc, 0x26bd, 0x26be, 0x26bf, + 0x26c0, 0x26c1, 0x26c2, 0x26c3, 0x26c4, 0x26c5, 0x26c6, 0x26c7, + 0x26c8, 0x26c9, 0x26ca, 0x26cb, 0x26cc, 0x26cd, 0x26ce, 0x26cf, + 0x26d0, 0x26d1, 0x26d2, 0x26d3, 0x26d4, 0x26d5, 0x26d6, 0x26d7, + 0x26d8, 0x26d9, 0x26da, 0x26db, 0x26dc, 0x26dd, 0x26de, 0x26df, + 0x26e0, 0x26e1, 0x26e2, 0x26e3, 0x26e4, 0x26e5, 0x26e6, 0x26e7, + 0x26e8, 0x26e9, 0x26ea, 0x26eb, 0x26ec, 0x26ed, 0x26ee, 0x26ef, + 0x26f0, 0x26f1, 0x26f2, 0x26f3, 0x26f4, 0x26f5, 0x26f6, 0x26f7, + 0x26f8, 0x26f9, 0x26fa, 0x26fb, 0x26fc, 0x26fd, 0x26fe, 0x26ff, + 0x2700, 0x2701, 0x2702, 0x2703, 0x2704, 0x2705, 0x2706, 0x2707, + 0x2708, 0x2709, 0x270a, 0x270b, 0x270c, 0x270d, 0x270e, 0x270f, + 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, + 0x2718, 0x2719, 0x271a, 0x271b, 0x271c, 0x271d, 0x271e, 0x271f, + 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727, + 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, + 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, + 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, + 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, + 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x274e, 0x274f, + 0x2750, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2757, + 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, + 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, + 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, + 0x2770, 0x2771, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777, + 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, 0x277f, + 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, + 0x2788, 0x2789, 0x278a, 0x278b, 0x278c, 0x278d, 0x278e, 0x278f, + 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2795, 0x2796, 0x2797, + 0x2798, 0x2799, 0x279a, 0x279b, 0x279c, 0x279d, 0x279e, 0x279f, + 0x27a0, 0x27a1, 0x27a2, 0x27a3, 0x27a4, 0x27a5, 0x27a6, 0x27a7, + 0x27a8, 0x27a9, 0x27aa, 0x27ab, 0x27ac, 0x27ad, 0x27ae, 0x27af, + 0x27b0, 0x27b1, 0x27b2, 0x27b3, 0x27b4, 0x27b5, 0x27b6, 0x27b7, + 0x27b8, 0x27b9, 0x27ba, 0x27bb, 0x27bc, 0x27bd, 0x27be, 0x27bf, + 0x27c0, 0x27c1, 0x27c2, 0x27c3, 0x27c4, 0x27c5, 0x27c6, 0x27c7, + 0x27c8, 0x27c9, 0x27ca, 0x27cb, 0x27cc, 0x27cd, 0x27ce, 0x27cf, + 0x27d0, 0x27d1, 0x27d2, 0x27d3, 0x27d4, 0x27d5, 0x27d6, 0x27d7, + 0x27d8, 0x27d9, 0x27da, 0x27db, 0x27dc, 0x27dd, 0x27de, 0x27df, + 0x27e0, 0x27e1, 0x27e2, 0x27e3, 0x27e4, 0x27e5, 0x27e6, 0x27e7, + 0x27e8, 0x27e9, 0x27ea, 0x27eb, 0x27ec, 0x27ed, 0x27ee, 0x27ef, + 0x27f0, 0x27f1, 0x27f2, 0x27f3, 0x27f4, 0x27f5, 0x27f6, 0x27f7, + 0x27f8, 0x27f9, 0x27fa, 0x27fb, 0x27fc, 0x27fd, 0x27fe, 0x27ff, + 0x2800, 0x2801, 0x2802, 0x2803, 0x2804, 0x2805, 0x2806, 0x2807, + 0x2808, 0x2809, 0x280a, 0x280b, 0x280c, 0x280d, 0x280e, 0x280f, + 0x2810, 0x2811, 0x2812, 0x2813, 0x2814, 0x2815, 0x2816, 0x2817, + 0x2818, 0x2819, 0x281a, 0x281b, 0x281c, 0x281d, 0x281e, 0x281f, + 0x2820, 0x2821, 0x2822, 0x2823, 0x2824, 0x2825, 0x2826, 0x2827, + 0x2828, 0x2829, 0x282a, 0x282b, 0x282c, 0x282d, 0x282e, 0x282f, + 0x2830, 0x2831, 0x2832, 0x2833, 0x2834, 0x2835, 0x2836, 0x2837, + 0x2838, 0x2839, 0x283a, 0x283b, 0x283c, 0x283d, 0x283e, 0x283f, + 0x2840, 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847, + 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, + 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, + 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, + 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, + 0x2868, 0x2869, 0x286a, 0x286b, 0x286c, 0x286d, 0x286e, 0x286f, + 0x2870, 0x2871, 0x2872, 0x2873, 0x2874, 0x2875, 0x2876, 0x2877, + 0x2878, 0x2879, 0x287a, 0x287b, 0x287c, 0x287d, 0x287e, 0x287f, + 0x2880, 0x2881, 0x2882, 0x2883, 0x2884, 0x2885, 0x2886, 0x2887, + 0x2888, 0x2889, 0x288a, 0x288b, 0x288c, 0x288d, 0x288e, 0x288f, + 0x2890, 0x2891, 0x2892, 0x2893, 0x2894, 0x2895, 0x2896, 0x2897, + 0x2898, 0x2899, 0x289a, 0x289b, 0x289c, 0x289d, 0x289e, 0x289f, + 0x28a0, 0x28a1, 0x28a2, 0x28a3, 0x28a4, 0x28a5, 0x28a6, 0x28a7, + 0x28a8, 0x28a9, 0x28aa, 0x28ab, 0x28ac, 0x28ad, 0x28ae, 0x28af, + 0x28b0, 0x28b1, 0x28b2, 0x28b3, 0x28b4, 0x28b5, 0x28b6, 0x28b7, + 0x28b8, 0x28b9, 0x28ba, 0x28bb, 0x28bc, 0x28bd, 0x28be, 0x28bf, + 0x28c0, 0x28c1, 0x28c2, 0x28c3, 0x28c4, 0x28c5, 0x28c6, 0x28c7, + 0x28c8, 0x28c9, 0x28ca, 0x28cb, 0x28cc, 0x28cd, 0x28ce, 0x28cf, + 0x28d0, 0x28d1, 0x28d2, 0x28d3, 0x28d4, 0x28d5, 0x28d6, 0x28d7, + 0x28d8, 0x28d9, 0x28da, 0x28db, 0x28dc, 0x28dd, 0x28de, 0x28df, + 0x28e0, 0x28e1, 0x28e2, 0x28e3, 0x28e4, 0x28e5, 0x28e6, 0x28e7, + 0x28e8, 0x28e9, 0x28ea, 0x28eb, 0x28ec, 0x28ed, 0x28ee, 0x28ef, + 0x28f0, 0x28f1, 0x28f2, 0x28f3, 0x28f4, 0x28f5, 0x28f6, 0x28f7, + 0x28f8, 0x28f9, 0x28fa, 0x28fb, 0x28fc, 0x28fd, 0x28fe, 0x28ff, + 0x2900, 0x2901, 0x2902, 0x2903, 0x2904, 0x2905, 0x2906, 0x2907, + 0x2908, 0x2909, 0x290a, 0x290b, 0x290c, 0x290d, 0x290e, 0x290f, + 0x2910, 0x2911, 0x2912, 0x2913, 0x2914, 0x2915, 0x2916, 0x2917, + 0x2918, 0x2919, 0x291a, 0x291b, 0x291c, 0x291d, 0x291e, 0x291f, + 0x2920, 0x2921, 0x2922, 0x2923, 0x2924, 0x2925, 0x2926, 0x2927, + 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, + 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, + 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, + 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, + 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, + 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, + 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, + 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, + 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, + 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, 0x2975, 0x2976, 0x2977, + 0x2978, 0x2979, 0x297a, 0x297b, 0x297c, 0x297d, 0x297e, 0x297f, + 0x2980, 0x2981, 0x2982, 0x2983, 0x2984, 0x2985, 0x2986, 0x2987, + 0x2988, 0x2989, 0x298a, 0x298b, 0x298c, 0x298d, 0x298e, 0x298f, + 0x2990, 0x2991, 0x2992, 0x2993, 0x2994, 0x2995, 0x2996, 0x2997, + 0x2998, 0x2999, 0x299a, 0x299b, 0x299c, 0x299d, 0x299e, 0x299f, + 0x29a0, 0x29a1, 0x29a2, 0x29a3, 0x29a4, 0x29a5, 0x29a6, 0x29a7, + 0x29a8, 0x29a9, 0x29aa, 0x29ab, 0x29ac, 0x29ad, 0x29ae, 0x29af, + 0x29b0, 0x29b1, 0x29b2, 0x29b3, 0x29b4, 0x29b5, 0x29b6, 0x29b7, + 0x29b8, 0x29b9, 0x29ba, 0x29bb, 0x29bc, 0x29bd, 0x29be, 0x29bf, + 0x29c0, 0x29c1, 0x29c2, 0x29c3, 0x29c4, 0x29c5, 0x29c6, 0x29c7, + 0x29c8, 0x29c9, 0x29ca, 0x29cb, 0x29cc, 0x29cd, 0x29ce, 0x29cf, + 0x29d0, 0x29d1, 0x29d2, 0x29d3, 0x29d4, 0x29d5, 0x29d6, 0x29d7, + 0x29d8, 0x29d9, 0x29da, 0x29db, 0x29dc, 0x29dd, 0x29de, 0x29df, + 0x29e0, 0x29e1, 0x29e2, 0x29e3, 0x29e4, 0x29e5, 0x29e6, 0x29e7, + 0x29e8, 0x29e9, 0x29ea, 0x29eb, 0x29ec, 0x29ed, 0x29ee, 0x29ef, + 0x29f0, 0x29f1, 0x29f2, 0x29f3, 0x29f4, 0x29f5, 0x29f6, 0x29f7, + 0x29f8, 0x29f9, 0x29fa, 0x29fb, 0x29fc, 0x29fd, 0x29fe, 0x29ff, + 0x2a00, 0x2a01, 0x2a02, 0x2a03, 0x2a04, 0x2a05, 0x2a06, 0x2a07, + 0x2a08, 0x2a09, 0x2a0a, 0x2a0b, 0x2a0c, 0x2a0d, 0x2a0e, 0x2a0f, + 0x2a10, 0x2a11, 0x2a12, 0x2a13, 0x2a14, 0x2a15, 0x2a16, 0x2a17, + 0x2a18, 0x2a19, 0x2a1a, 0x2a1b, 0x2a1c, 0x2a1d, 0x2a1e, 0x2a1f, + 0x2a20, 0x2a21, 0x2a22, 0x2a23, 0x2a24, 0x2a25, 0x2a26, 0x2a27, + 0x2a28, 0x2a29, 0x2a2a, 0x2a2b, 0x2a2c, 0x2a2d, 0x2a2e, 0x2a2f, + 0x2a30, 0x2a31, 0x2a32, 0x2a33, 0x2a34, 0x2a35, 0x2a36, 0x2a37, + 0x2a38, 0x2a39, 0x2a3a, 0x2a3b, 0x2a3c, 0x2a3d, 0x2a3e, 0x2a3f, + 0x2a40, 0x2a41, 0x2a42, 0x2a43, 0x2a44, 0x2a45, 0x2a46, 0x2a47, + 0x2a48, 0x2a49, 0x2a4a, 0x2a4b, 0x2a4c, 0x2a4d, 0x2a4e, 0x2a4f, + 0x2a50, 0x2a51, 0x2a52, 0x2a53, 0x2a54, 0x2a55, 0x2a56, 0x2a57, + 0x2a58, 0x2a59, 0x2a5a, 0x2a5b, 0x2a5c, 0x2a5d, 0x2a5e, 0x2a5f, + 0x2a60, 0x2a61, 0x2a62, 0x2a63, 0x2a64, 0x2a65, 0x2a66, 0x2a67, + 0x2a68, 0x2a69, 0x2a6a, 0x2a6b, 0x2a6c, 0x2a6d, 0x2a6e, 0x2a6f, + 0x2a70, 0x2a71, 0x2a72, 0x2a73, 0x2a74, 0x2a75, 0x2a76, 0x2a77, + 0x2a78, 0x2a79, 0x2a7a, 0x2a7b, 0x2a7c, 0x2a7d, 0x2a7e, 0x2a7f, + 0x2a80, 0x2a81, 0x2a82, 0x2a83, 0x2a84, 0x2a85, 0x2a86, 0x2a87, + 0x2a88, 0x2a89, 0x2a8a, 0x2a8b, 0x2a8c, 0x2a8d, 0x2a8e, 0x2a8f, + 0x2a90, 0x2a91, 0x2a92, 0x2a93, 0x2a94, 0x2a95, 0x2a96, 0x2a97, + 0x2a98, 0x2a99, 0x2a9a, 0x2a9b, 0x2a9c, 0x2a9d, 0x2a9e, 0x2a9f, + 0x2aa0, 0x2aa1, 0x2aa2, 0x2aa3, 0x2aa4, 0x2aa5, 0x2aa6, 0x2aa7, + 0x2aa8, 0x2aa9, 0x2aaa, 0x2aab, 0x2aac, 0x2aad, 0x2aae, 0x2aaf, + 0x2ab0, 0x2ab1, 0x2ab2, 0x2ab3, 0x2ab4, 0x2ab5, 0x2ab6, 0x2ab7, + 0x2ab8, 0x2ab9, 0x2aba, 0x2abb, 0x2abc, 0x2abd, 0x2abe, 0x2abf, + 0x2ac0, 0x2ac1, 0x2ac2, 0x2ac3, 0x2ac4, 0x2ac5, 0x2ac6, 0x2ac7, + 0x2ac8, 0x2ac9, 0x2aca, 0x2acb, 0x2acc, 0x2acd, 0x2ace, 0x2acf, + 0x2ad0, 0x2ad1, 0x2ad2, 0x2ad3, 0x2ad4, 0x2ad5, 0x2ad6, 0x2ad7, + 0x2ad8, 0x2ad9, 0x2ada, 0x2adb, 0x2adc, 0x2add, 0x2ade, 0x2adf, + 0x2ae0, 0x2ae1, 0x2ae2, 0x2ae3, 0x2ae4, 0x2ae5, 0x2ae6, 0x2ae7, + 0x2ae8, 0x2ae9, 0x2aea, 0x2aeb, 0x2aec, 0x2aed, 0x2aee, 0x2aef, + 0x2af0, 0x2af1, 0x2af2, 0x2af3, 0x2af4, 0x2af5, 0x2af6, 0x2af7, + 0x2af8, 0x2af9, 0x2afa, 0x2afb, 0x2afc, 0x2afd, 0x2afe, 0x2aff, + 0x2b00, 0x2b01, 0x2b02, 0x2b03, 0x2b04, 0x2b05, 0x2b06, 0x2b07, + 0x2b08, 0x2b09, 0x2b0a, 0x2b0b, 0x2b0c, 0x2b0d, 0x2b0e, 0x2b0f, + 0x2b10, 0x2b11, 0x2b12, 0x2b13, 0x2b14, 0x2b15, 0x2b16, 0x2b17, + 0x2b18, 0x2b19, 0x2b1a, 0x2b1b, 0x2b1c, 0x2b1d, 0x2b1e, 0x2b1f, + 0x2b20, 0x2b21, 0x2b22, 0x2b23, 0x2b24, 0x2b25, 0x2b26, 0x2b27, + 0x2b28, 0x2b29, 0x2b2a, 0x2b2b, 0x2b2c, 0x2b2d, 0x2b2e, 0x2b2f, + 0x2b30, 0x2b31, 0x2b32, 0x2b33, 0x2b34, 0x2b35, 0x2b36, 0x2b37, + 0x2b38, 0x2b39, 0x2b3a, 0x2b3b, 0x2b3c, 0x2b3d, 0x2b3e, 0x2b3f, + 0x2b40, 0x2b41, 0x2b42, 0x2b43, 0x2b44, 0x2b45, 0x2b46, 0x2b47, + 0x2b48, 0x2b49, 0x2b4a, 0x2b4b, 0x2b4c, 0x2b4d, 0x2b4e, 0x2b4f, + 0x2b50, 0x2b51, 0x2b52, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2b57, + 0x2b58, 0x2b59, 0x2b5a, 0x2b5b, 0x2b5c, 0x2b5d, 0x2b5e, 0x2b5f, + 0x2b60, 0x2b61, 0x2b62, 0x2b63, 0x2b64, 0x2b65, 0x2b66, 0x2b67, + 0x2b68, 0x2b69, 0x2b6a, 0x2b6b, 0x2b6c, 0x2b6d, 0x2b6e, 0x2b6f, + 0x2b70, 0x2b71, 0x2b72, 0x2b73, 0x2b74, 0x2b75, 0x2b76, 0x2b77, + 0x2b78, 0x2b79, 0x2b7a, 0x2b7b, 0x2b7c, 0x2b7d, 0x2b7e, 0x2b7f, + 0x2b80, 0x2b81, 0x2b82, 0x2b83, 0x2b84, 0x2b85, 0x2b86, 0x2b87, + 0x2b88, 0x2b89, 0x2b8a, 0x2b8b, 0x2b8c, 0x2b8d, 0x2b8e, 0x2b8f, + 0x2b90, 0x2b91, 0x2b92, 0x2b93, 0x2b94, 0x2b95, 0x2b96, 0x2b97, + 0x2b98, 0x2b99, 0x2b9a, 0x2b9b, 0x2b9c, 0x2b9d, 0x2b9e, 0x2b9f, + 0x2ba0, 0x2ba1, 0x2ba2, 0x2ba3, 0x2ba4, 0x2ba5, 0x2ba6, 0x2ba7, + 0x2ba8, 0x2ba9, 0x2baa, 0x2bab, 0x2bac, 0x2bad, 0x2bae, 0x2baf, + 0x2bb0, 0x2bb1, 0x2bb2, 0x2bb3, 0x2bb4, 0x2bb5, 0x2bb6, 0x2bb7, + 0x2bb8, 0x2bb9, 0x2bba, 0x2bbb, 0x2bbc, 0x2bbd, 0x2bbe, 0x2bbf, + 0x2bc0, 0x2bc1, 0x2bc2, 0x2bc3, 0x2bc4, 0x2bc5, 0x2bc6, 0x2bc7, + 0x2bc8, 0x2bc9, 0x2bca, 0x2bcb, 0x2bcc, 0x2bcd, 0x2bce, 0x2bcf, + 0x2bd0, 0x2bd1, 0x2bd2, 0x2bd3, 0x2bd4, 0x2bd5, 0x2bd6, 0x2bd7, + 0x2bd8, 0x2bd9, 0x2bda, 0x2bdb, 0x2bdc, 0x2bdd, 0x2bde, 0x2bdf, + 0x2be0, 0x2be1, 0x2be2, 0x2be3, 0x2be4, 0x2be5, 0x2be6, 0x2be7, + 0x2be8, 0x2be9, 0x2bea, 0x2beb, 0x2bec, 0x2bed, 0x2bee, 0x2bef, + 0x2bf0, 0x2bf1, 0x2bf2, 0x2bf3, 0x2bf4, 0x2bf5, 0x2bf6, 0x2bf7, + 0x2bf8, 0x2bf9, 0x2bfa, 0x2bfb, 0x2bfc, 0x2bfd, 0x2bfe, 0x2bff, + 0x2c00, 0x2c01, 0x2c02, 0x2c03, 0x2c04, 0x2c05, 0x2c06, 0x2c07, + 0x2c08, 0x2c09, 0x2c0a, 0x2c0b, 0x2c0c, 0x2c0d, 0x2c0e, 0x2c0f, + 0x2c10, 0x2c11, 0x2c12, 0x2c13, 0x2c14, 0x2c15, 0x2c16, 0x2c17, + 0x2c18, 0x2c19, 0x2c1a, 0x2c1b, 0x2c1c, 0x2c1d, 0x2c1e, 0x2c1f, + 0x2c20, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, + 0x2c28, 0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, + 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, + 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, + 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, + 0x2c48, 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, + 0x2c50, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c57, + 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, + 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, + 0x2c68, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c6f, + 0x2c70, 0x2c71, 0x2c72, 0x2c73, 0x2c74, 0x2c75, 0x2c76, 0x2c77, + 0x2c78, 0x2c79, 0x2c7a, 0x2c7b, 0x2c7c, 0x2c7d, 0x2c7e, 0x2c7f, + 0x2c80, 0x2c81, 0x2c82, 0x2c83, 0x2c84, 0x2c85, 0x2c86, 0x2c87, + 0x2c88, 0x2c89, 0x2c8a, 0x2c8b, 0x2c8c, 0x2c8d, 0x2c8e, 0x2c8f, + 0x2c90, 0x2c91, 0x2c92, 0x2c93, 0x2c94, 0x2c95, 0x2c96, 0x2c97, + 0x2c98, 0x2c99, 0x2c9a, 0x2c9b, 0x2c9c, 0x2c9d, 0x2c9e, 0x2c9f, + 0x2ca0, 0x2ca1, 0x2ca2, 0x2ca3, 0x2ca4, 0x2ca5, 0x2ca6, 0x2ca7, + 0x2ca8, 0x2ca9, 0x2caa, 0x2cab, 0x2cac, 0x2cad, 0x2cae, 0x2caf, + 0x2cb0, 0x2cb1, 0x2cb2, 0x2cb3, 0x2cb4, 0x2cb5, 0x2cb6, 0x2cb7, + 0x2cb8, 0x2cb9, 0x2cba, 0x2cbb, 0x2cbc, 0x2cbd, 0x2cbe, 0x2cbf, + 0x2cc0, 0x2cc1, 0x2cc2, 0x2cc3, 0x2cc4, 0x2cc5, 0x2cc6, 0x2cc7, + 0x2cc8, 0x2cc9, 0x2cca, 0x2ccb, 0x2ccc, 0x2ccd, 0x2cce, 0x2ccf, + 0x2cd0, 0x2cd1, 0x2cd2, 0x2cd3, 0x2cd4, 0x2cd5, 0x2cd6, 0x2cd7, + 0x2cd8, 0x2cd9, 0x2cda, 0x2cdb, 0x2cdc, 0x2cdd, 0x2cde, 0x2cdf, + 0x2ce0, 0x2ce1, 0x2ce2, 0x2ce3, 0x2ce4, 0x2ce5, 0x2ce6, 0x2ce7, + 0x2ce8, 0x2ce9, 0x2cea, 0x2ceb, 0x2cec, 0x2ced, 0x2cee, 0x2cef, + 0x2cf0, 0x2cf1, 0x2cf2, 0x2cf3, 0x2cf4, 0x2cf5, 0x2cf6, 0x2cf7, + 0x2cf8, 0x2cf9, 0x2cfa, 0x2cfb, 0x2cfc, 0x2cfd, 0x2cfe, 0x2cff, + 0x2d00, 0x2d01, 0x2d02, 0x2d03, 0x2d04, 0x2d05, 0x2d06, 0x2d07, + 0x2d08, 0x2d09, 0x2d0a, 0x2d0b, 0x2d0c, 0x2d0d, 0x2d0e, 0x2d0f, + 0x2d10, 0x2d11, 0x2d12, 0x2d13, 0x2d14, 0x2d15, 0x2d16, 0x2d17, + 0x2d18, 0x2d19, 0x2d1a, 0x2d1b, 0x2d1c, 0x2d1d, 0x2d1e, 0x2d1f, + 0x2d20, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x2d26, 0x2d27, + 0x2d28, 0x2d29, 0x2d2a, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e, 0x2d2f, + 0x2d30, 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x2d35, 0x2d36, 0x2d37, + 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2d3e, 0x2d3f, + 0x2d40, 0x2d41, 0x2d42, 0x2d43, 0x2d44, 0x2d45, 0x2d46, 0x2d47, + 0x2d48, 0x2d49, 0x2d4a, 0x2d4b, 0x2d4c, 0x2d4d, 0x2d4e, 0x2d4f, + 0x2d50, 0x2d51, 0x2d52, 0x2d53, 0x2d54, 0x2d55, 0x2d56, 0x2d57, + 0x2d58, 0x2d59, 0x2d5a, 0x2d5b, 0x2d5c, 0x2d5d, 0x2d5e, 0x2d5f, + 0x2d60, 0x2d61, 0x2d62, 0x2d63, 0x2d64, 0x2d65, 0x2d66, 0x2d67, + 0x2d68, 0x2d69, 0x2d6a, 0x2d6b, 0x2d6c, 0x2d6d, 0x2d6e, 0x2d6f, + 0x2d70, 0x2d71, 0x2d72, 0x2d73, 0x2d74, 0x2d75, 0x2d76, 0x2d77, + 0x2d78, 0x2d79, 0x2d7a, 0x2d7b, 0x2d7c, 0x2d7d, 0x2d7e, 0x2d7f, + 0x2d80, 0x2d81, 0x2d82, 0x2d83, 0x2d84, 0x2d85, 0x2d86, 0x2d87, + 0x2d88, 0x2d89, 0x2d8a, 0x2d8b, 0x2d8c, 0x2d8d, 0x2d8e, 0x2d8f, + 0x2d90, 0x2d91, 0x2d92, 0x2d93, 0x2d94, 0x2d95, 0x2d96, 0x2d97, + 0x2d98, 0x2d99, 0x2d9a, 0x2d9b, 0x2d9c, 0x2d9d, 0x2d9e, 0x2d9f, + 0x2da0, 0x2da1, 0x2da2, 0x2da3, 0x2da4, 0x2da5, 0x2da6, 0x2da7, + 0x2da8, 0x2da9, 0x2daa, 0x2dab, 0x2dac, 0x2dad, 0x2dae, 0x2daf, + 0x2db0, 0x2db1, 0x2db2, 0x2db3, 0x2db4, 0x2db5, 0x2db6, 0x2db7, + 0x2db8, 0x2db9, 0x2dba, 0x2dbb, 0x2dbc, 0x2dbd, 0x2dbe, 0x2dbf, + 0x2dc0, 0x2dc1, 0x2dc2, 0x2dc3, 0x2dc4, 0x2dc5, 0x2dc6, 0x2dc7, + 0x2dc8, 0x2dc9, 0x2dca, 0x2dcb, 0x2dcc, 0x2dcd, 0x2dce, 0x2dcf, + 0x2dd0, 0x2dd1, 0x2dd2, 0x2dd3, 0x2dd4, 0x2dd5, 0x2dd6, 0x2dd7, + 0x2dd8, 0x2dd9, 0x2dda, 0x2ddb, 0x2ddc, 0x2ddd, 0x2dde, 0x2ddf, + 0x2de0, 0x2de1, 0x2de2, 0x2de3, 0x2de4, 0x2de5, 0x2de6, 0x2de7, + 0x2de8, 0x2de9, 0x2dea, 0x2deb, 0x2dec, 0x2ded, 0x2dee, 0x2def, + 0x2df0, 0x2df1, 0x2df2, 0x2df3, 0x2df4, 0x2df5, 0x2df6, 0x2df7, + 0x2df8, 0x2df9, 0x2dfa, 0x2dfb, 0x2dfc, 0x2dfd, 0x2dfe, 0x2dff, + 0x2e00, 0x2e01, 0x2e02, 0x2e03, 0x2e04, 0x2e05, 0x2e06, 0x2e07, + 0x2e08, 0x2e09, 0x2e0a, 0x2e0b, 0x2e0c, 0x2e0d, 0x2e0e, 0x2e0f, + 0x2e10, 0x2e11, 0x2e12, 0x2e13, 0x2e14, 0x2e15, 0x2e16, 0x2e17, + 0x2e18, 0x2e19, 0x2e1a, 0x2e1b, 0x2e1c, 0x2e1d, 0x2e1e, 0x2e1f, + 0x2e20, 0x2e21, 0x2e22, 0x2e23, 0x2e24, 0x2e25, 0x2e26, 0x2e27, + 0x2e28, 0x2e29, 0x2e2a, 0x2e2b, 0x2e2c, 0x2e2d, 0x2e2e, 0x2e2f, + 0x2e30, 0x2e31, 0x2e32, 0x2e33, 0x2e34, 0x2e35, 0x2e36, 0x2e37, + 0x2e38, 0x2e39, 0x2e3a, 0x2e3b, 0x2e3c, 0x2e3d, 0x2e3e, 0x2e3f, + 0x2e40, 0x2e41, 0x2e42, 0x2e43, 0x2e44, 0x2e45, 0x2e46, 0x2e47, + 0x2e48, 0x2e49, 0x2e4a, 0x2e4b, 0x2e4c, 0x2e4d, 0x2e4e, 0x2e4f, + 0x2e50, 0x2e51, 0x2e52, 0x2e53, 0x2e54, 0x2e55, 0x2e56, 0x2e57, + 0x2e58, 0x2e59, 0x2e5a, 0x2e5b, 0x2e5c, 0x2e5d, 0x2e5e, 0x2e5f, + 0x2e60, 0x2e61, 0x2e62, 0x2e63, 0x2e64, 0x2e65, 0x2e66, 0x2e67, + 0x2e68, 0x2e69, 0x2e6a, 0x2e6b, 0x2e6c, 0x2e6d, 0x2e6e, 0x2e6f, + 0x2e70, 0x2e71, 0x2e72, 0x2e73, 0x2e74, 0x2e75, 0x2e76, 0x2e77, + 0x2e78, 0x2e79, 0x2e7a, 0x2e7b, 0x2e7c, 0x2e7d, 0x2e7e, 0x2e7f, + 0x2e80, 0x2e81, 0x2e82, 0x2e83, 0x2e84, 0x2e85, 0x2e86, 0x2e87, + 0x2e88, 0x2e89, 0x2e8a, 0x2e8b, 0x2e8c, 0x2e8d, 0x2e8e, 0x2e8f, + 0x2e90, 0x2e91, 0x2e92, 0x2e93, 0x2e94, 0x2e95, 0x2e96, 0x2e97, + 0x2e98, 0x2e99, 0x2e9a, 0x2e9b, 0x2e9c, 0x2e9d, 0x2e9e, 0x2e9f, + 0x2ea0, 0x2ea1, 0x2ea2, 0x2ea3, 0x2ea4, 0x2ea5, 0x2ea6, 0x2ea7, + 0x2ea8, 0x2ea9, 0x2eaa, 0x2eab, 0x2eac, 0x2ead, 0x2eae, 0x2eaf, + 0x2eb0, 0x2eb1, 0x2eb2, 0x2eb3, 0x2eb4, 0x2eb5, 0x2eb6, 0x2eb7, + 0x2eb8, 0x2eb9, 0x2eba, 0x2ebb, 0x2ebc, 0x2ebd, 0x2ebe, 0x2ebf, + 0x2ec0, 0x2ec1, 0x2ec2, 0x2ec3, 0x2ec4, 0x2ec5, 0x2ec6, 0x2ec7, + 0x2ec8, 0x2ec9, 0x2eca, 0x2ecb, 0x2ecc, 0x2ecd, 0x2ece, 0x2ecf, + 0x2ed0, 0x2ed1, 0x2ed2, 0x2ed3, 0x2ed4, 0x2ed5, 0x2ed6, 0x2ed7, + 0x2ed8, 0x2ed9, 0x2eda, 0x2edb, 0x2edc, 0x2edd, 0x2ede, 0x2edf, + 0x2ee0, 0x2ee1, 0x2ee2, 0x2ee3, 0x2ee4, 0x2ee5, 0x2ee6, 0x2ee7, + 0x2ee8, 0x2ee9, 0x2eea, 0x2eeb, 0x2eec, 0x2eed, 0x2eee, 0x2eef, + 0x2ef0, 0x2ef1, 0x2ef2, 0x2ef3, 0x2ef4, 0x2ef5, 0x2ef6, 0x2ef7, + 0x2ef8, 0x2ef9, 0x2efa, 0x2efb, 0x2efc, 0x2efd, 0x2efe, 0x2eff, + 0x2f00, 0x2f01, 0x2f02, 0x2f03, 0x2f04, 0x2f05, 0x2f06, 0x2f07, + 0x2f08, 0x2f09, 0x2f0a, 0x2f0b, 0x2f0c, 0x2f0d, 0x2f0e, 0x2f0f, + 0x2f10, 0x2f11, 0x2f12, 0x2f13, 0x2f14, 0x2f15, 0x2f16, 0x2f17, + 0x2f18, 0x2f19, 0x2f1a, 0x2f1b, 0x2f1c, 0x2f1d, 0x2f1e, 0x2f1f, + 0x2f20, 0x2f21, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f26, 0x2f27, + 0x2f28, 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f2d, 0x2f2e, 0x2f2f, + 0x2f30, 0x2f31, 0x2f32, 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, + 0x2f38, 0x2f39, 0x2f3a, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3f, + 0x2f40, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f46, 0x2f47, + 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, + 0x2f50, 0x2f51, 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f57, + 0x2f58, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5d, 0x2f5e, 0x2f5f, + 0x2f60, 0x2f61, 0x2f62, 0x2f63, 0x2f64, 0x2f65, 0x2f66, 0x2f67, + 0x2f68, 0x2f69, 0x2f6a, 0x2f6b, 0x2f6c, 0x2f6d, 0x2f6e, 0x2f6f, + 0x2f70, 0x2f71, 0x2f72, 0x2f73, 0x2f74, 0x2f75, 0x2f76, 0x2f77, + 0x2f78, 0x2f79, 0x2f7a, 0x2f7b, 0x2f7c, 0x2f7d, 0x2f7e, 0x2f7f, + 0x2f80, 0x2f81, 0x2f82, 0x2f83, 0x2f84, 0x2f85, 0x2f86, 0x2f87, + 0x2f88, 0x2f89, 0x2f8a, 0x2f8b, 0x2f8c, 0x2f8d, 0x2f8e, 0x2f8f, + 0x2f90, 0x2f91, 0x2f92, 0x2f93, 0x2f94, 0x2f95, 0x2f96, 0x2f97, + 0x2f98, 0x2f99, 0x2f9a, 0x2f9b, 0x2f9c, 0x2f9d, 0x2f9e, 0x2f9f, + 0x2fa0, 0x2fa1, 0x2fa2, 0x2fa3, 0x2fa4, 0x2fa5, 0x2fa6, 0x2fa7, + 0x2fa8, 0x2fa9, 0x2faa, 0x2fab, 0x2fac, 0x2fad, 0x2fae, 0x2faf, + 0x2fb0, 0x2fb1, 0x2fb2, 0x2fb3, 0x2fb4, 0x2fb5, 0x2fb6, 0x2fb7, + 0x2fb8, 0x2fb9, 0x2fba, 0x2fbb, 0x2fbc, 0x2fbd, 0x2fbe, 0x2fbf, + 0x2fc0, 0x2fc1, 0x2fc2, 0x2fc3, 0x2fc4, 0x2fc5, 0x2fc6, 0x2fc7, + 0x2fc8, 0x2fc9, 0x2fca, 0x2fcb, 0x2fcc, 0x2fcd, 0x2fce, 0x2fcf, + 0x2fd0, 0x2fd1, 0x2fd2, 0x2fd3, 0x2fd4, 0x2fd5, 0x2fd6, 0x2fd7, + 0x2fd8, 0x2fd9, 0x2fda, 0x2fdb, 0x2fdc, 0x2fdd, 0x2fde, 0x2fdf, + 0x2fe0, 0x2fe1, 0x2fe2, 0x2fe3, 0x2fe4, 0x2fe5, 0x2fe6, 0x2fe7, + 0x2fe8, 0x2fe9, 0x2fea, 0x2feb, 0x2fec, 0x2fed, 0x2fee, 0x2fef, + 0x2ff0, 0x2ff1, 0x2ff2, 0x2ff3, 0x2ff4, 0x2ff5, 0x2ff6, 0x2ff7, + 0x2ff8, 0x2ff9, 0x2ffa, 0x2ffb, 0x2ffc, 0x2ffd, 0x2ffe, 0x2fff, + 0x3000, 0x3001, 0x3002, 0x3003, 0x3004, 0x3005, 0x3006, 0x3007, + 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, + 0x3010, 0x3011, 0x3012, 0x3013, 0x3014, 0x3015, 0x3016, 0x3017, + 0x3018, 0x3019, 0x301a, 0x301b, 0x301c, 0x301d, 0x301e, 0x301f, + 0x3020, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e, 0x302f, + 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, + 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e, 0x303f, + 0x3040, 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, 0x3094, 0x3095, 0x3096, 0x3097, + 0x3098, 0x3099, 0x309a, 0x309b, 0x309c, 0x309d, 0x309e, 0x309f, + 0x30a0, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, + 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, + 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, + 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, + 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, + 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, + 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, + 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, + 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, + 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, + 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x30f7, + 0x30f8, 0x30f9, 0x30fa, 0x30fb, 0x30fc, 0x30fd, 0x30fe, 0x30ff, + 0x3100, 0x3101, 0x3102, 0x3103, 0x3104, 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, 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, + 0x3130, 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, 0x3164, 0x3165, 0x3166, 0x3167, + 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, + 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, + 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, + 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, + 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, 0x318f, + 0x3190, 0x3191, 0x3192, 0x3193, 0x3194, 0x3195, 0x3196, 0x3197, + 0x3198, 0x3199, 0x319a, 0x319b, 0x319c, 0x319d, 0x319e, 0x319f, + 0x31a0, 0x31a1, 0x31a2, 0x31a3, 0x31a4, 0x31a5, 0x31a6, 0x31a7, + 0x31a8, 0x31a9, 0x31aa, 0x31ab, 0x31ac, 0x31ad, 0x31ae, 0x31af, + 0x31b0, 0x31b1, 0x31b2, 0x31b3, 0x31b4, 0x31b5, 0x31b6, 0x31b7, + 0x31b8, 0x31b9, 0x31ba, 0x31bb, 0x31bc, 0x31bd, 0x31be, 0x31bf, + 0x31c0, 0x31c1, 0x31c2, 0x31c3, 0x31c4, 0x31c5, 0x31c6, 0x31c7, + 0x31c8, 0x31c9, 0x31ca, 0x31cb, 0x31cc, 0x31cd, 0x31ce, 0x31cf, + 0x31d0, 0x31d1, 0x31d2, 0x31d3, 0x31d4, 0x31d5, 0x31d6, 0x31d7, + 0x31d8, 0x31d9, 0x31da, 0x31db, 0x31dc, 0x31dd, 0x31de, 0x31df, + 0x31e0, 0x31e1, 0x31e2, 0x31e3, 0x31e4, 0x31e5, 0x31e6, 0x31e7, + 0x31e8, 0x31e9, 0x31ea, 0x31eb, 0x31ec, 0x31ed, 0x31ee, 0x31ef, + 0x31f0, 0x31f1, 0x31f2, 0x31f3, 0x31f4, 0x31f5, 0x31f6, 0x31f7, + 0x31f8, 0x31f9, 0x31fa, 0x31fb, 0x31fc, 0x31fd, 0x31fe, 0x31ff, + 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, 0x321c, 0x321d, 0x321e, 0x321f, + 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, + 0x3228, 0x3229, 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, + 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, + 0x3238, 0x3239, 0x323a, 0x323b, 0x323c, 0x323d, 0x323e, 0x323f, + 0x3240, 0x3241, 0x3242, 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, + 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, + 0x3250, 0x3251, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, + 0x3258, 0x3259, 0x325a, 0x325b, 0x325c, 0x325d, 0x325e, 0x325f, + 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, + 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, + 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, + 0x3278, 0x3279, 0x327a, 0x327b, 0x327c, 0x327d, 0x327e, 0x327f, + 0x3280, 0x3281, 0x3282, 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, + 0x3288, 0x3289, 0x328a, 0x328b, 0x328c, 0x328d, 0x328e, 0x328f, + 0x3290, 0x3291, 0x3292, 0x3293, 0x3294, 0x3295, 0x3296, 0x3297, + 0x3298, 0x3299, 0x329a, 0x329b, 0x329c, 0x329d, 0x329e, 0x329f, + 0x32a0, 0x32a1, 0x32a2, 0x32a3, 0x32a4, 0x32a5, 0x32a6, 0x32a7, + 0x32a8, 0x32a9, 0x32aa, 0x32ab, 0x32ac, 0x32ad, 0x32ae, 0x32af, + 0x32b0, 0x32b1, 0x32b2, 0x32b3, 0x32b4, 0x32b5, 0x32b6, 0x32b7, + 0x32b8, 0x32b9, 0x32ba, 0x32bb, 0x32bc, 0x32bd, 0x32be, 0x32bf, + 0x32c0, 0x32c1, 0x32c2, 0x32c3, 0x32c4, 0x32c5, 0x32c6, 0x32c7, + 0x32c8, 0x32c9, 0x32ca, 0x32cb, 0x32cc, 0x32cd, 0x32ce, 0x32cf, + 0x32d0, 0x32d1, 0x32d2, 0x32d3, 0x32d4, 0x32d5, 0x32d6, 0x32d7, + 0x32d8, 0x32d9, 0x32da, 0x32db, 0x32dc, 0x32dd, 0x32de, 0x32df, + 0x32e0, 0x32e1, 0x32e2, 0x32e3, 0x32e4, 0x32e5, 0x32e6, 0x32e7, + 0x32e8, 0x32e9, 0x32ea, 0x32eb, 0x32ec, 0x32ed, 0x32ee, 0x32ef, + 0x32f0, 0x32f1, 0x32f2, 0x32f3, 0x32f4, 0x32f5, 0x32f6, 0x32f7, + 0x32f8, 0x32f9, 0x32fa, 0x32fb, 0x32fc, 0x32fd, 0x32fe, 0x32ff, + 0x3300, 0x3301, 0x3302, 0x3303, 0x3304, 0x3305, 0x3306, 0x3307, + 0x3308, 0x3309, 0x330a, 0x330b, 0x330c, 0x330d, 0x330e, 0x330f, + 0x3310, 0x3311, 0x3312, 0x3313, 0x3314, 0x3315, 0x3316, 0x3317, + 0x3318, 0x3319, 0x331a, 0x331b, 0x331c, 0x331d, 0x331e, 0x331f, + 0x3320, 0x3321, 0x3322, 0x3323, 0x3324, 0x3325, 0x3326, 0x3327, + 0x3328, 0x3329, 0x332a, 0x332b, 0x332c, 0x332d, 0x332e, 0x332f, + 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, + 0x3338, 0x3339, 0x333a, 0x333b, 0x333c, 0x333d, 0x333e, 0x333f, + 0x3340, 0x3341, 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, 0x3347, + 0x3348, 0x3349, 0x334a, 0x334b, 0x334c, 0x334d, 0x334e, 0x334f, + 0x3350, 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, 0x3356, 0x3357, + 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, + 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, + 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, + 0x3370, 0x3371, 0x3372, 0x3373, 0x3374, 0x3375, 0x3376, 0x3377, + 0x3378, 0x3379, 0x337a, 0x337b, 0x337c, 0x337d, 0x337e, 0x337f, + 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x3385, 0x3386, 0x3387, + 0x3388, 0x3389, 0x338a, 0x338b, 0x338c, 0x338d, 0x338e, 0x338f, + 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x3395, 0x3396, 0x3397, + 0x3398, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, + 0x33a0, 0x33a1, 0x33a2, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x33a7, + 0x33a8, 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33ad, 0x33ae, 0x33af, + 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, + 0x33b8, 0x33b9, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, + 0x33c0, 0x33c1, 0x33c2, 0x33c3, 0x33c4, 0x33c5, 0x33c6, 0x33c7, + 0x33c8, 0x33c9, 0x33ca, 0x33cb, 0x33cc, 0x33cd, 0x33ce, 0x33cf, + 0x33d0, 0x33d1, 0x33d2, 0x33d3, 0x33d4, 0x33d5, 0x33d6, 0x33d7, + 0x33d8, 0x33d9, 0x33da, 0x33db, 0x33dc, 0x33dd, 0x33de, 0x33df, + 0x33e0, 0x33e1, 0x33e2, 0x33e3, 0x33e4, 0x33e5, 0x33e6, 0x33e7, + 0x33e8, 0x33e9, 0x33ea, 0x33eb, 0x33ec, 0x33ed, 0x33ee, 0x33ef, + 0x33f0, 0x33f1, 0x33f2, 0x33f3, 0x33f4, 0x33f5, 0x33f6, 0x33f7, + 0x33f8, 0x33f9, 0x33fa, 0x33fb, 0x33fc, 0x33fd, 0x33fe, 0x33ff, + 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406, 0x3407, + 0x3408, 0x3409, 0x340a, 0x340b, 0x340c, 0x340d, 0x340e, 0x340f, + 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416, 0x3417, + 0x3418, 0x3419, 0x341a, 0x341b, 0x341c, 0x341d, 0x341e, 0x341f, + 0x3420, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, + 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e, 0x342f, + 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, + 0x3438, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e, 0x343f, + 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, 0x3447, + 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e, 0x344f, + 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, + 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e, 0x345f, + 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, + 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e, 0x346f, + 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476, 0x3477, + 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e, 0x347f, + 0x3480, 0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, 0x3487, + 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, 0x359e, 0x359f, + 0x35a0, 0x35a1, 0x35a2, 0x35a3, 0x35a4, 0x35a5, 0x35a6, 0x35a7, + 0x35a8, 0x35a9, 0x35aa, 0x35ab, 0x35ac, 0x35ad, 0x35ae, 0x35af, + 0x35b0, 0x35b1, 0x35b2, 0x35b3, 0x35b4, 0x35b5, 0x35b6, 0x35b7, + 0x35b8, 0x35b9, 0x35ba, 0x35bb, 0x35bc, 0x35bd, 0x35be, 0x35bf, + 0x35c0, 0x35c1, 0x35c2, 0x35c3, 0x35c4, 0x35c5, 0x35c6, 0x35c7, + 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, 0x360e, 0x360f, + 0x3610, 0x3611, 0x3612, 0x3613, 0x3614, 0x3615, 0x3616, 0x3617, + 0x3618, 0x3619, 0x361a, 0x361b, 0x361c, 0x361d, 0x361e, 0x361f, + 0x3620, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, + 0x3628, 0x3629, 0x362a, 0x362b, 0x362c, 0x362d, 0x362e, 0x362f, + 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, + 0x3638, 0x3639, 0x363a, 0x363b, 0x363c, 0x363d, 0x363e, 0x363f, + 0x3640, 0x3641, 0x3642, 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, + 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, + 0x3918, 0x3919, 0x391a, 0x391b, 0x391c, 0x391d, 0x391e, 0x391f, + 0x3920, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, + 0x3928, 0x3929, 0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, + 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, + 0x3938, 0x3939, 0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, + 0x3940, 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, + 0x3948, 0x3949, 0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, + 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, + 0x3958, 0x3959, 0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, + 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, + 0x3968, 0x3969, 0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, + 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, + 0x3978, 0x3979, 0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x397f, + 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985, 0x3986, 0x3987, + 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, 0x39cf, + 0x39d0, 0x39d1, 0x39d2, 0x39d3, 0x39d4, 0x39d5, 0x39d6, 0x39d7, + 0x39d8, 0x39d9, 0x39da, 0x39db, 0x39dc, 0x39dd, 0x39de, 0x39df, + 0x39e0, 0x39e1, 0x39e2, 0x39e3, 0x39e4, 0x39e5, 0x39e6, 0x39e7, + 0x39e8, 0x39e9, 0x39ea, 0x39eb, 0x39ec, 0x39ed, 0x39ee, 0x39ef, + 0x39f0, 0x39f1, 0x39f2, 0x39f3, 0x39f4, 0x39f5, 0x39f6, 0x39f7, + 0x39f8, 0x39f9, 0x39fa, 0x39fb, 0x39fc, 0x39fd, 0x39fe, 0x39ff, + 0x3a00, 0x3a01, 0x3a02, 0x3a03, 0x3a04, 0x3a05, 0x3a06, 0x3a07, + 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, 0x3a73, 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, 0x3b4e, 0x3b4f, + 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b54, 0x3b55, 0x3b56, 0x3b57, + 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, 0x3b5f, + 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, 0x3b67, + 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, 0x3b6f, + 0x3b70, 0x3b71, 0x3b72, 0x3b73, 0x3b74, 0x3b75, 0x3b76, 0x3b77, + 0x3b78, 0x3b79, 0x3b7a, 0x3b7b, 0x3b7c, 0x3b7d, 0x3b7e, 0x3b7f, + 0x3b80, 0x3b81, 0x3b82, 0x3b83, 0x3b84, 0x3b85, 0x3b86, 0x3b87, + 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, 0x3c6e, 0x3c6f, + 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76, 0x3c77, + 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e, 0x3c7f, + 0x3c80, 0x3c81, 0x3c82, 0x3c83, 0x3c84, 0x3c85, 0x3c86, 0x3c87, + 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, + 0x3ce0, 0x3ce1, 0x3ce2, 0x3ce3, 0x3ce4, 0x3ce5, 0x3ce6, 0x3ce7, + 0x3ce8, 0x3ce9, 0x3cea, 0x3ceb, 0x3cec, 0x3ced, 0x3cee, 0x3cef, + 0x3cf0, 0x3cf1, 0x3cf2, 0x3cf3, 0x3cf4, 0x3cf5, 0x3cf6, 0x3cf7, + 0x3cf8, 0x3cf9, 0x3cfa, 0x3cfb, 0x3cfc, 0x3cfd, 0x3cfe, 0x3cff, + 0x3d00, 0x3d01, 0x3d02, 0x3d03, 0x3d04, 0x3d05, 0x3d06, 0x3d07, + 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, 0x4056, 0x4057, + 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e, 0x405f, + 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, + 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e, 0x406f, + 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, + 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e, 0x407f, + 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085, 0x4086, 0x4087, + 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, 0x415f, + 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, + 0x4168, 0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, + 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, + 0x4178, 0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x417f, + 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, 0x4185, 0x4186, 0x4187, + 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, 0x4337, + 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, 0x43ac, 0x43ad, 0x43ae, 0x43af, + 0x43b0, 0x43b1, 0x43b2, 0x43b3, 0x43b4, 0x43b5, 0x43b6, 0x43b7, + 0x43b8, 0x43b9, 0x43ba, 0x43bb, 0x43bc, 0x43bd, 0x43be, 0x43bf, + 0x43c0, 0x43c1, 0x43c2, 0x43c3, 0x43c4, 0x43c5, 0x43c6, 0x43c7, + 0x43c8, 0x43c9, 0x43ca, 0x43cb, 0x43cc, 0x43cd, 0x43ce, 0x43cf, + 0x43d0, 0x43d1, 0x43d2, 0x43d3, 0x43d4, 0x43d5, 0x43d6, 0x43d7, + 0x43d8, 0x43d9, 0x43da, 0x43db, 0x43dc, 0x43dd, 0x43de, 0x43df, + 0x43e0, 0x43e1, 0x43e2, 0x43e3, 0x43e4, 0x43e5, 0x43e6, 0x43e7, + 0x43e8, 0x43e9, 0x43ea, 0x43eb, 0x43ec, 0x43ed, 0x43ee, 0x43ef, + 0x43f0, 0x43f1, 0x43f2, 0x43f3, 0x43f4, 0x43f5, 0x43f6, 0x43f7, + 0x43f8, 0x43f9, 0x43fa, 0x43fb, 0x43fc, 0x43fd, 0x43fe, 0x43ff, + 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, + 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, 0x44d6, 0x44d7, + 0x44d8, 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44de, 0x44df, + 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e4, 0x44e5, 0x44e6, 0x44e7, + 0x44e8, 0x44e9, 0x44ea, 0x44eb, 0x44ec, 0x44ed, 0x44ee, 0x44ef, + 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f4, 0x44f5, 0x44f6, 0x44f7, + 0x44f8, 0x44f9, 0x44fa, 0x44fb, 0x44fc, 0x44fd, 0x44fe, 0x44ff, + 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, 0x4505, 0x4506, 0x4507, + 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, 0x464c, 0x464d, 0x464e, 0x464f, + 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, + 0x4658, 0x4659, 0x465a, 0x465b, 0x465c, 0x465d, 0x465e, 0x465f, + 0x4660, 0x4661, 0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, + 0x4668, 0x4669, 0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, + 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, + 0x4678, 0x4679, 0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x467f, + 0x4680, 0x4681, 0x4682, 0x4683, 0x4684, 0x4685, 0x4686, 0x4687, + 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, 0x4723, 0x4724, 0x4725, 0x4726, 0x4727, + 0x4728, 0x4729, 0x472a, 0x472b, 0x472c, 0x472d, 0x472e, 0x472f, + 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737, + 0x4738, 0x4739, 0x473a, 0x473b, 0x473c, 0x473d, 0x473e, 0x473f, + 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, + 0x4748, 0x4749, 0x474a, 0x474b, 0x474c, 0x474d, 0x474e, 0x474f, + 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, + 0x4758, 0x4759, 0x475a, 0x475b, 0x475c, 0x475d, 0x475e, 0x475f, + 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767, + 0x4768, 0x4769, 0x476a, 0x476b, 0x476c, 0x476d, 0x476e, 0x476f, + 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777, + 0x4778, 0x4779, 0x477a, 0x477b, 0x477c, 0x477d, 0x477e, 0x477f, + 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, + 0x4788, 0x4789, 0x478a, 0x478b, 0x478c, 0x478d, 0x478e, 0x478f, + 0x4790, 0x4791, 0x4792, 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, + 0x4798, 0x4799, 0x479a, 0x479b, 0x479c, 0x479d, 0x479e, 0x479f, + 0x47a0, 0x47a1, 0x47a2, 0x47a3, 0x47a4, 0x47a5, 0x47a6, 0x47a7, + 0x47a8, 0x47a9, 0x47aa, 0x47ab, 0x47ac, 0x47ad, 0x47ae, 0x47af, + 0x47b0, 0x47b1, 0x47b2, 0x47b3, 0x47b4, 0x47b5, 0x47b6, 0x47b7, + 0x47b8, 0x47b9, 0x47ba, 0x47bb, 0x47bc, 0x47bd, 0x47be, 0x47bf, + 0x47c0, 0x47c1, 0x47c2, 0x47c3, 0x47c4, 0x47c5, 0x47c6, 0x47c7, + 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, 0x4947, + 0x4948, 0x4949, 0x494a, 0x494b, 0x494c, 0x494d, 0x494e, 0x494f, + 0x4950, 0x4951, 0x4952, 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, + 0x4958, 0x4959, 0x495a, 0x495b, 0x495c, 0x495d, 0x495e, 0x495f, + 0x4960, 0x4961, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, + 0x4968, 0x4969, 0x496a, 0x496b, 0x496c, 0x496d, 0x496e, 0x496f, + 0x4970, 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, + 0x4978, 0x4979, 0x497a, 0x497b, 0x497c, 0x497d, 0x497e, 0x497f, + 0x4980, 0x4981, 0x4982, 0x4983, 0x4984, 0x4985, 0x4986, 0x4987, + 0x4988, 0x4989, 0x498a, 0x498b, 0x498c, 0x498d, 0x498e, 0x498f, + 0x4990, 0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, + 0x4998, 0x4999, 0x499a, 0x499b, 0x499c, 0x499d, 0x499e, 0x499f, + 0x49a0, 0x49a1, 0x49a2, 0x49a3, 0x49a4, 0x49a5, 0x49a6, 0x49a7, + 0x49a8, 0x49a9, 0x49aa, 0x49ab, 0x49ac, 0x49ad, 0x49ae, 0x49af, + 0x49b0, 0x49b1, 0x49b2, 0x49b3, 0x49b4, 0x49b5, 0x49b6, 0x49b7, + 0x49b8, 0x49b9, 0x49ba, 0x49bb, 0x49bc, 0x49bd, 0x49be, 0x49bf, + 0x49c0, 0x49c1, 0x49c2, 0x49c3, 0x49c4, 0x49c5, 0x49c6, 0x49c7, + 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, 0x4c77, + 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, 0x4c9f, + 0x4ca0, 0x4ca1, 0x4ca2, 0x4ca3, 0x4ca4, 0x4ca5, 0x4ca6, 0x4ca7, + 0x4ca8, 0x4ca9, 0x4caa, 0x4cab, 0x4cac, 0x4cad, 0x4cae, 0x4caf, + 0x4cb0, 0x4cb1, 0x4cb2, 0x4cb3, 0x4cb4, 0x4cb5, 0x4cb6, 0x4cb7, + 0x4cb8, 0x4cb9, 0x4cba, 0x4cbb, 0x4cbc, 0x4cbd, 0x4cbe, 0x4cbf, + 0x4cc0, 0x4cc1, 0x4cc2, 0x4cc3, 0x4cc4, 0x4cc5, 0x4cc6, 0x4cc7, + 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, 0x4d13, 0x4d14, 0x4d15, 0x4d16, 0x4d17, + 0x4d18, 0x4d19, 0x4d1a, 0x4d1b, 0x4d1c, 0x4d1d, 0x4d1e, 0x4d1f, + 0x4d20, 0x4d21, 0x4d22, 0x4d23, 0x4d24, 0x4d25, 0x4d26, 0x4d27, + 0x4d28, 0x4d29, 0x4d2a, 0x4d2b, 0x4d2c, 0x4d2d, 0x4d2e, 0x4d2f, + 0x4d30, 0x4d31, 0x4d32, 0x4d33, 0x4d34, 0x4d35, 0x4d36, 0x4d37, + 0x4d38, 0x4d39, 0x4d3a, 0x4d3b, 0x4d3c, 0x4d3d, 0x4d3e, 0x4d3f, + 0x4d40, 0x4d41, 0x4d42, 0x4d43, 0x4d44, 0x4d45, 0x4d46, 0x4d47, + 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, 0x4dae, 0x4daf, + 0x4db0, 0x4db1, 0x4db2, 0x4db3, 0x4db4, 0x4db5, 0x4db6, 0x4db7, + 0x4db8, 0x4db9, 0x4dba, 0x4dbb, 0x4dbc, 0x4dbd, 0x4dbe, 0x4dbf, + 0x4dc0, 0x4dc1, 0x4dc2, 0x4dc3, 0x4dc4, 0x4dc5, 0x4dc6, 0x4dc7, + 0x4dc8, 0x4dc9, 0x4dca, 0x4dcb, 0x4dcc, 0x4dcd, 0x4dce, 0x4dcf, + 0x4dd0, 0x4dd1, 0x4dd2, 0x4dd3, 0x4dd4, 0x4dd5, 0x4dd6, 0x4dd7, + 0x4dd8, 0x4dd9, 0x4dda, 0x4ddb, 0x4ddc, 0x4ddd, 0x4dde, 0x4ddf, + 0x4de0, 0x4de1, 0x4de2, 0x4de3, 0x4de4, 0x4de5, 0x4de6, 0x4de7, + 0x4de8, 0x4de9, 0x4dea, 0x4deb, 0x4dec, 0x4ded, 0x4dee, 0x4def, + 0x4df0, 0x4df1, 0x4df2, 0x4df3, 0x4df4, 0x4df5, 0x4df6, 0x4df7, + 0x4df8, 0x4df9, 0x4dfa, 0x4dfb, 0x4dfc, 0x4dfd, 0x4dfe, 0x4dff, + 0x4e00, 0x4e01, 0x4e02, 0x4e03, 0x4e04, 0x4e05, 0x4e06, 0x4e07, + 0x4e08, 0x4e09, 0x4e0a, 0x4e0b, 0x4e0c, 0x4e0d, 0x4e0e, 0x4e0f, + 0x4e10, 0x4e11, 0x4e12, 0x4e13, 0x4e14, 0x4e15, 0x4e16, 0x4e17, + 0x4e18, 0x4e19, 0x4e1a, 0x4e1b, 0x4e1c, 0x4e1d, 0x4e1e, 0x4e1f, + 0x4e20, 0x4e21, 0x4e22, 0x4e23, 0x4e24, 0x4e25, 0x4e26, 0x4e27, + 0x4e28, 0x4e29, 0x4e2a, 0x4e2b, 0x4e2c, 0x4e2d, 0x4e2e, 0x4e2f, + 0x4e30, 0x4e31, 0x4e32, 0x4e33, 0x4e34, 0x4e35, 0x4e36, 0x4e37, + 0x4e38, 0x4e39, 0x4e3a, 0x4e3b, 0x4e3c, 0x4e3d, 0x4e3e, 0x4e3f, + 0x4e40, 0x4e41, 0x4e42, 0x4e43, 0x4e44, 0x4e45, 0x4e46, 0x4e47, + 0x4e48, 0x4e49, 0x4e4a, 0x4e4b, 0x4e4c, 0x4e4d, 0x4e4e, 0x4e4f, + 0x4e50, 0x4e51, 0x4e52, 0x4e53, 0x4e54, 0x4e55, 0x4e56, 0x4e57, + 0x4e58, 0x4e59, 0x4e5a, 0x4e5b, 0x4e5c, 0x4e5d, 0x4e5e, 0x4e5f, + 0x4e60, 0x4e61, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e66, 0x4e67, + 0x4e68, 0x4e69, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, + 0x4e70, 0x4e71, 0x4e72, 0x4e73, 0x4e74, 0x4e75, 0x4e76, 0x4e77, + 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7e, 0x4e7f, + 0x4e80, 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e86, 0x4e87, + 0x4e88, 0x4e89, 0x4e8a, 0x4e8b, 0x4e8c, 0x4e8d, 0x4e8e, 0x4e8f, + 0x4e90, 0x4e91, 0x4e92, 0x4e93, 0x4e94, 0x4e95, 0x4e96, 0x4e97, + 0x4e98, 0x4e99, 0x4e9a, 0x4e9b, 0x4e9c, 0x4e9d, 0x4e9e, 0x4e9f, + 0x4ea0, 0x4ea1, 0x4ea2, 0x4ea3, 0x4ea4, 0x4ea5, 0x4ea6, 0x4ea7, + 0x4ea8, 0x4ea9, 0x4eaa, 0x4eab, 0x4eac, 0x4ead, 0x4eae, 0x4eaf, + 0x4eb0, 0x4eb1, 0x4eb2, 0x4eb3, 0x4eb4, 0x4eb5, 0x4eb6, 0x4eb7, + 0x4eb8, 0x4eb9, 0x4eba, 0x4ebb, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ebf, + 0x4ec0, 0x4ec1, 0x4ec2, 0x4ec3, 0x4ec4, 0x4ec5, 0x4ec6, 0x4ec7, + 0x4ec8, 0x4ec9, 0x4eca, 0x4ecb, 0x4ecc, 0x4ecd, 0x4ece, 0x4ecf, + 0x4ed0, 0x4ed1, 0x4ed2, 0x4ed3, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, + 0x4ed8, 0x4ed9, 0x4eda, 0x4edb, 0x4edc, 0x4edd, 0x4ede, 0x4edf, + 0x4ee0, 0x4ee1, 0x4ee2, 0x4ee3, 0x4ee4, 0x4ee5, 0x4ee6, 0x4ee7, + 0x4ee8, 0x4ee9, 0x4eea, 0x4eeb, 0x4eec, 0x4eed, 0x4eee, 0x4eef, + 0x4ef0, 0x4ef1, 0x4ef2, 0x4ef3, 0x4ef4, 0x4ef5, 0x4ef6, 0x4ef7, + 0x4ef8, 0x4ef9, 0x4efa, 0x4efb, 0x4efc, 0x4efd, 0x4efe, 0x4eff, + 0x4f00, 0x4f01, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, 0x4f07, + 0x4f08, 0x4f09, 0x4f0a, 0x4f0b, 0x4f0c, 0x4f0d, 0x4f0e, 0x4f0f, + 0x4f10, 0x4f11, 0x4f12, 0x4f13, 0x4f14, 0x4f15, 0x4f16, 0x4f17, + 0x4f18, 0x4f19, 0x4f1a, 0x4f1b, 0x4f1c, 0x4f1d, 0x4f1e, 0x4f1f, + 0x4f20, 0x4f21, 0x4f22, 0x4f23, 0x4f24, 0x4f25, 0x4f26, 0x4f27, + 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f2f, + 0x4f30, 0x4f31, 0x4f32, 0x4f33, 0x4f34, 0x4f35, 0x4f36, 0x4f37, + 0x4f38, 0x4f39, 0x4f3a, 0x4f3b, 0x4f3c, 0x4f3d, 0x4f3e, 0x4f3f, + 0x4f40, 0x4f41, 0x4f42, 0x4f43, 0x4f44, 0x4f45, 0x4f46, 0x4f47, + 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f4d, 0x4f4e, 0x4f4f, + 0x4f50, 0x4f51, 0x4f52, 0x4f53, 0x4f54, 0x4f55, 0x4f56, 0x4f57, + 0x4f58, 0x4f59, 0x4f5a, 0x4f5b, 0x4f5c, 0x4f5d, 0x4f5e, 0x4f5f, + 0x4f60, 0x4f61, 0x4f62, 0x4f63, 0x4f64, 0x4f65, 0x4f66, 0x4f67, + 0x4f68, 0x4f69, 0x4f6a, 0x4f6b, 0x4f6c, 0x4f6d, 0x4f6e, 0x4f6f, + 0x4f70, 0x4f71, 0x4f72, 0x4f73, 0x4f74, 0x4f75, 0x4f76, 0x4f77, + 0x4f78, 0x4f79, 0x4f7a, 0x4f7b, 0x4f7c, 0x4f7d, 0x4f7e, 0x4f7f, + 0x4f80, 0x4f81, 0x4f82, 0x4f83, 0x4f84, 0x4f85, 0x4f86, 0x4f87, + 0x4f88, 0x4f89, 0x4f8a, 0x4f8b, 0x4f8c, 0x4f8d, 0x4f8e, 0x4f8f, + 0x4f90, 0x4f91, 0x4f92, 0x4f93, 0x4f94, 0x4f95, 0x4f96, 0x4f97, + 0x4f98, 0x4f99, 0x4f9a, 0x4f9b, 0x4f9c, 0x4f9d, 0x4f9e, 0x4f9f, + 0x4fa0, 0x4fa1, 0x4fa2, 0x4fa3, 0x4fa4, 0x4fa5, 0x4fa6, 0x4fa7, + 0x4fa8, 0x4fa9, 0x4faa, 0x4fab, 0x4fac, 0x4fad, 0x4fae, 0x4faf, + 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, 0x4fb5, 0x4fb6, 0x4fb7, + 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fbf, + 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc3, 0x4fc4, 0x4fc5, 0x4fc6, 0x4fc7, + 0x4fc8, 0x4fc9, 0x4fca, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fce, 0x4fcf, + 0x4fd0, 0x4fd1, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, 0x4fd7, + 0x4fd8, 0x4fd9, 0x4fda, 0x4fdb, 0x4fdc, 0x4fdd, 0x4fde, 0x4fdf, + 0x4fe0, 0x4fe1, 0x4fe2, 0x4fe3, 0x4fe4, 0x4fe5, 0x4fe6, 0x4fe7, + 0x4fe8, 0x4fe9, 0x4fea, 0x4feb, 0x4fec, 0x4fed, 0x4fee, 0x4fef, + 0x4ff0, 0x4ff1, 0x4ff2, 0x4ff3, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, + 0x4ff8, 0x4ff9, 0x4ffa, 0x4ffb, 0x4ffc, 0x4ffd, 0x4ffe, 0x4fff, + 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, + 0x5008, 0x5009, 0x500a, 0x500b, 0x500c, 0x500d, 0x500e, 0x500f, + 0x5010, 0x5011, 0x5012, 0x5013, 0x5014, 0x5015, 0x5016, 0x5017, + 0x5018, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e, 0x501f, + 0x5020, 0x5021, 0x5022, 0x5023, 0x5024, 0x5025, 0x5026, 0x5027, + 0x5028, 0x5029, 0x502a, 0x502b, 0x502c, 0x502d, 0x502e, 0x502f, + 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, + 0x5038, 0x5039, 0x503a, 0x503b, 0x503c, 0x503d, 0x503e, 0x503f, + 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, 0x5046, 0x5047, + 0x5048, 0x5049, 0x504a, 0x504b, 0x504c, 0x504d, 0x504e, 0x504f, + 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, 0x5056, 0x5057, + 0x5058, 0x5059, 0x505a, 0x505b, 0x505c, 0x505d, 0x505e, 0x505f, + 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5065, 0x5066, 0x5067, + 0x5068, 0x5069, 0x506a, 0x506b, 0x506c, 0x506d, 0x506e, 0x506f, + 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5076, 0x5077, + 0x5078, 0x5079, 0x507a, 0x507b, 0x507c, 0x507d, 0x507e, 0x507f, + 0x5080, 0x5081, 0x5082, 0x5083, 0x5084, 0x5085, 0x5086, 0x5087, + 0x5088, 0x5089, 0x508a, 0x508b, 0x508c, 0x508d, 0x508e, 0x508f, + 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, + 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, 0x509e, 0x509f, + 0x50a0, 0x50a1, 0x50a2, 0x50a3, 0x50a4, 0x50a5, 0x50a6, 0x50a7, + 0x50a8, 0x50a9, 0x50aa, 0x50ab, 0x50ac, 0x50ad, 0x50ae, 0x50af, + 0x50b0, 0x50b1, 0x50b2, 0x50b3, 0x50b4, 0x50b5, 0x50b6, 0x50b7, + 0x50b8, 0x50b9, 0x50ba, 0x50bb, 0x50bc, 0x50bd, 0x50be, 0x50bf, + 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, 0x50c5, 0x50c6, 0x50c7, + 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, 0x50cd, 0x50ce, 0x50cf, + 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, 0x50d6, 0x50d7, + 0x50d8, 0x50d9, 0x50da, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, + 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e6, 0x50e7, + 0x50e8, 0x50e9, 0x50ea, 0x50eb, 0x50ec, 0x50ed, 0x50ee, 0x50ef, + 0x50f0, 0x50f1, 0x50f2, 0x50f3, 0x50f4, 0x50f5, 0x50f6, 0x50f7, + 0x50f8, 0x50f9, 0x50fa, 0x50fb, 0x50fc, 0x50fd, 0x50fe, 0x50ff, + 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5106, 0x5107, + 0x5108, 0x5109, 0x510a, 0x510b, 0x510c, 0x510d, 0x510e, 0x510f, + 0x5110, 0x5111, 0x5112, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, + 0x5118, 0x5119, 0x511a, 0x511b, 0x511c, 0x511d, 0x511e, 0x511f, + 0x5120, 0x5121, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, + 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, + 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, + 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x513f, + 0x5140, 0x5141, 0x5142, 0x5143, 0x5144, 0x5145, 0x5146, 0x5147, + 0x5148, 0x5149, 0x514a, 0x514b, 0x514c, 0x514d, 0x514e, 0x514f, + 0x5150, 0x5151, 0x5152, 0x5153, 0x5154, 0x5155, 0x5156, 0x5157, + 0x5158, 0x5159, 0x515a, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, + 0x5160, 0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5167, + 0x5168, 0x5169, 0x516a, 0x516b, 0x516c, 0x516d, 0x516e, 0x516f, + 0x5170, 0x5171, 0x5172, 0x5173, 0x5174, 0x5175, 0x5176, 0x5177, + 0x5178, 0x5179, 0x517a, 0x517b, 0x517c, 0x517d, 0x517e, 0x517f, + 0x5180, 0x5181, 0x5182, 0x5183, 0x5184, 0x5185, 0x5186, 0x5187, + 0x5188, 0x5189, 0x518a, 0x518b, 0x518c, 0x518d, 0x518e, 0x518f, + 0x5190, 0x5191, 0x5192, 0x5193, 0x5194, 0x5195, 0x5196, 0x5197, + 0x5198, 0x5199, 0x519a, 0x519b, 0x519c, 0x519d, 0x519e, 0x519f, + 0x51a0, 0x51a1, 0x51a2, 0x51a3, 0x51a4, 0x51a5, 0x51a6, 0x51a7, + 0x51a8, 0x51a9, 0x51aa, 0x51ab, 0x51ac, 0x51ad, 0x51ae, 0x51af, + 0x51b0, 0x51b1, 0x51b2, 0x51b3, 0x51b4, 0x51b5, 0x51b6, 0x51b7, + 0x51b8, 0x51b9, 0x51ba, 0x51bb, 0x51bc, 0x51bd, 0x51be, 0x51bf, + 0x51c0, 0x51c1, 0x51c2, 0x51c3, 0x51c4, 0x51c5, 0x51c6, 0x51c7, + 0x51c8, 0x51c9, 0x51ca, 0x51cb, 0x51cc, 0x51cd, 0x51ce, 0x51cf, + 0x51d0, 0x51d1, 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, + 0x51d8, 0x51d9, 0x51da, 0x51db, 0x51dc, 0x51dd, 0x51de, 0x51df, + 0x51e0, 0x51e1, 0x51e2, 0x51e3, 0x51e4, 0x51e5, 0x51e6, 0x51e7, + 0x51e8, 0x51e9, 0x51ea, 0x51eb, 0x51ec, 0x51ed, 0x51ee, 0x51ef, + 0x51f0, 0x51f1, 0x51f2, 0x51f3, 0x51f4, 0x51f5, 0x51f6, 0x51f7, + 0x51f8, 0x51f9, 0x51fa, 0x51fb, 0x51fc, 0x51fd, 0x51fe, 0x51ff, + 0x5200, 0x5201, 0x5202, 0x5203, 0x5204, 0x5205, 0x5206, 0x5207, + 0x5208, 0x5209, 0x520a, 0x520b, 0x520c, 0x520d, 0x520e, 0x520f, + 0x5210, 0x5211, 0x5212, 0x5213, 0x5214, 0x5215, 0x5216, 0x5217, + 0x5218, 0x5219, 0x521a, 0x521b, 0x521c, 0x521d, 0x521e, 0x521f, + 0x5220, 0x5221, 0x5222, 0x5223, 0x5224, 0x5225, 0x5226, 0x5227, + 0x5228, 0x5229, 0x522a, 0x522b, 0x522c, 0x522d, 0x522e, 0x522f, + 0x5230, 0x5231, 0x5232, 0x5233, 0x5234, 0x5235, 0x5236, 0x5237, + 0x5238, 0x5239, 0x523a, 0x523b, 0x523c, 0x523d, 0x523e, 0x523f, + 0x5240, 0x5241, 0x5242, 0x5243, 0x5244, 0x5245, 0x5246, 0x5247, + 0x5248, 0x5249, 0x524a, 0x524b, 0x524c, 0x524d, 0x524e, 0x524f, + 0x5250, 0x5251, 0x5252, 0x5253, 0x5254, 0x5255, 0x5256, 0x5257, + 0x5258, 0x5259, 0x525a, 0x525b, 0x525c, 0x525d, 0x525e, 0x525f, + 0x5260, 0x5261, 0x5262, 0x5263, 0x5264, 0x5265, 0x5266, 0x5267, + 0x5268, 0x5269, 0x526a, 0x526b, 0x526c, 0x526d, 0x526e, 0x526f, + 0x5270, 0x5271, 0x5272, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, + 0x5278, 0x5279, 0x527a, 0x527b, 0x527c, 0x527d, 0x527e, 0x527f, + 0x5280, 0x5281, 0x5282, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, + 0x5288, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, + 0x5290, 0x5291, 0x5292, 0x5293, 0x5294, 0x5295, 0x5296, 0x5297, + 0x5298, 0x5299, 0x529a, 0x529b, 0x529c, 0x529d, 0x529e, 0x529f, + 0x52a0, 0x52a1, 0x52a2, 0x52a3, 0x52a4, 0x52a5, 0x52a6, 0x52a7, + 0x52a8, 0x52a9, 0x52aa, 0x52ab, 0x52ac, 0x52ad, 0x52ae, 0x52af, + 0x52b0, 0x52b1, 0x52b2, 0x52b3, 0x52b4, 0x52b5, 0x52b6, 0x52b7, + 0x52b8, 0x52b9, 0x52ba, 0x52bb, 0x52bc, 0x52bd, 0x52be, 0x52bf, + 0x52c0, 0x52c1, 0x52c2, 0x52c3, 0x52c4, 0x52c5, 0x52c6, 0x52c7, + 0x52c8, 0x52c9, 0x52ca, 0x52cb, 0x52cc, 0x52cd, 0x52ce, 0x52cf, + 0x52d0, 0x52d1, 0x52d2, 0x52d3, 0x52d4, 0x52d5, 0x52d6, 0x52d7, + 0x52d8, 0x52d9, 0x52da, 0x52db, 0x52dc, 0x52dd, 0x52de, 0x52df, + 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e4, 0x52e5, 0x52e6, 0x52e7, + 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, 0x52ef, + 0x52f0, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, + 0x52f8, 0x52f9, 0x52fa, 0x52fb, 0x52fc, 0x52fd, 0x52fe, 0x52ff, + 0x5300, 0x5301, 0x5302, 0x5303, 0x5304, 0x5305, 0x5306, 0x5307, + 0x5308, 0x5309, 0x530a, 0x530b, 0x530c, 0x530d, 0x530e, 0x530f, + 0x5310, 0x5311, 0x5312, 0x5313, 0x5314, 0x5315, 0x5316, 0x5317, + 0x5318, 0x5319, 0x531a, 0x531b, 0x531c, 0x531d, 0x531e, 0x531f, + 0x5320, 0x5321, 0x5322, 0x5323, 0x5324, 0x5325, 0x5326, 0x5327, + 0x5328, 0x5329, 0x532a, 0x532b, 0x532c, 0x532d, 0x532e, 0x532f, + 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, + 0x5338, 0x5339, 0x533a, 0x533b, 0x533c, 0x533d, 0x533e, 0x533f, + 0x5340, 0x5341, 0x5342, 0x5343, 0x5344, 0x5345, 0x5346, 0x5347, + 0x5348, 0x5349, 0x534a, 0x534b, 0x534c, 0x534d, 0x534e, 0x534f, + 0x5350, 0x5351, 0x5352, 0x5353, 0x5354, 0x5355, 0x5356, 0x5357, + 0x5358, 0x5359, 0x535a, 0x535b, 0x535c, 0x535d, 0x535e, 0x535f, + 0x5360, 0x5361, 0x5362, 0x5363, 0x5364, 0x5365, 0x5366, 0x5367, + 0x5368, 0x5369, 0x536a, 0x536b, 0x536c, 0x536d, 0x536e, 0x536f, + 0x5370, 0x5371, 0x5372, 0x5373, 0x5374, 0x5375, 0x5376, 0x5377, + 0x5378, 0x5379, 0x537a, 0x537b, 0x537c, 0x537d, 0x537e, 0x537f, + 0x5380, 0x5381, 0x5382, 0x5383, 0x5384, 0x5385, 0x5386, 0x5387, + 0x5388, 0x5389, 0x538a, 0x538b, 0x538c, 0x538d, 0x538e, 0x538f, + 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5395, 0x5396, 0x5397, + 0x5398, 0x5399, 0x539a, 0x539b, 0x539c, 0x539d, 0x539e, 0x539f, + 0x53a0, 0x53a1, 0x53a2, 0x53a3, 0x53a4, 0x53a5, 0x53a6, 0x53a7, + 0x53a8, 0x53a9, 0x53aa, 0x53ab, 0x53ac, 0x53ad, 0x53ae, 0x53af, + 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, 0x53b5, 0x53b6, 0x53b7, + 0x53b8, 0x53b9, 0x53ba, 0x53bb, 0x53bc, 0x53bd, 0x53be, 0x53bf, + 0x53c0, 0x53c1, 0x53c2, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, + 0x53c8, 0x53c9, 0x53ca, 0x53cb, 0x53cc, 0x53cd, 0x53ce, 0x53cf, + 0x53d0, 0x53d1, 0x53d2, 0x53d3, 0x53d4, 0x53d5, 0x53d6, 0x53d7, + 0x53d8, 0x53d9, 0x53da, 0x53db, 0x53dc, 0x53dd, 0x53de, 0x53df, + 0x53e0, 0x53e1, 0x53e2, 0x53e3, 0x53e4, 0x53e5, 0x53e6, 0x53e7, + 0x53e8, 0x53e9, 0x53ea, 0x53eb, 0x53ec, 0x53ed, 0x53ee, 0x53ef, + 0x53f0, 0x53f1, 0x53f2, 0x53f3, 0x53f4, 0x53f5, 0x53f6, 0x53f7, + 0x53f8, 0x53f9, 0x53fa, 0x53fb, 0x53fc, 0x53fd, 0x53fe, 0x53ff, + 0x5400, 0x5401, 0x5402, 0x5403, 0x5404, 0x5405, 0x5406, 0x5407, + 0x5408, 0x5409, 0x540a, 0x540b, 0x540c, 0x540d, 0x540e, 0x540f, + 0x5410, 0x5411, 0x5412, 0x5413, 0x5414, 0x5415, 0x5416, 0x5417, + 0x5418, 0x5419, 0x541a, 0x541b, 0x541c, 0x541d, 0x541e, 0x541f, + 0x5420, 0x5421, 0x5422, 0x5423, 0x5424, 0x5425, 0x5426, 0x5427, + 0x5428, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x542e, 0x542f, + 0x5430, 0x5431, 0x5432, 0x5433, 0x5434, 0x5435, 0x5436, 0x5437, + 0x5438, 0x5439, 0x543a, 0x543b, 0x543c, 0x543d, 0x543e, 0x543f, + 0x5440, 0x5441, 0x5442, 0x5443, 0x5444, 0x5445, 0x5446, 0x5447, + 0x5448, 0x5449, 0x544a, 0x544b, 0x544c, 0x544d, 0x544e, 0x544f, + 0x5450, 0x5451, 0x5452, 0x5453, 0x5454, 0x5455, 0x5456, 0x5457, + 0x5458, 0x5459, 0x545a, 0x545b, 0x545c, 0x545d, 0x545e, 0x545f, + 0x5460, 0x5461, 0x5462, 0x5463, 0x5464, 0x5465, 0x5466, 0x5467, + 0x5468, 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, + 0x5470, 0x5471, 0x5472, 0x5473, 0x5474, 0x5475, 0x5476, 0x5477, + 0x5478, 0x5479, 0x547a, 0x547b, 0x547c, 0x547d, 0x547e, 0x547f, + 0x5480, 0x5481, 0x5482, 0x5483, 0x5484, 0x5485, 0x5486, 0x5487, + 0x5488, 0x5489, 0x548a, 0x548b, 0x548c, 0x548d, 0x548e, 0x548f, + 0x5490, 0x5491, 0x5492, 0x5493, 0x5494, 0x5495, 0x5496, 0x5497, + 0x5498, 0x5499, 0x549a, 0x549b, 0x549c, 0x549d, 0x549e, 0x549f, + 0x54a0, 0x54a1, 0x54a2, 0x54a3, 0x54a4, 0x54a5, 0x54a6, 0x54a7, + 0x54a8, 0x54a9, 0x54aa, 0x54ab, 0x54ac, 0x54ad, 0x54ae, 0x54af, + 0x54b0, 0x54b1, 0x54b2, 0x54b3, 0x54b4, 0x54b5, 0x54b6, 0x54b7, + 0x54b8, 0x54b9, 0x54ba, 0x54bb, 0x54bc, 0x54bd, 0x54be, 0x54bf, + 0x54c0, 0x54c1, 0x54c2, 0x54c3, 0x54c4, 0x54c5, 0x54c6, 0x54c7, + 0x54c8, 0x54c9, 0x54ca, 0x54cb, 0x54cc, 0x54cd, 0x54ce, 0x54cf, + 0x54d0, 0x54d1, 0x54d2, 0x54d3, 0x54d4, 0x54d5, 0x54d6, 0x54d7, + 0x54d8, 0x54d9, 0x54da, 0x54db, 0x54dc, 0x54dd, 0x54de, 0x54df, + 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, 0x54e5, 0x54e6, 0x54e7, + 0x54e8, 0x54e9, 0x54ea, 0x54eb, 0x54ec, 0x54ed, 0x54ee, 0x54ef, + 0x54f0, 0x54f1, 0x54f2, 0x54f3, 0x54f4, 0x54f5, 0x54f6, 0x54f7, + 0x54f8, 0x54f9, 0x54fa, 0x54fb, 0x54fc, 0x54fd, 0x54fe, 0x54ff, + 0x5500, 0x5501, 0x5502, 0x5503, 0x5504, 0x5505, 0x5506, 0x5507, + 0x5508, 0x5509, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, 0x550f, + 0x5510, 0x5511, 0x5512, 0x5513, 0x5514, 0x5515, 0x5516, 0x5517, + 0x5518, 0x5519, 0x551a, 0x551b, 0x551c, 0x551d, 0x551e, 0x551f, + 0x5520, 0x5521, 0x5522, 0x5523, 0x5524, 0x5525, 0x5526, 0x5527, + 0x5528, 0x5529, 0x552a, 0x552b, 0x552c, 0x552d, 0x552e, 0x552f, + 0x5530, 0x5531, 0x5532, 0x5533, 0x5534, 0x5535, 0x5536, 0x5537, + 0x5538, 0x5539, 0x553a, 0x553b, 0x553c, 0x553d, 0x553e, 0x553f, + 0x5540, 0x5541, 0x5542, 0x5543, 0x5544, 0x5545, 0x5546, 0x5547, + 0x5548, 0x5549, 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, + 0x5550, 0x5551, 0x5552, 0x5553, 0x5554, 0x5555, 0x5556, 0x5557, + 0x5558, 0x5559, 0x555a, 0x555b, 0x555c, 0x555d, 0x555e, 0x555f, + 0x5560, 0x5561, 0x5562, 0x5563, 0x5564, 0x5565, 0x5566, 0x5567, + 0x5568, 0x5569, 0x556a, 0x556b, 0x556c, 0x556d, 0x556e, 0x556f, + 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5575, 0x5576, 0x5577, + 0x5578, 0x5579, 0x557a, 0x557b, 0x557c, 0x557d, 0x557e, 0x557f, + 0x5580, 0x5581, 0x5582, 0x5583, 0x5584, 0x5585, 0x5586, 0x5587, + 0x5588, 0x5589, 0x558a, 0x558b, 0x558c, 0x558d, 0x558e, 0x558f, + 0x5590, 0x5591, 0x5592, 0x5593, 0x5594, 0x5595, 0x5596, 0x5597, + 0x5598, 0x5599, 0x559a, 0x559b, 0x559c, 0x559d, 0x559e, 0x559f, + 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a7, + 0x55a8, 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, + 0x55b0, 0x55b1, 0x55b2, 0x55b3, 0x55b4, 0x55b5, 0x55b6, 0x55b7, + 0x55b8, 0x55b9, 0x55ba, 0x55bb, 0x55bc, 0x55bd, 0x55be, 0x55bf, + 0x55c0, 0x55c1, 0x55c2, 0x55c3, 0x55c4, 0x55c5, 0x55c6, 0x55c7, + 0x55c8, 0x55c9, 0x55ca, 0x55cb, 0x55cc, 0x55cd, 0x55ce, 0x55cf, + 0x55d0, 0x55d1, 0x55d2, 0x55d3, 0x55d4, 0x55d5, 0x55d6, 0x55d7, + 0x55d8, 0x55d9, 0x55da, 0x55db, 0x55dc, 0x55dd, 0x55de, 0x55df, + 0x55e0, 0x55e1, 0x55e2, 0x55e3, 0x55e4, 0x55e5, 0x55e6, 0x55e7, + 0x55e8, 0x55e9, 0x55ea, 0x55eb, 0x55ec, 0x55ed, 0x55ee, 0x55ef, + 0x55f0, 0x55f1, 0x55f2, 0x55f3, 0x55f4, 0x55f5, 0x55f6, 0x55f7, + 0x55f8, 0x55f9, 0x55fa, 0x55fb, 0x55fc, 0x55fd, 0x55fe, 0x55ff, + 0x5600, 0x5601, 0x5602, 0x5603, 0x5604, 0x5605, 0x5606, 0x5607, + 0x5608, 0x5609, 0x560a, 0x560b, 0x560c, 0x560d, 0x560e, 0x560f, + 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, + 0x5618, 0x5619, 0x561a, 0x561b, 0x561c, 0x561d, 0x561e, 0x561f, + 0x5620, 0x5621, 0x5622, 0x5623, 0x5624, 0x5625, 0x5626, 0x5627, + 0x5628, 0x5629, 0x562a, 0x562b, 0x562c, 0x562d, 0x562e, 0x562f, + 0x5630, 0x5631, 0x5632, 0x5633, 0x5634, 0x5635, 0x5636, 0x5637, + 0x5638, 0x5639, 0x563a, 0x563b, 0x563c, 0x563d, 0x563e, 0x563f, + 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, + 0x5648, 0x5649, 0x564a, 0x564b, 0x564c, 0x564d, 0x564e, 0x564f, + 0x5650, 0x5651, 0x5652, 0x5653, 0x5654, 0x5655, 0x5656, 0x5657, + 0x5658, 0x5659, 0x565a, 0x565b, 0x565c, 0x565d, 0x565e, 0x565f, + 0x5660, 0x5661, 0x5662, 0x5663, 0x5664, 0x5665, 0x5666, 0x5667, + 0x5668, 0x5669, 0x566a, 0x566b, 0x566c, 0x566d, 0x566e, 0x566f, + 0x5670, 0x5671, 0x5672, 0x5673, 0x5674, 0x5675, 0x5676, 0x5677, + 0x5678, 0x5679, 0x567a, 0x567b, 0x567c, 0x567d, 0x567e, 0x567f, + 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5685, 0x5686, 0x5687, + 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x568e, 0x568f, + 0x5690, 0x5691, 0x5692, 0x5693, 0x5694, 0x5695, 0x5696, 0x5697, + 0x5698, 0x5699, 0x569a, 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, + 0x56a0, 0x56a1, 0x56a2, 0x56a3, 0x56a4, 0x56a5, 0x56a6, 0x56a7, + 0x56a8, 0x56a9, 0x56aa, 0x56ab, 0x56ac, 0x56ad, 0x56ae, 0x56af, + 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, 0x56b5, 0x56b6, 0x56b7, + 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bc, 0x56bd, 0x56be, 0x56bf, + 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, 0x56c7, + 0x56c8, 0x56c9, 0x56ca, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, + 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d4, 0x56d5, 0x56d6, 0x56d7, + 0x56d8, 0x56d9, 0x56da, 0x56db, 0x56dc, 0x56dd, 0x56de, 0x56df, + 0x56e0, 0x56e1, 0x56e2, 0x56e3, 0x56e4, 0x56e5, 0x56e6, 0x56e7, + 0x56e8, 0x56e9, 0x56ea, 0x56eb, 0x56ec, 0x56ed, 0x56ee, 0x56ef, + 0x56f0, 0x56f1, 0x56f2, 0x56f3, 0x56f4, 0x56f5, 0x56f6, 0x56f7, + 0x56f8, 0x56f9, 0x56fa, 0x56fb, 0x56fc, 0x56fd, 0x56fe, 0x56ff, + 0x5700, 0x5701, 0x5702, 0x5703, 0x5704, 0x5705, 0x5706, 0x5707, + 0x5708, 0x5709, 0x570a, 0x570b, 0x570c, 0x570d, 0x570e, 0x570f, + 0x5710, 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, + 0x5718, 0x5719, 0x571a, 0x571b, 0x571c, 0x571d, 0x571e, 0x571f, + 0x5720, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, 0x5726, 0x5727, + 0x5728, 0x5729, 0x572a, 0x572b, 0x572c, 0x572d, 0x572e, 0x572f, + 0x5730, 0x5731, 0x5732, 0x5733, 0x5734, 0x5735, 0x5736, 0x5737, + 0x5738, 0x5739, 0x573a, 0x573b, 0x573c, 0x573d, 0x573e, 0x573f, + 0x5740, 0x5741, 0x5742, 0x5743, 0x5744, 0x5745, 0x5746, 0x5747, + 0x5748, 0x5749, 0x574a, 0x574b, 0x574c, 0x574d, 0x574e, 0x574f, + 0x5750, 0x5751, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5757, + 0x5758, 0x5759, 0x575a, 0x575b, 0x575c, 0x575d, 0x575e, 0x575f, + 0x5760, 0x5761, 0x5762, 0x5763, 0x5764, 0x5765, 0x5766, 0x5767, + 0x5768, 0x5769, 0x576a, 0x576b, 0x576c, 0x576d, 0x576e, 0x576f, + 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775, 0x5776, 0x5777, + 0x5778, 0x5779, 0x577a, 0x577b, 0x577c, 0x577d, 0x577e, 0x577f, + 0x5780, 0x5781, 0x5782, 0x5783, 0x5784, 0x5785, 0x5786, 0x5787, + 0x5788, 0x5789, 0x578a, 0x578b, 0x578c, 0x578d, 0x578e, 0x578f, + 0x5790, 0x5791, 0x5792, 0x5793, 0x5794, 0x5795, 0x5796, 0x5797, + 0x5798, 0x5799, 0x579a, 0x579b, 0x579c, 0x579d, 0x579e, 0x579f, + 0x57a0, 0x57a1, 0x57a2, 0x57a3, 0x57a4, 0x57a5, 0x57a6, 0x57a7, + 0x57a8, 0x57a9, 0x57aa, 0x57ab, 0x57ac, 0x57ad, 0x57ae, 0x57af, + 0x57b0, 0x57b1, 0x57b2, 0x57b3, 0x57b4, 0x57b5, 0x57b6, 0x57b7, + 0x57b8, 0x57b9, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, + 0x57c0, 0x57c1, 0x57c2, 0x57c3, 0x57c4, 0x57c5, 0x57c6, 0x57c7, + 0x57c8, 0x57c9, 0x57ca, 0x57cb, 0x57cc, 0x57cd, 0x57ce, 0x57cf, + 0x57d0, 0x57d1, 0x57d2, 0x57d3, 0x57d4, 0x57d5, 0x57d6, 0x57d7, + 0x57d8, 0x57d9, 0x57da, 0x57db, 0x57dc, 0x57dd, 0x57de, 0x57df, + 0x57e0, 0x57e1, 0x57e2, 0x57e3, 0x57e4, 0x57e5, 0x57e6, 0x57e7, + 0x57e8, 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ed, 0x57ee, 0x57ef, + 0x57f0, 0x57f1, 0x57f2, 0x57f3, 0x57f4, 0x57f5, 0x57f6, 0x57f7, + 0x57f8, 0x57f9, 0x57fa, 0x57fb, 0x57fc, 0x57fd, 0x57fe, 0x57ff, + 0x5800, 0x5801, 0x5802, 0x5803, 0x5804, 0x5805, 0x5806, 0x5807, + 0x5808, 0x5809, 0x580a, 0x580b, 0x580c, 0x580d, 0x580e, 0x580f, + 0x5810, 0x5811, 0x5812, 0x5813, 0x5814, 0x5815, 0x5816, 0x5817, + 0x5818, 0x5819, 0x581a, 0x581b, 0x581c, 0x581d, 0x581e, 0x581f, + 0x5820, 0x5821, 0x5822, 0x5823, 0x5824, 0x5825, 0x5826, 0x5827, + 0x5828, 0x5829, 0x582a, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, + 0x5830, 0x5831, 0x5832, 0x5833, 0x5834, 0x5835, 0x5836, 0x5837, + 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, 0x583e, 0x583f, + 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847, + 0x5848, 0x5849, 0x584a, 0x584b, 0x584c, 0x584d, 0x584e, 0x584f, + 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, 0x5856, 0x5857, + 0x5858, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585e, 0x585f, + 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, + 0x5868, 0x5869, 0x586a, 0x586b, 0x586c, 0x586d, 0x586e, 0x586f, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587e, 0x587f, + 0x5880, 0x5881, 0x5882, 0x5883, 0x5884, 0x5885, 0x5886, 0x5887, + 0x5888, 0x5889, 0x588a, 0x588b, 0x588c, 0x588d, 0x588e, 0x588f, + 0x5890, 0x5891, 0x5892, 0x5893, 0x5894, 0x5895, 0x5896, 0x5897, + 0x5898, 0x5899, 0x589a, 0x589b, 0x589c, 0x589d, 0x589e, 0x589f, + 0x58a0, 0x58a1, 0x58a2, 0x58a3, 0x58a4, 0x58a5, 0x58a6, 0x58a7, + 0x58a8, 0x58a9, 0x58aa, 0x58ab, 0x58ac, 0x58ad, 0x58ae, 0x58af, + 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, 0x58b6, 0x58b7, + 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bc, 0x58bd, 0x58be, 0x58bf, + 0x58c0, 0x58c1, 0x58c2, 0x58c3, 0x58c4, 0x58c5, 0x58c6, 0x58c7, + 0x58c8, 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, + 0x58d0, 0x58d1, 0x58d2, 0x58d3, 0x58d4, 0x58d5, 0x58d6, 0x58d7, + 0x58d8, 0x58d9, 0x58da, 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, + 0x58e0, 0x58e1, 0x58e2, 0x58e3, 0x58e4, 0x58e5, 0x58e6, 0x58e7, + 0x58e8, 0x58e9, 0x58ea, 0x58eb, 0x58ec, 0x58ed, 0x58ee, 0x58ef, + 0x58f0, 0x58f1, 0x58f2, 0x58f3, 0x58f4, 0x58f5, 0x58f6, 0x58f7, + 0x58f8, 0x58f9, 0x58fa, 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, + 0x5900, 0x5901, 0x5902, 0x5903, 0x5904, 0x5905, 0x5906, 0x5907, + 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590d, 0x590e, 0x590f, + 0x5910, 0x5911, 0x5912, 0x5913, 0x5914, 0x5915, 0x5916, 0x5917, + 0x5918, 0x5919, 0x591a, 0x591b, 0x591c, 0x591d, 0x591e, 0x591f, + 0x5920, 0x5921, 0x5922, 0x5923, 0x5924, 0x5925, 0x5926, 0x5927, + 0x5928, 0x5929, 0x592a, 0x592b, 0x592c, 0x592d, 0x592e, 0x592f, + 0x5930, 0x5931, 0x5932, 0x5933, 0x5934, 0x5935, 0x5936, 0x5937, + 0x5938, 0x5939, 0x593a, 0x593b, 0x593c, 0x593d, 0x593e, 0x593f, + 0x5940, 0x5941, 0x5942, 0x5943, 0x5944, 0x5945, 0x5946, 0x5947, + 0x5948, 0x5949, 0x594a, 0x594b, 0x594c, 0x594d, 0x594e, 0x594f, + 0x5950, 0x5951, 0x5952, 0x5953, 0x5954, 0x5955, 0x5956, 0x5957, + 0x5958, 0x5959, 0x595a, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, + 0x5960, 0x5961, 0x5962, 0x5963, 0x5964, 0x5965, 0x5966, 0x5967, + 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, + 0x5970, 0x5971, 0x5972, 0x5973, 0x5974, 0x5975, 0x5976, 0x5977, + 0x5978, 0x5979, 0x597a, 0x597b, 0x597c, 0x597d, 0x597e, 0x597f, + 0x5980, 0x5981, 0x5982, 0x5983, 0x5984, 0x5985, 0x5986, 0x5987, + 0x5988, 0x5989, 0x598a, 0x598b, 0x598c, 0x598d, 0x598e, 0x598f, + 0x5990, 0x5991, 0x5992, 0x5993, 0x5994, 0x5995, 0x5996, 0x5997, + 0x5998, 0x5999, 0x599a, 0x599b, 0x599c, 0x599d, 0x599e, 0x599f, + 0x59a0, 0x59a1, 0x59a2, 0x59a3, 0x59a4, 0x59a5, 0x59a6, 0x59a7, + 0x59a8, 0x59a9, 0x59aa, 0x59ab, 0x59ac, 0x59ad, 0x59ae, 0x59af, + 0x59b0, 0x59b1, 0x59b2, 0x59b3, 0x59b4, 0x59b5, 0x59b6, 0x59b7, + 0x59b8, 0x59b9, 0x59ba, 0x59bb, 0x59bc, 0x59bd, 0x59be, 0x59bf, + 0x59c0, 0x59c1, 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c6, 0x59c7, + 0x59c8, 0x59c9, 0x59ca, 0x59cb, 0x59cc, 0x59cd, 0x59ce, 0x59cf, + 0x59d0, 0x59d1, 0x59d2, 0x59d3, 0x59d4, 0x59d5, 0x59d6, 0x59d7, + 0x59d8, 0x59d9, 0x59da, 0x59db, 0x59dc, 0x59dd, 0x59de, 0x59df, + 0x59e0, 0x59e1, 0x59e2, 0x59e3, 0x59e4, 0x59e5, 0x59e6, 0x59e7, + 0x59e8, 0x59e9, 0x59ea, 0x59eb, 0x59ec, 0x59ed, 0x59ee, 0x59ef, + 0x59f0, 0x59f1, 0x59f2, 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, + 0x59f8, 0x59f9, 0x59fa, 0x59fb, 0x59fc, 0x59fd, 0x59fe, 0x59ff, + 0x5a00, 0x5a01, 0x5a02, 0x5a03, 0x5a04, 0x5a05, 0x5a06, 0x5a07, + 0x5a08, 0x5a09, 0x5a0a, 0x5a0b, 0x5a0c, 0x5a0d, 0x5a0e, 0x5a0f, + 0x5a10, 0x5a11, 0x5a12, 0x5a13, 0x5a14, 0x5a15, 0x5a16, 0x5a17, + 0x5a18, 0x5a19, 0x5a1a, 0x5a1b, 0x5a1c, 0x5a1d, 0x5a1e, 0x5a1f, + 0x5a20, 0x5a21, 0x5a22, 0x5a23, 0x5a24, 0x5a25, 0x5a26, 0x5a27, + 0x5a28, 0x5a29, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, + 0x5a30, 0x5a31, 0x5a32, 0x5a33, 0x5a34, 0x5a35, 0x5a36, 0x5a37, + 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3c, 0x5a3d, 0x5a3e, 0x5a3f, + 0x5a40, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a46, 0x5a47, + 0x5a48, 0x5a49, 0x5a4a, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, + 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x5a56, 0x5a57, + 0x5a58, 0x5a59, 0x5a5a, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, + 0x5a60, 0x5a61, 0x5a62, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a67, + 0x5a68, 0x5a69, 0x5a6a, 0x5a6b, 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, + 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a74, 0x5a75, 0x5a76, 0x5a77, + 0x5a78, 0x5a79, 0x5a7a, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a7f, + 0x5a80, 0x5a81, 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, + 0x5a88, 0x5a89, 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, + 0x5a90, 0x5a91, 0x5a92, 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, + 0x5a98, 0x5a99, 0x5a9a, 0x5a9b, 0x5a9c, 0x5a9d, 0x5a9e, 0x5a9f, + 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, 0x5aa5, 0x5aa6, 0x5aa7, + 0x5aa8, 0x5aa9, 0x5aaa, 0x5aab, 0x5aac, 0x5aad, 0x5aae, 0x5aaf, + 0x5ab0, 0x5ab1, 0x5ab2, 0x5ab3, 0x5ab4, 0x5ab5, 0x5ab6, 0x5ab7, + 0x5ab8, 0x5ab9, 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abe, 0x5abf, + 0x5ac0, 0x5ac1, 0x5ac2, 0x5ac3, 0x5ac4, 0x5ac5, 0x5ac6, 0x5ac7, + 0x5ac8, 0x5ac9, 0x5aca, 0x5acb, 0x5acc, 0x5acd, 0x5ace, 0x5acf, + 0x5ad0, 0x5ad1, 0x5ad2, 0x5ad3, 0x5ad4, 0x5ad5, 0x5ad6, 0x5ad7, + 0x5ad8, 0x5ad9, 0x5ada, 0x5adb, 0x5adc, 0x5add, 0x5ade, 0x5adf, + 0x5ae0, 0x5ae1, 0x5ae2, 0x5ae3, 0x5ae4, 0x5ae5, 0x5ae6, 0x5ae7, + 0x5ae8, 0x5ae9, 0x5aea, 0x5aeb, 0x5aec, 0x5aed, 0x5aee, 0x5aef, + 0x5af0, 0x5af1, 0x5af2, 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, + 0x5af8, 0x5af9, 0x5afa, 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, + 0x5b00, 0x5b01, 0x5b02, 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, + 0x5b08, 0x5b09, 0x5b0a, 0x5b0b, 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, + 0x5b10, 0x5b11, 0x5b12, 0x5b13, 0x5b14, 0x5b15, 0x5b16, 0x5b17, + 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, 0x5b1e, 0x5b1f, + 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, + 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, + 0x5b30, 0x5b31, 0x5b32, 0x5b33, 0x5b34, 0x5b35, 0x5b36, 0x5b37, + 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, + 0x5b40, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, + 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, + 0x5b50, 0x5b51, 0x5b52, 0x5b53, 0x5b54, 0x5b55, 0x5b56, 0x5b57, + 0x5b58, 0x5b59, 0x5b5a, 0x5b5b, 0x5b5c, 0x5b5d, 0x5b5e, 0x5b5f, + 0x5b60, 0x5b61, 0x5b62, 0x5b63, 0x5b64, 0x5b65, 0x5b66, 0x5b67, + 0x5b68, 0x5b69, 0x5b6a, 0x5b6b, 0x5b6c, 0x5b6d, 0x5b6e, 0x5b6f, + 0x5b70, 0x5b71, 0x5b72, 0x5b73, 0x5b74, 0x5b75, 0x5b76, 0x5b77, + 0x5b78, 0x5b79, 0x5b7a, 0x5b7b, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, + 0x5b80, 0x5b81, 0x5b82, 0x5b83, 0x5b84, 0x5b85, 0x5b86, 0x5b87, + 0x5b88, 0x5b89, 0x5b8a, 0x5b8b, 0x5b8c, 0x5b8d, 0x5b8e, 0x5b8f, + 0x5b90, 0x5b91, 0x5b92, 0x5b93, 0x5b94, 0x5b95, 0x5b96, 0x5b97, + 0x5b98, 0x5b99, 0x5b9a, 0x5b9b, 0x5b9c, 0x5b9d, 0x5b9e, 0x5b9f, + 0x5ba0, 0x5ba1, 0x5ba2, 0x5ba3, 0x5ba4, 0x5ba5, 0x5ba6, 0x5ba7, + 0x5ba8, 0x5ba9, 0x5baa, 0x5bab, 0x5bac, 0x5bad, 0x5bae, 0x5baf, + 0x5bb0, 0x5bb1, 0x5bb2, 0x5bb3, 0x5bb4, 0x5bb5, 0x5bb6, 0x5bb7, + 0x5bb8, 0x5bb9, 0x5bba, 0x5bbb, 0x5bbc, 0x5bbd, 0x5bbe, 0x5bbf, + 0x5bc0, 0x5bc1, 0x5bc2, 0x5bc3, 0x5bc4, 0x5bc5, 0x5bc6, 0x5bc7, + 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcc, 0x5bcd, 0x5bce, 0x5bcf, + 0x5bd0, 0x5bd1, 0x5bd2, 0x5bd3, 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, + 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, 0x5bdc, 0x5bdd, 0x5bde, 0x5bdf, + 0x5be0, 0x5be1, 0x5be2, 0x5be3, 0x5be4, 0x5be5, 0x5be6, 0x5be7, + 0x5be8, 0x5be9, 0x5bea, 0x5beb, 0x5bec, 0x5bed, 0x5bee, 0x5bef, + 0x5bf0, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, 0x5bf5, 0x5bf6, 0x5bf7, + 0x5bf8, 0x5bf9, 0x5bfa, 0x5bfb, 0x5bfc, 0x5bfd, 0x5bfe, 0x5bff, + 0x5c00, 0x5c01, 0x5c02, 0x5c03, 0x5c04, 0x5c05, 0x5c06, 0x5c07, + 0x5c08, 0x5c09, 0x5c0a, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c0f, + 0x5c10, 0x5c11, 0x5c12, 0x5c13, 0x5c14, 0x5c15, 0x5c16, 0x5c17, + 0x5c18, 0x5c19, 0x5c1a, 0x5c1b, 0x5c1c, 0x5c1d, 0x5c1e, 0x5c1f, + 0x5c20, 0x5c21, 0x5c22, 0x5c23, 0x5c24, 0x5c25, 0x5c26, 0x5c27, + 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2c, 0x5c2d, 0x5c2e, 0x5c2f, + 0x5c30, 0x5c31, 0x5c32, 0x5c33, 0x5c34, 0x5c35, 0x5c36, 0x5c37, + 0x5c38, 0x5c39, 0x5c3a, 0x5c3b, 0x5c3c, 0x5c3d, 0x5c3e, 0x5c3f, + 0x5c40, 0x5c41, 0x5c42, 0x5c43, 0x5c44, 0x5c45, 0x5c46, 0x5c47, + 0x5c48, 0x5c49, 0x5c4a, 0x5c4b, 0x5c4c, 0x5c4d, 0x5c4e, 0x5c4f, + 0x5c50, 0x5c51, 0x5c52, 0x5c53, 0x5c54, 0x5c55, 0x5c56, 0x5c57, + 0x5c58, 0x5c59, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5e, 0x5c5f, + 0x5c60, 0x5c61, 0x5c62, 0x5c63, 0x5c64, 0x5c65, 0x5c66, 0x5c67, + 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c6e, 0x5c6f, + 0x5c70, 0x5c71, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, + 0x5c78, 0x5c79, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c7f, + 0x5c80, 0x5c81, 0x5c82, 0x5c83, 0x5c84, 0x5c85, 0x5c86, 0x5c87, + 0x5c88, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8c, 0x5c8d, 0x5c8e, 0x5c8f, + 0x5c90, 0x5c91, 0x5c92, 0x5c93, 0x5c94, 0x5c95, 0x5c96, 0x5c97, + 0x5c98, 0x5c99, 0x5c9a, 0x5c9b, 0x5c9c, 0x5c9d, 0x5c9e, 0x5c9f, + 0x5ca0, 0x5ca1, 0x5ca2, 0x5ca3, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, + 0x5ca8, 0x5ca9, 0x5caa, 0x5cab, 0x5cac, 0x5cad, 0x5cae, 0x5caf, + 0x5cb0, 0x5cb1, 0x5cb2, 0x5cb3, 0x5cb4, 0x5cb5, 0x5cb6, 0x5cb7, + 0x5cb8, 0x5cb9, 0x5cba, 0x5cbb, 0x5cbc, 0x5cbd, 0x5cbe, 0x5cbf, + 0x5cc0, 0x5cc1, 0x5cc2, 0x5cc3, 0x5cc4, 0x5cc5, 0x5cc6, 0x5cc7, + 0x5cc8, 0x5cc9, 0x5cca, 0x5ccb, 0x5ccc, 0x5ccd, 0x5cce, 0x5ccf, + 0x5cd0, 0x5cd1, 0x5cd2, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, + 0x5cd8, 0x5cd9, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, + 0x5ce0, 0x5ce1, 0x5ce2, 0x5ce3, 0x5ce4, 0x5ce5, 0x5ce6, 0x5ce7, + 0x5ce8, 0x5ce9, 0x5cea, 0x5ceb, 0x5cec, 0x5ced, 0x5cee, 0x5cef, + 0x5cf0, 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, + 0x5cf8, 0x5cf9, 0x5cfa, 0x5cfb, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, + 0x5d00, 0x5d01, 0x5d02, 0x5d03, 0x5d04, 0x5d05, 0x5d06, 0x5d07, + 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, 0x5d0e, 0x5d0f, + 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d14, 0x5d15, 0x5d16, 0x5d17, + 0x5d18, 0x5d19, 0x5d1a, 0x5d1b, 0x5d1c, 0x5d1d, 0x5d1e, 0x5d1f, + 0x5d20, 0x5d21, 0x5d22, 0x5d23, 0x5d24, 0x5d25, 0x5d26, 0x5d27, + 0x5d28, 0x5d29, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2d, 0x5d2e, 0x5d2f, + 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d34, 0x5d35, 0x5d36, 0x5d37, + 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3d, 0x5d3e, 0x5d3f, + 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d47, + 0x5d48, 0x5d49, 0x5d4a, 0x5d4b, 0x5d4c, 0x5d4d, 0x5d4e, 0x5d4f, + 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, + 0x5d58, 0x5d59, 0x5d5a, 0x5d5b, 0x5d5c, 0x5d5d, 0x5d5e, 0x5d5f, + 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, + 0x5d68, 0x5d69, 0x5d6a, 0x5d6b, 0x5d6c, 0x5d6d, 0x5d6e, 0x5d6f, + 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d74, 0x5d75, 0x5d76, 0x5d77, + 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, + 0x5d80, 0x5d81, 0x5d82, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, + 0x5d88, 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, + 0x5d90, 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, + 0x5d98, 0x5d99, 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9d, 0x5d9e, 0x5d9f, + 0x5da0, 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, + 0x5da8, 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, + 0x5db0, 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db7, + 0x5db8, 0x5db9, 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, + 0x5dc0, 0x5dc1, 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc5, 0x5dc6, 0x5dc7, + 0x5dc8, 0x5dc9, 0x5dca, 0x5dcb, 0x5dcc, 0x5dcd, 0x5dce, 0x5dcf, + 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, + 0x5dd8, 0x5dd9, 0x5dda, 0x5ddb, 0x5ddc, 0x5ddd, 0x5dde, 0x5ddf, + 0x5de0, 0x5de1, 0x5de2, 0x5de3, 0x5de4, 0x5de5, 0x5de6, 0x5de7, + 0x5de8, 0x5de9, 0x5dea, 0x5deb, 0x5dec, 0x5ded, 0x5dee, 0x5def, + 0x5df0, 0x5df1, 0x5df2, 0x5df3, 0x5df4, 0x5df5, 0x5df6, 0x5df7, + 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dfd, 0x5dfe, 0x5dff, + 0x5e00, 0x5e01, 0x5e02, 0x5e03, 0x5e04, 0x5e05, 0x5e06, 0x5e07, + 0x5e08, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0c, 0x5e0d, 0x5e0e, 0x5e0f, + 0x5e10, 0x5e11, 0x5e12, 0x5e13, 0x5e14, 0x5e15, 0x5e16, 0x5e17, + 0x5e18, 0x5e19, 0x5e1a, 0x5e1b, 0x5e1c, 0x5e1d, 0x5e1e, 0x5e1f, + 0x5e20, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e26, 0x5e27, + 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2d, 0x5e2e, 0x5e2f, + 0x5e30, 0x5e31, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e37, + 0x5e38, 0x5e39, 0x5e3a, 0x5e3b, 0x5e3c, 0x5e3d, 0x5e3e, 0x5e3f, + 0x5e40, 0x5e41, 0x5e42, 0x5e43, 0x5e44, 0x5e45, 0x5e46, 0x5e47, + 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4c, 0x5e4d, 0x5e4e, 0x5e4f, + 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e54, 0x5e55, 0x5e56, 0x5e57, + 0x5e58, 0x5e59, 0x5e5a, 0x5e5b, 0x5e5c, 0x5e5d, 0x5e5e, 0x5e5f, + 0x5e60, 0x5e61, 0x5e62, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, + 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, + 0x5e70, 0x5e71, 0x5e72, 0x5e73, 0x5e74, 0x5e75, 0x5e76, 0x5e77, + 0x5e78, 0x5e79, 0x5e7a, 0x5e7b, 0x5e7c, 0x5e7d, 0x5e7e, 0x5e7f, + 0x5e80, 0x5e81, 0x5e82, 0x5e83, 0x5e84, 0x5e85, 0x5e86, 0x5e87, + 0x5e88, 0x5e89, 0x5e8a, 0x5e8b, 0x5e8c, 0x5e8d, 0x5e8e, 0x5e8f, + 0x5e90, 0x5e91, 0x5e92, 0x5e93, 0x5e94, 0x5e95, 0x5e96, 0x5e97, + 0x5e98, 0x5e99, 0x5e9a, 0x5e9b, 0x5e9c, 0x5e9d, 0x5e9e, 0x5e9f, + 0x5ea0, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, 0x5ea5, 0x5ea6, 0x5ea7, + 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5ead, 0x5eae, 0x5eaf, + 0x5eb0, 0x5eb1, 0x5eb2, 0x5eb3, 0x5eb4, 0x5eb5, 0x5eb6, 0x5eb7, + 0x5eb8, 0x5eb9, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebe, 0x5ebf, + 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, 0x5ec6, 0x5ec7, + 0x5ec8, 0x5ec9, 0x5eca, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, + 0x5ed0, 0x5ed1, 0x5ed2, 0x5ed3, 0x5ed4, 0x5ed5, 0x5ed6, 0x5ed7, + 0x5ed8, 0x5ed9, 0x5eda, 0x5edb, 0x5edc, 0x5edd, 0x5ede, 0x5edf, + 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, 0x5ee5, 0x5ee6, 0x5ee7, + 0x5ee8, 0x5ee9, 0x5eea, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, 0x5eef, + 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef4, 0x5ef5, 0x5ef6, 0x5ef7, + 0x5ef8, 0x5ef9, 0x5efa, 0x5efb, 0x5efc, 0x5efd, 0x5efe, 0x5eff, + 0x5f00, 0x5f01, 0x5f02, 0x5f03, 0x5f04, 0x5f05, 0x5f06, 0x5f07, + 0x5f08, 0x5f09, 0x5f0a, 0x5f0b, 0x5f0c, 0x5f0d, 0x5f0e, 0x5f0f, + 0x5f10, 0x5f11, 0x5f12, 0x5f13, 0x5f14, 0x5f15, 0x5f16, 0x5f17, + 0x5f18, 0x5f19, 0x5f1a, 0x5f1b, 0x5f1c, 0x5f1d, 0x5f1e, 0x5f1f, + 0x5f20, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f25, 0x5f26, 0x5f27, + 0x5f28, 0x5f29, 0x5f2a, 0x5f2b, 0x5f2c, 0x5f2d, 0x5f2e, 0x5f2f, + 0x5f30, 0x5f31, 0x5f32, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, + 0x5f38, 0x5f39, 0x5f3a, 0x5f3b, 0x5f3c, 0x5f3d, 0x5f3e, 0x5f3f, + 0x5f40, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, + 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, + 0x5f50, 0x5f51, 0x5f52, 0x5f53, 0x5f54, 0x5f55, 0x5f56, 0x5f57, + 0x5f58, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5d, 0x5f5e, 0x5f5f, + 0x5f60, 0x5f61, 0x5f62, 0x5f63, 0x5f64, 0x5f65, 0x5f66, 0x5f67, + 0x5f68, 0x5f69, 0x5f6a, 0x5f6b, 0x5f6c, 0x5f6d, 0x5f6e, 0x5f6f, + 0x5f70, 0x5f71, 0x5f72, 0x5f73, 0x5f74, 0x5f75, 0x5f76, 0x5f77, + 0x5f78, 0x5f79, 0x5f7a, 0x5f7b, 0x5f7c, 0x5f7d, 0x5f7e, 0x5f7f, + 0x5f80, 0x5f81, 0x5f82, 0x5f83, 0x5f84, 0x5f85, 0x5f86, 0x5f87, + 0x5f88, 0x5f89, 0x5f8a, 0x5f8b, 0x5f8c, 0x5f8d, 0x5f8e, 0x5f8f, + 0x5f90, 0x5f91, 0x5f92, 0x5f93, 0x5f94, 0x5f95, 0x5f96, 0x5f97, + 0x5f98, 0x5f99, 0x5f9a, 0x5f9b, 0x5f9c, 0x5f9d, 0x5f9e, 0x5f9f, + 0x5fa0, 0x5fa1, 0x5fa2, 0x5fa3, 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, + 0x5fa8, 0x5fa9, 0x5faa, 0x5fab, 0x5fac, 0x5fad, 0x5fae, 0x5faf, + 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb5, 0x5fb6, 0x5fb7, + 0x5fb8, 0x5fb9, 0x5fba, 0x5fbb, 0x5fbc, 0x5fbd, 0x5fbe, 0x5fbf, + 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc3, 0x5fc4, 0x5fc5, 0x5fc6, 0x5fc7, + 0x5fc8, 0x5fc9, 0x5fca, 0x5fcb, 0x5fcc, 0x5fcd, 0x5fce, 0x5fcf, + 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fd6, 0x5fd7, + 0x5fd8, 0x5fd9, 0x5fda, 0x5fdb, 0x5fdc, 0x5fdd, 0x5fde, 0x5fdf, + 0x5fe0, 0x5fe1, 0x5fe2, 0x5fe3, 0x5fe4, 0x5fe5, 0x5fe6, 0x5fe7, + 0x5fe8, 0x5fe9, 0x5fea, 0x5feb, 0x5fec, 0x5fed, 0x5fee, 0x5fef, + 0x5ff0, 0x5ff1, 0x5ff2, 0x5ff3, 0x5ff4, 0x5ff5, 0x5ff6, 0x5ff7, + 0x5ff8, 0x5ff9, 0x5ffa, 0x5ffb, 0x5ffc, 0x5ffd, 0x5ffe, 0x5fff, + 0x6000, 0x6001, 0x6002, 0x6003, 0x6004, 0x6005, 0x6006, 0x6007, + 0x6008, 0x6009, 0x600a, 0x600b, 0x600c, 0x600d, 0x600e, 0x600f, + 0x6010, 0x6011, 0x6012, 0x6013, 0x6014, 0x6015, 0x6016, 0x6017, + 0x6018, 0x6019, 0x601a, 0x601b, 0x601c, 0x601d, 0x601e, 0x601f, + 0x6020, 0x6021, 0x6022, 0x6023, 0x6024, 0x6025, 0x6026, 0x6027, + 0x6028, 0x6029, 0x602a, 0x602b, 0x602c, 0x602d, 0x602e, 0x602f, + 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6035, 0x6036, 0x6037, + 0x6038, 0x6039, 0x603a, 0x603b, 0x603c, 0x603d, 0x603e, 0x603f, + 0x6040, 0x6041, 0x6042, 0x6043, 0x6044, 0x6045, 0x6046, 0x6047, + 0x6048, 0x6049, 0x604a, 0x604b, 0x604c, 0x604d, 0x604e, 0x604f, + 0x6050, 0x6051, 0x6052, 0x6053, 0x6054, 0x6055, 0x6056, 0x6057, + 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d, 0x605e, 0x605f, + 0x6060, 0x6061, 0x6062, 0x6063, 0x6064, 0x6065, 0x6066, 0x6067, + 0x6068, 0x6069, 0x606a, 0x606b, 0x606c, 0x606d, 0x606e, 0x606f, + 0x6070, 0x6071, 0x6072, 0x6073, 0x6074, 0x6075, 0x6076, 0x6077, + 0x6078, 0x6079, 0x607a, 0x607b, 0x607c, 0x607d, 0x607e, 0x607f, + 0x6080, 0x6081, 0x6082, 0x6083, 0x6084, 0x6085, 0x6086, 0x6087, + 0x6088, 0x6089, 0x608a, 0x608b, 0x608c, 0x608d, 0x608e, 0x608f, + 0x6090, 0x6091, 0x6092, 0x6093, 0x6094, 0x6095, 0x6096, 0x6097, + 0x6098, 0x6099, 0x609a, 0x609b, 0x609c, 0x609d, 0x609e, 0x609f, + 0x60a0, 0x60a1, 0x60a2, 0x60a3, 0x60a4, 0x60a5, 0x60a6, 0x60a7, + 0x60a8, 0x60a9, 0x60aa, 0x60ab, 0x60ac, 0x60ad, 0x60ae, 0x60af, + 0x60b0, 0x60b1, 0x60b2, 0x60b3, 0x60b4, 0x60b5, 0x60b6, 0x60b7, + 0x60b8, 0x60b9, 0x60ba, 0x60bb, 0x60bc, 0x60bd, 0x60be, 0x60bf, + 0x60c0, 0x60c1, 0x60c2, 0x60c3, 0x60c4, 0x60c5, 0x60c6, 0x60c7, + 0x60c8, 0x60c9, 0x60ca, 0x60cb, 0x60cc, 0x60cd, 0x60ce, 0x60cf, + 0x60d0, 0x60d1, 0x60d2, 0x60d3, 0x60d4, 0x60d5, 0x60d6, 0x60d7, + 0x60d8, 0x60d9, 0x60da, 0x60db, 0x60dc, 0x60dd, 0x60de, 0x60df, + 0x60e0, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60e6, 0x60e7, + 0x60e8, 0x60e9, 0x60ea, 0x60eb, 0x60ec, 0x60ed, 0x60ee, 0x60ef, + 0x60f0, 0x60f1, 0x60f2, 0x60f3, 0x60f4, 0x60f5, 0x60f6, 0x60f7, + 0x60f8, 0x60f9, 0x60fa, 0x60fb, 0x60fc, 0x60fd, 0x60fe, 0x60ff, + 0x6100, 0x6101, 0x6102, 0x6103, 0x6104, 0x6105, 0x6106, 0x6107, + 0x6108, 0x6109, 0x610a, 0x610b, 0x610c, 0x610d, 0x610e, 0x610f, + 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6115, 0x6116, 0x6117, + 0x6118, 0x6119, 0x611a, 0x611b, 0x611c, 0x611d, 0x611e, 0x611f, + 0x6120, 0x6121, 0x6122, 0x6123, 0x6124, 0x6125, 0x6126, 0x6127, + 0x6128, 0x6129, 0x612a, 0x612b, 0x612c, 0x612d, 0x612e, 0x612f, + 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, + 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x613f, + 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0x6147, + 0x6148, 0x6149, 0x614a, 0x614b, 0x614c, 0x614d, 0x614e, 0x614f, + 0x6150, 0x6151, 0x6152, 0x6153, 0x6154, 0x6155, 0x6156, 0x6157, + 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615d, 0x615e, 0x615f, + 0x6160, 0x6161, 0x6162, 0x6163, 0x6164, 0x6165, 0x6166, 0x6167, + 0x6168, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, + 0x6170, 0x6171, 0x6172, 0x6173, 0x6174, 0x6175, 0x6176, 0x6177, + 0x6178, 0x6179, 0x617a, 0x617b, 0x617c, 0x617d, 0x617e, 0x617f, + 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, + 0x6188, 0x6189, 0x618a, 0x618b, 0x618c, 0x618d, 0x618e, 0x618f, + 0x6190, 0x6191, 0x6192, 0x6193, 0x6194, 0x6195, 0x6196, 0x6197, + 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619d, 0x619e, 0x619f, + 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61a7, + 0x61a8, 0x61a9, 0x61aa, 0x61ab, 0x61ac, 0x61ad, 0x61ae, 0x61af, + 0x61b0, 0x61b1, 0x61b2, 0x61b3, 0x61b4, 0x61b5, 0x61b6, 0x61b7, + 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, 0x61bd, 0x61be, 0x61bf, + 0x61c0, 0x61c1, 0x61c2, 0x61c3, 0x61c4, 0x61c5, 0x61c6, 0x61c7, + 0x61c8, 0x61c9, 0x61ca, 0x61cb, 0x61cc, 0x61cd, 0x61ce, 0x61cf, + 0x61d0, 0x61d1, 0x61d2, 0x61d3, 0x61d4, 0x61d5, 0x61d6, 0x61d7, + 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, 0x61dd, 0x61de, 0x61df, + 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, 0x61e5, 0x61e6, 0x61e7, + 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, 0x61ee, 0x61ef, + 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f5, 0x61f6, 0x61f7, + 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, 0x61ff, + 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6206, 0x6207, + 0x6208, 0x6209, 0x620a, 0x620b, 0x620c, 0x620d, 0x620e, 0x620f, + 0x6210, 0x6211, 0x6212, 0x6213, 0x6214, 0x6215, 0x6216, 0x6217, + 0x6218, 0x6219, 0x621a, 0x621b, 0x621c, 0x621d, 0x621e, 0x621f, + 0x6220, 0x6221, 0x6222, 0x6223, 0x6224, 0x6225, 0x6226, 0x6227, + 0x6228, 0x6229, 0x622a, 0x622b, 0x622c, 0x622d, 0x622e, 0x622f, + 0x6230, 0x6231, 0x6232, 0x6233, 0x6234, 0x6235, 0x6236, 0x6237, + 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x623d, 0x623e, 0x623f, + 0x6240, 0x6241, 0x6242, 0x6243, 0x6244, 0x6245, 0x6246, 0x6247, + 0x6248, 0x6249, 0x624a, 0x624b, 0x624c, 0x624d, 0x624e, 0x624f, + 0x6250, 0x6251, 0x6252, 0x6253, 0x6254, 0x6255, 0x6256, 0x6257, + 0x6258, 0x6259, 0x625a, 0x625b, 0x625c, 0x625d, 0x625e, 0x625f, + 0x6260, 0x6261, 0x6262, 0x6263, 0x6264, 0x6265, 0x6266, 0x6267, + 0x6268, 0x6269, 0x626a, 0x626b, 0x626c, 0x626d, 0x626e, 0x626f, + 0x6270, 0x6271, 0x6272, 0x6273, 0x6274, 0x6275, 0x6276, 0x6277, + 0x6278, 0x6279, 0x627a, 0x627b, 0x627c, 0x627d, 0x627e, 0x627f, + 0x6280, 0x6281, 0x6282, 0x6283, 0x6284, 0x6285, 0x6286, 0x6287, + 0x6288, 0x6289, 0x628a, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, + 0x6290, 0x6291, 0x6292, 0x6293, 0x6294, 0x6295, 0x6296, 0x6297, + 0x6298, 0x6299, 0x629a, 0x629b, 0x629c, 0x629d, 0x629e, 0x629f, + 0x62a0, 0x62a1, 0x62a2, 0x62a3, 0x62a4, 0x62a5, 0x62a6, 0x62a7, + 0x62a8, 0x62a9, 0x62aa, 0x62ab, 0x62ac, 0x62ad, 0x62ae, 0x62af, + 0x62b0, 0x62b1, 0x62b2, 0x62b3, 0x62b4, 0x62b5, 0x62b6, 0x62b7, + 0x62b8, 0x62b9, 0x62ba, 0x62bb, 0x62bc, 0x62bd, 0x62be, 0x62bf, + 0x62c0, 0x62c1, 0x62c2, 0x62c3, 0x62c4, 0x62c5, 0x62c6, 0x62c7, + 0x62c8, 0x62c9, 0x62ca, 0x62cb, 0x62cc, 0x62cd, 0x62ce, 0x62cf, + 0x62d0, 0x62d1, 0x62d2, 0x62d3, 0x62d4, 0x62d5, 0x62d6, 0x62d7, + 0x62d8, 0x62d9, 0x62da, 0x62db, 0x62dc, 0x62dd, 0x62de, 0x62df, + 0x62e0, 0x62e1, 0x62e2, 0x62e3, 0x62e4, 0x62e5, 0x62e6, 0x62e7, + 0x62e8, 0x62e9, 0x62ea, 0x62eb, 0x62ec, 0x62ed, 0x62ee, 0x62ef, + 0x62f0, 0x62f1, 0x62f2, 0x62f3, 0x62f4, 0x62f5, 0x62f6, 0x62f7, + 0x62f8, 0x62f9, 0x62fa, 0x62fb, 0x62fc, 0x62fd, 0x62fe, 0x62ff, + 0x6300, 0x6301, 0x6302, 0x6303, 0x6304, 0x6305, 0x6306, 0x6307, + 0x6308, 0x6309, 0x630a, 0x630b, 0x630c, 0x630d, 0x630e, 0x630f, + 0x6310, 0x6311, 0x6312, 0x6313, 0x6314, 0x6315, 0x6316, 0x6317, + 0x6318, 0x6319, 0x631a, 0x631b, 0x631c, 0x631d, 0x631e, 0x631f, + 0x6320, 0x6321, 0x6322, 0x6323, 0x6324, 0x6325, 0x6326, 0x6327, + 0x6328, 0x6329, 0x632a, 0x632b, 0x632c, 0x632d, 0x632e, 0x632f, + 0x6330, 0x6331, 0x6332, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, + 0x6338, 0x6339, 0x633a, 0x633b, 0x633c, 0x633d, 0x633e, 0x633f, + 0x6340, 0x6341, 0x6342, 0x6343, 0x6344, 0x6345, 0x6346, 0x6347, + 0x6348, 0x6349, 0x634a, 0x634b, 0x634c, 0x634d, 0x634e, 0x634f, + 0x6350, 0x6351, 0x6352, 0x6353, 0x6354, 0x6355, 0x6356, 0x6357, + 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x635e, 0x635f, + 0x6360, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6367, + 0x6368, 0x6369, 0x636a, 0x636b, 0x636c, 0x636d, 0x636e, 0x636f, + 0x6370, 0x6371, 0x6372, 0x6373, 0x6374, 0x6375, 0x6376, 0x6377, + 0x6378, 0x6379, 0x637a, 0x637b, 0x637c, 0x637d, 0x637e, 0x637f, + 0x6380, 0x6381, 0x6382, 0x6383, 0x6384, 0x6385, 0x6386, 0x6387, + 0x6388, 0x6389, 0x638a, 0x638b, 0x638c, 0x638d, 0x638e, 0x638f, + 0x6390, 0x6391, 0x6392, 0x6393, 0x6394, 0x6395, 0x6396, 0x6397, + 0x6398, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, + 0x63a0, 0x63a1, 0x63a2, 0x63a3, 0x63a4, 0x63a5, 0x63a6, 0x63a7, + 0x63a8, 0x63a9, 0x63aa, 0x63ab, 0x63ac, 0x63ad, 0x63ae, 0x63af, + 0x63b0, 0x63b1, 0x63b2, 0x63b3, 0x63b4, 0x63b5, 0x63b6, 0x63b7, + 0x63b8, 0x63b9, 0x63ba, 0x63bb, 0x63bc, 0x63bd, 0x63be, 0x63bf, + 0x63c0, 0x63c1, 0x63c2, 0x63c3, 0x63c4, 0x63c5, 0x63c6, 0x63c7, + 0x63c8, 0x63c9, 0x63ca, 0x63cb, 0x63cc, 0x63cd, 0x63ce, 0x63cf, + 0x63d0, 0x63d1, 0x63d2, 0x63d3, 0x63d4, 0x63d5, 0x63d6, 0x63d7, + 0x63d8, 0x63d9, 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63de, 0x63df, + 0x63e0, 0x63e1, 0x63e2, 0x63e3, 0x63e4, 0x63e5, 0x63e6, 0x63e7, + 0x63e8, 0x63e9, 0x63ea, 0x63eb, 0x63ec, 0x63ed, 0x63ee, 0x63ef, + 0x63f0, 0x63f1, 0x63f2, 0x63f3, 0x63f4, 0x63f5, 0x63f6, 0x63f7, + 0x63f8, 0x63f9, 0x63fa, 0x63fb, 0x63fc, 0x63fd, 0x63fe, 0x63ff, + 0x6400, 0x6401, 0x6402, 0x6403, 0x6404, 0x6405, 0x6406, 0x6407, + 0x6408, 0x6409, 0x640a, 0x640b, 0x640c, 0x640d, 0x640e, 0x640f, + 0x6410, 0x6411, 0x6412, 0x6413, 0x6414, 0x6415, 0x6416, 0x6417, + 0x6418, 0x6419, 0x641a, 0x641b, 0x641c, 0x641d, 0x641e, 0x641f, + 0x6420, 0x6421, 0x6422, 0x6423, 0x6424, 0x6425, 0x6426, 0x6427, + 0x6428, 0x6429, 0x642a, 0x642b, 0x642c, 0x642d, 0x642e, 0x642f, + 0x6430, 0x6431, 0x6432, 0x6433, 0x6434, 0x6435, 0x6436, 0x6437, + 0x6438, 0x6439, 0x643a, 0x643b, 0x643c, 0x643d, 0x643e, 0x643f, + 0x6440, 0x6441, 0x6442, 0x6443, 0x6444, 0x6445, 0x6446, 0x6447, + 0x6448, 0x6449, 0x644a, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, + 0x6450, 0x6451, 0x6452, 0x6453, 0x6454, 0x6455, 0x6456, 0x6457, + 0x6458, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645e, 0x645f, + 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6467, + 0x6468, 0x6469, 0x646a, 0x646b, 0x646c, 0x646d, 0x646e, 0x646f, + 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, + 0x6478, 0x6479, 0x647a, 0x647b, 0x647c, 0x647d, 0x647e, 0x647f, + 0x6480, 0x6481, 0x6482, 0x6483, 0x6484, 0x6485, 0x6486, 0x6487, + 0x6488, 0x6489, 0x648a, 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, + 0x6490, 0x6491, 0x6492, 0x6493, 0x6494, 0x6495, 0x6496, 0x6497, + 0x6498, 0x6499, 0x649a, 0x649b, 0x649c, 0x649d, 0x649e, 0x649f, + 0x64a0, 0x64a1, 0x64a2, 0x64a3, 0x64a4, 0x64a5, 0x64a6, 0x64a7, + 0x64a8, 0x64a9, 0x64aa, 0x64ab, 0x64ac, 0x64ad, 0x64ae, 0x64af, + 0x64b0, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b5, 0x64b6, 0x64b7, + 0x64b8, 0x64b9, 0x64ba, 0x64bb, 0x64bc, 0x64bd, 0x64be, 0x64bf, + 0x64c0, 0x64c1, 0x64c2, 0x64c3, 0x64c4, 0x64c5, 0x64c6, 0x64c7, + 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cd, 0x64ce, 0x64cf, + 0x64d0, 0x64d1, 0x64d2, 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d7, + 0x64d8, 0x64d9, 0x64da, 0x64db, 0x64dc, 0x64dd, 0x64de, 0x64df, + 0x64e0, 0x64e1, 0x64e2, 0x64e3, 0x64e4, 0x64e5, 0x64e6, 0x64e7, + 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, 0x64ef, + 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, 0x64f7, + 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, 0x64ff, + 0x6500, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, + 0x6508, 0x6509, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, + 0x6510, 0x6511, 0x6512, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, + 0x6518, 0x6519, 0x651a, 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, + 0x6520, 0x6521, 0x6522, 0x6523, 0x6524, 0x6525, 0x6526, 0x6527, + 0x6528, 0x6529, 0x652a, 0x652b, 0x652c, 0x652d, 0x652e, 0x652f, + 0x6530, 0x6531, 0x6532, 0x6533, 0x6534, 0x6535, 0x6536, 0x6537, + 0x6538, 0x6539, 0x653a, 0x653b, 0x653c, 0x653d, 0x653e, 0x653f, + 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x6546, 0x6547, + 0x6548, 0x6549, 0x654a, 0x654b, 0x654c, 0x654d, 0x654e, 0x654f, + 0x6550, 0x6551, 0x6552, 0x6553, 0x6554, 0x6555, 0x6556, 0x6557, + 0x6558, 0x6559, 0x655a, 0x655b, 0x655c, 0x655d, 0x655e, 0x655f, + 0x6560, 0x6561, 0x6562, 0x6563, 0x6564, 0x6565, 0x6566, 0x6567, + 0x6568, 0x6569, 0x656a, 0x656b, 0x656c, 0x656d, 0x656e, 0x656f, + 0x6570, 0x6571, 0x6572, 0x6573, 0x6574, 0x6575, 0x6576, 0x6577, + 0x6578, 0x6579, 0x657a, 0x657b, 0x657c, 0x657d, 0x657e, 0x657f, + 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6587, + 0x6588, 0x6589, 0x658a, 0x658b, 0x658c, 0x658d, 0x658e, 0x658f, + 0x6590, 0x6591, 0x6592, 0x6593, 0x6594, 0x6595, 0x6596, 0x6597, + 0x6598, 0x6599, 0x659a, 0x659b, 0x659c, 0x659d, 0x659e, 0x659f, + 0x65a0, 0x65a1, 0x65a2, 0x65a3, 0x65a4, 0x65a5, 0x65a6, 0x65a7, + 0x65a8, 0x65a9, 0x65aa, 0x65ab, 0x65ac, 0x65ad, 0x65ae, 0x65af, + 0x65b0, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, + 0x65b8, 0x65b9, 0x65ba, 0x65bb, 0x65bc, 0x65bd, 0x65be, 0x65bf, + 0x65c0, 0x65c1, 0x65c2, 0x65c3, 0x65c4, 0x65c5, 0x65c6, 0x65c7, + 0x65c8, 0x65c9, 0x65ca, 0x65cb, 0x65cc, 0x65cd, 0x65ce, 0x65cf, + 0x65d0, 0x65d1, 0x65d2, 0x65d3, 0x65d4, 0x65d5, 0x65d6, 0x65d7, + 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, 0x65df, + 0x65e0, 0x65e1, 0x65e2, 0x65e3, 0x65e4, 0x65e5, 0x65e6, 0x65e7, + 0x65e8, 0x65e9, 0x65ea, 0x65eb, 0x65ec, 0x65ed, 0x65ee, 0x65ef, + 0x65f0, 0x65f1, 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f6, 0x65f7, + 0x65f8, 0x65f9, 0x65fa, 0x65fb, 0x65fc, 0x65fd, 0x65fe, 0x65ff, + 0x6600, 0x6601, 0x6602, 0x6603, 0x6604, 0x6605, 0x6606, 0x6607, + 0x6608, 0x6609, 0x660a, 0x660b, 0x660c, 0x660d, 0x660e, 0x660f, + 0x6610, 0x6611, 0x6612, 0x6613, 0x6614, 0x6615, 0x6616, 0x6617, + 0x6618, 0x6619, 0x661a, 0x661b, 0x661c, 0x661d, 0x661e, 0x661f, + 0x6620, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6627, + 0x6628, 0x6629, 0x662a, 0x662b, 0x662c, 0x662d, 0x662e, 0x662f, + 0x6630, 0x6631, 0x6632, 0x6633, 0x6634, 0x6635, 0x6636, 0x6637, + 0x6638, 0x6639, 0x663a, 0x663b, 0x663c, 0x663d, 0x663e, 0x663f, + 0x6640, 0x6641, 0x6642, 0x6643, 0x6644, 0x6645, 0x6646, 0x6647, + 0x6648, 0x6649, 0x664a, 0x664b, 0x664c, 0x664d, 0x664e, 0x664f, + 0x6650, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x6656, 0x6657, + 0x6658, 0x6659, 0x665a, 0x665b, 0x665c, 0x665d, 0x665e, 0x665f, + 0x6660, 0x6661, 0x6662, 0x6663, 0x6664, 0x6665, 0x6666, 0x6667, + 0x6668, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x666e, 0x666f, + 0x6670, 0x6671, 0x6672, 0x6673, 0x6674, 0x6675, 0x6676, 0x6677, + 0x6678, 0x6679, 0x667a, 0x667b, 0x667c, 0x667d, 0x667e, 0x667f, + 0x6680, 0x6681, 0x6682, 0x6683, 0x6684, 0x6685, 0x6686, 0x6687, + 0x6688, 0x6689, 0x668a, 0x668b, 0x668c, 0x668d, 0x668e, 0x668f, + 0x6690, 0x6691, 0x6692, 0x6693, 0x6694, 0x6695, 0x6696, 0x6697, + 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669d, 0x669e, 0x669f, + 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a7, + 0x66a8, 0x66a9, 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66ae, 0x66af, + 0x66b0, 0x66b1, 0x66b2, 0x66b3, 0x66b4, 0x66b5, 0x66b6, 0x66b7, + 0x66b8, 0x66b9, 0x66ba, 0x66bb, 0x66bc, 0x66bd, 0x66be, 0x66bf, + 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, 0x66c6, 0x66c7, + 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, 0x66ce, 0x66cf, + 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x66d6, 0x66d7, + 0x66d8, 0x66d9, 0x66da, 0x66db, 0x66dc, 0x66dd, 0x66de, 0x66df, + 0x66e0, 0x66e1, 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e6, 0x66e7, + 0x66e8, 0x66e9, 0x66ea, 0x66eb, 0x66ec, 0x66ed, 0x66ee, 0x66ef, + 0x66f0, 0x66f1, 0x66f2, 0x66f3, 0x66f4, 0x66f5, 0x66f6, 0x66f7, + 0x66f8, 0x66f9, 0x66fa, 0x66fb, 0x66fc, 0x66fd, 0x66fe, 0x66ff, + 0x6700, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, 0x6706, 0x6707, + 0x6708, 0x6709, 0x670a, 0x670b, 0x670c, 0x670d, 0x670e, 0x670f, + 0x6710, 0x6711, 0x6712, 0x6713, 0x6714, 0x6715, 0x6716, 0x6717, + 0x6718, 0x6719, 0x671a, 0x671b, 0x671c, 0x671d, 0x671e, 0x671f, + 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6726, 0x6727, + 0x6728, 0x6729, 0x672a, 0x672b, 0x672c, 0x672d, 0x672e, 0x672f, + 0x6730, 0x6731, 0x6732, 0x6733, 0x6734, 0x6735, 0x6736, 0x6737, + 0x6738, 0x6739, 0x673a, 0x673b, 0x673c, 0x673d, 0x673e, 0x673f, + 0x6740, 0x6741, 0x6742, 0x6743, 0x6744, 0x6745, 0x6746, 0x6747, + 0x6748, 0x6749, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, + 0x6750, 0x6751, 0x6752, 0x6753, 0x6754, 0x6755, 0x6756, 0x6757, + 0x6758, 0x6759, 0x675a, 0x675b, 0x675c, 0x675d, 0x675e, 0x675f, + 0x6760, 0x6761, 0x6762, 0x6763, 0x6764, 0x6765, 0x6766, 0x6767, + 0x6768, 0x6769, 0x676a, 0x676b, 0x676c, 0x676d, 0x676e, 0x676f, + 0x6770, 0x6771, 0x6772, 0x6773, 0x6774, 0x6775, 0x6776, 0x6777, + 0x6778, 0x6779, 0x677a, 0x677b, 0x677c, 0x677d, 0x677e, 0x677f, + 0x6780, 0x6781, 0x6782, 0x6783, 0x6784, 0x6785, 0x6786, 0x6787, + 0x6788, 0x6789, 0x678a, 0x678b, 0x678c, 0x678d, 0x678e, 0x678f, + 0x6790, 0x6791, 0x6792, 0x6793, 0x6794, 0x6795, 0x6796, 0x6797, + 0x6798, 0x6799, 0x679a, 0x679b, 0x679c, 0x679d, 0x679e, 0x679f, + 0x67a0, 0x67a1, 0x67a2, 0x67a3, 0x67a4, 0x67a5, 0x67a6, 0x67a7, + 0x67a8, 0x67a9, 0x67aa, 0x67ab, 0x67ac, 0x67ad, 0x67ae, 0x67af, + 0x67b0, 0x67b1, 0x67b2, 0x67b3, 0x67b4, 0x67b5, 0x67b6, 0x67b7, + 0x67b8, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, + 0x67c0, 0x67c1, 0x67c2, 0x67c3, 0x67c4, 0x67c5, 0x67c6, 0x67c7, + 0x67c8, 0x67c9, 0x67ca, 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67cf, + 0x67d0, 0x67d1, 0x67d2, 0x67d3, 0x67d4, 0x67d5, 0x67d6, 0x67d7, + 0x67d8, 0x67d9, 0x67da, 0x67db, 0x67dc, 0x67dd, 0x67de, 0x67df, + 0x67e0, 0x67e1, 0x67e2, 0x67e3, 0x67e4, 0x67e5, 0x67e6, 0x67e7, + 0x67e8, 0x67e9, 0x67ea, 0x67eb, 0x67ec, 0x67ed, 0x67ee, 0x67ef, + 0x67f0, 0x67f1, 0x67f2, 0x67f3, 0x67f4, 0x67f5, 0x67f6, 0x67f7, + 0x67f8, 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fd, 0x67fe, 0x67ff, + 0x6800, 0x6801, 0x6802, 0x6803, 0x6804, 0x6805, 0x6806, 0x6807, + 0x6808, 0x6809, 0x680a, 0x680b, 0x680c, 0x680d, 0x680e, 0x680f, + 0x6810, 0x6811, 0x6812, 0x6813, 0x6814, 0x6815, 0x6816, 0x6817, + 0x6818, 0x6819, 0x681a, 0x681b, 0x681c, 0x681d, 0x681e, 0x681f, + 0x6820, 0x6821, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, + 0x6828, 0x6829, 0x682a, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, + 0x6830, 0x6831, 0x6832, 0x6833, 0x6834, 0x6835, 0x6836, 0x6837, + 0x6838, 0x6839, 0x683a, 0x683b, 0x683c, 0x683d, 0x683e, 0x683f, + 0x6840, 0x6841, 0x6842, 0x6843, 0x6844, 0x6845, 0x6846, 0x6847, + 0x6848, 0x6849, 0x684a, 0x684b, 0x684c, 0x684d, 0x684e, 0x684f, + 0x6850, 0x6851, 0x6852, 0x6853, 0x6854, 0x6855, 0x6856, 0x6857, + 0x6858, 0x6859, 0x685a, 0x685b, 0x685c, 0x685d, 0x685e, 0x685f, + 0x6860, 0x6861, 0x6862, 0x6863, 0x6864, 0x6865, 0x6866, 0x6867, + 0x6868, 0x6869, 0x686a, 0x686b, 0x686c, 0x686d, 0x686e, 0x686f, + 0x6870, 0x6871, 0x6872, 0x6873, 0x6874, 0x6875, 0x6876, 0x6877, + 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, + 0x6880, 0x6881, 0x6882, 0x6883, 0x6884, 0x6885, 0x6886, 0x6887, + 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, 0x688e, 0x688f, + 0x6890, 0x6891, 0x6892, 0x6893, 0x6894, 0x6895, 0x6896, 0x6897, + 0x6898, 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, + 0x68a0, 0x68a1, 0x68a2, 0x68a3, 0x68a4, 0x68a5, 0x68a6, 0x68a7, + 0x68a8, 0x68a9, 0x68aa, 0x68ab, 0x68ac, 0x68ad, 0x68ae, 0x68af, + 0x68b0, 0x68b1, 0x68b2, 0x68b3, 0x68b4, 0x68b5, 0x68b6, 0x68b7, + 0x68b8, 0x68b9, 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, + 0x68c0, 0x68c1, 0x68c2, 0x68c3, 0x68c4, 0x68c5, 0x68c6, 0x68c7, + 0x68c8, 0x68c9, 0x68ca, 0x68cb, 0x68cc, 0x68cd, 0x68ce, 0x68cf, + 0x68d0, 0x68d1, 0x68d2, 0x68d3, 0x68d4, 0x68d5, 0x68d6, 0x68d7, + 0x68d8, 0x68d9, 0x68da, 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, + 0x68e0, 0x68e1, 0x68e2, 0x68e3, 0x68e4, 0x68e5, 0x68e6, 0x68e7, + 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ee, 0x68ef, + 0x68f0, 0x68f1, 0x68f2, 0x68f3, 0x68f4, 0x68f5, 0x68f6, 0x68f7, + 0x68f8, 0x68f9, 0x68fa, 0x68fb, 0x68fc, 0x68fd, 0x68fe, 0x68ff, + 0x6900, 0x6901, 0x6902, 0x6903, 0x6904, 0x6905, 0x6906, 0x6907, + 0x6908, 0x6909, 0x690a, 0x690b, 0x690c, 0x690d, 0x690e, 0x690f, + 0x6910, 0x6911, 0x6912, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, + 0x6918, 0x6919, 0x691a, 0x691b, 0x691c, 0x691d, 0x691e, 0x691f, + 0x6920, 0x6921, 0x6922, 0x6923, 0x6924, 0x6925, 0x6926, 0x6927, + 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692d, 0x692e, 0x692f, + 0x6930, 0x6931, 0x6932, 0x6933, 0x6934, 0x6935, 0x6936, 0x6937, + 0x6938, 0x6939, 0x693a, 0x693b, 0x693c, 0x693d, 0x693e, 0x693f, + 0x6940, 0x6941, 0x6942, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, + 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, 0x694d, 0x694e, 0x694f, + 0x6950, 0x6951, 0x6952, 0x6953, 0x6954, 0x6955, 0x6956, 0x6957, + 0x6958, 0x6959, 0x695a, 0x695b, 0x695c, 0x695d, 0x695e, 0x695f, + 0x6960, 0x6961, 0x6962, 0x6963, 0x6964, 0x6965, 0x6966, 0x6967, + 0x6968, 0x6969, 0x696a, 0x696b, 0x696c, 0x696d, 0x696e, 0x696f, + 0x6970, 0x6971, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x6977, + 0x6978, 0x6979, 0x697a, 0x697b, 0x697c, 0x697d, 0x697e, 0x697f, + 0x6980, 0x6981, 0x6982, 0x6983, 0x6984, 0x6985, 0x6986, 0x6987, + 0x6988, 0x6989, 0x698a, 0x698b, 0x698c, 0x698d, 0x698e, 0x698f, + 0x6990, 0x6991, 0x6992, 0x6993, 0x6994, 0x6995, 0x6996, 0x6997, + 0x6998, 0x6999, 0x699a, 0x699b, 0x699c, 0x699d, 0x699e, 0x699f, + 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, 0x69a7, + 0x69a8, 0x69a9, 0x69aa, 0x69ab, 0x69ac, 0x69ad, 0x69ae, 0x69af, + 0x69b0, 0x69b1, 0x69b2, 0x69b3, 0x69b4, 0x69b5, 0x69b6, 0x69b7, + 0x69b8, 0x69b9, 0x69ba, 0x69bb, 0x69bc, 0x69bd, 0x69be, 0x69bf, + 0x69c0, 0x69c1, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, + 0x69c8, 0x69c9, 0x69ca, 0x69cb, 0x69cc, 0x69cd, 0x69ce, 0x69cf, + 0x69d0, 0x69d1, 0x69d2, 0x69d3, 0x69d4, 0x69d5, 0x69d6, 0x69d7, + 0x69d8, 0x69d9, 0x69da, 0x69db, 0x69dc, 0x69dd, 0x69de, 0x69df, + 0x69e0, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, + 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ed, 0x69ee, 0x69ef, + 0x69f0, 0x69f1, 0x69f2, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, + 0x69f8, 0x69f9, 0x69fa, 0x69fb, 0x69fc, 0x69fd, 0x69fe, 0x69ff, + 0x6a00, 0x6a01, 0x6a02, 0x6a03, 0x6a04, 0x6a05, 0x6a06, 0x6a07, + 0x6a08, 0x6a09, 0x6a0a, 0x6a0b, 0x6a0c, 0x6a0d, 0x6a0e, 0x6a0f, + 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a17, + 0x6a18, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, 0x6a1f, + 0x6a20, 0x6a21, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, + 0x6a28, 0x6a29, 0x6a2a, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a2f, + 0x6a30, 0x6a31, 0x6a32, 0x6a33, 0x6a34, 0x6a35, 0x6a36, 0x6a37, + 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3d, 0x6a3e, 0x6a3f, + 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x6a47, + 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, + 0x6a50, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, + 0x6a58, 0x6a59, 0x6a5a, 0x6a5b, 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, + 0x6a60, 0x6a61, 0x6a62, 0x6a63, 0x6a64, 0x6a65, 0x6a66, 0x6a67, + 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, + 0x6a70, 0x6a71, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, + 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a7c, 0x6a7d, 0x6a7e, 0x6a7f, + 0x6a80, 0x6a81, 0x6a82, 0x6a83, 0x6a84, 0x6a85, 0x6a86, 0x6a87, + 0x6a88, 0x6a89, 0x6a8a, 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8e, 0x6a8f, + 0x6a90, 0x6a91, 0x6a92, 0x6a93, 0x6a94, 0x6a95, 0x6a96, 0x6a97, + 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, 0x6a9f, + 0x6aa0, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, + 0x6aa8, 0x6aa9, 0x6aaa, 0x6aab, 0x6aac, 0x6aad, 0x6aae, 0x6aaf, + 0x6ab0, 0x6ab1, 0x6ab2, 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, + 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, + 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, + 0x6ac8, 0x6ac9, 0x6aca, 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, + 0x6ad0, 0x6ad1, 0x6ad2, 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, + 0x6ad8, 0x6ad9, 0x6ada, 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, + 0x6ae0, 0x6ae1, 0x6ae2, 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, + 0x6ae8, 0x6ae9, 0x6aea, 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, + 0x6af0, 0x6af1, 0x6af2, 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, + 0x6af8, 0x6af9, 0x6afa, 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, + 0x6b00, 0x6b01, 0x6b02, 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, + 0x6b08, 0x6b09, 0x6b0a, 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, + 0x6b10, 0x6b11, 0x6b12, 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, + 0x6b18, 0x6b19, 0x6b1a, 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, + 0x6b20, 0x6b21, 0x6b22, 0x6b23, 0x6b24, 0x6b25, 0x6b26, 0x6b27, + 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, 0x6b2f, + 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b37, + 0x6b38, 0x6b39, 0x6b3a, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3e, 0x6b3f, + 0x6b40, 0x6b41, 0x6b42, 0x6b43, 0x6b44, 0x6b45, 0x6b46, 0x6b47, + 0x6b48, 0x6b49, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b4e, 0x6b4f, + 0x6b50, 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, + 0x6b58, 0x6b59, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, + 0x6b60, 0x6b61, 0x6b62, 0x6b63, 0x6b64, 0x6b65, 0x6b66, 0x6b67, + 0x6b68, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, + 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, + 0x6b78, 0x6b79, 0x6b7a, 0x6b7b, 0x6b7c, 0x6b7d, 0x6b7e, 0x6b7f, + 0x6b80, 0x6b81, 0x6b82, 0x6b83, 0x6b84, 0x6b85, 0x6b86, 0x6b87, + 0x6b88, 0x6b89, 0x6b8a, 0x6b8b, 0x6b8c, 0x6b8d, 0x6b8e, 0x6b8f, + 0x6b90, 0x6b91, 0x6b92, 0x6b93, 0x6b94, 0x6b95, 0x6b96, 0x6b97, + 0x6b98, 0x6b99, 0x6b9a, 0x6b9b, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, + 0x6ba0, 0x6ba1, 0x6ba2, 0x6ba3, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, + 0x6ba8, 0x6ba9, 0x6baa, 0x6bab, 0x6bac, 0x6bad, 0x6bae, 0x6baf, + 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb3, 0x6bb4, 0x6bb5, 0x6bb6, 0x6bb7, + 0x6bb8, 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bbf, + 0x6bc0, 0x6bc1, 0x6bc2, 0x6bc3, 0x6bc4, 0x6bc5, 0x6bc6, 0x6bc7, + 0x6bc8, 0x6bc9, 0x6bca, 0x6bcb, 0x6bcc, 0x6bcd, 0x6bce, 0x6bcf, + 0x6bd0, 0x6bd1, 0x6bd2, 0x6bd3, 0x6bd4, 0x6bd5, 0x6bd6, 0x6bd7, + 0x6bd8, 0x6bd9, 0x6bda, 0x6bdb, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, + 0x6be0, 0x6be1, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, + 0x6be8, 0x6be9, 0x6bea, 0x6beb, 0x6bec, 0x6bed, 0x6bee, 0x6bef, + 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf3, 0x6bf4, 0x6bf5, 0x6bf6, 0x6bf7, + 0x6bf8, 0x6bf9, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfd, 0x6bfe, 0x6bff, + 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c05, 0x6c06, 0x6c07, + 0x6c08, 0x6c09, 0x6c0a, 0x6c0b, 0x6c0c, 0x6c0d, 0x6c0e, 0x6c0f, + 0x6c10, 0x6c11, 0x6c12, 0x6c13, 0x6c14, 0x6c15, 0x6c16, 0x6c17, + 0x6c18, 0x6c19, 0x6c1a, 0x6c1b, 0x6c1c, 0x6c1d, 0x6c1e, 0x6c1f, + 0x6c20, 0x6c21, 0x6c22, 0x6c23, 0x6c24, 0x6c25, 0x6c26, 0x6c27, + 0x6c28, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c2e, 0x6c2f, + 0x6c30, 0x6c31, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x6c36, 0x6c37, + 0x6c38, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3d, 0x6c3e, 0x6c3f, + 0x6c40, 0x6c41, 0x6c42, 0x6c43, 0x6c44, 0x6c45, 0x6c46, 0x6c47, + 0x6c48, 0x6c49, 0x6c4a, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, 0x6c4f, + 0x6c50, 0x6c51, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c56, 0x6c57, + 0x6c58, 0x6c59, 0x6c5a, 0x6c5b, 0x6c5c, 0x6c5d, 0x6c5e, 0x6c5f, + 0x6c60, 0x6c61, 0x6c62, 0x6c63, 0x6c64, 0x6c65, 0x6c66, 0x6c67, + 0x6c68, 0x6c69, 0x6c6a, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, + 0x6c70, 0x6c71, 0x6c72, 0x6c73, 0x6c74, 0x6c75, 0x6c76, 0x6c77, + 0x6c78, 0x6c79, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7d, 0x6c7e, 0x6c7f, + 0x6c80, 0x6c81, 0x6c82, 0x6c83, 0x6c84, 0x6c85, 0x6c86, 0x6c87, + 0x6c88, 0x6c89, 0x6c8a, 0x6c8b, 0x6c8c, 0x6c8d, 0x6c8e, 0x6c8f, + 0x6c90, 0x6c91, 0x6c92, 0x6c93, 0x6c94, 0x6c95, 0x6c96, 0x6c97, + 0x6c98, 0x6c99, 0x6c9a, 0x6c9b, 0x6c9c, 0x6c9d, 0x6c9e, 0x6c9f, + 0x6ca0, 0x6ca1, 0x6ca2, 0x6ca3, 0x6ca4, 0x6ca5, 0x6ca6, 0x6ca7, + 0x6ca8, 0x6ca9, 0x6caa, 0x6cab, 0x6cac, 0x6cad, 0x6cae, 0x6caf, + 0x6cb0, 0x6cb1, 0x6cb2, 0x6cb3, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, + 0x6cb8, 0x6cb9, 0x6cba, 0x6cbb, 0x6cbc, 0x6cbd, 0x6cbe, 0x6cbf, + 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc4, 0x6cc5, 0x6cc6, 0x6cc7, + 0x6cc8, 0x6cc9, 0x6cca, 0x6ccb, 0x6ccc, 0x6ccd, 0x6cce, 0x6ccf, + 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd3, 0x6cd4, 0x6cd5, 0x6cd6, 0x6cd7, + 0x6cd8, 0x6cd9, 0x6cda, 0x6cdb, 0x6cdc, 0x6cdd, 0x6cde, 0x6cdf, + 0x6ce0, 0x6ce1, 0x6ce2, 0x6ce3, 0x6ce4, 0x6ce5, 0x6ce6, 0x6ce7, + 0x6ce8, 0x6ce9, 0x6cea, 0x6ceb, 0x6cec, 0x6ced, 0x6cee, 0x6cef, + 0x6cf0, 0x6cf1, 0x6cf2, 0x6cf3, 0x6cf4, 0x6cf5, 0x6cf6, 0x6cf7, + 0x6cf8, 0x6cf9, 0x6cfa, 0x6cfb, 0x6cfc, 0x6cfd, 0x6cfe, 0x6cff, + 0x6d00, 0x6d01, 0x6d02, 0x6d03, 0x6d04, 0x6d05, 0x6d06, 0x6d07, + 0x6d08, 0x6d09, 0x6d0a, 0x6d0b, 0x6d0c, 0x6d0d, 0x6d0e, 0x6d0f, + 0x6d10, 0x6d11, 0x6d12, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d17, + 0x6d18, 0x6d19, 0x6d1a, 0x6d1b, 0x6d1c, 0x6d1d, 0x6d1e, 0x6d1f, + 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d25, 0x6d26, 0x6d27, + 0x6d28, 0x6d29, 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, + 0x6d30, 0x6d31, 0x6d32, 0x6d33, 0x6d34, 0x6d35, 0x6d36, 0x6d37, + 0x6d38, 0x6d39, 0x6d3a, 0x6d3b, 0x6d3c, 0x6d3d, 0x6d3e, 0x6d3f, + 0x6d40, 0x6d41, 0x6d42, 0x6d43, 0x6d44, 0x6d45, 0x6d46, 0x6d47, + 0x6d48, 0x6d49, 0x6d4a, 0x6d4b, 0x6d4c, 0x6d4d, 0x6d4e, 0x6d4f, + 0x6d50, 0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6d56, 0x6d57, + 0x6d58, 0x6d59, 0x6d5a, 0x6d5b, 0x6d5c, 0x6d5d, 0x6d5e, 0x6d5f, + 0x6d60, 0x6d61, 0x6d62, 0x6d63, 0x6d64, 0x6d65, 0x6d66, 0x6d67, + 0x6d68, 0x6d69, 0x6d6a, 0x6d6b, 0x6d6c, 0x6d6d, 0x6d6e, 0x6d6f, + 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d74, 0x6d75, 0x6d76, 0x6d77, + 0x6d78, 0x6d79, 0x6d7a, 0x6d7b, 0x6d7c, 0x6d7d, 0x6d7e, 0x6d7f, + 0x6d80, 0x6d81, 0x6d82, 0x6d83, 0x6d84, 0x6d85, 0x6d86, 0x6d87, + 0x6d88, 0x6d89, 0x6d8a, 0x6d8b, 0x6d8c, 0x6d8d, 0x6d8e, 0x6d8f, + 0x6d90, 0x6d91, 0x6d92, 0x6d93, 0x6d94, 0x6d95, 0x6d96, 0x6d97, + 0x6d98, 0x6d99, 0x6d9a, 0x6d9b, 0x6d9c, 0x6d9d, 0x6d9e, 0x6d9f, + 0x6da0, 0x6da1, 0x6da2, 0x6da3, 0x6da4, 0x6da5, 0x6da6, 0x6da7, + 0x6da8, 0x6da9, 0x6daa, 0x6dab, 0x6dac, 0x6dad, 0x6dae, 0x6daf, + 0x6db0, 0x6db1, 0x6db2, 0x6db3, 0x6db4, 0x6db5, 0x6db6, 0x6db7, + 0x6db8, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, 0x6dbf, + 0x6dc0, 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc4, 0x6dc5, 0x6dc6, 0x6dc7, + 0x6dc8, 0x6dc9, 0x6dca, 0x6dcb, 0x6dcc, 0x6dcd, 0x6dce, 0x6dcf, + 0x6dd0, 0x6dd1, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, 0x6dd6, 0x6dd7, + 0x6dd8, 0x6dd9, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddd, 0x6dde, 0x6ddf, + 0x6de0, 0x6de1, 0x6de2, 0x6de3, 0x6de4, 0x6de5, 0x6de6, 0x6de7, + 0x6de8, 0x6de9, 0x6dea, 0x6deb, 0x6dec, 0x6ded, 0x6dee, 0x6def, + 0x6df0, 0x6df1, 0x6df2, 0x6df3, 0x6df4, 0x6df5, 0x6df6, 0x6df7, + 0x6df8, 0x6df9, 0x6dfa, 0x6dfb, 0x6dfc, 0x6dfd, 0x6dfe, 0x6dff, + 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e05, 0x6e06, 0x6e07, + 0x6e08, 0x6e09, 0x6e0a, 0x6e0b, 0x6e0c, 0x6e0d, 0x6e0e, 0x6e0f, + 0x6e10, 0x6e11, 0x6e12, 0x6e13, 0x6e14, 0x6e15, 0x6e16, 0x6e17, + 0x6e18, 0x6e19, 0x6e1a, 0x6e1b, 0x6e1c, 0x6e1d, 0x6e1e, 0x6e1f, + 0x6e20, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x6e25, 0x6e26, 0x6e27, + 0x6e28, 0x6e29, 0x6e2a, 0x6e2b, 0x6e2c, 0x6e2d, 0x6e2e, 0x6e2f, + 0x6e30, 0x6e31, 0x6e32, 0x6e33, 0x6e34, 0x6e35, 0x6e36, 0x6e37, + 0x6e38, 0x6e39, 0x6e3a, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, + 0x6e40, 0x6e41, 0x6e42, 0x6e43, 0x6e44, 0x6e45, 0x6e46, 0x6e47, + 0x6e48, 0x6e49, 0x6e4a, 0x6e4b, 0x6e4c, 0x6e4d, 0x6e4e, 0x6e4f, + 0x6e50, 0x6e51, 0x6e52, 0x6e53, 0x6e54, 0x6e55, 0x6e56, 0x6e57, + 0x6e58, 0x6e59, 0x6e5a, 0x6e5b, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e5f, + 0x6e60, 0x6e61, 0x6e62, 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, + 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, + 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, 0x6e75, 0x6e76, 0x6e77, + 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6e7e, 0x6e7f, + 0x6e80, 0x6e81, 0x6e82, 0x6e83, 0x6e84, 0x6e85, 0x6e86, 0x6e87, + 0x6e88, 0x6e89, 0x6e8a, 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e8f, + 0x6e90, 0x6e91, 0x6e92, 0x6e93, 0x6e94, 0x6e95, 0x6e96, 0x6e97, + 0x6e98, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9c, 0x6e9d, 0x6e9e, 0x6e9f, + 0x6ea0, 0x6ea1, 0x6ea2, 0x6ea3, 0x6ea4, 0x6ea5, 0x6ea6, 0x6ea7, + 0x6ea8, 0x6ea9, 0x6eaa, 0x6eab, 0x6eac, 0x6ead, 0x6eae, 0x6eaf, + 0x6eb0, 0x6eb1, 0x6eb2, 0x6eb3, 0x6eb4, 0x6eb5, 0x6eb6, 0x6eb7, + 0x6eb8, 0x6eb9, 0x6eba, 0x6ebb, 0x6ebc, 0x6ebd, 0x6ebe, 0x6ebf, + 0x6ec0, 0x6ec1, 0x6ec2, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, 0x6ec7, + 0x6ec8, 0x6ec9, 0x6eca, 0x6ecb, 0x6ecc, 0x6ecd, 0x6ece, 0x6ecf, + 0x6ed0, 0x6ed1, 0x6ed2, 0x6ed3, 0x6ed4, 0x6ed5, 0x6ed6, 0x6ed7, + 0x6ed8, 0x6ed9, 0x6eda, 0x6edb, 0x6edc, 0x6edd, 0x6ede, 0x6edf, + 0x6ee0, 0x6ee1, 0x6ee2, 0x6ee3, 0x6ee4, 0x6ee5, 0x6ee6, 0x6ee7, + 0x6ee8, 0x6ee9, 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, + 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef4, 0x6ef5, 0x6ef6, 0x6ef7, + 0x6ef8, 0x6ef9, 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, + 0x6f00, 0x6f01, 0x6f02, 0x6f03, 0x6f04, 0x6f05, 0x6f06, 0x6f07, + 0x6f08, 0x6f09, 0x6f0a, 0x6f0b, 0x6f0c, 0x6f0d, 0x6f0e, 0x6f0f, + 0x6f10, 0x6f11, 0x6f12, 0x6f13, 0x6f14, 0x6f15, 0x6f16, 0x6f17, + 0x6f18, 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, + 0x6f20, 0x6f21, 0x6f22, 0x6f23, 0x6f24, 0x6f25, 0x6f26, 0x6f27, + 0x6f28, 0x6f29, 0x6f2a, 0x6f2b, 0x6f2c, 0x6f2d, 0x6f2e, 0x6f2f, + 0x6f30, 0x6f31, 0x6f32, 0x6f33, 0x6f34, 0x6f35, 0x6f36, 0x6f37, + 0x6f38, 0x6f39, 0x6f3a, 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, + 0x6f40, 0x6f41, 0x6f42, 0x6f43, 0x6f44, 0x6f45, 0x6f46, 0x6f47, + 0x6f48, 0x6f49, 0x6f4a, 0x6f4b, 0x6f4c, 0x6f4d, 0x6f4e, 0x6f4f, + 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, + 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, + 0x6f60, 0x6f61, 0x6f62, 0x6f63, 0x6f64, 0x6f65, 0x6f66, 0x6f67, + 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x6f6d, 0x6f6e, 0x6f6f, + 0x6f70, 0x6f71, 0x6f72, 0x6f73, 0x6f74, 0x6f75, 0x6f76, 0x6f77, + 0x6f78, 0x6f79, 0x6f7a, 0x6f7b, 0x6f7c, 0x6f7d, 0x6f7e, 0x6f7f, + 0x6f80, 0x6f81, 0x6f82, 0x6f83, 0x6f84, 0x6f85, 0x6f86, 0x6f87, + 0x6f88, 0x6f89, 0x6f8a, 0x6f8b, 0x6f8c, 0x6f8d, 0x6f8e, 0x6f8f, + 0x6f90, 0x6f91, 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, + 0x6f98, 0x6f99, 0x6f9a, 0x6f9b, 0x6f9c, 0x6f9d, 0x6f9e, 0x6f9f, + 0x6fa0, 0x6fa1, 0x6fa2, 0x6fa3, 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa7, + 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, 0x6fad, 0x6fae, 0x6faf, + 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb3, 0x6fb4, 0x6fb5, 0x6fb6, 0x6fb7, + 0x6fb8, 0x6fb9, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, + 0x6fc0, 0x6fc1, 0x6fc2, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, + 0x6fc8, 0x6fc9, 0x6fca, 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, + 0x6fd0, 0x6fd1, 0x6fd2, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, + 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, 0x6fdd, 0x6fde, 0x6fdf, + 0x6fe0, 0x6fe1, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, 0x6fe6, 0x6fe7, + 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, 0x6fee, 0x6fef, + 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, + 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, + 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, + 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, + 0x7010, 0x7011, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, + 0x7018, 0x7019, 0x701a, 0x701b, 0x701c, 0x701d, 0x701e, 0x701f, + 0x7020, 0x7021, 0x7022, 0x7023, 0x7024, 0x7025, 0x7026, 0x7027, + 0x7028, 0x7029, 0x702a, 0x702b, 0x702c, 0x702d, 0x702e, 0x702f, + 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x7036, 0x7037, + 0x7038, 0x7039, 0x703a, 0x703b, 0x703c, 0x703d, 0x703e, 0x703f, + 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, + 0x7048, 0x7049, 0x704a, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, + 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, + 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705e, 0x705f, + 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, + 0x7068, 0x7069, 0x706a, 0x706b, 0x706c, 0x706d, 0x706e, 0x706f, + 0x7070, 0x7071, 0x7072, 0x7073, 0x7074, 0x7075, 0x7076, 0x7077, + 0x7078, 0x7079, 0x707a, 0x707b, 0x707c, 0x707d, 0x707e, 0x707f, + 0x7080, 0x7081, 0x7082, 0x7083, 0x7084, 0x7085, 0x7086, 0x7087, + 0x7088, 0x7089, 0x708a, 0x708b, 0x708c, 0x708d, 0x708e, 0x708f, + 0x7090, 0x7091, 0x7092, 0x7093, 0x7094, 0x7095, 0x7096, 0x7097, + 0x7098, 0x7099, 0x709a, 0x709b, 0x709c, 0x709d, 0x709e, 0x709f, + 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, + 0x70a8, 0x70a9, 0x70aa, 0x70ab, 0x70ac, 0x70ad, 0x70ae, 0x70af, + 0x70b0, 0x70b1, 0x70b2, 0x70b3, 0x70b4, 0x70b5, 0x70b6, 0x70b7, + 0x70b8, 0x70b9, 0x70ba, 0x70bb, 0x70bc, 0x70bd, 0x70be, 0x70bf, + 0x70c0, 0x70c1, 0x70c2, 0x70c3, 0x70c4, 0x70c5, 0x70c6, 0x70c7, + 0x70c8, 0x70c9, 0x70ca, 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, + 0x70d0, 0x70d1, 0x70d2, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, + 0x70d8, 0x70d9, 0x70da, 0x70db, 0x70dc, 0x70dd, 0x70de, 0x70df, + 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e4, 0x70e5, 0x70e6, 0x70e7, + 0x70e8, 0x70e9, 0x70ea, 0x70eb, 0x70ec, 0x70ed, 0x70ee, 0x70ef, + 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70f6, 0x70f7, + 0x70f8, 0x70f9, 0x70fa, 0x70fb, 0x70fc, 0x70fd, 0x70fe, 0x70ff, + 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, + 0x7108, 0x7109, 0x710a, 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, + 0x7110, 0x7111, 0x7112, 0x7113, 0x7114, 0x7115, 0x7116, 0x7117, + 0x7118, 0x7119, 0x711a, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, + 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7126, 0x7127, + 0x7128, 0x7129, 0x712a, 0x712b, 0x712c, 0x712d, 0x712e, 0x712f, + 0x7130, 0x7131, 0x7132, 0x7133, 0x7134, 0x7135, 0x7136, 0x7137, + 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, + 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7145, 0x7146, 0x7147, + 0x7148, 0x7149, 0x714a, 0x714b, 0x714c, 0x714d, 0x714e, 0x714f, + 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, + 0x7158, 0x7159, 0x715a, 0x715b, 0x715c, 0x715d, 0x715e, 0x715f, + 0x7160, 0x7161, 0x7162, 0x7163, 0x7164, 0x7165, 0x7166, 0x7167, + 0x7168, 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, + 0x7170, 0x7171, 0x7172, 0x7173, 0x7174, 0x7175, 0x7176, 0x7177, + 0x7178, 0x7179, 0x717a, 0x717b, 0x717c, 0x717d, 0x717e, 0x717f, + 0x7180, 0x7181, 0x7182, 0x7183, 0x7184, 0x7185, 0x7186, 0x7187, + 0x7188, 0x7189, 0x718a, 0x718b, 0x718c, 0x718d, 0x718e, 0x718f, + 0x7190, 0x7191, 0x7192, 0x7193, 0x7194, 0x7195, 0x7196, 0x7197, + 0x7198, 0x7199, 0x719a, 0x719b, 0x719c, 0x719d, 0x719e, 0x719f, + 0x71a0, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, 0x71a7, + 0x71a8, 0x71a9, 0x71aa, 0x71ab, 0x71ac, 0x71ad, 0x71ae, 0x71af, + 0x71b0, 0x71b1, 0x71b2, 0x71b3, 0x71b4, 0x71b5, 0x71b6, 0x71b7, + 0x71b8, 0x71b9, 0x71ba, 0x71bb, 0x71bc, 0x71bd, 0x71be, 0x71bf, + 0x71c0, 0x71c1, 0x71c2, 0x71c3, 0x71c4, 0x71c5, 0x71c6, 0x71c7, + 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, 0x71cd, 0x71ce, 0x71cf, + 0x71d0, 0x71d1, 0x71d2, 0x71d3, 0x71d4, 0x71d5, 0x71d6, 0x71d7, + 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, 0x71de, 0x71df, + 0x71e0, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e5, 0x71e6, 0x71e7, + 0x71e8, 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ee, 0x71ef, + 0x71f0, 0x71f1, 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, + 0x71f8, 0x71f9, 0x71fa, 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, + 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7206, 0x7207, + 0x7208, 0x7209, 0x720a, 0x720b, 0x720c, 0x720d, 0x720e, 0x720f, + 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, + 0x7218, 0x7219, 0x721a, 0x721b, 0x721c, 0x721d, 0x721e, 0x721f, + 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, + 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x722f, + 0x7230, 0x7231, 0x7232, 0x7233, 0x7234, 0x7235, 0x7236, 0x7237, + 0x7238, 0x7239, 0x723a, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, + 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7247, + 0x7248, 0x7249, 0x724a, 0x724b, 0x724c, 0x724d, 0x724e, 0x724f, + 0x7250, 0x7251, 0x7252, 0x7253, 0x7254, 0x7255, 0x7256, 0x7257, + 0x7258, 0x7259, 0x725a, 0x725b, 0x725c, 0x725d, 0x725e, 0x725f, + 0x7260, 0x7261, 0x7262, 0x7263, 0x7264, 0x7265, 0x7266, 0x7267, + 0x7268, 0x7269, 0x726a, 0x726b, 0x726c, 0x726d, 0x726e, 0x726f, + 0x7270, 0x7271, 0x7272, 0x7273, 0x7274, 0x7275, 0x7276, 0x7277, + 0x7278, 0x7279, 0x727a, 0x727b, 0x727c, 0x727d, 0x727e, 0x727f, + 0x7280, 0x7281, 0x7282, 0x7283, 0x7284, 0x7285, 0x7286, 0x7287, + 0x7288, 0x7289, 0x728a, 0x728b, 0x728c, 0x728d, 0x728e, 0x728f, + 0x7290, 0x7291, 0x7292, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, + 0x7298, 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x729f, + 0x72a0, 0x72a1, 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, + 0x72a8, 0x72a9, 0x72aa, 0x72ab, 0x72ac, 0x72ad, 0x72ae, 0x72af, + 0x72b0, 0x72b1, 0x72b2, 0x72b3, 0x72b4, 0x72b5, 0x72b6, 0x72b7, + 0x72b8, 0x72b9, 0x72ba, 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, + 0x72c0, 0x72c1, 0x72c2, 0x72c3, 0x72c4, 0x72c5, 0x72c6, 0x72c7, + 0x72c8, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cd, 0x72ce, 0x72cf, + 0x72d0, 0x72d1, 0x72d2, 0x72d3, 0x72d4, 0x72d5, 0x72d6, 0x72d7, + 0x72d8, 0x72d9, 0x72da, 0x72db, 0x72dc, 0x72dd, 0x72de, 0x72df, + 0x72e0, 0x72e1, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, 0x72e7, + 0x72e8, 0x72e9, 0x72ea, 0x72eb, 0x72ec, 0x72ed, 0x72ee, 0x72ef, + 0x72f0, 0x72f1, 0x72f2, 0x72f3, 0x72f4, 0x72f5, 0x72f6, 0x72f7, + 0x72f8, 0x72f9, 0x72fa, 0x72fb, 0x72fc, 0x72fd, 0x72fe, 0x72ff, + 0x7300, 0x7301, 0x7302, 0x7303, 0x7304, 0x7305, 0x7306, 0x7307, + 0x7308, 0x7309, 0x730a, 0x730b, 0x730c, 0x730d, 0x730e, 0x730f, + 0x7310, 0x7311, 0x7312, 0x7313, 0x7314, 0x7315, 0x7316, 0x7317, + 0x7318, 0x7319, 0x731a, 0x731b, 0x731c, 0x731d, 0x731e, 0x731f, + 0x7320, 0x7321, 0x7322, 0x7323, 0x7324, 0x7325, 0x7326, 0x7327, + 0x7328, 0x7329, 0x732a, 0x732b, 0x732c, 0x732d, 0x732e, 0x732f, + 0x7330, 0x7331, 0x7332, 0x7333, 0x7334, 0x7335, 0x7336, 0x7337, + 0x7338, 0x7339, 0x733a, 0x733b, 0x733c, 0x733d, 0x733e, 0x733f, + 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, + 0x7348, 0x7349, 0x734a, 0x734b, 0x734c, 0x734d, 0x734e, 0x734f, + 0x7350, 0x7351, 0x7352, 0x7353, 0x7354, 0x7355, 0x7356, 0x7357, + 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, 0x735e, 0x735f, + 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, + 0x7368, 0x7369, 0x736a, 0x736b, 0x736c, 0x736d, 0x736e, 0x736f, + 0x7370, 0x7371, 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, + 0x7378, 0x7379, 0x737a, 0x737b, 0x737c, 0x737d, 0x737e, 0x737f, + 0x7380, 0x7381, 0x7382, 0x7383, 0x7384, 0x7385, 0x7386, 0x7387, + 0x7388, 0x7389, 0x738a, 0x738b, 0x738c, 0x738d, 0x738e, 0x738f, + 0x7390, 0x7391, 0x7392, 0x7393, 0x7394, 0x7395, 0x7396, 0x7397, + 0x7398, 0x7399, 0x739a, 0x739b, 0x739c, 0x739d, 0x739e, 0x739f, + 0x73a0, 0x73a1, 0x73a2, 0x73a3, 0x73a4, 0x73a5, 0x73a6, 0x73a7, + 0x73a8, 0x73a9, 0x73aa, 0x73ab, 0x73ac, 0x73ad, 0x73ae, 0x73af, + 0x73b0, 0x73b1, 0x73b2, 0x73b3, 0x73b4, 0x73b5, 0x73b6, 0x73b7, + 0x73b8, 0x73b9, 0x73ba, 0x73bb, 0x73bc, 0x73bd, 0x73be, 0x73bf, + 0x73c0, 0x73c1, 0x73c2, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, + 0x73c8, 0x73c9, 0x73ca, 0x73cb, 0x73cc, 0x73cd, 0x73ce, 0x73cf, + 0x73d0, 0x73d1, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, + 0x73d8, 0x73d9, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73de, 0x73df, + 0x73e0, 0x73e1, 0x73e2, 0x73e3, 0x73e4, 0x73e5, 0x73e6, 0x73e7, + 0x73e8, 0x73e9, 0x73ea, 0x73eb, 0x73ec, 0x73ed, 0x73ee, 0x73ef, + 0x73f0, 0x73f1, 0x73f2, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, + 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, + 0x7400, 0x7401, 0x7402, 0x7403, 0x7404, 0x7405, 0x7406, 0x7407, + 0x7408, 0x7409, 0x740a, 0x740b, 0x740c, 0x740d, 0x740e, 0x740f, + 0x7410, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, + 0x7418, 0x7419, 0x741a, 0x741b, 0x741c, 0x741d, 0x741e, 0x741f, + 0x7420, 0x7421, 0x7422, 0x7423, 0x7424, 0x7425, 0x7426, 0x7427, + 0x7428, 0x7429, 0x742a, 0x742b, 0x742c, 0x742d, 0x742e, 0x742f, + 0x7430, 0x7431, 0x7432, 0x7433, 0x7434, 0x7435, 0x7436, 0x7437, + 0x7438, 0x7439, 0x743a, 0x743b, 0x743c, 0x743d, 0x743e, 0x743f, + 0x7440, 0x7441, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, + 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, 0x744f, + 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7455, 0x7456, 0x7457, + 0x7458, 0x7459, 0x745a, 0x745b, 0x745c, 0x745d, 0x745e, 0x745f, + 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, + 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746d, 0x746e, 0x746f, + 0x7470, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7476, 0x7477, + 0x7478, 0x7479, 0x747a, 0x747b, 0x747c, 0x747d, 0x747e, 0x747f, + 0x7480, 0x7481, 0x7482, 0x7483, 0x7484, 0x7485, 0x7486, 0x7487, + 0x7488, 0x7489, 0x748a, 0x748b, 0x748c, 0x748d, 0x748e, 0x748f, + 0x7490, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, + 0x7498, 0x7499, 0x749a, 0x749b, 0x749c, 0x749d, 0x749e, 0x749f, + 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, 0x74a5, 0x74a6, 0x74a7, + 0x74a8, 0x74a9, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, + 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, + 0x74b8, 0x74b9, 0x74ba, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, + 0x74c0, 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, + 0x74c8, 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, + 0x74d0, 0x74d1, 0x74d2, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, + 0x74d8, 0x74d9, 0x74da, 0x74db, 0x74dc, 0x74dd, 0x74de, 0x74df, + 0x74e0, 0x74e1, 0x74e2, 0x74e3, 0x74e4, 0x74e5, 0x74e6, 0x74e7, + 0x74e8, 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74ee, 0x74ef, + 0x74f0, 0x74f1, 0x74f2, 0x74f3, 0x74f4, 0x74f5, 0x74f6, 0x74f7, + 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, 0x74fe, 0x74ff, + 0x7500, 0x7501, 0x7502, 0x7503, 0x7504, 0x7505, 0x7506, 0x7507, + 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750d, 0x750e, 0x750f, + 0x7510, 0x7511, 0x7512, 0x7513, 0x7514, 0x7515, 0x7516, 0x7517, + 0x7518, 0x7519, 0x751a, 0x751b, 0x751c, 0x751d, 0x751e, 0x751f, + 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7525, 0x7526, 0x7527, + 0x7528, 0x7529, 0x752a, 0x752b, 0x752c, 0x752d, 0x752e, 0x752f, + 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7536, 0x7537, + 0x7538, 0x7539, 0x753a, 0x753b, 0x753c, 0x753d, 0x753e, 0x753f, + 0x7540, 0x7541, 0x7542, 0x7543, 0x7544, 0x7545, 0x7546, 0x7547, + 0x7548, 0x7549, 0x754a, 0x754b, 0x754c, 0x754d, 0x754e, 0x754f, + 0x7550, 0x7551, 0x7552, 0x7553, 0x7554, 0x7555, 0x7556, 0x7557, + 0x7558, 0x7559, 0x755a, 0x755b, 0x755c, 0x755d, 0x755e, 0x755f, + 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7565, 0x7566, 0x7567, + 0x7568, 0x7569, 0x756a, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, + 0x7570, 0x7571, 0x7572, 0x7573, 0x7574, 0x7575, 0x7576, 0x7577, + 0x7578, 0x7579, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x757f, + 0x7580, 0x7581, 0x7582, 0x7583, 0x7584, 0x7585, 0x7586, 0x7587, + 0x7588, 0x7589, 0x758a, 0x758b, 0x758c, 0x758d, 0x758e, 0x758f, + 0x7590, 0x7591, 0x7592, 0x7593, 0x7594, 0x7595, 0x7596, 0x7597, + 0x7598, 0x7599, 0x759a, 0x759b, 0x759c, 0x759d, 0x759e, 0x759f, + 0x75a0, 0x75a1, 0x75a2, 0x75a3, 0x75a4, 0x75a5, 0x75a6, 0x75a7, + 0x75a8, 0x75a9, 0x75aa, 0x75ab, 0x75ac, 0x75ad, 0x75ae, 0x75af, + 0x75b0, 0x75b1, 0x75b2, 0x75b3, 0x75b4, 0x75b5, 0x75b6, 0x75b7, + 0x75b8, 0x75b9, 0x75ba, 0x75bb, 0x75bc, 0x75bd, 0x75be, 0x75bf, + 0x75c0, 0x75c1, 0x75c2, 0x75c3, 0x75c4, 0x75c5, 0x75c6, 0x75c7, + 0x75c8, 0x75c9, 0x75ca, 0x75cb, 0x75cc, 0x75cd, 0x75ce, 0x75cf, + 0x75d0, 0x75d1, 0x75d2, 0x75d3, 0x75d4, 0x75d5, 0x75d6, 0x75d7, + 0x75d8, 0x75d9, 0x75da, 0x75db, 0x75dc, 0x75dd, 0x75de, 0x75df, + 0x75e0, 0x75e1, 0x75e2, 0x75e3, 0x75e4, 0x75e5, 0x75e6, 0x75e7, + 0x75e8, 0x75e9, 0x75ea, 0x75eb, 0x75ec, 0x75ed, 0x75ee, 0x75ef, + 0x75f0, 0x75f1, 0x75f2, 0x75f3, 0x75f4, 0x75f5, 0x75f6, 0x75f7, + 0x75f8, 0x75f9, 0x75fa, 0x75fb, 0x75fc, 0x75fd, 0x75fe, 0x75ff, + 0x7600, 0x7601, 0x7602, 0x7603, 0x7604, 0x7605, 0x7606, 0x7607, + 0x7608, 0x7609, 0x760a, 0x760b, 0x760c, 0x760d, 0x760e, 0x760f, + 0x7610, 0x7611, 0x7612, 0x7613, 0x7614, 0x7615, 0x7616, 0x7617, + 0x7618, 0x7619, 0x761a, 0x761b, 0x761c, 0x761d, 0x761e, 0x761f, + 0x7620, 0x7621, 0x7622, 0x7623, 0x7624, 0x7625, 0x7626, 0x7627, + 0x7628, 0x7629, 0x762a, 0x762b, 0x762c, 0x762d, 0x762e, 0x762f, + 0x7630, 0x7631, 0x7632, 0x7633, 0x7634, 0x7635, 0x7636, 0x7637, + 0x7638, 0x7639, 0x763a, 0x763b, 0x763c, 0x763d, 0x763e, 0x763f, + 0x7640, 0x7641, 0x7642, 0x7643, 0x7644, 0x7645, 0x7646, 0x7647, + 0x7648, 0x7649, 0x764a, 0x764b, 0x764c, 0x764d, 0x764e, 0x764f, + 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7655, 0x7656, 0x7657, + 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x765f, + 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x7665, 0x7666, 0x7667, + 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, + 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, + 0x7678, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x767f, + 0x7680, 0x7681, 0x7682, 0x7683, 0x7684, 0x7685, 0x7686, 0x7687, + 0x7688, 0x7689, 0x768a, 0x768b, 0x768c, 0x768d, 0x768e, 0x768f, + 0x7690, 0x7691, 0x7692, 0x7693, 0x7694, 0x7695, 0x7696, 0x7697, + 0x7698, 0x7699, 0x769a, 0x769b, 0x769c, 0x769d, 0x769e, 0x769f, + 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a4, 0x76a5, 0x76a6, 0x76a7, + 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, 0x76ae, 0x76af, + 0x76b0, 0x76b1, 0x76b2, 0x76b3, 0x76b4, 0x76b5, 0x76b6, 0x76b7, + 0x76b8, 0x76b9, 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76bf, + 0x76c0, 0x76c1, 0x76c2, 0x76c3, 0x76c4, 0x76c5, 0x76c6, 0x76c7, + 0x76c8, 0x76c9, 0x76ca, 0x76cb, 0x76cc, 0x76cd, 0x76ce, 0x76cf, + 0x76d0, 0x76d1, 0x76d2, 0x76d3, 0x76d4, 0x76d5, 0x76d6, 0x76d7, + 0x76d8, 0x76d9, 0x76da, 0x76db, 0x76dc, 0x76dd, 0x76de, 0x76df, + 0x76e0, 0x76e1, 0x76e2, 0x76e3, 0x76e4, 0x76e5, 0x76e6, 0x76e7, + 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, 0x76ed, 0x76ee, 0x76ef, + 0x76f0, 0x76f1, 0x76f2, 0x76f3, 0x76f4, 0x76f5, 0x76f6, 0x76f7, + 0x76f8, 0x76f9, 0x76fa, 0x76fb, 0x76fc, 0x76fd, 0x76fe, 0x76ff, + 0x7700, 0x7701, 0x7702, 0x7703, 0x7704, 0x7705, 0x7706, 0x7707, + 0x7708, 0x7709, 0x770a, 0x770b, 0x770c, 0x770d, 0x770e, 0x770f, + 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, + 0x7718, 0x7719, 0x771a, 0x771b, 0x771c, 0x771d, 0x771e, 0x771f, + 0x7720, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, + 0x7728, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x772e, 0x772f, + 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7735, 0x7736, 0x7737, + 0x7738, 0x7739, 0x773a, 0x773b, 0x773c, 0x773d, 0x773e, 0x773f, + 0x7740, 0x7741, 0x7742, 0x7743, 0x7744, 0x7745, 0x7746, 0x7747, + 0x7748, 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, + 0x7750, 0x7751, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, + 0x7758, 0x7759, 0x775a, 0x775b, 0x775c, 0x775d, 0x775e, 0x775f, + 0x7760, 0x7761, 0x7762, 0x7763, 0x7764, 0x7765, 0x7766, 0x7767, + 0x7768, 0x7769, 0x776a, 0x776b, 0x776c, 0x776d, 0x776e, 0x776f, + 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, + 0x7778, 0x7779, 0x777a, 0x777b, 0x777c, 0x777d, 0x777e, 0x777f, + 0x7780, 0x7781, 0x7782, 0x7783, 0x7784, 0x7785, 0x7786, 0x7787, + 0x7788, 0x7789, 0x778a, 0x778b, 0x778c, 0x778d, 0x778e, 0x778f, + 0x7790, 0x7791, 0x7792, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, + 0x7798, 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x779f, + 0x77a0, 0x77a1, 0x77a2, 0x77a3, 0x77a4, 0x77a5, 0x77a6, 0x77a7, + 0x77a8, 0x77a9, 0x77aa, 0x77ab, 0x77ac, 0x77ad, 0x77ae, 0x77af, + 0x77b0, 0x77b1, 0x77b2, 0x77b3, 0x77b4, 0x77b5, 0x77b6, 0x77b7, + 0x77b8, 0x77b9, 0x77ba, 0x77bb, 0x77bc, 0x77bd, 0x77be, 0x77bf, + 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, 0x77c7, + 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77cd, 0x77ce, 0x77cf, + 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d7, + 0x77d8, 0x77d9, 0x77da, 0x77db, 0x77dc, 0x77dd, 0x77de, 0x77df, + 0x77e0, 0x77e1, 0x77e2, 0x77e3, 0x77e4, 0x77e5, 0x77e6, 0x77e7, + 0x77e8, 0x77e9, 0x77ea, 0x77eb, 0x77ec, 0x77ed, 0x77ee, 0x77ef, + 0x77f0, 0x77f1, 0x77f2, 0x77f3, 0x77f4, 0x77f5, 0x77f6, 0x77f7, + 0x77f8, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x77fd, 0x77fe, 0x77ff, + 0x7800, 0x7801, 0x7802, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, + 0x7808, 0x7809, 0x780a, 0x780b, 0x780c, 0x780d, 0x780e, 0x780f, + 0x7810, 0x7811, 0x7812, 0x7813, 0x7814, 0x7815, 0x7816, 0x7817, + 0x7818, 0x7819, 0x781a, 0x781b, 0x781c, 0x781d, 0x781e, 0x781f, + 0x7820, 0x7821, 0x7822, 0x7823, 0x7824, 0x7825, 0x7826, 0x7827, + 0x7828, 0x7829, 0x782a, 0x782b, 0x782c, 0x782d, 0x782e, 0x782f, + 0x7830, 0x7831, 0x7832, 0x7833, 0x7834, 0x7835, 0x7836, 0x7837, + 0x7838, 0x7839, 0x783a, 0x783b, 0x783c, 0x783d, 0x783e, 0x783f, + 0x7840, 0x7841, 0x7842, 0x7843, 0x7844, 0x7845, 0x7846, 0x7847, + 0x7848, 0x7849, 0x784a, 0x784b, 0x784c, 0x784d, 0x784e, 0x784f, + 0x7850, 0x7851, 0x7852, 0x7853, 0x7854, 0x7855, 0x7856, 0x7857, + 0x7858, 0x7859, 0x785a, 0x785b, 0x785c, 0x785d, 0x785e, 0x785f, + 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, + 0x7868, 0x7869, 0x786a, 0x786b, 0x786c, 0x786d, 0x786e, 0x786f, + 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7877, + 0x7878, 0x7879, 0x787a, 0x787b, 0x787c, 0x787d, 0x787e, 0x787f, + 0x7880, 0x7881, 0x7882, 0x7883, 0x7884, 0x7885, 0x7886, 0x7887, + 0x7888, 0x7889, 0x788a, 0x788b, 0x788c, 0x788d, 0x788e, 0x788f, + 0x7890, 0x7891, 0x7892, 0x7893, 0x7894, 0x7895, 0x7896, 0x7897, + 0x7898, 0x7899, 0x789a, 0x789b, 0x789c, 0x789d, 0x789e, 0x789f, + 0x78a0, 0x78a1, 0x78a2, 0x78a3, 0x78a4, 0x78a5, 0x78a6, 0x78a7, + 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, 0x78ad, 0x78ae, 0x78af, + 0x78b0, 0x78b1, 0x78b2, 0x78b3, 0x78b4, 0x78b5, 0x78b6, 0x78b7, + 0x78b8, 0x78b9, 0x78ba, 0x78bb, 0x78bc, 0x78bd, 0x78be, 0x78bf, + 0x78c0, 0x78c1, 0x78c2, 0x78c3, 0x78c4, 0x78c5, 0x78c6, 0x78c7, + 0x78c8, 0x78c9, 0x78ca, 0x78cb, 0x78cc, 0x78cd, 0x78ce, 0x78cf, + 0x78d0, 0x78d1, 0x78d2, 0x78d3, 0x78d4, 0x78d5, 0x78d6, 0x78d7, + 0x78d8, 0x78d9, 0x78da, 0x78db, 0x78dc, 0x78dd, 0x78de, 0x78df, + 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, + 0x78e8, 0x78e9, 0x78ea, 0x78eb, 0x78ec, 0x78ed, 0x78ee, 0x78ef, + 0x78f0, 0x78f1, 0x78f2, 0x78f3, 0x78f4, 0x78f5, 0x78f6, 0x78f7, + 0x78f8, 0x78f9, 0x78fa, 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, + 0x7900, 0x7901, 0x7902, 0x7903, 0x7904, 0x7905, 0x7906, 0x7907, + 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, 0x790d, 0x790e, 0x790f, + 0x7910, 0x7911, 0x7912, 0x7913, 0x7914, 0x7915, 0x7916, 0x7917, + 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, 0x791e, 0x791f, + 0x7920, 0x7921, 0x7922, 0x7923, 0x7924, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7934, 0x7935, 0x7936, 0x7937, + 0x7938, 0x7939, 0x793a, 0x793b, 0x793c, 0x793d, 0x793e, 0x793f, + 0x7940, 0x7941, 0x7942, 0x7943, 0x7944, 0x7945, 0x7946, 0x7947, + 0x7948, 0x7949, 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, + 0x7950, 0x7951, 0x7952, 0x7953, 0x7954, 0x7955, 0x7956, 0x7957, + 0x7958, 0x7959, 0x795a, 0x795b, 0x795c, 0x795d, 0x795e, 0x795f, + 0x7960, 0x7961, 0x7962, 0x7963, 0x7964, 0x7965, 0x7966, 0x7967, + 0x7968, 0x7969, 0x796a, 0x796b, 0x796c, 0x796d, 0x796e, 0x796f, + 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7977, + 0x7978, 0x7979, 0x797a, 0x797b, 0x797c, 0x797d, 0x797e, 0x797f, + 0x7980, 0x7981, 0x7982, 0x7983, 0x7984, 0x7985, 0x7986, 0x7987, + 0x7988, 0x7989, 0x798a, 0x798b, 0x798c, 0x798d, 0x798e, 0x798f, + 0x7990, 0x7991, 0x7992, 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, + 0x7998, 0x7999, 0x799a, 0x799b, 0x799c, 0x799d, 0x799e, 0x799f, + 0x79a0, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79a6, 0x79a7, + 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, 0x79ad, 0x79ae, 0x79af, + 0x79b0, 0x79b1, 0x79b2, 0x79b3, 0x79b4, 0x79b5, 0x79b6, 0x79b7, + 0x79b8, 0x79b9, 0x79ba, 0x79bb, 0x79bc, 0x79bd, 0x79be, 0x79bf, + 0x79c0, 0x79c1, 0x79c2, 0x79c3, 0x79c4, 0x79c5, 0x79c6, 0x79c7, + 0x79c8, 0x79c9, 0x79ca, 0x79cb, 0x79cc, 0x79cd, 0x79ce, 0x79cf, + 0x79d0, 0x79d1, 0x79d2, 0x79d3, 0x79d4, 0x79d5, 0x79d6, 0x79d7, + 0x79d8, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, 0x79de, 0x79df, + 0x79e0, 0x79e1, 0x79e2, 0x79e3, 0x79e4, 0x79e5, 0x79e6, 0x79e7, + 0x79e8, 0x79e9, 0x79ea, 0x79eb, 0x79ec, 0x79ed, 0x79ee, 0x79ef, + 0x79f0, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, + 0x79f8, 0x79f9, 0x79fa, 0x79fb, 0x79fc, 0x79fd, 0x79fe, 0x79ff, + 0x7a00, 0x7a01, 0x7a02, 0x7a03, 0x7a04, 0x7a05, 0x7a06, 0x7a07, + 0x7a08, 0x7a09, 0x7a0a, 0x7a0b, 0x7a0c, 0x7a0d, 0x7a0e, 0x7a0f, + 0x7a10, 0x7a11, 0x7a12, 0x7a13, 0x7a14, 0x7a15, 0x7a16, 0x7a17, + 0x7a18, 0x7a19, 0x7a1a, 0x7a1b, 0x7a1c, 0x7a1d, 0x7a1e, 0x7a1f, + 0x7a20, 0x7a21, 0x7a22, 0x7a23, 0x7a24, 0x7a25, 0x7a26, 0x7a27, + 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, + 0x7a30, 0x7a31, 0x7a32, 0x7a33, 0x7a34, 0x7a35, 0x7a36, 0x7a37, + 0x7a38, 0x7a39, 0x7a3a, 0x7a3b, 0x7a3c, 0x7a3d, 0x7a3e, 0x7a3f, + 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a46, 0x7a47, + 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, + 0x7a50, 0x7a51, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a57, + 0x7a58, 0x7a59, 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, + 0x7a60, 0x7a61, 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, + 0x7a68, 0x7a69, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, + 0x7a70, 0x7a71, 0x7a72, 0x7a73, 0x7a74, 0x7a75, 0x7a76, 0x7a77, + 0x7a78, 0x7a79, 0x7a7a, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a7f, + 0x7a80, 0x7a81, 0x7a82, 0x7a83, 0x7a84, 0x7a85, 0x7a86, 0x7a87, + 0x7a88, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8d, 0x7a8e, 0x7a8f, + 0x7a90, 0x7a91, 0x7a92, 0x7a93, 0x7a94, 0x7a95, 0x7a96, 0x7a97, + 0x7a98, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9c, 0x7a9d, 0x7a9e, 0x7a9f, + 0x7aa0, 0x7aa1, 0x7aa2, 0x7aa3, 0x7aa4, 0x7aa5, 0x7aa6, 0x7aa7, + 0x7aa8, 0x7aa9, 0x7aaa, 0x7aab, 0x7aac, 0x7aad, 0x7aae, 0x7aaf, + 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab3, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, + 0x7ab8, 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7abf, + 0x7ac0, 0x7ac1, 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, + 0x7ac8, 0x7ac9, 0x7aca, 0x7acb, 0x7acc, 0x7acd, 0x7ace, 0x7acf, + 0x7ad0, 0x7ad1, 0x7ad2, 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad6, 0x7ad7, + 0x7ad8, 0x7ad9, 0x7ada, 0x7adb, 0x7adc, 0x7add, 0x7ade, 0x7adf, + 0x7ae0, 0x7ae1, 0x7ae2, 0x7ae3, 0x7ae4, 0x7ae5, 0x7ae6, 0x7ae7, + 0x7ae8, 0x7ae9, 0x7aea, 0x7aeb, 0x7aec, 0x7aed, 0x7aee, 0x7aef, + 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, 0x7af5, 0x7af6, 0x7af7, + 0x7af8, 0x7af9, 0x7afa, 0x7afb, 0x7afc, 0x7afd, 0x7afe, 0x7aff, + 0x7b00, 0x7b01, 0x7b02, 0x7b03, 0x7b04, 0x7b05, 0x7b06, 0x7b07, + 0x7b08, 0x7b09, 0x7b0a, 0x7b0b, 0x7b0c, 0x7b0d, 0x7b0e, 0x7b0f, + 0x7b10, 0x7b11, 0x7b12, 0x7b13, 0x7b14, 0x7b15, 0x7b16, 0x7b17, + 0x7b18, 0x7b19, 0x7b1a, 0x7b1b, 0x7b1c, 0x7b1d, 0x7b1e, 0x7b1f, + 0x7b20, 0x7b21, 0x7b22, 0x7b23, 0x7b24, 0x7b25, 0x7b26, 0x7b27, + 0x7b28, 0x7b29, 0x7b2a, 0x7b2b, 0x7b2c, 0x7b2d, 0x7b2e, 0x7b2f, + 0x7b30, 0x7b31, 0x7b32, 0x7b33, 0x7b34, 0x7b35, 0x7b36, 0x7b37, + 0x7b38, 0x7b39, 0x7b3a, 0x7b3b, 0x7b3c, 0x7b3d, 0x7b3e, 0x7b3f, + 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x7b45, 0x7b46, 0x7b47, + 0x7b48, 0x7b49, 0x7b4a, 0x7b4b, 0x7b4c, 0x7b4d, 0x7b4e, 0x7b4f, + 0x7b50, 0x7b51, 0x7b52, 0x7b53, 0x7b54, 0x7b55, 0x7b56, 0x7b57, + 0x7b58, 0x7b59, 0x7b5a, 0x7b5b, 0x7b5c, 0x7b5d, 0x7b5e, 0x7b5f, + 0x7b60, 0x7b61, 0x7b62, 0x7b63, 0x7b64, 0x7b65, 0x7b66, 0x7b67, + 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, 0x7b6e, 0x7b6f, + 0x7b70, 0x7b71, 0x7b72, 0x7b73, 0x7b74, 0x7b75, 0x7b76, 0x7b77, + 0x7b78, 0x7b79, 0x7b7a, 0x7b7b, 0x7b7c, 0x7b7d, 0x7b7e, 0x7b7f, + 0x7b80, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b85, 0x7b86, 0x7b87, + 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8d, 0x7b8e, 0x7b8f, + 0x7b90, 0x7b91, 0x7b92, 0x7b93, 0x7b94, 0x7b95, 0x7b96, 0x7b97, + 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9c, 0x7b9d, 0x7b9e, 0x7b9f, + 0x7ba0, 0x7ba1, 0x7ba2, 0x7ba3, 0x7ba4, 0x7ba5, 0x7ba6, 0x7ba7, + 0x7ba8, 0x7ba9, 0x7baa, 0x7bab, 0x7bac, 0x7bad, 0x7bae, 0x7baf, + 0x7bb0, 0x7bb1, 0x7bb2, 0x7bb3, 0x7bb4, 0x7bb5, 0x7bb6, 0x7bb7, + 0x7bb8, 0x7bb9, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, + 0x7bc0, 0x7bc1, 0x7bc2, 0x7bc3, 0x7bc4, 0x7bc5, 0x7bc6, 0x7bc7, + 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcc, 0x7bcd, 0x7bce, 0x7bcf, + 0x7bd0, 0x7bd1, 0x7bd2, 0x7bd3, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, + 0x7bd8, 0x7bd9, 0x7bda, 0x7bdb, 0x7bdc, 0x7bdd, 0x7bde, 0x7bdf, + 0x7be0, 0x7be1, 0x7be2, 0x7be3, 0x7be4, 0x7be5, 0x7be6, 0x7be7, + 0x7be8, 0x7be9, 0x7bea, 0x7beb, 0x7bec, 0x7bed, 0x7bee, 0x7bef, + 0x7bf0, 0x7bf1, 0x7bf2, 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf7, + 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, 0x7bfc, 0x7bfd, 0x7bfe, 0x7bff, + 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, 0x7c06, 0x7c07, + 0x7c08, 0x7c09, 0x7c0a, 0x7c0b, 0x7c0c, 0x7c0d, 0x7c0e, 0x7c0f, + 0x7c10, 0x7c11, 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c16, 0x7c17, + 0x7c18, 0x7c19, 0x7c1a, 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c1f, + 0x7c20, 0x7c21, 0x7c22, 0x7c23, 0x7c24, 0x7c25, 0x7c26, 0x7c27, + 0x7c28, 0x7c29, 0x7c2a, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, 0x7c2f, + 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, 0x7c37, + 0x7c38, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c3f, + 0x7c40, 0x7c41, 0x7c42, 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, + 0x7c48, 0x7c49, 0x7c4a, 0x7c4b, 0x7c4c, 0x7c4d, 0x7c4e, 0x7c4f, + 0x7c50, 0x7c51, 0x7c52, 0x7c53, 0x7c54, 0x7c55, 0x7c56, 0x7c57, + 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, + 0x7c60, 0x7c61, 0x7c62, 0x7c63, 0x7c64, 0x7c65, 0x7c66, 0x7c67, + 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, + 0x7c70, 0x7c71, 0x7c72, 0x7c73, 0x7c74, 0x7c75, 0x7c76, 0x7c77, + 0x7c78, 0x7c79, 0x7c7a, 0x7c7b, 0x7c7c, 0x7c7d, 0x7c7e, 0x7c7f, + 0x7c80, 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, + 0x7c88, 0x7c89, 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, + 0x7c90, 0x7c91, 0x7c92, 0x7c93, 0x7c94, 0x7c95, 0x7c96, 0x7c97, + 0x7c98, 0x7c99, 0x7c9a, 0x7c9b, 0x7c9c, 0x7c9d, 0x7c9e, 0x7c9f, + 0x7ca0, 0x7ca1, 0x7ca2, 0x7ca3, 0x7ca4, 0x7ca5, 0x7ca6, 0x7ca7, + 0x7ca8, 0x7ca9, 0x7caa, 0x7cab, 0x7cac, 0x7cad, 0x7cae, 0x7caf, + 0x7cb0, 0x7cb1, 0x7cb2, 0x7cb3, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, + 0x7cb8, 0x7cb9, 0x7cba, 0x7cbb, 0x7cbc, 0x7cbd, 0x7cbe, 0x7cbf, + 0x7cc0, 0x7cc1, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc5, 0x7cc6, 0x7cc7, + 0x7cc8, 0x7cc9, 0x7cca, 0x7ccb, 0x7ccc, 0x7ccd, 0x7cce, 0x7ccf, + 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd5, 0x7cd6, 0x7cd7, + 0x7cd8, 0x7cd9, 0x7cda, 0x7cdb, 0x7cdc, 0x7cdd, 0x7cde, 0x7cdf, + 0x7ce0, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, 0x7ce5, 0x7ce6, 0x7ce7, + 0x7ce8, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, 0x7cee, 0x7cef, + 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, 0x7cf7, + 0x7cf8, 0x7cf9, 0x7cfa, 0x7cfb, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, + 0x7d00, 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, + 0x7d08, 0x7d09, 0x7d0a, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, + 0x7d10, 0x7d11, 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, + 0x7d18, 0x7d19, 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, + 0x7d20, 0x7d21, 0x7d22, 0x7d23, 0x7d24, 0x7d25, 0x7d26, 0x7d27, + 0x7d28, 0x7d29, 0x7d2a, 0x7d2b, 0x7d2c, 0x7d2d, 0x7d2e, 0x7d2f, + 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, 0x7d37, + 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d3f, + 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, 0x7d47, + 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, 0x7d4f, + 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, 0x7d57, + 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, + 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, 0x7d67, + 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6e, 0x7d6f, + 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d77, + 0x7d78, 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, + 0x7d80, 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, + 0x7d88, 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, + 0x7d90, 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, + 0x7d98, 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, + 0x7da0, 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da6, 0x7da7, + 0x7da8, 0x7da9, 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7dae, 0x7daf, + 0x7db0, 0x7db1, 0x7db2, 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, + 0x7db8, 0x7db9, 0x7dba, 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, + 0x7dc0, 0x7dc1, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, + 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, + 0x7dd0, 0x7dd1, 0x7dd2, 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, + 0x7dd8, 0x7dd9, 0x7dda, 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, + 0x7de0, 0x7de1, 0x7de2, 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, + 0x7de8, 0x7de9, 0x7dea, 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, + 0x7df0, 0x7df1, 0x7df2, 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, + 0x7df8, 0x7df9, 0x7dfa, 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, + 0x7e00, 0x7e01, 0x7e02, 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, + 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, + 0x7e10, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, + 0x7e18, 0x7e19, 0x7e1a, 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, + 0x7e20, 0x7e21, 0x7e22, 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, + 0x7e28, 0x7e29, 0x7e2a, 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, + 0x7e30, 0x7e31, 0x7e32, 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, + 0x7e38, 0x7e39, 0x7e3a, 0x7e3b, 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, + 0x7e40, 0x7e41, 0x7e42, 0x7e43, 0x7e44, 0x7e45, 0x7e46, 0x7e47, + 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, 0x7e4e, 0x7e4f, + 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, 0x7e56, 0x7e57, + 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, 0x7e5e, 0x7e5f, + 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, 0x7e66, 0x7e67, + 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, 0x7e6e, 0x7e6f, + 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, + 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, 0x7e7e, 0x7e7f, + 0x7e80, 0x7e81, 0x7e82, 0x7e83, 0x7e84, 0x7e85, 0x7e86, 0x7e87, + 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, 0x7e8f, + 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, 0x7e97, + 0x7e98, 0x7e99, 0x7e9a, 0x7e9b, 0x7e9c, 0x7e9d, 0x7e9e, 0x7e9f, + 0x7ea0, 0x7ea1, 0x7ea2, 0x7ea3, 0x7ea4, 0x7ea5, 0x7ea6, 0x7ea7, + 0x7ea8, 0x7ea9, 0x7eaa, 0x7eab, 0x7eac, 0x7ead, 0x7eae, 0x7eaf, + 0x7eb0, 0x7eb1, 0x7eb2, 0x7eb3, 0x7eb4, 0x7eb5, 0x7eb6, 0x7eb7, + 0x7eb8, 0x7eb9, 0x7eba, 0x7ebb, 0x7ebc, 0x7ebd, 0x7ebe, 0x7ebf, + 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec3, 0x7ec4, 0x7ec5, 0x7ec6, 0x7ec7, + 0x7ec8, 0x7ec9, 0x7eca, 0x7ecb, 0x7ecc, 0x7ecd, 0x7ece, 0x7ecf, + 0x7ed0, 0x7ed1, 0x7ed2, 0x7ed3, 0x7ed4, 0x7ed5, 0x7ed6, 0x7ed7, + 0x7ed8, 0x7ed9, 0x7eda, 0x7edb, 0x7edc, 0x7edd, 0x7ede, 0x7edf, + 0x7ee0, 0x7ee1, 0x7ee2, 0x7ee3, 0x7ee4, 0x7ee5, 0x7ee6, 0x7ee7, + 0x7ee8, 0x7ee9, 0x7eea, 0x7eeb, 0x7eec, 0x7eed, 0x7eee, 0x7eef, + 0x7ef0, 0x7ef1, 0x7ef2, 0x7ef3, 0x7ef4, 0x7ef5, 0x7ef6, 0x7ef7, + 0x7ef8, 0x7ef9, 0x7efa, 0x7efb, 0x7efc, 0x7efd, 0x7efe, 0x7eff, + 0x7f00, 0x7f01, 0x7f02, 0x7f03, 0x7f04, 0x7f05, 0x7f06, 0x7f07, + 0x7f08, 0x7f09, 0x7f0a, 0x7f0b, 0x7f0c, 0x7f0d, 0x7f0e, 0x7f0f, + 0x7f10, 0x7f11, 0x7f12, 0x7f13, 0x7f14, 0x7f15, 0x7f16, 0x7f17, + 0x7f18, 0x7f19, 0x7f1a, 0x7f1b, 0x7f1c, 0x7f1d, 0x7f1e, 0x7f1f, + 0x7f20, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, + 0x7f28, 0x7f29, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2e, 0x7f2f, + 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f34, 0x7f35, 0x7f36, 0x7f37, + 0x7f38, 0x7f39, 0x7f3a, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f, + 0x7f40, 0x7f41, 0x7f42, 0x7f43, 0x7f44, 0x7f45, 0x7f46, 0x7f47, + 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, + 0x7f50, 0x7f51, 0x7f52, 0x7f53, 0x7f54, 0x7f55, 0x7f56, 0x7f57, + 0x7f58, 0x7f59, 0x7f5a, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f5f, + 0x7f60, 0x7f61, 0x7f62, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67, + 0x7f68, 0x7f69, 0x7f6a, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6e, 0x7f6f, + 0x7f70, 0x7f71, 0x7f72, 0x7f73, 0x7f74, 0x7f75, 0x7f76, 0x7f77, + 0x7f78, 0x7f79, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7e, 0x7f7f, + 0x7f80, 0x7f81, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, + 0x7f88, 0x7f89, 0x7f8a, 0x7f8b, 0x7f8c, 0x7f8d, 0x7f8e, 0x7f8f, + 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f94, 0x7f95, 0x7f96, 0x7f97, + 0x7f98, 0x7f99, 0x7f9a, 0x7f9b, 0x7f9c, 0x7f9d, 0x7f9e, 0x7f9f, + 0x7fa0, 0x7fa1, 0x7fa2, 0x7fa3, 0x7fa4, 0x7fa5, 0x7fa6, 0x7fa7, + 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7faf, + 0x7fb0, 0x7fb1, 0x7fb2, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, + 0x7fb8, 0x7fb9, 0x7fba, 0x7fbb, 0x7fbc, 0x7fbd, 0x7fbe, 0x7fbf, + 0x7fc0, 0x7fc1, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc5, 0x7fc6, 0x7fc7, + 0x7fc8, 0x7fc9, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fcf, + 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd6, 0x7fd7, + 0x7fd8, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fdf, + 0x7fe0, 0x7fe1, 0x7fe2, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7, + 0x7fe8, 0x7fe9, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fee, 0x7fef, + 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, + 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffb, 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, + 0x8000, 0x8001, 0x8002, 0x8003, 0x8004, 0x8005, 0x8006, 0x8007, + 0x8008, 0x8009, 0x800a, 0x800b, 0x800c, 0x800d, 0x800e, 0x800f, + 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x8016, 0x8017, + 0x8018, 0x8019, 0x801a, 0x801b, 0x801c, 0x801d, 0x801e, 0x801f, + 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x8026, 0x8027, + 0x8028, 0x8029, 0x802a, 0x802b, 0x802c, 0x802d, 0x802e, 0x802f, + 0x8030, 0x8031, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, + 0x8038, 0x8039, 0x803a, 0x803b, 0x803c, 0x803d, 0x803e, 0x803f, + 0x8040, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x8047, + 0x8048, 0x8049, 0x804a, 0x804b, 0x804c, 0x804d, 0x804e, 0x804f, + 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057, + 0x8058, 0x8059, 0x805a, 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, + 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, + 0x8068, 0x8069, 0x806a, 0x806b, 0x806c, 0x806d, 0x806e, 0x806f, + 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, + 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, 0x807e, 0x807f, + 0x8080, 0x8081, 0x8082, 0x8083, 0x8084, 0x8085, 0x8086, 0x8087, + 0x8088, 0x8089, 0x808a, 0x808b, 0x808c, 0x808d, 0x808e, 0x808f, + 0x8090, 0x8091, 0x8092, 0x8093, 0x8094, 0x8095, 0x8096, 0x8097, + 0x8098, 0x8099, 0x809a, 0x809b, 0x809c, 0x809d, 0x809e, 0x809f, + 0x80a0, 0x80a1, 0x80a2, 0x80a3, 0x80a4, 0x80a5, 0x80a6, 0x80a7, + 0x80a8, 0x80a9, 0x80aa, 0x80ab, 0x80ac, 0x80ad, 0x80ae, 0x80af, + 0x80b0, 0x80b1, 0x80b2, 0x80b3, 0x80b4, 0x80b5, 0x80b6, 0x80b7, + 0x80b8, 0x80b9, 0x80ba, 0x80bb, 0x80bc, 0x80bd, 0x80be, 0x80bf, + 0x80c0, 0x80c1, 0x80c2, 0x80c3, 0x80c4, 0x80c5, 0x80c6, 0x80c7, + 0x80c8, 0x80c9, 0x80ca, 0x80cb, 0x80cc, 0x80cd, 0x80ce, 0x80cf, + 0x80d0, 0x80d1, 0x80d2, 0x80d3, 0x80d4, 0x80d5, 0x80d6, 0x80d7, + 0x80d8, 0x80d9, 0x80da, 0x80db, 0x80dc, 0x80dd, 0x80de, 0x80df, + 0x80e0, 0x80e1, 0x80e2, 0x80e3, 0x80e4, 0x80e5, 0x80e6, 0x80e7, + 0x80e8, 0x80e9, 0x80ea, 0x80eb, 0x80ec, 0x80ed, 0x80ee, 0x80ef, + 0x80f0, 0x80f1, 0x80f2, 0x80f3, 0x80f4, 0x80f5, 0x80f6, 0x80f7, + 0x80f8, 0x80f9, 0x80fa, 0x80fb, 0x80fc, 0x80fd, 0x80fe, 0x80ff, + 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, + 0x8108, 0x8109, 0x810a, 0x810b, 0x810c, 0x810d, 0x810e, 0x810f, + 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116, 0x8117, + 0x8118, 0x8119, 0x811a, 0x811b, 0x811c, 0x811d, 0x811e, 0x811f, + 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, + 0x8128, 0x8129, 0x812a, 0x812b, 0x812c, 0x812d, 0x812e, 0x812f, + 0x8130, 0x8131, 0x8132, 0x8133, 0x8134, 0x8135, 0x8136, 0x8137, + 0x8138, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813e, 0x813f, + 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, + 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, + 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, + 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, + 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, + 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, + 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, + 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x817f, + 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, + 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, + 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, + 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, + 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, + 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, + 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, + 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, + 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, + 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, + 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, + 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, + 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, + 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, + 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, + 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x81ff, + 0x8200, 0x8201, 0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, + 0x8208, 0x8209, 0x820a, 0x820b, 0x820c, 0x820d, 0x820e, 0x820f, + 0x8210, 0x8211, 0x8212, 0x8213, 0x8214, 0x8215, 0x8216, 0x8217, + 0x8218, 0x8219, 0x821a, 0x821b, 0x821c, 0x821d, 0x821e, 0x821f, + 0x8220, 0x8221, 0x8222, 0x8223, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8228, 0x8229, 0x822a, 0x822b, 0x822c, 0x822d, 0x822e, 0x822f, + 0x8230, 0x8231, 0x8232, 0x8233, 0x8234, 0x8235, 0x8236, 0x8237, + 0x8238, 0x8239, 0x823a, 0x823b, 0x823c, 0x823d, 0x823e, 0x823f, + 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, + 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, + 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, + 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, + 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, + 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, + 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, + 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x827f, + 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, + 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, + 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, + 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, + 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, + 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, + 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, + 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, + 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, + 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, + 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, + 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, + 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, + 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, + 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, + 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x82ff, + 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, + 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, 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, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, + 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, + 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, + 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x83ff, + 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, + 0x8408, 0x8409, 0x840a, 0x840b, 0x840c, 0x840d, 0x840e, 0x840f, + 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, + 0x8418, 0x8419, 0x841a, 0x841b, 0x841c, 0x841d, 0x841e, 0x841f, + 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x8425, 0x8426, 0x8427, + 0x8428, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, 0x842e, 0x842f, + 0x8430, 0x8431, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, + 0x8438, 0x8439, 0x843a, 0x843b, 0x843c, 0x843d, 0x843e, 0x843f, + 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, + 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, + 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, + 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, + 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, + 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, + 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, + 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x847f, + 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, + 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, + 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, + 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, + 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, + 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, + 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, + 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, + 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, + 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, + 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, + 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, + 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, + 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, + 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, + 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x84ff, + 0x8500, 0x8501, 0x8502, 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, + 0x8508, 0x8509, 0x850a, 0x850b, 0x850c, 0x850d, 0x850e, 0x850f, + 0x8510, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, + 0x8518, 0x8519, 0x851a, 0x851b, 0x851c, 0x851d, 0x851e, 0x851f, + 0x8520, 0x8521, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, + 0x8528, 0x8529, 0x852a, 0x852b, 0x852c, 0x852d, 0x852e, 0x852f, + 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x8537, + 0x8538, 0x8539, 0x853a, 0x853b, 0x853c, 0x853d, 0x853e, 0x853f, + 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, + 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, + 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, + 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, + 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, + 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, + 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, + 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x857f, + 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, + 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, + 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, + 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, + 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, + 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, + 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, + 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, + 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, + 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, + 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, + 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, + 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, + 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, + 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, + 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, + 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, + 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, + 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, + 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, + 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, + 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, + 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, + 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x86ff, + 0x8700, 0x8701, 0x8702, 0x8703, 0x8704, 0x8705, 0x8706, 0x8707, + 0x8708, 0x8709, 0x870a, 0x870b, 0x870c, 0x870d, 0x870e, 0x870f, + 0x8710, 0x8711, 0x8712, 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, + 0x8718, 0x8719, 0x871a, 0x871b, 0x871c, 0x871d, 0x871e, 0x871f, + 0x8720, 0x8721, 0x8722, 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, + 0x8728, 0x8729, 0x872a, 0x872b, 0x872c, 0x872d, 0x872e, 0x872f, + 0x8730, 0x8731, 0x8732, 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, + 0x8738, 0x8739, 0x873a, 0x873b, 0x873c, 0x873d, 0x873e, 0x873f, + 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, + 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, + 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, + 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, + 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, + 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, + 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, + 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x877f, + 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, + 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, + 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, + 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, + 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, + 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, + 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, + 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, + 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, + 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, + 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, + 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, + 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, + 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, + 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, + 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x87ff, + 0x8800, 0x8801, 0x8802, 0x8803, 0x8804, 0x8805, 0x8806, 0x8807, + 0x8808, 0x8809, 0x880a, 0x880b, 0x880c, 0x880d, 0x880e, 0x880f, + 0x8810, 0x8811, 0x8812, 0x8813, 0x8814, 0x8815, 0x8816, 0x8817, + 0x8818, 0x8819, 0x881a, 0x881b, 0x881c, 0x881d, 0x881e, 0x881f, + 0x8820, 0x8821, 0x8822, 0x8823, 0x8824, 0x8825, 0x8826, 0x8827, + 0x8828, 0x8829, 0x882a, 0x882b, 0x882c, 0x882d, 0x882e, 0x882f, + 0x8830, 0x8831, 0x8832, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, + 0x8838, 0x8839, 0x883a, 0x883b, 0x883c, 0x883d, 0x883e, 0x883f, + 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, + 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, + 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, + 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, + 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, + 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, + 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, + 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x887f, + 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, + 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, + 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, + 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, + 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, + 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, + 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, + 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, + 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, + 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, + 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, + 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, + 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, + 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, + 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, + 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x88ff, + 0x8900, 0x8901, 0x8902, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, + 0x8908, 0x8909, 0x890a, 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, + 0x8910, 0x8911, 0x8912, 0x8913, 0x8914, 0x8915, 0x8916, 0x8917, + 0x8918, 0x8919, 0x891a, 0x891b, 0x891c, 0x891d, 0x891e, 0x891f, + 0x8920, 0x8921, 0x8922, 0x8923, 0x8924, 0x8925, 0x8926, 0x8927, + 0x8928, 0x8929, 0x892a, 0x892b, 0x892c, 0x892d, 0x892e, 0x892f, + 0x8930, 0x8931, 0x8932, 0x8933, 0x8934, 0x8935, 0x8936, 0x8937, + 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, + 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, + 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, + 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, + 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, + 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, + 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, + 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, + 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x897f, + 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, + 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, + 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, + 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, + 0x89a0, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, + 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, + 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, + 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, + 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, + 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, + 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, + 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, + 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, + 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, + 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, + 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x89ff, + 0x8a00, 0x8a01, 0x8a02, 0x8a03, 0x8a04, 0x8a05, 0x8a06, 0x8a07, + 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, 0x8a0e, 0x8a0f, + 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, + 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, 0x8a1e, 0x8a1f, + 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, 0x8a26, 0x8a27, + 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, 0x8a2e, 0x8a2f, + 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, 0x8a36, 0x8a37, + 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, 0x8a3e, 0x8a3f, + 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, + 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, + 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, + 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, + 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, + 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, + 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, + 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, + 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, + 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, + 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0x8a95, 0x8a96, 0x8a97, + 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, + 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, + 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, + 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, + 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, + 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, + 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, + 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, + 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, + 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, + 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, + 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, + 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8aff, + 0x8b00, 0x8b01, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b07, + 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, 0x8b0d, 0x8b0e, 0x8b0f, + 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, 0x8b15, 0x8b16, 0x8b17, + 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, 0x8b1d, 0x8b1e, 0x8b1f, + 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, 0x8b25, 0x8b26, 0x8b27, + 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, 0x8b2e, 0x8b2f, + 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, 0x8b36, 0x8b37, + 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, 0x8b3e, 0x8b3f, + 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, + 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, + 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, + 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, + 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, + 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, + 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, + 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, + 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, + 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, + 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, + 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, + 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, + 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, + 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, + 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, + 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, + 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, + 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, + 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, + 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, + 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, + 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, + 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8bff, + 0x8c00, 0x8c01, 0x8c02, 0x8c03, 0x8c04, 0x8c05, 0x8c06, 0x8c07, + 0x8c08, 0x8c09, 0x8c0a, 0x8c0b, 0x8c0c, 0x8c0d, 0x8c0e, 0x8c0f, + 0x8c10, 0x8c11, 0x8c12, 0x8c13, 0x8c14, 0x8c15, 0x8c16, 0x8c17, + 0x8c18, 0x8c19, 0x8c1a, 0x8c1b, 0x8c1c, 0x8c1d, 0x8c1e, 0x8c1f, + 0x8c20, 0x8c21, 0x8c22, 0x8c23, 0x8c24, 0x8c25, 0x8c26, 0x8c27, + 0x8c28, 0x8c29, 0x8c2a, 0x8c2b, 0x8c2c, 0x8c2d, 0x8c2e, 0x8c2f, + 0x8c30, 0x8c31, 0x8c32, 0x8c33, 0x8c34, 0x8c35, 0x8c36, 0x8c37, + 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, + 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, + 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, + 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, + 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, + 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, + 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, + 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, + 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c7f, + 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, + 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, + 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, + 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, + 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, + 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, + 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, + 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, + 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, + 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, + 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, + 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, + 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, + 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, + 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, + 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8cff, + 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, 0x8d06, 0x8d07, + 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, 0x8d0e, 0x8d0f, + 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17, + 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d1d, 0x8d1e, 0x8d1f, + 0x8d20, 0x8d21, 0x8d22, 0x8d23, 0x8d24, 0x8d25, 0x8d26, 0x8d27, + 0x8d28, 0x8d29, 0x8d2a, 0x8d2b, 0x8d2c, 0x8d2d, 0x8d2e, 0x8d2f, + 0x8d30, 0x8d31, 0x8d32, 0x8d33, 0x8d34, 0x8d35, 0x8d36, 0x8d37, + 0x8d38, 0x8d39, 0x8d3a, 0x8d3b, 0x8d3c, 0x8d3d, 0x8d3e, 0x8d3f, + 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, + 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, + 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, + 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, + 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, + 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, + 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, + 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, + 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, + 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, + 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, + 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, + 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, + 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, + 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, + 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, + 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, + 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, + 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, + 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, + 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, + 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, + 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, + 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8dff, + 0x8e00, 0x8e01, 0x8e02, 0x8e03, 0x8e04, 0x8e05, 0x8e06, 0x8e07, + 0x8e08, 0x8e09, 0x8e0a, 0x8e0b, 0x8e0c, 0x8e0d, 0x8e0e, 0x8e0f, + 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e14, 0x8e15, 0x8e16, 0x8e17, + 0x8e18, 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e1d, 0x8e1e, 0x8e1f, + 0x8e20, 0x8e21, 0x8e22, 0x8e23, 0x8e24, 0x8e25, 0x8e26, 0x8e27, + 0x8e28, 0x8e29, 0x8e2a, 0x8e2b, 0x8e2c, 0x8e2d, 0x8e2e, 0x8e2f, + 0x8e30, 0x8e31, 0x8e32, 0x8e33, 0x8e34, 0x8e35, 0x8e36, 0x8e37, + 0x8e38, 0x8e39, 0x8e3a, 0x8e3b, 0x8e3c, 0x8e3d, 0x8e3e, 0x8e3f, + 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, + 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, + 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, + 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, + 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, + 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, + 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, + 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e7f, + 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, + 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, + 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, + 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, + 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, + 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, + 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, + 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, + 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, + 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, + 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, + 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, + 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 0x8ee5, 0x8ee6, 0x8ee7, + 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, + 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, + 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8eff, + 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, 0x8f05, 0x8f06, 0x8f07, + 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, 0x8f0d, 0x8f0e, 0x8f0f, + 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, 0x8f15, 0x8f16, 0x8f17, + 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, 0x8f1d, 0x8f1e, 0x8f1f, + 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, 0x8f25, 0x8f26, 0x8f27, + 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f2f, + 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, 0x8f35, 0x8f36, 0x8f37, + 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, 0x8f3d, 0x8f3e, 0x8f3f, + 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, + 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, + 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, + 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, + 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, + 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, + 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, + 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f7f, + 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, + 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, + 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, + 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, + 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, + 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, + 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, + 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, + 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, + 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, + 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, + 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, + 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, + 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, + 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, + 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x8fff, + 0x9000, 0x9001, 0x9002, 0x9003, 0x9004, 0x9005, 0x9006, 0x9007, + 0x9008, 0x9009, 0x900a, 0x900b, 0x900c, 0x900d, 0x900e, 0x900f, + 0x9010, 0x9011, 0x9012, 0x9013, 0x9014, 0x9015, 0x9016, 0x9017, + 0x9018, 0x9019, 0x901a, 0x901b, 0x901c, 0x901d, 0x901e, 0x901f, + 0x9020, 0x9021, 0x9022, 0x9023, 0x9024, 0x9025, 0x9026, 0x9027, + 0x9028, 0x9029, 0x902a, 0x902b, 0x902c, 0x902d, 0x902e, 0x902f, + 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9035, 0x9036, 0x9037, + 0x9038, 0x9039, 0x903a, 0x903b, 0x903c, 0x903d, 0x903e, 0x903f, + 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, + 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, + 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, + 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, + 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, + 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, + 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, + 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x907f, + 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, + 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, + 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, + 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, + 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, + 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, + 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, + 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, + 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, + 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, + 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, + 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, + 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, + 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, + 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, + 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x90ff, + 0x9100, 0x9101, 0x9102, 0x9103, 0x9104, 0x9105, 0x9106, 0x9107, + 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, 0x910d, 0x910e, 0x910f, + 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, + 0x9118, 0x9119, 0x911a, 0x911b, 0x911c, 0x911d, 0x911e, 0x911f, + 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125, 0x9126, 0x9127, + 0x9128, 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x912f, + 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, + 0x9138, 0x9139, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, + 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, + 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, 0x9224, 0x9225, 0x9226, 0x9227, + 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, 0x922e, 0x922f, + 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, + 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, 0x923e, 0x923f, + 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247, + 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, + 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, + 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, + 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, + 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, + 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, + 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x927f, + 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, + 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, 0x92d4, 0x92d5, 0x92d6, 0x92d7, + 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, + 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, + 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, + 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, + 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, + 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, + 0x9308, 0x9309, 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, + 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, + 0x9318, 0x9319, 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, + 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, + 0x9328, 0x9329, 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, + 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, + 0x9338, 0x9339, 0x933a, 0x933b, 0x933c, 0x933d, 0x933e, 0x933f, + 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, + 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, + 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, + 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, + 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, + 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, + 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, + 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x937f, + 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, + 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, + 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, + 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, + 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, + 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, + 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, + 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, + 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, + 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, 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, 0x94dd, 0x94de, 0x94df, + 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, + 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, + 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, + 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x94ff, + 0x9500, 0x9501, 0x9502, 0x9503, 0x9504, 0x9505, 0x9506, 0x9507, + 0x9508, 0x9509, 0x950a, 0x950b, 0x950c, 0x950d, 0x950e, 0x950f, + 0x9510, 0x9511, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9517, + 0x9518, 0x9519, 0x951a, 0x951b, 0x951c, 0x951d, 0x951e, 0x951f, + 0x9520, 0x9521, 0x9522, 0x9523, 0x9524, 0x9525, 0x9526, 0x9527, + 0x9528, 0x9529, 0x952a, 0x952b, 0x952c, 0x952d, 0x952e, 0x952f, + 0x9530, 0x9531, 0x9532, 0x9533, 0x9534, 0x9535, 0x9536, 0x9537, + 0x9538, 0x9539, 0x953a, 0x953b, 0x953c, 0x953d, 0x953e, 0x953f, + 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, + 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, + 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, + 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, + 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, + 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, + 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, + 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x957f, + 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, + 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, + 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, + 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, + 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, + 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, + 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, + 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, + 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, + 0x95c8, 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, + 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, + 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, + 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, + 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, + 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, + 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x95ff, + 0x9600, 0x9601, 0x9602, 0x9603, 0x9604, 0x9605, 0x9606, 0x9607, + 0x9608, 0x9609, 0x960a, 0x960b, 0x960c, 0x960d, 0x960e, 0x960f, + 0x9610, 0x9611, 0x9612, 0x9613, 0x9614, 0x9615, 0x9616, 0x9617, + 0x9618, 0x9619, 0x961a, 0x961b, 0x961c, 0x961d, 0x961e, 0x961f, + 0x9620, 0x9621, 0x9622, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, + 0x9628, 0x9629, 0x962a, 0x962b, 0x962c, 0x962d, 0x962e, 0x962f, + 0x9630, 0x9631, 0x9632, 0x9633, 0x9634, 0x9635, 0x9636, 0x9637, + 0x9638, 0x9639, 0x963a, 0x963b, 0x963c, 0x963d, 0x963e, 0x963f, + 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, + 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, + 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, + 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, + 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, + 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, + 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, + 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, + 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, + 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, + 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, + 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, + 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, + 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, + 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, + 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, + 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, + 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, + 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, + 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, + 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, + 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, + 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, + 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x96ff, + 0x9700, 0x9701, 0x9702, 0x9703, 0x9704, 0x9705, 0x9706, 0x9707, + 0x9708, 0x9709, 0x970a, 0x970b, 0x970c, 0x970d, 0x970e, 0x970f, + 0x9710, 0x9711, 0x9712, 0x9713, 0x9714, 0x9715, 0x9716, 0x9717, + 0x9718, 0x9719, 0x971a, 0x971b, 0x971c, 0x971d, 0x971e, 0x971f, + 0x9720, 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, + 0x9728, 0x9729, 0x972a, 0x972b, 0x972c, 0x972d, 0x972e, 0x972f, + 0x9730, 0x9731, 0x9732, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, + 0x9738, 0x9739, 0x973a, 0x973b, 0x973c, 0x973d, 0x973e, 0x973f, + 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, + 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, + 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, + 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, + 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, + 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, + 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, + 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x977f, + 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, + 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, + 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, + 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, + 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, + 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, + 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7, + 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, + 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, + 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, + 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, + 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, + 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7, + 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, + 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, + 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x97ff, + 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, + 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, 0x980f, + 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, + 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, 0x981f, + 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, + 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, 0x982f, + 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, + 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, 0x983f, + 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, + 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, + 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, + 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, + 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, + 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, + 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, + 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x987f, + 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, + 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, + 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, + 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, + 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, + 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, + 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, + 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, + 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, + 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, + 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, + 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, + 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, + 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, + 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, + 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, + 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, + 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990d, 0x990e, 0x990f, + 0x9910, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, + 0x9918, 0x9919, 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, + 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, + 0x9928, 0x9929, 0x992a, 0x992b, 0x992c, 0x992d, 0x992e, 0x992f, + 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, + 0x9938, 0x9939, 0x993a, 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, + 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, + 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, + 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, + 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, + 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, + 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, + 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, + 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x997f, + 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, + 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, + 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, + 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, + 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, + 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, + 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, + 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, + 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, + 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, + 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, + 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, + 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, + 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, + 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, + 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, + 0x9a00, 0x9a01, 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, + 0x9a08, 0x9a09, 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, + 0x9a10, 0x9a11, 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, + 0x9a18, 0x9a19, 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, + 0x9a20, 0x9a21, 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, + 0x9a28, 0x9a29, 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, + 0x9a30, 0x9a31, 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, + 0x9a38, 0x9a39, 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, + 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, + 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, + 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, + 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, + 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, + 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, + 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, + 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a7f, + 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, + 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, + 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, + 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, + 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, + 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, + 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, + 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, + 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, + 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, + 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, + 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, + 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, + 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, + 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, + 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9aff, + 0x9b00, 0x9b01, 0x9b02, 0x9b03, 0x9b04, 0x9b05, 0x9b06, 0x9b07, + 0x9b08, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b0f, + 0x9b10, 0x9b11, 0x9b12, 0x9b13, 0x9b14, 0x9b15, 0x9b16, 0x9b17, + 0x9b18, 0x9b19, 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b1f, + 0x9b20, 0x9b21, 0x9b22, 0x9b23, 0x9b24, 0x9b25, 0x9b26, 0x9b27, + 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, 0x9b2c, 0x9b2d, 0x9b2e, 0x9b2f, + 0x9b30, 0x9b31, 0x9b32, 0x9b33, 0x9b34, 0x9b35, 0x9b36, 0x9b37, + 0x9b38, 0x9b39, 0x9b3a, 0x9b3b, 0x9b3c, 0x9b3d, 0x9b3e, 0x9b3f, + 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, + 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, + 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, + 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, + 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, + 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, + 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, + 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, + 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, + 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, + 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, + 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, + 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, + 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, + 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, + 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, + 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, + 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, + 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, + 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, + 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, + 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, + 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, + 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, + 0x9c00, 0x9c01, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x9c07, + 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, + 0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17, + 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, + 0x9c20, 0x9c21, 0x9c22, 0x9c23, 0x9c24, 0x9c25, 0x9c26, 0x9c27, + 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, + 0x9c30, 0x9c31, 0x9c32, 0x9c33, 0x9c34, 0x9c35, 0x9c36, 0x9c37, + 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, + 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, + 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, + 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, + 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, + 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, + 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, + 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, + 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c7f, + 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, + 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, + 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, + 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, + 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, + 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, + 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, + 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, + 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, + 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, + 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, + 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, + 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, + 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, + 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, + 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, + 0x9d00, 0x9d01, 0x9d02, 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, + 0x9d08, 0x9d09, 0x9d0a, 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, + 0x9d10, 0x9d11, 0x9d12, 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, + 0x9d18, 0x9d19, 0x9d1a, 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, + 0x9d20, 0x9d21, 0x9d22, 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, + 0x9d28, 0x9d29, 0x9d2a, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, + 0x9d30, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, + 0x9d38, 0x9d39, 0x9d3a, 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, + 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, + 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, + 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, + 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, + 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, + 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, + 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, + 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, + 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, + 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, + 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, + 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, + 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, + 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, + 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, + 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, + 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, + 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, + 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, + 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, + 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, + 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, + 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, + 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, + 0x9e00, 0x9e01, 0x9e02, 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, + 0x9e08, 0x9e09, 0x9e0a, 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, + 0x9e10, 0x9e11, 0x9e12, 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, + 0x9e18, 0x9e19, 0x9e1a, 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e1f, + 0x9e20, 0x9e21, 0x9e22, 0x9e23, 0x9e24, 0x9e25, 0x9e26, 0x9e27, + 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e2d, 0x9e2e, 0x9e2f, + 0x9e30, 0x9e31, 0x9e32, 0x9e33, 0x9e34, 0x9e35, 0x9e36, 0x9e37, + 0x9e38, 0x9e39, 0x9e3a, 0x9e3b, 0x9e3c, 0x9e3d, 0x9e3e, 0x9e3f, + 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, + 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, + 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, + 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, + 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, + 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, + 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, + 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e7f, + 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, + 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, + 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, + 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, + 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, + 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, + 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, + 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, + 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, + 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, + 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, + 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, + 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, + 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, + 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, + 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9eff, + 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, 0x9f07, + 0x9f08, 0x9f09, 0x9f0a, 0x9f0b, 0x9f0c, 0x9f0d, 0x9f0e, 0x9f0f, + 0x9f10, 0x9f11, 0x9f12, 0x9f13, 0x9f14, 0x9f15, 0x9f16, 0x9f17, + 0x9f18, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, 0x9f1e, 0x9f1f, + 0x9f20, 0x9f21, 0x9f22, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, + 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2c, 0x9f2d, 0x9f2e, 0x9f2f, + 0x9f30, 0x9f31, 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f37, + 0x9f38, 0x9f39, 0x9f3a, 0x9f3b, 0x9f3c, 0x9f3d, 0x9f3e, 0x9f3f, + 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, + 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, + 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, + 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, + 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, + 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, + 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, + 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f7f, + 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, + 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, + 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, + 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, + 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, + 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, + 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, + 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, + 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, + 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf, + 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, + 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf, + 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7, + 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef, + 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, + 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0x9fff, + 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, 0xa48d, 0xa48e, 0xa48f, + 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, 0xa4c7, + 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf, + 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, + 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df, + 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7, + 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef, + 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0xa4f4, 0xa4f5, 0xa4f6, 0xa4f7, + 0xa4f8, 0xa4f9, 0xa4fa, 0xa4fb, 0xa4fc, 0xa4fd, 0xa4fe, 0xa4ff, + 0xa500, 0xa501, 0xa502, 0xa503, 0xa504, 0xa505, 0xa506, 0xa507, + 0xa508, 0xa509, 0xa50a, 0xa50b, 0xa50c, 0xa50d, 0xa50e, 0xa50f, + 0xa510, 0xa511, 0xa512, 0xa513, 0xa514, 0xa515, 0xa516, 0xa517, + 0xa518, 0xa519, 0xa51a, 0xa51b, 0xa51c, 0xa51d, 0xa51e, 0xa51f, + 0xa520, 0xa521, 0xa522, 0xa523, 0xa524, 0xa525, 0xa526, 0xa527, + 0xa528, 0xa529, 0xa52a, 0xa52b, 0xa52c, 0xa52d, 0xa52e, 0xa52f, + 0xa530, 0xa531, 0xa532, 0xa533, 0xa534, 0xa535, 0xa536, 0xa537, + 0xa538, 0xa539, 0xa53a, 0xa53b, 0xa53c, 0xa53d, 0xa53e, 0xa53f, + 0xa540, 0xa541, 0xa542, 0xa543, 0xa544, 0xa545, 0xa546, 0xa547, + 0xa548, 0xa549, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa54e, 0xa54f, + 0xa550, 0xa551, 0xa552, 0xa553, 0xa554, 0xa555, 0xa556, 0xa557, + 0xa558, 0xa559, 0xa55a, 0xa55b, 0xa55c, 0xa55d, 0xa55e, 0xa55f, + 0xa560, 0xa561, 0xa562, 0xa563, 0xa564, 0xa565, 0xa566, 0xa567, + 0xa568, 0xa569, 0xa56a, 0xa56b, 0xa56c, 0xa56d, 0xa56e, 0xa56f, + 0xa570, 0xa571, 0xa572, 0xa573, 0xa574, 0xa575, 0xa576, 0xa577, + 0xa578, 0xa579, 0xa57a, 0xa57b, 0xa57c, 0xa57d, 0xa57e, 0xa57f, + 0xa580, 0xa581, 0xa582, 0xa583, 0xa584, 0xa585, 0xa586, 0xa587, + 0xa588, 0xa589, 0xa58a, 0xa58b, 0xa58c, 0xa58d, 0xa58e, 0xa58f, + 0xa590, 0xa591, 0xa592, 0xa593, 0xa594, 0xa595, 0xa596, 0xa597, + 0xa598, 0xa599, 0xa59a, 0xa59b, 0xa59c, 0xa59d, 0xa59e, 0xa59f, + 0xa5a0, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7, + 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae, 0xa5af, + 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7, + 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be, 0xa5bf, + 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7, + 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf, + 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7, + 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de, 0xa5df, + 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7, + 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef, + 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6, 0xa5f7, + 0xa5f8, 0xa5f9, 0xa5fa, 0xa5fb, 0xa5fc, 0xa5fd, 0xa5fe, 0xa5ff, + 0xa600, 0xa601, 0xa602, 0xa603, 0xa604, 0xa605, 0xa606, 0xa607, + 0xa608, 0xa609, 0xa60a, 0xa60b, 0xa60c, 0xa60d, 0xa60e, 0xa60f, + 0xa610, 0xa611, 0xa612, 0xa613, 0xa614, 0xa615, 0xa616, 0xa617, + 0xa618, 0xa619, 0xa61a, 0xa61b, 0xa61c, 0xa61d, 0xa61e, 0xa61f, + 0xa620, 0xa621, 0xa622, 0xa623, 0xa624, 0xa625, 0xa626, 0xa627, + 0xa628, 0xa629, 0xa62a, 0xa62b, 0xa62c, 0xa62d, 0xa62e, 0xa62f, + 0xa630, 0xa631, 0xa632, 0xa633, 0xa634, 0xa635, 0xa636, 0xa637, + 0xa638, 0xa639, 0xa63a, 0xa63b, 0xa63c, 0xa63d, 0xa63e, 0xa63f, + 0xa640, 0xa641, 0xa642, 0xa643, 0xa644, 0xa645, 0xa646, 0xa647, + 0xa648, 0xa649, 0xa64a, 0xa64b, 0xa64c, 0xa64d, 0xa64e, 0xa64f, + 0xa650, 0xa651, 0xa652, 0xa653, 0xa654, 0xa655, 0xa656, 0xa657, + 0xa658, 0xa659, 0xa65a, 0xa65b, 0xa65c, 0xa65d, 0xa65e, 0xa65f, + 0xa660, 0xa661, 0xa662, 0xa663, 0xa664, 0xa665, 0xa666, 0xa667, + 0xa668, 0xa669, 0xa66a, 0xa66b, 0xa66c, 0xa66d, 0xa66e, 0xa66f, + 0xa670, 0xa671, 0xa672, 0xa673, 0xa674, 0xa675, 0xa676, 0xa677, + 0xa678, 0xa679, 0xa67a, 0xa67b, 0xa67c, 0xa67d, 0xa67e, 0xa67f, + 0xa680, 0xa681, 0xa682, 0xa683, 0xa684, 0xa685, 0xa686, 0xa687, + 0xa688, 0xa689, 0xa68a, 0xa68b, 0xa68c, 0xa68d, 0xa68e, 0xa68f, + 0xa690, 0xa691, 0xa692, 0xa693, 0xa694, 0xa695, 0xa696, 0xa697, + 0xa698, 0xa699, 0xa69a, 0xa69b, 0xa69c, 0xa69d, 0xa69e, 0xa69f, + 0xa6a0, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6, 0xa6a7, + 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae, 0xa6af, + 0xa6b0, 0xa6b1, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6, 0xa6b7, + 0xa6b8, 0xa6b9, 0xa6ba, 0xa6bb, 0xa6bc, 0xa6bd, 0xa6be, 0xa6bf, + 0xa6c0, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7, + 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf, + 0xa6d0, 0xa6d1, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6, 0xa6d7, + 0xa6d8, 0xa6d9, 0xa6da, 0xa6db, 0xa6dc, 0xa6dd, 0xa6de, 0xa6df, + 0xa6e0, 0xa6e1, 0xa6e2, 0xa6e3, 0xa6e4, 0xa6e5, 0xa6e6, 0xa6e7, + 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0xa6ec, 0xa6ed, 0xa6ee, 0xa6ef, + 0xa6f0, 0xa6f1, 0xa6f2, 0xa6f3, 0xa6f4, 0xa6f5, 0xa6f6, 0xa6f7, + 0xa6f8, 0xa6f9, 0xa6fa, 0xa6fb, 0xa6fc, 0xa6fd, 0xa6fe, 0xa6ff, + 0xa700, 0xa701, 0xa702, 0xa703, 0xa704, 0xa705, 0xa706, 0xa707, + 0xa708, 0xa709, 0xa70a, 0xa70b, 0xa70c, 0xa70d, 0xa70e, 0xa70f, + 0xa710, 0xa711, 0xa712, 0xa713, 0xa714, 0xa715, 0xa716, 0xa717, + 0xa718, 0xa719, 0xa71a, 0xa71b, 0xa71c, 0xa71d, 0xa71e, 0xa71f, + 0xa720, 0xa721, 0xa722, 0xa723, 0xa724, 0xa725, 0xa726, 0xa727, + 0xa728, 0xa729, 0xa72a, 0xa72b, 0xa72c, 0xa72d, 0xa72e, 0xa72f, + 0xa730, 0xa731, 0xa732, 0xa733, 0xa734, 0xa735, 0xa736, 0xa737, + 0xa738, 0xa739, 0xa73a, 0xa73b, 0xa73c, 0xa73d, 0xa73e, 0xa73f, + 0xa740, 0xa741, 0xa742, 0xa743, 0xa744, 0xa745, 0xa746, 0xa747, + 0xa748, 0xa749, 0xa74a, 0xa74b, 0xa74c, 0xa74d, 0xa74e, 0xa74f, + 0xa750, 0xa751, 0xa752, 0xa753, 0xa754, 0xa755, 0xa756, 0xa757, + 0xa758, 0xa759, 0xa75a, 0xa75b, 0xa75c, 0xa75d, 0xa75e, 0xa75f, + 0xa760, 0xa761, 0xa762, 0xa763, 0xa764, 0xa765, 0xa766, 0xa767, + 0xa768, 0xa769, 0xa76a, 0xa76b, 0xa76c, 0xa76d, 0xa76e, 0xa76f, + 0xa770, 0xa771, 0xa772, 0xa773, 0xa774, 0xa775, 0xa776, 0xa777, + 0xa778, 0xa779, 0xa77a, 0xa77b, 0xa77c, 0xa77d, 0xa77e, 0xa77f, + 0xa780, 0xa781, 0xa782, 0xa783, 0xa784, 0xa785, 0xa786, 0xa787, + 0xa788, 0xa789, 0xa78a, 0xa78b, 0xa78c, 0xa78d, 0xa78e, 0xa78f, + 0xa790, 0xa791, 0xa792, 0xa793, 0xa794, 0xa795, 0xa796, 0xa797, + 0xa798, 0xa799, 0xa79a, 0xa79b, 0xa79c, 0xa79d, 0xa79e, 0xa79f, + 0xa7a0, 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4, 0xa7a5, 0xa7a6, 0xa7a7, + 0xa7a8, 0xa7a9, 0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, + 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5, 0xa7b6, 0xa7b7, + 0xa7b8, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd, 0xa7be, 0xa7bf, + 0xa7c0, 0xa7c1, 0xa7c2, 0xa7c3, 0xa7c4, 0xa7c5, 0xa7c6, 0xa7c7, + 0xa7c8, 0xa7c9, 0xa7ca, 0xa7cb, 0xa7cc, 0xa7cd, 0xa7ce, 0xa7cf, + 0xa7d0, 0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d7, + 0xa7d8, 0xa7d9, 0xa7da, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de, 0xa7df, + 0xa7e0, 0xa7e1, 0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0xa7e7, + 0xa7e8, 0xa7e9, 0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed, 0xa7ee, 0xa7ef, + 0xa7f0, 0xa7f1, 0xa7f2, 0xa7f3, 0xa7f4, 0xa7f5, 0xa7f6, 0xa7f7, + 0xa7f8, 0xa7f9, 0xa7fa, 0xa7fb, 0xa7fc, 0xa7fd, 0xa7fe, 0xa7ff, + 0xa800, 0xa801, 0xa802, 0xa803, 0xa804, 0xa805, 0xa806, 0xa807, + 0xa808, 0xa809, 0xa80a, 0xa80b, 0xa80c, 0xa80d, 0xa80e, 0xa80f, + 0xa810, 0xa811, 0xa812, 0xa813, 0xa814, 0xa815, 0xa816, 0xa817, + 0xa818, 0xa819, 0xa81a, 0xa81b, 0xa81c, 0xa81d, 0xa81e, 0xa81f, + 0xa820, 0xa821, 0xa822, 0xa823, 0xa824, 0xa825, 0xa826, 0xa827, + 0xa828, 0xa829, 0xa82a, 0xa82b, 0xa82c, 0xa82d, 0xa82e, 0xa82f, + 0xa830, 0xa831, 0xa832, 0xa833, 0xa834, 0xa835, 0xa836, 0xa837, + 0xa838, 0xa839, 0xa83a, 0xa83b, 0xa83c, 0xa83d, 0xa83e, 0xa83f, + 0xa840, 0xa841, 0xa842, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, + 0xa848, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, + 0xa850, 0xa851, 0xa852, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, + 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, + 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, + 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, + 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, + 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, 0xa87f, + 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, + 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, + 0xa890, 0xa891, 0xa892, 0xa893, 0xa894, 0xa895, 0xa896, 0xa897, + 0xa898, 0xa899, 0xa89a, 0xa89b, 0xa89c, 0xa89d, 0xa89e, 0xa89f, + 0xa8a0, 0xa8a1, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a5, 0xa8a6, 0xa8a7, + 0xa8a8, 0xa8a9, 0xa8aa, 0xa8ab, 0xa8ac, 0xa8ad, 0xa8ae, 0xa8af, + 0xa8b0, 0xa8b1, 0xa8b2, 0xa8b3, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, + 0xa8b8, 0xa8b9, 0xa8ba, 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, + 0xa8c0, 0xa8c1, 0xa8c2, 0xa8c3, 0xa8c4, 0xa8c5, 0xa8c6, 0xa8c7, + 0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0xa8cd, 0xa8ce, 0xa8cf, + 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7, + 0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc, 0xa8dd, 0xa8de, 0xa8df, + 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7, + 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, 0xa8ed, 0xa8ee, 0xa8ef, + 0xa8f0, 0xa8f1, 0xa8f2, 0xa8f3, 0xa8f4, 0xa8f5, 0xa8f6, 0xa8f7, + 0xa8f8, 0xa8f9, 0xa8fa, 0xa8fb, 0xa8fc, 0xa8fd, 0xa8fe, 0xa8ff, + 0xa900, 0xa901, 0xa902, 0xa903, 0xa904, 0xa905, 0xa906, 0xa907, + 0xa908, 0xa909, 0xa90a, 0xa90b, 0xa90c, 0xa90d, 0xa90e, 0xa90f, + 0xa910, 0xa911, 0xa912, 0xa913, 0xa914, 0xa915, 0xa916, 0xa917, + 0xa918, 0xa919, 0xa91a, 0xa91b, 0xa91c, 0xa91d, 0xa91e, 0xa91f, + 0xa920, 0xa921, 0xa922, 0xa923, 0xa924, 0xa925, 0xa926, 0xa927, + 0xa928, 0xa929, 0xa92a, 0xa92b, 0xa92c, 0xa92d, 0xa92e, 0xa92f, + 0xa930, 0xa931, 0xa932, 0xa933, 0xa934, 0xa935, 0xa936, 0xa937, + 0xa938, 0xa939, 0xa93a, 0xa93b, 0xa93c, 0xa93d, 0xa93e, 0xa93f, + 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, + 0xa948, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, + 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0xa955, 0xa956, 0xa957, + 0xa958, 0xa959, 0xa95a, 0xa95b, 0xa95c, 0xa95d, 0xa95e, 0xa95f, + 0xa960, 0xa961, 0xa962, 0xa963, 0xa964, 0xa965, 0xa966, 0xa967, + 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, + 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, + 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa97f, + 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, + 0xa988, 0xa989, 0xa98a, 0xa98b, 0xa98c, 0xa98d, 0xa98e, 0xa98f, + 0xa990, 0xa991, 0xa992, 0xa993, 0xa994, 0xa995, 0xa996, 0xa997, + 0xa998, 0xa999, 0xa99a, 0xa99b, 0xa99c, 0xa99d, 0xa99e, 0xa99f, + 0xa9a0, 0xa9a1, 0xa9a2, 0xa9a3, 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, + 0xa9a8, 0xa9a9, 0xa9aa, 0xa9ab, 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, + 0xa9b0, 0xa9b1, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, + 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, + 0xa9c0, 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, + 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb, 0xa9cc, 0xa9cd, 0xa9ce, 0xa9cf, + 0xa9d0, 0xa9d1, 0xa9d2, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, + 0xa9d8, 0xa9d9, 0xa9da, 0xa9db, 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, + 0xa9e0, 0xa9e1, 0xa9e2, 0xa9e3, 0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, + 0xa9e8, 0xa9e9, 0xa9ea, 0xa9eb, 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, + 0xa9f0, 0xa9f1, 0xa9f2, 0xa9f3, 0xa9f4, 0xa9f5, 0xa9f6, 0xa9f7, + 0xa9f8, 0xa9f9, 0xa9fa, 0xa9fb, 0xa9fc, 0xa9fd, 0xa9fe, 0xa9ff, + 0xaa00, 0xaa01, 0xaa02, 0xaa03, 0xaa04, 0xaa05, 0xaa06, 0xaa07, + 0xaa08, 0xaa09, 0xaa0a, 0xaa0b, 0xaa0c, 0xaa0d, 0xaa0e, 0xaa0f, + 0xaa10, 0xaa11, 0xaa12, 0xaa13, 0xaa14, 0xaa15, 0xaa16, 0xaa17, + 0xaa18, 0xaa19, 0xaa1a, 0xaa1b, 0xaa1c, 0xaa1d, 0xaa1e, 0xaa1f, + 0xaa20, 0xaa21, 0xaa22, 0xaa23, 0xaa24, 0xaa25, 0xaa26, 0xaa27, + 0xaa28, 0xaa29, 0xaa2a, 0xaa2b, 0xaa2c, 0xaa2d, 0xaa2e, 0xaa2f, + 0xaa30, 0xaa31, 0xaa32, 0xaa33, 0xaa34, 0xaa35, 0xaa36, 0xaa37, + 0xaa38, 0xaa39, 0xaa3a, 0xaa3b, 0xaa3c, 0xaa3d, 0xaa3e, 0xaa3f, + 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, + 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, + 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, + 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, + 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, + 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, + 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, + 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa7f, + 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, + 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, + 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, + 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, + 0xaaa0, 0xaaa1, 0xaaa2, 0xaaa3, 0xaaa4, 0xaaa5, 0xaaa6, 0xaaa7, + 0xaaa8, 0xaaa9, 0xaaaa, 0xaaab, 0xaaac, 0xaaad, 0xaaae, 0xaaaf, + 0xaab0, 0xaab1, 0xaab2, 0xaab3, 0xaab4, 0xaab5, 0xaab6, 0xaab7, + 0xaab8, 0xaab9, 0xaaba, 0xaabb, 0xaabc, 0xaabd, 0xaabe, 0xaabf, + 0xaac0, 0xaac1, 0xaac2, 0xaac3, 0xaac4, 0xaac5, 0xaac6, 0xaac7, + 0xaac8, 0xaac9, 0xaaca, 0xaacb, 0xaacc, 0xaacd, 0xaace, 0xaacf, + 0xaad0, 0xaad1, 0xaad2, 0xaad3, 0xaad4, 0xaad5, 0xaad6, 0xaad7, + 0xaad8, 0xaad9, 0xaada, 0xaadb, 0xaadc, 0xaadd, 0xaade, 0xaadf, + 0xaae0, 0xaae1, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7, + 0xaae8, 0xaae9, 0xaaea, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef, + 0xaaf0, 0xaaf1, 0xaaf2, 0xaaf3, 0xaaf4, 0xaaf5, 0xaaf6, 0xaaf7, + 0xaaf8, 0xaaf9, 0xaafa, 0xaafb, 0xaafc, 0xaafd, 0xaafe, 0xaaff, + 0xab00, 0xab01, 0xab02, 0xab03, 0xab04, 0xab05, 0xab06, 0xab07, + 0xab08, 0xab09, 0xab0a, 0xab0b, 0xab0c, 0xab0d, 0xab0e, 0xab0f, + 0xab10, 0xab11, 0xab12, 0xab13, 0xab14, 0xab15, 0xab16, 0xab17, + 0xab18, 0xab19, 0xab1a, 0xab1b, 0xab1c, 0xab1d, 0xab1e, 0xab1f, + 0xab20, 0xab21, 0xab22, 0xab23, 0xab24, 0xab25, 0xab26, 0xab27, + 0xab28, 0xab29, 0xab2a, 0xab2b, 0xab2c, 0xab2d, 0xab2e, 0xab2f, + 0xab30, 0xab31, 0xab32, 0xab33, 0xab34, 0xab35, 0xab36, 0xab37, + 0xab38, 0xab39, 0xab3a, 0xab3b, 0xab3c, 0xab3d, 0xab3e, 0xab3f, + 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, + 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, + 0xab50, 0xab51, 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, + 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, + 0xab60, 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, + 0xab68, 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, + 0xab70, 0xab71, 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, + 0xab78, 0xab79, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab7f, + 0xab80, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, + 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, + 0xab90, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, + 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, + 0xaba0, 0xaba1, 0xaba2, 0xaba3, 0xaba4, 0xaba5, 0xaba6, 0xaba7, + 0xaba8, 0xaba9, 0xabaa, 0xabab, 0xabac, 0xabad, 0xabae, 0xabaf, + 0xabb0, 0xabb1, 0xabb2, 0xabb3, 0xabb4, 0xabb5, 0xabb6, 0xabb7, + 0xabb8, 0xabb9, 0xabba, 0xabbb, 0xabbc, 0xabbd, 0xabbe, 0xabbf, + 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc4, 0xabc5, 0xabc6, 0xabc7, + 0xabc8, 0xabc9, 0xabca, 0xabcb, 0xabcc, 0xabcd, 0xabce, 0xabcf, + 0xabd0, 0xabd1, 0xabd2, 0xabd3, 0xabd4, 0xabd5, 0xabd6, 0xabd7, + 0xabd8, 0xabd9, 0xabda, 0xabdb, 0xabdc, 0xabdd, 0xabde, 0xabdf, + 0xabe0, 0xabe1, 0xabe2, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7, + 0xabe8, 0xabe9, 0xabea, 0xabeb, 0xabec, 0xabed, 0xabee, 0xabef, + 0xabf0, 0xabf1, 0xabf2, 0xabf3, 0xabf4, 0xabf5, 0xabf6, 0xabf7, + 0xabf8, 0xabf9, 0xabfa, 0xabfb, 0xabfc, 0xabfd, 0xabfe, 0xabff, + 0xac00, 0xac01, 0xac02, 0xac03, 0xac04, 0xac05, 0xac06, 0xac07, + 0xac08, 0xac09, 0xac0a, 0xac0b, 0xac0c, 0xac0d, 0xac0e, 0xac0f, + 0xac10, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, + 0xac18, 0xac19, 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac1e, 0xac1f, + 0xac20, 0xac21, 0xac22, 0xac23, 0xac24, 0xac25, 0xac26, 0xac27, + 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2c, 0xac2d, 0xac2e, 0xac2f, + 0xac30, 0xac31, 0xac32, 0xac33, 0xac34, 0xac35, 0xac36, 0xac37, + 0xac38, 0xac39, 0xac3a, 0xac3b, 0xac3c, 0xac3d, 0xac3e, 0xac3f, + 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, + 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, + 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, + 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, + 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, + 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, + 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, + 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac7f, + 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, + 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, + 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, + 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, + 0xaca0, 0xaca1, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca7, + 0xaca8, 0xaca9, 0xacaa, 0xacab, 0xacac, 0xacad, 0xacae, 0xacaf, + 0xacb0, 0xacb1, 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, + 0xacb8, 0xacb9, 0xacba, 0xacbb, 0xacbc, 0xacbd, 0xacbe, 0xacbf, + 0xacc0, 0xacc1, 0xacc2, 0xacc3, 0xacc4, 0xacc5, 0xacc6, 0xacc7, + 0xacc8, 0xacc9, 0xacca, 0xaccb, 0xaccc, 0xaccd, 0xacce, 0xaccf, + 0xacd0, 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd5, 0xacd6, 0xacd7, + 0xacd8, 0xacd9, 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, + 0xace0, 0xace1, 0xace2, 0xace3, 0xace4, 0xace5, 0xace6, 0xace7, + 0xace8, 0xace9, 0xacea, 0xaceb, 0xacec, 0xaced, 0xacee, 0xacef, + 0xacf0, 0xacf1, 0xacf2, 0xacf3, 0xacf4, 0xacf5, 0xacf6, 0xacf7, + 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0xacfc, 0xacfd, 0xacfe, 0xacff, + 0xad00, 0xad01, 0xad02, 0xad03, 0xad04, 0xad05, 0xad06, 0xad07, + 0xad08, 0xad09, 0xad0a, 0xad0b, 0xad0c, 0xad0d, 0xad0e, 0xad0f, + 0xad10, 0xad11, 0xad12, 0xad13, 0xad14, 0xad15, 0xad16, 0xad17, + 0xad18, 0xad19, 0xad1a, 0xad1b, 0xad1c, 0xad1d, 0xad1e, 0xad1f, + 0xad20, 0xad21, 0xad22, 0xad23, 0xad24, 0xad25, 0xad26, 0xad27, + 0xad28, 0xad29, 0xad2a, 0xad2b, 0xad2c, 0xad2d, 0xad2e, 0xad2f, + 0xad30, 0xad31, 0xad32, 0xad33, 0xad34, 0xad35, 0xad36, 0xad37, + 0xad38, 0xad39, 0xad3a, 0xad3b, 0xad3c, 0xad3d, 0xad3e, 0xad3f, + 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, + 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, + 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, + 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, + 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, + 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, + 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, + 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad7f, + 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, + 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, + 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, + 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, + 0xada0, 0xada1, 0xada2, 0xada3, 0xada4, 0xada5, 0xada6, 0xada7, + 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac, 0xadad, 0xadae, 0xadaf, + 0xadb0, 0xadb1, 0xadb2, 0xadb3, 0xadb4, 0xadb5, 0xadb6, 0xadb7, + 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd, 0xadbe, 0xadbf, + 0xadc0, 0xadc1, 0xadc2, 0xadc3, 0xadc4, 0xadc5, 0xadc6, 0xadc7, + 0xadc8, 0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, + 0xadd0, 0xadd1, 0xadd2, 0xadd3, 0xadd4, 0xadd5, 0xadd6, 0xadd7, + 0xadd8, 0xadd9, 0xadda, 0xaddb, 0xaddc, 0xaddd, 0xadde, 0xaddf, + 0xade0, 0xade1, 0xade2, 0xade3, 0xade4, 0xade5, 0xade6, 0xade7, + 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec, 0xaded, 0xadee, 0xadef, + 0xadf0, 0xadf1, 0xadf2, 0xadf3, 0xadf4, 0xadf5, 0xadf6, 0xadf7, + 0xadf8, 0xadf9, 0xadfa, 0xadfb, 0xadfc, 0xadfd, 0xadfe, 0xadff, + 0xae00, 0xae01, 0xae02, 0xae03, 0xae04, 0xae05, 0xae06, 0xae07, + 0xae08, 0xae09, 0xae0a, 0xae0b, 0xae0c, 0xae0d, 0xae0e, 0xae0f, + 0xae10, 0xae11, 0xae12, 0xae13, 0xae14, 0xae15, 0xae16, 0xae17, + 0xae18, 0xae19, 0xae1a, 0xae1b, 0xae1c, 0xae1d, 0xae1e, 0xae1f, + 0xae20, 0xae21, 0xae22, 0xae23, 0xae24, 0xae25, 0xae26, 0xae27, + 0xae28, 0xae29, 0xae2a, 0xae2b, 0xae2c, 0xae2d, 0xae2e, 0xae2f, + 0xae30, 0xae31, 0xae32, 0xae33, 0xae34, 0xae35, 0xae36, 0xae37, + 0xae38, 0xae39, 0xae3a, 0xae3b, 0xae3c, 0xae3d, 0xae3e, 0xae3f, + 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, + 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, + 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, + 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, + 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, + 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, + 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, + 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae7f, + 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, + 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, + 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, + 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, + 0xaea0, 0xaea1, 0xaea2, 0xaea3, 0xaea4, 0xaea5, 0xaea6, 0xaea7, + 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac, 0xaead, 0xaeae, 0xaeaf, + 0xaeb0, 0xaeb1, 0xaeb2, 0xaeb3, 0xaeb4, 0xaeb5, 0xaeb6, 0xaeb7, + 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0xaebc, 0xaebd, 0xaebe, 0xaebf, + 0xaec0, 0xaec1, 0xaec2, 0xaec3, 0xaec4, 0xaec5, 0xaec6, 0xaec7, + 0xaec8, 0xaec9, 0xaeca, 0xaecb, 0xaecc, 0xaecd, 0xaece, 0xaecf, + 0xaed0, 0xaed1, 0xaed2, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, + 0xaed8, 0xaed9, 0xaeda, 0xaedb, 0xaedc, 0xaedd, 0xaede, 0xaedf, + 0xaee0, 0xaee1, 0xaee2, 0xaee3, 0xaee4, 0xaee5, 0xaee6, 0xaee7, + 0xaee8, 0xaee9, 0xaeea, 0xaeeb, 0xaeec, 0xaeed, 0xaeee, 0xaeef, + 0xaef0, 0xaef1, 0xaef2, 0xaef3, 0xaef4, 0xaef5, 0xaef6, 0xaef7, + 0xaef8, 0xaef9, 0xaefa, 0xaefb, 0xaefc, 0xaefd, 0xaefe, 0xaeff, + 0xaf00, 0xaf01, 0xaf02, 0xaf03, 0xaf04, 0xaf05, 0xaf06, 0xaf07, + 0xaf08, 0xaf09, 0xaf0a, 0xaf0b, 0xaf0c, 0xaf0d, 0xaf0e, 0xaf0f, + 0xaf10, 0xaf11, 0xaf12, 0xaf13, 0xaf14, 0xaf15, 0xaf16, 0xaf17, + 0xaf18, 0xaf19, 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1e, 0xaf1f, + 0xaf20, 0xaf21, 0xaf22, 0xaf23, 0xaf24, 0xaf25, 0xaf26, 0xaf27, + 0xaf28, 0xaf29, 0xaf2a, 0xaf2b, 0xaf2c, 0xaf2d, 0xaf2e, 0xaf2f, + 0xaf30, 0xaf31, 0xaf32, 0xaf33, 0xaf34, 0xaf35, 0xaf36, 0xaf37, + 0xaf38, 0xaf39, 0xaf3a, 0xaf3b, 0xaf3c, 0xaf3d, 0xaf3e, 0xaf3f, + 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, + 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, + 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, + 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, + 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, + 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, + 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, + 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf7f, + 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, + 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, + 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, + 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, + 0xafa0, 0xafa1, 0xafa2, 0xafa3, 0xafa4, 0xafa5, 0xafa6, 0xafa7, + 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac, 0xafad, 0xafae, 0xafaf, + 0xafb0, 0xafb1, 0xafb2, 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafb7, + 0xafb8, 0xafb9, 0xafba, 0xafbb, 0xafbc, 0xafbd, 0xafbe, 0xafbf, + 0xafc0, 0xafc1, 0xafc2, 0xafc3, 0xafc4, 0xafc5, 0xafc6, 0xafc7, + 0xafc8, 0xafc9, 0xafca, 0xafcb, 0xafcc, 0xafcd, 0xafce, 0xafcf, + 0xafd0, 0xafd1, 0xafd2, 0xafd3, 0xafd4, 0xafd5, 0xafd6, 0xafd7, + 0xafd8, 0xafd9, 0xafda, 0xafdb, 0xafdc, 0xafdd, 0xafde, 0xafdf, + 0xafe0, 0xafe1, 0xafe2, 0xafe3, 0xafe4, 0xafe5, 0xafe6, 0xafe7, + 0xafe8, 0xafe9, 0xafea, 0xafeb, 0xafec, 0xafed, 0xafee, 0xafef, + 0xaff0, 0xaff1, 0xaff2, 0xaff3, 0xaff4, 0xaff5, 0xaff6, 0xaff7, + 0xaff8, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff, + 0xb000, 0xb001, 0xb002, 0xb003, 0xb004, 0xb005, 0xb006, 0xb007, + 0xb008, 0xb009, 0xb00a, 0xb00b, 0xb00c, 0xb00d, 0xb00e, 0xb00f, + 0xb010, 0xb011, 0xb012, 0xb013, 0xb014, 0xb015, 0xb016, 0xb017, + 0xb018, 0xb019, 0xb01a, 0xb01b, 0xb01c, 0xb01d, 0xb01e, 0xb01f, + 0xb020, 0xb021, 0xb022, 0xb023, 0xb024, 0xb025, 0xb026, 0xb027, + 0xb028, 0xb029, 0xb02a, 0xb02b, 0xb02c, 0xb02d, 0xb02e, 0xb02f, + 0xb030, 0xb031, 0xb032, 0xb033, 0xb034, 0xb035, 0xb036, 0xb037, + 0xb038, 0xb039, 0xb03a, 0xb03b, 0xb03c, 0xb03d, 0xb03e, 0xb03f, + 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, + 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, + 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, + 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, + 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, + 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, + 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, + 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb07f, + 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, + 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, + 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, + 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, + 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, + 0xb0a8, 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, + 0xb0b0, 0xb0b1, 0xb0b2, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b6, 0xb0b7, + 0xb0b8, 0xb0b9, 0xb0ba, 0xb0bb, 0xb0bc, 0xb0bd, 0xb0be, 0xb0bf, + 0xb0c0, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c4, 0xb0c5, 0xb0c6, 0xb0c7, + 0xb0c8, 0xb0c9, 0xb0ca, 0xb0cb, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf, + 0xb0d0, 0xb0d1, 0xb0d2, 0xb0d3, 0xb0d4, 0xb0d5, 0xb0d6, 0xb0d7, + 0xb0d8, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd, 0xb0de, 0xb0df, + 0xb0e0, 0xb0e1, 0xb0e2, 0xb0e3, 0xb0e4, 0xb0e5, 0xb0e6, 0xb0e7, + 0xb0e8, 0xb0e9, 0xb0ea, 0xb0eb, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, + 0xb0f0, 0xb0f1, 0xb0f2, 0xb0f3, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, + 0xb0f8, 0xb0f9, 0xb0fa, 0xb0fb, 0xb0fc, 0xb0fd, 0xb0fe, 0xb0ff, + 0xb100, 0xb101, 0xb102, 0xb103, 0xb104, 0xb105, 0xb106, 0xb107, + 0xb108, 0xb109, 0xb10a, 0xb10b, 0xb10c, 0xb10d, 0xb10e, 0xb10f, + 0xb110, 0xb111, 0xb112, 0xb113, 0xb114, 0xb115, 0xb116, 0xb117, + 0xb118, 0xb119, 0xb11a, 0xb11b, 0xb11c, 0xb11d, 0xb11e, 0xb11f, + 0xb120, 0xb121, 0xb122, 0xb123, 0xb124, 0xb125, 0xb126, 0xb127, + 0xb128, 0xb129, 0xb12a, 0xb12b, 0xb12c, 0xb12d, 0xb12e, 0xb12f, + 0xb130, 0xb131, 0xb132, 0xb133, 0xb134, 0xb135, 0xb136, 0xb137, + 0xb138, 0xb139, 0xb13a, 0xb13b, 0xb13c, 0xb13d, 0xb13e, 0xb13f, + 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, + 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, + 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, + 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, + 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, + 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, + 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, + 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb17f, + 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, + 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, + 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, + 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, + 0xb1a0, 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0xb1a5, 0xb1a6, 0xb1a7, + 0xb1a8, 0xb1a9, 0xb1aa, 0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, + 0xb1b0, 0xb1b1, 0xb1b2, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, + 0xb1b8, 0xb1b9, 0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0xb1bf, + 0xb1c0, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4, 0xb1c5, 0xb1c6, 0xb1c7, + 0xb1c8, 0xb1c9, 0xb1ca, 0xb1cb, 0xb1cc, 0xb1cd, 0xb1ce, 0xb1cf, + 0xb1d0, 0xb1d1, 0xb1d2, 0xb1d3, 0xb1d4, 0xb1d5, 0xb1d6, 0xb1d7, + 0xb1d8, 0xb1d9, 0xb1da, 0xb1db, 0xb1dc, 0xb1dd, 0xb1de, 0xb1df, + 0xb1e0, 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, + 0xb1e8, 0xb1e9, 0xb1ea, 0xb1eb, 0xb1ec, 0xb1ed, 0xb1ee, 0xb1ef, + 0xb1f0, 0xb1f1, 0xb1f2, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, + 0xb1f8, 0xb1f9, 0xb1fa, 0xb1fb, 0xb1fc, 0xb1fd, 0xb1fe, 0xb1ff, + 0xb200, 0xb201, 0xb202, 0xb203, 0xb204, 0xb205, 0xb206, 0xb207, + 0xb208, 0xb209, 0xb20a, 0xb20b, 0xb20c, 0xb20d, 0xb20e, 0xb20f, + 0xb210, 0xb211, 0xb212, 0xb213, 0xb214, 0xb215, 0xb216, 0xb217, + 0xb218, 0xb219, 0xb21a, 0xb21b, 0xb21c, 0xb21d, 0xb21e, 0xb21f, + 0xb220, 0xb221, 0xb222, 0xb223, 0xb224, 0xb225, 0xb226, 0xb227, + 0xb228, 0xb229, 0xb22a, 0xb22b, 0xb22c, 0xb22d, 0xb22e, 0xb22f, + 0xb230, 0xb231, 0xb232, 0xb233, 0xb234, 0xb235, 0xb236, 0xb237, + 0xb238, 0xb239, 0xb23a, 0xb23b, 0xb23c, 0xb23d, 0xb23e, 0xb23f, + 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, + 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, + 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, + 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, + 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, + 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, + 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, + 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb27f, + 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, + 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, + 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, + 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, + 0xb2a0, 0xb2a1, 0xb2a2, 0xb2a3, 0xb2a4, 0xb2a5, 0xb2a6, 0xb2a7, + 0xb2a8, 0xb2a9, 0xb2aa, 0xb2ab, 0xb2ac, 0xb2ad, 0xb2ae, 0xb2af, + 0xb2b0, 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, + 0xb2b8, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bd, 0xb2be, 0xb2bf, + 0xb2c0, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, + 0xb2c8, 0xb2c9, 0xb2ca, 0xb2cb, 0xb2cc, 0xb2cd, 0xb2ce, 0xb2cf, + 0xb2d0, 0xb2d1, 0xb2d2, 0xb2d3, 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, + 0xb2d8, 0xb2d9, 0xb2da, 0xb2db, 0xb2dc, 0xb2dd, 0xb2de, 0xb2df, + 0xb2e0, 0xb2e1, 0xb2e2, 0xb2e3, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e7, + 0xb2e8, 0xb2e9, 0xb2ea, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, + 0xb2f0, 0xb2f1, 0xb2f2, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f6, 0xb2f7, + 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fb, 0xb2fc, 0xb2fd, 0xb2fe, 0xb2ff, + 0xb300, 0xb301, 0xb302, 0xb303, 0xb304, 0xb305, 0xb306, 0xb307, + 0xb308, 0xb309, 0xb30a, 0xb30b, 0xb30c, 0xb30d, 0xb30e, 0xb30f, + 0xb310, 0xb311, 0xb312, 0xb313, 0xb314, 0xb315, 0xb316, 0xb317, + 0xb318, 0xb319, 0xb31a, 0xb31b, 0xb31c, 0xb31d, 0xb31e, 0xb31f, + 0xb320, 0xb321, 0xb322, 0xb323, 0xb324, 0xb325, 0xb326, 0xb327, + 0xb328, 0xb329, 0xb32a, 0xb32b, 0xb32c, 0xb32d, 0xb32e, 0xb32f, + 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, + 0xb338, 0xb339, 0xb33a, 0xb33b, 0xb33c, 0xb33d, 0xb33e, 0xb33f, + 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, + 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, + 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, + 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, + 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, + 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, + 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, + 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb37f, + 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, + 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, + 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, + 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, + 0xb3a0, 0xb3a1, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a6, 0xb3a7, + 0xb3a8, 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ac, 0xb3ad, 0xb3ae, 0xb3af, + 0xb3b0, 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, + 0xb3b8, 0xb3b9, 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb3be, 0xb3bf, + 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c3, 0xb3c4, 0xb3c5, 0xb3c6, 0xb3c7, + 0xb3c8, 0xb3c9, 0xb3ca, 0xb3cb, 0xb3cc, 0xb3cd, 0xb3ce, 0xb3cf, + 0xb3d0, 0xb3d1, 0xb3d2, 0xb3d3, 0xb3d4, 0xb3d5, 0xb3d6, 0xb3d7, + 0xb3d8, 0xb3d9, 0xb3da, 0xb3db, 0xb3dc, 0xb3dd, 0xb3de, 0xb3df, + 0xb3e0, 0xb3e1, 0xb3e2, 0xb3e3, 0xb3e4, 0xb3e5, 0xb3e6, 0xb3e7, + 0xb3e8, 0xb3e9, 0xb3ea, 0xb3eb, 0xb3ec, 0xb3ed, 0xb3ee, 0xb3ef, + 0xb3f0, 0xb3f1, 0xb3f2, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, + 0xb3f8, 0xb3f9, 0xb3fa, 0xb3fb, 0xb3fc, 0xb3fd, 0xb3fe, 0xb3ff, + 0xb400, 0xb401, 0xb402, 0xb403, 0xb404, 0xb405, 0xb406, 0xb407, + 0xb408, 0xb409, 0xb40a, 0xb40b, 0xb40c, 0xb40d, 0xb40e, 0xb40f, + 0xb410, 0xb411, 0xb412, 0xb413, 0xb414, 0xb415, 0xb416, 0xb417, + 0xb418, 0xb419, 0xb41a, 0xb41b, 0xb41c, 0xb41d, 0xb41e, 0xb41f, + 0xb420, 0xb421, 0xb422, 0xb423, 0xb424, 0xb425, 0xb426, 0xb427, + 0xb428, 0xb429, 0xb42a, 0xb42b, 0xb42c, 0xb42d, 0xb42e, 0xb42f, + 0xb430, 0xb431, 0xb432, 0xb433, 0xb434, 0xb435, 0xb436, 0xb437, + 0xb438, 0xb439, 0xb43a, 0xb43b, 0xb43c, 0xb43d, 0xb43e, 0xb43f, + 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, + 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, + 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, + 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, + 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, + 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, + 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, + 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb47f, + 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, + 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, + 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, + 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, + 0xb4a0, 0xb4a1, 0xb4a2, 0xb4a3, 0xb4a4, 0xb4a5, 0xb4a6, 0xb4a7, + 0xb4a8, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ac, 0xb4ad, 0xb4ae, 0xb4af, + 0xb4b0, 0xb4b1, 0xb4b2, 0xb4b3, 0xb4b4, 0xb4b5, 0xb4b6, 0xb4b7, + 0xb4b8, 0xb4b9, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd, 0xb4be, 0xb4bf, + 0xb4c0, 0xb4c1, 0xb4c2, 0xb4c3, 0xb4c4, 0xb4c5, 0xb4c6, 0xb4c7, + 0xb4c8, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, + 0xb4d0, 0xb4d1, 0xb4d2, 0xb4d3, 0xb4d4, 0xb4d5, 0xb4d6, 0xb4d7, + 0xb4d8, 0xb4d9, 0xb4da, 0xb4db, 0xb4dc, 0xb4dd, 0xb4de, 0xb4df, + 0xb4e0, 0xb4e1, 0xb4e2, 0xb4e3, 0xb4e4, 0xb4e5, 0xb4e6, 0xb4e7, + 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb, 0xb4ec, 0xb4ed, 0xb4ee, 0xb4ef, + 0xb4f0, 0xb4f1, 0xb4f2, 0xb4f3, 0xb4f4, 0xb4f5, 0xb4f6, 0xb4f7, + 0xb4f8, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd, 0xb4fe, 0xb4ff, + 0xb500, 0xb501, 0xb502, 0xb503, 0xb504, 0xb505, 0xb506, 0xb507, + 0xb508, 0xb509, 0xb50a, 0xb50b, 0xb50c, 0xb50d, 0xb50e, 0xb50f, + 0xb510, 0xb511, 0xb512, 0xb513, 0xb514, 0xb515, 0xb516, 0xb517, + 0xb518, 0xb519, 0xb51a, 0xb51b, 0xb51c, 0xb51d, 0xb51e, 0xb51f, + 0xb520, 0xb521, 0xb522, 0xb523, 0xb524, 0xb525, 0xb526, 0xb527, + 0xb528, 0xb529, 0xb52a, 0xb52b, 0xb52c, 0xb52d, 0xb52e, 0xb52f, + 0xb530, 0xb531, 0xb532, 0xb533, 0xb534, 0xb535, 0xb536, 0xb537, + 0xb538, 0xb539, 0xb53a, 0xb53b, 0xb53c, 0xb53d, 0xb53e, 0xb53f, + 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, + 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, + 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, + 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, + 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, + 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, + 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, + 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb57f, + 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, + 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, + 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, + 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, + 0xb5a0, 0xb5a1, 0xb5a2, 0xb5a3, 0xb5a4, 0xb5a5, 0xb5a6, 0xb5a7, + 0xb5a8, 0xb5a9, 0xb5aa, 0xb5ab, 0xb5ac, 0xb5ad, 0xb5ae, 0xb5af, + 0xb5b0, 0xb5b1, 0xb5b2, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5b6, 0xb5b7, + 0xb5b8, 0xb5b9, 0xb5ba, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5be, 0xb5bf, + 0xb5c0, 0xb5c1, 0xb5c2, 0xb5c3, 0xb5c4, 0xb5c5, 0xb5c6, 0xb5c7, + 0xb5c8, 0xb5c9, 0xb5ca, 0xb5cb, 0xb5cc, 0xb5cd, 0xb5ce, 0xb5cf, + 0xb5d0, 0xb5d1, 0xb5d2, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7, + 0xb5d8, 0xb5d9, 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5de, 0xb5df, + 0xb5e0, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4, 0xb5e5, 0xb5e6, 0xb5e7, + 0xb5e8, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ec, 0xb5ed, 0xb5ee, 0xb5ef, + 0xb5f0, 0xb5f1, 0xb5f2, 0xb5f3, 0xb5f4, 0xb5f5, 0xb5f6, 0xb5f7, + 0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd, 0xb5fe, 0xb5ff, + 0xb600, 0xb601, 0xb602, 0xb603, 0xb604, 0xb605, 0xb606, 0xb607, + 0xb608, 0xb609, 0xb60a, 0xb60b, 0xb60c, 0xb60d, 0xb60e, 0xb60f, + 0xb610, 0xb611, 0xb612, 0xb613, 0xb614, 0xb615, 0xb616, 0xb617, + 0xb618, 0xb619, 0xb61a, 0xb61b, 0xb61c, 0xb61d, 0xb61e, 0xb61f, + 0xb620, 0xb621, 0xb622, 0xb623, 0xb624, 0xb625, 0xb626, 0xb627, + 0xb628, 0xb629, 0xb62a, 0xb62b, 0xb62c, 0xb62d, 0xb62e, 0xb62f, + 0xb630, 0xb631, 0xb632, 0xb633, 0xb634, 0xb635, 0xb636, 0xb637, + 0xb638, 0xb639, 0xb63a, 0xb63b, 0xb63c, 0xb63d, 0xb63e, 0xb63f, + 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, + 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, + 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, + 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, + 0xb660, 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, + 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, + 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, + 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb67f, + 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, + 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, + 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, + 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, + 0xb6a0, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a4, 0xb6a5, 0xb6a6, 0xb6a7, + 0xb6a8, 0xb6a9, 0xb6aa, 0xb6ab, 0xb6ac, 0xb6ad, 0xb6ae, 0xb6af, + 0xb6b0, 0xb6b1, 0xb6b2, 0xb6b3, 0xb6b4, 0xb6b5, 0xb6b6, 0xb6b7, + 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bd, 0xb6be, 0xb6bf, + 0xb6c0, 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, + 0xb6c8, 0xb6c9, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, + 0xb6d0, 0xb6d1, 0xb6d2, 0xb6d3, 0xb6d4, 0xb6d5, 0xb6d6, 0xb6d7, + 0xb6d8, 0xb6d9, 0xb6da, 0xb6db, 0xb6dc, 0xb6dd, 0xb6de, 0xb6df, + 0xb6e0, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4, 0xb6e5, 0xb6e6, 0xb6e7, + 0xb6e8, 0xb6e9, 0xb6ea, 0xb6eb, 0xb6ec, 0xb6ed, 0xb6ee, 0xb6ef, + 0xb6f0, 0xb6f1, 0xb6f2, 0xb6f3, 0xb6f4, 0xb6f5, 0xb6f6, 0xb6f7, + 0xb6f8, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fd, 0xb6fe, 0xb6ff, + 0xb700, 0xb701, 0xb702, 0xb703, 0xb704, 0xb705, 0xb706, 0xb707, + 0xb708, 0xb709, 0xb70a, 0xb70b, 0xb70c, 0xb70d, 0xb70e, 0xb70f, + 0xb710, 0xb711, 0xb712, 0xb713, 0xb714, 0xb715, 0xb716, 0xb717, + 0xb718, 0xb719, 0xb71a, 0xb71b, 0xb71c, 0xb71d, 0xb71e, 0xb71f, + 0xb720, 0xb721, 0xb722, 0xb723, 0xb724, 0xb725, 0xb726, 0xb727, + 0xb728, 0xb729, 0xb72a, 0xb72b, 0xb72c, 0xb72d, 0xb72e, 0xb72f, + 0xb730, 0xb731, 0xb732, 0xb733, 0xb734, 0xb735, 0xb736, 0xb737, + 0xb738, 0xb739, 0xb73a, 0xb73b, 0xb73c, 0xb73d, 0xb73e, 0xb73f, + 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, + 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, + 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, + 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, + 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, + 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, + 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, + 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb77f, + 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, + 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, + 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, + 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, + 0xb7a0, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4, 0xb7a5, 0xb7a6, 0xb7a7, + 0xb7a8, 0xb7a9, 0xb7aa, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7ae, 0xb7af, + 0xb7b0, 0xb7b1, 0xb7b2, 0xb7b3, 0xb7b4, 0xb7b5, 0xb7b6, 0xb7b7, + 0xb7b8, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd, 0xb7be, 0xb7bf, + 0xb7c0, 0xb7c1, 0xb7c2, 0xb7c3, 0xb7c4, 0xb7c5, 0xb7c6, 0xb7c7, + 0xb7c8, 0xb7c9, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cd, 0xb7ce, 0xb7cf, + 0xb7d0, 0xb7d1, 0xb7d2, 0xb7d3, 0xb7d4, 0xb7d5, 0xb7d6, 0xb7d7, + 0xb7d8, 0xb7d9, 0xb7da, 0xb7db, 0xb7dc, 0xb7dd, 0xb7de, 0xb7df, + 0xb7e0, 0xb7e1, 0xb7e2, 0xb7e3, 0xb7e4, 0xb7e5, 0xb7e6, 0xb7e7, + 0xb7e8, 0xb7e9, 0xb7ea, 0xb7eb, 0xb7ec, 0xb7ed, 0xb7ee, 0xb7ef, + 0xb7f0, 0xb7f1, 0xb7f2, 0xb7f3, 0xb7f4, 0xb7f5, 0xb7f6, 0xb7f7, + 0xb7f8, 0xb7f9, 0xb7fa, 0xb7fb, 0xb7fc, 0xb7fd, 0xb7fe, 0xb7ff, + 0xb800, 0xb801, 0xb802, 0xb803, 0xb804, 0xb805, 0xb806, 0xb807, + 0xb808, 0xb809, 0xb80a, 0xb80b, 0xb80c, 0xb80d, 0xb80e, 0xb80f, + 0xb810, 0xb811, 0xb812, 0xb813, 0xb814, 0xb815, 0xb816, 0xb817, + 0xb818, 0xb819, 0xb81a, 0xb81b, 0xb81c, 0xb81d, 0xb81e, 0xb81f, + 0xb820, 0xb821, 0xb822, 0xb823, 0xb824, 0xb825, 0xb826, 0xb827, + 0xb828, 0xb829, 0xb82a, 0xb82b, 0xb82c, 0xb82d, 0xb82e, 0xb82f, + 0xb830, 0xb831, 0xb832, 0xb833, 0xb834, 0xb835, 0xb836, 0xb837, + 0xb838, 0xb839, 0xb83a, 0xb83b, 0xb83c, 0xb83d, 0xb83e, 0xb83f, + 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, + 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, + 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, + 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, + 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, + 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, + 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, + 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb87f, + 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, + 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, + 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, + 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, + 0xb8a0, 0xb8a1, 0xb8a2, 0xb8a3, 0xb8a4, 0xb8a5, 0xb8a6, 0xb8a7, + 0xb8a8, 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, + 0xb8b0, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb8b7, + 0xb8b8, 0xb8b9, 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8be, 0xb8bf, + 0xb8c0, 0xb8c1, 0xb8c2, 0xb8c3, 0xb8c4, 0xb8c5, 0xb8c6, 0xb8c7, + 0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0xb8cc, 0xb8cd, 0xb8ce, 0xb8cf, + 0xb8d0, 0xb8d1, 0xb8d2, 0xb8d3, 0xb8d4, 0xb8d5, 0xb8d6, 0xb8d7, + 0xb8d8, 0xb8d9, 0xb8da, 0xb8db, 0xb8dc, 0xb8dd, 0xb8de, 0xb8df, + 0xb8e0, 0xb8e1, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, + 0xb8e8, 0xb8e9, 0xb8ea, 0xb8eb, 0xb8ec, 0xb8ed, 0xb8ee, 0xb8ef, + 0xb8f0, 0xb8f1, 0xb8f2, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, + 0xb8f8, 0xb8f9, 0xb8fa, 0xb8fb, 0xb8fc, 0xb8fd, 0xb8fe, 0xb8ff, + 0xb900, 0xb901, 0xb902, 0xb903, 0xb904, 0xb905, 0xb906, 0xb907, + 0xb908, 0xb909, 0xb90a, 0xb90b, 0xb90c, 0xb90d, 0xb90e, 0xb90f, + 0xb910, 0xb911, 0xb912, 0xb913, 0xb914, 0xb915, 0xb916, 0xb917, + 0xb918, 0xb919, 0xb91a, 0xb91b, 0xb91c, 0xb91d, 0xb91e, 0xb91f, + 0xb920, 0xb921, 0xb922, 0xb923, 0xb924, 0xb925, 0xb926, 0xb927, + 0xb928, 0xb929, 0xb92a, 0xb92b, 0xb92c, 0xb92d, 0xb92e, 0xb92f, + 0xb930, 0xb931, 0xb932, 0xb933, 0xb934, 0xb935, 0xb936, 0xb937, + 0xb938, 0xb939, 0xb93a, 0xb93b, 0xb93c, 0xb93d, 0xb93e, 0xb93f, + 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, + 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, + 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, + 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, + 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, + 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, + 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, + 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb97f, + 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, + 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, + 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, + 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, + 0xb9a0, 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6, 0xb9a7, + 0xb9a8, 0xb9a9, 0xb9aa, 0xb9ab, 0xb9ac, 0xb9ad, 0xb9ae, 0xb9af, + 0xb9b0, 0xb9b1, 0xb9b2, 0xb9b3, 0xb9b4, 0xb9b5, 0xb9b6, 0xb9b7, + 0xb9b8, 0xb9b9, 0xb9ba, 0xb9bb, 0xb9bc, 0xb9bd, 0xb9be, 0xb9bf, + 0xb9c0, 0xb9c1, 0xb9c2, 0xb9c3, 0xb9c4, 0xb9c5, 0xb9c6, 0xb9c7, + 0xb9c8, 0xb9c9, 0xb9ca, 0xb9cb, 0xb9cc, 0xb9cd, 0xb9ce, 0xb9cf, + 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d3, 0xb9d4, 0xb9d5, 0xb9d6, 0xb9d7, + 0xb9d8, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc, 0xb9dd, 0xb9de, 0xb9df, + 0xb9e0, 0xb9e1, 0xb9e2, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e6, 0xb9e7, + 0xb9e8, 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ec, 0xb9ed, 0xb9ee, 0xb9ef, + 0xb9f0, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f4, 0xb9f5, 0xb9f6, 0xb9f7, + 0xb9f8, 0xb9f9, 0xb9fa, 0xb9fb, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9ff, + 0xba00, 0xba01, 0xba02, 0xba03, 0xba04, 0xba05, 0xba06, 0xba07, + 0xba08, 0xba09, 0xba0a, 0xba0b, 0xba0c, 0xba0d, 0xba0e, 0xba0f, + 0xba10, 0xba11, 0xba12, 0xba13, 0xba14, 0xba15, 0xba16, 0xba17, + 0xba18, 0xba19, 0xba1a, 0xba1b, 0xba1c, 0xba1d, 0xba1e, 0xba1f, + 0xba20, 0xba21, 0xba22, 0xba23, 0xba24, 0xba25, 0xba26, 0xba27, + 0xba28, 0xba29, 0xba2a, 0xba2b, 0xba2c, 0xba2d, 0xba2e, 0xba2f, + 0xba30, 0xba31, 0xba32, 0xba33, 0xba34, 0xba35, 0xba36, 0xba37, + 0xba38, 0xba39, 0xba3a, 0xba3b, 0xba3c, 0xba3d, 0xba3e, 0xba3f, + 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, + 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, + 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, + 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, + 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, + 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, + 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, + 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba7f, + 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, + 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, + 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, + 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, + 0xbaa0, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, + 0xbaa8, 0xbaa9, 0xbaaa, 0xbaab, 0xbaac, 0xbaad, 0xbaae, 0xbaaf, + 0xbab0, 0xbab1, 0xbab2, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, + 0xbab8, 0xbab9, 0xbaba, 0xbabb, 0xbabc, 0xbabd, 0xbabe, 0xbabf, + 0xbac0, 0xbac1, 0xbac2, 0xbac3, 0xbac4, 0xbac5, 0xbac6, 0xbac7, + 0xbac8, 0xbac9, 0xbaca, 0xbacb, 0xbacc, 0xbacd, 0xbace, 0xbacf, + 0xbad0, 0xbad1, 0xbad2, 0xbad3, 0xbad4, 0xbad5, 0xbad6, 0xbad7, + 0xbad8, 0xbad9, 0xbada, 0xbadb, 0xbadc, 0xbadd, 0xbade, 0xbadf, + 0xbae0, 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6, 0xbae7, + 0xbae8, 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, + 0xbaf0, 0xbaf1, 0xbaf2, 0xbaf3, 0xbaf4, 0xbaf5, 0xbaf6, 0xbaf7, + 0xbaf8, 0xbaf9, 0xbafa, 0xbafb, 0xbafc, 0xbafd, 0xbafe, 0xbaff, + 0xbb00, 0xbb01, 0xbb02, 0xbb03, 0xbb04, 0xbb05, 0xbb06, 0xbb07, + 0xbb08, 0xbb09, 0xbb0a, 0xbb0b, 0xbb0c, 0xbb0d, 0xbb0e, 0xbb0f, + 0xbb10, 0xbb11, 0xbb12, 0xbb13, 0xbb14, 0xbb15, 0xbb16, 0xbb17, + 0xbb18, 0xbb19, 0xbb1a, 0xbb1b, 0xbb1c, 0xbb1d, 0xbb1e, 0xbb1f, + 0xbb20, 0xbb21, 0xbb22, 0xbb23, 0xbb24, 0xbb25, 0xbb26, 0xbb27, + 0xbb28, 0xbb29, 0xbb2a, 0xbb2b, 0xbb2c, 0xbb2d, 0xbb2e, 0xbb2f, + 0xbb30, 0xbb31, 0xbb32, 0xbb33, 0xbb34, 0xbb35, 0xbb36, 0xbb37, + 0xbb38, 0xbb39, 0xbb3a, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e, 0xbb3f, + 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, + 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, + 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, + 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, + 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, + 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, + 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, + 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb7f, + 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, + 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, + 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, + 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, + 0xbba0, 0xbba1, 0xbba2, 0xbba3, 0xbba4, 0xbba5, 0xbba6, 0xbba7, + 0xbba8, 0xbba9, 0xbbaa, 0xbbab, 0xbbac, 0xbbad, 0xbbae, 0xbbaf, + 0xbbb0, 0xbbb1, 0xbbb2, 0xbbb3, 0xbbb4, 0xbbb5, 0xbbb6, 0xbbb7, + 0xbbb8, 0xbbb9, 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbbbe, 0xbbbf, + 0xbbc0, 0xbbc1, 0xbbc2, 0xbbc3, 0xbbc4, 0xbbc5, 0xbbc6, 0xbbc7, + 0xbbc8, 0xbbc9, 0xbbca, 0xbbcb, 0xbbcc, 0xbbcd, 0xbbce, 0xbbcf, + 0xbbd0, 0xbbd1, 0xbbd2, 0xbbd3, 0xbbd4, 0xbbd5, 0xbbd6, 0xbbd7, + 0xbbd8, 0xbbd9, 0xbbda, 0xbbdb, 0xbbdc, 0xbbdd, 0xbbde, 0xbbdf, + 0xbbe0, 0xbbe1, 0xbbe2, 0xbbe3, 0xbbe4, 0xbbe5, 0xbbe6, 0xbbe7, + 0xbbe8, 0xbbe9, 0xbbea, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0xbbef, + 0xbbf0, 0xbbf1, 0xbbf2, 0xbbf3, 0xbbf4, 0xbbf5, 0xbbf6, 0xbbf7, + 0xbbf8, 0xbbf9, 0xbbfa, 0xbbfb, 0xbbfc, 0xbbfd, 0xbbfe, 0xbbff, + 0xbc00, 0xbc01, 0xbc02, 0xbc03, 0xbc04, 0xbc05, 0xbc06, 0xbc07, + 0xbc08, 0xbc09, 0xbc0a, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0e, 0xbc0f, + 0xbc10, 0xbc11, 0xbc12, 0xbc13, 0xbc14, 0xbc15, 0xbc16, 0xbc17, + 0xbc18, 0xbc19, 0xbc1a, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f, + 0xbc20, 0xbc21, 0xbc22, 0xbc23, 0xbc24, 0xbc25, 0xbc26, 0xbc27, + 0xbc28, 0xbc29, 0xbc2a, 0xbc2b, 0xbc2c, 0xbc2d, 0xbc2e, 0xbc2f, + 0xbc30, 0xbc31, 0xbc32, 0xbc33, 0xbc34, 0xbc35, 0xbc36, 0xbc37, + 0xbc38, 0xbc39, 0xbc3a, 0xbc3b, 0xbc3c, 0xbc3d, 0xbc3e, 0xbc3f, + 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, + 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, + 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, + 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, + 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, + 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, + 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, + 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc7f, + 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, + 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, + 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, + 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, + 0xbca0, 0xbca1, 0xbca2, 0xbca3, 0xbca4, 0xbca5, 0xbca6, 0xbca7, + 0xbca8, 0xbca9, 0xbcaa, 0xbcab, 0xbcac, 0xbcad, 0xbcae, 0xbcaf, + 0xbcb0, 0xbcb1, 0xbcb2, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcb6, 0xbcb7, + 0xbcb8, 0xbcb9, 0xbcba, 0xbcbb, 0xbcbc, 0xbcbd, 0xbcbe, 0xbcbf, + 0xbcc0, 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc4, 0xbcc5, 0xbcc6, 0xbcc7, + 0xbcc8, 0xbcc9, 0xbcca, 0xbccb, 0xbccc, 0xbccd, 0xbcce, 0xbccf, + 0xbcd0, 0xbcd1, 0xbcd2, 0xbcd3, 0xbcd4, 0xbcd5, 0xbcd6, 0xbcd7, + 0xbcd8, 0xbcd9, 0xbcda, 0xbcdb, 0xbcdc, 0xbcdd, 0xbcde, 0xbcdf, + 0xbce0, 0xbce1, 0xbce2, 0xbce3, 0xbce4, 0xbce5, 0xbce6, 0xbce7, + 0xbce8, 0xbce9, 0xbcea, 0xbceb, 0xbcec, 0xbced, 0xbcee, 0xbcef, + 0xbcf0, 0xbcf1, 0xbcf2, 0xbcf3, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf7, + 0xbcf8, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfc, 0xbcfd, 0xbcfe, 0xbcff, + 0xbd00, 0xbd01, 0xbd02, 0xbd03, 0xbd04, 0xbd05, 0xbd06, 0xbd07, + 0xbd08, 0xbd09, 0xbd0a, 0xbd0b, 0xbd0c, 0xbd0d, 0xbd0e, 0xbd0f, + 0xbd10, 0xbd11, 0xbd12, 0xbd13, 0xbd14, 0xbd15, 0xbd16, 0xbd17, + 0xbd18, 0xbd19, 0xbd1a, 0xbd1b, 0xbd1c, 0xbd1d, 0xbd1e, 0xbd1f, + 0xbd20, 0xbd21, 0xbd22, 0xbd23, 0xbd24, 0xbd25, 0xbd26, 0xbd27, + 0xbd28, 0xbd29, 0xbd2a, 0xbd2b, 0xbd2c, 0xbd2d, 0xbd2e, 0xbd2f, + 0xbd30, 0xbd31, 0xbd32, 0xbd33, 0xbd34, 0xbd35, 0xbd36, 0xbd37, + 0xbd38, 0xbd39, 0xbd3a, 0xbd3b, 0xbd3c, 0xbd3d, 0xbd3e, 0xbd3f, + 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, + 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, + 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, + 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, + 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, + 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, + 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, + 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd7f, + 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, + 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, + 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, + 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, + 0xbda0, 0xbda1, 0xbda2, 0xbda3, 0xbda4, 0xbda5, 0xbda6, 0xbda7, + 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac, 0xbdad, 0xbdae, 0xbdaf, + 0xbdb0, 0xbdb1, 0xbdb2, 0xbdb3, 0xbdb4, 0xbdb5, 0xbdb6, 0xbdb7, + 0xbdb8, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd, 0xbdbe, 0xbdbf, + 0xbdc0, 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, + 0xbdc8, 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc, 0xbdcd, 0xbdce, 0xbdcf, + 0xbdd0, 0xbdd1, 0xbdd2, 0xbdd3, 0xbdd4, 0xbdd5, 0xbdd6, 0xbdd7, + 0xbdd8, 0xbdd9, 0xbdda, 0xbddb, 0xbddc, 0xbddd, 0xbdde, 0xbddf, + 0xbde0, 0xbde1, 0xbde2, 0xbde3, 0xbde4, 0xbde5, 0xbde6, 0xbde7, + 0xbde8, 0xbde9, 0xbdea, 0xbdeb, 0xbdec, 0xbded, 0xbdee, 0xbdef, + 0xbdf0, 0xbdf1, 0xbdf2, 0xbdf3, 0xbdf4, 0xbdf5, 0xbdf6, 0xbdf7, + 0xbdf8, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd, 0xbdfe, 0xbdff, + 0xbe00, 0xbe01, 0xbe02, 0xbe03, 0xbe04, 0xbe05, 0xbe06, 0xbe07, + 0xbe08, 0xbe09, 0xbe0a, 0xbe0b, 0xbe0c, 0xbe0d, 0xbe0e, 0xbe0f, + 0xbe10, 0xbe11, 0xbe12, 0xbe13, 0xbe14, 0xbe15, 0xbe16, 0xbe17, + 0xbe18, 0xbe19, 0xbe1a, 0xbe1b, 0xbe1c, 0xbe1d, 0xbe1e, 0xbe1f, + 0xbe20, 0xbe21, 0xbe22, 0xbe23, 0xbe24, 0xbe25, 0xbe26, 0xbe27, + 0xbe28, 0xbe29, 0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xbe2e, 0xbe2f, + 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0xbe34, 0xbe35, 0xbe36, 0xbe37, + 0xbe38, 0xbe39, 0xbe3a, 0xbe3b, 0xbe3c, 0xbe3d, 0xbe3e, 0xbe3f, + 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, + 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, + 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, + 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, + 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, + 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, + 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, + 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe7f, + 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, + 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, + 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, + 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, + 0xbea0, 0xbea1, 0xbea2, 0xbea3, 0xbea4, 0xbea5, 0xbea6, 0xbea7, + 0xbea8, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeae, 0xbeaf, + 0xbeb0, 0xbeb1, 0xbeb2, 0xbeb3, 0xbeb4, 0xbeb5, 0xbeb6, 0xbeb7, + 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd, 0xbebe, 0xbebf, + 0xbec0, 0xbec1, 0xbec2, 0xbec3, 0xbec4, 0xbec5, 0xbec6, 0xbec7, + 0xbec8, 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, + 0xbed0, 0xbed1, 0xbed2, 0xbed3, 0xbed4, 0xbed5, 0xbed6, 0xbed7, + 0xbed8, 0xbed9, 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbede, 0xbedf, + 0xbee0, 0xbee1, 0xbee2, 0xbee3, 0xbee4, 0xbee5, 0xbee6, 0xbee7, + 0xbee8, 0xbee9, 0xbeea, 0xbeeb, 0xbeec, 0xbeed, 0xbeee, 0xbeef, + 0xbef0, 0xbef1, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0xbef6, 0xbef7, + 0xbef8, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0xbefd, 0xbefe, 0xbeff, + 0xbf00, 0xbf01, 0xbf02, 0xbf03, 0xbf04, 0xbf05, 0xbf06, 0xbf07, + 0xbf08, 0xbf09, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, + 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xbf16, 0xbf17, + 0xbf18, 0xbf19, 0xbf1a, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf1f, + 0xbf20, 0xbf21, 0xbf22, 0xbf23, 0xbf24, 0xbf25, 0xbf26, 0xbf27, + 0xbf28, 0xbf29, 0xbf2a, 0xbf2b, 0xbf2c, 0xbf2d, 0xbf2e, 0xbf2f, + 0xbf30, 0xbf31, 0xbf32, 0xbf33, 0xbf34, 0xbf35, 0xbf36, 0xbf37, + 0xbf38, 0xbf39, 0xbf3a, 0xbf3b, 0xbf3c, 0xbf3d, 0xbf3e, 0xbf3f, + 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, + 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, + 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, + 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, + 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, + 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, + 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, + 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf7f, + 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, + 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, + 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, + 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, + 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0xbfa5, 0xbfa6, 0xbfa7, + 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac, 0xbfad, 0xbfae, 0xbfaf, + 0xbfb0, 0xbfb1, 0xbfb2, 0xbfb3, 0xbfb4, 0xbfb5, 0xbfb6, 0xbfb7, + 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd, 0xbfbe, 0xbfbf, + 0xbfc0, 0xbfc1, 0xbfc2, 0xbfc3, 0xbfc4, 0xbfc5, 0xbfc6, 0xbfc7, + 0xbfc8, 0xbfc9, 0xbfca, 0xbfcb, 0xbfcc, 0xbfcd, 0xbfce, 0xbfcf, + 0xbfd0, 0xbfd1, 0xbfd2, 0xbfd3, 0xbfd4, 0xbfd5, 0xbfd6, 0xbfd7, + 0xbfd8, 0xbfd9, 0xbfda, 0xbfdb, 0xbfdc, 0xbfdd, 0xbfde, 0xbfdf, + 0xbfe0, 0xbfe1, 0xbfe2, 0xbfe3, 0xbfe4, 0xbfe5, 0xbfe6, 0xbfe7, + 0xbfe8, 0xbfe9, 0xbfea, 0xbfeb, 0xbfec, 0xbfed, 0xbfee, 0xbfef, + 0xbff0, 0xbff1, 0xbff2, 0xbff3, 0xbff4, 0xbff5, 0xbff6, 0xbff7, + 0xbff8, 0xbff9, 0xbffa, 0xbffb, 0xbffc, 0xbffd, 0xbffe, 0xbfff, + 0xc000, 0xc001, 0xc002, 0xc003, 0xc004, 0xc005, 0xc006, 0xc007, + 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e, 0xc00f, + 0xc010, 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, + 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, + 0xc020, 0xc021, 0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, + 0xc028, 0xc029, 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, + 0xc030, 0xc031, 0xc032, 0xc033, 0xc034, 0xc035, 0xc036, 0xc037, + 0xc038, 0xc039, 0xc03a, 0xc03b, 0xc03c, 0xc03d, 0xc03e, 0xc03f, + 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, + 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, + 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, + 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, + 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, + 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, + 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, + 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc07f, + 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, + 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, + 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, + 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, + 0xc0a0, 0xc0a1, 0xc0a2, 0xc0a3, 0xc0a4, 0xc0a5, 0xc0a6, 0xc0a7, + 0xc0a8, 0xc0a9, 0xc0aa, 0xc0ab, 0xc0ac, 0xc0ad, 0xc0ae, 0xc0af, + 0xc0b0, 0xc0b1, 0xc0b2, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0b7, + 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0bc, 0xc0bd, 0xc0be, 0xc0bf, + 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c5, 0xc0c6, 0xc0c7, + 0xc0c8, 0xc0c9, 0xc0ca, 0xc0cb, 0xc0cc, 0xc0cd, 0xc0ce, 0xc0cf, + 0xc0d0, 0xc0d1, 0xc0d2, 0xc0d3, 0xc0d4, 0xc0d5, 0xc0d6, 0xc0d7, + 0xc0d8, 0xc0d9, 0xc0da, 0xc0db, 0xc0dc, 0xc0dd, 0xc0de, 0xc0df, + 0xc0e0, 0xc0e1, 0xc0e2, 0xc0e3, 0xc0e4, 0xc0e5, 0xc0e6, 0xc0e7, + 0xc0e8, 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ec, 0xc0ed, 0xc0ee, 0xc0ef, + 0xc0f0, 0xc0f1, 0xc0f2, 0xc0f3, 0xc0f4, 0xc0f5, 0xc0f6, 0xc0f7, + 0xc0f8, 0xc0f9, 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc0fe, 0xc0ff, + 0xc100, 0xc101, 0xc102, 0xc103, 0xc104, 0xc105, 0xc106, 0xc107, + 0xc108, 0xc109, 0xc10a, 0xc10b, 0xc10c, 0xc10d, 0xc10e, 0xc10f, + 0xc110, 0xc111, 0xc112, 0xc113, 0xc114, 0xc115, 0xc116, 0xc117, + 0xc118, 0xc119, 0xc11a, 0xc11b, 0xc11c, 0xc11d, 0xc11e, 0xc11f, + 0xc120, 0xc121, 0xc122, 0xc123, 0xc124, 0xc125, 0xc126, 0xc127, + 0xc128, 0xc129, 0xc12a, 0xc12b, 0xc12c, 0xc12d, 0xc12e, 0xc12f, + 0xc130, 0xc131, 0xc132, 0xc133, 0xc134, 0xc135, 0xc136, 0xc137, + 0xc138, 0xc139, 0xc13a, 0xc13b, 0xc13c, 0xc13d, 0xc13e, 0xc13f, + 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, + 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, + 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, + 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, + 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, + 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, + 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, + 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc17f, + 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, + 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, + 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, + 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, + 0xc1a0, 0xc1a1, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a5, 0xc1a6, 0xc1a7, + 0xc1a8, 0xc1a9, 0xc1aa, 0xc1ab, 0xc1ac, 0xc1ad, 0xc1ae, 0xc1af, + 0xc1b0, 0xc1b1, 0xc1b2, 0xc1b3, 0xc1b4, 0xc1b5, 0xc1b6, 0xc1b7, + 0xc1b8, 0xc1b9, 0xc1ba, 0xc1bb, 0xc1bc, 0xc1bd, 0xc1be, 0xc1bf, + 0xc1c0, 0xc1c1, 0xc1c2, 0xc1c3, 0xc1c4, 0xc1c5, 0xc1c6, 0xc1c7, + 0xc1c8, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cc, 0xc1cd, 0xc1ce, 0xc1cf, + 0xc1d0, 0xc1d1, 0xc1d2, 0xc1d3, 0xc1d4, 0xc1d5, 0xc1d6, 0xc1d7, + 0xc1d8, 0xc1d9, 0xc1da, 0xc1db, 0xc1dc, 0xc1dd, 0xc1de, 0xc1df, + 0xc1e0, 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e4, 0xc1e5, 0xc1e6, 0xc1e7, + 0xc1e8, 0xc1e9, 0xc1ea, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, + 0xc1f0, 0xc1f1, 0xc1f2, 0xc1f3, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, + 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0xc1fc, 0xc1fd, 0xc1fe, 0xc1ff, + 0xc200, 0xc201, 0xc202, 0xc203, 0xc204, 0xc205, 0xc206, 0xc207, + 0xc208, 0xc209, 0xc20a, 0xc20b, 0xc20c, 0xc20d, 0xc20e, 0xc20f, + 0xc210, 0xc211, 0xc212, 0xc213, 0xc214, 0xc215, 0xc216, 0xc217, + 0xc218, 0xc219, 0xc21a, 0xc21b, 0xc21c, 0xc21d, 0xc21e, 0xc21f, + 0xc220, 0xc221, 0xc222, 0xc223, 0xc224, 0xc225, 0xc226, 0xc227, + 0xc228, 0xc229, 0xc22a, 0xc22b, 0xc22c, 0xc22d, 0xc22e, 0xc22f, + 0xc230, 0xc231, 0xc232, 0xc233, 0xc234, 0xc235, 0xc236, 0xc237, + 0xc238, 0xc239, 0xc23a, 0xc23b, 0xc23c, 0xc23d, 0xc23e, 0xc23f, + 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, + 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, + 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, + 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, + 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, + 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, + 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, + 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc27f, + 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, + 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, + 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, + 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, + 0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a4, 0xc2a5, 0xc2a6, 0xc2a7, + 0xc2a8, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ac, 0xc2ad, 0xc2ae, 0xc2af, + 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3, 0xc2b4, 0xc2b5, 0xc2b6, 0xc2b7, + 0xc2b8, 0xc2b9, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf, + 0xc2c0, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4, 0xc2c5, 0xc2c6, 0xc2c7, + 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc, 0xc2cd, 0xc2ce, 0xc2cf, + 0xc2d0, 0xc2d1, 0xc2d2, 0xc2d3, 0xc2d4, 0xc2d5, 0xc2d6, 0xc2d7, + 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0xc2dc, 0xc2dd, 0xc2de, 0xc2df, + 0xc2e0, 0xc2e1, 0xc2e2, 0xc2e3, 0xc2e4, 0xc2e5, 0xc2e6, 0xc2e7, + 0xc2e8, 0xc2e9, 0xc2ea, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ee, 0xc2ef, + 0xc2f0, 0xc2f1, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f6, 0xc2f7, + 0xc2f8, 0xc2f9, 0xc2fa, 0xc2fb, 0xc2fc, 0xc2fd, 0xc2fe, 0xc2ff, + 0xc300, 0xc301, 0xc302, 0xc303, 0xc304, 0xc305, 0xc306, 0xc307, + 0xc308, 0xc309, 0xc30a, 0xc30b, 0xc30c, 0xc30d, 0xc30e, 0xc30f, + 0xc310, 0xc311, 0xc312, 0xc313, 0xc314, 0xc315, 0xc316, 0xc317, + 0xc318, 0xc319, 0xc31a, 0xc31b, 0xc31c, 0xc31d, 0xc31e, 0xc31f, + 0xc320, 0xc321, 0xc322, 0xc323, 0xc324, 0xc325, 0xc326, 0xc327, + 0xc328, 0xc329, 0xc32a, 0xc32b, 0xc32c, 0xc32d, 0xc32e, 0xc32f, + 0xc330, 0xc331, 0xc332, 0xc333, 0xc334, 0xc335, 0xc336, 0xc337, + 0xc338, 0xc339, 0xc33a, 0xc33b, 0xc33c, 0xc33d, 0xc33e, 0xc33f, + 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, + 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, + 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, + 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, + 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, + 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, + 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, + 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc37f, + 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, + 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, + 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, + 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, + 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7, + 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, + 0xc3b0, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, + 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, + 0xc3c0, 0xc3c1, 0xc3c2, 0xc3c3, 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, + 0xc3c8, 0xc3c9, 0xc3ca, 0xc3cb, 0xc3cc, 0xc3cd, 0xc3ce, 0xc3cf, + 0xc3d0, 0xc3d1, 0xc3d2, 0xc3d3, 0xc3d4, 0xc3d5, 0xc3d6, 0xc3d7, + 0xc3d8, 0xc3d9, 0xc3da, 0xc3db, 0xc3dc, 0xc3dd, 0xc3de, 0xc3df, + 0xc3e0, 0xc3e1, 0xc3e2, 0xc3e3, 0xc3e4, 0xc3e5, 0xc3e6, 0xc3e7, + 0xc3e8, 0xc3e9, 0xc3ea, 0xc3eb, 0xc3ec, 0xc3ed, 0xc3ee, 0xc3ef, + 0xc3f0, 0xc3f1, 0xc3f2, 0xc3f3, 0xc3f4, 0xc3f5, 0xc3f6, 0xc3f7, + 0xc3f8, 0xc3f9, 0xc3fa, 0xc3fb, 0xc3fc, 0xc3fd, 0xc3fe, 0xc3ff, + 0xc400, 0xc401, 0xc402, 0xc403, 0xc404, 0xc405, 0xc406, 0xc407, + 0xc408, 0xc409, 0xc40a, 0xc40b, 0xc40c, 0xc40d, 0xc40e, 0xc40f, + 0xc410, 0xc411, 0xc412, 0xc413, 0xc414, 0xc415, 0xc416, 0xc417, + 0xc418, 0xc419, 0xc41a, 0xc41b, 0xc41c, 0xc41d, 0xc41e, 0xc41f, + 0xc420, 0xc421, 0xc422, 0xc423, 0xc424, 0xc425, 0xc426, 0xc427, + 0xc428, 0xc429, 0xc42a, 0xc42b, 0xc42c, 0xc42d, 0xc42e, 0xc42f, + 0xc430, 0xc431, 0xc432, 0xc433, 0xc434, 0xc435, 0xc436, 0xc437, + 0xc438, 0xc439, 0xc43a, 0xc43b, 0xc43c, 0xc43d, 0xc43e, 0xc43f, + 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, + 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, + 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, + 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, + 0xc460, 0xc461, 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, + 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, + 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, + 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc47f, + 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, + 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, + 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, + 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, + 0xc4a0, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4, 0xc4a5, 0xc4a6, 0xc4a7, + 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac, 0xc4ad, 0xc4ae, 0xc4af, + 0xc4b0, 0xc4b1, 0xc4b2, 0xc4b3, 0xc4b4, 0xc4b5, 0xc4b6, 0xc4b7, + 0xc4b8, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bc, 0xc4bd, 0xc4be, 0xc4bf, + 0xc4c0, 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5, 0xc4c6, 0xc4c7, + 0xc4c8, 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, + 0xc4d0, 0xc4d1, 0xc4d2, 0xc4d3, 0xc4d4, 0xc4d5, 0xc4d6, 0xc4d7, + 0xc4d8, 0xc4d9, 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4de, 0xc4df, + 0xc4e0, 0xc4e1, 0xc4e2, 0xc4e3, 0xc4e4, 0xc4e5, 0xc4e6, 0xc4e7, + 0xc4e8, 0xc4e9, 0xc4ea, 0xc4eb, 0xc4ec, 0xc4ed, 0xc4ee, 0xc4ef, + 0xc4f0, 0xc4f1, 0xc4f2, 0xc4f3, 0xc4f4, 0xc4f5, 0xc4f6, 0xc4f7, + 0xc4f8, 0xc4f9, 0xc4fa, 0xc4fb, 0xc4fc, 0xc4fd, 0xc4fe, 0xc4ff, + 0xc500, 0xc501, 0xc502, 0xc503, 0xc504, 0xc505, 0xc506, 0xc507, + 0xc508, 0xc509, 0xc50a, 0xc50b, 0xc50c, 0xc50d, 0xc50e, 0xc50f, + 0xc510, 0xc511, 0xc512, 0xc513, 0xc514, 0xc515, 0xc516, 0xc517, + 0xc518, 0xc519, 0xc51a, 0xc51b, 0xc51c, 0xc51d, 0xc51e, 0xc51f, + 0xc520, 0xc521, 0xc522, 0xc523, 0xc524, 0xc525, 0xc526, 0xc527, + 0xc528, 0xc529, 0xc52a, 0xc52b, 0xc52c, 0xc52d, 0xc52e, 0xc52f, + 0xc530, 0xc531, 0xc532, 0xc533, 0xc534, 0xc535, 0xc536, 0xc537, + 0xc538, 0xc539, 0xc53a, 0xc53b, 0xc53c, 0xc53d, 0xc53e, 0xc53f, + 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, + 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, + 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, + 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, + 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, + 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, + 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, + 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc57f, + 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, + 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, + 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, + 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, + 0xc5a0, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4, 0xc5a5, 0xc5a6, 0xc5a7, + 0xc5a8, 0xc5a9, 0xc5aa, 0xc5ab, 0xc5ac, 0xc5ad, 0xc5ae, 0xc5af, + 0xc5b0, 0xc5b1, 0xc5b2, 0xc5b3, 0xc5b4, 0xc5b5, 0xc5b6, 0xc5b7, + 0xc5b8, 0xc5b9, 0xc5ba, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5bf, + 0xc5c0, 0xc5c1, 0xc5c2, 0xc5c3, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, + 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cb, 0xc5cc, 0xc5cd, 0xc5ce, 0xc5cf, + 0xc5d0, 0xc5d1, 0xc5d2, 0xc5d3, 0xc5d4, 0xc5d5, 0xc5d6, 0xc5d7, + 0xc5d8, 0xc5d9, 0xc5da, 0xc5db, 0xc5dc, 0xc5dd, 0xc5de, 0xc5df, + 0xc5e0, 0xc5e1, 0xc5e2, 0xc5e3, 0xc5e4, 0xc5e5, 0xc5e6, 0xc5e7, + 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5ef, + 0xc5f0, 0xc5f1, 0xc5f2, 0xc5f3, 0xc5f4, 0xc5f5, 0xc5f6, 0xc5f7, + 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, + 0xc600, 0xc601, 0xc602, 0xc603, 0xc604, 0xc605, 0xc606, 0xc607, + 0xc608, 0xc609, 0xc60a, 0xc60b, 0xc60c, 0xc60d, 0xc60e, 0xc60f, + 0xc610, 0xc611, 0xc612, 0xc613, 0xc614, 0xc615, 0xc616, 0xc617, + 0xc618, 0xc619, 0xc61a, 0xc61b, 0xc61c, 0xc61d, 0xc61e, 0xc61f, + 0xc620, 0xc621, 0xc622, 0xc623, 0xc624, 0xc625, 0xc626, 0xc627, + 0xc628, 0xc629, 0xc62a, 0xc62b, 0xc62c, 0xc62d, 0xc62e, 0xc62f, + 0xc630, 0xc631, 0xc632, 0xc633, 0xc634, 0xc635, 0xc636, 0xc637, + 0xc638, 0xc639, 0xc63a, 0xc63b, 0xc63c, 0xc63d, 0xc63e, 0xc63f, + 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, + 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, + 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, + 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, + 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, + 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, + 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, + 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc67f, + 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, + 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, + 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, + 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, + 0xc6a0, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4, 0xc6a5, 0xc6a6, 0xc6a7, + 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, + 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, + 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, + 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, + 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, + 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, + 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, + 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, + 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, + 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, + 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc6ff, + 0xc700, 0xc701, 0xc702, 0xc703, 0xc704, 0xc705, 0xc706, 0xc707, + 0xc708, 0xc709, 0xc70a, 0xc70b, 0xc70c, 0xc70d, 0xc70e, 0xc70f, + 0xc710, 0xc711, 0xc712, 0xc713, 0xc714, 0xc715, 0xc716, 0xc717, + 0xc718, 0xc719, 0xc71a, 0xc71b, 0xc71c, 0xc71d, 0xc71e, 0xc71f, + 0xc720, 0xc721, 0xc722, 0xc723, 0xc724, 0xc725, 0xc726, 0xc727, + 0xc728, 0xc729, 0xc72a, 0xc72b, 0xc72c, 0xc72d, 0xc72e, 0xc72f, + 0xc730, 0xc731, 0xc732, 0xc733, 0xc734, 0xc735, 0xc736, 0xc737, + 0xc738, 0xc739, 0xc73a, 0xc73b, 0xc73c, 0xc73d, 0xc73e, 0xc73f, + 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, + 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, + 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, + 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, + 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, + 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, + 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, + 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc77f, + 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, + 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, + 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, + 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, + 0xc7a0, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, + 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, + 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, + 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, + 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, + 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7ce, 0xc7cf, + 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, + 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, + 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, + 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, + 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, + 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc7ff, + 0xc800, 0xc801, 0xc802, 0xc803, 0xc804, 0xc805, 0xc806, 0xc807, + 0xc808, 0xc809, 0xc80a, 0xc80b, 0xc80c, 0xc80d, 0xc80e, 0xc80f, + 0xc810, 0xc811, 0xc812, 0xc813, 0xc814, 0xc815, 0xc816, 0xc817, + 0xc818, 0xc819, 0xc81a, 0xc81b, 0xc81c, 0xc81d, 0xc81e, 0xc81f, + 0xc820, 0xc821, 0xc822, 0xc823, 0xc824, 0xc825, 0xc826, 0xc827, + 0xc828, 0xc829, 0xc82a, 0xc82b, 0xc82c, 0xc82d, 0xc82e, 0xc82f, + 0xc830, 0xc831, 0xc832, 0xc833, 0xc834, 0xc835, 0xc836, 0xc837, + 0xc838, 0xc839, 0xc83a, 0xc83b, 0xc83c, 0xc83d, 0xc83e, 0xc83f, + 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, + 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, + 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, + 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, + 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, + 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, + 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, + 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc87f, + 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, + 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, + 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, + 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, + 0xc8a0, 0xc8a1, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, + 0xc8a8, 0xc8a9, 0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, + 0xc8b0, 0xc8b1, 0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, + 0xc8b8, 0xc8b9, 0xc8ba, 0xc8bb, 0xc8bc, 0xc8bd, 0xc8be, 0xc8bf, + 0xc8c0, 0xc8c1, 0xc8c2, 0xc8c3, 0xc8c4, 0xc8c5, 0xc8c6, 0xc8c7, + 0xc8c8, 0xc8c9, 0xc8ca, 0xc8cb, 0xc8cc, 0xc8cd, 0xc8ce, 0xc8cf, + 0xc8d0, 0xc8d1, 0xc8d2, 0xc8d3, 0xc8d4, 0xc8d5, 0xc8d6, 0xc8d7, + 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, + 0xc8e0, 0xc8e1, 0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, + 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, + 0xc8f0, 0xc8f1, 0xc8f2, 0xc8f3, 0xc8f4, 0xc8f5, 0xc8f6, 0xc8f7, + 0xc8f8, 0xc8f9, 0xc8fa, 0xc8fb, 0xc8fc, 0xc8fd, 0xc8fe, 0xc8ff, + 0xc900, 0xc901, 0xc902, 0xc903, 0xc904, 0xc905, 0xc906, 0xc907, + 0xc908, 0xc909, 0xc90a, 0xc90b, 0xc90c, 0xc90d, 0xc90e, 0xc90f, + 0xc910, 0xc911, 0xc912, 0xc913, 0xc914, 0xc915, 0xc916, 0xc917, + 0xc918, 0xc919, 0xc91a, 0xc91b, 0xc91c, 0xc91d, 0xc91e, 0xc91f, + 0xc920, 0xc921, 0xc922, 0xc923, 0xc924, 0xc925, 0xc926, 0xc927, + 0xc928, 0xc929, 0xc92a, 0xc92b, 0xc92c, 0xc92d, 0xc92e, 0xc92f, + 0xc930, 0xc931, 0xc932, 0xc933, 0xc934, 0xc935, 0xc936, 0xc937, + 0xc938, 0xc939, 0xc93a, 0xc93b, 0xc93c, 0xc93d, 0xc93e, 0xc93f, + 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, + 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, + 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, + 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, + 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, + 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, + 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, + 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc97f, + 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, + 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, + 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, + 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, + 0xc9a0, 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, + 0xc9a8, 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, + 0xc9b0, 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7, + 0xc9b8, 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, + 0xc9c0, 0xc9c1, 0xc9c2, 0xc9c3, 0xc9c4, 0xc9c5, 0xc9c6, 0xc9c7, + 0xc9c8, 0xc9c9, 0xc9ca, 0xc9cb, 0xc9cc, 0xc9cd, 0xc9ce, 0xc9cf, + 0xc9d0, 0xc9d1, 0xc9d2, 0xc9d3, 0xc9d4, 0xc9d5, 0xc9d6, 0xc9d7, + 0xc9d8, 0xc9d9, 0xc9da, 0xc9db, 0xc9dc, 0xc9dd, 0xc9de, 0xc9df, + 0xc9e0, 0xc9e1, 0xc9e2, 0xc9e3, 0xc9e4, 0xc9e5, 0xc9e6, 0xc9e7, + 0xc9e8, 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ec, 0xc9ed, 0xc9ee, 0xc9ef, + 0xc9f0, 0xc9f1, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, + 0xc9f8, 0xc9f9, 0xc9fa, 0xc9fb, 0xc9fc, 0xc9fd, 0xc9fe, 0xc9ff, + 0xca00, 0xca01, 0xca02, 0xca03, 0xca04, 0xca05, 0xca06, 0xca07, + 0xca08, 0xca09, 0xca0a, 0xca0b, 0xca0c, 0xca0d, 0xca0e, 0xca0f, + 0xca10, 0xca11, 0xca12, 0xca13, 0xca14, 0xca15, 0xca16, 0xca17, + 0xca18, 0xca19, 0xca1a, 0xca1b, 0xca1c, 0xca1d, 0xca1e, 0xca1f, + 0xca20, 0xca21, 0xca22, 0xca23, 0xca24, 0xca25, 0xca26, 0xca27, + 0xca28, 0xca29, 0xca2a, 0xca2b, 0xca2c, 0xca2d, 0xca2e, 0xca2f, + 0xca30, 0xca31, 0xca32, 0xca33, 0xca34, 0xca35, 0xca36, 0xca37, + 0xca38, 0xca39, 0xca3a, 0xca3b, 0xca3c, 0xca3d, 0xca3e, 0xca3f, + 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, + 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, + 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, + 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, + 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, + 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, + 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, + 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca7f, + 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, + 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, + 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, + 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, + 0xcaa0, 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, + 0xcaa8, 0xcaa9, 0xcaaa, 0xcaab, 0xcaac, 0xcaad, 0xcaae, 0xcaaf, + 0xcab0, 0xcab1, 0xcab2, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, + 0xcab8, 0xcab9, 0xcaba, 0xcabb, 0xcabc, 0xcabd, 0xcabe, 0xcabf, + 0xcac0, 0xcac1, 0xcac2, 0xcac3, 0xcac4, 0xcac5, 0xcac6, 0xcac7, + 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcacc, 0xcacd, 0xcace, 0xcacf, + 0xcad0, 0xcad1, 0xcad2, 0xcad3, 0xcad4, 0xcad5, 0xcad6, 0xcad7, + 0xcad8, 0xcad9, 0xcada, 0xcadb, 0xcadc, 0xcadd, 0xcade, 0xcadf, + 0xcae0, 0xcae1, 0xcae2, 0xcae3, 0xcae4, 0xcae5, 0xcae6, 0xcae7, + 0xcae8, 0xcae9, 0xcaea, 0xcaeb, 0xcaec, 0xcaed, 0xcaee, 0xcaef, + 0xcaf0, 0xcaf1, 0xcaf2, 0xcaf3, 0xcaf4, 0xcaf5, 0xcaf6, 0xcaf7, + 0xcaf8, 0xcaf9, 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcafe, 0xcaff, + 0xcb00, 0xcb01, 0xcb02, 0xcb03, 0xcb04, 0xcb05, 0xcb06, 0xcb07, + 0xcb08, 0xcb09, 0xcb0a, 0xcb0b, 0xcb0c, 0xcb0d, 0xcb0e, 0xcb0f, + 0xcb10, 0xcb11, 0xcb12, 0xcb13, 0xcb14, 0xcb15, 0xcb16, 0xcb17, + 0xcb18, 0xcb19, 0xcb1a, 0xcb1b, 0xcb1c, 0xcb1d, 0xcb1e, 0xcb1f, + 0xcb20, 0xcb21, 0xcb22, 0xcb23, 0xcb24, 0xcb25, 0xcb26, 0xcb27, + 0xcb28, 0xcb29, 0xcb2a, 0xcb2b, 0xcb2c, 0xcb2d, 0xcb2e, 0xcb2f, + 0xcb30, 0xcb31, 0xcb32, 0xcb33, 0xcb34, 0xcb35, 0xcb36, 0xcb37, + 0xcb38, 0xcb39, 0xcb3a, 0xcb3b, 0xcb3c, 0xcb3d, 0xcb3e, 0xcb3f, + 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, + 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, + 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, + 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, + 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, + 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, + 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, + 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb7f, + 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, + 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, + 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, + 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, + 0xcba0, 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, + 0xcba8, 0xcba9, 0xcbaa, 0xcbab, 0xcbac, 0xcbad, 0xcbae, 0xcbaf, + 0xcbb0, 0xcbb1, 0xcbb2, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, + 0xcbb8, 0xcbb9, 0xcbba, 0xcbbb, 0xcbbc, 0xcbbd, 0xcbbe, 0xcbbf, + 0xcbc0, 0xcbc1, 0xcbc2, 0xcbc3, 0xcbc4, 0xcbc5, 0xcbc6, 0xcbc7, + 0xcbc8, 0xcbc9, 0xcbca, 0xcbcb, 0xcbcc, 0xcbcd, 0xcbce, 0xcbcf, + 0xcbd0, 0xcbd1, 0xcbd2, 0xcbd3, 0xcbd4, 0xcbd5, 0xcbd6, 0xcbd7, + 0xcbd8, 0xcbd9, 0xcbda, 0xcbdb, 0xcbdc, 0xcbdd, 0xcbde, 0xcbdf, + 0xcbe0, 0xcbe1, 0xcbe2, 0xcbe3, 0xcbe4, 0xcbe5, 0xcbe6, 0xcbe7, + 0xcbe8, 0xcbe9, 0xcbea, 0xcbeb, 0xcbec, 0xcbed, 0xcbee, 0xcbef, + 0xcbf0, 0xcbf1, 0xcbf2, 0xcbf3, 0xcbf4, 0xcbf5, 0xcbf6, 0xcbf7, + 0xcbf8, 0xcbf9, 0xcbfa, 0xcbfb, 0xcbfc, 0xcbfd, 0xcbfe, 0xcbff, + 0xcc00, 0xcc01, 0xcc02, 0xcc03, 0xcc04, 0xcc05, 0xcc06, 0xcc07, + 0xcc08, 0xcc09, 0xcc0a, 0xcc0b, 0xcc0c, 0xcc0d, 0xcc0e, 0xcc0f, + 0xcc10, 0xcc11, 0xcc12, 0xcc13, 0xcc14, 0xcc15, 0xcc16, 0xcc17, + 0xcc18, 0xcc19, 0xcc1a, 0xcc1b, 0xcc1c, 0xcc1d, 0xcc1e, 0xcc1f, + 0xcc20, 0xcc21, 0xcc22, 0xcc23, 0xcc24, 0xcc25, 0xcc26, 0xcc27, + 0xcc28, 0xcc29, 0xcc2a, 0xcc2b, 0xcc2c, 0xcc2d, 0xcc2e, 0xcc2f, + 0xcc30, 0xcc31, 0xcc32, 0xcc33, 0xcc34, 0xcc35, 0xcc36, 0xcc37, + 0xcc38, 0xcc39, 0xcc3a, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc3f, + 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, + 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, + 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, + 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, + 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, + 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, + 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, + 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc7f, + 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, + 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, + 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, + 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, + 0xcca0, 0xcca1, 0xcca2, 0xcca3, 0xcca4, 0xcca5, 0xcca6, 0xcca7, + 0xcca8, 0xcca9, 0xccaa, 0xccab, 0xccac, 0xccad, 0xccae, 0xccaf, + 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb4, 0xccb5, 0xccb6, 0xccb7, + 0xccb8, 0xccb9, 0xccba, 0xccbb, 0xccbc, 0xccbd, 0xccbe, 0xccbf, + 0xccc0, 0xccc1, 0xccc2, 0xccc3, 0xccc4, 0xccc5, 0xccc6, 0xccc7, + 0xccc8, 0xccc9, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, + 0xccd0, 0xccd1, 0xccd2, 0xccd3, 0xccd4, 0xccd5, 0xccd6, 0xccd7, + 0xccd8, 0xccd9, 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xccde, 0xccdf, + 0xcce0, 0xcce1, 0xcce2, 0xcce3, 0xcce4, 0xcce5, 0xcce6, 0xcce7, + 0xcce8, 0xcce9, 0xccea, 0xcceb, 0xccec, 0xcced, 0xccee, 0xccef, + 0xccf0, 0xccf1, 0xccf2, 0xccf3, 0xccf4, 0xccf5, 0xccf6, 0xccf7, + 0xccf8, 0xccf9, 0xccfa, 0xccfb, 0xccfc, 0xccfd, 0xccfe, 0xccff, + 0xcd00, 0xcd01, 0xcd02, 0xcd03, 0xcd04, 0xcd05, 0xcd06, 0xcd07, + 0xcd08, 0xcd09, 0xcd0a, 0xcd0b, 0xcd0c, 0xcd0d, 0xcd0e, 0xcd0f, + 0xcd10, 0xcd11, 0xcd12, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0xcd17, + 0xcd18, 0xcd19, 0xcd1a, 0xcd1b, 0xcd1c, 0xcd1d, 0xcd1e, 0xcd1f, + 0xcd20, 0xcd21, 0xcd22, 0xcd23, 0xcd24, 0xcd25, 0xcd26, 0xcd27, + 0xcd28, 0xcd29, 0xcd2a, 0xcd2b, 0xcd2c, 0xcd2d, 0xcd2e, 0xcd2f, + 0xcd30, 0xcd31, 0xcd32, 0xcd33, 0xcd34, 0xcd35, 0xcd36, 0xcd37, + 0xcd38, 0xcd39, 0xcd3a, 0xcd3b, 0xcd3c, 0xcd3d, 0xcd3e, 0xcd3f, + 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, + 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, + 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, + 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, + 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, + 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, + 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, + 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd7f, + 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, + 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, + 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, + 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, + 0xcda0, 0xcda1, 0xcda2, 0xcda3, 0xcda4, 0xcda5, 0xcda6, 0xcda7, + 0xcda8, 0xcda9, 0xcdaa, 0xcdab, 0xcdac, 0xcdad, 0xcdae, 0xcdaf, + 0xcdb0, 0xcdb1, 0xcdb2, 0xcdb3, 0xcdb4, 0xcdb5, 0xcdb6, 0xcdb7, + 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc, 0xcdbd, 0xcdbe, 0xcdbf, + 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, 0xcdc6, 0xcdc7, + 0xcdc8, 0xcdc9, 0xcdca, 0xcdcb, 0xcdcc, 0xcdcd, 0xcdce, 0xcdcf, + 0xcdd0, 0xcdd1, 0xcdd2, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, + 0xcdd8, 0xcdd9, 0xcdda, 0xcddb, 0xcddc, 0xcddd, 0xcdde, 0xcddf, + 0xcde0, 0xcde1, 0xcde2, 0xcde3, 0xcde4, 0xcde5, 0xcde6, 0xcde7, + 0xcde8, 0xcde9, 0xcdea, 0xcdeb, 0xcdec, 0xcded, 0xcdee, 0xcdef, + 0xcdf0, 0xcdf1, 0xcdf2, 0xcdf3, 0xcdf4, 0xcdf5, 0xcdf6, 0xcdf7, + 0xcdf8, 0xcdf9, 0xcdfa, 0xcdfb, 0xcdfc, 0xcdfd, 0xcdfe, 0xcdff, + 0xce00, 0xce01, 0xce02, 0xce03, 0xce04, 0xce05, 0xce06, 0xce07, + 0xce08, 0xce09, 0xce0a, 0xce0b, 0xce0c, 0xce0d, 0xce0e, 0xce0f, + 0xce10, 0xce11, 0xce12, 0xce13, 0xce14, 0xce15, 0xce16, 0xce17, + 0xce18, 0xce19, 0xce1a, 0xce1b, 0xce1c, 0xce1d, 0xce1e, 0xce1f, + 0xce20, 0xce21, 0xce22, 0xce23, 0xce24, 0xce25, 0xce26, 0xce27, + 0xce28, 0xce29, 0xce2a, 0xce2b, 0xce2c, 0xce2d, 0xce2e, 0xce2f, + 0xce30, 0xce31, 0xce32, 0xce33, 0xce34, 0xce35, 0xce36, 0xce37, + 0xce38, 0xce39, 0xce3a, 0xce3b, 0xce3c, 0xce3d, 0xce3e, 0xce3f, + 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, + 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, + 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, + 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, + 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, + 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, + 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, + 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce7f, + 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, + 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, + 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, + 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, + 0xcea0, 0xcea1, 0xcea2, 0xcea3, 0xcea4, 0xcea5, 0xcea6, 0xcea7, + 0xcea8, 0xcea9, 0xceaa, 0xceab, 0xceac, 0xcead, 0xceae, 0xceaf, + 0xceb0, 0xceb1, 0xceb2, 0xceb3, 0xceb4, 0xceb5, 0xceb6, 0xceb7, + 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0xcebd, 0xcebe, 0xcebf, + 0xcec0, 0xcec1, 0xcec2, 0xcec3, 0xcec4, 0xcec5, 0xcec6, 0xcec7, + 0xcec8, 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, + 0xced0, 0xced1, 0xced2, 0xced3, 0xced4, 0xced5, 0xced6, 0xced7, + 0xced8, 0xced9, 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcede, 0xcedf, + 0xcee0, 0xcee1, 0xcee2, 0xcee3, 0xcee4, 0xcee5, 0xcee6, 0xcee7, + 0xcee8, 0xcee9, 0xceea, 0xceeb, 0xceec, 0xceed, 0xceee, 0xceef, + 0xcef0, 0xcef1, 0xcef2, 0xcef3, 0xcef4, 0xcef5, 0xcef6, 0xcef7, + 0xcef8, 0xcef9, 0xcefa, 0xcefb, 0xcefc, 0xcefd, 0xcefe, 0xceff, + 0xcf00, 0xcf01, 0xcf02, 0xcf03, 0xcf04, 0xcf05, 0xcf06, 0xcf07, + 0xcf08, 0xcf09, 0xcf0a, 0xcf0b, 0xcf0c, 0xcf0d, 0xcf0e, 0xcf0f, + 0xcf10, 0xcf11, 0xcf12, 0xcf13, 0xcf14, 0xcf15, 0xcf16, 0xcf17, + 0xcf18, 0xcf19, 0xcf1a, 0xcf1b, 0xcf1c, 0xcf1d, 0xcf1e, 0xcf1f, + 0xcf20, 0xcf21, 0xcf22, 0xcf23, 0xcf24, 0xcf25, 0xcf26, 0xcf27, + 0xcf28, 0xcf29, 0xcf2a, 0xcf2b, 0xcf2c, 0xcf2d, 0xcf2e, 0xcf2f, + 0xcf30, 0xcf31, 0xcf32, 0xcf33, 0xcf34, 0xcf35, 0xcf36, 0xcf37, + 0xcf38, 0xcf39, 0xcf3a, 0xcf3b, 0xcf3c, 0xcf3d, 0xcf3e, 0xcf3f, + 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, + 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, + 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, + 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, + 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, + 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, + 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, + 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf7f, + 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, + 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, + 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, + 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, + 0xcfa0, 0xcfa1, 0xcfa2, 0xcfa3, 0xcfa4, 0xcfa5, 0xcfa6, 0xcfa7, + 0xcfa8, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac, 0xcfad, 0xcfae, 0xcfaf, + 0xcfb0, 0xcfb1, 0xcfb2, 0xcfb3, 0xcfb4, 0xcfb5, 0xcfb6, 0xcfb7, + 0xcfb8, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd, 0xcfbe, 0xcfbf, + 0xcfc0, 0xcfc1, 0xcfc2, 0xcfc3, 0xcfc4, 0xcfc5, 0xcfc6, 0xcfc7, + 0xcfc8, 0xcfc9, 0xcfca, 0xcfcb, 0xcfcc, 0xcfcd, 0xcfce, 0xcfcf, + 0xcfd0, 0xcfd1, 0xcfd2, 0xcfd3, 0xcfd4, 0xcfd5, 0xcfd6, 0xcfd7, + 0xcfd8, 0xcfd9, 0xcfda, 0xcfdb, 0xcfdc, 0xcfdd, 0xcfde, 0xcfdf, + 0xcfe0, 0xcfe1, 0xcfe2, 0xcfe3, 0xcfe4, 0xcfe5, 0xcfe6, 0xcfe7, + 0xcfe8, 0xcfe9, 0xcfea, 0xcfeb, 0xcfec, 0xcfed, 0xcfee, 0xcfef, + 0xcff0, 0xcff1, 0xcff2, 0xcff3, 0xcff4, 0xcff5, 0xcff6, 0xcff7, + 0xcff8, 0xcff9, 0xcffa, 0xcffb, 0xcffc, 0xcffd, 0xcffe, 0xcfff, + 0xd000, 0xd001, 0xd002, 0xd003, 0xd004, 0xd005, 0xd006, 0xd007, + 0xd008, 0xd009, 0xd00a, 0xd00b, 0xd00c, 0xd00d, 0xd00e, 0xd00f, + 0xd010, 0xd011, 0xd012, 0xd013, 0xd014, 0xd015, 0xd016, 0xd017, + 0xd018, 0xd019, 0xd01a, 0xd01b, 0xd01c, 0xd01d, 0xd01e, 0xd01f, + 0xd020, 0xd021, 0xd022, 0xd023, 0xd024, 0xd025, 0xd026, 0xd027, + 0xd028, 0xd029, 0xd02a, 0xd02b, 0xd02c, 0xd02d, 0xd02e, 0xd02f, + 0xd030, 0xd031, 0xd032, 0xd033, 0xd034, 0xd035, 0xd036, 0xd037, + 0xd038, 0xd039, 0xd03a, 0xd03b, 0xd03c, 0xd03d, 0xd03e, 0xd03f, + 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, + 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, + 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, + 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, + 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, + 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, + 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, + 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd07f, + 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, + 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, + 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, + 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, + 0xd0a0, 0xd0a1, 0xd0a2, 0xd0a3, 0xd0a4, 0xd0a5, 0xd0a6, 0xd0a7, + 0xd0a8, 0xd0a9, 0xd0aa, 0xd0ab, 0xd0ac, 0xd0ad, 0xd0ae, 0xd0af, + 0xd0b0, 0xd0b1, 0xd0b2, 0xd0b3, 0xd0b4, 0xd0b5, 0xd0b6, 0xd0b7, + 0xd0b8, 0xd0b9, 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0be, 0xd0bf, + 0xd0c0, 0xd0c1, 0xd0c2, 0xd0c3, 0xd0c4, 0xd0c5, 0xd0c6, 0xd0c7, + 0xd0c8, 0xd0c9, 0xd0ca, 0xd0cb, 0xd0cc, 0xd0cd, 0xd0ce, 0xd0cf, + 0xd0d0, 0xd0d1, 0xd0d2, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0d6, 0xd0d7, + 0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0xd0dc, 0xd0dd, 0xd0de, 0xd0df, + 0xd0e0, 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e4, 0xd0e5, 0xd0e6, 0xd0e7, + 0xd0e8, 0xd0e9, 0xd0ea, 0xd0eb, 0xd0ec, 0xd0ed, 0xd0ee, 0xd0ef, + 0xd0f0, 0xd0f1, 0xd0f2, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, + 0xd0f8, 0xd0f9, 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd0fe, 0xd0ff, + 0xd100, 0xd101, 0xd102, 0xd103, 0xd104, 0xd105, 0xd106, 0xd107, + 0xd108, 0xd109, 0xd10a, 0xd10b, 0xd10c, 0xd10d, 0xd10e, 0xd10f, + 0xd110, 0xd111, 0xd112, 0xd113, 0xd114, 0xd115, 0xd116, 0xd117, + 0xd118, 0xd119, 0xd11a, 0xd11b, 0xd11c, 0xd11d, 0xd11e, 0xd11f, + 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd125, 0xd126, 0xd127, + 0xd128, 0xd129, 0xd12a, 0xd12b, 0xd12c, 0xd12d, 0xd12e, 0xd12f, + 0xd130, 0xd131, 0xd132, 0xd133, 0xd134, 0xd135, 0xd136, 0xd137, + 0xd138, 0xd139, 0xd13a, 0xd13b, 0xd13c, 0xd13d, 0xd13e, 0xd13f, + 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, + 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, + 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, + 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, + 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, + 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, + 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, + 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd17f, + 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, + 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, + 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, + 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, + 0xd1a0, 0xd1a1, 0xd1a2, 0xd1a3, 0xd1a4, 0xd1a5, 0xd1a6, 0xd1a7, + 0xd1a8, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, + 0xd1b0, 0xd1b1, 0xd1b2, 0xd1b3, 0xd1b4, 0xd1b5, 0xd1b6, 0xd1b7, + 0xd1b8, 0xd1b9, 0xd1ba, 0xd1bb, 0xd1bc, 0xd1bd, 0xd1be, 0xd1bf, + 0xd1c0, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7, + 0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc, 0xd1cd, 0xd1ce, 0xd1cf, + 0xd1d0, 0xd1d1, 0xd1d2, 0xd1d3, 0xd1d4, 0xd1d5, 0xd1d6, 0xd1d7, + 0xd1d8, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd, 0xd1de, 0xd1df, + 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0xd1e7, + 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, + 0xd1f0, 0xd1f1, 0xd1f2, 0xd1f3, 0xd1f4, 0xd1f5, 0xd1f6, 0xd1f7, + 0xd1f8, 0xd1f9, 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd1fe, 0xd1ff, + 0xd200, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206, 0xd207, + 0xd208, 0xd209, 0xd20a, 0xd20b, 0xd20c, 0xd20d, 0xd20e, 0xd20f, + 0xd210, 0xd211, 0xd212, 0xd213, 0xd214, 0xd215, 0xd216, 0xd217, + 0xd218, 0xd219, 0xd21a, 0xd21b, 0xd21c, 0xd21d, 0xd21e, 0xd21f, + 0xd220, 0xd221, 0xd222, 0xd223, 0xd224, 0xd225, 0xd226, 0xd227, + 0xd228, 0xd229, 0xd22a, 0xd22b, 0xd22c, 0xd22d, 0xd22e, 0xd22f, + 0xd230, 0xd231, 0xd232, 0xd233, 0xd234, 0xd235, 0xd236, 0xd237, + 0xd238, 0xd239, 0xd23a, 0xd23b, 0xd23c, 0xd23d, 0xd23e, 0xd23f, + 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, + 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, + 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, + 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, + 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, + 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, + 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, + 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd27f, + 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, + 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, + 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, + 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, + 0xd2a0, 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a4, 0xd2a5, 0xd2a6, 0xd2a7, + 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ac, 0xd2ad, 0xd2ae, 0xd2af, + 0xd2b0, 0xd2b1, 0xd2b2, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6, 0xd2b7, + 0xd2b8, 0xd2b9, 0xd2ba, 0xd2bb, 0xd2bc, 0xd2bd, 0xd2be, 0xd2bf, + 0xd2c0, 0xd2c1, 0xd2c2, 0xd2c3, 0xd2c4, 0xd2c5, 0xd2c6, 0xd2c7, + 0xd2c8, 0xd2c9, 0xd2ca, 0xd2cb, 0xd2cc, 0xd2cd, 0xd2ce, 0xd2cf, + 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2d7, + 0xd2d8, 0xd2d9, 0xd2da, 0xd2db, 0xd2dc, 0xd2dd, 0xd2de, 0xd2df, + 0xd2e0, 0xd2e1, 0xd2e2, 0xd2e3, 0xd2e4, 0xd2e5, 0xd2e6, 0xd2e7, + 0xd2e8, 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, + 0xd2f0, 0xd2f1, 0xd2f2, 0xd2f3, 0xd2f4, 0xd2f5, 0xd2f6, 0xd2f7, + 0xd2f8, 0xd2f9, 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd2fe, 0xd2ff, + 0xd300, 0xd301, 0xd302, 0xd303, 0xd304, 0xd305, 0xd306, 0xd307, + 0xd308, 0xd309, 0xd30a, 0xd30b, 0xd30c, 0xd30d, 0xd30e, 0xd30f, + 0xd310, 0xd311, 0xd312, 0xd313, 0xd314, 0xd315, 0xd316, 0xd317, + 0xd318, 0xd319, 0xd31a, 0xd31b, 0xd31c, 0xd31d, 0xd31e, 0xd31f, + 0xd320, 0xd321, 0xd322, 0xd323, 0xd324, 0xd325, 0xd326, 0xd327, + 0xd328, 0xd329, 0xd32a, 0xd32b, 0xd32c, 0xd32d, 0xd32e, 0xd32f, + 0xd330, 0xd331, 0xd332, 0xd333, 0xd334, 0xd335, 0xd336, 0xd337, + 0xd338, 0xd339, 0xd33a, 0xd33b, 0xd33c, 0xd33d, 0xd33e, 0xd33f, + 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, + 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, + 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, + 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, + 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, + 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, + 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, + 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd37f, + 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, + 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, + 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, + 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, + 0xd3a0, 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4, 0xd3a5, 0xd3a6, 0xd3a7, + 0xd3a8, 0xd3a9, 0xd3aa, 0xd3ab, 0xd3ac, 0xd3ad, 0xd3ae, 0xd3af, + 0xd3b0, 0xd3b1, 0xd3b2, 0xd3b3, 0xd3b4, 0xd3b5, 0xd3b6, 0xd3b7, + 0xd3b8, 0xd3b9, 0xd3ba, 0xd3bb, 0xd3bc, 0xd3bd, 0xd3be, 0xd3bf, + 0xd3c0, 0xd3c1, 0xd3c2, 0xd3c3, 0xd3c4, 0xd3c5, 0xd3c6, 0xd3c7, + 0xd3c8, 0xd3c9, 0xd3ca, 0xd3cb, 0xd3cc, 0xd3cd, 0xd3ce, 0xd3cf, + 0xd3d0, 0xd3d1, 0xd3d2, 0xd3d3, 0xd3d4, 0xd3d5, 0xd3d6, 0xd3d7, + 0xd3d8, 0xd3d9, 0xd3da, 0xd3db, 0xd3dc, 0xd3dd, 0xd3de, 0xd3df, + 0xd3e0, 0xd3e1, 0xd3e2, 0xd3e3, 0xd3e4, 0xd3e5, 0xd3e6, 0xd3e7, + 0xd3e8, 0xd3e9, 0xd3ea, 0xd3eb, 0xd3ec, 0xd3ed, 0xd3ee, 0xd3ef, + 0xd3f0, 0xd3f1, 0xd3f2, 0xd3f3, 0xd3f4, 0xd3f5, 0xd3f6, 0xd3f7, + 0xd3f8, 0xd3f9, 0xd3fa, 0xd3fb, 0xd3fc, 0xd3fd, 0xd3fe, 0xd3ff, + 0xd400, 0xd401, 0xd402, 0xd403, 0xd404, 0xd405, 0xd406, 0xd407, + 0xd408, 0xd409, 0xd40a, 0xd40b, 0xd40c, 0xd40d, 0xd40e, 0xd40f, + 0xd410, 0xd411, 0xd412, 0xd413, 0xd414, 0xd415, 0xd416, 0xd417, + 0xd418, 0xd419, 0xd41a, 0xd41b, 0xd41c, 0xd41d, 0xd41e, 0xd41f, + 0xd420, 0xd421, 0xd422, 0xd423, 0xd424, 0xd425, 0xd426, 0xd427, + 0xd428, 0xd429, 0xd42a, 0xd42b, 0xd42c, 0xd42d, 0xd42e, 0xd42f, + 0xd430, 0xd431, 0xd432, 0xd433, 0xd434, 0xd435, 0xd436, 0xd437, + 0xd438, 0xd439, 0xd43a, 0xd43b, 0xd43c, 0xd43d, 0xd43e, 0xd43f, + 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, + 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, + 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, + 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, + 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, + 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, + 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, + 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd47f, + 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, + 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, + 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, + 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, + 0xd4a0, 0xd4a1, 0xd4a2, 0xd4a3, 0xd4a4, 0xd4a5, 0xd4a6, 0xd4a7, + 0xd4a8, 0xd4a9, 0xd4aa, 0xd4ab, 0xd4ac, 0xd4ad, 0xd4ae, 0xd4af, + 0xd4b0, 0xd4b1, 0xd4b2, 0xd4b3, 0xd4b4, 0xd4b5, 0xd4b6, 0xd4b7, + 0xd4b8, 0xd4b9, 0xd4ba, 0xd4bb, 0xd4bc, 0xd4bd, 0xd4be, 0xd4bf, + 0xd4c0, 0xd4c1, 0xd4c2, 0xd4c3, 0xd4c4, 0xd4c5, 0xd4c6, 0xd4c7, + 0xd4c8, 0xd4c9, 0xd4ca, 0xd4cb, 0xd4cc, 0xd4cd, 0xd4ce, 0xd4cf, + 0xd4d0, 0xd4d1, 0xd4d2, 0xd4d3, 0xd4d4, 0xd4d5, 0xd4d6, 0xd4d7, + 0xd4d8, 0xd4d9, 0xd4da, 0xd4db, 0xd4dc, 0xd4dd, 0xd4de, 0xd4df, + 0xd4e0, 0xd4e1, 0xd4e2, 0xd4e3, 0xd4e4, 0xd4e5, 0xd4e6, 0xd4e7, + 0xd4e8, 0xd4e9, 0xd4ea, 0xd4eb, 0xd4ec, 0xd4ed, 0xd4ee, 0xd4ef, + 0xd4f0, 0xd4f1, 0xd4f2, 0xd4f3, 0xd4f4, 0xd4f5, 0xd4f6, 0xd4f7, + 0xd4f8, 0xd4f9, 0xd4fa, 0xd4fb, 0xd4fc, 0xd4fd, 0xd4fe, 0xd4ff, + 0xd500, 0xd501, 0xd502, 0xd503, 0xd504, 0xd505, 0xd506, 0xd507, + 0xd508, 0xd509, 0xd50a, 0xd50b, 0xd50c, 0xd50d, 0xd50e, 0xd50f, + 0xd510, 0xd511, 0xd512, 0xd513, 0xd514, 0xd515, 0xd516, 0xd517, + 0xd518, 0xd519, 0xd51a, 0xd51b, 0xd51c, 0xd51d, 0xd51e, 0xd51f, + 0xd520, 0xd521, 0xd522, 0xd523, 0xd524, 0xd525, 0xd526, 0xd527, + 0xd528, 0xd529, 0xd52a, 0xd52b, 0xd52c, 0xd52d, 0xd52e, 0xd52f, + 0xd530, 0xd531, 0xd532, 0xd533, 0xd534, 0xd535, 0xd536, 0xd537, + 0xd538, 0xd539, 0xd53a, 0xd53b, 0xd53c, 0xd53d, 0xd53e, 0xd53f, + 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, + 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, + 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, + 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, + 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, + 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, + 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, + 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd57f, + 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, + 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, + 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, + 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, + 0xd5a0, 0xd5a1, 0xd5a2, 0xd5a3, 0xd5a4, 0xd5a5, 0xd5a6, 0xd5a7, + 0xd5a8, 0xd5a9, 0xd5aa, 0xd5ab, 0xd5ac, 0xd5ad, 0xd5ae, 0xd5af, + 0xd5b0, 0xd5b1, 0xd5b2, 0xd5b3, 0xd5b4, 0xd5b5, 0xd5b6, 0xd5b7, + 0xd5b8, 0xd5b9, 0xd5ba, 0xd5bb, 0xd5bc, 0xd5bd, 0xd5be, 0xd5bf, + 0xd5c0, 0xd5c1, 0xd5c2, 0xd5c3, 0xd5c4, 0xd5c5, 0xd5c6, 0xd5c7, + 0xd5c8, 0xd5c9, 0xd5ca, 0xd5cb, 0xd5cc, 0xd5cd, 0xd5ce, 0xd5cf, + 0xd5d0, 0xd5d1, 0xd5d2, 0xd5d3, 0xd5d4, 0xd5d5, 0xd5d6, 0xd5d7, + 0xd5d8, 0xd5d9, 0xd5da, 0xd5db, 0xd5dc, 0xd5dd, 0xd5de, 0xd5df, + 0xd5e0, 0xd5e1, 0xd5e2, 0xd5e3, 0xd5e4, 0xd5e5, 0xd5e6, 0xd5e7, + 0xd5e8, 0xd5e9, 0xd5ea, 0xd5eb, 0xd5ec, 0xd5ed, 0xd5ee, 0xd5ef, + 0xd5f0, 0xd5f1, 0xd5f2, 0xd5f3, 0xd5f4, 0xd5f5, 0xd5f6, 0xd5f7, + 0xd5f8, 0xd5f9, 0xd5fa, 0xd5fb, 0xd5fc, 0xd5fd, 0xd5fe, 0xd5ff, + 0xd600, 0xd601, 0xd602, 0xd603, 0xd604, 0xd605, 0xd606, 0xd607, + 0xd608, 0xd609, 0xd60a, 0xd60b, 0xd60c, 0xd60d, 0xd60e, 0xd60f, + 0xd610, 0xd611, 0xd612, 0xd613, 0xd614, 0xd615, 0xd616, 0xd617, + 0xd618, 0xd619, 0xd61a, 0xd61b, 0xd61c, 0xd61d, 0xd61e, 0xd61f, + 0xd620, 0xd621, 0xd622, 0xd623, 0xd624, 0xd625, 0xd626, 0xd627, + 0xd628, 0xd629, 0xd62a, 0xd62b, 0xd62c, 0xd62d, 0xd62e, 0xd62f, + 0xd630, 0xd631, 0xd632, 0xd633, 0xd634, 0xd635, 0xd636, 0xd637, + 0xd638, 0xd639, 0xd63a, 0xd63b, 0xd63c, 0xd63d, 0xd63e, 0xd63f, + 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, + 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, + 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, + 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, + 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, + 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, + 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, + 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd67f, + 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, + 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, + 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, + 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, + 0xd6a0, 0xd6a1, 0xd6a2, 0xd6a3, 0xd6a4, 0xd6a5, 0xd6a6, 0xd6a7, + 0xd6a8, 0xd6a9, 0xd6aa, 0xd6ab, 0xd6ac, 0xd6ad, 0xd6ae, 0xd6af, + 0xd6b0, 0xd6b1, 0xd6b2, 0xd6b3, 0xd6b4, 0xd6b5, 0xd6b6, 0xd6b7, + 0xd6b8, 0xd6b9, 0xd6ba, 0xd6bb, 0xd6bc, 0xd6bd, 0xd6be, 0xd6bf, + 0xd6c0, 0xd6c1, 0xd6c2, 0xd6c3, 0xd6c4, 0xd6c5, 0xd6c6, 0xd6c7, + 0xd6c8, 0xd6c9, 0xd6ca, 0xd6cb, 0xd6cc, 0xd6cd, 0xd6ce, 0xd6cf, + 0xd6d0, 0xd6d1, 0xd6d2, 0xd6d3, 0xd6d4, 0xd6d5, 0xd6d6, 0xd6d7, + 0xd6d8, 0xd6d9, 0xd6da, 0xd6db, 0xd6dc, 0xd6dd, 0xd6de, 0xd6df, + 0xd6e0, 0xd6e1, 0xd6e2, 0xd6e3, 0xd6e4, 0xd6e5, 0xd6e6, 0xd6e7, + 0xd6e8, 0xd6e9, 0xd6ea, 0xd6eb, 0xd6ec, 0xd6ed, 0xd6ee, 0xd6ef, + 0xd6f0, 0xd6f1, 0xd6f2, 0xd6f3, 0xd6f4, 0xd6f5, 0xd6f6, 0xd6f7, + 0xd6f8, 0xd6f9, 0xd6fa, 0xd6fb, 0xd6fc, 0xd6fd, 0xd6fe, 0xd6ff, + 0xd700, 0xd701, 0xd702, 0xd703, 0xd704, 0xd705, 0xd706, 0xd707, + 0xd708, 0xd709, 0xd70a, 0xd70b, 0xd70c, 0xd70d, 0xd70e, 0xd70f, + 0xd710, 0xd711, 0xd712, 0xd713, 0xd714, 0xd715, 0xd716, 0xd717, + 0xd718, 0xd719, 0xd71a, 0xd71b, 0xd71c, 0xd71d, 0xd71e, 0xd71f, + 0xd720, 0xd721, 0xd722, 0xd723, 0xd724, 0xd725, 0xd726, 0xd727, + 0xd728, 0xd729, 0xd72a, 0xd72b, 0xd72c, 0xd72d, 0xd72e, 0xd72f, + 0xd730, 0xd731, 0xd732, 0xd733, 0xd734, 0xd735, 0xd736, 0xd737, + 0xd738, 0xd739, 0xd73a, 0xd73b, 0xd73c, 0xd73d, 0xd73e, 0xd73f, + 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, + 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, + 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, + 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, + 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, + 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, + 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, + 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd77f, + 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, + 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, + 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, + 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, + 0xd7a0, 0xd7a1, 0xd7a2, 0xd7a3, 0xd7a4, 0xd7a5, 0xd7a6, 0xd7a7, + 0xd7a8, 0xd7a9, 0xd7aa, 0xd7ab, 0xd7ac, 0xd7ad, 0xd7ae, 0xd7af, + 0xd7b0, 0xd7b1, 0xd7b2, 0xd7b3, 0xd7b4, 0xd7b5, 0xd7b6, 0xd7b7, + 0xd7b8, 0xd7b9, 0xd7ba, 0xd7bb, 0xd7bc, 0xd7bd, 0xd7be, 0xd7bf, + 0xd7c0, 0xd7c1, 0xd7c2, 0xd7c3, 0xd7c4, 0xd7c5, 0xd7c6, 0xd7c7, + 0xd7c8, 0xd7c9, 0xd7ca, 0xd7cb, 0xd7cc, 0xd7cd, 0xd7ce, 0xd7cf, + 0xd7d0, 0xd7d1, 0xd7d2, 0xd7d3, 0xd7d4, 0xd7d5, 0xd7d6, 0xd7d7, + 0xd7d8, 0xd7d9, 0xd7da, 0xd7db, 0xd7dc, 0xd7dd, 0xd7de, 0xd7df, + 0xd7e0, 0xd7e1, 0xd7e2, 0xd7e3, 0xd7e4, 0xd7e5, 0xd7e6, 0xd7e7, + 0xd7e8, 0xd7e9, 0xd7ea, 0xd7eb, 0xd7ec, 0xd7ed, 0xd7ee, 0xd7ef, + 0xd7f0, 0xd7f1, 0xd7f2, 0xd7f3, 0xd7f4, 0xd7f5, 0xd7f6, 0xd7f7, + 0xd7f8, 0xd7f9, 0xd7fa, 0xd7fb, 0xd7fc, 0xd7fd, 0xd7fe, 0xd7ff, + 0xd800, 0xd801, 0xd802, 0xd803, 0xd804, 0xd805, 0xd806, 0xd807, + 0xd808, 0xd809, 0xd80a, 0xd80b, 0xd80c, 0xd80d, 0xd80e, 0xd80f, + 0xd810, 0xd811, 0xd812, 0xd813, 0xd814, 0xd815, 0xd816, 0xd817, + 0xd818, 0xd819, 0xd81a, 0xd81b, 0xd81c, 0xd81d, 0xd81e, 0xd81f, + 0xd820, 0xd821, 0xd822, 0xd823, 0xd824, 0xd825, 0xd826, 0xd827, + 0xd828, 0xd829, 0xd82a, 0xd82b, 0xd82c, 0xd82d, 0xd82e, 0xd82f, + 0xd830, 0xd831, 0xd832, 0xd833, 0xd834, 0xd835, 0xd836, 0xd837, + 0xd838, 0xd839, 0xd83a, 0xd83b, 0xd83c, 0xd83d, 0xd83e, 0xd83f, + 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, + 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, + 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, + 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, + 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, + 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, + 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, + 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd87f, + 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, + 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, + 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, + 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, + 0xd8a0, 0xd8a1, 0xd8a2, 0xd8a3, 0xd8a4, 0xd8a5, 0xd8a6, 0xd8a7, + 0xd8a8, 0xd8a9, 0xd8aa, 0xd8ab, 0xd8ac, 0xd8ad, 0xd8ae, 0xd8af, + 0xd8b0, 0xd8b1, 0xd8b2, 0xd8b3, 0xd8b4, 0xd8b5, 0xd8b6, 0xd8b7, + 0xd8b8, 0xd8b9, 0xd8ba, 0xd8bb, 0xd8bc, 0xd8bd, 0xd8be, 0xd8bf, + 0xd8c0, 0xd8c1, 0xd8c2, 0xd8c3, 0xd8c4, 0xd8c5, 0xd8c6, 0xd8c7, + 0xd8c8, 0xd8c9, 0xd8ca, 0xd8cb, 0xd8cc, 0xd8cd, 0xd8ce, 0xd8cf, + 0xd8d0, 0xd8d1, 0xd8d2, 0xd8d3, 0xd8d4, 0xd8d5, 0xd8d6, 0xd8d7, + 0xd8d8, 0xd8d9, 0xd8da, 0xd8db, 0xd8dc, 0xd8dd, 0xd8de, 0xd8df, + 0xd8e0, 0xd8e1, 0xd8e2, 0xd8e3, 0xd8e4, 0xd8e5, 0xd8e6, 0xd8e7, + 0xd8e8, 0xd8e9, 0xd8ea, 0xd8eb, 0xd8ec, 0xd8ed, 0xd8ee, 0xd8ef, + 0xd8f0, 0xd8f1, 0xd8f2, 0xd8f3, 0xd8f4, 0xd8f5, 0xd8f6, 0xd8f7, + 0xd8f8, 0xd8f9, 0xd8fa, 0xd8fb, 0xd8fc, 0xd8fd, 0xd8fe, 0xd8ff, + 0xd900, 0xd901, 0xd902, 0xd903, 0xd904, 0xd905, 0xd906, 0xd907, + 0xd908, 0xd909, 0xd90a, 0xd90b, 0xd90c, 0xd90d, 0xd90e, 0xd90f, + 0xd910, 0xd911, 0xd912, 0xd913, 0xd914, 0xd915, 0xd916, 0xd917, + 0xd918, 0xd919, 0xd91a, 0xd91b, 0xd91c, 0xd91d, 0xd91e, 0xd91f, + 0xd920, 0xd921, 0xd922, 0xd923, 0xd924, 0xd925, 0xd926, 0xd927, + 0xd928, 0xd929, 0xd92a, 0xd92b, 0xd92c, 0xd92d, 0xd92e, 0xd92f, + 0xd930, 0xd931, 0xd932, 0xd933, 0xd934, 0xd935, 0xd936, 0xd937, + 0xd938, 0xd939, 0xd93a, 0xd93b, 0xd93c, 0xd93d, 0xd93e, 0xd93f, + 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, + 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, + 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, + 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, + 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, + 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, + 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, + 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd97f, + 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, + 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, + 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, + 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, + 0xd9a0, 0xd9a1, 0xd9a2, 0xd9a3, 0xd9a4, 0xd9a5, 0xd9a6, 0xd9a7, + 0xd9a8, 0xd9a9, 0xd9aa, 0xd9ab, 0xd9ac, 0xd9ad, 0xd9ae, 0xd9af, + 0xd9b0, 0xd9b1, 0xd9b2, 0xd9b3, 0xd9b4, 0xd9b5, 0xd9b6, 0xd9b7, + 0xd9b8, 0xd9b9, 0xd9ba, 0xd9bb, 0xd9bc, 0xd9bd, 0xd9be, 0xd9bf, + 0xd9c0, 0xd9c1, 0xd9c2, 0xd9c3, 0xd9c4, 0xd9c5, 0xd9c6, 0xd9c7, + 0xd9c8, 0xd9c9, 0xd9ca, 0xd9cb, 0xd9cc, 0xd9cd, 0xd9ce, 0xd9cf, + 0xd9d0, 0xd9d1, 0xd9d2, 0xd9d3, 0xd9d4, 0xd9d5, 0xd9d6, 0xd9d7, + 0xd9d8, 0xd9d9, 0xd9da, 0xd9db, 0xd9dc, 0xd9dd, 0xd9de, 0xd9df, + 0xd9e0, 0xd9e1, 0xd9e2, 0xd9e3, 0xd9e4, 0xd9e5, 0xd9e6, 0xd9e7, + 0xd9e8, 0xd9e9, 0xd9ea, 0xd9eb, 0xd9ec, 0xd9ed, 0xd9ee, 0xd9ef, + 0xd9f0, 0xd9f1, 0xd9f2, 0xd9f3, 0xd9f4, 0xd9f5, 0xd9f6, 0xd9f7, + 0xd9f8, 0xd9f9, 0xd9fa, 0xd9fb, 0xd9fc, 0xd9fd, 0xd9fe, 0xd9ff, + 0xda00, 0xda01, 0xda02, 0xda03, 0xda04, 0xda05, 0xda06, 0xda07, + 0xda08, 0xda09, 0xda0a, 0xda0b, 0xda0c, 0xda0d, 0xda0e, 0xda0f, + 0xda10, 0xda11, 0xda12, 0xda13, 0xda14, 0xda15, 0xda16, 0xda17, + 0xda18, 0xda19, 0xda1a, 0xda1b, 0xda1c, 0xda1d, 0xda1e, 0xda1f, + 0xda20, 0xda21, 0xda22, 0xda23, 0xda24, 0xda25, 0xda26, 0xda27, + 0xda28, 0xda29, 0xda2a, 0xda2b, 0xda2c, 0xda2d, 0xda2e, 0xda2f, + 0xda30, 0xda31, 0xda32, 0xda33, 0xda34, 0xda35, 0xda36, 0xda37, + 0xda38, 0xda39, 0xda3a, 0xda3b, 0xda3c, 0xda3d, 0xda3e, 0xda3f, + 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, + 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, + 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, + 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, + 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, + 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, + 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, + 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda7f, + 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, + 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, + 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, + 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, + 0xdaa0, 0xdaa1, 0xdaa2, 0xdaa3, 0xdaa4, 0xdaa5, 0xdaa6, 0xdaa7, + 0xdaa8, 0xdaa9, 0xdaaa, 0xdaab, 0xdaac, 0xdaad, 0xdaae, 0xdaaf, + 0xdab0, 0xdab1, 0xdab2, 0xdab3, 0xdab4, 0xdab5, 0xdab6, 0xdab7, + 0xdab8, 0xdab9, 0xdaba, 0xdabb, 0xdabc, 0xdabd, 0xdabe, 0xdabf, + 0xdac0, 0xdac1, 0xdac2, 0xdac3, 0xdac4, 0xdac5, 0xdac6, 0xdac7, + 0xdac8, 0xdac9, 0xdaca, 0xdacb, 0xdacc, 0xdacd, 0xdace, 0xdacf, + 0xdad0, 0xdad1, 0xdad2, 0xdad3, 0xdad4, 0xdad5, 0xdad6, 0xdad7, + 0xdad8, 0xdad9, 0xdada, 0xdadb, 0xdadc, 0xdadd, 0xdade, 0xdadf, + 0xdae0, 0xdae1, 0xdae2, 0xdae3, 0xdae4, 0xdae5, 0xdae6, 0xdae7, + 0xdae8, 0xdae9, 0xdaea, 0xdaeb, 0xdaec, 0xdaed, 0xdaee, 0xdaef, + 0xdaf0, 0xdaf1, 0xdaf2, 0xdaf3, 0xdaf4, 0xdaf5, 0xdaf6, 0xdaf7, + 0xdaf8, 0xdaf9, 0xdafa, 0xdafb, 0xdafc, 0xdafd, 0xdafe, 0xdaff, + 0xdb00, 0xdb01, 0xdb02, 0xdb03, 0xdb04, 0xdb05, 0xdb06, 0xdb07, + 0xdb08, 0xdb09, 0xdb0a, 0xdb0b, 0xdb0c, 0xdb0d, 0xdb0e, 0xdb0f, + 0xdb10, 0xdb11, 0xdb12, 0xdb13, 0xdb14, 0xdb15, 0xdb16, 0xdb17, + 0xdb18, 0xdb19, 0xdb1a, 0xdb1b, 0xdb1c, 0xdb1d, 0xdb1e, 0xdb1f, + 0xdb20, 0xdb21, 0xdb22, 0xdb23, 0xdb24, 0xdb25, 0xdb26, 0xdb27, + 0xdb28, 0xdb29, 0xdb2a, 0xdb2b, 0xdb2c, 0xdb2d, 0xdb2e, 0xdb2f, + 0xdb30, 0xdb31, 0xdb32, 0xdb33, 0xdb34, 0xdb35, 0xdb36, 0xdb37, + 0xdb38, 0xdb39, 0xdb3a, 0xdb3b, 0xdb3c, 0xdb3d, 0xdb3e, 0xdb3f, + 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, + 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, + 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, + 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, + 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, + 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, + 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, + 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb7f, + 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, + 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, + 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, + 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, + 0xdba0, 0xdba1, 0xdba2, 0xdba3, 0xdba4, 0xdba5, 0xdba6, 0xdba7, + 0xdba8, 0xdba9, 0xdbaa, 0xdbab, 0xdbac, 0xdbad, 0xdbae, 0xdbaf, + 0xdbb0, 0xdbb1, 0xdbb2, 0xdbb3, 0xdbb4, 0xdbb5, 0xdbb6, 0xdbb7, + 0xdbb8, 0xdbb9, 0xdbba, 0xdbbb, 0xdbbc, 0xdbbd, 0xdbbe, 0xdbbf, + 0xdbc0, 0xdbc1, 0xdbc2, 0xdbc3, 0xdbc4, 0xdbc5, 0xdbc6, 0xdbc7, + 0xdbc8, 0xdbc9, 0xdbca, 0xdbcb, 0xdbcc, 0xdbcd, 0xdbce, 0xdbcf, + 0xdbd0, 0xdbd1, 0xdbd2, 0xdbd3, 0xdbd4, 0xdbd5, 0xdbd6, 0xdbd7, + 0xdbd8, 0xdbd9, 0xdbda, 0xdbdb, 0xdbdc, 0xdbdd, 0xdbde, 0xdbdf, + 0xdbe0, 0xdbe1, 0xdbe2, 0xdbe3, 0xdbe4, 0xdbe5, 0xdbe6, 0xdbe7, + 0xdbe8, 0xdbe9, 0xdbea, 0xdbeb, 0xdbec, 0xdbed, 0xdbee, 0xdbef, + 0xdbf0, 0xdbf1, 0xdbf2, 0xdbf3, 0xdbf4, 0xdbf5, 0xdbf6, 0xdbf7, + 0xdbf8, 0xdbf9, 0xdbfa, 0xdbfb, 0xdbfc, 0xdbfd, 0xdbfe, 0xdbff, + 0xdc00, 0xdc01, 0xdc02, 0xdc03, 0xdc04, 0xdc05, 0xdc06, 0xdc07, + 0xdc08, 0xdc09, 0xdc0a, 0xdc0b, 0xdc0c, 0xdc0d, 0xdc0e, 0xdc0f, + 0xdc10, 0xdc11, 0xdc12, 0xdc13, 0xdc14, 0xdc15, 0xdc16, 0xdc17, + 0xdc18, 0xdc19, 0xdc1a, 0xdc1b, 0xdc1c, 0xdc1d, 0xdc1e, 0xdc1f, + 0xdc20, 0xdc21, 0xdc22, 0xdc23, 0xdc24, 0xdc25, 0xdc26, 0xdc27, + 0xdc28, 0xdc29, 0xdc2a, 0xdc2b, 0xdc2c, 0xdc2d, 0xdc2e, 0xdc2f, + 0xdc30, 0xdc31, 0xdc32, 0xdc33, 0xdc34, 0xdc35, 0xdc36, 0xdc37, + 0xdc38, 0xdc39, 0xdc3a, 0xdc3b, 0xdc3c, 0xdc3d, 0xdc3e, 0xdc3f, + 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, + 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, + 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, + 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, + 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, + 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, + 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, + 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc7f, + 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, + 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, + 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, + 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, + 0xdca0, 0xdca1, 0xdca2, 0xdca3, 0xdca4, 0xdca5, 0xdca6, 0xdca7, + 0xdca8, 0xdca9, 0xdcaa, 0xdcab, 0xdcac, 0xdcad, 0xdcae, 0xdcaf, + 0xdcb0, 0xdcb1, 0xdcb2, 0xdcb3, 0xdcb4, 0xdcb5, 0xdcb6, 0xdcb7, + 0xdcb8, 0xdcb9, 0xdcba, 0xdcbb, 0xdcbc, 0xdcbd, 0xdcbe, 0xdcbf, + 0xdcc0, 0xdcc1, 0xdcc2, 0xdcc3, 0xdcc4, 0xdcc5, 0xdcc6, 0xdcc7, + 0xdcc8, 0xdcc9, 0xdcca, 0xdccb, 0xdccc, 0xdccd, 0xdcce, 0xdccf, + 0xdcd0, 0xdcd1, 0xdcd2, 0xdcd3, 0xdcd4, 0xdcd5, 0xdcd6, 0xdcd7, + 0xdcd8, 0xdcd9, 0xdcda, 0xdcdb, 0xdcdc, 0xdcdd, 0xdcde, 0xdcdf, + 0xdce0, 0xdce1, 0xdce2, 0xdce3, 0xdce4, 0xdce5, 0xdce6, 0xdce7, + 0xdce8, 0xdce9, 0xdcea, 0xdceb, 0xdcec, 0xdced, 0xdcee, 0xdcef, + 0xdcf0, 0xdcf1, 0xdcf2, 0xdcf3, 0xdcf4, 0xdcf5, 0xdcf6, 0xdcf7, + 0xdcf8, 0xdcf9, 0xdcfa, 0xdcfb, 0xdcfc, 0xdcfd, 0xdcfe, 0xdcff, + 0xdd00, 0xdd01, 0xdd02, 0xdd03, 0xdd04, 0xdd05, 0xdd06, 0xdd07, + 0xdd08, 0xdd09, 0xdd0a, 0xdd0b, 0xdd0c, 0xdd0d, 0xdd0e, 0xdd0f, + 0xdd10, 0xdd11, 0xdd12, 0xdd13, 0xdd14, 0xdd15, 0xdd16, 0xdd17, + 0xdd18, 0xdd19, 0xdd1a, 0xdd1b, 0xdd1c, 0xdd1d, 0xdd1e, 0xdd1f, + 0xdd20, 0xdd21, 0xdd22, 0xdd23, 0xdd24, 0xdd25, 0xdd26, 0xdd27, + 0xdd28, 0xdd29, 0xdd2a, 0xdd2b, 0xdd2c, 0xdd2d, 0xdd2e, 0xdd2f, + 0xdd30, 0xdd31, 0xdd32, 0xdd33, 0xdd34, 0xdd35, 0xdd36, 0xdd37, + 0xdd38, 0xdd39, 0xdd3a, 0xdd3b, 0xdd3c, 0xdd3d, 0xdd3e, 0xdd3f, + 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, + 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, + 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, + 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, + 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, + 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, + 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, + 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd7f, + 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, + 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, + 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, + 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, + 0xdda0, 0xdda1, 0xdda2, 0xdda3, 0xdda4, 0xdda5, 0xdda6, 0xdda7, + 0xdda8, 0xdda9, 0xddaa, 0xddab, 0xddac, 0xddad, 0xddae, 0xddaf, + 0xddb0, 0xddb1, 0xddb2, 0xddb3, 0xddb4, 0xddb5, 0xddb6, 0xddb7, + 0xddb8, 0xddb9, 0xddba, 0xddbb, 0xddbc, 0xddbd, 0xddbe, 0xddbf, + 0xddc0, 0xddc1, 0xddc2, 0xddc3, 0xddc4, 0xddc5, 0xddc6, 0xddc7, + 0xddc8, 0xddc9, 0xddca, 0xddcb, 0xddcc, 0xddcd, 0xddce, 0xddcf, + 0xddd0, 0xddd1, 0xddd2, 0xddd3, 0xddd4, 0xddd5, 0xddd6, 0xddd7, + 0xddd8, 0xddd9, 0xddda, 0xdddb, 0xdddc, 0xdddd, 0xddde, 0xdddf, + 0xdde0, 0xdde1, 0xdde2, 0xdde3, 0xdde4, 0xdde5, 0xdde6, 0xdde7, + 0xdde8, 0xdde9, 0xddea, 0xddeb, 0xddec, 0xdded, 0xddee, 0xddef, + 0xddf0, 0xddf1, 0xddf2, 0xddf3, 0xddf4, 0xddf5, 0xddf6, 0xddf7, + 0xddf8, 0xddf9, 0xddfa, 0xddfb, 0xddfc, 0xddfd, 0xddfe, 0xddff, + 0xde00, 0xde01, 0xde02, 0xde03, 0xde04, 0xde05, 0xde06, 0xde07, + 0xde08, 0xde09, 0xde0a, 0xde0b, 0xde0c, 0xde0d, 0xde0e, 0xde0f, + 0xde10, 0xde11, 0xde12, 0xde13, 0xde14, 0xde15, 0xde16, 0xde17, + 0xde18, 0xde19, 0xde1a, 0xde1b, 0xde1c, 0xde1d, 0xde1e, 0xde1f, + 0xde20, 0xde21, 0xde22, 0xde23, 0xde24, 0xde25, 0xde26, 0xde27, + 0xde28, 0xde29, 0xde2a, 0xde2b, 0xde2c, 0xde2d, 0xde2e, 0xde2f, + 0xde30, 0xde31, 0xde32, 0xde33, 0xde34, 0xde35, 0xde36, 0xde37, + 0xde38, 0xde39, 0xde3a, 0xde3b, 0xde3c, 0xde3d, 0xde3e, 0xde3f, + 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, + 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, + 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, + 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, + 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, + 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, + 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, + 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde7f, + 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, + 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, + 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, + 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, + 0xdea0, 0xdea1, 0xdea2, 0xdea3, 0xdea4, 0xdea5, 0xdea6, 0xdea7, + 0xdea8, 0xdea9, 0xdeaa, 0xdeab, 0xdeac, 0xdead, 0xdeae, 0xdeaf, + 0xdeb0, 0xdeb1, 0xdeb2, 0xdeb3, 0xdeb4, 0xdeb5, 0xdeb6, 0xdeb7, + 0xdeb8, 0xdeb9, 0xdeba, 0xdebb, 0xdebc, 0xdebd, 0xdebe, 0xdebf, + 0xdec0, 0xdec1, 0xdec2, 0xdec3, 0xdec4, 0xdec5, 0xdec6, 0xdec7, + 0xdec8, 0xdec9, 0xdeca, 0xdecb, 0xdecc, 0xdecd, 0xdece, 0xdecf, + 0xded0, 0xded1, 0xded2, 0xded3, 0xded4, 0xded5, 0xded6, 0xded7, + 0xded8, 0xded9, 0xdeda, 0xdedb, 0xdedc, 0xdedd, 0xdede, 0xdedf, + 0xdee0, 0xdee1, 0xdee2, 0xdee3, 0xdee4, 0xdee5, 0xdee6, 0xdee7, + 0xdee8, 0xdee9, 0xdeea, 0xdeeb, 0xdeec, 0xdeed, 0xdeee, 0xdeef, + 0xdef0, 0xdef1, 0xdef2, 0xdef3, 0xdef4, 0xdef5, 0xdef6, 0xdef7, + 0xdef8, 0xdef9, 0xdefa, 0xdefb, 0xdefc, 0xdefd, 0xdefe, 0xdeff, + 0xdf00, 0xdf01, 0xdf02, 0xdf03, 0xdf04, 0xdf05, 0xdf06, 0xdf07, + 0xdf08, 0xdf09, 0xdf0a, 0xdf0b, 0xdf0c, 0xdf0d, 0xdf0e, 0xdf0f, + 0xdf10, 0xdf11, 0xdf12, 0xdf13, 0xdf14, 0xdf15, 0xdf16, 0xdf17, + 0xdf18, 0xdf19, 0xdf1a, 0xdf1b, 0xdf1c, 0xdf1d, 0xdf1e, 0xdf1f, + 0xdf20, 0xdf21, 0xdf22, 0xdf23, 0xdf24, 0xdf25, 0xdf26, 0xdf27, + 0xdf28, 0xdf29, 0xdf2a, 0xdf2b, 0xdf2c, 0xdf2d, 0xdf2e, 0xdf2f, + 0xdf30, 0xdf31, 0xdf32, 0xdf33, 0xdf34, 0xdf35, 0xdf36, 0xdf37, + 0xdf38, 0xdf39, 0xdf3a, 0xdf3b, 0xdf3c, 0xdf3d, 0xdf3e, 0xdf3f, + 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, + 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, + 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, + 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, + 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, + 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, + 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, + 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf7f, + 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, + 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, + 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, + 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, + 0xdfa0, 0xdfa1, 0xdfa2, 0xdfa3, 0xdfa4, 0xdfa5, 0xdfa6, 0xdfa7, + 0xdfa8, 0xdfa9, 0xdfaa, 0xdfab, 0xdfac, 0xdfad, 0xdfae, 0xdfaf, + 0xdfb0, 0xdfb1, 0xdfb2, 0xdfb3, 0xdfb4, 0xdfb5, 0xdfb6, 0xdfb7, + 0xdfb8, 0xdfb9, 0xdfba, 0xdfbb, 0xdfbc, 0xdfbd, 0xdfbe, 0xdfbf, + 0xdfc0, 0xdfc1, 0xdfc2, 0xdfc3, 0xdfc4, 0xdfc5, 0xdfc6, 0xdfc7, + 0xdfc8, 0xdfc9, 0xdfca, 0xdfcb, 0xdfcc, 0xdfcd, 0xdfce, 0xdfcf, + 0xdfd0, 0xdfd1, 0xdfd2, 0xdfd3, 0xdfd4, 0xdfd5, 0xdfd6, 0xdfd7, + 0xdfd8, 0xdfd9, 0xdfda, 0xdfdb, 0xdfdc, 0xdfdd, 0xdfde, 0xdfdf, + 0xdfe0, 0xdfe1, 0xdfe2, 0xdfe3, 0xdfe4, 0xdfe5, 0xdfe6, 0xdfe7, + 0xdfe8, 0xdfe9, 0xdfea, 0xdfeb, 0xdfec, 0xdfed, 0xdfee, 0xdfef, + 0xdff0, 0xdff1, 0xdff2, 0xdff3, 0xdff4, 0xdff5, 0xdff6, 0xdff7, + 0xdff8, 0xdff9, 0xdffa, 0xdffb, 0xdffc, 0xdffd, 0xdffe, 0xdfff, + 0xe000, 0xe001, 0xe002, 0xe003, 0xe004, 0xe005, 0xe006, 0xe007, + 0xe008, 0xe009, 0xe00a, 0xe00b, 0xe00c, 0xe00d, 0xe00e, 0xe00f, + 0xe010, 0xe011, 0xe012, 0xe013, 0xe014, 0xe015, 0xe016, 0xe017, + 0xe018, 0xe019, 0xe01a, 0xe01b, 0xe01c, 0xe01d, 0xe01e, 0xe01f, + 0xe020, 0xe021, 0xe022, 0xe023, 0xe024, 0xe025, 0xe026, 0xe027, + 0xe028, 0xe029, 0xe02a, 0xe02b, 0xe02c, 0xe02d, 0xe02e, 0xe02f, + 0xe030, 0xe031, 0xe032, 0xe033, 0xe034, 0xe035, 0xe036, 0xe037, + 0xe038, 0xe039, 0xe03a, 0xe03b, 0xe03c, 0xe03d, 0xe03e, 0xe03f, + 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, + 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, + 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, + 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, + 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, + 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, + 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, + 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe07f, + 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, + 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, + 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, + 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, + 0xe0a0, 0xe0a1, 0xe0a2, 0xe0a3, 0xe0a4, 0xe0a5, 0xe0a6, 0xe0a7, + 0xe0a8, 0xe0a9, 0xe0aa, 0xe0ab, 0xe0ac, 0xe0ad, 0xe0ae, 0xe0af, + 0xe0b0, 0xe0b1, 0xe0b2, 0xe0b3, 0xe0b4, 0xe0b5, 0xe0b6, 0xe0b7, + 0xe0b8, 0xe0b9, 0xe0ba, 0xe0bb, 0xe0bc, 0xe0bd, 0xe0be, 0xe0bf, + 0xe0c0, 0xe0c1, 0xe0c2, 0xe0c3, 0xe0c4, 0xe0c5, 0xe0c6, 0xe0c7, + 0xe0c8, 0xe0c9, 0xe0ca, 0xe0cb, 0xe0cc, 0xe0cd, 0xe0ce, 0xe0cf, + 0xe0d0, 0xe0d1, 0xe0d2, 0xe0d3, 0xe0d4, 0xe0d5, 0xe0d6, 0xe0d7, + 0xe0d8, 0xe0d9, 0xe0da, 0xe0db, 0xe0dc, 0xe0dd, 0xe0de, 0xe0df, + 0xe0e0, 0xe0e1, 0xe0e2, 0xe0e3, 0xe0e4, 0xe0e5, 0xe0e6, 0xe0e7, + 0xe0e8, 0xe0e9, 0xe0ea, 0xe0eb, 0xe0ec, 0xe0ed, 0xe0ee, 0xe0ef, + 0xe0f0, 0xe0f1, 0xe0f2, 0xe0f3, 0xe0f4, 0xe0f5, 0xe0f6, 0xe0f7, + 0xe0f8, 0xe0f9, 0xe0fa, 0xe0fb, 0xe0fc, 0xe0fd, 0xe0fe, 0xe0ff, + 0xe100, 0xe101, 0xe102, 0xe103, 0xe104, 0xe105, 0xe106, 0xe107, + 0xe108, 0xe109, 0xe10a, 0xe10b, 0xe10c, 0xe10d, 0xe10e, 0xe10f, + 0xe110, 0xe111, 0xe112, 0xe113, 0xe114, 0xe115, 0xe116, 0xe117, + 0xe118, 0xe119, 0xe11a, 0xe11b, 0xe11c, 0xe11d, 0xe11e, 0xe11f, + 0xe120, 0xe121, 0xe122, 0xe123, 0xe124, 0xe125, 0xe126, 0xe127, + 0xe128, 0xe129, 0xe12a, 0xe12b, 0xe12c, 0xe12d, 0xe12e, 0xe12f, + 0xe130, 0xe131, 0xe132, 0xe133, 0xe134, 0xe135, 0xe136, 0xe137, + 0xe138, 0xe139, 0xe13a, 0xe13b, 0xe13c, 0xe13d, 0xe13e, 0xe13f, + 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, + 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, + 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, + 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, + 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, + 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, + 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, + 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe17f, + 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, + 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, + 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, + 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, + 0xe1a0, 0xe1a1, 0xe1a2, 0xe1a3, 0xe1a4, 0xe1a5, 0xe1a6, 0xe1a7, + 0xe1a8, 0xe1a9, 0xe1aa, 0xe1ab, 0xe1ac, 0xe1ad, 0xe1ae, 0xe1af, + 0xe1b0, 0xe1b1, 0xe1b2, 0xe1b3, 0xe1b4, 0xe1b5, 0xe1b6, 0xe1b7, + 0xe1b8, 0xe1b9, 0xe1ba, 0xe1bb, 0xe1bc, 0xe1bd, 0xe1be, 0xe1bf, + 0xe1c0, 0xe1c1, 0xe1c2, 0xe1c3, 0xe1c4, 0xe1c5, 0xe1c6, 0xe1c7, + 0xe1c8, 0xe1c9, 0xe1ca, 0xe1cb, 0xe1cc, 0xe1cd, 0xe1ce, 0xe1cf, + 0xe1d0, 0xe1d1, 0xe1d2, 0xe1d3, 0xe1d4, 0xe1d5, 0xe1d6, 0xe1d7, + 0xe1d8, 0xe1d9, 0xe1da, 0xe1db, 0xe1dc, 0xe1dd, 0xe1de, 0xe1df, + 0xe1e0, 0xe1e1, 0xe1e2, 0xe1e3, 0xe1e4, 0xe1e5, 0xe1e6, 0xe1e7, + 0xe1e8, 0xe1e9, 0xe1ea, 0xe1eb, 0xe1ec, 0xe1ed, 0xe1ee, 0xe1ef, + 0xe1f0, 0xe1f1, 0xe1f2, 0xe1f3, 0xe1f4, 0xe1f5, 0xe1f6, 0xe1f7, + 0xe1f8, 0xe1f9, 0xe1fa, 0xe1fb, 0xe1fc, 0xe1fd, 0xe1fe, 0xe1ff, + 0xe200, 0xe201, 0xe202, 0xe203, 0xe204, 0xe205, 0xe206, 0xe207, + 0xe208, 0xe209, 0xe20a, 0xe20b, 0xe20c, 0xe20d, 0xe20e, 0xe20f, + 0xe210, 0xe211, 0xe212, 0xe213, 0xe214, 0xe215, 0xe216, 0xe217, + 0xe218, 0xe219, 0xe21a, 0xe21b, 0xe21c, 0xe21d, 0xe21e, 0xe21f, + 0xe220, 0xe221, 0xe222, 0xe223, 0xe224, 0xe225, 0xe226, 0xe227, + 0xe228, 0xe229, 0xe22a, 0xe22b, 0xe22c, 0xe22d, 0xe22e, 0xe22f, + 0xe230, 0xe231, 0xe232, 0xe233, 0xe234, 0xe235, 0xe236, 0xe237, + 0xe238, 0xe239, 0xe23a, 0xe23b, 0xe23c, 0xe23d, 0xe23e, 0xe23f, + 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, + 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, + 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, + 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, + 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, + 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, + 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, + 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe27f, + 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, + 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, + 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, + 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, + 0xe2a0, 0xe2a1, 0xe2a2, 0xe2a3, 0xe2a4, 0xe2a5, 0xe2a6, 0xe2a7, + 0xe2a8, 0xe2a9, 0xe2aa, 0xe2ab, 0xe2ac, 0xe2ad, 0xe2ae, 0xe2af, + 0xe2b0, 0xe2b1, 0xe2b2, 0xe2b3, 0xe2b4, 0xe2b5, 0xe2b6, 0xe2b7, + 0xe2b8, 0xe2b9, 0xe2ba, 0xe2bb, 0xe2bc, 0xe2bd, 0xe2be, 0xe2bf, + 0xe2c0, 0xe2c1, 0xe2c2, 0xe2c3, 0xe2c4, 0xe2c5, 0xe2c6, 0xe2c7, + 0xe2c8, 0xe2c9, 0xe2ca, 0xe2cb, 0xe2cc, 0xe2cd, 0xe2ce, 0xe2cf, + 0xe2d0, 0xe2d1, 0xe2d2, 0xe2d3, 0xe2d4, 0xe2d5, 0xe2d6, 0xe2d7, + 0xe2d8, 0xe2d9, 0xe2da, 0xe2db, 0xe2dc, 0xe2dd, 0xe2de, 0xe2df, + 0xe2e0, 0xe2e1, 0xe2e2, 0xe2e3, 0xe2e4, 0xe2e5, 0xe2e6, 0xe2e7, + 0xe2e8, 0xe2e9, 0xe2ea, 0xe2eb, 0xe2ec, 0xe2ed, 0xe2ee, 0xe2ef, + 0xe2f0, 0xe2f1, 0xe2f2, 0xe2f3, 0xe2f4, 0xe2f5, 0xe2f6, 0xe2f7, + 0xe2f8, 0xe2f9, 0xe2fa, 0xe2fb, 0xe2fc, 0xe2fd, 0xe2fe, 0xe2ff, + 0xe300, 0xe301, 0xe302, 0xe303, 0xe304, 0xe305, 0xe306, 0xe307, + 0xe308, 0xe309, 0xe30a, 0xe30b, 0xe30c, 0xe30d, 0xe30e, 0xe30f, + 0xe310, 0xe311, 0xe312, 0xe313, 0xe314, 0xe315, 0xe316, 0xe317, + 0xe318, 0xe319, 0xe31a, 0xe31b, 0xe31c, 0xe31d, 0xe31e, 0xe31f, + 0xe320, 0xe321, 0xe322, 0xe323, 0xe324, 0xe325, 0xe326, 0xe327, + 0xe328, 0xe329, 0xe32a, 0xe32b, 0xe32c, 0xe32d, 0xe32e, 0xe32f, + 0xe330, 0xe331, 0xe332, 0xe333, 0xe334, 0xe335, 0xe336, 0xe337, + 0xe338, 0xe339, 0xe33a, 0xe33b, 0xe33c, 0xe33d, 0xe33e, 0xe33f, + 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, + 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, + 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, + 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, + 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, + 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, + 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, + 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe37f, + 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, + 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, + 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, + 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, + 0xe3a0, 0xe3a1, 0xe3a2, 0xe3a3, 0xe3a4, 0xe3a5, 0xe3a6, 0xe3a7, + 0xe3a8, 0xe3a9, 0xe3aa, 0xe3ab, 0xe3ac, 0xe3ad, 0xe3ae, 0xe3af, + 0xe3b0, 0xe3b1, 0xe3b2, 0xe3b3, 0xe3b4, 0xe3b5, 0xe3b6, 0xe3b7, + 0xe3b8, 0xe3b9, 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd, 0xe3be, 0xe3bf, + 0xe3c0, 0xe3c1, 0xe3c2, 0xe3c3, 0xe3c4, 0xe3c5, 0xe3c6, 0xe3c7, + 0xe3c8, 0xe3c9, 0xe3ca, 0xe3cb, 0xe3cc, 0xe3cd, 0xe3ce, 0xe3cf, + 0xe3d0, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xe3d5, 0xe3d6, 0xe3d7, + 0xe3d8, 0xe3d9, 0xe3da, 0xe3db, 0xe3dc, 0xe3dd, 0xe3de, 0xe3df, + 0xe3e0, 0xe3e1, 0xe3e2, 0xe3e3, 0xe3e4, 0xe3e5, 0xe3e6, 0xe3e7, + 0xe3e8, 0xe3e9, 0xe3ea, 0xe3eb, 0xe3ec, 0xe3ed, 0xe3ee, 0xe3ef, + 0xe3f0, 0xe3f1, 0xe3f2, 0xe3f3, 0xe3f4, 0xe3f5, 0xe3f6, 0xe3f7, + 0xe3f8, 0xe3f9, 0xe3fa, 0xe3fb, 0xe3fc, 0xe3fd, 0xe3fe, 0xe3ff, + 0xe400, 0xe401, 0xe402, 0xe403, 0xe404, 0xe405, 0xe406, 0xe407, + 0xe408, 0xe409, 0xe40a, 0xe40b, 0xe40c, 0xe40d, 0xe40e, 0xe40f, + 0xe410, 0xe411, 0xe412, 0xe413, 0xe414, 0xe415, 0xe416, 0xe417, + 0xe418, 0xe419, 0xe41a, 0xe41b, 0xe41c, 0xe41d, 0xe41e, 0xe41f, + 0xe420, 0xe421, 0xe422, 0xe423, 0xe424, 0xe425, 0xe426, 0xe427, + 0xe428, 0xe429, 0xe42a, 0xe42b, 0xe42c, 0xe42d, 0xe42e, 0xe42f, + 0xe430, 0xe431, 0xe432, 0xe433, 0xe434, 0xe435, 0xe436, 0xe437, + 0xe438, 0xe439, 0xe43a, 0xe43b, 0xe43c, 0xe43d, 0xe43e, 0xe43f, + 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, + 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, + 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, + 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, + 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, + 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, + 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, + 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe47f, + 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, + 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, + 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, + 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, + 0xe4a0, 0xe4a1, 0xe4a2, 0xe4a3, 0xe4a4, 0xe4a5, 0xe4a6, 0xe4a7, + 0xe4a8, 0xe4a9, 0xe4aa, 0xe4ab, 0xe4ac, 0xe4ad, 0xe4ae, 0xe4af, + 0xe4b0, 0xe4b1, 0xe4b2, 0xe4b3, 0xe4b4, 0xe4b5, 0xe4b6, 0xe4b7, + 0xe4b8, 0xe4b9, 0xe4ba, 0xe4bb, 0xe4bc, 0xe4bd, 0xe4be, 0xe4bf, + 0xe4c0, 0xe4c1, 0xe4c2, 0xe4c3, 0xe4c4, 0xe4c5, 0xe4c6, 0xe4c7, + 0xe4c8, 0xe4c9, 0xe4ca, 0xe4cb, 0xe4cc, 0xe4cd, 0xe4ce, 0xe4cf, + 0xe4d0, 0xe4d1, 0xe4d2, 0xe4d3, 0xe4d4, 0xe4d5, 0xe4d6, 0xe4d7, + 0xe4d8, 0xe4d9, 0xe4da, 0xe4db, 0xe4dc, 0xe4dd, 0xe4de, 0xe4df, + 0xe4e0, 0xe4e1, 0xe4e2, 0xe4e3, 0xe4e4, 0xe4e5, 0xe4e6, 0xe4e7, + 0xe4e8, 0xe4e9, 0xe4ea, 0xe4eb, 0xe4ec, 0xe4ed, 0xe4ee, 0xe4ef, + 0xe4f0, 0xe4f1, 0xe4f2, 0xe4f3, 0xe4f4, 0xe4f5, 0xe4f6, 0xe4f7, + 0xe4f8, 0xe4f9, 0xe4fa, 0xe4fb, 0xe4fc, 0xe4fd, 0xe4fe, 0xe4ff, + 0xe500, 0xe501, 0xe502, 0xe503, 0xe504, 0xe505, 0xe506, 0xe507, + 0xe508, 0xe509, 0xe50a, 0xe50b, 0xe50c, 0xe50d, 0xe50e, 0xe50f, + 0xe510, 0xe511, 0xe512, 0xe513, 0xe514, 0xe515, 0xe516, 0xe517, + 0xe518, 0xe519, 0xe51a, 0xe51b, 0xe51c, 0xe51d, 0xe51e, 0xe51f, + 0xe520, 0xe521, 0xe522, 0xe523, 0xe524, 0xe525, 0xe526, 0xe527, + 0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c, 0xe52d, 0xe52e, 0xe52f, + 0xe530, 0xe531, 0xe532, 0xe533, 0xe534, 0xe535, 0xe536, 0xe537, + 0xe538, 0xe539, 0xe53a, 0xe53b, 0xe53c, 0xe53d, 0xe53e, 0xe53f, + 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, + 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, + 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, + 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, + 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, + 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, + 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, + 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe57f, + 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, + 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, + 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, + 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, + 0xe5a0, 0xe5a1, 0xe5a2, 0xe5a3, 0xe5a4, 0xe5a5, 0xe5a6, 0xe5a7, + 0xe5a8, 0xe5a9, 0xe5aa, 0xe5ab, 0xe5ac, 0xe5ad, 0xe5ae, 0xe5af, + 0xe5b0, 0xe5b1, 0xe5b2, 0xe5b3, 0xe5b4, 0xe5b5, 0xe5b6, 0xe5b7, + 0xe5b8, 0xe5b9, 0xe5ba, 0xe5bb, 0xe5bc, 0xe5bd, 0xe5be, 0xe5bf, + 0xe5c0, 0xe5c1, 0xe5c2, 0xe5c3, 0xe5c4, 0xe5c5, 0xe5c6, 0xe5c7, + 0xe5c8, 0xe5c9, 0xe5ca, 0xe5cb, 0xe5cc, 0xe5cd, 0xe5ce, 0xe5cf, + 0xe5d0, 0xe5d1, 0xe5d2, 0xe5d3, 0xe5d4, 0xe5d5, 0xe5d6, 0xe5d7, + 0xe5d8, 0xe5d9, 0xe5da, 0xe5db, 0xe5dc, 0xe5dd, 0xe5de, 0xe5df, + 0xe5e0, 0xe5e1, 0xe5e2, 0xe5e3, 0xe5e4, 0xe5e5, 0xe5e6, 0xe5e7, + 0xe5e8, 0xe5e9, 0xe5ea, 0xe5eb, 0xe5ec, 0xe5ed, 0xe5ee, 0xe5ef, + 0xe5f0, 0xe5f1, 0xe5f2, 0xe5f3, 0xe5f4, 0xe5f5, 0xe5f6, 0xe5f7, + 0xe5f8, 0xe5f9, 0xe5fa, 0xe5fb, 0xe5fc, 0xe5fd, 0xe5fe, 0xe5ff, + 0xe600, 0xe601, 0xe602, 0xe603, 0xe604, 0xe605, 0xe606, 0xe607, + 0xe608, 0xe609, 0xe60a, 0xe60b, 0xe60c, 0xe60d, 0xe60e, 0xe60f, + 0xe610, 0xe611, 0xe612, 0xe613, 0xe614, 0xe615, 0xe616, 0xe617, + 0xe618, 0xe619, 0xe61a, 0xe61b, 0xe61c, 0xe61d, 0xe61e, 0xe61f, + 0xe620, 0xe621, 0xe622, 0xe623, 0xe624, 0xe625, 0xe626, 0xe627, + 0xe628, 0xe629, 0xe62a, 0xe62b, 0xe62c, 0xe62d, 0xe62e, 0xe62f, + 0xe630, 0xe631, 0xe632, 0xe633, 0xe634, 0xe635, 0xe636, 0xe637, + 0xe638, 0xe639, 0xe63a, 0xe63b, 0xe63c, 0xe63d, 0xe63e, 0xe63f, + 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, + 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, + 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, + 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, + 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, + 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, + 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, + 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe67f, + 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, + 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, + 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, + 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, + 0xe6a0, 0xe6a1, 0xe6a2, 0xe6a3, 0xe6a4, 0xe6a5, 0xe6a6, 0xe6a7, + 0xe6a8, 0xe6a9, 0xe6aa, 0xe6ab, 0xe6ac, 0xe6ad, 0xe6ae, 0xe6af, + 0xe6b0, 0xe6b1, 0xe6b2, 0xe6b3, 0xe6b4, 0xe6b5, 0xe6b6, 0xe6b7, + 0xe6b8, 0xe6b9, 0xe6ba, 0xe6bb, 0xe6bc, 0xe6bd, 0xe6be, 0xe6bf, + 0xe6c0, 0xe6c1, 0xe6c2, 0xe6c3, 0xe6c4, 0xe6c5, 0xe6c6, 0xe6c7, + 0xe6c8, 0xe6c9, 0xe6ca, 0xe6cb, 0xe6cc, 0xe6cd, 0xe6ce, 0xe6cf, + 0xe6d0, 0xe6d1, 0xe6d2, 0xe6d3, 0xe6d4, 0xe6d5, 0xe6d6, 0xe6d7, + 0xe6d8, 0xe6d9, 0xe6da, 0xe6db, 0xe6dc, 0xe6dd, 0xe6de, 0xe6df, + 0xe6e0, 0xe6e1, 0xe6e2, 0xe6e3, 0xe6e4, 0xe6e5, 0xe6e6, 0xe6e7, + 0xe6e8, 0xe6e9, 0xe6ea, 0xe6eb, 0xe6ec, 0xe6ed, 0xe6ee, 0xe6ef, + 0xe6f0, 0xe6f1, 0xe6f2, 0xe6f3, 0xe6f4, 0xe6f5, 0xe6f6, 0xe6f7, + 0xe6f8, 0xe6f9, 0xe6fa, 0xe6fb, 0xe6fc, 0xe6fd, 0xe6fe, 0xe6ff, + 0xe700, 0xe701, 0xe702, 0xe703, 0xe704, 0xe705, 0xe706, 0xe707, + 0xe708, 0xe709, 0xe70a, 0xe70b, 0xe70c, 0xe70d, 0xe70e, 0xe70f, + 0xe710, 0xe711, 0xe712, 0xe713, 0xe714, 0xe715, 0xe716, 0xe717, + 0xe718, 0xe719, 0xe71a, 0xe71b, 0xe71c, 0xe71d, 0xe71e, 0xe71f, + 0xe720, 0xe721, 0xe722, 0xe723, 0xe724, 0xe725, 0xe726, 0xe727, + 0xe728, 0xe729, 0xe72a, 0xe72b, 0xe72c, 0xe72d, 0xe72e, 0xe72f, + 0xe730, 0xe731, 0xe732, 0xe733, 0xe734, 0xe735, 0xe736, 0xe737, + 0xe738, 0xe739, 0xe73a, 0xe73b, 0xe73c, 0xe73d, 0xe73e, 0xe73f, + 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, + 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, + 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, + 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, + 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, + 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, + 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, + 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe77f, + 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, + 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, + 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, + 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, + 0xe7a0, 0xe7a1, 0xe7a2, 0xe7a3, 0xe7a4, 0xe7a5, 0xe7a6, 0xe7a7, + 0xe7a8, 0xe7a9, 0xe7aa, 0xe7ab, 0xe7ac, 0xe7ad, 0xe7ae, 0xe7af, + 0xe7b0, 0xe7b1, 0xe7b2, 0xe7b3, 0xe7b4, 0xe7b5, 0xe7b6, 0xe7b7, + 0xe7b8, 0xe7b9, 0xe7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xe7be, 0xe7bf, + 0xe7c0, 0xe7c1, 0xe7c2, 0xe7c3, 0xe7c4, 0xe7c5, 0xe7c6, 0xe7c7, + 0xe7c8, 0xe7c9, 0xe7ca, 0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, + 0xe7d0, 0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xe7d5, 0xe7d6, 0xe7d7, + 0xe7d8, 0xe7d9, 0xe7da, 0xe7db, 0xe7dc, 0xe7dd, 0xe7de, 0xe7df, + 0xe7e0, 0xe7e1, 0xe7e2, 0xe7e3, 0xe7e4, 0xe7e5, 0xe7e6, 0xe7e7, + 0xe7e8, 0xe7e9, 0xe7ea, 0xe7eb, 0xe7ec, 0xe7ed, 0xe7ee, 0xe7ef, + 0xe7f0, 0xe7f1, 0xe7f2, 0xe7f3, 0xe7f4, 0xe7f5, 0xe7f6, 0xe7f7, + 0xe7f8, 0xe7f9, 0xe7fa, 0xe7fb, 0xe7fc, 0xe7fd, 0xe7fe, 0xe7ff, + 0xe800, 0xe801, 0xe802, 0xe803, 0xe804, 0xe805, 0xe806, 0xe807, + 0xe808, 0xe809, 0xe80a, 0xe80b, 0xe80c, 0xe80d, 0xe80e, 0xe80f, + 0xe810, 0xe811, 0xe812, 0xe813, 0xe814, 0xe815, 0xe816, 0xe817, + 0xe818, 0xe819, 0xe81a, 0xe81b, 0xe81c, 0xe81d, 0xe81e, 0xe81f, + 0xe820, 0xe821, 0xe822, 0xe823, 0xe824, 0xe825, 0xe826, 0xe827, + 0xe828, 0xe829, 0xe82a, 0xe82b, 0xe82c, 0xe82d, 0xe82e, 0xe82f, + 0xe830, 0xe831, 0xe832, 0xe833, 0xe834, 0xe835, 0xe836, 0xe837, + 0xe838, 0xe839, 0xe83a, 0xe83b, 0xe83c, 0xe83d, 0xe83e, 0xe83f, + 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, + 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, + 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, + 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, + 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, + 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, + 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, + 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe87f, + 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, + 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, + 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, + 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, + 0xe8a0, 0xe8a1, 0xe8a2, 0xe8a3, 0xe8a4, 0xe8a5, 0xe8a6, 0xe8a7, + 0xe8a8, 0xe8a9, 0xe8aa, 0xe8ab, 0xe8ac, 0xe8ad, 0xe8ae, 0xe8af, + 0xe8b0, 0xe8b1, 0xe8b2, 0xe8b3, 0xe8b4, 0xe8b5, 0xe8b6, 0xe8b7, + 0xe8b8, 0xe8b9, 0xe8ba, 0xe8bb, 0xe8bc, 0xe8bd, 0xe8be, 0xe8bf, + 0xe8c0, 0xe8c1, 0xe8c2, 0xe8c3, 0xe8c4, 0xe8c5, 0xe8c6, 0xe8c7, + 0xe8c8, 0xe8c9, 0xe8ca, 0xe8cb, 0xe8cc, 0xe8cd, 0xe8ce, 0xe8cf, + 0xe8d0, 0xe8d1, 0xe8d2, 0xe8d3, 0xe8d4, 0xe8d5, 0xe8d6, 0xe8d7, + 0xe8d8, 0xe8d9, 0xe8da, 0xe8db, 0xe8dc, 0xe8dd, 0xe8de, 0xe8df, + 0xe8e0, 0xe8e1, 0xe8e2, 0xe8e3, 0xe8e4, 0xe8e5, 0xe8e6, 0xe8e7, + 0xe8e8, 0xe8e9, 0xe8ea, 0xe8eb, 0xe8ec, 0xe8ed, 0xe8ee, 0xe8ef, + 0xe8f0, 0xe8f1, 0xe8f2, 0xe8f3, 0xe8f4, 0xe8f5, 0xe8f6, 0xe8f7, + 0xe8f8, 0xe8f9, 0xe8fa, 0xe8fb, 0xe8fc, 0xe8fd, 0xe8fe, 0xe8ff, + 0xe900, 0xe901, 0xe902, 0xe903, 0xe904, 0xe905, 0xe906, 0xe907, + 0xe908, 0xe909, 0xe90a, 0xe90b, 0xe90c, 0xe90d, 0xe90e, 0xe90f, + 0xe910, 0xe911, 0xe912, 0xe913, 0xe914, 0xe915, 0xe916, 0xe917, + 0xe918, 0xe919, 0xe91a, 0xe91b, 0xe91c, 0xe91d, 0xe91e, 0xe91f, + 0xe920, 0xe921, 0xe922, 0xe923, 0xe924, 0xe925, 0xe926, 0xe927, + 0xe928, 0xe929, 0xe92a, 0xe92b, 0xe92c, 0xe92d, 0xe92e, 0xe92f, + 0xe930, 0xe931, 0xe932, 0xe933, 0xe934, 0xe935, 0xe936, 0xe937, + 0xe938, 0xe939, 0xe93a, 0xe93b, 0xe93c, 0xe93d, 0xe93e, 0xe93f, + 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, + 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, + 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, + 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, + 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, + 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, + 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, + 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe97f, + 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, + 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, + 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, + 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, + 0xe9a0, 0xe9a1, 0xe9a2, 0xe9a3, 0xe9a4, 0xe9a5, 0xe9a6, 0xe9a7, + 0xe9a8, 0xe9a9, 0xe9aa, 0xe9ab, 0xe9ac, 0xe9ad, 0xe9ae, 0xe9af, + 0xe9b0, 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b4, 0xe9b5, 0xe9b6, 0xe9b7, + 0xe9b8, 0xe9b9, 0xe9ba, 0xe9bb, 0xe9bc, 0xe9bd, 0xe9be, 0xe9bf, + 0xe9c0, 0xe9c1, 0xe9c2, 0xe9c3, 0xe9c4, 0xe9c5, 0xe9c6, 0xe9c7, + 0xe9c8, 0xe9c9, 0xe9ca, 0xe9cb, 0xe9cc, 0xe9cd, 0xe9ce, 0xe9cf, + 0xe9d0, 0xe9d1, 0xe9d2, 0xe9d3, 0xe9d4, 0xe9d5, 0xe9d6, 0xe9d7, + 0xe9d8, 0xe9d9, 0xe9da, 0xe9db, 0xe9dc, 0xe9dd, 0xe9de, 0xe9df, + 0xe9e0, 0xe9e1, 0xe9e2, 0xe9e3, 0xe9e4, 0xe9e5, 0xe9e6, 0xe9e7, + 0xe9e8, 0xe9e9, 0xe9ea, 0xe9eb, 0xe9ec, 0xe9ed, 0xe9ee, 0xe9ef, + 0xe9f0, 0xe9f1, 0xe9f2, 0xe9f3, 0xe9f4, 0xe9f5, 0xe9f6, 0xe9f7, + 0xe9f8, 0xe9f9, 0xe9fa, 0xe9fb, 0xe9fc, 0xe9fd, 0xe9fe, 0xe9ff, + 0xea00, 0xea01, 0xea02, 0xea03, 0xea04, 0xea05, 0xea06, 0xea07, + 0xea08, 0xea09, 0xea0a, 0xea0b, 0xea0c, 0xea0d, 0xea0e, 0xea0f, + 0xea10, 0xea11, 0xea12, 0xea13, 0xea14, 0xea15, 0xea16, 0xea17, + 0xea18, 0xea19, 0xea1a, 0xea1b, 0xea1c, 0xea1d, 0xea1e, 0xea1f, + 0xea20, 0xea21, 0xea22, 0xea23, 0xea24, 0xea25, 0xea26, 0xea27, + 0xea28, 0xea29, 0xea2a, 0xea2b, 0xea2c, 0xea2d, 0xea2e, 0xea2f, + 0xea30, 0xea31, 0xea32, 0xea33, 0xea34, 0xea35, 0xea36, 0xea37, + 0xea38, 0xea39, 0xea3a, 0xea3b, 0xea3c, 0xea3d, 0xea3e, 0xea3f, + 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, + 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, + 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, + 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, + 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, + 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, + 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, + 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea7f, + 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, + 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, + 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, + 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, + 0xeaa0, 0xeaa1, 0xeaa2, 0xeaa3, 0xeaa4, 0xeaa5, 0xeaa6, 0xeaa7, + 0xeaa8, 0xeaa9, 0xeaaa, 0xeaab, 0xeaac, 0xeaad, 0xeaae, 0xeaaf, + 0xeab0, 0xeab1, 0xeab2, 0xeab3, 0xeab4, 0xeab5, 0xeab6, 0xeab7, + 0xeab8, 0xeab9, 0xeaba, 0xeabb, 0xeabc, 0xeabd, 0xeabe, 0xeabf, + 0xeac0, 0xeac1, 0xeac2, 0xeac3, 0xeac4, 0xeac5, 0xeac6, 0xeac7, + 0xeac8, 0xeac9, 0xeaca, 0xeacb, 0xeacc, 0xeacd, 0xeace, 0xeacf, + 0xead0, 0xead1, 0xead2, 0xead3, 0xead4, 0xead5, 0xead6, 0xead7, + 0xead8, 0xead9, 0xeada, 0xeadb, 0xeadc, 0xeadd, 0xeade, 0xeadf, + 0xeae0, 0xeae1, 0xeae2, 0xeae3, 0xeae4, 0xeae5, 0xeae6, 0xeae7, + 0xeae8, 0xeae9, 0xeaea, 0xeaeb, 0xeaec, 0xeaed, 0xeaee, 0xeaef, + 0xeaf0, 0xeaf1, 0xeaf2, 0xeaf3, 0xeaf4, 0xeaf5, 0xeaf6, 0xeaf7, + 0xeaf8, 0xeaf9, 0xeafa, 0xeafb, 0xeafc, 0xeafd, 0xeafe, 0xeaff, + 0xeb00, 0xeb01, 0xeb02, 0xeb03, 0xeb04, 0xeb05, 0xeb06, 0xeb07, + 0xeb08, 0xeb09, 0xeb0a, 0xeb0b, 0xeb0c, 0xeb0d, 0xeb0e, 0xeb0f, + 0xeb10, 0xeb11, 0xeb12, 0xeb13, 0xeb14, 0xeb15, 0xeb16, 0xeb17, + 0xeb18, 0xeb19, 0xeb1a, 0xeb1b, 0xeb1c, 0xeb1d, 0xeb1e, 0xeb1f, + 0xeb20, 0xeb21, 0xeb22, 0xeb23, 0xeb24, 0xeb25, 0xeb26, 0xeb27, + 0xeb28, 0xeb29, 0xeb2a, 0xeb2b, 0xeb2c, 0xeb2d, 0xeb2e, 0xeb2f, + 0xeb30, 0xeb31, 0xeb32, 0xeb33, 0xeb34, 0xeb35, 0xeb36, 0xeb37, + 0xeb38, 0xeb39, 0xeb3a, 0xeb3b, 0xeb3c, 0xeb3d, 0xeb3e, 0xeb3f, + 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, + 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, + 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, + 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, + 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, + 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, + 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, + 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb7f, + 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, + 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, + 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, + 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, + 0xeba0, 0xeba1, 0xeba2, 0xeba3, 0xeba4, 0xeba5, 0xeba6, 0xeba7, + 0xeba8, 0xeba9, 0xebaa, 0xebab, 0xebac, 0xebad, 0xebae, 0xebaf, + 0xebb0, 0xebb1, 0xebb2, 0xebb3, 0xebb4, 0xebb5, 0xebb6, 0xebb7, + 0xebb8, 0xebb9, 0xebba, 0xebbb, 0xebbc, 0xebbd, 0xebbe, 0xebbf, + 0xebc0, 0xebc1, 0xebc2, 0xebc3, 0xebc4, 0xebc5, 0xebc6, 0xebc7, + 0xebc8, 0xebc9, 0xebca, 0xebcb, 0xebcc, 0xebcd, 0xebce, 0xebcf, + 0xebd0, 0xebd1, 0xebd2, 0xebd3, 0xebd4, 0xebd5, 0xebd6, 0xebd7, + 0xebd8, 0xebd9, 0xebda, 0xebdb, 0xebdc, 0xebdd, 0xebde, 0xebdf, + 0xebe0, 0xebe1, 0xebe2, 0xebe3, 0xebe4, 0xebe5, 0xebe6, 0xebe7, + 0xebe8, 0xebe9, 0xebea, 0xebeb, 0xebec, 0xebed, 0xebee, 0xebef, + 0xebf0, 0xebf1, 0xebf2, 0xebf3, 0xebf4, 0xebf5, 0xebf6, 0xebf7, + 0xebf8, 0xebf9, 0xebfa, 0xebfb, 0xebfc, 0xebfd, 0xebfe, 0xebff, + 0xec00, 0xec01, 0xec02, 0xec03, 0xec04, 0xec05, 0xec06, 0xec07, + 0xec08, 0xec09, 0xec0a, 0xec0b, 0xec0c, 0xec0d, 0xec0e, 0xec0f, + 0xec10, 0xec11, 0xec12, 0xec13, 0xec14, 0xec15, 0xec16, 0xec17, + 0xec18, 0xec19, 0xec1a, 0xec1b, 0xec1c, 0xec1d, 0xec1e, 0xec1f, + 0xec20, 0xec21, 0xec22, 0xec23, 0xec24, 0xec25, 0xec26, 0xec27, + 0xec28, 0xec29, 0xec2a, 0xec2b, 0xec2c, 0xec2d, 0xec2e, 0xec2f, + 0xec30, 0xec31, 0xec32, 0xec33, 0xec34, 0xec35, 0xec36, 0xec37, + 0xec38, 0xec39, 0xec3a, 0xec3b, 0xec3c, 0xec3d, 0xec3e, 0xec3f, + 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, + 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, + 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, + 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, + 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, + 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, + 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, + 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec7f, + 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, + 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, + 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, + 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, + 0xeca0, 0xeca1, 0xeca2, 0xeca3, 0xeca4, 0xeca5, 0xeca6, 0xeca7, + 0xeca8, 0xeca9, 0xecaa, 0xecab, 0xecac, 0xecad, 0xecae, 0xecaf, + 0xecb0, 0xecb1, 0xecb2, 0xecb3, 0xecb4, 0xecb5, 0xecb6, 0xecb7, + 0xecb8, 0xecb9, 0xecba, 0xecbb, 0xecbc, 0xecbd, 0xecbe, 0xecbf, + 0xecc0, 0xecc1, 0xecc2, 0xecc3, 0xecc4, 0xecc5, 0xecc6, 0xecc7, + 0xecc8, 0xecc9, 0xecca, 0xeccb, 0xeccc, 0xeccd, 0xecce, 0xeccf, + 0xecd0, 0xecd1, 0xecd2, 0xecd3, 0xecd4, 0xecd5, 0xecd6, 0xecd7, + 0xecd8, 0xecd9, 0xecda, 0xecdb, 0xecdc, 0xecdd, 0xecde, 0xecdf, + 0xece0, 0xece1, 0xece2, 0xece3, 0xece4, 0xece5, 0xece6, 0xece7, + 0xece8, 0xece9, 0xecea, 0xeceb, 0xecec, 0xeced, 0xecee, 0xecef, + 0xecf0, 0xecf1, 0xecf2, 0xecf3, 0xecf4, 0xecf5, 0xecf6, 0xecf7, + 0xecf8, 0xecf9, 0xecfa, 0xecfb, 0xecfc, 0xecfd, 0xecfe, 0xecff, + 0xed00, 0xed01, 0xed02, 0xed03, 0xed04, 0xed05, 0xed06, 0xed07, + 0xed08, 0xed09, 0xed0a, 0xed0b, 0xed0c, 0xed0d, 0xed0e, 0xed0f, + 0xed10, 0xed11, 0xed12, 0xed13, 0xed14, 0xed15, 0xed16, 0xed17, + 0xed18, 0xed19, 0xed1a, 0xed1b, 0xed1c, 0xed1d, 0xed1e, 0xed1f, + 0xed20, 0xed21, 0xed22, 0xed23, 0xed24, 0xed25, 0xed26, 0xed27, + 0xed28, 0xed29, 0xed2a, 0xed2b, 0xed2c, 0xed2d, 0xed2e, 0xed2f, + 0xed30, 0xed31, 0xed32, 0xed33, 0xed34, 0xed35, 0xed36, 0xed37, + 0xed38, 0xed39, 0xed3a, 0xed3b, 0xed3c, 0xed3d, 0xed3e, 0xed3f, + 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, + 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, + 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, + 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, + 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, + 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, + 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, + 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed7f, + 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, + 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, + 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, + 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, + 0xeda0, 0xeda1, 0xeda2, 0xeda3, 0xeda4, 0xeda5, 0xeda6, 0xeda7, + 0xeda8, 0xeda9, 0xedaa, 0xedab, 0xedac, 0xedad, 0xedae, 0xedaf, + 0xedb0, 0xedb1, 0xedb2, 0xedb3, 0xedb4, 0xedb5, 0xedb6, 0xedb7, + 0xedb8, 0xedb9, 0xedba, 0xedbb, 0xedbc, 0xedbd, 0xedbe, 0xedbf, + 0xedc0, 0xedc1, 0xedc2, 0xedc3, 0xedc4, 0xedc5, 0xedc6, 0xedc7, + 0xedc8, 0xedc9, 0xedca, 0xedcb, 0xedcc, 0xedcd, 0xedce, 0xedcf, + 0xedd0, 0xedd1, 0xedd2, 0xedd3, 0xedd4, 0xedd5, 0xedd6, 0xedd7, + 0xedd8, 0xedd9, 0xedda, 0xeddb, 0xeddc, 0xeddd, 0xedde, 0xeddf, + 0xede0, 0xede1, 0xede2, 0xede3, 0xede4, 0xede5, 0xede6, 0xede7, + 0xede8, 0xede9, 0xedea, 0xedeb, 0xedec, 0xeded, 0xedee, 0xedef, + 0xedf0, 0xedf1, 0xedf2, 0xedf3, 0xedf4, 0xedf5, 0xedf6, 0xedf7, + 0xedf8, 0xedf9, 0xedfa, 0xedfb, 0xedfc, 0xedfd, 0xedfe, 0xedff, + 0xee00, 0xee01, 0xee02, 0xee03, 0xee04, 0xee05, 0xee06, 0xee07, + 0xee08, 0xee09, 0xee0a, 0xee0b, 0xee0c, 0xee0d, 0xee0e, 0xee0f, + 0xee10, 0xee11, 0xee12, 0xee13, 0xee14, 0xee15, 0xee16, 0xee17, + 0xee18, 0xee19, 0xee1a, 0xee1b, 0xee1c, 0xee1d, 0xee1e, 0xee1f, + 0xee20, 0xee21, 0xee22, 0xee23, 0xee24, 0xee25, 0xee26, 0xee27, + 0xee28, 0xee29, 0xee2a, 0xee2b, 0xee2c, 0xee2d, 0xee2e, 0xee2f, + 0xee30, 0xee31, 0xee32, 0xee33, 0xee34, 0xee35, 0xee36, 0xee37, + 0xee38, 0xee39, 0xee3a, 0xee3b, 0xee3c, 0xee3d, 0xee3e, 0xee3f, + 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, + 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, + 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, + 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, + 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, + 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, + 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, + 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee7f, + 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, + 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, + 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, + 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, + 0xeea0, 0xeea1, 0xeea2, 0xeea3, 0xeea4, 0xeea5, 0xeea6, 0xeea7, + 0xeea8, 0xeea9, 0xeeaa, 0xeeab, 0xeeac, 0xeead, 0xeeae, 0xeeaf, + 0xeeb0, 0xeeb1, 0xeeb2, 0xeeb3, 0xeeb4, 0xeeb5, 0xeeb6, 0xeeb7, + 0xeeb8, 0xeeb9, 0xeeba, 0xeebb, 0xeebc, 0xeebd, 0xeebe, 0xeebf, + 0xeec0, 0xeec1, 0xeec2, 0xeec3, 0xeec4, 0xeec5, 0xeec6, 0xeec7, + 0xeec8, 0xeec9, 0xeeca, 0xeecb, 0xeecc, 0xeecd, 0xeece, 0xeecf, + 0xeed0, 0xeed1, 0xeed2, 0xeed3, 0xeed4, 0xeed5, 0xeed6, 0xeed7, + 0xeed8, 0xeed9, 0xeeda, 0xeedb, 0xeedc, 0xeedd, 0xeede, 0xeedf, + 0xeee0, 0xeee1, 0xeee2, 0xeee3, 0xeee4, 0xeee5, 0xeee6, 0xeee7, + 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xeeed, 0xeeee, 0xeeef, + 0xeef0, 0xeef1, 0xeef2, 0xeef3, 0xeef4, 0xeef5, 0xeef6, 0xeef7, + 0xeef8, 0xeef9, 0xeefa, 0xeefb, 0xeefc, 0xeefd, 0xeefe, 0xeeff, + 0xef00, 0xef01, 0xef02, 0xef03, 0xef04, 0xef05, 0xef06, 0xef07, + 0xef08, 0xef09, 0xef0a, 0xef0b, 0xef0c, 0xef0d, 0xef0e, 0xef0f, + 0xef10, 0xef11, 0xef12, 0xef13, 0xef14, 0xef15, 0xef16, 0xef17, + 0xef18, 0xef19, 0xef1a, 0xef1b, 0xef1c, 0xef1d, 0xef1e, 0xef1f, + 0xef20, 0xef21, 0xef22, 0xef23, 0xef24, 0xef25, 0xef26, 0xef27, + 0xef28, 0xef29, 0xef2a, 0xef2b, 0xef2c, 0xef2d, 0xef2e, 0xef2f, + 0xef30, 0xef31, 0xef32, 0xef33, 0xef34, 0xef35, 0xef36, 0xef37, + 0xef38, 0xef39, 0xef3a, 0xef3b, 0xef3c, 0xef3d, 0xef3e, 0xef3f, + 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, + 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, + 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, + 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, + 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, + 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, + 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, + 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef7f, + 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, + 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, + 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, + 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, + 0xefa0, 0xefa1, 0xefa2, 0xefa3, 0xefa4, 0xefa5, 0xefa6, 0xefa7, + 0xefa8, 0xefa9, 0xefaa, 0xefab, 0xefac, 0xefad, 0xefae, 0xefaf, + 0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefb4, 0xefb5, 0xefb6, 0xefb7, + 0xefb8, 0xefb9, 0xefba, 0xefbb, 0xefbc, 0xefbd, 0xefbe, 0xefbf, + 0xefc0, 0xefc1, 0xefc2, 0xefc3, 0xefc4, 0xefc5, 0xefc6, 0xefc7, + 0xefc8, 0xefc9, 0xefca, 0xefcb, 0xefcc, 0xefcd, 0xefce, 0xefcf, + 0xefd0, 0xefd1, 0xefd2, 0xefd3, 0xefd4, 0xefd5, 0xefd6, 0xefd7, + 0xefd8, 0xefd9, 0xefda, 0xefdb, 0xefdc, 0xefdd, 0xefde, 0xefdf, + 0xefe0, 0xefe1, 0xefe2, 0xefe3, 0xefe4, 0xefe5, 0xefe6, 0xefe7, + 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xefed, 0xefee, 0xefef, + 0xeff0, 0xeff1, 0xeff2, 0xeff3, 0xeff4, 0xeff5, 0xeff6, 0xeff7, + 0xeff8, 0xeff9, 0xeffa, 0xeffb, 0xeffc, 0xeffd, 0xeffe, 0xefff, + 0xf000, 0xf001, 0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007, + 0xf008, 0xf009, 0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f, + 0xf010, 0xf011, 0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017, + 0xf018, 0xf019, 0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, + 0xf020, 0xf021, 0xf022, 0xf023, 0xf024, 0xf025, 0xf026, 0xf027, + 0xf028, 0xf029, 0xf02a, 0xf02b, 0xf02c, 0xf02d, 0xf02e, 0xf02f, + 0xf030, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, + 0xf038, 0xf039, 0xf03a, 0xf03b, 0xf03c, 0xf03d, 0xf03e, 0xf03f, + 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, + 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, + 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, + 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, + 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, + 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, + 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, + 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf07f, + 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, + 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, + 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, + 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, + 0xf0a0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6, 0xf0a7, + 0xf0a8, 0xf0a9, 0xf0aa, 0xf0ab, 0xf0ac, 0xf0ad, 0xf0ae, 0xf0af, + 0xf0b0, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xf0b6, 0xf0b7, + 0xf0b8, 0xf0b9, 0xf0ba, 0xf0bb, 0xf0bc, 0xf0bd, 0xf0be, 0xf0bf, + 0xf0c0, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xf0c5, 0xf0c6, 0xf0c7, + 0xf0c8, 0xf0c9, 0xf0ca, 0xf0cb, 0xf0cc, 0xf0cd, 0xf0ce, 0xf0cf, + 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d7, + 0xf0d8, 0xf0d9, 0xf0da, 0xf0db, 0xf0dc, 0xf0dd, 0xf0de, 0xf0df, + 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf0e5, 0xf0e6, 0xf0e7, + 0xf0e8, 0xf0e9, 0xf0ea, 0xf0eb, 0xf0ec, 0xf0ed, 0xf0ee, 0xf0ef, + 0xf0f0, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6, 0xf0f7, + 0xf0f8, 0xf0f9, 0xf0fa, 0xf0fb, 0xf0fc, 0xf0fd, 0xf0fe, 0xf0ff, + 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, + 0xf108, 0xf109, 0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, + 0xf110, 0xf111, 0xf112, 0xf113, 0xf114, 0xf115, 0xf116, 0xf117, + 0xf118, 0xf119, 0xf11a, 0xf11b, 0xf11c, 0xf11d, 0xf11e, 0xf11f, + 0xf120, 0xf121, 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf127, + 0xf128, 0xf129, 0xf12a, 0xf12b, 0xf12c, 0xf12d, 0xf12e, 0xf12f, + 0xf130, 0xf131, 0xf132, 0xf133, 0xf134, 0xf135, 0xf136, 0xf137, + 0xf138, 0xf139, 0xf13a, 0xf13b, 0xf13c, 0xf13d, 0xf13e, 0xf13f, + 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, + 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, + 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, + 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, + 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, + 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, + 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, + 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf17f, + 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, + 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, + 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, + 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, + 0xf1a0, 0xf1a1, 0xf1a2, 0xf1a3, 0xf1a4, 0xf1a5, 0xf1a6, 0xf1a7, + 0xf1a8, 0xf1a9, 0xf1aa, 0xf1ab, 0xf1ac, 0xf1ad, 0xf1ae, 0xf1af, + 0xf1b0, 0xf1b1, 0xf1b2, 0xf1b3, 0xf1b4, 0xf1b5, 0xf1b6, 0xf1b7, + 0xf1b8, 0xf1b9, 0xf1ba, 0xf1bb, 0xf1bc, 0xf1bd, 0xf1be, 0xf1bf, + 0xf1c0, 0xf1c1, 0xf1c2, 0xf1c3, 0xf1c4, 0xf1c5, 0xf1c6, 0xf1c7, + 0xf1c8, 0xf1c9, 0xf1ca, 0xf1cb, 0xf1cc, 0xf1cd, 0xf1ce, 0xf1cf, + 0xf1d0, 0xf1d1, 0xf1d2, 0xf1d3, 0xf1d4, 0xf1d5, 0xf1d6, 0xf1d7, + 0xf1d8, 0xf1d9, 0xf1da, 0xf1db, 0xf1dc, 0xf1dd, 0xf1de, 0xf1df, + 0xf1e0, 0xf1e1, 0xf1e2, 0xf1e3, 0xf1e4, 0xf1e5, 0xf1e6, 0xf1e7, + 0xf1e8, 0xf1e9, 0xf1ea, 0xf1eb, 0xf1ec, 0xf1ed, 0xf1ee, 0xf1ef, + 0xf1f0, 0xf1f1, 0xf1f2, 0xf1f3, 0xf1f4, 0xf1f5, 0xf1f6, 0xf1f7, + 0xf1f8, 0xf1f9, 0xf1fa, 0xf1fb, 0xf1fc, 0xf1fd, 0xf1fe, 0xf1ff, + 0xf200, 0xf201, 0xf202, 0xf203, 0xf204, 0xf205, 0xf206, 0xf207, + 0xf208, 0xf209, 0xf20a, 0xf20b, 0xf20c, 0xf20d, 0xf20e, 0xf20f, + 0xf210, 0xf211, 0xf212, 0xf213, 0xf214, 0xf215, 0xf216, 0xf217, + 0xf218, 0xf219, 0xf21a, 0xf21b, 0xf21c, 0xf21d, 0xf21e, 0xf21f, + 0xf220, 0xf221, 0xf222, 0xf223, 0xf224, 0xf225, 0xf226, 0xf227, + 0xf228, 0xf229, 0xf22a, 0xf22b, 0xf22c, 0xf22d, 0xf22e, 0xf22f, + 0xf230, 0xf231, 0xf232, 0xf233, 0xf234, 0xf235, 0xf236, 0xf237, + 0xf238, 0xf239, 0xf23a, 0xf23b, 0xf23c, 0xf23d, 0xf23e, 0xf23f, + 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, + 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, + 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, + 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, + 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, + 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, + 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, + 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf27f, + 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, + 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, + 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, + 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, + 0xf2a0, 0xf2a1, 0xf2a2, 0xf2a3, 0xf2a4, 0xf2a5, 0xf2a6, 0xf2a7, + 0xf2a8, 0xf2a9, 0xf2aa, 0xf2ab, 0xf2ac, 0xf2ad, 0xf2ae, 0xf2af, + 0xf2b0, 0xf2b1, 0xf2b2, 0xf2b3, 0xf2b4, 0xf2b5, 0xf2b6, 0xf2b7, + 0xf2b8, 0xf2b9, 0xf2ba, 0xf2bb, 0xf2bc, 0xf2bd, 0xf2be, 0xf2bf, + 0xf2c0, 0xf2c1, 0xf2c2, 0xf2c3, 0xf2c4, 0xf2c5, 0xf2c6, 0xf2c7, + 0xf2c8, 0xf2c9, 0xf2ca, 0xf2cb, 0xf2cc, 0xf2cd, 0xf2ce, 0xf2cf, + 0xf2d0, 0xf2d1, 0xf2d2, 0xf2d3, 0xf2d4, 0xf2d5, 0xf2d6, 0xf2d7, + 0xf2d8, 0xf2d9, 0xf2da, 0xf2db, 0xf2dc, 0xf2dd, 0xf2de, 0xf2df, + 0xf2e0, 0xf2e1, 0xf2e2, 0xf2e3, 0xf2e4, 0xf2e5, 0xf2e6, 0xf2e7, + 0xf2e8, 0xf2e9, 0xf2ea, 0xf2eb, 0xf2ec, 0xf2ed, 0xf2ee, 0xf2ef, + 0xf2f0, 0xf2f1, 0xf2f2, 0xf2f3, 0xf2f4, 0xf2f5, 0xf2f6, 0xf2f7, + 0xf2f8, 0xf2f9, 0xf2fa, 0xf2fb, 0xf2fc, 0xf2fd, 0xf2fe, 0xf2ff, + 0xf300, 0xf301, 0xf302, 0xf303, 0xf304, 0xf305, 0xf306, 0xf307, + 0xf308, 0xf309, 0xf30a, 0xf30b, 0xf30c, 0xf30d, 0xf30e, 0xf30f, + 0xf310, 0xf311, 0xf312, 0xf313, 0xf314, 0xf315, 0xf316, 0xf317, + 0xf318, 0xf319, 0xf31a, 0xf31b, 0xf31c, 0xf31d, 0xf31e, 0xf31f, + 0xf320, 0xf321, 0xf322, 0xf323, 0xf324, 0xf325, 0xf326, 0xf327, + 0xf328, 0xf329, 0xf32a, 0xf32b, 0xf32c, 0xf32d, 0xf32e, 0xf32f, + 0xf330, 0xf331, 0xf332, 0xf333, 0xf334, 0xf335, 0xf336, 0xf337, + 0xf338, 0xf339, 0xf33a, 0xf33b, 0xf33c, 0xf33d, 0xf33e, 0xf33f, + 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, + 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, + 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, + 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, + 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, + 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, + 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, + 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf37f, + 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, + 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, + 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, + 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, + 0xf3a0, 0xf3a1, 0xf3a2, 0xf3a3, 0xf3a4, 0xf3a5, 0xf3a6, 0xf3a7, + 0xf3a8, 0xf3a9, 0xf3aa, 0xf3ab, 0xf3ac, 0xf3ad, 0xf3ae, 0xf3af, + 0xf3b0, 0xf3b1, 0xf3b2, 0xf3b3, 0xf3b4, 0xf3b5, 0xf3b6, 0xf3b7, + 0xf3b8, 0xf3b9, 0xf3ba, 0xf3bb, 0xf3bc, 0xf3bd, 0xf3be, 0xf3bf, + 0xf3c0, 0xf3c1, 0xf3c2, 0xf3c3, 0xf3c4, 0xf3c5, 0xf3c6, 0xf3c7, + 0xf3c8, 0xf3c9, 0xf3ca, 0xf3cb, 0xf3cc, 0xf3cd, 0xf3ce, 0xf3cf, + 0xf3d0, 0xf3d1, 0xf3d2, 0xf3d3, 0xf3d4, 0xf3d5, 0xf3d6, 0xf3d7, + 0xf3d8, 0xf3d9, 0xf3da, 0xf3db, 0xf3dc, 0xf3dd, 0xf3de, 0xf3df, + 0xf3e0, 0xf3e1, 0xf3e2, 0xf3e3, 0xf3e4, 0xf3e5, 0xf3e6, 0xf3e7, + 0xf3e8, 0xf3e9, 0xf3ea, 0xf3eb, 0xf3ec, 0xf3ed, 0xf3ee, 0xf3ef, + 0xf3f0, 0xf3f1, 0xf3f2, 0xf3f3, 0xf3f4, 0xf3f5, 0xf3f6, 0xf3f7, + 0xf3f8, 0xf3f9, 0xf3fa, 0xf3fb, 0xf3fc, 0xf3fd, 0xf3fe, 0xf3ff, + 0xf400, 0xf401, 0xf402, 0xf403, 0xf404, 0xf405, 0xf406, 0xf407, + 0xf408, 0xf409, 0xf40a, 0xf40b, 0xf40c, 0xf40d, 0xf40e, 0xf40f, + 0xf410, 0xf411, 0xf412, 0xf413, 0xf414, 0xf415, 0xf416, 0xf417, + 0xf418, 0xf419, 0xf41a, 0xf41b, 0xf41c, 0xf41d, 0xf41e, 0xf41f, + 0xf420, 0xf421, 0xf422, 0xf423, 0xf424, 0xf425, 0xf426, 0xf427, + 0xf428, 0xf429, 0xf42a, 0xf42b, 0xf42c, 0xf42d, 0xf42e, 0xf42f, + 0xf430, 0xf431, 0xf432, 0xf433, 0xf434, 0xf435, 0xf436, 0xf437, + 0xf438, 0xf439, 0xf43a, 0xf43b, 0xf43c, 0xf43d, 0xf43e, 0xf43f, + 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, + 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, + 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, + 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, + 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, + 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, + 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, + 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf47f, + 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, + 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, + 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, + 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, + 0xf4a0, 0xf4a1, 0xf4a2, 0xf4a3, 0xf4a4, 0xf4a5, 0xf4a6, 0xf4a7, + 0xf4a8, 0xf4a9, 0xf4aa, 0xf4ab, 0xf4ac, 0xf4ad, 0xf4ae, 0xf4af, + 0xf4b0, 0xf4b1, 0xf4b2, 0xf4b3, 0xf4b4, 0xf4b5, 0xf4b6, 0xf4b7, + 0xf4b8, 0xf4b9, 0xf4ba, 0xf4bb, 0xf4bc, 0xf4bd, 0xf4be, 0xf4bf, + 0xf4c0, 0xf4c1, 0xf4c2, 0xf4c3, 0xf4c4, 0xf4c5, 0xf4c6, 0xf4c7, + 0xf4c8, 0xf4c9, 0xf4ca, 0xf4cb, 0xf4cc, 0xf4cd, 0xf4ce, 0xf4cf, + 0xf4d0, 0xf4d1, 0xf4d2, 0xf4d3, 0xf4d4, 0xf4d5, 0xf4d6, 0xf4d7, + 0xf4d8, 0xf4d9, 0xf4da, 0xf4db, 0xf4dc, 0xf4dd, 0xf4de, 0xf4df, + 0xf4e0, 0xf4e1, 0xf4e2, 0xf4e3, 0xf4e4, 0xf4e5, 0xf4e6, 0xf4e7, + 0xf4e8, 0xf4e9, 0xf4ea, 0xf4eb, 0xf4ec, 0xf4ed, 0xf4ee, 0xf4ef, + 0xf4f0, 0xf4f1, 0xf4f2, 0xf4f3, 0xf4f4, 0xf4f5, 0xf4f6, 0xf4f7, + 0xf4f8, 0xf4f9, 0xf4fa, 0xf4fb, 0xf4fc, 0xf4fd, 0xf4fe, 0xf4ff, + 0xf500, 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, + 0xf508, 0xf509, 0xf50a, 0xf50b, 0xf50c, 0xf50d, 0xf50e, 0xf50f, + 0xf510, 0xf511, 0xf512, 0xf513, 0xf514, 0xf515, 0xf516, 0xf517, + 0xf518, 0xf519, 0xf51a, 0xf51b, 0xf51c, 0xf51d, 0xf51e, 0xf51f, + 0xf520, 0xf521, 0xf522, 0xf523, 0xf524, 0xf525, 0xf526, 0xf527, + 0xf528, 0xf529, 0xf52a, 0xf52b, 0xf52c, 0xf52d, 0xf52e, 0xf52f, + 0xf530, 0xf531, 0xf532, 0xf533, 0xf534, 0xf535, 0xf536, 0xf537, + 0xf538, 0xf539, 0xf53a, 0xf53b, 0xf53c, 0xf53d, 0xf53e, 0xf53f, + 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, + 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, + 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, + 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, + 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, + 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, + 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, + 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf57f, + 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, + 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, + 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, + 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, + 0xf5a0, 0xf5a1, 0xf5a2, 0xf5a3, 0xf5a4, 0xf5a5, 0xf5a6, 0xf5a7, + 0xf5a8, 0xf5a9, 0xf5aa, 0xf5ab, 0xf5ac, 0xf5ad, 0xf5ae, 0xf5af, + 0xf5b0, 0xf5b1, 0xf5b2, 0xf5b3, 0xf5b4, 0xf5b5, 0xf5b6, 0xf5b7, + 0xf5b8, 0xf5b9, 0xf5ba, 0xf5bb, 0xf5bc, 0xf5bd, 0xf5be, 0xf5bf, + 0xf5c0, 0xf5c1, 0xf5c2, 0xf5c3, 0xf5c4, 0xf5c5, 0xf5c6, 0xf5c7, + 0xf5c8, 0xf5c9, 0xf5ca, 0xf5cb, 0xf5cc, 0xf5cd, 0xf5ce, 0xf5cf, + 0xf5d0, 0xf5d1, 0xf5d2, 0xf5d3, 0xf5d4, 0xf5d5, 0xf5d6, 0xf5d7, + 0xf5d8, 0xf5d9, 0xf5da, 0xf5db, 0xf5dc, 0xf5dd, 0xf5de, 0xf5df, + 0xf5e0, 0xf5e1, 0xf5e2, 0xf5e3, 0xf5e4, 0xf5e5, 0xf5e6, 0xf5e7, + 0xf5e8, 0xf5e9, 0xf5ea, 0xf5eb, 0xf5ec, 0xf5ed, 0xf5ee, 0xf5ef, + 0xf5f0, 0xf5f1, 0xf5f2, 0xf5f3, 0xf5f4, 0xf5f5, 0xf5f6, 0xf5f7, + 0xf5f8, 0xf5f9, 0xf5fa, 0xf5fb, 0xf5fc, 0xf5fd, 0xf5fe, 0xf5ff, + 0xf600, 0xf601, 0xf602, 0xf603, 0xf604, 0xf605, 0xf606, 0xf607, + 0xf608, 0xf609, 0xf60a, 0xf60b, 0xf60c, 0xf60d, 0xf60e, 0xf60f, + 0xf610, 0xf611, 0xf612, 0xf613, 0xf614, 0xf615, 0xf616, 0xf617, + 0xf618, 0xf619, 0xf61a, 0xf61b, 0xf61c, 0xf61d, 0xf61e, 0xf61f, + 0xf620, 0xf621, 0xf622, 0xf623, 0xf624, 0xf625, 0xf626, 0xf627, + 0xf628, 0xf629, 0xf62a, 0xf62b, 0xf62c, 0xf62d, 0xf62e, 0xf62f, + 0xf630, 0xf631, 0xf632, 0xf633, 0xf634, 0xf635, 0xf636, 0xf637, + 0xf638, 0xf639, 0xf63a, 0xf63b, 0xf63c, 0xf63d, 0xf63e, 0xf63f, + 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, + 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, + 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, + 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, + 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, + 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, + 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, + 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf67f, + 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, + 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, + 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, + 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, + 0xf6a0, 0xf6a1, 0xf6a2, 0xf6a3, 0xf6a4, 0xf6a5, 0xf6a6, 0xf6a7, + 0xf6a8, 0xf6a9, 0xf6aa, 0xf6ab, 0xf6ac, 0xf6ad, 0xf6ae, 0xf6af, + 0xf6b0, 0xf6b1, 0xf6b2, 0xf6b3, 0xf6b4, 0xf6b5, 0xf6b6, 0xf6b7, + 0xf6b8, 0xf6b9, 0xf6ba, 0xf6bb, 0xf6bc, 0xf6bd, 0xf6be, 0xf6bf, + 0xf6c0, 0xf6c1, 0xf6c2, 0xf6c3, 0xf6c4, 0xf6c5, 0xf6c6, 0xf6c7, + 0xf6c8, 0xf6c9, 0xf6ca, 0xf6cb, 0xf6cc, 0xf6cd, 0xf6ce, 0xf6cf, + 0xf6d0, 0xf6d1, 0xf6d2, 0xf6d3, 0xf6d4, 0xf6d5, 0xf6d6, 0xf6d7, + 0xf6d8, 0xf6d9, 0xf6da, 0xf6db, 0xf6dc, 0xf6dd, 0xf6de, 0xf6df, + 0xf6e0, 0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xf6e5, 0xf6e6, 0xf6e7, + 0xf6e8, 0xf6e9, 0xf6ea, 0xf6eb, 0xf6ec, 0xf6ed, 0xf6ee, 0xf6ef, + 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4, 0xf6f5, 0xf6f6, 0xf6f7, + 0xf6f8, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc, 0xf6fd, 0xf6fe, 0xf6ff, + 0xf700, 0xf701, 0xf702, 0xf703, 0xf704, 0xf705, 0xf706, 0xf707, + 0xf708, 0xf709, 0xf70a, 0xf70b, 0xf70c, 0xf70d, 0xf70e, 0xf70f, + 0xf710, 0xf711, 0xf712, 0xf713, 0xf714, 0xf715, 0xf716, 0xf717, + 0xf718, 0xf719, 0xf71a, 0xf71b, 0xf71c, 0xf71d, 0xf71e, 0xf71f, + 0xf720, 0xf721, 0xf722, 0xf723, 0xf724, 0xf725, 0xf726, 0xf727, + 0xf728, 0xf729, 0xf72a, 0xf72b, 0xf72c, 0xf72d, 0xf72e, 0xf72f, + 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, + 0xf738, 0xf739, 0xf73a, 0xf73b, 0xf73c, 0xf73d, 0xf73e, 0xf73f, + 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, + 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, + 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, + 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, + 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, + 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, + 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, + 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf77f, + 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, + 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, + 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, + 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, + 0xf7a0, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4, 0xf7a5, 0xf7a6, 0xf7a7, + 0xf7a8, 0xf7a9, 0xf7aa, 0xf7ab, 0xf7ac, 0xf7ad, 0xf7ae, 0xf7af, + 0xf7b0, 0xf7b1, 0xf7b2, 0xf7b3, 0xf7b4, 0xf7b5, 0xf7b6, 0xf7b7, + 0xf7b8, 0xf7b9, 0xf7ba, 0xf7bb, 0xf7bc, 0xf7bd, 0xf7be, 0xf7bf, + 0xf7c0, 0xf7c1, 0xf7c2, 0xf7c3, 0xf7c4, 0xf7c5, 0xf7c6, 0xf7c7, + 0xf7c8, 0xf7c9, 0xf7ca, 0xf7cb, 0xf7cc, 0xf7cd, 0xf7ce, 0xf7cf, + 0xf7d0, 0xf7d1, 0xf7d2, 0xf7d3, 0xf7d4, 0xf7d5, 0xf7d6, 0xf7d7, + 0xf7d8, 0xf7d9, 0xf7da, 0xf7db, 0xf7dc, 0xf7dd, 0xf7de, 0xf7df, + 0xf7e0, 0xf7e1, 0xf7e2, 0xf7e3, 0xf7e4, 0xf7e5, 0xf7e6, 0xf7e7, + 0xf7e8, 0xf7e9, 0xf7ea, 0xf7eb, 0xf7ec, 0xf7ed, 0xf7ee, 0xf7ef, + 0xf7f0, 0xf7f1, 0xf7f2, 0xf7f3, 0xf7f4, 0xf7f5, 0xf7f6, 0xf7f7, + 0xf7f8, 0xf7f9, 0xf7fa, 0xf7fb, 0xf7fc, 0xf7fd, 0xf7fe, 0xf7ff, + 0xf800, 0xf801, 0xf802, 0xf803, 0xf804, 0xf805, 0xf806, 0xf807, + 0xf808, 0xf809, 0xf80a, 0xf80b, 0xf80c, 0xf80d, 0xf80e, 0xf80f, + 0xf810, 0xf811, 0xf812, 0xf813, 0xf814, 0xf815, 0xf816, 0xf817, + 0xf818, 0xf819, 0xf81a, 0xf81b, 0xf81c, 0xf81d, 0xf81e, 0xf81f, + 0xf820, 0xf821, 0xf822, 0xf823, 0xf824, 0xf825, 0xf826, 0xf827, + 0xf828, 0xf829, 0xf82a, 0xf82b, 0xf82c, 0xf82d, 0xf82e, 0xf82f, + 0xf830, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, 0xf837, + 0xf838, 0xf839, 0xf83a, 0xf83b, 0xf83c, 0xf83d, 0xf83e, 0xf83f, + 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, + 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, + 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, + 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, + 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, + 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, + 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, + 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf87f, + 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, + 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, + 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, + 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, + 0xf8a0, 0xf8a1, 0xf8a2, 0xf8a3, 0xf8a4, 0xf8a5, 0xf8a6, 0xf8a7, + 0xf8a8, 0xf8a9, 0xf8aa, 0xf8ab, 0xf8ac, 0xf8ad, 0xf8ae, 0xf8af, + 0xf8b0, 0xf8b1, 0xf8b2, 0xf8b3, 0xf8b4, 0xf8b5, 0xf8b6, 0xf8b7, + 0xf8b8, 0xf8b9, 0xf8ba, 0xf8bb, 0xf8bc, 0xf8bd, 0xf8be, 0xf8bf, + 0xf8c0, 0xf8c1, 0xf8c2, 0xf8c3, 0xf8c4, 0xf8c5, 0xf8c6, 0xf8c7, + 0xf8c8, 0xf8c9, 0xf8ca, 0xf8cb, 0xf8cc, 0xf8cd, 0xf8ce, 0xf8cf, + 0xf8d0, 0xf8d1, 0xf8d2, 0xf8d3, 0xf8d4, 0xf8d5, 0xf8d6, 0xf8d7, + 0xf8d8, 0xf8d9, 0xf8da, 0xf8db, 0xf8dc, 0xf8dd, 0xf8de, 0xf8df, + 0xf8e0, 0xf8e1, 0xf8e2, 0xf8e3, 0xf8e4, 0xf8e5, 0xf8e6, 0xf8e7, + 0xf8e8, 0xf8e9, 0xf8ea, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, + 0xf8f0, 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8f5, 0xf8f6, 0xf8f7, + 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0xf8ff, + 0xf900, 0xf901, 0xf902, 0xf903, 0xf904, 0xf905, 0xf906, 0xf907, + 0xf908, 0xf909, 0xf90a, 0xf90b, 0xf90c, 0xf90d, 0xf90e, 0xf90f, + 0xf910, 0xf911, 0xf912, 0xf913, 0xf914, 0xf915, 0xf916, 0xf917, + 0xf918, 0xf919, 0xf91a, 0xf91b, 0xf91c, 0xf91d, 0xf91e, 0xf91f, + 0xf920, 0xf921, 0xf922, 0xf923, 0xf924, 0xf925, 0xf926, 0xf927, + 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0xf92d, 0xf92e, 0xf92f, + 0xf930, 0xf931, 0xf932, 0xf933, 0xf934, 0xf935, 0xf936, 0xf937, + 0xf938, 0xf939, 0xf93a, 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, + 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, + 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, + 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, + 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, + 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, + 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, + 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, + 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf97f, + 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, + 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, + 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, + 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, + 0xf9a0, 0xf9a1, 0xf9a2, 0xf9a3, 0xf9a4, 0xf9a5, 0xf9a6, 0xf9a7, + 0xf9a8, 0xf9a9, 0xf9aa, 0xf9ab, 0xf9ac, 0xf9ad, 0xf9ae, 0xf9af, + 0xf9b0, 0xf9b1, 0xf9b2, 0xf9b3, 0xf9b4, 0xf9b5, 0xf9b6, 0xf9b7, + 0xf9b8, 0xf9b9, 0xf9ba, 0xf9bb, 0xf9bc, 0xf9bd, 0xf9be, 0xf9bf, + 0xf9c0, 0xf9c1, 0xf9c2, 0xf9c3, 0xf9c4, 0xf9c5, 0xf9c6, 0xf9c7, + 0xf9c8, 0xf9c9, 0xf9ca, 0xf9cb, 0xf9cc, 0xf9cd, 0xf9ce, 0xf9cf, + 0xf9d0, 0xf9d1, 0xf9d2, 0xf9d3, 0xf9d4, 0xf9d5, 0xf9d6, 0xf9d7, + 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0xf9dc, 0xf9dd, 0xf9de, 0xf9df, + 0xf9e0, 0xf9e1, 0xf9e2, 0xf9e3, 0xf9e4, 0xf9e5, 0xf9e6, 0xf9e7, + 0xf9e8, 0xf9e9, 0xf9ea, 0xf9eb, 0xf9ec, 0xf9ed, 0xf9ee, 0xf9ef, + 0xf9f0, 0xf9f1, 0xf9f2, 0xf9f3, 0xf9f4, 0xf9f5, 0xf9f6, 0xf9f7, + 0xf9f8, 0xf9f9, 0xf9fa, 0xf9fb, 0xf9fc, 0xf9fd, 0xf9fe, 0xf9ff, + 0xfa00, 0xfa01, 0xfa02, 0xfa03, 0xfa04, 0xfa05, 0xfa06, 0xfa07, + 0xfa08, 0xfa09, 0xfa0a, 0xfa0b, 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, + 0xfa10, 0xfa11, 0xfa12, 0xfa13, 0xfa14, 0xfa15, 0xfa16, 0xfa17, + 0xfa18, 0xfa19, 0xfa1a, 0xfa1b, 0xfa1c, 0xfa1d, 0xfa1e, 0xfa1f, + 0xfa20, 0xfa21, 0xfa22, 0xfa23, 0xfa24, 0xfa25, 0xfa26, 0xfa27, + 0xfa28, 0xfa29, 0xfa2a, 0xfa2b, 0xfa2c, 0xfa2d, 0xfa2e, 0xfa2f, + 0xfa30, 0xfa31, 0xfa32, 0xfa33, 0xfa34, 0xfa35, 0xfa36, 0xfa37, + 0xfa38, 0xfa39, 0xfa3a, 0xfa3b, 0xfa3c, 0xfa3d, 0xfa3e, 0xfa3f, + 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, + 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, + 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, + 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, + 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, + 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, + 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, + 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa7f, + 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, + 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, + 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, + 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, + 0xfaa0, 0xfaa1, 0xfaa2, 0xfaa3, 0xfaa4, 0xfaa5, 0xfaa6, 0xfaa7, + 0xfaa8, 0xfaa9, 0xfaaa, 0xfaab, 0xfaac, 0xfaad, 0xfaae, 0xfaaf, + 0xfab0, 0xfab1, 0xfab2, 0xfab3, 0xfab4, 0xfab5, 0xfab6, 0xfab7, + 0xfab8, 0xfab9, 0xfaba, 0xfabb, 0xfabc, 0xfabd, 0xfabe, 0xfabf, + 0xfac0, 0xfac1, 0xfac2, 0xfac3, 0xfac4, 0xfac5, 0xfac6, 0xfac7, + 0xfac8, 0xfac9, 0xfaca, 0xfacb, 0xfacc, 0xfacd, 0xface, 0xfacf, + 0xfad0, 0xfad1, 0xfad2, 0xfad3, 0xfad4, 0xfad5, 0xfad6, 0xfad7, + 0xfad8, 0xfad9, 0xfada, 0xfadb, 0xfadc, 0xfadd, 0xfade, 0xfadf, + 0xfae0, 0xfae1, 0xfae2, 0xfae3, 0xfae4, 0xfae5, 0xfae6, 0xfae7, + 0xfae8, 0xfae9, 0xfaea, 0xfaeb, 0xfaec, 0xfaed, 0xfaee, 0xfaef, + 0xfaf0, 0xfaf1, 0xfaf2, 0xfaf3, 0xfaf4, 0xfaf5, 0xfaf6, 0xfaf7, + 0xfaf8, 0xfaf9, 0xfafa, 0xfafb, 0xfafc, 0xfafd, 0xfafe, 0xfaff, + 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04, 0xfb05, 0xfb06, 0xfb07, + 0xfb08, 0xfb09, 0xfb0a, 0xfb0b, 0xfb0c, 0xfb0d, 0xfb0e, 0xfb0f, + 0xfb10, 0xfb11, 0xfb12, 0xfb13, 0xfb14, 0xfb15, 0xfb16, 0xfb17, + 0xfb18, 0xfb19, 0xfb1a, 0xfb1b, 0xfb1c, 0xfb1d, 0xfb1e, 0xfb1f, + 0xfb20, 0xfb21, 0xfb22, 0xfb23, 0xfb24, 0xfb25, 0xfb26, 0xfb27, + 0xfb28, 0xfb29, 0xfb2a, 0xfb2b, 0xfb2c, 0xfb2d, 0xfb2e, 0xfb2f, + 0xfb30, 0xfb31, 0xfb32, 0xfb33, 0xfb34, 0xfb35, 0xfb36, 0xfb37, + 0xfb38, 0xfb39, 0xfb3a, 0xfb3b, 0xfb3c, 0xfb3d, 0xfb3e, 0xfb3f, + 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, + 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, + 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, + 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, + 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, + 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, + 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, + 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb7f, + 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, + 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, + 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, + 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, + 0xfba0, 0xfba1, 0xfba2, 0xfba3, 0xfba4, 0xfba5, 0xfba6, 0xfba7, + 0xfba8, 0xfba9, 0xfbaa, 0xfbab, 0xfbac, 0xfbad, 0xfbae, 0xfbaf, + 0xfbb0, 0xfbb1, 0xfbb2, 0xfbb3, 0xfbb4, 0xfbb5, 0xfbb6, 0xfbb7, + 0xfbb8, 0xfbb9, 0xfbba, 0xfbbb, 0xfbbc, 0xfbbd, 0xfbbe, 0xfbbf, + 0xfbc0, 0xfbc1, 0xfbc2, 0xfbc3, 0xfbc4, 0xfbc5, 0xfbc6, 0xfbc7, + 0xfbc8, 0xfbc9, 0xfbca, 0xfbcb, 0xfbcc, 0xfbcd, 0xfbce, 0xfbcf, + 0xfbd0, 0xfbd1, 0xfbd2, 0xfbd3, 0xfbd4, 0xfbd5, 0xfbd6, 0xfbd7, + 0xfbd8, 0xfbd9, 0xfbda, 0xfbdb, 0xfbdc, 0xfbdd, 0xfbde, 0xfbdf, + 0xfbe0, 0xfbe1, 0xfbe2, 0xfbe3, 0xfbe4, 0xfbe5, 0xfbe6, 0xfbe7, + 0xfbe8, 0xfbe9, 0xfbea, 0xfbeb, 0xfbec, 0xfbed, 0xfbee, 0xfbef, + 0xfbf0, 0xfbf1, 0xfbf2, 0xfbf3, 0xfbf4, 0xfbf5, 0xfbf6, 0xfbf7, + 0xfbf8, 0xfbf9, 0xfbfa, 0xfbfb, 0xfbfc, 0xfbfd, 0xfbfe, 0xfbff, + 0xfc00, 0xfc01, 0xfc02, 0xfc03, 0xfc04, 0xfc05, 0xfc06, 0xfc07, + 0xfc08, 0xfc09, 0xfc0a, 0xfc0b, 0xfc0c, 0xfc0d, 0xfc0e, 0xfc0f, + 0xfc10, 0xfc11, 0xfc12, 0xfc13, 0xfc14, 0xfc15, 0xfc16, 0xfc17, + 0xfc18, 0xfc19, 0xfc1a, 0xfc1b, 0xfc1c, 0xfc1d, 0xfc1e, 0xfc1f, + 0xfc20, 0xfc21, 0xfc22, 0xfc23, 0xfc24, 0xfc25, 0xfc26, 0xfc27, + 0xfc28, 0xfc29, 0xfc2a, 0xfc2b, 0xfc2c, 0xfc2d, 0xfc2e, 0xfc2f, + 0xfc30, 0xfc31, 0xfc32, 0xfc33, 0xfc34, 0xfc35, 0xfc36, 0xfc37, + 0xfc38, 0xfc39, 0xfc3a, 0xfc3b, 0xfc3c, 0xfc3d, 0xfc3e, 0xfc3f, + 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, + 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, + 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, + 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, + 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, + 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, + 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, + 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc7f, + 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, + 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, + 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, + 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, + 0xfca0, 0xfca1, 0xfca2, 0xfca3, 0xfca4, 0xfca5, 0xfca6, 0xfca7, + 0xfca8, 0xfca9, 0xfcaa, 0xfcab, 0xfcac, 0xfcad, 0xfcae, 0xfcaf, + 0xfcb0, 0xfcb1, 0xfcb2, 0xfcb3, 0xfcb4, 0xfcb5, 0xfcb6, 0xfcb7, + 0xfcb8, 0xfcb9, 0xfcba, 0xfcbb, 0xfcbc, 0xfcbd, 0xfcbe, 0xfcbf, + 0xfcc0, 0xfcc1, 0xfcc2, 0xfcc3, 0xfcc4, 0xfcc5, 0xfcc6, 0xfcc7, + 0xfcc8, 0xfcc9, 0xfcca, 0xfccb, 0xfccc, 0xfccd, 0xfcce, 0xfccf, + 0xfcd0, 0xfcd1, 0xfcd2, 0xfcd3, 0xfcd4, 0xfcd5, 0xfcd6, 0xfcd7, + 0xfcd8, 0xfcd9, 0xfcda, 0xfcdb, 0xfcdc, 0xfcdd, 0xfcde, 0xfcdf, + 0xfce0, 0xfce1, 0xfce2, 0xfce3, 0xfce4, 0xfce5, 0xfce6, 0xfce7, + 0xfce8, 0xfce9, 0xfcea, 0xfceb, 0xfcec, 0xfced, 0xfcee, 0xfcef, + 0xfcf0, 0xfcf1, 0xfcf2, 0xfcf3, 0xfcf4, 0xfcf5, 0xfcf6, 0xfcf7, + 0xfcf8, 0xfcf9, 0xfcfa, 0xfcfb, 0xfcfc, 0xfcfd, 0xfcfe, 0xfcff, + 0xfd00, 0xfd01, 0xfd02, 0xfd03, 0xfd04, 0xfd05, 0xfd06, 0xfd07, + 0xfd08, 0xfd09, 0xfd0a, 0xfd0b, 0xfd0c, 0xfd0d, 0xfd0e, 0xfd0f, + 0xfd10, 0xfd11, 0xfd12, 0xfd13, 0xfd14, 0xfd15, 0xfd16, 0xfd17, + 0xfd18, 0xfd19, 0xfd1a, 0xfd1b, 0xfd1c, 0xfd1d, 0xfd1e, 0xfd1f, + 0xfd20, 0xfd21, 0xfd22, 0xfd23, 0xfd24, 0xfd25, 0xfd26, 0xfd27, + 0xfd28, 0xfd29, 0xfd2a, 0xfd2b, 0xfd2c, 0xfd2d, 0xfd2e, 0xfd2f, + 0xfd30, 0xfd31, 0xfd32, 0xfd33, 0xfd34, 0xfd35, 0xfd36, 0xfd37, + 0xfd38, 0xfd39, 0xfd3a, 0xfd3b, 0xfd3c, 0xfd3d, 0xfd3e, 0xfd3f, + 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, + 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, + 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, + 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, + 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, + 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, + 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, + 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd7f, + 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, + 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, + 0xfd90, 0xfd91, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, + 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, + 0xfda0, 0xfda1, 0xfda2, 0xfda3, 0xfda4, 0xfda5, 0xfda6, 0xfda7, + 0xfda8, 0xfda9, 0xfdaa, 0xfdab, 0xfdac, 0xfdad, 0xfdae, 0xfdaf, + 0xfdb0, 0xfdb1, 0xfdb2, 0xfdb3, 0xfdb4, 0xfdb5, 0xfdb6, 0xfdb7, + 0xfdb8, 0xfdb9, 0xfdba, 0xfdbb, 0xfdbc, 0xfdbd, 0xfdbe, 0xfdbf, + 0xfdc0, 0xfdc1, 0xfdc2, 0xfdc3, 0xfdc4, 0xfdc5, 0xfdc6, 0xfdc7, + 0xfdc8, 0xfdc9, 0xfdca, 0xfdcb, 0xfdcc, 0xfdcd, 0xfdce, 0xfdcf, + 0xfdd0, 0xfdd1, 0xfdd2, 0xfdd3, 0xfdd4, 0xfdd5, 0xfdd6, 0xfdd7, + 0xfdd8, 0xfdd9, 0xfdda, 0xfddb, 0xfddc, 0xfddd, 0xfdde, 0xfddf, + 0xfde0, 0xfde1, 0xfde2, 0xfde3, 0xfde4, 0xfde5, 0xfde6, 0xfde7, + 0xfde8, 0xfde9, 0xfdea, 0xfdeb, 0xfdec, 0xfded, 0xfdee, 0xfdef, + 0xfdf0, 0xfdf1, 0xfdf2, 0xfdf3, 0xfdf4, 0xfdf5, 0xfdf6, 0xfdf7, + 0xfdf8, 0xfdf9, 0xfdfa, 0xfdfb, 0xfdfc, 0xfdfd, 0xfdfe, 0xfdff, + 0xfe00, 0xfe01, 0xfe02, 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, + 0xfe08, 0xfe09, 0xfe0a, 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, + 0xfe10, 0xfe11, 0xfe12, 0xfe13, 0xfe14, 0xfe15, 0xfe16, 0xfe17, + 0xfe18, 0xfe19, 0xfe1a, 0xfe1b, 0xfe1c, 0xfe1d, 0xfe1e, 0xfe1f, + 0xfe20, 0xfe21, 0xfe22, 0xfe23, 0xfe24, 0xfe25, 0xfe26, 0xfe27, + 0xfe28, 0xfe29, 0xfe2a, 0xfe2b, 0xfe2c, 0xfe2d, 0xfe2e, 0xfe2f, + 0xfe30, 0xfe31, 0xfe32, 0xfe33, 0xfe34, 0xfe35, 0xfe36, 0xfe37, + 0xfe38, 0xfe39, 0xfe3a, 0xfe3b, 0xfe3c, 0xfe3d, 0xfe3e, 0xfe3f, + 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, + 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, + 0xfe50, 0xfe51, 0xfe52, 0xfe53, 0xfe54, 0xfe55, 0xfe56, 0xfe57, + 0xfe58, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, + 0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe67, + 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfe6c, 0xfe6d, 0xfe6e, 0xfe6f, + 0xfe70, 0xfe71, 0xfe72, 0xfe73, 0xfe74, 0xfe75, 0xfe76, 0xfe77, + 0xfe78, 0xfe79, 0xfe7a, 0xfe7b, 0xfe7c, 0xfe7d, 0xfe7e, 0xfe7f, + 0xfe80, 0xfe81, 0xfe82, 0xfe83, 0xfe84, 0xfe85, 0xfe86, 0xfe87, + 0xfe88, 0xfe89, 0xfe8a, 0xfe8b, 0xfe8c, 0xfe8d, 0xfe8e, 0xfe8f, + 0xfe90, 0xfe91, 0xfe92, 0xfe93, 0xfe94, 0xfe95, 0xfe96, 0xfe97, + 0xfe98, 0xfe99, 0xfe9a, 0xfe9b, 0xfe9c, 0xfe9d, 0xfe9e, 0xfe9f, + 0xfea0, 0xfea1, 0xfea2, 0xfea3, 0xfea4, 0xfea5, 0xfea6, 0xfea7, + 0xfea8, 0xfea9, 0xfeaa, 0xfeab, 0xfeac, 0xfead, 0xfeae, 0xfeaf, + 0xfeb0, 0xfeb1, 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb5, 0xfeb6, 0xfeb7, + 0xfeb8, 0xfeb9, 0xfeba, 0xfebb, 0xfebc, 0xfebd, 0xfebe, 0xfebf, + 0xfec0, 0xfec1, 0xfec2, 0xfec3, 0xfec4, 0xfec5, 0xfec6, 0xfec7, + 0xfec8, 0xfec9, 0xfeca, 0xfecb, 0xfecc, 0xfecd, 0xfece, 0xfecf, + 0xfed0, 0xfed1, 0xfed2, 0xfed3, 0xfed4, 0xfed5, 0xfed6, 0xfed7, + 0xfed8, 0xfed9, 0xfeda, 0xfedb, 0xfedc, 0xfedd, 0xfede, 0xfedf, + 0xfee0, 0xfee1, 0xfee2, 0xfee3, 0xfee4, 0xfee5, 0xfee6, 0xfee7, + 0xfee8, 0xfee9, 0xfeea, 0xfeeb, 0xfeec, 0xfeed, 0xfeee, 0xfeef, + 0xfef0, 0xfef1, 0xfef2, 0xfef3, 0xfef4, 0xfef5, 0xfef6, 0xfef7, + 0xfef8, 0xfef9, 0xfefa, 0xfefb, 0xfefc, 0xfefd, 0xfefe, 0xfeff, + 0xff00, 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, 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, 0xff5e, 0xff5f, + 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, + 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, + 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, + 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, + 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, + 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, + 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, + 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, + 0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, + 0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, + 0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, + 0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, + 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, + 0xffc8, 0xffc9, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, + 0xffd0, 0xffd1, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, + 0xffd8, 0xffd9, 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, + 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, + 0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, + 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, + 0xfff8, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff, +}; + + + +const unsigned short dwaCompressorToLinear[] = +{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0013, 0x0013, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0016, 0x0016, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0019, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x001a, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, + 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, + 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002d, 0x002d, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0037, + 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, + 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, + 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0041, 0x0041, 0x0041, 0x0041, + 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, + 0x0041, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0049, + 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, + 0x0049, 0x0049, 0x0049, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, + 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004b, + 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, + 0x004b, 0x004b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004f, 0x004f, + 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, + 0x004f, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, + 0x0050, 0x0050, 0x0050, 0x0050, 0x0051, 0x0051, 0x0051, 0x0051, + 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, + 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0059, + 0x0059, 0x0059, 0x0059, 0x0059, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005c, + 0x005c, 0x005c, 0x005c, 0x005c, 0x005d, 0x005d, 0x005d, 0x005d, + 0x005d, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005f, 0x005f, + 0x005f, 0x005f, 0x005f, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0067, + 0x0067, 0x0067, 0x0067, 0x0067, 0x0068, 0x0068, 0x0068, 0x0068, + 0x0068, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x006a, 0x006a, + 0x006a, 0x006a, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006c, + 0x006c, 0x006c, 0x006c, 0x006c, 0x006d, 0x006d, 0x006d, 0x006d, + 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, + 0x006f, 0x006f, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0074, 0x0074, 0x0074, + 0x0074, 0x0074, 0x0075, 0x0075, 0x0075, 0x0075, 0x0076, 0x0076, + 0x0076, 0x0076, 0x0076, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0079, 0x0079, 0x0079, 0x0079, + 0x0079, 0x007a, 0x007a, 0x007a, 0x007a, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007d, 0x007d, + 0x007d, 0x007d, 0x007d, 0x007e, 0x007e, 0x007e, 0x007e, 0x007f, + 0x007f, 0x007f, 0x007f, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0082, 0x0082, 0x0082, 0x0082, + 0x0082, 0x0083, 0x0083, 0x0083, 0x0083, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0085, 0x0085, 0x0085, 0x0085, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0087, 0x0087, 0x0087, 0x0087, 0x0088, 0x0088, + 0x0088, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008b, 0x008b, 0x008b, 0x008b, 0x008c, + 0x008c, 0x008c, 0x008c, 0x008d, 0x008d, 0x008d, 0x008d, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, + 0x0092, 0x0092, 0x0092, 0x0092, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0094, 0x0094, 0x0094, 0x0094, 0x0095, 0x0095, 0x0095, 0x0095, + 0x0096, 0x0096, 0x0096, 0x0096, 0x0097, 0x0097, 0x0097, 0x0097, + 0x0098, 0x0098, 0x0098, 0x0098, 0x0099, 0x0099, 0x0099, 0x0099, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009d, 0x009d, 0x009d, 0x009d, + 0x009e, 0x009e, 0x009e, 0x009e, 0x009f, 0x009f, 0x009f, 0x009f, + 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a1, 0x00a1, 0x00a1, 0x00a2, + 0x00a2, 0x00a2, 0x00a2, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a6, + 0x00a6, 0x00a6, 0x00a6, 0x00a7, 0x00a7, 0x00a7, 0x00a8, 0x00a8, + 0x00a8, 0x00a8, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00aa, 0x00aa, + 0x00aa, 0x00aa, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ac, 0x00ac, + 0x00ac, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00af, 0x00af, 0x00af, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b3, + 0x00b3, 0x00b3, 0x00b3, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b5, + 0x00b5, 0x00b5, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b7, 0x00b7, + 0x00b7, 0x00b7, 0x00b8, 0x00b8, 0x00b8, 0x00b9, 0x00b9, 0x00b9, + 0x00b9, 0x00ba, 0x00ba, 0x00ba, 0x00bb, 0x00bb, 0x00bb, 0x00bb, + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bd, 0x00bd, 0x00bd, 0x00be, + 0x00be, 0x00be, 0x00be, 0x00bf, 0x00bf, 0x00bf, 0x00c0, 0x00c0, + 0x00c0, 0x00c0, 0x00c1, 0x00c1, 0x00c1, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c3, 0x00c3, 0x00c3, 0x00c4, 0x00c4, 0x00c4, 0x00c4, + 0x00c5, 0x00c5, 0x00c5, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c7, + 0x00c7, 0x00c7, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c9, 0x00c9, + 0x00c9, 0x00ca, 0x00ca, 0x00ca, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cc, 0x00cc, 0x00cc, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00ce, + 0x00ce, 0x00ce, 0x00cf, 0x00cf, 0x00cf, 0x00d0, 0x00d0, 0x00d0, + 0x00d0, 0x00d1, 0x00d1, 0x00d1, 0x00d2, 0x00d2, 0x00d2, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, + 0x00d5, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d7, 0x00d7, 0x00d7, + 0x00d8, 0x00d8, 0x00d8, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00da, + 0x00da, 0x00da, 0x00db, 0x00db, 0x00db, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dd, 0x00dd, 0x00dd, 0x00de, 0x00de, 0x00de, 0x00df, + 0x00df, 0x00df, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e1, 0x00e1, + 0x00e1, 0x00e2, 0x00e2, 0x00e2, 0x00e3, 0x00e3, 0x00e3, 0x00e4, + 0x00e4, 0x00e4, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e6, 0x00e6, + 0x00e6, 0x00e7, 0x00e7, 0x00e7, 0x00e8, 0x00e8, 0x00e8, 0x00e9, + 0x00e9, 0x00e9, 0x00ea, 0x00ea, 0x00ea, 0x00eb, 0x00eb, 0x00eb, + 0x00eb, 0x00ec, 0x00ec, 0x00ec, 0x00ed, 0x00ed, 0x00ed, 0x00ee, + 0x00ee, 0x00ee, 0x00ef, 0x00ef, 0x00ef, 0x00f0, 0x00f0, 0x00f0, + 0x00f1, 0x00f1, 0x00f1, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f3, + 0x00f3, 0x00f3, 0x00f4, 0x00f4, 0x00f4, 0x00f5, 0x00f5, 0x00f5, + 0x00f6, 0x00f6, 0x00f6, 0x00f7, 0x00f7, 0x00f7, 0x00f8, 0x00f8, + 0x00f8, 0x00f9, 0x00f9, 0x00f9, 0x00fa, 0x00fa, 0x00fa, 0x00fb, + 0x00fb, 0x00fb, 0x00fc, 0x00fc, 0x00fc, 0x00fd, 0x00fd, 0x00fd, + 0x00fe, 0x00fe, 0x00fe, 0x00ff, 0x00ff, 0x00ff, 0x0100, 0x0100, + 0x0100, 0x0101, 0x0101, 0x0101, 0x0102, 0x0102, 0x0102, 0x0103, + 0x0103, 0x0103, 0x0104, 0x0104, 0x0104, 0x0105, 0x0105, 0x0105, + 0x0106, 0x0106, 0x0106, 0x0107, 0x0107, 0x0107, 0x0108, 0x0108, + 0x0108, 0x0109, 0x0109, 0x0109, 0x010a, 0x010a, 0x010a, 0x010b, + 0x010b, 0x010b, 0x010c, 0x010c, 0x010c, 0x010d, 0x010d, 0x010d, + 0x010e, 0x010e, 0x010e, 0x010f, 0x010f, 0x010f, 0x0110, 0x0110, + 0x0110, 0x0111, 0x0111, 0x0112, 0x0112, 0x0112, 0x0113, 0x0113, + 0x0113, 0x0114, 0x0114, 0x0114, 0x0115, 0x0115, 0x0115, 0x0116, + 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0118, 0x0118, 0x0118, + 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011b, 0x011b, 0x011b, + 0x011c, 0x011c, 0x011c, 0x011d, 0x011d, 0x011d, 0x011e, 0x011e, + 0x011e, 0x011f, 0x011f, 0x011f, 0x0120, 0x0120, 0x0121, 0x0121, + 0x0121, 0x0122, 0x0122, 0x0122, 0x0123, 0x0123, 0x0123, 0x0124, + 0x0124, 0x0124, 0x0125, 0x0125, 0x0126, 0x0126, 0x0126, 0x0127, + 0x0127, 0x0127, 0x0128, 0x0128, 0x0128, 0x0129, 0x0129, 0x0129, + 0x012a, 0x012a, 0x012b, 0x012b, 0x012b, 0x012c, 0x012c, 0x012c, + 0x012d, 0x012d, 0x012d, 0x012e, 0x012e, 0x012f, 0x012f, 0x012f, + 0x0130, 0x0130, 0x0130, 0x0131, 0x0131, 0x0131, 0x0132, 0x0132, + 0x0133, 0x0133, 0x0133, 0x0134, 0x0134, 0x0134, 0x0135, 0x0135, + 0x0136, 0x0136, 0x0136, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, + 0x0138, 0x0139, 0x0139, 0x013a, 0x013a, 0x013a, 0x013b, 0x013b, + 0x013b, 0x013c, 0x013c, 0x013d, 0x013d, 0x013d, 0x013e, 0x013e, + 0x013e, 0x013f, 0x013f, 0x0140, 0x0140, 0x0140, 0x0141, 0x0141, + 0x0141, 0x0142, 0x0142, 0x0143, 0x0143, 0x0143, 0x0144, 0x0144, + 0x0144, 0x0145, 0x0145, 0x0146, 0x0146, 0x0146, 0x0147, 0x0147, + 0x0147, 0x0148, 0x0148, 0x0149, 0x0149, 0x0149, 0x014a, 0x014a, + 0x014b, 0x014b, 0x014b, 0x014c, 0x014c, 0x014c, 0x014d, 0x014d, + 0x014e, 0x014e, 0x014e, 0x014f, 0x014f, 0x0150, 0x0150, 0x0150, + 0x0151, 0x0151, 0x0151, 0x0152, 0x0152, 0x0153, 0x0153, 0x0153, + 0x0154, 0x0154, 0x0155, 0x0155, 0x0155, 0x0156, 0x0156, 0x0156, + 0x0157, 0x0157, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x015a, + 0x015a, 0x015a, 0x015b, 0x015b, 0x015c, 0x015c, 0x015c, 0x015d, + 0x015d, 0x015e, 0x015e, 0x015e, 0x015f, 0x015f, 0x015f, 0x0160, + 0x0160, 0x0161, 0x0161, 0x0161, 0x0162, 0x0162, 0x0163, 0x0163, + 0x0163, 0x0164, 0x0164, 0x0165, 0x0165, 0x0165, 0x0166, 0x0166, + 0x0167, 0x0167, 0x0167, 0x0168, 0x0168, 0x0169, 0x0169, 0x0169, + 0x016a, 0x016a, 0x016b, 0x016b, 0x016b, 0x016c, 0x016c, 0x016d, + 0x016d, 0x016d, 0x016e, 0x016e, 0x016f, 0x016f, 0x016f, 0x0170, + 0x0170, 0x0171, 0x0171, 0x0172, 0x0172, 0x0172, 0x0173, 0x0173, + 0x0174, 0x0174, 0x0174, 0x0175, 0x0175, 0x0176, 0x0176, 0x0176, + 0x0177, 0x0177, 0x0178, 0x0178, 0x0178, 0x0179, 0x0179, 0x017a, + 0x017a, 0x017b, 0x017b, 0x017b, 0x017c, 0x017c, 0x017d, 0x017d, + 0x017d, 0x017e, 0x017e, 0x017f, 0x017f, 0x017f, 0x0180, 0x0180, + 0x0181, 0x0181, 0x0182, 0x0182, 0x0182, 0x0183, 0x0183, 0x0184, + 0x0184, 0x0185, 0x0186, 0x0187, 0x0187, 0x0188, 0x0189, 0x018a, + 0x018b, 0x018c, 0x018c, 0x018d, 0x018e, 0x018f, 0x0190, 0x0191, + 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0197, + 0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019d, 0x019e, + 0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4, 0x01a4, 0x01a5, + 0x01a6, 0x01a7, 0x01a8, 0x01a9, 0x01aa, 0x01ab, 0x01ab, 0x01ac, + 0x01ad, 0x01ae, 0x01af, 0x01b0, 0x01b1, 0x01b2, 0x01b2, 0x01b3, + 0x01b4, 0x01b5, 0x01b6, 0x01b7, 0x01b8, 0x01b9, 0x01ba, 0x01ba, + 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf, 0x01c0, 0x01c1, 0x01c2, + 0x01c3, 0x01c3, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01c8, 0x01c9, + 0x01ca, 0x01cb, 0x01cc, 0x01cd, 0x01ce, 0x01ce, 0x01cf, 0x01d0, + 0x01d1, 0x01d2, 0x01d3, 0x01d4, 0x01d5, 0x01d6, 0x01d7, 0x01d8, + 0x01d9, 0x01da, 0x01da, 0x01db, 0x01dc, 0x01dd, 0x01de, 0x01df, + 0x01e0, 0x01e1, 0x01e2, 0x01e3, 0x01e4, 0x01e5, 0x01e6, 0x01e7, + 0x01e8, 0x01e9, 0x01e9, 0x01ea, 0x01eb, 0x01ec, 0x01ed, 0x01ee, + 0x01ef, 0x01f0, 0x01f1, 0x01f2, 0x01f3, 0x01f4, 0x01f5, 0x01f6, + 0x01f7, 0x01f8, 0x01f9, 0x01fa, 0x01fb, 0x01fc, 0x01fd, 0x01fe, + 0x01ff, 0x01ff, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, + 0x0206, 0x0207, 0x0208, 0x0209, 0x020a, 0x020b, 0x020c, 0x020d, + 0x020e, 0x020f, 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, + 0x0216, 0x0217, 0x0218, 0x0219, 0x021a, 0x021b, 0x021c, 0x021d, + 0x021e, 0x021f, 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, + 0x0226, 0x0227, 0x0228, 0x0229, 0x022a, 0x022b, 0x022c, 0x022d, + 0x022e, 0x022f, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, + 0x0236, 0x0237, 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023e, + 0x023f, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, + 0x0247, 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, + 0x024f, 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0257, + 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, + 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0267, 0x0268, + 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, 0x0270, + 0x0271, 0x0272, 0x0273, 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, + 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, 0x0281, 0x0282, + 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x028a, + 0x028c, 0x028d, 0x028e, 0x028f, 0x0290, 0x0291, 0x0292, 0x0293, + 0x0294, 0x0296, 0x0297, 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, + 0x029d, 0x029e, 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, + 0x02a6, 0x02a7, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, + 0x02af, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, + 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, 0x02c1, + 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c8, 0x02c9, 0x02ca, + 0x02cb, 0x02cc, 0x02cd, 0x02cf, 0x02d0, 0x02d1, 0x02d2, 0x02d3, + 0x02d4, 0x02d6, 0x02d7, 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dd, + 0x02de, 0x02df, 0x02e0, 0x02e1, 0x02e3, 0x02e4, 0x02e5, 0x02e6, + 0x02e7, 0x02e8, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02f0, + 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f6, 0x02f7, 0x02f8, 0x02f9, + 0x02fa, 0x02fc, 0x02fd, 0x02fe, 0x02ff, 0x0300, 0x0302, 0x0303, + 0x0304, 0x0305, 0x0307, 0x0308, 0x0309, 0x030a, 0x030b, 0x030d, + 0x030e, 0x030f, 0x0310, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, + 0x0318, 0x0319, 0x031a, 0x031b, 0x031d, 0x031e, 0x031f, 0x0320, + 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0328, 0x0329, 0x032a, + 0x032b, 0x032d, 0x032e, 0x032f, 0x0330, 0x0332, 0x0333, 0x0334, + 0x0335, 0x0337, 0x0338, 0x0339, 0x033b, 0x033c, 0x033d, 0x033e, + 0x0340, 0x0341, 0x0342, 0x0343, 0x0345, 0x0346, 0x0347, 0x0348, + 0x034a, 0x034b, 0x034c, 0x034e, 0x034f, 0x0350, 0x0351, 0x0353, + 0x0354, 0x0355, 0x0356, 0x0358, 0x0359, 0x035a, 0x035c, 0x035d, + 0x035e, 0x035f, 0x0361, 0x0362, 0x0363, 0x0365, 0x0366, 0x0367, + 0x0369, 0x036a, 0x036b, 0x036c, 0x036e, 0x036f, 0x0370, 0x0372, + 0x0373, 0x0374, 0x0376, 0x0377, 0x0378, 0x0379, 0x037b, 0x037c, + 0x037d, 0x037f, 0x0380, 0x0381, 0x0383, 0x0384, 0x0385, 0x0387, + 0x0388, 0x0389, 0x038b, 0x038c, 0x038d, 0x038f, 0x0390, 0x0391, + 0x0393, 0x0394, 0x0395, 0x0397, 0x0398, 0x0399, 0x039b, 0x039c, + 0x039d, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a7, + 0x03a8, 0x03a9, 0x03ab, 0x03ac, 0x03ad, 0x03af, 0x03b0, 0x03b1, + 0x03b3, 0x03b4, 0x03b6, 0x03b7, 0x03b8, 0x03ba, 0x03bb, 0x03bc, + 0x03be, 0x03bf, 0x03c0, 0x03c2, 0x03c3, 0x03c5, 0x03c6, 0x03c7, + 0x03c9, 0x03ca, 0x03cb, 0x03cd, 0x03ce, 0x03d0, 0x03d1, 0x03d2, + 0x03d4, 0x03d5, 0x03d6, 0x03d8, 0x03d9, 0x03db, 0x03dc, 0x03dd, + 0x03df, 0x03e0, 0x03e2, 0x03e3, 0x03e4, 0x03e6, 0x03e7, 0x03e8, + 0x03ea, 0x03eb, 0x03ed, 0x03ee, 0x03ef, 0x03f1, 0x03f2, 0x03f4, + 0x03f5, 0x03f7, 0x03f8, 0x03f9, 0x03fb, 0x03fc, 0x03fe, 0x03ff, + 0x0400, 0x0402, 0x0403, 0x0405, 0x0406, 0x0407, 0x0409, 0x040a, + 0x040c, 0x040d, 0x040f, 0x0410, 0x0411, 0x0413, 0x0414, 0x0416, + 0x0417, 0x0419, 0x041a, 0x041b, 0x041d, 0x041e, 0x0420, 0x0421, + 0x0423, 0x0424, 0x0426, 0x0427, 0x0428, 0x042a, 0x042b, 0x042d, + 0x042e, 0x0430, 0x0431, 0x0433, 0x0434, 0x0436, 0x0437, 0x0438, + 0x043a, 0x043b, 0x043d, 0x043e, 0x0440, 0x0441, 0x0443, 0x0444, + 0x0446, 0x0447, 0x0449, 0x044a, 0x044b, 0x044d, 0x044e, 0x0450, + 0x0451, 0x0453, 0x0454, 0x0456, 0x0457, 0x0459, 0x045a, 0x045c, + 0x045d, 0x045f, 0x0460, 0x0462, 0x0463, 0x0465, 0x0466, 0x0468, + 0x0469, 0x046b, 0x046c, 0x046e, 0x046f, 0x0471, 0x0472, 0x0474, + 0x0475, 0x0477, 0x0478, 0x047a, 0x047b, 0x047d, 0x047e, 0x0480, + 0x0481, 0x0483, 0x0484, 0x0486, 0x0487, 0x0489, 0x048a, 0x048c, + 0x048d, 0x048f, 0x0490, 0x0492, 0x0493, 0x0495, 0x0496, 0x0498, + 0x0499, 0x049b, 0x049c, 0x049e, 0x04a0, 0x04a1, 0x04a3, 0x04a4, + 0x04a6, 0x04a7, 0x04a9, 0x04aa, 0x04ac, 0x04ad, 0x04af, 0x04b0, + 0x04b2, 0x04b4, 0x04b5, 0x04b7, 0x04b8, 0x04ba, 0x04bb, 0x04bd, + 0x04be, 0x04c0, 0x04c2, 0x04c3, 0x04c5, 0x04c6, 0x04c8, 0x04c9, + 0x04cb, 0x04cc, 0x04ce, 0x04d0, 0x04d1, 0x04d3, 0x04d4, 0x04d6, + 0x04d7, 0x04d9, 0x04db, 0x04dc, 0x04de, 0x04df, 0x04e1, 0x04e2, + 0x04e4, 0x04e6, 0x04e7, 0x04e9, 0x04ea, 0x04ec, 0x04ed, 0x04ef, + 0x04f1, 0x04f2, 0x04f4, 0x04f5, 0x04f7, 0x04f9, 0x04fa, 0x04fc, + 0x04fd, 0x04ff, 0x0501, 0x0502, 0x0504, 0x0505, 0x0507, 0x0509, + 0x050a, 0x050c, 0x050d, 0x050f, 0x0511, 0x0512, 0x0514, 0x0515, + 0x0517, 0x0519, 0x051a, 0x051c, 0x051e, 0x051f, 0x0521, 0x0522, + 0x0524, 0x0526, 0x0527, 0x0529, 0x052b, 0x052c, 0x052e, 0x052f, + 0x0531, 0x0533, 0x0534, 0x0536, 0x0538, 0x0539, 0x053b, 0x053c, + 0x053e, 0x0540, 0x0541, 0x0543, 0x0545, 0x0546, 0x0548, 0x054a, + 0x054b, 0x054d, 0x054f, 0x0550, 0x0552, 0x0554, 0x0555, 0x0557, + 0x0559, 0x055a, 0x055c, 0x055e, 0x055f, 0x0561, 0x0562, 0x0564, + 0x0566, 0x0567, 0x0569, 0x056b, 0x056c, 0x056e, 0x0570, 0x0572, + 0x0573, 0x0575, 0x0577, 0x0578, 0x057a, 0x057c, 0x057d, 0x057f, + 0x0581, 0x0582, 0x0584, 0x0586, 0x0587, 0x0589, 0x058b, 0x058c, + 0x058e, 0x0590, 0x0592, 0x0593, 0x0595, 0x0597, 0x0598, 0x059a, + 0x059c, 0x059d, 0x059f, 0x05a1, 0x05a3, 0x05a4, 0x05a6, 0x05a8, + 0x05a9, 0x05ab, 0x05ad, 0x05af, 0x05b0, 0x05b2, 0x05b4, 0x05b5, + 0x05b7, 0x05b9, 0x05bb, 0x05bc, 0x05be, 0x05c0, 0x05c1, 0x05c3, + 0x05c5, 0x05c7, 0x05c8, 0x05ca, 0x05cc, 0x05ce, 0x05cf, 0x05d1, + 0x05d3, 0x05d4, 0x05d6, 0x05d8, 0x05da, 0x05db, 0x05dd, 0x05df, + 0x05e1, 0x05e2, 0x05e4, 0x05e6, 0x05e8, 0x05e9, 0x05eb, 0x05ed, + 0x05ef, 0x05f0, 0x05f2, 0x05f4, 0x05f6, 0x05f7, 0x05f9, 0x05fb, + 0x05fd, 0x05ff, 0x0600, 0x0602, 0x0604, 0x0606, 0x0607, 0x0609, + 0x060b, 0x060d, 0x060e, 0x0610, 0x0612, 0x0614, 0x0616, 0x0617, + 0x0619, 0x061b, 0x061d, 0x061e, 0x0620, 0x0622, 0x0624, 0x0626, + 0x0627, 0x0629, 0x062b, 0x062d, 0x062f, 0x0630, 0x0632, 0x0634, + 0x0636, 0x0638, 0x0639, 0x063b, 0x063d, 0x063f, 0x0641, 0x0642, + 0x0644, 0x0646, 0x0648, 0x064a, 0x064b, 0x064d, 0x064f, 0x0651, + 0x0653, 0x0654, 0x0656, 0x0658, 0x065a, 0x065c, 0x065e, 0x065f, + 0x0661, 0x0663, 0x0665, 0x0667, 0x0669, 0x066a, 0x066c, 0x066e, + 0x0670, 0x0672, 0x0674, 0x0675, 0x0677, 0x0679, 0x067b, 0x067d, + 0x067f, 0x0680, 0x0682, 0x0684, 0x0686, 0x0688, 0x068a, 0x068c, + 0x068d, 0x068f, 0x0691, 0x0693, 0x0695, 0x0697, 0x0699, 0x069a, + 0x069c, 0x069e, 0x06a0, 0x06a2, 0x06a4, 0x06a6, 0x06a7, 0x06a9, + 0x06ab, 0x06ad, 0x06af, 0x06b1, 0x06b3, 0x06b5, 0x06b6, 0x06b8, + 0x06ba, 0x06bc, 0x06be, 0x06c0, 0x06c2, 0x06c4, 0x06c5, 0x06c7, + 0x06c9, 0x06cb, 0x06cd, 0x06cf, 0x06d1, 0x06d3, 0x06d5, 0x06d6, + 0x06d8, 0x06da, 0x06dc, 0x06de, 0x06e0, 0x06e2, 0x06e4, 0x06e6, + 0x06e8, 0x06ea, 0x06eb, 0x06ed, 0x06ef, 0x06f1, 0x06f3, 0x06f5, + 0x06f7, 0x06fb, 0x06ff, 0x0702, 0x0706, 0x070a, 0x070e, 0x0712, + 0x0716, 0x071a, 0x071d, 0x0721, 0x0725, 0x0729, 0x072d, 0x0731, + 0x0735, 0x0739, 0x073d, 0x0740, 0x0744, 0x0748, 0x074c, 0x0750, + 0x0754, 0x0758, 0x075c, 0x0760, 0x0764, 0x0768, 0x076c, 0x0770, + 0x0774, 0x0778, 0x077c, 0x0780, 0x0784, 0x0788, 0x078c, 0x0790, + 0x0794, 0x0798, 0x079c, 0x07a0, 0x07a4, 0x07a8, 0x07ac, 0x07b0, + 0x07b4, 0x07b8, 0x07bc, 0x07c0, 0x07c4, 0x07c8, 0x07cc, 0x07d0, + 0x07d4, 0x07d9, 0x07dd, 0x07e1, 0x07e5, 0x07e9, 0x07ed, 0x07f1, + 0x07f5, 0x07f9, 0x07fe, 0x0801, 0x0803, 0x0805, 0x0807, 0x0809, + 0x080b, 0x080d, 0x080f, 0x0811, 0x0814, 0x0816, 0x0818, 0x081a, + 0x081c, 0x081e, 0x0820, 0x0822, 0x0824, 0x0826, 0x0828, 0x082b, + 0x082d, 0x082f, 0x0831, 0x0833, 0x0835, 0x0837, 0x0839, 0x083c, + 0x083e, 0x0840, 0x0842, 0x0844, 0x0846, 0x0848, 0x084b, 0x084d, + 0x084f, 0x0851, 0x0853, 0x0855, 0x0857, 0x085a, 0x085c, 0x085e, + 0x0860, 0x0862, 0x0864, 0x0867, 0x0869, 0x086b, 0x086d, 0x086f, + 0x0872, 0x0874, 0x0876, 0x0878, 0x087a, 0x087d, 0x087f, 0x0881, + 0x0883, 0x0885, 0x0888, 0x088a, 0x088c, 0x088e, 0x0890, 0x0893, + 0x0895, 0x0897, 0x0899, 0x089c, 0x089e, 0x08a0, 0x08a2, 0x08a4, + 0x08a7, 0x08a9, 0x08ab, 0x08ad, 0x08b0, 0x08b2, 0x08b4, 0x08b6, + 0x08b9, 0x08bb, 0x08bd, 0x08c0, 0x08c2, 0x08c4, 0x08c6, 0x08c9, + 0x08cb, 0x08cd, 0x08cf, 0x08d2, 0x08d4, 0x08d6, 0x08d9, 0x08db, + 0x08dd, 0x08e0, 0x08e2, 0x08e4, 0x08e6, 0x08e9, 0x08eb, 0x08ed, + 0x08f0, 0x08f2, 0x08f4, 0x08f7, 0x08f9, 0x08fb, 0x08fe, 0x0900, + 0x0902, 0x0905, 0x0907, 0x0909, 0x090c, 0x090e, 0x0910, 0x0913, + 0x0915, 0x0917, 0x091a, 0x091c, 0x091e, 0x0921, 0x0923, 0x0926, + 0x0928, 0x092a, 0x092d, 0x092f, 0x0931, 0x0934, 0x0936, 0x0939, + 0x093b, 0x093d, 0x0940, 0x0942, 0x0945, 0x0947, 0x0949, 0x094c, + 0x094e, 0x0951, 0x0953, 0x0955, 0x0958, 0x095a, 0x095d, 0x095f, + 0x0962, 0x0964, 0x0966, 0x0969, 0x096b, 0x096e, 0x0970, 0x0973, + 0x0975, 0x0977, 0x097a, 0x097c, 0x097f, 0x0981, 0x0984, 0x0986, + 0x0989, 0x098b, 0x098e, 0x0990, 0x0993, 0x0995, 0x0998, 0x099a, + 0x099c, 0x099f, 0x09a1, 0x09a4, 0x09a6, 0x09a9, 0x09ab, 0x09ae, + 0x09b0, 0x09b3, 0x09b5, 0x09b8, 0x09ba, 0x09bd, 0x09c0, 0x09c2, + 0x09c5, 0x09c7, 0x09ca, 0x09cc, 0x09cf, 0x09d1, 0x09d4, 0x09d6, + 0x09d9, 0x09db, 0x09de, 0x09e0, 0x09e3, 0x09e6, 0x09e8, 0x09eb, + 0x09ed, 0x09f0, 0x09f2, 0x09f5, 0x09f7, 0x09fa, 0x09fd, 0x09ff, + 0x0a02, 0x0a04, 0x0a07, 0x0a0a, 0x0a0c, 0x0a0f, 0x0a11, 0x0a14, + 0x0a16, 0x0a19, 0x0a1c, 0x0a1e, 0x0a21, 0x0a23, 0x0a26, 0x0a29, + 0x0a2b, 0x0a2e, 0x0a31, 0x0a33, 0x0a36, 0x0a38, 0x0a3b, 0x0a3e, + 0x0a40, 0x0a43, 0x0a46, 0x0a48, 0x0a4b, 0x0a4e, 0x0a50, 0x0a53, + 0x0a55, 0x0a58, 0x0a5b, 0x0a5d, 0x0a60, 0x0a63, 0x0a65, 0x0a68, + 0x0a6b, 0x0a6d, 0x0a70, 0x0a73, 0x0a76, 0x0a78, 0x0a7b, 0x0a7e, + 0x0a80, 0x0a83, 0x0a86, 0x0a88, 0x0a8b, 0x0a8e, 0x0a90, 0x0a93, + 0x0a96, 0x0a99, 0x0a9b, 0x0a9e, 0x0aa1, 0x0aa3, 0x0aa6, 0x0aa9, + 0x0aac, 0x0aae, 0x0ab1, 0x0ab4, 0x0ab7, 0x0ab9, 0x0abc, 0x0abf, + 0x0ac2, 0x0ac4, 0x0ac7, 0x0aca, 0x0acd, 0x0acf, 0x0ad2, 0x0ad5, + 0x0ad8, 0x0ada, 0x0add, 0x0ae0, 0x0ae3, 0x0ae5, 0x0ae8, 0x0aeb, + 0x0aee, 0x0af1, 0x0af3, 0x0af6, 0x0af9, 0x0afc, 0x0aff, 0x0b01, + 0x0b04, 0x0b07, 0x0b0a, 0x0b0d, 0x0b0f, 0x0b12, 0x0b15, 0x0b18, + 0x0b1b, 0x0b1e, 0x0b20, 0x0b23, 0x0b26, 0x0b29, 0x0b2c, 0x0b2f, + 0x0b31, 0x0b34, 0x0b37, 0x0b3a, 0x0b3d, 0x0b40, 0x0b43, 0x0b45, + 0x0b48, 0x0b4b, 0x0b4e, 0x0b51, 0x0b54, 0x0b57, 0x0b59, 0x0b5c, + 0x0b5f, 0x0b62, 0x0b65, 0x0b68, 0x0b6b, 0x0b6e, 0x0b71, 0x0b74, + 0x0b76, 0x0b79, 0x0b7c, 0x0b7f, 0x0b82, 0x0b85, 0x0b88, 0x0b8b, + 0x0b8e, 0x0b91, 0x0b94, 0x0b96, 0x0b99, 0x0b9c, 0x0b9f, 0x0ba2, + 0x0ba5, 0x0ba8, 0x0bab, 0x0bae, 0x0bb1, 0x0bb4, 0x0bb7, 0x0bba, + 0x0bbd, 0x0bc0, 0x0bc3, 0x0bc6, 0x0bc9, 0x0bcc, 0x0bcf, 0x0bd2, + 0x0bd5, 0x0bd7, 0x0bda, 0x0bdd, 0x0be0, 0x0be3, 0x0be6, 0x0be9, + 0x0bec, 0x0bef, 0x0bf2, 0x0bf5, 0x0bf8, 0x0bfb, 0x0bfe, 0x0c01, + 0x0c02, 0x0c04, 0x0c05, 0x0c07, 0x0c08, 0x0c0a, 0x0c0b, 0x0c0d, + 0x0c0e, 0x0c10, 0x0c11, 0x0c13, 0x0c14, 0x0c16, 0x0c17, 0x0c19, + 0x0c1b, 0x0c1c, 0x0c1e, 0x0c1f, 0x0c21, 0x0c22, 0x0c24, 0x0c25, + 0x0c27, 0x0c28, 0x0c2a, 0x0c2b, 0x0c2d, 0x0c2f, 0x0c30, 0x0c32, + 0x0c33, 0x0c35, 0x0c36, 0x0c38, 0x0c39, 0x0c3b, 0x0c3c, 0x0c3e, + 0x0c40, 0x0c41, 0x0c43, 0x0c44, 0x0c46, 0x0c47, 0x0c49, 0x0c4b, + 0x0c4c, 0x0c4e, 0x0c4f, 0x0c51, 0x0c52, 0x0c54, 0x0c56, 0x0c57, + 0x0c59, 0x0c5a, 0x0c5c, 0x0c5d, 0x0c5f, 0x0c61, 0x0c62, 0x0c64, + 0x0c65, 0x0c67, 0x0c69, 0x0c6a, 0x0c6c, 0x0c6d, 0x0c6f, 0x0c70, + 0x0c72, 0x0c74, 0x0c75, 0x0c77, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7d, + 0x0c7f, 0x0c80, 0x0c82, 0x0c84, 0x0c85, 0x0c87, 0x0c89, 0x0c8a, + 0x0c8c, 0x0c8d, 0x0c8f, 0x0c91, 0x0c92, 0x0c94, 0x0c95, 0x0c97, + 0x0c99, 0x0c9a, 0x0c9c, 0x0c9e, 0x0c9f, 0x0ca1, 0x0ca3, 0x0ca4, + 0x0ca6, 0x0ca7, 0x0ca9, 0x0cab, 0x0cac, 0x0cae, 0x0cb0, 0x0cb1, + 0x0cb3, 0x0cb5, 0x0cb6, 0x0cb8, 0x0cba, 0x0cbb, 0x0cbd, 0x0cbe, + 0x0cc0, 0x0cc2, 0x0cc3, 0x0cc5, 0x0cc7, 0x0cc8, 0x0cca, 0x0ccc, + 0x0ccd, 0x0ccf, 0x0cd1, 0x0cd2, 0x0cd4, 0x0cd6, 0x0cd7, 0x0cd9, + 0x0cdb, 0x0cdc, 0x0cde, 0x0ce0, 0x0ce1, 0x0ce3, 0x0ce5, 0x0ce7, + 0x0ce8, 0x0cea, 0x0cec, 0x0ced, 0x0cef, 0x0cf1, 0x0cf2, 0x0cf4, + 0x0cf6, 0x0cf7, 0x0cf9, 0x0cfb, 0x0cfd, 0x0cfe, 0x0d00, 0x0d02, + 0x0d03, 0x0d05, 0x0d07, 0x0d08, 0x0d0a, 0x0d0c, 0x0d0e, 0x0d0f, + 0x0d11, 0x0d13, 0x0d14, 0x0d16, 0x0d18, 0x0d1a, 0x0d1b, 0x0d1d, + 0x0d1f, 0x0d20, 0x0d22, 0x0d24, 0x0d26, 0x0d27, 0x0d29, 0x0d2b, + 0x0d2d, 0x0d2e, 0x0d30, 0x0d32, 0x0d34, 0x0d35, 0x0d37, 0x0d39, + 0x0d3b, 0x0d3c, 0x0d3e, 0x0d40, 0x0d42, 0x0d43, 0x0d45, 0x0d47, + 0x0d49, 0x0d4a, 0x0d4c, 0x0d4e, 0x0d50, 0x0d51, 0x0d53, 0x0d55, + 0x0d57, 0x0d58, 0x0d5a, 0x0d5c, 0x0d5e, 0x0d5f, 0x0d61, 0x0d63, + 0x0d65, 0x0d67, 0x0d68, 0x0d6a, 0x0d6c, 0x0d6e, 0x0d6f, 0x0d71, + 0x0d73, 0x0d75, 0x0d77, 0x0d78, 0x0d7a, 0x0d7c, 0x0d7e, 0x0d7f, + 0x0d81, 0x0d83, 0x0d85, 0x0d87, 0x0d88, 0x0d8a, 0x0d8c, 0x0d8e, + 0x0d90, 0x0d91, 0x0d93, 0x0d95, 0x0d97, 0x0d99, 0x0d9b, 0x0d9c, + 0x0d9e, 0x0da0, 0x0da2, 0x0da4, 0x0da5, 0x0da7, 0x0da9, 0x0dab, + 0x0dad, 0x0daf, 0x0db0, 0x0db2, 0x0db4, 0x0db6, 0x0db8, 0x0dba, + 0x0dbb, 0x0dbd, 0x0dbf, 0x0dc1, 0x0dc3, 0x0dc5, 0x0dc6, 0x0dc8, + 0x0dca, 0x0dcc, 0x0dce, 0x0dd0, 0x0dd1, 0x0dd3, 0x0dd5, 0x0dd7, + 0x0dd9, 0x0ddb, 0x0ddd, 0x0dde, 0x0de0, 0x0de2, 0x0de4, 0x0de6, + 0x0de8, 0x0dea, 0x0deb, 0x0ded, 0x0def, 0x0df1, 0x0df3, 0x0df5, + 0x0df7, 0x0df9, 0x0dfa, 0x0dfc, 0x0dfe, 0x0e00, 0x0e02, 0x0e04, + 0x0e06, 0x0e08, 0x0e09, 0x0e0b, 0x0e0d, 0x0e0f, 0x0e11, 0x0e13, + 0x0e15, 0x0e17, 0x0e19, 0x0e1b, 0x0e1c, 0x0e1e, 0x0e20, 0x0e22, + 0x0e24, 0x0e26, 0x0e28, 0x0e2a, 0x0e2c, 0x0e2e, 0x0e2f, 0x0e31, + 0x0e33, 0x0e35, 0x0e37, 0x0e39, 0x0e3b, 0x0e3d, 0x0e3f, 0x0e41, + 0x0e43, 0x0e45, 0x0e47, 0x0e48, 0x0e4a, 0x0e4c, 0x0e4e, 0x0e50, + 0x0e52, 0x0e54, 0x0e56, 0x0e58, 0x0e5a, 0x0e5c, 0x0e5e, 0x0e60, + 0x0e62, 0x0e64, 0x0e66, 0x0e67, 0x0e69, 0x0e6b, 0x0e6d, 0x0e6f, + 0x0e71, 0x0e73, 0x0e75, 0x0e77, 0x0e79, 0x0e7b, 0x0e7d, 0x0e7f, + 0x0e81, 0x0e83, 0x0e85, 0x0e87, 0x0e89, 0x0e8b, 0x0e8d, 0x0e8f, + 0x0e91, 0x0e93, 0x0e95, 0x0e97, 0x0e99, 0x0e9b, 0x0e9d, 0x0e9f, + 0x0ea0, 0x0ea2, 0x0ea4, 0x0ea6, 0x0ea8, 0x0eaa, 0x0eac, 0x0eae, + 0x0eb0, 0x0eb2, 0x0eb4, 0x0eb6, 0x0eb8, 0x0eba, 0x0ebc, 0x0ebe, + 0x0ec0, 0x0ec2, 0x0ec4, 0x0ec6, 0x0ec8, 0x0eca, 0x0ecc, 0x0ece, + 0x0ed1, 0x0ed3, 0x0ed5, 0x0ed7, 0x0ed9, 0x0edb, 0x0edd, 0x0edf, + 0x0ee1, 0x0ee3, 0x0ee5, 0x0ee7, 0x0ee9, 0x0eeb, 0x0eed, 0x0eef, + 0x0ef1, 0x0ef3, 0x0ef5, 0x0ef7, 0x0ef9, 0x0efb, 0x0efd, 0x0eff, + 0x0f01, 0x0f03, 0x0f05, 0x0f07, 0x0f09, 0x0f0b, 0x0f0e, 0x0f10, + 0x0f12, 0x0f14, 0x0f16, 0x0f18, 0x0f1a, 0x0f1c, 0x0f1e, 0x0f20, + 0x0f22, 0x0f24, 0x0f26, 0x0f28, 0x0f2a, 0x0f2c, 0x0f2f, 0x0f31, + 0x0f33, 0x0f35, 0x0f37, 0x0f39, 0x0f3b, 0x0f3d, 0x0f3f, 0x0f41, + 0x0f43, 0x0f45, 0x0f48, 0x0f4a, 0x0f4c, 0x0f4e, 0x0f50, 0x0f52, + 0x0f54, 0x0f56, 0x0f58, 0x0f5a, 0x0f5d, 0x0f5f, 0x0f61, 0x0f63, + 0x0f65, 0x0f67, 0x0f69, 0x0f6b, 0x0f6d, 0x0f6f, 0x0f72, 0x0f74, + 0x0f76, 0x0f78, 0x0f7a, 0x0f7c, 0x0f7e, 0x0f80, 0x0f83, 0x0f85, + 0x0f87, 0x0f89, 0x0f8b, 0x0f8d, 0x0f8f, 0x0f91, 0x0f94, 0x0f96, + 0x0f98, 0x0f9a, 0x0f9c, 0x0f9e, 0x0fa0, 0x0fa3, 0x0fa5, 0x0fa7, + 0x0fa9, 0x0fab, 0x0fad, 0x0faf, 0x0fb2, 0x0fb4, 0x0fb6, 0x0fb8, + 0x0fba, 0x0fbc, 0x0fbf, 0x0fc1, 0x0fc3, 0x0fc5, 0x0fc7, 0x0fc9, + 0x0fcc, 0x0fce, 0x0fd0, 0x0fd2, 0x0fd4, 0x0fd6, 0x0fd9, 0x0fdb, + 0x0fdd, 0x0fdf, 0x0fe1, 0x0fe4, 0x0fe6, 0x0fe8, 0x0fea, 0x0fec, + 0x0fee, 0x0ff1, 0x0ff3, 0x0ff5, 0x0ff7, 0x0ff9, 0x0ffc, 0x0ffe, + 0x1000, 0x1002, 0x1004, 0x1007, 0x1009, 0x100b, 0x100d, 0x100f, + 0x1012, 0x1014, 0x1016, 0x1018, 0x101b, 0x101d, 0x101f, 0x1021, + 0x1024, 0x1026, 0x1028, 0x102a, 0x102d, 0x102f, 0x1031, 0x1033, + 0x1036, 0x1038, 0x103a, 0x103c, 0x103f, 0x1041, 0x1043, 0x1045, + 0x1048, 0x104a, 0x104c, 0x104f, 0x1051, 0x1053, 0x1055, 0x1058, + 0x105a, 0x105c, 0x105f, 0x1061, 0x1063, 0x1066, 0x1068, 0x106a, + 0x106d, 0x106f, 0x1071, 0x1074, 0x1076, 0x1078, 0x107b, 0x107d, + 0x107f, 0x1082, 0x1084, 0x1086, 0x1089, 0x108b, 0x108d, 0x1090, + 0x1092, 0x1094, 0x1097, 0x1099, 0x109c, 0x109e, 0x10a0, 0x10a3, + 0x10a5, 0x10a8, 0x10aa, 0x10ac, 0x10af, 0x10b1, 0x10b3, 0x10b6, + 0x10b8, 0x10bb, 0x10bd, 0x10c0, 0x10c2, 0x10c4, 0x10c7, 0x10c9, + 0x10cc, 0x10ce, 0x10d1, 0x10d3, 0x10d5, 0x10d8, 0x10da, 0x10dd, + 0x10df, 0x10e2, 0x10e4, 0x10e7, 0x10e9, 0x10eb, 0x10ee, 0x10f0, + 0x10f3, 0x10f5, 0x10f8, 0x10fa, 0x10fd, 0x10ff, 0x1102, 0x1104, + 0x1107, 0x1109, 0x110c, 0x110e, 0x1111, 0x1113, 0x1116, 0x1118, + 0x111b, 0x111d, 0x1120, 0x1122, 0x1125, 0x1127, 0x112a, 0x112c, + 0x112f, 0x1131, 0x1134, 0x1137, 0x1139, 0x113c, 0x113e, 0x1141, + 0x1143, 0x1146, 0x1148, 0x114b, 0x114d, 0x1150, 0x1153, 0x1155, + 0x1158, 0x115a, 0x115d, 0x1160, 0x1162, 0x1165, 0x1167, 0x116a, + 0x116c, 0x116f, 0x1172, 0x1174, 0x1177, 0x1179, 0x117c, 0x117f, + 0x1181, 0x1184, 0x1187, 0x1189, 0x118c, 0x118e, 0x1191, 0x1194, + 0x1196, 0x1199, 0x119c, 0x119e, 0x11a1, 0x11a4, 0x11a6, 0x11a9, + 0x11ac, 0x11ae, 0x11b1, 0x11b4, 0x11b6, 0x11b9, 0x11bc, 0x11be, + 0x11c1, 0x11c4, 0x11c6, 0x11c9, 0x11cc, 0x11ce, 0x11d1, 0x11d4, + 0x11d6, 0x11d9, 0x11dc, 0x11df, 0x11e1, 0x11e4, 0x11e7, 0x11e9, + 0x11ec, 0x11ef, 0x11f2, 0x11f4, 0x11f7, 0x11fa, 0x11fd, 0x11ff, + 0x1202, 0x1205, 0x1208, 0x120a, 0x120d, 0x1210, 0x1213, 0x1215, + 0x1218, 0x121b, 0x121e, 0x1220, 0x1223, 0x1226, 0x1229, 0x122c, + 0x122e, 0x1231, 0x1234, 0x1237, 0x123a, 0x123c, 0x123f, 0x1242, + 0x1245, 0x1248, 0x124a, 0x124d, 0x1250, 0x1253, 0x1256, 0x1259, + 0x125b, 0x125e, 0x1261, 0x1264, 0x1267, 0x126a, 0x126c, 0x126f, + 0x1272, 0x1275, 0x1278, 0x127b, 0x127e, 0x1280, 0x1283, 0x1286, + 0x1289, 0x128c, 0x128f, 0x1292, 0x1295, 0x1297, 0x129a, 0x129d, + 0x12a0, 0x12a3, 0x12a6, 0x12a9, 0x12ac, 0x12af, 0x12b2, 0x12b4, + 0x12b7, 0x12ba, 0x12bd, 0x12c0, 0x12c3, 0x12c6, 0x12c9, 0x12cc, + 0x12cf, 0x12d2, 0x12d5, 0x12d8, 0x12db, 0x12de, 0x12e1, 0x12e3, + 0x12e6, 0x12e9, 0x12ec, 0x12ef, 0x12f2, 0x12f5, 0x12f8, 0x12fb, + 0x12fe, 0x1301, 0x1304, 0x1307, 0x130a, 0x130d, 0x1310, 0x1313, + 0x1316, 0x1319, 0x131c, 0x131f, 0x1322, 0x1325, 0x1328, 0x132b, + 0x132e, 0x1331, 0x1334, 0x1337, 0x133a, 0x133d, 0x1341, 0x1344, + 0x1347, 0x134a, 0x134d, 0x1350, 0x1353, 0x1356, 0x1359, 0x135c, + 0x135f, 0x1362, 0x1365, 0x1368, 0x136b, 0x136e, 0x1372, 0x1375, + 0x1378, 0x137b, 0x137e, 0x1381, 0x1384, 0x1387, 0x138a, 0x138d, + 0x1391, 0x1394, 0x1397, 0x139a, 0x139d, 0x13a0, 0x13a3, 0x13a6, + 0x13aa, 0x13ad, 0x13b0, 0x13b3, 0x13b6, 0x13b9, 0x13bc, 0x13c0, + 0x13c3, 0x13c6, 0x13c9, 0x13cc, 0x13cf, 0x13d3, 0x13d6, 0x13d9, + 0x13dc, 0x13df, 0x13e2, 0x13e6, 0x13e9, 0x13ec, 0x13ef, 0x13f2, + 0x13f6, 0x13f9, 0x13fc, 0x13ff, 0x1401, 0x1403, 0x1404, 0x1406, + 0x1408, 0x1409, 0x140b, 0x140d, 0x140e, 0x1410, 0x1411, 0x1413, + 0x1415, 0x1416, 0x1418, 0x1419, 0x141b, 0x141d, 0x141e, 0x1420, + 0x1422, 0x1423, 0x1425, 0x1427, 0x1428, 0x142a, 0x142b, 0x142d, + 0x142f, 0x1430, 0x1432, 0x1434, 0x1435, 0x1437, 0x1439, 0x143a, + 0x143c, 0x143e, 0x143f, 0x1441, 0x1443, 0x1444, 0x1446, 0x1448, + 0x1449, 0x144b, 0x144d, 0x144e, 0x1450, 0x1452, 0x1453, 0x1455, + 0x1457, 0x1458, 0x145a, 0x145c, 0x145d, 0x145f, 0x1461, 0x1462, + 0x1464, 0x1466, 0x1467, 0x1469, 0x146b, 0x146d, 0x146e, 0x1470, + 0x1472, 0x1473, 0x1475, 0x1477, 0x1478, 0x147a, 0x147c, 0x147e, + 0x147f, 0x1481, 0x1483, 0x1484, 0x1486, 0x1488, 0x148a, 0x148b, + 0x148d, 0x148f, 0x1490, 0x1492, 0x1494, 0x1496, 0x1497, 0x1499, + 0x149b, 0x149d, 0x149e, 0x14a0, 0x14a2, 0x14a4, 0x14a5, 0x14a7, + 0x14a9, 0x14ab, 0x14ac, 0x14ae, 0x14b0, 0x14b2, 0x14b3, 0x14b5, + 0x14b7, 0x14b9, 0x14ba, 0x14bc, 0x14be, 0x14c0, 0x14c1, 0x14c3, + 0x14c5, 0x14c7, 0x14c8, 0x14ca, 0x14cc, 0x14ce, 0x14cf, 0x14d1, + 0x14d3, 0x14d5, 0x14d7, 0x14d8, 0x14da, 0x14dc, 0x14de, 0x14e0, + 0x14e1, 0x14e3, 0x14e5, 0x14e7, 0x14e8, 0x14ea, 0x14ec, 0x14ee, + 0x14f0, 0x14f1, 0x14f3, 0x14f5, 0x14f7, 0x14f9, 0x14fa, 0x14fc, + 0x14fe, 0x1500, 0x1502, 0x1504, 0x1505, 0x1507, 0x1509, 0x150b, + 0x150d, 0x150e, 0x1510, 0x1512, 0x1514, 0x1516, 0x1518, 0x1519, + 0x151b, 0x151d, 0x151f, 0x1521, 0x1523, 0x1524, 0x1526, 0x1528, + 0x152a, 0x152c, 0x152e, 0x1530, 0x1531, 0x1533, 0x1535, 0x1537, + 0x1539, 0x153b, 0x153d, 0x153e, 0x1540, 0x1542, 0x1544, 0x1546, + 0x1548, 0x154a, 0x154b, 0x154d, 0x154f, 0x1551, 0x1553, 0x1555, + 0x1557, 0x1559, 0x155a, 0x155c, 0x155e, 0x1560, 0x1562, 0x1564, + 0x1566, 0x1568, 0x156a, 0x156b, 0x156d, 0x156f, 0x1571, 0x1573, + 0x1575, 0x1577, 0x1579, 0x157b, 0x157d, 0x157e, 0x1580, 0x1582, + 0x1584, 0x1586, 0x1588, 0x158a, 0x158c, 0x158e, 0x1590, 0x1592, + 0x1594, 0x1595, 0x1597, 0x1599, 0x159b, 0x159d, 0x159f, 0x15a1, + 0x15a3, 0x15a5, 0x15a7, 0x15a9, 0x15ab, 0x15ad, 0x15af, 0x15b1, + 0x15b3, 0x15b4, 0x15b6, 0x15b8, 0x15ba, 0x15bc, 0x15be, 0x15c0, + 0x15c2, 0x15c4, 0x15c6, 0x15c8, 0x15ca, 0x15cc, 0x15ce, 0x15d0, + 0x15d2, 0x15d4, 0x15d6, 0x15d8, 0x15da, 0x15dc, 0x15de, 0x15e0, + 0x15e2, 0x15e4, 0x15e6, 0x15e8, 0x15ea, 0x15ec, 0x15ee, 0x15f0, + 0x15f2, 0x15f4, 0x15f6, 0x15f8, 0x15fa, 0x15fc, 0x15fe, 0x1600, + 0x1602, 0x1604, 0x1606, 0x1608, 0x160a, 0x160c, 0x160e, 0x1610, + 0x1612, 0x1614, 0x1616, 0x1618, 0x161a, 0x161c, 0x161e, 0x1620, + 0x1622, 0x1624, 0x1626, 0x1628, 0x162a, 0x162c, 0x162e, 0x1630, + 0x1632, 0x1634, 0x1636, 0x1638, 0x163a, 0x163c, 0x163e, 0x1640, + 0x1642, 0x1644, 0x1647, 0x1649, 0x164b, 0x164d, 0x164f, 0x1651, + 0x1653, 0x1655, 0x1657, 0x1659, 0x165b, 0x165d, 0x165f, 0x1661, + 0x1663, 0x1665, 0x1668, 0x166a, 0x166c, 0x166e, 0x1670, 0x1672, + 0x1674, 0x1676, 0x1678, 0x167a, 0x167c, 0x167e, 0x1681, 0x1683, + 0x1685, 0x1687, 0x1689, 0x168b, 0x168d, 0x168f, 0x1691, 0x1693, + 0x1696, 0x1698, 0x169a, 0x169c, 0x169e, 0x16a0, 0x16a2, 0x16a4, + 0x16a6, 0x16a9, 0x16ab, 0x16ad, 0x16af, 0x16b1, 0x16b3, 0x16b5, + 0x16b7, 0x16ba, 0x16bc, 0x16be, 0x16c0, 0x16c2, 0x16c4, 0x16c6, + 0x16c9, 0x16cb, 0x16cd, 0x16cf, 0x16d1, 0x16d3, 0x16d5, 0x16d8, + 0x16da, 0x16dc, 0x16de, 0x16e0, 0x16e2, 0x16e4, 0x16e7, 0x16e9, + 0x16eb, 0x16ed, 0x16ef, 0x16f1, 0x16f4, 0x16f6, 0x16f8, 0x16fa, + 0x16fc, 0x16ff, 0x1701, 0x1703, 0x1705, 0x1707, 0x1709, 0x170c, + 0x170e, 0x1710, 0x1712, 0x1714, 0x1717, 0x1719, 0x171b, 0x171d, + 0x171f, 0x1722, 0x1724, 0x1726, 0x1728, 0x172a, 0x172d, 0x172f, + 0x1731, 0x1733, 0x1735, 0x1738, 0x173a, 0x173c, 0x173e, 0x1740, + 0x1743, 0x1745, 0x1747, 0x1749, 0x174c, 0x174e, 0x1750, 0x1752, + 0x1755, 0x1757, 0x1759, 0x175b, 0x175d, 0x1760, 0x1762, 0x1764, + 0x1766, 0x1769, 0x176b, 0x176d, 0x176f, 0x1772, 0x1774, 0x1776, + 0x1778, 0x177b, 0x177d, 0x177f, 0x1781, 0x1784, 0x1786, 0x1788, + 0x178b, 0x178d, 0x178f, 0x1791, 0x1794, 0x1796, 0x1798, 0x179a, + 0x179d, 0x179f, 0x17a1, 0x17a4, 0x17a6, 0x17a8, 0x17aa, 0x17ad, + 0x17af, 0x17b1, 0x17b4, 0x17b6, 0x17b8, 0x17bb, 0x17bd, 0x17bf, + 0x17c1, 0x17c4, 0x17c6, 0x17c8, 0x17cb, 0x17cd, 0x17cf, 0x17d2, + 0x17d4, 0x17d6, 0x17d9, 0x17db, 0x17dd, 0x17e0, 0x17e2, 0x17e4, + 0x17e6, 0x17e9, 0x17eb, 0x17ed, 0x17f0, 0x17f2, 0x17f4, 0x17f7, + 0x17f9, 0x17fb, 0x17fe, 0x1800, 0x1801, 0x1802, 0x1804, 0x1805, + 0x1806, 0x1807, 0x1808, 0x1809, 0x180b, 0x180c, 0x180d, 0x180e, + 0x180f, 0x1811, 0x1812, 0x1813, 0x1814, 0x1815, 0x1816, 0x1818, + 0x1819, 0x181a, 0x181b, 0x181c, 0x181e, 0x181f, 0x1820, 0x1821, + 0x1822, 0x1824, 0x1825, 0x1826, 0x1827, 0x1828, 0x182a, 0x182b, + 0x182c, 0x182d, 0x182e, 0x1830, 0x1831, 0x1832, 0x1833, 0x1834, + 0x1836, 0x1837, 0x1838, 0x1839, 0x183a, 0x183c, 0x183d, 0x183e, + 0x183f, 0x1840, 0x1842, 0x1843, 0x1844, 0x1845, 0x1846, 0x1848, + 0x1849, 0x184a, 0x184b, 0x184d, 0x184e, 0x184f, 0x1850, 0x1851, + 0x1853, 0x1854, 0x1855, 0x1856, 0x1858, 0x1859, 0x185a, 0x185b, + 0x185c, 0x185e, 0x185f, 0x1860, 0x1861, 0x1863, 0x1864, 0x1865, + 0x1866, 0x1868, 0x1869, 0x186a, 0x186b, 0x186c, 0x186e, 0x186f, + 0x1870, 0x1871, 0x1873, 0x1874, 0x1875, 0x1876, 0x1878, 0x1879, + 0x187a, 0x187b, 0x187d, 0x187e, 0x187f, 0x1880, 0x1882, 0x1883, + 0x1884, 0x1885, 0x1887, 0x1888, 0x1889, 0x188a, 0x188c, 0x188d, + 0x188e, 0x188f, 0x1891, 0x1892, 0x1893, 0x1894, 0x1896, 0x1897, + 0x1898, 0x189b, 0x189d, 0x18a0, 0x18a2, 0x18a5, 0x18a7, 0x18aa, + 0x18ad, 0x18af, 0x18b2, 0x18b4, 0x18b7, 0x18b9, 0x18bc, 0x18bf, + 0x18c1, 0x18c4, 0x18c6, 0x18c9, 0x18cb, 0x18ce, 0x18d1, 0x18d3, + 0x18d6, 0x18d8, 0x18db, 0x18de, 0x18e0, 0x18e3, 0x18e5, 0x18e8, + 0x18eb, 0x18ed, 0x18f0, 0x18f3, 0x18f5, 0x18f8, 0x18fa, 0x18fd, + 0x1900, 0x1902, 0x1905, 0x1908, 0x190a, 0x190d, 0x1910, 0x1912, + 0x1915, 0x1918, 0x191a, 0x191d, 0x1920, 0x1922, 0x1925, 0x1928, + 0x192a, 0x192d, 0x1930, 0x1933, 0x1935, 0x1938, 0x193b, 0x193d, + 0x1940, 0x1943, 0x1946, 0x1948, 0x194b, 0x194e, 0x1950, 0x1953, + 0x1956, 0x1959, 0x195b, 0x195e, 0x1961, 0x1964, 0x1966, 0x1969, + 0x196c, 0x196f, 0x1972, 0x1974, 0x1977, 0x197a, 0x197d, 0x197f, + 0x1982, 0x1985, 0x1988, 0x198b, 0x198d, 0x1990, 0x1993, 0x1996, + 0x1999, 0x199b, 0x199e, 0x19a1, 0x19a4, 0x19a7, 0x19aa, 0x19ac, + 0x19af, 0x19b2, 0x19b5, 0x19b8, 0x19bb, 0x19bd, 0x19c0, 0x19c3, + 0x19c6, 0x19c9, 0x19cc, 0x19cf, 0x19d1, 0x19d4, 0x19d7, 0x19da, + 0x19dd, 0x19e0, 0x19e3, 0x19e6, 0x19e9, 0x19eb, 0x19ee, 0x19f1, + 0x19f4, 0x19f7, 0x19fa, 0x19fd, 0x1a00, 0x1a03, 0x1a06, 0x1a09, + 0x1a0c, 0x1a0f, 0x1a11, 0x1a14, 0x1a17, 0x1a1a, 0x1a1d, 0x1a20, + 0x1a23, 0x1a26, 0x1a29, 0x1a2c, 0x1a2f, 0x1a32, 0x1a35, 0x1a38, + 0x1a3b, 0x1a3e, 0x1a41, 0x1a44, 0x1a47, 0x1a4a, 0x1a4d, 0x1a50, + 0x1a53, 0x1a56, 0x1a59, 0x1a5c, 0x1a5f, 0x1a62, 0x1a65, 0x1a68, + 0x1a6b, 0x1a6e, 0x1a71, 0x1a74, 0x1a77, 0x1a7a, 0x1a7d, 0x1a80, + 0x1a83, 0x1a86, 0x1a8a, 0x1a8d, 0x1a90, 0x1a93, 0x1a96, 0x1a99, + 0x1a9c, 0x1a9f, 0x1aa2, 0x1aa5, 0x1aa8, 0x1aab, 0x1aaf, 0x1ab2, + 0x1ab5, 0x1ab8, 0x1abb, 0x1abe, 0x1ac1, 0x1ac4, 0x1ac7, 0x1acb, + 0x1ace, 0x1ad1, 0x1ad4, 0x1ad7, 0x1ada, 0x1add, 0x1ae1, 0x1ae4, + 0x1ae7, 0x1aea, 0x1aed, 0x1af0, 0x1af3, 0x1af7, 0x1afa, 0x1afd, + 0x1b00, 0x1b03, 0x1b07, 0x1b0a, 0x1b0d, 0x1b10, 0x1b13, 0x1b16, + 0x1b1a, 0x1b1d, 0x1b20, 0x1b23, 0x1b27, 0x1b2a, 0x1b2d, 0x1b30, + 0x1b33, 0x1b37, 0x1b3a, 0x1b3d, 0x1b40, 0x1b44, 0x1b47, 0x1b4a, + 0x1b4d, 0x1b51, 0x1b54, 0x1b57, 0x1b5a, 0x1b5e, 0x1b61, 0x1b64, + 0x1b67, 0x1b6b, 0x1b6e, 0x1b71, 0x1b75, 0x1b78, 0x1b7b, 0x1b7e, + 0x1b82, 0x1b85, 0x1b88, 0x1b8c, 0x1b8f, 0x1b92, 0x1b96, 0x1b99, + 0x1b9c, 0x1ba0, 0x1ba3, 0x1ba6, 0x1baa, 0x1bad, 0x1bb0, 0x1bb4, + 0x1bb7, 0x1bba, 0x1bbe, 0x1bc1, 0x1bc4, 0x1bc8, 0x1bcb, 0x1bcf, + 0x1bd2, 0x1bd5, 0x1bd9, 0x1bdc, 0x1be0, 0x1be3, 0x1be6, 0x1bea, + 0x1bed, 0x1bf0, 0x1bf4, 0x1bf7, 0x1bfb, 0x1bfe, 0x1c01, 0x1c02, + 0x1c04, 0x1c06, 0x1c08, 0x1c09, 0x1c0b, 0x1c0d, 0x1c0f, 0x1c10, + 0x1c12, 0x1c14, 0x1c15, 0x1c17, 0x1c19, 0x1c1b, 0x1c1c, 0x1c1e, + 0x1c20, 0x1c22, 0x1c23, 0x1c25, 0x1c27, 0x1c29, 0x1c2a, 0x1c2c, + 0x1c2e, 0x1c30, 0x1c31, 0x1c33, 0x1c35, 0x1c37, 0x1c38, 0x1c3a, + 0x1c3c, 0x1c3e, 0x1c3f, 0x1c41, 0x1c43, 0x1c45, 0x1c46, 0x1c48, + 0x1c4a, 0x1c4c, 0x1c4e, 0x1c4f, 0x1c51, 0x1c53, 0x1c55, 0x1c56, + 0x1c58, 0x1c5a, 0x1c5c, 0x1c5e, 0x1c5f, 0x1c61, 0x1c63, 0x1c65, + 0x1c67, 0x1c68, 0x1c6a, 0x1c6c, 0x1c6e, 0x1c70, 0x1c71, 0x1c73, + 0x1c75, 0x1c77, 0x1c79, 0x1c7b, 0x1c7c, 0x1c7e, 0x1c80, 0x1c82, + 0x1c84, 0x1c85, 0x1c87, 0x1c89, 0x1c8b, 0x1c8d, 0x1c8f, 0x1c90, + 0x1c92, 0x1c94, 0x1c96, 0x1c98, 0x1c9a, 0x1c9c, 0x1c9d, 0x1c9f, + 0x1ca1, 0x1ca3, 0x1ca5, 0x1ca7, 0x1ca8, 0x1caa, 0x1cac, 0x1cae, + 0x1cb0, 0x1cb2, 0x1cb4, 0x1cb6, 0x1cb7, 0x1cb9, 0x1cbb, 0x1cbd, + 0x1cbf, 0x1cc1, 0x1cc3, 0x1cc5, 0x1cc6, 0x1cc8, 0x1cca, 0x1ccc, + 0x1cce, 0x1cd0, 0x1cd2, 0x1cd4, 0x1cd6, 0x1cd7, 0x1cd9, 0x1cdb, + 0x1cdd, 0x1cdf, 0x1ce1, 0x1ce3, 0x1ce5, 0x1ce7, 0x1ce9, 0x1cea, + 0x1cec, 0x1cee, 0x1cf0, 0x1cf2, 0x1cf4, 0x1cf6, 0x1cf8, 0x1cfa, + 0x1cfc, 0x1cfe, 0x1d00, 0x1d02, 0x1d03, 0x1d05, 0x1d07, 0x1d09, + 0x1d0b, 0x1d0d, 0x1d0f, 0x1d11, 0x1d13, 0x1d15, 0x1d17, 0x1d19, + 0x1d1b, 0x1d1d, 0x1d1f, 0x1d21, 0x1d23, 0x1d25, 0x1d27, 0x1d29, + 0x1d2a, 0x1d2c, 0x1d2e, 0x1d30, 0x1d32, 0x1d34, 0x1d36, 0x1d38, + 0x1d3a, 0x1d3c, 0x1d3e, 0x1d40, 0x1d42, 0x1d44, 0x1d46, 0x1d48, + 0x1d4a, 0x1d4c, 0x1d4e, 0x1d50, 0x1d52, 0x1d54, 0x1d56, 0x1d58, + 0x1d5a, 0x1d5c, 0x1d5e, 0x1d60, 0x1d62, 0x1d64, 0x1d66, 0x1d68, + 0x1d6a, 0x1d6c, 0x1d6e, 0x1d70, 0x1d72, 0x1d74, 0x1d76, 0x1d78, + 0x1d7a, 0x1d7c, 0x1d7e, 0x1d80, 0x1d83, 0x1d85, 0x1d87, 0x1d89, + 0x1d8b, 0x1d8d, 0x1d8f, 0x1d91, 0x1d93, 0x1d95, 0x1d97, 0x1d99, + 0x1d9b, 0x1d9d, 0x1d9f, 0x1da1, 0x1da3, 0x1da5, 0x1da7, 0x1daa, + 0x1dac, 0x1dae, 0x1db0, 0x1db2, 0x1db4, 0x1db6, 0x1db8, 0x1dba, + 0x1dbc, 0x1dbe, 0x1dc0, 0x1dc2, 0x1dc5, 0x1dc7, 0x1dc9, 0x1dcb, + 0x1dcd, 0x1dcf, 0x1dd1, 0x1dd3, 0x1dd5, 0x1dd7, 0x1dd9, 0x1ddc, + 0x1dde, 0x1de0, 0x1de2, 0x1de4, 0x1de6, 0x1de8, 0x1dea, 0x1dec, + 0x1def, 0x1df1, 0x1df3, 0x1df5, 0x1df7, 0x1df9, 0x1dfb, 0x1dfd, + 0x1e00, 0x1e02, 0x1e04, 0x1e06, 0x1e08, 0x1e0a, 0x1e0c, 0x1e0f, + 0x1e11, 0x1e13, 0x1e15, 0x1e17, 0x1e19, 0x1e1b, 0x1e1e, 0x1e20, + 0x1e22, 0x1e24, 0x1e26, 0x1e28, 0x1e2b, 0x1e2d, 0x1e2f, 0x1e31, + 0x1e33, 0x1e35, 0x1e38, 0x1e3a, 0x1e3c, 0x1e3e, 0x1e40, 0x1e42, + 0x1e45, 0x1e47, 0x1e49, 0x1e4b, 0x1e4d, 0x1e50, 0x1e52, 0x1e54, + 0x1e56, 0x1e58, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e66, + 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e, 0x1e71, 0x1e73, 0x1e75, 0x1e77, + 0x1e7a, 0x1e7c, 0x1e7e, 0x1e80, 0x1e82, 0x1e85, 0x1e87, 0x1e89, + 0x1e8b, 0x1e8e, 0x1e90, 0x1e92, 0x1e94, 0x1e97, 0x1e99, 0x1e9b, + 0x1e9d, 0x1ea0, 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea9, 0x1eab, 0x1ead, + 0x1eaf, 0x1eb2, 0x1eb4, 0x1eb6, 0x1eb8, 0x1ebb, 0x1ebd, 0x1ebf, + 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed2, + 0x1ed4, 0x1ed6, 0x1ed8, 0x1edb, 0x1edd, 0x1edf, 0x1ee2, 0x1ee4, + 0x1ee6, 0x1ee8, 0x1eeb, 0x1eed, 0x1eef, 0x1ef2, 0x1ef4, 0x1ef6, + 0x1ef9, 0x1efb, 0x1efd, 0x1f00, 0x1f02, 0x1f04, 0x1f07, 0x1f09, + 0x1f0b, 0x1f0e, 0x1f10, 0x1f12, 0x1f15, 0x1f17, 0x1f19, 0x1f1c, + 0x1f1e, 0x1f20, 0x1f23, 0x1f25, 0x1f27, 0x1f2a, 0x1f2c, 0x1f2e, + 0x1f31, 0x1f33, 0x1f35, 0x1f38, 0x1f3a, 0x1f3c, 0x1f3f, 0x1f41, + 0x1f44, 0x1f46, 0x1f48, 0x1f4b, 0x1f4d, 0x1f4f, 0x1f52, 0x1f54, + 0x1f57, 0x1f59, 0x1f5b, 0x1f5e, 0x1f60, 0x1f62, 0x1f65, 0x1f67, + 0x1f6a, 0x1f6c, 0x1f6e, 0x1f71, 0x1f73, 0x1f76, 0x1f78, 0x1f7a, + 0x1f7d, 0x1f7f, 0x1f82, 0x1f84, 0x1f87, 0x1f89, 0x1f8b, 0x1f8e, + 0x1f90, 0x1f93, 0x1f95, 0x1f97, 0x1f9a, 0x1f9c, 0x1f9f, 0x1fa1, + 0x1fa4, 0x1fa6, 0x1fa8, 0x1fab, 0x1fad, 0x1fb0, 0x1fb2, 0x1fb5, + 0x1fb7, 0x1fba, 0x1fbc, 0x1fbe, 0x1fc1, 0x1fc3, 0x1fc6, 0x1fc8, + 0x1fcb, 0x1fcd, 0x1fd0, 0x1fd2, 0x1fd5, 0x1fd7, 0x1fda, 0x1fdc, + 0x1fde, 0x1fe1, 0x1fe3, 0x1fe6, 0x1fe8, 0x1feb, 0x1fed, 0x1ff0, + 0x1ff2, 0x1ff5, 0x1ff7, 0x1ffa, 0x1ffc, 0x1fff, 0x2001, 0x2002, + 0x2003, 0x2004, 0x2006, 0x2007, 0x2008, 0x2009, 0x200b, 0x200c, + 0x200d, 0x200e, 0x2010, 0x2011, 0x2012, 0x2013, 0x2015, 0x2016, + 0x2017, 0x2018, 0x201a, 0x201b, 0x201c, 0x201e, 0x201f, 0x2020, + 0x2021, 0x2023, 0x2024, 0x2025, 0x2026, 0x2028, 0x2029, 0x202a, + 0x202c, 0x202d, 0x202e, 0x202f, 0x2031, 0x2032, 0x2033, 0x2034, + 0x2036, 0x2037, 0x2038, 0x203a, 0x203b, 0x203c, 0x203d, 0x203f, + 0x2040, 0x2041, 0x2043, 0x2044, 0x2045, 0x2047, 0x2048, 0x2049, + 0x204a, 0x204c, 0x204d, 0x204e, 0x2050, 0x2051, 0x2052, 0x2054, + 0x2055, 0x2056, 0x2057, 0x2059, 0x205a, 0x205b, 0x205d, 0x205e, + 0x205f, 0x2061, 0x2062, 0x2063, 0x2065, 0x2066, 0x2067, 0x2068, + 0x206a, 0x206b, 0x206c, 0x206e, 0x206f, 0x2070, 0x2072, 0x2073, + 0x2074, 0x2076, 0x2077, 0x2078, 0x207a, 0x207b, 0x207c, 0x207e, + 0x207f, 0x2080, 0x2082, 0x2083, 0x2084, 0x2086, 0x2087, 0x2088, + 0x208a, 0x208b, 0x208c, 0x208e, 0x208f, 0x2090, 0x2092, 0x2093, + 0x2094, 0x2096, 0x2097, 0x2098, 0x209a, 0x209b, 0x209c, 0x209e, + 0x209f, 0x20a0, 0x20a2, 0x20a3, 0x20a5, 0x20a6, 0x20a7, 0x20a9, + 0x20aa, 0x20ab, 0x20ad, 0x20ae, 0x20af, 0x20b1, 0x20b2, 0x20b3, + 0x20b5, 0x20b6, 0x20b8, 0x20b9, 0x20ba, 0x20bc, 0x20bd, 0x20be, + 0x20c0, 0x20c1, 0x20c2, 0x20c4, 0x20c5, 0x20c7, 0x20c8, 0x20c9, + 0x20cb, 0x20cc, 0x20cd, 0x20cf, 0x20d0, 0x20d2, 0x20d3, 0x20d4, + 0x20d6, 0x20d7, 0x20d9, 0x20da, 0x20db, 0x20dd, 0x20de, 0x20df, + 0x20e1, 0x20e2, 0x20e4, 0x20e5, 0x20e6, 0x20e8, 0x20e9, 0x20eb, + 0x20ec, 0x20ed, 0x20ef, 0x20f0, 0x20f2, 0x20f3, 0x20f4, 0x20f6, + 0x20f7, 0x20f9, 0x20fa, 0x20fb, 0x20fd, 0x20fe, 0x2100, 0x2101, + 0x2102, 0x2104, 0x2105, 0x2107, 0x2108, 0x210a, 0x210b, 0x210c, + 0x210e, 0x210f, 0x2111, 0x2112, 0x2113, 0x2115, 0x2116, 0x2118, + 0x2119, 0x211b, 0x211c, 0x211d, 0x211f, 0x2120, 0x2122, 0x2123, + 0x2125, 0x2126, 0x2127, 0x2129, 0x212a, 0x212c, 0x212d, 0x212f, + 0x2130, 0x2131, 0x2133, 0x2134, 0x2136, 0x2137, 0x2139, 0x213a, + 0x213c, 0x213d, 0x213e, 0x2140, 0x2141, 0x2143, 0x2144, 0x2146, + 0x2147, 0x214a, 0x214d, 0x2150, 0x2153, 0x2156, 0x2159, 0x215c, + 0x215f, 0x2161, 0x2164, 0x2167, 0x216a, 0x216d, 0x2170, 0x2173, + 0x2176, 0x2179, 0x217c, 0x217f, 0x2182, 0x2185, 0x2188, 0x218b, + 0x218e, 0x2191, 0x2194, 0x2197, 0x219a, 0x219d, 0x21a0, 0x21a3, + 0x21a6, 0x21a9, 0x21ac, 0x21af, 0x21b2, 0x21b5, 0x21b8, 0x21bb, + 0x21be, 0x21c1, 0x21c4, 0x21c7, 0x21ca, 0x21cd, 0x21d0, 0x21d3, + 0x21d6, 0x21da, 0x21dd, 0x21e0, 0x21e3, 0x21e6, 0x21e9, 0x21ec, + 0x21ef, 0x21f2, 0x21f5, 0x21f8, 0x21fb, 0x21ff, 0x2202, 0x2205, + 0x2208, 0x220b, 0x220e, 0x2211, 0x2214, 0x2218, 0x221b, 0x221e, + 0x2221, 0x2224, 0x2227, 0x222b, 0x222e, 0x2231, 0x2234, 0x2237, + 0x223a, 0x223e, 0x2241, 0x2244, 0x2247, 0x224a, 0x224d, 0x2251, + 0x2254, 0x2257, 0x225a, 0x225e, 0x2261, 0x2264, 0x2267, 0x226a, + 0x226e, 0x2271, 0x2274, 0x2277, 0x227b, 0x227e, 0x2281, 0x2284, + 0x2288, 0x228b, 0x228e, 0x2291, 0x2295, 0x2298, 0x229b, 0x229f, + 0x22a2, 0x22a5, 0x22a8, 0x22ac, 0x22af, 0x22b2, 0x22b6, 0x22b9, + 0x22bc, 0x22c0, 0x22c3, 0x22c6, 0x22c9, 0x22cd, 0x22d0, 0x22d4, + 0x22d7, 0x22da, 0x22de, 0x22e1, 0x22e4, 0x22e8, 0x22eb, 0x22ee, + 0x22f2, 0x22f5, 0x22f8, 0x22fc, 0x22ff, 0x2303, 0x2306, 0x2309, + 0x230d, 0x2310, 0x2314, 0x2317, 0x231a, 0x231e, 0x2321, 0x2325, + 0x2328, 0x232c, 0x232f, 0x2332, 0x2336, 0x2339, 0x233d, 0x2340, + 0x2344, 0x2347, 0x234b, 0x234e, 0x2351, 0x2355, 0x2358, 0x235c, + 0x235f, 0x2363, 0x2366, 0x236a, 0x236d, 0x2371, 0x2374, 0x2378, + 0x237b, 0x237f, 0x2382, 0x2386, 0x2389, 0x238d, 0x2390, 0x2394, + 0x2398, 0x239b, 0x239f, 0x23a2, 0x23a6, 0x23a9, 0x23ad, 0x23b0, + 0x23b4, 0x23b8, 0x23bb, 0x23bf, 0x23c2, 0x23c6, 0x23c9, 0x23cd, + 0x23d1, 0x23d4, 0x23d8, 0x23db, 0x23df, 0x23e3, 0x23e6, 0x23ea, + 0x23ee, 0x23f1, 0x23f5, 0x23f8, 0x23fc, 0x2400, 0x2402, 0x2403, + 0x2405, 0x2407, 0x2409, 0x240b, 0x240d, 0x240e, 0x2410, 0x2412, + 0x2414, 0x2416, 0x2418, 0x241a, 0x241b, 0x241d, 0x241f, 0x2421, + 0x2423, 0x2425, 0x2426, 0x2428, 0x242a, 0x242c, 0x242e, 0x2430, + 0x2432, 0x2434, 0x2435, 0x2437, 0x2439, 0x243b, 0x243d, 0x243f, + 0x2441, 0x2443, 0x2444, 0x2446, 0x2448, 0x244a, 0x244c, 0x244e, + 0x2450, 0x2452, 0x2454, 0x2455, 0x2457, 0x2459, 0x245b, 0x245d, + 0x245f, 0x2461, 0x2463, 0x2465, 0x2467, 0x2469, 0x246b, 0x246c, + 0x246e, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247a, 0x247c, + 0x247e, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488, 0x2489, 0x248b, + 0x248d, 0x248f, 0x2491, 0x2493, 0x2495, 0x2497, 0x2499, 0x249b, + 0x249d, 0x249f, 0x24a1, 0x24a3, 0x24a5, 0x24a7, 0x24a9, 0x24ab, + 0x24ad, 0x24af, 0x24b1, 0x24b3, 0x24b5, 0x24b7, 0x24b9, 0x24bb, + 0x24bd, 0x24bf, 0x24c1, 0x24c3, 0x24c5, 0x24c7, 0x24c9, 0x24cb, + 0x24cd, 0x24cf, 0x24d1, 0x24d3, 0x24d5, 0x24d7, 0x24d9, 0x24db, + 0x24dd, 0x24df, 0x24e1, 0x24e3, 0x24e5, 0x24e7, 0x24e9, 0x24eb, + 0x24ed, 0x24ef, 0x24f1, 0x24f3, 0x24f5, 0x24f7, 0x24fa, 0x24fc, + 0x24fe, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508, 0x250a, 0x250c, + 0x250e, 0x2510, 0x2512, 0x2514, 0x2516, 0x2519, 0x251b, 0x251d, + 0x251f, 0x2521, 0x2523, 0x2525, 0x2527, 0x2529, 0x252b, 0x252d, + 0x252f, 0x2532, 0x2534, 0x2536, 0x2538, 0x253a, 0x253c, 0x253e, + 0x2540, 0x2542, 0x2545, 0x2547, 0x2549, 0x254b, 0x254d, 0x254f, + 0x2551, 0x2553, 0x2556, 0x2558, 0x255a, 0x255c, 0x255e, 0x2560, + 0x2562, 0x2564, 0x2567, 0x2569, 0x256b, 0x256d, 0x256f, 0x2571, + 0x2574, 0x2576, 0x2578, 0x257a, 0x257c, 0x257e, 0x2581, 0x2583, + 0x2585, 0x2587, 0x2589, 0x258b, 0x258e, 0x2590, 0x2592, 0x2594, + 0x2596, 0x2598, 0x259b, 0x259d, 0x259f, 0x25a1, 0x25a3, 0x25a6, + 0x25a8, 0x25aa, 0x25ac, 0x25ae, 0x25b1, 0x25b3, 0x25b5, 0x25b7, + 0x25b9, 0x25bc, 0x25be, 0x25c0, 0x25c2, 0x25c5, 0x25c7, 0x25c9, + 0x25cb, 0x25cd, 0x25d0, 0x25d2, 0x25d4, 0x25d6, 0x25d9, 0x25db, + 0x25dd, 0x25df, 0x25e2, 0x25e4, 0x25e6, 0x25e8, 0x25eb, 0x25ed, + 0x25ef, 0x25f1, 0x25f4, 0x25f6, 0x25f8, 0x25fa, 0x25fd, 0x25ff, + 0x2601, 0x2604, 0x2606, 0x2608, 0x260a, 0x260d, 0x260f, 0x2611, + 0x2614, 0x2616, 0x2618, 0x261a, 0x261d, 0x261f, 0x2621, 0x2624, + 0x2626, 0x2628, 0x262a, 0x262d, 0x262f, 0x2631, 0x2634, 0x2636, + 0x2638, 0x263b, 0x263d, 0x263f, 0x2642, 0x2644, 0x2646, 0x2649, + 0x264b, 0x264d, 0x2650, 0x2652, 0x2654, 0x2657, 0x2659, 0x265b, + 0x265e, 0x2660, 0x2662, 0x2665, 0x2667, 0x2669, 0x266c, 0x266e, + 0x2670, 0x2673, 0x2675, 0x2678, 0x267a, 0x267c, 0x267f, 0x2681, + 0x2683, 0x2686, 0x2688, 0x268b, 0x268d, 0x268f, 0x2692, 0x2694, + 0x2696, 0x2699, 0x269b, 0x269e, 0x26a0, 0x26a2, 0x26a5, 0x26a7, + 0x26aa, 0x26ac, 0x26ae, 0x26b1, 0x26b3, 0x26b6, 0x26b8, 0x26bb, + 0x26bd, 0x26bf, 0x26c2, 0x26c4, 0x26c7, 0x26c9, 0x26cc, 0x26ce, + 0x26d0, 0x26d3, 0x26d5, 0x26d8, 0x26da, 0x26dd, 0x26df, 0x26e1, + 0x26e4, 0x26e6, 0x26e9, 0x26eb, 0x26ee, 0x26f0, 0x26f3, 0x26f5, + 0x26f8, 0x26fa, 0x26fd, 0x26ff, 0x2701, 0x2704, 0x2706, 0x2709, + 0x270b, 0x270e, 0x2710, 0x2713, 0x2715, 0x2718, 0x271a, 0x271d, + 0x271f, 0x2722, 0x2724, 0x2727, 0x2729, 0x272c, 0x272e, 0x2731, + 0x2733, 0x2736, 0x2738, 0x273b, 0x273d, 0x2740, 0x2742, 0x2745, + 0x2747, 0x274a, 0x274c, 0x274f, 0x2752, 0x2754, 0x2757, 0x2759, + 0x275c, 0x275e, 0x2761, 0x2763, 0x2766, 0x2768, 0x276b, 0x276d, + 0x2770, 0x2773, 0x2775, 0x2778, 0x277a, 0x277d, 0x277f, 0x2782, + 0x2785, 0x2787, 0x278a, 0x278c, 0x278f, 0x2791, 0x2794, 0x2797, + 0x2799, 0x279c, 0x279e, 0x27a1, 0x27a4, 0x27a6, 0x27a9, 0x27ab, + 0x27ae, 0x27b0, 0x27b3, 0x27b6, 0x27b8, 0x27bb, 0x27be, 0x27c0, + 0x27c3, 0x27c5, 0x27c8, 0x27cb, 0x27cd, 0x27d0, 0x27d2, 0x27d5, + 0x27d8, 0x27da, 0x27dd, 0x27e0, 0x27e2, 0x27e5, 0x27e8, 0x27ea, + 0x27ed, 0x27ef, 0x27f2, 0x27f5, 0x27f7, 0x27fa, 0x27fd, 0x27ff, + 0x2801, 0x2802, 0x2804, 0x2805, 0x2806, 0x2808, 0x2809, 0x280a, + 0x280c, 0x280d, 0x280e, 0x2810, 0x2811, 0x2812, 0x2814, 0x2815, + 0x2816, 0x2818, 0x2819, 0x281a, 0x281c, 0x281d, 0x281e, 0x2820, + 0x2821, 0x2823, 0x2824, 0x2825, 0x2827, 0x2828, 0x2829, 0x282b, + 0x282c, 0x282d, 0x282f, 0x2830, 0x2831, 0x2833, 0x2834, 0x2836, + 0x2837, 0x2838, 0x283a, 0x283b, 0x283c, 0x283e, 0x283f, 0x2841, + 0x2842, 0x2843, 0x2845, 0x2846, 0x2847, 0x2849, 0x284a, 0x284c, + 0x284d, 0x284e, 0x2850, 0x2851, 0x2852, 0x2854, 0x2855, 0x2857, + 0x2858, 0x2859, 0x285b, 0x285c, 0x285e, 0x285f, 0x2860, 0x2862, + 0x2863, 0x2865, 0x2866, 0x2867, 0x2869, 0x286a, 0x286c, 0x286d, + 0x286e, 0x2870, 0x2871, 0x2873, 0x2874, 0x2875, 0x2877, 0x2878, + 0x287a, 0x287b, 0x287d, 0x287e, 0x287f, 0x2881, 0x2882, 0x2884, + 0x2885, 0x2886, 0x2888, 0x2889, 0x288b, 0x288c, 0x288e, 0x288f, + 0x2890, 0x2892, 0x2893, 0x2895, 0x2896, 0x2898, 0x2899, 0x289a, + 0x289c, 0x289d, 0x289f, 0x28a0, 0x28a2, 0x28a3, 0x28a4, 0x28a6, + 0x28a7, 0x28a9, 0x28aa, 0x28ac, 0x28ad, 0x28af, 0x28b0, 0x28b1, + 0x28b3, 0x28b4, 0x28b6, 0x28b7, 0x28b9, 0x28ba, 0x28bc, 0x28bd, + 0x28bf, 0x28c0, 0x28c2, 0x28c3, 0x28c4, 0x28c6, 0x28c7, 0x28c9, + 0x28ca, 0x28cc, 0x28cd, 0x28cf, 0x28d0, 0x28d2, 0x28d3, 0x28d5, + 0x28d6, 0x28d8, 0x28d9, 0x28da, 0x28dc, 0x28dd, 0x28df, 0x28e0, + 0x28e2, 0x28e3, 0x28e5, 0x28e6, 0x28e8, 0x28e9, 0x28eb, 0x28ec, + 0x28ee, 0x28ef, 0x28f1, 0x28f2, 0x28f4, 0x28f5, 0x28f7, 0x28f8, + 0x28fa, 0x28fb, 0x28fd, 0x28fe, 0x2900, 0x2901, 0x2903, 0x2904, + 0x2906, 0x2907, 0x2909, 0x290a, 0x290c, 0x290d, 0x290f, 0x2910, + 0x2912, 0x2913, 0x2915, 0x2916, 0x2918, 0x2919, 0x291b, 0x291c, + 0x291e, 0x291f, 0x2921, 0x2922, 0x2924, 0x2926, 0x2927, 0x2929, + 0x292a, 0x292c, 0x292d, 0x292f, 0x2930, 0x2932, 0x2933, 0x2935, + 0x2936, 0x2938, 0x2939, 0x293b, 0x293c, 0x293e, 0x2940, 0x2941, + 0x2943, 0x2944, 0x2946, 0x2947, 0x2949, 0x294a, 0x294c, 0x294d, + 0x294f, 0x2951, 0x2952, 0x2954, 0x2955, 0x2957, 0x2958, 0x295a, + 0x295b, 0x295d, 0x295f, 0x2960, 0x2962, 0x2963, 0x2965, 0x2966, + 0x2968, 0x296a, 0x296b, 0x296d, 0x296e, 0x2970, 0x2971, 0x2973, + 0x2975, 0x2976, 0x2978, 0x2979, 0x297b, 0x297c, 0x297e, 0x2980, + 0x2981, 0x2983, 0x2984, 0x2986, 0x2987, 0x2989, 0x298b, 0x298c, + 0x298e, 0x298f, 0x2991, 0x2993, 0x2994, 0x2996, 0x2997, 0x2999, + 0x299b, 0x299c, 0x299e, 0x299f, 0x29a1, 0x29a3, 0x29a4, 0x29a6, + 0x29a7, 0x29a9, 0x29ab, 0x29ac, 0x29ae, 0x29af, 0x29b1, 0x29b3, + 0x29b4, 0x29b6, 0x29b7, 0x29b9, 0x29bb, 0x29bc, 0x29be, 0x29c0, + 0x29c1, 0x29c3, 0x29c4, 0x29c6, 0x29c8, 0x29c9, 0x29cb, 0x29cd, + 0x29ce, 0x29d0, 0x29d1, 0x29d3, 0x29d5, 0x29d6, 0x29d8, 0x29da, + 0x29db, 0x29dd, 0x29df, 0x29e0, 0x29e2, 0x29e3, 0x29e5, 0x29e7, + 0x29e8, 0x29ea, 0x29ec, 0x29ed, 0x29ef, 0x29f1, 0x29f2, 0x29f4, + 0x29f6, 0x29f7, 0x29f9, 0x29fb, 0x29fc, 0x29fe, 0x29ff, 0x2a01, + 0x2a03, 0x2a04, 0x2a06, 0x2a08, 0x2a09, 0x2a0b, 0x2a0d, 0x2a0e, + 0x2a10, 0x2a13, 0x2a17, 0x2a1a, 0x2a1d, 0x2a21, 0x2a24, 0x2a28, + 0x2a2b, 0x2a2e, 0x2a32, 0x2a35, 0x2a38, 0x2a3c, 0x2a3f, 0x2a43, + 0x2a46, 0x2a49, 0x2a4d, 0x2a50, 0x2a54, 0x2a57, 0x2a5a, 0x2a5e, + 0x2a61, 0x2a65, 0x2a68, 0x2a6c, 0x2a6f, 0x2a72, 0x2a76, 0x2a79, + 0x2a7d, 0x2a80, 0x2a84, 0x2a87, 0x2a8b, 0x2a8e, 0x2a92, 0x2a95, + 0x2a99, 0x2a9c, 0x2aa0, 0x2aa3, 0x2aa7, 0x2aaa, 0x2aae, 0x2ab1, + 0x2ab5, 0x2ab8, 0x2abc, 0x2abf, 0x2ac3, 0x2ac6, 0x2aca, 0x2acd, + 0x2ad1, 0x2ad5, 0x2ad8, 0x2adc, 0x2adf, 0x2ae3, 0x2ae6, 0x2aea, + 0x2aee, 0x2af1, 0x2af5, 0x2af8, 0x2afc, 0x2b00, 0x2b03, 0x2b07, + 0x2b0a, 0x2b0e, 0x2b12, 0x2b15, 0x2b19, 0x2b1c, 0x2b20, 0x2b24, + 0x2b27, 0x2b2b, 0x2b2f, 0x2b32, 0x2b36, 0x2b3a, 0x2b3d, 0x2b41, + 0x2b45, 0x2b48, 0x2b4c, 0x2b50, 0x2b54, 0x2b57, 0x2b5b, 0x2b5f, + 0x2b62, 0x2b66, 0x2b6a, 0x2b6d, 0x2b71, 0x2b75, 0x2b79, 0x2b7c, + 0x2b80, 0x2b84, 0x2b88, 0x2b8b, 0x2b8f, 0x2b93, 0x2b97, 0x2b9a, + 0x2b9e, 0x2ba2, 0x2ba6, 0x2baa, 0x2bad, 0x2bb1, 0x2bb5, 0x2bb9, + 0x2bbd, 0x2bc0, 0x2bc4, 0x2bc8, 0x2bcc, 0x2bd0, 0x2bd4, 0x2bd7, + 0x2bdb, 0x2bdf, 0x2be3, 0x2be7, 0x2beb, 0x2bee, 0x2bf2, 0x2bf6, + 0x2bfa, 0x2bfe, 0x2c01, 0x2c03, 0x2c05, 0x2c07, 0x2c09, 0x2c0b, + 0x2c0d, 0x2c0f, 0x2c10, 0x2c12, 0x2c14, 0x2c16, 0x2c18, 0x2c1a, + 0x2c1c, 0x2c1e, 0x2c20, 0x2c22, 0x2c24, 0x2c26, 0x2c28, 0x2c2a, + 0x2c2c, 0x2c2e, 0x2c30, 0x2c32, 0x2c34, 0x2c36, 0x2c38, 0x2c3a, + 0x2c3c, 0x2c3e, 0x2c40, 0x2c42, 0x2c44, 0x2c46, 0x2c48, 0x2c4a, + 0x2c4c, 0x2c4e, 0x2c50, 0x2c52, 0x2c54, 0x2c56, 0x2c58, 0x2c5a, + 0x2c5c, 0x2c5e, 0x2c60, 0x2c62, 0x2c64, 0x2c66, 0x2c69, 0x2c6b, + 0x2c6d, 0x2c6f, 0x2c71, 0x2c73, 0x2c75, 0x2c77, 0x2c79, 0x2c7b, + 0x2c7d, 0x2c7f, 0x2c81, 0x2c83, 0x2c85, 0x2c87, 0x2c8a, 0x2c8c, + 0x2c8e, 0x2c90, 0x2c92, 0x2c94, 0x2c96, 0x2c98, 0x2c9a, 0x2c9c, + 0x2c9e, 0x2ca0, 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab, 0x2cad, + 0x2caf, 0x2cb1, 0x2cb3, 0x2cb6, 0x2cb8, 0x2cba, 0x2cbc, 0x2cbe, + 0x2cc0, 0x2cc2, 0x2cc4, 0x2cc7, 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, + 0x2cd1, 0x2cd3, 0x2cd6, 0x2cd8, 0x2cda, 0x2cdc, 0x2cde, 0x2ce0, + 0x2ce3, 0x2ce5, 0x2ce7, 0x2ce9, 0x2ceb, 0x2ced, 0x2cf0, 0x2cf2, + 0x2cf4, 0x2cf6, 0x2cf8, 0x2cfa, 0x2cfd, 0x2cff, 0x2d01, 0x2d03, + 0x2d05, 0x2d08, 0x2d0a, 0x2d0c, 0x2d0e, 0x2d10, 0x2d13, 0x2d15, + 0x2d17, 0x2d19, 0x2d1b, 0x2d1e, 0x2d20, 0x2d22, 0x2d24, 0x2d27, + 0x2d29, 0x2d2b, 0x2d2d, 0x2d2f, 0x2d32, 0x2d34, 0x2d36, 0x2d38, + 0x2d3b, 0x2d3d, 0x2d3f, 0x2d41, 0x2d44, 0x2d46, 0x2d48, 0x2d4a, + 0x2d4d, 0x2d4f, 0x2d51, 0x2d54, 0x2d56, 0x2d58, 0x2d5a, 0x2d5d, + 0x2d5f, 0x2d61, 0x2d63, 0x2d66, 0x2d68, 0x2d6a, 0x2d6d, 0x2d6f, + 0x2d71, 0x2d73, 0x2d76, 0x2d78, 0x2d7a, 0x2d7d, 0x2d7f, 0x2d81, + 0x2d84, 0x2d86, 0x2d88, 0x2d8b, 0x2d8d, 0x2d8f, 0x2d91, 0x2d94, + 0x2d96, 0x2d98, 0x2d9b, 0x2d9d, 0x2d9f, 0x2da2, 0x2da4, 0x2da6, + 0x2da9, 0x2dab, 0x2dae, 0x2db0, 0x2db2, 0x2db5, 0x2db7, 0x2db9, + 0x2dbc, 0x2dbe, 0x2dc0, 0x2dc3, 0x2dc5, 0x2dc7, 0x2dca, 0x2dcc, + 0x2dcf, 0x2dd1, 0x2dd3, 0x2dd6, 0x2dd8, 0x2dda, 0x2ddd, 0x2ddf, + 0x2de2, 0x2de4, 0x2de6, 0x2de9, 0x2deb, 0x2dee, 0x2df0, 0x2df2, + 0x2df5, 0x2df7, 0x2dfa, 0x2dfc, 0x2dff, 0x2e01, 0x2e03, 0x2e06, + 0x2e08, 0x2e0b, 0x2e0d, 0x2e10, 0x2e12, 0x2e14, 0x2e17, 0x2e19, + 0x2e1c, 0x2e1e, 0x2e21, 0x2e23, 0x2e25, 0x2e28, 0x2e2a, 0x2e2d, + 0x2e2f, 0x2e32, 0x2e34, 0x2e37, 0x2e39, 0x2e3c, 0x2e3e, 0x2e41, + 0x2e43, 0x2e46, 0x2e48, 0x2e4b, 0x2e4d, 0x2e4f, 0x2e52, 0x2e54, + 0x2e57, 0x2e59, 0x2e5c, 0x2e5e, 0x2e61, 0x2e63, 0x2e66, 0x2e68, + 0x2e6b, 0x2e6d, 0x2e70, 0x2e72, 0x2e75, 0x2e78, 0x2e7a, 0x2e7d, + 0x2e7f, 0x2e82, 0x2e84, 0x2e87, 0x2e89, 0x2e8c, 0x2e8e, 0x2e91, + 0x2e93, 0x2e96, 0x2e98, 0x2e9b, 0x2e9e, 0x2ea0, 0x2ea3, 0x2ea5, + 0x2ea8, 0x2eaa, 0x2ead, 0x2eaf, 0x2eb2, 0x2eb5, 0x2eb7, 0x2eba, + 0x2ebc, 0x2ebf, 0x2ec2, 0x2ec4, 0x2ec7, 0x2ec9, 0x2ecc, 0x2ece, + 0x2ed1, 0x2ed4, 0x2ed6, 0x2ed9, 0x2edb, 0x2ede, 0x2ee1, 0x2ee3, + 0x2ee6, 0x2ee8, 0x2eeb, 0x2eee, 0x2ef0, 0x2ef3, 0x2ef6, 0x2ef8, + 0x2efb, 0x2efd, 0x2f00, 0x2f03, 0x2f05, 0x2f08, 0x2f0b, 0x2f0d, + 0x2f10, 0x2f13, 0x2f15, 0x2f18, 0x2f1a, 0x2f1d, 0x2f20, 0x2f22, + 0x2f25, 0x2f28, 0x2f2a, 0x2f2d, 0x2f30, 0x2f32, 0x2f35, 0x2f38, + 0x2f3a, 0x2f3d, 0x2f40, 0x2f43, 0x2f45, 0x2f48, 0x2f4b, 0x2f4d, + 0x2f50, 0x2f53, 0x2f55, 0x2f58, 0x2f5b, 0x2f5d, 0x2f60, 0x2f63, + 0x2f66, 0x2f68, 0x2f6b, 0x2f6e, 0x2f70, 0x2f73, 0x2f76, 0x2f79, + 0x2f7b, 0x2f7e, 0x2f81, 0x2f84, 0x2f86, 0x2f89, 0x2f8c, 0x2f8f, + 0x2f91, 0x2f94, 0x2f97, 0x2f9a, 0x2f9c, 0x2f9f, 0x2fa2, 0x2fa5, + 0x2fa7, 0x2faa, 0x2fad, 0x2fb0, 0x2fb2, 0x2fb5, 0x2fb8, 0x2fbb, + 0x2fbd, 0x2fc0, 0x2fc3, 0x2fc6, 0x2fc9, 0x2fcb, 0x2fce, 0x2fd1, + 0x2fd4, 0x2fd7, 0x2fd9, 0x2fdc, 0x2fdf, 0x2fe2, 0x2fe5, 0x2fe7, + 0x2fea, 0x2fed, 0x2ff0, 0x2ff3, 0x2ff6, 0x2ff8, 0x2ffb, 0x2ffe, + 0x3000, 0x3002, 0x3003, 0x3005, 0x3006, 0x3007, 0x3009, 0x300a, + 0x300c, 0x300d, 0x300f, 0x3010, 0x3011, 0x3013, 0x3014, 0x3016, + 0x3017, 0x3019, 0x301a, 0x301b, 0x301d, 0x301e, 0x3020, 0x3021, + 0x3023, 0x3024, 0x3026, 0x3027, 0x3028, 0x302a, 0x302b, 0x302d, + 0x302e, 0x3030, 0x3031, 0x3033, 0x3034, 0x3036, 0x3037, 0x3038, + 0x303a, 0x303b, 0x303d, 0x303e, 0x3040, 0x3041, 0x3043, 0x3044, + 0x3046, 0x3047, 0x3049, 0x304a, 0x304b, 0x304d, 0x304e, 0x3050, + 0x3051, 0x3053, 0x3054, 0x3056, 0x3057, 0x3059, 0x305a, 0x305c, + 0x305d, 0x305f, 0x3060, 0x3062, 0x3063, 0x3065, 0x3066, 0x3068, + 0x3069, 0x306b, 0x306c, 0x306e, 0x306f, 0x3071, 0x3072, 0x3074, + 0x3075, 0x3077, 0x3078, 0x307a, 0x307b, 0x307d, 0x307e, 0x3080, + 0x3081, 0x3083, 0x3084, 0x3086, 0x3087, 0x3089, 0x308a, 0x308c, + 0x308d, 0x308f, 0x3090, 0x3092, 0x3093, 0x3095, 0x3096, 0x3098, + 0x3099, 0x309b, 0x309c, 0x309e, 0x30a0, 0x30a1, 0x30a3, 0x30a4, + 0x30a6, 0x30a7, 0x30a9, 0x30aa, 0x30ac, 0x30ad, 0x30af, 0x30b0, + 0x30b2, 0x30b4, 0x30b5, 0x30b7, 0x30b8, 0x30ba, 0x30bb, 0x30bd, + 0x30be, 0x30c0, 0x30c2, 0x30c3, 0x30c5, 0x30c6, 0x30c8, 0x30c9, + 0x30cb, 0x30cc, 0x30ce, 0x30d0, 0x30d1, 0x30d3, 0x30d4, 0x30d6, + 0x30d7, 0x30d9, 0x30db, 0x30dc, 0x30de, 0x30df, 0x30e1, 0x30e2, + 0x30e4, 0x30e6, 0x30e7, 0x30e9, 0x30ea, 0x30ec, 0x30ed, 0x30ef, + 0x30f1, 0x30f2, 0x30f4, 0x30f5, 0x30f7, 0x30f9, 0x30fa, 0x30fc, + 0x30fd, 0x30ff, 0x3101, 0x3102, 0x3104, 0x3105, 0x3107, 0x3109, + 0x310a, 0x310c, 0x310d, 0x310f, 0x3111, 0x3112, 0x3114, 0x3115, + 0x3117, 0x3119, 0x311a, 0x311c, 0x311e, 0x311f, 0x3121, 0x3122, + 0x3124, 0x3126, 0x3127, 0x3129, 0x312b, 0x312c, 0x312e, 0x312f, + 0x3131, 0x3133, 0x3134, 0x3136, 0x3138, 0x3139, 0x313b, 0x313c, + 0x313e, 0x3140, 0x3141, 0x3143, 0x3145, 0x3146, 0x3148, 0x314a, + 0x314b, 0x314d, 0x314f, 0x3150, 0x3152, 0x3154, 0x3155, 0x3157, + 0x3159, 0x315a, 0x315c, 0x315e, 0x315f, 0x3161, 0x3162, 0x3164, + 0x3166, 0x3167, 0x3169, 0x316b, 0x316c, 0x316e, 0x3170, 0x3172, + 0x3173, 0x3175, 0x3177, 0x3178, 0x317a, 0x317c, 0x317d, 0x317f, + 0x3181, 0x3182, 0x3184, 0x3186, 0x3187, 0x3189, 0x318b, 0x318c, + 0x318e, 0x3190, 0x3192, 0x3193, 0x3195, 0x3197, 0x3198, 0x319a, + 0x319c, 0x319d, 0x319f, 0x31a1, 0x31a3, 0x31a4, 0x31a6, 0x31a8, + 0x31a9, 0x31ab, 0x31ad, 0x31af, 0x31b0, 0x31b2, 0x31b4, 0x31b5, + 0x31b7, 0x31b9, 0x31bb, 0x31bc, 0x31be, 0x31c0, 0x31c1, 0x31c3, + 0x31c5, 0x31c7, 0x31c8, 0x31ca, 0x31cc, 0x31ce, 0x31cf, 0x31d1, + 0x31d3, 0x31d4, 0x31d6, 0x31d8, 0x31da, 0x31db, 0x31dd, 0x31df, + 0x31e1, 0x31e2, 0x31e4, 0x31e6, 0x31e8, 0x31e9, 0x31eb, 0x31ed, + 0x31ef, 0x31f0, 0x31f2, 0x31f4, 0x31f6, 0x31f7, 0x31f9, 0x31fb, + 0x31fd, 0x31ff, 0x3200, 0x3202, 0x3204, 0x3206, 0x3207, 0x3209, + 0x320b, 0x320d, 0x320e, 0x3210, 0x3212, 0x3214, 0x3216, 0x3217, + 0x3219, 0x321b, 0x321d, 0x321e, 0x3220, 0x3222, 0x3224, 0x3226, + 0x3227, 0x3229, 0x322b, 0x322d, 0x322f, 0x3230, 0x3232, 0x3234, + 0x3236, 0x3238, 0x3239, 0x323b, 0x323d, 0x323f, 0x3241, 0x3242, + 0x3244, 0x3246, 0x3248, 0x324a, 0x324b, 0x324d, 0x324f, 0x3251, + 0x3253, 0x3254, 0x3256, 0x3258, 0x325a, 0x325c, 0x325e, 0x325f, + 0x3261, 0x3263, 0x3265, 0x3267, 0x3269, 0x326a, 0x326c, 0x326e, + 0x3270, 0x3272, 0x3274, 0x3275, 0x3277, 0x3279, 0x327b, 0x327d, + 0x327f, 0x3280, 0x3282, 0x3284, 0x3286, 0x3288, 0x328a, 0x328c, + 0x328d, 0x328f, 0x3291, 0x3293, 0x3295, 0x3297, 0x3299, 0x329a, + 0x329c, 0x329e, 0x32a0, 0x32a2, 0x32a4, 0x32a6, 0x32a7, 0x32a9, + 0x32ab, 0x32ad, 0x32af, 0x32b1, 0x32b3, 0x32b5, 0x32b6, 0x32b8, + 0x32ba, 0x32bc, 0x32be, 0x32c0, 0x32c2, 0x32c4, 0x32c5, 0x32c7, + 0x32c9, 0x32cb, 0x32cd, 0x32cf, 0x32d1, 0x32d3, 0x32d5, 0x32d6, + 0x32d8, 0x32da, 0x32dc, 0x32de, 0x32e0, 0x32e2, 0x32e4, 0x32e6, + 0x32e8, 0x32ea, 0x32eb, 0x32ed, 0x32ef, 0x32f1, 0x32f3, 0x32f5, + 0x32f7, 0x32fb, 0x32ff, 0x3302, 0x3306, 0x330a, 0x330e, 0x3312, + 0x3316, 0x331a, 0x331d, 0x3321, 0x3325, 0x3329, 0x332d, 0x3331, + 0x3335, 0x3339, 0x333d, 0x3340, 0x3344, 0x3348, 0x334c, 0x3350, + 0x3354, 0x3358, 0x335c, 0x3360, 0x3364, 0x3368, 0x336c, 0x3370, + 0x3374, 0x3378, 0x337c, 0x3380, 0x3384, 0x3388, 0x338c, 0x3390, + 0x3394, 0x3398, 0x339c, 0x33a0, 0x33a4, 0x33a8, 0x33ac, 0x33b0, + 0x33b4, 0x33b8, 0x33bc, 0x33c0, 0x33c4, 0x33c8, 0x33cc, 0x33d0, + 0x33d4, 0x33d9, 0x33dd, 0x33e1, 0x33e5, 0x33e9, 0x33ed, 0x33f1, + 0x33f5, 0x33f9, 0x33fe, 0x3401, 0x3403, 0x3405, 0x3407, 0x3409, + 0x340b, 0x340d, 0x340f, 0x3411, 0x3414, 0x3416, 0x3418, 0x341a, + 0x341c, 0x341e, 0x3420, 0x3422, 0x3424, 0x3426, 0x3428, 0x342b, + 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437, 0x3439, 0x343c, + 0x343e, 0x3440, 0x3442, 0x3444, 0x3446, 0x3448, 0x344b, 0x344d, + 0x344f, 0x3451, 0x3453, 0x3455, 0x3457, 0x345a, 0x345c, 0x345e, + 0x3460, 0x3462, 0x3464, 0x3467, 0x3469, 0x346b, 0x346d, 0x346f, + 0x3472, 0x3474, 0x3476, 0x3478, 0x347a, 0x347d, 0x347f, 0x3481, + 0x3483, 0x3485, 0x3488, 0x348a, 0x348c, 0x348e, 0x3490, 0x3493, + 0x3495, 0x3497, 0x3499, 0x349c, 0x349e, 0x34a0, 0x34a2, 0x34a4, + 0x34a7, 0x34a9, 0x34ab, 0x34ad, 0x34b0, 0x34b2, 0x34b4, 0x34b6, + 0x34b9, 0x34bb, 0x34bd, 0x34c0, 0x34c2, 0x34c4, 0x34c6, 0x34c9, + 0x34cb, 0x34cd, 0x34cf, 0x34d2, 0x34d4, 0x34d6, 0x34d9, 0x34db, + 0x34dd, 0x34e0, 0x34e2, 0x34e4, 0x34e6, 0x34e9, 0x34eb, 0x34ed, + 0x34f0, 0x34f2, 0x34f4, 0x34f7, 0x34f9, 0x34fb, 0x34fe, 0x3500, + 0x3502, 0x3505, 0x3507, 0x3509, 0x350c, 0x350e, 0x3510, 0x3513, + 0x3515, 0x3517, 0x351a, 0x351c, 0x351e, 0x3521, 0x3523, 0x3526, + 0x3528, 0x352a, 0x352d, 0x352f, 0x3531, 0x3534, 0x3536, 0x3539, + 0x353b, 0x353d, 0x3540, 0x3542, 0x3545, 0x3547, 0x3549, 0x354c, + 0x354e, 0x3551, 0x3553, 0x3555, 0x3558, 0x355a, 0x355d, 0x355f, + 0x3562, 0x3564, 0x3566, 0x3569, 0x356b, 0x356e, 0x3570, 0x3573, + 0x3575, 0x3577, 0x357a, 0x357c, 0x357f, 0x3581, 0x3584, 0x3586, + 0x3589, 0x358b, 0x358e, 0x3590, 0x3593, 0x3595, 0x3598, 0x359a, + 0x359d, 0x359f, 0x35a1, 0x35a4, 0x35a6, 0x35a9, 0x35ab, 0x35ae, + 0x35b0, 0x35b3, 0x35b5, 0x35b8, 0x35ba, 0x35bd, 0x35c0, 0x35c2, + 0x35c5, 0x35c7, 0x35ca, 0x35cc, 0x35cf, 0x35d1, 0x35d4, 0x35d6, + 0x35d9, 0x35db, 0x35de, 0x35e0, 0x35e3, 0x35e6, 0x35e8, 0x35eb, + 0x35ed, 0x35f0, 0x35f2, 0x35f5, 0x35f7, 0x35fa, 0x35fd, 0x35ff, + 0x3602, 0x3604, 0x3607, 0x360a, 0x360c, 0x360f, 0x3611, 0x3614, + 0x3616, 0x3619, 0x361c, 0x361e, 0x3621, 0x3623, 0x3626, 0x3629, + 0x362b, 0x362e, 0x3631, 0x3633, 0x3636, 0x3638, 0x363b, 0x363e, + 0x3640, 0x3643, 0x3646, 0x3648, 0x364b, 0x364e, 0x3650, 0x3653, + 0x3655, 0x3658, 0x365b, 0x365d, 0x3660, 0x3663, 0x3665, 0x3668, + 0x366b, 0x366d, 0x3670, 0x3673, 0x3676, 0x3678, 0x367b, 0x367e, + 0x3680, 0x3683, 0x3686, 0x3688, 0x368b, 0x368e, 0x3690, 0x3693, + 0x3696, 0x3699, 0x369b, 0x369e, 0x36a1, 0x36a3, 0x36a6, 0x36a9, + 0x36ac, 0x36ae, 0x36b1, 0x36b4, 0x36b7, 0x36b9, 0x36bc, 0x36bf, + 0x36c2, 0x36c4, 0x36c7, 0x36ca, 0x36cd, 0x36cf, 0x36d2, 0x36d5, + 0x36d8, 0x36da, 0x36dd, 0x36e0, 0x36e3, 0x36e5, 0x36e8, 0x36eb, + 0x36ee, 0x36f1, 0x36f3, 0x36f6, 0x36f9, 0x36fc, 0x36ff, 0x3701, + 0x3704, 0x3707, 0x370a, 0x370d, 0x370f, 0x3712, 0x3715, 0x3718, + 0x371b, 0x371e, 0x3720, 0x3723, 0x3726, 0x3729, 0x372c, 0x372f, + 0x3731, 0x3734, 0x3737, 0x373a, 0x373d, 0x3740, 0x3743, 0x3745, + 0x3748, 0x374b, 0x374e, 0x3751, 0x3754, 0x3757, 0x3759, 0x375c, + 0x375f, 0x3762, 0x3765, 0x3768, 0x376b, 0x376e, 0x3771, 0x3774, + 0x3776, 0x3779, 0x377c, 0x377f, 0x3782, 0x3785, 0x3788, 0x378b, + 0x378e, 0x3791, 0x3794, 0x3796, 0x3799, 0x379c, 0x379f, 0x37a2, + 0x37a5, 0x37a8, 0x37ab, 0x37ae, 0x37b1, 0x37b4, 0x37b7, 0x37ba, + 0x37bd, 0x37c0, 0x37c3, 0x37c6, 0x37c9, 0x37cc, 0x37cf, 0x37d2, + 0x37d5, 0x37d7, 0x37da, 0x37dd, 0x37e0, 0x37e3, 0x37e6, 0x37e9, + 0x37ec, 0x37ef, 0x37f2, 0x37f5, 0x37f8, 0x37fb, 0x37fe, 0x3801, + 0x3802, 0x3804, 0x3805, 0x3807, 0x3808, 0x380a, 0x380b, 0x380d, + 0x380e, 0x3810, 0x3811, 0x3813, 0x3814, 0x3816, 0x3817, 0x3819, + 0x381b, 0x381c, 0x381e, 0x381f, 0x3821, 0x3822, 0x3824, 0x3825, + 0x3827, 0x3828, 0x382a, 0x382b, 0x382d, 0x382f, 0x3830, 0x3832, + 0x3833, 0x3835, 0x3836, 0x3838, 0x3839, 0x383b, 0x383c, 0x383e, + 0x3840, 0x3841, 0x3843, 0x3844, 0x3846, 0x3847, 0x3849, 0x384b, + 0x384c, 0x384e, 0x384f, 0x3851, 0x3852, 0x3854, 0x3856, 0x3857, + 0x3859, 0x385a, 0x385c, 0x385d, 0x385f, 0x3861, 0x3862, 0x3864, + 0x3865, 0x3867, 0x3869, 0x386a, 0x386c, 0x386d, 0x386f, 0x3870, + 0x3872, 0x3874, 0x3875, 0x3877, 0x3878, 0x387a, 0x387c, 0x387d, + 0x387f, 0x3880, 0x3882, 0x3884, 0x3885, 0x3887, 0x3889, 0x388a, + 0x388c, 0x388d, 0x388f, 0x3891, 0x3892, 0x3894, 0x3895, 0x3897, + 0x3899, 0x389a, 0x389c, 0x389e, 0x389f, 0x38a1, 0x38a3, 0x38a4, + 0x38a6, 0x38a7, 0x38a9, 0x38ab, 0x38ac, 0x38ae, 0x38b0, 0x38b1, + 0x38b3, 0x38b5, 0x38b6, 0x38b8, 0x38ba, 0x38bb, 0x38bd, 0x38be, + 0x38c0, 0x38c2, 0x38c3, 0x38c5, 0x38c7, 0x38c8, 0x38ca, 0x38cc, + 0x38cd, 0x38cf, 0x38d1, 0x38d2, 0x38d4, 0x38d6, 0x38d7, 0x38d9, + 0x38db, 0x38dc, 0x38de, 0x38e0, 0x38e1, 0x38e3, 0x38e5, 0x38e7, + 0x38e8, 0x38ea, 0x38ec, 0x38ed, 0x38ef, 0x38f1, 0x38f2, 0x38f4, + 0x38f6, 0x38f7, 0x38f9, 0x38fb, 0x38fd, 0x38fe, 0x3900, 0x3902, + 0x3903, 0x3905, 0x3907, 0x3908, 0x390a, 0x390c, 0x390e, 0x390f, + 0x3911, 0x3913, 0x3914, 0x3916, 0x3918, 0x391a, 0x391b, 0x391d, + 0x391f, 0x3920, 0x3922, 0x3924, 0x3926, 0x3927, 0x3929, 0x392b, + 0x392d, 0x392e, 0x3930, 0x3932, 0x3934, 0x3935, 0x3937, 0x3939, + 0x393b, 0x393c, 0x393e, 0x3940, 0x3942, 0x3943, 0x3945, 0x3947, + 0x3949, 0x394a, 0x394c, 0x394e, 0x3950, 0x3951, 0x3953, 0x3955, + 0x3957, 0x3958, 0x395a, 0x395c, 0x395e, 0x395f, 0x3961, 0x3963, + 0x3965, 0x3967, 0x3968, 0x396a, 0x396c, 0x396e, 0x396f, 0x3971, + 0x3973, 0x3975, 0x3977, 0x3978, 0x397a, 0x397c, 0x397e, 0x397f, + 0x3981, 0x3983, 0x3985, 0x3987, 0x3988, 0x398a, 0x398c, 0x398e, + 0x3990, 0x3991, 0x3993, 0x3995, 0x3997, 0x3999, 0x399b, 0x399c, + 0x399e, 0x39a0, 0x39a2, 0x39a4, 0x39a5, 0x39a7, 0x39a9, 0x39ab, + 0x39ad, 0x39af, 0x39b0, 0x39b2, 0x39b4, 0x39b6, 0x39b8, 0x39ba, + 0x39bb, 0x39bd, 0x39bf, 0x39c1, 0x39c3, 0x39c5, 0x39c6, 0x39c8, + 0x39ca, 0x39cc, 0x39ce, 0x39d0, 0x39d1, 0x39d3, 0x39d5, 0x39d7, + 0x39d9, 0x39db, 0x39dd, 0x39de, 0x39e0, 0x39e2, 0x39e4, 0x39e6, + 0x39e8, 0x39ea, 0x39eb, 0x39ed, 0x39ef, 0x39f1, 0x39f3, 0x39f5, + 0x39f7, 0x39f9, 0x39fa, 0x39fc, 0x39fe, 0x3a00, 0x3a02, 0x3a04, + 0x3a06, 0x3a08, 0x3a09, 0x3a0b, 0x3a0d, 0x3a0f, 0x3a11, 0x3a13, + 0x3a15, 0x3a17, 0x3a19, 0x3a1b, 0x3a1c, 0x3a1e, 0x3a20, 0x3a22, + 0x3a24, 0x3a26, 0x3a28, 0x3a2a, 0x3a2c, 0x3a2e, 0x3a2f, 0x3a31, + 0x3a33, 0x3a35, 0x3a37, 0x3a39, 0x3a3b, 0x3a3d, 0x3a3f, 0x3a41, + 0x3a43, 0x3a45, 0x3a47, 0x3a48, 0x3a4a, 0x3a4c, 0x3a4e, 0x3a50, + 0x3a52, 0x3a54, 0x3a56, 0x3a58, 0x3a5a, 0x3a5c, 0x3a5e, 0x3a60, + 0x3a62, 0x3a64, 0x3a66, 0x3a67, 0x3a69, 0x3a6b, 0x3a6d, 0x3a6f, + 0x3a71, 0x3a73, 0x3a75, 0x3a77, 0x3a79, 0x3a7b, 0x3a7d, 0x3a7f, + 0x3a81, 0x3a83, 0x3a85, 0x3a87, 0x3a89, 0x3a8b, 0x3a8d, 0x3a8f, + 0x3a91, 0x3a93, 0x3a95, 0x3a97, 0x3a99, 0x3a9b, 0x3a9d, 0x3a9f, + 0x3aa0, 0x3aa2, 0x3aa4, 0x3aa6, 0x3aa8, 0x3aaa, 0x3aac, 0x3aae, + 0x3ab0, 0x3ab2, 0x3ab4, 0x3ab6, 0x3ab8, 0x3aba, 0x3abc, 0x3abe, + 0x3ac0, 0x3ac2, 0x3ac4, 0x3ac6, 0x3ac8, 0x3aca, 0x3acc, 0x3ace, + 0x3ad1, 0x3ad3, 0x3ad5, 0x3ad7, 0x3ad9, 0x3adb, 0x3add, 0x3adf, + 0x3ae1, 0x3ae3, 0x3ae5, 0x3ae7, 0x3ae9, 0x3aeb, 0x3aed, 0x3aef, + 0x3af1, 0x3af3, 0x3af5, 0x3af7, 0x3af9, 0x3afb, 0x3afd, 0x3aff, + 0x3b01, 0x3b03, 0x3b05, 0x3b07, 0x3b09, 0x3b0b, 0x3b0e, 0x3b10, + 0x3b12, 0x3b14, 0x3b16, 0x3b18, 0x3b1a, 0x3b1c, 0x3b1e, 0x3b20, + 0x3b22, 0x3b24, 0x3b26, 0x3b28, 0x3b2a, 0x3b2c, 0x3b2f, 0x3b31, + 0x3b33, 0x3b35, 0x3b37, 0x3b39, 0x3b3b, 0x3b3d, 0x3b3f, 0x3b41, + 0x3b43, 0x3b45, 0x3b48, 0x3b4a, 0x3b4c, 0x3b4e, 0x3b50, 0x3b52, + 0x3b54, 0x3b56, 0x3b58, 0x3b5a, 0x3b5d, 0x3b5f, 0x3b61, 0x3b63, + 0x3b65, 0x3b67, 0x3b69, 0x3b6b, 0x3b6d, 0x3b6f, 0x3b72, 0x3b74, + 0x3b76, 0x3b78, 0x3b7a, 0x3b7c, 0x3b7e, 0x3b80, 0x3b83, 0x3b85, + 0x3b87, 0x3b89, 0x3b8b, 0x3b8d, 0x3b8f, 0x3b91, 0x3b94, 0x3b96, + 0x3b98, 0x3b9a, 0x3b9c, 0x3b9e, 0x3ba0, 0x3ba3, 0x3ba5, 0x3ba7, + 0x3ba9, 0x3bab, 0x3bad, 0x3baf, 0x3bb2, 0x3bb4, 0x3bb6, 0x3bb8, + 0x3bba, 0x3bbc, 0x3bbf, 0x3bc1, 0x3bc3, 0x3bc5, 0x3bc7, 0x3bc9, + 0x3bcc, 0x3bce, 0x3bd0, 0x3bd2, 0x3bd4, 0x3bd6, 0x3bd9, 0x3bdb, + 0x3bdd, 0x3bdf, 0x3be1, 0x3be4, 0x3be6, 0x3be8, 0x3bea, 0x3bec, + 0x3bee, 0x3bf1, 0x3bf3, 0x3bf5, 0x3bf7, 0x3bf9, 0x3bfc, 0x3bfe, + 0x3c00, 0x3c02, 0x3c04, 0x3c07, 0x3c09, 0x3c0b, 0x3c0d, 0x3c10, + 0x3c12, 0x3c14, 0x3c16, 0x3c18, 0x3c1b, 0x3c1d, 0x3c1f, 0x3c22, + 0x3c24, 0x3c26, 0x3c28, 0x3c2b, 0x3c2d, 0x3c2f, 0x3c32, 0x3c34, + 0x3c36, 0x3c39, 0x3c3b, 0x3c3d, 0x3c3f, 0x3c42, 0x3c44, 0x3c47, + 0x3c49, 0x3c4b, 0x3c4e, 0x3c50, 0x3c52, 0x3c55, 0x3c57, 0x3c59, + 0x3c5c, 0x3c5e, 0x3c61, 0x3c63, 0x3c66, 0x3c68, 0x3c6a, 0x3c6d, + 0x3c6f, 0x3c72, 0x3c74, 0x3c77, 0x3c79, 0x3c7b, 0x3c7e, 0x3c80, + 0x3c83, 0x3c85, 0x3c88, 0x3c8a, 0x3c8d, 0x3c8f, 0x3c92, 0x3c94, + 0x3c97, 0x3c99, 0x3c9c, 0x3c9f, 0x3ca1, 0x3ca4, 0x3ca6, 0x3ca9, + 0x3cab, 0x3cae, 0x3cb0, 0x3cb3, 0x3cb6, 0x3cb8, 0x3cbb, 0x3cbd, + 0x3cc0, 0x3cc3, 0x3cc5, 0x3cc8, 0x3ccb, 0x3ccd, 0x3cd0, 0x3cd2, + 0x3cd5, 0x3cd8, 0x3cda, 0x3cdd, 0x3ce0, 0x3ce2, 0x3ce5, 0x3ce8, + 0x3ceb, 0x3ced, 0x3cf0, 0x3cf3, 0x3cf5, 0x3cf8, 0x3cfb, 0x3cfe, + 0x3d00, 0x3d03, 0x3d06, 0x3d09, 0x3d0b, 0x3d0e, 0x3d11, 0x3d14, + 0x3d17, 0x3d19, 0x3d1c, 0x3d1f, 0x3d22, 0x3d25, 0x3d27, 0x3d2a, + 0x3d2d, 0x3d30, 0x3d33, 0x3d36, 0x3d39, 0x3d3b, 0x3d3e, 0x3d41, + 0x3d44, 0x3d47, 0x3d4a, 0x3d4d, 0x3d50, 0x3d53, 0x3d56, 0x3d59, + 0x3d5b, 0x3d5e, 0x3d61, 0x3d64, 0x3d67, 0x3d6a, 0x3d6d, 0x3d70, + 0x3d73, 0x3d76, 0x3d79, 0x3d7c, 0x3d7f, 0x3d82, 0x3d85, 0x3d88, + 0x3d8b, 0x3d8f, 0x3d92, 0x3d95, 0x3d98, 0x3d9b, 0x3d9e, 0x3da1, + 0x3da4, 0x3da7, 0x3daa, 0x3dad, 0x3db1, 0x3db4, 0x3db7, 0x3dba, + 0x3dbd, 0x3dc0, 0x3dc3, 0x3dc7, 0x3dca, 0x3dcd, 0x3dd0, 0x3dd3, + 0x3dd7, 0x3dda, 0x3ddd, 0x3de0, 0x3de3, 0x3de7, 0x3dea, 0x3ded, + 0x3df0, 0x3df4, 0x3df7, 0x3dfa, 0x3dfe, 0x3e01, 0x3e04, 0x3e08, + 0x3e0b, 0x3e0e, 0x3e12, 0x3e15, 0x3e18, 0x3e1c, 0x3e1f, 0x3e22, + 0x3e26, 0x3e29, 0x3e2c, 0x3e30, 0x3e33, 0x3e37, 0x3e3a, 0x3e3e, + 0x3e41, 0x3e44, 0x3e48, 0x3e4b, 0x3e4f, 0x3e52, 0x3e56, 0x3e59, + 0x3e5d, 0x3e60, 0x3e64, 0x3e67, 0x3e6b, 0x3e6e, 0x3e72, 0x3e75, + 0x3e79, 0x3e7c, 0x3e80, 0x3e84, 0x3e87, 0x3e8b, 0x3e8e, 0x3e92, + 0x3e96, 0x3e99, 0x3e9d, 0x3ea1, 0x3ea4, 0x3ea8, 0x3eac, 0x3eaf, + 0x3eb3, 0x3eb7, 0x3eba, 0x3ebe, 0x3ec2, 0x3ec5, 0x3ec9, 0x3ecd, + 0x3ed1, 0x3ed4, 0x3ed8, 0x3edc, 0x3ee0, 0x3ee3, 0x3ee7, 0x3eeb, + 0x3eef, 0x3ef3, 0x3ef6, 0x3efa, 0x3efe, 0x3f02, 0x3f06, 0x3f0a, + 0x3f0e, 0x3f12, 0x3f15, 0x3f19, 0x3f1d, 0x3f21, 0x3f25, 0x3f29, + 0x3f2d, 0x3f31, 0x3f35, 0x3f39, 0x3f3d, 0x3f41, 0x3f45, 0x3f49, + 0x3f4d, 0x3f51, 0x3f55, 0x3f59, 0x3f5d, 0x3f61, 0x3f65, 0x3f69, + 0x3f6d, 0x3f71, 0x3f75, 0x3f79, 0x3f7e, 0x3f82, 0x3f86, 0x3f8a, + 0x3f8e, 0x3f92, 0x3f96, 0x3f9b, 0x3f9f, 0x3fa3, 0x3fa7, 0x3fab, + 0x3fb0, 0x3fb4, 0x3fb8, 0x3fbc, 0x3fc1, 0x3fc5, 0x3fc9, 0x3fcd, + 0x3fd2, 0x3fd6, 0x3fda, 0x3fdf, 0x3fe3, 0x3fe7, 0x3fec, 0x3ff0, + 0x3ff4, 0x3ff9, 0x3ffd, 0x4001, 0x4003, 0x4005, 0x4007, 0x400a, + 0x400c, 0x400e, 0x4010, 0x4013, 0x4015, 0x4017, 0x4019, 0x401c, + 0x401e, 0x4020, 0x4022, 0x4025, 0x4027, 0x4029, 0x402c, 0x402e, + 0x4030, 0x4032, 0x4035, 0x4037, 0x4039, 0x403c, 0x403e, 0x4040, + 0x4043, 0x4045, 0x4047, 0x404a, 0x404c, 0x404e, 0x4051, 0x4053, + 0x4056, 0x4058, 0x405a, 0x405d, 0x405f, 0x4062, 0x4064, 0x4066, + 0x4069, 0x406b, 0x406e, 0x4070, 0x4073, 0x4075, 0x4077, 0x407a, + 0x407c, 0x407f, 0x4081, 0x4084, 0x4086, 0x4089, 0x408b, 0x408e, + 0x4090, 0x4093, 0x4095, 0x4098, 0x409a, 0x409d, 0x409f, 0x40a2, + 0x40a5, 0x40a7, 0x40aa, 0x40ac, 0x40af, 0x40b1, 0x40b4, 0x40b7, + 0x40b9, 0x40bc, 0x40be, 0x40c1, 0x40c4, 0x40c6, 0x40c9, 0x40cc, + 0x40ce, 0x40d1, 0x40d3, 0x40d6, 0x40d9, 0x40db, 0x40de, 0x40e1, + 0x40e3, 0x40e6, 0x40e9, 0x40ec, 0x40ee, 0x40f1, 0x40f4, 0x40f6, + 0x40f9, 0x40fc, 0x40ff, 0x4101, 0x4104, 0x4107, 0x410a, 0x410c, + 0x410f, 0x4112, 0x4115, 0x4118, 0x411a, 0x411d, 0x4120, 0x4123, + 0x4126, 0x4129, 0x412b, 0x412e, 0x4131, 0x4134, 0x4137, 0x413a, + 0x413d, 0x413f, 0x4142, 0x4145, 0x4148, 0x414b, 0x414e, 0x4151, + 0x4154, 0x4157, 0x415a, 0x415d, 0x4160, 0x4163, 0x4165, 0x4168, + 0x416b, 0x416e, 0x4171, 0x4174, 0x4177, 0x417a, 0x417d, 0x4180, + 0x4183, 0x4187, 0x418a, 0x418d, 0x4190, 0x4193, 0x4196, 0x4199, + 0x419c, 0x419f, 0x41a2, 0x41a5, 0x41a8, 0x41ab, 0x41af, 0x41b2, + 0x41b5, 0x41b8, 0x41bb, 0x41be, 0x41c1, 0x41c5, 0x41c8, 0x41cb, + 0x41ce, 0x41d1, 0x41d5, 0x41d8, 0x41db, 0x41de, 0x41e1, 0x41e5, + 0x41e8, 0x41eb, 0x41ee, 0x41f2, 0x41f5, 0x41f8, 0x41fc, 0x41ff, + 0x4202, 0x4205, 0x4209, 0x420c, 0x420f, 0x4213, 0x4216, 0x4219, + 0x421d, 0x4220, 0x4224, 0x4227, 0x422a, 0x422e, 0x4231, 0x4235, + 0x4238, 0x423b, 0x423f, 0x4242, 0x4246, 0x4249, 0x424d, 0x4250, + 0x4254, 0x4257, 0x425a, 0x425e, 0x4262, 0x4265, 0x4269, 0x426c, + 0x4270, 0x4273, 0x4277, 0x427a, 0x427e, 0x4281, 0x4285, 0x4289, + 0x428c, 0x4290, 0x4293, 0x4297, 0x429b, 0x429e, 0x42a2, 0x42a6, + 0x42a9, 0x42ad, 0x42b1, 0x42b4, 0x42b8, 0x42bc, 0x42bf, 0x42c3, + 0x42c7, 0x42cb, 0x42ce, 0x42d2, 0x42d6, 0x42da, 0x42dd, 0x42e1, + 0x42e5, 0x42e9, 0x42ec, 0x42f0, 0x42f4, 0x42f8, 0x42fc, 0x4300, + 0x4303, 0x4307, 0x430b, 0x430f, 0x4313, 0x4317, 0x431b, 0x431f, + 0x4323, 0x4327, 0x432a, 0x432e, 0x4332, 0x4336, 0x433a, 0x433e, + 0x4342, 0x4346, 0x434a, 0x434e, 0x4352, 0x4356, 0x435a, 0x435e, + 0x4362, 0x4367, 0x436b, 0x436f, 0x4373, 0x4377, 0x437b, 0x437f, + 0x4383, 0x4387, 0x438c, 0x4390, 0x4394, 0x4398, 0x439c, 0x43a0, + 0x43a5, 0x43a9, 0x43ad, 0x43b1, 0x43b5, 0x43ba, 0x43be, 0x43c2, + 0x43c6, 0x43cb, 0x43cf, 0x43d3, 0x43d8, 0x43dc, 0x43e0, 0x43e5, + 0x43e9, 0x43ed, 0x43f2, 0x43f6, 0x43fa, 0x43ff, 0x4402, 0x4404, + 0x4406, 0x4408, 0x440a, 0x440d, 0x440f, 0x4411, 0x4413, 0x4416, + 0x4418, 0x441a, 0x441c, 0x441f, 0x4421, 0x4423, 0x4426, 0x4428, + 0x442a, 0x442c, 0x442f, 0x4431, 0x4433, 0x4436, 0x4438, 0x443a, + 0x443d, 0x443f, 0x4441, 0x4444, 0x4446, 0x4448, 0x444b, 0x444d, + 0x444f, 0x4452, 0x4454, 0x4456, 0x4459, 0x445b, 0x445e, 0x4460, + 0x4462, 0x4465, 0x4467, 0x446a, 0x446c, 0x446f, 0x4471, 0x4473, + 0x4476, 0x4478, 0x447b, 0x447d, 0x4480, 0x4482, 0x4485, 0x4487, + 0x448a, 0x448c, 0x448f, 0x4491, 0x4494, 0x4496, 0x4499, 0x449b, + 0x449e, 0x44a0, 0x44a3, 0x44a6, 0x44a8, 0x44ab, 0x44ad, 0x44b0, + 0x44b2, 0x44b5, 0x44b8, 0x44ba, 0x44bd, 0x44bf, 0x44c2, 0x44c5, + 0x44c7, 0x44ca, 0x44cc, 0x44cf, 0x44d2, 0x44d4, 0x44d7, 0x44da, + 0x44dc, 0x44df, 0x44e2, 0x44e4, 0x44e7, 0x44ea, 0x44ed, 0x44ef, + 0x44f2, 0x44f5, 0x44f7, 0x44fa, 0x44fd, 0x4500, 0x4502, 0x4505, + 0x4508, 0x450b, 0x450d, 0x4510, 0x4513, 0x4516, 0x4519, 0x451b, + 0x451e, 0x4521, 0x4524, 0x4527, 0x452a, 0x452c, 0x452f, 0x4532, + 0x4535, 0x4538, 0x453b, 0x453e, 0x4540, 0x4543, 0x4546, 0x4549, + 0x454c, 0x454f, 0x4552, 0x4555, 0x4558, 0x455b, 0x455e, 0x4561, + 0x4564, 0x4567, 0x456a, 0x456d, 0x4570, 0x4573, 0x4576, 0x4579, + 0x457c, 0x457f, 0x4582, 0x4585, 0x4588, 0x458b, 0x458e, 0x4591, + 0x4594, 0x4597, 0x459a, 0x459d, 0x45a0, 0x45a3, 0x45a6, 0x45a9, + 0x45ad, 0x45b0, 0x45b3, 0x45b6, 0x45b9, 0x45bc, 0x45bf, 0x45c3, + 0x45c6, 0x45c9, 0x45cc, 0x45cf, 0x45d3, 0x45d6, 0x45d9, 0x45dc, + 0x45df, 0x45e3, 0x45e6, 0x45e9, 0x45ec, 0x45f0, 0x45f3, 0x45f6, + 0x45f9, 0x45fd, 0x4600, 0x4603, 0x4607, 0x460a, 0x460d, 0x4611, + 0x4614, 0x4617, 0x461b, 0x461e, 0x4621, 0x4625, 0x4628, 0x462c, + 0x462f, 0x4632, 0x4636, 0x4639, 0x463d, 0x4640, 0x4643, 0x4647, + 0x464a, 0x464e, 0x4651, 0x4655, 0x4658, 0x465c, 0x465f, 0x4663, + 0x4666, 0x466a, 0x466d, 0x4671, 0x4674, 0x4678, 0x467c, 0x467f, + 0x4683, 0x4686, 0x468a, 0x468e, 0x4691, 0x4695, 0x4698, 0x469c, + 0x46a0, 0x46a3, 0x46a7, 0x46ab, 0x46ae, 0x46b2, 0x46b6, 0x46b9, + 0x46bd, 0x46c1, 0x46c4, 0x46c8, 0x46cc, 0x46d0, 0x46d3, 0x46d7, + 0x46db, 0x46df, 0x46e2, 0x46e6, 0x46ea, 0x46ee, 0x46f2, 0x46f6, + 0x46f9, 0x46fd, 0x4701, 0x4705, 0x4709, 0x470d, 0x4711, 0x4714, + 0x4718, 0x471c, 0x4720, 0x4724, 0x4728, 0x472c, 0x4730, 0x4734, + 0x4738, 0x473c, 0x4740, 0x4744, 0x4748, 0x474c, 0x4750, 0x4754, + 0x4758, 0x475c, 0x4760, 0x4764, 0x4768, 0x476c, 0x4770, 0x4774, + 0x4778, 0x477d, 0x4781, 0x4785, 0x4789, 0x478d, 0x4791, 0x4795, + 0x479a, 0x479e, 0x47a2, 0x47a6, 0x47aa, 0x47af, 0x47b3, 0x47b7, + 0x47bb, 0x47c0, 0x47c4, 0x47c8, 0x47cc, 0x47d1, 0x47d5, 0x47d9, + 0x47de, 0x47e2, 0x47e6, 0x47eb, 0x47ef, 0x47f3, 0x47f8, 0x47fc, + 0x4800, 0x4802, 0x4805, 0x4807, 0x4809, 0x480b, 0x480e, 0x4810, + 0x4812, 0x4814, 0x4816, 0x4819, 0x481b, 0x481d, 0x4820, 0x4822, + 0x4824, 0x4826, 0x4829, 0x482b, 0x482d, 0x4830, 0x4832, 0x4834, + 0x4836, 0x4839, 0x483b, 0x483d, 0x4840, 0x4842, 0x4844, 0x4847, + 0x4849, 0x484c, 0x484e, 0x4850, 0x4853, 0x4855, 0x4857, 0x485a, + 0x485c, 0x485f, 0x4861, 0x4863, 0x4866, 0x4868, 0x486b, 0x486d, + 0x4870, 0x4872, 0x4874, 0x4877, 0x4879, 0x487c, 0x487e, 0x4881, + 0x4883, 0x4888, 0x488d, 0x4892, 0x4897, 0x489c, 0x48a1, 0x48a6, + 0x48ac, 0x48b1, 0x48b6, 0x48bb, 0x48c0, 0x48c6, 0x48cb, 0x48d0, + 0x48d5, 0x48db, 0x48e0, 0x48e5, 0x48eb, 0x48f0, 0x48f6, 0x48fb, + 0x4901, 0x4906, 0x490c, 0x4911, 0x4917, 0x491d, 0x4922, 0x4928, + 0x492d, 0x4933, 0x4939, 0x493f, 0x4944, 0x494a, 0x4950, 0x4956, + 0x495c, 0x4962, 0x4968, 0x496e, 0x4974, 0x497a, 0x4980, 0x4986, + 0x498c, 0x4992, 0x4998, 0x499e, 0x49a4, 0x49ab, 0x49b1, 0x49b7, + 0x49bd, 0x49c4, 0x49ca, 0x49d1, 0x49d7, 0x49dd, 0x49e4, 0x49ea, + 0x49f1, 0x49f7, 0x49fe, 0x4a05, 0x4a0b, 0x4a12, 0x4a19, 0x4a1f, + 0x4a26, 0x4a2d, 0x4a34, 0x4a3a, 0x4a41, 0x4a48, 0x4a4f, 0x4a56, + 0x4a5d, 0x4a64, 0x4a6b, 0x4a72, 0x4a79, 0x4a80, 0x4a88, 0x4a8f, + 0x4a96, 0x4a9d, 0x4aa5, 0x4aac, 0x4ab3, 0x4abb, 0x4ac2, 0x4aca, + 0x4ad1, 0x4ad9, 0x4ae0, 0x4ae8, 0x4aef, 0x4af7, 0x4aff, 0x4b06, + 0x4b0e, 0x4b16, 0x4b1e, 0x4b25, 0x4b2d, 0x4b35, 0x4b3d, 0x4b45, + 0x4b4d, 0x4b55, 0x4b5d, 0x4b65, 0x4b6e, 0x4b76, 0x4b7e, 0x4b86, + 0x4b8f, 0x4b97, 0x4b9f, 0x4ba8, 0x4bb0, 0x4bb9, 0x4bc1, 0x4bca, + 0x4bd2, 0x4bdb, 0x4be4, 0x4bec, 0x4bf5, 0x4bfe, 0x4c03, 0x4c08, + 0x4c0c, 0x4c11, 0x4c15, 0x4c1a, 0x4c1e, 0x4c23, 0x4c27, 0x4c2c, + 0x4c30, 0x4c35, 0x4c3a, 0x4c3e, 0x4c43, 0x4c48, 0x4c4c, 0x4c51, + 0x4c56, 0x4c5b, 0x4c5f, 0x4c64, 0x4c69, 0x4c6e, 0x4c73, 0x4c78, + 0x4c7d, 0x4c82, 0x4c87, 0x4c8c, 0x4c91, 0x4c96, 0x4c9b, 0x4ca0, + 0x4ca5, 0x4caa, 0x4caf, 0x4cb4, 0x4cb9, 0x4cbf, 0x4cc4, 0x4cc9, + 0x4cce, 0x4cd4, 0x4cd9, 0x4cde, 0x4ce4, 0x4ce9, 0x4cef, 0x4cf4, + 0x4cf9, 0x4cff, 0x4d04, 0x4d0a, 0x4d10, 0x4d15, 0x4d1b, 0x4d20, + 0x4d26, 0x4d2c, 0x4d31, 0x4d37, 0x4d3d, 0x4d43, 0x4d48, 0x4d4e, + 0x4d54, 0x4d5a, 0x4d60, 0x4d66, 0x4d6c, 0x4d72, 0x4d78, 0x4d7e, + 0x4d84, 0x4d8a, 0x4d90, 0x4d96, 0x4d9c, 0x4da2, 0x4da9, 0x4daf, + 0x4db5, 0x4dbb, 0x4dc2, 0x4dc8, 0x4dcf, 0x4dd5, 0x4ddb, 0x4de2, + 0x4de8, 0x4def, 0x4df5, 0x4dfc, 0x4e03, 0x4e09, 0x4e10, 0x4e16, + 0x4e1d, 0x4e24, 0x4e2b, 0x4e31, 0x4e38, 0x4e3f, 0x4e46, 0x4e4d, + 0x4e54, 0x4e5b, 0x4e62, 0x4e69, 0x4e70, 0x4e77, 0x4e7e, 0x4e85, + 0x4e8d, 0x4e94, 0x4e9b, 0x4ea2, 0x4eaa, 0x4eb1, 0x4eb8, 0x4ec0, + 0x4ec7, 0x4ecf, 0x4ed6, 0x4ede, 0x4ee5, 0x4eed, 0x4ef5, 0x4efc, + 0x4f04, 0x4f0c, 0x4f13, 0x4f1b, 0x4f23, 0x4f2b, 0x4f33, 0x4f3b, + 0x4f43, 0x4f4b, 0x4f53, 0x4f5b, 0x4f63, 0x4f6b, 0x4f73, 0x4f7b, + 0x4f84, 0x4f8c, 0x4f94, 0x4f9d, 0x4fa5, 0x4fad, 0x4fb6, 0x4fbe, + 0x4fc7, 0x4fd0, 0x4fd8, 0x4fe1, 0x4fe9, 0x4ff2, 0x4ffb, 0x5002, + 0x5006, 0x500b, 0x500f, 0x5014, 0x5018, 0x501d, 0x5021, 0x5026, + 0x502a, 0x502f, 0x5034, 0x5038, 0x503d, 0x5041, 0x5046, 0x504b, + 0x5050, 0x5054, 0x5059, 0x505e, 0x5063, 0x5068, 0x506c, 0x5071, + 0x5076, 0x507b, 0x5080, 0x5085, 0x508a, 0x508f, 0x5094, 0x5099, + 0x509e, 0x50a3, 0x50a8, 0x50ae, 0x50b3, 0x50b8, 0x50bd, 0x50c2, + 0x50c8, 0x50cd, 0x50d2, 0x50d7, 0x50dd, 0x50e2, 0x50e7, 0x50ed, + 0x50f2, 0x50f8, 0x50fd, 0x5103, 0x5108, 0x510e, 0x5113, 0x5119, + 0x511f, 0x5124, 0x512a, 0x5130, 0x5135, 0x513b, 0x5141, 0x5147, + 0x514c, 0x5152, 0x5158, 0x515e, 0x5164, 0x516a, 0x5170, 0x5176, + 0x517c, 0x5182, 0x5188, 0x518e, 0x5194, 0x519a, 0x51a1, 0x51a7, + 0x51ad, 0x51b3, 0x51ba, 0x51c0, 0x51c6, 0x51cd, 0x51d3, 0x51d9, + 0x51e0, 0x51e6, 0x51ed, 0x51f3, 0x51fa, 0x5200, 0x5207, 0x520e, + 0x5214, 0x521b, 0x5222, 0x5229, 0x522f, 0x5236, 0x523d, 0x5244, + 0x524b, 0x5252, 0x5259, 0x5260, 0x5267, 0x526e, 0x5275, 0x527c, + 0x5283, 0x528a, 0x5292, 0x5299, 0x52a0, 0x52a7, 0x52af, 0x52b6, + 0x52bd, 0x52c5, 0x52cc, 0x52d4, 0x52db, 0x52e3, 0x52ea, 0x52f2, + 0x52fa, 0x5301, 0x5309, 0x5311, 0x5319, 0x5321, 0x5328, 0x5330, + 0x5338, 0x5340, 0x5348, 0x5350, 0x5358, 0x5360, 0x5369, 0x5371, + 0x5379, 0x5381, 0x5389, 0x5392, 0x539a, 0x53a2, 0x53ab, 0x53b3, + 0x53bc, 0x53c4, 0x53cd, 0x53d5, 0x53de, 0x53e7, 0x53ef, 0x53f8, + 0x5401, 0x5405, 0x5409, 0x540e, 0x5412, 0x5417, 0x541b, 0x5420, + 0x5424, 0x5429, 0x542d, 0x5432, 0x5437, 0x543b, 0x5440, 0x5445, + 0x5449, 0x544e, 0x5453, 0x5458, 0x545c, 0x5461, 0x5466, 0x546b, + 0x5470, 0x5475, 0x547a, 0x547f, 0x5483, 0x5488, 0x548d, 0x5492, + 0x5498, 0x549d, 0x54a2, 0x54a7, 0x54ac, 0x54b1, 0x54b6, 0x54bb, + 0x54c1, 0x54c6, 0x54cb, 0x54d0, 0x54d6, 0x54db, 0x54e0, 0x54e6, + 0x54eb, 0x54f1, 0x54f6, 0x54fc, 0x5501, 0x5507, 0x550c, 0x5512, + 0x5517, 0x551d, 0x5522, 0x5528, 0x552e, 0x5534, 0x5539, 0x553f, + 0x5545, 0x554b, 0x5550, 0x5556, 0x555c, 0x5562, 0x5568, 0x556e, + 0x5574, 0x557a, 0x5580, 0x5586, 0x558c, 0x5592, 0x5598, 0x559f, + 0x55a5, 0x55ab, 0x55b1, 0x55b8, 0x55be, 0x55c4, 0x55cb, 0x55d1, + 0x55d7, 0x55de, 0x55e4, 0x55eb, 0x55f1, 0x55f8, 0x55fe, 0x5605, + 0x560c, 0x5612, 0x5619, 0x5620, 0x5626, 0x562d, 0x5634, 0x563b, + 0x5642, 0x5649, 0x5650, 0x5657, 0x565d, 0x5665, 0x566c, 0x5673, + 0x567a, 0x5681, 0x5688, 0x568f, 0x5696, 0x569e, 0x56a5, 0x56ac, + 0x56b4, 0x56bb, 0x56c3, 0x56ca, 0x56d1, 0x56d9, 0x56e1, 0x56e8, + 0x56f0, 0x56f7, 0x56ff, 0x5707, 0x570f, 0x5716, 0x571e, 0x5726, + 0x572e, 0x5736, 0x573e, 0x5746, 0x574e, 0x5756, 0x575e, 0x5766, + 0x576e, 0x5776, 0x577f, 0x5787, 0x578f, 0x5797, 0x57a0, 0x57a8, + 0x57b1, 0x57b9, 0x57c2, 0x57ca, 0x57d3, 0x57db, 0x57e4, 0x57ed, + 0x57f5, 0x57fe, 0x5804, 0x5808, 0x580c, 0x5811, 0x5815, 0x581a, + 0x581e, 0x5823, 0x5827, 0x582c, 0x5831, 0x5835, 0x583a, 0x583f, + 0x5843, 0x5848, 0x584d, 0x5851, 0x5856, 0x585b, 0x5860, 0x5865, + 0x5869, 0x586e, 0x5873, 0x5878, 0x587d, 0x5882, 0x5887, 0x588c, + 0x5891, 0x5896, 0x589b, 0x58a0, 0x58a5, 0x58aa, 0x58af, 0x58b5, + 0x58ba, 0x58bf, 0x58c4, 0x58c9, 0x58cf, 0x58d4, 0x58d9, 0x58df, + 0x58e4, 0x58e9, 0x58ef, 0x58f4, 0x58fa, 0x58ff, 0x5905, 0x590a, + 0x5910, 0x5915, 0x591b, 0x5921, 0x5926, 0x592c, 0x5932, 0x5937, + 0x593d, 0x5943, 0x5949, 0x594f, 0x5954, 0x595a, 0x5960, 0x5966, + 0x596c, 0x5972, 0x5978, 0x597e, 0x5984, 0x598a, 0x5990, 0x5996, + 0x599d, 0x59a3, 0x59a9, 0x59af, 0x59b6, 0x59bc, 0x59c2, 0x59c9, + 0x59cf, 0x59d5, 0x59dc, 0x59e2, 0x59e9, 0x59ef, 0x59f6, 0x59fc, + 0x5a03, 0x5a0a, 0x5a10, 0x5a17, 0x5a1e, 0x5a24, 0x5a2b, 0x5a32, + 0x5a39, 0x5a40, 0x5a46, 0x5a4d, 0x5a54, 0x5a5b, 0x5a62, 0x5a69, + 0x5a70, 0x5a78, 0x5a7f, 0x5a86, 0x5a8d, 0x5a94, 0x5a9b, 0x5aa3, + 0x5aaa, 0x5ab1, 0x5ab9, 0x5ac0, 0x5ac8, 0x5acf, 0x5ad7, 0x5ade, + 0x5ae6, 0x5aed, 0x5af5, 0x5afd, 0x5b04, 0x5b0c, 0x5b14, 0x5b1c, + 0x5b23, 0x5b2b, 0x5b33, 0x5b3b, 0x5b43, 0x5b4b, 0x5b53, 0x5b5b, + 0x5b63, 0x5b6c, 0x5b74, 0x5b7c, 0x5b84, 0x5b8c, 0x5b95, 0x5b9d, + 0x5ba6, 0x5bae, 0x5bb6, 0x5bbf, 0x5bc7, 0x5bd0, 0x5bd9, 0x5be1, + 0x5bea, 0x5bf3, 0x5bfb, 0x5c02, 0x5c07, 0x5c0b, 0x5c0f, 0x5c14, + 0x5c18, 0x5c1d, 0x5c21, 0x5c26, 0x5c2b, 0x5c2f, 0x5c34, 0x5c38, + 0x5c3d, 0x5c42, 0x5c46, 0x5c4b, 0x5c50, 0x5c55, 0x5c59, 0x5c5e, + 0x5c63, 0x5c68, 0x5c6d, 0x5c72, 0x5c77, 0x5c7b, 0x5c80, 0x5c85, + 0x5c8a, 0x5c8f, 0x5c94, 0x5c99, 0x5c9e, 0x5ca4, 0x5ca9, 0x5cae, + 0x5cb3, 0x5cb8, 0x5cbd, 0x5cc3, 0x5cc8, 0x5ccd, 0x5cd2, 0x5cd8, + 0x5cdd, 0x5ce2, 0x5ce8, 0x5ced, 0x5cf3, 0x5cf8, 0x5cfe, 0x5d03, + 0x5d09, 0x5d0e, 0x5d14, 0x5d19, 0x5d1f, 0x5d25, 0x5d2a, 0x5d30, + 0x5d36, 0x5d3b, 0x5d41, 0x5d47, 0x5d4d, 0x5d53, 0x5d58, 0x5d5e, + 0x5d64, 0x5d6a, 0x5d70, 0x5d76, 0x5d7c, 0x5d82, 0x5d88, 0x5d8e, + 0x5d95, 0x5d9b, 0x5da1, 0x5da7, 0x5dad, 0x5db4, 0x5dba, 0x5dc0, + 0x5dc7, 0x5dcd, 0x5dd3, 0x5dda, 0x5de0, 0x5de7, 0x5ded, 0x5df4, + 0x5dfa, 0x5e01, 0x5e07, 0x5e0e, 0x5e15, 0x5e1b, 0x5e22, 0x5e29, + 0x5e30, 0x5e37, 0x5e3d, 0x5e44, 0x5e4b, 0x5e52, 0x5e59, 0x5e60, + 0x5e67, 0x5e6e, 0x5e75, 0x5e7c, 0x5e84, 0x5e8b, 0x5e92, 0x5e99, + 0x5ea0, 0x5ea8, 0x5eaf, 0x5eb6, 0x5ebe, 0x5ec5, 0x5ecd, 0x5ed4, + 0x5edc, 0x5ee3, 0x5eeb, 0x5ef3, 0x5efa, 0x5f02, 0x5f0a, 0x5f11, + 0x5f19, 0x5f21, 0x5f29, 0x5f31, 0x5f39, 0x5f41, 0x5f49, 0x5f51, + 0x5f59, 0x5f61, 0x5f69, 0x5f71, 0x5f79, 0x5f82, 0x5f8a, 0x5f92, + 0x5f9b, 0x5fa3, 0x5fab, 0x5fb4, 0x5fbc, 0x5fc5, 0x5fcd, 0x5fd6, + 0x5fdf, 0x5fe7, 0x5ff0, 0x5ff9, 0x6001, 0x6005, 0x600a, 0x600e, + 0x6013, 0x6017, 0x601c, 0x6020, 0x6025, 0x6029, 0x602e, 0x6032, + 0x6037, 0x603c, 0x6040, 0x6045, 0x604a, 0x604e, 0x6053, 0x6058, + 0x605d, 0x6062, 0x6066, 0x606b, 0x6070, 0x6075, 0x607a, 0x607f, + 0x6084, 0x6089, 0x608e, 0x6093, 0x6098, 0x609d, 0x60a2, 0x60a7, + 0x60ac, 0x60b1, 0x60b7, 0x60bc, 0x60c1, 0x60c6, 0x60cb, 0x60d1, + 0x60d6, 0x60db, 0x60e1, 0x60e6, 0x60eb, 0x60f1, 0x60f6, 0x60fc, + 0x6101, 0x6107, 0x610c, 0x6112, 0x6118, 0x611d, 0x6123, 0x6128, + 0x612e, 0x6134, 0x613a, 0x613f, 0x6145, 0x614b, 0x6151, 0x6157, + 0x615d, 0x6162, 0x6168, 0x616e, 0x6174, 0x617a, 0x6180, 0x6186, + 0x618d, 0x6193, 0x6199, 0x619f, 0x61a5, 0x61ab, 0x61b2, 0x61b8, + 0x61be, 0x61cb, 0x61d8, 0x61e5, 0x61f2, 0x61ff, 0x620c, 0x6219, + 0x6227, 0x6234, 0x6242, 0x6250, 0x625e, 0x626c, 0x627a, 0x6288, + 0x6297, 0x62a5, 0x62b4, 0x62c3, 0x62d2, 0x62e1, 0x62f0, 0x62ff, + 0x630f, 0x631f, 0x632e, 0x633e, 0x634e, 0x635e, 0x636f, 0x637f, + 0x6390, 0x63a0, 0x63b1, 0x63c2, 0x63d3, 0x63e5, 0x63f6, 0x6404, + 0x640d, 0x6416, 0x641f, 0x6428, 0x6431, 0x643a, 0x6444, 0x644d, + 0x6456, 0x6460, 0x646a, 0x6473, 0x647d, 0x6487, 0x6491, 0x649b, + 0x64a5, 0x64b0, 0x64ba, 0x64c5, 0x64cf, 0x64da, 0x64e4, 0x64ef, + 0x64fa, 0x6505, 0x6510, 0x651b, 0x6527, 0x6532, 0x653e, 0x6549, + 0x6555, 0x6561, 0x656c, 0x6578, 0x6585, 0x6591, 0x659d, 0x65a9, + 0x65b6, 0x65c3, 0x65cf, 0x65dc, 0x65e9, 0x65f6, 0x6603, 0x6611, + 0x661e, 0x662b, 0x6639, 0x6647, 0x6655, 0x6663, 0x6671, 0x667f, + 0x668d, 0x669c, 0x66aa, 0x66b9, 0x66c8, 0x66d7, 0x66e6, 0x66f5, + 0x6705, 0x6714, 0x6724, 0x6734, 0x6744, 0x6754, 0x6764, 0x6774, + 0x6785, 0x6795, 0x67a6, 0x67b7, 0x67c8, 0x67d9, 0x67ea, 0x67fc, + 0x6807, 0x6810, 0x6819, 0x6822, 0x682b, 0x6834, 0x683d, 0x6847, + 0x6850, 0x685a, 0x6863, 0x686d, 0x6877, 0x6881, 0x688b, 0x6895, + 0x689f, 0x68a9, 0x68b3, 0x68be, 0x68c8, 0x68d3, 0x68dd, 0x68e8, + 0x68f3, 0x68fe, 0x6909, 0x6914, 0x691f, 0x692b, 0x6936, 0x6941, + 0x694d, 0x6959, 0x6965, 0x6971, 0x697d, 0x6989, 0x6995, 0x69a1, + 0x69ae, 0x69ba, 0x69c7, 0x69d4, 0x69e1, 0x69ee, 0x69fb, 0x6a08, + 0x6a15, 0x6a23, 0x6a30, 0x6a3e, 0x6a4c, 0x6a5a, 0x6a68, 0x6a76, + 0x6a84, 0x6a92, 0x6aa1, 0x6ab0, 0x6abe, 0x6acd, 0x6adc, 0x6aeb, + 0x6afb, 0x6b0a, 0x6b1a, 0x6b29, 0x6b39, 0x6b49, 0x6b59, 0x6b69, + 0x6b7a, 0x6b8a, 0x6b9b, 0x6bac, 0x6bbd, 0x6bce, 0x6bdf, 0x6bf0, + 0x6c01, 0x6c0a, 0x6c13, 0x6c1c, 0x6c25, 0x6c2e, 0x6c37, 0x6c41, + 0x6c4a, 0x6c53, 0x6c5d, 0x6c67, 0x6c70, 0x6c7a, 0x6c84, 0x6c8e, + 0x6c98, 0x6ca2, 0x6cac, 0x6cb7, 0x6cc1, 0x6ccc, 0x6cd6, 0x6ce1, + 0x6cec, 0x6cf7, 0x6d02, 0x6d0d, 0x6d18, 0x6d23, 0x6d2e, 0x6d3a, + 0x6d45, 0x6d51, 0x6d5d, 0x6d69, 0x6d75, 0x6d81, 0x6d8d, 0x6d99, + 0x6da5, 0x6db2, 0x6dbf, 0x6dcb, 0x6dd8, 0x6de5, 0x6df2, 0x6dff, + 0x6e0c, 0x6e1a, 0x6e27, 0x6e35, 0x6e43, 0x6e50, 0x6e5e, 0x6e6c, + 0x6e7b, 0x6e89, 0x6e97, 0x6ea6, 0x6eb5, 0x6ec3, 0x6ed2, 0x6ee1, + 0x6ef1, 0x6f00, 0x6f0f, 0x6f1f, 0x6f2f, 0x6f3f, 0x6f4f, 0x6f5f, + 0x6f6f, 0x6f7f, 0x6f90, 0x6fa1, 0x6fb2, 0x6fc3, 0x6fd4, 0x6fe5, + 0x6ff6, 0x7004, 0x700d, 0x7016, 0x701f, 0x7028, 0x7031, 0x703a, + 0x7044, 0x704d, 0x7057, 0x7060, 0x706a, 0x7074, 0x707e, 0x7087, + 0x7091, 0x709c, 0x70a6, 0x70b0, 0x70ba, 0x70c5, 0x70cf, 0x70da, + 0x70e5, 0x70f0, 0x70fa, 0x7105, 0x7111, 0x711c, 0x7127, 0x7132, + 0x713e, 0x7149, 0x7155, 0x7161, 0x716d, 0x7179, 0x7185, 0x7191, + 0x719d, 0x71aa, 0x71b6, 0x71c3, 0x71d0, 0x71dc, 0x71e9, 0x71f6, + 0x7204, 0x7211, 0x721e, 0x722c, 0x7239, 0x7247, 0x7255, 0x7263, + 0x7271, 0x727f, 0x728e, 0x729c, 0x72ab, 0x72ba, 0x72c8, 0x72d7, + 0x72e7, 0x72f6, 0x7305, 0x7315, 0x7324, 0x7334, 0x7344, 0x7354, + 0x7364, 0x7375, 0x7385, 0x7396, 0x73a6, 0x73b7, 0x73c8, 0x73da, + 0x73eb, 0x73fc, 0x7407, 0x7410, 0x7419, 0x7422, 0x742b, 0x7434, + 0x743e, 0x7447, 0x7450, 0x745a, 0x7464, 0x746d, 0x7477, 0x7481, + 0x748b, 0x7495, 0x749f, 0x74a9, 0x74b4, 0x74be, 0x74c8, 0x74d3, + 0x74de, 0x74e8, 0x74f3, 0x74fe, 0x7509, 0x7514, 0x7520, 0x752b, + 0x7536, 0x7542, 0x754d, 0x7559, 0x7565, 0x7571, 0x757d, 0x7589, + 0x7595, 0x75a2, 0x75ae, 0x75bb, 0x75c7, 0x75d4, 0x75e1, 0x75ee, + 0x75fb, 0x7608, 0x7616, 0x7623, 0x7631, 0x763e, 0x764c, 0x765a, + 0x7668, 0x7676, 0x7684, 0x7693, 0x76a1, 0x76b0, 0x76bf, 0x76ce, + 0x76dd, 0x76ec, 0x76fb, 0x770b, 0x771a, 0x772a, 0x773a, 0x774a, + 0x775a, 0x776a, 0x777a, 0x778b, 0x779b, 0x77ac, 0x77bd, 0x77ce, + 0x77e0, 0x77f1, 0x7801, 0x780a, 0x7813, 0x781c, 0x7825, 0x782e, + 0x7838, 0x7841, 0x784a, 0x7854, 0x785d, 0x7867, 0x7871, 0x787a, + 0x7884, 0x788e, 0x7898, 0x78a3, 0x78ad, 0x78b7, 0x78c2, 0x78cc, + 0x78d7, 0x78e1, 0x78ec, 0x78f7, 0x7902, 0x790d, 0x7918, 0x7923, + 0x792f, 0x793a, 0x7946, 0x7951, 0x795d, 0x7969, 0x7975, 0x7981, + 0x798d, 0x7999, 0x79a6, 0x79b2, 0x79bf, 0x79cc, 0x79d8, 0x79e5, + 0x79f2, 0x79ff, 0x7a0d, 0x7a1a, 0x7a28, 0x7a35, 0x7a43, 0x7a51, + 0x7a5f, 0x7a6d, 0x7a7b, 0x7a89, 0x7a98, 0x7aa6, 0x7ab5, 0x7ac4, + 0x7ad3, 0x7ae2, 0x7af1, 0x7b00, 0x7b10, 0x7b1f, 0x7b2f, 0x7b3f, + 0x7b4f, 0x7b5f, 0x7b70, 0x7b80, 0x7b91, 0x7ba1, 0x7bb2, 0x7bc3, + 0x7bd4, 0x7be6, 0x7bf7, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 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, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, + 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8002, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, 0x8003, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0x8004, + 0x8004, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, 0x8005, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, + 0x8006, 0x8006, 0x8006, 0x8006, 0x8006, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, 0x8007, + 0x8007, 0x8007, 0x8007, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, 0x8008, + 0x8008, 0x8008, 0x8008, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, + 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x8009, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, 0x800a, + 0x800a, 0x800a, 0x800a, 0x800a, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, + 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800b, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, + 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800c, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, + 0x800d, 0x800d, 0x800d, 0x800d, 0x800d, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, + 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800e, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, 0x800f, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, + 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8010, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, 0x8011, + 0x8011, 0x8011, 0x8011, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, 0x8012, + 0x8012, 0x8012, 0x8012, 0x8012, 0x8013, 0x8013, 0x8013, 0x8013, + 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, + 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, 0x8013, + 0x8013, 0x8013, 0x8013, 0x8013, 0x8014, 0x8014, 0x8014, 0x8014, + 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, + 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, + 0x8014, 0x8014, 0x8014, 0x8014, 0x8014, 0x8015, 0x8015, 0x8015, + 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, + 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, 0x8015, + 0x8015, 0x8015, 0x8015, 0x8015, 0x8016, 0x8016, 0x8016, 0x8016, + 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, + 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, 0x8016, + 0x8016, 0x8016, 0x8016, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, + 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, + 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, 0x8017, + 0x8017, 0x8017, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, + 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, + 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8018, 0x8019, + 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, + 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, + 0x8019, 0x8019, 0x8019, 0x8019, 0x8019, 0x801a, 0x801a, 0x801a, + 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, + 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, 0x801a, + 0x801a, 0x801a, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, + 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, + 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801b, 0x801c, 0x801c, + 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, + 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, 0x801c, + 0x801c, 0x801c, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, + 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, + 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801d, 0x801e, 0x801e, + 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, + 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, 0x801e, + 0x801e, 0x801e, 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, + 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, + 0x801f, 0x801f, 0x801f, 0x801f, 0x801f, 0x8020, 0x8020, 0x8020, + 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, + 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8020, 0x8021, + 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, + 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, 0x8021, + 0x8021, 0x8021, 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, + 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, 0x8022, + 0x8022, 0x8022, 0x8022, 0x8022, 0x8023, 0x8023, 0x8023, 0x8023, + 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, + 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, 0x8023, 0x8024, 0x8024, + 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, + 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8024, 0x8025, + 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, + 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, 0x8025, + 0x8025, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, + 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, 0x8026, + 0x8026, 0x8026, 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, + 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, 0x8027, + 0x8027, 0x8027, 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, + 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, 0x8028, + 0x8028, 0x8028, 0x8028, 0x8029, 0x8029, 0x8029, 0x8029, 0x8029, + 0x8029, 0x8029, 0x8029, 0x8029, 0x8029, 0x8029, 0x8029, 0x8029, + 0x8029, 0x8029, 0x8029, 0x802a, 0x802a, 0x802a, 0x802a, 0x802a, + 0x802a, 0x802a, 0x802a, 0x802a, 0x802a, 0x802a, 0x802a, 0x802a, + 0x802a, 0x802a, 0x802a, 0x802b, 0x802b, 0x802b, 0x802b, 0x802b, + 0x802b, 0x802b, 0x802b, 0x802b, 0x802b, 0x802b, 0x802b, 0x802b, + 0x802b, 0x802b, 0x802b, 0x802c, 0x802c, 0x802c, 0x802c, 0x802c, + 0x802c, 0x802c, 0x802c, 0x802c, 0x802c, 0x802c, 0x802c, 0x802c, + 0x802c, 0x802c, 0x802c, 0x802d, 0x802d, 0x802d, 0x802d, 0x802d, + 0x802d, 0x802d, 0x802d, 0x802d, 0x802d, 0x802d, 0x802d, 0x802d, + 0x802d, 0x802d, 0x802d, 0x802e, 0x802e, 0x802e, 0x802e, 0x802e, + 0x802e, 0x802e, 0x802e, 0x802e, 0x802e, 0x802e, 0x802e, 0x802e, + 0x802e, 0x802e, 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, + 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, 0x802f, + 0x802f, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, + 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, 0x8030, + 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, + 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8031, 0x8032, + 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, + 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, 0x8032, 0x8033, 0x8033, + 0x8033, 0x8033, 0x8033, 0x8033, 0x8033, 0x8033, 0x8033, 0x8033, + 0x8033, 0x8033, 0x8033, 0x8033, 0x8034, 0x8034, 0x8034, 0x8034, + 0x8034, 0x8034, 0x8034, 0x8034, 0x8034, 0x8034, 0x8034, 0x8034, + 0x8034, 0x8034, 0x8034, 0x8035, 0x8035, 0x8035, 0x8035, 0x8035, + 0x8035, 0x8035, 0x8035, 0x8035, 0x8035, 0x8035, 0x8035, 0x8035, + 0x8035, 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, + 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, 0x8036, 0x8037, + 0x8037, 0x8037, 0x8037, 0x8037, 0x8037, 0x8037, 0x8037, 0x8037, + 0x8037, 0x8037, 0x8037, 0x8037, 0x8037, 0x8038, 0x8038, 0x8038, + 0x8038, 0x8038, 0x8038, 0x8038, 0x8038, 0x8038, 0x8038, 0x8038, + 0x8038, 0x8038, 0x8038, 0x8039, 0x8039, 0x8039, 0x8039, 0x8039, + 0x8039, 0x8039, 0x8039, 0x8039, 0x8039, 0x8039, 0x8039, 0x8039, + 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, + 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, 0x803a, 0x803b, 0x803b, + 0x803b, 0x803b, 0x803b, 0x803b, 0x803b, 0x803b, 0x803b, 0x803b, + 0x803b, 0x803b, 0x803b, 0x803c, 0x803c, 0x803c, 0x803c, 0x803c, + 0x803c, 0x803c, 0x803c, 0x803c, 0x803c, 0x803c, 0x803c, 0x803c, + 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, + 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, 0x803d, 0x803e, 0x803e, + 0x803e, 0x803e, 0x803e, 0x803e, 0x803e, 0x803e, 0x803e, 0x803e, + 0x803e, 0x803e, 0x803e, 0x803f, 0x803f, 0x803f, 0x803f, 0x803f, + 0x803f, 0x803f, 0x803f, 0x803f, 0x803f, 0x803f, 0x803f, 0x803f, + 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, + 0x8040, 0x8040, 0x8040, 0x8040, 0x8041, 0x8041, 0x8041, 0x8041, + 0x8041, 0x8041, 0x8041, 0x8041, 0x8041, 0x8041, 0x8041, 0x8041, + 0x8041, 0x8042, 0x8042, 0x8042, 0x8042, 0x8042, 0x8042, 0x8042, + 0x8042, 0x8042, 0x8042, 0x8042, 0x8042, 0x8042, 0x8043, 0x8043, + 0x8043, 0x8043, 0x8043, 0x8043, 0x8043, 0x8043, 0x8043, 0x8043, + 0x8043, 0x8043, 0x8044, 0x8044, 0x8044, 0x8044, 0x8044, 0x8044, + 0x8044, 0x8044, 0x8044, 0x8044, 0x8044, 0x8044, 0x8044, 0x8045, + 0x8045, 0x8045, 0x8045, 0x8045, 0x8045, 0x8045, 0x8045, 0x8045, + 0x8045, 0x8045, 0x8045, 0x8046, 0x8046, 0x8046, 0x8046, 0x8046, + 0x8046, 0x8046, 0x8046, 0x8046, 0x8046, 0x8046, 0x8046, 0x8047, + 0x8047, 0x8047, 0x8047, 0x8047, 0x8047, 0x8047, 0x8047, 0x8047, + 0x8047, 0x8047, 0x8047, 0x8048, 0x8048, 0x8048, 0x8048, 0x8048, + 0x8048, 0x8048, 0x8048, 0x8048, 0x8048, 0x8048, 0x8048, 0x8049, + 0x8049, 0x8049, 0x8049, 0x8049, 0x8049, 0x8049, 0x8049, 0x8049, + 0x8049, 0x8049, 0x8049, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, + 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804a, 0x804b, + 0x804b, 0x804b, 0x804b, 0x804b, 0x804b, 0x804b, 0x804b, 0x804b, + 0x804b, 0x804b, 0x804b, 0x804c, 0x804c, 0x804c, 0x804c, 0x804c, + 0x804c, 0x804c, 0x804c, 0x804c, 0x804c, 0x804c, 0x804c, 0x804d, + 0x804d, 0x804d, 0x804d, 0x804d, 0x804d, 0x804d, 0x804d, 0x804d, + 0x804d, 0x804d, 0x804e, 0x804e, 0x804e, 0x804e, 0x804e, 0x804e, + 0x804e, 0x804e, 0x804e, 0x804e, 0x804e, 0x804e, 0x804f, 0x804f, + 0x804f, 0x804f, 0x804f, 0x804f, 0x804f, 0x804f, 0x804f, 0x804f, + 0x804f, 0x8050, 0x8050, 0x8050, 0x8050, 0x8050, 0x8050, 0x8050, + 0x8050, 0x8050, 0x8050, 0x8050, 0x8051, 0x8051, 0x8051, 0x8051, + 0x8051, 0x8051, 0x8051, 0x8051, 0x8051, 0x8051, 0x8051, 0x8051, + 0x8052, 0x8052, 0x8052, 0x8052, 0x8052, 0x8052, 0x8052, 0x8052, + 0x8052, 0x8052, 0x8052, 0x8053, 0x8053, 0x8053, 0x8053, 0x8053, + 0x8053, 0x8053, 0x8053, 0x8053, 0x8053, 0x8053, 0x8054, 0x8054, + 0x8054, 0x8054, 0x8054, 0x8054, 0x8054, 0x8054, 0x8054, 0x8054, + 0x8054, 0x8055, 0x8055, 0x8055, 0x8055, 0x8055, 0x8056, 0x8056, + 0x8056, 0x8056, 0x8056, 0x8056, 0x8057, 0x8057, 0x8057, 0x8057, + 0x8057, 0x8058, 0x8058, 0x8058, 0x8058, 0x8058, 0x8058, 0x8059, + 0x8059, 0x8059, 0x8059, 0x8059, 0x805a, 0x805a, 0x805a, 0x805a, + 0x805a, 0x805b, 0x805b, 0x805b, 0x805b, 0x805b, 0x805b, 0x805c, + 0x805c, 0x805c, 0x805c, 0x805c, 0x805d, 0x805d, 0x805d, 0x805d, + 0x805d, 0x805e, 0x805e, 0x805e, 0x805e, 0x805e, 0x805f, 0x805f, + 0x805f, 0x805f, 0x805f, 0x8060, 0x8060, 0x8060, 0x8060, 0x8060, + 0x8060, 0x8061, 0x8061, 0x8061, 0x8061, 0x8061, 0x8062, 0x8062, + 0x8062, 0x8062, 0x8062, 0x8063, 0x8063, 0x8063, 0x8063, 0x8063, + 0x8064, 0x8064, 0x8064, 0x8064, 0x8064, 0x8065, 0x8065, 0x8065, + 0x8065, 0x8065, 0x8066, 0x8066, 0x8066, 0x8066, 0x8066, 0x8067, + 0x8067, 0x8067, 0x8067, 0x8067, 0x8068, 0x8068, 0x8068, 0x8068, + 0x8068, 0x8069, 0x8069, 0x8069, 0x8069, 0x8069, 0x806a, 0x806a, + 0x806a, 0x806a, 0x806b, 0x806b, 0x806b, 0x806b, 0x806b, 0x806c, + 0x806c, 0x806c, 0x806c, 0x806c, 0x806d, 0x806d, 0x806d, 0x806d, + 0x806d, 0x806e, 0x806e, 0x806e, 0x806e, 0x806e, 0x806f, 0x806f, + 0x806f, 0x806f, 0x8070, 0x8070, 0x8070, 0x8070, 0x8070, 0x8071, + 0x8071, 0x8071, 0x8071, 0x8071, 0x8072, 0x8072, 0x8072, 0x8072, + 0x8073, 0x8073, 0x8073, 0x8073, 0x8073, 0x8074, 0x8074, 0x8074, + 0x8074, 0x8074, 0x8075, 0x8075, 0x8075, 0x8075, 0x8076, 0x8076, + 0x8076, 0x8076, 0x8076, 0x8077, 0x8077, 0x8077, 0x8077, 0x8077, + 0x8078, 0x8078, 0x8078, 0x8078, 0x8079, 0x8079, 0x8079, 0x8079, + 0x8079, 0x807a, 0x807a, 0x807a, 0x807a, 0x807b, 0x807b, 0x807b, + 0x807b, 0x807b, 0x807c, 0x807c, 0x807c, 0x807c, 0x807d, 0x807d, + 0x807d, 0x807d, 0x807d, 0x807e, 0x807e, 0x807e, 0x807e, 0x807f, + 0x807f, 0x807f, 0x807f, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, + 0x8081, 0x8081, 0x8081, 0x8081, 0x8082, 0x8082, 0x8082, 0x8082, + 0x8082, 0x8083, 0x8083, 0x8083, 0x8083, 0x8084, 0x8084, 0x8084, + 0x8084, 0x8085, 0x8085, 0x8085, 0x8085, 0x8086, 0x8086, 0x8086, + 0x8086, 0x8086, 0x8087, 0x8087, 0x8087, 0x8087, 0x8088, 0x8088, + 0x8088, 0x8088, 0x8089, 0x8089, 0x8089, 0x8089, 0x8089, 0x808a, + 0x808a, 0x808a, 0x808a, 0x808b, 0x808b, 0x808b, 0x808b, 0x808c, + 0x808c, 0x808c, 0x808c, 0x808d, 0x808d, 0x808d, 0x808d, 0x808e, + 0x808e, 0x808e, 0x808e, 0x808f, 0x808f, 0x808f, 0x808f, 0x808f, + 0x8090, 0x8090, 0x8090, 0x8090, 0x8091, 0x8091, 0x8091, 0x8091, + 0x8092, 0x8092, 0x8092, 0x8092, 0x8093, 0x8093, 0x8093, 0x8093, + 0x8094, 0x8094, 0x8094, 0x8094, 0x8095, 0x8095, 0x8095, 0x8095, + 0x8096, 0x8096, 0x8096, 0x8096, 0x8097, 0x8097, 0x8097, 0x8097, + 0x8098, 0x8098, 0x8098, 0x8098, 0x8099, 0x8099, 0x8099, 0x8099, + 0x809a, 0x809a, 0x809a, 0x809a, 0x809b, 0x809b, 0x809b, 0x809b, + 0x809c, 0x809c, 0x809c, 0x809c, 0x809d, 0x809d, 0x809d, 0x809d, + 0x809e, 0x809e, 0x809e, 0x809e, 0x809f, 0x809f, 0x809f, 0x809f, + 0x80a0, 0x80a0, 0x80a0, 0x80a0, 0x80a1, 0x80a1, 0x80a1, 0x80a2, + 0x80a2, 0x80a2, 0x80a2, 0x80a3, 0x80a3, 0x80a3, 0x80a3, 0x80a4, + 0x80a4, 0x80a4, 0x80a4, 0x80a5, 0x80a5, 0x80a5, 0x80a5, 0x80a6, + 0x80a6, 0x80a6, 0x80a6, 0x80a7, 0x80a7, 0x80a7, 0x80a8, 0x80a8, + 0x80a8, 0x80a8, 0x80a9, 0x80a9, 0x80a9, 0x80a9, 0x80aa, 0x80aa, + 0x80aa, 0x80aa, 0x80ab, 0x80ab, 0x80ab, 0x80ab, 0x80ac, 0x80ac, + 0x80ac, 0x80ad, 0x80ad, 0x80ad, 0x80ad, 0x80ae, 0x80ae, 0x80ae, + 0x80ae, 0x80af, 0x80af, 0x80af, 0x80b0, 0x80b0, 0x80b0, 0x80b0, + 0x80b1, 0x80b1, 0x80b1, 0x80b1, 0x80b2, 0x80b2, 0x80b2, 0x80b3, + 0x80b3, 0x80b3, 0x80b3, 0x80b4, 0x80b4, 0x80b4, 0x80b4, 0x80b5, + 0x80b5, 0x80b5, 0x80b6, 0x80b6, 0x80b6, 0x80b6, 0x80b7, 0x80b7, + 0x80b7, 0x80b7, 0x80b8, 0x80b8, 0x80b8, 0x80b9, 0x80b9, 0x80b9, + 0x80b9, 0x80ba, 0x80ba, 0x80ba, 0x80bb, 0x80bb, 0x80bb, 0x80bb, + 0x80bc, 0x80bc, 0x80bc, 0x80bc, 0x80bd, 0x80bd, 0x80bd, 0x80be, + 0x80be, 0x80be, 0x80be, 0x80bf, 0x80bf, 0x80bf, 0x80c0, 0x80c0, + 0x80c0, 0x80c0, 0x80c1, 0x80c1, 0x80c1, 0x80c2, 0x80c2, 0x80c2, + 0x80c2, 0x80c3, 0x80c3, 0x80c3, 0x80c4, 0x80c4, 0x80c4, 0x80c4, + 0x80c5, 0x80c5, 0x80c5, 0x80c6, 0x80c6, 0x80c6, 0x80c6, 0x80c7, + 0x80c7, 0x80c7, 0x80c8, 0x80c8, 0x80c8, 0x80c8, 0x80c9, 0x80c9, + 0x80c9, 0x80ca, 0x80ca, 0x80ca, 0x80cb, 0x80cb, 0x80cb, 0x80cb, + 0x80cc, 0x80cc, 0x80cc, 0x80cd, 0x80cd, 0x80cd, 0x80cd, 0x80ce, + 0x80ce, 0x80ce, 0x80cf, 0x80cf, 0x80cf, 0x80d0, 0x80d0, 0x80d0, + 0x80d0, 0x80d1, 0x80d1, 0x80d1, 0x80d2, 0x80d2, 0x80d2, 0x80d3, + 0x80d3, 0x80d3, 0x80d3, 0x80d4, 0x80d4, 0x80d4, 0x80d5, 0x80d5, + 0x80d5, 0x80d6, 0x80d6, 0x80d6, 0x80d6, 0x80d7, 0x80d7, 0x80d7, + 0x80d8, 0x80d8, 0x80d8, 0x80d9, 0x80d9, 0x80d9, 0x80d9, 0x80da, + 0x80da, 0x80da, 0x80db, 0x80db, 0x80db, 0x80dc, 0x80dc, 0x80dc, + 0x80dc, 0x80dd, 0x80dd, 0x80dd, 0x80de, 0x80de, 0x80de, 0x80df, + 0x80df, 0x80df, 0x80e0, 0x80e0, 0x80e0, 0x80e0, 0x80e1, 0x80e1, + 0x80e1, 0x80e2, 0x80e2, 0x80e2, 0x80e3, 0x80e3, 0x80e3, 0x80e4, + 0x80e4, 0x80e4, 0x80e5, 0x80e5, 0x80e5, 0x80e5, 0x80e6, 0x80e6, + 0x80e6, 0x80e7, 0x80e7, 0x80e7, 0x80e8, 0x80e8, 0x80e8, 0x80e9, + 0x80e9, 0x80e9, 0x80ea, 0x80ea, 0x80ea, 0x80eb, 0x80eb, 0x80eb, + 0x80eb, 0x80ec, 0x80ec, 0x80ec, 0x80ed, 0x80ed, 0x80ed, 0x80ee, + 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80f0, 0x80f0, 0x80f0, + 0x80f1, 0x80f1, 0x80f1, 0x80f2, 0x80f2, 0x80f2, 0x80f2, 0x80f3, + 0x80f3, 0x80f3, 0x80f4, 0x80f4, 0x80f4, 0x80f5, 0x80f5, 0x80f5, + 0x80f6, 0x80f6, 0x80f6, 0x80f7, 0x80f7, 0x80f7, 0x80f8, 0x80f8, + 0x80f8, 0x80f9, 0x80f9, 0x80f9, 0x80fa, 0x80fa, 0x80fa, 0x80fb, + 0x80fb, 0x80fb, 0x80fc, 0x80fc, 0x80fc, 0x80fd, 0x80fd, 0x80fd, + 0x80fe, 0x80fe, 0x80fe, 0x80ff, 0x80ff, 0x80ff, 0x8100, 0x8100, + 0x8100, 0x8101, 0x8101, 0x8101, 0x8102, 0x8102, 0x8102, 0x8103, + 0x8103, 0x8103, 0x8104, 0x8104, 0x8104, 0x8105, 0x8105, 0x8105, + 0x8106, 0x8106, 0x8106, 0x8107, 0x8107, 0x8107, 0x8108, 0x8108, + 0x8108, 0x8109, 0x8109, 0x8109, 0x810a, 0x810a, 0x810a, 0x810b, + 0x810b, 0x810b, 0x810c, 0x810c, 0x810c, 0x810d, 0x810d, 0x810d, + 0x810e, 0x810e, 0x810e, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, + 0x8110, 0x8111, 0x8111, 0x8112, 0x8112, 0x8112, 0x8113, 0x8113, + 0x8113, 0x8114, 0x8114, 0x8114, 0x8115, 0x8115, 0x8115, 0x8116, + 0x8116, 0x8116, 0x8117, 0x8117, 0x8117, 0x8118, 0x8118, 0x8118, + 0x8119, 0x8119, 0x8119, 0x811a, 0x811a, 0x811b, 0x811b, 0x811b, + 0x811c, 0x811c, 0x811c, 0x811d, 0x811d, 0x811d, 0x811e, 0x811e, + 0x811e, 0x811f, 0x811f, 0x811f, 0x8120, 0x8120, 0x8121, 0x8121, + 0x8121, 0x8122, 0x8122, 0x8122, 0x8123, 0x8123, 0x8123, 0x8124, + 0x8124, 0x8124, 0x8125, 0x8125, 0x8126, 0x8126, 0x8126, 0x8127, + 0x8127, 0x8127, 0x8128, 0x8128, 0x8128, 0x8129, 0x8129, 0x8129, + 0x812a, 0x812a, 0x812b, 0x812b, 0x812b, 0x812c, 0x812c, 0x812c, + 0x812d, 0x812d, 0x812d, 0x812e, 0x812e, 0x812f, 0x812f, 0x812f, + 0x8130, 0x8130, 0x8130, 0x8131, 0x8131, 0x8131, 0x8132, 0x8132, + 0x8133, 0x8133, 0x8133, 0x8134, 0x8134, 0x8134, 0x8135, 0x8135, + 0x8136, 0x8136, 0x8136, 0x8137, 0x8137, 0x8137, 0x8138, 0x8138, + 0x8138, 0x8139, 0x8139, 0x813a, 0x813a, 0x813a, 0x813b, 0x813b, + 0x813b, 0x813c, 0x813c, 0x813d, 0x813d, 0x813d, 0x813e, 0x813e, + 0x813e, 0x813f, 0x813f, 0x8140, 0x8140, 0x8140, 0x8141, 0x8141, + 0x8141, 0x8142, 0x8142, 0x8143, 0x8143, 0x8143, 0x8144, 0x8144, + 0x8144, 0x8145, 0x8145, 0x8146, 0x8146, 0x8146, 0x8147, 0x8147, + 0x8147, 0x8148, 0x8148, 0x8149, 0x8149, 0x8149, 0x814a, 0x814a, + 0x814b, 0x814b, 0x814b, 0x814c, 0x814c, 0x814c, 0x814d, 0x814d, + 0x814e, 0x814e, 0x814e, 0x814f, 0x814f, 0x8150, 0x8150, 0x8150, + 0x8151, 0x8151, 0x8151, 0x8152, 0x8152, 0x8153, 0x8153, 0x8153, + 0x8154, 0x8154, 0x8155, 0x8155, 0x8155, 0x8156, 0x8156, 0x8156, + 0x8157, 0x8157, 0x8158, 0x8158, 0x8158, 0x8159, 0x8159, 0x815a, + 0x815a, 0x815a, 0x815b, 0x815b, 0x815c, 0x815c, 0x815c, 0x815d, + 0x815d, 0x815e, 0x815e, 0x815e, 0x815f, 0x815f, 0x815f, 0x8160, + 0x8160, 0x8161, 0x8161, 0x8161, 0x8162, 0x8162, 0x8163, 0x8163, + 0x8163, 0x8164, 0x8164, 0x8165, 0x8165, 0x8165, 0x8166, 0x8166, + 0x8167, 0x8167, 0x8167, 0x8168, 0x8168, 0x8169, 0x8169, 0x8169, + 0x816a, 0x816a, 0x816b, 0x816b, 0x816b, 0x816c, 0x816c, 0x816d, + 0x816d, 0x816d, 0x816e, 0x816e, 0x816f, 0x816f, 0x816f, 0x8170, + 0x8170, 0x8171, 0x8171, 0x8172, 0x8172, 0x8172, 0x8173, 0x8173, + 0x8174, 0x8174, 0x8174, 0x8175, 0x8175, 0x8176, 0x8176, 0x8176, + 0x8177, 0x8177, 0x8178, 0x8178, 0x8178, 0x8179, 0x8179, 0x817a, + 0x817a, 0x817b, 0x817b, 0x817b, 0x817c, 0x817c, 0x817d, 0x817d, + 0x817d, 0x817e, 0x817e, 0x817f, 0x817f, 0x817f, 0x8180, 0x8180, + 0x8181, 0x8181, 0x8182, 0x8182, 0x8182, 0x8183, 0x8183, 0x8184, + 0x8184, 0x8185, 0x8186, 0x8187, 0x8187, 0x8188, 0x8189, 0x818a, + 0x818b, 0x818c, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, + 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8197, + 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819d, 0x819e, + 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a4, 0x81a5, + 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ab, 0x81ac, + 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b2, 0x81b3, + 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81ba, + 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, + 0x81c3, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, + 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81ce, 0x81cf, 0x81d0, + 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, + 0x81d9, 0x81da, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, + 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, + 0x81e8, 0x81e9, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, + 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, + 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, + 0x81ff, 0x81ff, 0x8200, 0x8201, 0x8202, 0x8203, 0x8204, 0x8205, + 0x8206, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b, 0x820c, 0x820d, + 0x820e, 0x820f, 0x8210, 0x8211, 0x8212, 0x8213, 0x8214, 0x8215, + 0x8216, 0x8217, 0x8218, 0x8219, 0x821a, 0x821b, 0x821c, 0x821d, + 0x821e, 0x821f, 0x8220, 0x8221, 0x8222, 0x8223, 0x8224, 0x8225, + 0x8226, 0x8227, 0x8228, 0x8229, 0x822a, 0x822b, 0x822c, 0x822d, + 0x822e, 0x822f, 0x8230, 0x8231, 0x8232, 0x8233, 0x8234, 0x8235, + 0x8236, 0x8237, 0x8238, 0x8239, 0x823a, 0x823b, 0x823c, 0x823e, + 0x823f, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, + 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, + 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8257, + 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, + 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8267, 0x8268, + 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, + 0x8271, 0x8272, 0x8273, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, + 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x827f, 0x8281, 0x8282, + 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, + 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, + 0x8294, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, + 0x829d, 0x829e, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, + 0x82a6, 0x82a7, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, + 0x82af, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, + 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c1, + 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c8, 0x82c9, 0x82ca, + 0x82cb, 0x82cc, 0x82cd, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, + 0x82d4, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dd, + 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e3, 0x82e4, 0x82e5, 0x82e6, + 0x82e7, 0x82e8, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82f0, + 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f6, 0x82f7, 0x82f8, 0x82f9, + 0x82fa, 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x8302, 0x8303, + 0x8304, 0x8305, 0x8307, 0x8308, 0x8309, 0x830a, 0x830b, 0x830d, + 0x830e, 0x830f, 0x8310, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, + 0x8318, 0x8319, 0x831a, 0x831b, 0x831d, 0x831e, 0x831f, 0x8320, + 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8328, 0x8329, 0x832a, + 0x832b, 0x832d, 0x832e, 0x832f, 0x8330, 0x8332, 0x8333, 0x8334, + 0x8335, 0x8337, 0x8338, 0x8339, 0x833b, 0x833c, 0x833d, 0x833e, + 0x8340, 0x8341, 0x8342, 0x8343, 0x8345, 0x8346, 0x8347, 0x8348, + 0x834a, 0x834b, 0x834c, 0x834e, 0x834f, 0x8350, 0x8351, 0x8353, + 0x8354, 0x8355, 0x8356, 0x8358, 0x8359, 0x835a, 0x835c, 0x835d, + 0x835e, 0x835f, 0x8361, 0x8362, 0x8363, 0x8365, 0x8366, 0x8367, + 0x8369, 0x836a, 0x836b, 0x836c, 0x836e, 0x836f, 0x8370, 0x8372, + 0x8373, 0x8374, 0x8376, 0x8377, 0x8378, 0x8379, 0x837b, 0x837c, + 0x837d, 0x837f, 0x8380, 0x8381, 0x8383, 0x8384, 0x8385, 0x8387, + 0x8388, 0x8389, 0x838b, 0x838c, 0x838d, 0x838f, 0x8390, 0x8391, + 0x8393, 0x8394, 0x8395, 0x8397, 0x8398, 0x8399, 0x839b, 0x839c, + 0x839d, 0x839f, 0x83a0, 0x83a1, 0x83a3, 0x83a4, 0x83a5, 0x83a7, + 0x83a8, 0x83a9, 0x83ab, 0x83ac, 0x83ad, 0x83af, 0x83b0, 0x83b1, + 0x83b3, 0x83b4, 0x83b6, 0x83b7, 0x83b8, 0x83ba, 0x83bb, 0x83bc, + 0x83be, 0x83bf, 0x83c0, 0x83c2, 0x83c3, 0x83c5, 0x83c6, 0x83c7, + 0x83c9, 0x83ca, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2, + 0x83d4, 0x83d5, 0x83d6, 0x83d8, 0x83d9, 0x83db, 0x83dc, 0x83dd, + 0x83df, 0x83e0, 0x83e2, 0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, + 0x83ea, 0x83eb, 0x83ed, 0x83ee, 0x83ef, 0x83f1, 0x83f2, 0x83f4, + 0x83f5, 0x83f7, 0x83f8, 0x83f9, 0x83fb, 0x83fc, 0x83fe, 0x83ff, + 0x8400, 0x8402, 0x8403, 0x8405, 0x8406, 0x8407, 0x8409, 0x840a, + 0x840c, 0x840d, 0x840f, 0x8410, 0x8411, 0x8413, 0x8414, 0x8416, + 0x8417, 0x8419, 0x841a, 0x841b, 0x841d, 0x841e, 0x8420, 0x8421, + 0x8423, 0x8424, 0x8426, 0x8427, 0x8428, 0x842a, 0x842b, 0x842d, + 0x842e, 0x8430, 0x8431, 0x8433, 0x8434, 0x8436, 0x8437, 0x8438, + 0x843a, 0x843b, 0x843d, 0x843e, 0x8440, 0x8441, 0x8443, 0x8444, + 0x8446, 0x8447, 0x8449, 0x844a, 0x844b, 0x844d, 0x844e, 0x8450, + 0x8451, 0x8453, 0x8454, 0x8456, 0x8457, 0x8459, 0x845a, 0x845c, + 0x845d, 0x845f, 0x8460, 0x8462, 0x8463, 0x8465, 0x8466, 0x8468, + 0x8469, 0x846b, 0x846c, 0x846e, 0x846f, 0x8471, 0x8472, 0x8474, + 0x8475, 0x8477, 0x8478, 0x847a, 0x847b, 0x847d, 0x847e, 0x8480, + 0x8481, 0x8483, 0x8484, 0x8486, 0x8487, 0x8489, 0x848a, 0x848c, + 0x848d, 0x848f, 0x8490, 0x8492, 0x8493, 0x8495, 0x8496, 0x8498, + 0x8499, 0x849b, 0x849c, 0x849e, 0x84a0, 0x84a1, 0x84a3, 0x84a4, + 0x84a6, 0x84a7, 0x84a9, 0x84aa, 0x84ac, 0x84ad, 0x84af, 0x84b0, + 0x84b2, 0x84b4, 0x84b5, 0x84b7, 0x84b8, 0x84ba, 0x84bb, 0x84bd, + 0x84be, 0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c8, 0x84c9, + 0x84cb, 0x84cc, 0x84ce, 0x84d0, 0x84d1, 0x84d3, 0x84d4, 0x84d6, + 0x84d7, 0x84d9, 0x84db, 0x84dc, 0x84de, 0x84df, 0x84e1, 0x84e2, + 0x84e4, 0x84e6, 0x84e7, 0x84e9, 0x84ea, 0x84ec, 0x84ed, 0x84ef, + 0x84f1, 0x84f2, 0x84f4, 0x84f5, 0x84f7, 0x84f9, 0x84fa, 0x84fc, + 0x84fd, 0x84ff, 0x8501, 0x8502, 0x8504, 0x8505, 0x8507, 0x8509, + 0x850a, 0x850c, 0x850d, 0x850f, 0x8511, 0x8512, 0x8514, 0x8515, + 0x8517, 0x8519, 0x851a, 0x851c, 0x851e, 0x851f, 0x8521, 0x8522, + 0x8524, 0x8526, 0x8527, 0x8529, 0x852b, 0x852c, 0x852e, 0x852f, + 0x8531, 0x8533, 0x8534, 0x8536, 0x8538, 0x8539, 0x853b, 0x853c, + 0x853e, 0x8540, 0x8541, 0x8543, 0x8545, 0x8546, 0x8548, 0x854a, + 0x854b, 0x854d, 0x854f, 0x8550, 0x8552, 0x8554, 0x8555, 0x8557, + 0x8559, 0x855a, 0x855c, 0x855e, 0x855f, 0x8561, 0x8562, 0x8564, + 0x8566, 0x8567, 0x8569, 0x856b, 0x856c, 0x856e, 0x8570, 0x8572, + 0x8573, 0x8575, 0x8577, 0x8578, 0x857a, 0x857c, 0x857d, 0x857f, + 0x8581, 0x8582, 0x8584, 0x8586, 0x8587, 0x8589, 0x858b, 0x858c, + 0x858e, 0x8590, 0x8592, 0x8593, 0x8595, 0x8597, 0x8598, 0x859a, + 0x859c, 0x859d, 0x859f, 0x85a1, 0x85a3, 0x85a4, 0x85a6, 0x85a8, + 0x85a9, 0x85ab, 0x85ad, 0x85af, 0x85b0, 0x85b2, 0x85b4, 0x85b5, + 0x85b7, 0x85b9, 0x85bb, 0x85bc, 0x85be, 0x85c0, 0x85c1, 0x85c3, + 0x85c5, 0x85c7, 0x85c8, 0x85ca, 0x85cc, 0x85ce, 0x85cf, 0x85d1, + 0x85d3, 0x85d4, 0x85d6, 0x85d8, 0x85da, 0x85db, 0x85dd, 0x85df, + 0x85e1, 0x85e2, 0x85e4, 0x85e6, 0x85e8, 0x85e9, 0x85eb, 0x85ed, + 0x85ef, 0x85f0, 0x85f2, 0x85f4, 0x85f6, 0x85f7, 0x85f9, 0x85fb, + 0x85fd, 0x85ff, 0x8600, 0x8602, 0x8604, 0x8606, 0x8607, 0x8609, + 0x860b, 0x860d, 0x860e, 0x8610, 0x8612, 0x8614, 0x8616, 0x8617, + 0x8619, 0x861b, 0x861d, 0x861e, 0x8620, 0x8622, 0x8624, 0x8626, + 0x8627, 0x8629, 0x862b, 0x862d, 0x862f, 0x8630, 0x8632, 0x8634, + 0x8636, 0x8638, 0x8639, 0x863b, 0x863d, 0x863f, 0x8641, 0x8642, + 0x8644, 0x8646, 0x8648, 0x864a, 0x864b, 0x864d, 0x864f, 0x8651, + 0x8653, 0x8654, 0x8656, 0x8658, 0x865a, 0x865c, 0x865e, 0x865f, + 0x8661, 0x8663, 0x8665, 0x8667, 0x8669, 0x866a, 0x866c, 0x866e, + 0x8670, 0x8672, 0x8674, 0x8675, 0x8677, 0x8679, 0x867b, 0x867d, + 0x867f, 0x8680, 0x8682, 0x8684, 0x8686, 0x8688, 0x868a, 0x868c, + 0x868d, 0x868f, 0x8691, 0x8693, 0x8695, 0x8697, 0x8699, 0x869a, + 0x869c, 0x869e, 0x86a0, 0x86a2, 0x86a4, 0x86a6, 0x86a7, 0x86a9, + 0x86ab, 0x86ad, 0x86af, 0x86b1, 0x86b3, 0x86b5, 0x86b6, 0x86b8, + 0x86ba, 0x86bc, 0x86be, 0x86c0, 0x86c2, 0x86c4, 0x86c5, 0x86c7, + 0x86c9, 0x86cb, 0x86cd, 0x86cf, 0x86d1, 0x86d3, 0x86d5, 0x86d6, + 0x86d8, 0x86da, 0x86dc, 0x86de, 0x86e0, 0x86e2, 0x86e4, 0x86e6, + 0x86e8, 0x86ea, 0x86eb, 0x86ed, 0x86ef, 0x86f1, 0x86f3, 0x86f5, + 0x86f7, 0x86fb, 0x86ff, 0x8702, 0x8706, 0x870a, 0x870e, 0x8712, + 0x8716, 0x871a, 0x871d, 0x8721, 0x8725, 0x8729, 0x872d, 0x8731, + 0x8735, 0x8739, 0x873d, 0x8740, 0x8744, 0x8748, 0x874c, 0x8750, + 0x8754, 0x8758, 0x875c, 0x8760, 0x8764, 0x8768, 0x876c, 0x8770, + 0x8774, 0x8778, 0x877c, 0x8780, 0x8784, 0x8788, 0x878c, 0x8790, + 0x8794, 0x8798, 0x879c, 0x87a0, 0x87a4, 0x87a8, 0x87ac, 0x87b0, + 0x87b4, 0x87b8, 0x87bc, 0x87c0, 0x87c4, 0x87c8, 0x87cc, 0x87d0, + 0x87d4, 0x87d9, 0x87dd, 0x87e1, 0x87e5, 0x87e9, 0x87ed, 0x87f1, + 0x87f5, 0x87f9, 0x87fe, 0x8801, 0x8803, 0x8805, 0x8807, 0x8809, + 0x880b, 0x880d, 0x880f, 0x8811, 0x8814, 0x8816, 0x8818, 0x881a, + 0x881c, 0x881e, 0x8820, 0x8822, 0x8824, 0x8826, 0x8828, 0x882b, + 0x882d, 0x882f, 0x8831, 0x8833, 0x8835, 0x8837, 0x8839, 0x883c, + 0x883e, 0x8840, 0x8842, 0x8844, 0x8846, 0x8848, 0x884b, 0x884d, + 0x884f, 0x8851, 0x8853, 0x8855, 0x8857, 0x885a, 0x885c, 0x885e, + 0x8860, 0x8862, 0x8864, 0x8867, 0x8869, 0x886b, 0x886d, 0x886f, + 0x8872, 0x8874, 0x8876, 0x8878, 0x887a, 0x887d, 0x887f, 0x8881, + 0x8883, 0x8885, 0x8888, 0x888a, 0x888c, 0x888e, 0x8890, 0x8893, + 0x8895, 0x8897, 0x8899, 0x889c, 0x889e, 0x88a0, 0x88a2, 0x88a4, + 0x88a7, 0x88a9, 0x88ab, 0x88ad, 0x88b0, 0x88b2, 0x88b4, 0x88b6, + 0x88b9, 0x88bb, 0x88bd, 0x88c0, 0x88c2, 0x88c4, 0x88c6, 0x88c9, + 0x88cb, 0x88cd, 0x88cf, 0x88d2, 0x88d4, 0x88d6, 0x88d9, 0x88db, + 0x88dd, 0x88e0, 0x88e2, 0x88e4, 0x88e6, 0x88e9, 0x88eb, 0x88ed, + 0x88f0, 0x88f2, 0x88f4, 0x88f7, 0x88f9, 0x88fb, 0x88fe, 0x8900, + 0x8902, 0x8905, 0x8907, 0x8909, 0x890c, 0x890e, 0x8910, 0x8913, + 0x8915, 0x8917, 0x891a, 0x891c, 0x891e, 0x8921, 0x8923, 0x8926, + 0x8928, 0x892a, 0x892d, 0x892f, 0x8931, 0x8934, 0x8936, 0x8939, + 0x893b, 0x893d, 0x8940, 0x8942, 0x8945, 0x8947, 0x8949, 0x894c, + 0x894e, 0x8951, 0x8953, 0x8955, 0x8958, 0x895a, 0x895d, 0x895f, + 0x8962, 0x8964, 0x8966, 0x8969, 0x896b, 0x896e, 0x8970, 0x8973, + 0x8975, 0x8977, 0x897a, 0x897c, 0x897f, 0x8981, 0x8984, 0x8986, + 0x8989, 0x898b, 0x898e, 0x8990, 0x8993, 0x8995, 0x8998, 0x899a, + 0x899c, 0x899f, 0x89a1, 0x89a4, 0x89a6, 0x89a9, 0x89ab, 0x89ae, + 0x89b0, 0x89b3, 0x89b5, 0x89b8, 0x89ba, 0x89bd, 0x89c0, 0x89c2, + 0x89c5, 0x89c7, 0x89ca, 0x89cc, 0x89cf, 0x89d1, 0x89d4, 0x89d6, + 0x89d9, 0x89db, 0x89de, 0x89e0, 0x89e3, 0x89e6, 0x89e8, 0x89eb, + 0x89ed, 0x89f0, 0x89f2, 0x89f5, 0x89f7, 0x89fa, 0x89fd, 0x89ff, + 0x8a02, 0x8a04, 0x8a07, 0x8a0a, 0x8a0c, 0x8a0f, 0x8a11, 0x8a14, + 0x8a16, 0x8a19, 0x8a1c, 0x8a1e, 0x8a21, 0x8a23, 0x8a26, 0x8a29, + 0x8a2b, 0x8a2e, 0x8a31, 0x8a33, 0x8a36, 0x8a38, 0x8a3b, 0x8a3e, + 0x8a40, 0x8a43, 0x8a46, 0x8a48, 0x8a4b, 0x8a4e, 0x8a50, 0x8a53, + 0x8a55, 0x8a58, 0x8a5b, 0x8a5d, 0x8a60, 0x8a63, 0x8a65, 0x8a68, + 0x8a6b, 0x8a6d, 0x8a70, 0x8a73, 0x8a76, 0x8a78, 0x8a7b, 0x8a7e, + 0x8a80, 0x8a83, 0x8a86, 0x8a88, 0x8a8b, 0x8a8e, 0x8a90, 0x8a93, + 0x8a96, 0x8a99, 0x8a9b, 0x8a9e, 0x8aa1, 0x8aa3, 0x8aa6, 0x8aa9, + 0x8aac, 0x8aae, 0x8ab1, 0x8ab4, 0x8ab7, 0x8ab9, 0x8abc, 0x8abf, + 0x8ac2, 0x8ac4, 0x8ac7, 0x8aca, 0x8acd, 0x8acf, 0x8ad2, 0x8ad5, + 0x8ad8, 0x8ada, 0x8add, 0x8ae0, 0x8ae3, 0x8ae5, 0x8ae8, 0x8aeb, + 0x8aee, 0x8af1, 0x8af3, 0x8af6, 0x8af9, 0x8afc, 0x8aff, 0x8b01, + 0x8b04, 0x8b07, 0x8b0a, 0x8b0d, 0x8b0f, 0x8b12, 0x8b15, 0x8b18, + 0x8b1b, 0x8b1e, 0x8b20, 0x8b23, 0x8b26, 0x8b29, 0x8b2c, 0x8b2f, + 0x8b31, 0x8b34, 0x8b37, 0x8b3a, 0x8b3d, 0x8b40, 0x8b43, 0x8b45, + 0x8b48, 0x8b4b, 0x8b4e, 0x8b51, 0x8b54, 0x8b57, 0x8b59, 0x8b5c, + 0x8b5f, 0x8b62, 0x8b65, 0x8b68, 0x8b6b, 0x8b6e, 0x8b71, 0x8b74, + 0x8b76, 0x8b79, 0x8b7c, 0x8b7f, 0x8b82, 0x8b85, 0x8b88, 0x8b8b, + 0x8b8e, 0x8b91, 0x8b94, 0x8b96, 0x8b99, 0x8b9c, 0x8b9f, 0x8ba2, + 0x8ba5, 0x8ba8, 0x8bab, 0x8bae, 0x8bb1, 0x8bb4, 0x8bb7, 0x8bba, + 0x8bbd, 0x8bc0, 0x8bc3, 0x8bc6, 0x8bc9, 0x8bcc, 0x8bcf, 0x8bd2, + 0x8bd5, 0x8bd7, 0x8bda, 0x8bdd, 0x8be0, 0x8be3, 0x8be6, 0x8be9, + 0x8bec, 0x8bef, 0x8bf2, 0x8bf5, 0x8bf8, 0x8bfb, 0x8bfe, 0x8c01, + 0x8c02, 0x8c04, 0x8c05, 0x8c07, 0x8c08, 0x8c0a, 0x8c0b, 0x8c0d, + 0x8c0e, 0x8c10, 0x8c11, 0x8c13, 0x8c14, 0x8c16, 0x8c17, 0x8c19, + 0x8c1b, 0x8c1c, 0x8c1e, 0x8c1f, 0x8c21, 0x8c22, 0x8c24, 0x8c25, + 0x8c27, 0x8c28, 0x8c2a, 0x8c2b, 0x8c2d, 0x8c2f, 0x8c30, 0x8c32, + 0x8c33, 0x8c35, 0x8c36, 0x8c38, 0x8c39, 0x8c3b, 0x8c3c, 0x8c3e, + 0x8c40, 0x8c41, 0x8c43, 0x8c44, 0x8c46, 0x8c47, 0x8c49, 0x8c4b, + 0x8c4c, 0x8c4e, 0x8c4f, 0x8c51, 0x8c52, 0x8c54, 0x8c56, 0x8c57, + 0x8c59, 0x8c5a, 0x8c5c, 0x8c5d, 0x8c5f, 0x8c61, 0x8c62, 0x8c64, + 0x8c65, 0x8c67, 0x8c69, 0x8c6a, 0x8c6c, 0x8c6d, 0x8c6f, 0x8c70, + 0x8c72, 0x8c74, 0x8c75, 0x8c77, 0x8c78, 0x8c7a, 0x8c7c, 0x8c7d, + 0x8c7f, 0x8c80, 0x8c82, 0x8c84, 0x8c85, 0x8c87, 0x8c89, 0x8c8a, + 0x8c8c, 0x8c8d, 0x8c8f, 0x8c91, 0x8c92, 0x8c94, 0x8c95, 0x8c97, + 0x8c99, 0x8c9a, 0x8c9c, 0x8c9e, 0x8c9f, 0x8ca1, 0x8ca3, 0x8ca4, + 0x8ca6, 0x8ca7, 0x8ca9, 0x8cab, 0x8cac, 0x8cae, 0x8cb0, 0x8cb1, + 0x8cb3, 0x8cb5, 0x8cb6, 0x8cb8, 0x8cba, 0x8cbb, 0x8cbd, 0x8cbe, + 0x8cc0, 0x8cc2, 0x8cc3, 0x8cc5, 0x8cc7, 0x8cc8, 0x8cca, 0x8ccc, + 0x8ccd, 0x8ccf, 0x8cd1, 0x8cd2, 0x8cd4, 0x8cd6, 0x8cd7, 0x8cd9, + 0x8cdb, 0x8cdc, 0x8cde, 0x8ce0, 0x8ce1, 0x8ce3, 0x8ce5, 0x8ce7, + 0x8ce8, 0x8cea, 0x8cec, 0x8ced, 0x8cef, 0x8cf1, 0x8cf2, 0x8cf4, + 0x8cf6, 0x8cf7, 0x8cf9, 0x8cfb, 0x8cfd, 0x8cfe, 0x8d00, 0x8d02, + 0x8d03, 0x8d05, 0x8d07, 0x8d08, 0x8d0a, 0x8d0c, 0x8d0e, 0x8d0f, + 0x8d11, 0x8d13, 0x8d14, 0x8d16, 0x8d18, 0x8d1a, 0x8d1b, 0x8d1d, + 0x8d1f, 0x8d20, 0x8d22, 0x8d24, 0x8d26, 0x8d27, 0x8d29, 0x8d2b, + 0x8d2d, 0x8d2e, 0x8d30, 0x8d32, 0x8d34, 0x8d35, 0x8d37, 0x8d39, + 0x8d3b, 0x8d3c, 0x8d3e, 0x8d40, 0x8d42, 0x8d43, 0x8d45, 0x8d47, + 0x8d49, 0x8d4a, 0x8d4c, 0x8d4e, 0x8d50, 0x8d51, 0x8d53, 0x8d55, + 0x8d57, 0x8d58, 0x8d5a, 0x8d5c, 0x8d5e, 0x8d5f, 0x8d61, 0x8d63, + 0x8d65, 0x8d67, 0x8d68, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, + 0x8d73, 0x8d75, 0x8d77, 0x8d78, 0x8d7a, 0x8d7c, 0x8d7e, 0x8d7f, + 0x8d81, 0x8d83, 0x8d85, 0x8d87, 0x8d88, 0x8d8a, 0x8d8c, 0x8d8e, + 0x8d90, 0x8d91, 0x8d93, 0x8d95, 0x8d97, 0x8d99, 0x8d9b, 0x8d9c, + 0x8d9e, 0x8da0, 0x8da2, 0x8da4, 0x8da5, 0x8da7, 0x8da9, 0x8dab, + 0x8dad, 0x8daf, 0x8db0, 0x8db2, 0x8db4, 0x8db6, 0x8db8, 0x8dba, + 0x8dbb, 0x8dbd, 0x8dbf, 0x8dc1, 0x8dc3, 0x8dc5, 0x8dc6, 0x8dc8, + 0x8dca, 0x8dcc, 0x8dce, 0x8dd0, 0x8dd1, 0x8dd3, 0x8dd5, 0x8dd7, + 0x8dd9, 0x8ddb, 0x8ddd, 0x8dde, 0x8de0, 0x8de2, 0x8de4, 0x8de6, + 0x8de8, 0x8dea, 0x8deb, 0x8ded, 0x8def, 0x8df1, 0x8df3, 0x8df5, + 0x8df7, 0x8df9, 0x8dfa, 0x8dfc, 0x8dfe, 0x8e00, 0x8e02, 0x8e04, + 0x8e06, 0x8e08, 0x8e09, 0x8e0b, 0x8e0d, 0x8e0f, 0x8e11, 0x8e13, + 0x8e15, 0x8e17, 0x8e19, 0x8e1b, 0x8e1c, 0x8e1e, 0x8e20, 0x8e22, + 0x8e24, 0x8e26, 0x8e28, 0x8e2a, 0x8e2c, 0x8e2e, 0x8e2f, 0x8e31, + 0x8e33, 0x8e35, 0x8e37, 0x8e39, 0x8e3b, 0x8e3d, 0x8e3f, 0x8e41, + 0x8e43, 0x8e45, 0x8e47, 0x8e48, 0x8e4a, 0x8e4c, 0x8e4e, 0x8e50, + 0x8e52, 0x8e54, 0x8e56, 0x8e58, 0x8e5a, 0x8e5c, 0x8e5e, 0x8e60, + 0x8e62, 0x8e64, 0x8e66, 0x8e67, 0x8e69, 0x8e6b, 0x8e6d, 0x8e6f, + 0x8e71, 0x8e73, 0x8e75, 0x8e77, 0x8e79, 0x8e7b, 0x8e7d, 0x8e7f, + 0x8e81, 0x8e83, 0x8e85, 0x8e87, 0x8e89, 0x8e8b, 0x8e8d, 0x8e8f, + 0x8e91, 0x8e93, 0x8e95, 0x8e97, 0x8e99, 0x8e9b, 0x8e9d, 0x8e9f, + 0x8ea0, 0x8ea2, 0x8ea4, 0x8ea6, 0x8ea8, 0x8eaa, 0x8eac, 0x8eae, + 0x8eb0, 0x8eb2, 0x8eb4, 0x8eb6, 0x8eb8, 0x8eba, 0x8ebc, 0x8ebe, + 0x8ec0, 0x8ec2, 0x8ec4, 0x8ec6, 0x8ec8, 0x8eca, 0x8ecc, 0x8ece, + 0x8ed1, 0x8ed3, 0x8ed5, 0x8ed7, 0x8ed9, 0x8edb, 0x8edd, 0x8edf, + 0x8ee1, 0x8ee3, 0x8ee5, 0x8ee7, 0x8ee9, 0x8eeb, 0x8eed, 0x8eef, + 0x8ef1, 0x8ef3, 0x8ef5, 0x8ef7, 0x8ef9, 0x8efb, 0x8efd, 0x8eff, + 0x8f01, 0x8f03, 0x8f05, 0x8f07, 0x8f09, 0x8f0b, 0x8f0e, 0x8f10, + 0x8f12, 0x8f14, 0x8f16, 0x8f18, 0x8f1a, 0x8f1c, 0x8f1e, 0x8f20, + 0x8f22, 0x8f24, 0x8f26, 0x8f28, 0x8f2a, 0x8f2c, 0x8f2f, 0x8f31, + 0x8f33, 0x8f35, 0x8f37, 0x8f39, 0x8f3b, 0x8f3d, 0x8f3f, 0x8f41, + 0x8f43, 0x8f45, 0x8f48, 0x8f4a, 0x8f4c, 0x8f4e, 0x8f50, 0x8f52, + 0x8f54, 0x8f56, 0x8f58, 0x8f5a, 0x8f5d, 0x8f5f, 0x8f61, 0x8f63, + 0x8f65, 0x8f67, 0x8f69, 0x8f6b, 0x8f6d, 0x8f6f, 0x8f72, 0x8f74, + 0x8f76, 0x8f78, 0x8f7a, 0x8f7c, 0x8f7e, 0x8f80, 0x8f83, 0x8f85, + 0x8f87, 0x8f89, 0x8f8b, 0x8f8d, 0x8f8f, 0x8f91, 0x8f94, 0x8f96, + 0x8f98, 0x8f9a, 0x8f9c, 0x8f9e, 0x8fa0, 0x8fa3, 0x8fa5, 0x8fa7, + 0x8fa9, 0x8fab, 0x8fad, 0x8faf, 0x8fb2, 0x8fb4, 0x8fb6, 0x8fb8, + 0x8fba, 0x8fbc, 0x8fbf, 0x8fc1, 0x8fc3, 0x8fc5, 0x8fc7, 0x8fc9, + 0x8fcc, 0x8fce, 0x8fd0, 0x8fd2, 0x8fd4, 0x8fd6, 0x8fd9, 0x8fdb, + 0x8fdd, 0x8fdf, 0x8fe1, 0x8fe4, 0x8fe6, 0x8fe8, 0x8fea, 0x8fec, + 0x8fee, 0x8ff1, 0x8ff3, 0x8ff5, 0x8ff7, 0x8ff9, 0x8ffc, 0x8ffe, + 0x9000, 0x9002, 0x9004, 0x9007, 0x9009, 0x900b, 0x900d, 0x900f, + 0x9012, 0x9014, 0x9016, 0x9018, 0x901b, 0x901d, 0x901f, 0x9021, + 0x9024, 0x9026, 0x9028, 0x902a, 0x902d, 0x902f, 0x9031, 0x9033, + 0x9036, 0x9038, 0x903a, 0x903c, 0x903f, 0x9041, 0x9043, 0x9045, + 0x9048, 0x904a, 0x904c, 0x904f, 0x9051, 0x9053, 0x9055, 0x9058, + 0x905a, 0x905c, 0x905f, 0x9061, 0x9063, 0x9066, 0x9068, 0x906a, + 0x906d, 0x906f, 0x9071, 0x9074, 0x9076, 0x9078, 0x907b, 0x907d, + 0x907f, 0x9082, 0x9084, 0x9086, 0x9089, 0x908b, 0x908d, 0x9090, + 0x9092, 0x9094, 0x9097, 0x9099, 0x909c, 0x909e, 0x90a0, 0x90a3, + 0x90a5, 0x90a8, 0x90aa, 0x90ac, 0x90af, 0x90b1, 0x90b3, 0x90b6, + 0x90b8, 0x90bb, 0x90bd, 0x90c0, 0x90c2, 0x90c4, 0x90c7, 0x90c9, + 0x90cc, 0x90ce, 0x90d1, 0x90d3, 0x90d5, 0x90d8, 0x90da, 0x90dd, + 0x90df, 0x90e2, 0x90e4, 0x90e7, 0x90e9, 0x90eb, 0x90ee, 0x90f0, + 0x90f3, 0x90f5, 0x90f8, 0x90fa, 0x90fd, 0x90ff, 0x9102, 0x9104, + 0x9107, 0x9109, 0x910c, 0x910e, 0x9111, 0x9113, 0x9116, 0x9118, + 0x911b, 0x911d, 0x9120, 0x9122, 0x9125, 0x9127, 0x912a, 0x912c, + 0x912f, 0x9131, 0x9134, 0x9137, 0x9139, 0x913c, 0x913e, 0x9141, + 0x9143, 0x9146, 0x9148, 0x914b, 0x914d, 0x9150, 0x9153, 0x9155, + 0x9158, 0x915a, 0x915d, 0x9160, 0x9162, 0x9165, 0x9167, 0x916a, + 0x916c, 0x916f, 0x9172, 0x9174, 0x9177, 0x9179, 0x917c, 0x917f, + 0x9181, 0x9184, 0x9187, 0x9189, 0x918c, 0x918e, 0x9191, 0x9194, + 0x9196, 0x9199, 0x919c, 0x919e, 0x91a1, 0x91a4, 0x91a6, 0x91a9, + 0x91ac, 0x91ae, 0x91b1, 0x91b4, 0x91b6, 0x91b9, 0x91bc, 0x91be, + 0x91c1, 0x91c4, 0x91c6, 0x91c9, 0x91cc, 0x91ce, 0x91d1, 0x91d4, + 0x91d6, 0x91d9, 0x91dc, 0x91df, 0x91e1, 0x91e4, 0x91e7, 0x91e9, + 0x91ec, 0x91ef, 0x91f2, 0x91f4, 0x91f7, 0x91fa, 0x91fd, 0x91ff, + 0x9202, 0x9205, 0x9208, 0x920a, 0x920d, 0x9210, 0x9213, 0x9215, + 0x9218, 0x921b, 0x921e, 0x9220, 0x9223, 0x9226, 0x9229, 0x922c, + 0x922e, 0x9231, 0x9234, 0x9237, 0x923a, 0x923c, 0x923f, 0x9242, + 0x9245, 0x9248, 0x924a, 0x924d, 0x9250, 0x9253, 0x9256, 0x9259, + 0x925b, 0x925e, 0x9261, 0x9264, 0x9267, 0x926a, 0x926c, 0x926f, + 0x9272, 0x9275, 0x9278, 0x927b, 0x927e, 0x9280, 0x9283, 0x9286, + 0x9289, 0x928c, 0x928f, 0x9292, 0x9295, 0x9297, 0x929a, 0x929d, + 0x92a0, 0x92a3, 0x92a6, 0x92a9, 0x92ac, 0x92af, 0x92b2, 0x92b4, + 0x92b7, 0x92ba, 0x92bd, 0x92c0, 0x92c3, 0x92c6, 0x92c9, 0x92cc, + 0x92cf, 0x92d2, 0x92d5, 0x92d8, 0x92db, 0x92de, 0x92e1, 0x92e3, + 0x92e6, 0x92e9, 0x92ec, 0x92ef, 0x92f2, 0x92f5, 0x92f8, 0x92fb, + 0x92fe, 0x9301, 0x9304, 0x9307, 0x930a, 0x930d, 0x9310, 0x9313, + 0x9316, 0x9319, 0x931c, 0x931f, 0x9322, 0x9325, 0x9328, 0x932b, + 0x932e, 0x9331, 0x9334, 0x9337, 0x933a, 0x933d, 0x9341, 0x9344, + 0x9347, 0x934a, 0x934d, 0x9350, 0x9353, 0x9356, 0x9359, 0x935c, + 0x935f, 0x9362, 0x9365, 0x9368, 0x936b, 0x936e, 0x9372, 0x9375, + 0x9378, 0x937b, 0x937e, 0x9381, 0x9384, 0x9387, 0x938a, 0x938d, + 0x9391, 0x9394, 0x9397, 0x939a, 0x939d, 0x93a0, 0x93a3, 0x93a6, + 0x93aa, 0x93ad, 0x93b0, 0x93b3, 0x93b6, 0x93b9, 0x93bc, 0x93c0, + 0x93c3, 0x93c6, 0x93c9, 0x93cc, 0x93cf, 0x93d3, 0x93d6, 0x93d9, + 0x93dc, 0x93df, 0x93e2, 0x93e6, 0x93e9, 0x93ec, 0x93ef, 0x93f2, + 0x93f6, 0x93f9, 0x93fc, 0x93ff, 0x9401, 0x9403, 0x9404, 0x9406, + 0x9408, 0x9409, 0x940b, 0x940d, 0x940e, 0x9410, 0x9411, 0x9413, + 0x9415, 0x9416, 0x9418, 0x9419, 0x941b, 0x941d, 0x941e, 0x9420, + 0x9422, 0x9423, 0x9425, 0x9427, 0x9428, 0x942a, 0x942b, 0x942d, + 0x942f, 0x9430, 0x9432, 0x9434, 0x9435, 0x9437, 0x9439, 0x943a, + 0x943c, 0x943e, 0x943f, 0x9441, 0x9443, 0x9444, 0x9446, 0x9448, + 0x9449, 0x944b, 0x944d, 0x944e, 0x9450, 0x9452, 0x9453, 0x9455, + 0x9457, 0x9458, 0x945a, 0x945c, 0x945d, 0x945f, 0x9461, 0x9462, + 0x9464, 0x9466, 0x9467, 0x9469, 0x946b, 0x946d, 0x946e, 0x9470, + 0x9472, 0x9473, 0x9475, 0x9477, 0x9478, 0x947a, 0x947c, 0x947e, + 0x947f, 0x9481, 0x9483, 0x9484, 0x9486, 0x9488, 0x948a, 0x948b, + 0x948d, 0x948f, 0x9490, 0x9492, 0x9494, 0x9496, 0x9497, 0x9499, + 0x949b, 0x949d, 0x949e, 0x94a0, 0x94a2, 0x94a4, 0x94a5, 0x94a7, + 0x94a9, 0x94ab, 0x94ac, 0x94ae, 0x94b0, 0x94b2, 0x94b3, 0x94b5, + 0x94b7, 0x94b9, 0x94ba, 0x94bc, 0x94be, 0x94c0, 0x94c1, 0x94c3, + 0x94c5, 0x94c7, 0x94c8, 0x94ca, 0x94cc, 0x94ce, 0x94cf, 0x94d1, + 0x94d3, 0x94d5, 0x94d7, 0x94d8, 0x94da, 0x94dc, 0x94de, 0x94e0, + 0x94e1, 0x94e3, 0x94e5, 0x94e7, 0x94e8, 0x94ea, 0x94ec, 0x94ee, + 0x94f0, 0x94f1, 0x94f3, 0x94f5, 0x94f7, 0x94f9, 0x94fa, 0x94fc, + 0x94fe, 0x9500, 0x9502, 0x9504, 0x9505, 0x9507, 0x9509, 0x950b, + 0x950d, 0x950e, 0x9510, 0x9512, 0x9514, 0x9516, 0x9518, 0x9519, + 0x951b, 0x951d, 0x951f, 0x9521, 0x9523, 0x9524, 0x9526, 0x9528, + 0x952a, 0x952c, 0x952e, 0x9530, 0x9531, 0x9533, 0x9535, 0x9537, + 0x9539, 0x953b, 0x953d, 0x953e, 0x9540, 0x9542, 0x9544, 0x9546, + 0x9548, 0x954a, 0x954b, 0x954d, 0x954f, 0x9551, 0x9553, 0x9555, + 0x9557, 0x9559, 0x955a, 0x955c, 0x955e, 0x9560, 0x9562, 0x9564, + 0x9566, 0x9568, 0x956a, 0x956b, 0x956d, 0x956f, 0x9571, 0x9573, + 0x9575, 0x9577, 0x9579, 0x957b, 0x957d, 0x957e, 0x9580, 0x9582, + 0x9584, 0x9586, 0x9588, 0x958a, 0x958c, 0x958e, 0x9590, 0x9592, + 0x9594, 0x9595, 0x9597, 0x9599, 0x959b, 0x959d, 0x959f, 0x95a1, + 0x95a3, 0x95a5, 0x95a7, 0x95a9, 0x95ab, 0x95ad, 0x95af, 0x95b1, + 0x95b3, 0x95b4, 0x95b6, 0x95b8, 0x95ba, 0x95bc, 0x95be, 0x95c0, + 0x95c2, 0x95c4, 0x95c6, 0x95c8, 0x95ca, 0x95cc, 0x95ce, 0x95d0, + 0x95d2, 0x95d4, 0x95d6, 0x95d8, 0x95da, 0x95dc, 0x95de, 0x95e0, + 0x95e2, 0x95e4, 0x95e6, 0x95e8, 0x95ea, 0x95ec, 0x95ee, 0x95f0, + 0x95f2, 0x95f4, 0x95f6, 0x95f8, 0x95fa, 0x95fc, 0x95fe, 0x9600, + 0x9602, 0x9604, 0x9606, 0x9608, 0x960a, 0x960c, 0x960e, 0x9610, + 0x9612, 0x9614, 0x9616, 0x9618, 0x961a, 0x961c, 0x961e, 0x9620, + 0x9622, 0x9624, 0x9626, 0x9628, 0x962a, 0x962c, 0x962e, 0x9630, + 0x9632, 0x9634, 0x9636, 0x9638, 0x963a, 0x963c, 0x963e, 0x9640, + 0x9642, 0x9644, 0x9647, 0x9649, 0x964b, 0x964d, 0x964f, 0x9651, + 0x9653, 0x9655, 0x9657, 0x9659, 0x965b, 0x965d, 0x965f, 0x9661, + 0x9663, 0x9665, 0x9668, 0x966a, 0x966c, 0x966e, 0x9670, 0x9672, + 0x9674, 0x9676, 0x9678, 0x967a, 0x967c, 0x967e, 0x9681, 0x9683, + 0x9685, 0x9687, 0x9689, 0x968b, 0x968d, 0x968f, 0x9691, 0x9693, + 0x9696, 0x9698, 0x969a, 0x969c, 0x969e, 0x96a0, 0x96a2, 0x96a4, + 0x96a6, 0x96a9, 0x96ab, 0x96ad, 0x96af, 0x96b1, 0x96b3, 0x96b5, + 0x96b7, 0x96ba, 0x96bc, 0x96be, 0x96c0, 0x96c2, 0x96c4, 0x96c6, + 0x96c9, 0x96cb, 0x96cd, 0x96cf, 0x96d1, 0x96d3, 0x96d5, 0x96d8, + 0x96da, 0x96dc, 0x96de, 0x96e0, 0x96e2, 0x96e4, 0x96e7, 0x96e9, + 0x96eb, 0x96ed, 0x96ef, 0x96f1, 0x96f4, 0x96f6, 0x96f8, 0x96fa, + 0x96fc, 0x96ff, 0x9701, 0x9703, 0x9705, 0x9707, 0x9709, 0x970c, + 0x970e, 0x9710, 0x9712, 0x9714, 0x9717, 0x9719, 0x971b, 0x971d, + 0x971f, 0x9722, 0x9724, 0x9726, 0x9728, 0x972a, 0x972d, 0x972f, + 0x9731, 0x9733, 0x9735, 0x9738, 0x973a, 0x973c, 0x973e, 0x9740, + 0x9743, 0x9745, 0x9747, 0x9749, 0x974c, 0x974e, 0x9750, 0x9752, + 0x9755, 0x9757, 0x9759, 0x975b, 0x975d, 0x9760, 0x9762, 0x9764, + 0x9766, 0x9769, 0x976b, 0x976d, 0x976f, 0x9772, 0x9774, 0x9776, + 0x9778, 0x977b, 0x977d, 0x977f, 0x9781, 0x9784, 0x9786, 0x9788, + 0x978b, 0x978d, 0x978f, 0x9791, 0x9794, 0x9796, 0x9798, 0x979a, + 0x979d, 0x979f, 0x97a1, 0x97a4, 0x97a6, 0x97a8, 0x97aa, 0x97ad, + 0x97af, 0x97b1, 0x97b4, 0x97b6, 0x97b8, 0x97bb, 0x97bd, 0x97bf, + 0x97c1, 0x97c4, 0x97c6, 0x97c8, 0x97cb, 0x97cd, 0x97cf, 0x97d2, + 0x97d4, 0x97d6, 0x97d9, 0x97db, 0x97dd, 0x97e0, 0x97e2, 0x97e4, + 0x97e6, 0x97e9, 0x97eb, 0x97ed, 0x97f0, 0x97f2, 0x97f4, 0x97f7, + 0x97f9, 0x97fb, 0x97fe, 0x9800, 0x9801, 0x9802, 0x9804, 0x9805, + 0x9806, 0x9807, 0x9808, 0x9809, 0x980b, 0x980c, 0x980d, 0x980e, + 0x980f, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9818, + 0x9819, 0x981a, 0x981b, 0x981c, 0x981e, 0x981f, 0x9820, 0x9821, + 0x9822, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x982a, 0x982b, + 0x982c, 0x982d, 0x982e, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, + 0x9836, 0x9837, 0x9838, 0x9839, 0x983a, 0x983c, 0x983d, 0x983e, + 0x983f, 0x9840, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9848, + 0x9849, 0x984a, 0x984b, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, + 0x9853, 0x9854, 0x9855, 0x9856, 0x9858, 0x9859, 0x985a, 0x985b, + 0x985c, 0x985e, 0x985f, 0x9860, 0x9861, 0x9863, 0x9864, 0x9865, + 0x9866, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986e, 0x986f, + 0x9870, 0x9871, 0x9873, 0x9874, 0x9875, 0x9876, 0x9878, 0x9879, + 0x987a, 0x987b, 0x987d, 0x987e, 0x987f, 0x9880, 0x9882, 0x9883, + 0x9884, 0x9885, 0x9887, 0x9888, 0x9889, 0x988a, 0x988c, 0x988d, + 0x988e, 0x988f, 0x9891, 0x9892, 0x9893, 0x9894, 0x9896, 0x9897, + 0x9898, 0x989b, 0x989d, 0x98a0, 0x98a2, 0x98a5, 0x98a7, 0x98aa, + 0x98ad, 0x98af, 0x98b2, 0x98b4, 0x98b7, 0x98b9, 0x98bc, 0x98bf, + 0x98c1, 0x98c4, 0x98c6, 0x98c9, 0x98cb, 0x98ce, 0x98d1, 0x98d3, + 0x98d6, 0x98d8, 0x98db, 0x98de, 0x98e0, 0x98e3, 0x98e5, 0x98e8, + 0x98eb, 0x98ed, 0x98f0, 0x98f3, 0x98f5, 0x98f8, 0x98fa, 0x98fd, + 0x9900, 0x9902, 0x9905, 0x9908, 0x990a, 0x990d, 0x9910, 0x9912, + 0x9915, 0x9918, 0x991a, 0x991d, 0x9920, 0x9922, 0x9925, 0x9928, + 0x992a, 0x992d, 0x9930, 0x9933, 0x9935, 0x9938, 0x993b, 0x993d, + 0x9940, 0x9943, 0x9946, 0x9948, 0x994b, 0x994e, 0x9950, 0x9953, + 0x9956, 0x9959, 0x995b, 0x995e, 0x9961, 0x9964, 0x9966, 0x9969, + 0x996c, 0x996f, 0x9972, 0x9974, 0x9977, 0x997a, 0x997d, 0x997f, + 0x9982, 0x9985, 0x9988, 0x998b, 0x998d, 0x9990, 0x9993, 0x9996, + 0x9999, 0x999b, 0x999e, 0x99a1, 0x99a4, 0x99a7, 0x99aa, 0x99ac, + 0x99af, 0x99b2, 0x99b5, 0x99b8, 0x99bb, 0x99bd, 0x99c0, 0x99c3, + 0x99c6, 0x99c9, 0x99cc, 0x99cf, 0x99d1, 0x99d4, 0x99d7, 0x99da, + 0x99dd, 0x99e0, 0x99e3, 0x99e6, 0x99e9, 0x99eb, 0x99ee, 0x99f1, + 0x99f4, 0x99f7, 0x99fa, 0x99fd, 0x9a00, 0x9a03, 0x9a06, 0x9a09, + 0x9a0c, 0x9a0f, 0x9a11, 0x9a14, 0x9a17, 0x9a1a, 0x9a1d, 0x9a20, + 0x9a23, 0x9a26, 0x9a29, 0x9a2c, 0x9a2f, 0x9a32, 0x9a35, 0x9a38, + 0x9a3b, 0x9a3e, 0x9a41, 0x9a44, 0x9a47, 0x9a4a, 0x9a4d, 0x9a50, + 0x9a53, 0x9a56, 0x9a59, 0x9a5c, 0x9a5f, 0x9a62, 0x9a65, 0x9a68, + 0x9a6b, 0x9a6e, 0x9a71, 0x9a74, 0x9a77, 0x9a7a, 0x9a7d, 0x9a80, + 0x9a83, 0x9a86, 0x9a8a, 0x9a8d, 0x9a90, 0x9a93, 0x9a96, 0x9a99, + 0x9a9c, 0x9a9f, 0x9aa2, 0x9aa5, 0x9aa8, 0x9aab, 0x9aaf, 0x9ab2, + 0x9ab5, 0x9ab8, 0x9abb, 0x9abe, 0x9ac1, 0x9ac4, 0x9ac7, 0x9acb, + 0x9ace, 0x9ad1, 0x9ad4, 0x9ad7, 0x9ada, 0x9add, 0x9ae1, 0x9ae4, + 0x9ae7, 0x9aea, 0x9aed, 0x9af0, 0x9af3, 0x9af7, 0x9afa, 0x9afd, + 0x9b00, 0x9b03, 0x9b07, 0x9b0a, 0x9b0d, 0x9b10, 0x9b13, 0x9b16, + 0x9b1a, 0x9b1d, 0x9b20, 0x9b23, 0x9b27, 0x9b2a, 0x9b2d, 0x9b30, + 0x9b33, 0x9b37, 0x9b3a, 0x9b3d, 0x9b40, 0x9b44, 0x9b47, 0x9b4a, + 0x9b4d, 0x9b51, 0x9b54, 0x9b57, 0x9b5a, 0x9b5e, 0x9b61, 0x9b64, + 0x9b67, 0x9b6b, 0x9b6e, 0x9b71, 0x9b75, 0x9b78, 0x9b7b, 0x9b7e, + 0x9b82, 0x9b85, 0x9b88, 0x9b8c, 0x9b8f, 0x9b92, 0x9b96, 0x9b99, + 0x9b9c, 0x9ba0, 0x9ba3, 0x9ba6, 0x9baa, 0x9bad, 0x9bb0, 0x9bb4, + 0x9bb7, 0x9bba, 0x9bbe, 0x9bc1, 0x9bc4, 0x9bc8, 0x9bcb, 0x9bcf, + 0x9bd2, 0x9bd5, 0x9bd9, 0x9bdc, 0x9be0, 0x9be3, 0x9be6, 0x9bea, + 0x9bed, 0x9bf0, 0x9bf4, 0x9bf7, 0x9bfb, 0x9bfe, 0x9c01, 0x9c02, + 0x9c04, 0x9c06, 0x9c08, 0x9c09, 0x9c0b, 0x9c0d, 0x9c0f, 0x9c10, + 0x9c12, 0x9c14, 0x9c15, 0x9c17, 0x9c19, 0x9c1b, 0x9c1c, 0x9c1e, + 0x9c20, 0x9c22, 0x9c23, 0x9c25, 0x9c27, 0x9c29, 0x9c2a, 0x9c2c, + 0x9c2e, 0x9c30, 0x9c31, 0x9c33, 0x9c35, 0x9c37, 0x9c38, 0x9c3a, + 0x9c3c, 0x9c3e, 0x9c3f, 0x9c41, 0x9c43, 0x9c45, 0x9c46, 0x9c48, + 0x9c4a, 0x9c4c, 0x9c4e, 0x9c4f, 0x9c51, 0x9c53, 0x9c55, 0x9c56, + 0x9c58, 0x9c5a, 0x9c5c, 0x9c5e, 0x9c5f, 0x9c61, 0x9c63, 0x9c65, + 0x9c67, 0x9c68, 0x9c6a, 0x9c6c, 0x9c6e, 0x9c70, 0x9c71, 0x9c73, + 0x9c75, 0x9c77, 0x9c79, 0x9c7b, 0x9c7c, 0x9c7e, 0x9c80, 0x9c82, + 0x9c84, 0x9c85, 0x9c87, 0x9c89, 0x9c8b, 0x9c8d, 0x9c8f, 0x9c90, + 0x9c92, 0x9c94, 0x9c96, 0x9c98, 0x9c9a, 0x9c9c, 0x9c9d, 0x9c9f, + 0x9ca1, 0x9ca3, 0x9ca5, 0x9ca7, 0x9ca8, 0x9caa, 0x9cac, 0x9cae, + 0x9cb0, 0x9cb2, 0x9cb4, 0x9cb6, 0x9cb7, 0x9cb9, 0x9cbb, 0x9cbd, + 0x9cbf, 0x9cc1, 0x9cc3, 0x9cc5, 0x9cc6, 0x9cc8, 0x9cca, 0x9ccc, + 0x9cce, 0x9cd0, 0x9cd2, 0x9cd4, 0x9cd6, 0x9cd7, 0x9cd9, 0x9cdb, + 0x9cdd, 0x9cdf, 0x9ce1, 0x9ce3, 0x9ce5, 0x9ce7, 0x9ce9, 0x9cea, + 0x9cec, 0x9cee, 0x9cf0, 0x9cf2, 0x9cf4, 0x9cf6, 0x9cf8, 0x9cfa, + 0x9cfc, 0x9cfe, 0x9d00, 0x9d02, 0x9d03, 0x9d05, 0x9d07, 0x9d09, + 0x9d0b, 0x9d0d, 0x9d0f, 0x9d11, 0x9d13, 0x9d15, 0x9d17, 0x9d19, + 0x9d1b, 0x9d1d, 0x9d1f, 0x9d21, 0x9d23, 0x9d25, 0x9d27, 0x9d29, + 0x9d2a, 0x9d2c, 0x9d2e, 0x9d30, 0x9d32, 0x9d34, 0x9d36, 0x9d38, + 0x9d3a, 0x9d3c, 0x9d3e, 0x9d40, 0x9d42, 0x9d44, 0x9d46, 0x9d48, + 0x9d4a, 0x9d4c, 0x9d4e, 0x9d50, 0x9d52, 0x9d54, 0x9d56, 0x9d58, + 0x9d5a, 0x9d5c, 0x9d5e, 0x9d60, 0x9d62, 0x9d64, 0x9d66, 0x9d68, + 0x9d6a, 0x9d6c, 0x9d6e, 0x9d70, 0x9d72, 0x9d74, 0x9d76, 0x9d78, + 0x9d7a, 0x9d7c, 0x9d7e, 0x9d80, 0x9d83, 0x9d85, 0x9d87, 0x9d89, + 0x9d8b, 0x9d8d, 0x9d8f, 0x9d91, 0x9d93, 0x9d95, 0x9d97, 0x9d99, + 0x9d9b, 0x9d9d, 0x9d9f, 0x9da1, 0x9da3, 0x9da5, 0x9da7, 0x9daa, + 0x9dac, 0x9dae, 0x9db0, 0x9db2, 0x9db4, 0x9db6, 0x9db8, 0x9dba, + 0x9dbc, 0x9dbe, 0x9dc0, 0x9dc2, 0x9dc5, 0x9dc7, 0x9dc9, 0x9dcb, + 0x9dcd, 0x9dcf, 0x9dd1, 0x9dd3, 0x9dd5, 0x9dd7, 0x9dd9, 0x9ddc, + 0x9dde, 0x9de0, 0x9de2, 0x9de4, 0x9de6, 0x9de8, 0x9dea, 0x9dec, + 0x9def, 0x9df1, 0x9df3, 0x9df5, 0x9df7, 0x9df9, 0x9dfb, 0x9dfd, + 0x9e00, 0x9e02, 0x9e04, 0x9e06, 0x9e08, 0x9e0a, 0x9e0c, 0x9e0f, + 0x9e11, 0x9e13, 0x9e15, 0x9e17, 0x9e19, 0x9e1b, 0x9e1e, 0x9e20, + 0x9e22, 0x9e24, 0x9e26, 0x9e28, 0x9e2b, 0x9e2d, 0x9e2f, 0x9e31, + 0x9e33, 0x9e35, 0x9e38, 0x9e3a, 0x9e3c, 0x9e3e, 0x9e40, 0x9e42, + 0x9e45, 0x9e47, 0x9e49, 0x9e4b, 0x9e4d, 0x9e50, 0x9e52, 0x9e54, + 0x9e56, 0x9e58, 0x9e5b, 0x9e5d, 0x9e5f, 0x9e61, 0x9e63, 0x9e66, + 0x9e68, 0x9e6a, 0x9e6c, 0x9e6e, 0x9e71, 0x9e73, 0x9e75, 0x9e77, + 0x9e7a, 0x9e7c, 0x9e7e, 0x9e80, 0x9e82, 0x9e85, 0x9e87, 0x9e89, + 0x9e8b, 0x9e8e, 0x9e90, 0x9e92, 0x9e94, 0x9e97, 0x9e99, 0x9e9b, + 0x9e9d, 0x9ea0, 0x9ea2, 0x9ea4, 0x9ea6, 0x9ea9, 0x9eab, 0x9ead, + 0x9eaf, 0x9eb2, 0x9eb4, 0x9eb6, 0x9eb8, 0x9ebb, 0x9ebd, 0x9ebf, + 0x9ec2, 0x9ec4, 0x9ec6, 0x9ec8, 0x9ecb, 0x9ecd, 0x9ecf, 0x9ed2, + 0x9ed4, 0x9ed6, 0x9ed8, 0x9edb, 0x9edd, 0x9edf, 0x9ee2, 0x9ee4, + 0x9ee6, 0x9ee8, 0x9eeb, 0x9eed, 0x9eef, 0x9ef2, 0x9ef4, 0x9ef6, + 0x9ef9, 0x9efb, 0x9efd, 0x9f00, 0x9f02, 0x9f04, 0x9f07, 0x9f09, + 0x9f0b, 0x9f0e, 0x9f10, 0x9f12, 0x9f15, 0x9f17, 0x9f19, 0x9f1c, + 0x9f1e, 0x9f20, 0x9f23, 0x9f25, 0x9f27, 0x9f2a, 0x9f2c, 0x9f2e, + 0x9f31, 0x9f33, 0x9f35, 0x9f38, 0x9f3a, 0x9f3c, 0x9f3f, 0x9f41, + 0x9f44, 0x9f46, 0x9f48, 0x9f4b, 0x9f4d, 0x9f4f, 0x9f52, 0x9f54, + 0x9f57, 0x9f59, 0x9f5b, 0x9f5e, 0x9f60, 0x9f62, 0x9f65, 0x9f67, + 0x9f6a, 0x9f6c, 0x9f6e, 0x9f71, 0x9f73, 0x9f76, 0x9f78, 0x9f7a, + 0x9f7d, 0x9f7f, 0x9f82, 0x9f84, 0x9f87, 0x9f89, 0x9f8b, 0x9f8e, + 0x9f90, 0x9f93, 0x9f95, 0x9f97, 0x9f9a, 0x9f9c, 0x9f9f, 0x9fa1, + 0x9fa4, 0x9fa6, 0x9fa8, 0x9fab, 0x9fad, 0x9fb0, 0x9fb2, 0x9fb5, + 0x9fb7, 0x9fba, 0x9fbc, 0x9fbe, 0x9fc1, 0x9fc3, 0x9fc6, 0x9fc8, + 0x9fcb, 0x9fcd, 0x9fd0, 0x9fd2, 0x9fd5, 0x9fd7, 0x9fda, 0x9fdc, + 0x9fde, 0x9fe1, 0x9fe3, 0x9fe6, 0x9fe8, 0x9feb, 0x9fed, 0x9ff0, + 0x9ff2, 0x9ff5, 0x9ff7, 0x9ffa, 0x9ffc, 0x9fff, 0xa001, 0xa002, + 0xa003, 0xa004, 0xa006, 0xa007, 0xa008, 0xa009, 0xa00b, 0xa00c, + 0xa00d, 0xa00e, 0xa010, 0xa011, 0xa012, 0xa013, 0xa015, 0xa016, + 0xa017, 0xa018, 0xa01a, 0xa01b, 0xa01c, 0xa01e, 0xa01f, 0xa020, + 0xa021, 0xa023, 0xa024, 0xa025, 0xa026, 0xa028, 0xa029, 0xa02a, + 0xa02c, 0xa02d, 0xa02e, 0xa02f, 0xa031, 0xa032, 0xa033, 0xa034, + 0xa036, 0xa037, 0xa038, 0xa03a, 0xa03b, 0xa03c, 0xa03d, 0xa03f, + 0xa040, 0xa041, 0xa043, 0xa044, 0xa045, 0xa047, 0xa048, 0xa049, + 0xa04a, 0xa04c, 0xa04d, 0xa04e, 0xa050, 0xa051, 0xa052, 0xa054, + 0xa055, 0xa056, 0xa057, 0xa059, 0xa05a, 0xa05b, 0xa05d, 0xa05e, + 0xa05f, 0xa061, 0xa062, 0xa063, 0xa065, 0xa066, 0xa067, 0xa068, + 0xa06a, 0xa06b, 0xa06c, 0xa06e, 0xa06f, 0xa070, 0xa072, 0xa073, + 0xa074, 0xa076, 0xa077, 0xa078, 0xa07a, 0xa07b, 0xa07c, 0xa07e, + 0xa07f, 0xa080, 0xa082, 0xa083, 0xa084, 0xa086, 0xa087, 0xa088, + 0xa08a, 0xa08b, 0xa08c, 0xa08e, 0xa08f, 0xa090, 0xa092, 0xa093, + 0xa094, 0xa096, 0xa097, 0xa098, 0xa09a, 0xa09b, 0xa09c, 0xa09e, + 0xa09f, 0xa0a0, 0xa0a2, 0xa0a3, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a9, + 0xa0aa, 0xa0ab, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b1, 0xa0b2, 0xa0b3, + 0xa0b5, 0xa0b6, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bc, 0xa0bd, 0xa0be, + 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c4, 0xa0c5, 0xa0c7, 0xa0c8, 0xa0c9, + 0xa0cb, 0xa0cc, 0xa0cd, 0xa0cf, 0xa0d0, 0xa0d2, 0xa0d3, 0xa0d4, + 0xa0d6, 0xa0d7, 0xa0d9, 0xa0da, 0xa0db, 0xa0dd, 0xa0de, 0xa0df, + 0xa0e1, 0xa0e2, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e8, 0xa0e9, 0xa0eb, + 0xa0ec, 0xa0ed, 0xa0ef, 0xa0f0, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f6, + 0xa0f7, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fd, 0xa0fe, 0xa100, 0xa101, + 0xa102, 0xa104, 0xa105, 0xa107, 0xa108, 0xa10a, 0xa10b, 0xa10c, + 0xa10e, 0xa10f, 0xa111, 0xa112, 0xa113, 0xa115, 0xa116, 0xa118, + 0xa119, 0xa11b, 0xa11c, 0xa11d, 0xa11f, 0xa120, 0xa122, 0xa123, + 0xa125, 0xa126, 0xa127, 0xa129, 0xa12a, 0xa12c, 0xa12d, 0xa12f, + 0xa130, 0xa131, 0xa133, 0xa134, 0xa136, 0xa137, 0xa139, 0xa13a, + 0xa13c, 0xa13d, 0xa13e, 0xa140, 0xa141, 0xa143, 0xa144, 0xa146, + 0xa147, 0xa14a, 0xa14d, 0xa150, 0xa153, 0xa156, 0xa159, 0xa15c, + 0xa15f, 0xa161, 0xa164, 0xa167, 0xa16a, 0xa16d, 0xa170, 0xa173, + 0xa176, 0xa179, 0xa17c, 0xa17f, 0xa182, 0xa185, 0xa188, 0xa18b, + 0xa18e, 0xa191, 0xa194, 0xa197, 0xa19a, 0xa19d, 0xa1a0, 0xa1a3, + 0xa1a6, 0xa1a9, 0xa1ac, 0xa1af, 0xa1b2, 0xa1b5, 0xa1b8, 0xa1bb, + 0xa1be, 0xa1c1, 0xa1c4, 0xa1c7, 0xa1ca, 0xa1cd, 0xa1d0, 0xa1d3, + 0xa1d6, 0xa1da, 0xa1dd, 0xa1e0, 0xa1e3, 0xa1e6, 0xa1e9, 0xa1ec, + 0xa1ef, 0xa1f2, 0xa1f5, 0xa1f8, 0xa1fb, 0xa1ff, 0xa202, 0xa205, + 0xa208, 0xa20b, 0xa20e, 0xa211, 0xa214, 0xa218, 0xa21b, 0xa21e, + 0xa221, 0xa224, 0xa227, 0xa22b, 0xa22e, 0xa231, 0xa234, 0xa237, + 0xa23a, 0xa23e, 0xa241, 0xa244, 0xa247, 0xa24a, 0xa24d, 0xa251, + 0xa254, 0xa257, 0xa25a, 0xa25e, 0xa261, 0xa264, 0xa267, 0xa26a, + 0xa26e, 0xa271, 0xa274, 0xa277, 0xa27b, 0xa27e, 0xa281, 0xa284, + 0xa288, 0xa28b, 0xa28e, 0xa291, 0xa295, 0xa298, 0xa29b, 0xa29f, + 0xa2a2, 0xa2a5, 0xa2a8, 0xa2ac, 0xa2af, 0xa2b2, 0xa2b6, 0xa2b9, + 0xa2bc, 0xa2c0, 0xa2c3, 0xa2c6, 0xa2c9, 0xa2cd, 0xa2d0, 0xa2d4, + 0xa2d7, 0xa2da, 0xa2de, 0xa2e1, 0xa2e4, 0xa2e8, 0xa2eb, 0xa2ee, + 0xa2f2, 0xa2f5, 0xa2f8, 0xa2fc, 0xa2ff, 0xa303, 0xa306, 0xa309, + 0xa30d, 0xa310, 0xa314, 0xa317, 0xa31a, 0xa31e, 0xa321, 0xa325, + 0xa328, 0xa32c, 0xa32f, 0xa332, 0xa336, 0xa339, 0xa33d, 0xa340, + 0xa344, 0xa347, 0xa34b, 0xa34e, 0xa351, 0xa355, 0xa358, 0xa35c, + 0xa35f, 0xa363, 0xa366, 0xa36a, 0xa36d, 0xa371, 0xa374, 0xa378, + 0xa37b, 0xa37f, 0xa382, 0xa386, 0xa389, 0xa38d, 0xa390, 0xa394, + 0xa398, 0xa39b, 0xa39f, 0xa3a2, 0xa3a6, 0xa3a9, 0xa3ad, 0xa3b0, + 0xa3b4, 0xa3b8, 0xa3bb, 0xa3bf, 0xa3c2, 0xa3c6, 0xa3c9, 0xa3cd, + 0xa3d1, 0xa3d4, 0xa3d8, 0xa3db, 0xa3df, 0xa3e3, 0xa3e6, 0xa3ea, + 0xa3ee, 0xa3f1, 0xa3f5, 0xa3f8, 0xa3fc, 0xa400, 0xa402, 0xa403, + 0xa405, 0xa407, 0xa409, 0xa40b, 0xa40d, 0xa40e, 0xa410, 0xa412, + 0xa414, 0xa416, 0xa418, 0xa41a, 0xa41b, 0xa41d, 0xa41f, 0xa421, + 0xa423, 0xa425, 0xa426, 0xa428, 0xa42a, 0xa42c, 0xa42e, 0xa430, + 0xa432, 0xa434, 0xa435, 0xa437, 0xa439, 0xa43b, 0xa43d, 0xa43f, + 0xa441, 0xa443, 0xa444, 0xa446, 0xa448, 0xa44a, 0xa44c, 0xa44e, + 0xa450, 0xa452, 0xa454, 0xa455, 0xa457, 0xa459, 0xa45b, 0xa45d, + 0xa45f, 0xa461, 0xa463, 0xa465, 0xa467, 0xa469, 0xa46b, 0xa46c, + 0xa46e, 0xa470, 0xa472, 0xa474, 0xa476, 0xa478, 0xa47a, 0xa47c, + 0xa47e, 0xa480, 0xa482, 0xa484, 0xa486, 0xa488, 0xa489, 0xa48b, + 0xa48d, 0xa48f, 0xa491, 0xa493, 0xa495, 0xa497, 0xa499, 0xa49b, + 0xa49d, 0xa49f, 0xa4a1, 0xa4a3, 0xa4a5, 0xa4a7, 0xa4a9, 0xa4ab, + 0xa4ad, 0xa4af, 0xa4b1, 0xa4b3, 0xa4b5, 0xa4b7, 0xa4b9, 0xa4bb, + 0xa4bd, 0xa4bf, 0xa4c1, 0xa4c3, 0xa4c5, 0xa4c7, 0xa4c9, 0xa4cb, + 0xa4cd, 0xa4cf, 0xa4d1, 0xa4d3, 0xa4d5, 0xa4d7, 0xa4d9, 0xa4db, + 0xa4dd, 0xa4df, 0xa4e1, 0xa4e3, 0xa4e5, 0xa4e7, 0xa4e9, 0xa4eb, + 0xa4ed, 0xa4ef, 0xa4f1, 0xa4f3, 0xa4f5, 0xa4f7, 0xa4fa, 0xa4fc, + 0xa4fe, 0xa500, 0xa502, 0xa504, 0xa506, 0xa508, 0xa50a, 0xa50c, + 0xa50e, 0xa510, 0xa512, 0xa514, 0xa516, 0xa519, 0xa51b, 0xa51d, + 0xa51f, 0xa521, 0xa523, 0xa525, 0xa527, 0xa529, 0xa52b, 0xa52d, + 0xa52f, 0xa532, 0xa534, 0xa536, 0xa538, 0xa53a, 0xa53c, 0xa53e, + 0xa540, 0xa542, 0xa545, 0xa547, 0xa549, 0xa54b, 0xa54d, 0xa54f, + 0xa551, 0xa553, 0xa556, 0xa558, 0xa55a, 0xa55c, 0xa55e, 0xa560, + 0xa562, 0xa564, 0xa567, 0xa569, 0xa56b, 0xa56d, 0xa56f, 0xa571, + 0xa574, 0xa576, 0xa578, 0xa57a, 0xa57c, 0xa57e, 0xa581, 0xa583, + 0xa585, 0xa587, 0xa589, 0xa58b, 0xa58e, 0xa590, 0xa592, 0xa594, + 0xa596, 0xa598, 0xa59b, 0xa59d, 0xa59f, 0xa5a1, 0xa5a3, 0xa5a6, + 0xa5a8, 0xa5aa, 0xa5ac, 0xa5ae, 0xa5b1, 0xa5b3, 0xa5b5, 0xa5b7, + 0xa5b9, 0xa5bc, 0xa5be, 0xa5c0, 0xa5c2, 0xa5c5, 0xa5c7, 0xa5c9, + 0xa5cb, 0xa5cd, 0xa5d0, 0xa5d2, 0xa5d4, 0xa5d6, 0xa5d9, 0xa5db, + 0xa5dd, 0xa5df, 0xa5e2, 0xa5e4, 0xa5e6, 0xa5e8, 0xa5eb, 0xa5ed, + 0xa5ef, 0xa5f1, 0xa5f4, 0xa5f6, 0xa5f8, 0xa5fa, 0xa5fd, 0xa5ff, + 0xa601, 0xa604, 0xa606, 0xa608, 0xa60a, 0xa60d, 0xa60f, 0xa611, + 0xa614, 0xa616, 0xa618, 0xa61a, 0xa61d, 0xa61f, 0xa621, 0xa624, + 0xa626, 0xa628, 0xa62a, 0xa62d, 0xa62f, 0xa631, 0xa634, 0xa636, + 0xa638, 0xa63b, 0xa63d, 0xa63f, 0xa642, 0xa644, 0xa646, 0xa649, + 0xa64b, 0xa64d, 0xa650, 0xa652, 0xa654, 0xa657, 0xa659, 0xa65b, + 0xa65e, 0xa660, 0xa662, 0xa665, 0xa667, 0xa669, 0xa66c, 0xa66e, + 0xa670, 0xa673, 0xa675, 0xa678, 0xa67a, 0xa67c, 0xa67f, 0xa681, + 0xa683, 0xa686, 0xa688, 0xa68b, 0xa68d, 0xa68f, 0xa692, 0xa694, + 0xa696, 0xa699, 0xa69b, 0xa69e, 0xa6a0, 0xa6a2, 0xa6a5, 0xa6a7, + 0xa6aa, 0xa6ac, 0xa6ae, 0xa6b1, 0xa6b3, 0xa6b6, 0xa6b8, 0xa6bb, + 0xa6bd, 0xa6bf, 0xa6c2, 0xa6c4, 0xa6c7, 0xa6c9, 0xa6cc, 0xa6ce, + 0xa6d0, 0xa6d3, 0xa6d5, 0xa6d8, 0xa6da, 0xa6dd, 0xa6df, 0xa6e1, + 0xa6e4, 0xa6e6, 0xa6e9, 0xa6eb, 0xa6ee, 0xa6f0, 0xa6f3, 0xa6f5, + 0xa6f8, 0xa6fa, 0xa6fd, 0xa6ff, 0xa701, 0xa704, 0xa706, 0xa709, + 0xa70b, 0xa70e, 0xa710, 0xa713, 0xa715, 0xa718, 0xa71a, 0xa71d, + 0xa71f, 0xa722, 0xa724, 0xa727, 0xa729, 0xa72c, 0xa72e, 0xa731, + 0xa733, 0xa736, 0xa738, 0xa73b, 0xa73d, 0xa740, 0xa742, 0xa745, + 0xa747, 0xa74a, 0xa74c, 0xa74f, 0xa752, 0xa754, 0xa757, 0xa759, + 0xa75c, 0xa75e, 0xa761, 0xa763, 0xa766, 0xa768, 0xa76b, 0xa76d, + 0xa770, 0xa773, 0xa775, 0xa778, 0xa77a, 0xa77d, 0xa77f, 0xa782, + 0xa785, 0xa787, 0xa78a, 0xa78c, 0xa78f, 0xa791, 0xa794, 0xa797, + 0xa799, 0xa79c, 0xa79e, 0xa7a1, 0xa7a4, 0xa7a6, 0xa7a9, 0xa7ab, + 0xa7ae, 0xa7b0, 0xa7b3, 0xa7b6, 0xa7b8, 0xa7bb, 0xa7be, 0xa7c0, + 0xa7c3, 0xa7c5, 0xa7c8, 0xa7cb, 0xa7cd, 0xa7d0, 0xa7d2, 0xa7d5, + 0xa7d8, 0xa7da, 0xa7dd, 0xa7e0, 0xa7e2, 0xa7e5, 0xa7e8, 0xa7ea, + 0xa7ed, 0xa7ef, 0xa7f2, 0xa7f5, 0xa7f7, 0xa7fa, 0xa7fd, 0xa7ff, + 0xa801, 0xa802, 0xa804, 0xa805, 0xa806, 0xa808, 0xa809, 0xa80a, + 0xa80c, 0xa80d, 0xa80e, 0xa810, 0xa811, 0xa812, 0xa814, 0xa815, + 0xa816, 0xa818, 0xa819, 0xa81a, 0xa81c, 0xa81d, 0xa81e, 0xa820, + 0xa821, 0xa823, 0xa824, 0xa825, 0xa827, 0xa828, 0xa829, 0xa82b, + 0xa82c, 0xa82d, 0xa82f, 0xa830, 0xa831, 0xa833, 0xa834, 0xa836, + 0xa837, 0xa838, 0xa83a, 0xa83b, 0xa83c, 0xa83e, 0xa83f, 0xa841, + 0xa842, 0xa843, 0xa845, 0xa846, 0xa847, 0xa849, 0xa84a, 0xa84c, + 0xa84d, 0xa84e, 0xa850, 0xa851, 0xa852, 0xa854, 0xa855, 0xa857, + 0xa858, 0xa859, 0xa85b, 0xa85c, 0xa85e, 0xa85f, 0xa860, 0xa862, + 0xa863, 0xa865, 0xa866, 0xa867, 0xa869, 0xa86a, 0xa86c, 0xa86d, + 0xa86e, 0xa870, 0xa871, 0xa873, 0xa874, 0xa875, 0xa877, 0xa878, + 0xa87a, 0xa87b, 0xa87d, 0xa87e, 0xa87f, 0xa881, 0xa882, 0xa884, + 0xa885, 0xa886, 0xa888, 0xa889, 0xa88b, 0xa88c, 0xa88e, 0xa88f, + 0xa890, 0xa892, 0xa893, 0xa895, 0xa896, 0xa898, 0xa899, 0xa89a, + 0xa89c, 0xa89d, 0xa89f, 0xa8a0, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a6, + 0xa8a7, 0xa8a9, 0xa8aa, 0xa8ac, 0xa8ad, 0xa8af, 0xa8b0, 0xa8b1, + 0xa8b3, 0xa8b4, 0xa8b6, 0xa8b7, 0xa8b9, 0xa8ba, 0xa8bc, 0xa8bd, + 0xa8bf, 0xa8c0, 0xa8c2, 0xa8c3, 0xa8c4, 0xa8c6, 0xa8c7, 0xa8c9, + 0xa8ca, 0xa8cc, 0xa8cd, 0xa8cf, 0xa8d0, 0xa8d2, 0xa8d3, 0xa8d5, + 0xa8d6, 0xa8d8, 0xa8d9, 0xa8da, 0xa8dc, 0xa8dd, 0xa8df, 0xa8e0, + 0xa8e2, 0xa8e3, 0xa8e5, 0xa8e6, 0xa8e8, 0xa8e9, 0xa8eb, 0xa8ec, + 0xa8ee, 0xa8ef, 0xa8f1, 0xa8f2, 0xa8f4, 0xa8f5, 0xa8f7, 0xa8f8, + 0xa8fa, 0xa8fb, 0xa8fd, 0xa8fe, 0xa900, 0xa901, 0xa903, 0xa904, + 0xa906, 0xa907, 0xa909, 0xa90a, 0xa90c, 0xa90d, 0xa90f, 0xa910, + 0xa912, 0xa913, 0xa915, 0xa916, 0xa918, 0xa919, 0xa91b, 0xa91c, + 0xa91e, 0xa91f, 0xa921, 0xa922, 0xa924, 0xa926, 0xa927, 0xa929, + 0xa92a, 0xa92c, 0xa92d, 0xa92f, 0xa930, 0xa932, 0xa933, 0xa935, + 0xa936, 0xa938, 0xa939, 0xa93b, 0xa93c, 0xa93e, 0xa940, 0xa941, + 0xa943, 0xa944, 0xa946, 0xa947, 0xa949, 0xa94a, 0xa94c, 0xa94d, + 0xa94f, 0xa951, 0xa952, 0xa954, 0xa955, 0xa957, 0xa958, 0xa95a, + 0xa95b, 0xa95d, 0xa95f, 0xa960, 0xa962, 0xa963, 0xa965, 0xa966, + 0xa968, 0xa96a, 0xa96b, 0xa96d, 0xa96e, 0xa970, 0xa971, 0xa973, + 0xa975, 0xa976, 0xa978, 0xa979, 0xa97b, 0xa97c, 0xa97e, 0xa980, + 0xa981, 0xa983, 0xa984, 0xa986, 0xa987, 0xa989, 0xa98b, 0xa98c, + 0xa98e, 0xa98f, 0xa991, 0xa993, 0xa994, 0xa996, 0xa997, 0xa999, + 0xa99b, 0xa99c, 0xa99e, 0xa99f, 0xa9a1, 0xa9a3, 0xa9a4, 0xa9a6, + 0xa9a7, 0xa9a9, 0xa9ab, 0xa9ac, 0xa9ae, 0xa9af, 0xa9b1, 0xa9b3, + 0xa9b4, 0xa9b6, 0xa9b7, 0xa9b9, 0xa9bb, 0xa9bc, 0xa9be, 0xa9c0, + 0xa9c1, 0xa9c3, 0xa9c4, 0xa9c6, 0xa9c8, 0xa9c9, 0xa9cb, 0xa9cd, + 0xa9ce, 0xa9d0, 0xa9d1, 0xa9d3, 0xa9d5, 0xa9d6, 0xa9d8, 0xa9da, + 0xa9db, 0xa9dd, 0xa9df, 0xa9e0, 0xa9e2, 0xa9e3, 0xa9e5, 0xa9e7, + 0xa9e8, 0xa9ea, 0xa9ec, 0xa9ed, 0xa9ef, 0xa9f1, 0xa9f2, 0xa9f4, + 0xa9f6, 0xa9f7, 0xa9f9, 0xa9fb, 0xa9fc, 0xa9fe, 0xa9ff, 0xaa01, + 0xaa03, 0xaa04, 0xaa06, 0xaa08, 0xaa09, 0xaa0b, 0xaa0d, 0xaa0e, + 0xaa10, 0xaa13, 0xaa17, 0xaa1a, 0xaa1d, 0xaa21, 0xaa24, 0xaa28, + 0xaa2b, 0xaa2e, 0xaa32, 0xaa35, 0xaa38, 0xaa3c, 0xaa3f, 0xaa43, + 0xaa46, 0xaa49, 0xaa4d, 0xaa50, 0xaa54, 0xaa57, 0xaa5a, 0xaa5e, + 0xaa61, 0xaa65, 0xaa68, 0xaa6c, 0xaa6f, 0xaa72, 0xaa76, 0xaa79, + 0xaa7d, 0xaa80, 0xaa84, 0xaa87, 0xaa8b, 0xaa8e, 0xaa92, 0xaa95, + 0xaa99, 0xaa9c, 0xaaa0, 0xaaa3, 0xaaa7, 0xaaaa, 0xaaae, 0xaab1, + 0xaab5, 0xaab8, 0xaabc, 0xaabf, 0xaac3, 0xaac6, 0xaaca, 0xaacd, + 0xaad1, 0xaad5, 0xaad8, 0xaadc, 0xaadf, 0xaae3, 0xaae6, 0xaaea, + 0xaaee, 0xaaf1, 0xaaf5, 0xaaf8, 0xaafc, 0xab00, 0xab03, 0xab07, + 0xab0a, 0xab0e, 0xab12, 0xab15, 0xab19, 0xab1c, 0xab20, 0xab24, + 0xab27, 0xab2b, 0xab2f, 0xab32, 0xab36, 0xab3a, 0xab3d, 0xab41, + 0xab45, 0xab48, 0xab4c, 0xab50, 0xab54, 0xab57, 0xab5b, 0xab5f, + 0xab62, 0xab66, 0xab6a, 0xab6d, 0xab71, 0xab75, 0xab79, 0xab7c, + 0xab80, 0xab84, 0xab88, 0xab8b, 0xab8f, 0xab93, 0xab97, 0xab9a, + 0xab9e, 0xaba2, 0xaba6, 0xabaa, 0xabad, 0xabb1, 0xabb5, 0xabb9, + 0xabbd, 0xabc0, 0xabc4, 0xabc8, 0xabcc, 0xabd0, 0xabd4, 0xabd7, + 0xabdb, 0xabdf, 0xabe3, 0xabe7, 0xabeb, 0xabee, 0xabf2, 0xabf6, + 0xabfa, 0xabfe, 0xac01, 0xac03, 0xac05, 0xac07, 0xac09, 0xac0b, + 0xac0d, 0xac0f, 0xac10, 0xac12, 0xac14, 0xac16, 0xac18, 0xac1a, + 0xac1c, 0xac1e, 0xac20, 0xac22, 0xac24, 0xac26, 0xac28, 0xac2a, + 0xac2c, 0xac2e, 0xac30, 0xac32, 0xac34, 0xac36, 0xac38, 0xac3a, + 0xac3c, 0xac3e, 0xac40, 0xac42, 0xac44, 0xac46, 0xac48, 0xac4a, + 0xac4c, 0xac4e, 0xac50, 0xac52, 0xac54, 0xac56, 0xac58, 0xac5a, + 0xac5c, 0xac5e, 0xac60, 0xac62, 0xac64, 0xac66, 0xac69, 0xac6b, + 0xac6d, 0xac6f, 0xac71, 0xac73, 0xac75, 0xac77, 0xac79, 0xac7b, + 0xac7d, 0xac7f, 0xac81, 0xac83, 0xac85, 0xac87, 0xac8a, 0xac8c, + 0xac8e, 0xac90, 0xac92, 0xac94, 0xac96, 0xac98, 0xac9a, 0xac9c, + 0xac9e, 0xaca0, 0xaca3, 0xaca5, 0xaca7, 0xaca9, 0xacab, 0xacad, + 0xacaf, 0xacb1, 0xacb3, 0xacb6, 0xacb8, 0xacba, 0xacbc, 0xacbe, + 0xacc0, 0xacc2, 0xacc4, 0xacc7, 0xacc9, 0xaccb, 0xaccd, 0xaccf, + 0xacd1, 0xacd3, 0xacd6, 0xacd8, 0xacda, 0xacdc, 0xacde, 0xace0, + 0xace3, 0xace5, 0xace7, 0xace9, 0xaceb, 0xaced, 0xacf0, 0xacf2, + 0xacf4, 0xacf6, 0xacf8, 0xacfa, 0xacfd, 0xacff, 0xad01, 0xad03, + 0xad05, 0xad08, 0xad0a, 0xad0c, 0xad0e, 0xad10, 0xad13, 0xad15, + 0xad17, 0xad19, 0xad1b, 0xad1e, 0xad20, 0xad22, 0xad24, 0xad27, + 0xad29, 0xad2b, 0xad2d, 0xad2f, 0xad32, 0xad34, 0xad36, 0xad38, + 0xad3b, 0xad3d, 0xad3f, 0xad41, 0xad44, 0xad46, 0xad48, 0xad4a, + 0xad4d, 0xad4f, 0xad51, 0xad54, 0xad56, 0xad58, 0xad5a, 0xad5d, + 0xad5f, 0xad61, 0xad63, 0xad66, 0xad68, 0xad6a, 0xad6d, 0xad6f, + 0xad71, 0xad73, 0xad76, 0xad78, 0xad7a, 0xad7d, 0xad7f, 0xad81, + 0xad84, 0xad86, 0xad88, 0xad8b, 0xad8d, 0xad8f, 0xad91, 0xad94, + 0xad96, 0xad98, 0xad9b, 0xad9d, 0xad9f, 0xada2, 0xada4, 0xada6, + 0xada9, 0xadab, 0xadae, 0xadb0, 0xadb2, 0xadb5, 0xadb7, 0xadb9, + 0xadbc, 0xadbe, 0xadc0, 0xadc3, 0xadc5, 0xadc7, 0xadca, 0xadcc, + 0xadcf, 0xadd1, 0xadd3, 0xadd6, 0xadd8, 0xadda, 0xaddd, 0xaddf, + 0xade2, 0xade4, 0xade6, 0xade9, 0xadeb, 0xadee, 0xadf0, 0xadf2, + 0xadf5, 0xadf7, 0xadfa, 0xadfc, 0xadff, 0xae01, 0xae03, 0xae06, + 0xae08, 0xae0b, 0xae0d, 0xae10, 0xae12, 0xae14, 0xae17, 0xae19, + 0xae1c, 0xae1e, 0xae21, 0xae23, 0xae25, 0xae28, 0xae2a, 0xae2d, + 0xae2f, 0xae32, 0xae34, 0xae37, 0xae39, 0xae3c, 0xae3e, 0xae41, + 0xae43, 0xae46, 0xae48, 0xae4b, 0xae4d, 0xae4f, 0xae52, 0xae54, + 0xae57, 0xae59, 0xae5c, 0xae5e, 0xae61, 0xae63, 0xae66, 0xae68, + 0xae6b, 0xae6d, 0xae70, 0xae72, 0xae75, 0xae78, 0xae7a, 0xae7d, + 0xae7f, 0xae82, 0xae84, 0xae87, 0xae89, 0xae8c, 0xae8e, 0xae91, + 0xae93, 0xae96, 0xae98, 0xae9b, 0xae9e, 0xaea0, 0xaea3, 0xaea5, + 0xaea8, 0xaeaa, 0xaead, 0xaeaf, 0xaeb2, 0xaeb5, 0xaeb7, 0xaeba, + 0xaebc, 0xaebf, 0xaec2, 0xaec4, 0xaec7, 0xaec9, 0xaecc, 0xaece, + 0xaed1, 0xaed4, 0xaed6, 0xaed9, 0xaedb, 0xaede, 0xaee1, 0xaee3, + 0xaee6, 0xaee8, 0xaeeb, 0xaeee, 0xaef0, 0xaef3, 0xaef6, 0xaef8, + 0xaefb, 0xaefd, 0xaf00, 0xaf03, 0xaf05, 0xaf08, 0xaf0b, 0xaf0d, + 0xaf10, 0xaf13, 0xaf15, 0xaf18, 0xaf1a, 0xaf1d, 0xaf20, 0xaf22, + 0xaf25, 0xaf28, 0xaf2a, 0xaf2d, 0xaf30, 0xaf32, 0xaf35, 0xaf38, + 0xaf3a, 0xaf3d, 0xaf40, 0xaf43, 0xaf45, 0xaf48, 0xaf4b, 0xaf4d, + 0xaf50, 0xaf53, 0xaf55, 0xaf58, 0xaf5b, 0xaf5d, 0xaf60, 0xaf63, + 0xaf66, 0xaf68, 0xaf6b, 0xaf6e, 0xaf70, 0xaf73, 0xaf76, 0xaf79, + 0xaf7b, 0xaf7e, 0xaf81, 0xaf84, 0xaf86, 0xaf89, 0xaf8c, 0xaf8f, + 0xaf91, 0xaf94, 0xaf97, 0xaf9a, 0xaf9c, 0xaf9f, 0xafa2, 0xafa5, + 0xafa7, 0xafaa, 0xafad, 0xafb0, 0xafb2, 0xafb5, 0xafb8, 0xafbb, + 0xafbd, 0xafc0, 0xafc3, 0xafc6, 0xafc9, 0xafcb, 0xafce, 0xafd1, + 0xafd4, 0xafd7, 0xafd9, 0xafdc, 0xafdf, 0xafe2, 0xafe5, 0xafe7, + 0xafea, 0xafed, 0xaff0, 0xaff3, 0xaff6, 0xaff8, 0xaffb, 0xaffe, + 0xb000, 0xb002, 0xb003, 0xb005, 0xb006, 0xb007, 0xb009, 0xb00a, + 0xb00c, 0xb00d, 0xb00f, 0xb010, 0xb011, 0xb013, 0xb014, 0xb016, + 0xb017, 0xb019, 0xb01a, 0xb01b, 0xb01d, 0xb01e, 0xb020, 0xb021, + 0xb023, 0xb024, 0xb026, 0xb027, 0xb028, 0xb02a, 0xb02b, 0xb02d, + 0xb02e, 0xb030, 0xb031, 0xb033, 0xb034, 0xb036, 0xb037, 0xb038, + 0xb03a, 0xb03b, 0xb03d, 0xb03e, 0xb040, 0xb041, 0xb043, 0xb044, + 0xb046, 0xb047, 0xb049, 0xb04a, 0xb04b, 0xb04d, 0xb04e, 0xb050, + 0xb051, 0xb053, 0xb054, 0xb056, 0xb057, 0xb059, 0xb05a, 0xb05c, + 0xb05d, 0xb05f, 0xb060, 0xb062, 0xb063, 0xb065, 0xb066, 0xb068, + 0xb069, 0xb06b, 0xb06c, 0xb06e, 0xb06f, 0xb071, 0xb072, 0xb074, + 0xb075, 0xb077, 0xb078, 0xb07a, 0xb07b, 0xb07d, 0xb07e, 0xb080, + 0xb081, 0xb083, 0xb084, 0xb086, 0xb087, 0xb089, 0xb08a, 0xb08c, + 0xb08d, 0xb08f, 0xb090, 0xb092, 0xb093, 0xb095, 0xb096, 0xb098, + 0xb099, 0xb09b, 0xb09c, 0xb09e, 0xb0a0, 0xb0a1, 0xb0a3, 0xb0a4, + 0xb0a6, 0xb0a7, 0xb0a9, 0xb0aa, 0xb0ac, 0xb0ad, 0xb0af, 0xb0b0, + 0xb0b2, 0xb0b4, 0xb0b5, 0xb0b7, 0xb0b8, 0xb0ba, 0xb0bb, 0xb0bd, + 0xb0be, 0xb0c0, 0xb0c2, 0xb0c3, 0xb0c5, 0xb0c6, 0xb0c8, 0xb0c9, + 0xb0cb, 0xb0cc, 0xb0ce, 0xb0d0, 0xb0d1, 0xb0d3, 0xb0d4, 0xb0d6, + 0xb0d7, 0xb0d9, 0xb0db, 0xb0dc, 0xb0de, 0xb0df, 0xb0e1, 0xb0e2, + 0xb0e4, 0xb0e6, 0xb0e7, 0xb0e9, 0xb0ea, 0xb0ec, 0xb0ed, 0xb0ef, + 0xb0f1, 0xb0f2, 0xb0f4, 0xb0f5, 0xb0f7, 0xb0f9, 0xb0fa, 0xb0fc, + 0xb0fd, 0xb0ff, 0xb101, 0xb102, 0xb104, 0xb105, 0xb107, 0xb109, + 0xb10a, 0xb10c, 0xb10d, 0xb10f, 0xb111, 0xb112, 0xb114, 0xb115, + 0xb117, 0xb119, 0xb11a, 0xb11c, 0xb11e, 0xb11f, 0xb121, 0xb122, + 0xb124, 0xb126, 0xb127, 0xb129, 0xb12b, 0xb12c, 0xb12e, 0xb12f, + 0xb131, 0xb133, 0xb134, 0xb136, 0xb138, 0xb139, 0xb13b, 0xb13c, + 0xb13e, 0xb140, 0xb141, 0xb143, 0xb145, 0xb146, 0xb148, 0xb14a, + 0xb14b, 0xb14d, 0xb14f, 0xb150, 0xb152, 0xb154, 0xb155, 0xb157, + 0xb159, 0xb15a, 0xb15c, 0xb15e, 0xb15f, 0xb161, 0xb162, 0xb164, + 0xb166, 0xb167, 0xb169, 0xb16b, 0xb16c, 0xb16e, 0xb170, 0xb172, + 0xb173, 0xb175, 0xb177, 0xb178, 0xb17a, 0xb17c, 0xb17d, 0xb17f, + 0xb181, 0xb182, 0xb184, 0xb186, 0xb187, 0xb189, 0xb18b, 0xb18c, + 0xb18e, 0xb190, 0xb192, 0xb193, 0xb195, 0xb197, 0xb198, 0xb19a, + 0xb19c, 0xb19d, 0xb19f, 0xb1a1, 0xb1a3, 0xb1a4, 0xb1a6, 0xb1a8, + 0xb1a9, 0xb1ab, 0xb1ad, 0xb1af, 0xb1b0, 0xb1b2, 0xb1b4, 0xb1b5, + 0xb1b7, 0xb1b9, 0xb1bb, 0xb1bc, 0xb1be, 0xb1c0, 0xb1c1, 0xb1c3, + 0xb1c5, 0xb1c7, 0xb1c8, 0xb1ca, 0xb1cc, 0xb1ce, 0xb1cf, 0xb1d1, + 0xb1d3, 0xb1d4, 0xb1d6, 0xb1d8, 0xb1da, 0xb1db, 0xb1dd, 0xb1df, + 0xb1e1, 0xb1e2, 0xb1e4, 0xb1e6, 0xb1e8, 0xb1e9, 0xb1eb, 0xb1ed, + 0xb1ef, 0xb1f0, 0xb1f2, 0xb1f4, 0xb1f6, 0xb1f7, 0xb1f9, 0xb1fb, + 0xb1fd, 0xb1ff, 0xb200, 0xb202, 0xb204, 0xb206, 0xb207, 0xb209, + 0xb20b, 0xb20d, 0xb20e, 0xb210, 0xb212, 0xb214, 0xb216, 0xb217, + 0xb219, 0xb21b, 0xb21d, 0xb21e, 0xb220, 0xb222, 0xb224, 0xb226, + 0xb227, 0xb229, 0xb22b, 0xb22d, 0xb22f, 0xb230, 0xb232, 0xb234, + 0xb236, 0xb238, 0xb239, 0xb23b, 0xb23d, 0xb23f, 0xb241, 0xb242, + 0xb244, 0xb246, 0xb248, 0xb24a, 0xb24b, 0xb24d, 0xb24f, 0xb251, + 0xb253, 0xb254, 0xb256, 0xb258, 0xb25a, 0xb25c, 0xb25e, 0xb25f, + 0xb261, 0xb263, 0xb265, 0xb267, 0xb269, 0xb26a, 0xb26c, 0xb26e, + 0xb270, 0xb272, 0xb274, 0xb275, 0xb277, 0xb279, 0xb27b, 0xb27d, + 0xb27f, 0xb280, 0xb282, 0xb284, 0xb286, 0xb288, 0xb28a, 0xb28c, + 0xb28d, 0xb28f, 0xb291, 0xb293, 0xb295, 0xb297, 0xb299, 0xb29a, + 0xb29c, 0xb29e, 0xb2a0, 0xb2a2, 0xb2a4, 0xb2a6, 0xb2a7, 0xb2a9, + 0xb2ab, 0xb2ad, 0xb2af, 0xb2b1, 0xb2b3, 0xb2b5, 0xb2b6, 0xb2b8, + 0xb2ba, 0xb2bc, 0xb2be, 0xb2c0, 0xb2c2, 0xb2c4, 0xb2c5, 0xb2c7, + 0xb2c9, 0xb2cb, 0xb2cd, 0xb2cf, 0xb2d1, 0xb2d3, 0xb2d5, 0xb2d6, + 0xb2d8, 0xb2da, 0xb2dc, 0xb2de, 0xb2e0, 0xb2e2, 0xb2e4, 0xb2e6, + 0xb2e8, 0xb2ea, 0xb2eb, 0xb2ed, 0xb2ef, 0xb2f1, 0xb2f3, 0xb2f5, + 0xb2f7, 0xb2fb, 0xb2ff, 0xb302, 0xb306, 0xb30a, 0xb30e, 0xb312, + 0xb316, 0xb31a, 0xb31d, 0xb321, 0xb325, 0xb329, 0xb32d, 0xb331, + 0xb335, 0xb339, 0xb33d, 0xb340, 0xb344, 0xb348, 0xb34c, 0xb350, + 0xb354, 0xb358, 0xb35c, 0xb360, 0xb364, 0xb368, 0xb36c, 0xb370, + 0xb374, 0xb378, 0xb37c, 0xb380, 0xb384, 0xb388, 0xb38c, 0xb390, + 0xb394, 0xb398, 0xb39c, 0xb3a0, 0xb3a4, 0xb3a8, 0xb3ac, 0xb3b0, + 0xb3b4, 0xb3b8, 0xb3bc, 0xb3c0, 0xb3c4, 0xb3c8, 0xb3cc, 0xb3d0, + 0xb3d4, 0xb3d9, 0xb3dd, 0xb3e1, 0xb3e5, 0xb3e9, 0xb3ed, 0xb3f1, + 0xb3f5, 0xb3f9, 0xb3fe, 0xb401, 0xb403, 0xb405, 0xb407, 0xb409, + 0xb40b, 0xb40d, 0xb40f, 0xb411, 0xb414, 0xb416, 0xb418, 0xb41a, + 0xb41c, 0xb41e, 0xb420, 0xb422, 0xb424, 0xb426, 0xb428, 0xb42b, + 0xb42d, 0xb42f, 0xb431, 0xb433, 0xb435, 0xb437, 0xb439, 0xb43c, + 0xb43e, 0xb440, 0xb442, 0xb444, 0xb446, 0xb448, 0xb44b, 0xb44d, + 0xb44f, 0xb451, 0xb453, 0xb455, 0xb457, 0xb45a, 0xb45c, 0xb45e, + 0xb460, 0xb462, 0xb464, 0xb467, 0xb469, 0xb46b, 0xb46d, 0xb46f, + 0xb472, 0xb474, 0xb476, 0xb478, 0xb47a, 0xb47d, 0xb47f, 0xb481, + 0xb483, 0xb485, 0xb488, 0xb48a, 0xb48c, 0xb48e, 0xb490, 0xb493, + 0xb495, 0xb497, 0xb499, 0xb49c, 0xb49e, 0xb4a0, 0xb4a2, 0xb4a4, + 0xb4a7, 0xb4a9, 0xb4ab, 0xb4ad, 0xb4b0, 0xb4b2, 0xb4b4, 0xb4b6, + 0xb4b9, 0xb4bb, 0xb4bd, 0xb4c0, 0xb4c2, 0xb4c4, 0xb4c6, 0xb4c9, + 0xb4cb, 0xb4cd, 0xb4cf, 0xb4d2, 0xb4d4, 0xb4d6, 0xb4d9, 0xb4db, + 0xb4dd, 0xb4e0, 0xb4e2, 0xb4e4, 0xb4e6, 0xb4e9, 0xb4eb, 0xb4ed, + 0xb4f0, 0xb4f2, 0xb4f4, 0xb4f7, 0xb4f9, 0xb4fb, 0xb4fe, 0xb500, + 0xb502, 0xb505, 0xb507, 0xb509, 0xb50c, 0xb50e, 0xb510, 0xb513, + 0xb515, 0xb517, 0xb51a, 0xb51c, 0xb51e, 0xb521, 0xb523, 0xb526, + 0xb528, 0xb52a, 0xb52d, 0xb52f, 0xb531, 0xb534, 0xb536, 0xb539, + 0xb53b, 0xb53d, 0xb540, 0xb542, 0xb545, 0xb547, 0xb549, 0xb54c, + 0xb54e, 0xb551, 0xb553, 0xb555, 0xb558, 0xb55a, 0xb55d, 0xb55f, + 0xb562, 0xb564, 0xb566, 0xb569, 0xb56b, 0xb56e, 0xb570, 0xb573, + 0xb575, 0xb577, 0xb57a, 0xb57c, 0xb57f, 0xb581, 0xb584, 0xb586, + 0xb589, 0xb58b, 0xb58e, 0xb590, 0xb593, 0xb595, 0xb598, 0xb59a, + 0xb59d, 0xb59f, 0xb5a1, 0xb5a4, 0xb5a6, 0xb5a9, 0xb5ab, 0xb5ae, + 0xb5b0, 0xb5b3, 0xb5b5, 0xb5b8, 0xb5ba, 0xb5bd, 0xb5c0, 0xb5c2, + 0xb5c5, 0xb5c7, 0xb5ca, 0xb5cc, 0xb5cf, 0xb5d1, 0xb5d4, 0xb5d6, + 0xb5d9, 0xb5db, 0xb5de, 0xb5e0, 0xb5e3, 0xb5e6, 0xb5e8, 0xb5eb, + 0xb5ed, 0xb5f0, 0xb5f2, 0xb5f5, 0xb5f7, 0xb5fa, 0xb5fd, 0xb5ff, + 0xb602, 0xb604, 0xb607, 0xb60a, 0xb60c, 0xb60f, 0xb611, 0xb614, + 0xb616, 0xb619, 0xb61c, 0xb61e, 0xb621, 0xb623, 0xb626, 0xb629, + 0xb62b, 0xb62e, 0xb631, 0xb633, 0xb636, 0xb638, 0xb63b, 0xb63e, + 0xb640, 0xb643, 0xb646, 0xb648, 0xb64b, 0xb64e, 0xb650, 0xb653, + 0xb655, 0xb658, 0xb65b, 0xb65d, 0xb660, 0xb663, 0xb665, 0xb668, + 0xb66b, 0xb66d, 0xb670, 0xb673, 0xb676, 0xb678, 0xb67b, 0xb67e, + 0xb680, 0xb683, 0xb686, 0xb688, 0xb68b, 0xb68e, 0xb690, 0xb693, + 0xb696, 0xb699, 0xb69b, 0xb69e, 0xb6a1, 0xb6a3, 0xb6a6, 0xb6a9, + 0xb6ac, 0xb6ae, 0xb6b1, 0xb6b4, 0xb6b7, 0xb6b9, 0xb6bc, 0xb6bf, + 0xb6c2, 0xb6c4, 0xb6c7, 0xb6ca, 0xb6cd, 0xb6cf, 0xb6d2, 0xb6d5, + 0xb6d8, 0xb6da, 0xb6dd, 0xb6e0, 0xb6e3, 0xb6e5, 0xb6e8, 0xb6eb, + 0xb6ee, 0xb6f1, 0xb6f3, 0xb6f6, 0xb6f9, 0xb6fc, 0xb6ff, 0xb701, + 0xb704, 0xb707, 0xb70a, 0xb70d, 0xb70f, 0xb712, 0xb715, 0xb718, + 0xb71b, 0xb71e, 0xb720, 0xb723, 0xb726, 0xb729, 0xb72c, 0xb72f, + 0xb731, 0xb734, 0xb737, 0xb73a, 0xb73d, 0xb740, 0xb743, 0xb745, + 0xb748, 0xb74b, 0xb74e, 0xb751, 0xb754, 0xb757, 0xb759, 0xb75c, + 0xb75f, 0xb762, 0xb765, 0xb768, 0xb76b, 0xb76e, 0xb771, 0xb774, + 0xb776, 0xb779, 0xb77c, 0xb77f, 0xb782, 0xb785, 0xb788, 0xb78b, + 0xb78e, 0xb791, 0xb794, 0xb796, 0xb799, 0xb79c, 0xb79f, 0xb7a2, + 0xb7a5, 0xb7a8, 0xb7ab, 0xb7ae, 0xb7b1, 0xb7b4, 0xb7b7, 0xb7ba, + 0xb7bd, 0xb7c0, 0xb7c3, 0xb7c6, 0xb7c9, 0xb7cc, 0xb7cf, 0xb7d2, + 0xb7d5, 0xb7d7, 0xb7da, 0xb7dd, 0xb7e0, 0xb7e3, 0xb7e6, 0xb7e9, + 0xb7ec, 0xb7ef, 0xb7f2, 0xb7f5, 0xb7f8, 0xb7fb, 0xb7fe, 0xb801, + 0xb802, 0xb804, 0xb805, 0xb807, 0xb808, 0xb80a, 0xb80b, 0xb80d, + 0xb80e, 0xb810, 0xb811, 0xb813, 0xb814, 0xb816, 0xb817, 0xb819, + 0xb81b, 0xb81c, 0xb81e, 0xb81f, 0xb821, 0xb822, 0xb824, 0xb825, + 0xb827, 0xb828, 0xb82a, 0xb82b, 0xb82d, 0xb82f, 0xb830, 0xb832, + 0xb833, 0xb835, 0xb836, 0xb838, 0xb839, 0xb83b, 0xb83c, 0xb83e, + 0xb840, 0xb841, 0xb843, 0xb844, 0xb846, 0xb847, 0xb849, 0xb84b, + 0xb84c, 0xb84e, 0xb84f, 0xb851, 0xb852, 0xb854, 0xb856, 0xb857, + 0xb859, 0xb85a, 0xb85c, 0xb85d, 0xb85f, 0xb861, 0xb862, 0xb864, + 0xb865, 0xb867, 0xb869, 0xb86a, 0xb86c, 0xb86d, 0xb86f, 0xb870, + 0xb872, 0xb874, 0xb875, 0xb877, 0xb878, 0xb87a, 0xb87c, 0xb87d, + 0xb87f, 0xb880, 0xb882, 0xb884, 0xb885, 0xb887, 0xb889, 0xb88a, + 0xb88c, 0xb88d, 0xb88f, 0xb891, 0xb892, 0xb894, 0xb895, 0xb897, + 0xb899, 0xb89a, 0xb89c, 0xb89e, 0xb89f, 0xb8a1, 0xb8a3, 0xb8a4, + 0xb8a6, 0xb8a7, 0xb8a9, 0xb8ab, 0xb8ac, 0xb8ae, 0xb8b0, 0xb8b1, + 0xb8b3, 0xb8b5, 0xb8b6, 0xb8b8, 0xb8ba, 0xb8bb, 0xb8bd, 0xb8be, + 0xb8c0, 0xb8c2, 0xb8c3, 0xb8c5, 0xb8c7, 0xb8c8, 0xb8ca, 0xb8cc, + 0xb8cd, 0xb8cf, 0xb8d1, 0xb8d2, 0xb8d4, 0xb8d6, 0xb8d7, 0xb8d9, + 0xb8db, 0xb8dc, 0xb8de, 0xb8e0, 0xb8e1, 0xb8e3, 0xb8e5, 0xb8e7, + 0xb8e8, 0xb8ea, 0xb8ec, 0xb8ed, 0xb8ef, 0xb8f1, 0xb8f2, 0xb8f4, + 0xb8f6, 0xb8f7, 0xb8f9, 0xb8fb, 0xb8fd, 0xb8fe, 0xb900, 0xb902, + 0xb903, 0xb905, 0xb907, 0xb908, 0xb90a, 0xb90c, 0xb90e, 0xb90f, + 0xb911, 0xb913, 0xb914, 0xb916, 0xb918, 0xb91a, 0xb91b, 0xb91d, + 0xb91f, 0xb920, 0xb922, 0xb924, 0xb926, 0xb927, 0xb929, 0xb92b, + 0xb92d, 0xb92e, 0xb930, 0xb932, 0xb934, 0xb935, 0xb937, 0xb939, + 0xb93b, 0xb93c, 0xb93e, 0xb940, 0xb942, 0xb943, 0xb945, 0xb947, + 0xb949, 0xb94a, 0xb94c, 0xb94e, 0xb950, 0xb951, 0xb953, 0xb955, + 0xb957, 0xb958, 0xb95a, 0xb95c, 0xb95e, 0xb95f, 0xb961, 0xb963, + 0xb965, 0xb967, 0xb968, 0xb96a, 0xb96c, 0xb96e, 0xb96f, 0xb971, + 0xb973, 0xb975, 0xb977, 0xb978, 0xb97a, 0xb97c, 0xb97e, 0xb97f, + 0xb981, 0xb983, 0xb985, 0xb987, 0xb988, 0xb98a, 0xb98c, 0xb98e, + 0xb990, 0xb991, 0xb993, 0xb995, 0xb997, 0xb999, 0xb99b, 0xb99c, + 0xb99e, 0xb9a0, 0xb9a2, 0xb9a4, 0xb9a5, 0xb9a7, 0xb9a9, 0xb9ab, + 0xb9ad, 0xb9af, 0xb9b0, 0xb9b2, 0xb9b4, 0xb9b6, 0xb9b8, 0xb9ba, + 0xb9bb, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c3, 0xb9c5, 0xb9c6, 0xb9c8, + 0xb9ca, 0xb9cc, 0xb9ce, 0xb9d0, 0xb9d1, 0xb9d3, 0xb9d5, 0xb9d7, + 0xb9d9, 0xb9db, 0xb9dd, 0xb9de, 0xb9e0, 0xb9e2, 0xb9e4, 0xb9e6, + 0xb9e8, 0xb9ea, 0xb9eb, 0xb9ed, 0xb9ef, 0xb9f1, 0xb9f3, 0xb9f5, + 0xb9f7, 0xb9f9, 0xb9fa, 0xb9fc, 0xb9fe, 0xba00, 0xba02, 0xba04, + 0xba06, 0xba08, 0xba09, 0xba0b, 0xba0d, 0xba0f, 0xba11, 0xba13, + 0xba15, 0xba17, 0xba19, 0xba1b, 0xba1c, 0xba1e, 0xba20, 0xba22, + 0xba24, 0xba26, 0xba28, 0xba2a, 0xba2c, 0xba2e, 0xba2f, 0xba31, + 0xba33, 0xba35, 0xba37, 0xba39, 0xba3b, 0xba3d, 0xba3f, 0xba41, + 0xba43, 0xba45, 0xba47, 0xba48, 0xba4a, 0xba4c, 0xba4e, 0xba50, + 0xba52, 0xba54, 0xba56, 0xba58, 0xba5a, 0xba5c, 0xba5e, 0xba60, + 0xba62, 0xba64, 0xba66, 0xba67, 0xba69, 0xba6b, 0xba6d, 0xba6f, + 0xba71, 0xba73, 0xba75, 0xba77, 0xba79, 0xba7b, 0xba7d, 0xba7f, + 0xba81, 0xba83, 0xba85, 0xba87, 0xba89, 0xba8b, 0xba8d, 0xba8f, + 0xba91, 0xba93, 0xba95, 0xba97, 0xba99, 0xba9b, 0xba9d, 0xba9f, + 0xbaa0, 0xbaa2, 0xbaa4, 0xbaa6, 0xbaa8, 0xbaaa, 0xbaac, 0xbaae, + 0xbab0, 0xbab2, 0xbab4, 0xbab6, 0xbab8, 0xbaba, 0xbabc, 0xbabe, + 0xbac0, 0xbac2, 0xbac4, 0xbac6, 0xbac8, 0xbaca, 0xbacc, 0xbace, + 0xbad1, 0xbad3, 0xbad5, 0xbad7, 0xbad9, 0xbadb, 0xbadd, 0xbadf, + 0xbae1, 0xbae3, 0xbae5, 0xbae7, 0xbae9, 0xbaeb, 0xbaed, 0xbaef, + 0xbaf1, 0xbaf3, 0xbaf5, 0xbaf7, 0xbaf9, 0xbafb, 0xbafd, 0xbaff, + 0xbb01, 0xbb03, 0xbb05, 0xbb07, 0xbb09, 0xbb0b, 0xbb0e, 0xbb10, + 0xbb12, 0xbb14, 0xbb16, 0xbb18, 0xbb1a, 0xbb1c, 0xbb1e, 0xbb20, + 0xbb22, 0xbb24, 0xbb26, 0xbb28, 0xbb2a, 0xbb2c, 0xbb2f, 0xbb31, + 0xbb33, 0xbb35, 0xbb37, 0xbb39, 0xbb3b, 0xbb3d, 0xbb3f, 0xbb41, + 0xbb43, 0xbb45, 0xbb48, 0xbb4a, 0xbb4c, 0xbb4e, 0xbb50, 0xbb52, + 0xbb54, 0xbb56, 0xbb58, 0xbb5a, 0xbb5d, 0xbb5f, 0xbb61, 0xbb63, + 0xbb65, 0xbb67, 0xbb69, 0xbb6b, 0xbb6d, 0xbb6f, 0xbb72, 0xbb74, + 0xbb76, 0xbb78, 0xbb7a, 0xbb7c, 0xbb7e, 0xbb80, 0xbb83, 0xbb85, + 0xbb87, 0xbb89, 0xbb8b, 0xbb8d, 0xbb8f, 0xbb91, 0xbb94, 0xbb96, + 0xbb98, 0xbb9a, 0xbb9c, 0xbb9e, 0xbba0, 0xbba3, 0xbba5, 0xbba7, + 0xbba9, 0xbbab, 0xbbad, 0xbbaf, 0xbbb2, 0xbbb4, 0xbbb6, 0xbbb8, + 0xbbba, 0xbbbc, 0xbbbf, 0xbbc1, 0xbbc3, 0xbbc5, 0xbbc7, 0xbbc9, + 0xbbcc, 0xbbce, 0xbbd0, 0xbbd2, 0xbbd4, 0xbbd6, 0xbbd9, 0xbbdb, + 0xbbdd, 0xbbdf, 0xbbe1, 0xbbe4, 0xbbe6, 0xbbe8, 0xbbea, 0xbbec, + 0xbbee, 0xbbf1, 0xbbf3, 0xbbf5, 0xbbf7, 0xbbf9, 0xbbfc, 0xbbfe, + 0xbc00, 0xbc02, 0xbc04, 0xbc07, 0xbc09, 0xbc0b, 0xbc0d, 0xbc10, + 0xbc12, 0xbc14, 0xbc16, 0xbc18, 0xbc1b, 0xbc1d, 0xbc1f, 0xbc22, + 0xbc24, 0xbc26, 0xbc28, 0xbc2b, 0xbc2d, 0xbc2f, 0xbc32, 0xbc34, + 0xbc36, 0xbc39, 0xbc3b, 0xbc3d, 0xbc3f, 0xbc42, 0xbc44, 0xbc47, + 0xbc49, 0xbc4b, 0xbc4e, 0xbc50, 0xbc52, 0xbc55, 0xbc57, 0xbc59, + 0xbc5c, 0xbc5e, 0xbc61, 0xbc63, 0xbc66, 0xbc68, 0xbc6a, 0xbc6d, + 0xbc6f, 0xbc72, 0xbc74, 0xbc77, 0xbc79, 0xbc7b, 0xbc7e, 0xbc80, + 0xbc83, 0xbc85, 0xbc88, 0xbc8a, 0xbc8d, 0xbc8f, 0xbc92, 0xbc94, + 0xbc97, 0xbc99, 0xbc9c, 0xbc9f, 0xbca1, 0xbca4, 0xbca6, 0xbca9, + 0xbcab, 0xbcae, 0xbcb0, 0xbcb3, 0xbcb6, 0xbcb8, 0xbcbb, 0xbcbd, + 0xbcc0, 0xbcc3, 0xbcc5, 0xbcc8, 0xbccb, 0xbccd, 0xbcd0, 0xbcd2, + 0xbcd5, 0xbcd8, 0xbcda, 0xbcdd, 0xbce0, 0xbce2, 0xbce5, 0xbce8, + 0xbceb, 0xbced, 0xbcf0, 0xbcf3, 0xbcf5, 0xbcf8, 0xbcfb, 0xbcfe, + 0xbd00, 0xbd03, 0xbd06, 0xbd09, 0xbd0b, 0xbd0e, 0xbd11, 0xbd14, + 0xbd17, 0xbd19, 0xbd1c, 0xbd1f, 0xbd22, 0xbd25, 0xbd27, 0xbd2a, + 0xbd2d, 0xbd30, 0xbd33, 0xbd36, 0xbd39, 0xbd3b, 0xbd3e, 0xbd41, + 0xbd44, 0xbd47, 0xbd4a, 0xbd4d, 0xbd50, 0xbd53, 0xbd56, 0xbd59, + 0xbd5b, 0xbd5e, 0xbd61, 0xbd64, 0xbd67, 0xbd6a, 0xbd6d, 0xbd70, + 0xbd73, 0xbd76, 0xbd79, 0xbd7c, 0xbd7f, 0xbd82, 0xbd85, 0xbd88, + 0xbd8b, 0xbd8f, 0xbd92, 0xbd95, 0xbd98, 0xbd9b, 0xbd9e, 0xbda1, + 0xbda4, 0xbda7, 0xbdaa, 0xbdad, 0xbdb1, 0xbdb4, 0xbdb7, 0xbdba, + 0xbdbd, 0xbdc0, 0xbdc3, 0xbdc7, 0xbdca, 0xbdcd, 0xbdd0, 0xbdd3, + 0xbdd7, 0xbdda, 0xbddd, 0xbde0, 0xbde3, 0xbde7, 0xbdea, 0xbded, + 0xbdf0, 0xbdf4, 0xbdf7, 0xbdfa, 0xbdfe, 0xbe01, 0xbe04, 0xbe08, + 0xbe0b, 0xbe0e, 0xbe12, 0xbe15, 0xbe18, 0xbe1c, 0xbe1f, 0xbe22, + 0xbe26, 0xbe29, 0xbe2c, 0xbe30, 0xbe33, 0xbe37, 0xbe3a, 0xbe3e, + 0xbe41, 0xbe44, 0xbe48, 0xbe4b, 0xbe4f, 0xbe52, 0xbe56, 0xbe59, + 0xbe5d, 0xbe60, 0xbe64, 0xbe67, 0xbe6b, 0xbe6e, 0xbe72, 0xbe75, + 0xbe79, 0xbe7c, 0xbe80, 0xbe84, 0xbe87, 0xbe8b, 0xbe8e, 0xbe92, + 0xbe96, 0xbe99, 0xbe9d, 0xbea1, 0xbea4, 0xbea8, 0xbeac, 0xbeaf, + 0xbeb3, 0xbeb7, 0xbeba, 0xbebe, 0xbec2, 0xbec5, 0xbec9, 0xbecd, + 0xbed1, 0xbed4, 0xbed8, 0xbedc, 0xbee0, 0xbee3, 0xbee7, 0xbeeb, + 0xbeef, 0xbef3, 0xbef6, 0xbefa, 0xbefe, 0xbf02, 0xbf06, 0xbf0a, + 0xbf0e, 0xbf12, 0xbf15, 0xbf19, 0xbf1d, 0xbf21, 0xbf25, 0xbf29, + 0xbf2d, 0xbf31, 0xbf35, 0xbf39, 0xbf3d, 0xbf41, 0xbf45, 0xbf49, + 0xbf4d, 0xbf51, 0xbf55, 0xbf59, 0xbf5d, 0xbf61, 0xbf65, 0xbf69, + 0xbf6d, 0xbf71, 0xbf75, 0xbf79, 0xbf7e, 0xbf82, 0xbf86, 0xbf8a, + 0xbf8e, 0xbf92, 0xbf96, 0xbf9b, 0xbf9f, 0xbfa3, 0xbfa7, 0xbfab, + 0xbfb0, 0xbfb4, 0xbfb8, 0xbfbc, 0xbfc1, 0xbfc5, 0xbfc9, 0xbfcd, + 0xbfd2, 0xbfd6, 0xbfda, 0xbfdf, 0xbfe3, 0xbfe7, 0xbfec, 0xbff0, + 0xbff4, 0xbff9, 0xbffd, 0xc001, 0xc003, 0xc005, 0xc007, 0xc00a, + 0xc00c, 0xc00e, 0xc010, 0xc013, 0xc015, 0xc017, 0xc019, 0xc01c, + 0xc01e, 0xc020, 0xc022, 0xc025, 0xc027, 0xc029, 0xc02c, 0xc02e, + 0xc030, 0xc032, 0xc035, 0xc037, 0xc039, 0xc03c, 0xc03e, 0xc040, + 0xc043, 0xc045, 0xc047, 0xc04a, 0xc04c, 0xc04e, 0xc051, 0xc053, + 0xc056, 0xc058, 0xc05a, 0xc05d, 0xc05f, 0xc062, 0xc064, 0xc066, + 0xc069, 0xc06b, 0xc06e, 0xc070, 0xc073, 0xc075, 0xc077, 0xc07a, + 0xc07c, 0xc07f, 0xc081, 0xc084, 0xc086, 0xc089, 0xc08b, 0xc08e, + 0xc090, 0xc093, 0xc095, 0xc098, 0xc09a, 0xc09d, 0xc09f, 0xc0a2, + 0xc0a5, 0xc0a7, 0xc0aa, 0xc0ac, 0xc0af, 0xc0b1, 0xc0b4, 0xc0b7, + 0xc0b9, 0xc0bc, 0xc0be, 0xc0c1, 0xc0c4, 0xc0c6, 0xc0c9, 0xc0cc, + 0xc0ce, 0xc0d1, 0xc0d3, 0xc0d6, 0xc0d9, 0xc0db, 0xc0de, 0xc0e1, + 0xc0e3, 0xc0e6, 0xc0e9, 0xc0ec, 0xc0ee, 0xc0f1, 0xc0f4, 0xc0f6, + 0xc0f9, 0xc0fc, 0xc0ff, 0xc101, 0xc104, 0xc107, 0xc10a, 0xc10c, + 0xc10f, 0xc112, 0xc115, 0xc118, 0xc11a, 0xc11d, 0xc120, 0xc123, + 0xc126, 0xc129, 0xc12b, 0xc12e, 0xc131, 0xc134, 0xc137, 0xc13a, + 0xc13d, 0xc13f, 0xc142, 0xc145, 0xc148, 0xc14b, 0xc14e, 0xc151, + 0xc154, 0xc157, 0xc15a, 0xc15d, 0xc160, 0xc163, 0xc165, 0xc168, + 0xc16b, 0xc16e, 0xc171, 0xc174, 0xc177, 0xc17a, 0xc17d, 0xc180, + 0xc183, 0xc187, 0xc18a, 0xc18d, 0xc190, 0xc193, 0xc196, 0xc199, + 0xc19c, 0xc19f, 0xc1a2, 0xc1a5, 0xc1a8, 0xc1ab, 0xc1af, 0xc1b2, + 0xc1b5, 0xc1b8, 0xc1bb, 0xc1be, 0xc1c1, 0xc1c5, 0xc1c8, 0xc1cb, + 0xc1ce, 0xc1d1, 0xc1d5, 0xc1d8, 0xc1db, 0xc1de, 0xc1e1, 0xc1e5, + 0xc1e8, 0xc1eb, 0xc1ee, 0xc1f2, 0xc1f5, 0xc1f8, 0xc1fc, 0xc1ff, + 0xc202, 0xc205, 0xc209, 0xc20c, 0xc20f, 0xc213, 0xc216, 0xc219, + 0xc21d, 0xc220, 0xc224, 0xc227, 0xc22a, 0xc22e, 0xc231, 0xc235, + 0xc238, 0xc23b, 0xc23f, 0xc242, 0xc246, 0xc249, 0xc24d, 0xc250, + 0xc254, 0xc257, 0xc25a, 0xc25e, 0xc262, 0xc265, 0xc269, 0xc26c, + 0xc270, 0xc273, 0xc277, 0xc27a, 0xc27e, 0xc281, 0xc285, 0xc289, + 0xc28c, 0xc290, 0xc293, 0xc297, 0xc29b, 0xc29e, 0xc2a2, 0xc2a6, + 0xc2a9, 0xc2ad, 0xc2b1, 0xc2b4, 0xc2b8, 0xc2bc, 0xc2bf, 0xc2c3, + 0xc2c7, 0xc2cb, 0xc2ce, 0xc2d2, 0xc2d6, 0xc2da, 0xc2dd, 0xc2e1, + 0xc2e5, 0xc2e9, 0xc2ec, 0xc2f0, 0xc2f4, 0xc2f8, 0xc2fc, 0xc300, + 0xc303, 0xc307, 0xc30b, 0xc30f, 0xc313, 0xc317, 0xc31b, 0xc31f, + 0xc323, 0xc327, 0xc32a, 0xc32e, 0xc332, 0xc336, 0xc33a, 0xc33e, + 0xc342, 0xc346, 0xc34a, 0xc34e, 0xc352, 0xc356, 0xc35a, 0xc35e, + 0xc362, 0xc367, 0xc36b, 0xc36f, 0xc373, 0xc377, 0xc37b, 0xc37f, + 0xc383, 0xc387, 0xc38c, 0xc390, 0xc394, 0xc398, 0xc39c, 0xc3a0, + 0xc3a5, 0xc3a9, 0xc3ad, 0xc3b1, 0xc3b5, 0xc3ba, 0xc3be, 0xc3c2, + 0xc3c6, 0xc3cb, 0xc3cf, 0xc3d3, 0xc3d8, 0xc3dc, 0xc3e0, 0xc3e5, + 0xc3e9, 0xc3ed, 0xc3f2, 0xc3f6, 0xc3fa, 0xc3ff, 0xc402, 0xc404, + 0xc406, 0xc408, 0xc40a, 0xc40d, 0xc40f, 0xc411, 0xc413, 0xc416, + 0xc418, 0xc41a, 0xc41c, 0xc41f, 0xc421, 0xc423, 0xc426, 0xc428, + 0xc42a, 0xc42c, 0xc42f, 0xc431, 0xc433, 0xc436, 0xc438, 0xc43a, + 0xc43d, 0xc43f, 0xc441, 0xc444, 0xc446, 0xc448, 0xc44b, 0xc44d, + 0xc44f, 0xc452, 0xc454, 0xc456, 0xc459, 0xc45b, 0xc45e, 0xc460, + 0xc462, 0xc465, 0xc467, 0xc46a, 0xc46c, 0xc46f, 0xc471, 0xc473, + 0xc476, 0xc478, 0xc47b, 0xc47d, 0xc480, 0xc482, 0xc485, 0xc487, + 0xc48a, 0xc48c, 0xc48f, 0xc491, 0xc494, 0xc496, 0xc499, 0xc49b, + 0xc49e, 0xc4a0, 0xc4a3, 0xc4a6, 0xc4a8, 0xc4ab, 0xc4ad, 0xc4b0, + 0xc4b2, 0xc4b5, 0xc4b8, 0xc4ba, 0xc4bd, 0xc4bf, 0xc4c2, 0xc4c5, + 0xc4c7, 0xc4ca, 0xc4cc, 0xc4cf, 0xc4d2, 0xc4d4, 0xc4d7, 0xc4da, + 0xc4dc, 0xc4df, 0xc4e2, 0xc4e4, 0xc4e7, 0xc4ea, 0xc4ed, 0xc4ef, + 0xc4f2, 0xc4f5, 0xc4f7, 0xc4fa, 0xc4fd, 0xc500, 0xc502, 0xc505, + 0xc508, 0xc50b, 0xc50d, 0xc510, 0xc513, 0xc516, 0xc519, 0xc51b, + 0xc51e, 0xc521, 0xc524, 0xc527, 0xc52a, 0xc52c, 0xc52f, 0xc532, + 0xc535, 0xc538, 0xc53b, 0xc53e, 0xc540, 0xc543, 0xc546, 0xc549, + 0xc54c, 0xc54f, 0xc552, 0xc555, 0xc558, 0xc55b, 0xc55e, 0xc561, + 0xc564, 0xc567, 0xc56a, 0xc56d, 0xc570, 0xc573, 0xc576, 0xc579, + 0xc57c, 0xc57f, 0xc582, 0xc585, 0xc588, 0xc58b, 0xc58e, 0xc591, + 0xc594, 0xc597, 0xc59a, 0xc59d, 0xc5a0, 0xc5a3, 0xc5a6, 0xc5a9, + 0xc5ad, 0xc5b0, 0xc5b3, 0xc5b6, 0xc5b9, 0xc5bc, 0xc5bf, 0xc5c3, + 0xc5c6, 0xc5c9, 0xc5cc, 0xc5cf, 0xc5d3, 0xc5d6, 0xc5d9, 0xc5dc, + 0xc5df, 0xc5e3, 0xc5e6, 0xc5e9, 0xc5ec, 0xc5f0, 0xc5f3, 0xc5f6, + 0xc5f9, 0xc5fd, 0xc600, 0xc603, 0xc607, 0xc60a, 0xc60d, 0xc611, + 0xc614, 0xc617, 0xc61b, 0xc61e, 0xc621, 0xc625, 0xc628, 0xc62c, + 0xc62f, 0xc632, 0xc636, 0xc639, 0xc63d, 0xc640, 0xc643, 0xc647, + 0xc64a, 0xc64e, 0xc651, 0xc655, 0xc658, 0xc65c, 0xc65f, 0xc663, + 0xc666, 0xc66a, 0xc66d, 0xc671, 0xc674, 0xc678, 0xc67c, 0xc67f, + 0xc683, 0xc686, 0xc68a, 0xc68e, 0xc691, 0xc695, 0xc698, 0xc69c, + 0xc6a0, 0xc6a3, 0xc6a7, 0xc6ab, 0xc6ae, 0xc6b2, 0xc6b6, 0xc6b9, + 0xc6bd, 0xc6c1, 0xc6c4, 0xc6c8, 0xc6cc, 0xc6d0, 0xc6d3, 0xc6d7, + 0xc6db, 0xc6df, 0xc6e2, 0xc6e6, 0xc6ea, 0xc6ee, 0xc6f2, 0xc6f6, + 0xc6f9, 0xc6fd, 0xc701, 0xc705, 0xc709, 0xc70d, 0xc711, 0xc714, + 0xc718, 0xc71c, 0xc720, 0xc724, 0xc728, 0xc72c, 0xc730, 0xc734, + 0xc738, 0xc73c, 0xc740, 0xc744, 0xc748, 0xc74c, 0xc750, 0xc754, + 0xc758, 0xc75c, 0xc760, 0xc764, 0xc768, 0xc76c, 0xc770, 0xc774, + 0xc778, 0xc77d, 0xc781, 0xc785, 0xc789, 0xc78d, 0xc791, 0xc795, + 0xc79a, 0xc79e, 0xc7a2, 0xc7a6, 0xc7aa, 0xc7af, 0xc7b3, 0xc7b7, + 0xc7bb, 0xc7c0, 0xc7c4, 0xc7c8, 0xc7cc, 0xc7d1, 0xc7d5, 0xc7d9, + 0xc7de, 0xc7e2, 0xc7e6, 0xc7eb, 0xc7ef, 0xc7f3, 0xc7f8, 0xc7fc, + 0xc800, 0xc802, 0xc805, 0xc807, 0xc809, 0xc80b, 0xc80e, 0xc810, + 0xc812, 0xc814, 0xc816, 0xc819, 0xc81b, 0xc81d, 0xc820, 0xc822, + 0xc824, 0xc826, 0xc829, 0xc82b, 0xc82d, 0xc830, 0xc832, 0xc834, + 0xc836, 0xc839, 0xc83b, 0xc83d, 0xc840, 0xc842, 0xc844, 0xc847, + 0xc849, 0xc84c, 0xc84e, 0xc850, 0xc853, 0xc855, 0xc857, 0xc85a, + 0xc85c, 0xc85f, 0xc861, 0xc863, 0xc866, 0xc868, 0xc86b, 0xc86d, + 0xc870, 0xc872, 0xc874, 0xc877, 0xc879, 0xc87c, 0xc87e, 0xc881, + 0xc883, 0xc888, 0xc88d, 0xc892, 0xc897, 0xc89c, 0xc8a1, 0xc8a6, + 0xc8ac, 0xc8b1, 0xc8b6, 0xc8bb, 0xc8c0, 0xc8c6, 0xc8cb, 0xc8d0, + 0xc8d5, 0xc8db, 0xc8e0, 0xc8e5, 0xc8eb, 0xc8f0, 0xc8f6, 0xc8fb, + 0xc901, 0xc906, 0xc90c, 0xc911, 0xc917, 0xc91d, 0xc922, 0xc928, + 0xc92d, 0xc933, 0xc939, 0xc93f, 0xc944, 0xc94a, 0xc950, 0xc956, + 0xc95c, 0xc962, 0xc968, 0xc96e, 0xc974, 0xc97a, 0xc980, 0xc986, + 0xc98c, 0xc992, 0xc998, 0xc99e, 0xc9a4, 0xc9ab, 0xc9b1, 0xc9b7, + 0xc9bd, 0xc9c4, 0xc9ca, 0xc9d1, 0xc9d7, 0xc9dd, 0xc9e4, 0xc9ea, + 0xc9f1, 0xc9f7, 0xc9fe, 0xca05, 0xca0b, 0xca12, 0xca19, 0xca1f, + 0xca26, 0xca2d, 0xca34, 0xca3a, 0xca41, 0xca48, 0xca4f, 0xca56, + 0xca5d, 0xca64, 0xca6b, 0xca72, 0xca79, 0xca80, 0xca88, 0xca8f, + 0xca96, 0xca9d, 0xcaa5, 0xcaac, 0xcab3, 0xcabb, 0xcac2, 0xcaca, + 0xcad1, 0xcad9, 0xcae0, 0xcae8, 0xcaef, 0xcaf7, 0xcaff, 0xcb06, + 0xcb0e, 0xcb16, 0xcb1e, 0xcb25, 0xcb2d, 0xcb35, 0xcb3d, 0xcb45, + 0xcb4d, 0xcb55, 0xcb5d, 0xcb65, 0xcb6e, 0xcb76, 0xcb7e, 0xcb86, + 0xcb8f, 0xcb97, 0xcb9f, 0xcba8, 0xcbb0, 0xcbb9, 0xcbc1, 0xcbca, + 0xcbd2, 0xcbdb, 0xcbe4, 0xcbec, 0xcbf5, 0xcbfe, 0xcc03, 0xcc08, + 0xcc0c, 0xcc11, 0xcc15, 0xcc1a, 0xcc1e, 0xcc23, 0xcc27, 0xcc2c, + 0xcc30, 0xcc35, 0xcc3a, 0xcc3e, 0xcc43, 0xcc48, 0xcc4c, 0xcc51, + 0xcc56, 0xcc5b, 0xcc5f, 0xcc64, 0xcc69, 0xcc6e, 0xcc73, 0xcc78, + 0xcc7d, 0xcc82, 0xcc87, 0xcc8c, 0xcc91, 0xcc96, 0xcc9b, 0xcca0, + 0xcca5, 0xccaa, 0xccaf, 0xccb4, 0xccb9, 0xccbf, 0xccc4, 0xccc9, + 0xccce, 0xccd4, 0xccd9, 0xccde, 0xcce4, 0xcce9, 0xccef, 0xccf4, + 0xccf9, 0xccff, 0xcd04, 0xcd0a, 0xcd10, 0xcd15, 0xcd1b, 0xcd20, + 0xcd26, 0xcd2c, 0xcd31, 0xcd37, 0xcd3d, 0xcd43, 0xcd48, 0xcd4e, + 0xcd54, 0xcd5a, 0xcd60, 0xcd66, 0xcd6c, 0xcd72, 0xcd78, 0xcd7e, + 0xcd84, 0xcd8a, 0xcd90, 0xcd96, 0xcd9c, 0xcda2, 0xcda9, 0xcdaf, + 0xcdb5, 0xcdbb, 0xcdc2, 0xcdc8, 0xcdcf, 0xcdd5, 0xcddb, 0xcde2, + 0xcde8, 0xcdef, 0xcdf5, 0xcdfc, 0xce03, 0xce09, 0xce10, 0xce16, + 0xce1d, 0xce24, 0xce2b, 0xce31, 0xce38, 0xce3f, 0xce46, 0xce4d, + 0xce54, 0xce5b, 0xce62, 0xce69, 0xce70, 0xce77, 0xce7e, 0xce85, + 0xce8d, 0xce94, 0xce9b, 0xcea2, 0xceaa, 0xceb1, 0xceb8, 0xcec0, + 0xcec7, 0xcecf, 0xced6, 0xcede, 0xcee5, 0xceed, 0xcef5, 0xcefc, + 0xcf04, 0xcf0c, 0xcf13, 0xcf1b, 0xcf23, 0xcf2b, 0xcf33, 0xcf3b, + 0xcf43, 0xcf4b, 0xcf53, 0xcf5b, 0xcf63, 0xcf6b, 0xcf73, 0xcf7b, + 0xcf84, 0xcf8c, 0xcf94, 0xcf9d, 0xcfa5, 0xcfad, 0xcfb6, 0xcfbe, + 0xcfc7, 0xcfd0, 0xcfd8, 0xcfe1, 0xcfe9, 0xcff2, 0xcffb, 0xd002, + 0xd006, 0xd00b, 0xd00f, 0xd014, 0xd018, 0xd01d, 0xd021, 0xd026, + 0xd02a, 0xd02f, 0xd034, 0xd038, 0xd03d, 0xd041, 0xd046, 0xd04b, + 0xd050, 0xd054, 0xd059, 0xd05e, 0xd063, 0xd068, 0xd06c, 0xd071, + 0xd076, 0xd07b, 0xd080, 0xd085, 0xd08a, 0xd08f, 0xd094, 0xd099, + 0xd09e, 0xd0a3, 0xd0a8, 0xd0ae, 0xd0b3, 0xd0b8, 0xd0bd, 0xd0c2, + 0xd0c8, 0xd0cd, 0xd0d2, 0xd0d7, 0xd0dd, 0xd0e2, 0xd0e7, 0xd0ed, + 0xd0f2, 0xd0f8, 0xd0fd, 0xd103, 0xd108, 0xd10e, 0xd113, 0xd119, + 0xd11f, 0xd124, 0xd12a, 0xd130, 0xd135, 0xd13b, 0xd141, 0xd147, + 0xd14c, 0xd152, 0xd158, 0xd15e, 0xd164, 0xd16a, 0xd170, 0xd176, + 0xd17c, 0xd182, 0xd188, 0xd18e, 0xd194, 0xd19a, 0xd1a1, 0xd1a7, + 0xd1ad, 0xd1b3, 0xd1ba, 0xd1c0, 0xd1c6, 0xd1cd, 0xd1d3, 0xd1d9, + 0xd1e0, 0xd1e6, 0xd1ed, 0xd1f3, 0xd1fa, 0xd200, 0xd207, 0xd20e, + 0xd214, 0xd21b, 0xd222, 0xd229, 0xd22f, 0xd236, 0xd23d, 0xd244, + 0xd24b, 0xd252, 0xd259, 0xd260, 0xd267, 0xd26e, 0xd275, 0xd27c, + 0xd283, 0xd28a, 0xd292, 0xd299, 0xd2a0, 0xd2a7, 0xd2af, 0xd2b6, + 0xd2bd, 0xd2c5, 0xd2cc, 0xd2d4, 0xd2db, 0xd2e3, 0xd2ea, 0xd2f2, + 0xd2fa, 0xd301, 0xd309, 0xd311, 0xd319, 0xd321, 0xd328, 0xd330, + 0xd338, 0xd340, 0xd348, 0xd350, 0xd358, 0xd360, 0xd369, 0xd371, + 0xd379, 0xd381, 0xd389, 0xd392, 0xd39a, 0xd3a2, 0xd3ab, 0xd3b3, + 0xd3bc, 0xd3c4, 0xd3cd, 0xd3d5, 0xd3de, 0xd3e7, 0xd3ef, 0xd3f8, + 0xd401, 0xd405, 0xd409, 0xd40e, 0xd412, 0xd417, 0xd41b, 0xd420, + 0xd424, 0xd429, 0xd42d, 0xd432, 0xd437, 0xd43b, 0xd440, 0xd445, + 0xd449, 0xd44e, 0xd453, 0xd458, 0xd45c, 0xd461, 0xd466, 0xd46b, + 0xd470, 0xd475, 0xd47a, 0xd47f, 0xd483, 0xd488, 0xd48d, 0xd492, + 0xd498, 0xd49d, 0xd4a2, 0xd4a7, 0xd4ac, 0xd4b1, 0xd4b6, 0xd4bb, + 0xd4c1, 0xd4c6, 0xd4cb, 0xd4d0, 0xd4d6, 0xd4db, 0xd4e0, 0xd4e6, + 0xd4eb, 0xd4f1, 0xd4f6, 0xd4fc, 0xd501, 0xd507, 0xd50c, 0xd512, + 0xd517, 0xd51d, 0xd522, 0xd528, 0xd52e, 0xd534, 0xd539, 0xd53f, + 0xd545, 0xd54b, 0xd550, 0xd556, 0xd55c, 0xd562, 0xd568, 0xd56e, + 0xd574, 0xd57a, 0xd580, 0xd586, 0xd58c, 0xd592, 0xd598, 0xd59f, + 0xd5a5, 0xd5ab, 0xd5b1, 0xd5b8, 0xd5be, 0xd5c4, 0xd5cb, 0xd5d1, + 0xd5d7, 0xd5de, 0xd5e4, 0xd5eb, 0xd5f1, 0xd5f8, 0xd5fe, 0xd605, + 0xd60c, 0xd612, 0xd619, 0xd620, 0xd626, 0xd62d, 0xd634, 0xd63b, + 0xd642, 0xd649, 0xd650, 0xd657, 0xd65d, 0xd665, 0xd66c, 0xd673, + 0xd67a, 0xd681, 0xd688, 0xd68f, 0xd696, 0xd69e, 0xd6a5, 0xd6ac, + 0xd6b4, 0xd6bb, 0xd6c3, 0xd6ca, 0xd6d1, 0xd6d9, 0xd6e1, 0xd6e8, + 0xd6f0, 0xd6f7, 0xd6ff, 0xd707, 0xd70f, 0xd716, 0xd71e, 0xd726, + 0xd72e, 0xd736, 0xd73e, 0xd746, 0xd74e, 0xd756, 0xd75e, 0xd766, + 0xd76e, 0xd776, 0xd77f, 0xd787, 0xd78f, 0xd797, 0xd7a0, 0xd7a8, + 0xd7b1, 0xd7b9, 0xd7c2, 0xd7ca, 0xd7d3, 0xd7db, 0xd7e4, 0xd7ed, + 0xd7f5, 0xd7fe, 0xd804, 0xd808, 0xd80c, 0xd811, 0xd815, 0xd81a, + 0xd81e, 0xd823, 0xd827, 0xd82c, 0xd831, 0xd835, 0xd83a, 0xd83f, + 0xd843, 0xd848, 0xd84d, 0xd851, 0xd856, 0xd85b, 0xd860, 0xd865, + 0xd869, 0xd86e, 0xd873, 0xd878, 0xd87d, 0xd882, 0xd887, 0xd88c, + 0xd891, 0xd896, 0xd89b, 0xd8a0, 0xd8a5, 0xd8aa, 0xd8af, 0xd8b5, + 0xd8ba, 0xd8bf, 0xd8c4, 0xd8c9, 0xd8cf, 0xd8d4, 0xd8d9, 0xd8df, + 0xd8e4, 0xd8e9, 0xd8ef, 0xd8f4, 0xd8fa, 0xd8ff, 0xd905, 0xd90a, + 0xd910, 0xd915, 0xd91b, 0xd921, 0xd926, 0xd92c, 0xd932, 0xd937, + 0xd93d, 0xd943, 0xd949, 0xd94f, 0xd954, 0xd95a, 0xd960, 0xd966, + 0xd96c, 0xd972, 0xd978, 0xd97e, 0xd984, 0xd98a, 0xd990, 0xd996, + 0xd99d, 0xd9a3, 0xd9a9, 0xd9af, 0xd9b6, 0xd9bc, 0xd9c2, 0xd9c9, + 0xd9cf, 0xd9d5, 0xd9dc, 0xd9e2, 0xd9e9, 0xd9ef, 0xd9f6, 0xd9fc, + 0xda03, 0xda0a, 0xda10, 0xda17, 0xda1e, 0xda24, 0xda2b, 0xda32, + 0xda39, 0xda40, 0xda46, 0xda4d, 0xda54, 0xda5b, 0xda62, 0xda69, + 0xda70, 0xda78, 0xda7f, 0xda86, 0xda8d, 0xda94, 0xda9b, 0xdaa3, + 0xdaaa, 0xdab1, 0xdab9, 0xdac0, 0xdac8, 0xdacf, 0xdad7, 0xdade, + 0xdae6, 0xdaed, 0xdaf5, 0xdafd, 0xdb04, 0xdb0c, 0xdb14, 0xdb1c, + 0xdb23, 0xdb2b, 0xdb33, 0xdb3b, 0xdb43, 0xdb4b, 0xdb53, 0xdb5b, + 0xdb63, 0xdb6c, 0xdb74, 0xdb7c, 0xdb84, 0xdb8c, 0xdb95, 0xdb9d, + 0xdba6, 0xdbae, 0xdbb6, 0xdbbf, 0xdbc7, 0xdbd0, 0xdbd9, 0xdbe1, + 0xdbea, 0xdbf3, 0xdbfb, 0xdc02, 0xdc07, 0xdc0b, 0xdc0f, 0xdc14, + 0xdc18, 0xdc1d, 0xdc21, 0xdc26, 0xdc2b, 0xdc2f, 0xdc34, 0xdc38, + 0xdc3d, 0xdc42, 0xdc46, 0xdc4b, 0xdc50, 0xdc55, 0xdc59, 0xdc5e, + 0xdc63, 0xdc68, 0xdc6d, 0xdc72, 0xdc77, 0xdc7b, 0xdc80, 0xdc85, + 0xdc8a, 0xdc8f, 0xdc94, 0xdc99, 0xdc9e, 0xdca4, 0xdca9, 0xdcae, + 0xdcb3, 0xdcb8, 0xdcbd, 0xdcc3, 0xdcc8, 0xdccd, 0xdcd2, 0xdcd8, + 0xdcdd, 0xdce2, 0xdce8, 0xdced, 0xdcf3, 0xdcf8, 0xdcfe, 0xdd03, + 0xdd09, 0xdd0e, 0xdd14, 0xdd19, 0xdd1f, 0xdd25, 0xdd2a, 0xdd30, + 0xdd36, 0xdd3b, 0xdd41, 0xdd47, 0xdd4d, 0xdd53, 0xdd58, 0xdd5e, + 0xdd64, 0xdd6a, 0xdd70, 0xdd76, 0xdd7c, 0xdd82, 0xdd88, 0xdd8e, + 0xdd95, 0xdd9b, 0xdda1, 0xdda7, 0xddad, 0xddb4, 0xddba, 0xddc0, + 0xddc7, 0xddcd, 0xddd3, 0xddda, 0xdde0, 0xdde7, 0xdded, 0xddf4, + 0xddfa, 0xde01, 0xde07, 0xde0e, 0xde15, 0xde1b, 0xde22, 0xde29, + 0xde30, 0xde37, 0xde3d, 0xde44, 0xde4b, 0xde52, 0xde59, 0xde60, + 0xde67, 0xde6e, 0xde75, 0xde7c, 0xde84, 0xde8b, 0xde92, 0xde99, + 0xdea0, 0xdea8, 0xdeaf, 0xdeb6, 0xdebe, 0xdec5, 0xdecd, 0xded4, + 0xdedc, 0xdee3, 0xdeeb, 0xdef3, 0xdefa, 0xdf02, 0xdf0a, 0xdf11, + 0xdf19, 0xdf21, 0xdf29, 0xdf31, 0xdf39, 0xdf41, 0xdf49, 0xdf51, + 0xdf59, 0xdf61, 0xdf69, 0xdf71, 0xdf79, 0xdf82, 0xdf8a, 0xdf92, + 0xdf9b, 0xdfa3, 0xdfab, 0xdfb4, 0xdfbc, 0xdfc5, 0xdfcd, 0xdfd6, + 0xdfdf, 0xdfe7, 0xdff0, 0xdff9, 0xe001, 0xe005, 0xe00a, 0xe00e, + 0xe013, 0xe017, 0xe01c, 0xe020, 0xe025, 0xe029, 0xe02e, 0xe032, + 0xe037, 0xe03c, 0xe040, 0xe045, 0xe04a, 0xe04e, 0xe053, 0xe058, + 0xe05d, 0xe062, 0xe066, 0xe06b, 0xe070, 0xe075, 0xe07a, 0xe07f, + 0xe084, 0xe089, 0xe08e, 0xe093, 0xe098, 0xe09d, 0xe0a2, 0xe0a7, + 0xe0ac, 0xe0b1, 0xe0b7, 0xe0bc, 0xe0c1, 0xe0c6, 0xe0cb, 0xe0d1, + 0xe0d6, 0xe0db, 0xe0e1, 0xe0e6, 0xe0eb, 0xe0f1, 0xe0f6, 0xe0fc, + 0xe101, 0xe107, 0xe10c, 0xe112, 0xe118, 0xe11d, 0xe123, 0xe128, + 0xe12e, 0xe134, 0xe13a, 0xe13f, 0xe145, 0xe14b, 0xe151, 0xe157, + 0xe15d, 0xe162, 0xe168, 0xe16e, 0xe174, 0xe17a, 0xe180, 0xe186, + 0xe18d, 0xe193, 0xe199, 0xe19f, 0xe1a5, 0xe1ab, 0xe1b2, 0xe1b8, + 0xe1be, 0xe1cb, 0xe1d8, 0xe1e5, 0xe1f2, 0xe1ff, 0xe20c, 0xe219, + 0xe227, 0xe234, 0xe242, 0xe250, 0xe25e, 0xe26c, 0xe27a, 0xe288, + 0xe297, 0xe2a5, 0xe2b4, 0xe2c3, 0xe2d2, 0xe2e1, 0xe2f0, 0xe2ff, + 0xe30f, 0xe31f, 0xe32e, 0xe33e, 0xe34e, 0xe35e, 0xe36f, 0xe37f, + 0xe390, 0xe3a0, 0xe3b1, 0xe3c2, 0xe3d3, 0xe3e5, 0xe3f6, 0xe404, + 0xe40d, 0xe416, 0xe41f, 0xe428, 0xe431, 0xe43a, 0xe444, 0xe44d, + 0xe456, 0xe460, 0xe46a, 0xe473, 0xe47d, 0xe487, 0xe491, 0xe49b, + 0xe4a5, 0xe4b0, 0xe4ba, 0xe4c5, 0xe4cf, 0xe4da, 0xe4e4, 0xe4ef, + 0xe4fa, 0xe505, 0xe510, 0xe51b, 0xe527, 0xe532, 0xe53e, 0xe549, + 0xe555, 0xe561, 0xe56c, 0xe578, 0xe585, 0xe591, 0xe59d, 0xe5a9, + 0xe5b6, 0xe5c3, 0xe5cf, 0xe5dc, 0xe5e9, 0xe5f6, 0xe603, 0xe611, + 0xe61e, 0xe62b, 0xe639, 0xe647, 0xe655, 0xe663, 0xe671, 0xe67f, + 0xe68d, 0xe69c, 0xe6aa, 0xe6b9, 0xe6c8, 0xe6d7, 0xe6e6, 0xe6f5, + 0xe705, 0xe714, 0xe724, 0xe734, 0xe744, 0xe754, 0xe764, 0xe774, + 0xe785, 0xe795, 0xe7a6, 0xe7b7, 0xe7c8, 0xe7d9, 0xe7ea, 0xe7fc, + 0xe807, 0xe810, 0xe819, 0xe822, 0xe82b, 0xe834, 0xe83d, 0xe847, + 0xe850, 0xe85a, 0xe863, 0xe86d, 0xe877, 0xe881, 0xe88b, 0xe895, + 0xe89f, 0xe8a9, 0xe8b3, 0xe8be, 0xe8c8, 0xe8d3, 0xe8dd, 0xe8e8, + 0xe8f3, 0xe8fe, 0xe909, 0xe914, 0xe91f, 0xe92b, 0xe936, 0xe941, + 0xe94d, 0xe959, 0xe965, 0xe971, 0xe97d, 0xe989, 0xe995, 0xe9a1, + 0xe9ae, 0xe9ba, 0xe9c7, 0xe9d4, 0xe9e1, 0xe9ee, 0xe9fb, 0xea08, + 0xea15, 0xea23, 0xea30, 0xea3e, 0xea4c, 0xea5a, 0xea68, 0xea76, + 0xea84, 0xea92, 0xeaa1, 0xeab0, 0xeabe, 0xeacd, 0xeadc, 0xeaeb, + 0xeafb, 0xeb0a, 0xeb1a, 0xeb29, 0xeb39, 0xeb49, 0xeb59, 0xeb69, + 0xeb7a, 0xeb8a, 0xeb9b, 0xebac, 0xebbd, 0xebce, 0xebdf, 0xebf0, + 0xec01, 0xec0a, 0xec13, 0xec1c, 0xec25, 0xec2e, 0xec37, 0xec41, + 0xec4a, 0xec53, 0xec5d, 0xec67, 0xec70, 0xec7a, 0xec84, 0xec8e, + 0xec98, 0xeca2, 0xecac, 0xecb7, 0xecc1, 0xeccc, 0xecd6, 0xece1, + 0xecec, 0xecf7, 0xed02, 0xed0d, 0xed18, 0xed23, 0xed2e, 0xed3a, + 0xed45, 0xed51, 0xed5d, 0xed69, 0xed75, 0xed81, 0xed8d, 0xed99, + 0xeda5, 0xedb2, 0xedbf, 0xedcb, 0xedd8, 0xede5, 0xedf2, 0xedff, + 0xee0c, 0xee1a, 0xee27, 0xee35, 0xee43, 0xee50, 0xee5e, 0xee6c, + 0xee7b, 0xee89, 0xee97, 0xeea6, 0xeeb5, 0xeec3, 0xeed2, 0xeee1, + 0xeef1, 0xef00, 0xef0f, 0xef1f, 0xef2f, 0xef3f, 0xef4f, 0xef5f, + 0xef6f, 0xef7f, 0xef90, 0xefa1, 0xefb2, 0xefc3, 0xefd4, 0xefe5, + 0xeff6, 0xf004, 0xf00d, 0xf016, 0xf01f, 0xf028, 0xf031, 0xf03a, + 0xf044, 0xf04d, 0xf057, 0xf060, 0xf06a, 0xf074, 0xf07e, 0xf087, + 0xf091, 0xf09c, 0xf0a6, 0xf0b0, 0xf0ba, 0xf0c5, 0xf0cf, 0xf0da, + 0xf0e5, 0xf0f0, 0xf0fa, 0xf105, 0xf111, 0xf11c, 0xf127, 0xf132, + 0xf13e, 0xf149, 0xf155, 0xf161, 0xf16d, 0xf179, 0xf185, 0xf191, + 0xf19d, 0xf1aa, 0xf1b6, 0xf1c3, 0xf1d0, 0xf1dc, 0xf1e9, 0xf1f6, + 0xf204, 0xf211, 0xf21e, 0xf22c, 0xf239, 0xf247, 0xf255, 0xf263, + 0xf271, 0xf27f, 0xf28e, 0xf29c, 0xf2ab, 0xf2ba, 0xf2c8, 0xf2d7, + 0xf2e7, 0xf2f6, 0xf305, 0xf315, 0xf324, 0xf334, 0xf344, 0xf354, + 0xf364, 0xf375, 0xf385, 0xf396, 0xf3a6, 0xf3b7, 0xf3c8, 0xf3da, + 0xf3eb, 0xf3fc, 0xf407, 0xf410, 0xf419, 0xf422, 0xf42b, 0xf434, + 0xf43e, 0xf447, 0xf450, 0xf45a, 0xf464, 0xf46d, 0xf477, 0xf481, + 0xf48b, 0xf495, 0xf49f, 0xf4a9, 0xf4b4, 0xf4be, 0xf4c8, 0xf4d3, + 0xf4de, 0xf4e8, 0xf4f3, 0xf4fe, 0xf509, 0xf514, 0xf520, 0xf52b, + 0xf536, 0xf542, 0xf54d, 0xf559, 0xf565, 0xf571, 0xf57d, 0xf589, + 0xf595, 0xf5a2, 0xf5ae, 0xf5bb, 0xf5c7, 0xf5d4, 0xf5e1, 0xf5ee, + 0xf5fb, 0xf608, 0xf616, 0xf623, 0xf631, 0xf63e, 0xf64c, 0xf65a, + 0xf668, 0xf676, 0xf684, 0xf693, 0xf6a1, 0xf6b0, 0xf6bf, 0xf6ce, + 0xf6dd, 0xf6ec, 0xf6fb, 0xf70b, 0xf71a, 0xf72a, 0xf73a, 0xf74a, + 0xf75a, 0xf76a, 0xf77a, 0xf78b, 0xf79b, 0xf7ac, 0xf7bd, 0xf7ce, + 0xf7e0, 0xf7f1, 0xf801, 0xf80a, 0xf813, 0xf81c, 0xf825, 0xf82e, + 0xf838, 0xf841, 0xf84a, 0xf854, 0xf85d, 0xf867, 0xf871, 0xf87a, + 0xf884, 0xf88e, 0xf898, 0xf8a3, 0xf8ad, 0xf8b7, 0xf8c2, 0xf8cc, + 0xf8d7, 0xf8e1, 0xf8ec, 0xf8f7, 0xf902, 0xf90d, 0xf918, 0xf923, + 0xf92f, 0xf93a, 0xf946, 0xf951, 0xf95d, 0xf969, 0xf975, 0xf981, + 0xf98d, 0xf999, 0xf9a6, 0xf9b2, 0xf9bf, 0xf9cc, 0xf9d8, 0xf9e5, + 0xf9f2, 0xf9ff, 0xfa0d, 0xfa1a, 0xfa28, 0xfa35, 0xfa43, 0xfa51, + 0xfa5f, 0xfa6d, 0xfa7b, 0xfa89, 0xfa98, 0xfaa6, 0xfab5, 0xfac4, + 0xfad3, 0xfae2, 0xfaf1, 0xfb00, 0xfb10, 0xfb1f, 0xfb2f, 0xfb3f, + 0xfb4f, 0xfb5f, 0xfb70, 0xfb80, 0xfb91, 0xfba1, 0xfbb2, 0xfbc3, + 0xfbd4, 0xfbe6, 0xfbf7, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + + + +const unsigned short dwaCompressorToNonlinear[] = +{ + 0x0000, 0x1043, 0x11d7, 0x1305, 0x1400, 0x146d, 0x14cf, 0x1529, + 0x157b, 0x15c8, 0x1611, 0x1656, 0x1697, 0x16d6, 0x1712, 0x174b, + 0x1783, 0x17b9, 0x17ed, 0x1810, 0x1828, 0x1840, 0x1857, 0x186e, + 0x1884, 0x189a, 0x18af, 0x18c4, 0x18d8, 0x18ec, 0x18ff, 0x1913, + 0x1926, 0x1938, 0x194a, 0x195c, 0x196e, 0x197f, 0x1991, 0x19a2, + 0x19b2, 0x19c3, 0x19d3, 0x19e3, 0x19f3, 0x1a02, 0x1a12, 0x1a21, + 0x1a30, 0x1a3f, 0x1a4e, 0x1a5c, 0x1a6b, 0x1a79, 0x1a87, 0x1a95, + 0x1aa3, 0x1ab1, 0x1abe, 0x1acc, 0x1ad9, 0x1ae7, 0x1af4, 0x1b01, + 0x1b0d, 0x1b1a, 0x1b27, 0x1b33, 0x1b40, 0x1b4c, 0x1b59, 0x1b65, + 0x1b71, 0x1b7d, 0x1b89, 0x1b94, 0x1ba0, 0x1bac, 0x1bb7, 0x1bc3, + 0x1bce, 0x1bda, 0x1be5, 0x1bf0, 0x1bfb, 0x1c03, 0x1c09, 0x1c0e, + 0x1c13, 0x1c19, 0x1c1e, 0x1c23, 0x1c29, 0x1c2e, 0x1c33, 0x1c38, + 0x1c3d, 0x1c43, 0x1c48, 0x1c4d, 0x1c52, 0x1c57, 0x1c5c, 0x1c61, + 0x1c66, 0x1c6b, 0x1c6f, 0x1c74, 0x1c79, 0x1c7e, 0x1c83, 0x1c87, + 0x1c8c, 0x1c91, 0x1c96, 0x1c9a, 0x1c9f, 0x1ca4, 0x1ca8, 0x1cad, + 0x1cb1, 0x1cb6, 0x1cba, 0x1cbf, 0x1cc3, 0x1cc8, 0x1ccc, 0x1cd1, + 0x1cd5, 0x1cd9, 0x1cde, 0x1ce2, 0x1ce7, 0x1ceb, 0x1cef, 0x1cf3, + 0x1cf8, 0x1cfc, 0x1d00, 0x1d04, 0x1d09, 0x1d0d, 0x1d11, 0x1d15, + 0x1d19, 0x1d1d, 0x1d21, 0x1d25, 0x1d29, 0x1d2e, 0x1d32, 0x1d36, + 0x1d3a, 0x1d3e, 0x1d42, 0x1d46, 0x1d49, 0x1d4d, 0x1d51, 0x1d55, + 0x1d59, 0x1d5d, 0x1d61, 0x1d65, 0x1d69, 0x1d6c, 0x1d70, 0x1d74, + 0x1d78, 0x1d7c, 0x1d7f, 0x1d83, 0x1d87, 0x1d8b, 0x1d8e, 0x1d92, + 0x1d96, 0x1d99, 0x1d9d, 0x1da1, 0x1da4, 0x1da8, 0x1dac, 0x1daf, + 0x1db3, 0x1db7, 0x1dba, 0x1dbe, 0x1dc1, 0x1dc5, 0x1dc8, 0x1dcc, + 0x1dcf, 0x1dd3, 0x1dd6, 0x1dda, 0x1ddd, 0x1de1, 0x1de4, 0x1de8, + 0x1deb, 0x1def, 0x1df2, 0x1df6, 0x1df9, 0x1dfc, 0x1e00, 0x1e03, + 0x1e07, 0x1e0a, 0x1e0d, 0x1e11, 0x1e14, 0x1e17, 0x1e1b, 0x1e1e, + 0x1e21, 0x1e25, 0x1e28, 0x1e2b, 0x1e2e, 0x1e32, 0x1e35, 0x1e38, + 0x1e3b, 0x1e3f, 0x1e42, 0x1e45, 0x1e48, 0x1e4b, 0x1e4f, 0x1e52, + 0x1e55, 0x1e58, 0x1e5b, 0x1e5f, 0x1e62, 0x1e65, 0x1e68, 0x1e6b, + 0x1e6e, 0x1e71, 0x1e74, 0x1e78, 0x1e7b, 0x1e7e, 0x1e81, 0x1e84, + 0x1e87, 0x1e8a, 0x1e8d, 0x1e90, 0x1e93, 0x1e96, 0x1e99, 0x1e9c, + 0x1e9f, 0x1ea2, 0x1ea5, 0x1ea8, 0x1eab, 0x1eae, 0x1eb1, 0x1eb4, + 0x1eb7, 0x1eba, 0x1ebd, 0x1ec0, 0x1ec3, 0x1ec6, 0x1ec9, 0x1ecc, + 0x1ecf, 0x1ed2, 0x1ed4, 0x1ed7, 0x1eda, 0x1edd, 0x1ee0, 0x1ee3, + 0x1ee6, 0x1ee9, 0x1eeb, 0x1eee, 0x1ef1, 0x1ef4, 0x1ef7, 0x1efa, + 0x1efc, 0x1eff, 0x1f02, 0x1f05, 0x1f08, 0x1f0b, 0x1f0d, 0x1f10, + 0x1f13, 0x1f16, 0x1f18, 0x1f1b, 0x1f1e, 0x1f21, 0x1f23, 0x1f26, + 0x1f29, 0x1f2c, 0x1f2e, 0x1f31, 0x1f34, 0x1f37, 0x1f39, 0x1f3c, + 0x1f3f, 0x1f41, 0x1f44, 0x1f47, 0x1f4a, 0x1f4c, 0x1f4f, 0x1f52, + 0x1f54, 0x1f57, 0x1f5a, 0x1f5c, 0x1f5f, 0x1f61, 0x1f64, 0x1f67, + 0x1f69, 0x1f6c, 0x1f6f, 0x1f71, 0x1f74, 0x1f76, 0x1f79, 0x1f7c, + 0x1f7e, 0x1f81, 0x1f83, 0x1f86, 0x1f89, 0x1f8b, 0x1f8e, 0x1f90, + 0x1f93, 0x1f95, 0x1f98, 0x1f9b, 0x1f9d, 0x1fa0, 0x1fa2, 0x1fa5, + 0x1fa7, 0x1faa, 0x1fac, 0x1faf, 0x1fb1, 0x1fb4, 0x1fb6, 0x1fb9, + 0x1fbb, 0x1fbe, 0x1fc0, 0x1fc3, 0x1fc5, 0x1fc8, 0x1fca, 0x1fcd, + 0x1fcf, 0x1fd2, 0x1fd4, 0x1fd7, 0x1fd9, 0x1fdc, 0x1fde, 0x1fe0, + 0x1fe3, 0x1fe5, 0x1fe8, 0x1fea, 0x1fed, 0x1fef, 0x1ff1, 0x1ff4, + 0x1ff6, 0x1ff9, 0x1ffb, 0x1ffe, 0x2000, 0x2001, 0x2002, 0x2004, + 0x2005, 0x2006, 0x2007, 0x2008, 0x200a, 0x200b, 0x200c, 0x200d, + 0x200e, 0x200f, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, + 0x2018, 0x2019, 0x201a, 0x201b, 0x201c, 0x201d, 0x201f, 0x2020, + 0x2021, 0x2022, 0x2023, 0x2024, 0x2026, 0x2027, 0x2028, 0x2029, + 0x202a, 0x202b, 0x202c, 0x202e, 0x202f, 0x2030, 0x2031, 0x2032, + 0x2033, 0x2034, 0x2035, 0x2037, 0x2038, 0x2039, 0x203a, 0x203b, + 0x203c, 0x203d, 0x203e, 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, + 0x2045, 0x2046, 0x2047, 0x2048, 0x204a, 0x204b, 0x204c, 0x204d, + 0x204e, 0x204f, 0x2050, 0x2051, 0x2052, 0x2053, 0x2055, 0x2056, + 0x2057, 0x2058, 0x2059, 0x205a, 0x205b, 0x205c, 0x205d, 0x205e, + 0x205f, 0x2060, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, + 0x2068, 0x2069, 0x206a, 0x206b, 0x206c, 0x206d, 0x206e, 0x206f, + 0x2070, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, + 0x2079, 0x207a, 0x207b, 0x207c, 0x207d, 0x207e, 0x207f, 0x2080, + 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2089, + 0x208a, 0x208b, 0x208c, 0x208d, 0x208e, 0x208f, 0x2090, 0x2091, + 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, + 0x209a, 0x209b, 0x209c, 0x209d, 0x209e, 0x209f, 0x20a0, 0x20a1, + 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, 0x20a8, 0x20a9, + 0x20aa, 0x20ab, 0x20ac, 0x20ad, 0x20ae, 0x20af, 0x20b0, 0x20b1, + 0x20b2, 0x20b3, 0x20b4, 0x20b5, 0x20b6, 0x20b7, 0x20b8, 0x20b9, + 0x20ba, 0x20bb, 0x20bc, 0x20bd, 0x20be, 0x20bf, 0x20c0, 0x20c1, + 0x20c2, 0x20c3, 0x20c4, 0x20c5, 0x20c6, 0x20c7, 0x20c7, 0x20c8, + 0x20c9, 0x20ca, 0x20cb, 0x20cc, 0x20cd, 0x20ce, 0x20cf, 0x20d0, + 0x20d1, 0x20d2, 0x20d3, 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, + 0x20d9, 0x20da, 0x20db, 0x20dc, 0x20dd, 0x20de, 0x20de, 0x20df, + 0x20e0, 0x20e1, 0x20e2, 0x20e3, 0x20e4, 0x20e5, 0x20e6, 0x20e7, + 0x20e8, 0x20e9, 0x20ea, 0x20eb, 0x20ec, 0x20ed, 0x20ee, 0x20ee, + 0x20ef, 0x20f0, 0x20f1, 0x20f2, 0x20f3, 0x20f4, 0x20f5, 0x20f6, + 0x20f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, 0x20fb, 0x20fc, 0x20fd, + 0x20fe, 0x20ff, 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, + 0x2106, 0x2106, 0x2107, 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, + 0x210d, 0x210e, 0x210f, 0x2110, 0x2110, 0x2111, 0x2112, 0x2113, + 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x2119, 0x211a, + 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, 0x2120, 0x2121, 0x2121, + 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, + 0x2129, 0x212a, 0x212b, 0x212c, 0x212d, 0x212e, 0x212f, 0x2130, + 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, + 0x213e, 0x213f, 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2144, + 0x2145, 0x2146, 0x2147, 0x2148, 0x2149, 0x214a, 0x214b, 0x214b, + 0x214c, 0x214d, 0x214e, 0x214f, 0x2150, 0x2151, 0x2151, 0x2152, + 0x2153, 0x2154, 0x2155, 0x2156, 0x2156, 0x2157, 0x2158, 0x2159, + 0x215a, 0x215b, 0x215c, 0x215c, 0x215d, 0x215e, 0x215f, 0x2160, + 0x2161, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2166, + 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0x216b, 0x216c, 0x216d, + 0x216e, 0x216f, 0x2170, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, + 0x2175, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217a, 0x217a, + 0x217b, 0x217c, 0x217d, 0x217e, 0x217e, 0x217f, 0x2180, 0x2181, + 0x2182, 0x2183, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, 0x2187, + 0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218c, 0x218d, 0x218e, + 0x218f, 0x2190, 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2194, + 0x2195, 0x2196, 0x2197, 0x2198, 0x2198, 0x2199, 0x219a, 0x219b, + 0x219c, 0x219c, 0x219d, 0x219e, 0x219f, 0x21a0, 0x21a0, 0x21a1, + 0x21a2, 0x21a3, 0x21a4, 0x21a4, 0x21a5, 0x21a6, 0x21a7, 0x21a8, + 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ac, 0x21ad, 0x21ae, + 0x21af, 0x21af, 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b3, 0x21b4, + 0x21b5, 0x21b6, 0x21b7, 0x21b7, 0x21b8, 0x21b9, 0x21ba, 0x21ba, + 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21be, 0x21bf, 0x21c0, 0x21c1, + 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c5, 0x21c6, 0x21c7, + 0x21c8, 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cb, 0x21cc, 0x21cd, + 0x21ce, 0x21cf, 0x21cf, 0x21d0, 0x21d1, 0x21d2, 0x21d2, 0x21d3, + 0x21d4, 0x21d5, 0x21d5, 0x21d6, 0x21d7, 0x21d8, 0x21d8, 0x21d9, + 0x21da, 0x21db, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, 0x21df, + 0x21e0, 0x21e1, 0x21e2, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e5, + 0x21e6, 0x21e7, 0x21e8, 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21eb, + 0x21ec, 0x21ed, 0x21ee, 0x21ee, 0x21ef, 0x21f0, 0x21f1, 0x21f1, + 0x21f2, 0x21f3, 0x21f4, 0x21f4, 0x21f5, 0x21f6, 0x21f7, 0x21f7, + 0x21f8, 0x21f9, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fc, 0x21fd, + 0x21fe, 0x21ff, 0x21ff, 0x2200, 0x2201, 0x2202, 0x2202, 0x2203, + 0x2204, 0x2205, 0x2205, 0x2206, 0x2207, 0x2207, 0x2208, 0x2209, + 0x220a, 0x220a, 0x220b, 0x220c, 0x220d, 0x220d, 0x220e, 0x220f, + 0x2210, 0x2210, 0x2211, 0x2212, 0x2212, 0x2213, 0x2214, 0x2215, + 0x2215, 0x2216, 0x2217, 0x2218, 0x2218, 0x2219, 0x221a, 0x221a, + 0x221b, 0x221c, 0x221d, 0x221d, 0x221e, 0x221f, 0x221f, 0x2220, + 0x2221, 0x2222, 0x2222, 0x2223, 0x2224, 0x2224, 0x2225, 0x2226, + 0x2227, 0x2227, 0x2228, 0x2229, 0x222a, 0x222a, 0x222b, 0x222c, + 0x222c, 0x222d, 0x222e, 0x222e, 0x222f, 0x2230, 0x2231, 0x2231, + 0x2232, 0x2233, 0x2233, 0x2234, 0x2235, 0x2236, 0x2236, 0x2237, + 0x2238, 0x2238, 0x2239, 0x223a, 0x223b, 0x223b, 0x223c, 0x223d, + 0x223d, 0x223e, 0x223f, 0x223f, 0x2240, 0x2241, 0x2242, 0x2242, + 0x2243, 0x2244, 0x2244, 0x2245, 0x2246, 0x2246, 0x2247, 0x2248, + 0x2249, 0x2249, 0x224a, 0x224b, 0x224b, 0x224c, 0x224d, 0x224d, + 0x224e, 0x224f, 0x2250, 0x2250, 0x2251, 0x2252, 0x2252, 0x2253, + 0x2254, 0x2254, 0x2255, 0x2256, 0x2256, 0x2257, 0x2258, 0x2259, + 0x2259, 0x225a, 0x225b, 0x225b, 0x225c, 0x225d, 0x225d, 0x225e, + 0x225f, 0x225f, 0x2260, 0x2261, 0x2261, 0x2262, 0x2263, 0x2264, + 0x2264, 0x2265, 0x2266, 0x2266, 0x2267, 0x2268, 0x2268, 0x2269, + 0x226a, 0x226a, 0x226b, 0x226c, 0x226c, 0x226d, 0x226e, 0x226e, + 0x226f, 0x2270, 0x2270, 0x2271, 0x2272, 0x2272, 0x2273, 0x2274, + 0x2274, 0x2275, 0x2276, 0x2277, 0x2277, 0x2278, 0x2279, 0x2279, + 0x227a, 0x227b, 0x227b, 0x227c, 0x227d, 0x227d, 0x227e, 0x227f, + 0x227f, 0x2280, 0x2281, 0x2281, 0x2282, 0x2283, 0x2283, 0x2284, + 0x2285, 0x2285, 0x2286, 0x2287, 0x2287, 0x2288, 0x2289, 0x2289, + 0x228a, 0x228b, 0x228b, 0x228c, 0x228d, 0x228d, 0x228e, 0x228f, + 0x228f, 0x2290, 0x2291, 0x2291, 0x2292, 0x2293, 0x2293, 0x2294, + 0x2295, 0x2295, 0x2296, 0x2297, 0x2297, 0x2298, 0x2298, 0x2299, + 0x229a, 0x229a, 0x229b, 0x229c, 0x229c, 0x229d, 0x229e, 0x229e, + 0x229f, 0x22a0, 0x22a0, 0x22a1, 0x22a2, 0x22a2, 0x22a3, 0x22a4, + 0x22a4, 0x22a5, 0x22a6, 0x22a6, 0x22a7, 0x22a8, 0x22a8, 0x22a9, + 0x22aa, 0x22aa, 0x22ab, 0x22ab, 0x22ac, 0x22ad, 0x22ad, 0x22ae, + 0x22af, 0x22af, 0x22b0, 0x22b1, 0x22b1, 0x22b2, 0x22b3, 0x22b3, + 0x22b4, 0x22b5, 0x22b5, 0x22b6, 0x22b6, 0x22b7, 0x22b8, 0x22b8, + 0x22b9, 0x22ba, 0x22ba, 0x22bb, 0x22bc, 0x22bc, 0x22bd, 0x22be, + 0x22be, 0x22bf, 0x22bf, 0x22c0, 0x22c1, 0x22c1, 0x22c2, 0x22c3, + 0x22c3, 0x22c4, 0x22c5, 0x22c5, 0x22c6, 0x22c6, 0x22c7, 0x22c8, + 0x22c8, 0x22c9, 0x22ca, 0x22ca, 0x22cb, 0x22cc, 0x22cc, 0x22cd, + 0x22cd, 0x22ce, 0x22cf, 0x22cf, 0x22d0, 0x22d1, 0x22d1, 0x22d2, + 0x22d3, 0x22d3, 0x22d4, 0x22d4, 0x22d5, 0x22d6, 0x22d6, 0x22d7, + 0x22d8, 0x22d8, 0x22d9, 0x22d9, 0x22da, 0x22db, 0x22db, 0x22dc, + 0x22dd, 0x22dd, 0x22de, 0x22de, 0x22df, 0x22e0, 0x22e0, 0x22e1, + 0x22e2, 0x22e2, 0x22e3, 0x22e4, 0x22e4, 0x22e5, 0x22e5, 0x22e6, + 0x22e7, 0x22e7, 0x22e8, 0x22e8, 0x22e9, 0x22ea, 0x22ea, 0x22eb, + 0x22ec, 0x22ec, 0x22ed, 0x22ed, 0x22ee, 0x22ef, 0x22ef, 0x22f0, + 0x22f1, 0x22f1, 0x22f2, 0x22f2, 0x22f3, 0x22f4, 0x22f4, 0x22f5, + 0x22f6, 0x22f6, 0x22f7, 0x22f7, 0x22f8, 0x22f9, 0x22f9, 0x22fa, + 0x22fa, 0x22fb, 0x22fc, 0x22fc, 0x22fd, 0x22fe, 0x22fe, 0x22ff, + 0x22ff, 0x2300, 0x2301, 0x2301, 0x2302, 0x2302, 0x2303, 0x2304, + 0x2304, 0x2305, 0x2305, 0x2306, 0x2307, 0x2307, 0x2308, 0x2309, + 0x2309, 0x230a, 0x230a, 0x230b, 0x230c, 0x230c, 0x230d, 0x230d, + 0x230e, 0x230f, 0x230f, 0x2310, 0x2310, 0x2311, 0x2312, 0x2312, + 0x2313, 0x2313, 0x2314, 0x2315, 0x2315, 0x2316, 0x2316, 0x2317, + 0x2318, 0x2318, 0x2319, 0x2319, 0x231a, 0x231b, 0x231b, 0x231c, + 0x231d, 0x231d, 0x231e, 0x231e, 0x231f, 0x2320, 0x2320, 0x2321, + 0x2321, 0x2322, 0x2323, 0x2323, 0x2324, 0x2324, 0x2325, 0x2325, + 0x2326, 0x2327, 0x2327, 0x2328, 0x2328, 0x2329, 0x232a, 0x232a, + 0x232b, 0x232b, 0x232c, 0x232d, 0x232d, 0x232e, 0x232e, 0x232f, + 0x2330, 0x2330, 0x2331, 0x2331, 0x2332, 0x2333, 0x2333, 0x2334, + 0x2334, 0x2335, 0x2336, 0x2336, 0x2337, 0x2337, 0x2338, 0x2339, + 0x2339, 0x233a, 0x233a, 0x233b, 0x233b, 0x233c, 0x233d, 0x233d, + 0x233e, 0x233e, 0x233f, 0x2340, 0x2340, 0x2341, 0x2341, 0x2342, + 0x2343, 0x2343, 0x2344, 0x2344, 0x2345, 0x2345, 0x2346, 0x2347, + 0x2347, 0x2348, 0x2348, 0x2349, 0x234a, 0x234a, 0x234b, 0x234b, + 0x234c, 0x234c, 0x234d, 0x234e, 0x234e, 0x234f, 0x234f, 0x2350, + 0x2351, 0x2351, 0x2352, 0x2352, 0x2353, 0x2353, 0x2354, 0x2355, + 0x2355, 0x2356, 0x2356, 0x2357, 0x2357, 0x2358, 0x2359, 0x2359, + 0x235a, 0x235a, 0x235b, 0x235c, 0x235c, 0x235d, 0x235d, 0x235e, + 0x235e, 0x235f, 0x2360, 0x2360, 0x2361, 0x2361, 0x2362, 0x2362, + 0x2363, 0x2364, 0x2364, 0x2365, 0x2365, 0x2366, 0x2366, 0x2367, + 0x2368, 0x2368, 0x2369, 0x2369, 0x236a, 0x236a, 0x236b, 0x236c, + 0x236c, 0x236d, 0x236d, 0x236e, 0x236e, 0x236f, 0x2370, 0x2370, + 0x2371, 0x2371, 0x2372, 0x2372, 0x2373, 0x2374, 0x2374, 0x2375, + 0x2375, 0x2376, 0x2376, 0x2377, 0x2378, 0x2378, 0x2379, 0x2379, + 0x237a, 0x237a, 0x237b, 0x237c, 0x237c, 0x237d, 0x237d, 0x237e, + 0x237e, 0x237f, 0x237f, 0x2380, 0x2381, 0x2381, 0x2382, 0x2382, + 0x2383, 0x2383, 0x2384, 0x2385, 0x2385, 0x2386, 0x2386, 0x2387, + 0x2387, 0x2388, 0x2388, 0x2389, 0x238a, 0x238a, 0x238b, 0x238b, + 0x238c, 0x238c, 0x238d, 0x238e, 0x238e, 0x238f, 0x238f, 0x2390, + 0x2390, 0x2391, 0x2391, 0x2392, 0x2393, 0x2393, 0x2394, 0x2394, + 0x2395, 0x2395, 0x2396, 0x2396, 0x2397, 0x2398, 0x2398, 0x2399, + 0x2399, 0x239a, 0x239a, 0x239b, 0x239b, 0x239c, 0x239d, 0x239d, + 0x239e, 0x239e, 0x239f, 0x239f, 0x23a0, 0x23a0, 0x23a1, 0x23a2, + 0x23a2, 0x23a3, 0x23a3, 0x23a4, 0x23a4, 0x23a5, 0x23a5, 0x23a6, + 0x23a7, 0x23a7, 0x23a8, 0x23a8, 0x23a9, 0x23a9, 0x23aa, 0x23aa, + 0x23ab, 0x23ab, 0x23ac, 0x23ad, 0x23ad, 0x23ae, 0x23ae, 0x23af, + 0x23af, 0x23b0, 0x23b0, 0x23b1, 0x23b2, 0x23b2, 0x23b3, 0x23b3, + 0x23b4, 0x23b4, 0x23b5, 0x23b5, 0x23b6, 0x23b6, 0x23b7, 0x23b8, + 0x23b8, 0x23b9, 0x23b9, 0x23ba, 0x23ba, 0x23bb, 0x23bb, 0x23bc, + 0x23bc, 0x23bd, 0x23bd, 0x23be, 0x23bf, 0x23bf, 0x23c0, 0x23c0, + 0x23c1, 0x23c1, 0x23c2, 0x23c2, 0x23c3, 0x23c3, 0x23c4, 0x23c5, + 0x23c5, 0x23c6, 0x23c6, 0x23c7, 0x23c7, 0x23c8, 0x23c8, 0x23c9, + 0x23c9, 0x23ca, 0x23ca, 0x23cb, 0x23cc, 0x23cc, 0x23cd, 0x23cd, + 0x23ce, 0x23ce, 0x23cf, 0x23cf, 0x23d0, 0x23d0, 0x23d1, 0x23d1, + 0x23d2, 0x23d3, 0x23d3, 0x23d4, 0x23d4, 0x23d5, 0x23d5, 0x23d6, + 0x23d6, 0x23d7, 0x23d7, 0x23d8, 0x23d8, 0x23d9, 0x23da, 0x23da, + 0x23db, 0x23db, 0x23dc, 0x23dc, 0x23dd, 0x23dd, 0x23de, 0x23de, + 0x23df, 0x23df, 0x23e0, 0x23e0, 0x23e1, 0x23e2, 0x23e2, 0x23e3, + 0x23e3, 0x23e4, 0x23e4, 0x23e5, 0x23e5, 0x23e6, 0x23e6, 0x23e7, + 0x23e7, 0x23e8, 0x23e8, 0x23e9, 0x23e9, 0x23ea, 0x23eb, 0x23eb, + 0x23ec, 0x23ec, 0x23ed, 0x23ed, 0x23ee, 0x23ee, 0x23ef, 0x23ef, + 0x23f0, 0x23f0, 0x23f1, 0x23f1, 0x23f2, 0x23f2, 0x23f3, 0x23f3, + 0x23f4, 0x23f5, 0x23f5, 0x23f6, 0x23f6, 0x23f7, 0x23f7, 0x23f8, + 0x23f8, 0x23f9, 0x23f9, 0x23fa, 0x23fa, 0x23fb, 0x23fb, 0x23fc, + 0x23fc, 0x23fd, 0x23fd, 0x23fe, 0x23fe, 0x23ff, 0x2400, 0x2400, + 0x2400, 0x2401, 0x2401, 0x2401, 0x2401, 0x2402, 0x2402, 0x2402, + 0x2402, 0x2403, 0x2403, 0x2403, 0x2403, 0x2404, 0x2404, 0x2404, + 0x2404, 0x2405, 0x2405, 0x2405, 0x2405, 0x2406, 0x2406, 0x2406, + 0x2407, 0x2407, 0x2407, 0x2407, 0x2408, 0x2408, 0x2408, 0x2408, + 0x2409, 0x2409, 0x2409, 0x2409, 0x240a, 0x240a, 0x240a, 0x240a, + 0x240b, 0x240b, 0x240b, 0x240b, 0x240c, 0x240c, 0x240c, 0x240c, + 0x240d, 0x240d, 0x240d, 0x240d, 0x240e, 0x240e, 0x240e, 0x240f, + 0x240f, 0x240f, 0x240f, 0x2410, 0x2410, 0x2410, 0x2410, 0x2411, + 0x2411, 0x2411, 0x2411, 0x2412, 0x2412, 0x2412, 0x2412, 0x2413, + 0x2413, 0x2413, 0x2413, 0x2414, 0x2414, 0x2414, 0x2414, 0x2415, + 0x2415, 0x2415, 0x2415, 0x2416, 0x2416, 0x2416, 0x2416, 0x2417, + 0x2417, 0x2417, 0x2417, 0x2418, 0x2418, 0x2418, 0x2418, 0x2419, + 0x2419, 0x2419, 0x2419, 0x241a, 0x241a, 0x241a, 0x241b, 0x241b, + 0x241b, 0x241b, 0x241c, 0x241c, 0x241c, 0x241c, 0x241d, 0x241d, + 0x241d, 0x241d, 0x241e, 0x241e, 0x241e, 0x241e, 0x241f, 0x241f, + 0x241f, 0x241f, 0x2420, 0x2420, 0x2420, 0x2420, 0x2421, 0x2421, + 0x2421, 0x2421, 0x2422, 0x2422, 0x2422, 0x2422, 0x2423, 0x2423, + 0x2423, 0x2423, 0x2424, 0x2424, 0x2424, 0x2424, 0x2425, 0x2425, + 0x2425, 0x2425, 0x2426, 0x2426, 0x2426, 0x2426, 0x2427, 0x2427, + 0x2427, 0x2427, 0x2428, 0x2428, 0x2428, 0x2428, 0x2429, 0x2429, + 0x2429, 0x2429, 0x242a, 0x242a, 0x242a, 0x242a, 0x242b, 0x242b, + 0x242b, 0x242b, 0x242c, 0x242c, 0x242c, 0x242c, 0x242d, 0x242d, + 0x242d, 0x242d, 0x242e, 0x242e, 0x242e, 0x242e, 0x242f, 0x242f, + 0x242f, 0x242f, 0x2430, 0x2430, 0x2430, 0x2430, 0x2431, 0x2431, + 0x2431, 0x2431, 0x2431, 0x2432, 0x2432, 0x2432, 0x2432, 0x2433, + 0x2433, 0x2433, 0x2433, 0x2434, 0x2434, 0x2434, 0x2434, 0x2435, + 0x2435, 0x2435, 0x2435, 0x2436, 0x2436, 0x2436, 0x2436, 0x2437, + 0x2437, 0x2437, 0x2437, 0x2438, 0x2438, 0x2438, 0x2438, 0x2439, + 0x2439, 0x2439, 0x2439, 0x243a, 0x243a, 0x243a, 0x243a, 0x243b, + 0x243b, 0x243b, 0x243b, 0x243c, 0x243c, 0x243c, 0x243c, 0x243d, + 0x243d, 0x243d, 0x243d, 0x243e, 0x243e, 0x243e, 0x243e, 0x243e, + 0x243f, 0x243f, 0x243f, 0x243f, 0x2440, 0x2440, 0x2440, 0x2440, + 0x2441, 0x2441, 0x2441, 0x2441, 0x2442, 0x2442, 0x2442, 0x2442, + 0x2443, 0x2443, 0x2444, 0x2444, 0x2445, 0x2445, 0x2446, 0x2446, + 0x2446, 0x2447, 0x2447, 0x2448, 0x2448, 0x2449, 0x2449, 0x244a, + 0x244a, 0x244b, 0x244b, 0x244c, 0x244c, 0x244d, 0x244d, 0x244e, + 0x244e, 0x244f, 0x244f, 0x2450, 0x2450, 0x2451, 0x2451, 0x2451, + 0x2452, 0x2452, 0x2453, 0x2453, 0x2454, 0x2454, 0x2455, 0x2455, + 0x2456, 0x2456, 0x2457, 0x2457, 0x2458, 0x2458, 0x2459, 0x2459, + 0x245a, 0x245a, 0x245a, 0x245b, 0x245b, 0x245c, 0x245c, 0x245d, + 0x245d, 0x245e, 0x245e, 0x245f, 0x245f, 0x2460, 0x2460, 0x2461, + 0x2461, 0x2462, 0x2462, 0x2462, 0x2463, 0x2463, 0x2464, 0x2464, + 0x2465, 0x2465, 0x2466, 0x2466, 0x2467, 0x2467, 0x2468, 0x2468, + 0x2469, 0x2469, 0x2469, 0x246a, 0x246a, 0x246b, 0x246b, 0x246c, + 0x246c, 0x246d, 0x246d, 0x246e, 0x246e, 0x246f, 0x246f, 0x246f, + 0x2470, 0x2470, 0x2471, 0x2471, 0x2472, 0x2472, 0x2473, 0x2473, + 0x2474, 0x2474, 0x2475, 0x2475, 0x2475, 0x2476, 0x2476, 0x2477, + 0x2477, 0x2478, 0x2478, 0x2479, 0x2479, 0x247a, 0x247a, 0x247a, + 0x247b, 0x247b, 0x247c, 0x247c, 0x247d, 0x247d, 0x247e, 0x247e, + 0x247f, 0x247f, 0x247f, 0x2480, 0x2480, 0x2481, 0x2481, 0x2482, + 0x2482, 0x2483, 0x2483, 0x2484, 0x2484, 0x2484, 0x2485, 0x2485, + 0x2486, 0x2486, 0x2487, 0x2487, 0x2488, 0x2488, 0x2489, 0x2489, + 0x2489, 0x248a, 0x248a, 0x248b, 0x248b, 0x248c, 0x248c, 0x248d, + 0x248d, 0x248d, 0x248e, 0x248e, 0x248f, 0x248f, 0x2490, 0x2490, + 0x2491, 0x2491, 0x2491, 0x2492, 0x2492, 0x2493, 0x2493, 0x2494, + 0x2494, 0x2495, 0x2495, 0x2495, 0x2496, 0x2496, 0x2497, 0x2497, + 0x2498, 0x2498, 0x2499, 0x2499, 0x2499, 0x249a, 0x249a, 0x249b, + 0x249b, 0x249c, 0x249c, 0x249d, 0x249d, 0x249d, 0x249e, 0x249e, + 0x249f, 0x249f, 0x24a0, 0x24a0, 0x24a0, 0x24a1, 0x24a1, 0x24a2, + 0x24a2, 0x24a3, 0x24a3, 0x24a4, 0x24a4, 0x24a4, 0x24a5, 0x24a5, + 0x24a6, 0x24a6, 0x24a7, 0x24a7, 0x24a7, 0x24a8, 0x24a8, 0x24a9, + 0x24a9, 0x24aa, 0x24aa, 0x24ab, 0x24ab, 0x24ab, 0x24ac, 0x24ac, + 0x24ad, 0x24ad, 0x24ae, 0x24ae, 0x24ae, 0x24af, 0x24af, 0x24b0, + 0x24b0, 0x24b1, 0x24b1, 0x24b1, 0x24b2, 0x24b2, 0x24b3, 0x24b3, + 0x24b4, 0x24b4, 0x24b4, 0x24b5, 0x24b5, 0x24b6, 0x24b6, 0x24b7, + 0x24b7, 0x24b7, 0x24b8, 0x24b8, 0x24b9, 0x24b9, 0x24ba, 0x24ba, + 0x24ba, 0x24bb, 0x24bb, 0x24bc, 0x24bc, 0x24bd, 0x24bd, 0x24bd, + 0x24be, 0x24be, 0x24bf, 0x24bf, 0x24c0, 0x24c0, 0x24c0, 0x24c1, + 0x24c1, 0x24c2, 0x24c2, 0x24c3, 0x24c3, 0x24c3, 0x24c4, 0x24c4, + 0x24c5, 0x24c5, 0x24c5, 0x24c6, 0x24c6, 0x24c7, 0x24c7, 0x24c8, + 0x24c8, 0x24c8, 0x24c9, 0x24c9, 0x24ca, 0x24ca, 0x24cb, 0x24cb, + 0x24cb, 0x24cc, 0x24cc, 0x24cd, 0x24cd, 0x24cd, 0x24ce, 0x24ce, + 0x24cf, 0x24cf, 0x24d0, 0x24d0, 0x24d0, 0x24d1, 0x24d1, 0x24d2, + 0x24d2, 0x24d3, 0x24d3, 0x24d3, 0x24d4, 0x24d4, 0x24d5, 0x24d5, + 0x24d5, 0x24d6, 0x24d6, 0x24d7, 0x24d7, 0x24d8, 0x24d8, 0x24d8, + 0x24d9, 0x24d9, 0x24da, 0x24da, 0x24da, 0x24db, 0x24db, 0x24dc, + 0x24dc, 0x24dc, 0x24dd, 0x24dd, 0x24de, 0x24de, 0x24df, 0x24df, + 0x24df, 0x24e0, 0x24e0, 0x24e1, 0x24e1, 0x24e1, 0x24e2, 0x24e2, + 0x24e3, 0x24e3, 0x24e3, 0x24e4, 0x24e4, 0x24e5, 0x24e5, 0x24e6, + 0x24e6, 0x24e6, 0x24e7, 0x24e7, 0x24e8, 0x24e8, 0x24e8, 0x24e9, + 0x24e9, 0x24ea, 0x24ea, 0x24ea, 0x24eb, 0x24eb, 0x24ec, 0x24ec, + 0x24ec, 0x24ed, 0x24ed, 0x24ee, 0x24ee, 0x24ee, 0x24ef, 0x24ef, + 0x24f0, 0x24f0, 0x24f1, 0x24f1, 0x24f1, 0x24f2, 0x24f2, 0x24f3, + 0x24f3, 0x24f3, 0x24f4, 0x24f4, 0x24f5, 0x24f5, 0x24f5, 0x24f6, + 0x24f6, 0x24f7, 0x24f7, 0x24f7, 0x24f8, 0x24f8, 0x24f9, 0x24f9, + 0x24f9, 0x24fa, 0x24fa, 0x24fb, 0x24fb, 0x24fb, 0x24fc, 0x24fc, + 0x24fd, 0x24fd, 0x24fd, 0x24fe, 0x24fe, 0x24ff, 0x24ff, 0x24ff, + 0x2500, 0x2500, 0x2501, 0x2501, 0x2501, 0x2502, 0x2502, 0x2503, + 0x2503, 0x2503, 0x2504, 0x2504, 0x2505, 0x2505, 0x2505, 0x2506, + 0x2506, 0x2507, 0x2507, 0x2507, 0x2508, 0x2508, 0x2509, 0x2509, + 0x2509, 0x250a, 0x250a, 0x250b, 0x250b, 0x250b, 0x250c, 0x250c, + 0x250d, 0x250d, 0x250d, 0x250e, 0x250e, 0x250f, 0x250f, 0x250f, + 0x2510, 0x2510, 0x2510, 0x2511, 0x2511, 0x2512, 0x2512, 0x2512, + 0x2513, 0x2513, 0x2514, 0x2514, 0x2514, 0x2515, 0x2515, 0x2516, + 0x2516, 0x2516, 0x2517, 0x2517, 0x2518, 0x2518, 0x2518, 0x2519, + 0x2519, 0x2519, 0x251a, 0x251a, 0x251b, 0x251b, 0x251b, 0x251c, + 0x251c, 0x251d, 0x251d, 0x251d, 0x251e, 0x251e, 0x251f, 0x251f, + 0x251f, 0x2520, 0x2520, 0x2520, 0x2521, 0x2521, 0x2522, 0x2522, + 0x2522, 0x2523, 0x2523, 0x2524, 0x2524, 0x2524, 0x2525, 0x2525, + 0x2526, 0x2526, 0x2526, 0x2527, 0x2527, 0x2527, 0x2528, 0x2528, + 0x2529, 0x2529, 0x2529, 0x252a, 0x252a, 0x252b, 0x252b, 0x252b, + 0x252c, 0x252c, 0x252c, 0x252d, 0x252d, 0x252e, 0x252e, 0x252e, + 0x252f, 0x252f, 0x252f, 0x2530, 0x2530, 0x2531, 0x2531, 0x2531, + 0x2532, 0x2532, 0x2533, 0x2533, 0x2533, 0x2534, 0x2534, 0x2534, + 0x2535, 0x2535, 0x2536, 0x2536, 0x2536, 0x2537, 0x2537, 0x2537, + 0x2538, 0x2538, 0x2539, 0x2539, 0x2539, 0x253a, 0x253a, 0x253b, + 0x253b, 0x253b, 0x253c, 0x253c, 0x253c, 0x253d, 0x253d, 0x253e, + 0x253e, 0x253e, 0x253f, 0x253f, 0x253f, 0x2540, 0x2540, 0x2541, + 0x2541, 0x2541, 0x2542, 0x2542, 0x2542, 0x2543, 0x2543, 0x2544, + 0x2544, 0x2544, 0x2545, 0x2545, 0x2545, 0x2546, 0x2546, 0x2547, + 0x2547, 0x2547, 0x2548, 0x2548, 0x2548, 0x2549, 0x2549, 0x254a, + 0x254a, 0x254a, 0x254b, 0x254b, 0x254b, 0x254c, 0x254c, 0x254d, + 0x254d, 0x254d, 0x254e, 0x254e, 0x254e, 0x254f, 0x254f, 0x2550, + 0x2550, 0x2550, 0x2551, 0x2551, 0x2551, 0x2552, 0x2552, 0x2553, + 0x2553, 0x2553, 0x2554, 0x2554, 0x2554, 0x2555, 0x2555, 0x2555, + 0x2556, 0x2556, 0x2557, 0x2557, 0x2557, 0x2558, 0x2558, 0x2558, + 0x2559, 0x2559, 0x255a, 0x255a, 0x255a, 0x255b, 0x255b, 0x255b, + 0x255c, 0x255c, 0x255c, 0x255d, 0x255d, 0x255e, 0x255e, 0x255e, + 0x255f, 0x255f, 0x255f, 0x2560, 0x2560, 0x2561, 0x2561, 0x2561, + 0x2562, 0x2562, 0x2562, 0x2563, 0x2563, 0x2563, 0x2564, 0x2564, + 0x2565, 0x2565, 0x2565, 0x2566, 0x2566, 0x2566, 0x2567, 0x2567, + 0x2567, 0x2568, 0x2568, 0x2569, 0x2569, 0x2569, 0x256a, 0x256a, + 0x256a, 0x256b, 0x256b, 0x256b, 0x256c, 0x256c, 0x256d, 0x256d, + 0x256d, 0x256e, 0x256e, 0x256e, 0x256f, 0x256f, 0x256f, 0x2570, + 0x2570, 0x2570, 0x2571, 0x2571, 0x2572, 0x2572, 0x2572, 0x2573, + 0x2573, 0x2573, 0x2574, 0x2574, 0x2574, 0x2575, 0x2575, 0x2576, + 0x2576, 0x2576, 0x2577, 0x2577, 0x2577, 0x2578, 0x2578, 0x2578, + 0x2579, 0x2579, 0x2579, 0x257a, 0x257a, 0x257b, 0x257b, 0x257b, + 0x257c, 0x257c, 0x257c, 0x257d, 0x257d, 0x257d, 0x257e, 0x257e, + 0x257e, 0x257f, 0x257f, 0x2580, 0x2580, 0x2580, 0x2581, 0x2581, + 0x2581, 0x2582, 0x2582, 0x2582, 0x2583, 0x2583, 0x2583, 0x2584, + 0x2584, 0x2585, 0x2585, 0x2585, 0x2586, 0x2586, 0x2586, 0x2587, + 0x2587, 0x2587, 0x2588, 0x2588, 0x2588, 0x2589, 0x2589, 0x258a, + 0x258a, 0x258a, 0x258b, 0x258b, 0x258b, 0x258c, 0x258c, 0x258c, + 0x258d, 0x258d, 0x258d, 0x258e, 0x258e, 0x258e, 0x258f, 0x258f, + 0x258f, 0x2590, 0x2590, 0x2591, 0x2591, 0x2591, 0x2592, 0x2592, + 0x2592, 0x2593, 0x2593, 0x2593, 0x2594, 0x2594, 0x2594, 0x2595, + 0x2595, 0x2595, 0x2596, 0x2596, 0x2597, 0x2597, 0x2597, 0x2598, + 0x2598, 0x2598, 0x2599, 0x2599, 0x2599, 0x259a, 0x259a, 0x259a, + 0x259b, 0x259b, 0x259b, 0x259c, 0x259c, 0x259c, 0x259d, 0x259d, + 0x259d, 0x259e, 0x259e, 0x259f, 0x259f, 0x259f, 0x25a0, 0x25a0, + 0x25a0, 0x25a1, 0x25a1, 0x25a1, 0x25a2, 0x25a2, 0x25a2, 0x25a3, + 0x25a3, 0x25a3, 0x25a4, 0x25a4, 0x25a4, 0x25a5, 0x25a5, 0x25a5, + 0x25a6, 0x25a6, 0x25a6, 0x25a7, 0x25a7, 0x25a8, 0x25a8, 0x25a8, + 0x25a9, 0x25a9, 0x25a9, 0x25aa, 0x25aa, 0x25aa, 0x25ab, 0x25ab, + 0x25ab, 0x25ac, 0x25ac, 0x25ac, 0x25ad, 0x25ad, 0x25ad, 0x25ae, + 0x25ae, 0x25ae, 0x25af, 0x25af, 0x25af, 0x25b0, 0x25b0, 0x25b0, + 0x25b1, 0x25b1, 0x25b1, 0x25b2, 0x25b2, 0x25b2, 0x25b3, 0x25b3, + 0x25b4, 0x25b4, 0x25b4, 0x25b5, 0x25b5, 0x25b5, 0x25b6, 0x25b6, + 0x25b6, 0x25b7, 0x25b7, 0x25b7, 0x25b8, 0x25b8, 0x25b8, 0x25b9, + 0x25b9, 0x25b9, 0x25ba, 0x25ba, 0x25ba, 0x25bb, 0x25bb, 0x25bb, + 0x25bc, 0x25bc, 0x25bc, 0x25bd, 0x25bd, 0x25bd, 0x25be, 0x25be, + 0x25be, 0x25bf, 0x25bf, 0x25bf, 0x25c0, 0x25c0, 0x25c0, 0x25c1, + 0x25c1, 0x25c1, 0x25c2, 0x25c2, 0x25c2, 0x25c3, 0x25c3, 0x25c3, + 0x25c4, 0x25c4, 0x25c4, 0x25c5, 0x25c5, 0x25c5, 0x25c6, 0x25c6, + 0x25c6, 0x25c7, 0x25c7, 0x25c7, 0x25c8, 0x25c8, 0x25c8, 0x25c9, + 0x25c9, 0x25ca, 0x25ca, 0x25ca, 0x25cb, 0x25cb, 0x25cb, 0x25cc, + 0x25cc, 0x25cc, 0x25cd, 0x25cd, 0x25cd, 0x25ce, 0x25ce, 0x25ce, + 0x25cf, 0x25cf, 0x25cf, 0x25d0, 0x25d0, 0x25d0, 0x25d1, 0x25d1, + 0x25d1, 0x25d2, 0x25d2, 0x25d2, 0x25d3, 0x25d3, 0x25d3, 0x25d4, + 0x25d4, 0x25d4, 0x25d5, 0x25d5, 0x25d5, 0x25d6, 0x25d6, 0x25d6, + 0x25d7, 0x25d7, 0x25d8, 0x25d8, 0x25d9, 0x25da, 0x25da, 0x25db, + 0x25dc, 0x25dc, 0x25dd, 0x25de, 0x25de, 0x25df, 0x25e0, 0x25e0, + 0x25e1, 0x25e2, 0x25e2, 0x25e3, 0x25e4, 0x25e4, 0x25e5, 0x25e6, + 0x25e6, 0x25e7, 0x25e8, 0x25e8, 0x25e9, 0x25ea, 0x25ea, 0x25eb, + 0x25ec, 0x25ec, 0x25ed, 0x25ee, 0x25ee, 0x25ef, 0x25ef, 0x25f0, + 0x25f1, 0x25f1, 0x25f2, 0x25f3, 0x25f3, 0x25f4, 0x25f5, 0x25f5, + 0x25f6, 0x25f7, 0x25f7, 0x25f8, 0x25f9, 0x25f9, 0x25fa, 0x25fa, + 0x25fb, 0x25fc, 0x25fc, 0x25fd, 0x25fe, 0x25fe, 0x25ff, 0x2600, + 0x2600, 0x2601, 0x2602, 0x2602, 0x2603, 0x2603, 0x2604, 0x2605, + 0x2605, 0x2606, 0x2607, 0x2607, 0x2608, 0x2609, 0x2609, 0x260a, + 0x260a, 0x260b, 0x260c, 0x260c, 0x260d, 0x260e, 0x260e, 0x260f, + 0x2610, 0x2610, 0x2611, 0x2611, 0x2612, 0x2613, 0x2613, 0x2614, + 0x2615, 0x2615, 0x2616, 0x2617, 0x2617, 0x2618, 0x2618, 0x2619, + 0x261a, 0x261a, 0x261b, 0x261c, 0x261c, 0x261d, 0x261d, 0x261e, + 0x261f, 0x261f, 0x2620, 0x2621, 0x2621, 0x2622, 0x2622, 0x2623, + 0x2624, 0x2624, 0x2625, 0x2626, 0x2626, 0x2627, 0x2627, 0x2628, + 0x2629, 0x2629, 0x262a, 0x262b, 0x262b, 0x262c, 0x262c, 0x262d, + 0x262e, 0x262e, 0x262f, 0x2630, 0x2630, 0x2631, 0x2631, 0x2632, + 0x2633, 0x2633, 0x2634, 0x2634, 0x2635, 0x2636, 0x2636, 0x2637, + 0x2638, 0x2638, 0x2639, 0x2639, 0x263a, 0x263b, 0x263b, 0x263c, + 0x263c, 0x263d, 0x263e, 0x263e, 0x263f, 0x2640, 0x2640, 0x2641, + 0x2641, 0x2642, 0x2643, 0x2643, 0x2644, 0x2644, 0x2645, 0x2646, + 0x2646, 0x2647, 0x2647, 0x2648, 0x2649, 0x2649, 0x264a, 0x264a, + 0x264b, 0x264c, 0x264c, 0x264d, 0x264e, 0x264e, 0x264f, 0x264f, + 0x2650, 0x2651, 0x2651, 0x2652, 0x2652, 0x2653, 0x2654, 0x2654, + 0x2655, 0x2655, 0x2656, 0x2657, 0x2657, 0x2658, 0x2658, 0x2659, + 0x265a, 0x265a, 0x265b, 0x265b, 0x265c, 0x265d, 0x265d, 0x265e, + 0x265e, 0x265f, 0x2660, 0x2660, 0x2661, 0x2661, 0x2662, 0x2663, + 0x2663, 0x2664, 0x2664, 0x2665, 0x2666, 0x2666, 0x2667, 0x2667, + 0x2668, 0x2668, 0x2669, 0x266a, 0x266a, 0x266b, 0x266b, 0x266c, + 0x266d, 0x266d, 0x266e, 0x266e, 0x266f, 0x2670, 0x2670, 0x2671, + 0x2671, 0x2672, 0x2673, 0x2673, 0x2674, 0x2674, 0x2675, 0x2675, + 0x2676, 0x2677, 0x2677, 0x2678, 0x2678, 0x2679, 0x267a, 0x267a, + 0x267b, 0x267b, 0x267c, 0x267c, 0x267d, 0x267e, 0x267e, 0x267f, + 0x267f, 0x2680, 0x2681, 0x2681, 0x2682, 0x2682, 0x2683, 0x2683, + 0x2684, 0x2685, 0x2685, 0x2686, 0x2686, 0x2687, 0x2688, 0x2688, + 0x2689, 0x2689, 0x268a, 0x268a, 0x268b, 0x268c, 0x268c, 0x268d, + 0x268d, 0x268e, 0x268f, 0x268f, 0x2690, 0x2690, 0x2691, 0x2691, + 0x2692, 0x2693, 0x2693, 0x2694, 0x2694, 0x2695, 0x2695, 0x2696, + 0x2697, 0x2697, 0x2698, 0x2698, 0x2699, 0x2699, 0x269a, 0x269b, + 0x269b, 0x269c, 0x269c, 0x269d, 0x269d, 0x269e, 0x269f, 0x269f, + 0x26a0, 0x26a0, 0x26a1, 0x26a1, 0x26a2, 0x26a3, 0x26a3, 0x26a4, + 0x26a4, 0x26a5, 0x26a5, 0x26a6, 0x26a7, 0x26a7, 0x26a8, 0x26a8, + 0x26a9, 0x26a9, 0x26aa, 0x26aa, 0x26ab, 0x26ac, 0x26ac, 0x26ad, + 0x26ad, 0x26ae, 0x26ae, 0x26af, 0x26b0, 0x26b0, 0x26b1, 0x26b1, + 0x26b2, 0x26b2, 0x26b3, 0x26b4, 0x26b4, 0x26b5, 0x26b5, 0x26b6, + 0x26b6, 0x26b7, 0x26b7, 0x26b8, 0x26b9, 0x26b9, 0x26ba, 0x26ba, + 0x26bb, 0x26bb, 0x26bc, 0x26bc, 0x26bd, 0x26be, 0x26be, 0x26bf, + 0x26bf, 0x26c0, 0x26c0, 0x26c1, 0x26c2, 0x26c2, 0x26c3, 0x26c3, + 0x26c4, 0x26c4, 0x26c5, 0x26c5, 0x26c6, 0x26c7, 0x26c7, 0x26c8, + 0x26c8, 0x26c9, 0x26c9, 0x26ca, 0x26ca, 0x26cb, 0x26cb, 0x26cc, + 0x26cd, 0x26cd, 0x26ce, 0x26ce, 0x26cf, 0x26cf, 0x26d0, 0x26d0, + 0x26d1, 0x26d2, 0x26d2, 0x26d3, 0x26d3, 0x26d4, 0x26d4, 0x26d5, + 0x26d5, 0x26d6, 0x26d7, 0x26d7, 0x26d8, 0x26d8, 0x26d9, 0x26d9, + 0x26da, 0x26da, 0x26db, 0x26db, 0x26dc, 0x26dd, 0x26dd, 0x26de, + 0x26de, 0x26df, 0x26df, 0x26e0, 0x26e0, 0x26e1, 0x26e1, 0x26e2, + 0x26e3, 0x26e3, 0x26e4, 0x26e4, 0x26e5, 0x26e5, 0x26e6, 0x26e6, + 0x26e7, 0x26e7, 0x26e8, 0x26e9, 0x26e9, 0x26ea, 0x26ea, 0x26eb, + 0x26eb, 0x26ec, 0x26ec, 0x26ed, 0x26ed, 0x26ee, 0x26ee, 0x26ef, + 0x26f0, 0x26f0, 0x26f1, 0x26f1, 0x26f2, 0x26f2, 0x26f3, 0x26f3, + 0x26f4, 0x26f4, 0x26f5, 0x26f5, 0x26f6, 0x26f7, 0x26f7, 0x26f8, + 0x26f8, 0x26f9, 0x26f9, 0x26fa, 0x26fa, 0x26fb, 0x26fb, 0x26fc, + 0x26fc, 0x26fd, 0x26fe, 0x26fe, 0x26ff, 0x26ff, 0x2700, 0x2700, + 0x2701, 0x2701, 0x2702, 0x2702, 0x2703, 0x2703, 0x2704, 0x2704, + 0x2705, 0x2705, 0x2706, 0x2707, 0x2707, 0x2708, 0x2708, 0x2709, + 0x2709, 0x270a, 0x270a, 0x270b, 0x270b, 0x270c, 0x270c, 0x270d, + 0x270d, 0x270e, 0x270f, 0x270f, 0x2710, 0x2710, 0x2711, 0x2711, + 0x2712, 0x2712, 0x2713, 0x2713, 0x2714, 0x2714, 0x2715, 0x2715, + 0x2716, 0x2716, 0x2717, 0x2717, 0x2718, 0x2719, 0x2719, 0x271a, + 0x271a, 0x271b, 0x271b, 0x271c, 0x271c, 0x271d, 0x271d, 0x271e, + 0x271e, 0x271f, 0x271f, 0x2720, 0x2720, 0x2721, 0x2721, 0x2722, + 0x2722, 0x2723, 0x2723, 0x2724, 0x2725, 0x2725, 0x2726, 0x2726, + 0x2727, 0x2727, 0x2728, 0x2728, 0x2729, 0x2729, 0x272a, 0x272a, + 0x272b, 0x272b, 0x272c, 0x272c, 0x272d, 0x272d, 0x272e, 0x272e, + 0x272f, 0x272f, 0x2730, 0x2730, 0x2731, 0x2732, 0x2732, 0x2733, + 0x2733, 0x2734, 0x2734, 0x2735, 0x2735, 0x2736, 0x2736, 0x2737, + 0x2737, 0x2738, 0x2738, 0x2739, 0x2739, 0x273a, 0x273a, 0x273b, + 0x273b, 0x273c, 0x273c, 0x273d, 0x273d, 0x273e, 0x273e, 0x273f, + 0x273f, 0x2740, 0x2740, 0x2741, 0x2741, 0x2742, 0x2742, 0x2743, + 0x2743, 0x2744, 0x2744, 0x2745, 0x2746, 0x2746, 0x2747, 0x2747, + 0x2748, 0x2748, 0x2749, 0x2749, 0x274a, 0x274a, 0x274b, 0x274b, + 0x274c, 0x274c, 0x274d, 0x274d, 0x274e, 0x274e, 0x274f, 0x274f, + 0x2750, 0x2750, 0x2751, 0x2751, 0x2752, 0x2752, 0x2753, 0x2753, + 0x2754, 0x2754, 0x2755, 0x2755, 0x2756, 0x2756, 0x2757, 0x2757, + 0x2758, 0x2758, 0x2759, 0x2759, 0x275a, 0x275a, 0x275b, 0x275b, + 0x275c, 0x275c, 0x275d, 0x275d, 0x275e, 0x275e, 0x275f, 0x275f, + 0x2760, 0x2760, 0x2761, 0x2761, 0x2762, 0x2762, 0x2763, 0x2763, + 0x2764, 0x2764, 0x2765, 0x2765, 0x2766, 0x2766, 0x2767, 0x2767, + 0x2768, 0x2768, 0x2769, 0x2769, 0x276a, 0x276a, 0x276b, 0x276b, + 0x276c, 0x276c, 0x276d, 0x276d, 0x276e, 0x276e, 0x276f, 0x276f, + 0x2770, 0x2770, 0x2771, 0x2771, 0x2772, 0x2772, 0x2773, 0x2773, + 0x2774, 0x2774, 0x2775, 0x2775, 0x2776, 0x2776, 0x2777, 0x2777, + 0x2778, 0x2778, 0x2779, 0x2779, 0x277a, 0x277a, 0x277b, 0x277b, + 0x277c, 0x277c, 0x277d, 0x277d, 0x277e, 0x277e, 0x277f, 0x277f, + 0x2780, 0x2780, 0x2781, 0x2781, 0x2782, 0x2782, 0x2782, 0x2783, + 0x2783, 0x2784, 0x2784, 0x2785, 0x2785, 0x2786, 0x2786, 0x2787, + 0x2787, 0x2788, 0x2788, 0x2789, 0x2789, 0x278a, 0x278a, 0x278b, + 0x278b, 0x278c, 0x278c, 0x278d, 0x278d, 0x278e, 0x278e, 0x278f, + 0x278f, 0x2790, 0x2790, 0x2791, 0x2791, 0x2792, 0x2792, 0x2793, + 0x2793, 0x2794, 0x2794, 0x2795, 0x2795, 0x2796, 0x2796, 0x2796, + 0x2797, 0x2797, 0x2798, 0x2798, 0x2799, 0x2799, 0x279a, 0x279a, + 0x279b, 0x279b, 0x279c, 0x279c, 0x279d, 0x279d, 0x279e, 0x279e, + 0x279f, 0x279f, 0x27a0, 0x27a0, 0x27a1, 0x27a1, 0x27a2, 0x27a2, + 0x27a3, 0x27a3, 0x27a4, 0x27a4, 0x27a4, 0x27a5, 0x27a5, 0x27a6, + 0x27a6, 0x27a7, 0x27a7, 0x27a8, 0x27a8, 0x27a9, 0x27a9, 0x27aa, + 0x27aa, 0x27ab, 0x27ab, 0x27ac, 0x27ac, 0x27ad, 0x27ad, 0x27ae, + 0x27ae, 0x27af, 0x27af, 0x27af, 0x27b0, 0x27b0, 0x27b1, 0x27b1, + 0x27b2, 0x27b2, 0x27b3, 0x27b3, 0x27b4, 0x27b4, 0x27b5, 0x27b5, + 0x27b6, 0x27b6, 0x27b7, 0x27b7, 0x27b8, 0x27b8, 0x27b9, 0x27b9, + 0x27b9, 0x27ba, 0x27ba, 0x27bb, 0x27bb, 0x27bc, 0x27bc, 0x27bd, + 0x27bd, 0x27be, 0x27be, 0x27bf, 0x27bf, 0x27c0, 0x27c0, 0x27c1, + 0x27c1, 0x27c1, 0x27c2, 0x27c2, 0x27c3, 0x27c3, 0x27c4, 0x27c4, + 0x27c5, 0x27c5, 0x27c6, 0x27c6, 0x27c7, 0x27c7, 0x27c8, 0x27c8, + 0x27c9, 0x27c9, 0x27c9, 0x27ca, 0x27ca, 0x27cb, 0x27cb, 0x27cc, + 0x27cc, 0x27cd, 0x27cd, 0x27ce, 0x27ce, 0x27cf, 0x27cf, 0x27d0, + 0x27d0, 0x27d1, 0x27d1, 0x27d1, 0x27d2, 0x27d2, 0x27d3, 0x27d3, + 0x27d4, 0x27d4, 0x27d5, 0x27d5, 0x27d6, 0x27d6, 0x27d7, 0x27d7, + 0x27d8, 0x27d8, 0x27d8, 0x27d9, 0x27d9, 0x27da, 0x27da, 0x27db, + 0x27db, 0x27dc, 0x27dc, 0x27dd, 0x27dd, 0x27de, 0x27de, 0x27de, + 0x27df, 0x27df, 0x27e0, 0x27e0, 0x27e1, 0x27e1, 0x27e2, 0x27e2, + 0x27e3, 0x27e3, 0x27e4, 0x27e4, 0x27e5, 0x27e5, 0x27e5, 0x27e6, + 0x27e6, 0x27e7, 0x27e7, 0x27e8, 0x27e8, 0x27e9, 0x27e9, 0x27ea, + 0x27ea, 0x27eb, 0x27eb, 0x27eb, 0x27ec, 0x27ec, 0x27ed, 0x27ed, + 0x27ee, 0x27ee, 0x27ef, 0x27ef, 0x27f0, 0x27f0, 0x27f0, 0x27f1, + 0x27f1, 0x27f2, 0x27f2, 0x27f3, 0x27f3, 0x27f4, 0x27f4, 0x27f5, + 0x27f5, 0x27f6, 0x27f6, 0x27f6, 0x27f7, 0x27f7, 0x27f8, 0x27f8, + 0x27f9, 0x27f9, 0x27fa, 0x27fa, 0x27fb, 0x27fb, 0x27fb, 0x27fc, + 0x27fc, 0x27fd, 0x27fd, 0x27fe, 0x27fe, 0x27ff, 0x27ff, 0x2800, + 0x2800, 0x2800, 0x2801, 0x2801, 0x2802, 0x2802, 0x2803, 0x2803, + 0x2804, 0x2804, 0x2805, 0x2805, 0x2805, 0x2806, 0x2806, 0x2807, + 0x2807, 0x2808, 0x2808, 0x2809, 0x2809, 0x2809, 0x280a, 0x280a, + 0x280b, 0x280b, 0x280c, 0x280c, 0x280d, 0x280d, 0x280e, 0x280e, + 0x280e, 0x280f, 0x280f, 0x2810, 0x2810, 0x2811, 0x2811, 0x2812, + 0x2812, 0x2812, 0x2813, 0x2813, 0x2814, 0x2814, 0x2815, 0x2815, + 0x2816, 0x2816, 0x2816, 0x2817, 0x2817, 0x2818, 0x2818, 0x2819, + 0x2819, 0x281a, 0x281a, 0x281a, 0x281b, 0x281b, 0x281c, 0x281c, + 0x281d, 0x281d, 0x281d, 0x281e, 0x281e, 0x281f, 0x281f, 0x2820, + 0x2820, 0x2821, 0x2821, 0x2821, 0x2822, 0x2822, 0x2823, 0x2823, + 0x2824, 0x2824, 0x2824, 0x2825, 0x2825, 0x2826, 0x2826, 0x2827, + 0x2827, 0x2828, 0x2828, 0x2828, 0x2829, 0x2829, 0x282a, 0x282a, + 0x282b, 0x282b, 0x282b, 0x282c, 0x282c, 0x282d, 0x282d, 0x282e, + 0x282e, 0x282e, 0x282f, 0x282f, 0x2830, 0x2830, 0x2831, 0x2831, + 0x2831, 0x2832, 0x2832, 0x2833, 0x2833, 0x2834, 0x2834, 0x2834, + 0x2835, 0x2835, 0x2836, 0x2836, 0x2837, 0x2837, 0x2837, 0x2838, + 0x2838, 0x2839, 0x2839, 0x283a, 0x283a, 0x283a, 0x283b, 0x283b, + 0x283c, 0x283c, 0x283d, 0x283d, 0x283d, 0x283e, 0x283e, 0x283f, + 0x283f, 0x2840, 0x2840, 0x2840, 0x2841, 0x2841, 0x2842, 0x2842, + 0x2842, 0x2843, 0x2843, 0x2844, 0x2844, 0x2845, 0x2845, 0x2845, + 0x2846, 0x2846, 0x2847, 0x2847, 0x2848, 0x2848, 0x2848, 0x2849, + 0x2849, 0x284a, 0x284a, 0x284a, 0x284b, 0x284b, 0x284c, 0x284c, + 0x284d, 0x284d, 0x284d, 0x284e, 0x284e, 0x284f, 0x284f, 0x284f, + 0x2850, 0x2850, 0x2851, 0x2851, 0x2852, 0x2852, 0x2852, 0x2853, + 0x2853, 0x2854, 0x2854, 0x2854, 0x2855, 0x2855, 0x2856, 0x2856, + 0x2857, 0x2857, 0x2857, 0x2858, 0x2858, 0x2859, 0x2859, 0x2859, + 0x285a, 0x285a, 0x285b, 0x285b, 0x285b, 0x285c, 0x285c, 0x285d, + 0x285d, 0x285d, 0x285e, 0x285e, 0x285f, 0x285f, 0x2860, 0x2860, + 0x2860, 0x2861, 0x2861, 0x2862, 0x2862, 0x2862, 0x2863, 0x2863, + 0x2864, 0x2864, 0x2864, 0x2865, 0x2865, 0x2866, 0x2866, 0x2866, + 0x2867, 0x2867, 0x2868, 0x2868, 0x2868, 0x2869, 0x2869, 0x286a, + 0x286a, 0x286a, 0x286b, 0x286b, 0x286c, 0x286c, 0x286d, 0x286d, + 0x286d, 0x286e, 0x286e, 0x286f, 0x286f, 0x286f, 0x2870, 0x2870, + 0x2871, 0x2871, 0x2871, 0x2872, 0x2872, 0x2873, 0x2873, 0x2873, + 0x2874, 0x2874, 0x2875, 0x2875, 0x2875, 0x2876, 0x2876, 0x2877, + 0x2877, 0x2877, 0x2878, 0x2878, 0x2879, 0x2879, 0x2879, 0x287a, + 0x287a, 0x287b, 0x287b, 0x287b, 0x287c, 0x287c, 0x287c, 0x287d, + 0x287d, 0x287e, 0x287e, 0x287e, 0x287f, 0x287f, 0x2880, 0x2880, + 0x2880, 0x2881, 0x2881, 0x2882, 0x2882, 0x2882, 0x2883, 0x2883, + 0x2884, 0x2884, 0x2884, 0x2885, 0x2885, 0x2886, 0x2886, 0x2886, + 0x2887, 0x2887, 0x2888, 0x2888, 0x2888, 0x2889, 0x2889, 0x2889, + 0x288a, 0x288a, 0x288b, 0x288b, 0x288b, 0x288c, 0x288c, 0x288d, + 0x288d, 0x288d, 0x288e, 0x288e, 0x288f, 0x288f, 0x288f, 0x2890, + 0x2890, 0x2890, 0x2891, 0x2891, 0x2892, 0x2892, 0x2892, 0x2893, + 0x2893, 0x2894, 0x2894, 0x2894, 0x2895, 0x2895, 0x2896, 0x2896, + 0x2896, 0x2897, 0x2897, 0x2897, 0x2898, 0x2898, 0x2899, 0x2899, + 0x2899, 0x289a, 0x289a, 0x289b, 0x289b, 0x289b, 0x289c, 0x289c, + 0x289c, 0x289d, 0x289d, 0x289e, 0x289e, 0x289e, 0x289f, 0x289f, + 0x289f, 0x28a0, 0x28a0, 0x28a1, 0x28a1, 0x28a1, 0x28a2, 0x28a2, + 0x28a3, 0x28a3, 0x28a3, 0x28a4, 0x28a4, 0x28a4, 0x28a5, 0x28a5, + 0x28a6, 0x28a6, 0x28a6, 0x28a7, 0x28a7, 0x28a7, 0x28a8, 0x28a8, + 0x28a9, 0x28a9, 0x28a9, 0x28aa, 0x28aa, 0x28ab, 0x28ab, 0x28ab, + 0x28ac, 0x28ac, 0x28ac, 0x28ad, 0x28ad, 0x28ae, 0x28ae, 0x28ae, + 0x28af, 0x28af, 0x28af, 0x28b0, 0x28b0, 0x28b1, 0x28b1, 0x28b1, + 0x28b2, 0x28b2, 0x28b2, 0x28b3, 0x28b3, 0x28b4, 0x28b4, 0x28b4, + 0x28b5, 0x28b5, 0x28b5, 0x28b6, 0x28b6, 0x28b7, 0x28b7, 0x28b7, + 0x28b8, 0x28b8, 0x28b8, 0x28b9, 0x28b9, 0x28ba, 0x28ba, 0x28ba, + 0x28bb, 0x28bb, 0x28bb, 0x28bc, 0x28bc, 0x28bc, 0x28bd, 0x28bd, + 0x28be, 0x28be, 0x28be, 0x28bf, 0x28bf, 0x28bf, 0x28c0, 0x28c0, + 0x28c1, 0x28c1, 0x28c1, 0x28c2, 0x28c2, 0x28c2, 0x28c3, 0x28c3, + 0x28c4, 0x28c4, 0x28c4, 0x28c5, 0x28c5, 0x28c5, 0x28c6, 0x28c6, + 0x28c6, 0x28c7, 0x28c7, 0x28c8, 0x28c8, 0x28c8, 0x28c9, 0x28c9, + 0x28c9, 0x28ca, 0x28ca, 0x28ca, 0x28cb, 0x28cb, 0x28cc, 0x28cc, + 0x28cc, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ce, 0x28cf, 0x28cf, + 0x28cf, 0x28d0, 0x28d0, 0x28d0, 0x28d1, 0x28d1, 0x28d1, 0x28d2, + 0x28d2, 0x28d3, 0x28d3, 0x28d3, 0x28d4, 0x28d4, 0x28d4, 0x28d5, + 0x28d5, 0x28d5, 0x28d6, 0x28d6, 0x28d6, 0x28d7, 0x28d7, 0x28d8, + 0x28d8, 0x28d8, 0x28d9, 0x28d9, 0x28d9, 0x28da, 0x28da, 0x28da, + 0x28db, 0x28db, 0x28dc, 0x28dc, 0x28dc, 0x28dd, 0x28dd, 0x28dd, + 0x28de, 0x28de, 0x28de, 0x28df, 0x28df, 0x28e0, 0x28e0, 0x28e0, + 0x28e1, 0x28e1, 0x28e1, 0x28e2, 0x28e2, 0x28e2, 0x28e3, 0x28e3, + 0x28e3, 0x28e4, 0x28e4, 0x28e5, 0x28e5, 0x28e5, 0x28e6, 0x28e6, + 0x28e6, 0x28e7, 0x28e7, 0x28e7, 0x28e8, 0x28e8, 0x28e8, 0x28e9, + 0x28e9, 0x28e9, 0x28ea, 0x28ea, 0x28eb, 0x28eb, 0x28eb, 0x28ec, + 0x28ec, 0x28ec, 0x28ed, 0x28ed, 0x28ed, 0x28ee, 0x28ee, 0x28ee, + 0x28ef, 0x28ef, 0x28f0, 0x28f0, 0x28f0, 0x28f1, 0x28f1, 0x28f1, + 0x28f2, 0x28f2, 0x28f2, 0x28f3, 0x28f3, 0x28f3, 0x28f4, 0x28f4, + 0x28f4, 0x28f5, 0x28f5, 0x28f6, 0x28f6, 0x28f6, 0x28f7, 0x28f7, + 0x28f7, 0x28f8, 0x28f8, 0x28f8, 0x28f9, 0x28f9, 0x28f9, 0x28fa, + 0x28fa, 0x28fa, 0x28fb, 0x28fb, 0x28fb, 0x28fc, 0x28fc, 0x28fd, + 0x28fd, 0x28fd, 0x28fe, 0x28fe, 0x28fe, 0x28ff, 0x28ff, 0x28ff, + 0x2900, 0x2900, 0x2900, 0x2901, 0x2901, 0x2901, 0x2902, 0x2902, + 0x2902, 0x2903, 0x2903, 0x2903, 0x2904, 0x2904, 0x2905, 0x2905, + 0x2905, 0x2906, 0x2906, 0x2906, 0x2907, 0x2907, 0x2907, 0x2908, + 0x2908, 0x2908, 0x2909, 0x2909, 0x2909, 0x290a, 0x290a, 0x290a, + 0x290b, 0x290b, 0x290b, 0x290c, 0x290c, 0x290c, 0x290d, 0x290d, + 0x290d, 0x290e, 0x290e, 0x290e, 0x290f, 0x290f, 0x2910, 0x2910, + 0x2910, 0x2911, 0x2911, 0x2911, 0x2912, 0x2912, 0x2912, 0x2913, + 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2915, 0x2915, 0x2915, + 0x2916, 0x2916, 0x2916, 0x2917, 0x2917, 0x2917, 0x2918, 0x2918, + 0x2918, 0x2919, 0x2919, 0x2919, 0x291a, 0x291a, 0x291a, 0x291b, + 0x291b, 0x291b, 0x291c, 0x291c, 0x291c, 0x291d, 0x291d, 0x291d, + 0x291e, 0x291e, 0x291f, 0x291f, 0x291f, 0x2920, 0x2920, 0x2920, + 0x2921, 0x2921, 0x2921, 0x2922, 0x2922, 0x2922, 0x2923, 0x2923, + 0x2923, 0x2924, 0x2924, 0x2924, 0x2925, 0x2925, 0x2925, 0x2926, + 0x2926, 0x2926, 0x2927, 0x2927, 0x2927, 0x2928, 0x2928, 0x2928, + 0x2929, 0x2929, 0x2929, 0x292a, 0x292a, 0x292a, 0x292b, 0x292b, + 0x292b, 0x292c, 0x292c, 0x292c, 0x292d, 0x292d, 0x292d, 0x292e, + 0x292e, 0x292e, 0x292f, 0x292f, 0x292f, 0x2930, 0x2930, 0x2930, + 0x2931, 0x2931, 0x2931, 0x2932, 0x2932, 0x2932, 0x2933, 0x2933, + 0x2933, 0x2934, 0x2934, 0x2934, 0x2935, 0x2935, 0x2935, 0x2936, + 0x2936, 0x2936, 0x2937, 0x2937, 0x2937, 0x2938, 0x2938, 0x2938, + 0x2939, 0x2939, 0x2939, 0x293a, 0x293a, 0x293a, 0x293b, 0x293b, + 0x293b, 0x293c, 0x293c, 0x293c, 0x293d, 0x293d, 0x293d, 0x293e, + 0x293e, 0x293e, 0x293e, 0x293f, 0x293f, 0x293f, 0x2940, 0x2940, + 0x2940, 0x2941, 0x2941, 0x2941, 0x2942, 0x2942, 0x2942, 0x2943, + 0x2943, 0x2943, 0x2944, 0x2944, 0x2944, 0x2945, 0x2945, 0x2945, + 0x2946, 0x2946, 0x2946, 0x2947, 0x2947, 0x2947, 0x2948, 0x2948, + 0x2948, 0x2949, 0x2949, 0x2949, 0x294a, 0x294a, 0x294a, 0x294b, + 0x294b, 0x294b, 0x294c, 0x294c, 0x294c, 0x294d, 0x294d, 0x294d, + 0x294d, 0x294e, 0x294e, 0x294e, 0x294f, 0x294f, 0x294f, 0x2950, + 0x2950, 0x2950, 0x2951, 0x2951, 0x2951, 0x2952, 0x2952, 0x2952, + 0x2953, 0x2953, 0x2953, 0x2954, 0x2954, 0x2954, 0x2955, 0x2955, + 0x2955, 0x2956, 0x2956, 0x2956, 0x2957, 0x2957, 0x2957, 0x2958, + 0x2958, 0x2958, 0x2958, 0x2959, 0x2959, 0x2959, 0x295a, 0x295a, + 0x295a, 0x295b, 0x295b, 0x295b, 0x295c, 0x295c, 0x295c, 0x295d, + 0x295d, 0x295d, 0x295e, 0x295e, 0x295e, 0x295f, 0x295f, 0x295f, + 0x2960, 0x2960, 0x2960, 0x2960, 0x2961, 0x2961, 0x2961, 0x2962, + 0x2962, 0x2962, 0x2963, 0x2963, 0x2963, 0x2964, 0x2964, 0x2964, + 0x2965, 0x2965, 0x2965, 0x2966, 0x2966, 0x2966, 0x2967, 0x2967, + 0x2967, 0x2967, 0x2968, 0x2968, 0x2968, 0x2969, 0x2969, 0x2969, + 0x296a, 0x296a, 0x296a, 0x296b, 0x296b, 0x296b, 0x296c, 0x296c, + 0x296c, 0x296d, 0x296d, 0x296d, 0x296d, 0x296e, 0x296e, 0x296e, + 0x296f, 0x296f, 0x296f, 0x2970, 0x2970, 0x2970, 0x2971, 0x2971, + 0x2971, 0x2972, 0x2972, 0x2972, 0x2972, 0x2973, 0x2973, 0x2973, + 0x2974, 0x2974, 0x2974, 0x2975, 0x2975, 0x2975, 0x2976, 0x2976, + 0x2976, 0x2977, 0x2977, 0x2977, 0x2977, 0x2978, 0x2978, 0x2978, + 0x2979, 0x2979, 0x2979, 0x297a, 0x297a, 0x297a, 0x297b, 0x297b, + 0x297b, 0x297c, 0x297c, 0x297d, 0x297e, 0x297e, 0x297f, 0x2980, + 0x2980, 0x2981, 0x2981, 0x2982, 0x2983, 0x2983, 0x2984, 0x2985, + 0x2985, 0x2986, 0x2986, 0x2987, 0x2988, 0x2988, 0x2989, 0x2989, + 0x298a, 0x298b, 0x298b, 0x298c, 0x298d, 0x298d, 0x298e, 0x298e, + 0x298f, 0x2990, 0x2990, 0x2991, 0x2991, 0x2992, 0x2993, 0x2993, + 0x2994, 0x2995, 0x2995, 0x2996, 0x2996, 0x2997, 0x2998, 0x2998, + 0x2999, 0x2999, 0x299a, 0x299b, 0x299b, 0x299c, 0x299c, 0x299d, + 0x299e, 0x299e, 0x299f, 0x299f, 0x29a0, 0x29a1, 0x29a1, 0x29a2, + 0x29a2, 0x29a3, 0x29a4, 0x29a4, 0x29a5, 0x29a5, 0x29a6, 0x29a7, + 0x29a7, 0x29a8, 0x29a8, 0x29a9, 0x29aa, 0x29aa, 0x29ab, 0x29ab, + 0x29ac, 0x29ad, 0x29ad, 0x29ae, 0x29ae, 0x29af, 0x29b0, 0x29b0, + 0x29b1, 0x29b1, 0x29b2, 0x29b3, 0x29b3, 0x29b4, 0x29b4, 0x29b5, + 0x29b6, 0x29b6, 0x29b7, 0x29b7, 0x29b8, 0x29b9, 0x29b9, 0x29ba, + 0x29ba, 0x29bb, 0x29bb, 0x29bc, 0x29bd, 0x29bd, 0x29be, 0x29be, + 0x29bf, 0x29c0, 0x29c0, 0x29c1, 0x29c1, 0x29c2, 0x29c3, 0x29c3, + 0x29c4, 0x29c4, 0x29c5, 0x29c5, 0x29c6, 0x29c7, 0x29c7, 0x29c8, + 0x29c8, 0x29c9, 0x29ca, 0x29ca, 0x29cb, 0x29cb, 0x29cc, 0x29cc, + 0x29cd, 0x29ce, 0x29ce, 0x29cf, 0x29cf, 0x29d0, 0x29d1, 0x29d1, + 0x29d2, 0x29d2, 0x29d3, 0x29d3, 0x29d4, 0x29d5, 0x29d5, 0x29d6, + 0x29d6, 0x29d7, 0x29d8, 0x29d8, 0x29d9, 0x29d9, 0x29da, 0x29da, + 0x29db, 0x29dc, 0x29dc, 0x29dd, 0x29dd, 0x29de, 0x29de, 0x29df, + 0x29e0, 0x29e0, 0x29e1, 0x29e1, 0x29e2, 0x29e2, 0x29e3, 0x29e4, + 0x29e4, 0x29e5, 0x29e5, 0x29e6, 0x29e6, 0x29e7, 0x29e8, 0x29e8, + 0x29e9, 0x29e9, 0x29ea, 0x29ea, 0x29eb, 0x29ec, 0x29ec, 0x29ed, + 0x29ed, 0x29ee, 0x29ee, 0x29ef, 0x29f0, 0x29f0, 0x29f1, 0x29f1, + 0x29f2, 0x29f2, 0x29f3, 0x29f3, 0x29f4, 0x29f5, 0x29f5, 0x29f6, + 0x29f6, 0x29f7, 0x29f7, 0x29f8, 0x29f9, 0x29f9, 0x29fa, 0x29fa, + 0x29fb, 0x29fb, 0x29fc, 0x29fc, 0x29fd, 0x29fe, 0x29fe, 0x29ff, + 0x29ff, 0x2a00, 0x2a00, 0x2a01, 0x2a02, 0x2a02, 0x2a03, 0x2a03, + 0x2a04, 0x2a04, 0x2a05, 0x2a05, 0x2a06, 0x2a07, 0x2a07, 0x2a08, + 0x2a08, 0x2a09, 0x2a09, 0x2a0a, 0x2a0a, 0x2a0b, 0x2a0c, 0x2a0c, + 0x2a0d, 0x2a0d, 0x2a0e, 0x2a0e, 0x2a0f, 0x2a0f, 0x2a10, 0x2a10, + 0x2a11, 0x2a12, 0x2a12, 0x2a13, 0x2a13, 0x2a14, 0x2a14, 0x2a15, + 0x2a15, 0x2a16, 0x2a17, 0x2a17, 0x2a18, 0x2a18, 0x2a19, 0x2a19, + 0x2a1a, 0x2a1a, 0x2a1b, 0x2a1b, 0x2a1c, 0x2a1d, 0x2a1d, 0x2a1e, + 0x2a1e, 0x2a1f, 0x2a1f, 0x2a20, 0x2a20, 0x2a21, 0x2a21, 0x2a22, + 0x2a23, 0x2a23, 0x2a24, 0x2a24, 0x2a25, 0x2a25, 0x2a26, 0x2a26, + 0x2a27, 0x2a27, 0x2a28, 0x2a29, 0x2a29, 0x2a2a, 0x2a2a, 0x2a2b, + 0x2a2b, 0x2a2c, 0x2a2c, 0x2a2d, 0x2a2d, 0x2a2e, 0x2a2e, 0x2a2f, + 0x2a30, 0x2a30, 0x2a31, 0x2a31, 0x2a32, 0x2a32, 0x2a33, 0x2a33, + 0x2a34, 0x2a34, 0x2a35, 0x2a35, 0x2a36, 0x2a37, 0x2a37, 0x2a38, + 0x2a38, 0x2a39, 0x2a39, 0x2a3a, 0x2a3a, 0x2a3b, 0x2a3b, 0x2a3c, + 0x2a3c, 0x2a3d, 0x2a3d, 0x2a3e, 0x2a3f, 0x2a3f, 0x2a40, 0x2a40, + 0x2a41, 0x2a41, 0x2a42, 0x2a42, 0x2a43, 0x2a43, 0x2a44, 0x2a44, + 0x2a45, 0x2a45, 0x2a46, 0x2a47, 0x2a47, 0x2a48, 0x2a48, 0x2a49, + 0x2a49, 0x2a4a, 0x2a4a, 0x2a4b, 0x2a4b, 0x2a4c, 0x2a4c, 0x2a4d, + 0x2a4d, 0x2a4e, 0x2a4e, 0x2a4f, 0x2a50, 0x2a50, 0x2a51, 0x2a51, + 0x2a52, 0x2a52, 0x2a53, 0x2a53, 0x2a54, 0x2a54, 0x2a55, 0x2a55, + 0x2a56, 0x2a56, 0x2a57, 0x2a57, 0x2a58, 0x2a58, 0x2a59, 0x2a59, + 0x2a5a, 0x2a5b, 0x2a5b, 0x2a5c, 0x2a5c, 0x2a5d, 0x2a5d, 0x2a5e, + 0x2a5e, 0x2a5f, 0x2a5f, 0x2a60, 0x2a60, 0x2a61, 0x2a61, 0x2a62, + 0x2a62, 0x2a63, 0x2a63, 0x2a64, 0x2a64, 0x2a65, 0x2a65, 0x2a66, + 0x2a66, 0x2a67, 0x2a67, 0x2a68, 0x2a69, 0x2a69, 0x2a6a, 0x2a6a, + 0x2a6b, 0x2a6b, 0x2a6c, 0x2a6c, 0x2a6d, 0x2a6d, 0x2a6e, 0x2a6e, + 0x2a6f, 0x2a6f, 0x2a70, 0x2a70, 0x2a71, 0x2a71, 0x2a72, 0x2a72, + 0x2a73, 0x2a73, 0x2a74, 0x2a74, 0x2a75, 0x2a75, 0x2a76, 0x2a76, + 0x2a77, 0x2a77, 0x2a78, 0x2a78, 0x2a79, 0x2a79, 0x2a7a, 0x2a7a, + 0x2a7b, 0x2a7b, 0x2a7c, 0x2a7d, 0x2a7d, 0x2a7e, 0x2a7e, 0x2a7f, + 0x2a7f, 0x2a80, 0x2a80, 0x2a81, 0x2a81, 0x2a82, 0x2a82, 0x2a83, + 0x2a83, 0x2a84, 0x2a84, 0x2a85, 0x2a85, 0x2a86, 0x2a86, 0x2a87, + 0x2a87, 0x2a88, 0x2a88, 0x2a89, 0x2a89, 0x2a8a, 0x2a8a, 0x2a8b, + 0x2a8b, 0x2a8c, 0x2a8c, 0x2a8d, 0x2a8d, 0x2a8e, 0x2a8e, 0x2a8f, + 0x2a8f, 0x2a90, 0x2a90, 0x2a91, 0x2a91, 0x2a92, 0x2a92, 0x2a93, + 0x2a93, 0x2a94, 0x2a94, 0x2a95, 0x2a95, 0x2a96, 0x2a96, 0x2a97, + 0x2a97, 0x2a98, 0x2a98, 0x2a99, 0x2a99, 0x2a9a, 0x2a9a, 0x2a9b, + 0x2a9b, 0x2a9c, 0x2a9c, 0x2a9d, 0x2a9d, 0x2a9e, 0x2a9e, 0x2a9f, + 0x2a9f, 0x2aa0, 0x2aa0, 0x2aa1, 0x2aa1, 0x2aa2, 0x2aa2, 0x2aa3, + 0x2aa3, 0x2aa4, 0x2aa4, 0x2aa5, 0x2aa5, 0x2aa6, 0x2aa6, 0x2aa7, + 0x2aa7, 0x2aa8, 0x2aa8, 0x2aa9, 0x2aa9, 0x2aaa, 0x2aaa, 0x2aab, + 0x2aab, 0x2aac, 0x2aac, 0x2aad, 0x2aad, 0x2aae, 0x2aae, 0x2aaf, + 0x2aaf, 0x2aaf, 0x2ab0, 0x2ab0, 0x2ab1, 0x2ab1, 0x2ab2, 0x2ab2, + 0x2ab3, 0x2ab3, 0x2ab4, 0x2ab4, 0x2ab5, 0x2ab5, 0x2ab6, 0x2ab6, + 0x2ab7, 0x2ab7, 0x2ab8, 0x2ab8, 0x2ab9, 0x2ab9, 0x2aba, 0x2aba, + 0x2abb, 0x2abb, 0x2abc, 0x2abc, 0x2abd, 0x2abd, 0x2abe, 0x2abe, + 0x2abf, 0x2abf, 0x2ac0, 0x2ac0, 0x2ac1, 0x2ac1, 0x2ac2, 0x2ac2, + 0x2ac2, 0x2ac3, 0x2ac3, 0x2ac4, 0x2ac4, 0x2ac5, 0x2ac5, 0x2ac6, + 0x2ac6, 0x2ac7, 0x2ac7, 0x2ac8, 0x2ac8, 0x2ac9, 0x2ac9, 0x2aca, + 0x2aca, 0x2acb, 0x2acb, 0x2acc, 0x2acc, 0x2acd, 0x2acd, 0x2ace, + 0x2ace, 0x2acf, 0x2acf, 0x2ad0, 0x2ad0, 0x2ad0, 0x2ad1, 0x2ad1, + 0x2ad2, 0x2ad2, 0x2ad3, 0x2ad3, 0x2ad4, 0x2ad4, 0x2ad5, 0x2ad5, + 0x2ad6, 0x2ad6, 0x2ad7, 0x2ad7, 0x2ad8, 0x2ad8, 0x2ad9, 0x2ad9, + 0x2ada, 0x2ada, 0x2adb, 0x2adb, 0x2adb, 0x2adc, 0x2adc, 0x2add, + 0x2add, 0x2ade, 0x2ade, 0x2adf, 0x2adf, 0x2ae0, 0x2ae0, 0x2ae1, + 0x2ae1, 0x2ae2, 0x2ae2, 0x2ae3, 0x2ae3, 0x2ae4, 0x2ae4, 0x2ae4, + 0x2ae5, 0x2ae5, 0x2ae6, 0x2ae6, 0x2ae7, 0x2ae7, 0x2ae8, 0x2ae8, + 0x2ae9, 0x2ae9, 0x2aea, 0x2aea, 0x2aeb, 0x2aeb, 0x2aec, 0x2aec, + 0x2aed, 0x2aed, 0x2aed, 0x2aee, 0x2aee, 0x2aef, 0x2aef, 0x2af0, + 0x2af0, 0x2af1, 0x2af1, 0x2af2, 0x2af2, 0x2af3, 0x2af3, 0x2af4, + 0x2af4, 0x2af4, 0x2af5, 0x2af5, 0x2af6, 0x2af6, 0x2af7, 0x2af7, + 0x2af8, 0x2af8, 0x2af9, 0x2af9, 0x2afa, 0x2afa, 0x2afb, 0x2afb, + 0x2afb, 0x2afc, 0x2afc, 0x2afd, 0x2afd, 0x2afe, 0x2afe, 0x2aff, + 0x2aff, 0x2b00, 0x2b00, 0x2b01, 0x2b01, 0x2b02, 0x2b02, 0x2b02, + 0x2b03, 0x2b03, 0x2b04, 0x2b04, 0x2b05, 0x2b05, 0x2b06, 0x2b06, + 0x2b07, 0x2b07, 0x2b08, 0x2b08, 0x2b08, 0x2b09, 0x2b09, 0x2b0a, + 0x2b0a, 0x2b0b, 0x2b0b, 0x2b0c, 0x2b0c, 0x2b0d, 0x2b0d, 0x2b0e, + 0x2b0e, 0x2b0e, 0x2b0f, 0x2b0f, 0x2b10, 0x2b10, 0x2b11, 0x2b11, + 0x2b12, 0x2b12, 0x2b13, 0x2b13, 0x2b14, 0x2b14, 0x2b14, 0x2b15, + 0x2b15, 0x2b16, 0x2b16, 0x2b17, 0x2b17, 0x2b18, 0x2b18, 0x2b19, + 0x2b19, 0x2b19, 0x2b1a, 0x2b1a, 0x2b1b, 0x2b1b, 0x2b1c, 0x2b1c, + 0x2b1d, 0x2b1d, 0x2b1e, 0x2b1e, 0x2b1e, 0x2b1f, 0x2b1f, 0x2b20, + 0x2b20, 0x2b21, 0x2b21, 0x2b22, 0x2b22, 0x2b23, 0x2b23, 0x2b23, + 0x2b24, 0x2b24, 0x2b25, 0x2b25, 0x2b26, 0x2b26, 0x2b27, 0x2b27, + 0x2b28, 0x2b28, 0x2b28, 0x2b29, 0x2b29, 0x2b2a, 0x2b2a, 0x2b2b, + 0x2b2b, 0x2b2c, 0x2b2c, 0x2b2d, 0x2b2d, 0x2b2d, 0x2b2e, 0x2b2e, + 0x2b2f, 0x2b2f, 0x2b30, 0x2b30, 0x2b31, 0x2b31, 0x2b31, 0x2b32, + 0x2b32, 0x2b33, 0x2b33, 0x2b34, 0x2b34, 0x2b35, 0x2b35, 0x2b36, + 0x2b36, 0x2b36, 0x2b37, 0x2b37, 0x2b38, 0x2b38, 0x2b39, 0x2b39, + 0x2b3a, 0x2b3a, 0x2b3a, 0x2b3b, 0x2b3b, 0x2b3c, 0x2b3c, 0x2b3d, + 0x2b3d, 0x2b3e, 0x2b3e, 0x2b3e, 0x2b3f, 0x2b3f, 0x2b40, 0x2b40, + 0x2b41, 0x2b41, 0x2b42, 0x2b42, 0x2b42, 0x2b43, 0x2b43, 0x2b44, + 0x2b44, 0x2b45, 0x2b45, 0x2b46, 0x2b46, 0x2b46, 0x2b47, 0x2b47, + 0x2b48, 0x2b48, 0x2b49, 0x2b49, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4b, + 0x2b4b, 0x2b4c, 0x2b4c, 0x2b4d, 0x2b4d, 0x2b4e, 0x2b4e, 0x2b4e, + 0x2b4f, 0x2b4f, 0x2b50, 0x2b50, 0x2b51, 0x2b51, 0x2b52, 0x2b52, + 0x2b52, 0x2b53, 0x2b53, 0x2b54, 0x2b54, 0x2b55, 0x2b55, 0x2b55, + 0x2b56, 0x2b56, 0x2b57, 0x2b57, 0x2b58, 0x2b58, 0x2b59, 0x2b59, + 0x2b59, 0x2b5a, 0x2b5a, 0x2b5b, 0x2b5b, 0x2b5c, 0x2b5c, 0x2b5c, + 0x2b5d, 0x2b5d, 0x2b5e, 0x2b5e, 0x2b5f, 0x2b5f, 0x2b60, 0x2b60, + 0x2b60, 0x2b61, 0x2b61, 0x2b62, 0x2b62, 0x2b63, 0x2b63, 0x2b63, + 0x2b64, 0x2b64, 0x2b65, 0x2b65, 0x2b66, 0x2b66, 0x2b67, 0x2b67, + 0x2b67, 0x2b68, 0x2b68, 0x2b69, 0x2b69, 0x2b6a, 0x2b6a, 0x2b6a, + 0x2b6b, 0x2b6b, 0x2b6c, 0x2b6c, 0x2b6d, 0x2b6d, 0x2b6d, 0x2b6e, + 0x2b6e, 0x2b6f, 0x2b6f, 0x2b70, 0x2b70, 0x2b70, 0x2b71, 0x2b71, + 0x2b72, 0x2b72, 0x2b73, 0x2b73, 0x2b73, 0x2b74, 0x2b74, 0x2b75, + 0x2b75, 0x2b76, 0x2b76, 0x2b77, 0x2b77, 0x2b77, 0x2b78, 0x2b78, + 0x2b79, 0x2b79, 0x2b7a, 0x2b7a, 0x2b7a, 0x2b7b, 0x2b7b, 0x2b7c, + 0x2b7c, 0x2b7d, 0x2b7d, 0x2b7d, 0x2b7e, 0x2b7e, 0x2b7f, 0x2b7f, + 0x2b80, 0x2b80, 0x2b80, 0x2b81, 0x2b81, 0x2b82, 0x2b82, 0x2b83, + 0x2b83, 0x2b84, 0x2b85, 0x2b85, 0x2b86, 0x2b87, 0x2b88, 0x2b89, + 0x2b8a, 0x2b8b, 0x2b8b, 0x2b8c, 0x2b8d, 0x2b8e, 0x2b8f, 0x2b90, + 0x2b91, 0x2b91, 0x2b92, 0x2b93, 0x2b94, 0x2b95, 0x2b96, 0x2b96, + 0x2b97, 0x2b98, 0x2b99, 0x2b9a, 0x2b9b, 0x2b9b, 0x2b9c, 0x2b9d, + 0x2b9e, 0x2b9f, 0x2ba0, 0x2ba1, 0x2ba1, 0x2ba2, 0x2ba3, 0x2ba4, + 0x2ba5, 0x2ba6, 0x2ba6, 0x2ba7, 0x2ba8, 0x2ba9, 0x2baa, 0x2bab, + 0x2bab, 0x2bac, 0x2bad, 0x2bae, 0x2baf, 0x2bb0, 0x2bb0, 0x2bb1, + 0x2bb2, 0x2bb3, 0x2bb4, 0x2bb5, 0x2bb5, 0x2bb6, 0x2bb7, 0x2bb8, + 0x2bb9, 0x2bb9, 0x2bba, 0x2bbb, 0x2bbc, 0x2bbd, 0x2bbe, 0x2bbe, + 0x2bbf, 0x2bc0, 0x2bc1, 0x2bc2, 0x2bc3, 0x2bc3, 0x2bc4, 0x2bc5, + 0x2bc6, 0x2bc7, 0x2bc7, 0x2bc8, 0x2bc9, 0x2bca, 0x2bcb, 0x2bcc, + 0x2bcc, 0x2bcd, 0x2bce, 0x2bcf, 0x2bd0, 0x2bd0, 0x2bd1, 0x2bd2, + 0x2bd3, 0x2bd4, 0x2bd4, 0x2bd5, 0x2bd6, 0x2bd7, 0x2bd8, 0x2bd9, + 0x2bd9, 0x2bda, 0x2bdb, 0x2bdc, 0x2bdd, 0x2bdd, 0x2bde, 0x2bdf, + 0x2be0, 0x2be1, 0x2be1, 0x2be2, 0x2be3, 0x2be4, 0x2be5, 0x2be5, + 0x2be6, 0x2be7, 0x2be8, 0x2be9, 0x2be9, 0x2bea, 0x2beb, 0x2bec, + 0x2bed, 0x2bed, 0x2bee, 0x2bef, 0x2bf0, 0x2bf1, 0x2bf1, 0x2bf2, + 0x2bf3, 0x2bf4, 0x2bf5, 0x2bf5, 0x2bf6, 0x2bf7, 0x2bf8, 0x2bf9, + 0x2bf9, 0x2bfa, 0x2bfb, 0x2bfc, 0x2bfd, 0x2bfd, 0x2bfe, 0x2bff, + 0x2c00, 0x2c00, 0x2c01, 0x2c01, 0x2c01, 0x2c02, 0x2c02, 0x2c03, + 0x2c03, 0x2c03, 0x2c04, 0x2c04, 0x2c05, 0x2c05, 0x2c05, 0x2c06, + 0x2c06, 0x2c07, 0x2c07, 0x2c07, 0x2c08, 0x2c08, 0x2c09, 0x2c09, + 0x2c09, 0x2c0a, 0x2c0a, 0x2c0b, 0x2c0b, 0x2c0b, 0x2c0c, 0x2c0c, + 0x2c0c, 0x2c0d, 0x2c0d, 0x2c0e, 0x2c0e, 0x2c0e, 0x2c0f, 0x2c0f, + 0x2c10, 0x2c10, 0x2c10, 0x2c11, 0x2c11, 0x2c12, 0x2c12, 0x2c12, + 0x2c13, 0x2c13, 0x2c13, 0x2c14, 0x2c14, 0x2c15, 0x2c15, 0x2c15, + 0x2c16, 0x2c16, 0x2c17, 0x2c17, 0x2c17, 0x2c18, 0x2c18, 0x2c18, + 0x2c19, 0x2c19, 0x2c1a, 0x2c1a, 0x2c1a, 0x2c1b, 0x2c1b, 0x2c1c, + 0x2c1c, 0x2c1c, 0x2c1d, 0x2c1d, 0x2c1d, 0x2c1e, 0x2c1e, 0x2c1f, + 0x2c1f, 0x2c1f, 0x2c20, 0x2c20, 0x2c21, 0x2c21, 0x2c21, 0x2c22, + 0x2c22, 0x2c22, 0x2c23, 0x2c23, 0x2c24, 0x2c24, 0x2c24, 0x2c25, + 0x2c25, 0x2c25, 0x2c26, 0x2c26, 0x2c27, 0x2c27, 0x2c27, 0x2c28, + 0x2c28, 0x2c28, 0x2c29, 0x2c29, 0x2c2a, 0x2c2a, 0x2c2a, 0x2c2b, + 0x2c2b, 0x2c2b, 0x2c2c, 0x2c2c, 0x2c2d, 0x2c2d, 0x2c2d, 0x2c2e, + 0x2c2e, 0x2c2f, 0x2c2f, 0x2c2f, 0x2c30, 0x2c30, 0x2c30, 0x2c31, + 0x2c31, 0x2c32, 0x2c32, 0x2c32, 0x2c33, 0x2c33, 0x2c33, 0x2c34, + 0x2c34, 0x2c34, 0x2c35, 0x2c35, 0x2c36, 0x2c36, 0x2c36, 0x2c37, + 0x2c37, 0x2c37, 0x2c38, 0x2c38, 0x2c39, 0x2c39, 0x2c39, 0x2c3a, + 0x2c3a, 0x2c3a, 0x2c3b, 0x2c3b, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3d, + 0x2c3d, 0x2c3d, 0x2c3e, 0x2c3e, 0x2c3e, 0x2c3f, 0x2c3f, 0x2c40, + 0x2c40, 0x2c40, 0x2c41, 0x2c41, 0x2c41, 0x2c42, 0x2c42, 0x2c43, + 0x2c43, 0x2c43, 0x2c44, 0x2c44, 0x2c44, 0x2c45, 0x2c45, 0x2c45, + 0x2c46, 0x2c46, 0x2c47, 0x2c47, 0x2c47, 0x2c48, 0x2c48, 0x2c48, + 0x2c49, 0x2c49, 0x2c49, 0x2c4a, 0x2c4a, 0x2c4b, 0x2c4b, 0x2c4b, + 0x2c4c, 0x2c4c, 0x2c4c, 0x2c4d, 0x2c4d, 0x2c4d, 0x2c4e, 0x2c4e, + 0x2c4f, 0x2c4f, 0x2c4f, 0x2c50, 0x2c50, 0x2c50, 0x2c51, 0x2c51, + 0x2c51, 0x2c52, 0x2c52, 0x2c53, 0x2c53, 0x2c53, 0x2c54, 0x2c54, + 0x2c54, 0x2c55, 0x2c55, 0x2c55, 0x2c56, 0x2c56, 0x2c56, 0x2c57, + 0x2c57, 0x2c58, 0x2c58, 0x2c58, 0x2c59, 0x2c59, 0x2c59, 0x2c5a, + 0x2c5a, 0x2c5a, 0x2c5b, 0x2c5b, 0x2c5c, 0x2c5c, 0x2c5c, 0x2c5d, + 0x2c5d, 0x2c5d, 0x2c5e, 0x2c5e, 0x2c5e, 0x2c5f, 0x2c5f, 0x2c5f, + 0x2c60, 0x2c60, 0x2c60, 0x2c61, 0x2c61, 0x2c62, 0x2c62, 0x2c62, + 0x2c63, 0x2c63, 0x2c63, 0x2c64, 0x2c64, 0x2c64, 0x2c65, 0x2c65, + 0x2c65, 0x2c66, 0x2c66, 0x2c67, 0x2c67, 0x2c67, 0x2c68, 0x2c68, + 0x2c68, 0x2c69, 0x2c69, 0x2c69, 0x2c6a, 0x2c6a, 0x2c6a, 0x2c6b, + 0x2c6b, 0x2c6b, 0x2c6c, 0x2c6c, 0x2c6c, 0x2c6d, 0x2c6d, 0x2c6e, + 0x2c6e, 0x2c6e, 0x2c6f, 0x2c6f, 0x2c6f, 0x2c70, 0x2c70, 0x2c70, + 0x2c71, 0x2c71, 0x2c71, 0x2c72, 0x2c72, 0x2c72, 0x2c73, 0x2c73, + 0x2c73, 0x2c74, 0x2c74, 0x2c75, 0x2c75, 0x2c75, 0x2c76, 0x2c76, + 0x2c76, 0x2c77, 0x2c77, 0x2c77, 0x2c78, 0x2c78, 0x2c78, 0x2c79, + 0x2c79, 0x2c79, 0x2c7a, 0x2c7a, 0x2c7a, 0x2c7b, 0x2c7b, 0x2c7b, + 0x2c7c, 0x2c7c, 0x2c7c, 0x2c7d, 0x2c7d, 0x2c7e, 0x2c7e, 0x2c7e, + 0x2c7f, 0x2c7f, 0x2c7f, 0x2c80, 0x2c80, 0x2c80, 0x2c81, 0x2c81, + 0x2c81, 0x2c82, 0x2c82, 0x2c82, 0x2c83, 0x2c83, 0x2c83, 0x2c84, + 0x2c84, 0x2c84, 0x2c85, 0x2c85, 0x2c85, 0x2c86, 0x2c86, 0x2c86, + 0x2c87, 0x2c87, 0x2c87, 0x2c88, 0x2c88, 0x2c88, 0x2c89, 0x2c89, + 0x2c8a, 0x2c8a, 0x2c8a, 0x2c8b, 0x2c8b, 0x2c8b, 0x2c8c, 0x2c8c, + 0x2c8c, 0x2c8d, 0x2c8d, 0x2c8d, 0x2c8e, 0x2c8e, 0x2c8e, 0x2c8f, + 0x2c8f, 0x2c8f, 0x2c90, 0x2c90, 0x2c90, 0x2c91, 0x2c91, 0x2c91, + 0x2c92, 0x2c92, 0x2c92, 0x2c93, 0x2c93, 0x2c93, 0x2c94, 0x2c94, + 0x2c94, 0x2c95, 0x2c95, 0x2c95, 0x2c96, 0x2c96, 0x2c96, 0x2c97, + 0x2c97, 0x2c97, 0x2c98, 0x2c98, 0x2c98, 0x2c99, 0x2c99, 0x2c99, + 0x2c9a, 0x2c9a, 0x2c9a, 0x2c9b, 0x2c9b, 0x2c9b, 0x2c9c, 0x2c9c, + 0x2c9c, 0x2c9d, 0x2c9d, 0x2c9d, 0x2c9e, 0x2c9e, 0x2c9e, 0x2c9f, + 0x2c9f, 0x2c9f, 0x2ca0, 0x2ca0, 0x2ca0, 0x2ca1, 0x2ca1, 0x2ca1, + 0x2ca2, 0x2ca2, 0x2ca2, 0x2ca3, 0x2ca3, 0x2ca3, 0x2ca4, 0x2ca4, + 0x2ca4, 0x2ca5, 0x2ca5, 0x2ca5, 0x2ca6, 0x2ca6, 0x2ca6, 0x2ca7, + 0x2ca7, 0x2ca7, 0x2ca8, 0x2ca8, 0x2ca8, 0x2ca9, 0x2ca9, 0x2ca9, + 0x2caa, 0x2caa, 0x2caa, 0x2cab, 0x2cab, 0x2cab, 0x2cac, 0x2cac, + 0x2cac, 0x2cad, 0x2cad, 0x2cad, 0x2cae, 0x2cae, 0x2cae, 0x2caf, + 0x2caf, 0x2caf, 0x2cb0, 0x2cb0, 0x2cb0, 0x2cb1, 0x2cb1, 0x2cb1, + 0x2cb1, 0x2cb2, 0x2cb2, 0x2cb2, 0x2cb3, 0x2cb3, 0x2cb3, 0x2cb4, + 0x2cb4, 0x2cb4, 0x2cb5, 0x2cb5, 0x2cb5, 0x2cb6, 0x2cb6, 0x2cb6, + 0x2cb7, 0x2cb7, 0x2cb7, 0x2cb8, 0x2cb8, 0x2cb8, 0x2cb9, 0x2cb9, + 0x2cb9, 0x2cba, 0x2cba, 0x2cba, 0x2cbb, 0x2cbb, 0x2cbb, 0x2cbc, + 0x2cbc, 0x2cbc, 0x2cbd, 0x2cbd, 0x2cbd, 0x2cbe, 0x2cbe, 0x2cbe, + 0x2cbe, 0x2cbf, 0x2cbf, 0x2cbf, 0x2cc0, 0x2cc0, 0x2cc0, 0x2cc1, + 0x2cc1, 0x2cc1, 0x2cc2, 0x2cc2, 0x2cc2, 0x2cc3, 0x2cc3, 0x2cc3, + 0x2cc4, 0x2cc4, 0x2cc4, 0x2cc5, 0x2cc5, 0x2cc5, 0x2cc6, 0x2cc6, + 0x2cc6, 0x2cc7, 0x2cc7, 0x2cc7, 0x2cc7, 0x2cc8, 0x2cc8, 0x2cc8, + 0x2cc9, 0x2cc9, 0x2cc9, 0x2cca, 0x2cca, 0x2cca, 0x2ccb, 0x2ccb, + 0x2ccb, 0x2ccc, 0x2ccc, 0x2ccc, 0x2ccd, 0x2ccd, 0x2ccd, 0x2cce, + 0x2cce, 0x2cce, 0x2cce, 0x2ccf, 0x2ccf, 0x2ccf, 0x2cd0, 0x2cd0, + 0x2cd0, 0x2cd1, 0x2cd1, 0x2cd1, 0x2cd2, 0x2cd2, 0x2cd2, 0x2cd3, + 0x2cd3, 0x2cd3, 0x2cd4, 0x2cd4, 0x2cd4, 0x2cd4, 0x2cd5, 0x2cd5, + 0x2cd5, 0x2cd6, 0x2cd6, 0x2cd6, 0x2cd7, 0x2cd7, 0x2cd7, 0x2cd8, + 0x2cd8, 0x2cd8, 0x2cd9, 0x2cd9, 0x2cd9, 0x2cda, 0x2cda, 0x2cda, + 0x2cda, 0x2cdb, 0x2cdb, 0x2cdb, 0x2cdc, 0x2cdc, 0x2cdc, 0x2cdd, + 0x2cdd, 0x2cdd, 0x2cde, 0x2cde, 0x2cde, 0x2cdf, 0x2cdf, 0x2cdf, + 0x2cdf, 0x2ce0, 0x2ce0, 0x2ce0, 0x2ce1, 0x2ce1, 0x2ce1, 0x2ce2, + 0x2ce2, 0x2ce2, 0x2ce3, 0x2ce3, 0x2ce3, 0x2ce4, 0x2ce4, 0x2ce4, + 0x2ce4, 0x2ce5, 0x2ce5, 0x2ce5, 0x2ce6, 0x2ce6, 0x2ce6, 0x2ce7, + 0x2ce7, 0x2ce7, 0x2ce8, 0x2ce8, 0x2ce8, 0x2ce8, 0x2ce9, 0x2ce9, + 0x2ce9, 0x2cea, 0x2cea, 0x2cea, 0x2ceb, 0x2ceb, 0x2ceb, 0x2cec, + 0x2cec, 0x2cec, 0x2ced, 0x2ced, 0x2ced, 0x2ced, 0x2cee, 0x2cee, + 0x2cee, 0x2cef, 0x2cef, 0x2cef, 0x2cf0, 0x2cf0, 0x2cf0, 0x2cf1, + 0x2cf1, 0x2cf1, 0x2cf1, 0x2cf2, 0x2cf2, 0x2cf2, 0x2cf3, 0x2cf3, + 0x2cf3, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf4, 0x2cf5, 0x2cf5, 0x2cf5, + 0x2cf6, 0x2cf6, 0x2cf6, 0x2cf7, 0x2cf7, 0x2cf7, 0x2cf8, 0x2cf8, + 0x2cf8, 0x2cf8, 0x2cf9, 0x2cf9, 0x2cf9, 0x2cfa, 0x2cfa, 0x2cfa, + 0x2cfb, 0x2cfb, 0x2cfb, 0x2cfc, 0x2cfc, 0x2cfc, 0x2cfc, 0x2cfd, + 0x2cfd, 0x2cfd, 0x2cfe, 0x2cfe, 0x2cfe, 0x2cff, 0x2cff, 0x2cff, + 0x2cff, 0x2d00, 0x2d00, 0x2d00, 0x2d01, 0x2d01, 0x2d01, 0x2d02, + 0x2d02, 0x2d02, 0x2d02, 0x2d03, 0x2d03, 0x2d03, 0x2d04, 0x2d04, + 0x2d04, 0x2d05, 0x2d05, 0x2d05, 0x2d05, 0x2d06, 0x2d06, 0x2d06, + 0x2d07, 0x2d07, 0x2d07, 0x2d08, 0x2d08, 0x2d08, 0x2d09, 0x2d09, + 0x2d09, 0x2d09, 0x2d0a, 0x2d0a, 0x2d0a, 0x2d0b, 0x2d0b, 0x2d0b, + 0x2d0c, 0x2d0c, 0x2d0c, 0x2d0c, 0x2d0d, 0x2d0d, 0x2d0d, 0x2d0e, + 0x2d0e, 0x2d0e, 0x2d0e, 0x2d0f, 0x2d0f, 0x2d0f, 0x2d10, 0x2d10, + 0x2d10, 0x2d11, 0x2d11, 0x2d11, 0x2d11, 0x2d12, 0x2d12, 0x2d12, + 0x2d13, 0x2d13, 0x2d13, 0x2d14, 0x2d14, 0x2d14, 0x2d14, 0x2d15, + 0x2d15, 0x2d15, 0x2d16, 0x2d16, 0x2d16, 0x2d17, 0x2d17, 0x2d17, + 0x2d17, 0x2d18, 0x2d18, 0x2d18, 0x2d19, 0x2d19, 0x2d19, 0x2d19, + 0x2d1a, 0x2d1a, 0x2d1a, 0x2d1b, 0x2d1b, 0x2d1b, 0x2d1c, 0x2d1c, + 0x2d1c, 0x2d1c, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1e, 0x2d1e, 0x2d1e, + 0x2d1f, 0x2d1f, 0x2d1f, 0x2d1f, 0x2d20, 0x2d20, 0x2d20, 0x2d21, + 0x2d21, 0x2d21, 0x2d21, 0x2d22, 0x2d22, 0x2d22, 0x2d23, 0x2d23, + 0x2d23, 0x2d23, 0x2d24, 0x2d24, 0x2d24, 0x2d25, 0x2d25, 0x2d25, + 0x2d26, 0x2d26, 0x2d27, 0x2d27, 0x2d28, 0x2d28, 0x2d29, 0x2d2a, + 0x2d2a, 0x2d2b, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2d, 0x2d2e, 0x2d2e, + 0x2d2f, 0x2d2f, 0x2d30, 0x2d31, 0x2d31, 0x2d32, 0x2d32, 0x2d33, + 0x2d33, 0x2d34, 0x2d35, 0x2d35, 0x2d36, 0x2d36, 0x2d37, 0x2d38, + 0x2d38, 0x2d39, 0x2d39, 0x2d3a, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3c, + 0x2d3d, 0x2d3d, 0x2d3e, 0x2d3e, 0x2d3f, 0x2d40, 0x2d40, 0x2d41, + 0x2d41, 0x2d42, 0x2d42, 0x2d43, 0x2d44, 0x2d44, 0x2d45, 0x2d45, + 0x2d46, 0x2d46, 0x2d47, 0x2d48, 0x2d48, 0x2d49, 0x2d49, 0x2d4a, + 0x2d4a, 0x2d4b, 0x2d4b, 0x2d4c, 0x2d4d, 0x2d4d, 0x2d4e, 0x2d4e, + 0x2d4f, 0x2d4f, 0x2d50, 0x2d51, 0x2d51, 0x2d52, 0x2d52, 0x2d53, + 0x2d53, 0x2d54, 0x2d54, 0x2d55, 0x2d56, 0x2d56, 0x2d57, 0x2d57, + 0x2d58, 0x2d58, 0x2d59, 0x2d5a, 0x2d5a, 0x2d5b, 0x2d5b, 0x2d5c, + 0x2d5c, 0x2d5d, 0x2d5d, 0x2d5e, 0x2d5f, 0x2d5f, 0x2d60, 0x2d60, + 0x2d61, 0x2d61, 0x2d62, 0x2d62, 0x2d63, 0x2d64, 0x2d64, 0x2d65, + 0x2d65, 0x2d66, 0x2d66, 0x2d67, 0x2d67, 0x2d68, 0x2d69, 0x2d69, + 0x2d6a, 0x2d6a, 0x2d6b, 0x2d6b, 0x2d6c, 0x2d6c, 0x2d6d, 0x2d6d, + 0x2d6e, 0x2d6f, 0x2d6f, 0x2d70, 0x2d70, 0x2d71, 0x2d71, 0x2d72, + 0x2d72, 0x2d73, 0x2d73, 0x2d74, 0x2d75, 0x2d75, 0x2d76, 0x2d76, + 0x2d77, 0x2d77, 0x2d78, 0x2d78, 0x2d79, 0x2d79, 0x2d7a, 0x2d7b, + 0x2d7b, 0x2d7c, 0x2d7c, 0x2d7d, 0x2d7d, 0x2d7e, 0x2d7e, 0x2d7f, + 0x2d7f, 0x2d80, 0x2d81, 0x2d81, 0x2d82, 0x2d82, 0x2d83, 0x2d83, + 0x2d84, 0x2d84, 0x2d85, 0x2d85, 0x2d86, 0x2d86, 0x2d87, 0x2d88, + 0x2d88, 0x2d89, 0x2d89, 0x2d8a, 0x2d8a, 0x2d8b, 0x2d8b, 0x2d8c, + 0x2d8c, 0x2d8d, 0x2d8d, 0x2d8e, 0x2d8e, 0x2d8f, 0x2d90, 0x2d90, + 0x2d91, 0x2d91, 0x2d92, 0x2d92, 0x2d93, 0x2d93, 0x2d94, 0x2d94, + 0x2d95, 0x2d95, 0x2d96, 0x2d96, 0x2d97, 0x2d97, 0x2d98, 0x2d99, + 0x2d99, 0x2d9a, 0x2d9a, 0x2d9b, 0x2d9b, 0x2d9c, 0x2d9c, 0x2d9d, + 0x2d9d, 0x2d9e, 0x2d9e, 0x2d9f, 0x2d9f, 0x2da0, 0x2da0, 0x2da1, + 0x2da2, 0x2da2, 0x2da3, 0x2da3, 0x2da4, 0x2da4, 0x2da5, 0x2da5, + 0x2da6, 0x2da6, 0x2da7, 0x2da7, 0x2da8, 0x2da8, 0x2da9, 0x2da9, + 0x2daa, 0x2daa, 0x2dab, 0x2dab, 0x2dac, 0x2dac, 0x2dad, 0x2dae, + 0x2dae, 0x2daf, 0x2daf, 0x2db0, 0x2db0, 0x2db1, 0x2db1, 0x2db2, + 0x2db2, 0x2db3, 0x2db3, 0x2db4, 0x2db4, 0x2db5, 0x2db5, 0x2db6, + 0x2db6, 0x2db7, 0x2db7, 0x2db8, 0x2db8, 0x2db9, 0x2db9, 0x2dba, + 0x2dba, 0x2dbb, 0x2dbb, 0x2dbc, 0x2dbd, 0x2dbd, 0x2dbe, 0x2dbe, + 0x2dbf, 0x2dbf, 0x2dc0, 0x2dc0, 0x2dc1, 0x2dc1, 0x2dc2, 0x2dc2, + 0x2dc3, 0x2dc3, 0x2dc4, 0x2dc4, 0x2dc5, 0x2dc5, 0x2dc6, 0x2dc6, + 0x2dc7, 0x2dc7, 0x2dc8, 0x2dc8, 0x2dc9, 0x2dc9, 0x2dca, 0x2dca, + 0x2dcb, 0x2dcb, 0x2dcc, 0x2dcc, 0x2dcd, 0x2dcd, 0x2dce, 0x2dce, + 0x2dcf, 0x2dcf, 0x2dd0, 0x2dd0, 0x2dd1, 0x2dd1, 0x2dd2, 0x2dd2, + 0x2dd3, 0x2dd3, 0x2dd4, 0x2dd4, 0x2dd5, 0x2dd5, 0x2dd6, 0x2dd6, + 0x2dd7, 0x2dd7, 0x2dd8, 0x2dd8, 0x2dd9, 0x2dd9, 0x2dda, 0x2dda, + 0x2ddb, 0x2ddb, 0x2ddc, 0x2ddc, 0x2ddd, 0x2ddd, 0x2dde, 0x2dde, + 0x2ddf, 0x2ddf, 0x2de0, 0x2de0, 0x2de1, 0x2de1, 0x2de2, 0x2de2, + 0x2de3, 0x2de3, 0x2de4, 0x2de4, 0x2de5, 0x2de5, 0x2de6, 0x2de6, + 0x2de7, 0x2de7, 0x2de8, 0x2de8, 0x2de9, 0x2de9, 0x2dea, 0x2dea, + 0x2deb, 0x2deb, 0x2dec, 0x2dec, 0x2ded, 0x2ded, 0x2dee, 0x2dee, + 0x2def, 0x2def, 0x2df0, 0x2df0, 0x2df1, 0x2df1, 0x2df2, 0x2df2, + 0x2df3, 0x2df3, 0x2df4, 0x2df4, 0x2df5, 0x2df5, 0x2df6, 0x2df6, + 0x2df7, 0x2df7, 0x2df8, 0x2df8, 0x2df9, 0x2df9, 0x2dfa, 0x2dfa, + 0x2dfb, 0x2dfb, 0x2dfc, 0x2dfc, 0x2dfd, 0x2dfd, 0x2dfe, 0x2dfe, + 0x2dfe, 0x2dff, 0x2dff, 0x2e00, 0x2e00, 0x2e01, 0x2e01, 0x2e02, + 0x2e02, 0x2e03, 0x2e03, 0x2e04, 0x2e04, 0x2e05, 0x2e05, 0x2e06, + 0x2e06, 0x2e07, 0x2e07, 0x2e08, 0x2e08, 0x2e09, 0x2e09, 0x2e0a, + 0x2e0a, 0x2e0b, 0x2e0b, 0x2e0c, 0x2e0c, 0x2e0d, 0x2e0d, 0x2e0e, + 0x2e0e, 0x2e0e, 0x2e0f, 0x2e0f, 0x2e10, 0x2e10, 0x2e11, 0x2e11, + 0x2e12, 0x2e12, 0x2e13, 0x2e13, 0x2e14, 0x2e14, 0x2e15, 0x2e15, + 0x2e16, 0x2e16, 0x2e17, 0x2e17, 0x2e18, 0x2e18, 0x2e19, 0x2e19, + 0x2e19, 0x2e1a, 0x2e1a, 0x2e1b, 0x2e1b, 0x2e1c, 0x2e1c, 0x2e1d, + 0x2e1d, 0x2e1e, 0x2e1e, 0x2e1f, 0x2e1f, 0x2e20, 0x2e20, 0x2e21, + 0x2e21, 0x2e22, 0x2e22, 0x2e23, 0x2e23, 0x2e23, 0x2e24, 0x2e24, + 0x2e25, 0x2e25, 0x2e26, 0x2e26, 0x2e27, 0x2e27, 0x2e28, 0x2e28, + 0x2e29, 0x2e29, 0x2e2a, 0x2e2a, 0x2e2b, 0x2e2b, 0x2e2b, 0x2e2c, + 0x2e2c, 0x2e2d, 0x2e2d, 0x2e2e, 0x2e2e, 0x2e2f, 0x2e2f, 0x2e30, + 0x2e30, 0x2e31, 0x2e31, 0x2e32, 0x2e32, 0x2e33, 0x2e33, 0x2e33, + 0x2e34, 0x2e34, 0x2e35, 0x2e35, 0x2e36, 0x2e36, 0x2e37, 0x2e37, + 0x2e38, 0x2e38, 0x2e39, 0x2e39, 0x2e3a, 0x2e3a, 0x2e3a, 0x2e3b, + 0x2e3b, 0x2e3c, 0x2e3c, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3f, + 0x2e3f, 0x2e40, 0x2e40, 0x2e40, 0x2e41, 0x2e41, 0x2e42, 0x2e42, + 0x2e43, 0x2e43, 0x2e44, 0x2e44, 0x2e45, 0x2e45, 0x2e46, 0x2e46, + 0x2e47, 0x2e47, 0x2e47, 0x2e48, 0x2e48, 0x2e49, 0x2e49, 0x2e4a, + 0x2e4a, 0x2e4b, 0x2e4b, 0x2e4c, 0x2e4c, 0x2e4c, 0x2e4d, 0x2e4d, + 0x2e4e, 0x2e4e, 0x2e4f, 0x2e4f, 0x2e50, 0x2e50, 0x2e51, 0x2e51, + 0x2e52, 0x2e52, 0x2e52, 0x2e53, 0x2e53, 0x2e54, 0x2e54, 0x2e55, + 0x2e55, 0x2e56, 0x2e56, 0x2e57, 0x2e57, 0x2e57, 0x2e58, 0x2e58, + 0x2e59, 0x2e59, 0x2e5a, 0x2e5a, 0x2e5b, 0x2e5b, 0x2e5c, 0x2e5c, + 0x2e5c, 0x2e5d, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5f, 0x2e5f, 0x2e60, + 0x2e60, 0x2e61, 0x2e61, 0x2e61, 0x2e62, 0x2e62, 0x2e63, 0x2e63, + 0x2e64, 0x2e64, 0x2e65, 0x2e65, 0x2e65, 0x2e66, 0x2e66, 0x2e67, + 0x2e67, 0x2e68, 0x2e68, 0x2e69, 0x2e69, 0x2e6a, 0x2e6a, 0x2e6a, + 0x2e6b, 0x2e6b, 0x2e6c, 0x2e6c, 0x2e6d, 0x2e6d, 0x2e6e, 0x2e6e, + 0x2e6e, 0x2e6f, 0x2e6f, 0x2e70, 0x2e70, 0x2e71, 0x2e71, 0x2e72, + 0x2e72, 0x2e72, 0x2e73, 0x2e73, 0x2e74, 0x2e74, 0x2e75, 0x2e75, + 0x2e76, 0x2e76, 0x2e77, 0x2e77, 0x2e77, 0x2e78, 0x2e78, 0x2e79, + 0x2e79, 0x2e7a, 0x2e7a, 0x2e7b, 0x2e7b, 0x2e7b, 0x2e7c, 0x2e7c, + 0x2e7d, 0x2e7d, 0x2e7e, 0x2e7e, 0x2e7e, 0x2e7f, 0x2e7f, 0x2e80, + 0x2e80, 0x2e81, 0x2e81, 0x2e82, 0x2e82, 0x2e82, 0x2e83, 0x2e83, + 0x2e84, 0x2e84, 0x2e85, 0x2e85, 0x2e86, 0x2e86, 0x2e86, 0x2e87, + 0x2e87, 0x2e88, 0x2e88, 0x2e89, 0x2e89, 0x2e8a, 0x2e8a, 0x2e8a, + 0x2e8b, 0x2e8b, 0x2e8c, 0x2e8c, 0x2e8d, 0x2e8d, 0x2e8d, 0x2e8e, + 0x2e8e, 0x2e8f, 0x2e8f, 0x2e90, 0x2e90, 0x2e91, 0x2e91, 0x2e91, + 0x2e92, 0x2e92, 0x2e93, 0x2e93, 0x2e94, 0x2e94, 0x2e94, 0x2e95, + 0x2e95, 0x2e96, 0x2e96, 0x2e97, 0x2e97, 0x2e97, 0x2e98, 0x2e98, + 0x2e99, 0x2e99, 0x2e9a, 0x2e9a, 0x2e9b, 0x2e9b, 0x2e9b, 0x2e9c, + 0x2e9c, 0x2e9d, 0x2e9d, 0x2e9e, 0x2e9e, 0x2e9e, 0x2e9f, 0x2e9f, + 0x2ea0, 0x2ea0, 0x2ea1, 0x2ea1, 0x2ea1, 0x2ea2, 0x2ea2, 0x2ea3, + 0x2ea3, 0x2ea4, 0x2ea4, 0x2ea4, 0x2ea5, 0x2ea5, 0x2ea6, 0x2ea6, + 0x2ea7, 0x2ea7, 0x2ea7, 0x2ea8, 0x2ea8, 0x2ea9, 0x2ea9, 0x2eaa, + 0x2eaa, 0x2eaa, 0x2eab, 0x2eab, 0x2eac, 0x2eac, 0x2ead, 0x2ead, + 0x2ead, 0x2eae, 0x2eae, 0x2eaf, 0x2eaf, 0x2eb0, 0x2eb0, 0x2eb0, + 0x2eb1, 0x2eb1, 0x2eb2, 0x2eb2, 0x2eb3, 0x2eb3, 0x2eb3, 0x2eb4, + 0x2eb4, 0x2eb5, 0x2eb5, 0x2eb6, 0x2eb6, 0x2eb6, 0x2eb7, 0x2eb7, + 0x2eb8, 0x2eb8, 0x2eb9, 0x2eb9, 0x2eb9, 0x2eba, 0x2eba, 0x2ebb, + 0x2ebb, 0x2ebc, 0x2ebc, 0x2ebc, 0x2ebd, 0x2ebd, 0x2ebe, 0x2ebe, + 0x2ebe, 0x2ebf, 0x2ebf, 0x2ec0, 0x2ec0, 0x2ec1, 0x2ec1, 0x2ec1, + 0x2ec2, 0x2ec2, 0x2ec3, 0x2ec3, 0x2ec4, 0x2ec4, 0x2ec4, 0x2ec5, + 0x2ec5, 0x2ec6, 0x2ec6, 0x2ec7, 0x2ec7, 0x2ec7, 0x2ec8, 0x2ec8, + 0x2ec9, 0x2ec9, 0x2ec9, 0x2eca, 0x2eca, 0x2ecb, 0x2ecb, 0x2ecc, + 0x2ecc, 0x2ecc, 0x2ecd, 0x2ecd, 0x2ece, 0x2ece, 0x2ece, 0x2ecf, + 0x2ecf, 0x2ed0, 0x2ed0, 0x2ed1, 0x2ed1, 0x2ed1, 0x2ed2, 0x2ed2, + 0x2ed3, 0x2ed3, 0x2ed3, 0x2ed4, 0x2ed4, 0x2ed5, 0x2ed5, 0x2ed6, + 0x2ed6, 0x2ed6, 0x2ed7, 0x2ed7, 0x2ed8, 0x2ed8, 0x2ed8, 0x2ed9, + 0x2ed9, 0x2eda, 0x2eda, 0x2edb, 0x2edb, 0x2edb, 0x2edc, 0x2edc, + 0x2edd, 0x2edd, 0x2edd, 0x2ede, 0x2ede, 0x2edf, 0x2edf, 0x2ee0, + 0x2ee0, 0x2ee0, 0x2ee1, 0x2ee1, 0x2ee2, 0x2ee2, 0x2ee2, 0x2ee3, + 0x2ee3, 0x2ee4, 0x2ee4, 0x2ee4, 0x2ee5, 0x2ee5, 0x2ee6, 0x2ee6, + 0x2ee7, 0x2ee7, 0x2ee7, 0x2ee8, 0x2ee8, 0x2ee9, 0x2ee9, 0x2ee9, + 0x2eea, 0x2eea, 0x2eeb, 0x2eeb, 0x2eeb, 0x2eec, 0x2eec, 0x2eed, + 0x2eed, 0x2eee, 0x2eee, 0x2eee, 0x2eef, 0x2eef, 0x2ef0, 0x2ef0, + 0x2ef0, 0x2ef1, 0x2ef1, 0x2ef2, 0x2ef2, 0x2ef2, 0x2ef3, 0x2ef3, + 0x2ef4, 0x2ef4, 0x2ef4, 0x2ef5, 0x2ef5, 0x2ef6, 0x2ef6, 0x2ef6, + 0x2ef7, 0x2ef7, 0x2ef8, 0x2ef8, 0x2ef9, 0x2ef9, 0x2ef9, 0x2efa, + 0x2efa, 0x2efb, 0x2efb, 0x2efb, 0x2efc, 0x2efc, 0x2efd, 0x2efd, + 0x2efd, 0x2efe, 0x2efe, 0x2eff, 0x2eff, 0x2eff, 0x2f00, 0x2f00, + 0x2f01, 0x2f01, 0x2f01, 0x2f02, 0x2f02, 0x2f03, 0x2f03, 0x2f03, + 0x2f04, 0x2f04, 0x2f05, 0x2f05, 0x2f05, 0x2f06, 0x2f06, 0x2f07, + 0x2f07, 0x2f07, 0x2f08, 0x2f08, 0x2f09, 0x2f09, 0x2f09, 0x2f0a, + 0x2f0a, 0x2f0b, 0x2f0b, 0x2f0b, 0x2f0c, 0x2f0c, 0x2f0d, 0x2f0d, + 0x2f0d, 0x2f0e, 0x2f0f, 0x2f10, 0x2f11, 0x2f12, 0x2f12, 0x2f13, + 0x2f14, 0x2f15, 0x2f15, 0x2f16, 0x2f17, 0x2f18, 0x2f19, 0x2f19, + 0x2f1a, 0x2f1b, 0x2f1c, 0x2f1d, 0x2f1d, 0x2f1e, 0x2f1f, 0x2f20, + 0x2f21, 0x2f21, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f25, 0x2f26, + 0x2f27, 0x2f28, 0x2f29, 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f2c, + 0x2f2d, 0x2f2e, 0x2f2f, 0x2f30, 0x2f30, 0x2f31, 0x2f32, 0x2f33, + 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, 0x2f37, 0x2f38, 0x2f39, + 0x2f3a, 0x2f3b, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3e, 0x2f3f, + 0x2f40, 0x2f41, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f45, + 0x2f46, 0x2f47, 0x2f48, 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x2f4c, + 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, 0x2f4f, 0x2f50, 0x2f51, 0x2f52, + 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f56, 0x2f57, 0x2f58, + 0x2f59, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5c, 0x2f5d, 0x2f5e, + 0x2f5f, 0x2f5f, 0x2f60, 0x2f61, 0x2f62, 0x2f62, 0x2f63, 0x2f64, + 0x2f65, 0x2f65, 0x2f66, 0x2f67, 0x2f68, 0x2f69, 0x2f69, 0x2f6a, + 0x2f6b, 0x2f6c, 0x2f6c, 0x2f6d, 0x2f6e, 0x2f6f, 0x2f6f, 0x2f70, + 0x2f71, 0x2f72, 0x2f72, 0x2f73, 0x2f74, 0x2f75, 0x2f75, 0x2f76, + 0x2f77, 0x2f78, 0x2f78, 0x2f79, 0x2f7a, 0x2f7b, 0x2f7b, 0x2f7c, + 0x2f7d, 0x2f7e, 0x2f7e, 0x2f7f, 0x2f80, 0x2f81, 0x2f81, 0x2f82, + 0x2f83, 0x2f83, 0x2f84, 0x2f85, 0x2f86, 0x2f86, 0x2f87, 0x2f88, + 0x2f89, 0x2f89, 0x2f8a, 0x2f8b, 0x2f8c, 0x2f8c, 0x2f8d, 0x2f8e, + 0x2f8f, 0x2f8f, 0x2f90, 0x2f91, 0x2f92, 0x2f92, 0x2f93, 0x2f94, + 0x2f94, 0x2f95, 0x2f96, 0x2f97, 0x2f97, 0x2f98, 0x2f99, 0x2f9a, + 0x2f9a, 0x2f9b, 0x2f9c, 0x2f9d, 0x2f9d, 0x2f9e, 0x2f9f, 0x2f9f, + 0x2fa0, 0x2fa1, 0x2fa2, 0x2fa2, 0x2fa3, 0x2fa4, 0x2fa5, 0x2fa5, + 0x2fa6, 0x2fa7, 0x2fa7, 0x2fa8, 0x2fa9, 0x2faa, 0x2faa, 0x2fab, + 0x2fac, 0x2fad, 0x2fad, 0x2fae, 0x2faf, 0x2faf, 0x2fb0, 0x2fb1, + 0x2fb2, 0x2fb2, 0x2fb3, 0x2fb4, 0x2fb4, 0x2fb5, 0x2fb6, 0x2fb7, + 0x2fb7, 0x2fb8, 0x2fb9, 0x2fba, 0x2fba, 0x2fbb, 0x2fbc, 0x2fbc, + 0x2fbd, 0x2fbe, 0x2fbf, 0x2fbf, 0x2fc0, 0x2fc1, 0x2fc1, 0x2fc2, + 0x2fc3, 0x2fc4, 0x2fc4, 0x2fc5, 0x2fc6, 0x2fc6, 0x2fc7, 0x2fc8, + 0x2fc9, 0x2fc9, 0x2fca, 0x2fcb, 0x2fcb, 0x2fcc, 0x2fcd, 0x2fce, + 0x2fce, 0x2fcf, 0x2fd0, 0x2fd0, 0x2fd1, 0x2fd2, 0x2fd2, 0x2fd3, + 0x2fd4, 0x2fd5, 0x2fd5, 0x2fd6, 0x2fd7, 0x2fd7, 0x2fd8, 0x2fd9, + 0x2fda, 0x2fda, 0x2fdb, 0x2fdc, 0x2fdc, 0x2fdd, 0x2fde, 0x2fde, + 0x2fdf, 0x2fe0, 0x2fe1, 0x2fe1, 0x2fe2, 0x2fe3, 0x2fe3, 0x2fe4, + 0x2fe5, 0x2fe5, 0x2fe6, 0x2fe7, 0x2fe8, 0x2fe8, 0x2fe9, 0x2fea, + 0x2fea, 0x2feb, 0x2fec, 0x2fec, 0x2fed, 0x2fee, 0x2fef, 0x2fef, + 0x2ff0, 0x2ff1, 0x2ff1, 0x2ff2, 0x2ff3, 0x2ff3, 0x2ff4, 0x2ff5, + 0x2ff6, 0x2ff6, 0x2ff7, 0x2ff8, 0x2ff8, 0x2ff9, 0x2ffa, 0x2ffa, + 0x2ffb, 0x2ffc, 0x2ffc, 0x2ffd, 0x2ffe, 0x2fff, 0x2fff, 0x3000, + 0x3000, 0x3001, 0x3001, 0x3001, 0x3002, 0x3002, 0x3002, 0x3003, + 0x3003, 0x3003, 0x3004, 0x3004, 0x3004, 0x3005, 0x3005, 0x3005, + 0x3006, 0x3006, 0x3006, 0x3007, 0x3007, 0x3007, 0x3008, 0x3008, + 0x3009, 0x3009, 0x3009, 0x300a, 0x300a, 0x300a, 0x300b, 0x300b, + 0x300b, 0x300c, 0x300c, 0x300c, 0x300d, 0x300d, 0x300d, 0x300e, + 0x300e, 0x300e, 0x300f, 0x300f, 0x300f, 0x3010, 0x3010, 0x3010, + 0x3011, 0x3011, 0x3011, 0x3012, 0x3012, 0x3012, 0x3013, 0x3013, + 0x3013, 0x3014, 0x3014, 0x3014, 0x3015, 0x3015, 0x3015, 0x3016, + 0x3016, 0x3016, 0x3017, 0x3017, 0x3017, 0x3018, 0x3018, 0x3018, + 0x3019, 0x3019, 0x3019, 0x301a, 0x301a, 0x301a, 0x301b, 0x301b, + 0x301b, 0x301c, 0x301c, 0x301c, 0x301d, 0x301d, 0x301d, 0x301e, + 0x301e, 0x301e, 0x301f, 0x301f, 0x301f, 0x3020, 0x3020, 0x3020, + 0x3021, 0x3021, 0x3021, 0x3022, 0x3022, 0x3022, 0x3023, 0x3023, + 0x3023, 0x3024, 0x3024, 0x3024, 0x3025, 0x3025, 0x3025, 0x3026, + 0x3026, 0x3026, 0x3027, 0x3027, 0x3027, 0x3028, 0x3028, 0x3028, + 0x3029, 0x3029, 0x3029, 0x302a, 0x302a, 0x302a, 0x302b, 0x302b, + 0x302b, 0x302c, 0x302c, 0x302c, 0x302d, 0x302d, 0x302d, 0x302e, + 0x302e, 0x302e, 0x302f, 0x302f, 0x302f, 0x3030, 0x3030, 0x3030, + 0x3031, 0x3031, 0x3031, 0x3031, 0x3032, 0x3032, 0x3032, 0x3033, + 0x3033, 0x3033, 0x3034, 0x3034, 0x3034, 0x3035, 0x3035, 0x3035, + 0x3036, 0x3036, 0x3036, 0x3037, 0x3037, 0x3037, 0x3038, 0x3038, + 0x3038, 0x3039, 0x3039, 0x3039, 0x303a, 0x303a, 0x303a, 0x303b, + 0x303b, 0x303b, 0x303c, 0x303c, 0x303c, 0x303c, 0x303d, 0x303d, + 0x303d, 0x303e, 0x303e, 0x303e, 0x303f, 0x303f, 0x303f, 0x3040, + 0x3040, 0x3040, 0x3041, 0x3041, 0x3041, 0x3042, 0x3042, 0x3042, + 0x3043, 0x3043, 0x3043, 0x3044, 0x3044, 0x3044, 0x3044, 0x3045, + 0x3045, 0x3045, 0x3046, 0x3046, 0x3046, 0x3047, 0x3047, 0x3047, + 0x3048, 0x3048, 0x3048, 0x3049, 0x3049, 0x3049, 0x304a, 0x304a, + 0x304a, 0x304b, 0x304b, 0x304b, 0x304b, 0x304c, 0x304c, 0x304c, + 0x304d, 0x304d, 0x304d, 0x304e, 0x304e, 0x304e, 0x304f, 0x304f, + 0x304f, 0x3050, 0x3050, 0x3050, 0x3051, 0x3051, 0x3051, 0x3051, + 0x3052, 0x3052, 0x3052, 0x3053, 0x3053, 0x3053, 0x3054, 0x3054, + 0x3054, 0x3055, 0x3055, 0x3055, 0x3056, 0x3056, 0x3056, 0x3056, + 0x3057, 0x3057, 0x3057, 0x3058, 0x3058, 0x3058, 0x3059, 0x3059, + 0x3059, 0x305a, 0x305a, 0x305a, 0x305b, 0x305b, 0x305b, 0x305b, + 0x305c, 0x305c, 0x305c, 0x305d, 0x305d, 0x305d, 0x305e, 0x305e, + 0x305e, 0x305f, 0x305f, 0x305f, 0x305f, 0x3060, 0x3060, 0x3060, + 0x3061, 0x3061, 0x3061, 0x3062, 0x3062, 0x3062, 0x3063, 0x3063, + 0x3063, 0x3064, 0x3064, 0x3064, 0x3064, 0x3065, 0x3065, 0x3065, + 0x3066, 0x3066, 0x3066, 0x3067, 0x3067, 0x3067, 0x3068, 0x3068, + 0x3068, 0x3068, 0x3069, 0x3069, 0x3069, 0x306a, 0x306a, 0x306a, + 0x306b, 0x306b, 0x306b, 0x306b, 0x306c, 0x306c, 0x306c, 0x306d, + 0x306d, 0x306d, 0x306e, 0x306e, 0x306e, 0x306f, 0x306f, 0x306f, + 0x306f, 0x3070, 0x3070, 0x3070, 0x3071, 0x3071, 0x3071, 0x3072, + 0x3072, 0x3072, 0x3072, 0x3073, 0x3073, 0x3073, 0x3074, 0x3074, + 0x3074, 0x3075, 0x3075, 0x3075, 0x3076, 0x3076, 0x3076, 0x3076, + 0x3077, 0x3077, 0x3077, 0x3078, 0x3078, 0x3078, 0x3079, 0x3079, + 0x3079, 0x3079, 0x307a, 0x307a, 0x307a, 0x307b, 0x307b, 0x307b, + 0x307c, 0x307c, 0x307c, 0x307c, 0x307d, 0x307d, 0x307d, 0x307e, + 0x307e, 0x307e, 0x307f, 0x307f, 0x307f, 0x307f, 0x3080, 0x3080, + 0x3080, 0x3081, 0x3081, 0x3081, 0x3082, 0x3082, 0x3082, 0x3082, + 0x3083, 0x3083, 0x3083, 0x3084, 0x3084, 0x3084, 0x3085, 0x3085, + 0x3085, 0x3085, 0x3086, 0x3086, 0x3086, 0x3087, 0x3087, 0x3087, + 0x3087, 0x3088, 0x3088, 0x3088, 0x3089, 0x3089, 0x3089, 0x308a, + 0x308a, 0x308a, 0x308a, 0x308b, 0x308b, 0x308b, 0x308c, 0x308c, + 0x308c, 0x308d, 0x308d, 0x308d, 0x308d, 0x308e, 0x308e, 0x308e, + 0x308f, 0x308f, 0x308f, 0x308f, 0x3090, 0x3090, 0x3090, 0x3091, + 0x3091, 0x3091, 0x3092, 0x3092, 0x3092, 0x3092, 0x3093, 0x3093, + 0x3093, 0x3094, 0x3094, 0x3094, 0x3094, 0x3095, 0x3095, 0x3095, + 0x3096, 0x3096, 0x3096, 0x3097, 0x3097, 0x3097, 0x3097, 0x3098, + 0x3098, 0x3098, 0x3099, 0x3099, 0x3099, 0x3099, 0x309a, 0x309a, + 0x309a, 0x309b, 0x309b, 0x309b, 0x309b, 0x309c, 0x309c, 0x309c, + 0x309d, 0x309d, 0x309d, 0x309e, 0x309e, 0x309e, 0x309e, 0x309f, + 0x309f, 0x309f, 0x30a0, 0x30a0, 0x30a0, 0x30a0, 0x30a1, 0x30a1, + 0x30a1, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a3, 0x30a3, 0x30a3, + 0x30a4, 0x30a4, 0x30a4, 0x30a4, 0x30a5, 0x30a5, 0x30a5, 0x30a6, + 0x30a6, 0x30a6, 0x30a6, 0x30a7, 0x30a7, 0x30a7, 0x30a8, 0x30a8, + 0x30a8, 0x30a8, 0x30a9, 0x30a9, 0x30a9, 0x30aa, 0x30aa, 0x30aa, + 0x30aa, 0x30ab, 0x30ab, 0x30ab, 0x30ac, 0x30ac, 0x30ac, 0x30ac, + 0x30ad, 0x30ad, 0x30ad, 0x30ae, 0x30ae, 0x30ae, 0x30ae, 0x30af, + 0x30af, 0x30af, 0x30b0, 0x30b0, 0x30b0, 0x30b0, 0x30b1, 0x30b1, + 0x30b1, 0x30b2, 0x30b2, 0x30b2, 0x30b2, 0x30b3, 0x30b3, 0x30b3, + 0x30b4, 0x30b4, 0x30b4, 0x30b4, 0x30b5, 0x30b5, 0x30b5, 0x30b6, + 0x30b6, 0x30b6, 0x30b6, 0x30b7, 0x30b7, 0x30b7, 0x30b8, 0x30b8, + 0x30b8, 0x30b8, 0x30b9, 0x30b9, 0x30b9, 0x30ba, 0x30ba, 0x30ba, + 0x30ba, 0x30bb, 0x30bb, 0x30bb, 0x30bc, 0x30bc, 0x30bc, 0x30bc, + 0x30bd, 0x30bd, 0x30bd, 0x30bd, 0x30be, 0x30be, 0x30be, 0x30bf, + 0x30bf, 0x30bf, 0x30bf, 0x30c0, 0x30c0, 0x30c0, 0x30c1, 0x30c1, + 0x30c1, 0x30c1, 0x30c2, 0x30c2, 0x30c2, 0x30c3, 0x30c3, 0x30c3, + 0x30c3, 0x30c4, 0x30c4, 0x30c4, 0x30c4, 0x30c5, 0x30c5, 0x30c5, + 0x30c6, 0x30c6, 0x30c6, 0x30c6, 0x30c7, 0x30c7, 0x30c7, 0x30c8, + 0x30c8, 0x30c8, 0x30c8, 0x30c9, 0x30c9, 0x30c9, 0x30c9, 0x30ca, + 0x30ca, 0x30ca, 0x30cb, 0x30cb, 0x30cb, 0x30cb, 0x30cc, 0x30cc, + 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ce, 0x30ce, 0x30ce, + 0x30ce, 0x30cf, 0x30cf, 0x30cf, 0x30d0, 0x30d0, 0x30d0, 0x30d0, + 0x30d1, 0x30d1, 0x30d1, 0x30d2, 0x30d2, 0x30d2, 0x30d2, 0x30d3, + 0x30d3, 0x30d3, 0x30d3, 0x30d4, 0x30d4, 0x30d4, 0x30d5, 0x30d5, + 0x30d5, 0x30d6, 0x30d6, 0x30d7, 0x30d7, 0x30d8, 0x30d8, 0x30d9, + 0x30d9, 0x30da, 0x30db, 0x30db, 0x30dc, 0x30dc, 0x30dd, 0x30dd, + 0x30de, 0x30de, 0x30df, 0x30df, 0x30e0, 0x30e1, 0x30e1, 0x30e2, + 0x30e2, 0x30e3, 0x30e3, 0x30e4, 0x30e4, 0x30e5, 0x30e5, 0x30e6, + 0x30e7, 0x30e7, 0x30e8, 0x30e8, 0x30e9, 0x30e9, 0x30ea, 0x30ea, + 0x30eb, 0x30eb, 0x30ec, 0x30ec, 0x30ed, 0x30ee, 0x30ee, 0x30ef, + 0x30ef, 0x30f0, 0x30f0, 0x30f1, 0x30f1, 0x30f2, 0x30f2, 0x30f3, + 0x30f3, 0x30f4, 0x30f4, 0x30f5, 0x30f6, 0x30f6, 0x30f7, 0x30f7, + 0x30f8, 0x30f8, 0x30f9, 0x30f9, 0x30fa, 0x30fa, 0x30fb, 0x30fb, + 0x30fc, 0x30fc, 0x30fd, 0x30fd, 0x30fe, 0x30ff, 0x30ff, 0x3100, + 0x3100, 0x3101, 0x3101, 0x3102, 0x3102, 0x3103, 0x3103, 0x3104, + 0x3104, 0x3105, 0x3105, 0x3106, 0x3106, 0x3107, 0x3107, 0x3108, + 0x3109, 0x3109, 0x310a, 0x310a, 0x310b, 0x310b, 0x310c, 0x310c, + 0x310d, 0x310d, 0x310e, 0x310e, 0x310f, 0x310f, 0x3110, 0x3110, + 0x3111, 0x3111, 0x3112, 0x3112, 0x3113, 0x3113, 0x3114, 0x3114, + 0x3115, 0x3116, 0x3116, 0x3117, 0x3117, 0x3118, 0x3118, 0x3119, + 0x3119, 0x311a, 0x311a, 0x311b, 0x311b, 0x311c, 0x311c, 0x311d, + 0x311d, 0x311e, 0x311e, 0x311f, 0x311f, 0x3120, 0x3120, 0x3121, + 0x3121, 0x3122, 0x3122, 0x3123, 0x3123, 0x3124, 0x3124, 0x3125, + 0x3125, 0x3126, 0x3126, 0x3127, 0x3127, 0x3128, 0x3128, 0x3129, + 0x3129, 0x312a, 0x312a, 0x312b, 0x312c, 0x312c, 0x312d, 0x312d, + 0x312e, 0x312e, 0x312f, 0x312f, 0x3130, 0x3130, 0x3131, 0x3131, + 0x3132, 0x3132, 0x3133, 0x3133, 0x3134, 0x3134, 0x3135, 0x3135, + 0x3136, 0x3136, 0x3137, 0x3137, 0x3138, 0x3138, 0x3139, 0x3139, + 0x313a, 0x313a, 0x313b, 0x313b, 0x313c, 0x313c, 0x313d, 0x313d, + 0x313e, 0x313e, 0x313f, 0x313f, 0x3140, 0x3140, 0x3141, 0x3141, + 0x3142, 0x3142, 0x3143, 0x3143, 0x3144, 0x3144, 0x3145, 0x3145, + 0x3146, 0x3146, 0x3147, 0x3147, 0x3148, 0x3148, 0x3148, 0x3149, + 0x3149, 0x314a, 0x314a, 0x314b, 0x314b, 0x314c, 0x314c, 0x314d, + 0x314d, 0x314e, 0x314e, 0x314f, 0x314f, 0x3150, 0x3150, 0x3151, + 0x3151, 0x3152, 0x3152, 0x3153, 0x3153, 0x3154, 0x3154, 0x3155, + 0x3155, 0x3156, 0x3156, 0x3157, 0x3157, 0x3158, 0x3158, 0x3159, + 0x3159, 0x315a, 0x315a, 0x315b, 0x315b, 0x315c, 0x315c, 0x315d, + 0x315d, 0x315e, 0x315e, 0x315e, 0x315f, 0x315f, 0x3160, 0x3160, + 0x3161, 0x3161, 0x3162, 0x3162, 0x3163, 0x3163, 0x3164, 0x3164, + 0x3165, 0x3165, 0x3166, 0x3166, 0x3167, 0x3167, 0x3168, 0x3168, + 0x3169, 0x3169, 0x316a, 0x316a, 0x316b, 0x316b, 0x316b, 0x316c, + 0x316c, 0x316d, 0x316d, 0x316e, 0x316e, 0x316f, 0x316f, 0x3170, + 0x3170, 0x3171, 0x3171, 0x3172, 0x3172, 0x3173, 0x3173, 0x3174, + 0x3174, 0x3175, 0x3175, 0x3175, 0x3176, 0x3176, 0x3177, 0x3177, + 0x3178, 0x3178, 0x3179, 0x3179, 0x317a, 0x317a, 0x317b, 0x317b, + 0x317c, 0x317c, 0x317d, 0x317d, 0x317e, 0x317e, 0x317e, 0x317f, + 0x317f, 0x3180, 0x3180, 0x3181, 0x3181, 0x3182, 0x3182, 0x3183, + 0x3183, 0x3184, 0x3184, 0x3185, 0x3185, 0x3185, 0x3186, 0x3186, + 0x3187, 0x3187, 0x3188, 0x3188, 0x3189, 0x3189, 0x318a, 0x318a, + 0x318b, 0x318b, 0x318c, 0x318c, 0x318c, 0x318d, 0x318d, 0x318e, + 0x318e, 0x318f, 0x318f, 0x3190, 0x3190, 0x3191, 0x3191, 0x3192, + 0x3192, 0x3193, 0x3193, 0x3193, 0x3194, 0x3194, 0x3195, 0x3195, + 0x3196, 0x3196, 0x3197, 0x3197, 0x3198, 0x3198, 0x3199, 0x3199, + 0x3199, 0x319a, 0x319a, 0x319b, 0x319b, 0x319c, 0x319c, 0x319d, + 0x319d, 0x319e, 0x319e, 0x319f, 0x319f, 0x319f, 0x31a0, 0x31a0, + 0x31a1, 0x31a1, 0x31a2, 0x31a2, 0x31a3, 0x31a3, 0x31a4, 0x31a4, + 0x31a4, 0x31a5, 0x31a5, 0x31a6, 0x31a6, 0x31a7, 0x31a7, 0x31a8, + 0x31a8, 0x31a9, 0x31a9, 0x31a9, 0x31aa, 0x31aa, 0x31ab, 0x31ab, + 0x31ac, 0x31ac, 0x31ad, 0x31ad, 0x31ae, 0x31ae, 0x31ae, 0x31af, + 0x31af, 0x31b0, 0x31b0, 0x31b1, 0x31b1, 0x31b2, 0x31b2, 0x31b2, + 0x31b3, 0x31b3, 0x31b4, 0x31b4, 0x31b5, 0x31b5, 0x31b6, 0x31b6, + 0x31b7, 0x31b7, 0x31b7, 0x31b8, 0x31b8, 0x31b9, 0x31b9, 0x31ba, + 0x31ba, 0x31bb, 0x31bb, 0x31bb, 0x31bc, 0x31bc, 0x31bd, 0x31bd, + 0x31be, 0x31be, 0x31bf, 0x31bf, 0x31bf, 0x31c0, 0x31c0, 0x31c1, + 0x31c1, 0x31c2, 0x31c2, 0x31c3, 0x31c3, 0x31c4, 0x31c4, 0x31c4, + 0x31c5, 0x31c5, 0x31c6, 0x31c6, 0x31c7, 0x31c7, 0x31c7, 0x31c8, + 0x31c8, 0x31c9, 0x31c9, 0x31ca, 0x31ca, 0x31cb, 0x31cb, 0x31cb, + 0x31cc, 0x31cc, 0x31cd, 0x31cd, 0x31ce, 0x31ce, 0x31cf, 0x31cf, + 0x31cf, 0x31d0, 0x31d0, 0x31d1, 0x31d1, 0x31d2, 0x31d2, 0x31d3, + 0x31d3, 0x31d3, 0x31d4, 0x31d4, 0x31d5, 0x31d5, 0x31d6, 0x31d6, + 0x31d6, 0x31d7, 0x31d7, 0x31d8, 0x31d8, 0x31d9, 0x31d9, 0x31da, + 0x31da, 0x31da, 0x31db, 0x31db, 0x31dc, 0x31dc, 0x31dd, 0x31dd, + 0x31dd, 0x31de, 0x31de, 0x31df, 0x31df, 0x31e0, 0x31e0, 0x31e0, + 0x31e1, 0x31e1, 0x31e2, 0x31e2, 0x31e3, 0x31e3, 0x31e4, 0x31e4, + 0x31e4, 0x31e5, 0x31e5, 0x31e6, 0x31e6, 0x31e7, 0x31e7, 0x31e7, + 0x31e8, 0x31e8, 0x31e9, 0x31e9, 0x31ea, 0x31ea, 0x31ea, 0x31eb, + 0x31eb, 0x31ec, 0x31ec, 0x31ed, 0x31ed, 0x31ed, 0x31ee, 0x31ee, + 0x31ef, 0x31ef, 0x31f0, 0x31f0, 0x31f0, 0x31f1, 0x31f1, 0x31f2, + 0x31f2, 0x31f3, 0x31f3, 0x31f3, 0x31f4, 0x31f4, 0x31f5, 0x31f5, + 0x31f6, 0x31f6, 0x31f6, 0x31f7, 0x31f7, 0x31f8, 0x31f8, 0x31f9, + 0x31f9, 0x31f9, 0x31fa, 0x31fa, 0x31fb, 0x31fb, 0x31fc, 0x31fc, + 0x31fc, 0x31fd, 0x31fd, 0x31fe, 0x31fe, 0x31ff, 0x31ff, 0x31ff, + 0x3200, 0x3200, 0x3201, 0x3201, 0x3201, 0x3202, 0x3202, 0x3203, + 0x3203, 0x3204, 0x3204, 0x3204, 0x3205, 0x3205, 0x3206, 0x3206, + 0x3207, 0x3207, 0x3207, 0x3208, 0x3208, 0x3209, 0x3209, 0x320a, + 0x320a, 0x320a, 0x320b, 0x320b, 0x320c, 0x320c, 0x320c, 0x320d, + 0x320d, 0x320e, 0x320e, 0x320f, 0x320f, 0x320f, 0x3210, 0x3210, + 0x3211, 0x3211, 0x3211, 0x3212, 0x3212, 0x3213, 0x3213, 0x3214, + 0x3214, 0x3214, 0x3215, 0x3215, 0x3216, 0x3216, 0x3216, 0x3217, + 0x3217, 0x3218, 0x3218, 0x3219, 0x3219, 0x3219, 0x321a, 0x321a, + 0x321b, 0x321b, 0x321b, 0x321c, 0x321c, 0x321d, 0x321d, 0x321e, + 0x321e, 0x321e, 0x321f, 0x321f, 0x3220, 0x3220, 0x3220, 0x3221, + 0x3221, 0x3222, 0x3222, 0x3222, 0x3223, 0x3223, 0x3224, 0x3224, + 0x3225, 0x3225, 0x3225, 0x3226, 0x3226, 0x3227, 0x3227, 0x3227, + 0x3228, 0x3228, 0x3229, 0x3229, 0x3229, 0x322a, 0x322a, 0x322b, + 0x322b, 0x322c, 0x322c, 0x322c, 0x322d, 0x322d, 0x322e, 0x322e, + 0x322e, 0x322f, 0x322f, 0x3230, 0x3230, 0x3230, 0x3231, 0x3231, + 0x3232, 0x3232, 0x3232, 0x3233, 0x3233, 0x3234, 0x3234, 0x3235, + 0x3235, 0x3235, 0x3236, 0x3236, 0x3237, 0x3237, 0x3237, 0x3238, + 0x3238, 0x3239, 0x3239, 0x3239, 0x323a, 0x323a, 0x323b, 0x323b, + 0x323b, 0x323c, 0x323c, 0x323d, 0x323d, 0x323d, 0x323e, 0x323e, + 0x323f, 0x323f, 0x323f, 0x3240, 0x3240, 0x3241, 0x3241, 0x3241, + 0x3242, 0x3242, 0x3243, 0x3243, 0x3243, 0x3244, 0x3244, 0x3245, + 0x3245, 0x3245, 0x3246, 0x3246, 0x3247, 0x3247, 0x3247, 0x3248, + 0x3248, 0x3249, 0x3249, 0x3249, 0x324a, 0x324a, 0x324b, 0x324b, + 0x324b, 0x324c, 0x324c, 0x324d, 0x324d, 0x324d, 0x324e, 0x324e, + 0x324f, 0x324f, 0x324f, 0x3250, 0x3250, 0x3251, 0x3251, 0x3251, + 0x3252, 0x3252, 0x3253, 0x3253, 0x3253, 0x3254, 0x3254, 0x3255, + 0x3255, 0x3255, 0x3256, 0x3256, 0x3257, 0x3257, 0x3257, 0x3258, + 0x3258, 0x3259, 0x3259, 0x3259, 0x325a, 0x325a, 0x325b, 0x325b, + 0x325b, 0x325c, 0x325c, 0x325d, 0x325d, 0x325d, 0x325e, 0x325e, + 0x325f, 0x325f, 0x325f, 0x3260, 0x3260, 0x3261, 0x3261, 0x3261, + 0x3262, 0x3262, 0x3262, 0x3263, 0x3263, 0x3264, 0x3264, 0x3264, + 0x3265, 0x3265, 0x3266, 0x3266, 0x3266, 0x3267, 0x3267, 0x3268, + 0x3268, 0x3268, 0x3269, 0x3269, 0x326a, 0x326a, 0x326a, 0x326b, + 0x326b, 0x326b, 0x326c, 0x326c, 0x326d, 0x326d, 0x326d, 0x326e, + 0x326e, 0x326f, 0x326f, 0x326f, 0x3270, 0x3270, 0x3271, 0x3271, + 0x3271, 0x3272, 0x3272, 0x3273, 0x3273, 0x3273, 0x3274, 0x3274, + 0x3274, 0x3275, 0x3275, 0x3276, 0x3276, 0x3276, 0x3277, 0x3277, + 0x3278, 0x3278, 0x3278, 0x3279, 0x3279, 0x3279, 0x327a, 0x327a, + 0x327b, 0x327b, 0x327b, 0x327c, 0x327c, 0x327d, 0x327d, 0x327d, + 0x327e, 0x327e, 0x327f, 0x327f, 0x327f, 0x3280, 0x3280, 0x3280, + 0x3281, 0x3281, 0x3282, 0x3282, 0x3282, 0x3283, 0x3283, 0x3284, + 0x3284, 0x3284, 0x3285, 0x3285, 0x3285, 0x3286, 0x3286, 0x3287, + 0x3287, 0x3287, 0x3288, 0x3288, 0x3288, 0x3289, 0x3289, 0x328a, + 0x328a, 0x328a, 0x328b, 0x328b, 0x328c, 0x328c, 0x328c, 0x328d, + 0x328d, 0x328d, 0x328e, 0x328e, 0x328f, 0x328f, 0x328f, 0x3290, + 0x3290, 0x3290, 0x3291, 0x3291, 0x3292, 0x3292, 0x3292, 0x3293, + 0x3293, 0x3294, 0x3294, 0x3294, 0x3295, 0x3295, 0x3295, 0x3296, + 0x3296, 0x3297, 0x3297, 0x3297, 0x3298, 0x3298, 0x3298, 0x3299, + 0x3299, 0x329a, 0x329a, 0x329a, 0x329b, 0x329b, 0x329b, 0x329c, + 0x329c, 0x329d, 0x329d, 0x329d, 0x329e, 0x329e, 0x329e, 0x329f, + 0x329f, 0x32a0, 0x32a1, 0x32a1, 0x32a2, 0x32a3, 0x32a4, 0x32a4, + 0x32a5, 0x32a6, 0x32a7, 0x32a7, 0x32a8, 0x32a9, 0x32aa, 0x32aa, + 0x32ab, 0x32ac, 0x32ad, 0x32ad, 0x32ae, 0x32af, 0x32b0, 0x32b0, + 0x32b1, 0x32b2, 0x32b3, 0x32b3, 0x32b4, 0x32b5, 0x32b6, 0x32b6, + 0x32b7, 0x32b8, 0x32b9, 0x32b9, 0x32ba, 0x32bb, 0x32bc, 0x32bc, + 0x32bd, 0x32be, 0x32be, 0x32bf, 0x32c0, 0x32c1, 0x32c1, 0x32c2, + 0x32c3, 0x32c4, 0x32c4, 0x32c5, 0x32c6, 0x32c7, 0x32c7, 0x32c8, + 0x32c9, 0x32c9, 0x32ca, 0x32cb, 0x32cc, 0x32cc, 0x32cd, 0x32ce, + 0x32cf, 0x32cf, 0x32d0, 0x32d1, 0x32d2, 0x32d2, 0x32d3, 0x32d4, + 0x32d4, 0x32d5, 0x32d6, 0x32d7, 0x32d7, 0x32d8, 0x32d9, 0x32d9, + 0x32da, 0x32db, 0x32dc, 0x32dc, 0x32dd, 0x32de, 0x32df, 0x32df, + 0x32e0, 0x32e1, 0x32e1, 0x32e2, 0x32e3, 0x32e4, 0x32e4, 0x32e5, + 0x32e6, 0x32e6, 0x32e7, 0x32e8, 0x32e9, 0x32e9, 0x32ea, 0x32eb, + 0x32eb, 0x32ec, 0x32ed, 0x32ee, 0x32ee, 0x32ef, 0x32f0, 0x32f0, + 0x32f1, 0x32f2, 0x32f3, 0x32f3, 0x32f4, 0x32f5, 0x32f5, 0x32f6, + 0x32f7, 0x32f8, 0x32f8, 0x32f9, 0x32fa, 0x32fa, 0x32fb, 0x32fc, + 0x32fc, 0x32fd, 0x32fe, 0x32ff, 0x32ff, 0x3300, 0x3301, 0x3301, + 0x3302, 0x3303, 0x3304, 0x3304, 0x3305, 0x3306, 0x3306, 0x3307, + 0x3308, 0x3308, 0x3309, 0x330a, 0x330b, 0x330b, 0x330c, 0x330d, + 0x330d, 0x330e, 0x330f, 0x330f, 0x3310, 0x3311, 0x3311, 0x3312, + 0x3313, 0x3314, 0x3314, 0x3315, 0x3316, 0x3316, 0x3317, 0x3318, + 0x3318, 0x3319, 0x331a, 0x331b, 0x331b, 0x331c, 0x331d, 0x331d, + 0x331e, 0x331f, 0x331f, 0x3320, 0x3321, 0x3321, 0x3322, 0x3323, + 0x3323, 0x3324, 0x3325, 0x3326, 0x3326, 0x3327, 0x3328, 0x3328, + 0x3329, 0x332a, 0x332a, 0x332b, 0x332c, 0x332c, 0x332d, 0x332e, + 0x332e, 0x332f, 0x3330, 0x3330, 0x3331, 0x3332, 0x3333, 0x3333, + 0x3334, 0x3335, 0x3335, 0x3336, 0x3337, 0x3337, 0x3338, 0x3339, + 0x3339, 0x333a, 0x333b, 0x333b, 0x333c, 0x333d, 0x333d, 0x333e, + 0x333f, 0x333f, 0x3340, 0x3341, 0x3341, 0x3342, 0x3343, 0x3343, + 0x3344, 0x3345, 0x3345, 0x3346, 0x3347, 0x3347, 0x3348, 0x3349, + 0x334a, 0x334a, 0x334b, 0x334c, 0x334c, 0x334d, 0x334e, 0x334e, + 0x334f, 0x3350, 0x3350, 0x3351, 0x3352, 0x3352, 0x3353, 0x3354, + 0x3354, 0x3355, 0x3356, 0x3356, 0x3357, 0x3358, 0x3358, 0x3359, + 0x335a, 0x335a, 0x335b, 0x335c, 0x335c, 0x335d, 0x335e, 0x335e, + 0x335f, 0x335f, 0x3360, 0x3361, 0x3361, 0x3362, 0x3363, 0x3363, + 0x3364, 0x3365, 0x3365, 0x3366, 0x3367, 0x3367, 0x3368, 0x3369, + 0x3369, 0x336a, 0x336b, 0x336b, 0x336c, 0x336d, 0x336d, 0x336e, + 0x336f, 0x336f, 0x3370, 0x3371, 0x3371, 0x3372, 0x3373, 0x3373, + 0x3374, 0x3375, 0x3375, 0x3376, 0x3376, 0x3377, 0x3378, 0x3378, + 0x3379, 0x337a, 0x337a, 0x337b, 0x337c, 0x337c, 0x337d, 0x337e, + 0x337e, 0x337f, 0x3380, 0x3380, 0x3381, 0x3382, 0x3382, 0x3383, + 0x3383, 0x3384, 0x3385, 0x3385, 0x3386, 0x3387, 0x3387, 0x3388, + 0x3389, 0x3389, 0x338a, 0x338b, 0x338b, 0x338c, 0x338c, 0x338d, + 0x338e, 0x338e, 0x338f, 0x3390, 0x3390, 0x3391, 0x3392, 0x3392, + 0x3393, 0x3394, 0x3394, 0x3395, 0x3395, 0x3396, 0x3397, 0x3397, + 0x3398, 0x3399, 0x3399, 0x339a, 0x339b, 0x339b, 0x339c, 0x339c, + 0x339d, 0x339e, 0x339e, 0x339f, 0x33a0, 0x33a0, 0x33a1, 0x33a2, + 0x33a2, 0x33a3, 0x33a3, 0x33a4, 0x33a5, 0x33a5, 0x33a6, 0x33a7, + 0x33a7, 0x33a8, 0x33a9, 0x33a9, 0x33aa, 0x33aa, 0x33ab, 0x33ac, + 0x33ac, 0x33ad, 0x33ae, 0x33ae, 0x33af, 0x33af, 0x33b0, 0x33b1, + 0x33b1, 0x33b2, 0x33b3, 0x33b3, 0x33b4, 0x33b5, 0x33b5, 0x33b6, + 0x33b6, 0x33b7, 0x33b8, 0x33b8, 0x33b9, 0x33ba, 0x33ba, 0x33bb, + 0x33bb, 0x33bc, 0x33bd, 0x33bd, 0x33be, 0x33bf, 0x33bf, 0x33c0, + 0x33c0, 0x33c1, 0x33c2, 0x33c2, 0x33c3, 0x33c3, 0x33c4, 0x33c5, + 0x33c5, 0x33c6, 0x33c7, 0x33c7, 0x33c8, 0x33c8, 0x33c9, 0x33ca, + 0x33ca, 0x33cb, 0x33cc, 0x33cc, 0x33cd, 0x33cd, 0x33ce, 0x33cf, + 0x33cf, 0x33d0, 0x33d1, 0x33d1, 0x33d2, 0x33d2, 0x33d3, 0x33d4, + 0x33d4, 0x33d5, 0x33d5, 0x33d6, 0x33d7, 0x33d7, 0x33d8, 0x33d9, + 0x33d9, 0x33da, 0x33da, 0x33db, 0x33dc, 0x33dc, 0x33dd, 0x33dd, + 0x33de, 0x33df, 0x33df, 0x33e0, 0x33e0, 0x33e1, 0x33e2, 0x33e2, + 0x33e3, 0x33e4, 0x33e4, 0x33e5, 0x33e5, 0x33e6, 0x33e7, 0x33e7, + 0x33e8, 0x33e8, 0x33e9, 0x33ea, 0x33ea, 0x33eb, 0x33eb, 0x33ec, + 0x33ed, 0x33ed, 0x33ee, 0x33ee, 0x33ef, 0x33f0, 0x33f0, 0x33f1, + 0x33f1, 0x33f2, 0x33f3, 0x33f3, 0x33f4, 0x33f5, 0x33f5, 0x33f6, + 0x33f6, 0x33f7, 0x33f8, 0x33f8, 0x33f9, 0x33f9, 0x33fa, 0x33fb, + 0x33fb, 0x33fc, 0x33fc, 0x33fd, 0x33fe, 0x33fe, 0x33ff, 0x33ff, + 0x3400, 0x3400, 0x3401, 0x3401, 0x3401, 0x3401, 0x3402, 0x3402, + 0x3402, 0x3403, 0x3403, 0x3403, 0x3404, 0x3404, 0x3404, 0x3404, + 0x3405, 0x3405, 0x3405, 0x3406, 0x3406, 0x3406, 0x3407, 0x3407, + 0x3407, 0x3407, 0x3408, 0x3408, 0x3408, 0x3409, 0x3409, 0x3409, + 0x340a, 0x340a, 0x340a, 0x340a, 0x340b, 0x340b, 0x340b, 0x340c, + 0x340c, 0x340c, 0x340c, 0x340d, 0x340d, 0x340d, 0x340e, 0x340e, + 0x340e, 0x340f, 0x340f, 0x340f, 0x340f, 0x3410, 0x3410, 0x3410, + 0x3411, 0x3411, 0x3411, 0x3411, 0x3412, 0x3412, 0x3412, 0x3413, + 0x3413, 0x3413, 0x3414, 0x3414, 0x3414, 0x3414, 0x3415, 0x3415, + 0x3415, 0x3416, 0x3416, 0x3416, 0x3416, 0x3417, 0x3417, 0x3417, + 0x3418, 0x3418, 0x3418, 0x3419, 0x3419, 0x3419, 0x3419, 0x341a, + 0x341a, 0x341a, 0x341b, 0x341b, 0x341b, 0x341b, 0x341c, 0x341c, + 0x341c, 0x341d, 0x341d, 0x341d, 0x341d, 0x341e, 0x341e, 0x341e, + 0x341f, 0x341f, 0x341f, 0x341f, 0x3420, 0x3420, 0x3420, 0x3421, + 0x3421, 0x3421, 0x3422, 0x3422, 0x3422, 0x3422, 0x3423, 0x3423, + 0x3423, 0x3424, 0x3424, 0x3424, 0x3424, 0x3425, 0x3425, 0x3425, + 0x3426, 0x3426, 0x3426, 0x3426, 0x3427, 0x3427, 0x3427, 0x3428, + 0x3428, 0x3428, 0x3428, 0x3429, 0x3429, 0x3429, 0x342a, 0x342a, + 0x342a, 0x342a, 0x342b, 0x342b, 0x342b, 0x342c, 0x342c, 0x342c, + 0x342c, 0x342d, 0x342d, 0x342d, 0x342e, 0x342e, 0x342e, 0x342e, + 0x342f, 0x342f, 0x342f, 0x3430, 0x3430, 0x3430, 0x3430, 0x3431, + 0x3431, 0x3431, 0x3432, 0x3432, 0x3432, 0x3432, 0x3433, 0x3433, + 0x3433, 0x3433, 0x3434, 0x3434, 0x3434, 0x3435, 0x3435, 0x3435, + 0x3435, 0x3436, 0x3436, 0x3436, 0x3437, 0x3437, 0x3437, 0x3437, + 0x3438, 0x3438, 0x3438, 0x3439, 0x3439, 0x3439, 0x3439, 0x343a, + 0x343a, 0x343a, 0x343b, 0x343b, 0x343b, 0x343b, 0x343c, 0x343c, + 0x343c, 0x343c, 0x343d, 0x343d, 0x343d, 0x343e, 0x343e, 0x343e, + 0x343e, 0x343f, 0x343f, 0x343f, 0x3440, 0x3440, 0x3440, 0x3440, + 0x3441, 0x3441, 0x3441, 0x3442, 0x3442, 0x3442, 0x3442, 0x3443, + 0x3443, 0x3443, 0x3443, 0x3444, 0x3444, 0x3444, 0x3445, 0x3445, + 0x3445, 0x3445, 0x3446, 0x3446, 0x3446, 0x3447, 0x3447, 0x3447, + 0x3447, 0x3448, 0x3448, 0x3448, 0x3448, 0x3449, 0x3449, 0x3449, + 0x344a, 0x344a, 0x344a, 0x344a, 0x344b, 0x344b, 0x344b, 0x344b, + 0x344c, 0x344c, 0x344c, 0x344d, 0x344d, 0x344d, 0x344d, 0x344e, + 0x344e, 0x344e, 0x344f, 0x344f, 0x344f, 0x344f, 0x3450, 0x3450, + 0x3450, 0x3450, 0x3451, 0x3451, 0x3451, 0x3452, 0x3452, 0x3452, + 0x3452, 0x3453, 0x3453, 0x3453, 0x3453, 0x3454, 0x3454, 0x3454, + 0x3455, 0x3455, 0x3455, 0x3455, 0x3456, 0x3456, 0x3456, 0x3456, + 0x3457, 0x3457, 0x3457, 0x3458, 0x3458, 0x3458, 0x3458, 0x3459, + 0x3459, 0x3459, 0x3459, 0x345a, 0x345a, 0x345a, 0x345b, 0x345b, + 0x345b, 0x345b, 0x345c, 0x345c, 0x345c, 0x345c, 0x345d, 0x345d, + 0x345d, 0x345d, 0x345e, 0x345e, 0x345e, 0x345f, 0x345f, 0x345f, + 0x345f, 0x3460, 0x3460, 0x3460, 0x3460, 0x3461, 0x3461, 0x3461, + 0x3462, 0x3462, 0x3462, 0x3462, 0x3463, 0x3463, 0x3463, 0x3463, + 0x3464, 0x3464, 0x3464, 0x3464, 0x3465, 0x3465, 0x3465, 0x3466, + 0x3466, 0x3466, 0x3466, 0x3467, 0x3467, 0x3467, 0x3467, 0x3468, + 0x3468, 0x3468, 0x3468, 0x3469, 0x3469, 0x3469, 0x346a, 0x346a, + 0x346a, 0x346a, 0x346b, 0x346b, 0x346b, 0x346b, 0x346c, 0x346c, + 0x346c, 0x346c, 0x346d, 0x346d, 0x346d, 0x346e, 0x346e, 0x346e, + 0x346e, 0x346f, 0x346f, 0x346f, 0x346f, 0x3470, 0x3470, 0x3470, + 0x3470, 0x3471, 0x3471, 0x3471, 0x3472, 0x3472, 0x3472, 0x3472, + 0x3473, 0x3473, 0x3473, 0x3473, 0x3474, 0x3474, 0x3474, 0x3474, + 0x3475, 0x3475, 0x3475, 0x3475, 0x3476, 0x3476, 0x3476, 0x3477, + 0x3477, 0x3477, 0x3477, 0x3478, 0x3478, 0x3478, 0x3478, 0x3479, + 0x3479, 0x3479, 0x3479, 0x347a, 0x347a, 0x347a, 0x347a, 0x347b, + 0x347b, 0x347b, 0x347c, 0x347c, 0x347c, 0x347c, 0x347d, 0x347d, + 0x347d, 0x347d, 0x347e, 0x347e, 0x347e, 0x347e, 0x347f, 0x347f, + 0x347f, 0x347f, 0x3480, 0x3480, 0x3480, 0x3480, 0x3481, 0x3481, + 0x3481, 0x3482, 0x3482, 0x3482, 0x3482, 0x3483, 0x3483, 0x3483, + 0x3483, 0x3484, 0x3484, 0x3484, 0x3484, 0x3485, 0x3485, 0x3485, + 0x3485, 0x3486, 0x3486, 0x3486, 0x3486, 0x3487, 0x3487, 0x3487, + 0x3487, 0x3488, 0x3488, 0x3488, 0x3489, 0x3489, 0x3489, 0x3489, + 0x348a, 0x348a, 0x348b, 0x348b, 0x348c, 0x348c, 0x348d, 0x348d, + 0x348e, 0x348e, 0x348f, 0x348f, 0x3490, 0x3490, 0x3491, 0x3491, + 0x3492, 0x3492, 0x3493, 0x3493, 0x3494, 0x3494, 0x3495, 0x3495, + 0x3496, 0x3496, 0x3497, 0x3497, 0x3498, 0x3498, 0x3499, 0x3499, + 0x349a, 0x349a, 0x349b, 0x349b, 0x349c, 0x349c, 0x349d, 0x349d, + 0x349e, 0x349e, 0x349f, 0x349f, 0x34a0, 0x34a0, 0x34a1, 0x34a1, + 0x34a2, 0x34a2, 0x34a3, 0x34a3, 0x34a4, 0x34a4, 0x34a5, 0x34a5, + 0x34a6, 0x34a6, 0x34a7, 0x34a7, 0x34a8, 0x34a8, 0x34a9, 0x34a9, + 0x34aa, 0x34aa, 0x34ab, 0x34ab, 0x34ac, 0x34ac, 0x34ad, 0x34ad, + 0x34ae, 0x34ae, 0x34af, 0x34af, 0x34b0, 0x34b0, 0x34b1, 0x34b1, + 0x34b2, 0x34b2, 0x34b3, 0x34b3, 0x34b4, 0x34b4, 0x34b5, 0x34b5, + 0x34b6, 0x34b6, 0x34b7, 0x34b7, 0x34b8, 0x34b8, 0x34b9, 0x34b9, + 0x34ba, 0x34ba, 0x34bb, 0x34bb, 0x34bc, 0x34bc, 0x34bd, 0x34bd, + 0x34be, 0x34be, 0x34bf, 0x34bf, 0x34c0, 0x34c0, 0x34c1, 0x34c1, + 0x34c2, 0x34c2, 0x34c3, 0x34c3, 0x34c4, 0x34c4, 0x34c5, 0x34c5, + 0x34c6, 0x34c6, 0x34c7, 0x34c7, 0x34c7, 0x34c8, 0x34c8, 0x34c9, + 0x34c9, 0x34ca, 0x34ca, 0x34cb, 0x34cb, 0x34cc, 0x34cc, 0x34cd, + 0x34cd, 0x34ce, 0x34ce, 0x34cf, 0x34cf, 0x34d0, 0x34d0, 0x34d1, + 0x34d1, 0x34d2, 0x34d2, 0x34d3, 0x34d3, 0x34d4, 0x34d4, 0x34d4, + 0x34d5, 0x34d5, 0x34d6, 0x34d6, 0x34d7, 0x34d7, 0x34d8, 0x34d8, + 0x34d9, 0x34d9, 0x34da, 0x34da, 0x34db, 0x34db, 0x34dc, 0x34dc, + 0x34dd, 0x34dd, 0x34de, 0x34de, 0x34de, 0x34df, 0x34df, 0x34e0, + 0x34e0, 0x34e1, 0x34e1, 0x34e2, 0x34e2, 0x34e3, 0x34e3, 0x34e4, + 0x34e4, 0x34e5, 0x34e5, 0x34e6, 0x34e6, 0x34e6, 0x34e7, 0x34e7, + 0x34e8, 0x34e8, 0x34e9, 0x34e9, 0x34ea, 0x34ea, 0x34eb, 0x34eb, + 0x34ec, 0x34ec, 0x34ed, 0x34ed, 0x34ee, 0x34ee, 0x34ee, 0x34ef, + 0x34ef, 0x34f0, 0x34f0, 0x34f1, 0x34f1, 0x34f2, 0x34f2, 0x34f3, + 0x34f3, 0x34f4, 0x34f4, 0x34f5, 0x34f5, 0x34f5, 0x34f6, 0x34f6, + 0x34f7, 0x34f7, 0x34f8, 0x34f8, 0x34f9, 0x34f9, 0x34fa, 0x34fa, + 0x34fb, 0x34fb, 0x34fb, 0x34fc, 0x34fc, 0x34fd, 0x34fd, 0x34fe, + 0x34fe, 0x34ff, 0x34ff, 0x3500, 0x3500, 0x3500, 0x3501, 0x3501, + 0x3502, 0x3502, 0x3503, 0x3503, 0x3504, 0x3504, 0x3505, 0x3505, + 0x3506, 0x3506, 0x3506, 0x3507, 0x3507, 0x3508, 0x3508, 0x3509, + 0x3509, 0x350a, 0x350a, 0x350b, 0x350b, 0x350b, 0x350c, 0x350c, + 0x350d, 0x350d, 0x350e, 0x350e, 0x350f, 0x350f, 0x3510, 0x3510, + 0x3510, 0x3511, 0x3511, 0x3512, 0x3512, 0x3513, 0x3513, 0x3514, + 0x3514, 0x3514, 0x3515, 0x3515, 0x3516, 0x3516, 0x3517, 0x3517, + 0x3518, 0x3518, 0x3519, 0x3519, 0x3519, 0x351a, 0x351a, 0x351b, + 0x351b, 0x351c, 0x351c, 0x351d, 0x351d, 0x351d, 0x351e, 0x351e, + 0x351f, 0x351f, 0x3520, 0x3520, 0x3521, 0x3521, 0x3521, 0x3522, + 0x3522, 0x3523, 0x3523, 0x3524, 0x3524, 0x3525, 0x3525, 0x3525, + 0x3526, 0x3526, 0x3527, 0x3527, 0x3528, 0x3528, 0x3529, 0x3529, + 0x3529, 0x352a, 0x352a, 0x352b, 0x352b, 0x352c, 0x352c, 0x352d, + 0x352d, 0x352d, 0x352e, 0x352e, 0x352f, 0x352f, 0x3530, 0x3530, + 0x3530, 0x3531, 0x3531, 0x3532, 0x3532, 0x3533, 0x3533, 0x3534, + 0x3534, 0x3534, 0x3535, 0x3535, 0x3536, 0x3536, 0x3537, 0x3537, + 0x3537, 0x3538, 0x3538, 0x3539, 0x3539, 0x353a, 0x353a, 0x353b, + 0x353b, 0x353b, 0x353c, 0x353c, 0x353d, 0x353d, 0x353e, 0x353e, + 0x353e, 0x353f, 0x353f, 0x3540, 0x3540, 0x3541, 0x3541, 0x3541, + 0x3542, 0x3542, 0x3543, 0x3543, 0x3544, 0x3544, 0x3544, 0x3545, + 0x3545, 0x3546, 0x3546, 0x3547, 0x3547, 0x3548, 0x3548, 0x3548, + 0x3549, 0x3549, 0x354a, 0x354a, 0x354b, 0x354b, 0x354b, 0x354c, + 0x354c, 0x354d, 0x354d, 0x354e, 0x354e, 0x354e, 0x354f, 0x354f, + 0x3550, 0x3550, 0x3551, 0x3551, 0x3551, 0x3552, 0x3552, 0x3553, + 0x3553, 0x3553, 0x3554, 0x3554, 0x3555, 0x3555, 0x3556, 0x3556, + 0x3556, 0x3557, 0x3557, 0x3558, 0x3558, 0x3559, 0x3559, 0x3559, + 0x355a, 0x355a, 0x355b, 0x355b, 0x355c, 0x355c, 0x355c, 0x355d, + 0x355d, 0x355e, 0x355e, 0x355e, 0x355f, 0x355f, 0x3560, 0x3560, + 0x3561, 0x3561, 0x3561, 0x3562, 0x3562, 0x3563, 0x3563, 0x3564, + 0x3564, 0x3564, 0x3565, 0x3565, 0x3566, 0x3566, 0x3566, 0x3567, + 0x3567, 0x3568, 0x3568, 0x3569, 0x3569, 0x3569, 0x356a, 0x356a, + 0x356b, 0x356b, 0x356b, 0x356c, 0x356c, 0x356d, 0x356d, 0x356e, + 0x356e, 0x356e, 0x356f, 0x356f, 0x3570, 0x3570, 0x3570, 0x3571, + 0x3571, 0x3572, 0x3572, 0x3573, 0x3573, 0x3573, 0x3574, 0x3574, + 0x3575, 0x3575, 0x3575, 0x3576, 0x3576, 0x3577, 0x3577, 0x3577, + 0x3578, 0x3578, 0x3579, 0x3579, 0x357a, 0x357a, 0x357a, 0x357b, + 0x357b, 0x357c, 0x357c, 0x357c, 0x357d, 0x357d, 0x357e, 0x357e, + 0x357e, 0x357f, 0x357f, 0x3580, 0x3580, 0x3581, 0x3581, 0x3581, + 0x3582, 0x3582, 0x3583, 0x3583, 0x3583, 0x3584, 0x3584, 0x3585, + 0x3585, 0x3585, 0x3586, 0x3586, 0x3587, 0x3587, 0x3587, 0x3588, + 0x3588, 0x3589, 0x3589, 0x3589, 0x358a, 0x358a, 0x358b, 0x358b, + 0x358c, 0x358c, 0x358c, 0x358d, 0x358d, 0x358e, 0x358e, 0x358e, + 0x358f, 0x358f, 0x3590, 0x3590, 0x3590, 0x3591, 0x3591, 0x3592, + 0x3592, 0x3592, 0x3593, 0x3593, 0x3594, 0x3594, 0x3594, 0x3595, + 0x3595, 0x3596, 0x3596, 0x3596, 0x3597, 0x3597, 0x3598, 0x3598, + 0x3598, 0x3599, 0x3599, 0x359a, 0x359a, 0x359a, 0x359b, 0x359b, + 0x359c, 0x359c, 0x359c, 0x359d, 0x359d, 0x359e, 0x359e, 0x359e, + 0x359f, 0x359f, 0x35a0, 0x35a0, 0x35a0, 0x35a1, 0x35a1, 0x35a2, + 0x35a2, 0x35a2, 0x35a3, 0x35a3, 0x35a4, 0x35a4, 0x35a4, 0x35a5, + 0x35a5, 0x35a6, 0x35a6, 0x35a6, 0x35a7, 0x35a7, 0x35a8, 0x35a8, + 0x35a8, 0x35a9, 0x35a9, 0x35aa, 0x35aa, 0x35aa, 0x35ab, 0x35ab, + 0x35ac, 0x35ac, 0x35ac, 0x35ad, 0x35ad, 0x35ad, 0x35ae, 0x35ae, + 0x35af, 0x35af, 0x35af, 0x35b0, 0x35b0, 0x35b1, 0x35b1, 0x35b1, + 0x35b2, 0x35b2, 0x35b3, 0x35b3, 0x35b3, 0x35b4, 0x35b4, 0x35b5, + 0x35b5, 0x35b5, 0x35b6, 0x35b6, 0x35b7, 0x35b7, 0x35b7, 0x35b8, + 0x35b8, 0x35b8, 0x35b9, 0x35b9, 0x35ba, 0x35ba, 0x35ba, 0x35bb, + 0x35bb, 0x35bc, 0x35bc, 0x35bc, 0x35bd, 0x35bd, 0x35be, 0x35be, + 0x35be, 0x35bf, 0x35bf, 0x35bf, 0x35c0, 0x35c0, 0x35c1, 0x35c1, + 0x35c1, 0x35c2, 0x35c2, 0x35c3, 0x35c3, 0x35c3, 0x35c4, 0x35c4, + 0x35c5, 0x35c5, 0x35c5, 0x35c6, 0x35c6, 0x35c6, 0x35c7, 0x35c7, + 0x35c8, 0x35c8, 0x35c8, 0x35c9, 0x35c9, 0x35ca, 0x35ca, 0x35ca, + 0x35cb, 0x35cb, 0x35cb, 0x35cc, 0x35cc, 0x35cd, 0x35cd, 0x35cd, + 0x35ce, 0x35ce, 0x35cf, 0x35cf, 0x35cf, 0x35d0, 0x35d0, 0x35d0, + 0x35d1, 0x35d1, 0x35d2, 0x35d2, 0x35d2, 0x35d3, 0x35d3, 0x35d3, + 0x35d4, 0x35d4, 0x35d5, 0x35d5, 0x35d5, 0x35d6, 0x35d6, 0x35d7, + 0x35d7, 0x35d7, 0x35d8, 0x35d8, 0x35d8, 0x35d9, 0x35d9, 0x35da, + 0x35da, 0x35da, 0x35db, 0x35db, 0x35db, 0x35dc, 0x35dc, 0x35dd, + 0x35dd, 0x35dd, 0x35de, 0x35de, 0x35df, 0x35df, 0x35df, 0x35e0, + 0x35e0, 0x35e0, 0x35e1, 0x35e1, 0x35e2, 0x35e2, 0x35e2, 0x35e3, + 0x35e3, 0x35e3, 0x35e4, 0x35e4, 0x35e5, 0x35e5, 0x35e5, 0x35e6, + 0x35e6, 0x35e6, 0x35e7, 0x35e7, 0x35e8, 0x35e8, 0x35e8, 0x35e9, + 0x35e9, 0x35e9, 0x35ea, 0x35ea, 0x35eb, 0x35eb, 0x35eb, 0x35ec, + 0x35ec, 0x35ec, 0x35ed, 0x35ed, 0x35ee, 0x35ee, 0x35ee, 0x35ef, + 0x35ef, 0x35ef, 0x35f0, 0x35f0, 0x35f1, 0x35f1, 0x35f1, 0x35f2, + 0x35f2, 0x35f2, 0x35f3, 0x35f3, 0x35f4, 0x35f4, 0x35f4, 0x35f5, + 0x35f5, 0x35f5, 0x35f6, 0x35f6, 0x35f7, 0x35f7, 0x35f7, 0x35f8, + 0x35f8, 0x35f8, 0x35f9, 0x35f9, 0x35f9, 0x35fa, 0x35fa, 0x35fb, + 0x35fb, 0x35fb, 0x35fc, 0x35fc, 0x35fc, 0x35fd, 0x35fd, 0x35fe, + 0x35fe, 0x35fe, 0x35ff, 0x35ff, 0x35ff, 0x3600, 0x3600, 0x3601, + 0x3601, 0x3601, 0x3602, 0x3602, 0x3602, 0x3603, 0x3603, 0x3603, + 0x3604, 0x3604, 0x3605, 0x3605, 0x3605, 0x3606, 0x3606, 0x3606, + 0x3607, 0x3607, 0x3607, 0x3608, 0x3608, 0x3609, 0x3609, 0x3609, + 0x360a, 0x360a, 0x360a, 0x360b, 0x360b, 0x360c, 0x360c, 0x360c, + 0x360d, 0x360d, 0x360d, 0x360e, 0x360e, 0x360e, 0x360f, 0x360f, + 0x3610, 0x3610, 0x3610, 0x3611, 0x3611, 0x3611, 0x3612, 0x3612, + 0x3612, 0x3613, 0x3613, 0x3614, 0x3614, 0x3614, 0x3615, 0x3615, + 0x3615, 0x3616, 0x3616, 0x3616, 0x3617, 0x3617, 0x3618, 0x3618, + 0x3618, 0x3619, 0x3619, 0x3619, 0x361a, 0x361a, 0x361a, 0x361b, + 0x361b, 0x361c, 0x361c, 0x361c, 0x361d, 0x361d, 0x361d, 0x361e, + 0x361e, 0x361e, 0x361f, 0x361f, 0x361f, 0x3620, 0x3620, 0x3621, + 0x3621, 0x3621, 0x3622, 0x3622, 0x3622, 0x3623, 0x3623, 0x3623, + 0x3624, 0x3624, 0x3624, 0x3625, 0x3625, 0x3626, 0x3626, 0x3626, + 0x3627, 0x3627, 0x3627, 0x3628, 0x3628, 0x3628, 0x3629, 0x3629, + 0x362a, 0x362a, 0x362a, 0x362b, 0x362b, 0x362b, 0x362c, 0x362c, + 0x362c, 0x362d, 0x362d, 0x362d, 0x362e, 0x362e, 0x362e, 0x362f, + 0x362f, 0x3630, 0x3630, 0x3630, 0x3631, 0x3631, 0x3631, 0x3632, + 0x3632, 0x3632, 0x3633, 0x3633, 0x3633, 0x3634, 0x3634, 0x3635, + 0x3635, 0x3635, 0x3636, 0x3636, 0x3636, 0x3637, 0x3637, 0x3637, + 0x3638, 0x3638, 0x3639, 0x363a, 0x363b, 0x363b, 0x363c, 0x363d, + 0x363d, 0x363e, 0x363f, 0x363f, 0x3640, 0x3641, 0x3642, 0x3642, + 0x3643, 0x3644, 0x3644, 0x3645, 0x3646, 0x3646, 0x3647, 0x3648, + 0x3649, 0x3649, 0x364a, 0x364b, 0x364b, 0x364c, 0x364d, 0x364d, + 0x364e, 0x364f, 0x3650, 0x3650, 0x3651, 0x3652, 0x3652, 0x3653, + 0x3654, 0x3654, 0x3655, 0x3656, 0x3656, 0x3657, 0x3658, 0x3659, + 0x3659, 0x365a, 0x365b, 0x365b, 0x365c, 0x365d, 0x365d, 0x365e, + 0x365f, 0x365f, 0x3660, 0x3661, 0x3661, 0x3662, 0x3663, 0x3664, + 0x3664, 0x3665, 0x3666, 0x3666, 0x3667, 0x3668, 0x3668, 0x3669, + 0x366a, 0x366a, 0x366b, 0x366c, 0x366c, 0x366d, 0x366e, 0x366e, + 0x366f, 0x3670, 0x3670, 0x3671, 0x3672, 0x3672, 0x3673, 0x3674, + 0x3674, 0x3675, 0x3676, 0x3677, 0x3677, 0x3678, 0x3679, 0x3679, + 0x367a, 0x367b, 0x367b, 0x367c, 0x367d, 0x367d, 0x367e, 0x367f, + 0x367f, 0x3680, 0x3681, 0x3681, 0x3682, 0x3683, 0x3683, 0x3684, + 0x3685, 0x3685, 0x3686, 0x3687, 0x3687, 0x3688, 0x3689, 0x3689, + 0x368a, 0x368b, 0x368b, 0x368c, 0x368d, 0x368d, 0x368e, 0x368f, + 0x368f, 0x3690, 0x3691, 0x3691, 0x3692, 0x3693, 0x3693, 0x3694, + 0x3695, 0x3695, 0x3696, 0x3697, 0x3697, 0x3698, 0x3698, 0x3699, + 0x369a, 0x369a, 0x369b, 0x369c, 0x369c, 0x369d, 0x369e, 0x369e, + 0x369f, 0x36a0, 0x36a0, 0x36a1, 0x36a2, 0x36a2, 0x36a3, 0x36a4, + 0x36a4, 0x36a5, 0x36a6, 0x36a6, 0x36a7, 0x36a8, 0x36a8, 0x36a9, + 0x36aa, 0x36aa, 0x36ab, 0x36ab, 0x36ac, 0x36ad, 0x36ad, 0x36ae, + 0x36af, 0x36af, 0x36b0, 0x36b1, 0x36b1, 0x36b2, 0x36b3, 0x36b3, + 0x36b4, 0x36b5, 0x36b5, 0x36b6, 0x36b6, 0x36b7, 0x36b8, 0x36b8, + 0x36b9, 0x36ba, 0x36ba, 0x36bb, 0x36bc, 0x36bc, 0x36bd, 0x36be, + 0x36be, 0x36bf, 0x36bf, 0x36c0, 0x36c1, 0x36c1, 0x36c2, 0x36c3, + 0x36c3, 0x36c4, 0x36c5, 0x36c5, 0x36c6, 0x36c6, 0x36c7, 0x36c8, + 0x36c8, 0x36c9, 0x36ca, 0x36ca, 0x36cb, 0x36cc, 0x36cc, 0x36cd, + 0x36cd, 0x36ce, 0x36cf, 0x36cf, 0x36d0, 0x36d1, 0x36d1, 0x36d2, + 0x36d3, 0x36d3, 0x36d4, 0x36d4, 0x36d5, 0x36d6, 0x36d6, 0x36d7, + 0x36d8, 0x36d8, 0x36d9, 0x36d9, 0x36da, 0x36db, 0x36db, 0x36dc, + 0x36dd, 0x36dd, 0x36de, 0x36de, 0x36df, 0x36e0, 0x36e0, 0x36e1, + 0x36e2, 0x36e2, 0x36e3, 0x36e4, 0x36e4, 0x36e5, 0x36e5, 0x36e6, + 0x36e7, 0x36e7, 0x36e8, 0x36e8, 0x36e9, 0x36ea, 0x36ea, 0x36eb, + 0x36ec, 0x36ec, 0x36ed, 0x36ed, 0x36ee, 0x36ef, 0x36ef, 0x36f0, + 0x36f1, 0x36f1, 0x36f2, 0x36f2, 0x36f3, 0x36f4, 0x36f4, 0x36f5, + 0x36f6, 0x36f6, 0x36f7, 0x36f7, 0x36f8, 0x36f9, 0x36f9, 0x36fa, + 0x36fa, 0x36fb, 0x36fc, 0x36fc, 0x36fd, 0x36fe, 0x36fe, 0x36ff, + 0x36ff, 0x3700, 0x3701, 0x3701, 0x3702, 0x3702, 0x3703, 0x3704, + 0x3704, 0x3705, 0x3705, 0x3706, 0x3707, 0x3707, 0x3708, 0x3709, + 0x3709, 0x370a, 0x370a, 0x370b, 0x370c, 0x370c, 0x370d, 0x370d, + 0x370e, 0x370f, 0x370f, 0x3710, 0x3710, 0x3711, 0x3712, 0x3712, + 0x3713, 0x3713, 0x3714, 0x3715, 0x3715, 0x3716, 0x3716, 0x3717, + 0x3718, 0x3718, 0x3719, 0x3719, 0x371a, 0x371b, 0x371b, 0x371c, + 0x371d, 0x371d, 0x371e, 0x371e, 0x371f, 0x3720, 0x3720, 0x3721, + 0x3721, 0x3722, 0x3723, 0x3723, 0x3724, 0x3724, 0x3725, 0x3725, + 0x3726, 0x3727, 0x3727, 0x3728, 0x3728, 0x3729, 0x372a, 0x372a, + 0x372b, 0x372b, 0x372c, 0x372d, 0x372d, 0x372e, 0x372e, 0x372f, + 0x3730, 0x3730, 0x3731, 0x3731, 0x3732, 0x3733, 0x3733, 0x3734, + 0x3734, 0x3735, 0x3736, 0x3736, 0x3737, 0x3737, 0x3738, 0x3739, + 0x3739, 0x373a, 0x373a, 0x373b, 0x373b, 0x373c, 0x373d, 0x373d, + 0x373e, 0x373e, 0x373f, 0x3740, 0x3740, 0x3741, 0x3741, 0x3742, + 0x3743, 0x3743, 0x3744, 0x3744, 0x3745, 0x3745, 0x3746, 0x3747, + 0x3747, 0x3748, 0x3748, 0x3749, 0x374a, 0x374a, 0x374b, 0x374b, + 0x374c, 0x374c, 0x374d, 0x374e, 0x374e, 0x374f, 0x374f, 0x3750, + 0x3751, 0x3751, 0x3752, 0x3752, 0x3753, 0x3753, 0x3754, 0x3755, + 0x3755, 0x3756, 0x3756, 0x3757, 0x3757, 0x3758, 0x3759, 0x3759, + 0x375a, 0x375a, 0x375b, 0x375c, 0x375c, 0x375d, 0x375d, 0x375e, + 0x375e, 0x375f, 0x3760, 0x3760, 0x3761, 0x3761, 0x3762, 0x3762, + 0x3763, 0x3764, 0x3764, 0x3765, 0x3765, 0x3766, 0x3766, 0x3767, + 0x3768, 0x3768, 0x3769, 0x3769, 0x376a, 0x376a, 0x376b, 0x376c, + 0x376c, 0x376d, 0x376d, 0x376e, 0x376e, 0x376f, 0x3770, 0x3770, + 0x3771, 0x3771, 0x3772, 0x3772, 0x3773, 0x3774, 0x3774, 0x3775, + 0x3775, 0x3776, 0x3776, 0x3777, 0x3778, 0x3778, 0x3779, 0x3779, + 0x377a, 0x377a, 0x377b, 0x377c, 0x377c, 0x377d, 0x377d, 0x377e, + 0x377e, 0x377f, 0x377f, 0x3780, 0x3781, 0x3781, 0x3782, 0x3782, + 0x3783, 0x3783, 0x3784, 0x3785, 0x3785, 0x3786, 0x3786, 0x3787, + 0x3787, 0x3788, 0x3788, 0x3789, 0x378a, 0x378a, 0x378b, 0x378b, + 0x378c, 0x378c, 0x378d, 0x378e, 0x378e, 0x378f, 0x378f, 0x3790, + 0x3790, 0x3791, 0x3791, 0x3792, 0x3793, 0x3793, 0x3794, 0x3794, + 0x3795, 0x3795, 0x3796, 0x3796, 0x3797, 0x3798, 0x3798, 0x3799, + 0x3799, 0x379a, 0x379a, 0x379b, 0x379b, 0x379c, 0x379d, 0x379d, + 0x379e, 0x379e, 0x379f, 0x379f, 0x37a0, 0x37a0, 0x37a1, 0x37a2, + 0x37a2, 0x37a3, 0x37a3, 0x37a4, 0x37a4, 0x37a5, 0x37a5, 0x37a6, + 0x37a7, 0x37a7, 0x37a8, 0x37a8, 0x37a9, 0x37a9, 0x37aa, 0x37aa, + 0x37ab, 0x37ab, 0x37ac, 0x37ad, 0x37ad, 0x37ae, 0x37ae, 0x37af, + 0x37af, 0x37b0, 0x37b0, 0x37b1, 0x37b2, 0x37b2, 0x37b3, 0x37b3, + 0x37b4, 0x37b4, 0x37b5, 0x37b5, 0x37b6, 0x37b6, 0x37b7, 0x37b8, + 0x37b8, 0x37b9, 0x37b9, 0x37ba, 0x37ba, 0x37bb, 0x37bb, 0x37bc, + 0x37bc, 0x37bd, 0x37bd, 0x37be, 0x37bf, 0x37bf, 0x37c0, 0x37c0, + 0x37c1, 0x37c1, 0x37c2, 0x37c2, 0x37c3, 0x37c3, 0x37c4, 0x37c5, + 0x37c5, 0x37c6, 0x37c6, 0x37c7, 0x37c7, 0x37c8, 0x37c8, 0x37c9, + 0x37c9, 0x37ca, 0x37ca, 0x37cb, 0x37cc, 0x37cc, 0x37cd, 0x37cd, + 0x37ce, 0x37ce, 0x37cf, 0x37cf, 0x37d0, 0x37d0, 0x37d1, 0x37d1, + 0x37d2, 0x37d3, 0x37d3, 0x37d4, 0x37d4, 0x37d5, 0x37d5, 0x37d6, + 0x37d6, 0x37d7, 0x37d7, 0x37d8, 0x37d8, 0x37d9, 0x37da, 0x37da, + 0x37db, 0x37db, 0x37dc, 0x37dc, 0x37dd, 0x37dd, 0x37de, 0x37de, + 0x37df, 0x37df, 0x37e0, 0x37e0, 0x37e1, 0x37e2, 0x37e2, 0x37e3, + 0x37e3, 0x37e4, 0x37e4, 0x37e5, 0x37e5, 0x37e6, 0x37e6, 0x37e7, + 0x37e7, 0x37e8, 0x37e8, 0x37e9, 0x37e9, 0x37ea, 0x37eb, 0x37eb, + 0x37ec, 0x37ec, 0x37ed, 0x37ed, 0x37ee, 0x37ee, 0x37ef, 0x37ef, + 0x37f0, 0x37f0, 0x37f1, 0x37f1, 0x37f2, 0x37f2, 0x37f3, 0x37f3, + 0x37f4, 0x37f5, 0x37f5, 0x37f6, 0x37f6, 0x37f7, 0x37f7, 0x37f8, + 0x37f8, 0x37f9, 0x37f9, 0x37fa, 0x37fa, 0x37fb, 0x37fb, 0x37fc, + 0x37fc, 0x37fd, 0x37fd, 0x37fe, 0x37fe, 0x37ff, 0x3800, 0x3800, + 0x3800, 0x3801, 0x3801, 0x3801, 0x3801, 0x3802, 0x3802, 0x3802, + 0x3802, 0x3803, 0x3803, 0x3803, 0x3803, 0x3804, 0x3804, 0x3804, + 0x3804, 0x3805, 0x3805, 0x3805, 0x3805, 0x3806, 0x3806, 0x3806, + 0x3807, 0x3807, 0x3807, 0x3807, 0x3808, 0x3808, 0x3808, 0x3808, + 0x3809, 0x3809, 0x3809, 0x3809, 0x380a, 0x380a, 0x380a, 0x380a, + 0x380b, 0x380b, 0x380b, 0x380b, 0x380c, 0x380c, 0x380c, 0x380c, + 0x380d, 0x380d, 0x380d, 0x380d, 0x380e, 0x380e, 0x380e, 0x380f, + 0x380f, 0x380f, 0x380f, 0x3810, 0x3810, 0x3810, 0x3810, 0x3811, + 0x3811, 0x3811, 0x3811, 0x3812, 0x3812, 0x3812, 0x3812, 0x3813, + 0x3813, 0x3813, 0x3813, 0x3814, 0x3814, 0x3814, 0x3814, 0x3815, + 0x3815, 0x3815, 0x3815, 0x3816, 0x3816, 0x3816, 0x3816, 0x3817, + 0x3817, 0x3817, 0x3817, 0x3818, 0x3818, 0x3818, 0x3818, 0x3819, + 0x3819, 0x3819, 0x3819, 0x381a, 0x381a, 0x381a, 0x381b, 0x381b, + 0x381b, 0x381b, 0x381c, 0x381c, 0x381c, 0x381c, 0x381d, 0x381d, + 0x381d, 0x381d, 0x381e, 0x381e, 0x381e, 0x381e, 0x381f, 0x381f, + 0x381f, 0x381f, 0x3820, 0x3820, 0x3820, 0x3820, 0x3821, 0x3821, + 0x3821, 0x3821, 0x3822, 0x3822, 0x3822, 0x3822, 0x3823, 0x3823, + 0x3823, 0x3823, 0x3824, 0x3824, 0x3824, 0x3824, 0x3825, 0x3825, + 0x3825, 0x3825, 0x3826, 0x3826, 0x3826, 0x3826, 0x3827, 0x3827, + 0x3827, 0x3827, 0x3828, 0x3828, 0x3828, 0x3828, 0x3829, 0x3829, + 0x3829, 0x3829, 0x382a, 0x382a, 0x382a, 0x382a, 0x382b, 0x382b, + 0x382b, 0x382b, 0x382c, 0x382c, 0x382c, 0x382c, 0x382d, 0x382d, + 0x382d, 0x382d, 0x382e, 0x382e, 0x382e, 0x382e, 0x382f, 0x382f, + 0x382f, 0x382f, 0x3830, 0x3830, 0x3830, 0x3830, 0x3831, 0x3831, + 0x3831, 0x3831, 0x3831, 0x3832, 0x3832, 0x3832, 0x3832, 0x3833, + 0x3833, 0x3833, 0x3833, 0x3834, 0x3834, 0x3834, 0x3834, 0x3835, + 0x3835, 0x3835, 0x3835, 0x3836, 0x3836, 0x3836, 0x3836, 0x3837, + 0x3837, 0x3837, 0x3837, 0x3838, 0x3838, 0x3838, 0x3838, 0x3839, + 0x3839, 0x3839, 0x3839, 0x383a, 0x383a, 0x383a, 0x383a, 0x383b, + 0x383b, 0x383b, 0x383b, 0x383c, 0x383c, 0x383c, 0x383c, 0x383d, + 0x383d, 0x383d, 0x383d, 0x383e, 0x383e, 0x383e, 0x383e, 0x383e, + 0x383f, 0x383f, 0x383f, 0x383f, 0x3840, 0x3840, 0x3840, 0x3840, + 0x3841, 0x3841, 0x3841, 0x3841, 0x3842, 0x3842, 0x3842, 0x3842, + 0x3843, 0x3843, 0x3844, 0x3844, 0x3845, 0x3845, 0x3846, 0x3846, + 0x3846, 0x3847, 0x3847, 0x3848, 0x3848, 0x3849, 0x3849, 0x384a, + 0x384a, 0x384b, 0x384b, 0x384c, 0x384c, 0x384d, 0x384d, 0x384e, + 0x384e, 0x384f, 0x384f, 0x3850, 0x3850, 0x3851, 0x3851, 0x3851, + 0x3852, 0x3852, 0x3853, 0x3853, 0x3854, 0x3854, 0x3855, 0x3855, + 0x3856, 0x3856, 0x3857, 0x3857, 0x3858, 0x3858, 0x3859, 0x3859, + 0x385a, 0x385a, 0x385a, 0x385b, 0x385b, 0x385c, 0x385c, 0x385d, + 0x385d, 0x385e, 0x385e, 0x385f, 0x385f, 0x3860, 0x3860, 0x3861, + 0x3861, 0x3862, 0x3862, 0x3862, 0x3863, 0x3863, 0x3864, 0x3864, + 0x3865, 0x3865, 0x3866, 0x3866, 0x3867, 0x3867, 0x3868, 0x3868, + 0x3869, 0x3869, 0x3869, 0x386a, 0x386a, 0x386b, 0x386b, 0x386c, + 0x386c, 0x386d, 0x386d, 0x386e, 0x386e, 0x386f, 0x386f, 0x386f, + 0x3870, 0x3870, 0x3871, 0x3871, 0x3872, 0x3872, 0x3873, 0x3873, + 0x3874, 0x3874, 0x3875, 0x3875, 0x3875, 0x3876, 0x3876, 0x3877, + 0x3877, 0x3878, 0x3878, 0x3879, 0x3879, 0x387a, 0x387a, 0x387a, + 0x387b, 0x387b, 0x387c, 0x387c, 0x387d, 0x387d, 0x387e, 0x387e, + 0x387f, 0x387f, 0x387f, 0x3880, 0x3880, 0x3881, 0x3881, 0x3882, + 0x3882, 0x3883, 0x3883, 0x3884, 0x3884, 0x3884, 0x3885, 0x3885, + 0x3886, 0x3886, 0x3887, 0x3887, 0x3888, 0x3888, 0x3889, 0x3889, + 0x3889, 0x388a, 0x388a, 0x388b, 0x388b, 0x388c, 0x388c, 0x388d, + 0x388d, 0x388d, 0x388e, 0x388e, 0x388f, 0x388f, 0x3890, 0x3890, + 0x3891, 0x3891, 0x3891, 0x3892, 0x3892, 0x3893, 0x3893, 0x3894, + 0x3894, 0x3895, 0x3895, 0x3895, 0x3896, 0x3896, 0x3897, 0x3897, + 0x3898, 0x3898, 0x3899, 0x3899, 0x3899, 0x389a, 0x389a, 0x389b, + 0x389b, 0x389c, 0x389c, 0x389d, 0x389d, 0x389d, 0x389e, 0x389e, + 0x389f, 0x389f, 0x38a0, 0x38a0, 0x38a0, 0x38a1, 0x38a1, 0x38a2, + 0x38a2, 0x38a3, 0x38a3, 0x38a4, 0x38a4, 0x38a4, 0x38a5, 0x38a5, + 0x38a6, 0x38a6, 0x38a7, 0x38a7, 0x38a7, 0x38a8, 0x38a8, 0x38a9, + 0x38a9, 0x38aa, 0x38aa, 0x38ab, 0x38ab, 0x38ab, 0x38ac, 0x38ac, + 0x38ad, 0x38ad, 0x38ae, 0x38ae, 0x38ae, 0x38af, 0x38af, 0x38b0, + 0x38b0, 0x38b1, 0x38b1, 0x38b1, 0x38b2, 0x38b2, 0x38b3, 0x38b3, + 0x38b4, 0x38b4, 0x38b4, 0x38b5, 0x38b5, 0x38b6, 0x38b6, 0x38b7, + 0x38b7, 0x38b7, 0x38b8, 0x38b8, 0x38b9, 0x38b9, 0x38ba, 0x38ba, + 0x38ba, 0x38bb, 0x38bb, 0x38bc, 0x38bc, 0x38bd, 0x38bd, 0x38bd, + 0x38be, 0x38be, 0x38bf, 0x38bf, 0x38c0, 0x38c0, 0x38c0, 0x38c1, + 0x38c1, 0x38c2, 0x38c2, 0x38c3, 0x38c3, 0x38c3, 0x38c4, 0x38c4, + 0x38c5, 0x38c5, 0x38c5, 0x38c6, 0x38c6, 0x38c7, 0x38c7, 0x38c8, + 0x38c8, 0x38c8, 0x38c9, 0x38c9, 0x38ca, 0x38ca, 0x38cb, 0x38cb, + 0x38cb, 0x38cc, 0x38cc, 0x38cd, 0x38cd, 0x38cd, 0x38ce, 0x38ce, + 0x38cf, 0x38cf, 0x38d0, 0x38d0, 0x38d0, 0x38d1, 0x38d1, 0x38d2, + 0x38d2, 0x38d3, 0x38d3, 0x38d3, 0x38d4, 0x38d4, 0x38d5, 0x38d5, + 0x38d5, 0x38d6, 0x38d6, 0x38d7, 0x38d7, 0x38d8, 0x38d8, 0x38d8, + 0x38d9, 0x38d9, 0x38da, 0x38da, 0x38da, 0x38db, 0x38db, 0x38dc, + 0x38dc, 0x38dc, 0x38dd, 0x38dd, 0x38de, 0x38de, 0x38df, 0x38df, + 0x38df, 0x38e0, 0x38e0, 0x38e1, 0x38e1, 0x38e1, 0x38e2, 0x38e2, + 0x38e3, 0x38e3, 0x38e3, 0x38e4, 0x38e4, 0x38e5, 0x38e5, 0x38e6, + 0x38e6, 0x38e6, 0x38e7, 0x38e7, 0x38e8, 0x38e8, 0x38e8, 0x38e9, + 0x38e9, 0x38ea, 0x38ea, 0x38ea, 0x38eb, 0x38eb, 0x38ec, 0x38ec, + 0x38ec, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ef, 0x38ef, + 0x38f0, 0x38f0, 0x38f1, 0x38f1, 0x38f1, 0x38f2, 0x38f2, 0x38f3, + 0x38f3, 0x38f3, 0x38f4, 0x38f4, 0x38f5, 0x38f5, 0x38f5, 0x38f6, + 0x38f6, 0x38f7, 0x38f7, 0x38f7, 0x38f8, 0x38f8, 0x38f9, 0x38f9, + 0x38f9, 0x38fa, 0x38fa, 0x38fb, 0x38fb, 0x38fb, 0x38fc, 0x38fc, + 0x38fd, 0x38fd, 0x38fd, 0x38fe, 0x38fe, 0x38ff, 0x38ff, 0x38ff, + 0x3900, 0x3900, 0x3901, 0x3901, 0x3901, 0x3902, 0x3902, 0x3903, + 0x3903, 0x3903, 0x3904, 0x3904, 0x3905, 0x3905, 0x3905, 0x3906, + 0x3906, 0x3907, 0x3907, 0x3907, 0x3908, 0x3908, 0x3909, 0x3909, + 0x3909, 0x390a, 0x390a, 0x390b, 0x390b, 0x390b, 0x390c, 0x390c, + 0x390d, 0x390d, 0x390d, 0x390e, 0x390e, 0x390f, 0x390f, 0x390f, + 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3912, 0x3912, 0x3912, + 0x3913, 0x3913, 0x3914, 0x3914, 0x3914, 0x3915, 0x3915, 0x3916, + 0x3916, 0x3916, 0x3917, 0x3917, 0x3918, 0x3918, 0x3918, 0x3919, + 0x3919, 0x3919, 0x391a, 0x391a, 0x391b, 0x391b, 0x391b, 0x391c, + 0x391c, 0x391d, 0x391d, 0x391d, 0x391e, 0x391e, 0x391f, 0x391f, + 0x391f, 0x3920, 0x3920, 0x3920, 0x3921, 0x3921, 0x3922, 0x3922, + 0x3922, 0x3923, 0x3923, 0x3924, 0x3924, 0x3924, 0x3925, 0x3925, + 0x3926, 0x3926, 0x3926, 0x3927, 0x3927, 0x3927, 0x3928, 0x3928, + 0x3929, 0x3929, 0x3929, 0x392a, 0x392a, 0x392b, 0x392b, 0x392b, + 0x392c, 0x392c, 0x392c, 0x392d, 0x392d, 0x392e, 0x392e, 0x392e, + 0x392f, 0x392f, 0x392f, 0x3930, 0x3930, 0x3931, 0x3931, 0x3931, + 0x3932, 0x3932, 0x3933, 0x3933, 0x3933, 0x3934, 0x3934, 0x3934, + 0x3935, 0x3935, 0x3936, 0x3936, 0x3936, 0x3937, 0x3937, 0x3937, + 0x3938, 0x3938, 0x3939, 0x3939, 0x3939, 0x393a, 0x393a, 0x393b, + 0x393b, 0x393b, 0x393c, 0x393c, 0x393c, 0x393d, 0x393d, 0x393e, + 0x393e, 0x393e, 0x393f, 0x393f, 0x393f, 0x3940, 0x3940, 0x3941, + 0x3941, 0x3941, 0x3942, 0x3942, 0x3942, 0x3943, 0x3943, 0x3944, + 0x3944, 0x3944, 0x3945, 0x3945, 0x3945, 0x3946, 0x3946, 0x3947, + 0x3947, 0x3947, 0x3948, 0x3948, 0x3948, 0x3949, 0x3949, 0x394a, + 0x394a, 0x394a, 0x394b, 0x394b, 0x394b, 0x394c, 0x394c, 0x394d, + 0x394d, 0x394d, 0x394e, 0x394e, 0x394e, 0x394f, 0x394f, 0x3950, + 0x3950, 0x3950, 0x3951, 0x3951, 0x3951, 0x3952, 0x3952, 0x3953, + 0x3953, 0x3953, 0x3954, 0x3954, 0x3954, 0x3955, 0x3955, 0x3955, + 0x3956, 0x3956, 0x3957, 0x3957, 0x3957, 0x3958, 0x3958, 0x3958, + 0x3959, 0x3959, 0x395a, 0x395a, 0x395a, 0x395b, 0x395b, 0x395b, + 0x395c, 0x395c, 0x395c, 0x395d, 0x395d, 0x395e, 0x395e, 0x395e, + 0x395f, 0x395f, 0x395f, 0x3960, 0x3960, 0x3961, 0x3961, 0x3961, + 0x3962, 0x3962, 0x3962, 0x3963, 0x3963, 0x3963, 0x3964, 0x3964, + 0x3965, 0x3965, 0x3965, 0x3966, 0x3966, 0x3966, 0x3967, 0x3967, + 0x3967, 0x3968, 0x3968, 0x3969, 0x3969, 0x3969, 0x396a, 0x396a, + 0x396a, 0x396b, 0x396b, 0x396b, 0x396c, 0x396c, 0x396d, 0x396d, + 0x396d, 0x396e, 0x396e, 0x396e, 0x396f, 0x396f, 0x396f, 0x3970, + 0x3970, 0x3970, 0x3971, 0x3971, 0x3972, 0x3972, 0x3972, 0x3973, + 0x3973, 0x3973, 0x3974, 0x3974, 0x3974, 0x3975, 0x3975, 0x3976, + 0x3976, 0x3976, 0x3977, 0x3977, 0x3977, 0x3978, 0x3978, 0x3978, + 0x3979, 0x3979, 0x3979, 0x397a, 0x397a, 0x397b, 0x397b, 0x397b, + 0x397c, 0x397c, 0x397c, 0x397d, 0x397d, 0x397d, 0x397e, 0x397e, + 0x397e, 0x397f, 0x397f, 0x3980, 0x3980, 0x3980, 0x3981, 0x3981, + 0x3981, 0x3982, 0x3982, 0x3982, 0x3983, 0x3983, 0x3983, 0x3984, + 0x3984, 0x3985, 0x3985, 0x3985, 0x3986, 0x3986, 0x3986, 0x3987, + 0x3987, 0x3987, 0x3988, 0x3988, 0x3988, 0x3989, 0x3989, 0x398a, + 0x398a, 0x398a, 0x398b, 0x398b, 0x398b, 0x398c, 0x398c, 0x398c, + 0x398d, 0x398d, 0x398d, 0x398e, 0x398e, 0x398e, 0x398f, 0x398f, + 0x398f, 0x3990, 0x3990, 0x3991, 0x3991, 0x3991, 0x3992, 0x3992, + 0x3992, 0x3993, 0x3993, 0x3993, 0x3994, 0x3994, 0x3994, 0x3995, + 0x3995, 0x3995, 0x3996, 0x3996, 0x3997, 0x3997, 0x3997, 0x3998, + 0x3998, 0x3998, 0x3999, 0x3999, 0x3999, 0x399a, 0x399a, 0x399a, + 0x399b, 0x399b, 0x399b, 0x399c, 0x399c, 0x399c, 0x399d, 0x399d, + 0x399d, 0x399e, 0x399e, 0x399f, 0x399f, 0x399f, 0x39a0, 0x39a0, + 0x39a0, 0x39a1, 0x39a1, 0x39a1, 0x39a2, 0x39a2, 0x39a2, 0x39a3, + 0x39a3, 0x39a3, 0x39a4, 0x39a4, 0x39a4, 0x39a5, 0x39a5, 0x39a5, + 0x39a6, 0x39a6, 0x39a6, 0x39a7, 0x39a7, 0x39a8, 0x39a8, 0x39a8, + 0x39a9, 0x39a9, 0x39a9, 0x39aa, 0x39aa, 0x39aa, 0x39ab, 0x39ab, + 0x39ab, 0x39ac, 0x39ac, 0x39ac, 0x39ad, 0x39ad, 0x39ad, 0x39ae, + 0x39ae, 0x39ae, 0x39af, 0x39af, 0x39af, 0x39b0, 0x39b0, 0x39b0, + 0x39b1, 0x39b1, 0x39b1, 0x39b2, 0x39b2, 0x39b2, 0x39b3, 0x39b3, + 0x39b4, 0x39b4, 0x39b4, 0x39b5, 0x39b5, 0x39b5, 0x39b6, 0x39b6, + 0x39b6, 0x39b7, 0x39b7, 0x39b7, 0x39b8, 0x39b8, 0x39b8, 0x39b9, + 0x39b9, 0x39b9, 0x39ba, 0x39ba, 0x39ba, 0x39bb, 0x39bb, 0x39bb, + 0x39bc, 0x39bc, 0x39bc, 0x39bd, 0x39bd, 0x39bd, 0x39be, 0x39be, + 0x39be, 0x39bf, 0x39bf, 0x39bf, 0x39c0, 0x39c0, 0x39c0, 0x39c1, + 0x39c1, 0x39c1, 0x39c2, 0x39c2, 0x39c2, 0x39c3, 0x39c3, 0x39c3, + 0x39c4, 0x39c4, 0x39c4, 0x39c5, 0x39c5, 0x39c5, 0x39c6, 0x39c6, + 0x39c6, 0x39c7, 0x39c7, 0x39c7, 0x39c8, 0x39c8, 0x39c8, 0x39c9, + 0x39c9, 0x39ca, 0x39ca, 0x39ca, 0x39cb, 0x39cb, 0x39cb, 0x39cc, + 0x39cc, 0x39cc, 0x39cd, 0x39cd, 0x39cd, 0x39ce, 0x39ce, 0x39ce, + 0x39cf, 0x39cf, 0x39cf, 0x39d0, 0x39d0, 0x39d0, 0x39d1, 0x39d1, + 0x39d1, 0x39d2, 0x39d2, 0x39d2, 0x39d3, 0x39d3, 0x39d3, 0x39d4, + 0x39d4, 0x39d4, 0x39d5, 0x39d5, 0x39d5, 0x39d6, 0x39d6, 0x39d6, + 0x39d7, 0x39d7, 0x39d8, 0x39d8, 0x39d9, 0x39da, 0x39da, 0x39db, + 0x39dc, 0x39dc, 0x39dd, 0x39de, 0x39de, 0x39df, 0x39e0, 0x39e0, + 0x39e1, 0x39e2, 0x39e2, 0x39e3, 0x39e4, 0x39e4, 0x39e5, 0x39e6, + 0x39e6, 0x39e7, 0x39e8, 0x39e8, 0x39e9, 0x39ea, 0x39ea, 0x39eb, + 0x39ec, 0x39ec, 0x39ed, 0x39ee, 0x39ee, 0x39ef, 0x39ef, 0x39f0, + 0x39f1, 0x39f1, 0x39f2, 0x39f3, 0x39f3, 0x39f4, 0x39f5, 0x39f5, + 0x39f6, 0x39f7, 0x39f7, 0x39f8, 0x39f9, 0x39f9, 0x39fa, 0x39fa, + 0x39fb, 0x39fc, 0x39fc, 0x39fd, 0x39fe, 0x39fe, 0x39ff, 0x3a00, + 0x3a00, 0x3a01, 0x3a02, 0x3a02, 0x3a03, 0x3a03, 0x3a04, 0x3a05, + 0x3a05, 0x3a06, 0x3a07, 0x3a07, 0x3a08, 0x3a09, 0x3a09, 0x3a0a, + 0x3a0a, 0x3a0b, 0x3a0c, 0x3a0c, 0x3a0d, 0x3a0e, 0x3a0e, 0x3a0f, + 0x3a10, 0x3a10, 0x3a11, 0x3a11, 0x3a12, 0x3a13, 0x3a13, 0x3a14, + 0x3a15, 0x3a15, 0x3a16, 0x3a17, 0x3a17, 0x3a18, 0x3a18, 0x3a19, + 0x3a1a, 0x3a1a, 0x3a1b, 0x3a1c, 0x3a1c, 0x3a1d, 0x3a1d, 0x3a1e, + 0x3a1f, 0x3a1f, 0x3a20, 0x3a21, 0x3a21, 0x3a22, 0x3a22, 0x3a23, + 0x3a24, 0x3a24, 0x3a25, 0x3a26, 0x3a26, 0x3a27, 0x3a27, 0x3a28, + 0x3a29, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2b, 0x3a2c, 0x3a2c, 0x3a2d, + 0x3a2e, 0x3a2e, 0x3a2f, 0x3a30, 0x3a30, 0x3a31, 0x3a31, 0x3a32, + 0x3a33, 0x3a33, 0x3a34, 0x3a34, 0x3a35, 0x3a36, 0x3a36, 0x3a37, + 0x3a38, 0x3a38, 0x3a39, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3b, 0x3a3c, + 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3e, 0x3a3f, 0x3a40, 0x3a40, 0x3a41, + 0x3a41, 0x3a42, 0x3a43, 0x3a43, 0x3a44, 0x3a44, 0x3a45, 0x3a46, + 0x3a46, 0x3a47, 0x3a47, 0x3a48, 0x3a49, 0x3a49, 0x3a4a, 0x3a4a, + 0x3a4b, 0x3a4c, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4e, 0x3a4f, 0x3a4f, + 0x3a50, 0x3a51, 0x3a51, 0x3a52, 0x3a52, 0x3a53, 0x3a54, 0x3a54, + 0x3a55, 0x3a55, 0x3a56, 0x3a57, 0x3a57, 0x3a58, 0x3a58, 0x3a59, + 0x3a5a, 0x3a5a, 0x3a5b, 0x3a5b, 0x3a5c, 0x3a5d, 0x3a5d, 0x3a5e, + 0x3a5e, 0x3a5f, 0x3a60, 0x3a60, 0x3a61, 0x3a61, 0x3a62, 0x3a63, + 0x3a63, 0x3a64, 0x3a64, 0x3a65, 0x3a66, 0x3a66, 0x3a67, 0x3a67, + 0x3a68, 0x3a68, 0x3a69, 0x3a6a, 0x3a6a, 0x3a6b, 0x3a6b, 0x3a6c, + 0x3a6d, 0x3a6d, 0x3a6e, 0x3a6e, 0x3a6f, 0x3a70, 0x3a70, 0x3a71, + 0x3a71, 0x3a72, 0x3a73, 0x3a73, 0x3a74, 0x3a74, 0x3a75, 0x3a75, + 0x3a76, 0x3a77, 0x3a77, 0x3a78, 0x3a78, 0x3a79, 0x3a7a, 0x3a7a, + 0x3a7b, 0x3a7b, 0x3a7c, 0x3a7c, 0x3a7d, 0x3a7e, 0x3a7e, 0x3a7f, + 0x3a7f, 0x3a80, 0x3a81, 0x3a81, 0x3a82, 0x3a82, 0x3a83, 0x3a83, + 0x3a84, 0x3a85, 0x3a85, 0x3a86, 0x3a86, 0x3a87, 0x3a88, 0x3a88, + 0x3a89, 0x3a89, 0x3a8a, 0x3a8a, 0x3a8b, 0x3a8c, 0x3a8c, 0x3a8d, + 0x3a8d, 0x3a8e, 0x3a8f, 0x3a8f, 0x3a90, 0x3a90, 0x3a91, 0x3a91, + 0x3a92, 0x3a93, 0x3a93, 0x3a94, 0x3a94, 0x3a95, 0x3a95, 0x3a96, + 0x3a97, 0x3a97, 0x3a98, 0x3a98, 0x3a99, 0x3a99, 0x3a9a, 0x3a9b, + 0x3a9b, 0x3a9c, 0x3a9c, 0x3a9d, 0x3a9d, 0x3a9e, 0x3a9f, 0x3a9f, + 0x3aa0, 0x3aa0, 0x3aa1, 0x3aa1, 0x3aa2, 0x3aa3, 0x3aa3, 0x3aa4, + 0x3aa4, 0x3aa5, 0x3aa5, 0x3aa6, 0x3aa7, 0x3aa7, 0x3aa8, 0x3aa8, + 0x3aa9, 0x3aa9, 0x3aaa, 0x3aaa, 0x3aab, 0x3aac, 0x3aac, 0x3aad, + 0x3aad, 0x3aae, 0x3aae, 0x3aaf, 0x3ab0, 0x3ab0, 0x3ab1, 0x3ab1, + 0x3ab2, 0x3ab2, 0x3ab3, 0x3ab4, 0x3ab4, 0x3ab5, 0x3ab5, 0x3ab6, + 0x3ab6, 0x3ab7, 0x3ab7, 0x3ab8, 0x3ab9, 0x3ab9, 0x3aba, 0x3aba, + 0x3abb, 0x3abb, 0x3abc, 0x3abc, 0x3abd, 0x3abe, 0x3abe, 0x3abf, + 0x3abf, 0x3ac0, 0x3ac0, 0x3ac1, 0x3ac2, 0x3ac2, 0x3ac3, 0x3ac3, + 0x3ac4, 0x3ac4, 0x3ac5, 0x3ac5, 0x3ac6, 0x3ac7, 0x3ac7, 0x3ac8, + 0x3ac8, 0x3ac9, 0x3ac9, 0x3aca, 0x3aca, 0x3acb, 0x3acb, 0x3acc, + 0x3acd, 0x3acd, 0x3ace, 0x3ace, 0x3acf, 0x3acf, 0x3ad0, 0x3ad0, + 0x3ad1, 0x3ad2, 0x3ad2, 0x3ad3, 0x3ad3, 0x3ad4, 0x3ad4, 0x3ad5, + 0x3ad5, 0x3ad6, 0x3ad7, 0x3ad7, 0x3ad8, 0x3ad8, 0x3ad9, 0x3ad9, + 0x3ada, 0x3ada, 0x3adb, 0x3adb, 0x3adc, 0x3add, 0x3add, 0x3ade, + 0x3ade, 0x3adf, 0x3adf, 0x3ae0, 0x3ae0, 0x3ae1, 0x3ae1, 0x3ae2, + 0x3ae3, 0x3ae3, 0x3ae4, 0x3ae4, 0x3ae5, 0x3ae5, 0x3ae6, 0x3ae6, + 0x3ae7, 0x3ae7, 0x3ae8, 0x3ae9, 0x3ae9, 0x3aea, 0x3aea, 0x3aeb, + 0x3aeb, 0x3aec, 0x3aec, 0x3aed, 0x3aed, 0x3aee, 0x3aee, 0x3aef, + 0x3af0, 0x3af0, 0x3af1, 0x3af1, 0x3af2, 0x3af2, 0x3af3, 0x3af3, + 0x3af4, 0x3af4, 0x3af5, 0x3af5, 0x3af6, 0x3af7, 0x3af7, 0x3af8, + 0x3af8, 0x3af9, 0x3af9, 0x3afa, 0x3afa, 0x3afb, 0x3afb, 0x3afc, + 0x3afc, 0x3afd, 0x3afe, 0x3afe, 0x3aff, 0x3aff, 0x3b00, 0x3b00, + 0x3b01, 0x3b01, 0x3b02, 0x3b02, 0x3b03, 0x3b03, 0x3b04, 0x3b04, + 0x3b05, 0x3b05, 0x3b06, 0x3b07, 0x3b07, 0x3b08, 0x3b08, 0x3b09, + 0x3b09, 0x3b0a, 0x3b0a, 0x3b0b, 0x3b0b, 0x3b0c, 0x3b0c, 0x3b0d, + 0x3b0d, 0x3b0e, 0x3b0f, 0x3b0f, 0x3b10, 0x3b10, 0x3b11, 0x3b11, + 0x3b12, 0x3b12, 0x3b13, 0x3b13, 0x3b14, 0x3b14, 0x3b15, 0x3b15, + 0x3b16, 0x3b16, 0x3b17, 0x3b17, 0x3b18, 0x3b19, 0x3b19, 0x3b1a, + 0x3b1a, 0x3b1b, 0x3b1b, 0x3b1c, 0x3b1c, 0x3b1d, 0x3b1d, 0x3b1e, + 0x3b1e, 0x3b1f, 0x3b1f, 0x3b20, 0x3b20, 0x3b21, 0x3b21, 0x3b22, + 0x3b22, 0x3b23, 0x3b23, 0x3b24, 0x3b25, 0x3b25, 0x3b26, 0x3b26, + 0x3b27, 0x3b27, 0x3b28, 0x3b28, 0x3b29, 0x3b29, 0x3b2a, 0x3b2a, + 0x3b2b, 0x3b2b, 0x3b2c, 0x3b2c, 0x3b2d, 0x3b2d, 0x3b2e, 0x3b2e, + 0x3b2f, 0x3b2f, 0x3b30, 0x3b30, 0x3b31, 0x3b32, 0x3b32, 0x3b33, + 0x3b33, 0x3b34, 0x3b34, 0x3b35, 0x3b35, 0x3b36, 0x3b36, 0x3b37, + 0x3b37, 0x3b38, 0x3b38, 0x3b39, 0x3b39, 0x3b3a, 0x3b3a, 0x3b3b, + 0x3b3b, 0x3b3c, 0x3b3c, 0x3b3d, 0x3b3d, 0x3b3e, 0x3b3e, 0x3b3f, + 0x3b3f, 0x3b40, 0x3b40, 0x3b41, 0x3b41, 0x3b42, 0x3b42, 0x3b43, + 0x3b43, 0x3b44, 0x3b44, 0x3b45, 0x3b46, 0x3b46, 0x3b47, 0x3b47, + 0x3b48, 0x3b48, 0x3b49, 0x3b49, 0x3b4a, 0x3b4a, 0x3b4b, 0x3b4b, + 0x3b4c, 0x3b4c, 0x3b4d, 0x3b4d, 0x3b4e, 0x3b4e, 0x3b4f, 0x3b4f, + 0x3b50, 0x3b50, 0x3b51, 0x3b51, 0x3b52, 0x3b52, 0x3b53, 0x3b53, + 0x3b54, 0x3b54, 0x3b55, 0x3b55, 0x3b56, 0x3b56, 0x3b57, 0x3b57, + 0x3b58, 0x3b58, 0x3b59, 0x3b59, 0x3b5a, 0x3b5a, 0x3b5b, 0x3b5b, + 0x3b5c, 0x3b5c, 0x3b5d, 0x3b5d, 0x3b5e, 0x3b5e, 0x3b5f, 0x3b5f, + 0x3b60, 0x3b60, 0x3b61, 0x3b61, 0x3b62, 0x3b62, 0x3b63, 0x3b63, + 0x3b64, 0x3b64, 0x3b65, 0x3b65, 0x3b66, 0x3b66, 0x3b67, 0x3b67, + 0x3b68, 0x3b68, 0x3b69, 0x3b69, 0x3b6a, 0x3b6a, 0x3b6b, 0x3b6b, + 0x3b6c, 0x3b6c, 0x3b6d, 0x3b6d, 0x3b6e, 0x3b6e, 0x3b6f, 0x3b6f, + 0x3b70, 0x3b70, 0x3b71, 0x3b71, 0x3b72, 0x3b72, 0x3b73, 0x3b73, + 0x3b74, 0x3b74, 0x3b75, 0x3b75, 0x3b76, 0x3b76, 0x3b77, 0x3b77, + 0x3b78, 0x3b78, 0x3b79, 0x3b79, 0x3b7a, 0x3b7a, 0x3b7b, 0x3b7b, + 0x3b7c, 0x3b7c, 0x3b7d, 0x3b7d, 0x3b7e, 0x3b7e, 0x3b7f, 0x3b7f, + 0x3b80, 0x3b80, 0x3b81, 0x3b81, 0x3b82, 0x3b82, 0x3b82, 0x3b83, + 0x3b83, 0x3b84, 0x3b84, 0x3b85, 0x3b85, 0x3b86, 0x3b86, 0x3b87, + 0x3b87, 0x3b88, 0x3b88, 0x3b89, 0x3b89, 0x3b8a, 0x3b8a, 0x3b8b, + 0x3b8b, 0x3b8c, 0x3b8c, 0x3b8d, 0x3b8d, 0x3b8e, 0x3b8e, 0x3b8f, + 0x3b8f, 0x3b90, 0x3b90, 0x3b91, 0x3b91, 0x3b92, 0x3b92, 0x3b93, + 0x3b93, 0x3b94, 0x3b94, 0x3b95, 0x3b95, 0x3b96, 0x3b96, 0x3b96, + 0x3b97, 0x3b97, 0x3b98, 0x3b98, 0x3b99, 0x3b99, 0x3b9a, 0x3b9a, + 0x3b9b, 0x3b9b, 0x3b9c, 0x3b9c, 0x3b9d, 0x3b9d, 0x3b9e, 0x3b9e, + 0x3b9f, 0x3b9f, 0x3ba0, 0x3ba0, 0x3ba1, 0x3ba1, 0x3ba2, 0x3ba2, + 0x3ba3, 0x3ba3, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba5, 0x3ba5, 0x3ba6, + 0x3ba6, 0x3ba7, 0x3ba7, 0x3ba8, 0x3ba8, 0x3ba9, 0x3ba9, 0x3baa, + 0x3baa, 0x3bab, 0x3bab, 0x3bac, 0x3bac, 0x3bad, 0x3bad, 0x3bae, + 0x3bae, 0x3baf, 0x3baf, 0x3baf, 0x3bb0, 0x3bb0, 0x3bb1, 0x3bb1, + 0x3bb2, 0x3bb2, 0x3bb3, 0x3bb3, 0x3bb4, 0x3bb4, 0x3bb5, 0x3bb5, + 0x3bb6, 0x3bb6, 0x3bb7, 0x3bb7, 0x3bb8, 0x3bb8, 0x3bb9, 0x3bb9, + 0x3bb9, 0x3bba, 0x3bba, 0x3bbb, 0x3bbb, 0x3bbc, 0x3bbc, 0x3bbd, + 0x3bbd, 0x3bbe, 0x3bbe, 0x3bbf, 0x3bbf, 0x3bc0, 0x3bc0, 0x3bc1, + 0x3bc1, 0x3bc1, 0x3bc2, 0x3bc2, 0x3bc3, 0x3bc3, 0x3bc4, 0x3bc4, + 0x3bc5, 0x3bc5, 0x3bc6, 0x3bc6, 0x3bc7, 0x3bc7, 0x3bc8, 0x3bc8, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bca, 0x3bca, 0x3bcb, 0x3bcb, 0x3bcc, + 0x3bcc, 0x3bcd, 0x3bcd, 0x3bce, 0x3bce, 0x3bcf, 0x3bcf, 0x3bd0, + 0x3bd0, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd2, 0x3bd2, 0x3bd3, 0x3bd3, + 0x3bd4, 0x3bd4, 0x3bd5, 0x3bd5, 0x3bd6, 0x3bd6, 0x3bd7, 0x3bd7, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd9, 0x3bd9, 0x3bda, 0x3bda, 0x3bdb, + 0x3bdb, 0x3bdc, 0x3bdc, 0x3bdd, 0x3bdd, 0x3bde, 0x3bde, 0x3bde, + 0x3bdf, 0x3bdf, 0x3be0, 0x3be0, 0x3be1, 0x3be1, 0x3be2, 0x3be2, + 0x3be3, 0x3be3, 0x3be4, 0x3be4, 0x3be5, 0x3be5, 0x3be5, 0x3be6, + 0x3be6, 0x3be7, 0x3be7, 0x3be8, 0x3be8, 0x3be9, 0x3be9, 0x3bea, + 0x3bea, 0x3beb, 0x3beb, 0x3beb, 0x3bec, 0x3bec, 0x3bed, 0x3bed, + 0x3bee, 0x3bee, 0x3bef, 0x3bef, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf1, + 0x3bf1, 0x3bf2, 0x3bf2, 0x3bf3, 0x3bf3, 0x3bf4, 0x3bf4, 0x3bf5, + 0x3bf5, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf7, 0x3bf7, 0x3bf8, 0x3bf8, + 0x3bf9, 0x3bf9, 0x3bfa, 0x3bfa, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfc, + 0x3bfc, 0x3bfd, 0x3bfd, 0x3bfe, 0x3bfe, 0x3bff, 0x3bff, 0x3c00, + 0x3c00, 0x3c00, 0x3c01, 0x3c01, 0x3c02, 0x3c02, 0x3c03, 0x3c03, + 0x3c04, 0x3c04, 0x3c05, 0x3c05, 0x3c05, 0x3c06, 0x3c06, 0x3c07, + 0x3c07, 0x3c08, 0x3c08, 0x3c09, 0x3c09, 0x3c09, 0x3c0a, 0x3c0a, + 0x3c0b, 0x3c0b, 0x3c0c, 0x3c0c, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0e, + 0x3c0e, 0x3c0f, 0x3c0f, 0x3c10, 0x3c10, 0x3c11, 0x3c11, 0x3c11, + 0x3c12, 0x3c12, 0x3c13, 0x3c13, 0x3c14, 0x3c14, 0x3c14, 0x3c15, + 0x3c15, 0x3c16, 0x3c16, 0x3c17, 0x3c17, 0x3c17, 0x3c18, 0x3c18, + 0x3c19, 0x3c19, 0x3c1a, 0x3c1a, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1c, + 0x3c1c, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1e, 0x3c1e, 0x3c1f, 0x3c1f, + 0x3c20, 0x3c20, 0x3c20, 0x3c21, 0x3c21, 0x3c22, 0x3c22, 0x3c23, + 0x3c23, 0x3c23, 0x3c24, 0x3c24, 0x3c25, 0x3c25, 0x3c26, 0x3c26, + 0x3c26, 0x3c27, 0x3c27, 0x3c28, 0x3c28, 0x3c28, 0x3c29, 0x3c29, + 0x3c2a, 0x3c2a, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2c, 0x3c2c, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2e, 0x3c2e, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c30, + 0x3c30, 0x3c31, 0x3c31, 0x3c32, 0x3c32, 0x3c32, 0x3c33, 0x3c33, + 0x3c34, 0x3c34, 0x3c34, 0x3c35, 0x3c35, 0x3c36, 0x3c36, 0x3c36, + 0x3c37, 0x3c37, 0x3c38, 0x3c38, 0x3c38, 0x3c39, 0x3c39, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3b, 0x3c3b, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3d, + 0x3c3d, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3f, 0x3c3f, 0x3c40, 0x3c40, + 0x3c40, 0x3c41, 0x3c41, 0x3c42, 0x3c42, 0x3c42, 0x3c43, 0x3c43, + 0x3c44, 0x3c44, 0x3c44, 0x3c45, 0x3c45, 0x3c46, 0x3c46, 0x3c46, + 0x3c47, 0x3c47, 0x3c47, 0x3c48, 0x3c48, 0x3c49, 0x3c49, 0x3c49, + 0x3c4a, 0x3c4a, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4c, 0x3c4c, 0x3c4d, + 0x3c4d, 0x3c4d, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4f, 0x3c4f, 0x3c50, + 0x3c50, 0x3c50, 0x3c51, 0x3c51, 0x3c52, 0x3c52, 0x3c52, 0x3c53, + 0x3c53, 0x3c53, 0x3c54, 0x3c54, 0x3c55, 0x3c55, 0x3c55, 0x3c56, + 0x3c56, 0x3c56, 0x3c57, 0x3c57, 0x3c58, 0x3c58, 0x3c58, 0x3c59, + 0x3c59, 0x3c59, 0x3c5a, 0x3c5a, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5c, + 0x3c5c, 0x3c5c, 0x3c5d, 0x3c5d, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5f, + 0x3c5f, 0x3c5f, 0x3c60, 0x3c60, 0x3c61, 0x3c61, 0x3c61, 0x3c62, + 0x3c62, 0x3c62, 0x3c63, 0x3c63, 0x3c63, 0x3c64, 0x3c64, 0x3c65, + 0x3c65, 0x3c65, 0x3c66, 0x3c66, 0x3c66, 0x3c67, 0x3c67, 0x3c67, + 0x3c68, 0x3c68, 0x3c69, 0x3c69, 0x3c69, 0x3c6a, 0x3c6a, 0x3c6a, + 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6c, 0x3c6c, 0x3c6d, 0x3c6d, 0x3c6d, + 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c70, 0x3c70, + 0x3c71, 0x3c71, 0x3c71, 0x3c72, 0x3c72, 0x3c72, 0x3c73, 0x3c73, + 0x3c73, 0x3c74, 0x3c74, 0x3c74, 0x3c75, 0x3c75, 0x3c75, 0x3c76, + 0x3c76, 0x3c77, 0x3c77, 0x3c77, 0x3c78, 0x3c78, 0x3c78, 0x3c79, + 0x3c79, 0x3c79, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7b, 0x3c7b, 0x3c7b, + 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7d, 0x3c7d, 0x3c7e, 0x3c7e, 0x3c7e, + 0x3c7f, 0x3c7f, 0x3c7f, 0x3c80, 0x3c80, 0x3c80, 0x3c81, 0x3c81, + 0x3c81, 0x3c82, 0x3c82, 0x3c82, 0x3c83, 0x3c83, 0x3c83, 0x3c84, + 0x3c84, 0x3c84, 0x3c85, 0x3c85, 0x3c85, 0x3c86, 0x3c86, 0x3c86, + 0x3c87, 0x3c87, 0x3c87, 0x3c88, 0x3c88, 0x3c89, 0x3c89, 0x3c89, + 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8c, 0x3c8c, + 0x3c8c, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8f, + 0x3c8f, 0x3c8f, 0x3c90, 0x3c90, 0x3c90, 0x3c91, 0x3c91, 0x3c91, + 0x3c92, 0x3c92, 0x3c92, 0x3c93, 0x3c93, 0x3c93, 0x3c94, 0x3c94, + 0x3c94, 0x3c95, 0x3c95, 0x3c95, 0x3c96, 0x3c96, 0x3c96, 0x3c97, + 0x3c97, 0x3c97, 0x3c98, 0x3c98, 0x3c98, 0x3c99, 0x3c99, 0x3c99, + 0x3c99, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9c, + 0x3c9c, 0x3c9c, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9e, 0x3c9e, 0x3c9e, + 0x3c9f, 0x3c9f, 0x3c9f, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca1, 0x3ca1, + 0x3ca1, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca4, + 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca6, 0x3ca6, + 0x3ca6, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca9, + 0x3ca9, 0x3ca9, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3cab, 0x3cab, + 0x3cab, 0x3cac, 0x3cac, 0x3cac, 0x3cad, 0x3cad, 0x3cad, 0x3cae, + 0x3cae, 0x3cae, 0x3caf, 0x3caf, 0x3caf, 0x3cb0, 0x3cb0, 0x3cb0, + 0x3cb0, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb3, + 0x3cb3, 0x3cb3, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb5, 0x3cb5, + 0x3cb5, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb8, + 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cba, 0x3cba, + 0x3cba, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, + 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbf, 0x3cbf, + 0x3cbf, 0x3cbf, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc1, 0x3cc1, 0x3cc1, + 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc4, + 0x3cc4, 0x3cc4, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc6, 0x3cc6, + 0x3cc6, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, + 0x3cc9, 0x3cc9, 0x3cc9, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3ccb, + 0x3ccb, 0x3ccb, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccd, 0x3ccd, 0x3ccd, + 0x3ccd, 0x3cce, 0x3cce, 0x3cce, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, + 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd2, + 0x3cd2, 0x3cd2, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd4, 0x3cd4, + 0x3cd4, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, + 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd9, + 0x3cd9, 0x3cd9, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cdb, 0x3cdb, + 0x3cdb, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdd, 0x3cdd, 0x3cdd, + 0x3cdd, 0x3cde, 0x3cde, 0x3cde, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, + 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce2, + 0x3ce2, 0x3ce2, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce4, 0x3ce4, + 0x3ce4, 0x3ce4, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce6, 0x3ce6, 0x3ce6, + 0x3ce6, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, + 0x3ce9, 0x3ce9, 0x3ce9, 0x3ce9, 0x3cea, 0x3cea, 0x3cea, 0x3ceb, + 0x3ceb, 0x3ceb, 0x3ceb, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3ced, + 0x3ced, 0x3ced, 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cef, 0x3cef, + 0x3cef, 0x3cef, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf1, 0x3cf1, 0x3cf1, + 0x3cf1, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf3, 0x3cf3, 0x3cf3, + 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, + 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf8, + 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cfa, + 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfc, 0x3cfc, + 0x3cfc, 0x3cfc, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfe, 0x3cfe, + 0x3cfe, 0x3cfe, 0x3cff, 0x3cff, 0x3cff, 0x3d00, 0x3d00, 0x3d00, + 0x3d00, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d02, 0x3d02, 0x3d02, + 0x3d02, 0x3d03, 0x3d03, 0x3d03, 0x3d03, 0x3d04, 0x3d04, 0x3d04, + 0x3d04, 0x3d05, 0x3d05, 0x3d05, 0x3d06, 0x3d06, 0x3d06, 0x3d06, + 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d08, 0x3d08, 0x3d08, 0x3d08, + 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, + 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, + 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, + 0x3d0f, 0x3d0f, 0x3d0f, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d11, + 0x3d11, 0x3d11, 0x3d11, 0x3d12, 0x3d12, 0x3d12, 0x3d12, 0x3d13, + 0x3d13, 0x3d13, 0x3d13, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d15, + 0x3d15, 0x3d15, 0x3d15, 0x3d16, 0x3d16, 0x3d16, 0x3d16, 0x3d17, + 0x3d17, 0x3d17, 0x3d17, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d19, + 0x3d19, 0x3d19, 0x3d19, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1b, + 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1d, + 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, + 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d20, 0x3d20, 0x3d20, 0x3d20, + 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d22, 0x3d22, 0x3d22, 0x3d22, + 0x3d23, 0x3d23, 0x3d23, 0x3d23, 0x3d24, 0x3d24, 0x3d24, 0x3d24, + 0x3d25, 0x3d25, 0x3d25, 0x3d25, 0x3d26, 0x3d26, 0x3d26, 0x3d26, + 0x3d27, 0x3d27, 0x3d27, 0x3d27, 0x3d27, 0x3d28, 0x3d28, 0x3d28, + 0x3d28, 0x3d29, 0x3d29, 0x3d29, 0x3d29, 0x3d2a, 0x3d2a, 0x3d2a, + 0x3d2a, 0x3d2b, 0x3d2b, 0x3d2b, 0x3d2b, 0x3d2c, 0x3d2c, 0x3d2c, + 0x3d2c, 0x3d2d, 0x3d2d, 0x3d2d, 0x3d2d, 0x3d2d, 0x3d2e, 0x3d2e, + 0x3d2e, 0x3d2e, 0x3d2f, 0x3d2f, 0x3d2f, 0x3d2f, 0x3d30, 0x3d30, + 0x3d30, 0x3d30, 0x3d31, 0x3d31, 0x3d31, 0x3d31, 0x3d31, 0x3d32, + 0x3d32, 0x3d32, 0x3d32, 0x3d33, 0x3d33, 0x3d33, 0x3d33, 0x3d34, + 0x3d34, 0x3d34, 0x3d34, 0x3d35, 0x3d35, 0x3d35, 0x3d35, 0x3d35, + 0x3d36, 0x3d36, 0x3d36, 0x3d36, 0x3d37, 0x3d37, 0x3d37, 0x3d37, + 0x3d38, 0x3d38, 0x3d38, 0x3d38, 0x3d39, 0x3d39, 0x3d39, 0x3d39, + 0x3d39, 0x3d3a, 0x3d3a, 0x3d3a, 0x3d3a, 0x3d3b, 0x3d3b, 0x3d3b, + 0x3d3b, 0x3d3c, 0x3d3c, 0x3d3c, 0x3d3c, 0x3d3c, 0x3d3d, 0x3d3d, + 0x3d3d, 0x3d3d, 0x3d3e, 0x3d3e, 0x3d3e, 0x3d3e, 0x3d3f, 0x3d3f, + 0x3d3f, 0x3d3f, 0x3d3f, 0x3d40, 0x3d40, 0x3d40, 0x3d40, 0x3d41, + 0x3d41, 0x3d41, 0x3d41, 0x3d41, 0x3d42, 0x3d42, 0x3d42, 0x3d42, + 0x3d43, 0x3d43, 0x3d44, 0x3d44, 0x3d44, 0x3d45, 0x3d45, 0x3d46, + 0x3d46, 0x3d47, 0x3d47, 0x3d48, 0x3d48, 0x3d49, 0x3d49, 0x3d49, + 0x3d4a, 0x3d4a, 0x3d4b, 0x3d4b, 0x3d4c, 0x3d4c, 0x3d4d, 0x3d4d, + 0x3d4d, 0x3d4e, 0x3d4e, 0x3d4f, 0x3d4f, 0x3d50, 0x3d50, 0x3d51, + 0x3d51, 0x3d51, 0x3d52, 0x3d52, 0x3d53, 0x3d53, 0x3d54, 0x3d54, + 0x3d54, 0x3d55, 0x3d55, 0x3d56, 0x3d56, 0x3d57, 0x3d57, 0x3d58, + 0x3d58, 0x3d58, 0x3d59, 0x3d59, 0x3d5a, 0x3d5a, 0x3d5b, 0x3d5b, + 0x3d5b, 0x3d5c, 0x3d5c, 0x3d5d, 0x3d5d, 0x3d5e, 0x3d5e, 0x3d5e, + 0x3d5f, 0x3d5f, 0x3d60, 0x3d60, 0x3d61, 0x3d61, 0x3d61, 0x3d62, + 0x3d62, 0x3d63, 0x3d63, 0x3d64, 0x3d64, 0x3d64, 0x3d65, 0x3d65, + 0x3d66, 0x3d66, 0x3d66, 0x3d67, 0x3d67, 0x3d68, 0x3d68, 0x3d69, + 0x3d69, 0x3d69, 0x3d6a, 0x3d6a, 0x3d6b, 0x3d6b, 0x3d6c, 0x3d6c, + 0x3d6c, 0x3d6d, 0x3d6d, 0x3d6e, 0x3d6e, 0x3d6e, 0x3d6f, 0x3d6f, + 0x3d70, 0x3d70, 0x3d70, 0x3d71, 0x3d71, 0x3d72, 0x3d72, 0x3d73, + 0x3d73, 0x3d73, 0x3d74, 0x3d74, 0x3d75, 0x3d75, 0x3d75, 0x3d76, + 0x3d76, 0x3d77, 0x3d77, 0x3d77, 0x3d78, 0x3d78, 0x3d79, 0x3d79, + 0x3d79, 0x3d7a, 0x3d7a, 0x3d7b, 0x3d7b, 0x3d7b, 0x3d7c, 0x3d7c, + 0x3d7d, 0x3d7d, 0x3d7d, 0x3d7e, 0x3d7e, 0x3d7f, 0x3d7f, 0x3d7f, + 0x3d80, 0x3d80, 0x3d81, 0x3d81, 0x3d81, 0x3d82, 0x3d82, 0x3d83, + 0x3d83, 0x3d83, 0x3d84, 0x3d84, 0x3d85, 0x3d85, 0x3d85, 0x3d86, + 0x3d86, 0x3d87, 0x3d87, 0x3d87, 0x3d88, 0x3d88, 0x3d89, 0x3d89, + 0x3d89, 0x3d8a, 0x3d8a, 0x3d8b, 0x3d8b, 0x3d8b, 0x3d8c, 0x3d8c, + 0x3d8c, 0x3d8d, 0x3d8d, 0x3d8e, 0x3d8e, 0x3d8e, 0x3d8f, 0x3d8f, + 0x3d90, 0x3d90, 0x3d90, 0x3d91, 0x3d91, 0x3d91, 0x3d92, 0x3d92, + 0x3d93, 0x3d93, 0x3d93, 0x3d94, 0x3d94, 0x3d95, 0x3d95, 0x3d95, + 0x3d96, 0x3d96, 0x3d96, 0x3d97, 0x3d97, 0x3d98, 0x3d98, 0x3d98, + 0x3d99, 0x3d99, 0x3d99, 0x3d9a, 0x3d9a, 0x3d9b, 0x3d9b, 0x3d9b, + 0x3d9c, 0x3d9c, 0x3d9c, 0x3d9d, 0x3d9d, 0x3d9e, 0x3d9e, 0x3d9e, + 0x3d9f, 0x3d9f, 0x3d9f, 0x3da0, 0x3da0, 0x3da1, 0x3da1, 0x3da1, + 0x3da2, 0x3da2, 0x3da2, 0x3da3, 0x3da3, 0x3da4, 0x3da4, 0x3da4, + 0x3da5, 0x3da5, 0x3da5, 0x3da6, 0x3da6, 0x3da6, 0x3da7, 0x3da7, + 0x3da8, 0x3da8, 0x3da8, 0x3da9, 0x3da9, 0x3da9, 0x3daa, 0x3daa, + 0x3daa, 0x3dab, 0x3dab, 0x3dac, 0x3dac, 0x3dac, 0x3dad, 0x3dad, + 0x3dad, 0x3dae, 0x3dae, 0x3dae, 0x3daf, 0x3daf, 0x3db0, 0x3db0, + 0x3db0, 0x3db1, 0x3db1, 0x3db1, 0x3db2, 0x3db2, 0x3db2, 0x3db3, + 0x3db3, 0x3db3, 0x3db4, 0x3db4, 0x3db5, 0x3db5, 0x3db5, 0x3db6, + 0x3db6, 0x3db6, 0x3db7, 0x3db7, 0x3db7, 0x3db8, 0x3db8, 0x3db8, + 0x3db9, 0x3db9, 0x3dba, 0x3dba, 0x3dba, 0x3dbb, 0x3dbb, 0x3dbb, + 0x3dbc, 0x3dbc, 0x3dbc, 0x3dbd, 0x3dbd, 0x3dbd, 0x3dbe, 0x3dbe, + 0x3dbe, 0x3dbf, 0x3dbf, 0x3dbf, 0x3dc0, 0x3dc0, 0x3dc1, 0x3dc1, + 0x3dc1, 0x3dc2, 0x3dc2, 0x3dc2, 0x3dc3, 0x3dc3, 0x3dc3, 0x3dc4, + 0x3dc4, 0x3dc4, 0x3dc5, 0x3dc5, 0x3dc5, 0x3dc6, 0x3dc6, 0x3dc6, + 0x3dc7, 0x3dc7, 0x3dc7, 0x3dc8, 0x3dc8, 0x3dc8, 0x3dc9, 0x3dc9, + 0x3dc9, 0x3dca, 0x3dca, 0x3dca, 0x3dcb, 0x3dcb, 0x3dcb, 0x3dcc, + 0x3dcc, 0x3dcc, 0x3dcd, 0x3dcd, 0x3dce, 0x3dce, 0x3dce, 0x3dcf, + 0x3dcf, 0x3dcf, 0x3dd0, 0x3dd0, 0x3dd0, 0x3dd1, 0x3dd1, 0x3dd1, + 0x3dd2, 0x3dd2, 0x3dd2, 0x3dd3, 0x3dd3, 0x3dd3, 0x3dd4, 0x3dd4, + 0x3dd4, 0x3dd5, 0x3dd5, 0x3dd5, 0x3dd6, 0x3dd6, 0x3dd6, 0x3dd7, + 0x3dd7, 0x3dd7, 0x3dd8, 0x3dd8, 0x3dd8, 0x3dd9, 0x3dd9, 0x3dd9, + 0x3dd9, 0x3dda, 0x3dda, 0x3dda, 0x3ddb, 0x3ddb, 0x3ddb, 0x3ddc, + 0x3ddc, 0x3ddc, 0x3ddd, 0x3ddd, 0x3ddd, 0x3dde, 0x3dde, 0x3dde, + 0x3ddf, 0x3ddf, 0x3ddf, 0x3de0, 0x3de0, 0x3de0, 0x3de1, 0x3de1, + 0x3de1, 0x3de2, 0x3de2, 0x3de2, 0x3de3, 0x3de3, 0x3de3, 0x3de4, + 0x3de4, 0x3de4, 0x3de5, 0x3de5, 0x3de5, 0x3de5, 0x3de6, 0x3de6, + 0x3de6, 0x3de7, 0x3de7, 0x3de7, 0x3de8, 0x3de8, 0x3de8, 0x3de9, + 0x3de9, 0x3de9, 0x3dea, 0x3dea, 0x3dea, 0x3deb, 0x3deb, 0x3deb, + 0x3dec, 0x3dec, 0x3dec, 0x3dec, 0x3ded, 0x3ded, 0x3ded, 0x3dee, + 0x3dee, 0x3dee, 0x3def, 0x3def, 0x3def, 0x3df0, 0x3df0, 0x3df0, + 0x3df1, 0x3df1, 0x3df1, 0x3df2, 0x3df2, 0x3df2, 0x3df2, 0x3df3, + 0x3df3, 0x3df3, 0x3df4, 0x3df4, 0x3df4, 0x3df5, 0x3df5, 0x3df5, + 0x3df6, 0x3df6, 0x3df6, 0x3df6, 0x3df7, 0x3df7, 0x3df7, 0x3df8, + 0x3df8, 0x3df8, 0x3df9, 0x3df9, 0x3df9, 0x3dfa, 0x3dfa, 0x3dfa, + 0x3dfa, 0x3dfb, 0x3dfb, 0x3dfb, 0x3dfc, 0x3dfc, 0x3dfc, 0x3dfd, + 0x3dfd, 0x3dfd, 0x3dfe, 0x3dfe, 0x3dfe, 0x3dfe, 0x3dff, 0x3dff, + 0x3dff, 0x3e00, 0x3e00, 0x3e00, 0x3e01, 0x3e01, 0x3e01, 0x3e01, + 0x3e02, 0x3e02, 0x3e02, 0x3e03, 0x3e03, 0x3e03, 0x3e04, 0x3e04, + 0x3e04, 0x3e04, 0x3e05, 0x3e05, 0x3e05, 0x3e06, 0x3e06, 0x3e06, + 0x3e07, 0x3e07, 0x3e07, 0x3e07, 0x3e08, 0x3e08, 0x3e08, 0x3e09, + 0x3e09, 0x3e09, 0x3e0a, 0x3e0a, 0x3e0a, 0x3e0a, 0x3e0b, 0x3e0b, + 0x3e0b, 0x3e0c, 0x3e0c, 0x3e0c, 0x3e0c, 0x3e0d, 0x3e0d, 0x3e0d, + 0x3e0e, 0x3e0e, 0x3e0e, 0x3e0f, 0x3e0f, 0x3e0f, 0x3e0f, 0x3e10, + 0x3e10, 0x3e10, 0x3e11, 0x3e11, 0x3e11, 0x3e11, 0x3e12, 0x3e12, + 0x3e12, 0x3e13, 0x3e13, 0x3e13, 0x3e14, 0x3e14, 0x3e14, 0x3e14, + 0x3e15, 0x3e15, 0x3e15, 0x3e16, 0x3e16, 0x3e16, 0x3e16, 0x3e17, + 0x3e17, 0x3e17, 0x3e18, 0x3e18, 0x3e18, 0x3e18, 0x3e19, 0x3e19, + 0x3e19, 0x3e1a, 0x3e1a, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x3e1b, + 0x3e1c, 0x3e1c, 0x3e1c, 0x3e1c, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, + 0x3e1e, 0x3e1e, 0x3e1e, 0x3e1f, 0x3e1f, 0x3e1f, 0x3e20, 0x3e20, + 0x3e20, 0x3e20, 0x3e21, 0x3e21, 0x3e21, 0x3e22, 0x3e22, 0x3e22, + 0x3e22, 0x3e23, 0x3e23, 0x3e23, 0x3e23, 0x3e24, 0x3e24, 0x3e24, + 0x3e25, 0x3e25, 0x3e25, 0x3e25, 0x3e26, 0x3e26, 0x3e26, 0x3e27, + 0x3e27, 0x3e27, 0x3e27, 0x3e28, 0x3e28, 0x3e28, 0x3e29, 0x3e29, + 0x3e29, 0x3e29, 0x3e2a, 0x3e2a, 0x3e2a, 0x3e2a, 0x3e2b, 0x3e2b, + 0x3e2b, 0x3e2c, 0x3e2c, 0x3e2c, 0x3e2c, 0x3e2d, 0x3e2d, 0x3e2d, + 0x3e2d, 0x3e2e, 0x3e2e, 0x3e2e, 0x3e2f, 0x3e2f, 0x3e2f, 0x3e2f, + 0x3e30, 0x3e30, 0x3e30, 0x3e30, 0x3e31, 0x3e31, 0x3e31, 0x3e32, + 0x3e32, 0x3e32, 0x3e32, 0x3e33, 0x3e33, 0x3e33, 0x3e33, 0x3e34, + 0x3e34, 0x3e34, 0x3e35, 0x3e35, 0x3e35, 0x3e35, 0x3e36, 0x3e36, + 0x3e36, 0x3e36, 0x3e37, 0x3e37, 0x3e37, 0x3e38, 0x3e38, 0x3e38, + 0x3e38, 0x3e39, 0x3e39, 0x3e39, 0x3e39, 0x3e3a, 0x3e3a, 0x3e3a, + 0x3e3a, 0x3e3b, 0x3e3b, 0x3e3b, 0x3e3c, 0x3e3c, 0x3e3c, 0x3e3c, + 0x3e3d, 0x3e3d, 0x3e3d, 0x3e3d, 0x3e3e, 0x3e3e, 0x3e3e, 0x3e3e, + 0x3e3f, 0x3e3f, 0x3e3f, 0x3e40, 0x3e40, 0x3e40, 0x3e40, 0x3e41, + 0x3e41, 0x3e41, 0x3e41, 0x3e42, 0x3e42, 0x3e42, 0x3e42, 0x3e43, + 0x3e43, 0x3e43, 0x3e43, 0x3e44, 0x3e44, 0x3e44, 0x3e44, 0x3e45, + 0x3e45, 0x3e45, 0x3e46, 0x3e46, 0x3e46, 0x3e46, 0x3e47, 0x3e47, + 0x3e47, 0x3e47, 0x3e48, 0x3e48, 0x3e48, 0x3e48, 0x3e49, 0x3e49, + 0x3e49, 0x3e49, 0x3e4a, 0x3e4a, 0x3e4a, 0x3e4a, 0x3e4b, 0x3e4b, + 0x3e4b, 0x3e4b, 0x3e4c, 0x3e4c, 0x3e4c, 0x3e4d, 0x3e4d, 0x3e4d, + 0x3e4d, 0x3e4e, 0x3e4e, 0x3e4e, 0x3e4e, 0x3e4f, 0x3e4f, 0x3e4f, + 0x3e4f, 0x3e50, 0x3e50, 0x3e50, 0x3e50, 0x3e51, 0x3e51, 0x3e51, + 0x3e51, 0x3e52, 0x3e52, 0x3e52, 0x3e52, 0x3e53, 0x3e53, 0x3e53, + 0x3e53, 0x3e54, 0x3e54, 0x3e54, 0x3e54, 0x3e55, 0x3e55, 0x3e55, + 0x3e55, 0x3e56, 0x3e56, 0x3e56, 0x3e56, 0x3e57, 0x3e57, 0x3e57, + 0x3e57, 0x3e58, 0x3e58, 0x3e58, 0x3e58, 0x3e59, 0x3e59, 0x3e59, + 0x3e59, 0x3e5a, 0x3e5a, 0x3e5a, 0x3e5a, 0x3e5b, 0x3e5b, 0x3e5b, + 0x3e5b, 0x3e5c, 0x3e5c, 0x3e5c, 0x3e5c, 0x3e5d, 0x3e5d, 0x3e5d, + 0x3e5d, 0x3e5e, 0x3e5e, 0x3e5e, 0x3e5e, 0x3e5f, 0x3e5f, 0x3e5f, + 0x3e5f, 0x3e60, 0x3e60, 0x3e60, 0x3e60, 0x3e61, 0x3e61, 0x3e61, + 0x3e61, 0x3e62, 0x3e62, 0x3e62, 0x3e62, 0x3e63, 0x3e63, 0x3e63, + 0x3e63, 0x3e64, 0x3e64, 0x3e64, 0x3e64, 0x3e65, 0x3e65, 0x3e65, + 0x3e65, 0x3e66, 0x3e66, 0x3e66, 0x3e66, 0x3e66, 0x3e67, 0x3e67, + 0x3e67, 0x3e67, 0x3e68, 0x3e68, 0x3e68, 0x3e68, 0x3e69, 0x3e69, + 0x3e69, 0x3e69, 0x3e6a, 0x3e6a, 0x3e6a, 0x3e6a, 0x3e6b, 0x3e6b, + 0x3e6b, 0x3e6b, 0x3e6c, 0x3e6c, 0x3e6c, 0x3e6c, 0x3e6d, 0x3e6d, + 0x3e6d, 0x3e6d, 0x3e6d, 0x3e6e, 0x3e6e, 0x3e6e, 0x3e6e, 0x3e6f, + 0x3e6f, 0x3e6f, 0x3e6f, 0x3e70, 0x3e70, 0x3e70, 0x3e70, 0x3e71, + 0x3e71, 0x3e71, 0x3e71, 0x3e72, 0x3e72, 0x3e72, 0x3e72, 0x3e72, + 0x3e73, 0x3e73, 0x3e73, 0x3e73, 0x3e74, 0x3e74, 0x3e74, 0x3e74, + 0x3e75, 0x3e75, 0x3e75, 0x3e75, 0x3e76, 0x3e76, 0x3e76, 0x3e76, + 0x3e76, 0x3e77, 0x3e77, 0x3e77, 0x3e77, 0x3e78, 0x3e78, 0x3e78, + 0x3e78, 0x3e79, 0x3e79, 0x3e79, 0x3e79, 0x3e7a, 0x3e7a, 0x3e7a, + 0x3e7a, 0x3e7a, 0x3e7b, 0x3e7b, 0x3e7b, 0x3e7b, 0x3e7c, 0x3e7c, + 0x3e7c, 0x3e7c, 0x3e7d, 0x3e7d, 0x3e7d, 0x3e7d, 0x3e7d, 0x3e7e, + 0x3e7e, 0x3e7e, 0x3e7e, 0x3e7f, 0x3e7f, 0x3e7f, 0x3e7f, 0x3e80, + 0x3e80, 0x3e80, 0x3e80, 0x3e80, 0x3e81, 0x3e81, 0x3e81, 0x3e81, + 0x3e82, 0x3e82, 0x3e82, 0x3e82, 0x3e83, 0x3e83, 0x3e83, 0x3e83, + 0x3e83, 0x3e84, 0x3e84, 0x3e84, 0x3e84, 0x3e85, 0x3e85, 0x3e85, + 0x3e85, 0x3e86, 0x3e86, 0x3e87, 0x3e87, 0x3e88, 0x3e88, 0x3e88, + 0x3e89, 0x3e89, 0x3e8a, 0x3e8a, 0x3e8b, 0x3e8b, 0x3e8c, 0x3e8c, + 0x3e8c, 0x3e8d, 0x3e8d, 0x3e8e, 0x3e8e, 0x3e8f, 0x3e8f, 0x3e90, + 0x3e90, 0x3e90, 0x3e91, 0x3e91, 0x3e92, 0x3e92, 0x3e93, 0x3e93, + 0x3e94, 0x3e94, 0x3e94, 0x3e95, 0x3e95, 0x3e96, 0x3e96, 0x3e97, + 0x3e97, 0x3e98, 0x3e98, 0x3e98, 0x3e99, 0x3e99, 0x3e9a, 0x3e9a, + 0x3e9b, 0x3e9b, 0x3e9b, 0x3e9c, 0x3e9c, 0x3e9d, 0x3e9d, 0x3e9e, + 0x3e9e, 0x3e9e, 0x3e9f, 0x3e9f, 0x3ea0, 0x3ea0, 0x3ea1, 0x3ea1, + 0x3ea1, 0x3ea2, 0x3ea2, 0x3ea3, 0x3ea3, 0x3ea4, 0x3ea4, 0x3ea4, + 0x3ea5, 0x3ea5, 0x3ea6, 0x3ea6, 0x3ea7, 0x3ea7, 0x3ea7, 0x3ea8, + 0x3ea8, 0x3ea9, 0x3ea9, 0x3eaa, 0x3eaa, 0x3eaa, 0x3eab, 0x3eab, + 0x3eac, 0x3eac, 0x3eac, 0x3ead, 0x3ead, 0x3eae, 0x3eae, 0x3eaf, + 0x3eaf, 0x3eaf, 0x3eb0, 0x3eb0, 0x3eb1, 0x3eb1, 0x3eb1, 0x3eb2, + 0x3eb2, 0x3eb3, 0x3eb3, 0x3eb4, 0x3eb4, 0x3eb4, 0x3eb5, 0x3eb5, + 0x3eb6, 0x3eb6, 0x3eb6, 0x3eb7, 0x3eb7, 0x3eb8, 0x3eb8, 0x3eb8, + 0x3eb9, 0x3eb9, 0x3eba, 0x3eba, 0x3eba, 0x3ebb, 0x3ebb, 0x3ebc, + 0x3ebc, 0x3ebc, 0x3ebd, 0x3ebd, 0x3ebe, 0x3ebe, 0x3ebe, 0x3ebf, + 0x3ebf, 0x3ec0, 0x3ec0, 0x3ec1, 0x3ec1, 0x3ec1, 0x3ec2, 0x3ec2, + 0x3ec2, 0x3ec3, 0x3ec3, 0x3ec4, 0x3ec4, 0x3ec4, 0x3ec5, 0x3ec5, + 0x3ec6, 0x3ec6, 0x3ec6, 0x3ec7, 0x3ec7, 0x3ec8, 0x3ec8, 0x3ec8, + 0x3ec9, 0x3ec9, 0x3eca, 0x3eca, 0x3eca, 0x3ecb, 0x3ecb, 0x3ecc, + 0x3ecc, 0x3ecc, 0x3ecd, 0x3ecd, 0x3ece, 0x3ece, 0x3ece, 0x3ecf, + 0x3ecf, 0x3ecf, 0x3ed0, 0x3ed0, 0x3ed1, 0x3ed1, 0x3ed1, 0x3ed2, + 0x3ed2, 0x3ed3, 0x3ed3, 0x3ed3, 0x3ed4, 0x3ed4, 0x3ed4, 0x3ed5, + 0x3ed5, 0x3ed6, 0x3ed6, 0x3ed6, 0x3ed7, 0x3ed7, 0x3ed8, 0x3ed8, + 0x3ed8, 0x3ed9, 0x3ed9, 0x3ed9, 0x3eda, 0x3eda, 0x3edb, 0x3edb, + 0x3edb, 0x3edc, 0x3edc, 0x3edc, 0x3edd, 0x3edd, 0x3ede, 0x3ede, + 0x3ede, 0x3edf, 0x3edf, 0x3edf, 0x3ee0, 0x3ee0, 0x3ee1, 0x3ee1, + 0x3ee1, 0x3ee2, 0x3ee2, 0x3ee2, 0x3ee3, 0x3ee3, 0x3ee4, 0x3ee4, + 0x3ee4, 0x3ee5, 0x3ee5, 0x3ee5, 0x3ee6, 0x3ee6, 0x3ee7, 0x3ee7, + 0x3ee7, 0x3ee8, 0x3ee8, 0x3ee8, 0x3ee9, 0x3ee9, 0x3ee9, 0x3eea, + 0x3eea, 0x3eeb, 0x3eeb, 0x3eeb, 0x3eec, 0x3eec, 0x3eec, 0x3eed, + 0x3eed, 0x3eed, 0x3eee, 0x3eee, 0x3eef, 0x3eef, 0x3eef, 0x3ef0, + 0x3ef0, 0x3ef0, 0x3ef1, 0x3ef1, 0x3ef1, 0x3ef2, 0x3ef2, 0x3ef3, + 0x3ef3, 0x3ef3, 0x3ef4, 0x3ef4, 0x3ef4, 0x3ef5, 0x3ef5, 0x3ef5, + 0x3ef6, 0x3ef6, 0x3ef6, 0x3ef7, 0x3ef7, 0x3ef8, 0x3ef8, 0x3ef8, + 0x3ef9, 0x3ef9, 0x3ef9, 0x3efa, 0x3efa, 0x3efa, 0x3efb, 0x3efb, + 0x3efb, 0x3efc, 0x3efc, 0x3efc, 0x3efd, 0x3efd, 0x3efe, 0x3efe, + 0x3efe, 0x3eff, 0x3eff, 0x3eff, 0x3f00, 0x3f00, 0x3f00, 0x3f01, + 0x3f01, 0x3f01, 0x3f02, 0x3f02, 0x3f02, 0x3f03, 0x3f03, 0x3f03, + 0x3f04, 0x3f04, 0x3f05, 0x3f05, 0x3f05, 0x3f06, 0x3f06, 0x3f06, + 0x3f07, 0x3f07, 0x3f07, 0x3f08, 0x3f08, 0x3f08, 0x3f09, 0x3f09, + 0x3f09, 0x3f0a, 0x3f0a, 0x3f0a, 0x3f0b, 0x3f0b, 0x3f0b, 0x3f0c, + 0x3f0c, 0x3f0c, 0x3f0d, 0x3f0d, 0x3f0d, 0x3f0e, 0x3f0e, 0x3f0e, + 0x3f0f, 0x3f0f, 0x3f0f, 0x3f10, 0x3f10, 0x3f10, 0x3f11, 0x3f11, + 0x3f11, 0x3f12, 0x3f12, 0x3f12, 0x3f13, 0x3f13, 0x3f13, 0x3f14, + 0x3f14, 0x3f14, 0x3f15, 0x3f15, 0x3f15, 0x3f16, 0x3f16, 0x3f16, + 0x3f17, 0x3f17, 0x3f17, 0x3f18, 0x3f18, 0x3f18, 0x3f19, 0x3f19, + 0x3f19, 0x3f1a, 0x3f1a, 0x3f1a, 0x3f1b, 0x3f1b, 0x3f1b, 0x3f1c, + 0x3f1c, 0x3f1c, 0x3f1d, 0x3f1d, 0x3f1d, 0x3f1e, 0x3f1e, 0x3f1e, + 0x3f1f, 0x3f1f, 0x3f1f, 0x3f20, 0x3f20, 0x3f20, 0x3f21, 0x3f21, + 0x3f21, 0x3f22, 0x3f22, 0x3f22, 0x3f23, 0x3f23, 0x3f23, 0x3f24, + 0x3f24, 0x3f24, 0x3f25, 0x3f25, 0x3f25, 0x3f26, 0x3f26, 0x3f26, + 0x3f27, 0x3f27, 0x3f27, 0x3f27, 0x3f28, 0x3f28, 0x3f28, 0x3f29, + 0x3f29, 0x3f29, 0x3f2a, 0x3f2a, 0x3f2a, 0x3f2b, 0x3f2b, 0x3f2b, + 0x3f2c, 0x3f2c, 0x3f2c, 0x3f2d, 0x3f2d, 0x3f2d, 0x3f2e, 0x3f2e, + 0x3f2e, 0x3f2e, 0x3f2f, 0x3f2f, 0x3f2f, 0x3f30, 0x3f30, 0x3f30, + 0x3f31, 0x3f31, 0x3f31, 0x3f32, 0x3f32, 0x3f32, 0x3f33, 0x3f33, + 0x3f33, 0x3f34, 0x3f34, 0x3f34, 0x3f34, 0x3f35, 0x3f35, 0x3f35, + 0x3f36, 0x3f36, 0x3f36, 0x3f37, 0x3f37, 0x3f37, 0x3f38, 0x3f38, + 0x3f38, 0x3f38, 0x3f39, 0x3f39, 0x3f39, 0x3f3a, 0x3f3a, 0x3f3a, + 0x3f3b, 0x3f3b, 0x3f3b, 0x3f3c, 0x3f3c, 0x3f3c, 0x3f3c, 0x3f3d, + 0x3f3d, 0x3f3d, 0x3f3e, 0x3f3e, 0x3f3e, 0x3f3f, 0x3f3f, 0x3f3f, + 0x3f40, 0x3f40, 0x3f40, 0x3f40, 0x3f41, 0x3f41, 0x3f41, 0x3f42, + 0x3f42, 0x3f42, 0x3f43, 0x3f43, 0x3f43, 0x3f43, 0x3f44, 0x3f44, + 0x3f44, 0x3f45, 0x3f45, 0x3f45, 0x3f46, 0x3f46, 0x3f46, 0x3f47, + 0x3f47, 0x3f47, 0x3f47, 0x3f48, 0x3f48, 0x3f48, 0x3f49, 0x3f49, + 0x3f49, 0x3f49, 0x3f4a, 0x3f4a, 0x3f4a, 0x3f4b, 0x3f4b, 0x3f4b, + 0x3f4c, 0x3f4c, 0x3f4c, 0x3f4c, 0x3f4d, 0x3f4d, 0x3f4d, 0x3f4e, + 0x3f4e, 0x3f4e, 0x3f4f, 0x3f4f, 0x3f4f, 0x3f4f, 0x3f50, 0x3f50, + 0x3f50, 0x3f51, 0x3f51, 0x3f51, 0x3f51, 0x3f52, 0x3f52, 0x3f52, + 0x3f53, 0x3f53, 0x3f53, 0x3f54, 0x3f54, 0x3f54, 0x3f54, 0x3f55, + 0x3f55, 0x3f55, 0x3f56, 0x3f56, 0x3f56, 0x3f56, 0x3f57, 0x3f57, + 0x3f57, 0x3f58, 0x3f58, 0x3f58, 0x3f58, 0x3f59, 0x3f59, 0x3f59, + 0x3f5a, 0x3f5a, 0x3f5a, 0x3f5a, 0x3f5b, 0x3f5b, 0x3f5b, 0x3f5c, + 0x3f5c, 0x3f5c, 0x3f5c, 0x3f5d, 0x3f5d, 0x3f5d, 0x3f5e, 0x3f5e, + 0x3f5e, 0x3f5e, 0x3f5f, 0x3f5f, 0x3f5f, 0x3f60, 0x3f60, 0x3f60, + 0x3f60, 0x3f61, 0x3f61, 0x3f61, 0x3f62, 0x3f62, 0x3f62, 0x3f62, + 0x3f63, 0x3f63, 0x3f63, 0x3f64, 0x3f64, 0x3f64, 0x3f64, 0x3f65, + 0x3f65, 0x3f65, 0x3f66, 0x3f66, 0x3f66, 0x3f66, 0x3f67, 0x3f67, + 0x3f67, 0x3f68, 0x3f68, 0x3f68, 0x3f68, 0x3f69, 0x3f69, 0x3f69, + 0x3f69, 0x3f6a, 0x3f6a, 0x3f6a, 0x3f6b, 0x3f6b, 0x3f6b, 0x3f6b, + 0x3f6c, 0x3f6c, 0x3f6c, 0x3f6d, 0x3f6d, 0x3f6d, 0x3f6d, 0x3f6e, + 0x3f6e, 0x3f6e, 0x3f6e, 0x3f6f, 0x3f6f, 0x3f6f, 0x3f70, 0x3f70, + 0x3f70, 0x3f70, 0x3f71, 0x3f71, 0x3f71, 0x3f71, 0x3f72, 0x3f72, + 0x3f72, 0x3f73, 0x3f73, 0x3f73, 0x3f73, 0x3f74, 0x3f74, 0x3f74, + 0x3f74, 0x3f75, 0x3f75, 0x3f75, 0x3f76, 0x3f76, 0x3f76, 0x3f76, + 0x3f77, 0x3f77, 0x3f77, 0x3f77, 0x3f78, 0x3f78, 0x3f78, 0x3f79, + 0x3f79, 0x3f79, 0x3f79, 0x3f7a, 0x3f7a, 0x3f7a, 0x3f7a, 0x3f7b, + 0x3f7b, 0x3f7b, 0x3f7b, 0x3f7c, 0x3f7c, 0x3f7c, 0x3f7d, 0x3f7d, + 0x3f7d, 0x3f7d, 0x3f7e, 0x3f7e, 0x3f7e, 0x3f7e, 0x3f7f, 0x3f7f, + 0x3f7f, 0x3f7f, 0x3f80, 0x3f80, 0x3f80, 0x3f81, 0x3f81, 0x3f81, + 0x3f81, 0x3f82, 0x3f82, 0x3f82, 0x3f82, 0x3f83, 0x3f83, 0x3f83, + 0x3f83, 0x3f84, 0x3f84, 0x3f84, 0x3f85, 0x3f85, 0x3f85, 0x3f85, + 0x3f86, 0x3f86, 0x3f86, 0x3f86, 0x3f87, 0x3f87, 0x3f87, 0x3f87, + 0x3f88, 0x3f88, 0x3f88, 0x3f88, 0x3f89, 0x3f89, 0x3f89, 0x3f89, + 0x3f8a, 0x3f8a, 0x3f8a, 0x3f8b, 0x3f8b, 0x3f8b, 0x3f8b, 0x3f8c, + 0x3f8c, 0x3f8c, 0x3f8c, 0x3f8d, 0x3f8d, 0x3f8d, 0x3f8d, 0x3f8e, + 0x3f8e, 0x3f8e, 0x3f8e, 0x3f8f, 0x3f8f, 0x3f8f, 0x3f8f, 0x3f90, + 0x3f90, 0x3f90, 0x3f90, 0x3f91, 0x3f91, 0x3f91, 0x3f91, 0x3f92, + 0x3f92, 0x3f92, 0x3f92, 0x3f93, 0x3f93, 0x3f93, 0x3f93, 0x3f94, + 0x3f94, 0x3f94, 0x3f95, 0x3f95, 0x3f95, 0x3f95, 0x3f96, 0x3f96, + 0x3f96, 0x3f96, 0x3f97, 0x3f97, 0x3f97, 0x3f97, 0x3f98, 0x3f98, + 0x3f98, 0x3f98, 0x3f99, 0x3f99, 0x3f99, 0x3f99, 0x3f9a, 0x3f9a, + 0x3f9a, 0x3f9a, 0x3f9b, 0x3f9b, 0x3f9b, 0x3f9b, 0x3f9c, 0x3f9c, + 0x3f9c, 0x3f9c, 0x3f9d, 0x3f9d, 0x3f9d, 0x3f9d, 0x3f9e, 0x3f9e, + 0x3f9e, 0x3f9e, 0x3f9f, 0x3f9f, 0x3f9f, 0x3f9f, 0x3fa0, 0x3fa0, + 0x3fa0, 0x3fa0, 0x3fa1, 0x3fa1, 0x3fa1, 0x3fa1, 0x3fa2, 0x3fa2, + 0x3fa2, 0x3fa2, 0x3fa3, 0x3fa3, 0x3fa3, 0x3fa3, 0x3fa3, 0x3fa4, + 0x3fa4, 0x3fa4, 0x3fa4, 0x3fa5, 0x3fa5, 0x3fa5, 0x3fa5, 0x3fa6, + 0x3fa6, 0x3fa6, 0x3fa6, 0x3fa7, 0x3fa7, 0x3fa7, 0x3fa7, 0x3fa8, + 0x3fa8, 0x3fa8, 0x3fa8, 0x3fa9, 0x3fa9, 0x3fa9, 0x3fa9, 0x3faa, + 0x3faa, 0x3faa, 0x3faa, 0x3fab, 0x3fab, 0x3fab, 0x3fab, 0x3fac, + 0x3fac, 0x3fac, 0x3fac, 0x3fad, 0x3fad, 0x3fad, 0x3fad, 0x3fad, + 0x3fae, 0x3fae, 0x3fae, 0x3fae, 0x3faf, 0x3faf, 0x3faf, 0x3faf, + 0x3fb0, 0x3fb0, 0x3fb0, 0x3fb0, 0x3fb1, 0x3fb1, 0x3fb1, 0x3fb1, + 0x3fb2, 0x3fb2, 0x3fb2, 0x3fb2, 0x3fb2, 0x3fb3, 0x3fb3, 0x3fb3, + 0x3fb3, 0x3fb4, 0x3fb4, 0x3fb4, 0x3fb4, 0x3fb5, 0x3fb5, 0x3fb5, + 0x3fb5, 0x3fb6, 0x3fb6, 0x3fb6, 0x3fb6, 0x3fb7, 0x3fb7, 0x3fb7, + 0x3fb7, 0x3fb7, 0x3fb8, 0x3fb8, 0x3fb8, 0x3fb8, 0x3fb9, 0x3fb9, + 0x3fb9, 0x3fb9, 0x3fba, 0x3fba, 0x3fba, 0x3fba, 0x3fbb, 0x3fbb, + 0x3fbb, 0x3fbb, 0x3fbb, 0x3fbc, 0x3fbc, 0x3fbc, 0x3fbc, 0x3fbd, + 0x3fbd, 0x3fbd, 0x3fbd, 0x3fbe, 0x3fbe, 0x3fbe, 0x3fbe, 0x3fbe, + 0x3fbf, 0x3fbf, 0x3fbf, 0x3fbf, 0x3fc0, 0x3fc0, 0x3fc0, 0x3fc0, + 0x3fc1, 0x3fc1, 0x3fc1, 0x3fc1, 0x3fc1, 0x3fc2, 0x3fc2, 0x3fc2, + 0x3fc2, 0x3fc3, 0x3fc3, 0x3fc3, 0x3fc3, 0x3fc4, 0x3fc4, 0x3fc4, + 0x3fc4, 0x3fc4, 0x3fc5, 0x3fc5, 0x3fc5, 0x3fc5, 0x3fc6, 0x3fc6, + 0x3fc6, 0x3fc6, 0x3fc7, 0x3fc7, 0x3fc7, 0x3fc7, 0x3fc7, 0x3fc8, + 0x3fc8, 0x3fc8, 0x3fc9, 0x3fc9, 0x3fca, 0x3fca, 0x3fcb, 0x3fcb, + 0x3fcc, 0x3fcc, 0x3fcc, 0x3fcd, 0x3fcd, 0x3fce, 0x3fce, 0x3fcf, + 0x3fcf, 0x3fd0, 0x3fd0, 0x3fd0, 0x3fd1, 0x3fd1, 0x3fd2, 0x3fd2, + 0x3fd3, 0x3fd3, 0x3fd4, 0x3fd4, 0x3fd4, 0x3fd5, 0x3fd5, 0x3fd6, + 0x3fd6, 0x3fd7, 0x3fd7, 0x3fd8, 0x3fd8, 0x3fd8, 0x3fd9, 0x3fd9, + 0x3fda, 0x3fda, 0x3fdb, 0x3fdb, 0x3fdb, 0x3fdc, 0x3fdc, 0x3fdd, + 0x3fdd, 0x3fde, 0x3fde, 0x3fdf, 0x3fdf, 0x3fdf, 0x3fe0, 0x3fe0, + 0x3fe1, 0x3fe1, 0x3fe2, 0x3fe2, 0x3fe2, 0x3fe3, 0x3fe3, 0x3fe4, + 0x3fe4, 0x3fe5, 0x3fe5, 0x3fe5, 0x3fe6, 0x3fe6, 0x3fe7, 0x3fe7, + 0x3fe8, 0x3fe8, 0x3fe8, 0x3fe9, 0x3fe9, 0x3fea, 0x3fea, 0x3fea, + 0x3feb, 0x3feb, 0x3fec, 0x3fec, 0x3fed, 0x3fed, 0x3fed, 0x3fee, + 0x3fee, 0x3fef, 0x3fef, 0x3ff0, 0x3ff0, 0x3ff0, 0x3ff1, 0x3ff1, + 0x3ff2, 0x3ff2, 0x3ff2, 0x3ff3, 0x3ff3, 0x3ff4, 0x3ff4, 0x3ff4, + 0x3ff5, 0x3ff5, 0x3ff6, 0x3ff6, 0x3ff7, 0x3ff7, 0x3ff7, 0x3ff8, + 0x3ff8, 0x3ff9, 0x3ff9, 0x3ff9, 0x3ffa, 0x3ffa, 0x3ffb, 0x3ffb, + 0x3ffb, 0x3ffc, 0x3ffc, 0x3ffd, 0x3ffd, 0x3ffd, 0x3ffe, 0x3ffe, + 0x3fff, 0x3fff, 0x4000, 0x4000, 0x4000, 0x4000, 0x4001, 0x4001, + 0x4001, 0x4001, 0x4001, 0x4002, 0x4002, 0x4002, 0x4002, 0x4002, + 0x4003, 0x4003, 0x4003, 0x4003, 0x4003, 0x4004, 0x4004, 0x4004, + 0x4004, 0x4004, 0x4005, 0x4005, 0x4005, 0x4005, 0x4005, 0x4006, + 0x4006, 0x4006, 0x4006, 0x4006, 0x4007, 0x4007, 0x4007, 0x4007, + 0x4007, 0x4007, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4009, + 0x4009, 0x4009, 0x4009, 0x4009, 0x400a, 0x400a, 0x400a, 0x400a, + 0x400a, 0x400b, 0x400b, 0x400b, 0x400b, 0x400b, 0x400c, 0x400c, + 0x400c, 0x400c, 0x400c, 0x400d, 0x400d, 0x400d, 0x400d, 0x400d, + 0x400d, 0x400e, 0x400e, 0x400e, 0x400e, 0x400e, 0x400f, 0x400f, + 0x400f, 0x400f, 0x400f, 0x4010, 0x4010, 0x4010, 0x4010, 0x4010, + 0x4010, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4012, 0x4012, + 0x4012, 0x4012, 0x4012, 0x4013, 0x4013, 0x4013, 0x4013, 0x4013, + 0x4013, 0x4014, 0x4014, 0x4014, 0x4014, 0x4014, 0x4015, 0x4015, + 0x4015, 0x4015, 0x4015, 0x4015, 0x4016, 0x4016, 0x4016, 0x4016, + 0x4016, 0x4017, 0x4017, 0x4017, 0x4017, 0x4017, 0x4018, 0x4018, + 0x4018, 0x4018, 0x4018, 0x4018, 0x4019, 0x4019, 0x4019, 0x4019, + 0x4019, 0x401a, 0x401a, 0x401a, 0x401a, 0x401a, 0x401a, 0x401b, + 0x401b, 0x401b, 0x401b, 0x401b, 0x401b, 0x401c, 0x401c, 0x401c, + 0x401c, 0x401c, 0x401d, 0x401d, 0x401d, 0x401d, 0x401d, 0x401d, + 0x401e, 0x401e, 0x401e, 0x401e, 0x401e, 0x401f, 0x401f, 0x401f, + 0x401f, 0x401f, 0x401f, 0x4020, 0x4020, 0x4020, 0x4020, 0x4020, + 0x4020, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4022, + 0x4022, 0x4022, 0x4022, 0x4022, 0x4023, 0x4023, 0x4023, 0x4023, + 0x4023, 0x4023, 0x4024, 0x4024, 0x4024, 0x4024, 0x4024, 0x4024, + 0x4025, 0x4025, 0x4025, 0x4025, 0x4025, 0x4025, 0x4026, 0x4026, + 0x4026, 0x4026, 0x4026, 0x4026, 0x4027, 0x4027, 0x4027, 0x4027, + 0x4027, 0x4028, 0x4028, 0x4028, 0x4028, 0x4028, 0x4028, 0x4029, + 0x4029, 0x4029, 0x4029, 0x4029, 0x4029, 0x402a, 0x402a, 0x402a, + 0x402a, 0x402a, 0x402a, 0x402b, 0x402b, 0x402b, 0x402b, 0x402b, + 0x402b, 0x402c, 0x402c, 0x402c, 0x402c, 0x402c, 0x402c, 0x402d, + 0x402d, 0x402d, 0x402d, 0x402d, 0x402d, 0x402e, 0x402e, 0x402e, + 0x402e, 0x402e, 0x402e, 0x402f, 0x402f, 0x402f, 0x402f, 0x402f, + 0x402f, 0x4030, 0x4030, 0x4030, 0x4030, 0x4030, 0x4030, 0x4031, + 0x4031, 0x4031, 0x4031, 0x4031, 0x4031, 0x4032, 0x4032, 0x4032, + 0x4032, 0x4032, 0x4032, 0x4032, 0x4033, 0x4033, 0x4033, 0x4033, + 0x4033, 0x4033, 0x4034, 0x4034, 0x4034, 0x4034, 0x4034, 0x4034, + 0x4035, 0x4035, 0x4035, 0x4035, 0x4035, 0x4035, 0x4036, 0x4036, + 0x4036, 0x4036, 0x4036, 0x4036, 0x4036, 0x4037, 0x4037, 0x4037, + 0x4037, 0x4037, 0x4037, 0x4038, 0x4038, 0x4038, 0x4038, 0x4038, + 0x4038, 0x4039, 0x4039, 0x4039, 0x4039, 0x4039, 0x4039, 0x403a, + 0x403a, 0x403a, 0x403a, 0x403a, 0x403a, 0x403a, 0x403b, 0x403b, + 0x403b, 0x403b, 0x403b, 0x403b, 0x403c, 0x403c, 0x403c, 0x403c, + 0x403c, 0x403c, 0x403c, 0x403d, 0x403d, 0x403d, 0x403d, 0x403d, + 0x403d, 0x403e, 0x403e, 0x403e, 0x403e, 0x403e, 0x403e, 0x403e, + 0x403f, 0x403f, 0x403f, 0x403f, 0x403f, 0x403f, 0x4040, 0x4040, + 0x4040, 0x4040, 0x4040, 0x4040, 0x4040, 0x4041, 0x4041, 0x4041, + 0x4041, 0x4041, 0x4041, 0x4042, 0x4042, 0x4042, 0x4042, 0x4042, + 0x4042, 0x4042, 0x4043, 0x4043, 0x4043, 0x4043, 0x4043, 0x4043, + 0x4044, 0x4044, 0x4044, 0x4044, 0x4044, 0x4044, 0x4044, 0x4045, + 0x4045, 0x4045, 0x4045, 0x4045, 0x4045, 0x4045, 0x4046, 0x4046, + 0x4046, 0x4046, 0x4046, 0x4046, 0x4047, 0x4047, 0x4047, 0x4047, + 0x4047, 0x4047, 0x4047, 0x4048, 0x4048, 0x4048, 0x4048, 0x4048, + 0x4048, 0x4048, 0x4049, 0x4049, 0x4049, 0x4049, 0x4049, 0x4049, + 0x4049, 0x404a, 0x404a, 0x404a, 0x404a, 0x404a, 0x404a, 0x404a, + 0x404b, 0x404b, 0x404b, 0x404b, 0x404b, 0x404b, 0x404c, 0x404c, + 0x404c, 0x404c, 0x404c, 0x404c, 0x404c, 0x404d, 0x404d, 0x404d, + 0x404d, 0x404d, 0x404d, 0x404d, 0x404e, 0x404e, 0x404e, 0x404e, + 0x404e, 0x404e, 0x404e, 0x404f, 0x404f, 0x404f, 0x404f, 0x404f, + 0x404f, 0x404f, 0x4050, 0x4050, 0x4050, 0x4050, 0x4050, 0x4050, + 0x4050, 0x4051, 0x4051, 0x4051, 0x4051, 0x4051, 0x4051, 0x4051, + 0x4052, 0x4052, 0x4052, 0x4052, 0x4052, 0x4052, 0x4052, 0x4053, + 0x4053, 0x4053, 0x4053, 0x4053, 0x4053, 0x4053, 0x4054, 0x4054, + 0x4054, 0x4054, 0x4054, 0x4054, 0x4054, 0x4055, 0x4055, 0x4055, + 0x4055, 0x4055, 0x4055, 0x4055, 0x4055, 0x4056, 0x4056, 0x4056, + 0x4056, 0x4056, 0x4056, 0x4056, 0x4057, 0x4057, 0x4057, 0x4057, + 0x4057, 0x4057, 0x4057, 0x4058, 0x4058, 0x4058, 0x4058, 0x4058, + 0x4058, 0x4058, 0x4059, 0x4059, 0x4059, 0x4059, 0x4059, 0x4059, + 0x4059, 0x405a, 0x405a, 0x405a, 0x405a, 0x405a, 0x405a, 0x405a, + 0x405a, 0x405b, 0x405b, 0x405b, 0x405b, 0x405b, 0x405b, 0x405b, + 0x405c, 0x405c, 0x405c, 0x405c, 0x405c, 0x405c, 0x405c, 0x405d, + 0x405d, 0x405d, 0x405d, 0x405d, 0x405d, 0x405d, 0x405d, 0x405e, + 0x405e, 0x405e, 0x405e, 0x405e, 0x405e, 0x405e, 0x405f, 0x405f, + 0x405f, 0x405f, 0x405f, 0x405f, 0x405f, 0x405f, 0x4060, 0x4060, + 0x4060, 0x4060, 0x4060, 0x4060, 0x4060, 0x4061, 0x4061, 0x4061, + 0x4061, 0x4061, 0x4061, 0x4061, 0x4061, 0x4062, 0x4062, 0x4062, + 0x4062, 0x4062, 0x4062, 0x4062, 0x4063, 0x4063, 0x4063, 0x4063, + 0x4063, 0x4063, 0x4063, 0x4063, 0x4064, 0x4064, 0x4064, 0x4064, + 0x4064, 0x4064, 0x4064, 0x4064, 0x4065, 0x4065, 0x4065, 0x4065, + 0x4065, 0x4065, 0x4065, 0x4066, 0x4066, 0x4066, 0x4066, 0x4066, + 0x4066, 0x4066, 0x4066, 0x4067, 0x4067, 0x4067, 0x4067, 0x4067, + 0x4067, 0x4067, 0x4067, 0x4068, 0x4068, 0x4068, 0x4068, 0x4068, + 0x4068, 0x4068, 0x4069, 0x4069, 0x4069, 0x4069, 0x4069, 0x4069, + 0x4069, 0x4069, 0x406a, 0x406a, 0x406a, 0x406a, 0x406a, 0x406a, + 0x406a, 0x406a, 0x406b, 0x406b, 0x406b, 0x406b, 0x406b, 0x406b, + 0x406b, 0x406b, 0x406c, 0x406c, 0x406c, 0x406c, 0x406c, 0x406c, + 0x406c, 0x406c, 0x406d, 0x406d, 0x406d, 0x406d, 0x406d, 0x406d, + 0x406d, 0x406d, 0x406e, 0x406e, 0x406e, 0x406e, 0x406e, 0x406e, + 0x406e, 0x406e, 0x406f, 0x406f, 0x406f, 0x406f, 0x406f, 0x406f, + 0x406f, 0x406f, 0x4070, 0x4070, 0x4070, 0x4070, 0x4070, 0x4070, + 0x4070, 0x4070, 0x4071, 0x4071, 0x4071, 0x4071, 0x4071, 0x4071, + 0x4071, 0x4071, 0x4072, 0x4072, 0x4072, 0x4072, 0x4072, 0x4072, + 0x4072, 0x4072, 0x4073, 0x4073, 0x4073, 0x4073, 0x4073, 0x4073, + 0x4073, 0x4073, 0x4074, 0x4074, 0x4074, 0x4074, 0x4074, 0x4074, + 0x4074, 0x4074, 0x4075, 0x4075, 0x4075, 0x4075, 0x4075, 0x4075, + 0x4075, 0x4075, 0x4076, 0x4076, 0x4076, 0x4076, 0x4076, 0x4076, + 0x4076, 0x4076, 0x4076, 0x4077, 0x4077, 0x4077, 0x4077, 0x4077, + 0x4077, 0x4077, 0x4077, 0x4078, 0x4078, 0x4078, 0x4078, 0x4078, + 0x4078, 0x4078, 0x4078, 0x4079, 0x4079, 0x4079, 0x4079, 0x4079, + 0x4079, 0x4079, 0x4079, 0x4079, 0x407a, 0x407a, 0x407a, 0x407a, + 0x407a, 0x407a, 0x407a, 0x407a, 0x407b, 0x407b, 0x407b, 0x407b, + 0x407b, 0x407b, 0x407b, 0x407b, 0x407c, 0x407c, 0x407c, 0x407c, + 0x407c, 0x407c, 0x407c, 0x407c, 0x407c, 0x407d, 0x407d, 0x407d, + 0x407d, 0x407d, 0x407d, 0x407d, 0x407d, 0x407e, 0x407e, 0x407e, + 0x407e, 0x407e, 0x407e, 0x407e, 0x407e, 0x407e, 0x407f, 0x407f, + 0x407f, 0x407f, 0x407f, 0x407f, 0x407f, 0x407f, 0x4080, 0x4080, + 0x4080, 0x4080, 0x4080, 0x4080, 0x4080, 0x4080, 0x4080, 0x4081, + 0x4081, 0x4081, 0x4081, 0x4081, 0x4081, 0x4081, 0x4081, 0x4081, + 0x4082, 0x4082, 0x4082, 0x4082, 0x4082, 0x4082, 0x4082, 0x4082, + 0x4083, 0x4083, 0x4083, 0x4083, 0x4083, 0x4083, 0x4083, 0x4083, + 0x4083, 0x4084, 0x4084, 0x4084, 0x4084, 0x4084, 0x4084, 0x4084, + 0x4084, 0x4084, 0x4085, 0x4085, 0x4085, 0x4085, 0x4085, 0x4085, + 0x4085, 0x4085, 0x4086, 0x4086, 0x4086, 0x4086, 0x4087, 0x4087, + 0x4087, 0x4087, 0x4088, 0x4088, 0x4088, 0x4088, 0x4088, 0x4089, + 0x4089, 0x4089, 0x4089, 0x408a, 0x408a, 0x408a, 0x408a, 0x408a, + 0x408b, 0x408b, 0x408b, 0x408b, 0x408c, 0x408c, 0x408c, 0x408c, + 0x408c, 0x408d, 0x408d, 0x408d, 0x408d, 0x408e, 0x408e, 0x408e, + 0x408e, 0x408e, 0x408f, 0x408f, 0x408f, 0x408f, 0x408f, 0x4090, + 0x4090, 0x4090, 0x4090, 0x4091, 0x4091, 0x4091, 0x4091, 0x4091, + 0x4092, 0x4092, 0x4092, 0x4092, 0x4093, 0x4093, 0x4093, 0x4093, + 0x4093, 0x4094, 0x4094, 0x4094, 0x4094, 0x4094, 0x4095, 0x4095, + 0x4095, 0x4095, 0x4095, 0x4096, 0x4096, 0x4096, 0x4096, 0x4097, + 0x4097, 0x4097, 0x4097, 0x4097, 0x4098, 0x4098, 0x4098, 0x4098, + 0x4098, 0x4099, 0x4099, 0x4099, 0x4099, 0x4099, 0x409a, 0x409a, + 0x409a, 0x409a, 0x409b, 0x409b, 0x409b, 0x409b, 0x409b, 0x409c, + 0x409c, 0x409c, 0x409c, 0x409c, 0x409d, 0x409d, 0x409d, 0x409d, + 0x409d, 0x409e, 0x409e, 0x409e, 0x409e, 0x409e, 0x409f, 0x409f, + 0x409f, 0x409f, 0x409f, 0x40a0, 0x40a0, 0x40a0, 0x40a0, 0x40a0, + 0x40a1, 0x40a1, 0x40a1, 0x40a1, 0x40a1, 0x40a2, 0x40a2, 0x40a2, + 0x40a2, 0x40a2, 0x40a3, 0x40a3, 0x40a3, 0x40a3, 0x40a3, 0x40a4, + 0x40a4, 0x40a4, 0x40a4, 0x40a4, 0x40a5, 0x40a5, 0x40a5, 0x40a5, + 0x40a5, 0x40a6, 0x40a6, 0x40a6, 0x40a6, 0x40a6, 0x40a7, 0x40a7, + 0x40a7, 0x40a7, 0x40a7, 0x40a8, 0x40a8, 0x40a8, 0x40a8, 0x40a8, + 0x40a9, 0x40a9, 0x40a9, 0x40a9, 0x40a9, 0x40aa, 0x40aa, 0x40aa, + 0x40aa, 0x40aa, 0x40ab, 0x40ab, 0x40ab, 0x40ab, 0x40ab, 0x40ac, + 0x40ac, 0x40ac, 0x40ac, 0x40ac, 0x40ac, 0x40ad, 0x40ad, 0x40ad, + 0x40ad, 0x40ad, 0x40ae, 0x40ae, 0x40ae, 0x40ae, 0x40ae, 0x40af, + 0x40af, 0x40af, 0x40af, 0x40af, 0x40b0, 0x40b0, 0x40b0, 0x40b0, + 0x40b0, 0x40b0, 0x40b1, 0x40b1, 0x40b1, 0x40b1, 0x40b1, 0x40b2, + 0x40b2, 0x40b2, 0x40b2, 0x40b2, 0x40b3, 0x40b3, 0x40b3, 0x40b3, + 0x40b3, 0x40b3, 0x40b4, 0x40b4, 0x40b4, 0x40b4, 0x40b4, 0x40b5, + 0x40b5, 0x40b5, 0x40b5, 0x40b5, 0x40b6, 0x40b6, 0x40b6, 0x40b6, + 0x40b6, 0x40b6, 0x40b7, 0x40b7, 0x40b7, 0x40b7, 0x40b7, 0x40b8, + 0x40b8, 0x40b8, 0x40b8, 0x40b8, 0x40b8, 0x40b9, 0x40b9, 0x40b9, + 0x40b9, 0x40b9, 0x40ba, 0x40ba, 0x40ba, 0x40ba, 0x40ba, 0x40ba, + 0x40bb, 0x40bb, 0x40bb, 0x40bb, 0x40bb, 0x40bc, 0x40bc, 0x40bc, + 0x40bc, 0x40bc, 0x40bc, 0x40bd, 0x40bd, 0x40bd, 0x40bd, 0x40bd, + 0x40be, 0x40be, 0x40be, 0x40be, 0x40be, 0x40be, 0x40bf, 0x40bf, + 0x40bf, 0x40bf, 0x40bf, 0x40bf, 0x40c0, 0x40c0, 0x40c0, 0x40c0, + 0x40c0, 0x40c1, 0x40c1, 0x40c1, 0x40c1, 0x40c1, 0x40c1, 0x40c2, + 0x40c2, 0x40c2, 0x40c2, 0x40c2, 0x40c2, 0x40c3, 0x40c3, 0x40c3, + 0x40c3, 0x40c3, 0x40c4, 0x40c4, 0x40c4, 0x40c4, 0x40c4, 0x40c4, + 0x40c5, 0x40c5, 0x40c5, 0x40c5, 0x40c5, 0x40c5, 0x40c6, 0x40c6, + 0x40c6, 0x40c6, 0x40c6, 0x40c6, 0x40c7, 0x40c7, 0x40c7, 0x40c7, + 0x40c7, 0x40c7, 0x40c8, 0x40c8, 0x40c8, 0x40c8, 0x40c8, 0x40c8, + 0x40c9, 0x40c9, 0x40c9, 0x40c9, 0x40c9, 0x40ca, 0x40ca, 0x40ca, + 0x40ca, 0x40ca, 0x40ca, 0x40cb, 0x40cb, 0x40cb, 0x40cb, 0x40cb, + 0x40cb, 0x40cc, 0x40cc, 0x40cc, 0x40cc, 0x40cc, 0x40cc, 0x40cd, + 0x40cd, 0x40cd, 0x40cd, 0x40cd, 0x40cd, 0x40ce, 0x40ce, 0x40ce, + 0x40ce, 0x40ce, 0x40ce, 0x40cf, 0x40cf, 0x40cf, 0x40cf, 0x40cf, + 0x40cf, 0x40d0, 0x40d0, 0x40d0, 0x40d0, 0x40d0, 0x40d0, 0x40d1, + 0x40d1, 0x40d1, 0x40d1, 0x40d1, 0x40d1, 0x40d2, 0x40d2, 0x40d2, + 0x40d2, 0x40d2, 0x40d2, 0x40d2, 0x40d3, 0x40d3, 0x40d3, 0x40d3, + 0x40d3, 0x40d3, 0x40d4, 0x40d4, 0x40d4, 0x40d4, 0x40d4, 0x40d4, + 0x40d5, 0x40d5, 0x40d5, 0x40d5, 0x40d5, 0x40d5, 0x40d6, 0x40d6, + 0x40d6, 0x40d6, 0x40d6, 0x40d6, 0x40d7, 0x40d7, 0x40d7, 0x40d7, + 0x40d7, 0x40d7, 0x40d7, 0x40d8, 0x40d8, 0x40d8, 0x40d8, 0x40d8, + 0x40d8, 0x40d9, 0x40d9, 0x40d9, 0x40d9, 0x40d9, 0x40d9, 0x40da, + 0x40da, 0x40da, 0x40da, 0x40da, 0x40da, 0x40db, 0x40db, 0x40db, + 0x40db, 0x40db, 0x40db, 0x40db, 0x40dc, 0x40dc, 0x40dc, 0x40dc, + 0x40dc, 0x40dc, 0x40dd, 0x40dd, 0x40dd, 0x40dd, 0x40dd, 0x40dd, + 0x40dd, 0x40de, 0x40de, 0x40de, 0x40de, 0x40de, 0x40de, 0x40df, + 0x40df, 0x40df, 0x40df, 0x40df, 0x40df, 0x40df, 0x40e0, 0x40e0, + 0x40e0, 0x40e0, 0x40e0, 0x40e0, 0x40e1, 0x40e1, 0x40e1, 0x40e1, + 0x40e1, 0x40e1, 0x40e1, 0x40e2, 0x40e2, 0x40e2, 0x40e2, 0x40e2, + 0x40e2, 0x40e3, 0x40e3, 0x40e3, 0x40e3, 0x40e3, 0x40e3, 0x40e3, + 0x40e4, 0x40e4, 0x40e4, 0x40e4, 0x40e4, 0x40e4, 0x40e5, 0x40e5, + 0x40e5, 0x40e5, 0x40e5, 0x40e5, 0x40e5, 0x40e6, 0x40e6, 0x40e6, + 0x40e6, 0x40e6, 0x40e6, 0x40e6, 0x40e7, 0x40e7, 0x40e7, 0x40e7, + 0x40e7, 0x40e7, 0x40e8, 0x40e8, 0x40e8, 0x40e8, 0x40e8, 0x40e8, + 0x40e8, 0x40e9, 0x40e9, 0x40e9, 0x40e9, 0x40e9, 0x40e9, 0x40e9, + 0x40ea, 0x40ea, 0x40ea, 0x40ea, 0x40ea, 0x40ea, 0x40ea, 0x40eb, + 0x40eb, 0x40eb, 0x40eb, 0x40eb, 0x40eb, 0x40ec, 0x40ec, 0x40ec, + 0x40ec, 0x40ec, 0x40ec, 0x40ec, 0x40ed, 0x40ed, 0x40ed, 0x40ed, + 0x40ed, 0x40ed, 0x40ed, 0x40ee, 0x40ee, 0x40ee, 0x40ee, 0x40ee, + 0x40ee, 0x40ee, 0x40ef, 0x40ef, 0x40ef, 0x40ef, 0x40ef, 0x40ef, + 0x40ef, 0x40f0, 0x40f0, 0x40f0, 0x40f0, 0x40f0, 0x40f0, 0x40f0, + 0x40f1, 0x40f1, 0x40f1, 0x40f1, 0x40f1, 0x40f1, 0x40f1, 0x40f2, + 0x40f2, 0x40f2, 0x40f2, 0x40f2, 0x40f2, 0x40f2, 0x40f3, 0x40f3, + 0x40f3, 0x40f3, 0x40f3, 0x40f3, 0x40f3, 0x40f4, 0x40f4, 0x40f4, + 0x40f4, 0x40f4, 0x40f4, 0x40f4, 0x40f5, 0x40f5, 0x40f5, 0x40f5, + 0x40f5, 0x40f5, 0x40f5, 0x40f6, 0x40f6, 0x40f6, 0x40f6, 0x40f6, + 0x40f6, 0x40f6, 0x40f7, 0x40f7, 0x40f7, 0x40f7, 0x40f7, 0x40f7, + 0x40f7, 0x40f8, 0x40f8, 0x40f8, 0x40f8, 0x40f8, 0x40f8, 0x40f8, + 0x40f8, 0x40f9, 0x40f9, 0x40f9, 0x40f9, 0x40f9, 0x40f9, 0x40f9, + 0x40fa, 0x40fa, 0x40fa, 0x40fa, 0x40fa, 0x40fa, 0x40fa, 0x40fb, + 0x40fb, 0x40fb, 0x40fb, 0x40fb, 0x40fb, 0x40fb, 0x40fc, 0x40fc, + 0x40fc, 0x40fc, 0x40fc, 0x40fc, 0x40fc, 0x40fc, 0x40fd, 0x40fd, + 0x40fd, 0x40fd, 0x40fd, 0x40fd, 0x40fd, 0x40fe, 0x40fe, 0x40fe, + 0x40fe, 0x40fe, 0x40fe, 0x40fe, 0x40fe, 0x40ff, 0x40ff, 0x40ff, + 0x40ff, 0x40ff, 0x40ff, 0x40ff, 0x4100, 0x4100, 0x4100, 0x4100, + 0x4100, 0x4100, 0x4100, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, + 0x4101, 0x4101, 0x4101, 0x4102, 0x4102, 0x4102, 0x4102, 0x4102, + 0x4102, 0x4102, 0x4103, 0x4103, 0x4103, 0x4103, 0x4103, 0x4103, + 0x4103, 0x4103, 0x4104, 0x4104, 0x4104, 0x4104, 0x4104, 0x4104, + 0x4104, 0x4104, 0x4105, 0x4105, 0x4105, 0x4105, 0x4105, 0x4105, + 0x4105, 0x4106, 0x4106, 0x4106, 0x4106, 0x4106, 0x4106, 0x4106, + 0x4106, 0x4107, 0x4107, 0x4107, 0x4107, 0x4107, 0x4107, 0x4107, + 0x4107, 0x4108, 0x4108, 0x4108, 0x4108, 0x4108, 0x4108, 0x4108, + 0x4109, 0x4109, 0x4109, 0x4109, 0x4109, 0x4109, 0x4109, 0x4109, + 0x410a, 0x410a, 0x410a, 0x410a, 0x410a, 0x410a, 0x410a, 0x410a, + 0x410b, 0x410b, 0x410b, 0x410b, 0x410b, 0x410b, 0x410b, 0x410b, + 0x410c, 0x410c, 0x410c, 0x410c, 0x410c, 0x410c, 0x410c, 0x410d, + 0x410d, 0x410d, 0x410d, 0x410d, 0x410d, 0x410d, 0x410d, 0x410e, + 0x410e, 0x410e, 0x410e, 0x410e, 0x410e, 0x410e, 0x410e, 0x410f, + 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, + 0x4110, 0x4110, 0x4110, 0x4110, 0x4110, 0x4110, 0x4110, 0x4111, + 0x4111, 0x4111, 0x4111, 0x4111, 0x4111, 0x4111, 0x4111, 0x4112, + 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4113, + 0x4113, 0x4113, 0x4113, 0x4113, 0x4113, 0x4113, 0x4113, 0x4114, + 0x4114, 0x4114, 0x4114, 0x4114, 0x4114, 0x4114, 0x4114, 0x4115, + 0x4115, 0x4115, 0x4115, 0x4115, 0x4115, 0x4115, 0x4115, 0x4115, + 0x4116, 0x4116, 0x4116, 0x4116, 0x4116, 0x4116, 0x4116, 0x4116, + 0x4117, 0x4117, 0x4117, 0x4117, 0x4117, 0x4117, 0x4117, 0x4117, + 0x4118, 0x4118, 0x4118, 0x4118, 0x4118, 0x4118, 0x4118, 0x4118, + 0x4119, 0x4119, 0x4119, 0x4119, 0x4119, 0x4119, 0x4119, 0x4119, + 0x4119, 0x411a, 0x411a, 0x411a, 0x411a, 0x411a, 0x411a, 0x411a, + 0x411a, 0x411b, 0x411b, 0x411b, 0x411b, 0x411b, 0x411b, 0x411b, + 0x411b, 0x411c, 0x411c, 0x411c, 0x411c, 0x411c, 0x411c, 0x411c, + 0x411c, 0x411c, 0x411d, 0x411d, 0x411d, 0x411d, 0x411d, 0x411d, + 0x411d, 0x411d, 0x411e, 0x411e, 0x411e, 0x411e, 0x411e, 0x411e, + 0x411e, 0x411e, 0x411e, 0x411f, 0x411f, 0x411f, 0x411f, 0x411f, + 0x411f, 0x411f, 0x411f, 0x4120, 0x4120, 0x4120, 0x4120, 0x4120, + 0x4120, 0x4120, 0x4120, 0x4120, 0x4121, 0x4121, 0x4121, 0x4121, + 0x4121, 0x4121, 0x4121, 0x4121, 0x4122, 0x4122, 0x4122, 0x4122, + 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4123, 0x4123, 0x4123, + 0x4123, 0x4123, 0x4123, 0x4123, 0x4123, 0x4123, 0x4124, 0x4124, + 0x4124, 0x4124, 0x4124, 0x4124, 0x4124, 0x4124, 0x4125, 0x4125, + 0x4125, 0x4125, 0x4125, 0x4125, 0x4125, 0x4125, 0x4125, 0x4126, + 0x4126, 0x4126, 0x4126, 0x4126, 0x4126, 0x4126, 0x4126, 0x4126, + 0x4127, 0x4127, 0x4127, 0x4127, 0x4127, 0x4128, 0x4128, 0x4128, + 0x4128, 0x4129, 0x4129, 0x4129, 0x4129, 0x412a, 0x412a, 0x412a, + 0x412a, 0x412a, 0x412b, 0x412b, 0x412b, 0x412b, 0x412c, 0x412c, + 0x412c, 0x412c, 0x412c, 0x412d, 0x412d, 0x412d, 0x412d, 0x412e, + 0x412e, 0x412e, 0x412e, 0x412e, 0x412f, 0x412f, 0x412f, 0x412f, + 0x412f, 0x4130, 0x4130, 0x4130, 0x4130, 0x4131, 0x4131, 0x4131, + 0x4131, 0x4131, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4133, + 0x4133, 0x4133, 0x4133, 0x4134, 0x4134, 0x4134, 0x4134, 0x4134, + 0x4135, 0x4135, 0x4135, 0x4135, 0x4136, 0x4136, 0x4136, 0x4136, + 0x4136, 0x4137, 0x4137, 0x4137, 0x4137, 0x4137, 0x4138, 0x4138, + 0x4138, 0x4138, 0x4138, 0x4139, 0x4139, 0x4139, 0x4139, 0x413a, + 0x413a, 0x413a, 0x413a, 0x413a, 0x413b, 0x413b, 0x413b, 0x413b, + 0x413b, 0x413c, 0x413c, 0x413c, 0x413c, 0x413c, 0x413d, 0x413d, + 0x413d, 0x413d, 0x413d, 0x413e, 0x413e, 0x413e, 0x413e, 0x413f, + 0x413f, 0x413f, 0x413f, 0x413f, 0x4140, 0x4140, 0x4140, 0x4140, + 0x4140, 0x4141, 0x4141, 0x4141, 0x4141, 0x4141, 0x4142, 0x4142, + 0x4142, 0x4142, 0x4142, 0x4143, 0x4143, 0x4143, 0x4143, 0x4143, + 0x4144, 0x4144, 0x4144, 0x4144, 0x4144, 0x4145, 0x4145, 0x4145, + 0x4145, 0x4145, 0x4146, 0x4146, 0x4146, 0x4146, 0x4146, 0x4147, + 0x4147, 0x4147, 0x4147, 0x4147, 0x4148, 0x4148, 0x4148, 0x4148, + 0x4148, 0x4149, 0x4149, 0x4149, 0x4149, 0x4149, 0x414a, 0x414a, + 0x414a, 0x414a, 0x414a, 0x414b, 0x414b, 0x414b, 0x414b, 0x414b, + 0x414b, 0x414c, 0x414c, 0x414c, 0x414c, 0x414c, 0x414d, 0x414d, + 0x414d, 0x414d, 0x414d, 0x414e, 0x414e, 0x414e, 0x414e, 0x414e, + 0x414f, 0x414f, 0x414f, 0x414f, 0x414f, 0x4150, 0x4150, 0x4150, + 0x4150, 0x4150, 0x4150, 0x4151, 0x4151, 0x4151, 0x4151, 0x4151, + 0x4152, 0x4152, 0x4152, 0x4152, 0x4152, 0x4153, 0x4153, 0x4153, + 0x4153, 0x4153, 0x4153, 0x4154, 0x4154, 0x4154, 0x4154, 0x4154, + 0x4155, 0x4155, 0x4155, 0x4155, 0x4155, 0x4156, 0x4156, 0x4156, + 0x4156, 0x4156, 0x4156, 0x4157, 0x4157, 0x4157, 0x4157, 0x4157, + 0x4158, 0x4158, 0x4158, 0x4158, 0x4158, 0x4158, 0x4159, 0x4159, + 0x4159, 0x4159, 0x4159, 0x415a, 0x415a, 0x415a, 0x415a, 0x415a, + 0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x415c, 0x415c, + 0x415c, 0x415c, 0x415c, 0x415c, 0x415d, 0x415d, 0x415d, 0x415d, + 0x415d, 0x415e, 0x415e, 0x415e, 0x415e, 0x415e, 0x415e, 0x415f, + 0x415f, 0x415f, 0x415f, 0x415f, 0x4160, 0x4160, 0x4160, 0x4160, + 0x4160, 0x4160, 0x4161, 0x4161, 0x4161, 0x4161, 0x4161, 0x4161, + 0x4162, 0x4162, 0x4162, 0x4162, 0x4162, 0x4163, 0x4163, 0x4163, + 0x4163, 0x4163, 0x4163, 0x4164, 0x4164, 0x4164, 0x4164, 0x4164, + 0x4164, 0x4165, 0x4165, 0x4165, 0x4165, 0x4165, 0x4166, 0x4166, + 0x4166, 0x4166, 0x4166, 0x4166, 0x4167, 0x4167, 0x4167, 0x4167, + 0x4167, 0x4167, 0x4168, 0x4168, 0x4168, 0x4168, 0x4168, 0x4168, + 0x4169, 0x4169, 0x4169, 0x4169, 0x4169, 0x4169, 0x416a, 0x416a, + 0x416a, 0x416a, 0x416a, 0x416a, 0x416b, 0x416b, 0x416b, 0x416b, + 0x416b, 0x416c, 0x416c, 0x416c, 0x416c, 0x416c, 0x416c, 0x416d, + 0x416d, 0x416d, 0x416d, 0x416d, 0x416d, 0x416e, 0x416e, 0x416e, + 0x416e, 0x416e, 0x416e, 0x416f, 0x416f, 0x416f, 0x416f, 0x416f, + 0x416f, 0x4170, 0x4170, 0x4170, 0x4170, 0x4170, 0x4170, 0x4171, + 0x4171, 0x4171, 0x4171, 0x4171, 0x4171, 0x4172, 0x4172, 0x4172, + 0x4172, 0x4172, 0x4172, 0x4172, 0x4173, 0x4173, 0x4173, 0x4173, + 0x4173, 0x4173, 0x4174, 0x4174, 0x4174, 0x4174, 0x4174, 0x4174, + 0x4175, 0x4175, 0x4175, 0x4175, 0x4175, 0x4175, 0x4176, 0x4176, + 0x4176, 0x4176, 0x4176, 0x4176, 0x4177, 0x4177, 0x4177, 0x4177, + 0x4177, 0x4177, 0x4178, 0x4178, 0x4178, 0x4178, 0x4178, 0x4178, + 0x4178, 0x4179, 0x4179, 0x4179, 0x4179, 0x4179, 0x4179, 0x417a, + 0x417a, 0x417a, 0x417a, 0x417a, 0x417a, 0x417b, 0x417b, 0x417b, + 0x417b, 0x417b, 0x417b, 0x417c, 0x417c, 0x417c, 0x417c, 0x417c, + 0x417c, 0x417c, 0x417d, 0x417d, 0x417d, 0x417d, 0x417d, 0x417d, + 0x417e, 0x417e, 0x417e, 0x417e, 0x417e, 0x417e, 0x417e, 0x417f, + 0x417f, 0x417f, 0x417f, 0x417f, 0x417f, 0x4180, 0x4180, 0x4180, + 0x4180, 0x4180, 0x4180, 0x4180, 0x4181, 0x4181, 0x4181, 0x4181, + 0x4181, 0x4181, 0x4182, 0x4182, 0x4182, 0x4182, 0x4182, 0x4182, + 0x4182, 0x4183, 0x4183, 0x4183, 0x4183, 0x4183, 0x4183, 0x4184, + 0x4184, 0x4184, 0x4184, 0x4184, 0x4184, 0x4184, 0x4185, 0x4185, + 0x4185, 0x4185, 0x4185, 0x4185, 0x4186, 0x4186, 0x4186, 0x4186, + 0x4186, 0x4186, 0x4186, 0x4187, 0x4187, 0x4187, 0x4187, 0x4187, + 0x4187, 0x4187, 0x4188, 0x4188, 0x4188, 0x4188, 0x4188, 0x4188, + 0x4189, 0x4189, 0x4189, 0x4189, 0x4189, 0x4189, 0x4189, 0x418a, + 0x418a, 0x418a, 0x418a, 0x418a, 0x418a, 0x418a, 0x418b, 0x418b, + 0x418b, 0x418b, 0x418b, 0x418b, 0x418c, 0x418c, 0x418c, 0x418c, + 0x418c, 0x418c, 0x418c, 0x418d, 0x418d, 0x418d, 0x418d, 0x418d, + 0x418d, 0x418d, 0x418e, 0x418e, 0x418e, 0x418e, 0x418e, 0x418e, + 0x418e, 0x418f, 0x418f, 0x418f, 0x418f, 0x418f, 0x418f, 0x418f, + 0x4190, 0x4190, 0x4190, 0x4190, 0x4190, 0x4190, 0x4190, 0x4191, + 0x4191, 0x4191, 0x4191, 0x4191, 0x4191, 0x4191, 0x4192, 0x4192, + 0x4192, 0x4192, 0x4192, 0x4192, 0x4192, 0x4193, 0x4193, 0x4193, + 0x4193, 0x4193, 0x4193, 0x4193, 0x4194, 0x4194, 0x4194, 0x4194, + 0x4194, 0x4194, 0x4194, 0x4195, 0x4195, 0x4195, 0x4195, 0x4195, + 0x4195, 0x4195, 0x4196, 0x4196, 0x4196, 0x4196, 0x4196, 0x4196, + 0x4196, 0x4197, 0x4197, 0x4197, 0x4197, 0x4197, 0x4197, 0x4197, + 0x4198, 0x4198, 0x4198, 0x4198, 0x4198, 0x4198, 0x4198, 0x4199, + 0x4199, 0x4199, 0x4199, 0x4199, 0x4199, 0x4199, 0x419a, 0x419a, + 0x419a, 0x419a, 0x419a, 0x419a, 0x419a, 0x419a, 0x419b, 0x419b, + 0x419b, 0x419b, 0x419b, 0x419b, 0x419b, 0x419c, 0x419c, 0x419c, + 0x419c, 0x419c, 0x419c, 0x419c, 0x419d, 0x419d, 0x419d, 0x419d, + 0x419d, 0x419d, 0x419d, 0x419d, 0x419e, 0x419e, 0x419e, 0x419e, + 0x419e, 0x419e, 0x419e, 0x419f, 0x419f, 0x419f, 0x419f, 0x419f, + 0x419f, 0x419f, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, + 0x41a0, 0x41a0, 0x41a1, 0x41a1, 0x41a1, 0x41a1, 0x41a1, 0x41a1, + 0x41a1, 0x41a2, 0x41a2, 0x41a2, 0x41a2, 0x41a2, 0x41a2, 0x41a2, + 0x41a2, 0x41a3, 0x41a3, 0x41a3, 0x41a3, 0x41a3, 0x41a3, 0x41a3, + 0x41a4, 0x41a4, 0x41a4, 0x41a4, 0x41a4, 0x41a4, 0x41a4, 0x41a4, + 0x41a5, 0x41a5, 0x41a5, 0x41a5, 0x41a5, 0x41a5, 0x41a5, 0x41a6, + 0x41a6, 0x41a6, 0x41a6, 0x41a6, 0x41a6, 0x41a6, 0x41a6, 0x41a7, + 0x41a7, 0x41a7, 0x41a7, 0x41a7, 0x41a7, 0x41a7, 0x41a8, 0x41a8, + 0x41a8, 0x41a8, 0x41a8, 0x41a8, 0x41a8, 0x41a8, 0x41a9, 0x41a9, + 0x41a9, 0x41a9, 0x41a9, 0x41a9, 0x41a9, 0x41a9, 0x41aa, 0x41aa, + 0x41aa, 0x41aa, 0x41aa, 0x41aa, 0x41aa, 0x41aa, 0x41ab, 0x41ab, + 0x41ab, 0x41ab, 0x41ab, 0x41ab, 0x41ab, 0x41ac, 0x41ac, 0x41ac, + 0x41ac, 0x41ac, 0x41ac, 0x41ac, 0x41ac, 0x41ad, 0x41ad, 0x41ad, + 0x41ad, 0x41ad, 0x41ad, 0x41ad, 0x41ad, 0x41ae, 0x41ae, 0x41ae, + 0x41ae, 0x41ae, 0x41ae, 0x41ae, 0x41ae, 0x41af, 0x41af, 0x41af, + 0x41af, 0x41af, 0x41af, 0x41af, 0x41af, 0x41b0, 0x41b0, 0x41b0, + 0x41b0, 0x41b0, 0x41b0, 0x41b0, 0x41b0, 0x41b1, 0x41b1, 0x41b1, + 0x41b1, 0x41b1, 0x41b1, 0x41b1, 0x41b1, 0x41b2, 0x41b2, 0x41b2, + 0x41b2, 0x41b2, 0x41b2, 0x41b2, 0x41b2, 0x41b3, 0x41b3, 0x41b3, + 0x41b3, 0x41b3, 0x41b3, 0x41b3, 0x41b3, 0x41b4, 0x41b4, 0x41b4, + 0x41b4, 0x41b4, 0x41b4, 0x41b4, 0x41b4, 0x41b5, 0x41b5, 0x41b5, + 0x41b5, 0x41b5, 0x41b5, 0x41b5, 0x41b5, 0x41b6, 0x41b6, 0x41b6, + 0x41b6, 0x41b6, 0x41b6, 0x41b6, 0x41b6, 0x41b7, 0x41b7, 0x41b7, + 0x41b7, 0x41b7, 0x41b7, 0x41b7, 0x41b7, 0x41b8, 0x41b8, 0x41b8, + 0x41b8, 0x41b8, 0x41b8, 0x41b8, 0x41b8, 0x41b9, 0x41b9, 0x41b9, + 0x41b9, 0x41b9, 0x41b9, 0x41b9, 0x41b9, 0x41b9, 0x41ba, 0x41ba, + 0x41ba, 0x41ba, 0x41ba, 0x41ba, 0x41ba, 0x41ba, 0x41bb, 0x41bb, + 0x41bb, 0x41bb, 0x41bb, 0x41bb, 0x41bb, 0x41bb, 0x41bc, 0x41bc, + 0x41bc, 0x41bc, 0x41bc, 0x41bc, 0x41bc, 0x41bc, 0x41bc, 0x41bd, + 0x41bd, 0x41bd, 0x41bd, 0x41bd, 0x41bd, 0x41bd, 0x41bd, 0x41be, + 0x41be, 0x41be, 0x41be, 0x41be, 0x41be, 0x41be, 0x41be, 0x41be, + 0x41bf, 0x41bf, 0x41bf, 0x41bf, 0x41bf, 0x41bf, 0x41bf, 0x41bf, + 0x41c0, 0x41c0, 0x41c0, 0x41c0, 0x41c0, 0x41c0, 0x41c0, 0x41c0, + 0x41c0, 0x41c1, 0x41c1, 0x41c1, 0x41c1, 0x41c1, 0x41c1, 0x41c1, + 0x41c1, 0x41c2, 0x41c2, 0x41c2, 0x41c2, 0x41c2, 0x41c2, 0x41c2, + 0x41c2, 0x41c2, 0x41c3, 0x41c3, 0x41c3, 0x41c3, 0x41c3, 0x41c3, + 0x41c3, 0x41c3, 0x41c4, 0x41c4, 0x41c4, 0x41c4, 0x41c4, 0x41c4, + 0x41c4, 0x41c4, 0x41c4, 0x41c5, 0x41c5, 0x41c5, 0x41c5, 0x41c5, + 0x41c5, 0x41c5, 0x41c5, 0x41c5, 0x41c6, 0x41c6, 0x41c6, 0x41c6, + 0x41c6, 0x41c6, 0x41c6, 0x41c6, 0x41c7, 0x41c7, 0x41c7, 0x41c7, + 0x41c7, 0x41c7, 0x41c7, 0x41c7, 0x41c7, 0x41c8, 0x41c8, 0x41c8, + 0x41c8, 0x41c8, 0x41c8, 0x41c9, 0x41c9, 0x41c9, 0x41c9, 0x41c9, + 0x41ca, 0x41ca, 0x41ca, 0x41ca, 0x41cb, 0x41cb, 0x41cb, 0x41cb, + 0x41cb, 0x41cc, 0x41cc, 0x41cc, 0x41cc, 0x41cd, 0x41cd, 0x41cd, + 0x41cd, 0x41cd, 0x41ce, 0x41ce, 0x41ce, 0x41ce, 0x41cf, 0x41cf, + 0x41cf, 0x41cf, 0x41cf, 0x41d0, 0x41d0, 0x41d0, 0x41d0, 0x41d1, + 0x41d1, 0x41d1, 0x41d1, 0x41d1, 0x41d2, 0x41d2, 0x41d2, 0x41d2, + 0x41d3, 0x41d3, 0x41d3, 0x41d3, 0x41d3, 0x41d4, 0x41d4, 0x41d4, + 0x41d4, 0x41d4, 0x41d5, 0x41d5, 0x41d5, 0x41d5, 0x41d6, 0x41d6, + 0x41d6, 0x41d6, 0x41d6, 0x41d7, 0x41d7, 0x41d7, 0x41d7, 0x41d7, + 0x41d8, 0x41d8, 0x41d8, 0x41d8, 0x41d9, 0x41d9, 0x41d9, 0x41d9, + 0x41d9, 0x41da, 0x41da, 0x41da, 0x41da, 0x41da, 0x41db, 0x41db, + 0x41db, 0x41db, 0x41db, 0x41dc, 0x41dc, 0x41dc, 0x41dc, 0x41dd, + 0x41dd, 0x41dd, 0x41dd, 0x41dd, 0x41de, 0x41de, 0x41de, 0x41de, + 0x41de, 0x41df, 0x41df, 0x41df, 0x41df, 0x41df, 0x41e0, 0x41e0, + 0x41e0, 0x41e0, 0x41e0, 0x41e1, 0x41e1, 0x41e1, 0x41e1, 0x41e1, + 0x41e2, 0x41e2, 0x41e2, 0x41e2, 0x41e2, 0x41e3, 0x41e3, 0x41e3, + 0x41e3, 0x41e3, 0x41e4, 0x41e4, 0x41e4, 0x41e4, 0x41e5, 0x41e5, + 0x41e5, 0x41e5, 0x41e5, 0x41e6, 0x41e6, 0x41e6, 0x41e6, 0x41e6, + 0x41e7, 0x41e7, 0x41e7, 0x41e7, 0x41e7, 0x41e8, 0x41e8, 0x41e8, + 0x41e8, 0x41e8, 0x41e8, 0x41e9, 0x41e9, 0x41e9, 0x41e9, 0x41e9, + 0x41ea, 0x41ea, 0x41ea, 0x41ea, 0x41ea, 0x41eb, 0x41eb, 0x41eb, + 0x41eb, 0x41eb, 0x41ec, 0x41ec, 0x41ec, 0x41ec, 0x41ec, 0x41ed, + 0x41ed, 0x41ed, 0x41ed, 0x41ed, 0x41ee, 0x41ee, 0x41ee, 0x41ee, + 0x41ee, 0x41ef, 0x41ef, 0x41ef, 0x41ef, 0x41ef, 0x41ef, 0x41f0, + 0x41f0, 0x41f0, 0x41f0, 0x41f0, 0x41f1, 0x41f1, 0x41f1, 0x41f1, + 0x41f1, 0x41f2, 0x41f2, 0x41f2, 0x41f2, 0x41f2, 0x41f3, 0x41f3, + 0x41f3, 0x41f3, 0x41f3, 0x41f3, 0x41f4, 0x41f4, 0x41f4, 0x41f4, + 0x41f4, 0x41f5, 0x41f5, 0x41f5, 0x41f5, 0x41f5, 0x41f6, 0x41f6, + 0x41f6, 0x41f6, 0x41f6, 0x41f6, 0x41f7, 0x41f7, 0x41f7, 0x41f7, + 0x41f7, 0x41f8, 0x41f8, 0x41f8, 0x41f8, 0x41f8, 0x41f9, 0x41f9, + 0x41f9, 0x41f9, 0x41f9, 0x41f9, 0x41fa, 0x41fa, 0x41fa, 0x41fa, + 0x41fa, 0x41fb, 0x41fb, 0x41fb, 0x41fb, 0x41fb, 0x41fb, 0x41fc, + 0x41fc, 0x41fc, 0x41fc, 0x41fc, 0x41fd, 0x41fd, 0x41fd, 0x41fd, + 0x41fd, 0x41fd, 0x41fe, 0x41fe, 0x41fe, 0x41fe, 0x41fe, 0x41ff, + 0x41ff, 0x41ff, 0x41ff, 0x41ff, 0x41ff, 0x4200, 0x4200, 0x4200, + 0x4200, 0x4200, 0x4200, 0x4201, 0x4201, 0x4201, 0x4201, 0x4201, + 0x4202, 0x4202, 0x4202, 0x4202, 0x4202, 0x4202, 0x4203, 0x4203, + 0x4203, 0x4203, 0x4203, 0x4204, 0x4204, 0x4204, 0x4204, 0x4204, + 0x4204, 0x4205, 0x4205, 0x4205, 0x4205, 0x4205, 0x4205, 0x4206, + 0x4206, 0x4206, 0x4206, 0x4206, 0x4206, 0x4207, 0x4207, 0x4207, + 0x4207, 0x4207, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, 0x4208, + 0x4209, 0x4209, 0x4209, 0x4209, 0x4209, 0x4209, 0x420a, 0x420a, + 0x420a, 0x420a, 0x420a, 0x420a, 0x420b, 0x420b, 0x420b, 0x420b, + 0x420b, 0x420b, 0x420c, 0x420c, 0x420c, 0x420c, 0x420c, 0x420c, + 0x420d, 0x420d, 0x420d, 0x420d, 0x420d, 0x420d, 0x420e, 0x420e, + 0x420e, 0x420e, 0x420e, 0x420f, 0x420f, 0x420f, 0x420f, 0x420f, + 0x420f, 0x4210, 0x4210, 0x4210, 0x4210, 0x4210, 0x4210, 0x4211, + 0x4211, 0x4211, 0x4211, 0x4211, 0x4211, 0x4212, 0x4212, 0x4212, + 0x4212, 0x4212, 0x4212, 0x4212, 0x4213, 0x4213, 0x4213, 0x4213, + 0x4213, 0x4213, 0x4214, 0x4214, 0x4214, 0x4214, 0x4214, 0x4214, + 0x4215, 0x4215, 0x4215, 0x4215, 0x4215, 0x4215, 0x4216, 0x4216, + 0x4216, 0x4216, 0x4216, 0x4216, 0x4217, 0x4217, 0x4217, 0x4217, + 0x4217, 0x4217, 0x4218, 0x4218, 0x4218, 0x4218, 0x4218, 0x4218, + 0x4219, 0x4219, 0x4219, 0x4219, 0x4219, 0x4219, 0x4219, 0x421a, + 0x421a, 0x421a, 0x421a, 0x421a, 0x421a, 0x421b, 0x421b, 0x421b, + 0x421b, 0x421b, 0x421b, 0x421c, 0x421c, 0x421c, 0x421c, 0x421c, + 0x421c, 0x421d, 0x421d, 0x421d, 0x421d, 0x421d, 0x421d, 0x421d, + 0x421e, 0x421e, 0x421e, 0x421e, 0x421e, 0x421e, 0x421f, 0x421f, + 0x421f, 0x421f, 0x421f, 0x421f, 0x421f, 0x4220, 0x4220, 0x4220, + 0x4220, 0x4220, 0x4220, 0x4221, 0x4221, 0x4221, 0x4221, 0x4221, + 0x4221, 0x4222, 0x4222, 0x4222, 0x4222, 0x4222, 0x4222, 0x4222, + 0x4223, 0x4223, 0x4223, 0x4223, 0x4223, 0x4223, 0x4224, 0x4224, + 0x4224, 0x4224, 0x4224, 0x4224, 0x4224, 0x4225, 0x4225, 0x4225, + 0x4225, 0x4225, 0x4225, 0x4225, 0x4226, 0x4226, 0x4226, 0x4226, + 0x4226, 0x4226, 0x4227, 0x4227, 0x4227, 0x4227, 0x4227, 0x4227, + 0x4227, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4229, + 0x4229, 0x4229, 0x4229, 0x4229, 0x4229, 0x4229, 0x422a, 0x422a, + 0x422a, 0x422a, 0x422a, 0x422a, 0x422a, 0x422b, 0x422b, 0x422b, + 0x422b, 0x422b, 0x422b, 0x422b, 0x422c, 0x422c, 0x422c, 0x422c, + 0x422c, 0x422c, 0x422d, 0x422d, 0x422d, 0x422d, 0x422d, 0x422d, + 0x422d, 0x422e, 0x422e, 0x422e, 0x422e, 0x422e, 0x422e, 0x422e, + 0x422f, 0x422f, 0x422f, 0x422f, 0x422f, 0x422f, 0x422f, 0x4230, + 0x4230, 0x4230, 0x4230, 0x4230, 0x4230, 0x4230, 0x4231, 0x4231, + 0x4231, 0x4231, 0x4231, 0x4231, 0x4231, 0x4232, 0x4232, 0x4232, + 0x4232, 0x4232, 0x4232, 0x4232, 0x4233, 0x4233, 0x4233, 0x4233, + 0x4233, 0x4233, 0x4234, 0x4234, 0x4234, 0x4234, 0x4234, 0x4234, + 0x4234, 0x4234, 0x4235, 0x4235, 0x4235, 0x4235, 0x4235, 0x4235, + 0x4235, 0x4236, 0x4236, 0x4236, 0x4236, 0x4236, 0x4236, 0x4236, + 0x4237, 0x4237, 0x4237, 0x4237, 0x4237, 0x4237, 0x4237, 0x4238, + 0x4238, 0x4238, 0x4238, 0x4238, 0x4238, 0x4238, 0x4239, 0x4239, + 0x4239, 0x4239, 0x4239, 0x4239, 0x4239, 0x423a, 0x423a, 0x423a, + 0x423a, 0x423a, 0x423a, 0x423a, 0x423b, 0x423b, 0x423b, 0x423b, + 0x423b, 0x423b, 0x423b, 0x423c, 0x423c, 0x423c, 0x423c, 0x423c, + 0x423c, 0x423c, 0x423c, 0x423d, 0x423d, 0x423d, 0x423d, 0x423d, + 0x423d, 0x423d, 0x423e, 0x423e, 0x423e, 0x423e, 0x423e, 0x423e, + 0x423e, 0x423f, 0x423f, 0x423f, 0x423f, 0x423f, 0x423f, 0x423f, + 0x423f, 0x4240, 0x4240, 0x4240, 0x4240, 0x4240, 0x4240, 0x4240, + 0x4241, 0x4241, 0x4241, 0x4241, 0x4241, 0x4241, 0x4241, 0x4242, + 0x4242, 0x4242, 0x4242, 0x4242, 0x4242, 0x4242, 0x4242, 0x4243, + 0x4243, 0x4243, 0x4243, 0x4243, 0x4243, 0x4243, 0x4244, 0x4244, + 0x4244, 0x4244, 0x4244, 0x4244, 0x4244, 0x4244, 0x4245, 0x4245, + 0x4245, 0x4245, 0x4245, 0x4245, 0x4245, 0x4246, 0x4246, 0x4246, + 0x4246, 0x4246, 0x4246, 0x4246, 0x4246, 0x4247, 0x4247, 0x4247, + 0x4247, 0x4247, 0x4247, 0x4247, 0x4248, 0x4248, 0x4248, 0x4248, + 0x4248, 0x4248, 0x4248, 0x4248, 0x4249, 0x4249, 0x4249, 0x4249, + 0x4249, 0x4249, 0x4249, 0x4249, 0x424a, 0x424a, 0x424a, 0x424a, + 0x424a, 0x424a, 0x424a, 0x424b, 0x424b, 0x424b, 0x424b, 0x424b, + 0x424b, 0x424b, 0x424b, 0x424c, 0x424c, 0x424c, 0x424c, 0x424c, + 0x424c, 0x424c, 0x424c, 0x424d, 0x424d, 0x424d, 0x424d, 0x424d, + 0x424d, 0x424d, 0x424d, 0x424e, 0x424e, 0x424e, 0x424e, 0x424e, + 0x424e, 0x424e, 0x424e, 0x424f, 0x424f, 0x424f, 0x424f, 0x424f, + 0x424f, 0x424f, 0x4250, 0x4250, 0x4250, 0x4250, 0x4250, 0x4250, + 0x4250, 0x4250, 0x4251, 0x4251, 0x4251, 0x4251, 0x4251, 0x4251, + 0x4251, 0x4251, 0x4252, 0x4252, 0x4252, 0x4252, 0x4252, 0x4252, + 0x4252, 0x4252, 0x4253, 0x4253, 0x4253, 0x4253, 0x4253, 0x4253, + 0x4253, 0x4253, 0x4254, 0x4254, 0x4254, 0x4254, 0x4254, 0x4254, + 0x4254, 0x4254, 0x4255, 0x4255, 0x4255, 0x4255, 0x4255, 0x4255, + 0x4255, 0x4255, 0x4256, 0x4256, 0x4256, 0x4256, 0x4256, 0x4256, + 0x4256, 0x4256, 0x4257, 0x4257, 0x4257, 0x4257, 0x4257, 0x4257, + 0x4257, 0x4257, 0x4257, 0x4258, 0x4258, 0x4258, 0x4258, 0x4258, + 0x4258, 0x4258, 0x4258, 0x4259, 0x4259, 0x4259, 0x4259, 0x4259, + 0x4259, 0x4259, 0x4259, 0x425a, 0x425a, 0x425a, 0x425a, 0x425a, + 0x425a, 0x425a, 0x425a, 0x425b, 0x425b, 0x425b, 0x425b, 0x425b, + 0x425b, 0x425b, 0x425b, 0x425c, 0x425c, 0x425c, 0x425c, 0x425c, + 0x425c, 0x425c, 0x425c, 0x425c, 0x425d, 0x425d, 0x425d, 0x425d, + 0x425d, 0x425d, 0x425d, 0x425d, 0x425e, 0x425e, 0x425e, 0x425e, + 0x425e, 0x425e, 0x425e, 0x425e, 0x425f, 0x425f, 0x425f, 0x425f, + 0x425f, 0x425f, 0x425f, 0x425f, 0x425f, 0x4260, 0x4260, 0x4260, + 0x4260, 0x4260, 0x4260, 0x4260, 0x4260, 0x4261, 0x4261, 0x4261, + 0x4261, 0x4261, 0x4261, 0x4261, 0x4261, 0x4261, 0x4262, 0x4262, + 0x4262, 0x4262, 0x4262, 0x4262, 0x4262, 0x4262, 0x4263, 0x4263, + 0x4263, 0x4263, 0x4263, 0x4263, 0x4263, 0x4263, 0x4263, 0x4264, + 0x4264, 0x4264, 0x4264, 0x4264, 0x4264, 0x4264, 0x4264, 0x4264, + 0x4265, 0x4265, 0x4265, 0x4265, 0x4265, 0x4265, 0x4265, 0x4265, + 0x4266, 0x4266, 0x4266, 0x4266, 0x4266, 0x4266, 0x4266, 0x4266, + 0x4266, 0x4267, 0x4267, 0x4267, 0x4267, 0x4267, 0x4267, 0x4267, + 0x4267, 0x4267, 0x4268, 0x4268, 0x4268, 0x4268, 0x4268, 0x4268, + 0x4268, 0x4268, 0x4269, 0x4269, 0x4269, 0x4269, 0x4269, 0x4269, + 0x4269, 0x4269, 0x426a, 0x426a, 0x426a, 0x426a, 0x426b, 0x426b, + 0x426b, 0x426b, 0x426b, 0x426c, 0x426c, 0x426c, 0x426c, 0x426d, + 0x426d, 0x426d, 0x426d, 0x426d, 0x426e, 0x426e, 0x426e, 0x426e, + 0x426f, 0x426f, 0x426f, 0x426f, 0x426f, 0x4270, 0x4270, 0x4270, + 0x4270, 0x4271, 0x4271, 0x4271, 0x4271, 0x4271, 0x4272, 0x4272, + 0x4272, 0x4272, 0x4273, 0x4273, 0x4273, 0x4273, 0x4273, 0x4274, + 0x4274, 0x4274, 0x4274, 0x4275, 0x4275, 0x4275, 0x4275, 0x4275, + 0x4276, 0x4276, 0x4276, 0x4276, 0x4276, 0x4277, 0x4277, 0x4277, + 0x4277, 0x4278, 0x4278, 0x4278, 0x4278, 0x4278, 0x4279, 0x4279, + 0x4279, 0x4279, 0x4279, 0x427a, 0x427a, 0x427a, 0x427a, 0x427a, + 0x427b, 0x427b, 0x427b, 0x427b, 0x427c, 0x427c, 0x427c, 0x427c, + 0x427c, 0x427d, 0x427d, 0x427d, 0x427d, 0x427d, 0x427e, 0x427e, + 0x427e, 0x427e, 0x427e, 0x427f, 0x427f, 0x427f, 0x427f, 0x4280, + 0x4280, 0x4280, 0x4280, 0x4280, 0x4281, 0x4281, 0x4281, 0x4281, + 0x4281, 0x4282, 0x4282, 0x4282, 0x4282, 0x4282, 0x4283, 0x4283, + 0x4283, 0x4283, 0x4283, 0x4284, 0x4284, 0x4284, 0x4284, 0x4284, + 0x4285, 0x4285, 0x4285, 0x4285, 0x4285, 0x4286, 0x4286, 0x4286, + 0x4286, 0x4286, 0x4287, 0x4287, 0x4287, 0x4287, 0x4287, 0x4288, + 0x4288, 0x4288, 0x4288, 0x4288, 0x4289, 0x4289, 0x4289, 0x4289, + 0x4289, 0x428a, 0x428a, 0x428a, 0x428a, 0x428a, 0x428b, 0x428b, + 0x428b, 0x428b, 0x428b, 0x428c, 0x428c, 0x428c, 0x428c, 0x428c, + 0x428d, 0x428d, 0x428d, 0x428d, 0x428d, 0x428e, 0x428e, 0x428e, + 0x428e, 0x428e, 0x428e, 0x428f, 0x428f, 0x428f, 0x428f, 0x428f, + 0x4290, 0x4290, 0x4290, 0x4290, 0x4290, 0x4291, 0x4291, 0x4291, + 0x4291, 0x4291, 0x4292, 0x4292, 0x4292, 0x4292, 0x4292, 0x4293, + 0x4293, 0x4293, 0x4293, 0x4293, 0x4293, 0x4294, 0x4294, 0x4294, + 0x4294, 0x4294, 0x4295, 0x4295, 0x4295, 0x4295, 0x4295, 0x4296, + 0x4296, 0x4296, 0x4296, 0x4296, 0x4296, 0x4297, 0x4297, 0x4297, + 0x4297, 0x4297, 0x4298, 0x4298, 0x4298, 0x4298, 0x4298, 0x4299, + 0x4299, 0x4299, 0x4299, 0x4299, 0x4299, 0x429a, 0x429a, 0x429a, + 0x429a, 0x429a, 0x429b, 0x429b, 0x429b, 0x429b, 0x429b, 0x429b, + 0x429c, 0x429c, 0x429c, 0x429c, 0x429c, 0x429d, 0x429d, 0x429d, + 0x429d, 0x429d, 0x429d, 0x429e, 0x429e, 0x429e, 0x429e, 0x429e, + 0x429f, 0x429f, 0x429f, 0x429f, 0x429f, 0x429f, 0x42a0, 0x42a0, + 0x42a0, 0x42a0, 0x42a0, 0x42a1, 0x42a1, 0x42a1, 0x42a1, 0x42a1, + 0x42a1, 0x42a2, 0x42a2, 0x42a2, 0x42a2, 0x42a2, 0x42a3, 0x42a3, + 0x42a3, 0x42a3, 0x42a3, 0x42a3, 0x42a4, 0x42a4, 0x42a4, 0x42a4, + 0x42a4, 0x42a4, 0x42a5, 0x42a5, 0x42a5, 0x42a5, 0x42a5, 0x42a6, + 0x42a6, 0x42a6, 0x42a6, 0x42a6, 0x42a6, 0x42a7, 0x42a7, 0x42a7, + 0x42a7, 0x42a7, 0x42a7, 0x42a8, 0x42a8, 0x42a8, 0x42a8, 0x42a8, + 0x42a8, 0x42a9, 0x42a9, 0x42a9, 0x42a9, 0x42a9, 0x42aa, 0x42aa, + 0x42aa, 0x42aa, 0x42aa, 0x42aa, 0x42ab, 0x42ab, 0x42ab, 0x42ab, + 0x42ab, 0x42ab, 0x42ac, 0x42ac, 0x42ac, 0x42ac, 0x42ac, 0x42ac, + 0x42ad, 0x42ad, 0x42ad, 0x42ad, 0x42ad, 0x42ad, 0x42ae, 0x42ae, + 0x42ae, 0x42ae, 0x42ae, 0x42ae, 0x42af, 0x42af, 0x42af, 0x42af, + 0x42af, 0x42af, 0x42b0, 0x42b0, 0x42b0, 0x42b0, 0x42b0, 0x42b0, + 0x42b1, 0x42b1, 0x42b1, 0x42b1, 0x42b1, 0x42b1, 0x42b2, 0x42b2, + 0x42b2, 0x42b2, 0x42b2, 0x42b2, 0x42b3, 0x42b3, 0x42b3, 0x42b3, + 0x42b3, 0x42b3, 0x42b4, 0x42b4, 0x42b4, 0x42b4, 0x42b4, 0x42b4, + 0x42b5, 0x42b5, 0x42b5, 0x42b5, 0x42b5, 0x42b5, 0x42b6, 0x42b6, + 0x42b6, 0x42b6, 0x42b6, 0x42b6, 0x42b7, 0x42b7, 0x42b7, 0x42b7, + 0x42b7, 0x42b7, 0x42b8, 0x42b8, 0x42b8, 0x42b8, 0x42b8, 0x42b8, + 0x42b9, 0x42b9, 0x42b9, 0x42b9, 0x42b9, 0x42b9, 0x42ba, 0x42ba, + 0x42ba, 0x42ba, 0x42ba, 0x42ba, 0x42ba, 0x42bb, 0x42bb, 0x42bb, + 0x42bb, 0x42bb, 0x42bb, 0x42bc, 0x42bc, 0x42bc, 0x42bc, 0x42bc, + 0x42bc, 0x42bd, 0x42bd, 0x42bd, 0x42bd, 0x42bd, 0x42bd, 0x42bd, + 0x42be, 0x42be, 0x42be, 0x42be, 0x42be, 0x42be, 0x42bf, 0x42bf, + 0x42bf, 0x42bf, 0x42bf, 0x42bf, 0x42c0, 0x42c0, 0x42c0, 0x42c0, + 0x42c0, 0x42c0, 0x42c0, 0x42c1, 0x42c1, 0x42c1, 0x42c1, 0x42c1, + 0x42c1, 0x42c2, 0x42c2, 0x42c2, 0x42c2, 0x42c2, 0x42c2, 0x42c3, + 0x42c3, 0x42c3, 0x42c3, 0x42c3, 0x42c3, 0x42c3, 0x42c4, 0x42c4, + 0x42c4, 0x42c4, 0x42c4, 0x42c4, 0x42c5, 0x42c5, 0x42c5, 0x42c5, + 0x42c5, 0x42c5, 0x42c5, 0x42c6, 0x42c6, 0x42c6, 0x42c6, 0x42c6, + 0x42c6, 0x42c6, 0x42c7, 0x42c7, 0x42c7, 0x42c7, 0x42c7, 0x42c7, + 0x42c8, 0x42c8, 0x42c8, 0x42c8, 0x42c8, 0x42c8, 0x42c8, 0x42c9, + 0x42c9, 0x42c9, 0x42c9, 0x42c9, 0x42c9, 0x42ca, 0x42ca, 0x42ca, + 0x42ca, 0x42ca, 0x42ca, 0x42ca, 0x42cb, 0x42cb, 0x42cb, 0x42cb, + 0x42cb, 0x42cb, 0x42cb, 0x42cc, 0x42cc, 0x42cc, 0x42cc, 0x42cc, + 0x42cc, 0x42cd, 0x42cd, 0x42cd, 0x42cd, 0x42cd, 0x42cd, 0x42cd, + 0x42ce, 0x42ce, 0x42ce, 0x42ce, 0x42ce, 0x42ce, 0x42ce, 0x42cf, + 0x42cf, 0x42cf, 0x42cf, 0x42cf, 0x42cf, 0x42cf, 0x42d0, 0x42d0, + 0x42d0, 0x42d0, 0x42d0, 0x42d0, 0x42d0, 0x42d1, 0x42d1, 0x42d1, + 0x42d1, 0x42d1, 0x42d1, 0x42d1, 0x42d2, 0x42d2, 0x42d2, 0x42d2, + 0x42d2, 0x42d2, 0x42d3, 0x42d3, 0x42d3, 0x42d3, 0x42d3, 0x42d3, + 0x42d3, 0x42d4, 0x42d4, 0x42d4, 0x42d4, 0x42d4, 0x42d4, 0x42d4, + 0x42d5, 0x42d5, 0x42d5, 0x42d5, 0x42d5, 0x42d5, 0x42d5, 0x42d6, + 0x42d6, 0x42d6, 0x42d6, 0x42d6, 0x42d6, 0x42d6, 0x42d7, 0x42d7, + 0x42d7, 0x42d7, 0x42d7, 0x42d7, 0x42d7, 0x42d8, 0x42d8, 0x42d8, + 0x42d8, 0x42d8, 0x42d8, 0x42d8, 0x42d9, 0x42d9, 0x42d9, 0x42d9, + 0x42d9, 0x42d9, 0x42d9, 0x42d9, 0x42da, 0x42da, 0x42da, 0x42da, + 0x42da, 0x42da, 0x42da, 0x42db, 0x42db, 0x42db, 0x42db, 0x42db, + 0x42db, 0x42db, 0x42dc, 0x42dc, 0x42dc, 0x42dc, 0x42dc, 0x42dc, + 0x42dc, 0x42dd, 0x42dd, 0x42dd, 0x42dd, 0x42dd, 0x42dd, 0x42dd, + 0x42de, 0x42de, 0x42de, 0x42de, 0x42de, 0x42de, 0x42de, 0x42de, + 0x42df, 0x42df, 0x42df, 0x42df, 0x42df, 0x42df, 0x42df, 0x42e0, + 0x42e0, 0x42e0, 0x42e0, 0x42e0, 0x42e0, 0x42e0, 0x42e1, 0x42e1, + 0x42e1, 0x42e1, 0x42e1, 0x42e1, 0x42e1, 0x42e1, 0x42e2, 0x42e2, + 0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x42e2, 0x42e3, 0x42e3, 0x42e3, + 0x42e3, 0x42e3, 0x42e3, 0x42e3, 0x42e4, 0x42e4, 0x42e4, 0x42e4, + 0x42e4, 0x42e4, 0x42e4, 0x42e4, 0x42e5, 0x42e5, 0x42e5, 0x42e5, + 0x42e5, 0x42e5, 0x42e5, 0x42e6, 0x42e6, 0x42e6, 0x42e6, 0x42e6, + 0x42e6, 0x42e6, 0x42e6, 0x42e7, 0x42e7, 0x42e7, 0x42e7, 0x42e7, + 0x42e7, 0x42e7, 0x42e8, 0x42e8, 0x42e8, 0x42e8, 0x42e8, 0x42e8, + 0x42e8, 0x42e8, 0x42e9, 0x42e9, 0x42e9, 0x42e9, 0x42e9, 0x42e9, + 0x42e9, 0x42e9, 0x42ea, 0x42ea, 0x42ea, 0x42ea, 0x42ea, 0x42ea, + 0x42ea, 0x42eb, 0x42eb, 0x42eb, 0x42eb, 0x42eb, 0x42eb, 0x42eb, + 0x42eb, 0x42ec, 0x42ec, 0x42ec, 0x42ec, 0x42ec, 0x42ec, 0x42ec, + 0x42ec, 0x42ed, 0x42ed, 0x42ed, 0x42ed, 0x42ed, 0x42ed, 0x42ed, + 0x42ee, 0x42ee, 0x42ee, 0x42ee, 0x42ee, 0x42ee, 0x42ee, 0x42ee, + 0x42ef, 0x42ef, 0x42ef, 0x42ef, 0x42ef, 0x42ef, 0x42ef, 0x42ef, + 0x42f0, 0x42f0, 0x42f0, 0x42f0, 0x42f0, 0x42f0, 0x42f0, 0x42f0, + 0x42f1, 0x42f1, 0x42f1, 0x42f1, 0x42f1, 0x42f1, 0x42f1, 0x42f1, + 0x42f2, 0x42f2, 0x42f2, 0x42f2, 0x42f2, 0x42f2, 0x42f2, 0x42f2, + 0x42f3, 0x42f3, 0x42f3, 0x42f3, 0x42f3, 0x42f3, 0x42f3, 0x42f3, + 0x42f4, 0x42f4, 0x42f4, 0x42f4, 0x42f4, 0x42f4, 0x42f4, 0x42f4, + 0x42f5, 0x42f5, 0x42f5, 0x42f5, 0x42f5, 0x42f5, 0x42f5, 0x42f5, + 0x42f6, 0x42f6, 0x42f6, 0x42f6, 0x42f6, 0x42f6, 0x42f6, 0x42f6, + 0x42f7, 0x42f7, 0x42f7, 0x42f7, 0x42f7, 0x42f7, 0x42f7, 0x42f7, + 0x42f8, 0x42f8, 0x42f8, 0x42f8, 0x42f8, 0x42f8, 0x42f8, 0x42f8, + 0x42f9, 0x42f9, 0x42f9, 0x42f9, 0x42f9, 0x42f9, 0x42f9, 0x42f9, + 0x42fa, 0x42fa, 0x42fa, 0x42fa, 0x42fa, 0x42fa, 0x42fa, 0x42fa, + 0x42fb, 0x42fb, 0x42fb, 0x42fb, 0x42fb, 0x42fb, 0x42fb, 0x42fb, + 0x42fb, 0x42fc, 0x42fc, 0x42fc, 0x42fc, 0x42fc, 0x42fc, 0x42fc, + 0x42fc, 0x42fd, 0x42fd, 0x42fd, 0x42fd, 0x42fd, 0x42fd, 0x42fd, + 0x42fd, 0x42fe, 0x42fe, 0x42fe, 0x42fe, 0x42fe, 0x42fe, 0x42fe, + 0x42fe, 0x42ff, 0x42ff, 0x42ff, 0x42ff, 0x42ff, 0x42ff, 0x42ff, + 0x42ff, 0x42ff, 0x4300, 0x4300, 0x4300, 0x4300, 0x4300, 0x4300, + 0x4300, 0x4300, 0x4301, 0x4301, 0x4301, 0x4301, 0x4301, 0x4301, + 0x4301, 0x4301, 0x4301, 0x4302, 0x4302, 0x4302, 0x4302, 0x4302, + 0x4302, 0x4302, 0x4302, 0x4303, 0x4303, 0x4303, 0x4303, 0x4303, + 0x4303, 0x4303, 0x4303, 0x4303, 0x4304, 0x4304, 0x4304, 0x4304, + 0x4304, 0x4304, 0x4304, 0x4304, 0x4305, 0x4305, 0x4305, 0x4305, + 0x4305, 0x4305, 0x4305, 0x4305, 0x4305, 0x4306, 0x4306, 0x4306, + 0x4306, 0x4306, 0x4306, 0x4306, 0x4306, 0x4307, 0x4307, 0x4307, + 0x4307, 0x4307, 0x4307, 0x4307, 0x4307, 0x4307, 0x4308, 0x4308, + 0x4308, 0x4308, 0x4308, 0x4308, 0x4308, 0x4308, 0x4308, 0x4309, + 0x4309, 0x4309, 0x4309, 0x4309, 0x4309, 0x4309, 0x4309, 0x4309, + 0x430a, 0x430a, 0x430a, 0x430a, 0x430a, 0x430a, 0x430a, 0x430a, + 0x430b, 0x430b, 0x430b, 0x430b, 0x430b, 0x430c, 0x430c, 0x430c, + 0x430c, 0x430d, 0x430d, 0x430d, 0x430d, 0x430d, 0x430e, 0x430e, + 0x430e, 0x430e, 0x430f, 0x430f, 0x430f, 0x430f, 0x430f, 0x4310, + 0x4310, 0x4310, 0x4310, 0x4311, 0x4311, 0x4311, 0x4311, 0x4311, + 0x4312, 0x4312, 0x4312, 0x4312, 0x4313, 0x4313, 0x4313, 0x4313, + 0x4313, 0x4314, 0x4314, 0x4314, 0x4314, 0x4315, 0x4315, 0x4315, + 0x4315, 0x4315, 0x4316, 0x4316, 0x4316, 0x4316, 0x4316, 0x4317, + 0x4317, 0x4317, 0x4317, 0x4318, 0x4318, 0x4318, 0x4318, 0x4318, + 0x4319, 0x4319, 0x4319, 0x4319, 0x4319, 0x431a, 0x431a, 0x431a, + 0x431a, 0x431b, 0x431b, 0x431b, 0x431b, 0x431b, 0x431c, 0x431c, + 0x431c, 0x431c, 0x431c, 0x431d, 0x431d, 0x431d, 0x431d, 0x431d, + 0x431e, 0x431e, 0x431e, 0x431e, 0x431f, 0x431f, 0x431f, 0x431f, + 0x431f, 0x4320, 0x4320, 0x4320, 0x4320, 0x4320, 0x4321, 0x4321, + 0x4321, 0x4321, 0x4321, 0x4322, 0x4322, 0x4322, 0x4322, 0x4322, + 0x4323, 0x4323, 0x4323, 0x4323, 0x4323, 0x4324, 0x4324, 0x4324, + 0x4324, 0x4325, 0x4325, 0x4325, 0x4325, 0x4325, 0x4326, 0x4326, + 0x4326, 0x4326, 0x4326, 0x4327, 0x4327, 0x4327, 0x4327, 0x4327, + 0x4328, 0x4328, 0x4328, 0x4328, 0x4328, 0x4329, 0x4329, 0x4329, + 0x4329, 0x4329, 0x432a, 0x432a, 0x432a, 0x432a, 0x432a, 0x432b, + 0x432b, 0x432b, 0x432b, 0x432b, 0x432c, 0x432c, 0x432c, 0x432c, + 0x432c, 0x432c, 0x432d, 0x432d, 0x432d, 0x432d, 0x432d, 0x432e, + 0x432e, 0x432e, 0x432e, 0x432e, 0x432f, 0x432f, 0x432f, 0x432f, + 0x432f, 0x4330, 0x4330, 0x4330, 0x4330, 0x4330, 0x4331, 0x4331, + 0x4331, 0x4331, 0x4331, 0x4332, 0x4332, 0x4332, 0x4332, 0x4332, + 0x4333, 0x4333, 0x4333, 0x4333, 0x4333, 0x4333, 0x4334, 0x4334, + 0x4334, 0x4334, 0x4334, 0x4335, 0x4335, 0x4335, 0x4335, 0x4335, + 0x4336, 0x4336, 0x4336, 0x4336, 0x4336, 0x4336, 0x4337, 0x4337, + 0x4337, 0x4337, 0x4337, 0x4338, 0x4338, 0x4338, 0x4338, 0x4338, + 0x4339, 0x4339, 0x4339, 0x4339, 0x4339, 0x4339, 0x433a, 0x433a, + 0x433a, 0x433a, 0x433a, 0x433b, 0x433b, 0x433b, 0x433b, 0x433b, + 0x433c, 0x433c, 0x433c, 0x433c, 0x433c, 0x433c, 0x433d, 0x433d, + 0x433d, 0x433d, 0x433d, 0x433e, 0x433e, 0x433e, 0x433e, 0x433e, + 0x433e, 0x433f, 0x433f, 0x433f, 0x433f, 0x433f, 0x4340, 0x4340, + 0x4340, 0x4340, 0x4340, 0x4340, 0x4341, 0x4341, 0x4341, 0x4341, + 0x4341, 0x4342, 0x4342, 0x4342, 0x4342, 0x4342, 0x4342, 0x4343, + 0x4343, 0x4343, 0x4343, 0x4343, 0x4343, 0x4344, 0x4344, 0x4344, + 0x4344, 0x4344, 0x4345, 0x4345, 0x4345, 0x4345, 0x4345, 0x4345, + 0x4346, 0x4346, 0x4346, 0x4346, 0x4346, 0x4346, 0x4347, 0x4347, + 0x4347, 0x4347, 0x4347, 0x4348, 0x4348, 0x4348, 0x4348, 0x4348, + 0x4348, 0x4349, 0x4349, 0x4349, 0x4349, 0x4349, 0x4349, 0x434a, + 0x434a, 0x434a, 0x434a, 0x434a, 0x434a, 0x434b, 0x434b, 0x434b, + 0x434b, 0x434b, 0x434c, 0x434c, 0x434c, 0x434c, 0x434c, 0x434c, + 0x434d, 0x434d, 0x434d, 0x434d, 0x434d, 0x434d, 0x434e, 0x434e, + 0x434e, 0x434e, 0x434e, 0x434e, 0x434f, 0x434f, 0x434f, 0x434f, + 0x434f, 0x434f, 0x4350, 0x4350, 0x4350, 0x4350, 0x4350, 0x4350, + 0x4351, 0x4351, 0x4351, 0x4351, 0x4351, 0x4351, 0x4352, 0x4352, + 0x4352, 0x4352, 0x4352, 0x4352, 0x4353, 0x4353, 0x4353, 0x4353, + 0x4353, 0x4353, 0x4354, 0x4354, 0x4354, 0x4354, 0x4354, 0x4354, + 0x4355, 0x4355, 0x4355, 0x4355, 0x4355, 0x4355, 0x4356, 0x4356, + 0x4356, 0x4356, 0x4356, 0x4356, 0x4357, 0x4357, 0x4357, 0x4357, + 0x4357, 0x4357, 0x4358, 0x4358, 0x4358, 0x4358, 0x4358, 0x4358, + 0x4359, 0x4359, 0x4359, 0x4359, 0x4359, 0x4359, 0x435a, 0x435a, + 0x435a, 0x435a, 0x435a, 0x435a, 0x435b, 0x435b, 0x435b, 0x435b, + 0x435b, 0x435b, 0x435b, 0x435c, 0x435c, 0x435c, 0x435c, 0x435c, + 0x435c, 0x435d, 0x435d, 0x435d, 0x435d, 0x435d, 0x435d, 0x435e, + 0x435e, 0x435e, 0x435e, 0x435e, 0x435e, 0x435e, 0x435f, 0x435f, + 0x435f, 0x435f, 0x435f, 0x435f, 0x4360, 0x4360, 0x4360, 0x4360, + 0x4360, 0x4360, 0x4361, 0x4361, 0x4361, 0x4361, 0x4361, 0x4361, + 0x4361, 0x4362, 0x4362, 0x4362, 0x4362, 0x4362, 0x4362, 0x4363, + 0x4363, 0x4363, 0x4363, 0x4363, 0x4363, 0x4364, 0x4364, 0x4364, + 0x4364, 0x4364, 0x4364, 0x4364, 0x4365, 0x4365, 0x4365, 0x4365, + 0x4365, 0x4365, 0x4366, 0x4366, 0x4366, 0x4366, 0x4366, 0x4366, + 0x4366, 0x4367, 0x4367, 0x4367, 0x4367, 0x4367, 0x4367, 0x4368, + 0x4368, 0x4368, 0x4368, 0x4368, 0x4368, 0x4368, 0x4369, 0x4369, + 0x4369, 0x4369, 0x4369, 0x4369, 0x4369, 0x436a, 0x436a, 0x436a, + 0x436a, 0x436a, 0x436a, 0x436b, 0x436b, 0x436b, 0x436b, 0x436b, + 0x436b, 0x436b, 0x436c, 0x436c, 0x436c, 0x436c, 0x436c, 0x436c, + 0x436c, 0x436d, 0x436d, 0x436d, 0x436d, 0x436d, 0x436d, 0x436e, + 0x436e, 0x436e, 0x436e, 0x436e, 0x436e, 0x436e, 0x436f, 0x436f, + 0x436f, 0x436f, 0x436f, 0x436f, 0x436f, 0x4370, 0x4370, 0x4370, + 0x4370, 0x4370, 0x4370, 0x4370, 0x4371, 0x4371, 0x4371, 0x4371, + 0x4371, 0x4371, 0x4372, 0x4372, 0x4372, 0x4372, 0x4372, 0x4372, + 0x4372, 0x4373, 0x4373, 0x4373, 0x4373, 0x4373, 0x4373, 0x4373, + 0x4374, 0x4374, 0x4374, 0x4374, 0x4374, 0x4374, 0x4374, 0x4375, + 0x4375, 0x4375, 0x4375, 0x4375, 0x4375, 0x4375, 0x4376, 0x4376, + 0x4376, 0x4376, 0x4376, 0x4376, 0x4376, 0x4377, 0x4377, 0x4377, + 0x4377, 0x4377, 0x4377, 0x4377, 0x4378, 0x4378, 0x4378, 0x4378, + 0x4378, 0x4378, 0x4378, 0x4379, 0x4379, 0x4379, 0x4379, 0x4379, + 0x4379, 0x4379, 0x437a, 0x437a, 0x437a, 0x437a, 0x437a, 0x437a, + 0x437a, 0x437b, 0x437b, 0x437b, 0x437b, 0x437b, 0x437b, 0x437b, + 0x437c, 0x437c, 0x437c, 0x437c, 0x437c, 0x437c, 0x437c, 0x437c, + 0x437d, 0x437d, 0x437d, 0x437d, 0x437d, 0x437d, 0x437d, 0x437e, + 0x437e, 0x437e, 0x437e, 0x437e, 0x437e, 0x437e, 0x437f, 0x437f, + 0x437f, 0x437f, 0x437f, 0x437f, 0x437f, 0x4380, 0x4380, 0x4380, + 0x4380, 0x4380, 0x4380, 0x4380, 0x4380, 0x4381, 0x4381, 0x4381, + 0x4381, 0x4381, 0x4381, 0x4381, 0x4382, 0x4382, 0x4382, 0x4382, + 0x4382, 0x4382, 0x4382, 0x4383, 0x4383, 0x4383, 0x4383, 0x4383, + 0x4383, 0x4383, 0x4383, 0x4384, 0x4384, 0x4384, 0x4384, 0x4384, + 0x4384, 0x4384, 0x4385, 0x4385, 0x4385, 0x4385, 0x4385, 0x4385, + 0x4385, 0x4385, 0x4386, 0x4386, 0x4386, 0x4386, 0x4386, 0x4386, + 0x4386, 0x4387, 0x4387, 0x4387, 0x4387, 0x4387, 0x4387, 0x4387, + 0x4387, 0x4388, 0x4388, 0x4388, 0x4388, 0x4388, 0x4388, 0x4388, + 0x4389, 0x4389, 0x4389, 0x4389, 0x4389, 0x4389, 0x4389, 0x4389, + 0x438a, 0x438a, 0x438a, 0x438a, 0x438a, 0x438a, 0x438a, 0x438b, + 0x438b, 0x438b, 0x438b, 0x438b, 0x438b, 0x438b, 0x438b, 0x438c, + 0x438c, 0x438c, 0x438c, 0x438c, 0x438c, 0x438c, 0x438c, 0x438d, + 0x438d, 0x438d, 0x438d, 0x438d, 0x438d, 0x438d, 0x438e, 0x438e, + 0x438e, 0x438e, 0x438e, 0x438e, 0x438e, 0x438e, 0x438f, 0x438f, + 0x438f, 0x438f, 0x438f, 0x438f, 0x438f, 0x438f, 0x4390, 0x4390, + 0x4390, 0x4390, 0x4390, 0x4390, 0x4390, 0x4390, 0x4391, 0x4391, + 0x4391, 0x4391, 0x4391, 0x4391, 0x4391, 0x4392, 0x4392, 0x4392, + 0x4392, 0x4392, 0x4392, 0x4392, 0x4392, 0x4393, 0x4393, 0x4393, + 0x4393, 0x4393, 0x4393, 0x4393, 0x4393, 0x4394, 0x4394, 0x4394, + 0x4394, 0x4394, 0x4394, 0x4394, 0x4394, 0x4395, 0x4395, 0x4395, + 0x4395, 0x4395, 0x4395, 0x4395, 0x4395, 0x4396, 0x4396, 0x4396, + 0x4396, 0x4396, 0x4396, 0x4396, 0x4396, 0x4397, 0x4397, 0x4397, + 0x4397, 0x4397, 0x4397, 0x4397, 0x4397, 0x4398, 0x4398, 0x4398, + 0x4398, 0x4398, 0x4398, 0x4398, 0x4398, 0x4399, 0x4399, 0x4399, + 0x4399, 0x4399, 0x4399, 0x4399, 0x4399, 0x439a, 0x439a, 0x439a, + 0x439a, 0x439a, 0x439a, 0x439a, 0x439a, 0x439a, 0x439b, 0x439b, + 0x439b, 0x439b, 0x439b, 0x439b, 0x439b, 0x439b, 0x439c, 0x439c, + 0x439c, 0x439c, 0x439c, 0x439c, 0x439c, 0x439c, 0x439d, 0x439d, + 0x439d, 0x439d, 0x439d, 0x439d, 0x439d, 0x439d, 0x439e, 0x439e, + 0x439e, 0x439e, 0x439e, 0x439e, 0x439e, 0x439e, 0x439e, 0x439f, + 0x439f, 0x439f, 0x439f, 0x439f, 0x439f, 0x439f, 0x439f, 0x43a0, + 0x43a0, 0x43a0, 0x43a0, 0x43a0, 0x43a0, 0x43a0, 0x43a0, 0x43a1, + 0x43a1, 0x43a1, 0x43a1, 0x43a1, 0x43a1, 0x43a1, 0x43a1, 0x43a1, + 0x43a2, 0x43a2, 0x43a2, 0x43a2, 0x43a2, 0x43a2, 0x43a2, 0x43a2, + 0x43a3, 0x43a3, 0x43a3, 0x43a3, 0x43a3, 0x43a3, 0x43a3, 0x43a3, + 0x43a3, 0x43a4, 0x43a4, 0x43a4, 0x43a4, 0x43a4, 0x43a4, 0x43a4, + 0x43a4, 0x43a5, 0x43a5, 0x43a5, 0x43a5, 0x43a5, 0x43a5, 0x43a5, + 0x43a5, 0x43a5, 0x43a6, 0x43a6, 0x43a6, 0x43a6, 0x43a6, 0x43a6, + 0x43a6, 0x43a6, 0x43a7, 0x43a7, 0x43a7, 0x43a7, 0x43a7, 0x43a7, + 0x43a7, 0x43a7, 0x43a7, 0x43a8, 0x43a8, 0x43a8, 0x43a8, 0x43a8, + 0x43a8, 0x43a8, 0x43a8, 0x43a9, 0x43a9, 0x43a9, 0x43a9, 0x43a9, + 0x43a9, 0x43a9, 0x43a9, 0x43a9, 0x43aa, 0x43aa, 0x43aa, 0x43aa, + 0x43aa, 0x43aa, 0x43aa, 0x43aa, 0x43aa, 0x43ab, 0x43ab, 0x43ab, + 0x43ab, 0x43ab, 0x43ab, 0x43ab, 0x43ab, 0x43ab, 0x43ac, 0x43ac, + 0x43ac, 0x43ac, 0x43ac, 0x43ad, 0x43ad, 0x43ad, 0x43ad, 0x43ad, + 0x43ae, 0x43ae, 0x43ae, 0x43ae, 0x43af, 0x43af, 0x43af, 0x43af, + 0x43af, 0x43b0, 0x43b0, 0x43b0, 0x43b0, 0x43b1, 0x43b1, 0x43b1, + 0x43b1, 0x43b1, 0x43b2, 0x43b2, 0x43b2, 0x43b2, 0x43b3, 0x43b3, + 0x43b3, 0x43b3, 0x43b3, 0x43b4, 0x43b4, 0x43b4, 0x43b4, 0x43b5, + 0x43b5, 0x43b5, 0x43b5, 0x43b5, 0x43b6, 0x43b6, 0x43b6, 0x43b6, + 0x43b6, 0x43b7, 0x43b7, 0x43b7, 0x43b7, 0x43b8, 0x43b8, 0x43b8, + 0x43b8, 0x43b8, 0x43b9, 0x43b9, 0x43b9, 0x43b9, 0x43ba, 0x43ba, + 0x43ba, 0x43ba, 0x43ba, 0x43bb, 0x43bb, 0x43bb, 0x43bb, 0x43bb, + 0x43bc, 0x43bc, 0x43bc, 0x43bc, 0x43bc, 0x43bd, 0x43bd, 0x43bd, + 0x43bd, 0x43be, 0x43be, 0x43be, 0x43be, 0x43be, 0x43bf, 0x43bf, + 0x43bf, 0x43bf, 0x43bf, 0x43c0, 0x43c0, 0x43c0, 0x43c0, 0x43c0, + 0x43c1, 0x43c1, 0x43c1, 0x43c1, 0x43c2, 0x43c2, 0x43c2, 0x43c2, + 0x43c2, 0x43c3, 0x43c3, 0x43c3, 0x43c3, 0x43c3, 0x43c4, 0x43c4, + 0x43c4, 0x43c4, 0x43c4, 0x43c5, 0x43c5, 0x43c5, 0x43c5, 0x43c5, + 0x43c6, 0x43c6, 0x43c6, 0x43c6, 0x43c6, 0x43c7, 0x43c7, 0x43c7, + 0x43c7, 0x43c7, 0x43c8, 0x43c8, 0x43c8, 0x43c8, 0x43c8, 0x43c9, + 0x43c9, 0x43c9, 0x43c9, 0x43c9, 0x43ca, 0x43ca, 0x43ca, 0x43ca, + 0x43ca, 0x43cb, 0x43cb, 0x43cb, 0x43cb, 0x43cb, 0x43cc, 0x43cc, + 0x43cc, 0x43cc, 0x43cc, 0x43cd, 0x43cd, 0x43cd, 0x43cd, 0x43cd, + 0x43ce, 0x43ce, 0x43ce, 0x43ce, 0x43ce, 0x43cf, 0x43cf, 0x43cf, + 0x43cf, 0x43cf, 0x43d0, 0x43d0, 0x43d0, 0x43d0, 0x43d0, 0x43d1, + 0x43d1, 0x43d1, 0x43d1, 0x43d1, 0x43d2, 0x43d2, 0x43d2, 0x43d2, + 0x43d2, 0x43d2, 0x43d3, 0x43d3, 0x43d3, 0x43d3, 0x43d3, 0x43d4, + 0x43d4, 0x43d4, 0x43d4, 0x43d4, 0x43d5, 0x43d5, 0x43d5, 0x43d5, + 0x43d5, 0x43d6, 0x43d6, 0x43d6, 0x43d6, 0x43d6, 0x43d6, 0x43d7, + 0x43d7, 0x43d7, 0x43d7, 0x43d7, 0x43d8, 0x43d8, 0x43d8, 0x43d8, + 0x43d8, 0x43d9, 0x43d9, 0x43d9, 0x43d9, 0x43d9, 0x43d9, 0x43da, + 0x43da, 0x43da, 0x43da, 0x43da, 0x43db, 0x43db, 0x43db, 0x43db, + 0x43db, 0x43dc, 0x43dc, 0x43dc, 0x43dc, 0x43dc, 0x43dc, 0x43dd, + 0x43dd, 0x43dd, 0x43dd, 0x43dd, 0x43de, 0x43de, 0x43de, 0x43de, + 0x43de, 0x43de, 0x43df, 0x43df, 0x43df, 0x43df, 0x43df, 0x43e0, + 0x43e0, 0x43e0, 0x43e0, 0x43e0, 0x43e0, 0x43e1, 0x43e1, 0x43e1, + 0x43e1, 0x43e1, 0x43e2, 0x43e2, 0x43e2, 0x43e2, 0x43e2, 0x43e2, + 0x43e3, 0x43e3, 0x43e3, 0x43e3, 0x43e3, 0x43e4, 0x43e4, 0x43e4, + 0x43e4, 0x43e4, 0x43e4, 0x43e5, 0x43e5, 0x43e5, 0x43e5, 0x43e5, + 0x43e6, 0x43e6, 0x43e6, 0x43e6, 0x43e6, 0x43e6, 0x43e7, 0x43e7, + 0x43e7, 0x43e7, 0x43e7, 0x43e7, 0x43e8, 0x43e8, 0x43e8, 0x43e8, + 0x43e8, 0x43e9, 0x43e9, 0x43e9, 0x43e9, 0x43e9, 0x43e9, 0x43ea, + 0x43ea, 0x43ea, 0x43ea, 0x43ea, 0x43ea, 0x43eb, 0x43eb, 0x43eb, + 0x43eb, 0x43eb, 0x43eb, 0x43ec, 0x43ec, 0x43ec, 0x43ec, 0x43ec, + 0x43ec, 0x43ed, 0x43ed, 0x43ed, 0x43ed, 0x43ed, 0x43ee, 0x43ee, + 0x43ee, 0x43ee, 0x43ee, 0x43ee, 0x43ef, 0x43ef, 0x43ef, 0x43ef, + 0x43ef, 0x43ef, 0x43f0, 0x43f0, 0x43f0, 0x43f0, 0x43f0, 0x43f0, + 0x43f1, 0x43f1, 0x43f1, 0x43f1, 0x43f1, 0x43f1, 0x43f2, 0x43f2, + 0x43f2, 0x43f2, 0x43f2, 0x43f2, 0x43f3, 0x43f3, 0x43f3, 0x43f3, + 0x43f3, 0x43f3, 0x43f4, 0x43f4, 0x43f4, 0x43f4, 0x43f4, 0x43f4, + 0x43f5, 0x43f5, 0x43f5, 0x43f5, 0x43f5, 0x43f5, 0x43f6, 0x43f6, + 0x43f6, 0x43f6, 0x43f6, 0x43f6, 0x43f7, 0x43f7, 0x43f7, 0x43f7, + 0x43f7, 0x43f7, 0x43f8, 0x43f8, 0x43f8, 0x43f8, 0x43f8, 0x43f8, + 0x43f9, 0x43f9, 0x43f9, 0x43f9, 0x43f9, 0x43f9, 0x43fa, 0x43fa, + 0x43fa, 0x43fa, 0x43fa, 0x43fa, 0x43fb, 0x43fb, 0x43fb, 0x43fb, + 0x43fb, 0x43fb, 0x43fb, 0x43fc, 0x43fc, 0x43fc, 0x43fc, 0x43fc, + 0x43fc, 0x43fd, 0x43fd, 0x43fd, 0x43fd, 0x43fd, 0x43fd, 0x43fe, + 0x43fe, 0x43fe, 0x43fe, 0x43fe, 0x43fe, 0x43ff, 0x43ff, 0x43ff, + 0x43ff, 0x43ff, 0x43ff, 0x43ff, 0x4400, 0x4400, 0x4400, 0x4400, + 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4401, 0x4401, 0x4401, + 0x4401, 0x4401, 0x4401, 0x4401, 0x4401, 0x4401, 0x4401, 0x4401, + 0x4401, 0x4401, 0x4402, 0x4402, 0x4402, 0x4402, 0x4402, 0x4402, + 0x4402, 0x4402, 0x4402, 0x4402, 0x4402, 0x4402, 0x4402, 0x4403, + 0x4403, 0x4403, 0x4403, 0x4403, 0x4403, 0x4403, 0x4403, 0x4403, + 0x4403, 0x4403, 0x4403, 0x4403, 0x4404, 0x4404, 0x4404, 0x4404, + 0x4404, 0x4404, 0x4404, 0x4404, 0x4404, 0x4404, 0x4404, 0x4404, + 0x4404, 0x4405, 0x4405, 0x4405, 0x4405, 0x4405, 0x4405, 0x4405, + 0x4405, 0x4405, 0x4405, 0x4405, 0x4405, 0x4405, 0x4406, 0x4406, + 0x4406, 0x4406, 0x4406, 0x4406, 0x4406, 0x4406, 0x4406, 0x4406, + 0x4406, 0x4406, 0x4406, 0x4407, 0x4407, 0x4407, 0x4407, 0x4407, + 0x4407, 0x4407, 0x4407, 0x4407, 0x4407, 0x4407, 0x4407, 0x4407, + 0x4407, 0x4408, 0x4408, 0x4408, 0x4408, 0x4408, 0x4408, 0x4408, + 0x4408, 0x4408, 0x4408, 0x4408, 0x4408, 0x4408, 0x4409, 0x4409, + 0x4409, 0x4409, 0x4409, 0x4409, 0x4409, 0x4409, 0x4409, 0x4409, + 0x4409, 0x4409, 0x4409, 0x4409, 0x440a, 0x440a, 0x440a, 0x440a, + 0x440a, 0x440a, 0x440a, 0x440a, 0x440a, 0x440a, 0x440a, 0x440a, + 0x440a, 0x440a, 0x440b, 0x440b, 0x440b, 0x440b, 0x440b, 0x440b, + 0x440b, 0x440b, 0x440b, 0x440b, 0x440b, 0x440b, 0x440b, 0x440c, + 0x440c, 0x440c, 0x440c, 0x440c, 0x440c, 0x440c, 0x440c, 0x440c, + 0x440c, 0x440c, 0x440c, 0x440c, 0x440c, 0x440d, 0x440d, 0x440d, + 0x440d, 0x440d, 0x440d, 0x440d, 0x440d, 0x440d, 0x440d, 0x440d, + 0x440d, 0x440d, 0x440d, 0x440d, 0x440e, 0x440e, 0x440e, 0x440e, + 0x440e, 0x440e, 0x440e, 0x440e, 0x440e, 0x440e, 0x440e, 0x440e, + 0x440e, 0x440e, 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, + 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, 0x440f, + 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, + 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4410, 0x4411, + 0x4411, 0x4411, 0x4411, 0x4411, 0x4411, 0x4411, 0x4411, 0x4411, + 0x4411, 0x4411, 0x4411, 0x4411, 0x4411, 0x4412, 0x4412, 0x4412, + 0x4412, 0x4412, 0x4412, 0x4412, 0x4412, 0x4412, 0x4412, 0x4412, + 0x4412, 0x4412, 0x4412, 0x4412, 0x4413, 0x4413, 0x4413, 0x4413, + 0x4413, 0x4413, 0x4413, 0x4413, 0x4413, 0x4413, 0x4413, 0x4413, + 0x4413, 0x4413, 0x4413, 0x4414, 0x4414, 0x4414, 0x4414, 0x4414, + 0x4414, 0x4414, 0x4414, 0x4414, 0x4414, 0x4414, 0x4414, 0x4414, + 0x4414, 0x4414, 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, + 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, 0x4415, + 0x4415, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, + 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, 0x4416, + 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, + 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, 0x4417, + 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, + 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4418, 0x4419, + 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, + 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x4419, 0x441a, + 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, + 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441a, 0x441b, + 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, + 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441b, 0x441c, + 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, + 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441c, 0x441d, + 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, + 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441d, 0x441e, + 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, + 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441e, 0x441f, + 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, + 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, 0x441f, + 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, + 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, 0x4420, + 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, + 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, 0x4421, + 0x4421, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, + 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, 0x4422, + 0x4422, 0x4422, 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, + 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, 0x4423, + 0x4423, 0x4423, 0x4423, 0x4424, 0x4424, 0x4424, 0x4424, 0x4424, + 0x4424, 0x4424, 0x4424, 0x4424, 0x4424, 0x4424, 0x4424, 0x4424, + 0x4424, 0x4424, 0x4424, 0x4424, 0x4425, 0x4425, 0x4425, 0x4425, + 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, + 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, 0x4425, 0x4426, 0x4426, + 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, + 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4426, 0x4427, + 0x4427, 0x4427, 0x4427, 0x4427, 0x4427, 0x4427, 0x4427, 0x4427, + 0x4427, 0x4428, 0x4428, 0x4428, 0x4428, 0x4428, 0x4428, 0x4428, + 0x4428, 0x4428, 0x4429, 0x4429, 0x4429, 0x4429, 0x4429, 0x4429, + 0x4429, 0x4429, 0x4429, 0x442a, 0x442a, 0x442a, 0x442a, 0x442a, + 0x442a, 0x442a, 0x442a, 0x442a, 0x442b, 0x442b, 0x442b, 0x442b, + 0x442b, 0x442b, 0x442b, 0x442b, 0x442b, 0x442c, 0x442c, 0x442c, + 0x442c, 0x442c, 0x442c, 0x442c, 0x442c, 0x442c, 0x442d, 0x442d, + 0x442d, 0x442d, 0x442d, 0x442d, 0x442d, 0x442d, 0x442d, 0x442e, + 0x442e, 0x442e, 0x442e, 0x442e, 0x442e, 0x442e, 0x442e, 0x442e, + 0x442e, 0x442f, 0x442f, 0x442f, 0x442f, 0x442f, 0x442f, 0x442f, + 0x442f, 0x442f, 0x4430, 0x4430, 0x4430, 0x4430, 0x4430, 0x4430, + 0x4430, 0x4430, 0x4430, 0x4430, 0x4431, 0x4431, 0x4431, 0x4431, + 0x4431, 0x4431, 0x4431, 0x4431, 0x4431, 0x4432, 0x4432, 0x4432, + 0x4432, 0x4432, 0x4432, 0x4432, 0x4432, 0x4432, 0x4432, 0x4433, + 0x4433, 0x4433, 0x4433, 0x4433, 0x4433, 0x4433, 0x4433, 0x4433, + 0x4433, 0x4434, 0x4434, 0x4434, 0x4434, 0x4434, 0x4434, 0x4434, + 0x4434, 0x4434, 0x4434, 0x4435, 0x4435, 0x4435, 0x4435, 0x4435, + 0x4435, 0x4435, 0x4435, 0x4435, 0x4435, 0x4436, 0x4436, 0x4436, + 0x4436, 0x4436, 0x4436, 0x4436, 0x4436, 0x4436, 0x4436, 0x4437, + 0x4437, 0x4437, 0x4437, 0x4437, 0x4437, 0x4437, 0x4437, 0x4437, + 0x4437, 0x4438, 0x4438, 0x4438, 0x4438, 0x4438, 0x4438, 0x4438, + 0x4438, 0x4438, 0x4438, 0x4439, 0x4439, 0x4439, 0x4439, 0x4439, + 0x4439, 0x4439, 0x4439, 0x4439, 0x4439, 0x443a, 0x443a, 0x443a, + 0x443a, 0x443a, 0x443a, 0x443a, 0x443a, 0x443a, 0x443a, 0x443a, + 0x443b, 0x443b, 0x443b, 0x443b, 0x443b, 0x443b, 0x443b, 0x443b, + 0x443b, 0x443b, 0x443c, 0x443c, 0x443c, 0x443c, 0x443c, 0x443c, + 0x443c, 0x443c, 0x443c, 0x443c, 0x443c, 0x443d, 0x443d, 0x443d, + 0x443d, 0x443d, 0x443d, 0x443d, 0x443d, 0x443d, 0x443d, 0x443d, + 0x443e, 0x443e, 0x443e, 0x443e, 0x443e, 0x443e, 0x443e, 0x443e, + 0x443e, 0x443e, 0x443f, 0x443f, 0x443f, 0x443f, 0x443f, 0x443f, + 0x443f, 0x443f, 0x443f, 0x443f, 0x443f, 0x4440, 0x4440, 0x4440, + 0x4440, 0x4440, 0x4440, 0x4440, 0x4440, 0x4440, 0x4440, 0x4440, + 0x4441, 0x4441, 0x4441, 0x4441, 0x4441, 0x4441, 0x4441, 0x4441, + 0x4441, 0x4441, 0x4441, 0x4442, 0x4442, 0x4442, 0x4442, 0x4442, + 0x4442, 0x4442, 0x4442, 0x4442, 0x4442, 0x4442, 0x4443, 0x4443, + 0x4443, 0x4443, 0x4443, 0x4443, 0x4443, 0x4443, 0x4443, 0x4443, + 0x4443, 0x4443, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, + 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4445, 0x4445, 0x4445, + 0x4445, 0x4445, 0x4445, 0x4445, 0x4445, 0x4445, 0x4445, 0x4445, + 0x4446, 0x4446, 0x4446, 0x4446, 0x4446, 0x4446, 0x4446, 0x4446, + 0x4446, 0x4446, 0x4446, 0x4446, 0x4447, 0x4447, 0x4447, 0x4447, + 0x4447, 0x4447, 0x4447, 0x4447, 0x4447, 0x4447, 0x4447, 0x4448, + 0x4448, 0x4448, 0x4448, 0x4448, 0x4448, 0x4448, 0x4448, 0x4448, + 0x4448, 0x4448, 0x4448, 0x4449, 0x4449, 0x4449, 0x4449, 0x4449, + 0x4449, 0x4449, 0x4449, 0x4449, 0x4449, 0x4449, 0x4449, 0x444a, + 0x444a, 0x444a, 0x444a, 0x444a, 0x444a, 0x444a, 0x444a, 0x444a, + 0x444a, 0x444a, 0x444a, 0x444b, 0x444b, 0x444b, 0x444b, 0x444b, + 0x444b, 0x444b, 0x444b, 0x444b, 0x444b, 0x444b, 0x444b, 0x444c, + 0x444c, 0x444c, 0x444c, 0x444c, 0x444c, 0x444c, 0x444c, 0x444c, + 0x444c, 0x444c, 0x444c, 0x444d, 0x444d, 0x444d, 0x444d, 0x444d, + 0x444d, 0x444d, 0x444d, 0x444d, 0x444d, 0x444d, 0x444d, 0x444e, + 0x444e, 0x444e, 0x444e, 0x444e, 0x444e, 0x444e, 0x444e, 0x444e, + 0x444e, 0x444e, 0x444e, 0x444e, 0x444f, 0x444f, 0x444f, 0x444f, + 0x444f, 0x444f, 0x444f, 0x444f, 0x444f, 0x444f, 0x444f, 0x444f, + 0x4450, 0x4450, 0x4450, 0x4450, 0x4450, 0x4450, 0x4450, 0x4450, + 0x4450, 0x4450, 0x4450, 0x4450, 0x4450, 0x4451, 0x4451, 0x4451, + 0x4451, 0x4451, 0x4451, 0x4451, 0x4451, 0x4451, 0x4451, 0x4451, + 0x4451, 0x4452, 0x4452, 0x4452, 0x4452, 0x4452, 0x4452, 0x4452, + 0x4452, 0x4452, 0x4452, 0x4452, 0x4452, 0x4452, 0x4453, 0x4453, + 0x4453, 0x4453, 0x4453, 0x4453, 0x4453, 0x4453, 0x4453, 0x4453, + 0x4453, 0x4453, 0x4453, 0x4454, 0x4454, 0x4454, 0x4454, 0x4454, + 0x4454, 0x4454, 0x4454, 0x4454, 0x4454, 0x4454, 0x4454, 0x4454, + 0x4455, 0x4455, 0x4455, 0x4455, 0x4455, 0x4455, 0x4455, 0x4455, + 0x4455, 0x4455, 0x4455, 0x4455, 0x4455, 0x4456, 0x4456, 0x4456, + 0x4456, 0x4456, 0x4456, 0x4456, 0x4456, 0x4456, 0x4456, 0x4456, + 0x4456, 0x4456, 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, + 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, 0x4457, + 0x4458, 0x4458, 0x4458, 0x4458, 0x4458, 0x4458, 0x4458, 0x4458, + 0x4458, 0x4458, 0x4458, 0x4458, 0x4458, 0x4459, 0x4459, 0x4459, + 0x4459, 0x4459, 0x4459, 0x4459, 0x4459, 0x4459, 0x4459, 0x4459, + 0x4459, 0x4459, 0x4459, 0x445a, 0x445a, 0x445a, 0x445a, 0x445a, + 0x445a, 0x445a, 0x445a, 0x445a, 0x445a, 0x445a, 0x445a, 0x445a, + 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, + 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, 0x445b, 0x445c, 0x445c, + 0x445c, 0x445c, 0x445c, 0x445c, 0x445c, 0x445c, 0x445c, 0x445c, + 0x445c, 0x445c, 0x445c, 0x445c, 0x445d, 0x445d, 0x445d, 0x445d, + 0x445d, 0x445d, 0x445d, 0x445d, 0x445d, 0x445d, 0x445d, 0x445d, + 0x445d, 0x445d, 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, + 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, 0x445e, + 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, + 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x445f, 0x4460, + 0x4460, 0x4460, 0x4460, 0x4460, 0x4460, 0x4460, 0x4460, 0x4460, + 0x4460, 0x4460, 0x4460, 0x4460, 0x4460, 0x4461, 0x4461, 0x4461, + 0x4461, 0x4461, 0x4461, 0x4461, 0x4461, 0x4461, 0x4461, 0x4461, + 0x4461, 0x4461, 0x4461, 0x4461, 0x4462, 0x4462, 0x4462, 0x4462, + 0x4462, 0x4462, 0x4462, 0x4462, 0x4462, 0x4462, 0x4462, 0x4462, + 0x4462, 0x4462, 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, + 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, 0x4463, + 0x4463, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, + 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, 0x4464, + 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, + 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4465, 0x4466, + 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, + 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, 0x4466, 0x4467, 0x4467, + 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, + 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, 0x4467, 0x4468, 0x4468, + 0x4468, 0x4468, 0x4468, 0x4468, 0x4468, 0x4468, 0x4468, 0x4468, + 0x4468, 0x4468, 0x4468, 0x4468, 0x4468, 0x4469, 0x4469, 0x4469, + 0x4469, 0x4469, 0x4469, 0x4469, 0x4469, 0x4469, 0x4469, 0x4469, + 0x4469, 0x4469, 0x4469, 0x4469, 0x4469, 0x446a, 0x446a, 0x446a, + 0x446a, 0x446a, 0x446a, 0x446a, 0x446a, 0x446a, 0x446a, 0x446a, + 0x446a, 0x446a, 0x446a, 0x446a, 0x446b, 0x446b, 0x446b, 0x446b, + 0x446b, 0x446b, 0x446b, 0x446b, 0x446b, 0x446b, 0x446b, 0x446b, + 0x446b, 0x446b, 0x446b, 0x446b, 0x446c, 0x446c, 0x446c, 0x446c, + 0x446c, 0x446c, 0x446c, 0x446c, 0x446c, 0x446c, 0x446c, 0x446c, + 0x446c, 0x446c, 0x446c, 0x446c, 0x446d, 0x446d, 0x446d, 0x446d, + 0x446d, 0x446d, 0x446d, 0x446d, 0x446d, 0x446d, 0x446d, 0x446d, + 0x446d, 0x446d, 0x446d, 0x446d, 0x446e, 0x446e, 0x446e, 0x446e, + 0x446e, 0x446e, 0x446e, 0x446e, 0x446e, 0x446e, 0x446e, 0x446e, + 0x446e, 0x446e, 0x446e, 0x446e, 0x446e, 0x446f, 0x446f, 0x446f, + 0x446f, 0x446f, 0x446f, 0x446f, 0x446f, 0x446f, 0x446f, 0x446f, + 0x446f, 0x446f, 0x446f, 0x446f, 0x446f, 0x4470, 0x4470, 0x4470, + 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, + 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4471, 0x4471, 0x4471, + 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, + 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, 0x4471, 0x4472, 0x4472, + 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, + 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4472, 0x4473, + 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, + 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, 0x4473, + 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, + 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, 0x4474, + 0x4474, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, + 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, 0x4475, + 0x4475, 0x4475, 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, + 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, 0x4476, + 0x4476, 0x4476, 0x4476, 0x4476, 0x4477, 0x4477, 0x4477, 0x4477, + 0x4477, 0x4477, 0x4477, 0x4477, 0x4477, 0x4477, 0x4477, 0x4477, + 0x4477, 0x4477, 0x4477, 0x4478, 0x4478, 0x4478, 0x4478, 0x4478, + 0x4478, 0x4478, 0x4478, 0x4478, 0x4479, 0x4479, 0x4479, 0x4479, + 0x4479, 0x4479, 0x4479, 0x4479, 0x4479, 0x447a, 0x447a, 0x447a, + 0x447a, 0x447a, 0x447a, 0x447a, 0x447a, 0x447a, 0x447b, 0x447b, + 0x447b, 0x447b, 0x447b, 0x447b, 0x447b, 0x447b, 0x447b, 0x447c, + 0x447c, 0x447c, 0x447c, 0x447c, 0x447c, 0x447c, 0x447c, 0x447c, + 0x447d, 0x447d, 0x447d, 0x447d, 0x447d, 0x447d, 0x447d, 0x447d, + 0x447d, 0x447e, 0x447e, 0x447e, 0x447e, 0x447e, 0x447e, 0x447e, + 0x447e, 0x447e, 0x447e, 0x447f, 0x447f, 0x447f, 0x447f, 0x447f, + 0x447f, 0x447f, 0x447f, 0x447f, 0x4480, 0x4480, 0x4480, 0x4480, + 0x4480, 0x4480, 0x4480, 0x4480, 0x4480, 0x4481, 0x4481, 0x4481, + 0x4481, 0x4481, 0x4481, 0x4481, 0x4481, 0x4481, 0x4481, 0x4482, + 0x4482, 0x4482, 0x4482, 0x4482, 0x4482, 0x4482, 0x4482, 0x4482, + 0x4482, 0x4483, 0x4483, 0x4483, 0x4483, 0x4483, 0x4483, 0x4483, + 0x4483, 0x4483, 0x4484, 0x4484, 0x4484, 0x4484, 0x4484, 0x4484, + 0x4484, 0x4484, 0x4484, 0x4484, 0x4485, 0x4485, 0x4485, 0x4485, + 0x4485, 0x4485, 0x4485, 0x4485, 0x4485, 0x4485, 0x4486, 0x4486, + 0x4486, 0x4486, 0x4486, 0x4486, 0x4486, 0x4486, 0x4486, 0x4486, + 0x4487, 0x4487, 0x4487, 0x4487, 0x4487, 0x4487, 0x4487, 0x4487, + 0x4487, 0x4487, 0x4488, 0x4488, 0x4488, 0x4488, 0x4488, 0x4488, + 0x4488, 0x4488, 0x4488, 0x4488, 0x4489, 0x4489, 0x4489, 0x4489, + 0x4489, 0x4489, 0x4489, 0x4489, 0x4489, 0x4489, 0x4489, 0x448a, + 0x448a, 0x448a, 0x448a, 0x448a, 0x448a, 0x448a, 0x448a, 0x448a, + 0x448a, 0x448b, 0x448b, 0x448b, 0x448b, 0x448b, 0x448b, 0x448b, + 0x448b, 0x448b, 0x448b, 0x448c, 0x448c, 0x448c, 0x448c, 0x448c, + 0x448c, 0x448c, 0x448c, 0x448c, 0x448c, 0x448c, 0x448d, 0x448d, + 0x448d, 0x448d, 0x448d, 0x448d, 0x448d, 0x448d, 0x448d, 0x448d, + 0x448d, 0x448e, 0x448e, 0x448e, 0x448e, 0x448e, 0x448e, 0x448e, + 0x448e, 0x448e, 0x448e, 0x448f, 0x448f, 0x448f, 0x448f, 0x448f, + 0x448f, 0x448f, 0x448f, 0x448f, 0x448f, 0x448f, 0x4490, 0x4490, + 0x4490, 0x4490, 0x4490, 0x4490, 0x4490, 0x4490, 0x4490, 0x4490, + 0x4490, 0x4491, 0x4491, 0x4491, 0x4491, 0x4491, 0x4491, 0x4491, + 0x4491, 0x4491, 0x4491, 0x4491, 0x4492, 0x4492, 0x4492, 0x4492, + 0x4492, 0x4492, 0x4492, 0x4492, 0x4492, 0x4492, 0x4492, 0x4493, + 0x4493, 0x4493, 0x4493, 0x4493, 0x4493, 0x4493, 0x4493, 0x4493, + 0x4493, 0x4493, 0x4494, 0x4494, 0x4494, 0x4494, 0x4494, 0x4494, + 0x4494, 0x4494, 0x4494, 0x4494, 0x4494, 0x4495, 0x4495, 0x4495, + 0x4495, 0x4495, 0x4495, 0x4495, 0x4495, 0x4495, 0x4495, 0x4495, + 0x4495, 0x4496, 0x4496, 0x4496, 0x4496, 0x4496, 0x4496, 0x4496, + 0x4496, 0x4496, 0x4496, 0x4496, 0x4497, 0x4497, 0x4497, 0x4497, + 0x4497, 0x4497, 0x4497, 0x4497, 0x4497, 0x4497, 0x4497, 0x4497, + 0x4498, 0x4498, 0x4498, 0x4498, 0x4498, 0x4498, 0x4498, 0x4498, + 0x4498, 0x4498, 0x4498, 0x4499, 0x4499, 0x4499, 0x4499, 0x4499, + 0x4499, 0x4499, 0x4499, 0x4499, 0x4499, 0x4499, 0x4499, 0x449a, + 0x449a, 0x449a, 0x449a, 0x449a, 0x449a, 0x449a, 0x449a, 0x449a, + 0x449a, 0x449a, 0x449a, 0x449b, 0x449b, 0x449b, 0x449b, 0x449b, + 0x449b, 0x449b, 0x449b, 0x449b, 0x449b, 0x449b, 0x449b, 0x449c, + 0x449c, 0x449c, 0x449c, 0x449c, 0x449c, 0x449c, 0x449c, 0x449c, + 0x449c, 0x449c, 0x449c, 0x449d, 0x449d, 0x449d, 0x449d, 0x449d, + 0x449d, 0x449d, 0x449d, 0x449d, 0x449d, 0x449d, 0x449d, 0x449e, + 0x449e, 0x449e, 0x449e, 0x449e, 0x449e, 0x449e, 0x449e, 0x449e, + 0x449e, 0x449e, 0x449e, 0x449e, 0x449f, 0x449f, 0x449f, 0x449f, + 0x449f, 0x449f, 0x449f, 0x449f, 0x449f, 0x449f, 0x449f, 0x449f, + 0x44a0, 0x44a0, 0x44a0, 0x44a0, 0x44a0, 0x44a0, 0x44a0, 0x44a0, + 0x44a0, 0x44a0, 0x44a0, 0x44a0, 0x44a1, 0x44a1, 0x44a1, 0x44a1, + 0x44a1, 0x44a1, 0x44a1, 0x44a1, 0x44a1, 0x44a1, 0x44a1, 0x44a1, + 0x44a1, 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a2, + 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a2, 0x44a3, 0x44a3, + 0x44a3, 0x44a3, 0x44a3, 0x44a3, 0x44a3, 0x44a3, 0x44a3, 0x44a3, + 0x44a3, 0x44a3, 0x44a3, 0x44a4, 0x44a4, 0x44a4, 0x44a4, 0x44a4, + 0x44a4, 0x44a4, 0x44a4, 0x44a4, 0x44a4, 0x44a4, 0x44a4, 0x44a5, + 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a5, + 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a5, 0x44a6, 0x44a6, 0x44a6, + 0x44a6, 0x44a6, 0x44a6, 0x44a6, 0x44a6, 0x44a6, 0x44a6, 0x44a6, + 0x44a6, 0x44a6, 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a7, + 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a7, 0x44a8, + 0x44a8, 0x44a8, 0x44a8, 0x44a8, 0x44a8, 0x44a8, 0x44a8, 0x44a8, + 0x44a8, 0x44a8, 0x44a8, 0x44a8, 0x44a9, 0x44a9, 0x44a9, 0x44a9, + 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, + 0x44a9, 0x44a9, 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44aa, + 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44aa, 0x44ab, + 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ab, + 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ab, 0x44ac, 0x44ac, 0x44ac, + 0x44ac, 0x44ac, 0x44ac, 0x44ac, 0x44ac, 0x44ac, 0x44ac, 0x44ac, + 0x44ac, 0x44ac, 0x44ac, 0x44ad, 0x44ad, 0x44ad, 0x44ad, 0x44ad, + 0x44ad, 0x44ad, 0x44ad, 0x44ad, 0x44ad, 0x44ad, 0x44ad, 0x44ad, + 0x44ad, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, + 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44ae, 0x44af, + 0x44af, 0x44af, 0x44af, 0x44af, 0x44af, 0x44af, 0x44af, 0x44af, + 0x44af, 0x44af, 0x44af, 0x44af, 0x44af, 0x44b0, 0x44b0, 0x44b0, + 0x44b0, 0x44b0, 0x44b0, 0x44b0, 0x44b0, 0x44b0, 0x44b0, 0x44b0, + 0x44b0, 0x44b0, 0x44b0, 0x44b0, 0x44b1, 0x44b1, 0x44b1, 0x44b1, + 0x44b1, 0x44b1, 0x44b1, 0x44b1, 0x44b1, 0x44b1, 0x44b1, 0x44b1, + 0x44b1, 0x44b1, 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, + 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, 0x44b2, + 0x44b2, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, + 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b3, 0x44b4, + 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, + 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b4, 0x44b5, 0x44b5, + 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b5, + 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b5, 0x44b6, 0x44b6, 0x44b6, + 0x44b6, 0x44b6, 0x44b6, 0x44b6, 0x44b6, 0x44b6, 0x44b6, 0x44b6, + 0x44b6, 0x44b6, 0x44b6, 0x44b6, 0x44b7, 0x44b7, 0x44b7, 0x44b7, + 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, + 0x44b7, 0x44b7, 0x44b7, 0x44b8, 0x44b8, 0x44b8, 0x44b8, 0x44b8, + 0x44b8, 0x44b8, 0x44b8, 0x44b8, 0x44b8, 0x44b8, 0x44b8, 0x44b8, + 0x44b8, 0x44b8, 0x44b8, 0x44b9, 0x44b9, 0x44b9, 0x44b9, 0x44b9, + 0x44b9, 0x44b9, 0x44b9, 0x44b9, 0x44b9, 0x44b9, 0x44b9, 0x44b9, + 0x44b9, 0x44b9, 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, + 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, 0x44ba, + 0x44ba, 0x44ba, 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, + 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, 0x44bb, + 0x44bb, 0x44bb, 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, + 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, 0x44bc, + 0x44bc, 0x44bc, 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, + 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, 0x44bd, + 0x44bd, 0x44bd, 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, + 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, 0x44be, + 0x44be, 0x44be, 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, + 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, 0x44bf, + 0x44bf, 0x44bf, 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, + 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, 0x44c0, + 0x44c0, 0x44c0, 0x44c0, 0x44c1, 0x44c1, 0x44c1, 0x44c1, 0x44c1, + 0x44c1, 0x44c1, 0x44c1, 0x44c1, 0x44c1, 0x44c1, 0x44c1, 0x44c1, + 0x44c1, 0x44c1, 0x44c1, 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c2, + 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c2, + 0x44c2, 0x44c2, 0x44c2, 0x44c2, 0x44c3, 0x44c3, 0x44c3, 0x44c3, + 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c3, + 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c3, 0x44c4, 0x44c4, 0x44c4, + 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, + 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c4, 0x44c5, 0x44c5, + 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, + 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c5, 0x44c6, + 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, + 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, 0x44c6, + 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, + 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, 0x44c7, + 0x44c7, 0x44c7, 0x44c8, 0x44c8, 0x44c8, 0x44c8, 0x44c8, 0x44c8, + 0x44c8, 0x44c8, 0x44c8, 0x44c8, 0x44c8, 0x44c8, 0x44c9, 0x44c9, + 0x44c9, 0x44c9, 0x44c9, 0x44c9, 0x44c9, 0x44c9, 0x44c9, 0x44ca, + 0x44ca, 0x44ca, 0x44ca, 0x44ca, 0x44ca, 0x44ca, 0x44ca, 0x44ca, + 0x44cb, 0x44cb, 0x44cb, 0x44cb, 0x44cb, 0x44cb, 0x44cb, 0x44cb, + 0x44cb, 0x44cc, 0x44cc, 0x44cc, 0x44cc, 0x44cc, 0x44cc, 0x44cc, + 0x44cc, 0x44cc, 0x44cd, 0x44cd, 0x44cd, 0x44cd, 0x44cd, 0x44cd, + 0x44cd, 0x44cd, 0x44cd, 0x44ce, 0x44ce, 0x44ce, 0x44ce, 0x44ce, + 0x44ce, 0x44ce, 0x44ce, 0x44ce, 0x44cf, 0x44cf, 0x44cf, 0x44cf, + 0x44cf, 0x44cf, 0x44cf, 0x44cf, 0x44cf, 0x44cf, 0x44d0, 0x44d0, + 0x44d0, 0x44d0, 0x44d0, 0x44d0, 0x44d0, 0x44d0, 0x44d0, 0x44d1, + 0x44d1, 0x44d1, 0x44d1, 0x44d1, 0x44d1, 0x44d1, 0x44d1, 0x44d1, + 0x44d1, 0x44d2, 0x44d2, 0x44d2, 0x44d2, 0x44d2, 0x44d2, 0x44d2, + 0x44d2, 0x44d2, 0x44d3, 0x44d3, 0x44d3, 0x44d3, 0x44d3, 0x44d3, + 0x44d3, 0x44d3, 0x44d3, 0x44d3, 0x44d4, 0x44d4, 0x44d4, 0x44d4, + 0x44d4, 0x44d4, 0x44d4, 0x44d4, 0x44d4, 0x44d4, 0x44d5, 0x44d5, + 0x44d5, 0x44d5, 0x44d5, 0x44d5, 0x44d5, 0x44d5, 0x44d5, 0x44d5, + 0x44d6, 0x44d6, 0x44d6, 0x44d6, 0x44d6, 0x44d6, 0x44d6, 0x44d6, + 0x44d6, 0x44d6, 0x44d7, 0x44d7, 0x44d7, 0x44d7, 0x44d7, 0x44d7, + 0x44d7, 0x44d7, 0x44d7, 0x44d7, 0x44d8, 0x44d8, 0x44d8, 0x44d8, + 0x44d8, 0x44d8, 0x44d8, 0x44d8, 0x44d8, 0x44d8, 0x44d9, 0x44d9, + 0x44d9, 0x44d9, 0x44d9, 0x44d9, 0x44d9, 0x44d9, 0x44d9, 0x44d9, + 0x44da, 0x44da, 0x44da, 0x44da, 0x44da, 0x44da, 0x44da, 0x44da, + 0x44da, 0x44da, 0x44db, 0x44db, 0x44db, 0x44db, 0x44db, 0x44db, + 0x44db, 0x44db, 0x44db, 0x44db, 0x44db, 0x44dc, 0x44dc, 0x44dc, + 0x44dc, 0x44dc, 0x44dc, 0x44dc, 0x44dc, 0x44dc, 0x44dc, 0x44dd, + 0x44dd, 0x44dd, 0x44dd, 0x44dd, 0x44dd, 0x44dd, 0x44dd, 0x44dd, + 0x44dd, 0x44dd, 0x44de, 0x44de, 0x44de, 0x44de, 0x44de, 0x44de, + 0x44de, 0x44de, 0x44de, 0x44de, 0x44df, 0x44df, 0x44df, 0x44df, + 0x44df, 0x44df, 0x44df, 0x44df, 0x44df, 0x44df, 0x44df, 0x44e0, + 0x44e0, 0x44e0, 0x44e0, 0x44e0, 0x44e0, 0x44e0, 0x44e0, 0x44e0, + 0x44e0, 0x44e0, 0x44e1, 0x44e1, 0x44e1, 0x44e1, 0x44e1, 0x44e1, + 0x44e1, 0x44e1, 0x44e1, 0x44e1, 0x44e1, 0x44e2, 0x44e2, 0x44e2, + 0x44e2, 0x44e2, 0x44e2, 0x44e2, 0x44e2, 0x44e2, 0x44e2, 0x44e2, + 0x44e3, 0x44e3, 0x44e3, 0x44e3, 0x44e3, 0x44e3, 0x44e3, 0x44e3, + 0x44e3, 0x44e3, 0x44e3, 0x44e4, 0x44e4, 0x44e4, 0x44e4, 0x44e4, + 0x44e4, 0x44e4, 0x44e4, 0x44e4, 0x44e4, 0x44e4, 0x44e5, 0x44e5, + 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x44e5, + 0x44e5, 0x44e6, 0x44e6, 0x44e6, 0x44e6, 0x44e6, 0x44e6, 0x44e6, + 0x44e6, 0x44e6, 0x44e6, 0x44e6, 0x44e6, 0x44e7, 0x44e7, 0x44e7, + 0x44e7, 0x44e7, 0x44e7, 0x44e7, 0x44e7, 0x44e7, 0x44e7, 0x44e7, + 0x44e8, 0x44e8, 0x44e8, 0x44e8, 0x44e8, 0x44e8, 0x44e8, 0x44e8, + 0x44e8, 0x44e8, 0x44e8, 0x44e8, 0x44e9, 0x44e9, 0x44e9, 0x44e9, + 0x44e9, 0x44e9, 0x44e9, 0x44e9, 0x44e9, 0x44e9, 0x44e9, 0x44ea, + 0x44ea, 0x44ea, 0x44ea, 0x44ea, 0x44ea, 0x44ea, 0x44ea, 0x44ea, + 0x44ea, 0x44ea, 0x44ea, 0x44eb, 0x44eb, 0x44eb, 0x44eb, 0x44eb, + 0x44eb, 0x44eb, 0x44eb, 0x44eb, 0x44eb, 0x44eb, 0x44eb, 0x44ec, + 0x44ec, 0x44ec, 0x44ec, 0x44ec, 0x44ec, 0x44ec, 0x44ec, 0x44ec, + 0x44ec, 0x44ec, 0x44ec, 0x44ed, 0x44ed, 0x44ed, 0x44ed, 0x44ed, + 0x44ed, 0x44ed, 0x44ed, 0x44ed, 0x44ed, 0x44ed, 0x44ed, 0x44ee, + 0x44ee, 0x44ee, 0x44ee, 0x44ee, 0x44ee, 0x44ee, 0x44ee, 0x44ee, + 0x44ee, 0x44ee, 0x44ee, 0x44ef, 0x44ef, 0x44ef, 0x44ef, 0x44ef, + 0x44ef, 0x44ef, 0x44ef, 0x44ef, 0x44ef, 0x44ef, 0x44ef, 0x44ef, + 0x44f0, 0x44f0, 0x44f0, 0x44f0, 0x44f0, 0x44f0, 0x44f0, 0x44f0, + 0x44f0, 0x44f0, 0x44f0, 0x44f0, 0x44f1, 0x44f1, 0x44f1, 0x44f1, + 0x44f1, 0x44f1, 0x44f1, 0x44f1, 0x44f1, 0x44f1, 0x44f1, 0x44f1, + 0x44f1, 0x44f2, 0x44f2, 0x44f2, 0x44f2, 0x44f2, 0x44f2, 0x44f2, + 0x44f2, 0x44f2, 0x44f2, 0x44f2, 0x44f2, 0x44f3, 0x44f3, 0x44f3, + 0x44f3, 0x44f3, 0x44f3, 0x44f3, 0x44f3, 0x44f3, 0x44f3, 0x44f3, + 0x44f3, 0x44f3, 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f4, + 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f4, 0x44f5, + 0x44f5, 0x44f5, 0x44f5, 0x44f5, 0x44f5, 0x44f5, 0x44f5, 0x44f5, + 0x44f5, 0x44f5, 0x44f5, 0x44f5, 0x44f6, 0x44f6, 0x44f6, 0x44f6, + 0x44f6, 0x44f6, 0x44f6, 0x44f6, 0x44f6, 0x44f6, 0x44f6, 0x44f6, + 0x44f6, 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f7, + 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f7, 0x44f8, 0x44f8, + 0x44f8, 0x44f8, 0x44f8, 0x44f8, 0x44f8, 0x44f8, 0x44f8, 0x44f8, + 0x44f8, 0x44f8, 0x44f8, 0x44f8, 0x44f9, 0x44f9, 0x44f9, 0x44f9, + 0x44f9, 0x44f9, 0x44f9, 0x44f9, 0x44f9, 0x44f9, 0x44f9, 0x44f9, + 0x44f9, 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fa, + 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fa, 0x44fb, 0x44fb, + 0x44fb, 0x44fb, 0x44fb, 0x44fb, 0x44fb, 0x44fb, 0x44fb, 0x44fb, + 0x44fb, 0x44fb, 0x44fb, 0x44fb, 0x44fc, 0x44fc, 0x44fc, 0x44fc, + 0x44fc, 0x44fc, 0x44fc, 0x44fc, 0x44fc, 0x44fc, 0x44fc, 0x44fc, + 0x44fc, 0x44fc, 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, + 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, 0x44fd, + 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, + 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44fe, 0x44ff, 0x44ff, + 0x44ff, 0x44ff, 0x44ff, 0x44ff, 0x44ff, 0x44ff, 0x44ff, 0x44ff, + 0x44ff, 0x44ff, 0x44ff, 0x44ff, 0x4500, 0x4500, 0x4500, 0x4500, + 0x4500, 0x4500, 0x4500, 0x4500, 0x4500, 0x4500, 0x4500, 0x4500, + 0x4500, 0x4500, 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, + 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, 0x4501, + 0x4501, 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, + 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, 0x4502, 0x4503, + 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, + 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, 0x4503, 0x4504, 0x4504, + 0x4504, 0x4504, 0x4504, 0x4504, 0x4504, 0x4504, 0x4504, 0x4504, + 0x4504, 0x4504, 0x4504, 0x4504, 0x4505, 0x4505, 0x4505, 0x4505, + 0x4505, 0x4505, 0x4505, 0x4505, 0x4505, 0x4505, 0x4505, 0x4505, + 0x4505, 0x4505, 0x4505, 0x4506, 0x4506, 0x4506, 0x4506, 0x4506, + 0x4506, 0x4506, 0x4506, 0x4506, 0x4506, 0x4506, 0x4506, 0x4506, + 0x4506, 0x4506, 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, + 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, 0x4507, + 0x4507, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, + 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, 0x4508, + 0x4508, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, + 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, 0x4509, + 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, + 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, 0x450a, + 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, + 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450b, 0x450c, + 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, + 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450c, 0x450d, + 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, + 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450d, 0x450e, + 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, + 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450e, 0x450f, + 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, + 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x450f, 0x4510, + 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, + 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, 0x4510, + 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, + 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, 0x4511, + 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, + 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, 0x4512, + 0x4512, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, + 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, 0x4513, + 0x4513, 0x4513, 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, + 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, 0x4514, + 0x4514, 0x4514, 0x4514, 0x4515, 0x4515, 0x4515, 0x4515, 0x4515, + 0x4515, 0x4515, 0x4515, 0x4515, 0x4515, 0x4515, 0x4515, 0x4515, + 0x4515, 0x4515, 0x4515, 0x4515, 0x4516, 0x4516, 0x4516, 0x4516, + 0x4516, 0x4516, 0x4516, 0x4516, 0x4516, 0x4516, 0x4516, 0x4516, + 0x4516, 0x4516, 0x4516, 0x4516, 0x4516, 0x4517, 0x4517, 0x4517, + 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, + 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, 0x4517, 0x4518, 0x4518, + 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, + 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, 0x4518, + 0x4519, 0x4519, 0x4519, 0x4519, 0x4519, 0x4519, 0x4519, 0x4519, + 0x4519, 0x451a, 0x451a, 0x451a, 0x451a, 0x451a, 0x451a, 0x451a, + 0x451a, 0x451a, 0x451b, 0x451b, 0x451b, 0x451b, 0x451b, 0x451b, + 0x451b, 0x451b, 0x451b, 0x451c, 0x451c, 0x451c, 0x451c, 0x451c, + 0x451c, 0x451c, 0x451c, 0x451c, 0x451d, 0x451d, 0x451d, 0x451d, + 0x451d, 0x451d, 0x451d, 0x451d, 0x451d, 0x451e, 0x451e, 0x451e, + 0x451e, 0x451e, 0x451e, 0x451e, 0x451e, 0x451e, 0x451f, 0x451f, + 0x451f, 0x451f, 0x451f, 0x451f, 0x451f, 0x451f, 0x451f, 0x451f, + 0x4520, 0x4520, 0x4520, 0x4520, 0x4520, 0x4520, 0x4520, 0x4520, + 0x4520, 0x4521, 0x4521, 0x4521, 0x4521, 0x4521, 0x4521, 0x4521, + 0x4521, 0x4521, 0x4522, 0x4522, 0x4522, 0x4522, 0x4522, 0x4522, + 0x4522, 0x4522, 0x4522, 0x4522, 0x4523, 0x4523, 0x4523, 0x4523, + 0x4523, 0x4523, 0x4523, 0x4523, 0x4523, 0x4523, 0x4524, 0x4524, + 0x4524, 0x4524, 0x4524, 0x4524, 0x4524, 0x4524, 0x4524, 0x4525, + 0x4525, 0x4525, 0x4525, 0x4525, 0x4525, 0x4525, 0x4525, 0x4525, + 0x4525, 0x4526, 0x4526, 0x4526, 0x4526, 0x4526, 0x4526, 0x4526, + 0x4526, 0x4526, 0x4526, 0x4527, 0x4527, 0x4527, 0x4527, 0x4527, + 0x4527, 0x4527, 0x4527, 0x4527, 0x4527, 0x4528, 0x4528, 0x4528, + 0x4528, 0x4528, 0x4528, 0x4528, 0x4528, 0x4528, 0x4528, 0x4529, + 0x4529, 0x4529, 0x4529, 0x4529, 0x4529, 0x4529, 0x4529, 0x4529, + 0x4529, 0x452a, 0x452a, 0x452a, 0x452a, 0x452a, 0x452a, 0x452a, + 0x452a, 0x452a, 0x452a, 0x452b, 0x452b, 0x452b, 0x452b, 0x452b, + 0x452b, 0x452b, 0x452b, 0x452b, 0x452b, 0x452b, 0x452c, 0x452c, + 0x452c, 0x452c, 0x452c, 0x452c, 0x452c, 0x452c, 0x452c, 0x452c, + 0x452d, 0x452d, 0x452d, 0x452d, 0x452d, 0x452d, 0x452d, 0x452d, + 0x452d, 0x452d, 0x452d, 0x452e, 0x452e, 0x452e, 0x452e, 0x452e, + 0x452e, 0x452e, 0x452e, 0x452e, 0x452e, 0x452f, 0x452f, 0x452f, + 0x452f, 0x452f, 0x452f, 0x452f, 0x452f, 0x452f, 0x452f, 0x452f, + 0x4530, 0x4530, 0x4530, 0x4530, 0x4530, 0x4530, 0x4530, 0x4530, + 0x4530, 0x4530, 0x4530, 0x4531, 0x4531, 0x4531, 0x4531, 0x4531, + 0x4531, 0x4531, 0x4531, 0x4531, 0x4531, 0x4532, 0x4532, 0x4532, + 0x4532, 0x4532, 0x4532, 0x4532, 0x4532, 0x4532, 0x4532, 0x4532, + 0x4533, 0x4533, 0x4533, 0x4533, 0x4533, 0x4533, 0x4533, 0x4533, + 0x4533, 0x4533, 0x4533, 0x4534, 0x4534, 0x4534, 0x4534, 0x4534, + 0x4534, 0x4534, 0x4534, 0x4534, 0x4534, 0x4534, 0x4534, 0x4535, + 0x4535, 0x4535, 0x4535, 0x4535, 0x4535, 0x4535, 0x4535, 0x4535, + 0x4535, 0x4535, 0x4536, 0x4536, 0x4536, 0x4536, 0x4536, 0x4536, + 0x4536, 0x4536, 0x4536, 0x4536, 0x4536, 0x4537, 0x4537, 0x4537, + 0x4537, 0x4537, 0x4537, 0x4537, 0x4537, 0x4537, 0x4537, 0x4537, + 0x4537, 0x4538, 0x4538, 0x4538, 0x4538, 0x4538, 0x4538, 0x4538, + 0x4538, 0x4538, 0x4538, 0x4538, 0x4539, 0x4539, 0x4539, 0x4539, + 0x4539, 0x4539, 0x4539, 0x4539, 0x4539, 0x4539, 0x4539, 0x4539, + 0x453a, 0x453a, 0x453a, 0x453a, 0x453a, 0x453a, 0x453a, 0x453a, + 0x453a, 0x453a, 0x453a, 0x453b, 0x453b, 0x453b, 0x453b, 0x453b, + 0x453b, 0x453b, 0x453b, 0x453b, 0x453b, 0x453b, 0x453b, 0x453c, + 0x453c, 0x453c, 0x453c, 0x453c, 0x453c, 0x453c, 0x453c, 0x453c, + 0x453c, 0x453c, 0x453c, 0x453d, 0x453d, 0x453d, 0x453d, 0x453d, + 0x453d, 0x453d, 0x453d, 0x453d, 0x453d, 0x453d, 0x453d, 0x453e, + 0x453e, 0x453e, 0x453e, 0x453e, 0x453e, 0x453e, 0x453e, 0x453e, + 0x453e, 0x453e, 0x453e, 0x453f, 0x453f, 0x453f, 0x453f, 0x453f, + 0x453f, 0x453f, 0x453f, 0x453f, 0x453f, 0x453f, 0x453f, 0x453f, + 0x4540, 0x4540, 0x4540, 0x4540, 0x4540, 0x4540, 0x4540, 0x4540, + 0x4540, 0x4540, 0x4540, 0x4540, 0x4541, 0x4541, 0x4541, 0x4541, + 0x4541, 0x4541, 0x4541, 0x4541, 0x4541, 0x4541, 0x4541, 0x4541, + 0x4541, 0x4542, 0x4542, 0x4542, 0x4542, 0x4542, 0x4542, 0x4542, + 0x4542, 0x4542, 0x4542, 0x4542, 0x4542, 0x4543, 0x4543, 0x4543, + 0x4543, 0x4543, 0x4543, 0x4543, 0x4543, 0x4543, 0x4543, 0x4543, + 0x4543, 0x4543, 0x4544, 0x4544, 0x4544, 0x4544, 0x4544, 0x4544, + 0x4544, 0x4544, 0x4544, 0x4544, 0x4544, 0x4544, 0x4544, 0x4545, + 0x4545, 0x4545, 0x4545, 0x4545, 0x4545, 0x4545, 0x4545, 0x4545, + 0x4545, 0x4545, 0x4545, 0x4546, 0x4546, 0x4546, 0x4546, 0x4546, + 0x4546, 0x4546, 0x4546, 0x4546, 0x4546, 0x4546, 0x4546, 0x4546, + 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, + 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, 0x4547, 0x4548, 0x4548, + 0x4548, 0x4548, 0x4548, 0x4548, 0x4548, 0x4548, 0x4548, 0x4548, + 0x4548, 0x4548, 0x4548, 0x4549, 0x4549, 0x4549, 0x4549, 0x4549, + 0x4549, 0x4549, 0x4549, 0x4549, 0x4549, 0x4549, 0x4549, 0x4549, + 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, + 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, 0x454a, 0x454b, 0x454b, + 0x454b, 0x454b, 0x454b, 0x454b, 0x454b, 0x454b, 0x454b, 0x454b, + 0x454b, 0x454b, 0x454b, 0x454c, 0x454c, 0x454c, 0x454c, 0x454c, + 0x454c, 0x454c, 0x454c, 0x454c, 0x454c, 0x454c, 0x454c, 0x454c, + 0x454c, 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, + 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, 0x454d, 0x454e, + 0x454e, 0x454e, 0x454e, 0x454e, 0x454e, 0x454e, 0x454e, 0x454e, + 0x454e, 0x454e, 0x454e, 0x454e, 0x454e, 0x454f, 0x454f, 0x454f, + 0x454f, 0x454f, 0x454f, 0x454f, 0x454f, 0x454f, 0x454f, 0x454f, + 0x454f, 0x454f, 0x454f, 0x4550, 0x4550, 0x4550, 0x4550, 0x4550, + 0x4550, 0x4550, 0x4550, 0x4550, 0x4550, 0x4550, 0x4550, 0x4550, + 0x4550, 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, + 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, 0x4551, 0x4552, + 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, + 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, 0x4552, 0x4553, 0x4553, + 0x4553, 0x4553, 0x4553, 0x4553, 0x4553, 0x4553, 0x4553, 0x4553, + 0x4553, 0x4553, 0x4553, 0x4553, 0x4554, 0x4554, 0x4554, 0x4554, + 0x4554, 0x4554, 0x4554, 0x4554, 0x4554, 0x4554, 0x4554, 0x4554, + 0x4554, 0x4554, 0x4554, 0x4555, 0x4555, 0x4555, 0x4555, 0x4555, + 0x4555, 0x4555, 0x4555, 0x4555, 0x4555, 0x4555, 0x4555, 0x4555, + 0x4555, 0x4555, 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, + 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, 0x4556, + 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, + 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, 0x4557, + 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, + 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4558, 0x4559, + 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, + 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, 0x4559, 0x455a, 0x455a, + 0x455a, 0x455a, 0x455a, 0x455a, 0x455a, 0x455a, 0x455a, 0x455a, + 0x455a, 0x455a, 0x455a, 0x455a, 0x455a, 0x455b, 0x455b, 0x455b, + 0x455b, 0x455b, 0x455b, 0x455b, 0x455b, 0x455b, 0x455b, 0x455b, + 0x455b, 0x455b, 0x455b, 0x455b, 0x455b, 0x455c, 0x455c, 0x455c, + 0x455c, 0x455c, 0x455c, 0x455c, 0x455c, 0x455c, 0x455c, 0x455c, + 0x455c, 0x455c, 0x455c, 0x455c, 0x455c, 0x455d, 0x455d, 0x455d, + 0x455d, 0x455d, 0x455d, 0x455d, 0x455d, 0x455d, 0x455d, 0x455d, + 0x455d, 0x455d, 0x455d, 0x455d, 0x455d, 0x455e, 0x455e, 0x455e, + 0x455e, 0x455e, 0x455e, 0x455e, 0x455e, 0x455e, 0x455e, 0x455e, + 0x455e, 0x455e, 0x455e, 0x455e, 0x455e, 0x455f, 0x455f, 0x455f, + 0x455f, 0x455f, 0x455f, 0x455f, 0x455f, 0x455f, 0x455f, 0x455f, + 0x455f, 0x455f, 0x455f, 0x455f, 0x455f, 0x4560, 0x4560, 0x4560, + 0x4560, 0x4560, 0x4560, 0x4560, 0x4560, 0x4560, 0x4560, 0x4560, + 0x4560, 0x4560, 0x4560, 0x4560, 0x4560, 0x4561, 0x4561, 0x4561, + 0x4561, 0x4561, 0x4561, 0x4561, 0x4561, 0x4561, 0x4561, 0x4561, + 0x4561, 0x4561, 0x4561, 0x4561, 0x4561, 0x4562, 0x4562, 0x4562, + 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, + 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, 0x4562, 0x4563, 0x4563, + 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, + 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4563, 0x4564, + 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, + 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4564, 0x4565, + 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, + 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, 0x4565, + 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, + 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, 0x4566, + 0x4566, 0x4566, 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, + 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, 0x4567, + 0x4567, 0x4567, 0x4567, 0x4568, 0x4568, 0x4568, 0x4568, 0x4568, + 0x4568, 0x4568, 0x4568, 0x4568, 0x4568, 0x4568, 0x4568, 0x4568, + 0x4568, 0x4568, 0x4568, 0x4568, 0x4569, 0x4569, 0x4569, 0x4569, + 0x4569, 0x4569, 0x4569, 0x4569, 0x4569, 0x4569, 0x4569, 0x4569, + 0x4569, 0x4569, 0x4569, 0x456a, 0x456a, 0x456a, 0x456a, 0x456a, + 0x456a, 0x456a, 0x456a, 0x456a, 0x456b, 0x456b, 0x456b, 0x456b, + 0x456b, 0x456b, 0x456b, 0x456b, 0x456b, 0x456c, 0x456c, 0x456c, + 0x456c, 0x456c, 0x456c, 0x456c, 0x456c, 0x456c, 0x456d, 0x456d, + 0x456d, 0x456d, 0x456d, 0x456d, 0x456d, 0x456d, 0x456d, 0x456e, + 0x456e, 0x456e, 0x456e, 0x456e, 0x456e, 0x456e, 0x456e, 0x456e, + 0x456f, 0x456f, 0x456f, 0x456f, 0x456f, 0x456f, 0x456f, 0x456f, + 0x456f, 0x4570, 0x4570, 0x4570, 0x4570, 0x4570, 0x4570, 0x4570, + 0x4570, 0x4570, 0x4570, 0x4571, 0x4571, 0x4571, 0x4571, 0x4571, + 0x4571, 0x4571, 0x4571, 0x4571, 0x4572, 0x4572, 0x4572, 0x4572, + 0x4572, 0x4572, 0x4572, 0x4572, 0x4572, 0x4572, 0x4573, 0x4573, + 0x4573, 0x4573, 0x4573, 0x4573, 0x4573, 0x4573, 0x4573, 0x4574, + 0x4574, 0x4574, 0x4574, 0x4574, 0x4574, 0x4574, 0x4574, 0x4574, + 0x4574, 0x4575, 0x4575, 0x4575, 0x4575, 0x4575, 0x4575, 0x4575, + 0x4575, 0x4575, 0x4575, 0x4576, 0x4576, 0x4576, 0x4576, 0x4576, + 0x4576, 0x4576, 0x4576, 0x4576, 0x4577, 0x4577, 0x4577, 0x4577, + 0x4577, 0x4577, 0x4577, 0x4577, 0x4577, 0x4577, 0x4578, 0x4578, + 0x4578, 0x4578, 0x4578, 0x4578, 0x4578, 0x4578, 0x4578, 0x4578, + 0x4579, 0x4579, 0x4579, 0x4579, 0x4579, 0x4579, 0x4579, 0x4579, + 0x4579, 0x4579, 0x457a, 0x457a, 0x457a, 0x457a, 0x457a, 0x457a, + 0x457a, 0x457a, 0x457a, 0x457a, 0x457a, 0x457b, 0x457b, 0x457b, + 0x457b, 0x457b, 0x457b, 0x457b, 0x457b, 0x457b, 0x457b, 0x457c, + 0x457c, 0x457c, 0x457c, 0x457c, 0x457c, 0x457c, 0x457c, 0x457c, + 0x457c, 0x457d, 0x457d, 0x457d, 0x457d, 0x457d, 0x457d, 0x457d, + 0x457d, 0x457d, 0x457d, 0x457d, 0x457e, 0x457e, 0x457e, 0x457e, + 0x457e, 0x457e, 0x457e, 0x457e, 0x457e, 0x457e, 0x457f, 0x457f, + 0x457f, 0x457f, 0x457f, 0x457f, 0x457f, 0x457f, 0x457f, 0x457f, + 0x457f, 0x4580, 0x4580, 0x4580, 0x4580, 0x4580, 0x4580, 0x4580, + 0x4580, 0x4580, 0x4580, 0x4580, 0x4581, 0x4581, 0x4581, 0x4581, + 0x4581, 0x4581, 0x4581, 0x4581, 0x4581, 0x4581, 0x4582, 0x4582, + 0x4582, 0x4582, 0x4582, 0x4582, 0x4582, 0x4582, 0x4582, 0x4582, + 0x4582, 0x4583, 0x4583, 0x4583, 0x4583, 0x4583, 0x4583, 0x4583, + 0x4583, 0x4583, 0x4583, 0x4583, 0x4584, 0x4584, 0x4584, 0x4584, + 0x4584, 0x4584, 0x4584, 0x4584, 0x4584, 0x4584, 0x4584, 0x4585, + 0x4585, 0x4585, 0x4585, 0x4585, 0x4585, 0x4585, 0x4585, 0x4585, + 0x4585, 0x4585, 0x4586, 0x4586, 0x4586, 0x4586, 0x4586, 0x4586, + 0x4586, 0x4586, 0x4586, 0x4586, 0x4586, 0x4586, 0x4587, 0x4587, + 0x4587, 0x4587, 0x4587, 0x4587, 0x4587, 0x4587, 0x4587, 0x4587, + 0x4587, 0x4588, 0x4588, 0x4588, 0x4588, 0x4588, 0x4588, 0x4588, + 0x4588, 0x4588, 0x4588, 0x4588, 0x4588, 0x4589, 0x4589, 0x4589, + 0x4589, 0x4589, 0x4589, 0x4589, 0x4589, 0x4589, 0x4589, 0x4589, + 0x458a, 0x458a, 0x458a, 0x458a, 0x458a, 0x458a, 0x458a, 0x458a, + 0x458a, 0x458a, 0x458a, 0x458a, 0x458b, 0x458b, 0x458b, 0x458b, + 0x458b, 0x458b, 0x458b, 0x458b, 0x458b, 0x458b, 0x458b, 0x458b, + 0x458c, 0x458c, 0x458c, 0x458c, 0x458c, 0x458c, 0x458c, 0x458c, + 0x458c, 0x458c, 0x458c, 0x458d, 0x458d, 0x458d, 0x458d, 0x458d, + 0x458d, 0x458d, 0x458d, 0x458d, 0x458d, 0x458d, 0x458d, 0x458e, + 0x458e, 0x458e, 0x458e, 0x458e, 0x458e, 0x458e, 0x458e, 0x458e, + 0x458e, 0x458e, 0x458e, 0x458f, 0x458f, 0x458f, 0x458f, 0x458f, + 0x458f, 0x458f, 0x458f, 0x458f, 0x458f, 0x458f, 0x458f, 0x458f, + 0x4590, 0x4590, 0x4590, 0x4590, 0x4590, 0x4590, 0x4590, 0x4590, + 0x4590, 0x4590, 0x4590, 0x4590, 0x4591, 0x4591, 0x4591, 0x4591, + 0x4591, 0x4591, 0x4591, 0x4591, 0x4591, 0x4591, 0x4591, 0x4591, + 0x4592, 0x4592, 0x4592, 0x4592, 0x4592, 0x4592, 0x4592, 0x4592, + 0x4592, 0x4592, 0x4592, 0x4592, 0x4592, 0x4593, 0x4593, 0x4593, + 0x4593, 0x4593, 0x4593, 0x4593, 0x4593, 0x4593, 0x4593, 0x4593, + 0x4593, 0x4594, 0x4594, 0x4594, 0x4594, 0x4594, 0x4594, 0x4594, + 0x4594, 0x4594, 0x4594, 0x4594, 0x4594, 0x4594, 0x4595, 0x4595, + 0x4595, 0x4595, 0x4595, 0x4595, 0x4595, 0x4595, 0x4595, 0x4595, + 0x4595, 0x4595, 0x4595, 0x4596, 0x4596, 0x4596, 0x4596, 0x4596, + 0x4596, 0x4596, 0x4596, 0x4596, 0x4596, 0x4596, 0x4596, 0x4596, + 0x4597, 0x4597, 0x4597, 0x4597, 0x4597, 0x4597, 0x4597, 0x4597, + 0x4597, 0x4597, 0x4597, 0x4597, 0x4597, 0x4598, 0x4598, 0x4598, + 0x4598, 0x4598, 0x4598, 0x4598, 0x4598, 0x4598, 0x4598, 0x4598, + 0x4598, 0x4598, 0x4599, 0x4599, 0x4599, 0x4599, 0x4599, 0x4599, + 0x4599, 0x4599, 0x4599, 0x4599, 0x4599, 0x4599, 0x4599, 0x459a, + 0x459a, 0x459a, 0x459a, 0x459a, 0x459a, 0x459a, 0x459a, 0x459a, + 0x459a, 0x459a, 0x459a, 0x459a, 0x459a, 0x459b, 0x459b, 0x459b, + 0x459b, 0x459b, 0x459b, 0x459b, 0x459b, 0x459b, 0x459b, 0x459b, + 0x459b, 0x459b, 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, + 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, 0x459c, + 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, + 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, 0x459d, 0x459e, 0x459e, + 0x459e, 0x459e, 0x459e, 0x459e, 0x459e, 0x459e, 0x459e, 0x459e, + 0x459e, 0x459e, 0x459e, 0x459f, 0x459f, 0x459f, 0x459f, 0x459f, + 0x459f, 0x459f, 0x459f, 0x459f, 0x459f, 0x459f, 0x459f, 0x459f, + 0x459f, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, + 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a0, 0x45a1, + 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, + 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a1, 0x45a2, 0x45a2, + 0x45a2, 0x45a2, 0x45a2, 0x45a2, 0x45a2, 0x45a2, 0x45a2, 0x45a2, + 0x45a2, 0x45a2, 0x45a2, 0x45a2, 0x45a3, 0x45a3, 0x45a3, 0x45a3, + 0x45a3, 0x45a3, 0x45a3, 0x45a3, 0x45a3, 0x45a3, 0x45a3, 0x45a3, + 0x45a3, 0x45a3, 0x45a3, 0x45a4, 0x45a4, 0x45a4, 0x45a4, 0x45a4, + 0x45a4, 0x45a4, 0x45a4, 0x45a4, 0x45a4, 0x45a4, 0x45a4, 0x45a4, + 0x45a4, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, + 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, 0x45a5, + 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, + 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a6, 0x45a7, + 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, + 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a7, 0x45a8, 0x45a8, + 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a8, + 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a8, 0x45a9, 0x45a9, 0x45a9, + 0x45a9, 0x45a9, 0x45a9, 0x45a9, 0x45a9, 0x45a9, 0x45a9, 0x45a9, + 0x45a9, 0x45a9, 0x45a9, 0x45a9, 0x45aa, 0x45aa, 0x45aa, 0x45aa, + 0x45aa, 0x45aa, 0x45aa, 0x45aa, 0x45aa, 0x45aa, 0x45aa, 0x45aa, + 0x45aa, 0x45aa, 0x45aa, 0x45ab, 0x45ab, 0x45ab, 0x45ab, 0x45ab, + 0x45ab, 0x45ab, 0x45ab, 0x45ab, 0x45ab, 0x45ab, 0x45ab, 0x45ab, + 0x45ab, 0x45ab, 0x45ab, 0x45ac, 0x45ac, 0x45ac, 0x45ac, 0x45ac, + 0x45ac, 0x45ac, 0x45ac, 0x45ac, 0x45ac, 0x45ac, 0x45ac, 0x45ac, + 0x45ac, 0x45ac, 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, + 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, 0x45ad, + 0x45ad, 0x45ad, 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, + 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, 0x45ae, + 0x45ae, 0x45ae, 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, + 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, 0x45af, + 0x45af, 0x45af, 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, + 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, 0x45b0, + 0x45b0, 0x45b0, 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, + 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, 0x45b1, + 0x45b1, 0x45b1, 0x45b1, 0x45b2, 0x45b2, 0x45b2, 0x45b2, 0x45b2, + 0x45b2, 0x45b2, 0x45b2, 0x45b2, 0x45b2, 0x45b2, 0x45b2, 0x45b2, + 0x45b2, 0x45b2, 0x45b2, 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b3, + 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b3, + 0x45b3, 0x45b3, 0x45b3, 0x45b3, 0x45b4, 0x45b4, 0x45b4, 0x45b4, + 0x45b4, 0x45b4, 0x45b4, 0x45b4, 0x45b4, 0x45b4, 0x45b4, 0x45b4, + 0x45b4, 0x45b4, 0x45b4, 0x45b4, 0x45b5, 0x45b5, 0x45b5, 0x45b5, + 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b5, + 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b5, 0x45b6, 0x45b6, 0x45b6, + 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, + 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b6, 0x45b7, 0x45b7, + 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, + 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b7, 0x45b8, + 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, + 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, 0x45b8, + 0x45b8, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, + 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, 0x45b9, + 0x45b9, 0x45b9, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, + 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45bb, 0x45bb, + 0x45bb, 0x45bb, 0x45bb, 0x45bb, 0x45bb, 0x45bb, 0x45bb, 0x45bc, + 0x45bc, 0x45bc, 0x45bc, 0x45bc, 0x45bc, 0x45bc, 0x45bc, 0x45bc, + 0x45bd, 0x45bd, 0x45bd, 0x45bd, 0x45bd, 0x45bd, 0x45bd, 0x45bd, + 0x45bd, 0x45be, 0x45be, 0x45be, 0x45be, 0x45be, 0x45be, 0x45be, + 0x45be, 0x45be, 0x45bf, 0x45bf, 0x45bf, 0x45bf, 0x45bf, 0x45bf, + 0x45bf, 0x45bf, 0x45bf, 0x45c0, 0x45c0, 0x45c0, 0x45c0, 0x45c0, + 0x45c0, 0x45c0, 0x45c0, 0x45c0, 0x45c0, 0x45c1, 0x45c1, 0x45c1, + 0x45c1, 0x45c1, 0x45c1, 0x45c1, 0x45c1, 0x45c1, 0x45c2, 0x45c2, + 0x45c2, 0x45c2, 0x45c2, 0x45c2, 0x45c2, 0x45c2, 0x45c2, 0x45c3, + 0x45c3, 0x45c3, 0x45c3, 0x45c3, 0x45c3, 0x45c3, 0x45c3, 0x45c3, + 0x45c3, 0x45c4, 0x45c4, 0x45c4, 0x45c4, 0x45c4, 0x45c4, 0x45c4, + 0x45c4, 0x45c4, 0x45c4, 0x45c5, 0x45c5, 0x45c5, 0x45c5, 0x45c5, + 0x45c5, 0x45c5, 0x45c5, 0x45c5, 0x45c6, 0x45c6, 0x45c6, 0x45c6, + 0x45c6, 0x45c6, 0x45c6, 0x45c6, 0x45c6, 0x45c6, 0x45c7, 0x45c7, + 0x45c7, 0x45c7, 0x45c7, 0x45c7, 0x45c7, 0x45c7, 0x45c7, 0x45c7, + 0x45c8, 0x45c8, 0x45c8, 0x45c8, 0x45c8, 0x45c8, 0x45c8, 0x45c8, + 0x45c8, 0x45c8, 0x45c9, 0x45c9, 0x45c9, 0x45c9, 0x45c9, 0x45c9, + 0x45c9, 0x45c9, 0x45c9, 0x45c9, 0x45ca, 0x45ca, 0x45ca, 0x45ca, + 0x45ca, 0x45ca, 0x45ca, 0x45ca, 0x45ca, 0x45ca, 0x45cb, 0x45cb, + 0x45cb, 0x45cb, 0x45cb, 0x45cb, 0x45cb, 0x45cb, 0x45cb, 0x45cb, + 0x45cc, 0x45cc, 0x45cc, 0x45cc, 0x45cc, 0x45cc, 0x45cc, 0x45cc, + 0x45cc, 0x45cc, 0x45cd, 0x45cd, 0x45cd, 0x45cd, 0x45cd, 0x45cd, + 0x45cd, 0x45cd, 0x45cd, 0x45cd, 0x45cd, 0x45ce, 0x45ce, 0x45ce, + 0x45ce, 0x45ce, 0x45ce, 0x45ce, 0x45ce, 0x45ce, 0x45ce, 0x45cf, + 0x45cf, 0x45cf, 0x45cf, 0x45cf, 0x45cf, 0x45cf, 0x45cf, 0x45cf, + 0x45cf, 0x45cf, 0x45d0, 0x45d0, 0x45d0, 0x45d0, 0x45d0, 0x45d0, + 0x45d0, 0x45d0, 0x45d0, 0x45d0, 0x45d1, 0x45d1, 0x45d1, 0x45d1, + 0x45d1, 0x45d1, 0x45d1, 0x45d1, 0x45d1, 0x45d1, 0x45d1, 0x45d2, + 0x45d2, 0x45d2, 0x45d2, 0x45d2, 0x45d2, 0x45d2, 0x45d2, 0x45d2, + 0x45d2, 0x45d2, 0x45d3, 0x45d3, 0x45d3, 0x45d3, 0x45d3, 0x45d3, + 0x45d3, 0x45d3, 0x45d3, 0x45d3, 0x45d3, 0x45d4, 0x45d4, 0x45d4, + 0x45d4, 0x45d4, 0x45d4, 0x45d4, 0x45d4, 0x45d4, 0x45d4, 0x45d4, + 0x45d5, 0x45d5, 0x45d5, 0x45d5, 0x45d5, 0x45d5, 0x45d5, 0x45d5, + 0x45d5, 0x45d5, 0x45d5, 0x45d6, 0x45d6, 0x45d6, 0x45d6, 0x45d6, + 0x45d6, 0x45d6, 0x45d6, 0x45d6, 0x45d6, 0x45d6, 0x45d7, 0x45d7, + 0x45d7, 0x45d7, 0x45d7, 0x45d7, 0x45d7, 0x45d7, 0x45d7, 0x45d7, + 0x45d7, 0x45d7, 0x45d8, 0x45d8, 0x45d8, 0x45d8, 0x45d8, 0x45d8, + 0x45d8, 0x45d8, 0x45d8, 0x45d8, 0x45d8, 0x45d9, 0x45d9, 0x45d9, + 0x45d9, 0x45d9, 0x45d9, 0x45d9, 0x45d9, 0x45d9, 0x45d9, 0x45d9, + 0x45da, 0x45da, 0x45da, 0x45da, 0x45da, 0x45da, 0x45da, 0x45da, + 0x45da, 0x45da, 0x45da, 0x45da, 0x45db, 0x45db, 0x45db, 0x45db, + 0x45db, 0x45db, 0x45db, 0x45db, 0x45db, 0x45db, 0x45db, 0x45db, + 0x45dc, 0x45dc, 0x45dc, 0x45dc, 0x45dc, 0x45dc, 0x45dc, 0x45dc, + 0x45dc, 0x45dc, 0x45dc, 0x45dc, 0x45dd, 0x45dd, 0x45dd, 0x45dd, + 0x45dd, 0x45dd, 0x45dd, 0x45dd, 0x45dd, 0x45dd, 0x45dd, 0x45dd, + 0x45de, 0x45de, 0x45de, 0x45de, 0x45de, 0x45de, 0x45de, 0x45de, + 0x45de, 0x45de, 0x45de, 0x45de, 0x45df, 0x45df, 0x45df, 0x45df, + 0x45df, 0x45df, 0x45df, 0x45df, 0x45df, 0x45df, 0x45df, 0x45df, + 0x45e0, 0x45e0, 0x45e0, 0x45e0, 0x45e0, 0x45e0, 0x45e0, 0x45e0, + 0x45e0, 0x45e0, 0x45e0, 0x45e0, 0x45e1, 0x45e1, 0x45e1, 0x45e1, + 0x45e1, 0x45e1, 0x45e1, 0x45e1, 0x45e1, 0x45e1, 0x45e1, 0x45e1, + 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e2, + 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e2, 0x45e3, 0x45e3, 0x45e3, + 0x45e3, 0x45e3, 0x45e3, 0x45e3, 0x45e3, 0x45e3, 0x45e3, 0x45e3, + 0x45e3, 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e4, + 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e4, 0x45e5, 0x45e5, + 0x45e5, 0x45e5, 0x45e5, 0x45e5, 0x45e5, 0x45e5, 0x45e5, 0x45e5, + 0x45e5, 0x45e5, 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e6, + 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e6, 0x45e7, + 0x45e7, 0x45e7, 0x45e7, 0x45e7, 0x45e7, 0x45e7, 0x45e7, 0x45e7, + 0x45e7, 0x45e7, 0x45e7, 0x45e7, 0x45e8, 0x45e8, 0x45e8, 0x45e8, + 0x45e8, 0x45e8, 0x45e8, 0x45e8, 0x45e8, 0x45e8, 0x45e8, 0x45e8, + 0x45e8, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, + 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45e9, 0x45ea, + 0x45ea, 0x45ea, 0x45ea, 0x45ea, 0x45ea, 0x45ea, 0x45ea, 0x45ea, + 0x45ea, 0x45ea, 0x45ea, 0x45ea, 0x45eb, 0x45eb, 0x45eb, 0x45eb, + 0x45eb, 0x45eb, 0x45eb, 0x45eb, 0x45eb, 0x45eb, 0x45eb, 0x45eb, + 0x45eb, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, + 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ec, 0x45ed, + 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ed, + 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ed, 0x45ee, 0x45ee, 0x45ee, + 0x45ee, 0x45ee, 0x45ee, 0x45ee, 0x45ee, 0x45ee, 0x45ee, 0x45ee, + 0x45ee, 0x45ee, 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, + 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, 0x45ef, + 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, + 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f0, 0x45f1, 0x45f1, + 0x45f1, 0x45f1, 0x45f1, 0x45f1, 0x45f1, 0x45f1, 0x45f1, 0x45f1, + 0x45f1, 0x45f1, 0x45f1, 0x45f1, 0x45f2, 0x45f2, 0x45f2, 0x45f2, + 0x45f2, 0x45f2, 0x45f2, 0x45f2, 0x45f2, 0x45f2, 0x45f2, 0x45f2, + 0x45f2, 0x45f2, 0x45f2, 0x45f3, 0x45f3, 0x45f3, 0x45f3, 0x45f3, + 0x45f3, 0x45f3, 0x45f3, 0x45f3, 0x45f3, 0x45f3, 0x45f3, 0x45f3, + 0x45f3, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, + 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f4, 0x45f5, + 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, + 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f5, 0x45f6, 0x45f6, + 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f6, + 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f6, 0x45f7, 0x45f7, 0x45f7, + 0x45f7, 0x45f7, 0x45f7, 0x45f7, 0x45f7, 0x45f7, 0x45f7, 0x45f7, + 0x45f7, 0x45f7, 0x45f7, 0x45f7, 0x45f8, 0x45f8, 0x45f8, 0x45f8, + 0x45f8, 0x45f8, 0x45f8, 0x45f8, 0x45f8, 0x45f8, 0x45f8, 0x45f8, + 0x45f8, 0x45f8, 0x45f8, 0x45f9, 0x45f9, 0x45f9, 0x45f9, 0x45f9, + 0x45f9, 0x45f9, 0x45f9, 0x45f9, 0x45f9, 0x45f9, 0x45f9, 0x45f9, + 0x45f9, 0x45f9, 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, + 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, 0x45fa, + 0x45fa, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, + 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, 0x45fb, + 0x45fb, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, + 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, 0x45fc, + 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, + 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, 0x45fd, + 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, + 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, 0x45fe, + 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, + 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, 0x45ff, + 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, + 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, 0x4600, + 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, + 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, 0x4601, + 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, + 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, 0x4602, + 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, + 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, 0x4603, + 0x4603, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, + 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, 0x4604, + 0x4604, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, + 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, 0x4605, + 0x4605, 0x4605, 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, + 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, 0x4606, + 0x4606, 0x4606, 0x4606, 0x4607, 0x4607, 0x4607, 0x4607, 0x4607, + 0x4607, 0x4607, 0x4607, 0x4607, 0x4607, 0x4607, 0x4607, 0x4607, + 0x4607, 0x4607, 0x4607, 0x4607, 0x4608, 0x4608, 0x4608, 0x4608, + 0x4608, 0x4608, 0x4608, 0x4608, 0x4608, 0x4608, 0x4608, 0x4608, + 0x4608, 0x4608, 0x4608, 0x4608, 0x4608, 0x4609, 0x4609, 0x4609, + 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, + 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x4609, 0x460a, + 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, + 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, 0x460a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9043, 0x91d7, 0x9305, 0x9400, 0x946d, 0x94cf, 0x9529, + 0x957b, 0x95c8, 0x9611, 0x9656, 0x9697, 0x96d6, 0x9712, 0x974b, + 0x9783, 0x97b9, 0x97ed, 0x9810, 0x9828, 0x9840, 0x9857, 0x986e, + 0x9884, 0x989a, 0x98af, 0x98c4, 0x98d8, 0x98ec, 0x98ff, 0x9913, + 0x9926, 0x9938, 0x994a, 0x995c, 0x996e, 0x997f, 0x9991, 0x99a2, + 0x99b2, 0x99c3, 0x99d3, 0x99e3, 0x99f3, 0x9a02, 0x9a12, 0x9a21, + 0x9a30, 0x9a3f, 0x9a4e, 0x9a5c, 0x9a6b, 0x9a79, 0x9a87, 0x9a95, + 0x9aa3, 0x9ab1, 0x9abe, 0x9acc, 0x9ad9, 0x9ae7, 0x9af4, 0x9b01, + 0x9b0d, 0x9b1a, 0x9b27, 0x9b33, 0x9b40, 0x9b4c, 0x9b59, 0x9b65, + 0x9b71, 0x9b7d, 0x9b89, 0x9b94, 0x9ba0, 0x9bac, 0x9bb7, 0x9bc3, + 0x9bce, 0x9bda, 0x9be5, 0x9bf0, 0x9bfb, 0x9c03, 0x9c09, 0x9c0e, + 0x9c13, 0x9c19, 0x9c1e, 0x9c23, 0x9c29, 0x9c2e, 0x9c33, 0x9c38, + 0x9c3d, 0x9c43, 0x9c48, 0x9c4d, 0x9c52, 0x9c57, 0x9c5c, 0x9c61, + 0x9c66, 0x9c6b, 0x9c6f, 0x9c74, 0x9c79, 0x9c7e, 0x9c83, 0x9c87, + 0x9c8c, 0x9c91, 0x9c96, 0x9c9a, 0x9c9f, 0x9ca4, 0x9ca8, 0x9cad, + 0x9cb1, 0x9cb6, 0x9cba, 0x9cbf, 0x9cc3, 0x9cc8, 0x9ccc, 0x9cd1, + 0x9cd5, 0x9cd9, 0x9cde, 0x9ce2, 0x9ce7, 0x9ceb, 0x9cef, 0x9cf3, + 0x9cf8, 0x9cfc, 0x9d00, 0x9d04, 0x9d09, 0x9d0d, 0x9d11, 0x9d15, + 0x9d19, 0x9d1d, 0x9d21, 0x9d25, 0x9d29, 0x9d2e, 0x9d32, 0x9d36, + 0x9d3a, 0x9d3e, 0x9d42, 0x9d46, 0x9d49, 0x9d4d, 0x9d51, 0x9d55, + 0x9d59, 0x9d5d, 0x9d61, 0x9d65, 0x9d69, 0x9d6c, 0x9d70, 0x9d74, + 0x9d78, 0x9d7c, 0x9d7f, 0x9d83, 0x9d87, 0x9d8b, 0x9d8e, 0x9d92, + 0x9d96, 0x9d99, 0x9d9d, 0x9da1, 0x9da4, 0x9da8, 0x9dac, 0x9daf, + 0x9db3, 0x9db7, 0x9dba, 0x9dbe, 0x9dc1, 0x9dc5, 0x9dc8, 0x9dcc, + 0x9dcf, 0x9dd3, 0x9dd6, 0x9dda, 0x9ddd, 0x9de1, 0x9de4, 0x9de8, + 0x9deb, 0x9def, 0x9df2, 0x9df6, 0x9df9, 0x9dfc, 0x9e00, 0x9e03, + 0x9e07, 0x9e0a, 0x9e0d, 0x9e11, 0x9e14, 0x9e17, 0x9e1b, 0x9e1e, + 0x9e21, 0x9e25, 0x9e28, 0x9e2b, 0x9e2e, 0x9e32, 0x9e35, 0x9e38, + 0x9e3b, 0x9e3f, 0x9e42, 0x9e45, 0x9e48, 0x9e4b, 0x9e4f, 0x9e52, + 0x9e55, 0x9e58, 0x9e5b, 0x9e5f, 0x9e62, 0x9e65, 0x9e68, 0x9e6b, + 0x9e6e, 0x9e71, 0x9e74, 0x9e78, 0x9e7b, 0x9e7e, 0x9e81, 0x9e84, + 0x9e87, 0x9e8a, 0x9e8d, 0x9e90, 0x9e93, 0x9e96, 0x9e99, 0x9e9c, + 0x9e9f, 0x9ea2, 0x9ea5, 0x9ea8, 0x9eab, 0x9eae, 0x9eb1, 0x9eb4, + 0x9eb7, 0x9eba, 0x9ebd, 0x9ec0, 0x9ec3, 0x9ec6, 0x9ec9, 0x9ecc, + 0x9ecf, 0x9ed2, 0x9ed4, 0x9ed7, 0x9eda, 0x9edd, 0x9ee0, 0x9ee3, + 0x9ee6, 0x9ee9, 0x9eeb, 0x9eee, 0x9ef1, 0x9ef4, 0x9ef7, 0x9efa, + 0x9efc, 0x9eff, 0x9f02, 0x9f05, 0x9f08, 0x9f0b, 0x9f0d, 0x9f10, + 0x9f13, 0x9f16, 0x9f18, 0x9f1b, 0x9f1e, 0x9f21, 0x9f23, 0x9f26, + 0x9f29, 0x9f2c, 0x9f2e, 0x9f31, 0x9f34, 0x9f37, 0x9f39, 0x9f3c, + 0x9f3f, 0x9f41, 0x9f44, 0x9f47, 0x9f4a, 0x9f4c, 0x9f4f, 0x9f52, + 0x9f54, 0x9f57, 0x9f5a, 0x9f5c, 0x9f5f, 0x9f61, 0x9f64, 0x9f67, + 0x9f69, 0x9f6c, 0x9f6f, 0x9f71, 0x9f74, 0x9f76, 0x9f79, 0x9f7c, + 0x9f7e, 0x9f81, 0x9f83, 0x9f86, 0x9f89, 0x9f8b, 0x9f8e, 0x9f90, + 0x9f93, 0x9f95, 0x9f98, 0x9f9b, 0x9f9d, 0x9fa0, 0x9fa2, 0x9fa5, + 0x9fa7, 0x9faa, 0x9fac, 0x9faf, 0x9fb1, 0x9fb4, 0x9fb6, 0x9fb9, + 0x9fbb, 0x9fbe, 0x9fc0, 0x9fc3, 0x9fc5, 0x9fc8, 0x9fca, 0x9fcd, + 0x9fcf, 0x9fd2, 0x9fd4, 0x9fd7, 0x9fd9, 0x9fdc, 0x9fde, 0x9fe0, + 0x9fe3, 0x9fe5, 0x9fe8, 0x9fea, 0x9fed, 0x9fef, 0x9ff1, 0x9ff4, + 0x9ff6, 0x9ff9, 0x9ffb, 0x9ffe, 0xa000, 0xa001, 0xa002, 0xa004, + 0xa005, 0xa006, 0xa007, 0xa008, 0xa00a, 0xa00b, 0xa00c, 0xa00d, + 0xa00e, 0xa00f, 0xa011, 0xa012, 0xa013, 0xa014, 0xa015, 0xa016, + 0xa018, 0xa019, 0xa01a, 0xa01b, 0xa01c, 0xa01d, 0xa01f, 0xa020, + 0xa021, 0xa022, 0xa023, 0xa024, 0xa026, 0xa027, 0xa028, 0xa029, + 0xa02a, 0xa02b, 0xa02c, 0xa02e, 0xa02f, 0xa030, 0xa031, 0xa032, + 0xa033, 0xa034, 0xa035, 0xa037, 0xa038, 0xa039, 0xa03a, 0xa03b, + 0xa03c, 0xa03d, 0xa03e, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, + 0xa045, 0xa046, 0xa047, 0xa048, 0xa04a, 0xa04b, 0xa04c, 0xa04d, + 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa055, 0xa056, + 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, + 0xa05f, 0xa060, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, + 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, + 0xa070, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, + 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa07f, 0xa080, + 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 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, 0xa0c7, 0xa0c8, + 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, + 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, + 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0de, 0xa0df, + 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, + 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ee, + 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, + 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fb, 0xa0fc, 0xa0fd, + 0xa0fe, 0xa0ff, 0xa100, 0xa101, 0xa102, 0xa103, 0xa104, 0xa105, + 0xa106, 0xa106, 0xa107, 0xa108, 0xa109, 0xa10a, 0xa10b, 0xa10c, + 0xa10d, 0xa10e, 0xa10f, 0xa110, 0xa110, 0xa111, 0xa112, 0xa113, + 0xa114, 0xa115, 0xa116, 0xa117, 0xa118, 0xa119, 0xa119, 0xa11a, + 0xa11b, 0xa11c, 0xa11d, 0xa11e, 0xa11f, 0xa120, 0xa121, 0xa121, + 0xa122, 0xa123, 0xa124, 0xa125, 0xa126, 0xa127, 0xa128, 0xa129, + 0xa129, 0xa12a, 0xa12b, 0xa12c, 0xa12d, 0xa12e, 0xa12f, 0xa130, + 0xa130, 0xa131, 0xa132, 0xa133, 0xa134, 0xa135, 0xa136, 0xa137, + 0xa137, 0xa138, 0xa139, 0xa13a, 0xa13b, 0xa13c, 0xa13d, 0xa13e, + 0xa13e, 0xa13f, 0xa140, 0xa141, 0xa142, 0xa143, 0xa144, 0xa144, + 0xa145, 0xa146, 0xa147, 0xa148, 0xa149, 0xa14a, 0xa14b, 0xa14b, + 0xa14c, 0xa14d, 0xa14e, 0xa14f, 0xa150, 0xa151, 0xa151, 0xa152, + 0xa153, 0xa154, 0xa155, 0xa156, 0xa156, 0xa157, 0xa158, 0xa159, + 0xa15a, 0xa15b, 0xa15c, 0xa15c, 0xa15d, 0xa15e, 0xa15f, 0xa160, + 0xa161, 0xa161, 0xa162, 0xa163, 0xa164, 0xa165, 0xa166, 0xa166, + 0xa167, 0xa168, 0xa169, 0xa16a, 0xa16b, 0xa16b, 0xa16c, 0xa16d, + 0xa16e, 0xa16f, 0xa170, 0xa170, 0xa171, 0xa172, 0xa173, 0xa174, + 0xa175, 0xa175, 0xa176, 0xa177, 0xa178, 0xa179, 0xa17a, 0xa17a, + 0xa17b, 0xa17c, 0xa17d, 0xa17e, 0xa17e, 0xa17f, 0xa180, 0xa181, + 0xa182, 0xa183, 0xa183, 0xa184, 0xa185, 0xa186, 0xa187, 0xa187, + 0xa188, 0xa189, 0xa18a, 0xa18b, 0xa18c, 0xa18c, 0xa18d, 0xa18e, + 0xa18f, 0xa190, 0xa190, 0xa191, 0xa192, 0xa193, 0xa194, 0xa194, + 0xa195, 0xa196, 0xa197, 0xa198, 0xa198, 0xa199, 0xa19a, 0xa19b, + 0xa19c, 0xa19c, 0xa19d, 0xa19e, 0xa19f, 0xa1a0, 0xa1a0, 0xa1a1, + 0xa1a2, 0xa1a3, 0xa1a4, 0xa1a4, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, + 0xa1a8, 0xa1a9, 0xa1aa, 0xa1ab, 0xa1ac, 0xa1ac, 0xa1ad, 0xa1ae, + 0xa1af, 0xa1af, 0xa1b0, 0xa1b1, 0xa1b2, 0xa1b3, 0xa1b3, 0xa1b4, + 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1ba, + 0xa1bb, 0xa1bc, 0xa1bd, 0xa1be, 0xa1be, 0xa1bf, 0xa1c0, 0xa1c1, + 0xa1c1, 0xa1c2, 0xa1c3, 0xa1c4, 0xa1c5, 0xa1c5, 0xa1c6, 0xa1c7, + 0xa1c8, 0xa1c8, 0xa1c9, 0xa1ca, 0xa1cb, 0xa1cb, 0xa1cc, 0xa1cd, + 0xa1ce, 0xa1cf, 0xa1cf, 0xa1d0, 0xa1d1, 0xa1d2, 0xa1d2, 0xa1d3, + 0xa1d4, 0xa1d5, 0xa1d5, 0xa1d6, 0xa1d7, 0xa1d8, 0xa1d8, 0xa1d9, + 0xa1da, 0xa1db, 0xa1db, 0xa1dc, 0xa1dd, 0xa1de, 0xa1df, 0xa1df, + 0xa1e0, 0xa1e1, 0xa1e2, 0xa1e2, 0xa1e3, 0xa1e4, 0xa1e5, 0xa1e5, + 0xa1e6, 0xa1e7, 0xa1e8, 0xa1e8, 0xa1e9, 0xa1ea, 0xa1eb, 0xa1eb, + 0xa1ec, 0xa1ed, 0xa1ee, 0xa1ee, 0xa1ef, 0xa1f0, 0xa1f1, 0xa1f1, + 0xa1f2, 0xa1f3, 0xa1f4, 0xa1f4, 0xa1f5, 0xa1f6, 0xa1f7, 0xa1f7, + 0xa1f8, 0xa1f9, 0xa1f9, 0xa1fa, 0xa1fb, 0xa1fc, 0xa1fc, 0xa1fd, + 0xa1fe, 0xa1ff, 0xa1ff, 0xa200, 0xa201, 0xa202, 0xa202, 0xa203, + 0xa204, 0xa205, 0xa205, 0xa206, 0xa207, 0xa207, 0xa208, 0xa209, + 0xa20a, 0xa20a, 0xa20b, 0xa20c, 0xa20d, 0xa20d, 0xa20e, 0xa20f, + 0xa210, 0xa210, 0xa211, 0xa212, 0xa212, 0xa213, 0xa214, 0xa215, + 0xa215, 0xa216, 0xa217, 0xa218, 0xa218, 0xa219, 0xa21a, 0xa21a, + 0xa21b, 0xa21c, 0xa21d, 0xa21d, 0xa21e, 0xa21f, 0xa21f, 0xa220, + 0xa221, 0xa222, 0xa222, 0xa223, 0xa224, 0xa224, 0xa225, 0xa226, + 0xa227, 0xa227, 0xa228, 0xa229, 0xa22a, 0xa22a, 0xa22b, 0xa22c, + 0xa22c, 0xa22d, 0xa22e, 0xa22e, 0xa22f, 0xa230, 0xa231, 0xa231, + 0xa232, 0xa233, 0xa233, 0xa234, 0xa235, 0xa236, 0xa236, 0xa237, + 0xa238, 0xa238, 0xa239, 0xa23a, 0xa23b, 0xa23b, 0xa23c, 0xa23d, + 0xa23d, 0xa23e, 0xa23f, 0xa23f, 0xa240, 0xa241, 0xa242, 0xa242, + 0xa243, 0xa244, 0xa244, 0xa245, 0xa246, 0xa246, 0xa247, 0xa248, + 0xa249, 0xa249, 0xa24a, 0xa24b, 0xa24b, 0xa24c, 0xa24d, 0xa24d, + 0xa24e, 0xa24f, 0xa250, 0xa250, 0xa251, 0xa252, 0xa252, 0xa253, + 0xa254, 0xa254, 0xa255, 0xa256, 0xa256, 0xa257, 0xa258, 0xa259, + 0xa259, 0xa25a, 0xa25b, 0xa25b, 0xa25c, 0xa25d, 0xa25d, 0xa25e, + 0xa25f, 0xa25f, 0xa260, 0xa261, 0xa261, 0xa262, 0xa263, 0xa264, + 0xa264, 0xa265, 0xa266, 0xa266, 0xa267, 0xa268, 0xa268, 0xa269, + 0xa26a, 0xa26a, 0xa26b, 0xa26c, 0xa26c, 0xa26d, 0xa26e, 0xa26e, + 0xa26f, 0xa270, 0xa270, 0xa271, 0xa272, 0xa272, 0xa273, 0xa274, + 0xa274, 0xa275, 0xa276, 0xa277, 0xa277, 0xa278, 0xa279, 0xa279, + 0xa27a, 0xa27b, 0xa27b, 0xa27c, 0xa27d, 0xa27d, 0xa27e, 0xa27f, + 0xa27f, 0xa280, 0xa281, 0xa281, 0xa282, 0xa283, 0xa283, 0xa284, + 0xa285, 0xa285, 0xa286, 0xa287, 0xa287, 0xa288, 0xa289, 0xa289, + 0xa28a, 0xa28b, 0xa28b, 0xa28c, 0xa28d, 0xa28d, 0xa28e, 0xa28f, + 0xa28f, 0xa290, 0xa291, 0xa291, 0xa292, 0xa293, 0xa293, 0xa294, + 0xa295, 0xa295, 0xa296, 0xa297, 0xa297, 0xa298, 0xa298, 0xa299, + 0xa29a, 0xa29a, 0xa29b, 0xa29c, 0xa29c, 0xa29d, 0xa29e, 0xa29e, + 0xa29f, 0xa2a0, 0xa2a0, 0xa2a1, 0xa2a2, 0xa2a2, 0xa2a3, 0xa2a4, + 0xa2a4, 0xa2a5, 0xa2a6, 0xa2a6, 0xa2a7, 0xa2a8, 0xa2a8, 0xa2a9, + 0xa2aa, 0xa2aa, 0xa2ab, 0xa2ab, 0xa2ac, 0xa2ad, 0xa2ad, 0xa2ae, + 0xa2af, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b3, + 0xa2b4, 0xa2b5, 0xa2b5, 0xa2b6, 0xa2b6, 0xa2b7, 0xa2b8, 0xa2b8, + 0xa2b9, 0xa2ba, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bc, 0xa2bd, 0xa2be, + 0xa2be, 0xa2bf, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c1, 0xa2c2, 0xa2c3, + 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c5, 0xa2c6, 0xa2c6, 0xa2c7, 0xa2c8, + 0xa2c8, 0xa2c9, 0xa2ca, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cc, 0xa2cd, + 0xa2cd, 0xa2ce, 0xa2cf, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d1, 0xa2d2, + 0xa2d3, 0xa2d3, 0xa2d4, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d6, 0xa2d7, + 0xa2d8, 0xa2d8, 0xa2d9, 0xa2d9, 0xa2da, 0xa2db, 0xa2db, 0xa2dc, + 0xa2dd, 0xa2dd, 0xa2de, 0xa2de, 0xa2df, 0xa2e0, 0xa2e0, 0xa2e1, + 0xa2e2, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e4, 0xa2e5, 0xa2e5, 0xa2e6, + 0xa2e7, 0xa2e7, 0xa2e8, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2ea, 0xa2eb, + 0xa2ec, 0xa2ec, 0xa2ed, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2ef, 0xa2f0, + 0xa2f1, 0xa2f1, 0xa2f2, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f4, 0xa2f5, + 0xa2f6, 0xa2f6, 0xa2f7, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2f9, 0xa2fa, + 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fc, 0xa2fd, 0xa2fe, 0xa2fe, 0xa2ff, + 0xa2ff, 0xa300, 0xa301, 0xa301, 0xa302, 0xa302, 0xa303, 0xa304, + 0xa304, 0xa305, 0xa305, 0xa306, 0xa307, 0xa307, 0xa308, 0xa309, + 0xa309, 0xa30a, 0xa30a, 0xa30b, 0xa30c, 0xa30c, 0xa30d, 0xa30d, + 0xa30e, 0xa30f, 0xa30f, 0xa310, 0xa310, 0xa311, 0xa312, 0xa312, + 0xa313, 0xa313, 0xa314, 0xa315, 0xa315, 0xa316, 0xa316, 0xa317, + 0xa318, 0xa318, 0xa319, 0xa319, 0xa31a, 0xa31b, 0xa31b, 0xa31c, + 0xa31d, 0xa31d, 0xa31e, 0xa31e, 0xa31f, 0xa320, 0xa320, 0xa321, + 0xa321, 0xa322, 0xa323, 0xa323, 0xa324, 0xa324, 0xa325, 0xa325, + 0xa326, 0xa327, 0xa327, 0xa328, 0xa328, 0xa329, 0xa32a, 0xa32a, + 0xa32b, 0xa32b, 0xa32c, 0xa32d, 0xa32d, 0xa32e, 0xa32e, 0xa32f, + 0xa330, 0xa330, 0xa331, 0xa331, 0xa332, 0xa333, 0xa333, 0xa334, + 0xa334, 0xa335, 0xa336, 0xa336, 0xa337, 0xa337, 0xa338, 0xa339, + 0xa339, 0xa33a, 0xa33a, 0xa33b, 0xa33b, 0xa33c, 0xa33d, 0xa33d, + 0xa33e, 0xa33e, 0xa33f, 0xa340, 0xa340, 0xa341, 0xa341, 0xa342, + 0xa343, 0xa343, 0xa344, 0xa344, 0xa345, 0xa345, 0xa346, 0xa347, + 0xa347, 0xa348, 0xa348, 0xa349, 0xa34a, 0xa34a, 0xa34b, 0xa34b, + 0xa34c, 0xa34c, 0xa34d, 0xa34e, 0xa34e, 0xa34f, 0xa34f, 0xa350, + 0xa351, 0xa351, 0xa352, 0xa352, 0xa353, 0xa353, 0xa354, 0xa355, + 0xa355, 0xa356, 0xa356, 0xa357, 0xa357, 0xa358, 0xa359, 0xa359, + 0xa35a, 0xa35a, 0xa35b, 0xa35c, 0xa35c, 0xa35d, 0xa35d, 0xa35e, + 0xa35e, 0xa35f, 0xa360, 0xa360, 0xa361, 0xa361, 0xa362, 0xa362, + 0xa363, 0xa364, 0xa364, 0xa365, 0xa365, 0xa366, 0xa366, 0xa367, + 0xa368, 0xa368, 0xa369, 0xa369, 0xa36a, 0xa36a, 0xa36b, 0xa36c, + 0xa36c, 0xa36d, 0xa36d, 0xa36e, 0xa36e, 0xa36f, 0xa370, 0xa370, + 0xa371, 0xa371, 0xa372, 0xa372, 0xa373, 0xa374, 0xa374, 0xa375, + 0xa375, 0xa376, 0xa376, 0xa377, 0xa378, 0xa378, 0xa379, 0xa379, + 0xa37a, 0xa37a, 0xa37b, 0xa37c, 0xa37c, 0xa37d, 0xa37d, 0xa37e, + 0xa37e, 0xa37f, 0xa37f, 0xa380, 0xa381, 0xa381, 0xa382, 0xa382, + 0xa383, 0xa383, 0xa384, 0xa385, 0xa385, 0xa386, 0xa386, 0xa387, + 0xa387, 0xa388, 0xa388, 0xa389, 0xa38a, 0xa38a, 0xa38b, 0xa38b, + 0xa38c, 0xa38c, 0xa38d, 0xa38e, 0xa38e, 0xa38f, 0xa38f, 0xa390, + 0xa390, 0xa391, 0xa391, 0xa392, 0xa393, 0xa393, 0xa394, 0xa394, + 0xa395, 0xa395, 0xa396, 0xa396, 0xa397, 0xa398, 0xa398, 0xa399, + 0xa399, 0xa39a, 0xa39a, 0xa39b, 0xa39b, 0xa39c, 0xa39d, 0xa39d, + 0xa39e, 0xa39e, 0xa39f, 0xa39f, 0xa3a0, 0xa3a0, 0xa3a1, 0xa3a2, + 0xa3a2, 0xa3a3, 0xa3a3, 0xa3a4, 0xa3a4, 0xa3a5, 0xa3a5, 0xa3a6, + 0xa3a7, 0xa3a7, 0xa3a8, 0xa3a8, 0xa3a9, 0xa3a9, 0xa3aa, 0xa3aa, + 0xa3ab, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ad, 0xa3ae, 0xa3ae, 0xa3af, + 0xa3af, 0xa3b0, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b2, 0xa3b3, 0xa3b3, + 0xa3b4, 0xa3b4, 0xa3b5, 0xa3b5, 0xa3b6, 0xa3b6, 0xa3b7, 0xa3b8, + 0xa3b8, 0xa3b9, 0xa3b9, 0xa3ba, 0xa3ba, 0xa3bb, 0xa3bb, 0xa3bc, + 0xa3bc, 0xa3bd, 0xa3bd, 0xa3be, 0xa3bf, 0xa3bf, 0xa3c0, 0xa3c0, + 0xa3c1, 0xa3c1, 0xa3c2, 0xa3c2, 0xa3c3, 0xa3c3, 0xa3c4, 0xa3c5, + 0xa3c5, 0xa3c6, 0xa3c6, 0xa3c7, 0xa3c7, 0xa3c8, 0xa3c8, 0xa3c9, + 0xa3c9, 0xa3ca, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cc, 0xa3cd, 0xa3cd, + 0xa3ce, 0xa3ce, 0xa3cf, 0xa3cf, 0xa3d0, 0xa3d0, 0xa3d1, 0xa3d1, + 0xa3d2, 0xa3d3, 0xa3d3, 0xa3d4, 0xa3d4, 0xa3d5, 0xa3d5, 0xa3d6, + 0xa3d6, 0xa3d7, 0xa3d7, 0xa3d8, 0xa3d8, 0xa3d9, 0xa3da, 0xa3da, + 0xa3db, 0xa3db, 0xa3dc, 0xa3dc, 0xa3dd, 0xa3dd, 0xa3de, 0xa3de, + 0xa3df, 0xa3df, 0xa3e0, 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e2, 0xa3e3, + 0xa3e3, 0xa3e4, 0xa3e4, 0xa3e5, 0xa3e5, 0xa3e6, 0xa3e6, 0xa3e7, + 0xa3e7, 0xa3e8, 0xa3e8, 0xa3e9, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3eb, + 0xa3ec, 0xa3ec, 0xa3ed, 0xa3ed, 0xa3ee, 0xa3ee, 0xa3ef, 0xa3ef, + 0xa3f0, 0xa3f0, 0xa3f1, 0xa3f1, 0xa3f2, 0xa3f2, 0xa3f3, 0xa3f3, + 0xa3f4, 0xa3f5, 0xa3f5, 0xa3f6, 0xa3f6, 0xa3f7, 0xa3f7, 0xa3f8, + 0xa3f8, 0xa3f9, 0xa3f9, 0xa3fa, 0xa3fa, 0xa3fb, 0xa3fb, 0xa3fc, + 0xa3fc, 0xa3fd, 0xa3fd, 0xa3fe, 0xa3fe, 0xa3ff, 0xa400, 0xa400, + 0xa400, 0xa401, 0xa401, 0xa401, 0xa401, 0xa402, 0xa402, 0xa402, + 0xa402, 0xa403, 0xa403, 0xa403, 0xa403, 0xa404, 0xa404, 0xa404, + 0xa404, 0xa405, 0xa405, 0xa405, 0xa405, 0xa406, 0xa406, 0xa406, + 0xa407, 0xa407, 0xa407, 0xa407, 0xa408, 0xa408, 0xa408, 0xa408, + 0xa409, 0xa409, 0xa409, 0xa409, 0xa40a, 0xa40a, 0xa40a, 0xa40a, + 0xa40b, 0xa40b, 0xa40b, 0xa40b, 0xa40c, 0xa40c, 0xa40c, 0xa40c, + 0xa40d, 0xa40d, 0xa40d, 0xa40d, 0xa40e, 0xa40e, 0xa40e, 0xa40f, + 0xa40f, 0xa40f, 0xa40f, 0xa410, 0xa410, 0xa410, 0xa410, 0xa411, + 0xa411, 0xa411, 0xa411, 0xa412, 0xa412, 0xa412, 0xa412, 0xa413, + 0xa413, 0xa413, 0xa413, 0xa414, 0xa414, 0xa414, 0xa414, 0xa415, + 0xa415, 0xa415, 0xa415, 0xa416, 0xa416, 0xa416, 0xa416, 0xa417, + 0xa417, 0xa417, 0xa417, 0xa418, 0xa418, 0xa418, 0xa418, 0xa419, + 0xa419, 0xa419, 0xa419, 0xa41a, 0xa41a, 0xa41a, 0xa41b, 0xa41b, + 0xa41b, 0xa41b, 0xa41c, 0xa41c, 0xa41c, 0xa41c, 0xa41d, 0xa41d, + 0xa41d, 0xa41d, 0xa41e, 0xa41e, 0xa41e, 0xa41e, 0xa41f, 0xa41f, + 0xa41f, 0xa41f, 0xa420, 0xa420, 0xa420, 0xa420, 0xa421, 0xa421, + 0xa421, 0xa421, 0xa422, 0xa422, 0xa422, 0xa422, 0xa423, 0xa423, + 0xa423, 0xa423, 0xa424, 0xa424, 0xa424, 0xa424, 0xa425, 0xa425, + 0xa425, 0xa425, 0xa426, 0xa426, 0xa426, 0xa426, 0xa427, 0xa427, + 0xa427, 0xa427, 0xa428, 0xa428, 0xa428, 0xa428, 0xa429, 0xa429, + 0xa429, 0xa429, 0xa42a, 0xa42a, 0xa42a, 0xa42a, 0xa42b, 0xa42b, + 0xa42b, 0xa42b, 0xa42c, 0xa42c, 0xa42c, 0xa42c, 0xa42d, 0xa42d, + 0xa42d, 0xa42d, 0xa42e, 0xa42e, 0xa42e, 0xa42e, 0xa42f, 0xa42f, + 0xa42f, 0xa42f, 0xa430, 0xa430, 0xa430, 0xa430, 0xa431, 0xa431, + 0xa431, 0xa431, 0xa431, 0xa432, 0xa432, 0xa432, 0xa432, 0xa433, + 0xa433, 0xa433, 0xa433, 0xa434, 0xa434, 0xa434, 0xa434, 0xa435, + 0xa435, 0xa435, 0xa435, 0xa436, 0xa436, 0xa436, 0xa436, 0xa437, + 0xa437, 0xa437, 0xa437, 0xa438, 0xa438, 0xa438, 0xa438, 0xa439, + 0xa439, 0xa439, 0xa439, 0xa43a, 0xa43a, 0xa43a, 0xa43a, 0xa43b, + 0xa43b, 0xa43b, 0xa43b, 0xa43c, 0xa43c, 0xa43c, 0xa43c, 0xa43d, + 0xa43d, 0xa43d, 0xa43d, 0xa43e, 0xa43e, 0xa43e, 0xa43e, 0xa43e, + 0xa43f, 0xa43f, 0xa43f, 0xa43f, 0xa440, 0xa440, 0xa440, 0xa440, + 0xa441, 0xa441, 0xa441, 0xa441, 0xa442, 0xa442, 0xa442, 0xa442, + 0xa443, 0xa443, 0xa444, 0xa444, 0xa445, 0xa445, 0xa446, 0xa446, + 0xa446, 0xa447, 0xa447, 0xa448, 0xa448, 0xa449, 0xa449, 0xa44a, + 0xa44a, 0xa44b, 0xa44b, 0xa44c, 0xa44c, 0xa44d, 0xa44d, 0xa44e, + 0xa44e, 0xa44f, 0xa44f, 0xa450, 0xa450, 0xa451, 0xa451, 0xa451, + 0xa452, 0xa452, 0xa453, 0xa453, 0xa454, 0xa454, 0xa455, 0xa455, + 0xa456, 0xa456, 0xa457, 0xa457, 0xa458, 0xa458, 0xa459, 0xa459, + 0xa45a, 0xa45a, 0xa45a, 0xa45b, 0xa45b, 0xa45c, 0xa45c, 0xa45d, + 0xa45d, 0xa45e, 0xa45e, 0xa45f, 0xa45f, 0xa460, 0xa460, 0xa461, + 0xa461, 0xa462, 0xa462, 0xa462, 0xa463, 0xa463, 0xa464, 0xa464, + 0xa465, 0xa465, 0xa466, 0xa466, 0xa467, 0xa467, 0xa468, 0xa468, + 0xa469, 0xa469, 0xa469, 0xa46a, 0xa46a, 0xa46b, 0xa46b, 0xa46c, + 0xa46c, 0xa46d, 0xa46d, 0xa46e, 0xa46e, 0xa46f, 0xa46f, 0xa46f, + 0xa470, 0xa470, 0xa471, 0xa471, 0xa472, 0xa472, 0xa473, 0xa473, + 0xa474, 0xa474, 0xa475, 0xa475, 0xa475, 0xa476, 0xa476, 0xa477, + 0xa477, 0xa478, 0xa478, 0xa479, 0xa479, 0xa47a, 0xa47a, 0xa47a, + 0xa47b, 0xa47b, 0xa47c, 0xa47c, 0xa47d, 0xa47d, 0xa47e, 0xa47e, + 0xa47f, 0xa47f, 0xa47f, 0xa480, 0xa480, 0xa481, 0xa481, 0xa482, + 0xa482, 0xa483, 0xa483, 0xa484, 0xa484, 0xa484, 0xa485, 0xa485, + 0xa486, 0xa486, 0xa487, 0xa487, 0xa488, 0xa488, 0xa489, 0xa489, + 0xa489, 0xa48a, 0xa48a, 0xa48b, 0xa48b, 0xa48c, 0xa48c, 0xa48d, + 0xa48d, 0xa48d, 0xa48e, 0xa48e, 0xa48f, 0xa48f, 0xa490, 0xa490, + 0xa491, 0xa491, 0xa491, 0xa492, 0xa492, 0xa493, 0xa493, 0xa494, + 0xa494, 0xa495, 0xa495, 0xa495, 0xa496, 0xa496, 0xa497, 0xa497, + 0xa498, 0xa498, 0xa499, 0xa499, 0xa499, 0xa49a, 0xa49a, 0xa49b, + 0xa49b, 0xa49c, 0xa49c, 0xa49d, 0xa49d, 0xa49d, 0xa49e, 0xa49e, + 0xa49f, 0xa49f, 0xa4a0, 0xa4a0, 0xa4a0, 0xa4a1, 0xa4a1, 0xa4a2, + 0xa4a2, 0xa4a3, 0xa4a3, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a5, 0xa4a5, + 0xa4a6, 0xa4a6, 0xa4a7, 0xa4a7, 0xa4a7, 0xa4a8, 0xa4a8, 0xa4a9, + 0xa4a9, 0xa4aa, 0xa4aa, 0xa4ab, 0xa4ab, 0xa4ab, 0xa4ac, 0xa4ac, + 0xa4ad, 0xa4ad, 0xa4ae, 0xa4ae, 0xa4ae, 0xa4af, 0xa4af, 0xa4b0, + 0xa4b0, 0xa4b1, 0xa4b1, 0xa4b1, 0xa4b2, 0xa4b2, 0xa4b3, 0xa4b3, + 0xa4b4, 0xa4b4, 0xa4b4, 0xa4b5, 0xa4b5, 0xa4b6, 0xa4b6, 0xa4b7, + 0xa4b7, 0xa4b7, 0xa4b8, 0xa4b8, 0xa4b9, 0xa4b9, 0xa4ba, 0xa4ba, + 0xa4ba, 0xa4bb, 0xa4bb, 0xa4bc, 0xa4bc, 0xa4bd, 0xa4bd, 0xa4bd, + 0xa4be, 0xa4be, 0xa4bf, 0xa4bf, 0xa4c0, 0xa4c0, 0xa4c0, 0xa4c1, + 0xa4c1, 0xa4c2, 0xa4c2, 0xa4c3, 0xa4c3, 0xa4c3, 0xa4c4, 0xa4c4, + 0xa4c5, 0xa4c5, 0xa4c5, 0xa4c6, 0xa4c6, 0xa4c7, 0xa4c7, 0xa4c8, + 0xa4c8, 0xa4c8, 0xa4c9, 0xa4c9, 0xa4ca, 0xa4ca, 0xa4cb, 0xa4cb, + 0xa4cb, 0xa4cc, 0xa4cc, 0xa4cd, 0xa4cd, 0xa4cd, 0xa4ce, 0xa4ce, + 0xa4cf, 0xa4cf, 0xa4d0, 0xa4d0, 0xa4d0, 0xa4d1, 0xa4d1, 0xa4d2, + 0xa4d2, 0xa4d3, 0xa4d3, 0xa4d3, 0xa4d4, 0xa4d4, 0xa4d5, 0xa4d5, + 0xa4d5, 0xa4d6, 0xa4d6, 0xa4d7, 0xa4d7, 0xa4d8, 0xa4d8, 0xa4d8, + 0xa4d9, 0xa4d9, 0xa4da, 0xa4da, 0xa4da, 0xa4db, 0xa4db, 0xa4dc, + 0xa4dc, 0xa4dc, 0xa4dd, 0xa4dd, 0xa4de, 0xa4de, 0xa4df, 0xa4df, + 0xa4df, 0xa4e0, 0xa4e0, 0xa4e1, 0xa4e1, 0xa4e1, 0xa4e2, 0xa4e2, + 0xa4e3, 0xa4e3, 0xa4e3, 0xa4e4, 0xa4e4, 0xa4e5, 0xa4e5, 0xa4e6, + 0xa4e6, 0xa4e6, 0xa4e7, 0xa4e7, 0xa4e8, 0xa4e8, 0xa4e8, 0xa4e9, + 0xa4e9, 0xa4ea, 0xa4ea, 0xa4ea, 0xa4eb, 0xa4eb, 0xa4ec, 0xa4ec, + 0xa4ec, 0xa4ed, 0xa4ed, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ef, 0xa4ef, + 0xa4f0, 0xa4f0, 0xa4f1, 0xa4f1, 0xa4f1, 0xa4f2, 0xa4f2, 0xa4f3, + 0xa4f3, 0xa4f3, 0xa4f4, 0xa4f4, 0xa4f5, 0xa4f5, 0xa4f5, 0xa4f6, + 0xa4f6, 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f8, 0xa4f8, 0xa4f9, 0xa4f9, + 0xa4f9, 0xa4fa, 0xa4fa, 0xa4fb, 0xa4fb, 0xa4fb, 0xa4fc, 0xa4fc, + 0xa4fd, 0xa4fd, 0xa4fd, 0xa4fe, 0xa4fe, 0xa4ff, 0xa4ff, 0xa4ff, + 0xa500, 0xa500, 0xa501, 0xa501, 0xa501, 0xa502, 0xa502, 0xa503, + 0xa503, 0xa503, 0xa504, 0xa504, 0xa505, 0xa505, 0xa505, 0xa506, + 0xa506, 0xa507, 0xa507, 0xa507, 0xa508, 0xa508, 0xa509, 0xa509, + 0xa509, 0xa50a, 0xa50a, 0xa50b, 0xa50b, 0xa50b, 0xa50c, 0xa50c, + 0xa50d, 0xa50d, 0xa50d, 0xa50e, 0xa50e, 0xa50f, 0xa50f, 0xa50f, + 0xa510, 0xa510, 0xa510, 0xa511, 0xa511, 0xa512, 0xa512, 0xa512, + 0xa513, 0xa513, 0xa514, 0xa514, 0xa514, 0xa515, 0xa515, 0xa516, + 0xa516, 0xa516, 0xa517, 0xa517, 0xa518, 0xa518, 0xa518, 0xa519, + 0xa519, 0xa519, 0xa51a, 0xa51a, 0xa51b, 0xa51b, 0xa51b, 0xa51c, + 0xa51c, 0xa51d, 0xa51d, 0xa51d, 0xa51e, 0xa51e, 0xa51f, 0xa51f, + 0xa51f, 0xa520, 0xa520, 0xa520, 0xa521, 0xa521, 0xa522, 0xa522, + 0xa522, 0xa523, 0xa523, 0xa524, 0xa524, 0xa524, 0xa525, 0xa525, + 0xa526, 0xa526, 0xa526, 0xa527, 0xa527, 0xa527, 0xa528, 0xa528, + 0xa529, 0xa529, 0xa529, 0xa52a, 0xa52a, 0xa52b, 0xa52b, 0xa52b, + 0xa52c, 0xa52c, 0xa52c, 0xa52d, 0xa52d, 0xa52e, 0xa52e, 0xa52e, + 0xa52f, 0xa52f, 0xa52f, 0xa530, 0xa530, 0xa531, 0xa531, 0xa531, + 0xa532, 0xa532, 0xa533, 0xa533, 0xa533, 0xa534, 0xa534, 0xa534, + 0xa535, 0xa535, 0xa536, 0xa536, 0xa536, 0xa537, 0xa537, 0xa537, + 0xa538, 0xa538, 0xa539, 0xa539, 0xa539, 0xa53a, 0xa53a, 0xa53b, + 0xa53b, 0xa53b, 0xa53c, 0xa53c, 0xa53c, 0xa53d, 0xa53d, 0xa53e, + 0xa53e, 0xa53e, 0xa53f, 0xa53f, 0xa53f, 0xa540, 0xa540, 0xa541, + 0xa541, 0xa541, 0xa542, 0xa542, 0xa542, 0xa543, 0xa543, 0xa544, + 0xa544, 0xa544, 0xa545, 0xa545, 0xa545, 0xa546, 0xa546, 0xa547, + 0xa547, 0xa547, 0xa548, 0xa548, 0xa548, 0xa549, 0xa549, 0xa54a, + 0xa54a, 0xa54a, 0xa54b, 0xa54b, 0xa54b, 0xa54c, 0xa54c, 0xa54d, + 0xa54d, 0xa54d, 0xa54e, 0xa54e, 0xa54e, 0xa54f, 0xa54f, 0xa550, + 0xa550, 0xa550, 0xa551, 0xa551, 0xa551, 0xa552, 0xa552, 0xa553, + 0xa553, 0xa553, 0xa554, 0xa554, 0xa554, 0xa555, 0xa555, 0xa555, + 0xa556, 0xa556, 0xa557, 0xa557, 0xa557, 0xa558, 0xa558, 0xa558, + 0xa559, 0xa559, 0xa55a, 0xa55a, 0xa55a, 0xa55b, 0xa55b, 0xa55b, + 0xa55c, 0xa55c, 0xa55c, 0xa55d, 0xa55d, 0xa55e, 0xa55e, 0xa55e, + 0xa55f, 0xa55f, 0xa55f, 0xa560, 0xa560, 0xa561, 0xa561, 0xa561, + 0xa562, 0xa562, 0xa562, 0xa563, 0xa563, 0xa563, 0xa564, 0xa564, + 0xa565, 0xa565, 0xa565, 0xa566, 0xa566, 0xa566, 0xa567, 0xa567, + 0xa567, 0xa568, 0xa568, 0xa569, 0xa569, 0xa569, 0xa56a, 0xa56a, + 0xa56a, 0xa56b, 0xa56b, 0xa56b, 0xa56c, 0xa56c, 0xa56d, 0xa56d, + 0xa56d, 0xa56e, 0xa56e, 0xa56e, 0xa56f, 0xa56f, 0xa56f, 0xa570, + 0xa570, 0xa570, 0xa571, 0xa571, 0xa572, 0xa572, 0xa572, 0xa573, + 0xa573, 0xa573, 0xa574, 0xa574, 0xa574, 0xa575, 0xa575, 0xa576, + 0xa576, 0xa576, 0xa577, 0xa577, 0xa577, 0xa578, 0xa578, 0xa578, + 0xa579, 0xa579, 0xa579, 0xa57a, 0xa57a, 0xa57b, 0xa57b, 0xa57b, + 0xa57c, 0xa57c, 0xa57c, 0xa57d, 0xa57d, 0xa57d, 0xa57e, 0xa57e, + 0xa57e, 0xa57f, 0xa57f, 0xa580, 0xa580, 0xa580, 0xa581, 0xa581, + 0xa581, 0xa582, 0xa582, 0xa582, 0xa583, 0xa583, 0xa583, 0xa584, + 0xa584, 0xa585, 0xa585, 0xa585, 0xa586, 0xa586, 0xa586, 0xa587, + 0xa587, 0xa587, 0xa588, 0xa588, 0xa588, 0xa589, 0xa589, 0xa58a, + 0xa58a, 0xa58a, 0xa58b, 0xa58b, 0xa58b, 0xa58c, 0xa58c, 0xa58c, + 0xa58d, 0xa58d, 0xa58d, 0xa58e, 0xa58e, 0xa58e, 0xa58f, 0xa58f, + 0xa58f, 0xa590, 0xa590, 0xa591, 0xa591, 0xa591, 0xa592, 0xa592, + 0xa592, 0xa593, 0xa593, 0xa593, 0xa594, 0xa594, 0xa594, 0xa595, + 0xa595, 0xa595, 0xa596, 0xa596, 0xa597, 0xa597, 0xa597, 0xa598, + 0xa598, 0xa598, 0xa599, 0xa599, 0xa599, 0xa59a, 0xa59a, 0xa59a, + 0xa59b, 0xa59b, 0xa59b, 0xa59c, 0xa59c, 0xa59c, 0xa59d, 0xa59d, + 0xa59d, 0xa59e, 0xa59e, 0xa59f, 0xa59f, 0xa59f, 0xa5a0, 0xa5a0, + 0xa5a0, 0xa5a1, 0xa5a1, 0xa5a1, 0xa5a2, 0xa5a2, 0xa5a2, 0xa5a3, + 0xa5a3, 0xa5a3, 0xa5a4, 0xa5a4, 0xa5a4, 0xa5a5, 0xa5a5, 0xa5a5, + 0xa5a6, 0xa5a6, 0xa5a6, 0xa5a7, 0xa5a7, 0xa5a8, 0xa5a8, 0xa5a8, + 0xa5a9, 0xa5a9, 0xa5a9, 0xa5aa, 0xa5aa, 0xa5aa, 0xa5ab, 0xa5ab, + 0xa5ab, 0xa5ac, 0xa5ac, 0xa5ac, 0xa5ad, 0xa5ad, 0xa5ad, 0xa5ae, + 0xa5ae, 0xa5ae, 0xa5af, 0xa5af, 0xa5af, 0xa5b0, 0xa5b0, 0xa5b0, + 0xa5b1, 0xa5b1, 0xa5b1, 0xa5b2, 0xa5b2, 0xa5b2, 0xa5b3, 0xa5b3, + 0xa5b4, 0xa5b4, 0xa5b4, 0xa5b5, 0xa5b5, 0xa5b5, 0xa5b6, 0xa5b6, + 0xa5b6, 0xa5b7, 0xa5b7, 0xa5b7, 0xa5b8, 0xa5b8, 0xa5b8, 0xa5b9, + 0xa5b9, 0xa5b9, 0xa5ba, 0xa5ba, 0xa5ba, 0xa5bb, 0xa5bb, 0xa5bb, + 0xa5bc, 0xa5bc, 0xa5bc, 0xa5bd, 0xa5bd, 0xa5bd, 0xa5be, 0xa5be, + 0xa5be, 0xa5bf, 0xa5bf, 0xa5bf, 0xa5c0, 0xa5c0, 0xa5c0, 0xa5c1, + 0xa5c1, 0xa5c1, 0xa5c2, 0xa5c2, 0xa5c2, 0xa5c3, 0xa5c3, 0xa5c3, + 0xa5c4, 0xa5c4, 0xa5c4, 0xa5c5, 0xa5c5, 0xa5c5, 0xa5c6, 0xa5c6, + 0xa5c6, 0xa5c7, 0xa5c7, 0xa5c7, 0xa5c8, 0xa5c8, 0xa5c8, 0xa5c9, + 0xa5c9, 0xa5ca, 0xa5ca, 0xa5ca, 0xa5cb, 0xa5cb, 0xa5cb, 0xa5cc, + 0xa5cc, 0xa5cc, 0xa5cd, 0xa5cd, 0xa5cd, 0xa5ce, 0xa5ce, 0xa5ce, + 0xa5cf, 0xa5cf, 0xa5cf, 0xa5d0, 0xa5d0, 0xa5d0, 0xa5d1, 0xa5d1, + 0xa5d1, 0xa5d2, 0xa5d2, 0xa5d2, 0xa5d3, 0xa5d3, 0xa5d3, 0xa5d4, + 0xa5d4, 0xa5d4, 0xa5d5, 0xa5d5, 0xa5d5, 0xa5d6, 0xa5d6, 0xa5d6, + 0xa5d7, 0xa5d7, 0xa5d8, 0xa5d8, 0xa5d9, 0xa5da, 0xa5da, 0xa5db, + 0xa5dc, 0xa5dc, 0xa5dd, 0xa5de, 0xa5de, 0xa5df, 0xa5e0, 0xa5e0, + 0xa5e1, 0xa5e2, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e4, 0xa5e5, 0xa5e6, + 0xa5e6, 0xa5e7, 0xa5e8, 0xa5e8, 0xa5e9, 0xa5ea, 0xa5ea, 0xa5eb, + 0xa5ec, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ee, 0xa5ef, 0xa5ef, 0xa5f0, + 0xa5f1, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f5, + 0xa5f6, 0xa5f7, 0xa5f7, 0xa5f8, 0xa5f9, 0xa5f9, 0xa5fa, 0xa5fa, + 0xa5fb, 0xa5fc, 0xa5fc, 0xa5fd, 0xa5fe, 0xa5fe, 0xa5ff, 0xa600, + 0xa600, 0xa601, 0xa602, 0xa602, 0xa603, 0xa603, 0xa604, 0xa605, + 0xa605, 0xa606, 0xa607, 0xa607, 0xa608, 0xa609, 0xa609, 0xa60a, + 0xa60a, 0xa60b, 0xa60c, 0xa60c, 0xa60d, 0xa60e, 0xa60e, 0xa60f, + 0xa610, 0xa610, 0xa611, 0xa611, 0xa612, 0xa613, 0xa613, 0xa614, + 0xa615, 0xa615, 0xa616, 0xa617, 0xa617, 0xa618, 0xa618, 0xa619, + 0xa61a, 0xa61a, 0xa61b, 0xa61c, 0xa61c, 0xa61d, 0xa61d, 0xa61e, + 0xa61f, 0xa61f, 0xa620, 0xa621, 0xa621, 0xa622, 0xa622, 0xa623, + 0xa624, 0xa624, 0xa625, 0xa626, 0xa626, 0xa627, 0xa627, 0xa628, + 0xa629, 0xa629, 0xa62a, 0xa62b, 0xa62b, 0xa62c, 0xa62c, 0xa62d, + 0xa62e, 0xa62e, 0xa62f, 0xa630, 0xa630, 0xa631, 0xa631, 0xa632, + 0xa633, 0xa633, 0xa634, 0xa634, 0xa635, 0xa636, 0xa636, 0xa637, + 0xa638, 0xa638, 0xa639, 0xa639, 0xa63a, 0xa63b, 0xa63b, 0xa63c, + 0xa63c, 0xa63d, 0xa63e, 0xa63e, 0xa63f, 0xa640, 0xa640, 0xa641, + 0xa641, 0xa642, 0xa643, 0xa643, 0xa644, 0xa644, 0xa645, 0xa646, + 0xa646, 0xa647, 0xa647, 0xa648, 0xa649, 0xa649, 0xa64a, 0xa64a, + 0xa64b, 0xa64c, 0xa64c, 0xa64d, 0xa64e, 0xa64e, 0xa64f, 0xa64f, + 0xa650, 0xa651, 0xa651, 0xa652, 0xa652, 0xa653, 0xa654, 0xa654, + 0xa655, 0xa655, 0xa656, 0xa657, 0xa657, 0xa658, 0xa658, 0xa659, + 0xa65a, 0xa65a, 0xa65b, 0xa65b, 0xa65c, 0xa65d, 0xa65d, 0xa65e, + 0xa65e, 0xa65f, 0xa660, 0xa660, 0xa661, 0xa661, 0xa662, 0xa663, + 0xa663, 0xa664, 0xa664, 0xa665, 0xa666, 0xa666, 0xa667, 0xa667, + 0xa668, 0xa668, 0xa669, 0xa66a, 0xa66a, 0xa66b, 0xa66b, 0xa66c, + 0xa66d, 0xa66d, 0xa66e, 0xa66e, 0xa66f, 0xa670, 0xa670, 0xa671, + 0xa671, 0xa672, 0xa673, 0xa673, 0xa674, 0xa674, 0xa675, 0xa675, + 0xa676, 0xa677, 0xa677, 0xa678, 0xa678, 0xa679, 0xa67a, 0xa67a, + 0xa67b, 0xa67b, 0xa67c, 0xa67c, 0xa67d, 0xa67e, 0xa67e, 0xa67f, + 0xa67f, 0xa680, 0xa681, 0xa681, 0xa682, 0xa682, 0xa683, 0xa683, + 0xa684, 0xa685, 0xa685, 0xa686, 0xa686, 0xa687, 0xa688, 0xa688, + 0xa689, 0xa689, 0xa68a, 0xa68a, 0xa68b, 0xa68c, 0xa68c, 0xa68d, + 0xa68d, 0xa68e, 0xa68f, 0xa68f, 0xa690, 0xa690, 0xa691, 0xa691, + 0xa692, 0xa693, 0xa693, 0xa694, 0xa694, 0xa695, 0xa695, 0xa696, + 0xa697, 0xa697, 0xa698, 0xa698, 0xa699, 0xa699, 0xa69a, 0xa69b, + 0xa69b, 0xa69c, 0xa69c, 0xa69d, 0xa69d, 0xa69e, 0xa69f, 0xa69f, + 0xa6a0, 0xa6a0, 0xa6a1, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a3, 0xa6a4, + 0xa6a4, 0xa6a5, 0xa6a5, 0xa6a6, 0xa6a7, 0xa6a7, 0xa6a8, 0xa6a8, + 0xa6a9, 0xa6a9, 0xa6aa, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ac, 0xa6ad, + 0xa6ad, 0xa6ae, 0xa6ae, 0xa6af, 0xa6b0, 0xa6b0, 0xa6b1, 0xa6b1, + 0xa6b2, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b4, 0xa6b5, 0xa6b5, 0xa6b6, + 0xa6b6, 0xa6b7, 0xa6b7, 0xa6b8, 0xa6b9, 0xa6b9, 0xa6ba, 0xa6ba, + 0xa6bb, 0xa6bb, 0xa6bc, 0xa6bc, 0xa6bd, 0xa6be, 0xa6be, 0xa6bf, + 0xa6bf, 0xa6c0, 0xa6c0, 0xa6c1, 0xa6c2, 0xa6c2, 0xa6c3, 0xa6c3, + 0xa6c4, 0xa6c4, 0xa6c5, 0xa6c5, 0xa6c6, 0xa6c7, 0xa6c7, 0xa6c8, + 0xa6c8, 0xa6c9, 0xa6c9, 0xa6ca, 0xa6ca, 0xa6cb, 0xa6cb, 0xa6cc, + 0xa6cd, 0xa6cd, 0xa6ce, 0xa6ce, 0xa6cf, 0xa6cf, 0xa6d0, 0xa6d0, + 0xa6d1, 0xa6d2, 0xa6d2, 0xa6d3, 0xa6d3, 0xa6d4, 0xa6d4, 0xa6d5, + 0xa6d5, 0xa6d6, 0xa6d7, 0xa6d7, 0xa6d8, 0xa6d8, 0xa6d9, 0xa6d9, + 0xa6da, 0xa6da, 0xa6db, 0xa6db, 0xa6dc, 0xa6dd, 0xa6dd, 0xa6de, + 0xa6de, 0xa6df, 0xa6df, 0xa6e0, 0xa6e0, 0xa6e1, 0xa6e1, 0xa6e2, + 0xa6e3, 0xa6e3, 0xa6e4, 0xa6e4, 0xa6e5, 0xa6e5, 0xa6e6, 0xa6e6, + 0xa6e7, 0xa6e7, 0xa6e8, 0xa6e9, 0xa6e9, 0xa6ea, 0xa6ea, 0xa6eb, + 0xa6eb, 0xa6ec, 0xa6ec, 0xa6ed, 0xa6ed, 0xa6ee, 0xa6ee, 0xa6ef, + 0xa6f0, 0xa6f0, 0xa6f1, 0xa6f1, 0xa6f2, 0xa6f2, 0xa6f3, 0xa6f3, + 0xa6f4, 0xa6f4, 0xa6f5, 0xa6f5, 0xa6f6, 0xa6f7, 0xa6f7, 0xa6f8, + 0xa6f8, 0xa6f9, 0xa6f9, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fb, 0xa6fc, + 0xa6fc, 0xa6fd, 0xa6fe, 0xa6fe, 0xa6ff, 0xa6ff, 0xa700, 0xa700, + 0xa701, 0xa701, 0xa702, 0xa702, 0xa703, 0xa703, 0xa704, 0xa704, + 0xa705, 0xa705, 0xa706, 0xa707, 0xa707, 0xa708, 0xa708, 0xa709, + 0xa709, 0xa70a, 0xa70a, 0xa70b, 0xa70b, 0xa70c, 0xa70c, 0xa70d, + 0xa70d, 0xa70e, 0xa70f, 0xa70f, 0xa710, 0xa710, 0xa711, 0xa711, + 0xa712, 0xa712, 0xa713, 0xa713, 0xa714, 0xa714, 0xa715, 0xa715, + 0xa716, 0xa716, 0xa717, 0xa717, 0xa718, 0xa719, 0xa719, 0xa71a, + 0xa71a, 0xa71b, 0xa71b, 0xa71c, 0xa71c, 0xa71d, 0xa71d, 0xa71e, + 0xa71e, 0xa71f, 0xa71f, 0xa720, 0xa720, 0xa721, 0xa721, 0xa722, + 0xa722, 0xa723, 0xa723, 0xa724, 0xa725, 0xa725, 0xa726, 0xa726, + 0xa727, 0xa727, 0xa728, 0xa728, 0xa729, 0xa729, 0xa72a, 0xa72a, + 0xa72b, 0xa72b, 0xa72c, 0xa72c, 0xa72d, 0xa72d, 0xa72e, 0xa72e, + 0xa72f, 0xa72f, 0xa730, 0xa730, 0xa731, 0xa732, 0xa732, 0xa733, + 0xa733, 0xa734, 0xa734, 0xa735, 0xa735, 0xa736, 0xa736, 0xa737, + 0xa737, 0xa738, 0xa738, 0xa739, 0xa739, 0xa73a, 0xa73a, 0xa73b, + 0xa73b, 0xa73c, 0xa73c, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73f, + 0xa73f, 0xa740, 0xa740, 0xa741, 0xa741, 0xa742, 0xa742, 0xa743, + 0xa743, 0xa744, 0xa744, 0xa745, 0xa746, 0xa746, 0xa747, 0xa747, + 0xa748, 0xa748, 0xa749, 0xa749, 0xa74a, 0xa74a, 0xa74b, 0xa74b, + 0xa74c, 0xa74c, 0xa74d, 0xa74d, 0xa74e, 0xa74e, 0xa74f, 0xa74f, + 0xa750, 0xa750, 0xa751, 0xa751, 0xa752, 0xa752, 0xa753, 0xa753, + 0xa754, 0xa754, 0xa755, 0xa755, 0xa756, 0xa756, 0xa757, 0xa757, + 0xa758, 0xa758, 0xa759, 0xa759, 0xa75a, 0xa75a, 0xa75b, 0xa75b, + 0xa75c, 0xa75c, 0xa75d, 0xa75d, 0xa75e, 0xa75e, 0xa75f, 0xa75f, + 0xa760, 0xa760, 0xa761, 0xa761, 0xa762, 0xa762, 0xa763, 0xa763, + 0xa764, 0xa764, 0xa765, 0xa765, 0xa766, 0xa766, 0xa767, 0xa767, + 0xa768, 0xa768, 0xa769, 0xa769, 0xa76a, 0xa76a, 0xa76b, 0xa76b, + 0xa76c, 0xa76c, 0xa76d, 0xa76d, 0xa76e, 0xa76e, 0xa76f, 0xa76f, + 0xa770, 0xa770, 0xa771, 0xa771, 0xa772, 0xa772, 0xa773, 0xa773, + 0xa774, 0xa774, 0xa775, 0xa775, 0xa776, 0xa776, 0xa777, 0xa777, + 0xa778, 0xa778, 0xa779, 0xa779, 0xa77a, 0xa77a, 0xa77b, 0xa77b, + 0xa77c, 0xa77c, 0xa77d, 0xa77d, 0xa77e, 0xa77e, 0xa77f, 0xa77f, + 0xa780, 0xa780, 0xa781, 0xa781, 0xa782, 0xa782, 0xa782, 0xa783, + 0xa783, 0xa784, 0xa784, 0xa785, 0xa785, 0xa786, 0xa786, 0xa787, + 0xa787, 0xa788, 0xa788, 0xa789, 0xa789, 0xa78a, 0xa78a, 0xa78b, + 0xa78b, 0xa78c, 0xa78c, 0xa78d, 0xa78d, 0xa78e, 0xa78e, 0xa78f, + 0xa78f, 0xa790, 0xa790, 0xa791, 0xa791, 0xa792, 0xa792, 0xa793, + 0xa793, 0xa794, 0xa794, 0xa795, 0xa795, 0xa796, 0xa796, 0xa796, + 0xa797, 0xa797, 0xa798, 0xa798, 0xa799, 0xa799, 0xa79a, 0xa79a, + 0xa79b, 0xa79b, 0xa79c, 0xa79c, 0xa79d, 0xa79d, 0xa79e, 0xa79e, + 0xa79f, 0xa79f, 0xa7a0, 0xa7a0, 0xa7a1, 0xa7a1, 0xa7a2, 0xa7a2, + 0xa7a3, 0xa7a3, 0xa7a4, 0xa7a4, 0xa7a4, 0xa7a5, 0xa7a5, 0xa7a6, + 0xa7a6, 0xa7a7, 0xa7a7, 0xa7a8, 0xa7a8, 0xa7a9, 0xa7a9, 0xa7aa, + 0xa7aa, 0xa7ab, 0xa7ab, 0xa7ac, 0xa7ac, 0xa7ad, 0xa7ad, 0xa7ae, + 0xa7ae, 0xa7af, 0xa7af, 0xa7af, 0xa7b0, 0xa7b0, 0xa7b1, 0xa7b1, + 0xa7b2, 0xa7b2, 0xa7b3, 0xa7b3, 0xa7b4, 0xa7b4, 0xa7b5, 0xa7b5, + 0xa7b6, 0xa7b6, 0xa7b7, 0xa7b7, 0xa7b8, 0xa7b8, 0xa7b9, 0xa7b9, + 0xa7b9, 0xa7ba, 0xa7ba, 0xa7bb, 0xa7bb, 0xa7bc, 0xa7bc, 0xa7bd, + 0xa7bd, 0xa7be, 0xa7be, 0xa7bf, 0xa7bf, 0xa7c0, 0xa7c0, 0xa7c1, + 0xa7c1, 0xa7c1, 0xa7c2, 0xa7c2, 0xa7c3, 0xa7c3, 0xa7c4, 0xa7c4, + 0xa7c5, 0xa7c5, 0xa7c6, 0xa7c6, 0xa7c7, 0xa7c7, 0xa7c8, 0xa7c8, + 0xa7c9, 0xa7c9, 0xa7c9, 0xa7ca, 0xa7ca, 0xa7cb, 0xa7cb, 0xa7cc, + 0xa7cc, 0xa7cd, 0xa7cd, 0xa7ce, 0xa7ce, 0xa7cf, 0xa7cf, 0xa7d0, + 0xa7d0, 0xa7d1, 0xa7d1, 0xa7d1, 0xa7d2, 0xa7d2, 0xa7d3, 0xa7d3, + 0xa7d4, 0xa7d4, 0xa7d5, 0xa7d5, 0xa7d6, 0xa7d6, 0xa7d7, 0xa7d7, + 0xa7d8, 0xa7d8, 0xa7d8, 0xa7d9, 0xa7d9, 0xa7da, 0xa7da, 0xa7db, + 0xa7db, 0xa7dc, 0xa7dc, 0xa7dd, 0xa7dd, 0xa7de, 0xa7de, 0xa7de, + 0xa7df, 0xa7df, 0xa7e0, 0xa7e0, 0xa7e1, 0xa7e1, 0xa7e2, 0xa7e2, + 0xa7e3, 0xa7e3, 0xa7e4, 0xa7e4, 0xa7e5, 0xa7e5, 0xa7e5, 0xa7e6, + 0xa7e6, 0xa7e7, 0xa7e7, 0xa7e8, 0xa7e8, 0xa7e9, 0xa7e9, 0xa7ea, + 0xa7ea, 0xa7eb, 0xa7eb, 0xa7eb, 0xa7ec, 0xa7ec, 0xa7ed, 0xa7ed, + 0xa7ee, 0xa7ee, 0xa7ef, 0xa7ef, 0xa7f0, 0xa7f0, 0xa7f0, 0xa7f1, + 0xa7f1, 0xa7f2, 0xa7f2, 0xa7f3, 0xa7f3, 0xa7f4, 0xa7f4, 0xa7f5, + 0xa7f5, 0xa7f6, 0xa7f6, 0xa7f6, 0xa7f7, 0xa7f7, 0xa7f8, 0xa7f8, + 0xa7f9, 0xa7f9, 0xa7fa, 0xa7fa, 0xa7fb, 0xa7fb, 0xa7fb, 0xa7fc, + 0xa7fc, 0xa7fd, 0xa7fd, 0xa7fe, 0xa7fe, 0xa7ff, 0xa7ff, 0xa800, + 0xa800, 0xa800, 0xa801, 0xa801, 0xa802, 0xa802, 0xa803, 0xa803, + 0xa804, 0xa804, 0xa805, 0xa805, 0xa805, 0xa806, 0xa806, 0xa807, + 0xa807, 0xa808, 0xa808, 0xa809, 0xa809, 0xa809, 0xa80a, 0xa80a, + 0xa80b, 0xa80b, 0xa80c, 0xa80c, 0xa80d, 0xa80d, 0xa80e, 0xa80e, + 0xa80e, 0xa80f, 0xa80f, 0xa810, 0xa810, 0xa811, 0xa811, 0xa812, + 0xa812, 0xa812, 0xa813, 0xa813, 0xa814, 0xa814, 0xa815, 0xa815, + 0xa816, 0xa816, 0xa816, 0xa817, 0xa817, 0xa818, 0xa818, 0xa819, + 0xa819, 0xa81a, 0xa81a, 0xa81a, 0xa81b, 0xa81b, 0xa81c, 0xa81c, + 0xa81d, 0xa81d, 0xa81d, 0xa81e, 0xa81e, 0xa81f, 0xa81f, 0xa820, + 0xa820, 0xa821, 0xa821, 0xa821, 0xa822, 0xa822, 0xa823, 0xa823, + 0xa824, 0xa824, 0xa824, 0xa825, 0xa825, 0xa826, 0xa826, 0xa827, + 0xa827, 0xa828, 0xa828, 0xa828, 0xa829, 0xa829, 0xa82a, 0xa82a, + 0xa82b, 0xa82b, 0xa82b, 0xa82c, 0xa82c, 0xa82d, 0xa82d, 0xa82e, + 0xa82e, 0xa82e, 0xa82f, 0xa82f, 0xa830, 0xa830, 0xa831, 0xa831, + 0xa831, 0xa832, 0xa832, 0xa833, 0xa833, 0xa834, 0xa834, 0xa834, + 0xa835, 0xa835, 0xa836, 0xa836, 0xa837, 0xa837, 0xa837, 0xa838, + 0xa838, 0xa839, 0xa839, 0xa83a, 0xa83a, 0xa83a, 0xa83b, 0xa83b, + 0xa83c, 0xa83c, 0xa83d, 0xa83d, 0xa83d, 0xa83e, 0xa83e, 0xa83f, + 0xa83f, 0xa840, 0xa840, 0xa840, 0xa841, 0xa841, 0xa842, 0xa842, + 0xa842, 0xa843, 0xa843, 0xa844, 0xa844, 0xa845, 0xa845, 0xa845, + 0xa846, 0xa846, 0xa847, 0xa847, 0xa848, 0xa848, 0xa848, 0xa849, + 0xa849, 0xa84a, 0xa84a, 0xa84a, 0xa84b, 0xa84b, 0xa84c, 0xa84c, + 0xa84d, 0xa84d, 0xa84d, 0xa84e, 0xa84e, 0xa84f, 0xa84f, 0xa84f, + 0xa850, 0xa850, 0xa851, 0xa851, 0xa852, 0xa852, 0xa852, 0xa853, + 0xa853, 0xa854, 0xa854, 0xa854, 0xa855, 0xa855, 0xa856, 0xa856, + 0xa857, 0xa857, 0xa857, 0xa858, 0xa858, 0xa859, 0xa859, 0xa859, + 0xa85a, 0xa85a, 0xa85b, 0xa85b, 0xa85b, 0xa85c, 0xa85c, 0xa85d, + 0xa85d, 0xa85d, 0xa85e, 0xa85e, 0xa85f, 0xa85f, 0xa860, 0xa860, + 0xa860, 0xa861, 0xa861, 0xa862, 0xa862, 0xa862, 0xa863, 0xa863, + 0xa864, 0xa864, 0xa864, 0xa865, 0xa865, 0xa866, 0xa866, 0xa866, + 0xa867, 0xa867, 0xa868, 0xa868, 0xa868, 0xa869, 0xa869, 0xa86a, + 0xa86a, 0xa86a, 0xa86b, 0xa86b, 0xa86c, 0xa86c, 0xa86d, 0xa86d, + 0xa86d, 0xa86e, 0xa86e, 0xa86f, 0xa86f, 0xa86f, 0xa870, 0xa870, + 0xa871, 0xa871, 0xa871, 0xa872, 0xa872, 0xa873, 0xa873, 0xa873, + 0xa874, 0xa874, 0xa875, 0xa875, 0xa875, 0xa876, 0xa876, 0xa877, + 0xa877, 0xa877, 0xa878, 0xa878, 0xa879, 0xa879, 0xa879, 0xa87a, + 0xa87a, 0xa87b, 0xa87b, 0xa87b, 0xa87c, 0xa87c, 0xa87c, 0xa87d, + 0xa87d, 0xa87e, 0xa87e, 0xa87e, 0xa87f, 0xa87f, 0xa880, 0xa880, + 0xa880, 0xa881, 0xa881, 0xa882, 0xa882, 0xa882, 0xa883, 0xa883, + 0xa884, 0xa884, 0xa884, 0xa885, 0xa885, 0xa886, 0xa886, 0xa886, + 0xa887, 0xa887, 0xa888, 0xa888, 0xa888, 0xa889, 0xa889, 0xa889, + 0xa88a, 0xa88a, 0xa88b, 0xa88b, 0xa88b, 0xa88c, 0xa88c, 0xa88d, + 0xa88d, 0xa88d, 0xa88e, 0xa88e, 0xa88f, 0xa88f, 0xa88f, 0xa890, + 0xa890, 0xa890, 0xa891, 0xa891, 0xa892, 0xa892, 0xa892, 0xa893, + 0xa893, 0xa894, 0xa894, 0xa894, 0xa895, 0xa895, 0xa896, 0xa896, + 0xa896, 0xa897, 0xa897, 0xa897, 0xa898, 0xa898, 0xa899, 0xa899, + 0xa899, 0xa89a, 0xa89a, 0xa89b, 0xa89b, 0xa89b, 0xa89c, 0xa89c, + 0xa89c, 0xa89d, 0xa89d, 0xa89e, 0xa89e, 0xa89e, 0xa89f, 0xa89f, + 0xa89f, 0xa8a0, 0xa8a0, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a2, 0xa8a2, + 0xa8a3, 0xa8a3, 0xa8a3, 0xa8a4, 0xa8a4, 0xa8a4, 0xa8a5, 0xa8a5, + 0xa8a6, 0xa8a6, 0xa8a6, 0xa8a7, 0xa8a7, 0xa8a7, 0xa8a8, 0xa8a8, + 0xa8a9, 0xa8a9, 0xa8a9, 0xa8aa, 0xa8aa, 0xa8ab, 0xa8ab, 0xa8ab, + 0xa8ac, 0xa8ac, 0xa8ac, 0xa8ad, 0xa8ad, 0xa8ae, 0xa8ae, 0xa8ae, + 0xa8af, 0xa8af, 0xa8af, 0xa8b0, 0xa8b0, 0xa8b1, 0xa8b1, 0xa8b1, + 0xa8b2, 0xa8b2, 0xa8b2, 0xa8b3, 0xa8b3, 0xa8b4, 0xa8b4, 0xa8b4, + 0xa8b5, 0xa8b5, 0xa8b5, 0xa8b6, 0xa8b6, 0xa8b7, 0xa8b7, 0xa8b7, + 0xa8b8, 0xa8b8, 0xa8b8, 0xa8b9, 0xa8b9, 0xa8ba, 0xa8ba, 0xa8ba, + 0xa8bb, 0xa8bb, 0xa8bb, 0xa8bc, 0xa8bc, 0xa8bc, 0xa8bd, 0xa8bd, + 0xa8be, 0xa8be, 0xa8be, 0xa8bf, 0xa8bf, 0xa8bf, 0xa8c0, 0xa8c0, + 0xa8c1, 0xa8c1, 0xa8c1, 0xa8c2, 0xa8c2, 0xa8c2, 0xa8c3, 0xa8c3, + 0xa8c4, 0xa8c4, 0xa8c4, 0xa8c5, 0xa8c5, 0xa8c5, 0xa8c6, 0xa8c6, + 0xa8c6, 0xa8c7, 0xa8c7, 0xa8c8, 0xa8c8, 0xa8c8, 0xa8c9, 0xa8c9, + 0xa8c9, 0xa8ca, 0xa8ca, 0xa8ca, 0xa8cb, 0xa8cb, 0xa8cc, 0xa8cc, + 0xa8cc, 0xa8cd, 0xa8cd, 0xa8cd, 0xa8ce, 0xa8ce, 0xa8cf, 0xa8cf, + 0xa8cf, 0xa8d0, 0xa8d0, 0xa8d0, 0xa8d1, 0xa8d1, 0xa8d1, 0xa8d2, + 0xa8d2, 0xa8d3, 0xa8d3, 0xa8d3, 0xa8d4, 0xa8d4, 0xa8d4, 0xa8d5, + 0xa8d5, 0xa8d5, 0xa8d6, 0xa8d6, 0xa8d6, 0xa8d7, 0xa8d7, 0xa8d8, + 0xa8d8, 0xa8d8, 0xa8d9, 0xa8d9, 0xa8d9, 0xa8da, 0xa8da, 0xa8da, + 0xa8db, 0xa8db, 0xa8dc, 0xa8dc, 0xa8dc, 0xa8dd, 0xa8dd, 0xa8dd, + 0xa8de, 0xa8de, 0xa8de, 0xa8df, 0xa8df, 0xa8e0, 0xa8e0, 0xa8e0, + 0xa8e1, 0xa8e1, 0xa8e1, 0xa8e2, 0xa8e2, 0xa8e2, 0xa8e3, 0xa8e3, + 0xa8e3, 0xa8e4, 0xa8e4, 0xa8e5, 0xa8e5, 0xa8e5, 0xa8e6, 0xa8e6, + 0xa8e6, 0xa8e7, 0xa8e7, 0xa8e7, 0xa8e8, 0xa8e8, 0xa8e8, 0xa8e9, + 0xa8e9, 0xa8e9, 0xa8ea, 0xa8ea, 0xa8eb, 0xa8eb, 0xa8eb, 0xa8ec, + 0xa8ec, 0xa8ec, 0xa8ed, 0xa8ed, 0xa8ed, 0xa8ee, 0xa8ee, 0xa8ee, + 0xa8ef, 0xa8ef, 0xa8f0, 0xa8f0, 0xa8f0, 0xa8f1, 0xa8f1, 0xa8f1, + 0xa8f2, 0xa8f2, 0xa8f2, 0xa8f3, 0xa8f3, 0xa8f3, 0xa8f4, 0xa8f4, + 0xa8f4, 0xa8f5, 0xa8f5, 0xa8f6, 0xa8f6, 0xa8f6, 0xa8f7, 0xa8f7, + 0xa8f7, 0xa8f8, 0xa8f8, 0xa8f8, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8fa, + 0xa8fa, 0xa8fa, 0xa8fb, 0xa8fb, 0xa8fb, 0xa8fc, 0xa8fc, 0xa8fd, + 0xa8fd, 0xa8fd, 0xa8fe, 0xa8fe, 0xa8fe, 0xa8ff, 0xa8ff, 0xa8ff, + 0xa900, 0xa900, 0xa900, 0xa901, 0xa901, 0xa901, 0xa902, 0xa902, + 0xa902, 0xa903, 0xa903, 0xa903, 0xa904, 0xa904, 0xa905, 0xa905, + 0xa905, 0xa906, 0xa906, 0xa906, 0xa907, 0xa907, 0xa907, 0xa908, + 0xa908, 0xa908, 0xa909, 0xa909, 0xa909, 0xa90a, 0xa90a, 0xa90a, + 0xa90b, 0xa90b, 0xa90b, 0xa90c, 0xa90c, 0xa90c, 0xa90d, 0xa90d, + 0xa90d, 0xa90e, 0xa90e, 0xa90e, 0xa90f, 0xa90f, 0xa910, 0xa910, + 0xa910, 0xa911, 0xa911, 0xa911, 0xa912, 0xa912, 0xa912, 0xa913, + 0xa913, 0xa913, 0xa914, 0xa914, 0xa914, 0xa915, 0xa915, 0xa915, + 0xa916, 0xa916, 0xa916, 0xa917, 0xa917, 0xa917, 0xa918, 0xa918, + 0xa918, 0xa919, 0xa919, 0xa919, 0xa91a, 0xa91a, 0xa91a, 0xa91b, + 0xa91b, 0xa91b, 0xa91c, 0xa91c, 0xa91c, 0xa91d, 0xa91d, 0xa91d, + 0xa91e, 0xa91e, 0xa91f, 0xa91f, 0xa91f, 0xa920, 0xa920, 0xa920, + 0xa921, 0xa921, 0xa921, 0xa922, 0xa922, 0xa922, 0xa923, 0xa923, + 0xa923, 0xa924, 0xa924, 0xa924, 0xa925, 0xa925, 0xa925, 0xa926, + 0xa926, 0xa926, 0xa927, 0xa927, 0xa927, 0xa928, 0xa928, 0xa928, + 0xa929, 0xa929, 0xa929, 0xa92a, 0xa92a, 0xa92a, 0xa92b, 0xa92b, + 0xa92b, 0xa92c, 0xa92c, 0xa92c, 0xa92d, 0xa92d, 0xa92d, 0xa92e, + 0xa92e, 0xa92e, 0xa92f, 0xa92f, 0xa92f, 0xa930, 0xa930, 0xa930, + 0xa931, 0xa931, 0xa931, 0xa932, 0xa932, 0xa932, 0xa933, 0xa933, + 0xa933, 0xa934, 0xa934, 0xa934, 0xa935, 0xa935, 0xa935, 0xa936, + 0xa936, 0xa936, 0xa937, 0xa937, 0xa937, 0xa938, 0xa938, 0xa938, + 0xa939, 0xa939, 0xa939, 0xa93a, 0xa93a, 0xa93a, 0xa93b, 0xa93b, + 0xa93b, 0xa93c, 0xa93c, 0xa93c, 0xa93d, 0xa93d, 0xa93d, 0xa93e, + 0xa93e, 0xa93e, 0xa93e, 0xa93f, 0xa93f, 0xa93f, 0xa940, 0xa940, + 0xa940, 0xa941, 0xa941, 0xa941, 0xa942, 0xa942, 0xa942, 0xa943, + 0xa943, 0xa943, 0xa944, 0xa944, 0xa944, 0xa945, 0xa945, 0xa945, + 0xa946, 0xa946, 0xa946, 0xa947, 0xa947, 0xa947, 0xa948, 0xa948, + 0xa948, 0xa949, 0xa949, 0xa949, 0xa94a, 0xa94a, 0xa94a, 0xa94b, + 0xa94b, 0xa94b, 0xa94c, 0xa94c, 0xa94c, 0xa94d, 0xa94d, 0xa94d, + 0xa94d, 0xa94e, 0xa94e, 0xa94e, 0xa94f, 0xa94f, 0xa94f, 0xa950, + 0xa950, 0xa950, 0xa951, 0xa951, 0xa951, 0xa952, 0xa952, 0xa952, + 0xa953, 0xa953, 0xa953, 0xa954, 0xa954, 0xa954, 0xa955, 0xa955, + 0xa955, 0xa956, 0xa956, 0xa956, 0xa957, 0xa957, 0xa957, 0xa958, + 0xa958, 0xa958, 0xa958, 0xa959, 0xa959, 0xa959, 0xa95a, 0xa95a, + 0xa95a, 0xa95b, 0xa95b, 0xa95b, 0xa95c, 0xa95c, 0xa95c, 0xa95d, + 0xa95d, 0xa95d, 0xa95e, 0xa95e, 0xa95e, 0xa95f, 0xa95f, 0xa95f, + 0xa960, 0xa960, 0xa960, 0xa960, 0xa961, 0xa961, 0xa961, 0xa962, + 0xa962, 0xa962, 0xa963, 0xa963, 0xa963, 0xa964, 0xa964, 0xa964, + 0xa965, 0xa965, 0xa965, 0xa966, 0xa966, 0xa966, 0xa967, 0xa967, + 0xa967, 0xa967, 0xa968, 0xa968, 0xa968, 0xa969, 0xa969, 0xa969, + 0xa96a, 0xa96a, 0xa96a, 0xa96b, 0xa96b, 0xa96b, 0xa96c, 0xa96c, + 0xa96c, 0xa96d, 0xa96d, 0xa96d, 0xa96d, 0xa96e, 0xa96e, 0xa96e, + 0xa96f, 0xa96f, 0xa96f, 0xa970, 0xa970, 0xa970, 0xa971, 0xa971, + 0xa971, 0xa972, 0xa972, 0xa972, 0xa972, 0xa973, 0xa973, 0xa973, + 0xa974, 0xa974, 0xa974, 0xa975, 0xa975, 0xa975, 0xa976, 0xa976, + 0xa976, 0xa977, 0xa977, 0xa977, 0xa977, 0xa978, 0xa978, 0xa978, + 0xa979, 0xa979, 0xa979, 0xa97a, 0xa97a, 0xa97a, 0xa97b, 0xa97b, + 0xa97b, 0xa97c, 0xa97c, 0xa97d, 0xa97e, 0xa97e, 0xa97f, 0xa980, + 0xa980, 0xa981, 0xa981, 0xa982, 0xa983, 0xa983, 0xa984, 0xa985, + 0xa985, 0xa986, 0xa986, 0xa987, 0xa988, 0xa988, 0xa989, 0xa989, + 0xa98a, 0xa98b, 0xa98b, 0xa98c, 0xa98d, 0xa98d, 0xa98e, 0xa98e, + 0xa98f, 0xa990, 0xa990, 0xa991, 0xa991, 0xa992, 0xa993, 0xa993, + 0xa994, 0xa995, 0xa995, 0xa996, 0xa996, 0xa997, 0xa998, 0xa998, + 0xa999, 0xa999, 0xa99a, 0xa99b, 0xa99b, 0xa99c, 0xa99c, 0xa99d, + 0xa99e, 0xa99e, 0xa99f, 0xa99f, 0xa9a0, 0xa9a1, 0xa9a1, 0xa9a2, + 0xa9a2, 0xa9a3, 0xa9a4, 0xa9a4, 0xa9a5, 0xa9a5, 0xa9a6, 0xa9a7, + 0xa9a7, 0xa9a8, 0xa9a8, 0xa9a9, 0xa9aa, 0xa9aa, 0xa9ab, 0xa9ab, + 0xa9ac, 0xa9ad, 0xa9ad, 0xa9ae, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b0, + 0xa9b1, 0xa9b1, 0xa9b2, 0xa9b3, 0xa9b3, 0xa9b4, 0xa9b4, 0xa9b5, + 0xa9b6, 0xa9b6, 0xa9b7, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9b9, 0xa9ba, + 0xa9ba, 0xa9bb, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9bd, 0xa9be, 0xa9be, + 0xa9bf, 0xa9c0, 0xa9c0, 0xa9c1, 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c3, + 0xa9c4, 0xa9c4, 0xa9c5, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c7, 0xa9c8, + 0xa9c8, 0xa9c9, 0xa9ca, 0xa9ca, 0xa9cb, 0xa9cb, 0xa9cc, 0xa9cc, + 0xa9cd, 0xa9ce, 0xa9ce, 0xa9cf, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d1, + 0xa9d2, 0xa9d2, 0xa9d3, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d5, 0xa9d6, + 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d8, 0xa9d9, 0xa9d9, 0xa9da, 0xa9da, + 0xa9db, 0xa9dc, 0xa9dc, 0xa9dd, 0xa9dd, 0xa9de, 0xa9de, 0xa9df, + 0xa9e0, 0xa9e0, 0xa9e1, 0xa9e1, 0xa9e2, 0xa9e2, 0xa9e3, 0xa9e4, + 0xa9e4, 0xa9e5, 0xa9e5, 0xa9e6, 0xa9e6, 0xa9e7, 0xa9e8, 0xa9e8, + 0xa9e9, 0xa9e9, 0xa9ea, 0xa9ea, 0xa9eb, 0xa9ec, 0xa9ec, 0xa9ed, + 0xa9ed, 0xa9ee, 0xa9ee, 0xa9ef, 0xa9f0, 0xa9f0, 0xa9f1, 0xa9f1, + 0xa9f2, 0xa9f2, 0xa9f3, 0xa9f3, 0xa9f4, 0xa9f5, 0xa9f5, 0xa9f6, + 0xa9f6, 0xa9f7, 0xa9f7, 0xa9f8, 0xa9f9, 0xa9f9, 0xa9fa, 0xa9fa, + 0xa9fb, 0xa9fb, 0xa9fc, 0xa9fc, 0xa9fd, 0xa9fe, 0xa9fe, 0xa9ff, + 0xa9ff, 0xaa00, 0xaa00, 0xaa01, 0xaa02, 0xaa02, 0xaa03, 0xaa03, + 0xaa04, 0xaa04, 0xaa05, 0xaa05, 0xaa06, 0xaa07, 0xaa07, 0xaa08, + 0xaa08, 0xaa09, 0xaa09, 0xaa0a, 0xaa0a, 0xaa0b, 0xaa0c, 0xaa0c, + 0xaa0d, 0xaa0d, 0xaa0e, 0xaa0e, 0xaa0f, 0xaa0f, 0xaa10, 0xaa10, + 0xaa11, 0xaa12, 0xaa12, 0xaa13, 0xaa13, 0xaa14, 0xaa14, 0xaa15, + 0xaa15, 0xaa16, 0xaa17, 0xaa17, 0xaa18, 0xaa18, 0xaa19, 0xaa19, + 0xaa1a, 0xaa1a, 0xaa1b, 0xaa1b, 0xaa1c, 0xaa1d, 0xaa1d, 0xaa1e, + 0xaa1e, 0xaa1f, 0xaa1f, 0xaa20, 0xaa20, 0xaa21, 0xaa21, 0xaa22, + 0xaa23, 0xaa23, 0xaa24, 0xaa24, 0xaa25, 0xaa25, 0xaa26, 0xaa26, + 0xaa27, 0xaa27, 0xaa28, 0xaa29, 0xaa29, 0xaa2a, 0xaa2a, 0xaa2b, + 0xaa2b, 0xaa2c, 0xaa2c, 0xaa2d, 0xaa2d, 0xaa2e, 0xaa2e, 0xaa2f, + 0xaa30, 0xaa30, 0xaa31, 0xaa31, 0xaa32, 0xaa32, 0xaa33, 0xaa33, + 0xaa34, 0xaa34, 0xaa35, 0xaa35, 0xaa36, 0xaa37, 0xaa37, 0xaa38, + 0xaa38, 0xaa39, 0xaa39, 0xaa3a, 0xaa3a, 0xaa3b, 0xaa3b, 0xaa3c, + 0xaa3c, 0xaa3d, 0xaa3d, 0xaa3e, 0xaa3f, 0xaa3f, 0xaa40, 0xaa40, + 0xaa41, 0xaa41, 0xaa42, 0xaa42, 0xaa43, 0xaa43, 0xaa44, 0xaa44, + 0xaa45, 0xaa45, 0xaa46, 0xaa47, 0xaa47, 0xaa48, 0xaa48, 0xaa49, + 0xaa49, 0xaa4a, 0xaa4a, 0xaa4b, 0xaa4b, 0xaa4c, 0xaa4c, 0xaa4d, + 0xaa4d, 0xaa4e, 0xaa4e, 0xaa4f, 0xaa50, 0xaa50, 0xaa51, 0xaa51, + 0xaa52, 0xaa52, 0xaa53, 0xaa53, 0xaa54, 0xaa54, 0xaa55, 0xaa55, + 0xaa56, 0xaa56, 0xaa57, 0xaa57, 0xaa58, 0xaa58, 0xaa59, 0xaa59, + 0xaa5a, 0xaa5b, 0xaa5b, 0xaa5c, 0xaa5c, 0xaa5d, 0xaa5d, 0xaa5e, + 0xaa5e, 0xaa5f, 0xaa5f, 0xaa60, 0xaa60, 0xaa61, 0xaa61, 0xaa62, + 0xaa62, 0xaa63, 0xaa63, 0xaa64, 0xaa64, 0xaa65, 0xaa65, 0xaa66, + 0xaa66, 0xaa67, 0xaa67, 0xaa68, 0xaa69, 0xaa69, 0xaa6a, 0xaa6a, + 0xaa6b, 0xaa6b, 0xaa6c, 0xaa6c, 0xaa6d, 0xaa6d, 0xaa6e, 0xaa6e, + 0xaa6f, 0xaa6f, 0xaa70, 0xaa70, 0xaa71, 0xaa71, 0xaa72, 0xaa72, + 0xaa73, 0xaa73, 0xaa74, 0xaa74, 0xaa75, 0xaa75, 0xaa76, 0xaa76, + 0xaa77, 0xaa77, 0xaa78, 0xaa78, 0xaa79, 0xaa79, 0xaa7a, 0xaa7a, + 0xaa7b, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7d, 0xaa7e, 0xaa7e, 0xaa7f, + 0xaa7f, 0xaa80, 0xaa80, 0xaa81, 0xaa81, 0xaa82, 0xaa82, 0xaa83, + 0xaa83, 0xaa84, 0xaa84, 0xaa85, 0xaa85, 0xaa86, 0xaa86, 0xaa87, + 0xaa87, 0xaa88, 0xaa88, 0xaa89, 0xaa89, 0xaa8a, 0xaa8a, 0xaa8b, + 0xaa8b, 0xaa8c, 0xaa8c, 0xaa8d, 0xaa8d, 0xaa8e, 0xaa8e, 0xaa8f, + 0xaa8f, 0xaa90, 0xaa90, 0xaa91, 0xaa91, 0xaa92, 0xaa92, 0xaa93, + 0xaa93, 0xaa94, 0xaa94, 0xaa95, 0xaa95, 0xaa96, 0xaa96, 0xaa97, + 0xaa97, 0xaa98, 0xaa98, 0xaa99, 0xaa99, 0xaa9a, 0xaa9a, 0xaa9b, + 0xaa9b, 0xaa9c, 0xaa9c, 0xaa9d, 0xaa9d, 0xaa9e, 0xaa9e, 0xaa9f, + 0xaa9f, 0xaaa0, 0xaaa0, 0xaaa1, 0xaaa1, 0xaaa2, 0xaaa2, 0xaaa3, + 0xaaa3, 0xaaa4, 0xaaa4, 0xaaa5, 0xaaa5, 0xaaa6, 0xaaa6, 0xaaa7, + 0xaaa7, 0xaaa8, 0xaaa8, 0xaaa9, 0xaaa9, 0xaaaa, 0xaaaa, 0xaaab, + 0xaaab, 0xaaac, 0xaaac, 0xaaad, 0xaaad, 0xaaae, 0xaaae, 0xaaaf, + 0xaaaf, 0xaaaf, 0xaab0, 0xaab0, 0xaab1, 0xaab1, 0xaab2, 0xaab2, + 0xaab3, 0xaab3, 0xaab4, 0xaab4, 0xaab5, 0xaab5, 0xaab6, 0xaab6, + 0xaab7, 0xaab7, 0xaab8, 0xaab8, 0xaab9, 0xaab9, 0xaaba, 0xaaba, + 0xaabb, 0xaabb, 0xaabc, 0xaabc, 0xaabd, 0xaabd, 0xaabe, 0xaabe, + 0xaabf, 0xaabf, 0xaac0, 0xaac0, 0xaac1, 0xaac1, 0xaac2, 0xaac2, + 0xaac2, 0xaac3, 0xaac3, 0xaac4, 0xaac4, 0xaac5, 0xaac5, 0xaac6, + 0xaac6, 0xaac7, 0xaac7, 0xaac8, 0xaac8, 0xaac9, 0xaac9, 0xaaca, + 0xaaca, 0xaacb, 0xaacb, 0xaacc, 0xaacc, 0xaacd, 0xaacd, 0xaace, + 0xaace, 0xaacf, 0xaacf, 0xaad0, 0xaad0, 0xaad0, 0xaad1, 0xaad1, + 0xaad2, 0xaad2, 0xaad3, 0xaad3, 0xaad4, 0xaad4, 0xaad5, 0xaad5, + 0xaad6, 0xaad6, 0xaad7, 0xaad7, 0xaad8, 0xaad8, 0xaad9, 0xaad9, + 0xaada, 0xaada, 0xaadb, 0xaadb, 0xaadb, 0xaadc, 0xaadc, 0xaadd, + 0xaadd, 0xaade, 0xaade, 0xaadf, 0xaadf, 0xaae0, 0xaae0, 0xaae1, + 0xaae1, 0xaae2, 0xaae2, 0xaae3, 0xaae3, 0xaae4, 0xaae4, 0xaae4, + 0xaae5, 0xaae5, 0xaae6, 0xaae6, 0xaae7, 0xaae7, 0xaae8, 0xaae8, + 0xaae9, 0xaae9, 0xaaea, 0xaaea, 0xaaeb, 0xaaeb, 0xaaec, 0xaaec, + 0xaaed, 0xaaed, 0xaaed, 0xaaee, 0xaaee, 0xaaef, 0xaaef, 0xaaf0, + 0xaaf0, 0xaaf1, 0xaaf1, 0xaaf2, 0xaaf2, 0xaaf3, 0xaaf3, 0xaaf4, + 0xaaf4, 0xaaf4, 0xaaf5, 0xaaf5, 0xaaf6, 0xaaf6, 0xaaf7, 0xaaf7, + 0xaaf8, 0xaaf8, 0xaaf9, 0xaaf9, 0xaafa, 0xaafa, 0xaafb, 0xaafb, + 0xaafb, 0xaafc, 0xaafc, 0xaafd, 0xaafd, 0xaafe, 0xaafe, 0xaaff, + 0xaaff, 0xab00, 0xab00, 0xab01, 0xab01, 0xab02, 0xab02, 0xab02, + 0xab03, 0xab03, 0xab04, 0xab04, 0xab05, 0xab05, 0xab06, 0xab06, + 0xab07, 0xab07, 0xab08, 0xab08, 0xab08, 0xab09, 0xab09, 0xab0a, + 0xab0a, 0xab0b, 0xab0b, 0xab0c, 0xab0c, 0xab0d, 0xab0d, 0xab0e, + 0xab0e, 0xab0e, 0xab0f, 0xab0f, 0xab10, 0xab10, 0xab11, 0xab11, + 0xab12, 0xab12, 0xab13, 0xab13, 0xab14, 0xab14, 0xab14, 0xab15, + 0xab15, 0xab16, 0xab16, 0xab17, 0xab17, 0xab18, 0xab18, 0xab19, + 0xab19, 0xab19, 0xab1a, 0xab1a, 0xab1b, 0xab1b, 0xab1c, 0xab1c, + 0xab1d, 0xab1d, 0xab1e, 0xab1e, 0xab1e, 0xab1f, 0xab1f, 0xab20, + 0xab20, 0xab21, 0xab21, 0xab22, 0xab22, 0xab23, 0xab23, 0xab23, + 0xab24, 0xab24, 0xab25, 0xab25, 0xab26, 0xab26, 0xab27, 0xab27, + 0xab28, 0xab28, 0xab28, 0xab29, 0xab29, 0xab2a, 0xab2a, 0xab2b, + 0xab2b, 0xab2c, 0xab2c, 0xab2d, 0xab2d, 0xab2d, 0xab2e, 0xab2e, + 0xab2f, 0xab2f, 0xab30, 0xab30, 0xab31, 0xab31, 0xab31, 0xab32, + 0xab32, 0xab33, 0xab33, 0xab34, 0xab34, 0xab35, 0xab35, 0xab36, + 0xab36, 0xab36, 0xab37, 0xab37, 0xab38, 0xab38, 0xab39, 0xab39, + 0xab3a, 0xab3a, 0xab3a, 0xab3b, 0xab3b, 0xab3c, 0xab3c, 0xab3d, + 0xab3d, 0xab3e, 0xab3e, 0xab3e, 0xab3f, 0xab3f, 0xab40, 0xab40, + 0xab41, 0xab41, 0xab42, 0xab42, 0xab42, 0xab43, 0xab43, 0xab44, + 0xab44, 0xab45, 0xab45, 0xab46, 0xab46, 0xab46, 0xab47, 0xab47, + 0xab48, 0xab48, 0xab49, 0xab49, 0xab4a, 0xab4a, 0xab4a, 0xab4b, + 0xab4b, 0xab4c, 0xab4c, 0xab4d, 0xab4d, 0xab4e, 0xab4e, 0xab4e, + 0xab4f, 0xab4f, 0xab50, 0xab50, 0xab51, 0xab51, 0xab52, 0xab52, + 0xab52, 0xab53, 0xab53, 0xab54, 0xab54, 0xab55, 0xab55, 0xab55, + 0xab56, 0xab56, 0xab57, 0xab57, 0xab58, 0xab58, 0xab59, 0xab59, + 0xab59, 0xab5a, 0xab5a, 0xab5b, 0xab5b, 0xab5c, 0xab5c, 0xab5c, + 0xab5d, 0xab5d, 0xab5e, 0xab5e, 0xab5f, 0xab5f, 0xab60, 0xab60, + 0xab60, 0xab61, 0xab61, 0xab62, 0xab62, 0xab63, 0xab63, 0xab63, + 0xab64, 0xab64, 0xab65, 0xab65, 0xab66, 0xab66, 0xab67, 0xab67, + 0xab67, 0xab68, 0xab68, 0xab69, 0xab69, 0xab6a, 0xab6a, 0xab6a, + 0xab6b, 0xab6b, 0xab6c, 0xab6c, 0xab6d, 0xab6d, 0xab6d, 0xab6e, + 0xab6e, 0xab6f, 0xab6f, 0xab70, 0xab70, 0xab70, 0xab71, 0xab71, + 0xab72, 0xab72, 0xab73, 0xab73, 0xab73, 0xab74, 0xab74, 0xab75, + 0xab75, 0xab76, 0xab76, 0xab77, 0xab77, 0xab77, 0xab78, 0xab78, + 0xab79, 0xab79, 0xab7a, 0xab7a, 0xab7a, 0xab7b, 0xab7b, 0xab7c, + 0xab7c, 0xab7d, 0xab7d, 0xab7d, 0xab7e, 0xab7e, 0xab7f, 0xab7f, + 0xab80, 0xab80, 0xab80, 0xab81, 0xab81, 0xab82, 0xab82, 0xab83, + 0xab83, 0xab84, 0xab85, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, + 0xab8a, 0xab8b, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, + 0xab91, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab96, + 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9b, 0xab9c, 0xab9d, + 0xab9e, 0xab9f, 0xaba0, 0xaba1, 0xaba1, 0xaba2, 0xaba3, 0xaba4, + 0xaba5, 0xaba6, 0xaba6, 0xaba7, 0xaba8, 0xaba9, 0xabaa, 0xabab, + 0xabab, 0xabac, 0xabad, 0xabae, 0xabaf, 0xabb0, 0xabb0, 0xabb1, + 0xabb2, 0xabb3, 0xabb4, 0xabb5, 0xabb5, 0xabb6, 0xabb7, 0xabb8, + 0xabb9, 0xabb9, 0xabba, 0xabbb, 0xabbc, 0xabbd, 0xabbe, 0xabbe, + 0xabbf, 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc3, 0xabc4, 0xabc5, + 0xabc6, 0xabc7, 0xabc7, 0xabc8, 0xabc9, 0xabca, 0xabcb, 0xabcc, + 0xabcc, 0xabcd, 0xabce, 0xabcf, 0xabd0, 0xabd0, 0xabd1, 0xabd2, + 0xabd3, 0xabd4, 0xabd4, 0xabd5, 0xabd6, 0xabd7, 0xabd8, 0xabd9, + 0xabd9, 0xabda, 0xabdb, 0xabdc, 0xabdd, 0xabdd, 0xabde, 0xabdf, + 0xabe0, 0xabe1, 0xabe1, 0xabe2, 0xabe3, 0xabe4, 0xabe5, 0xabe5, + 0xabe6, 0xabe7, 0xabe8, 0xabe9, 0xabe9, 0xabea, 0xabeb, 0xabec, + 0xabed, 0xabed, 0xabee, 0xabef, 0xabf0, 0xabf1, 0xabf1, 0xabf2, + 0xabf3, 0xabf4, 0xabf5, 0xabf5, 0xabf6, 0xabf7, 0xabf8, 0xabf9, + 0xabf9, 0xabfa, 0xabfb, 0xabfc, 0xabfd, 0xabfd, 0xabfe, 0xabff, + 0xac00, 0xac00, 0xac01, 0xac01, 0xac01, 0xac02, 0xac02, 0xac03, + 0xac03, 0xac03, 0xac04, 0xac04, 0xac05, 0xac05, 0xac05, 0xac06, + 0xac06, 0xac07, 0xac07, 0xac07, 0xac08, 0xac08, 0xac09, 0xac09, + 0xac09, 0xac0a, 0xac0a, 0xac0b, 0xac0b, 0xac0b, 0xac0c, 0xac0c, + 0xac0c, 0xac0d, 0xac0d, 0xac0e, 0xac0e, 0xac0e, 0xac0f, 0xac0f, + 0xac10, 0xac10, 0xac10, 0xac11, 0xac11, 0xac12, 0xac12, 0xac12, + 0xac13, 0xac13, 0xac13, 0xac14, 0xac14, 0xac15, 0xac15, 0xac15, + 0xac16, 0xac16, 0xac17, 0xac17, 0xac17, 0xac18, 0xac18, 0xac18, + 0xac19, 0xac19, 0xac1a, 0xac1a, 0xac1a, 0xac1b, 0xac1b, 0xac1c, + 0xac1c, 0xac1c, 0xac1d, 0xac1d, 0xac1d, 0xac1e, 0xac1e, 0xac1f, + 0xac1f, 0xac1f, 0xac20, 0xac20, 0xac21, 0xac21, 0xac21, 0xac22, + 0xac22, 0xac22, 0xac23, 0xac23, 0xac24, 0xac24, 0xac24, 0xac25, + 0xac25, 0xac25, 0xac26, 0xac26, 0xac27, 0xac27, 0xac27, 0xac28, + 0xac28, 0xac28, 0xac29, 0xac29, 0xac2a, 0xac2a, 0xac2a, 0xac2b, + 0xac2b, 0xac2b, 0xac2c, 0xac2c, 0xac2d, 0xac2d, 0xac2d, 0xac2e, + 0xac2e, 0xac2f, 0xac2f, 0xac2f, 0xac30, 0xac30, 0xac30, 0xac31, + 0xac31, 0xac32, 0xac32, 0xac32, 0xac33, 0xac33, 0xac33, 0xac34, + 0xac34, 0xac34, 0xac35, 0xac35, 0xac36, 0xac36, 0xac36, 0xac37, + 0xac37, 0xac37, 0xac38, 0xac38, 0xac39, 0xac39, 0xac39, 0xac3a, + 0xac3a, 0xac3a, 0xac3b, 0xac3b, 0xac3c, 0xac3c, 0xac3c, 0xac3d, + 0xac3d, 0xac3d, 0xac3e, 0xac3e, 0xac3e, 0xac3f, 0xac3f, 0xac40, + 0xac40, 0xac40, 0xac41, 0xac41, 0xac41, 0xac42, 0xac42, 0xac43, + 0xac43, 0xac43, 0xac44, 0xac44, 0xac44, 0xac45, 0xac45, 0xac45, + 0xac46, 0xac46, 0xac47, 0xac47, 0xac47, 0xac48, 0xac48, 0xac48, + 0xac49, 0xac49, 0xac49, 0xac4a, 0xac4a, 0xac4b, 0xac4b, 0xac4b, + 0xac4c, 0xac4c, 0xac4c, 0xac4d, 0xac4d, 0xac4d, 0xac4e, 0xac4e, + 0xac4f, 0xac4f, 0xac4f, 0xac50, 0xac50, 0xac50, 0xac51, 0xac51, + 0xac51, 0xac52, 0xac52, 0xac53, 0xac53, 0xac53, 0xac54, 0xac54, + 0xac54, 0xac55, 0xac55, 0xac55, 0xac56, 0xac56, 0xac56, 0xac57, + 0xac57, 0xac58, 0xac58, 0xac58, 0xac59, 0xac59, 0xac59, 0xac5a, + 0xac5a, 0xac5a, 0xac5b, 0xac5b, 0xac5c, 0xac5c, 0xac5c, 0xac5d, + 0xac5d, 0xac5d, 0xac5e, 0xac5e, 0xac5e, 0xac5f, 0xac5f, 0xac5f, + 0xac60, 0xac60, 0xac60, 0xac61, 0xac61, 0xac62, 0xac62, 0xac62, + 0xac63, 0xac63, 0xac63, 0xac64, 0xac64, 0xac64, 0xac65, 0xac65, + 0xac65, 0xac66, 0xac66, 0xac67, 0xac67, 0xac67, 0xac68, 0xac68, + 0xac68, 0xac69, 0xac69, 0xac69, 0xac6a, 0xac6a, 0xac6a, 0xac6b, + 0xac6b, 0xac6b, 0xac6c, 0xac6c, 0xac6c, 0xac6d, 0xac6d, 0xac6e, + 0xac6e, 0xac6e, 0xac6f, 0xac6f, 0xac6f, 0xac70, 0xac70, 0xac70, + 0xac71, 0xac71, 0xac71, 0xac72, 0xac72, 0xac72, 0xac73, 0xac73, + 0xac73, 0xac74, 0xac74, 0xac75, 0xac75, 0xac75, 0xac76, 0xac76, + 0xac76, 0xac77, 0xac77, 0xac77, 0xac78, 0xac78, 0xac78, 0xac79, + 0xac79, 0xac79, 0xac7a, 0xac7a, 0xac7a, 0xac7b, 0xac7b, 0xac7b, + 0xac7c, 0xac7c, 0xac7c, 0xac7d, 0xac7d, 0xac7e, 0xac7e, 0xac7e, + 0xac7f, 0xac7f, 0xac7f, 0xac80, 0xac80, 0xac80, 0xac81, 0xac81, + 0xac81, 0xac82, 0xac82, 0xac82, 0xac83, 0xac83, 0xac83, 0xac84, + 0xac84, 0xac84, 0xac85, 0xac85, 0xac85, 0xac86, 0xac86, 0xac86, + 0xac87, 0xac87, 0xac87, 0xac88, 0xac88, 0xac88, 0xac89, 0xac89, + 0xac8a, 0xac8a, 0xac8a, 0xac8b, 0xac8b, 0xac8b, 0xac8c, 0xac8c, + 0xac8c, 0xac8d, 0xac8d, 0xac8d, 0xac8e, 0xac8e, 0xac8e, 0xac8f, + 0xac8f, 0xac8f, 0xac90, 0xac90, 0xac90, 0xac91, 0xac91, 0xac91, + 0xac92, 0xac92, 0xac92, 0xac93, 0xac93, 0xac93, 0xac94, 0xac94, + 0xac94, 0xac95, 0xac95, 0xac95, 0xac96, 0xac96, 0xac96, 0xac97, + 0xac97, 0xac97, 0xac98, 0xac98, 0xac98, 0xac99, 0xac99, 0xac99, + 0xac9a, 0xac9a, 0xac9a, 0xac9b, 0xac9b, 0xac9b, 0xac9c, 0xac9c, + 0xac9c, 0xac9d, 0xac9d, 0xac9d, 0xac9e, 0xac9e, 0xac9e, 0xac9f, + 0xac9f, 0xac9f, 0xaca0, 0xaca0, 0xaca0, 0xaca1, 0xaca1, 0xaca1, + 0xaca2, 0xaca2, 0xaca2, 0xaca3, 0xaca3, 0xaca3, 0xaca4, 0xaca4, + 0xaca4, 0xaca5, 0xaca5, 0xaca5, 0xaca6, 0xaca6, 0xaca6, 0xaca7, + 0xaca7, 0xaca7, 0xaca8, 0xaca8, 0xaca8, 0xaca9, 0xaca9, 0xaca9, + 0xacaa, 0xacaa, 0xacaa, 0xacab, 0xacab, 0xacab, 0xacac, 0xacac, + 0xacac, 0xacad, 0xacad, 0xacad, 0xacae, 0xacae, 0xacae, 0xacaf, + 0xacaf, 0xacaf, 0xacb0, 0xacb0, 0xacb0, 0xacb1, 0xacb1, 0xacb1, + 0xacb1, 0xacb2, 0xacb2, 0xacb2, 0xacb3, 0xacb3, 0xacb3, 0xacb4, + 0xacb4, 0xacb4, 0xacb5, 0xacb5, 0xacb5, 0xacb6, 0xacb6, 0xacb6, + 0xacb7, 0xacb7, 0xacb7, 0xacb8, 0xacb8, 0xacb8, 0xacb9, 0xacb9, + 0xacb9, 0xacba, 0xacba, 0xacba, 0xacbb, 0xacbb, 0xacbb, 0xacbc, + 0xacbc, 0xacbc, 0xacbd, 0xacbd, 0xacbd, 0xacbe, 0xacbe, 0xacbe, + 0xacbe, 0xacbf, 0xacbf, 0xacbf, 0xacc0, 0xacc0, 0xacc0, 0xacc1, + 0xacc1, 0xacc1, 0xacc2, 0xacc2, 0xacc2, 0xacc3, 0xacc3, 0xacc3, + 0xacc4, 0xacc4, 0xacc4, 0xacc5, 0xacc5, 0xacc5, 0xacc6, 0xacc6, + 0xacc6, 0xacc7, 0xacc7, 0xacc7, 0xacc7, 0xacc8, 0xacc8, 0xacc8, + 0xacc9, 0xacc9, 0xacc9, 0xacca, 0xacca, 0xacca, 0xaccb, 0xaccb, + 0xaccb, 0xaccc, 0xaccc, 0xaccc, 0xaccd, 0xaccd, 0xaccd, 0xacce, + 0xacce, 0xacce, 0xacce, 0xaccf, 0xaccf, 0xaccf, 0xacd0, 0xacd0, + 0xacd0, 0xacd1, 0xacd1, 0xacd1, 0xacd2, 0xacd2, 0xacd2, 0xacd3, + 0xacd3, 0xacd3, 0xacd4, 0xacd4, 0xacd4, 0xacd4, 0xacd5, 0xacd5, + 0xacd5, 0xacd6, 0xacd6, 0xacd6, 0xacd7, 0xacd7, 0xacd7, 0xacd8, + 0xacd8, 0xacd8, 0xacd9, 0xacd9, 0xacd9, 0xacda, 0xacda, 0xacda, + 0xacda, 0xacdb, 0xacdb, 0xacdb, 0xacdc, 0xacdc, 0xacdc, 0xacdd, + 0xacdd, 0xacdd, 0xacde, 0xacde, 0xacde, 0xacdf, 0xacdf, 0xacdf, + 0xacdf, 0xace0, 0xace0, 0xace0, 0xace1, 0xace1, 0xace1, 0xace2, + 0xace2, 0xace2, 0xace3, 0xace3, 0xace3, 0xace4, 0xace4, 0xace4, + 0xace4, 0xace5, 0xace5, 0xace5, 0xace6, 0xace6, 0xace6, 0xace7, + 0xace7, 0xace7, 0xace8, 0xace8, 0xace8, 0xace8, 0xace9, 0xace9, + 0xace9, 0xacea, 0xacea, 0xacea, 0xaceb, 0xaceb, 0xaceb, 0xacec, + 0xacec, 0xacec, 0xaced, 0xaced, 0xaced, 0xaced, 0xacee, 0xacee, + 0xacee, 0xacef, 0xacef, 0xacef, 0xacf0, 0xacf0, 0xacf0, 0xacf1, + 0xacf1, 0xacf1, 0xacf1, 0xacf2, 0xacf2, 0xacf2, 0xacf3, 0xacf3, + 0xacf3, 0xacf4, 0xacf4, 0xacf4, 0xacf4, 0xacf5, 0xacf5, 0xacf5, + 0xacf6, 0xacf6, 0xacf6, 0xacf7, 0xacf7, 0xacf7, 0xacf8, 0xacf8, + 0xacf8, 0xacf8, 0xacf9, 0xacf9, 0xacf9, 0xacfa, 0xacfa, 0xacfa, + 0xacfb, 0xacfb, 0xacfb, 0xacfc, 0xacfc, 0xacfc, 0xacfc, 0xacfd, + 0xacfd, 0xacfd, 0xacfe, 0xacfe, 0xacfe, 0xacff, 0xacff, 0xacff, + 0xacff, 0xad00, 0xad00, 0xad00, 0xad01, 0xad01, 0xad01, 0xad02, + 0xad02, 0xad02, 0xad02, 0xad03, 0xad03, 0xad03, 0xad04, 0xad04, + 0xad04, 0xad05, 0xad05, 0xad05, 0xad05, 0xad06, 0xad06, 0xad06, + 0xad07, 0xad07, 0xad07, 0xad08, 0xad08, 0xad08, 0xad09, 0xad09, + 0xad09, 0xad09, 0xad0a, 0xad0a, 0xad0a, 0xad0b, 0xad0b, 0xad0b, + 0xad0c, 0xad0c, 0xad0c, 0xad0c, 0xad0d, 0xad0d, 0xad0d, 0xad0e, + 0xad0e, 0xad0e, 0xad0e, 0xad0f, 0xad0f, 0xad0f, 0xad10, 0xad10, + 0xad10, 0xad11, 0xad11, 0xad11, 0xad11, 0xad12, 0xad12, 0xad12, + 0xad13, 0xad13, 0xad13, 0xad14, 0xad14, 0xad14, 0xad14, 0xad15, + 0xad15, 0xad15, 0xad16, 0xad16, 0xad16, 0xad17, 0xad17, 0xad17, + 0xad17, 0xad18, 0xad18, 0xad18, 0xad19, 0xad19, 0xad19, 0xad19, + 0xad1a, 0xad1a, 0xad1a, 0xad1b, 0xad1b, 0xad1b, 0xad1c, 0xad1c, + 0xad1c, 0xad1c, 0xad1d, 0xad1d, 0xad1d, 0xad1e, 0xad1e, 0xad1e, + 0xad1f, 0xad1f, 0xad1f, 0xad1f, 0xad20, 0xad20, 0xad20, 0xad21, + 0xad21, 0xad21, 0xad21, 0xad22, 0xad22, 0xad22, 0xad23, 0xad23, + 0xad23, 0xad23, 0xad24, 0xad24, 0xad24, 0xad25, 0xad25, 0xad25, + 0xad26, 0xad26, 0xad27, 0xad27, 0xad28, 0xad28, 0xad29, 0xad2a, + 0xad2a, 0xad2b, 0xad2b, 0xad2c, 0xad2d, 0xad2d, 0xad2e, 0xad2e, + 0xad2f, 0xad2f, 0xad30, 0xad31, 0xad31, 0xad32, 0xad32, 0xad33, + 0xad33, 0xad34, 0xad35, 0xad35, 0xad36, 0xad36, 0xad37, 0xad38, + 0xad38, 0xad39, 0xad39, 0xad3a, 0xad3a, 0xad3b, 0xad3c, 0xad3c, + 0xad3d, 0xad3d, 0xad3e, 0xad3e, 0xad3f, 0xad40, 0xad40, 0xad41, + 0xad41, 0xad42, 0xad42, 0xad43, 0xad44, 0xad44, 0xad45, 0xad45, + 0xad46, 0xad46, 0xad47, 0xad48, 0xad48, 0xad49, 0xad49, 0xad4a, + 0xad4a, 0xad4b, 0xad4b, 0xad4c, 0xad4d, 0xad4d, 0xad4e, 0xad4e, + 0xad4f, 0xad4f, 0xad50, 0xad51, 0xad51, 0xad52, 0xad52, 0xad53, + 0xad53, 0xad54, 0xad54, 0xad55, 0xad56, 0xad56, 0xad57, 0xad57, + 0xad58, 0xad58, 0xad59, 0xad5a, 0xad5a, 0xad5b, 0xad5b, 0xad5c, + 0xad5c, 0xad5d, 0xad5d, 0xad5e, 0xad5f, 0xad5f, 0xad60, 0xad60, + 0xad61, 0xad61, 0xad62, 0xad62, 0xad63, 0xad64, 0xad64, 0xad65, + 0xad65, 0xad66, 0xad66, 0xad67, 0xad67, 0xad68, 0xad69, 0xad69, + 0xad6a, 0xad6a, 0xad6b, 0xad6b, 0xad6c, 0xad6c, 0xad6d, 0xad6d, + 0xad6e, 0xad6f, 0xad6f, 0xad70, 0xad70, 0xad71, 0xad71, 0xad72, + 0xad72, 0xad73, 0xad73, 0xad74, 0xad75, 0xad75, 0xad76, 0xad76, + 0xad77, 0xad77, 0xad78, 0xad78, 0xad79, 0xad79, 0xad7a, 0xad7b, + 0xad7b, 0xad7c, 0xad7c, 0xad7d, 0xad7d, 0xad7e, 0xad7e, 0xad7f, + 0xad7f, 0xad80, 0xad81, 0xad81, 0xad82, 0xad82, 0xad83, 0xad83, + 0xad84, 0xad84, 0xad85, 0xad85, 0xad86, 0xad86, 0xad87, 0xad88, + 0xad88, 0xad89, 0xad89, 0xad8a, 0xad8a, 0xad8b, 0xad8b, 0xad8c, + 0xad8c, 0xad8d, 0xad8d, 0xad8e, 0xad8e, 0xad8f, 0xad90, 0xad90, + 0xad91, 0xad91, 0xad92, 0xad92, 0xad93, 0xad93, 0xad94, 0xad94, + 0xad95, 0xad95, 0xad96, 0xad96, 0xad97, 0xad97, 0xad98, 0xad99, + 0xad99, 0xad9a, 0xad9a, 0xad9b, 0xad9b, 0xad9c, 0xad9c, 0xad9d, + 0xad9d, 0xad9e, 0xad9e, 0xad9f, 0xad9f, 0xada0, 0xada0, 0xada1, + 0xada2, 0xada2, 0xada3, 0xada3, 0xada4, 0xada4, 0xada5, 0xada5, + 0xada6, 0xada6, 0xada7, 0xada7, 0xada8, 0xada8, 0xada9, 0xada9, + 0xadaa, 0xadaa, 0xadab, 0xadab, 0xadac, 0xadac, 0xadad, 0xadae, + 0xadae, 0xadaf, 0xadaf, 0xadb0, 0xadb0, 0xadb1, 0xadb1, 0xadb2, + 0xadb2, 0xadb3, 0xadb3, 0xadb4, 0xadb4, 0xadb5, 0xadb5, 0xadb6, + 0xadb6, 0xadb7, 0xadb7, 0xadb8, 0xadb8, 0xadb9, 0xadb9, 0xadba, + 0xadba, 0xadbb, 0xadbb, 0xadbc, 0xadbd, 0xadbd, 0xadbe, 0xadbe, + 0xadbf, 0xadbf, 0xadc0, 0xadc0, 0xadc1, 0xadc1, 0xadc2, 0xadc2, + 0xadc3, 0xadc3, 0xadc4, 0xadc4, 0xadc5, 0xadc5, 0xadc6, 0xadc6, + 0xadc7, 0xadc7, 0xadc8, 0xadc8, 0xadc9, 0xadc9, 0xadca, 0xadca, + 0xadcb, 0xadcb, 0xadcc, 0xadcc, 0xadcd, 0xadcd, 0xadce, 0xadce, + 0xadcf, 0xadcf, 0xadd0, 0xadd0, 0xadd1, 0xadd1, 0xadd2, 0xadd2, + 0xadd3, 0xadd3, 0xadd4, 0xadd4, 0xadd5, 0xadd5, 0xadd6, 0xadd6, + 0xadd7, 0xadd7, 0xadd8, 0xadd8, 0xadd9, 0xadd9, 0xadda, 0xadda, + 0xaddb, 0xaddb, 0xaddc, 0xaddc, 0xaddd, 0xaddd, 0xadde, 0xadde, + 0xaddf, 0xaddf, 0xade0, 0xade0, 0xade1, 0xade1, 0xade2, 0xade2, + 0xade3, 0xade3, 0xade4, 0xade4, 0xade5, 0xade5, 0xade6, 0xade6, + 0xade7, 0xade7, 0xade8, 0xade8, 0xade9, 0xade9, 0xadea, 0xadea, + 0xadeb, 0xadeb, 0xadec, 0xadec, 0xaded, 0xaded, 0xadee, 0xadee, + 0xadef, 0xadef, 0xadf0, 0xadf0, 0xadf1, 0xadf1, 0xadf2, 0xadf2, + 0xadf3, 0xadf3, 0xadf4, 0xadf4, 0xadf5, 0xadf5, 0xadf6, 0xadf6, + 0xadf7, 0xadf7, 0xadf8, 0xadf8, 0xadf9, 0xadf9, 0xadfa, 0xadfa, + 0xadfb, 0xadfb, 0xadfc, 0xadfc, 0xadfd, 0xadfd, 0xadfe, 0xadfe, + 0xadfe, 0xadff, 0xadff, 0xae00, 0xae00, 0xae01, 0xae01, 0xae02, + 0xae02, 0xae03, 0xae03, 0xae04, 0xae04, 0xae05, 0xae05, 0xae06, + 0xae06, 0xae07, 0xae07, 0xae08, 0xae08, 0xae09, 0xae09, 0xae0a, + 0xae0a, 0xae0b, 0xae0b, 0xae0c, 0xae0c, 0xae0d, 0xae0d, 0xae0e, + 0xae0e, 0xae0e, 0xae0f, 0xae0f, 0xae10, 0xae10, 0xae11, 0xae11, + 0xae12, 0xae12, 0xae13, 0xae13, 0xae14, 0xae14, 0xae15, 0xae15, + 0xae16, 0xae16, 0xae17, 0xae17, 0xae18, 0xae18, 0xae19, 0xae19, + 0xae19, 0xae1a, 0xae1a, 0xae1b, 0xae1b, 0xae1c, 0xae1c, 0xae1d, + 0xae1d, 0xae1e, 0xae1e, 0xae1f, 0xae1f, 0xae20, 0xae20, 0xae21, + 0xae21, 0xae22, 0xae22, 0xae23, 0xae23, 0xae23, 0xae24, 0xae24, + 0xae25, 0xae25, 0xae26, 0xae26, 0xae27, 0xae27, 0xae28, 0xae28, + 0xae29, 0xae29, 0xae2a, 0xae2a, 0xae2b, 0xae2b, 0xae2b, 0xae2c, + 0xae2c, 0xae2d, 0xae2d, 0xae2e, 0xae2e, 0xae2f, 0xae2f, 0xae30, + 0xae30, 0xae31, 0xae31, 0xae32, 0xae32, 0xae33, 0xae33, 0xae33, + 0xae34, 0xae34, 0xae35, 0xae35, 0xae36, 0xae36, 0xae37, 0xae37, + 0xae38, 0xae38, 0xae39, 0xae39, 0xae3a, 0xae3a, 0xae3a, 0xae3b, + 0xae3b, 0xae3c, 0xae3c, 0xae3d, 0xae3d, 0xae3e, 0xae3e, 0xae3f, + 0xae3f, 0xae40, 0xae40, 0xae40, 0xae41, 0xae41, 0xae42, 0xae42, + 0xae43, 0xae43, 0xae44, 0xae44, 0xae45, 0xae45, 0xae46, 0xae46, + 0xae47, 0xae47, 0xae47, 0xae48, 0xae48, 0xae49, 0xae49, 0xae4a, + 0xae4a, 0xae4b, 0xae4b, 0xae4c, 0xae4c, 0xae4c, 0xae4d, 0xae4d, + 0xae4e, 0xae4e, 0xae4f, 0xae4f, 0xae50, 0xae50, 0xae51, 0xae51, + 0xae52, 0xae52, 0xae52, 0xae53, 0xae53, 0xae54, 0xae54, 0xae55, + 0xae55, 0xae56, 0xae56, 0xae57, 0xae57, 0xae57, 0xae58, 0xae58, + 0xae59, 0xae59, 0xae5a, 0xae5a, 0xae5b, 0xae5b, 0xae5c, 0xae5c, + 0xae5c, 0xae5d, 0xae5d, 0xae5e, 0xae5e, 0xae5f, 0xae5f, 0xae60, + 0xae60, 0xae61, 0xae61, 0xae61, 0xae62, 0xae62, 0xae63, 0xae63, + 0xae64, 0xae64, 0xae65, 0xae65, 0xae65, 0xae66, 0xae66, 0xae67, + 0xae67, 0xae68, 0xae68, 0xae69, 0xae69, 0xae6a, 0xae6a, 0xae6a, + 0xae6b, 0xae6b, 0xae6c, 0xae6c, 0xae6d, 0xae6d, 0xae6e, 0xae6e, + 0xae6e, 0xae6f, 0xae6f, 0xae70, 0xae70, 0xae71, 0xae71, 0xae72, + 0xae72, 0xae72, 0xae73, 0xae73, 0xae74, 0xae74, 0xae75, 0xae75, + 0xae76, 0xae76, 0xae77, 0xae77, 0xae77, 0xae78, 0xae78, 0xae79, + 0xae79, 0xae7a, 0xae7a, 0xae7b, 0xae7b, 0xae7b, 0xae7c, 0xae7c, + 0xae7d, 0xae7d, 0xae7e, 0xae7e, 0xae7e, 0xae7f, 0xae7f, 0xae80, + 0xae80, 0xae81, 0xae81, 0xae82, 0xae82, 0xae82, 0xae83, 0xae83, + 0xae84, 0xae84, 0xae85, 0xae85, 0xae86, 0xae86, 0xae86, 0xae87, + 0xae87, 0xae88, 0xae88, 0xae89, 0xae89, 0xae8a, 0xae8a, 0xae8a, + 0xae8b, 0xae8b, 0xae8c, 0xae8c, 0xae8d, 0xae8d, 0xae8d, 0xae8e, + 0xae8e, 0xae8f, 0xae8f, 0xae90, 0xae90, 0xae91, 0xae91, 0xae91, + 0xae92, 0xae92, 0xae93, 0xae93, 0xae94, 0xae94, 0xae94, 0xae95, + 0xae95, 0xae96, 0xae96, 0xae97, 0xae97, 0xae97, 0xae98, 0xae98, + 0xae99, 0xae99, 0xae9a, 0xae9a, 0xae9b, 0xae9b, 0xae9b, 0xae9c, + 0xae9c, 0xae9d, 0xae9d, 0xae9e, 0xae9e, 0xae9e, 0xae9f, 0xae9f, + 0xaea0, 0xaea0, 0xaea1, 0xaea1, 0xaea1, 0xaea2, 0xaea2, 0xaea3, + 0xaea3, 0xaea4, 0xaea4, 0xaea4, 0xaea5, 0xaea5, 0xaea6, 0xaea6, + 0xaea7, 0xaea7, 0xaea7, 0xaea8, 0xaea8, 0xaea9, 0xaea9, 0xaeaa, + 0xaeaa, 0xaeaa, 0xaeab, 0xaeab, 0xaeac, 0xaeac, 0xaead, 0xaead, + 0xaead, 0xaeae, 0xaeae, 0xaeaf, 0xaeaf, 0xaeb0, 0xaeb0, 0xaeb0, + 0xaeb1, 0xaeb1, 0xaeb2, 0xaeb2, 0xaeb3, 0xaeb3, 0xaeb3, 0xaeb4, + 0xaeb4, 0xaeb5, 0xaeb5, 0xaeb6, 0xaeb6, 0xaeb6, 0xaeb7, 0xaeb7, + 0xaeb8, 0xaeb8, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeba, 0xaeba, 0xaebb, + 0xaebb, 0xaebc, 0xaebc, 0xaebc, 0xaebd, 0xaebd, 0xaebe, 0xaebe, + 0xaebe, 0xaebf, 0xaebf, 0xaec0, 0xaec0, 0xaec1, 0xaec1, 0xaec1, + 0xaec2, 0xaec2, 0xaec3, 0xaec3, 0xaec4, 0xaec4, 0xaec4, 0xaec5, + 0xaec5, 0xaec6, 0xaec6, 0xaec7, 0xaec7, 0xaec7, 0xaec8, 0xaec8, + 0xaec9, 0xaec9, 0xaec9, 0xaeca, 0xaeca, 0xaecb, 0xaecb, 0xaecc, + 0xaecc, 0xaecc, 0xaecd, 0xaecd, 0xaece, 0xaece, 0xaece, 0xaecf, + 0xaecf, 0xaed0, 0xaed0, 0xaed1, 0xaed1, 0xaed1, 0xaed2, 0xaed2, + 0xaed3, 0xaed3, 0xaed3, 0xaed4, 0xaed4, 0xaed5, 0xaed5, 0xaed6, + 0xaed6, 0xaed6, 0xaed7, 0xaed7, 0xaed8, 0xaed8, 0xaed8, 0xaed9, + 0xaed9, 0xaeda, 0xaeda, 0xaedb, 0xaedb, 0xaedb, 0xaedc, 0xaedc, + 0xaedd, 0xaedd, 0xaedd, 0xaede, 0xaede, 0xaedf, 0xaedf, 0xaee0, + 0xaee0, 0xaee0, 0xaee1, 0xaee1, 0xaee2, 0xaee2, 0xaee2, 0xaee3, + 0xaee3, 0xaee4, 0xaee4, 0xaee4, 0xaee5, 0xaee5, 0xaee6, 0xaee6, + 0xaee7, 0xaee7, 0xaee7, 0xaee8, 0xaee8, 0xaee9, 0xaee9, 0xaee9, + 0xaeea, 0xaeea, 0xaeeb, 0xaeeb, 0xaeeb, 0xaeec, 0xaeec, 0xaeed, + 0xaeed, 0xaeee, 0xaeee, 0xaeee, 0xaeef, 0xaeef, 0xaef0, 0xaef0, + 0xaef0, 0xaef1, 0xaef1, 0xaef2, 0xaef2, 0xaef2, 0xaef3, 0xaef3, + 0xaef4, 0xaef4, 0xaef4, 0xaef5, 0xaef5, 0xaef6, 0xaef6, 0xaef6, + 0xaef7, 0xaef7, 0xaef8, 0xaef8, 0xaef9, 0xaef9, 0xaef9, 0xaefa, + 0xaefa, 0xaefb, 0xaefb, 0xaefb, 0xaefc, 0xaefc, 0xaefd, 0xaefd, + 0xaefd, 0xaefe, 0xaefe, 0xaeff, 0xaeff, 0xaeff, 0xaf00, 0xaf00, + 0xaf01, 0xaf01, 0xaf01, 0xaf02, 0xaf02, 0xaf03, 0xaf03, 0xaf03, + 0xaf04, 0xaf04, 0xaf05, 0xaf05, 0xaf05, 0xaf06, 0xaf06, 0xaf07, + 0xaf07, 0xaf07, 0xaf08, 0xaf08, 0xaf09, 0xaf09, 0xaf09, 0xaf0a, + 0xaf0a, 0xaf0b, 0xaf0b, 0xaf0b, 0xaf0c, 0xaf0c, 0xaf0d, 0xaf0d, + 0xaf0d, 0xaf0e, 0xaf0f, 0xaf10, 0xaf11, 0xaf12, 0xaf12, 0xaf13, + 0xaf14, 0xaf15, 0xaf15, 0xaf16, 0xaf17, 0xaf18, 0xaf19, 0xaf19, + 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1d, 0xaf1e, 0xaf1f, 0xaf20, + 0xaf21, 0xaf21, 0xaf22, 0xaf23, 0xaf24, 0xaf25, 0xaf25, 0xaf26, + 0xaf27, 0xaf28, 0xaf29, 0xaf29, 0xaf2a, 0xaf2b, 0xaf2c, 0xaf2c, + 0xaf2d, 0xaf2e, 0xaf2f, 0xaf30, 0xaf30, 0xaf31, 0xaf32, 0xaf33, + 0xaf33, 0xaf34, 0xaf35, 0xaf36, 0xaf37, 0xaf37, 0xaf38, 0xaf39, + 0xaf3a, 0xaf3b, 0xaf3b, 0xaf3c, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3f, + 0xaf40, 0xaf41, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf45, + 0xaf46, 0xaf47, 0xaf48, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, + 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, + 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf56, 0xaf57, 0xaf58, + 0xaf59, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5c, 0xaf5d, 0xaf5e, + 0xaf5f, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf62, 0xaf63, 0xaf64, + 0xaf65, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf69, 0xaf6a, + 0xaf6b, 0xaf6c, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf6f, 0xaf70, + 0xaf71, 0xaf72, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf75, 0xaf76, + 0xaf77, 0xaf78, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7b, 0xaf7c, + 0xaf7d, 0xaf7e, 0xaf7e, 0xaf7f, 0xaf80, 0xaf81, 0xaf81, 0xaf82, + 0xaf83, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf86, 0xaf87, 0xaf88, + 0xaf89, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8c, 0xaf8d, 0xaf8e, + 0xaf8f, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf92, 0xaf93, 0xaf94, + 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, + 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9d, 0xaf9e, 0xaf9f, 0xaf9f, + 0xafa0, 0xafa1, 0xafa2, 0xafa2, 0xafa3, 0xafa4, 0xafa5, 0xafa5, + 0xafa6, 0xafa7, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafaa, 0xafab, + 0xafac, 0xafad, 0xafad, 0xafae, 0xafaf, 0xafaf, 0xafb0, 0xafb1, + 0xafb2, 0xafb2, 0xafb3, 0xafb4, 0xafb4, 0xafb5, 0xafb6, 0xafb7, + 0xafb7, 0xafb8, 0xafb9, 0xafba, 0xafba, 0xafbb, 0xafbc, 0xafbc, + 0xafbd, 0xafbe, 0xafbf, 0xafbf, 0xafc0, 0xafc1, 0xafc1, 0xafc2, + 0xafc3, 0xafc4, 0xafc4, 0xafc5, 0xafc6, 0xafc6, 0xafc7, 0xafc8, + 0xafc9, 0xafc9, 0xafca, 0xafcb, 0xafcb, 0xafcc, 0xafcd, 0xafce, + 0xafce, 0xafcf, 0xafd0, 0xafd0, 0xafd1, 0xafd2, 0xafd2, 0xafd3, + 0xafd4, 0xafd5, 0xafd5, 0xafd6, 0xafd7, 0xafd7, 0xafd8, 0xafd9, + 0xafda, 0xafda, 0xafdb, 0xafdc, 0xafdc, 0xafdd, 0xafde, 0xafde, + 0xafdf, 0xafe0, 0xafe1, 0xafe1, 0xafe2, 0xafe3, 0xafe3, 0xafe4, + 0xafe5, 0xafe5, 0xafe6, 0xafe7, 0xafe8, 0xafe8, 0xafe9, 0xafea, + 0xafea, 0xafeb, 0xafec, 0xafec, 0xafed, 0xafee, 0xafef, 0xafef, + 0xaff0, 0xaff1, 0xaff1, 0xaff2, 0xaff3, 0xaff3, 0xaff4, 0xaff5, + 0xaff6, 0xaff6, 0xaff7, 0xaff8, 0xaff8, 0xaff9, 0xaffa, 0xaffa, + 0xaffb, 0xaffc, 0xaffc, 0xaffd, 0xaffe, 0xafff, 0xafff, 0xb000, + 0xb000, 0xb001, 0xb001, 0xb001, 0xb002, 0xb002, 0xb002, 0xb003, + 0xb003, 0xb003, 0xb004, 0xb004, 0xb004, 0xb005, 0xb005, 0xb005, + 0xb006, 0xb006, 0xb006, 0xb007, 0xb007, 0xb007, 0xb008, 0xb008, + 0xb009, 0xb009, 0xb009, 0xb00a, 0xb00a, 0xb00a, 0xb00b, 0xb00b, + 0xb00b, 0xb00c, 0xb00c, 0xb00c, 0xb00d, 0xb00d, 0xb00d, 0xb00e, + 0xb00e, 0xb00e, 0xb00f, 0xb00f, 0xb00f, 0xb010, 0xb010, 0xb010, + 0xb011, 0xb011, 0xb011, 0xb012, 0xb012, 0xb012, 0xb013, 0xb013, + 0xb013, 0xb014, 0xb014, 0xb014, 0xb015, 0xb015, 0xb015, 0xb016, + 0xb016, 0xb016, 0xb017, 0xb017, 0xb017, 0xb018, 0xb018, 0xb018, + 0xb019, 0xb019, 0xb019, 0xb01a, 0xb01a, 0xb01a, 0xb01b, 0xb01b, + 0xb01b, 0xb01c, 0xb01c, 0xb01c, 0xb01d, 0xb01d, 0xb01d, 0xb01e, + 0xb01e, 0xb01e, 0xb01f, 0xb01f, 0xb01f, 0xb020, 0xb020, 0xb020, + 0xb021, 0xb021, 0xb021, 0xb022, 0xb022, 0xb022, 0xb023, 0xb023, + 0xb023, 0xb024, 0xb024, 0xb024, 0xb025, 0xb025, 0xb025, 0xb026, + 0xb026, 0xb026, 0xb027, 0xb027, 0xb027, 0xb028, 0xb028, 0xb028, + 0xb029, 0xb029, 0xb029, 0xb02a, 0xb02a, 0xb02a, 0xb02b, 0xb02b, + 0xb02b, 0xb02c, 0xb02c, 0xb02c, 0xb02d, 0xb02d, 0xb02d, 0xb02e, + 0xb02e, 0xb02e, 0xb02f, 0xb02f, 0xb02f, 0xb030, 0xb030, 0xb030, + 0xb031, 0xb031, 0xb031, 0xb031, 0xb032, 0xb032, 0xb032, 0xb033, + 0xb033, 0xb033, 0xb034, 0xb034, 0xb034, 0xb035, 0xb035, 0xb035, + 0xb036, 0xb036, 0xb036, 0xb037, 0xb037, 0xb037, 0xb038, 0xb038, + 0xb038, 0xb039, 0xb039, 0xb039, 0xb03a, 0xb03a, 0xb03a, 0xb03b, + 0xb03b, 0xb03b, 0xb03c, 0xb03c, 0xb03c, 0xb03c, 0xb03d, 0xb03d, + 0xb03d, 0xb03e, 0xb03e, 0xb03e, 0xb03f, 0xb03f, 0xb03f, 0xb040, + 0xb040, 0xb040, 0xb041, 0xb041, 0xb041, 0xb042, 0xb042, 0xb042, + 0xb043, 0xb043, 0xb043, 0xb044, 0xb044, 0xb044, 0xb044, 0xb045, + 0xb045, 0xb045, 0xb046, 0xb046, 0xb046, 0xb047, 0xb047, 0xb047, + 0xb048, 0xb048, 0xb048, 0xb049, 0xb049, 0xb049, 0xb04a, 0xb04a, + 0xb04a, 0xb04b, 0xb04b, 0xb04b, 0xb04b, 0xb04c, 0xb04c, 0xb04c, + 0xb04d, 0xb04d, 0xb04d, 0xb04e, 0xb04e, 0xb04e, 0xb04f, 0xb04f, + 0xb04f, 0xb050, 0xb050, 0xb050, 0xb051, 0xb051, 0xb051, 0xb051, + 0xb052, 0xb052, 0xb052, 0xb053, 0xb053, 0xb053, 0xb054, 0xb054, + 0xb054, 0xb055, 0xb055, 0xb055, 0xb056, 0xb056, 0xb056, 0xb056, + 0xb057, 0xb057, 0xb057, 0xb058, 0xb058, 0xb058, 0xb059, 0xb059, + 0xb059, 0xb05a, 0xb05a, 0xb05a, 0xb05b, 0xb05b, 0xb05b, 0xb05b, + 0xb05c, 0xb05c, 0xb05c, 0xb05d, 0xb05d, 0xb05d, 0xb05e, 0xb05e, + 0xb05e, 0xb05f, 0xb05f, 0xb05f, 0xb05f, 0xb060, 0xb060, 0xb060, + 0xb061, 0xb061, 0xb061, 0xb062, 0xb062, 0xb062, 0xb063, 0xb063, + 0xb063, 0xb064, 0xb064, 0xb064, 0xb064, 0xb065, 0xb065, 0xb065, + 0xb066, 0xb066, 0xb066, 0xb067, 0xb067, 0xb067, 0xb068, 0xb068, + 0xb068, 0xb068, 0xb069, 0xb069, 0xb069, 0xb06a, 0xb06a, 0xb06a, + 0xb06b, 0xb06b, 0xb06b, 0xb06b, 0xb06c, 0xb06c, 0xb06c, 0xb06d, + 0xb06d, 0xb06d, 0xb06e, 0xb06e, 0xb06e, 0xb06f, 0xb06f, 0xb06f, + 0xb06f, 0xb070, 0xb070, 0xb070, 0xb071, 0xb071, 0xb071, 0xb072, + 0xb072, 0xb072, 0xb072, 0xb073, 0xb073, 0xb073, 0xb074, 0xb074, + 0xb074, 0xb075, 0xb075, 0xb075, 0xb076, 0xb076, 0xb076, 0xb076, + 0xb077, 0xb077, 0xb077, 0xb078, 0xb078, 0xb078, 0xb079, 0xb079, + 0xb079, 0xb079, 0xb07a, 0xb07a, 0xb07a, 0xb07b, 0xb07b, 0xb07b, + 0xb07c, 0xb07c, 0xb07c, 0xb07c, 0xb07d, 0xb07d, 0xb07d, 0xb07e, + 0xb07e, 0xb07e, 0xb07f, 0xb07f, 0xb07f, 0xb07f, 0xb080, 0xb080, + 0xb080, 0xb081, 0xb081, 0xb081, 0xb082, 0xb082, 0xb082, 0xb082, + 0xb083, 0xb083, 0xb083, 0xb084, 0xb084, 0xb084, 0xb085, 0xb085, + 0xb085, 0xb085, 0xb086, 0xb086, 0xb086, 0xb087, 0xb087, 0xb087, + 0xb087, 0xb088, 0xb088, 0xb088, 0xb089, 0xb089, 0xb089, 0xb08a, + 0xb08a, 0xb08a, 0xb08a, 0xb08b, 0xb08b, 0xb08b, 0xb08c, 0xb08c, + 0xb08c, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08e, 0xb08e, 0xb08e, + 0xb08f, 0xb08f, 0xb08f, 0xb08f, 0xb090, 0xb090, 0xb090, 0xb091, + 0xb091, 0xb091, 0xb092, 0xb092, 0xb092, 0xb092, 0xb093, 0xb093, + 0xb093, 0xb094, 0xb094, 0xb094, 0xb094, 0xb095, 0xb095, 0xb095, + 0xb096, 0xb096, 0xb096, 0xb097, 0xb097, 0xb097, 0xb097, 0xb098, + 0xb098, 0xb098, 0xb099, 0xb099, 0xb099, 0xb099, 0xb09a, 0xb09a, + 0xb09a, 0xb09b, 0xb09b, 0xb09b, 0xb09b, 0xb09c, 0xb09c, 0xb09c, + 0xb09d, 0xb09d, 0xb09d, 0xb09e, 0xb09e, 0xb09e, 0xb09e, 0xb09f, + 0xb09f, 0xb09f, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a0, 0xb0a1, 0xb0a1, + 0xb0a1, 0xb0a2, 0xb0a2, 0xb0a2, 0xb0a2, 0xb0a3, 0xb0a3, 0xb0a3, + 0xb0a4, 0xb0a4, 0xb0a4, 0xb0a4, 0xb0a5, 0xb0a5, 0xb0a5, 0xb0a6, + 0xb0a6, 0xb0a6, 0xb0a6, 0xb0a7, 0xb0a7, 0xb0a7, 0xb0a8, 0xb0a8, + 0xb0a8, 0xb0a8, 0xb0a9, 0xb0a9, 0xb0a9, 0xb0aa, 0xb0aa, 0xb0aa, + 0xb0aa, 0xb0ab, 0xb0ab, 0xb0ab, 0xb0ac, 0xb0ac, 0xb0ac, 0xb0ac, + 0xb0ad, 0xb0ad, 0xb0ad, 0xb0ae, 0xb0ae, 0xb0ae, 0xb0ae, 0xb0af, + 0xb0af, 0xb0af, 0xb0b0, 0xb0b0, 0xb0b0, 0xb0b0, 0xb0b1, 0xb0b1, + 0xb0b1, 0xb0b2, 0xb0b2, 0xb0b2, 0xb0b2, 0xb0b3, 0xb0b3, 0xb0b3, + 0xb0b4, 0xb0b4, 0xb0b4, 0xb0b4, 0xb0b5, 0xb0b5, 0xb0b5, 0xb0b6, + 0xb0b6, 0xb0b6, 0xb0b6, 0xb0b7, 0xb0b7, 0xb0b7, 0xb0b8, 0xb0b8, + 0xb0b8, 0xb0b8, 0xb0b9, 0xb0b9, 0xb0b9, 0xb0ba, 0xb0ba, 0xb0ba, + 0xb0ba, 0xb0bb, 0xb0bb, 0xb0bb, 0xb0bc, 0xb0bc, 0xb0bc, 0xb0bc, + 0xb0bd, 0xb0bd, 0xb0bd, 0xb0bd, 0xb0be, 0xb0be, 0xb0be, 0xb0bf, + 0xb0bf, 0xb0bf, 0xb0bf, 0xb0c0, 0xb0c0, 0xb0c0, 0xb0c1, 0xb0c1, + 0xb0c1, 0xb0c1, 0xb0c2, 0xb0c2, 0xb0c2, 0xb0c3, 0xb0c3, 0xb0c3, + 0xb0c3, 0xb0c4, 0xb0c4, 0xb0c4, 0xb0c4, 0xb0c5, 0xb0c5, 0xb0c5, + 0xb0c6, 0xb0c6, 0xb0c6, 0xb0c6, 0xb0c7, 0xb0c7, 0xb0c7, 0xb0c8, + 0xb0c8, 0xb0c8, 0xb0c8, 0xb0c9, 0xb0c9, 0xb0c9, 0xb0c9, 0xb0ca, + 0xb0ca, 0xb0ca, 0xb0cb, 0xb0cb, 0xb0cb, 0xb0cb, 0xb0cc, 0xb0cc, + 0xb0cc, 0xb0cd, 0xb0cd, 0xb0cd, 0xb0cd, 0xb0ce, 0xb0ce, 0xb0ce, + 0xb0ce, 0xb0cf, 0xb0cf, 0xb0cf, 0xb0d0, 0xb0d0, 0xb0d0, 0xb0d0, + 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d2, 0xb0d2, 0xb0d2, 0xb0d2, 0xb0d3, + 0xb0d3, 0xb0d3, 0xb0d3, 0xb0d4, 0xb0d4, 0xb0d4, 0xb0d5, 0xb0d5, + 0xb0d5, 0xb0d6, 0xb0d6, 0xb0d7, 0xb0d7, 0xb0d8, 0xb0d8, 0xb0d9, + 0xb0d9, 0xb0da, 0xb0db, 0xb0db, 0xb0dc, 0xb0dc, 0xb0dd, 0xb0dd, + 0xb0de, 0xb0de, 0xb0df, 0xb0df, 0xb0e0, 0xb0e1, 0xb0e1, 0xb0e2, + 0xb0e2, 0xb0e3, 0xb0e3, 0xb0e4, 0xb0e4, 0xb0e5, 0xb0e5, 0xb0e6, + 0xb0e7, 0xb0e7, 0xb0e8, 0xb0e8, 0xb0e9, 0xb0e9, 0xb0ea, 0xb0ea, + 0xb0eb, 0xb0eb, 0xb0ec, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ee, 0xb0ef, + 0xb0ef, 0xb0f0, 0xb0f0, 0xb0f1, 0xb0f1, 0xb0f2, 0xb0f2, 0xb0f3, + 0xb0f3, 0xb0f4, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f6, 0xb0f7, 0xb0f7, + 0xb0f8, 0xb0f8, 0xb0f9, 0xb0f9, 0xb0fa, 0xb0fa, 0xb0fb, 0xb0fb, + 0xb0fc, 0xb0fc, 0xb0fd, 0xb0fd, 0xb0fe, 0xb0ff, 0xb0ff, 0xb100, + 0xb100, 0xb101, 0xb101, 0xb102, 0xb102, 0xb103, 0xb103, 0xb104, + 0xb104, 0xb105, 0xb105, 0xb106, 0xb106, 0xb107, 0xb107, 0xb108, + 0xb109, 0xb109, 0xb10a, 0xb10a, 0xb10b, 0xb10b, 0xb10c, 0xb10c, + 0xb10d, 0xb10d, 0xb10e, 0xb10e, 0xb10f, 0xb10f, 0xb110, 0xb110, + 0xb111, 0xb111, 0xb112, 0xb112, 0xb113, 0xb113, 0xb114, 0xb114, + 0xb115, 0xb116, 0xb116, 0xb117, 0xb117, 0xb118, 0xb118, 0xb119, + 0xb119, 0xb11a, 0xb11a, 0xb11b, 0xb11b, 0xb11c, 0xb11c, 0xb11d, + 0xb11d, 0xb11e, 0xb11e, 0xb11f, 0xb11f, 0xb120, 0xb120, 0xb121, + 0xb121, 0xb122, 0xb122, 0xb123, 0xb123, 0xb124, 0xb124, 0xb125, + 0xb125, 0xb126, 0xb126, 0xb127, 0xb127, 0xb128, 0xb128, 0xb129, + 0xb129, 0xb12a, 0xb12a, 0xb12b, 0xb12c, 0xb12c, 0xb12d, 0xb12d, + 0xb12e, 0xb12e, 0xb12f, 0xb12f, 0xb130, 0xb130, 0xb131, 0xb131, + 0xb132, 0xb132, 0xb133, 0xb133, 0xb134, 0xb134, 0xb135, 0xb135, + 0xb136, 0xb136, 0xb137, 0xb137, 0xb138, 0xb138, 0xb139, 0xb139, + 0xb13a, 0xb13a, 0xb13b, 0xb13b, 0xb13c, 0xb13c, 0xb13d, 0xb13d, + 0xb13e, 0xb13e, 0xb13f, 0xb13f, 0xb140, 0xb140, 0xb141, 0xb141, + 0xb142, 0xb142, 0xb143, 0xb143, 0xb144, 0xb144, 0xb145, 0xb145, + 0xb146, 0xb146, 0xb147, 0xb147, 0xb148, 0xb148, 0xb148, 0xb149, + 0xb149, 0xb14a, 0xb14a, 0xb14b, 0xb14b, 0xb14c, 0xb14c, 0xb14d, + 0xb14d, 0xb14e, 0xb14e, 0xb14f, 0xb14f, 0xb150, 0xb150, 0xb151, + 0xb151, 0xb152, 0xb152, 0xb153, 0xb153, 0xb154, 0xb154, 0xb155, + 0xb155, 0xb156, 0xb156, 0xb157, 0xb157, 0xb158, 0xb158, 0xb159, + 0xb159, 0xb15a, 0xb15a, 0xb15b, 0xb15b, 0xb15c, 0xb15c, 0xb15d, + 0xb15d, 0xb15e, 0xb15e, 0xb15e, 0xb15f, 0xb15f, 0xb160, 0xb160, + 0xb161, 0xb161, 0xb162, 0xb162, 0xb163, 0xb163, 0xb164, 0xb164, + 0xb165, 0xb165, 0xb166, 0xb166, 0xb167, 0xb167, 0xb168, 0xb168, + 0xb169, 0xb169, 0xb16a, 0xb16a, 0xb16b, 0xb16b, 0xb16b, 0xb16c, + 0xb16c, 0xb16d, 0xb16d, 0xb16e, 0xb16e, 0xb16f, 0xb16f, 0xb170, + 0xb170, 0xb171, 0xb171, 0xb172, 0xb172, 0xb173, 0xb173, 0xb174, + 0xb174, 0xb175, 0xb175, 0xb175, 0xb176, 0xb176, 0xb177, 0xb177, + 0xb178, 0xb178, 0xb179, 0xb179, 0xb17a, 0xb17a, 0xb17b, 0xb17b, + 0xb17c, 0xb17c, 0xb17d, 0xb17d, 0xb17e, 0xb17e, 0xb17e, 0xb17f, + 0xb17f, 0xb180, 0xb180, 0xb181, 0xb181, 0xb182, 0xb182, 0xb183, + 0xb183, 0xb184, 0xb184, 0xb185, 0xb185, 0xb185, 0xb186, 0xb186, + 0xb187, 0xb187, 0xb188, 0xb188, 0xb189, 0xb189, 0xb18a, 0xb18a, + 0xb18b, 0xb18b, 0xb18c, 0xb18c, 0xb18c, 0xb18d, 0xb18d, 0xb18e, + 0xb18e, 0xb18f, 0xb18f, 0xb190, 0xb190, 0xb191, 0xb191, 0xb192, + 0xb192, 0xb193, 0xb193, 0xb193, 0xb194, 0xb194, 0xb195, 0xb195, + 0xb196, 0xb196, 0xb197, 0xb197, 0xb198, 0xb198, 0xb199, 0xb199, + 0xb199, 0xb19a, 0xb19a, 0xb19b, 0xb19b, 0xb19c, 0xb19c, 0xb19d, + 0xb19d, 0xb19e, 0xb19e, 0xb19f, 0xb19f, 0xb19f, 0xb1a0, 0xb1a0, + 0xb1a1, 0xb1a1, 0xb1a2, 0xb1a2, 0xb1a3, 0xb1a3, 0xb1a4, 0xb1a4, + 0xb1a4, 0xb1a5, 0xb1a5, 0xb1a6, 0xb1a6, 0xb1a7, 0xb1a7, 0xb1a8, + 0xb1a8, 0xb1a9, 0xb1a9, 0xb1a9, 0xb1aa, 0xb1aa, 0xb1ab, 0xb1ab, + 0xb1ac, 0xb1ac, 0xb1ad, 0xb1ad, 0xb1ae, 0xb1ae, 0xb1ae, 0xb1af, + 0xb1af, 0xb1b0, 0xb1b0, 0xb1b1, 0xb1b1, 0xb1b2, 0xb1b2, 0xb1b2, + 0xb1b3, 0xb1b3, 0xb1b4, 0xb1b4, 0xb1b5, 0xb1b5, 0xb1b6, 0xb1b6, + 0xb1b7, 0xb1b7, 0xb1b7, 0xb1b8, 0xb1b8, 0xb1b9, 0xb1b9, 0xb1ba, + 0xb1ba, 0xb1bb, 0xb1bb, 0xb1bb, 0xb1bc, 0xb1bc, 0xb1bd, 0xb1bd, + 0xb1be, 0xb1be, 0xb1bf, 0xb1bf, 0xb1bf, 0xb1c0, 0xb1c0, 0xb1c1, + 0xb1c1, 0xb1c2, 0xb1c2, 0xb1c3, 0xb1c3, 0xb1c4, 0xb1c4, 0xb1c4, + 0xb1c5, 0xb1c5, 0xb1c6, 0xb1c6, 0xb1c7, 0xb1c7, 0xb1c7, 0xb1c8, + 0xb1c8, 0xb1c9, 0xb1c9, 0xb1ca, 0xb1ca, 0xb1cb, 0xb1cb, 0xb1cb, + 0xb1cc, 0xb1cc, 0xb1cd, 0xb1cd, 0xb1ce, 0xb1ce, 0xb1cf, 0xb1cf, + 0xb1cf, 0xb1d0, 0xb1d0, 0xb1d1, 0xb1d1, 0xb1d2, 0xb1d2, 0xb1d3, + 0xb1d3, 0xb1d3, 0xb1d4, 0xb1d4, 0xb1d5, 0xb1d5, 0xb1d6, 0xb1d6, + 0xb1d6, 0xb1d7, 0xb1d7, 0xb1d8, 0xb1d8, 0xb1d9, 0xb1d9, 0xb1da, + 0xb1da, 0xb1da, 0xb1db, 0xb1db, 0xb1dc, 0xb1dc, 0xb1dd, 0xb1dd, + 0xb1dd, 0xb1de, 0xb1de, 0xb1df, 0xb1df, 0xb1e0, 0xb1e0, 0xb1e0, + 0xb1e1, 0xb1e1, 0xb1e2, 0xb1e2, 0xb1e3, 0xb1e3, 0xb1e4, 0xb1e4, + 0xb1e4, 0xb1e5, 0xb1e5, 0xb1e6, 0xb1e6, 0xb1e7, 0xb1e7, 0xb1e7, + 0xb1e8, 0xb1e8, 0xb1e9, 0xb1e9, 0xb1ea, 0xb1ea, 0xb1ea, 0xb1eb, + 0xb1eb, 0xb1ec, 0xb1ec, 0xb1ed, 0xb1ed, 0xb1ed, 0xb1ee, 0xb1ee, + 0xb1ef, 0xb1ef, 0xb1f0, 0xb1f0, 0xb1f0, 0xb1f1, 0xb1f1, 0xb1f2, + 0xb1f2, 0xb1f3, 0xb1f3, 0xb1f3, 0xb1f4, 0xb1f4, 0xb1f5, 0xb1f5, + 0xb1f6, 0xb1f6, 0xb1f6, 0xb1f7, 0xb1f7, 0xb1f8, 0xb1f8, 0xb1f9, + 0xb1f9, 0xb1f9, 0xb1fa, 0xb1fa, 0xb1fb, 0xb1fb, 0xb1fc, 0xb1fc, + 0xb1fc, 0xb1fd, 0xb1fd, 0xb1fe, 0xb1fe, 0xb1ff, 0xb1ff, 0xb1ff, + 0xb200, 0xb200, 0xb201, 0xb201, 0xb201, 0xb202, 0xb202, 0xb203, + 0xb203, 0xb204, 0xb204, 0xb204, 0xb205, 0xb205, 0xb206, 0xb206, + 0xb207, 0xb207, 0xb207, 0xb208, 0xb208, 0xb209, 0xb209, 0xb20a, + 0xb20a, 0xb20a, 0xb20b, 0xb20b, 0xb20c, 0xb20c, 0xb20c, 0xb20d, + 0xb20d, 0xb20e, 0xb20e, 0xb20f, 0xb20f, 0xb20f, 0xb210, 0xb210, + 0xb211, 0xb211, 0xb211, 0xb212, 0xb212, 0xb213, 0xb213, 0xb214, + 0xb214, 0xb214, 0xb215, 0xb215, 0xb216, 0xb216, 0xb216, 0xb217, + 0xb217, 0xb218, 0xb218, 0xb219, 0xb219, 0xb219, 0xb21a, 0xb21a, + 0xb21b, 0xb21b, 0xb21b, 0xb21c, 0xb21c, 0xb21d, 0xb21d, 0xb21e, + 0xb21e, 0xb21e, 0xb21f, 0xb21f, 0xb220, 0xb220, 0xb220, 0xb221, + 0xb221, 0xb222, 0xb222, 0xb222, 0xb223, 0xb223, 0xb224, 0xb224, + 0xb225, 0xb225, 0xb225, 0xb226, 0xb226, 0xb227, 0xb227, 0xb227, + 0xb228, 0xb228, 0xb229, 0xb229, 0xb229, 0xb22a, 0xb22a, 0xb22b, + 0xb22b, 0xb22c, 0xb22c, 0xb22c, 0xb22d, 0xb22d, 0xb22e, 0xb22e, + 0xb22e, 0xb22f, 0xb22f, 0xb230, 0xb230, 0xb230, 0xb231, 0xb231, + 0xb232, 0xb232, 0xb232, 0xb233, 0xb233, 0xb234, 0xb234, 0xb235, + 0xb235, 0xb235, 0xb236, 0xb236, 0xb237, 0xb237, 0xb237, 0xb238, + 0xb238, 0xb239, 0xb239, 0xb239, 0xb23a, 0xb23a, 0xb23b, 0xb23b, + 0xb23b, 0xb23c, 0xb23c, 0xb23d, 0xb23d, 0xb23d, 0xb23e, 0xb23e, + 0xb23f, 0xb23f, 0xb23f, 0xb240, 0xb240, 0xb241, 0xb241, 0xb241, + 0xb242, 0xb242, 0xb243, 0xb243, 0xb243, 0xb244, 0xb244, 0xb245, + 0xb245, 0xb245, 0xb246, 0xb246, 0xb247, 0xb247, 0xb247, 0xb248, + 0xb248, 0xb249, 0xb249, 0xb249, 0xb24a, 0xb24a, 0xb24b, 0xb24b, + 0xb24b, 0xb24c, 0xb24c, 0xb24d, 0xb24d, 0xb24d, 0xb24e, 0xb24e, + 0xb24f, 0xb24f, 0xb24f, 0xb250, 0xb250, 0xb251, 0xb251, 0xb251, + 0xb252, 0xb252, 0xb253, 0xb253, 0xb253, 0xb254, 0xb254, 0xb255, + 0xb255, 0xb255, 0xb256, 0xb256, 0xb257, 0xb257, 0xb257, 0xb258, + 0xb258, 0xb259, 0xb259, 0xb259, 0xb25a, 0xb25a, 0xb25b, 0xb25b, + 0xb25b, 0xb25c, 0xb25c, 0xb25d, 0xb25d, 0xb25d, 0xb25e, 0xb25e, + 0xb25f, 0xb25f, 0xb25f, 0xb260, 0xb260, 0xb261, 0xb261, 0xb261, + 0xb262, 0xb262, 0xb262, 0xb263, 0xb263, 0xb264, 0xb264, 0xb264, + 0xb265, 0xb265, 0xb266, 0xb266, 0xb266, 0xb267, 0xb267, 0xb268, + 0xb268, 0xb268, 0xb269, 0xb269, 0xb26a, 0xb26a, 0xb26a, 0xb26b, + 0xb26b, 0xb26b, 0xb26c, 0xb26c, 0xb26d, 0xb26d, 0xb26d, 0xb26e, + 0xb26e, 0xb26f, 0xb26f, 0xb26f, 0xb270, 0xb270, 0xb271, 0xb271, + 0xb271, 0xb272, 0xb272, 0xb273, 0xb273, 0xb273, 0xb274, 0xb274, + 0xb274, 0xb275, 0xb275, 0xb276, 0xb276, 0xb276, 0xb277, 0xb277, + 0xb278, 0xb278, 0xb278, 0xb279, 0xb279, 0xb279, 0xb27a, 0xb27a, + 0xb27b, 0xb27b, 0xb27b, 0xb27c, 0xb27c, 0xb27d, 0xb27d, 0xb27d, + 0xb27e, 0xb27e, 0xb27f, 0xb27f, 0xb27f, 0xb280, 0xb280, 0xb280, + 0xb281, 0xb281, 0xb282, 0xb282, 0xb282, 0xb283, 0xb283, 0xb284, + 0xb284, 0xb284, 0xb285, 0xb285, 0xb285, 0xb286, 0xb286, 0xb287, + 0xb287, 0xb287, 0xb288, 0xb288, 0xb288, 0xb289, 0xb289, 0xb28a, + 0xb28a, 0xb28a, 0xb28b, 0xb28b, 0xb28c, 0xb28c, 0xb28c, 0xb28d, + 0xb28d, 0xb28d, 0xb28e, 0xb28e, 0xb28f, 0xb28f, 0xb28f, 0xb290, + 0xb290, 0xb290, 0xb291, 0xb291, 0xb292, 0xb292, 0xb292, 0xb293, + 0xb293, 0xb294, 0xb294, 0xb294, 0xb295, 0xb295, 0xb295, 0xb296, + 0xb296, 0xb297, 0xb297, 0xb297, 0xb298, 0xb298, 0xb298, 0xb299, + 0xb299, 0xb29a, 0xb29a, 0xb29a, 0xb29b, 0xb29b, 0xb29b, 0xb29c, + 0xb29c, 0xb29d, 0xb29d, 0xb29d, 0xb29e, 0xb29e, 0xb29e, 0xb29f, + 0xb29f, 0xb2a0, 0xb2a1, 0xb2a1, 0xb2a2, 0xb2a3, 0xb2a4, 0xb2a4, + 0xb2a5, 0xb2a6, 0xb2a7, 0xb2a7, 0xb2a8, 0xb2a9, 0xb2aa, 0xb2aa, + 0xb2ab, 0xb2ac, 0xb2ad, 0xb2ad, 0xb2ae, 0xb2af, 0xb2b0, 0xb2b0, + 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b6, + 0xb2b7, 0xb2b8, 0xb2b9, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bc, + 0xb2bd, 0xb2be, 0xb2be, 0xb2bf, 0xb2c0, 0xb2c1, 0xb2c1, 0xb2c2, + 0xb2c3, 0xb2c4, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, 0xb2c7, 0xb2c8, + 0xb2c9, 0xb2c9, 0xb2ca, 0xb2cb, 0xb2cc, 0xb2cc, 0xb2cd, 0xb2ce, + 0xb2cf, 0xb2cf, 0xb2d0, 0xb2d1, 0xb2d2, 0xb2d2, 0xb2d3, 0xb2d4, + 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, 0xb2d7, 0xb2d8, 0xb2d9, 0xb2d9, + 0xb2da, 0xb2db, 0xb2dc, 0xb2dc, 0xb2dd, 0xb2de, 0xb2df, 0xb2df, + 0xb2e0, 0xb2e1, 0xb2e1, 0xb2e2, 0xb2e3, 0xb2e4, 0xb2e4, 0xb2e5, + 0xb2e6, 0xb2e6, 0xb2e7, 0xb2e8, 0xb2e9, 0xb2e9, 0xb2ea, 0xb2eb, + 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ee, 0xb2ef, 0xb2f0, 0xb2f0, + 0xb2f1, 0xb2f2, 0xb2f3, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f5, 0xb2f6, + 0xb2f7, 0xb2f8, 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fa, 0xb2fb, 0xb2fc, + 0xb2fc, 0xb2fd, 0xb2fe, 0xb2ff, 0xb2ff, 0xb300, 0xb301, 0xb301, + 0xb302, 0xb303, 0xb304, 0xb304, 0xb305, 0xb306, 0xb306, 0xb307, + 0xb308, 0xb308, 0xb309, 0xb30a, 0xb30b, 0xb30b, 0xb30c, 0xb30d, + 0xb30d, 0xb30e, 0xb30f, 0xb30f, 0xb310, 0xb311, 0xb311, 0xb312, + 0xb313, 0xb314, 0xb314, 0xb315, 0xb316, 0xb316, 0xb317, 0xb318, + 0xb318, 0xb319, 0xb31a, 0xb31b, 0xb31b, 0xb31c, 0xb31d, 0xb31d, + 0xb31e, 0xb31f, 0xb31f, 0xb320, 0xb321, 0xb321, 0xb322, 0xb323, + 0xb323, 0xb324, 0xb325, 0xb326, 0xb326, 0xb327, 0xb328, 0xb328, + 0xb329, 0xb32a, 0xb32a, 0xb32b, 0xb32c, 0xb32c, 0xb32d, 0xb32e, + 0xb32e, 0xb32f, 0xb330, 0xb330, 0xb331, 0xb332, 0xb333, 0xb333, + 0xb334, 0xb335, 0xb335, 0xb336, 0xb337, 0xb337, 0xb338, 0xb339, + 0xb339, 0xb33a, 0xb33b, 0xb33b, 0xb33c, 0xb33d, 0xb33d, 0xb33e, + 0xb33f, 0xb33f, 0xb340, 0xb341, 0xb341, 0xb342, 0xb343, 0xb343, + 0xb344, 0xb345, 0xb345, 0xb346, 0xb347, 0xb347, 0xb348, 0xb349, + 0xb34a, 0xb34a, 0xb34b, 0xb34c, 0xb34c, 0xb34d, 0xb34e, 0xb34e, + 0xb34f, 0xb350, 0xb350, 0xb351, 0xb352, 0xb352, 0xb353, 0xb354, + 0xb354, 0xb355, 0xb356, 0xb356, 0xb357, 0xb358, 0xb358, 0xb359, + 0xb35a, 0xb35a, 0xb35b, 0xb35c, 0xb35c, 0xb35d, 0xb35e, 0xb35e, + 0xb35f, 0xb35f, 0xb360, 0xb361, 0xb361, 0xb362, 0xb363, 0xb363, + 0xb364, 0xb365, 0xb365, 0xb366, 0xb367, 0xb367, 0xb368, 0xb369, + 0xb369, 0xb36a, 0xb36b, 0xb36b, 0xb36c, 0xb36d, 0xb36d, 0xb36e, + 0xb36f, 0xb36f, 0xb370, 0xb371, 0xb371, 0xb372, 0xb373, 0xb373, + 0xb374, 0xb375, 0xb375, 0xb376, 0xb376, 0xb377, 0xb378, 0xb378, + 0xb379, 0xb37a, 0xb37a, 0xb37b, 0xb37c, 0xb37c, 0xb37d, 0xb37e, + 0xb37e, 0xb37f, 0xb380, 0xb380, 0xb381, 0xb382, 0xb382, 0xb383, + 0xb383, 0xb384, 0xb385, 0xb385, 0xb386, 0xb387, 0xb387, 0xb388, + 0xb389, 0xb389, 0xb38a, 0xb38b, 0xb38b, 0xb38c, 0xb38c, 0xb38d, + 0xb38e, 0xb38e, 0xb38f, 0xb390, 0xb390, 0xb391, 0xb392, 0xb392, + 0xb393, 0xb394, 0xb394, 0xb395, 0xb395, 0xb396, 0xb397, 0xb397, + 0xb398, 0xb399, 0xb399, 0xb39a, 0xb39b, 0xb39b, 0xb39c, 0xb39c, + 0xb39d, 0xb39e, 0xb39e, 0xb39f, 0xb3a0, 0xb3a0, 0xb3a1, 0xb3a2, + 0xb3a2, 0xb3a3, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a5, 0xb3a6, 0xb3a7, + 0xb3a7, 0xb3a8, 0xb3a9, 0xb3a9, 0xb3aa, 0xb3aa, 0xb3ab, 0xb3ac, + 0xb3ac, 0xb3ad, 0xb3ae, 0xb3ae, 0xb3af, 0xb3af, 0xb3b0, 0xb3b1, + 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b5, 0xb3b6, + 0xb3b6, 0xb3b7, 0xb3b8, 0xb3b8, 0xb3b9, 0xb3ba, 0xb3ba, 0xb3bb, + 0xb3bb, 0xb3bc, 0xb3bd, 0xb3bd, 0xb3be, 0xb3bf, 0xb3bf, 0xb3c0, + 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c2, 0xb3c3, 0xb3c3, 0xb3c4, 0xb3c5, + 0xb3c5, 0xb3c6, 0xb3c7, 0xb3c7, 0xb3c8, 0xb3c8, 0xb3c9, 0xb3ca, + 0xb3ca, 0xb3cb, 0xb3cc, 0xb3cc, 0xb3cd, 0xb3cd, 0xb3ce, 0xb3cf, + 0xb3cf, 0xb3d0, 0xb3d1, 0xb3d1, 0xb3d2, 0xb3d2, 0xb3d3, 0xb3d4, + 0xb3d4, 0xb3d5, 0xb3d5, 0xb3d6, 0xb3d7, 0xb3d7, 0xb3d8, 0xb3d9, + 0xb3d9, 0xb3da, 0xb3da, 0xb3db, 0xb3dc, 0xb3dc, 0xb3dd, 0xb3dd, + 0xb3de, 0xb3df, 0xb3df, 0xb3e0, 0xb3e0, 0xb3e1, 0xb3e2, 0xb3e2, + 0xb3e3, 0xb3e4, 0xb3e4, 0xb3e5, 0xb3e5, 0xb3e6, 0xb3e7, 0xb3e7, + 0xb3e8, 0xb3e8, 0xb3e9, 0xb3ea, 0xb3ea, 0xb3eb, 0xb3eb, 0xb3ec, + 0xb3ed, 0xb3ed, 0xb3ee, 0xb3ee, 0xb3ef, 0xb3f0, 0xb3f0, 0xb3f1, + 0xb3f1, 0xb3f2, 0xb3f3, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f5, 0xb3f6, + 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f8, 0xb3f9, 0xb3f9, 0xb3fa, 0xb3fb, + 0xb3fb, 0xb3fc, 0xb3fc, 0xb3fd, 0xb3fe, 0xb3fe, 0xb3ff, 0xb3ff, + 0xb400, 0xb400, 0xb401, 0xb401, 0xb401, 0xb401, 0xb402, 0xb402, + 0xb402, 0xb403, 0xb403, 0xb403, 0xb404, 0xb404, 0xb404, 0xb404, + 0xb405, 0xb405, 0xb405, 0xb406, 0xb406, 0xb406, 0xb407, 0xb407, + 0xb407, 0xb407, 0xb408, 0xb408, 0xb408, 0xb409, 0xb409, 0xb409, + 0xb40a, 0xb40a, 0xb40a, 0xb40a, 0xb40b, 0xb40b, 0xb40b, 0xb40c, + 0xb40c, 0xb40c, 0xb40c, 0xb40d, 0xb40d, 0xb40d, 0xb40e, 0xb40e, + 0xb40e, 0xb40f, 0xb40f, 0xb40f, 0xb40f, 0xb410, 0xb410, 0xb410, + 0xb411, 0xb411, 0xb411, 0xb411, 0xb412, 0xb412, 0xb412, 0xb413, + 0xb413, 0xb413, 0xb414, 0xb414, 0xb414, 0xb414, 0xb415, 0xb415, + 0xb415, 0xb416, 0xb416, 0xb416, 0xb416, 0xb417, 0xb417, 0xb417, + 0xb418, 0xb418, 0xb418, 0xb419, 0xb419, 0xb419, 0xb419, 0xb41a, + 0xb41a, 0xb41a, 0xb41b, 0xb41b, 0xb41b, 0xb41b, 0xb41c, 0xb41c, + 0xb41c, 0xb41d, 0xb41d, 0xb41d, 0xb41d, 0xb41e, 0xb41e, 0xb41e, + 0xb41f, 0xb41f, 0xb41f, 0xb41f, 0xb420, 0xb420, 0xb420, 0xb421, + 0xb421, 0xb421, 0xb422, 0xb422, 0xb422, 0xb422, 0xb423, 0xb423, + 0xb423, 0xb424, 0xb424, 0xb424, 0xb424, 0xb425, 0xb425, 0xb425, + 0xb426, 0xb426, 0xb426, 0xb426, 0xb427, 0xb427, 0xb427, 0xb428, + 0xb428, 0xb428, 0xb428, 0xb429, 0xb429, 0xb429, 0xb42a, 0xb42a, + 0xb42a, 0xb42a, 0xb42b, 0xb42b, 0xb42b, 0xb42c, 0xb42c, 0xb42c, + 0xb42c, 0xb42d, 0xb42d, 0xb42d, 0xb42e, 0xb42e, 0xb42e, 0xb42e, + 0xb42f, 0xb42f, 0xb42f, 0xb430, 0xb430, 0xb430, 0xb430, 0xb431, + 0xb431, 0xb431, 0xb432, 0xb432, 0xb432, 0xb432, 0xb433, 0xb433, + 0xb433, 0xb433, 0xb434, 0xb434, 0xb434, 0xb435, 0xb435, 0xb435, + 0xb435, 0xb436, 0xb436, 0xb436, 0xb437, 0xb437, 0xb437, 0xb437, + 0xb438, 0xb438, 0xb438, 0xb439, 0xb439, 0xb439, 0xb439, 0xb43a, + 0xb43a, 0xb43a, 0xb43b, 0xb43b, 0xb43b, 0xb43b, 0xb43c, 0xb43c, + 0xb43c, 0xb43c, 0xb43d, 0xb43d, 0xb43d, 0xb43e, 0xb43e, 0xb43e, + 0xb43e, 0xb43f, 0xb43f, 0xb43f, 0xb440, 0xb440, 0xb440, 0xb440, + 0xb441, 0xb441, 0xb441, 0xb442, 0xb442, 0xb442, 0xb442, 0xb443, + 0xb443, 0xb443, 0xb443, 0xb444, 0xb444, 0xb444, 0xb445, 0xb445, + 0xb445, 0xb445, 0xb446, 0xb446, 0xb446, 0xb447, 0xb447, 0xb447, + 0xb447, 0xb448, 0xb448, 0xb448, 0xb448, 0xb449, 0xb449, 0xb449, + 0xb44a, 0xb44a, 0xb44a, 0xb44a, 0xb44b, 0xb44b, 0xb44b, 0xb44b, + 0xb44c, 0xb44c, 0xb44c, 0xb44d, 0xb44d, 0xb44d, 0xb44d, 0xb44e, + 0xb44e, 0xb44e, 0xb44f, 0xb44f, 0xb44f, 0xb44f, 0xb450, 0xb450, + 0xb450, 0xb450, 0xb451, 0xb451, 0xb451, 0xb452, 0xb452, 0xb452, + 0xb452, 0xb453, 0xb453, 0xb453, 0xb453, 0xb454, 0xb454, 0xb454, + 0xb455, 0xb455, 0xb455, 0xb455, 0xb456, 0xb456, 0xb456, 0xb456, + 0xb457, 0xb457, 0xb457, 0xb458, 0xb458, 0xb458, 0xb458, 0xb459, + 0xb459, 0xb459, 0xb459, 0xb45a, 0xb45a, 0xb45a, 0xb45b, 0xb45b, + 0xb45b, 0xb45b, 0xb45c, 0xb45c, 0xb45c, 0xb45c, 0xb45d, 0xb45d, + 0xb45d, 0xb45d, 0xb45e, 0xb45e, 0xb45e, 0xb45f, 0xb45f, 0xb45f, + 0xb45f, 0xb460, 0xb460, 0xb460, 0xb460, 0xb461, 0xb461, 0xb461, + 0xb462, 0xb462, 0xb462, 0xb462, 0xb463, 0xb463, 0xb463, 0xb463, + 0xb464, 0xb464, 0xb464, 0xb464, 0xb465, 0xb465, 0xb465, 0xb466, + 0xb466, 0xb466, 0xb466, 0xb467, 0xb467, 0xb467, 0xb467, 0xb468, + 0xb468, 0xb468, 0xb468, 0xb469, 0xb469, 0xb469, 0xb46a, 0xb46a, + 0xb46a, 0xb46a, 0xb46b, 0xb46b, 0xb46b, 0xb46b, 0xb46c, 0xb46c, + 0xb46c, 0xb46c, 0xb46d, 0xb46d, 0xb46d, 0xb46e, 0xb46e, 0xb46e, + 0xb46e, 0xb46f, 0xb46f, 0xb46f, 0xb46f, 0xb470, 0xb470, 0xb470, + 0xb470, 0xb471, 0xb471, 0xb471, 0xb472, 0xb472, 0xb472, 0xb472, + 0xb473, 0xb473, 0xb473, 0xb473, 0xb474, 0xb474, 0xb474, 0xb474, + 0xb475, 0xb475, 0xb475, 0xb475, 0xb476, 0xb476, 0xb476, 0xb477, + 0xb477, 0xb477, 0xb477, 0xb478, 0xb478, 0xb478, 0xb478, 0xb479, + 0xb479, 0xb479, 0xb479, 0xb47a, 0xb47a, 0xb47a, 0xb47a, 0xb47b, + 0xb47b, 0xb47b, 0xb47c, 0xb47c, 0xb47c, 0xb47c, 0xb47d, 0xb47d, + 0xb47d, 0xb47d, 0xb47e, 0xb47e, 0xb47e, 0xb47e, 0xb47f, 0xb47f, + 0xb47f, 0xb47f, 0xb480, 0xb480, 0xb480, 0xb480, 0xb481, 0xb481, + 0xb481, 0xb482, 0xb482, 0xb482, 0xb482, 0xb483, 0xb483, 0xb483, + 0xb483, 0xb484, 0xb484, 0xb484, 0xb484, 0xb485, 0xb485, 0xb485, + 0xb485, 0xb486, 0xb486, 0xb486, 0xb486, 0xb487, 0xb487, 0xb487, + 0xb487, 0xb488, 0xb488, 0xb488, 0xb489, 0xb489, 0xb489, 0xb489, + 0xb48a, 0xb48a, 0xb48b, 0xb48b, 0xb48c, 0xb48c, 0xb48d, 0xb48d, + 0xb48e, 0xb48e, 0xb48f, 0xb48f, 0xb490, 0xb490, 0xb491, 0xb491, + 0xb492, 0xb492, 0xb493, 0xb493, 0xb494, 0xb494, 0xb495, 0xb495, + 0xb496, 0xb496, 0xb497, 0xb497, 0xb498, 0xb498, 0xb499, 0xb499, + 0xb49a, 0xb49a, 0xb49b, 0xb49b, 0xb49c, 0xb49c, 0xb49d, 0xb49d, + 0xb49e, 0xb49e, 0xb49f, 0xb49f, 0xb4a0, 0xb4a0, 0xb4a1, 0xb4a1, + 0xb4a2, 0xb4a2, 0xb4a3, 0xb4a3, 0xb4a4, 0xb4a4, 0xb4a5, 0xb4a5, + 0xb4a6, 0xb4a6, 0xb4a7, 0xb4a7, 0xb4a8, 0xb4a8, 0xb4a9, 0xb4a9, + 0xb4aa, 0xb4aa, 0xb4ab, 0xb4ab, 0xb4ac, 0xb4ac, 0xb4ad, 0xb4ad, + 0xb4ae, 0xb4ae, 0xb4af, 0xb4af, 0xb4b0, 0xb4b0, 0xb4b1, 0xb4b1, + 0xb4b2, 0xb4b2, 0xb4b3, 0xb4b3, 0xb4b4, 0xb4b4, 0xb4b5, 0xb4b5, + 0xb4b6, 0xb4b6, 0xb4b7, 0xb4b7, 0xb4b8, 0xb4b8, 0xb4b9, 0xb4b9, + 0xb4ba, 0xb4ba, 0xb4bb, 0xb4bb, 0xb4bc, 0xb4bc, 0xb4bd, 0xb4bd, + 0xb4be, 0xb4be, 0xb4bf, 0xb4bf, 0xb4c0, 0xb4c0, 0xb4c1, 0xb4c1, + 0xb4c2, 0xb4c2, 0xb4c3, 0xb4c3, 0xb4c4, 0xb4c4, 0xb4c5, 0xb4c5, + 0xb4c6, 0xb4c6, 0xb4c7, 0xb4c7, 0xb4c7, 0xb4c8, 0xb4c8, 0xb4c9, + 0xb4c9, 0xb4ca, 0xb4ca, 0xb4cb, 0xb4cb, 0xb4cc, 0xb4cc, 0xb4cd, + 0xb4cd, 0xb4ce, 0xb4ce, 0xb4cf, 0xb4cf, 0xb4d0, 0xb4d0, 0xb4d1, + 0xb4d1, 0xb4d2, 0xb4d2, 0xb4d3, 0xb4d3, 0xb4d4, 0xb4d4, 0xb4d4, + 0xb4d5, 0xb4d5, 0xb4d6, 0xb4d6, 0xb4d7, 0xb4d7, 0xb4d8, 0xb4d8, + 0xb4d9, 0xb4d9, 0xb4da, 0xb4da, 0xb4db, 0xb4db, 0xb4dc, 0xb4dc, + 0xb4dd, 0xb4dd, 0xb4de, 0xb4de, 0xb4de, 0xb4df, 0xb4df, 0xb4e0, + 0xb4e0, 0xb4e1, 0xb4e1, 0xb4e2, 0xb4e2, 0xb4e3, 0xb4e3, 0xb4e4, + 0xb4e4, 0xb4e5, 0xb4e5, 0xb4e6, 0xb4e6, 0xb4e6, 0xb4e7, 0xb4e7, + 0xb4e8, 0xb4e8, 0xb4e9, 0xb4e9, 0xb4ea, 0xb4ea, 0xb4eb, 0xb4eb, + 0xb4ec, 0xb4ec, 0xb4ed, 0xb4ed, 0xb4ee, 0xb4ee, 0xb4ee, 0xb4ef, + 0xb4ef, 0xb4f0, 0xb4f0, 0xb4f1, 0xb4f1, 0xb4f2, 0xb4f2, 0xb4f3, + 0xb4f3, 0xb4f4, 0xb4f4, 0xb4f5, 0xb4f5, 0xb4f5, 0xb4f6, 0xb4f6, + 0xb4f7, 0xb4f7, 0xb4f8, 0xb4f8, 0xb4f9, 0xb4f9, 0xb4fa, 0xb4fa, + 0xb4fb, 0xb4fb, 0xb4fb, 0xb4fc, 0xb4fc, 0xb4fd, 0xb4fd, 0xb4fe, + 0xb4fe, 0xb4ff, 0xb4ff, 0xb500, 0xb500, 0xb500, 0xb501, 0xb501, + 0xb502, 0xb502, 0xb503, 0xb503, 0xb504, 0xb504, 0xb505, 0xb505, + 0xb506, 0xb506, 0xb506, 0xb507, 0xb507, 0xb508, 0xb508, 0xb509, + 0xb509, 0xb50a, 0xb50a, 0xb50b, 0xb50b, 0xb50b, 0xb50c, 0xb50c, + 0xb50d, 0xb50d, 0xb50e, 0xb50e, 0xb50f, 0xb50f, 0xb510, 0xb510, + 0xb510, 0xb511, 0xb511, 0xb512, 0xb512, 0xb513, 0xb513, 0xb514, + 0xb514, 0xb514, 0xb515, 0xb515, 0xb516, 0xb516, 0xb517, 0xb517, + 0xb518, 0xb518, 0xb519, 0xb519, 0xb519, 0xb51a, 0xb51a, 0xb51b, + 0xb51b, 0xb51c, 0xb51c, 0xb51d, 0xb51d, 0xb51d, 0xb51e, 0xb51e, + 0xb51f, 0xb51f, 0xb520, 0xb520, 0xb521, 0xb521, 0xb521, 0xb522, + 0xb522, 0xb523, 0xb523, 0xb524, 0xb524, 0xb525, 0xb525, 0xb525, + 0xb526, 0xb526, 0xb527, 0xb527, 0xb528, 0xb528, 0xb529, 0xb529, + 0xb529, 0xb52a, 0xb52a, 0xb52b, 0xb52b, 0xb52c, 0xb52c, 0xb52d, + 0xb52d, 0xb52d, 0xb52e, 0xb52e, 0xb52f, 0xb52f, 0xb530, 0xb530, + 0xb530, 0xb531, 0xb531, 0xb532, 0xb532, 0xb533, 0xb533, 0xb534, + 0xb534, 0xb534, 0xb535, 0xb535, 0xb536, 0xb536, 0xb537, 0xb537, + 0xb537, 0xb538, 0xb538, 0xb539, 0xb539, 0xb53a, 0xb53a, 0xb53b, + 0xb53b, 0xb53b, 0xb53c, 0xb53c, 0xb53d, 0xb53d, 0xb53e, 0xb53e, + 0xb53e, 0xb53f, 0xb53f, 0xb540, 0xb540, 0xb541, 0xb541, 0xb541, + 0xb542, 0xb542, 0xb543, 0xb543, 0xb544, 0xb544, 0xb544, 0xb545, + 0xb545, 0xb546, 0xb546, 0xb547, 0xb547, 0xb548, 0xb548, 0xb548, + 0xb549, 0xb549, 0xb54a, 0xb54a, 0xb54b, 0xb54b, 0xb54b, 0xb54c, + 0xb54c, 0xb54d, 0xb54d, 0xb54e, 0xb54e, 0xb54e, 0xb54f, 0xb54f, + 0xb550, 0xb550, 0xb551, 0xb551, 0xb551, 0xb552, 0xb552, 0xb553, + 0xb553, 0xb553, 0xb554, 0xb554, 0xb555, 0xb555, 0xb556, 0xb556, + 0xb556, 0xb557, 0xb557, 0xb558, 0xb558, 0xb559, 0xb559, 0xb559, + 0xb55a, 0xb55a, 0xb55b, 0xb55b, 0xb55c, 0xb55c, 0xb55c, 0xb55d, + 0xb55d, 0xb55e, 0xb55e, 0xb55e, 0xb55f, 0xb55f, 0xb560, 0xb560, + 0xb561, 0xb561, 0xb561, 0xb562, 0xb562, 0xb563, 0xb563, 0xb564, + 0xb564, 0xb564, 0xb565, 0xb565, 0xb566, 0xb566, 0xb566, 0xb567, + 0xb567, 0xb568, 0xb568, 0xb569, 0xb569, 0xb569, 0xb56a, 0xb56a, + 0xb56b, 0xb56b, 0xb56b, 0xb56c, 0xb56c, 0xb56d, 0xb56d, 0xb56e, + 0xb56e, 0xb56e, 0xb56f, 0xb56f, 0xb570, 0xb570, 0xb570, 0xb571, + 0xb571, 0xb572, 0xb572, 0xb573, 0xb573, 0xb573, 0xb574, 0xb574, + 0xb575, 0xb575, 0xb575, 0xb576, 0xb576, 0xb577, 0xb577, 0xb577, + 0xb578, 0xb578, 0xb579, 0xb579, 0xb57a, 0xb57a, 0xb57a, 0xb57b, + 0xb57b, 0xb57c, 0xb57c, 0xb57c, 0xb57d, 0xb57d, 0xb57e, 0xb57e, + 0xb57e, 0xb57f, 0xb57f, 0xb580, 0xb580, 0xb581, 0xb581, 0xb581, + 0xb582, 0xb582, 0xb583, 0xb583, 0xb583, 0xb584, 0xb584, 0xb585, + 0xb585, 0xb585, 0xb586, 0xb586, 0xb587, 0xb587, 0xb587, 0xb588, + 0xb588, 0xb589, 0xb589, 0xb589, 0xb58a, 0xb58a, 0xb58b, 0xb58b, + 0xb58c, 0xb58c, 0xb58c, 0xb58d, 0xb58d, 0xb58e, 0xb58e, 0xb58e, + 0xb58f, 0xb58f, 0xb590, 0xb590, 0xb590, 0xb591, 0xb591, 0xb592, + 0xb592, 0xb592, 0xb593, 0xb593, 0xb594, 0xb594, 0xb594, 0xb595, + 0xb595, 0xb596, 0xb596, 0xb596, 0xb597, 0xb597, 0xb598, 0xb598, + 0xb598, 0xb599, 0xb599, 0xb59a, 0xb59a, 0xb59a, 0xb59b, 0xb59b, + 0xb59c, 0xb59c, 0xb59c, 0xb59d, 0xb59d, 0xb59e, 0xb59e, 0xb59e, + 0xb59f, 0xb59f, 0xb5a0, 0xb5a0, 0xb5a0, 0xb5a1, 0xb5a1, 0xb5a2, + 0xb5a2, 0xb5a2, 0xb5a3, 0xb5a3, 0xb5a4, 0xb5a4, 0xb5a4, 0xb5a5, + 0xb5a5, 0xb5a6, 0xb5a6, 0xb5a6, 0xb5a7, 0xb5a7, 0xb5a8, 0xb5a8, + 0xb5a8, 0xb5a9, 0xb5a9, 0xb5aa, 0xb5aa, 0xb5aa, 0xb5ab, 0xb5ab, + 0xb5ac, 0xb5ac, 0xb5ac, 0xb5ad, 0xb5ad, 0xb5ad, 0xb5ae, 0xb5ae, + 0xb5af, 0xb5af, 0xb5af, 0xb5b0, 0xb5b0, 0xb5b1, 0xb5b1, 0xb5b1, + 0xb5b2, 0xb5b2, 0xb5b3, 0xb5b3, 0xb5b3, 0xb5b4, 0xb5b4, 0xb5b5, + 0xb5b5, 0xb5b5, 0xb5b6, 0xb5b6, 0xb5b7, 0xb5b7, 0xb5b7, 0xb5b8, + 0xb5b8, 0xb5b8, 0xb5b9, 0xb5b9, 0xb5ba, 0xb5ba, 0xb5ba, 0xb5bb, + 0xb5bb, 0xb5bc, 0xb5bc, 0xb5bc, 0xb5bd, 0xb5bd, 0xb5be, 0xb5be, + 0xb5be, 0xb5bf, 0xb5bf, 0xb5bf, 0xb5c0, 0xb5c0, 0xb5c1, 0xb5c1, + 0xb5c1, 0xb5c2, 0xb5c2, 0xb5c3, 0xb5c3, 0xb5c3, 0xb5c4, 0xb5c4, + 0xb5c5, 0xb5c5, 0xb5c5, 0xb5c6, 0xb5c6, 0xb5c6, 0xb5c7, 0xb5c7, + 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c9, 0xb5c9, 0xb5ca, 0xb5ca, 0xb5ca, + 0xb5cb, 0xb5cb, 0xb5cb, 0xb5cc, 0xb5cc, 0xb5cd, 0xb5cd, 0xb5cd, + 0xb5ce, 0xb5ce, 0xb5cf, 0xb5cf, 0xb5cf, 0xb5d0, 0xb5d0, 0xb5d0, + 0xb5d1, 0xb5d1, 0xb5d2, 0xb5d2, 0xb5d2, 0xb5d3, 0xb5d3, 0xb5d3, + 0xb5d4, 0xb5d4, 0xb5d5, 0xb5d5, 0xb5d5, 0xb5d6, 0xb5d6, 0xb5d7, + 0xb5d7, 0xb5d7, 0xb5d8, 0xb5d8, 0xb5d8, 0xb5d9, 0xb5d9, 0xb5da, + 0xb5da, 0xb5da, 0xb5db, 0xb5db, 0xb5db, 0xb5dc, 0xb5dc, 0xb5dd, + 0xb5dd, 0xb5dd, 0xb5de, 0xb5de, 0xb5df, 0xb5df, 0xb5df, 0xb5e0, + 0xb5e0, 0xb5e0, 0xb5e1, 0xb5e1, 0xb5e2, 0xb5e2, 0xb5e2, 0xb5e3, + 0xb5e3, 0xb5e3, 0xb5e4, 0xb5e4, 0xb5e5, 0xb5e5, 0xb5e5, 0xb5e6, + 0xb5e6, 0xb5e6, 0xb5e7, 0xb5e7, 0xb5e8, 0xb5e8, 0xb5e8, 0xb5e9, + 0xb5e9, 0xb5e9, 0xb5ea, 0xb5ea, 0xb5eb, 0xb5eb, 0xb5eb, 0xb5ec, + 0xb5ec, 0xb5ec, 0xb5ed, 0xb5ed, 0xb5ee, 0xb5ee, 0xb5ee, 0xb5ef, + 0xb5ef, 0xb5ef, 0xb5f0, 0xb5f0, 0xb5f1, 0xb5f1, 0xb5f1, 0xb5f2, + 0xb5f2, 0xb5f2, 0xb5f3, 0xb5f3, 0xb5f4, 0xb5f4, 0xb5f4, 0xb5f5, + 0xb5f5, 0xb5f5, 0xb5f6, 0xb5f6, 0xb5f7, 0xb5f7, 0xb5f7, 0xb5f8, + 0xb5f8, 0xb5f8, 0xb5f9, 0xb5f9, 0xb5f9, 0xb5fa, 0xb5fa, 0xb5fb, + 0xb5fb, 0xb5fb, 0xb5fc, 0xb5fc, 0xb5fc, 0xb5fd, 0xb5fd, 0xb5fe, + 0xb5fe, 0xb5fe, 0xb5ff, 0xb5ff, 0xb5ff, 0xb600, 0xb600, 0xb601, + 0xb601, 0xb601, 0xb602, 0xb602, 0xb602, 0xb603, 0xb603, 0xb603, + 0xb604, 0xb604, 0xb605, 0xb605, 0xb605, 0xb606, 0xb606, 0xb606, + 0xb607, 0xb607, 0xb607, 0xb608, 0xb608, 0xb609, 0xb609, 0xb609, + 0xb60a, 0xb60a, 0xb60a, 0xb60b, 0xb60b, 0xb60c, 0xb60c, 0xb60c, + 0xb60d, 0xb60d, 0xb60d, 0xb60e, 0xb60e, 0xb60e, 0xb60f, 0xb60f, + 0xb610, 0xb610, 0xb610, 0xb611, 0xb611, 0xb611, 0xb612, 0xb612, + 0xb612, 0xb613, 0xb613, 0xb614, 0xb614, 0xb614, 0xb615, 0xb615, + 0xb615, 0xb616, 0xb616, 0xb616, 0xb617, 0xb617, 0xb618, 0xb618, + 0xb618, 0xb619, 0xb619, 0xb619, 0xb61a, 0xb61a, 0xb61a, 0xb61b, + 0xb61b, 0xb61c, 0xb61c, 0xb61c, 0xb61d, 0xb61d, 0xb61d, 0xb61e, + 0xb61e, 0xb61e, 0xb61f, 0xb61f, 0xb61f, 0xb620, 0xb620, 0xb621, + 0xb621, 0xb621, 0xb622, 0xb622, 0xb622, 0xb623, 0xb623, 0xb623, + 0xb624, 0xb624, 0xb624, 0xb625, 0xb625, 0xb626, 0xb626, 0xb626, + 0xb627, 0xb627, 0xb627, 0xb628, 0xb628, 0xb628, 0xb629, 0xb629, + 0xb62a, 0xb62a, 0xb62a, 0xb62b, 0xb62b, 0xb62b, 0xb62c, 0xb62c, + 0xb62c, 0xb62d, 0xb62d, 0xb62d, 0xb62e, 0xb62e, 0xb62e, 0xb62f, + 0xb62f, 0xb630, 0xb630, 0xb630, 0xb631, 0xb631, 0xb631, 0xb632, + 0xb632, 0xb632, 0xb633, 0xb633, 0xb633, 0xb634, 0xb634, 0xb635, + 0xb635, 0xb635, 0xb636, 0xb636, 0xb636, 0xb637, 0xb637, 0xb637, + 0xb638, 0xb638, 0xb639, 0xb63a, 0xb63b, 0xb63b, 0xb63c, 0xb63d, + 0xb63d, 0xb63e, 0xb63f, 0xb63f, 0xb640, 0xb641, 0xb642, 0xb642, + 0xb643, 0xb644, 0xb644, 0xb645, 0xb646, 0xb646, 0xb647, 0xb648, + 0xb649, 0xb649, 0xb64a, 0xb64b, 0xb64b, 0xb64c, 0xb64d, 0xb64d, + 0xb64e, 0xb64f, 0xb650, 0xb650, 0xb651, 0xb652, 0xb652, 0xb653, + 0xb654, 0xb654, 0xb655, 0xb656, 0xb656, 0xb657, 0xb658, 0xb659, + 0xb659, 0xb65a, 0xb65b, 0xb65b, 0xb65c, 0xb65d, 0xb65d, 0xb65e, + 0xb65f, 0xb65f, 0xb660, 0xb661, 0xb661, 0xb662, 0xb663, 0xb664, + 0xb664, 0xb665, 0xb666, 0xb666, 0xb667, 0xb668, 0xb668, 0xb669, + 0xb66a, 0xb66a, 0xb66b, 0xb66c, 0xb66c, 0xb66d, 0xb66e, 0xb66e, + 0xb66f, 0xb670, 0xb670, 0xb671, 0xb672, 0xb672, 0xb673, 0xb674, + 0xb674, 0xb675, 0xb676, 0xb677, 0xb677, 0xb678, 0xb679, 0xb679, + 0xb67a, 0xb67b, 0xb67b, 0xb67c, 0xb67d, 0xb67d, 0xb67e, 0xb67f, + 0xb67f, 0xb680, 0xb681, 0xb681, 0xb682, 0xb683, 0xb683, 0xb684, + 0xb685, 0xb685, 0xb686, 0xb687, 0xb687, 0xb688, 0xb689, 0xb689, + 0xb68a, 0xb68b, 0xb68b, 0xb68c, 0xb68d, 0xb68d, 0xb68e, 0xb68f, + 0xb68f, 0xb690, 0xb691, 0xb691, 0xb692, 0xb693, 0xb693, 0xb694, + 0xb695, 0xb695, 0xb696, 0xb697, 0xb697, 0xb698, 0xb698, 0xb699, + 0xb69a, 0xb69a, 0xb69b, 0xb69c, 0xb69c, 0xb69d, 0xb69e, 0xb69e, + 0xb69f, 0xb6a0, 0xb6a0, 0xb6a1, 0xb6a2, 0xb6a2, 0xb6a3, 0xb6a4, + 0xb6a4, 0xb6a5, 0xb6a6, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a8, 0xb6a9, + 0xb6aa, 0xb6aa, 0xb6ab, 0xb6ab, 0xb6ac, 0xb6ad, 0xb6ad, 0xb6ae, + 0xb6af, 0xb6af, 0xb6b0, 0xb6b1, 0xb6b1, 0xb6b2, 0xb6b3, 0xb6b3, + 0xb6b4, 0xb6b5, 0xb6b5, 0xb6b6, 0xb6b6, 0xb6b7, 0xb6b8, 0xb6b8, + 0xb6b9, 0xb6ba, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bc, 0xb6bd, 0xb6be, + 0xb6be, 0xb6bf, 0xb6bf, 0xb6c0, 0xb6c1, 0xb6c1, 0xb6c2, 0xb6c3, + 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c5, 0xb6c6, 0xb6c6, 0xb6c7, 0xb6c8, + 0xb6c8, 0xb6c9, 0xb6ca, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cc, 0xb6cd, + 0xb6cd, 0xb6ce, 0xb6cf, 0xb6cf, 0xb6d0, 0xb6d1, 0xb6d1, 0xb6d2, + 0xb6d3, 0xb6d3, 0xb6d4, 0xb6d4, 0xb6d5, 0xb6d6, 0xb6d6, 0xb6d7, + 0xb6d8, 0xb6d8, 0xb6d9, 0xb6d9, 0xb6da, 0xb6db, 0xb6db, 0xb6dc, + 0xb6dd, 0xb6dd, 0xb6de, 0xb6de, 0xb6df, 0xb6e0, 0xb6e0, 0xb6e1, + 0xb6e2, 0xb6e2, 0xb6e3, 0xb6e4, 0xb6e4, 0xb6e5, 0xb6e5, 0xb6e6, + 0xb6e7, 0xb6e7, 0xb6e8, 0xb6e8, 0xb6e9, 0xb6ea, 0xb6ea, 0xb6eb, + 0xb6ec, 0xb6ec, 0xb6ed, 0xb6ed, 0xb6ee, 0xb6ef, 0xb6ef, 0xb6f0, + 0xb6f1, 0xb6f1, 0xb6f2, 0xb6f2, 0xb6f3, 0xb6f4, 0xb6f4, 0xb6f5, + 0xb6f6, 0xb6f6, 0xb6f7, 0xb6f7, 0xb6f8, 0xb6f9, 0xb6f9, 0xb6fa, + 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fc, 0xb6fd, 0xb6fe, 0xb6fe, 0xb6ff, + 0xb6ff, 0xb700, 0xb701, 0xb701, 0xb702, 0xb702, 0xb703, 0xb704, + 0xb704, 0xb705, 0xb705, 0xb706, 0xb707, 0xb707, 0xb708, 0xb709, + 0xb709, 0xb70a, 0xb70a, 0xb70b, 0xb70c, 0xb70c, 0xb70d, 0xb70d, + 0xb70e, 0xb70f, 0xb70f, 0xb710, 0xb710, 0xb711, 0xb712, 0xb712, + 0xb713, 0xb713, 0xb714, 0xb715, 0xb715, 0xb716, 0xb716, 0xb717, + 0xb718, 0xb718, 0xb719, 0xb719, 0xb71a, 0xb71b, 0xb71b, 0xb71c, + 0xb71d, 0xb71d, 0xb71e, 0xb71e, 0xb71f, 0xb720, 0xb720, 0xb721, + 0xb721, 0xb722, 0xb723, 0xb723, 0xb724, 0xb724, 0xb725, 0xb725, + 0xb726, 0xb727, 0xb727, 0xb728, 0xb728, 0xb729, 0xb72a, 0xb72a, + 0xb72b, 0xb72b, 0xb72c, 0xb72d, 0xb72d, 0xb72e, 0xb72e, 0xb72f, + 0xb730, 0xb730, 0xb731, 0xb731, 0xb732, 0xb733, 0xb733, 0xb734, + 0xb734, 0xb735, 0xb736, 0xb736, 0xb737, 0xb737, 0xb738, 0xb739, + 0xb739, 0xb73a, 0xb73a, 0xb73b, 0xb73b, 0xb73c, 0xb73d, 0xb73d, + 0xb73e, 0xb73e, 0xb73f, 0xb740, 0xb740, 0xb741, 0xb741, 0xb742, + 0xb743, 0xb743, 0xb744, 0xb744, 0xb745, 0xb745, 0xb746, 0xb747, + 0xb747, 0xb748, 0xb748, 0xb749, 0xb74a, 0xb74a, 0xb74b, 0xb74b, + 0xb74c, 0xb74c, 0xb74d, 0xb74e, 0xb74e, 0xb74f, 0xb74f, 0xb750, + 0xb751, 0xb751, 0xb752, 0xb752, 0xb753, 0xb753, 0xb754, 0xb755, + 0xb755, 0xb756, 0xb756, 0xb757, 0xb757, 0xb758, 0xb759, 0xb759, + 0xb75a, 0xb75a, 0xb75b, 0xb75c, 0xb75c, 0xb75d, 0xb75d, 0xb75e, + 0xb75e, 0xb75f, 0xb760, 0xb760, 0xb761, 0xb761, 0xb762, 0xb762, + 0xb763, 0xb764, 0xb764, 0xb765, 0xb765, 0xb766, 0xb766, 0xb767, + 0xb768, 0xb768, 0xb769, 0xb769, 0xb76a, 0xb76a, 0xb76b, 0xb76c, + 0xb76c, 0xb76d, 0xb76d, 0xb76e, 0xb76e, 0xb76f, 0xb770, 0xb770, + 0xb771, 0xb771, 0xb772, 0xb772, 0xb773, 0xb774, 0xb774, 0xb775, + 0xb775, 0xb776, 0xb776, 0xb777, 0xb778, 0xb778, 0xb779, 0xb779, + 0xb77a, 0xb77a, 0xb77b, 0xb77c, 0xb77c, 0xb77d, 0xb77d, 0xb77e, + 0xb77e, 0xb77f, 0xb77f, 0xb780, 0xb781, 0xb781, 0xb782, 0xb782, + 0xb783, 0xb783, 0xb784, 0xb785, 0xb785, 0xb786, 0xb786, 0xb787, + 0xb787, 0xb788, 0xb788, 0xb789, 0xb78a, 0xb78a, 0xb78b, 0xb78b, + 0xb78c, 0xb78c, 0xb78d, 0xb78e, 0xb78e, 0xb78f, 0xb78f, 0xb790, + 0xb790, 0xb791, 0xb791, 0xb792, 0xb793, 0xb793, 0xb794, 0xb794, + 0xb795, 0xb795, 0xb796, 0xb796, 0xb797, 0xb798, 0xb798, 0xb799, + 0xb799, 0xb79a, 0xb79a, 0xb79b, 0xb79b, 0xb79c, 0xb79d, 0xb79d, + 0xb79e, 0xb79e, 0xb79f, 0xb79f, 0xb7a0, 0xb7a0, 0xb7a1, 0xb7a2, + 0xb7a2, 0xb7a3, 0xb7a3, 0xb7a4, 0xb7a4, 0xb7a5, 0xb7a5, 0xb7a6, + 0xb7a7, 0xb7a7, 0xb7a8, 0xb7a8, 0xb7a9, 0xb7a9, 0xb7aa, 0xb7aa, + 0xb7ab, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7ad, 0xb7ae, 0xb7ae, 0xb7af, + 0xb7af, 0xb7b0, 0xb7b0, 0xb7b1, 0xb7b2, 0xb7b2, 0xb7b3, 0xb7b3, + 0xb7b4, 0xb7b4, 0xb7b5, 0xb7b5, 0xb7b6, 0xb7b6, 0xb7b7, 0xb7b8, + 0xb7b8, 0xb7b9, 0xb7b9, 0xb7ba, 0xb7ba, 0xb7bb, 0xb7bb, 0xb7bc, + 0xb7bc, 0xb7bd, 0xb7bd, 0xb7be, 0xb7bf, 0xb7bf, 0xb7c0, 0xb7c0, + 0xb7c1, 0xb7c1, 0xb7c2, 0xb7c2, 0xb7c3, 0xb7c3, 0xb7c4, 0xb7c5, + 0xb7c5, 0xb7c6, 0xb7c6, 0xb7c7, 0xb7c7, 0xb7c8, 0xb7c8, 0xb7c9, + 0xb7c9, 0xb7ca, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cc, 0xb7cd, 0xb7cd, + 0xb7ce, 0xb7ce, 0xb7cf, 0xb7cf, 0xb7d0, 0xb7d0, 0xb7d1, 0xb7d1, + 0xb7d2, 0xb7d3, 0xb7d3, 0xb7d4, 0xb7d4, 0xb7d5, 0xb7d5, 0xb7d6, + 0xb7d6, 0xb7d7, 0xb7d7, 0xb7d8, 0xb7d8, 0xb7d9, 0xb7da, 0xb7da, + 0xb7db, 0xb7db, 0xb7dc, 0xb7dc, 0xb7dd, 0xb7dd, 0xb7de, 0xb7de, + 0xb7df, 0xb7df, 0xb7e0, 0xb7e0, 0xb7e1, 0xb7e2, 0xb7e2, 0xb7e3, + 0xb7e3, 0xb7e4, 0xb7e4, 0xb7e5, 0xb7e5, 0xb7e6, 0xb7e6, 0xb7e7, + 0xb7e7, 0xb7e8, 0xb7e8, 0xb7e9, 0xb7e9, 0xb7ea, 0xb7eb, 0xb7eb, + 0xb7ec, 0xb7ec, 0xb7ed, 0xb7ed, 0xb7ee, 0xb7ee, 0xb7ef, 0xb7ef, + 0xb7f0, 0xb7f0, 0xb7f1, 0xb7f1, 0xb7f2, 0xb7f2, 0xb7f3, 0xb7f3, + 0xb7f4, 0xb7f5, 0xb7f5, 0xb7f6, 0xb7f6, 0xb7f7, 0xb7f7, 0xb7f8, + 0xb7f8, 0xb7f9, 0xb7f9, 0xb7fa, 0xb7fa, 0xb7fb, 0xb7fb, 0xb7fc, + 0xb7fc, 0xb7fd, 0xb7fd, 0xb7fe, 0xb7fe, 0xb7ff, 0xb800, 0xb800, + 0xb800, 0xb801, 0xb801, 0xb801, 0xb801, 0xb802, 0xb802, 0xb802, + 0xb802, 0xb803, 0xb803, 0xb803, 0xb803, 0xb804, 0xb804, 0xb804, + 0xb804, 0xb805, 0xb805, 0xb805, 0xb805, 0xb806, 0xb806, 0xb806, + 0xb807, 0xb807, 0xb807, 0xb807, 0xb808, 0xb808, 0xb808, 0xb808, + 0xb809, 0xb809, 0xb809, 0xb809, 0xb80a, 0xb80a, 0xb80a, 0xb80a, + 0xb80b, 0xb80b, 0xb80b, 0xb80b, 0xb80c, 0xb80c, 0xb80c, 0xb80c, + 0xb80d, 0xb80d, 0xb80d, 0xb80d, 0xb80e, 0xb80e, 0xb80e, 0xb80f, + 0xb80f, 0xb80f, 0xb80f, 0xb810, 0xb810, 0xb810, 0xb810, 0xb811, + 0xb811, 0xb811, 0xb811, 0xb812, 0xb812, 0xb812, 0xb812, 0xb813, + 0xb813, 0xb813, 0xb813, 0xb814, 0xb814, 0xb814, 0xb814, 0xb815, + 0xb815, 0xb815, 0xb815, 0xb816, 0xb816, 0xb816, 0xb816, 0xb817, + 0xb817, 0xb817, 0xb817, 0xb818, 0xb818, 0xb818, 0xb818, 0xb819, + 0xb819, 0xb819, 0xb819, 0xb81a, 0xb81a, 0xb81a, 0xb81b, 0xb81b, + 0xb81b, 0xb81b, 0xb81c, 0xb81c, 0xb81c, 0xb81c, 0xb81d, 0xb81d, + 0xb81d, 0xb81d, 0xb81e, 0xb81e, 0xb81e, 0xb81e, 0xb81f, 0xb81f, + 0xb81f, 0xb81f, 0xb820, 0xb820, 0xb820, 0xb820, 0xb821, 0xb821, + 0xb821, 0xb821, 0xb822, 0xb822, 0xb822, 0xb822, 0xb823, 0xb823, + 0xb823, 0xb823, 0xb824, 0xb824, 0xb824, 0xb824, 0xb825, 0xb825, + 0xb825, 0xb825, 0xb826, 0xb826, 0xb826, 0xb826, 0xb827, 0xb827, + 0xb827, 0xb827, 0xb828, 0xb828, 0xb828, 0xb828, 0xb829, 0xb829, + 0xb829, 0xb829, 0xb82a, 0xb82a, 0xb82a, 0xb82a, 0xb82b, 0xb82b, + 0xb82b, 0xb82b, 0xb82c, 0xb82c, 0xb82c, 0xb82c, 0xb82d, 0xb82d, + 0xb82d, 0xb82d, 0xb82e, 0xb82e, 0xb82e, 0xb82e, 0xb82f, 0xb82f, + 0xb82f, 0xb82f, 0xb830, 0xb830, 0xb830, 0xb830, 0xb831, 0xb831, + 0xb831, 0xb831, 0xb831, 0xb832, 0xb832, 0xb832, 0xb832, 0xb833, + 0xb833, 0xb833, 0xb833, 0xb834, 0xb834, 0xb834, 0xb834, 0xb835, + 0xb835, 0xb835, 0xb835, 0xb836, 0xb836, 0xb836, 0xb836, 0xb837, + 0xb837, 0xb837, 0xb837, 0xb838, 0xb838, 0xb838, 0xb838, 0xb839, + 0xb839, 0xb839, 0xb839, 0xb83a, 0xb83a, 0xb83a, 0xb83a, 0xb83b, + 0xb83b, 0xb83b, 0xb83b, 0xb83c, 0xb83c, 0xb83c, 0xb83c, 0xb83d, + 0xb83d, 0xb83d, 0xb83d, 0xb83e, 0xb83e, 0xb83e, 0xb83e, 0xb83e, + 0xb83f, 0xb83f, 0xb83f, 0xb83f, 0xb840, 0xb840, 0xb840, 0xb840, + 0xb841, 0xb841, 0xb841, 0xb841, 0xb842, 0xb842, 0xb842, 0xb842, + 0xb843, 0xb843, 0xb844, 0xb844, 0xb845, 0xb845, 0xb846, 0xb846, + 0xb846, 0xb847, 0xb847, 0xb848, 0xb848, 0xb849, 0xb849, 0xb84a, + 0xb84a, 0xb84b, 0xb84b, 0xb84c, 0xb84c, 0xb84d, 0xb84d, 0xb84e, + 0xb84e, 0xb84f, 0xb84f, 0xb850, 0xb850, 0xb851, 0xb851, 0xb851, + 0xb852, 0xb852, 0xb853, 0xb853, 0xb854, 0xb854, 0xb855, 0xb855, + 0xb856, 0xb856, 0xb857, 0xb857, 0xb858, 0xb858, 0xb859, 0xb859, + 0xb85a, 0xb85a, 0xb85a, 0xb85b, 0xb85b, 0xb85c, 0xb85c, 0xb85d, + 0xb85d, 0xb85e, 0xb85e, 0xb85f, 0xb85f, 0xb860, 0xb860, 0xb861, + 0xb861, 0xb862, 0xb862, 0xb862, 0xb863, 0xb863, 0xb864, 0xb864, + 0xb865, 0xb865, 0xb866, 0xb866, 0xb867, 0xb867, 0xb868, 0xb868, + 0xb869, 0xb869, 0xb869, 0xb86a, 0xb86a, 0xb86b, 0xb86b, 0xb86c, + 0xb86c, 0xb86d, 0xb86d, 0xb86e, 0xb86e, 0xb86f, 0xb86f, 0xb86f, + 0xb870, 0xb870, 0xb871, 0xb871, 0xb872, 0xb872, 0xb873, 0xb873, + 0xb874, 0xb874, 0xb875, 0xb875, 0xb875, 0xb876, 0xb876, 0xb877, + 0xb877, 0xb878, 0xb878, 0xb879, 0xb879, 0xb87a, 0xb87a, 0xb87a, + 0xb87b, 0xb87b, 0xb87c, 0xb87c, 0xb87d, 0xb87d, 0xb87e, 0xb87e, + 0xb87f, 0xb87f, 0xb87f, 0xb880, 0xb880, 0xb881, 0xb881, 0xb882, + 0xb882, 0xb883, 0xb883, 0xb884, 0xb884, 0xb884, 0xb885, 0xb885, + 0xb886, 0xb886, 0xb887, 0xb887, 0xb888, 0xb888, 0xb889, 0xb889, + 0xb889, 0xb88a, 0xb88a, 0xb88b, 0xb88b, 0xb88c, 0xb88c, 0xb88d, + 0xb88d, 0xb88d, 0xb88e, 0xb88e, 0xb88f, 0xb88f, 0xb890, 0xb890, + 0xb891, 0xb891, 0xb891, 0xb892, 0xb892, 0xb893, 0xb893, 0xb894, + 0xb894, 0xb895, 0xb895, 0xb895, 0xb896, 0xb896, 0xb897, 0xb897, + 0xb898, 0xb898, 0xb899, 0xb899, 0xb899, 0xb89a, 0xb89a, 0xb89b, + 0xb89b, 0xb89c, 0xb89c, 0xb89d, 0xb89d, 0xb89d, 0xb89e, 0xb89e, + 0xb89f, 0xb89f, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a1, 0xb8a1, 0xb8a2, + 0xb8a2, 0xb8a3, 0xb8a3, 0xb8a4, 0xb8a4, 0xb8a4, 0xb8a5, 0xb8a5, + 0xb8a6, 0xb8a6, 0xb8a7, 0xb8a7, 0xb8a7, 0xb8a8, 0xb8a8, 0xb8a9, + 0xb8a9, 0xb8aa, 0xb8aa, 0xb8ab, 0xb8ab, 0xb8ab, 0xb8ac, 0xb8ac, + 0xb8ad, 0xb8ad, 0xb8ae, 0xb8ae, 0xb8ae, 0xb8af, 0xb8af, 0xb8b0, + 0xb8b0, 0xb8b1, 0xb8b1, 0xb8b1, 0xb8b2, 0xb8b2, 0xb8b3, 0xb8b3, + 0xb8b4, 0xb8b4, 0xb8b4, 0xb8b5, 0xb8b5, 0xb8b6, 0xb8b6, 0xb8b7, + 0xb8b7, 0xb8b7, 0xb8b8, 0xb8b8, 0xb8b9, 0xb8b9, 0xb8ba, 0xb8ba, + 0xb8ba, 0xb8bb, 0xb8bb, 0xb8bc, 0xb8bc, 0xb8bd, 0xb8bd, 0xb8bd, + 0xb8be, 0xb8be, 0xb8bf, 0xb8bf, 0xb8c0, 0xb8c0, 0xb8c0, 0xb8c1, + 0xb8c1, 0xb8c2, 0xb8c2, 0xb8c3, 0xb8c3, 0xb8c3, 0xb8c4, 0xb8c4, + 0xb8c5, 0xb8c5, 0xb8c5, 0xb8c6, 0xb8c6, 0xb8c7, 0xb8c7, 0xb8c8, + 0xb8c8, 0xb8c8, 0xb8c9, 0xb8c9, 0xb8ca, 0xb8ca, 0xb8cb, 0xb8cb, + 0xb8cb, 0xb8cc, 0xb8cc, 0xb8cd, 0xb8cd, 0xb8cd, 0xb8ce, 0xb8ce, + 0xb8cf, 0xb8cf, 0xb8d0, 0xb8d0, 0xb8d0, 0xb8d1, 0xb8d1, 0xb8d2, + 0xb8d2, 0xb8d3, 0xb8d3, 0xb8d3, 0xb8d4, 0xb8d4, 0xb8d5, 0xb8d5, + 0xb8d5, 0xb8d6, 0xb8d6, 0xb8d7, 0xb8d7, 0xb8d8, 0xb8d8, 0xb8d8, + 0xb8d9, 0xb8d9, 0xb8da, 0xb8da, 0xb8da, 0xb8db, 0xb8db, 0xb8dc, + 0xb8dc, 0xb8dc, 0xb8dd, 0xb8dd, 0xb8de, 0xb8de, 0xb8df, 0xb8df, + 0xb8df, 0xb8e0, 0xb8e0, 0xb8e1, 0xb8e1, 0xb8e1, 0xb8e2, 0xb8e2, + 0xb8e3, 0xb8e3, 0xb8e3, 0xb8e4, 0xb8e4, 0xb8e5, 0xb8e5, 0xb8e6, + 0xb8e6, 0xb8e6, 0xb8e7, 0xb8e7, 0xb8e8, 0xb8e8, 0xb8e8, 0xb8e9, + 0xb8e9, 0xb8ea, 0xb8ea, 0xb8ea, 0xb8eb, 0xb8eb, 0xb8ec, 0xb8ec, + 0xb8ec, 0xb8ed, 0xb8ed, 0xb8ee, 0xb8ee, 0xb8ee, 0xb8ef, 0xb8ef, + 0xb8f0, 0xb8f0, 0xb8f1, 0xb8f1, 0xb8f1, 0xb8f2, 0xb8f2, 0xb8f3, + 0xb8f3, 0xb8f3, 0xb8f4, 0xb8f4, 0xb8f5, 0xb8f5, 0xb8f5, 0xb8f6, + 0xb8f6, 0xb8f7, 0xb8f7, 0xb8f7, 0xb8f8, 0xb8f8, 0xb8f9, 0xb8f9, + 0xb8f9, 0xb8fa, 0xb8fa, 0xb8fb, 0xb8fb, 0xb8fb, 0xb8fc, 0xb8fc, + 0xb8fd, 0xb8fd, 0xb8fd, 0xb8fe, 0xb8fe, 0xb8ff, 0xb8ff, 0xb8ff, + 0xb900, 0xb900, 0xb901, 0xb901, 0xb901, 0xb902, 0xb902, 0xb903, + 0xb903, 0xb903, 0xb904, 0xb904, 0xb905, 0xb905, 0xb905, 0xb906, + 0xb906, 0xb907, 0xb907, 0xb907, 0xb908, 0xb908, 0xb909, 0xb909, + 0xb909, 0xb90a, 0xb90a, 0xb90b, 0xb90b, 0xb90b, 0xb90c, 0xb90c, + 0xb90d, 0xb90d, 0xb90d, 0xb90e, 0xb90e, 0xb90f, 0xb90f, 0xb90f, + 0xb910, 0xb910, 0xb910, 0xb911, 0xb911, 0xb912, 0xb912, 0xb912, + 0xb913, 0xb913, 0xb914, 0xb914, 0xb914, 0xb915, 0xb915, 0xb916, + 0xb916, 0xb916, 0xb917, 0xb917, 0xb918, 0xb918, 0xb918, 0xb919, + 0xb919, 0xb919, 0xb91a, 0xb91a, 0xb91b, 0xb91b, 0xb91b, 0xb91c, + 0xb91c, 0xb91d, 0xb91d, 0xb91d, 0xb91e, 0xb91e, 0xb91f, 0xb91f, + 0xb91f, 0xb920, 0xb920, 0xb920, 0xb921, 0xb921, 0xb922, 0xb922, + 0xb922, 0xb923, 0xb923, 0xb924, 0xb924, 0xb924, 0xb925, 0xb925, + 0xb926, 0xb926, 0xb926, 0xb927, 0xb927, 0xb927, 0xb928, 0xb928, + 0xb929, 0xb929, 0xb929, 0xb92a, 0xb92a, 0xb92b, 0xb92b, 0xb92b, + 0xb92c, 0xb92c, 0xb92c, 0xb92d, 0xb92d, 0xb92e, 0xb92e, 0xb92e, + 0xb92f, 0xb92f, 0xb92f, 0xb930, 0xb930, 0xb931, 0xb931, 0xb931, + 0xb932, 0xb932, 0xb933, 0xb933, 0xb933, 0xb934, 0xb934, 0xb934, + 0xb935, 0xb935, 0xb936, 0xb936, 0xb936, 0xb937, 0xb937, 0xb937, + 0xb938, 0xb938, 0xb939, 0xb939, 0xb939, 0xb93a, 0xb93a, 0xb93b, + 0xb93b, 0xb93b, 0xb93c, 0xb93c, 0xb93c, 0xb93d, 0xb93d, 0xb93e, + 0xb93e, 0xb93e, 0xb93f, 0xb93f, 0xb93f, 0xb940, 0xb940, 0xb941, + 0xb941, 0xb941, 0xb942, 0xb942, 0xb942, 0xb943, 0xb943, 0xb944, + 0xb944, 0xb944, 0xb945, 0xb945, 0xb945, 0xb946, 0xb946, 0xb947, + 0xb947, 0xb947, 0xb948, 0xb948, 0xb948, 0xb949, 0xb949, 0xb94a, + 0xb94a, 0xb94a, 0xb94b, 0xb94b, 0xb94b, 0xb94c, 0xb94c, 0xb94d, + 0xb94d, 0xb94d, 0xb94e, 0xb94e, 0xb94e, 0xb94f, 0xb94f, 0xb950, + 0xb950, 0xb950, 0xb951, 0xb951, 0xb951, 0xb952, 0xb952, 0xb953, + 0xb953, 0xb953, 0xb954, 0xb954, 0xb954, 0xb955, 0xb955, 0xb955, + 0xb956, 0xb956, 0xb957, 0xb957, 0xb957, 0xb958, 0xb958, 0xb958, + 0xb959, 0xb959, 0xb95a, 0xb95a, 0xb95a, 0xb95b, 0xb95b, 0xb95b, + 0xb95c, 0xb95c, 0xb95c, 0xb95d, 0xb95d, 0xb95e, 0xb95e, 0xb95e, + 0xb95f, 0xb95f, 0xb95f, 0xb960, 0xb960, 0xb961, 0xb961, 0xb961, + 0xb962, 0xb962, 0xb962, 0xb963, 0xb963, 0xb963, 0xb964, 0xb964, + 0xb965, 0xb965, 0xb965, 0xb966, 0xb966, 0xb966, 0xb967, 0xb967, + 0xb967, 0xb968, 0xb968, 0xb969, 0xb969, 0xb969, 0xb96a, 0xb96a, + 0xb96a, 0xb96b, 0xb96b, 0xb96b, 0xb96c, 0xb96c, 0xb96d, 0xb96d, + 0xb96d, 0xb96e, 0xb96e, 0xb96e, 0xb96f, 0xb96f, 0xb96f, 0xb970, + 0xb970, 0xb970, 0xb971, 0xb971, 0xb972, 0xb972, 0xb972, 0xb973, + 0xb973, 0xb973, 0xb974, 0xb974, 0xb974, 0xb975, 0xb975, 0xb976, + 0xb976, 0xb976, 0xb977, 0xb977, 0xb977, 0xb978, 0xb978, 0xb978, + 0xb979, 0xb979, 0xb979, 0xb97a, 0xb97a, 0xb97b, 0xb97b, 0xb97b, + 0xb97c, 0xb97c, 0xb97c, 0xb97d, 0xb97d, 0xb97d, 0xb97e, 0xb97e, + 0xb97e, 0xb97f, 0xb97f, 0xb980, 0xb980, 0xb980, 0xb981, 0xb981, + 0xb981, 0xb982, 0xb982, 0xb982, 0xb983, 0xb983, 0xb983, 0xb984, + 0xb984, 0xb985, 0xb985, 0xb985, 0xb986, 0xb986, 0xb986, 0xb987, + 0xb987, 0xb987, 0xb988, 0xb988, 0xb988, 0xb989, 0xb989, 0xb98a, + 0xb98a, 0xb98a, 0xb98b, 0xb98b, 0xb98b, 0xb98c, 0xb98c, 0xb98c, + 0xb98d, 0xb98d, 0xb98d, 0xb98e, 0xb98e, 0xb98e, 0xb98f, 0xb98f, + 0xb98f, 0xb990, 0xb990, 0xb991, 0xb991, 0xb991, 0xb992, 0xb992, + 0xb992, 0xb993, 0xb993, 0xb993, 0xb994, 0xb994, 0xb994, 0xb995, + 0xb995, 0xb995, 0xb996, 0xb996, 0xb997, 0xb997, 0xb997, 0xb998, + 0xb998, 0xb998, 0xb999, 0xb999, 0xb999, 0xb99a, 0xb99a, 0xb99a, + 0xb99b, 0xb99b, 0xb99b, 0xb99c, 0xb99c, 0xb99c, 0xb99d, 0xb99d, + 0xb99d, 0xb99e, 0xb99e, 0xb99f, 0xb99f, 0xb99f, 0xb9a0, 0xb9a0, + 0xb9a0, 0xb9a1, 0xb9a1, 0xb9a1, 0xb9a2, 0xb9a2, 0xb9a2, 0xb9a3, + 0xb9a3, 0xb9a3, 0xb9a4, 0xb9a4, 0xb9a4, 0xb9a5, 0xb9a5, 0xb9a5, + 0xb9a6, 0xb9a6, 0xb9a6, 0xb9a7, 0xb9a7, 0xb9a8, 0xb9a8, 0xb9a8, + 0xb9a9, 0xb9a9, 0xb9a9, 0xb9aa, 0xb9aa, 0xb9aa, 0xb9ab, 0xb9ab, + 0xb9ab, 0xb9ac, 0xb9ac, 0xb9ac, 0xb9ad, 0xb9ad, 0xb9ad, 0xb9ae, + 0xb9ae, 0xb9ae, 0xb9af, 0xb9af, 0xb9af, 0xb9b0, 0xb9b0, 0xb9b0, + 0xb9b1, 0xb9b1, 0xb9b1, 0xb9b2, 0xb9b2, 0xb9b2, 0xb9b3, 0xb9b3, + 0xb9b4, 0xb9b4, 0xb9b4, 0xb9b5, 0xb9b5, 0xb9b5, 0xb9b6, 0xb9b6, + 0xb9b6, 0xb9b7, 0xb9b7, 0xb9b7, 0xb9b8, 0xb9b8, 0xb9b8, 0xb9b9, + 0xb9b9, 0xb9b9, 0xb9ba, 0xb9ba, 0xb9ba, 0xb9bb, 0xb9bb, 0xb9bb, + 0xb9bc, 0xb9bc, 0xb9bc, 0xb9bd, 0xb9bd, 0xb9bd, 0xb9be, 0xb9be, + 0xb9be, 0xb9bf, 0xb9bf, 0xb9bf, 0xb9c0, 0xb9c0, 0xb9c0, 0xb9c1, + 0xb9c1, 0xb9c1, 0xb9c2, 0xb9c2, 0xb9c2, 0xb9c3, 0xb9c3, 0xb9c3, + 0xb9c4, 0xb9c4, 0xb9c4, 0xb9c5, 0xb9c5, 0xb9c5, 0xb9c6, 0xb9c6, + 0xb9c6, 0xb9c7, 0xb9c7, 0xb9c7, 0xb9c8, 0xb9c8, 0xb9c8, 0xb9c9, + 0xb9c9, 0xb9ca, 0xb9ca, 0xb9ca, 0xb9cb, 0xb9cb, 0xb9cb, 0xb9cc, + 0xb9cc, 0xb9cc, 0xb9cd, 0xb9cd, 0xb9cd, 0xb9ce, 0xb9ce, 0xb9ce, + 0xb9cf, 0xb9cf, 0xb9cf, 0xb9d0, 0xb9d0, 0xb9d0, 0xb9d1, 0xb9d1, + 0xb9d1, 0xb9d2, 0xb9d2, 0xb9d2, 0xb9d3, 0xb9d3, 0xb9d3, 0xb9d4, + 0xb9d4, 0xb9d4, 0xb9d5, 0xb9d5, 0xb9d5, 0xb9d6, 0xb9d6, 0xb9d6, + 0xb9d7, 0xb9d7, 0xb9d8, 0xb9d8, 0xb9d9, 0xb9da, 0xb9da, 0xb9db, + 0xb9dc, 0xb9dc, 0xb9dd, 0xb9de, 0xb9de, 0xb9df, 0xb9e0, 0xb9e0, + 0xb9e1, 0xb9e2, 0xb9e2, 0xb9e3, 0xb9e4, 0xb9e4, 0xb9e5, 0xb9e6, + 0xb9e6, 0xb9e7, 0xb9e8, 0xb9e8, 0xb9e9, 0xb9ea, 0xb9ea, 0xb9eb, + 0xb9ec, 0xb9ec, 0xb9ed, 0xb9ee, 0xb9ee, 0xb9ef, 0xb9ef, 0xb9f0, + 0xb9f1, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f3, 0xb9f4, 0xb9f5, 0xb9f5, + 0xb9f6, 0xb9f7, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9f9, 0xb9fa, 0xb9fa, + 0xb9fb, 0xb9fc, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9fe, 0xb9ff, 0xba00, + 0xba00, 0xba01, 0xba02, 0xba02, 0xba03, 0xba03, 0xba04, 0xba05, + 0xba05, 0xba06, 0xba07, 0xba07, 0xba08, 0xba09, 0xba09, 0xba0a, + 0xba0a, 0xba0b, 0xba0c, 0xba0c, 0xba0d, 0xba0e, 0xba0e, 0xba0f, + 0xba10, 0xba10, 0xba11, 0xba11, 0xba12, 0xba13, 0xba13, 0xba14, + 0xba15, 0xba15, 0xba16, 0xba17, 0xba17, 0xba18, 0xba18, 0xba19, + 0xba1a, 0xba1a, 0xba1b, 0xba1c, 0xba1c, 0xba1d, 0xba1d, 0xba1e, + 0xba1f, 0xba1f, 0xba20, 0xba21, 0xba21, 0xba22, 0xba22, 0xba23, + 0xba24, 0xba24, 0xba25, 0xba26, 0xba26, 0xba27, 0xba27, 0xba28, + 0xba29, 0xba29, 0xba2a, 0xba2b, 0xba2b, 0xba2c, 0xba2c, 0xba2d, + 0xba2e, 0xba2e, 0xba2f, 0xba30, 0xba30, 0xba31, 0xba31, 0xba32, + 0xba33, 0xba33, 0xba34, 0xba34, 0xba35, 0xba36, 0xba36, 0xba37, + 0xba38, 0xba38, 0xba39, 0xba39, 0xba3a, 0xba3b, 0xba3b, 0xba3c, + 0xba3c, 0xba3d, 0xba3e, 0xba3e, 0xba3f, 0xba40, 0xba40, 0xba41, + 0xba41, 0xba42, 0xba43, 0xba43, 0xba44, 0xba44, 0xba45, 0xba46, + 0xba46, 0xba47, 0xba47, 0xba48, 0xba49, 0xba49, 0xba4a, 0xba4a, + 0xba4b, 0xba4c, 0xba4c, 0xba4d, 0xba4e, 0xba4e, 0xba4f, 0xba4f, + 0xba50, 0xba51, 0xba51, 0xba52, 0xba52, 0xba53, 0xba54, 0xba54, + 0xba55, 0xba55, 0xba56, 0xba57, 0xba57, 0xba58, 0xba58, 0xba59, + 0xba5a, 0xba5a, 0xba5b, 0xba5b, 0xba5c, 0xba5d, 0xba5d, 0xba5e, + 0xba5e, 0xba5f, 0xba60, 0xba60, 0xba61, 0xba61, 0xba62, 0xba63, + 0xba63, 0xba64, 0xba64, 0xba65, 0xba66, 0xba66, 0xba67, 0xba67, + 0xba68, 0xba68, 0xba69, 0xba6a, 0xba6a, 0xba6b, 0xba6b, 0xba6c, + 0xba6d, 0xba6d, 0xba6e, 0xba6e, 0xba6f, 0xba70, 0xba70, 0xba71, + 0xba71, 0xba72, 0xba73, 0xba73, 0xba74, 0xba74, 0xba75, 0xba75, + 0xba76, 0xba77, 0xba77, 0xba78, 0xba78, 0xba79, 0xba7a, 0xba7a, + 0xba7b, 0xba7b, 0xba7c, 0xba7c, 0xba7d, 0xba7e, 0xba7e, 0xba7f, + 0xba7f, 0xba80, 0xba81, 0xba81, 0xba82, 0xba82, 0xba83, 0xba83, + 0xba84, 0xba85, 0xba85, 0xba86, 0xba86, 0xba87, 0xba88, 0xba88, + 0xba89, 0xba89, 0xba8a, 0xba8a, 0xba8b, 0xba8c, 0xba8c, 0xba8d, + 0xba8d, 0xba8e, 0xba8f, 0xba8f, 0xba90, 0xba90, 0xba91, 0xba91, + 0xba92, 0xba93, 0xba93, 0xba94, 0xba94, 0xba95, 0xba95, 0xba96, + 0xba97, 0xba97, 0xba98, 0xba98, 0xba99, 0xba99, 0xba9a, 0xba9b, + 0xba9b, 0xba9c, 0xba9c, 0xba9d, 0xba9d, 0xba9e, 0xba9f, 0xba9f, + 0xbaa0, 0xbaa0, 0xbaa1, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa3, 0xbaa4, + 0xbaa4, 0xbaa5, 0xbaa5, 0xbaa6, 0xbaa7, 0xbaa7, 0xbaa8, 0xbaa8, + 0xbaa9, 0xbaa9, 0xbaaa, 0xbaaa, 0xbaab, 0xbaac, 0xbaac, 0xbaad, + 0xbaad, 0xbaae, 0xbaae, 0xbaaf, 0xbab0, 0xbab0, 0xbab1, 0xbab1, + 0xbab2, 0xbab2, 0xbab3, 0xbab4, 0xbab4, 0xbab5, 0xbab5, 0xbab6, + 0xbab6, 0xbab7, 0xbab7, 0xbab8, 0xbab9, 0xbab9, 0xbaba, 0xbaba, + 0xbabb, 0xbabb, 0xbabc, 0xbabc, 0xbabd, 0xbabe, 0xbabe, 0xbabf, + 0xbabf, 0xbac0, 0xbac0, 0xbac1, 0xbac2, 0xbac2, 0xbac3, 0xbac3, + 0xbac4, 0xbac4, 0xbac5, 0xbac5, 0xbac6, 0xbac7, 0xbac7, 0xbac8, + 0xbac8, 0xbac9, 0xbac9, 0xbaca, 0xbaca, 0xbacb, 0xbacb, 0xbacc, + 0xbacd, 0xbacd, 0xbace, 0xbace, 0xbacf, 0xbacf, 0xbad0, 0xbad0, + 0xbad1, 0xbad2, 0xbad2, 0xbad3, 0xbad3, 0xbad4, 0xbad4, 0xbad5, + 0xbad5, 0xbad6, 0xbad7, 0xbad7, 0xbad8, 0xbad8, 0xbad9, 0xbad9, + 0xbada, 0xbada, 0xbadb, 0xbadb, 0xbadc, 0xbadd, 0xbadd, 0xbade, + 0xbade, 0xbadf, 0xbadf, 0xbae0, 0xbae0, 0xbae1, 0xbae1, 0xbae2, + 0xbae3, 0xbae3, 0xbae4, 0xbae4, 0xbae5, 0xbae5, 0xbae6, 0xbae6, + 0xbae7, 0xbae7, 0xbae8, 0xbae9, 0xbae9, 0xbaea, 0xbaea, 0xbaeb, + 0xbaeb, 0xbaec, 0xbaec, 0xbaed, 0xbaed, 0xbaee, 0xbaee, 0xbaef, + 0xbaf0, 0xbaf0, 0xbaf1, 0xbaf1, 0xbaf2, 0xbaf2, 0xbaf3, 0xbaf3, + 0xbaf4, 0xbaf4, 0xbaf5, 0xbaf5, 0xbaf6, 0xbaf7, 0xbaf7, 0xbaf8, + 0xbaf8, 0xbaf9, 0xbaf9, 0xbafa, 0xbafa, 0xbafb, 0xbafb, 0xbafc, + 0xbafc, 0xbafd, 0xbafe, 0xbafe, 0xbaff, 0xbaff, 0xbb00, 0xbb00, + 0xbb01, 0xbb01, 0xbb02, 0xbb02, 0xbb03, 0xbb03, 0xbb04, 0xbb04, + 0xbb05, 0xbb05, 0xbb06, 0xbb07, 0xbb07, 0xbb08, 0xbb08, 0xbb09, + 0xbb09, 0xbb0a, 0xbb0a, 0xbb0b, 0xbb0b, 0xbb0c, 0xbb0c, 0xbb0d, + 0xbb0d, 0xbb0e, 0xbb0f, 0xbb0f, 0xbb10, 0xbb10, 0xbb11, 0xbb11, + 0xbb12, 0xbb12, 0xbb13, 0xbb13, 0xbb14, 0xbb14, 0xbb15, 0xbb15, + 0xbb16, 0xbb16, 0xbb17, 0xbb17, 0xbb18, 0xbb19, 0xbb19, 0xbb1a, + 0xbb1a, 0xbb1b, 0xbb1b, 0xbb1c, 0xbb1c, 0xbb1d, 0xbb1d, 0xbb1e, + 0xbb1e, 0xbb1f, 0xbb1f, 0xbb20, 0xbb20, 0xbb21, 0xbb21, 0xbb22, + 0xbb22, 0xbb23, 0xbb23, 0xbb24, 0xbb25, 0xbb25, 0xbb26, 0xbb26, + 0xbb27, 0xbb27, 0xbb28, 0xbb28, 0xbb29, 0xbb29, 0xbb2a, 0xbb2a, + 0xbb2b, 0xbb2b, 0xbb2c, 0xbb2c, 0xbb2d, 0xbb2d, 0xbb2e, 0xbb2e, + 0xbb2f, 0xbb2f, 0xbb30, 0xbb30, 0xbb31, 0xbb32, 0xbb32, 0xbb33, + 0xbb33, 0xbb34, 0xbb34, 0xbb35, 0xbb35, 0xbb36, 0xbb36, 0xbb37, + 0xbb37, 0xbb38, 0xbb38, 0xbb39, 0xbb39, 0xbb3a, 0xbb3a, 0xbb3b, + 0xbb3b, 0xbb3c, 0xbb3c, 0xbb3d, 0xbb3d, 0xbb3e, 0xbb3e, 0xbb3f, + 0xbb3f, 0xbb40, 0xbb40, 0xbb41, 0xbb41, 0xbb42, 0xbb42, 0xbb43, + 0xbb43, 0xbb44, 0xbb44, 0xbb45, 0xbb46, 0xbb46, 0xbb47, 0xbb47, + 0xbb48, 0xbb48, 0xbb49, 0xbb49, 0xbb4a, 0xbb4a, 0xbb4b, 0xbb4b, + 0xbb4c, 0xbb4c, 0xbb4d, 0xbb4d, 0xbb4e, 0xbb4e, 0xbb4f, 0xbb4f, + 0xbb50, 0xbb50, 0xbb51, 0xbb51, 0xbb52, 0xbb52, 0xbb53, 0xbb53, + 0xbb54, 0xbb54, 0xbb55, 0xbb55, 0xbb56, 0xbb56, 0xbb57, 0xbb57, + 0xbb58, 0xbb58, 0xbb59, 0xbb59, 0xbb5a, 0xbb5a, 0xbb5b, 0xbb5b, + 0xbb5c, 0xbb5c, 0xbb5d, 0xbb5d, 0xbb5e, 0xbb5e, 0xbb5f, 0xbb5f, + 0xbb60, 0xbb60, 0xbb61, 0xbb61, 0xbb62, 0xbb62, 0xbb63, 0xbb63, + 0xbb64, 0xbb64, 0xbb65, 0xbb65, 0xbb66, 0xbb66, 0xbb67, 0xbb67, + 0xbb68, 0xbb68, 0xbb69, 0xbb69, 0xbb6a, 0xbb6a, 0xbb6b, 0xbb6b, + 0xbb6c, 0xbb6c, 0xbb6d, 0xbb6d, 0xbb6e, 0xbb6e, 0xbb6f, 0xbb6f, + 0xbb70, 0xbb70, 0xbb71, 0xbb71, 0xbb72, 0xbb72, 0xbb73, 0xbb73, + 0xbb74, 0xbb74, 0xbb75, 0xbb75, 0xbb76, 0xbb76, 0xbb77, 0xbb77, + 0xbb78, 0xbb78, 0xbb79, 0xbb79, 0xbb7a, 0xbb7a, 0xbb7b, 0xbb7b, + 0xbb7c, 0xbb7c, 0xbb7d, 0xbb7d, 0xbb7e, 0xbb7e, 0xbb7f, 0xbb7f, + 0xbb80, 0xbb80, 0xbb81, 0xbb81, 0xbb82, 0xbb82, 0xbb82, 0xbb83, + 0xbb83, 0xbb84, 0xbb84, 0xbb85, 0xbb85, 0xbb86, 0xbb86, 0xbb87, + 0xbb87, 0xbb88, 0xbb88, 0xbb89, 0xbb89, 0xbb8a, 0xbb8a, 0xbb8b, + 0xbb8b, 0xbb8c, 0xbb8c, 0xbb8d, 0xbb8d, 0xbb8e, 0xbb8e, 0xbb8f, + 0xbb8f, 0xbb90, 0xbb90, 0xbb91, 0xbb91, 0xbb92, 0xbb92, 0xbb93, + 0xbb93, 0xbb94, 0xbb94, 0xbb95, 0xbb95, 0xbb96, 0xbb96, 0xbb96, + 0xbb97, 0xbb97, 0xbb98, 0xbb98, 0xbb99, 0xbb99, 0xbb9a, 0xbb9a, + 0xbb9b, 0xbb9b, 0xbb9c, 0xbb9c, 0xbb9d, 0xbb9d, 0xbb9e, 0xbb9e, + 0xbb9f, 0xbb9f, 0xbba0, 0xbba0, 0xbba1, 0xbba1, 0xbba2, 0xbba2, + 0xbba3, 0xbba3, 0xbba4, 0xbba4, 0xbba4, 0xbba5, 0xbba5, 0xbba6, + 0xbba6, 0xbba7, 0xbba7, 0xbba8, 0xbba8, 0xbba9, 0xbba9, 0xbbaa, + 0xbbaa, 0xbbab, 0xbbab, 0xbbac, 0xbbac, 0xbbad, 0xbbad, 0xbbae, + 0xbbae, 0xbbaf, 0xbbaf, 0xbbaf, 0xbbb0, 0xbbb0, 0xbbb1, 0xbbb1, + 0xbbb2, 0xbbb2, 0xbbb3, 0xbbb3, 0xbbb4, 0xbbb4, 0xbbb5, 0xbbb5, + 0xbbb6, 0xbbb6, 0xbbb7, 0xbbb7, 0xbbb8, 0xbbb8, 0xbbb9, 0xbbb9, + 0xbbb9, 0xbbba, 0xbbba, 0xbbbb, 0xbbbb, 0xbbbc, 0xbbbc, 0xbbbd, + 0xbbbd, 0xbbbe, 0xbbbe, 0xbbbf, 0xbbbf, 0xbbc0, 0xbbc0, 0xbbc1, + 0xbbc1, 0xbbc1, 0xbbc2, 0xbbc2, 0xbbc3, 0xbbc3, 0xbbc4, 0xbbc4, + 0xbbc5, 0xbbc5, 0xbbc6, 0xbbc6, 0xbbc7, 0xbbc7, 0xbbc8, 0xbbc8, + 0xbbc9, 0xbbc9, 0xbbc9, 0xbbca, 0xbbca, 0xbbcb, 0xbbcb, 0xbbcc, + 0xbbcc, 0xbbcd, 0xbbcd, 0xbbce, 0xbbce, 0xbbcf, 0xbbcf, 0xbbd0, + 0xbbd0, 0xbbd1, 0xbbd1, 0xbbd1, 0xbbd2, 0xbbd2, 0xbbd3, 0xbbd3, + 0xbbd4, 0xbbd4, 0xbbd5, 0xbbd5, 0xbbd6, 0xbbd6, 0xbbd7, 0xbbd7, + 0xbbd8, 0xbbd8, 0xbbd8, 0xbbd9, 0xbbd9, 0xbbda, 0xbbda, 0xbbdb, + 0xbbdb, 0xbbdc, 0xbbdc, 0xbbdd, 0xbbdd, 0xbbde, 0xbbde, 0xbbde, + 0xbbdf, 0xbbdf, 0xbbe0, 0xbbe0, 0xbbe1, 0xbbe1, 0xbbe2, 0xbbe2, + 0xbbe3, 0xbbe3, 0xbbe4, 0xbbe4, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe6, + 0xbbe6, 0xbbe7, 0xbbe7, 0xbbe8, 0xbbe8, 0xbbe9, 0xbbe9, 0xbbea, + 0xbbea, 0xbbeb, 0xbbeb, 0xbbeb, 0xbbec, 0xbbec, 0xbbed, 0xbbed, + 0xbbee, 0xbbee, 0xbbef, 0xbbef, 0xbbf0, 0xbbf0, 0xbbf0, 0xbbf1, + 0xbbf1, 0xbbf2, 0xbbf2, 0xbbf3, 0xbbf3, 0xbbf4, 0xbbf4, 0xbbf5, + 0xbbf5, 0xbbf6, 0xbbf6, 0xbbf6, 0xbbf7, 0xbbf7, 0xbbf8, 0xbbf8, + 0xbbf9, 0xbbf9, 0xbbfa, 0xbbfa, 0xbbfb, 0xbbfb, 0xbbfb, 0xbbfc, + 0xbbfc, 0xbbfd, 0xbbfd, 0xbbfe, 0xbbfe, 0xbbff, 0xbbff, 0xbc00, + 0xbc00, 0xbc00, 0xbc01, 0xbc01, 0xbc02, 0xbc02, 0xbc03, 0xbc03, + 0xbc04, 0xbc04, 0xbc05, 0xbc05, 0xbc05, 0xbc06, 0xbc06, 0xbc07, + 0xbc07, 0xbc08, 0xbc08, 0xbc09, 0xbc09, 0xbc09, 0xbc0a, 0xbc0a, + 0xbc0b, 0xbc0b, 0xbc0c, 0xbc0c, 0xbc0d, 0xbc0d, 0xbc0d, 0xbc0e, + 0xbc0e, 0xbc0f, 0xbc0f, 0xbc10, 0xbc10, 0xbc11, 0xbc11, 0xbc11, + 0xbc12, 0xbc12, 0xbc13, 0xbc13, 0xbc14, 0xbc14, 0xbc14, 0xbc15, + 0xbc15, 0xbc16, 0xbc16, 0xbc17, 0xbc17, 0xbc17, 0xbc18, 0xbc18, + 0xbc19, 0xbc19, 0xbc1a, 0xbc1a, 0xbc1b, 0xbc1b, 0xbc1b, 0xbc1c, + 0xbc1c, 0xbc1d, 0xbc1d, 0xbc1d, 0xbc1e, 0xbc1e, 0xbc1f, 0xbc1f, + 0xbc20, 0xbc20, 0xbc20, 0xbc21, 0xbc21, 0xbc22, 0xbc22, 0xbc23, + 0xbc23, 0xbc23, 0xbc24, 0xbc24, 0xbc25, 0xbc25, 0xbc26, 0xbc26, + 0xbc26, 0xbc27, 0xbc27, 0xbc28, 0xbc28, 0xbc28, 0xbc29, 0xbc29, + 0xbc2a, 0xbc2a, 0xbc2b, 0xbc2b, 0xbc2b, 0xbc2c, 0xbc2c, 0xbc2d, + 0xbc2d, 0xbc2d, 0xbc2e, 0xbc2e, 0xbc2f, 0xbc2f, 0xbc2f, 0xbc30, + 0xbc30, 0xbc31, 0xbc31, 0xbc32, 0xbc32, 0xbc32, 0xbc33, 0xbc33, + 0xbc34, 0xbc34, 0xbc34, 0xbc35, 0xbc35, 0xbc36, 0xbc36, 0xbc36, + 0xbc37, 0xbc37, 0xbc38, 0xbc38, 0xbc38, 0xbc39, 0xbc39, 0xbc3a, + 0xbc3a, 0xbc3a, 0xbc3b, 0xbc3b, 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3d, + 0xbc3d, 0xbc3e, 0xbc3e, 0xbc3e, 0xbc3f, 0xbc3f, 0xbc40, 0xbc40, + 0xbc40, 0xbc41, 0xbc41, 0xbc42, 0xbc42, 0xbc42, 0xbc43, 0xbc43, + 0xbc44, 0xbc44, 0xbc44, 0xbc45, 0xbc45, 0xbc46, 0xbc46, 0xbc46, + 0xbc47, 0xbc47, 0xbc47, 0xbc48, 0xbc48, 0xbc49, 0xbc49, 0xbc49, + 0xbc4a, 0xbc4a, 0xbc4b, 0xbc4b, 0xbc4b, 0xbc4c, 0xbc4c, 0xbc4d, + 0xbc4d, 0xbc4d, 0xbc4e, 0xbc4e, 0xbc4e, 0xbc4f, 0xbc4f, 0xbc50, + 0xbc50, 0xbc50, 0xbc51, 0xbc51, 0xbc52, 0xbc52, 0xbc52, 0xbc53, + 0xbc53, 0xbc53, 0xbc54, 0xbc54, 0xbc55, 0xbc55, 0xbc55, 0xbc56, + 0xbc56, 0xbc56, 0xbc57, 0xbc57, 0xbc58, 0xbc58, 0xbc58, 0xbc59, + 0xbc59, 0xbc59, 0xbc5a, 0xbc5a, 0xbc5b, 0xbc5b, 0xbc5b, 0xbc5c, + 0xbc5c, 0xbc5c, 0xbc5d, 0xbc5d, 0xbc5e, 0xbc5e, 0xbc5e, 0xbc5f, + 0xbc5f, 0xbc5f, 0xbc60, 0xbc60, 0xbc61, 0xbc61, 0xbc61, 0xbc62, + 0xbc62, 0xbc62, 0xbc63, 0xbc63, 0xbc63, 0xbc64, 0xbc64, 0xbc65, + 0xbc65, 0xbc65, 0xbc66, 0xbc66, 0xbc66, 0xbc67, 0xbc67, 0xbc67, + 0xbc68, 0xbc68, 0xbc69, 0xbc69, 0xbc69, 0xbc6a, 0xbc6a, 0xbc6a, + 0xbc6b, 0xbc6b, 0xbc6b, 0xbc6c, 0xbc6c, 0xbc6d, 0xbc6d, 0xbc6d, + 0xbc6e, 0xbc6e, 0xbc6e, 0xbc6f, 0xbc6f, 0xbc6f, 0xbc70, 0xbc70, + 0xbc71, 0xbc71, 0xbc71, 0xbc72, 0xbc72, 0xbc72, 0xbc73, 0xbc73, + 0xbc73, 0xbc74, 0xbc74, 0xbc74, 0xbc75, 0xbc75, 0xbc75, 0xbc76, + 0xbc76, 0xbc77, 0xbc77, 0xbc77, 0xbc78, 0xbc78, 0xbc78, 0xbc79, + 0xbc79, 0xbc79, 0xbc7a, 0xbc7a, 0xbc7a, 0xbc7b, 0xbc7b, 0xbc7b, + 0xbc7c, 0xbc7c, 0xbc7c, 0xbc7d, 0xbc7d, 0xbc7e, 0xbc7e, 0xbc7e, + 0xbc7f, 0xbc7f, 0xbc7f, 0xbc80, 0xbc80, 0xbc80, 0xbc81, 0xbc81, + 0xbc81, 0xbc82, 0xbc82, 0xbc82, 0xbc83, 0xbc83, 0xbc83, 0xbc84, + 0xbc84, 0xbc84, 0xbc85, 0xbc85, 0xbc85, 0xbc86, 0xbc86, 0xbc86, + 0xbc87, 0xbc87, 0xbc87, 0xbc88, 0xbc88, 0xbc89, 0xbc89, 0xbc89, + 0xbc8a, 0xbc8a, 0xbc8a, 0xbc8b, 0xbc8b, 0xbc8b, 0xbc8c, 0xbc8c, + 0xbc8c, 0xbc8d, 0xbc8d, 0xbc8d, 0xbc8e, 0xbc8e, 0xbc8e, 0xbc8f, + 0xbc8f, 0xbc8f, 0xbc90, 0xbc90, 0xbc90, 0xbc91, 0xbc91, 0xbc91, + 0xbc92, 0xbc92, 0xbc92, 0xbc93, 0xbc93, 0xbc93, 0xbc94, 0xbc94, + 0xbc94, 0xbc95, 0xbc95, 0xbc95, 0xbc96, 0xbc96, 0xbc96, 0xbc97, + 0xbc97, 0xbc97, 0xbc98, 0xbc98, 0xbc98, 0xbc99, 0xbc99, 0xbc99, + 0xbc99, 0xbc9a, 0xbc9a, 0xbc9a, 0xbc9b, 0xbc9b, 0xbc9b, 0xbc9c, + 0xbc9c, 0xbc9c, 0xbc9d, 0xbc9d, 0xbc9d, 0xbc9e, 0xbc9e, 0xbc9e, + 0xbc9f, 0xbc9f, 0xbc9f, 0xbca0, 0xbca0, 0xbca0, 0xbca1, 0xbca1, + 0xbca1, 0xbca2, 0xbca2, 0xbca2, 0xbca3, 0xbca3, 0xbca3, 0xbca4, + 0xbca4, 0xbca4, 0xbca4, 0xbca5, 0xbca5, 0xbca5, 0xbca6, 0xbca6, + 0xbca6, 0xbca7, 0xbca7, 0xbca7, 0xbca8, 0xbca8, 0xbca8, 0xbca9, + 0xbca9, 0xbca9, 0xbcaa, 0xbcaa, 0xbcaa, 0xbcaa, 0xbcab, 0xbcab, + 0xbcab, 0xbcac, 0xbcac, 0xbcac, 0xbcad, 0xbcad, 0xbcad, 0xbcae, + 0xbcae, 0xbcae, 0xbcaf, 0xbcaf, 0xbcaf, 0xbcb0, 0xbcb0, 0xbcb0, + 0xbcb0, 0xbcb1, 0xbcb1, 0xbcb1, 0xbcb2, 0xbcb2, 0xbcb2, 0xbcb3, + 0xbcb3, 0xbcb3, 0xbcb4, 0xbcb4, 0xbcb4, 0xbcb4, 0xbcb5, 0xbcb5, + 0xbcb5, 0xbcb6, 0xbcb6, 0xbcb6, 0xbcb7, 0xbcb7, 0xbcb7, 0xbcb8, + 0xbcb8, 0xbcb8, 0xbcb8, 0xbcb9, 0xbcb9, 0xbcb9, 0xbcba, 0xbcba, + 0xbcba, 0xbcbb, 0xbcbb, 0xbcbb, 0xbcbc, 0xbcbc, 0xbcbc, 0xbcbc, + 0xbcbd, 0xbcbd, 0xbcbd, 0xbcbe, 0xbcbe, 0xbcbe, 0xbcbf, 0xbcbf, + 0xbcbf, 0xbcbf, 0xbcc0, 0xbcc0, 0xbcc0, 0xbcc1, 0xbcc1, 0xbcc1, + 0xbcc2, 0xbcc2, 0xbcc2, 0xbcc2, 0xbcc3, 0xbcc3, 0xbcc3, 0xbcc4, + 0xbcc4, 0xbcc4, 0xbcc5, 0xbcc5, 0xbcc5, 0xbcc5, 0xbcc6, 0xbcc6, + 0xbcc6, 0xbcc7, 0xbcc7, 0xbcc7, 0xbcc8, 0xbcc8, 0xbcc8, 0xbcc8, + 0xbcc9, 0xbcc9, 0xbcc9, 0xbcca, 0xbcca, 0xbcca, 0xbcca, 0xbccb, + 0xbccb, 0xbccb, 0xbccc, 0xbccc, 0xbccc, 0xbccd, 0xbccd, 0xbccd, + 0xbccd, 0xbcce, 0xbcce, 0xbcce, 0xbccf, 0xbccf, 0xbccf, 0xbccf, + 0xbcd0, 0xbcd0, 0xbcd0, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd2, + 0xbcd2, 0xbcd2, 0xbcd3, 0xbcd3, 0xbcd3, 0xbcd3, 0xbcd4, 0xbcd4, + 0xbcd4, 0xbcd5, 0xbcd5, 0xbcd5, 0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, + 0xbcd7, 0xbcd7, 0xbcd7, 0xbcd8, 0xbcd8, 0xbcd8, 0xbcd8, 0xbcd9, + 0xbcd9, 0xbcd9, 0xbcda, 0xbcda, 0xbcda, 0xbcda, 0xbcdb, 0xbcdb, + 0xbcdb, 0xbcdc, 0xbcdc, 0xbcdc, 0xbcdc, 0xbcdd, 0xbcdd, 0xbcdd, + 0xbcdd, 0xbcde, 0xbcde, 0xbcde, 0xbcdf, 0xbcdf, 0xbcdf, 0xbcdf, + 0xbce0, 0xbce0, 0xbce0, 0xbce1, 0xbce1, 0xbce1, 0xbce1, 0xbce2, + 0xbce2, 0xbce2, 0xbce3, 0xbce3, 0xbce3, 0xbce3, 0xbce4, 0xbce4, + 0xbce4, 0xbce4, 0xbce5, 0xbce5, 0xbce5, 0xbce6, 0xbce6, 0xbce6, + 0xbce6, 0xbce7, 0xbce7, 0xbce7, 0xbce8, 0xbce8, 0xbce8, 0xbce8, + 0xbce9, 0xbce9, 0xbce9, 0xbce9, 0xbcea, 0xbcea, 0xbcea, 0xbceb, + 0xbceb, 0xbceb, 0xbceb, 0xbcec, 0xbcec, 0xbcec, 0xbcec, 0xbced, + 0xbced, 0xbced, 0xbcee, 0xbcee, 0xbcee, 0xbcee, 0xbcef, 0xbcef, + 0xbcef, 0xbcef, 0xbcf0, 0xbcf0, 0xbcf0, 0xbcf1, 0xbcf1, 0xbcf1, + 0xbcf1, 0xbcf2, 0xbcf2, 0xbcf2, 0xbcf2, 0xbcf3, 0xbcf3, 0xbcf3, + 0xbcf4, 0xbcf4, 0xbcf4, 0xbcf4, 0xbcf5, 0xbcf5, 0xbcf5, 0xbcf5, + 0xbcf6, 0xbcf6, 0xbcf6, 0xbcf7, 0xbcf7, 0xbcf7, 0xbcf7, 0xbcf8, + 0xbcf8, 0xbcf8, 0xbcf8, 0xbcf9, 0xbcf9, 0xbcf9, 0xbcf9, 0xbcfa, + 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfb, 0xbcfb, 0xbcfb, 0xbcfc, 0xbcfc, + 0xbcfc, 0xbcfc, 0xbcfd, 0xbcfd, 0xbcfd, 0xbcfd, 0xbcfe, 0xbcfe, + 0xbcfe, 0xbcfe, 0xbcff, 0xbcff, 0xbcff, 0xbd00, 0xbd00, 0xbd00, + 0xbd00, 0xbd01, 0xbd01, 0xbd01, 0xbd01, 0xbd02, 0xbd02, 0xbd02, + 0xbd02, 0xbd03, 0xbd03, 0xbd03, 0xbd03, 0xbd04, 0xbd04, 0xbd04, + 0xbd04, 0xbd05, 0xbd05, 0xbd05, 0xbd06, 0xbd06, 0xbd06, 0xbd06, + 0xbd07, 0xbd07, 0xbd07, 0xbd07, 0xbd08, 0xbd08, 0xbd08, 0xbd08, + 0xbd09, 0xbd09, 0xbd09, 0xbd09, 0xbd0a, 0xbd0a, 0xbd0a, 0xbd0a, + 0xbd0b, 0xbd0b, 0xbd0b, 0xbd0b, 0xbd0c, 0xbd0c, 0xbd0c, 0xbd0c, + 0xbd0d, 0xbd0d, 0xbd0d, 0xbd0d, 0xbd0e, 0xbd0e, 0xbd0e, 0xbd0e, + 0xbd0f, 0xbd0f, 0xbd0f, 0xbd10, 0xbd10, 0xbd10, 0xbd10, 0xbd11, + 0xbd11, 0xbd11, 0xbd11, 0xbd12, 0xbd12, 0xbd12, 0xbd12, 0xbd13, + 0xbd13, 0xbd13, 0xbd13, 0xbd14, 0xbd14, 0xbd14, 0xbd14, 0xbd15, + 0xbd15, 0xbd15, 0xbd15, 0xbd16, 0xbd16, 0xbd16, 0xbd16, 0xbd17, + 0xbd17, 0xbd17, 0xbd17, 0xbd18, 0xbd18, 0xbd18, 0xbd18, 0xbd19, + 0xbd19, 0xbd19, 0xbd19, 0xbd1a, 0xbd1a, 0xbd1a, 0xbd1a, 0xbd1b, + 0xbd1b, 0xbd1b, 0xbd1b, 0xbd1c, 0xbd1c, 0xbd1c, 0xbd1c, 0xbd1d, + 0xbd1d, 0xbd1d, 0xbd1d, 0xbd1e, 0xbd1e, 0xbd1e, 0xbd1e, 0xbd1e, + 0xbd1f, 0xbd1f, 0xbd1f, 0xbd1f, 0xbd20, 0xbd20, 0xbd20, 0xbd20, + 0xbd21, 0xbd21, 0xbd21, 0xbd21, 0xbd22, 0xbd22, 0xbd22, 0xbd22, + 0xbd23, 0xbd23, 0xbd23, 0xbd23, 0xbd24, 0xbd24, 0xbd24, 0xbd24, + 0xbd25, 0xbd25, 0xbd25, 0xbd25, 0xbd26, 0xbd26, 0xbd26, 0xbd26, + 0xbd27, 0xbd27, 0xbd27, 0xbd27, 0xbd27, 0xbd28, 0xbd28, 0xbd28, + 0xbd28, 0xbd29, 0xbd29, 0xbd29, 0xbd29, 0xbd2a, 0xbd2a, 0xbd2a, + 0xbd2a, 0xbd2b, 0xbd2b, 0xbd2b, 0xbd2b, 0xbd2c, 0xbd2c, 0xbd2c, + 0xbd2c, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2d, 0xbd2e, 0xbd2e, + 0xbd2e, 0xbd2e, 0xbd2f, 0xbd2f, 0xbd2f, 0xbd2f, 0xbd30, 0xbd30, + 0xbd30, 0xbd30, 0xbd31, 0xbd31, 0xbd31, 0xbd31, 0xbd31, 0xbd32, + 0xbd32, 0xbd32, 0xbd32, 0xbd33, 0xbd33, 0xbd33, 0xbd33, 0xbd34, + 0xbd34, 0xbd34, 0xbd34, 0xbd35, 0xbd35, 0xbd35, 0xbd35, 0xbd35, + 0xbd36, 0xbd36, 0xbd36, 0xbd36, 0xbd37, 0xbd37, 0xbd37, 0xbd37, + 0xbd38, 0xbd38, 0xbd38, 0xbd38, 0xbd39, 0xbd39, 0xbd39, 0xbd39, + 0xbd39, 0xbd3a, 0xbd3a, 0xbd3a, 0xbd3a, 0xbd3b, 0xbd3b, 0xbd3b, + 0xbd3b, 0xbd3c, 0xbd3c, 0xbd3c, 0xbd3c, 0xbd3c, 0xbd3d, 0xbd3d, + 0xbd3d, 0xbd3d, 0xbd3e, 0xbd3e, 0xbd3e, 0xbd3e, 0xbd3f, 0xbd3f, + 0xbd3f, 0xbd3f, 0xbd3f, 0xbd40, 0xbd40, 0xbd40, 0xbd40, 0xbd41, + 0xbd41, 0xbd41, 0xbd41, 0xbd41, 0xbd42, 0xbd42, 0xbd42, 0xbd42, + 0xbd43, 0xbd43, 0xbd44, 0xbd44, 0xbd44, 0xbd45, 0xbd45, 0xbd46, + 0xbd46, 0xbd47, 0xbd47, 0xbd48, 0xbd48, 0xbd49, 0xbd49, 0xbd49, + 0xbd4a, 0xbd4a, 0xbd4b, 0xbd4b, 0xbd4c, 0xbd4c, 0xbd4d, 0xbd4d, + 0xbd4d, 0xbd4e, 0xbd4e, 0xbd4f, 0xbd4f, 0xbd50, 0xbd50, 0xbd51, + 0xbd51, 0xbd51, 0xbd52, 0xbd52, 0xbd53, 0xbd53, 0xbd54, 0xbd54, + 0xbd54, 0xbd55, 0xbd55, 0xbd56, 0xbd56, 0xbd57, 0xbd57, 0xbd58, + 0xbd58, 0xbd58, 0xbd59, 0xbd59, 0xbd5a, 0xbd5a, 0xbd5b, 0xbd5b, + 0xbd5b, 0xbd5c, 0xbd5c, 0xbd5d, 0xbd5d, 0xbd5e, 0xbd5e, 0xbd5e, + 0xbd5f, 0xbd5f, 0xbd60, 0xbd60, 0xbd61, 0xbd61, 0xbd61, 0xbd62, + 0xbd62, 0xbd63, 0xbd63, 0xbd64, 0xbd64, 0xbd64, 0xbd65, 0xbd65, + 0xbd66, 0xbd66, 0xbd66, 0xbd67, 0xbd67, 0xbd68, 0xbd68, 0xbd69, + 0xbd69, 0xbd69, 0xbd6a, 0xbd6a, 0xbd6b, 0xbd6b, 0xbd6c, 0xbd6c, + 0xbd6c, 0xbd6d, 0xbd6d, 0xbd6e, 0xbd6e, 0xbd6e, 0xbd6f, 0xbd6f, + 0xbd70, 0xbd70, 0xbd70, 0xbd71, 0xbd71, 0xbd72, 0xbd72, 0xbd73, + 0xbd73, 0xbd73, 0xbd74, 0xbd74, 0xbd75, 0xbd75, 0xbd75, 0xbd76, + 0xbd76, 0xbd77, 0xbd77, 0xbd77, 0xbd78, 0xbd78, 0xbd79, 0xbd79, + 0xbd79, 0xbd7a, 0xbd7a, 0xbd7b, 0xbd7b, 0xbd7b, 0xbd7c, 0xbd7c, + 0xbd7d, 0xbd7d, 0xbd7d, 0xbd7e, 0xbd7e, 0xbd7f, 0xbd7f, 0xbd7f, + 0xbd80, 0xbd80, 0xbd81, 0xbd81, 0xbd81, 0xbd82, 0xbd82, 0xbd83, + 0xbd83, 0xbd83, 0xbd84, 0xbd84, 0xbd85, 0xbd85, 0xbd85, 0xbd86, + 0xbd86, 0xbd87, 0xbd87, 0xbd87, 0xbd88, 0xbd88, 0xbd89, 0xbd89, + 0xbd89, 0xbd8a, 0xbd8a, 0xbd8b, 0xbd8b, 0xbd8b, 0xbd8c, 0xbd8c, + 0xbd8c, 0xbd8d, 0xbd8d, 0xbd8e, 0xbd8e, 0xbd8e, 0xbd8f, 0xbd8f, + 0xbd90, 0xbd90, 0xbd90, 0xbd91, 0xbd91, 0xbd91, 0xbd92, 0xbd92, + 0xbd93, 0xbd93, 0xbd93, 0xbd94, 0xbd94, 0xbd95, 0xbd95, 0xbd95, + 0xbd96, 0xbd96, 0xbd96, 0xbd97, 0xbd97, 0xbd98, 0xbd98, 0xbd98, + 0xbd99, 0xbd99, 0xbd99, 0xbd9a, 0xbd9a, 0xbd9b, 0xbd9b, 0xbd9b, + 0xbd9c, 0xbd9c, 0xbd9c, 0xbd9d, 0xbd9d, 0xbd9e, 0xbd9e, 0xbd9e, + 0xbd9f, 0xbd9f, 0xbd9f, 0xbda0, 0xbda0, 0xbda1, 0xbda1, 0xbda1, + 0xbda2, 0xbda2, 0xbda2, 0xbda3, 0xbda3, 0xbda4, 0xbda4, 0xbda4, + 0xbda5, 0xbda5, 0xbda5, 0xbda6, 0xbda6, 0xbda6, 0xbda7, 0xbda7, + 0xbda8, 0xbda8, 0xbda8, 0xbda9, 0xbda9, 0xbda9, 0xbdaa, 0xbdaa, + 0xbdaa, 0xbdab, 0xbdab, 0xbdac, 0xbdac, 0xbdac, 0xbdad, 0xbdad, + 0xbdad, 0xbdae, 0xbdae, 0xbdae, 0xbdaf, 0xbdaf, 0xbdb0, 0xbdb0, + 0xbdb0, 0xbdb1, 0xbdb1, 0xbdb1, 0xbdb2, 0xbdb2, 0xbdb2, 0xbdb3, + 0xbdb3, 0xbdb3, 0xbdb4, 0xbdb4, 0xbdb5, 0xbdb5, 0xbdb5, 0xbdb6, + 0xbdb6, 0xbdb6, 0xbdb7, 0xbdb7, 0xbdb7, 0xbdb8, 0xbdb8, 0xbdb8, + 0xbdb9, 0xbdb9, 0xbdba, 0xbdba, 0xbdba, 0xbdbb, 0xbdbb, 0xbdbb, + 0xbdbc, 0xbdbc, 0xbdbc, 0xbdbd, 0xbdbd, 0xbdbd, 0xbdbe, 0xbdbe, + 0xbdbe, 0xbdbf, 0xbdbf, 0xbdbf, 0xbdc0, 0xbdc0, 0xbdc1, 0xbdc1, + 0xbdc1, 0xbdc2, 0xbdc2, 0xbdc2, 0xbdc3, 0xbdc3, 0xbdc3, 0xbdc4, + 0xbdc4, 0xbdc4, 0xbdc5, 0xbdc5, 0xbdc5, 0xbdc6, 0xbdc6, 0xbdc6, + 0xbdc7, 0xbdc7, 0xbdc7, 0xbdc8, 0xbdc8, 0xbdc8, 0xbdc9, 0xbdc9, + 0xbdc9, 0xbdca, 0xbdca, 0xbdca, 0xbdcb, 0xbdcb, 0xbdcb, 0xbdcc, + 0xbdcc, 0xbdcc, 0xbdcd, 0xbdcd, 0xbdce, 0xbdce, 0xbdce, 0xbdcf, + 0xbdcf, 0xbdcf, 0xbdd0, 0xbdd0, 0xbdd0, 0xbdd1, 0xbdd1, 0xbdd1, + 0xbdd2, 0xbdd2, 0xbdd2, 0xbdd3, 0xbdd3, 0xbdd3, 0xbdd4, 0xbdd4, + 0xbdd4, 0xbdd5, 0xbdd5, 0xbdd5, 0xbdd6, 0xbdd6, 0xbdd6, 0xbdd7, + 0xbdd7, 0xbdd7, 0xbdd8, 0xbdd8, 0xbdd8, 0xbdd9, 0xbdd9, 0xbdd9, + 0xbdd9, 0xbdda, 0xbdda, 0xbdda, 0xbddb, 0xbddb, 0xbddb, 0xbddc, + 0xbddc, 0xbddc, 0xbddd, 0xbddd, 0xbddd, 0xbdde, 0xbdde, 0xbdde, + 0xbddf, 0xbddf, 0xbddf, 0xbde0, 0xbde0, 0xbde0, 0xbde1, 0xbde1, + 0xbde1, 0xbde2, 0xbde2, 0xbde2, 0xbde3, 0xbde3, 0xbde3, 0xbde4, + 0xbde4, 0xbde4, 0xbde5, 0xbde5, 0xbde5, 0xbde5, 0xbde6, 0xbde6, + 0xbde6, 0xbde7, 0xbde7, 0xbde7, 0xbde8, 0xbde8, 0xbde8, 0xbde9, + 0xbde9, 0xbde9, 0xbdea, 0xbdea, 0xbdea, 0xbdeb, 0xbdeb, 0xbdeb, + 0xbdec, 0xbdec, 0xbdec, 0xbdec, 0xbded, 0xbded, 0xbded, 0xbdee, + 0xbdee, 0xbdee, 0xbdef, 0xbdef, 0xbdef, 0xbdf0, 0xbdf0, 0xbdf0, + 0xbdf1, 0xbdf1, 0xbdf1, 0xbdf2, 0xbdf2, 0xbdf2, 0xbdf2, 0xbdf3, + 0xbdf3, 0xbdf3, 0xbdf4, 0xbdf4, 0xbdf4, 0xbdf5, 0xbdf5, 0xbdf5, + 0xbdf6, 0xbdf6, 0xbdf6, 0xbdf6, 0xbdf7, 0xbdf7, 0xbdf7, 0xbdf8, + 0xbdf8, 0xbdf8, 0xbdf9, 0xbdf9, 0xbdf9, 0xbdfa, 0xbdfa, 0xbdfa, + 0xbdfa, 0xbdfb, 0xbdfb, 0xbdfb, 0xbdfc, 0xbdfc, 0xbdfc, 0xbdfd, + 0xbdfd, 0xbdfd, 0xbdfe, 0xbdfe, 0xbdfe, 0xbdfe, 0xbdff, 0xbdff, + 0xbdff, 0xbe00, 0xbe00, 0xbe00, 0xbe01, 0xbe01, 0xbe01, 0xbe01, + 0xbe02, 0xbe02, 0xbe02, 0xbe03, 0xbe03, 0xbe03, 0xbe04, 0xbe04, + 0xbe04, 0xbe04, 0xbe05, 0xbe05, 0xbe05, 0xbe06, 0xbe06, 0xbe06, + 0xbe07, 0xbe07, 0xbe07, 0xbe07, 0xbe08, 0xbe08, 0xbe08, 0xbe09, + 0xbe09, 0xbe09, 0xbe0a, 0xbe0a, 0xbe0a, 0xbe0a, 0xbe0b, 0xbe0b, + 0xbe0b, 0xbe0c, 0xbe0c, 0xbe0c, 0xbe0c, 0xbe0d, 0xbe0d, 0xbe0d, + 0xbe0e, 0xbe0e, 0xbe0e, 0xbe0f, 0xbe0f, 0xbe0f, 0xbe0f, 0xbe10, + 0xbe10, 0xbe10, 0xbe11, 0xbe11, 0xbe11, 0xbe11, 0xbe12, 0xbe12, + 0xbe12, 0xbe13, 0xbe13, 0xbe13, 0xbe14, 0xbe14, 0xbe14, 0xbe14, + 0xbe15, 0xbe15, 0xbe15, 0xbe16, 0xbe16, 0xbe16, 0xbe16, 0xbe17, + 0xbe17, 0xbe17, 0xbe18, 0xbe18, 0xbe18, 0xbe18, 0xbe19, 0xbe19, + 0xbe19, 0xbe1a, 0xbe1a, 0xbe1a, 0xbe1a, 0xbe1b, 0xbe1b, 0xbe1b, + 0xbe1c, 0xbe1c, 0xbe1c, 0xbe1c, 0xbe1d, 0xbe1d, 0xbe1d, 0xbe1e, + 0xbe1e, 0xbe1e, 0xbe1e, 0xbe1f, 0xbe1f, 0xbe1f, 0xbe20, 0xbe20, + 0xbe20, 0xbe20, 0xbe21, 0xbe21, 0xbe21, 0xbe22, 0xbe22, 0xbe22, + 0xbe22, 0xbe23, 0xbe23, 0xbe23, 0xbe23, 0xbe24, 0xbe24, 0xbe24, + 0xbe25, 0xbe25, 0xbe25, 0xbe25, 0xbe26, 0xbe26, 0xbe26, 0xbe27, + 0xbe27, 0xbe27, 0xbe27, 0xbe28, 0xbe28, 0xbe28, 0xbe29, 0xbe29, + 0xbe29, 0xbe29, 0xbe2a, 0xbe2a, 0xbe2a, 0xbe2a, 0xbe2b, 0xbe2b, + 0xbe2b, 0xbe2c, 0xbe2c, 0xbe2c, 0xbe2c, 0xbe2d, 0xbe2d, 0xbe2d, + 0xbe2d, 0xbe2e, 0xbe2e, 0xbe2e, 0xbe2f, 0xbe2f, 0xbe2f, 0xbe2f, + 0xbe30, 0xbe30, 0xbe30, 0xbe30, 0xbe31, 0xbe31, 0xbe31, 0xbe32, + 0xbe32, 0xbe32, 0xbe32, 0xbe33, 0xbe33, 0xbe33, 0xbe33, 0xbe34, + 0xbe34, 0xbe34, 0xbe35, 0xbe35, 0xbe35, 0xbe35, 0xbe36, 0xbe36, + 0xbe36, 0xbe36, 0xbe37, 0xbe37, 0xbe37, 0xbe38, 0xbe38, 0xbe38, + 0xbe38, 0xbe39, 0xbe39, 0xbe39, 0xbe39, 0xbe3a, 0xbe3a, 0xbe3a, + 0xbe3a, 0xbe3b, 0xbe3b, 0xbe3b, 0xbe3c, 0xbe3c, 0xbe3c, 0xbe3c, + 0xbe3d, 0xbe3d, 0xbe3d, 0xbe3d, 0xbe3e, 0xbe3e, 0xbe3e, 0xbe3e, + 0xbe3f, 0xbe3f, 0xbe3f, 0xbe40, 0xbe40, 0xbe40, 0xbe40, 0xbe41, + 0xbe41, 0xbe41, 0xbe41, 0xbe42, 0xbe42, 0xbe42, 0xbe42, 0xbe43, + 0xbe43, 0xbe43, 0xbe43, 0xbe44, 0xbe44, 0xbe44, 0xbe44, 0xbe45, + 0xbe45, 0xbe45, 0xbe46, 0xbe46, 0xbe46, 0xbe46, 0xbe47, 0xbe47, + 0xbe47, 0xbe47, 0xbe48, 0xbe48, 0xbe48, 0xbe48, 0xbe49, 0xbe49, + 0xbe49, 0xbe49, 0xbe4a, 0xbe4a, 0xbe4a, 0xbe4a, 0xbe4b, 0xbe4b, + 0xbe4b, 0xbe4b, 0xbe4c, 0xbe4c, 0xbe4c, 0xbe4d, 0xbe4d, 0xbe4d, + 0xbe4d, 0xbe4e, 0xbe4e, 0xbe4e, 0xbe4e, 0xbe4f, 0xbe4f, 0xbe4f, + 0xbe4f, 0xbe50, 0xbe50, 0xbe50, 0xbe50, 0xbe51, 0xbe51, 0xbe51, + 0xbe51, 0xbe52, 0xbe52, 0xbe52, 0xbe52, 0xbe53, 0xbe53, 0xbe53, + 0xbe53, 0xbe54, 0xbe54, 0xbe54, 0xbe54, 0xbe55, 0xbe55, 0xbe55, + 0xbe55, 0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe57, 0xbe57, 0xbe57, + 0xbe57, 0xbe58, 0xbe58, 0xbe58, 0xbe58, 0xbe59, 0xbe59, 0xbe59, + 0xbe59, 0xbe5a, 0xbe5a, 0xbe5a, 0xbe5a, 0xbe5b, 0xbe5b, 0xbe5b, + 0xbe5b, 0xbe5c, 0xbe5c, 0xbe5c, 0xbe5c, 0xbe5d, 0xbe5d, 0xbe5d, + 0xbe5d, 0xbe5e, 0xbe5e, 0xbe5e, 0xbe5e, 0xbe5f, 0xbe5f, 0xbe5f, + 0xbe5f, 0xbe60, 0xbe60, 0xbe60, 0xbe60, 0xbe61, 0xbe61, 0xbe61, + 0xbe61, 0xbe62, 0xbe62, 0xbe62, 0xbe62, 0xbe63, 0xbe63, 0xbe63, + 0xbe63, 0xbe64, 0xbe64, 0xbe64, 0xbe64, 0xbe65, 0xbe65, 0xbe65, + 0xbe65, 0xbe66, 0xbe66, 0xbe66, 0xbe66, 0xbe66, 0xbe67, 0xbe67, + 0xbe67, 0xbe67, 0xbe68, 0xbe68, 0xbe68, 0xbe68, 0xbe69, 0xbe69, + 0xbe69, 0xbe69, 0xbe6a, 0xbe6a, 0xbe6a, 0xbe6a, 0xbe6b, 0xbe6b, + 0xbe6b, 0xbe6b, 0xbe6c, 0xbe6c, 0xbe6c, 0xbe6c, 0xbe6d, 0xbe6d, + 0xbe6d, 0xbe6d, 0xbe6d, 0xbe6e, 0xbe6e, 0xbe6e, 0xbe6e, 0xbe6f, + 0xbe6f, 0xbe6f, 0xbe6f, 0xbe70, 0xbe70, 0xbe70, 0xbe70, 0xbe71, + 0xbe71, 0xbe71, 0xbe71, 0xbe72, 0xbe72, 0xbe72, 0xbe72, 0xbe72, + 0xbe73, 0xbe73, 0xbe73, 0xbe73, 0xbe74, 0xbe74, 0xbe74, 0xbe74, + 0xbe75, 0xbe75, 0xbe75, 0xbe75, 0xbe76, 0xbe76, 0xbe76, 0xbe76, + 0xbe76, 0xbe77, 0xbe77, 0xbe77, 0xbe77, 0xbe78, 0xbe78, 0xbe78, + 0xbe78, 0xbe79, 0xbe79, 0xbe79, 0xbe79, 0xbe7a, 0xbe7a, 0xbe7a, + 0xbe7a, 0xbe7a, 0xbe7b, 0xbe7b, 0xbe7b, 0xbe7b, 0xbe7c, 0xbe7c, + 0xbe7c, 0xbe7c, 0xbe7d, 0xbe7d, 0xbe7d, 0xbe7d, 0xbe7d, 0xbe7e, + 0xbe7e, 0xbe7e, 0xbe7e, 0xbe7f, 0xbe7f, 0xbe7f, 0xbe7f, 0xbe80, + 0xbe80, 0xbe80, 0xbe80, 0xbe80, 0xbe81, 0xbe81, 0xbe81, 0xbe81, + 0xbe82, 0xbe82, 0xbe82, 0xbe82, 0xbe83, 0xbe83, 0xbe83, 0xbe83, + 0xbe83, 0xbe84, 0xbe84, 0xbe84, 0xbe84, 0xbe85, 0xbe85, 0xbe85, + 0xbe85, 0xbe86, 0xbe86, 0xbe87, 0xbe87, 0xbe88, 0xbe88, 0xbe88, + 0xbe89, 0xbe89, 0xbe8a, 0xbe8a, 0xbe8b, 0xbe8b, 0xbe8c, 0xbe8c, + 0xbe8c, 0xbe8d, 0xbe8d, 0xbe8e, 0xbe8e, 0xbe8f, 0xbe8f, 0xbe90, + 0xbe90, 0xbe90, 0xbe91, 0xbe91, 0xbe92, 0xbe92, 0xbe93, 0xbe93, + 0xbe94, 0xbe94, 0xbe94, 0xbe95, 0xbe95, 0xbe96, 0xbe96, 0xbe97, + 0xbe97, 0xbe98, 0xbe98, 0xbe98, 0xbe99, 0xbe99, 0xbe9a, 0xbe9a, + 0xbe9b, 0xbe9b, 0xbe9b, 0xbe9c, 0xbe9c, 0xbe9d, 0xbe9d, 0xbe9e, + 0xbe9e, 0xbe9e, 0xbe9f, 0xbe9f, 0xbea0, 0xbea0, 0xbea1, 0xbea1, + 0xbea1, 0xbea2, 0xbea2, 0xbea3, 0xbea3, 0xbea4, 0xbea4, 0xbea4, + 0xbea5, 0xbea5, 0xbea6, 0xbea6, 0xbea7, 0xbea7, 0xbea7, 0xbea8, + 0xbea8, 0xbea9, 0xbea9, 0xbeaa, 0xbeaa, 0xbeaa, 0xbeab, 0xbeab, + 0xbeac, 0xbeac, 0xbeac, 0xbead, 0xbead, 0xbeae, 0xbeae, 0xbeaf, + 0xbeaf, 0xbeaf, 0xbeb0, 0xbeb0, 0xbeb1, 0xbeb1, 0xbeb1, 0xbeb2, + 0xbeb2, 0xbeb3, 0xbeb3, 0xbeb4, 0xbeb4, 0xbeb4, 0xbeb5, 0xbeb5, + 0xbeb6, 0xbeb6, 0xbeb6, 0xbeb7, 0xbeb7, 0xbeb8, 0xbeb8, 0xbeb8, + 0xbeb9, 0xbeb9, 0xbeba, 0xbeba, 0xbeba, 0xbebb, 0xbebb, 0xbebc, + 0xbebc, 0xbebc, 0xbebd, 0xbebd, 0xbebe, 0xbebe, 0xbebe, 0xbebf, + 0xbebf, 0xbec0, 0xbec0, 0xbec1, 0xbec1, 0xbec1, 0xbec2, 0xbec2, + 0xbec2, 0xbec3, 0xbec3, 0xbec4, 0xbec4, 0xbec4, 0xbec5, 0xbec5, + 0xbec6, 0xbec6, 0xbec6, 0xbec7, 0xbec7, 0xbec8, 0xbec8, 0xbec8, + 0xbec9, 0xbec9, 0xbeca, 0xbeca, 0xbeca, 0xbecb, 0xbecb, 0xbecc, + 0xbecc, 0xbecc, 0xbecd, 0xbecd, 0xbece, 0xbece, 0xbece, 0xbecf, + 0xbecf, 0xbecf, 0xbed0, 0xbed0, 0xbed1, 0xbed1, 0xbed1, 0xbed2, + 0xbed2, 0xbed3, 0xbed3, 0xbed3, 0xbed4, 0xbed4, 0xbed4, 0xbed5, + 0xbed5, 0xbed6, 0xbed6, 0xbed6, 0xbed7, 0xbed7, 0xbed8, 0xbed8, + 0xbed8, 0xbed9, 0xbed9, 0xbed9, 0xbeda, 0xbeda, 0xbedb, 0xbedb, + 0xbedb, 0xbedc, 0xbedc, 0xbedc, 0xbedd, 0xbedd, 0xbede, 0xbede, + 0xbede, 0xbedf, 0xbedf, 0xbedf, 0xbee0, 0xbee0, 0xbee1, 0xbee1, + 0xbee1, 0xbee2, 0xbee2, 0xbee2, 0xbee3, 0xbee3, 0xbee4, 0xbee4, + 0xbee4, 0xbee5, 0xbee5, 0xbee5, 0xbee6, 0xbee6, 0xbee7, 0xbee7, + 0xbee7, 0xbee8, 0xbee8, 0xbee8, 0xbee9, 0xbee9, 0xbee9, 0xbeea, + 0xbeea, 0xbeeb, 0xbeeb, 0xbeeb, 0xbeec, 0xbeec, 0xbeec, 0xbeed, + 0xbeed, 0xbeed, 0xbeee, 0xbeee, 0xbeef, 0xbeef, 0xbeef, 0xbef0, + 0xbef0, 0xbef0, 0xbef1, 0xbef1, 0xbef1, 0xbef2, 0xbef2, 0xbef3, + 0xbef3, 0xbef3, 0xbef4, 0xbef4, 0xbef4, 0xbef5, 0xbef5, 0xbef5, + 0xbef6, 0xbef6, 0xbef6, 0xbef7, 0xbef7, 0xbef8, 0xbef8, 0xbef8, + 0xbef9, 0xbef9, 0xbef9, 0xbefa, 0xbefa, 0xbefa, 0xbefb, 0xbefb, + 0xbefb, 0xbefc, 0xbefc, 0xbefc, 0xbefd, 0xbefd, 0xbefe, 0xbefe, + 0xbefe, 0xbeff, 0xbeff, 0xbeff, 0xbf00, 0xbf00, 0xbf00, 0xbf01, + 0xbf01, 0xbf01, 0xbf02, 0xbf02, 0xbf02, 0xbf03, 0xbf03, 0xbf03, + 0xbf04, 0xbf04, 0xbf05, 0xbf05, 0xbf05, 0xbf06, 0xbf06, 0xbf06, + 0xbf07, 0xbf07, 0xbf07, 0xbf08, 0xbf08, 0xbf08, 0xbf09, 0xbf09, + 0xbf09, 0xbf0a, 0xbf0a, 0xbf0a, 0xbf0b, 0xbf0b, 0xbf0b, 0xbf0c, + 0xbf0c, 0xbf0c, 0xbf0d, 0xbf0d, 0xbf0d, 0xbf0e, 0xbf0e, 0xbf0e, + 0xbf0f, 0xbf0f, 0xbf0f, 0xbf10, 0xbf10, 0xbf10, 0xbf11, 0xbf11, + 0xbf11, 0xbf12, 0xbf12, 0xbf12, 0xbf13, 0xbf13, 0xbf13, 0xbf14, + 0xbf14, 0xbf14, 0xbf15, 0xbf15, 0xbf15, 0xbf16, 0xbf16, 0xbf16, + 0xbf17, 0xbf17, 0xbf17, 0xbf18, 0xbf18, 0xbf18, 0xbf19, 0xbf19, + 0xbf19, 0xbf1a, 0xbf1a, 0xbf1a, 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1c, + 0xbf1c, 0xbf1c, 0xbf1d, 0xbf1d, 0xbf1d, 0xbf1e, 0xbf1e, 0xbf1e, + 0xbf1f, 0xbf1f, 0xbf1f, 0xbf20, 0xbf20, 0xbf20, 0xbf21, 0xbf21, + 0xbf21, 0xbf22, 0xbf22, 0xbf22, 0xbf23, 0xbf23, 0xbf23, 0xbf24, + 0xbf24, 0xbf24, 0xbf25, 0xbf25, 0xbf25, 0xbf26, 0xbf26, 0xbf26, + 0xbf27, 0xbf27, 0xbf27, 0xbf27, 0xbf28, 0xbf28, 0xbf28, 0xbf29, + 0xbf29, 0xbf29, 0xbf2a, 0xbf2a, 0xbf2a, 0xbf2b, 0xbf2b, 0xbf2b, + 0xbf2c, 0xbf2c, 0xbf2c, 0xbf2d, 0xbf2d, 0xbf2d, 0xbf2e, 0xbf2e, + 0xbf2e, 0xbf2e, 0xbf2f, 0xbf2f, 0xbf2f, 0xbf30, 0xbf30, 0xbf30, + 0xbf31, 0xbf31, 0xbf31, 0xbf32, 0xbf32, 0xbf32, 0xbf33, 0xbf33, + 0xbf33, 0xbf34, 0xbf34, 0xbf34, 0xbf34, 0xbf35, 0xbf35, 0xbf35, + 0xbf36, 0xbf36, 0xbf36, 0xbf37, 0xbf37, 0xbf37, 0xbf38, 0xbf38, + 0xbf38, 0xbf38, 0xbf39, 0xbf39, 0xbf39, 0xbf3a, 0xbf3a, 0xbf3a, + 0xbf3b, 0xbf3b, 0xbf3b, 0xbf3c, 0xbf3c, 0xbf3c, 0xbf3c, 0xbf3d, + 0xbf3d, 0xbf3d, 0xbf3e, 0xbf3e, 0xbf3e, 0xbf3f, 0xbf3f, 0xbf3f, + 0xbf40, 0xbf40, 0xbf40, 0xbf40, 0xbf41, 0xbf41, 0xbf41, 0xbf42, + 0xbf42, 0xbf42, 0xbf43, 0xbf43, 0xbf43, 0xbf43, 0xbf44, 0xbf44, + 0xbf44, 0xbf45, 0xbf45, 0xbf45, 0xbf46, 0xbf46, 0xbf46, 0xbf47, + 0xbf47, 0xbf47, 0xbf47, 0xbf48, 0xbf48, 0xbf48, 0xbf49, 0xbf49, + 0xbf49, 0xbf49, 0xbf4a, 0xbf4a, 0xbf4a, 0xbf4b, 0xbf4b, 0xbf4b, + 0xbf4c, 0xbf4c, 0xbf4c, 0xbf4c, 0xbf4d, 0xbf4d, 0xbf4d, 0xbf4e, + 0xbf4e, 0xbf4e, 0xbf4f, 0xbf4f, 0xbf4f, 0xbf4f, 0xbf50, 0xbf50, + 0xbf50, 0xbf51, 0xbf51, 0xbf51, 0xbf51, 0xbf52, 0xbf52, 0xbf52, + 0xbf53, 0xbf53, 0xbf53, 0xbf54, 0xbf54, 0xbf54, 0xbf54, 0xbf55, + 0xbf55, 0xbf55, 0xbf56, 0xbf56, 0xbf56, 0xbf56, 0xbf57, 0xbf57, + 0xbf57, 0xbf58, 0xbf58, 0xbf58, 0xbf58, 0xbf59, 0xbf59, 0xbf59, + 0xbf5a, 0xbf5a, 0xbf5a, 0xbf5a, 0xbf5b, 0xbf5b, 0xbf5b, 0xbf5c, + 0xbf5c, 0xbf5c, 0xbf5c, 0xbf5d, 0xbf5d, 0xbf5d, 0xbf5e, 0xbf5e, + 0xbf5e, 0xbf5e, 0xbf5f, 0xbf5f, 0xbf5f, 0xbf60, 0xbf60, 0xbf60, + 0xbf60, 0xbf61, 0xbf61, 0xbf61, 0xbf62, 0xbf62, 0xbf62, 0xbf62, + 0xbf63, 0xbf63, 0xbf63, 0xbf64, 0xbf64, 0xbf64, 0xbf64, 0xbf65, + 0xbf65, 0xbf65, 0xbf66, 0xbf66, 0xbf66, 0xbf66, 0xbf67, 0xbf67, + 0xbf67, 0xbf68, 0xbf68, 0xbf68, 0xbf68, 0xbf69, 0xbf69, 0xbf69, + 0xbf69, 0xbf6a, 0xbf6a, 0xbf6a, 0xbf6b, 0xbf6b, 0xbf6b, 0xbf6b, + 0xbf6c, 0xbf6c, 0xbf6c, 0xbf6d, 0xbf6d, 0xbf6d, 0xbf6d, 0xbf6e, + 0xbf6e, 0xbf6e, 0xbf6e, 0xbf6f, 0xbf6f, 0xbf6f, 0xbf70, 0xbf70, + 0xbf70, 0xbf70, 0xbf71, 0xbf71, 0xbf71, 0xbf71, 0xbf72, 0xbf72, + 0xbf72, 0xbf73, 0xbf73, 0xbf73, 0xbf73, 0xbf74, 0xbf74, 0xbf74, + 0xbf74, 0xbf75, 0xbf75, 0xbf75, 0xbf76, 0xbf76, 0xbf76, 0xbf76, + 0xbf77, 0xbf77, 0xbf77, 0xbf77, 0xbf78, 0xbf78, 0xbf78, 0xbf79, + 0xbf79, 0xbf79, 0xbf79, 0xbf7a, 0xbf7a, 0xbf7a, 0xbf7a, 0xbf7b, + 0xbf7b, 0xbf7b, 0xbf7b, 0xbf7c, 0xbf7c, 0xbf7c, 0xbf7d, 0xbf7d, + 0xbf7d, 0xbf7d, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7f, 0xbf7f, + 0xbf7f, 0xbf7f, 0xbf80, 0xbf80, 0xbf80, 0xbf81, 0xbf81, 0xbf81, + 0xbf81, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf83, 0xbf83, 0xbf83, + 0xbf83, 0xbf84, 0xbf84, 0xbf84, 0xbf85, 0xbf85, 0xbf85, 0xbf85, + 0xbf86, 0xbf86, 0xbf86, 0xbf86, 0xbf87, 0xbf87, 0xbf87, 0xbf87, + 0xbf88, 0xbf88, 0xbf88, 0xbf88, 0xbf89, 0xbf89, 0xbf89, 0xbf89, + 0xbf8a, 0xbf8a, 0xbf8a, 0xbf8b, 0xbf8b, 0xbf8b, 0xbf8b, 0xbf8c, + 0xbf8c, 0xbf8c, 0xbf8c, 0xbf8d, 0xbf8d, 0xbf8d, 0xbf8d, 0xbf8e, + 0xbf8e, 0xbf8e, 0xbf8e, 0xbf8f, 0xbf8f, 0xbf8f, 0xbf8f, 0xbf90, + 0xbf90, 0xbf90, 0xbf90, 0xbf91, 0xbf91, 0xbf91, 0xbf91, 0xbf92, + 0xbf92, 0xbf92, 0xbf92, 0xbf93, 0xbf93, 0xbf93, 0xbf93, 0xbf94, + 0xbf94, 0xbf94, 0xbf95, 0xbf95, 0xbf95, 0xbf95, 0xbf96, 0xbf96, + 0xbf96, 0xbf96, 0xbf97, 0xbf97, 0xbf97, 0xbf97, 0xbf98, 0xbf98, + 0xbf98, 0xbf98, 0xbf99, 0xbf99, 0xbf99, 0xbf99, 0xbf9a, 0xbf9a, + 0xbf9a, 0xbf9a, 0xbf9b, 0xbf9b, 0xbf9b, 0xbf9b, 0xbf9c, 0xbf9c, + 0xbf9c, 0xbf9c, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9e, 0xbf9e, + 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9f, 0xbf9f, 0xbf9f, 0xbfa0, 0xbfa0, + 0xbfa0, 0xbfa0, 0xbfa1, 0xbfa1, 0xbfa1, 0xbfa1, 0xbfa2, 0xbfa2, + 0xbfa2, 0xbfa2, 0xbfa3, 0xbfa3, 0xbfa3, 0xbfa3, 0xbfa3, 0xbfa4, + 0xbfa4, 0xbfa4, 0xbfa4, 0xbfa5, 0xbfa5, 0xbfa5, 0xbfa5, 0xbfa6, + 0xbfa6, 0xbfa6, 0xbfa6, 0xbfa7, 0xbfa7, 0xbfa7, 0xbfa7, 0xbfa8, + 0xbfa8, 0xbfa8, 0xbfa8, 0xbfa9, 0xbfa9, 0xbfa9, 0xbfa9, 0xbfaa, + 0xbfaa, 0xbfaa, 0xbfaa, 0xbfab, 0xbfab, 0xbfab, 0xbfab, 0xbfac, + 0xbfac, 0xbfac, 0xbfac, 0xbfad, 0xbfad, 0xbfad, 0xbfad, 0xbfad, + 0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfaf, 0xbfaf, 0xbfaf, 0xbfaf, + 0xbfb0, 0xbfb0, 0xbfb0, 0xbfb0, 0xbfb1, 0xbfb1, 0xbfb1, 0xbfb1, + 0xbfb2, 0xbfb2, 0xbfb2, 0xbfb2, 0xbfb2, 0xbfb3, 0xbfb3, 0xbfb3, + 0xbfb3, 0xbfb4, 0xbfb4, 0xbfb4, 0xbfb4, 0xbfb5, 0xbfb5, 0xbfb5, + 0xbfb5, 0xbfb6, 0xbfb6, 0xbfb6, 0xbfb6, 0xbfb7, 0xbfb7, 0xbfb7, + 0xbfb7, 0xbfb7, 0xbfb8, 0xbfb8, 0xbfb8, 0xbfb8, 0xbfb9, 0xbfb9, + 0xbfb9, 0xbfb9, 0xbfba, 0xbfba, 0xbfba, 0xbfba, 0xbfbb, 0xbfbb, + 0xbfbb, 0xbfbb, 0xbfbb, 0xbfbc, 0xbfbc, 0xbfbc, 0xbfbc, 0xbfbd, + 0xbfbd, 0xbfbd, 0xbfbd, 0xbfbe, 0xbfbe, 0xbfbe, 0xbfbe, 0xbfbe, + 0xbfbf, 0xbfbf, 0xbfbf, 0xbfbf, 0xbfc0, 0xbfc0, 0xbfc0, 0xbfc0, + 0xbfc1, 0xbfc1, 0xbfc1, 0xbfc1, 0xbfc1, 0xbfc2, 0xbfc2, 0xbfc2, + 0xbfc2, 0xbfc3, 0xbfc3, 0xbfc3, 0xbfc3, 0xbfc4, 0xbfc4, 0xbfc4, + 0xbfc4, 0xbfc4, 0xbfc5, 0xbfc5, 0xbfc5, 0xbfc5, 0xbfc6, 0xbfc6, + 0xbfc6, 0xbfc6, 0xbfc7, 0xbfc7, 0xbfc7, 0xbfc7, 0xbfc7, 0xbfc8, + 0xbfc8, 0xbfc8, 0xbfc9, 0xbfc9, 0xbfca, 0xbfca, 0xbfcb, 0xbfcb, + 0xbfcc, 0xbfcc, 0xbfcc, 0xbfcd, 0xbfcd, 0xbfce, 0xbfce, 0xbfcf, + 0xbfcf, 0xbfd0, 0xbfd0, 0xbfd0, 0xbfd1, 0xbfd1, 0xbfd2, 0xbfd2, + 0xbfd3, 0xbfd3, 0xbfd4, 0xbfd4, 0xbfd4, 0xbfd5, 0xbfd5, 0xbfd6, + 0xbfd6, 0xbfd7, 0xbfd7, 0xbfd8, 0xbfd8, 0xbfd8, 0xbfd9, 0xbfd9, + 0xbfda, 0xbfda, 0xbfdb, 0xbfdb, 0xbfdb, 0xbfdc, 0xbfdc, 0xbfdd, + 0xbfdd, 0xbfde, 0xbfde, 0xbfdf, 0xbfdf, 0xbfdf, 0xbfe0, 0xbfe0, + 0xbfe1, 0xbfe1, 0xbfe2, 0xbfe2, 0xbfe2, 0xbfe3, 0xbfe3, 0xbfe4, + 0xbfe4, 0xbfe5, 0xbfe5, 0xbfe5, 0xbfe6, 0xbfe6, 0xbfe7, 0xbfe7, + 0xbfe8, 0xbfe8, 0xbfe8, 0xbfe9, 0xbfe9, 0xbfea, 0xbfea, 0xbfea, + 0xbfeb, 0xbfeb, 0xbfec, 0xbfec, 0xbfed, 0xbfed, 0xbfed, 0xbfee, + 0xbfee, 0xbfef, 0xbfef, 0xbff0, 0xbff0, 0xbff0, 0xbff1, 0xbff1, + 0xbff2, 0xbff2, 0xbff2, 0xbff3, 0xbff3, 0xbff4, 0xbff4, 0xbff4, + 0xbff5, 0xbff5, 0xbff6, 0xbff6, 0xbff7, 0xbff7, 0xbff7, 0xbff8, + 0xbff8, 0xbff9, 0xbff9, 0xbff9, 0xbffa, 0xbffa, 0xbffb, 0xbffb, + 0xbffb, 0xbffc, 0xbffc, 0xbffd, 0xbffd, 0xbffd, 0xbffe, 0xbffe, + 0xbfff, 0xbfff, 0xc000, 0xc000, 0xc000, 0xc000, 0xc001, 0xc001, + 0xc001, 0xc001, 0xc001, 0xc002, 0xc002, 0xc002, 0xc002, 0xc002, + 0xc003, 0xc003, 0xc003, 0xc003, 0xc003, 0xc004, 0xc004, 0xc004, + 0xc004, 0xc004, 0xc005, 0xc005, 0xc005, 0xc005, 0xc005, 0xc006, + 0xc006, 0xc006, 0xc006, 0xc006, 0xc007, 0xc007, 0xc007, 0xc007, + 0xc007, 0xc007, 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc009, + 0xc009, 0xc009, 0xc009, 0xc009, 0xc00a, 0xc00a, 0xc00a, 0xc00a, + 0xc00a, 0xc00b, 0xc00b, 0xc00b, 0xc00b, 0xc00b, 0xc00c, 0xc00c, + 0xc00c, 0xc00c, 0xc00c, 0xc00d, 0xc00d, 0xc00d, 0xc00d, 0xc00d, + 0xc00d, 0xc00e, 0xc00e, 0xc00e, 0xc00e, 0xc00e, 0xc00f, 0xc00f, + 0xc00f, 0xc00f, 0xc00f, 0xc010, 0xc010, 0xc010, 0xc010, 0xc010, + 0xc010, 0xc011, 0xc011, 0xc011, 0xc011, 0xc011, 0xc012, 0xc012, + 0xc012, 0xc012, 0xc012, 0xc013, 0xc013, 0xc013, 0xc013, 0xc013, + 0xc013, 0xc014, 0xc014, 0xc014, 0xc014, 0xc014, 0xc015, 0xc015, + 0xc015, 0xc015, 0xc015, 0xc015, 0xc016, 0xc016, 0xc016, 0xc016, + 0xc016, 0xc017, 0xc017, 0xc017, 0xc017, 0xc017, 0xc018, 0xc018, + 0xc018, 0xc018, 0xc018, 0xc018, 0xc019, 0xc019, 0xc019, 0xc019, + 0xc019, 0xc01a, 0xc01a, 0xc01a, 0xc01a, 0xc01a, 0xc01a, 0xc01b, + 0xc01b, 0xc01b, 0xc01b, 0xc01b, 0xc01b, 0xc01c, 0xc01c, 0xc01c, + 0xc01c, 0xc01c, 0xc01d, 0xc01d, 0xc01d, 0xc01d, 0xc01d, 0xc01d, + 0xc01e, 0xc01e, 0xc01e, 0xc01e, 0xc01e, 0xc01f, 0xc01f, 0xc01f, + 0xc01f, 0xc01f, 0xc01f, 0xc020, 0xc020, 0xc020, 0xc020, 0xc020, + 0xc020, 0xc021, 0xc021, 0xc021, 0xc021, 0xc021, 0xc021, 0xc022, + 0xc022, 0xc022, 0xc022, 0xc022, 0xc023, 0xc023, 0xc023, 0xc023, + 0xc023, 0xc023, 0xc024, 0xc024, 0xc024, 0xc024, 0xc024, 0xc024, + 0xc025, 0xc025, 0xc025, 0xc025, 0xc025, 0xc025, 0xc026, 0xc026, + 0xc026, 0xc026, 0xc026, 0xc026, 0xc027, 0xc027, 0xc027, 0xc027, + 0xc027, 0xc028, 0xc028, 0xc028, 0xc028, 0xc028, 0xc028, 0xc029, + 0xc029, 0xc029, 0xc029, 0xc029, 0xc029, 0xc02a, 0xc02a, 0xc02a, + 0xc02a, 0xc02a, 0xc02a, 0xc02b, 0xc02b, 0xc02b, 0xc02b, 0xc02b, + 0xc02b, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02d, + 0xc02d, 0xc02d, 0xc02d, 0xc02d, 0xc02d, 0xc02e, 0xc02e, 0xc02e, + 0xc02e, 0xc02e, 0xc02e, 0xc02f, 0xc02f, 0xc02f, 0xc02f, 0xc02f, + 0xc02f, 0xc030, 0xc030, 0xc030, 0xc030, 0xc030, 0xc030, 0xc031, + 0xc031, 0xc031, 0xc031, 0xc031, 0xc031, 0xc032, 0xc032, 0xc032, + 0xc032, 0xc032, 0xc032, 0xc032, 0xc033, 0xc033, 0xc033, 0xc033, + 0xc033, 0xc033, 0xc034, 0xc034, 0xc034, 0xc034, 0xc034, 0xc034, + 0xc035, 0xc035, 0xc035, 0xc035, 0xc035, 0xc035, 0xc036, 0xc036, + 0xc036, 0xc036, 0xc036, 0xc036, 0xc036, 0xc037, 0xc037, 0xc037, + 0xc037, 0xc037, 0xc037, 0xc038, 0xc038, 0xc038, 0xc038, 0xc038, + 0xc038, 0xc039, 0xc039, 0xc039, 0xc039, 0xc039, 0xc039, 0xc03a, + 0xc03a, 0xc03a, 0xc03a, 0xc03a, 0xc03a, 0xc03a, 0xc03b, 0xc03b, + 0xc03b, 0xc03b, 0xc03b, 0xc03b, 0xc03c, 0xc03c, 0xc03c, 0xc03c, + 0xc03c, 0xc03c, 0xc03c, 0xc03d, 0xc03d, 0xc03d, 0xc03d, 0xc03d, + 0xc03d, 0xc03e, 0xc03e, 0xc03e, 0xc03e, 0xc03e, 0xc03e, 0xc03e, + 0xc03f, 0xc03f, 0xc03f, 0xc03f, 0xc03f, 0xc03f, 0xc040, 0xc040, + 0xc040, 0xc040, 0xc040, 0xc040, 0xc040, 0xc041, 0xc041, 0xc041, + 0xc041, 0xc041, 0xc041, 0xc042, 0xc042, 0xc042, 0xc042, 0xc042, + 0xc042, 0xc042, 0xc043, 0xc043, 0xc043, 0xc043, 0xc043, 0xc043, + 0xc044, 0xc044, 0xc044, 0xc044, 0xc044, 0xc044, 0xc044, 0xc045, + 0xc045, 0xc045, 0xc045, 0xc045, 0xc045, 0xc045, 0xc046, 0xc046, + 0xc046, 0xc046, 0xc046, 0xc046, 0xc047, 0xc047, 0xc047, 0xc047, + 0xc047, 0xc047, 0xc047, 0xc048, 0xc048, 0xc048, 0xc048, 0xc048, + 0xc048, 0xc048, 0xc049, 0xc049, 0xc049, 0xc049, 0xc049, 0xc049, + 0xc049, 0xc04a, 0xc04a, 0xc04a, 0xc04a, 0xc04a, 0xc04a, 0xc04a, + 0xc04b, 0xc04b, 0xc04b, 0xc04b, 0xc04b, 0xc04b, 0xc04c, 0xc04c, + 0xc04c, 0xc04c, 0xc04c, 0xc04c, 0xc04c, 0xc04d, 0xc04d, 0xc04d, + 0xc04d, 0xc04d, 0xc04d, 0xc04d, 0xc04e, 0xc04e, 0xc04e, 0xc04e, + 0xc04e, 0xc04e, 0xc04e, 0xc04f, 0xc04f, 0xc04f, 0xc04f, 0xc04f, + 0xc04f, 0xc04f, 0xc050, 0xc050, 0xc050, 0xc050, 0xc050, 0xc050, + 0xc050, 0xc051, 0xc051, 0xc051, 0xc051, 0xc051, 0xc051, 0xc051, + 0xc052, 0xc052, 0xc052, 0xc052, 0xc052, 0xc052, 0xc052, 0xc053, + 0xc053, 0xc053, 0xc053, 0xc053, 0xc053, 0xc053, 0xc054, 0xc054, + 0xc054, 0xc054, 0xc054, 0xc054, 0xc054, 0xc055, 0xc055, 0xc055, + 0xc055, 0xc055, 0xc055, 0xc055, 0xc055, 0xc056, 0xc056, 0xc056, + 0xc056, 0xc056, 0xc056, 0xc056, 0xc057, 0xc057, 0xc057, 0xc057, + 0xc057, 0xc057, 0xc057, 0xc058, 0xc058, 0xc058, 0xc058, 0xc058, + 0xc058, 0xc058, 0xc059, 0xc059, 0xc059, 0xc059, 0xc059, 0xc059, + 0xc059, 0xc05a, 0xc05a, 0xc05a, 0xc05a, 0xc05a, 0xc05a, 0xc05a, + 0xc05a, 0xc05b, 0xc05b, 0xc05b, 0xc05b, 0xc05b, 0xc05b, 0xc05b, + 0xc05c, 0xc05c, 0xc05c, 0xc05c, 0xc05c, 0xc05c, 0xc05c, 0xc05d, + 0xc05d, 0xc05d, 0xc05d, 0xc05d, 0xc05d, 0xc05d, 0xc05d, 0xc05e, + 0xc05e, 0xc05e, 0xc05e, 0xc05e, 0xc05e, 0xc05e, 0xc05f, 0xc05f, + 0xc05f, 0xc05f, 0xc05f, 0xc05f, 0xc05f, 0xc05f, 0xc060, 0xc060, + 0xc060, 0xc060, 0xc060, 0xc060, 0xc060, 0xc061, 0xc061, 0xc061, + 0xc061, 0xc061, 0xc061, 0xc061, 0xc061, 0xc062, 0xc062, 0xc062, + 0xc062, 0xc062, 0xc062, 0xc062, 0xc063, 0xc063, 0xc063, 0xc063, + 0xc063, 0xc063, 0xc063, 0xc063, 0xc064, 0xc064, 0xc064, 0xc064, + 0xc064, 0xc064, 0xc064, 0xc064, 0xc065, 0xc065, 0xc065, 0xc065, + 0xc065, 0xc065, 0xc065, 0xc066, 0xc066, 0xc066, 0xc066, 0xc066, + 0xc066, 0xc066, 0xc066, 0xc067, 0xc067, 0xc067, 0xc067, 0xc067, + 0xc067, 0xc067, 0xc067, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, + 0xc068, 0xc068, 0xc069, 0xc069, 0xc069, 0xc069, 0xc069, 0xc069, + 0xc069, 0xc069, 0xc06a, 0xc06a, 0xc06a, 0xc06a, 0xc06a, 0xc06a, + 0xc06a, 0xc06a, 0xc06b, 0xc06b, 0xc06b, 0xc06b, 0xc06b, 0xc06b, + 0xc06b, 0xc06b, 0xc06c, 0xc06c, 0xc06c, 0xc06c, 0xc06c, 0xc06c, + 0xc06c, 0xc06c, 0xc06d, 0xc06d, 0xc06d, 0xc06d, 0xc06d, 0xc06d, + 0xc06d, 0xc06d, 0xc06e, 0xc06e, 0xc06e, 0xc06e, 0xc06e, 0xc06e, + 0xc06e, 0xc06e, 0xc06f, 0xc06f, 0xc06f, 0xc06f, 0xc06f, 0xc06f, + 0xc06f, 0xc06f, 0xc070, 0xc070, 0xc070, 0xc070, 0xc070, 0xc070, + 0xc070, 0xc070, 0xc071, 0xc071, 0xc071, 0xc071, 0xc071, 0xc071, + 0xc071, 0xc071, 0xc072, 0xc072, 0xc072, 0xc072, 0xc072, 0xc072, + 0xc072, 0xc072, 0xc073, 0xc073, 0xc073, 0xc073, 0xc073, 0xc073, + 0xc073, 0xc073, 0xc074, 0xc074, 0xc074, 0xc074, 0xc074, 0xc074, + 0xc074, 0xc074, 0xc075, 0xc075, 0xc075, 0xc075, 0xc075, 0xc075, + 0xc075, 0xc075, 0xc076, 0xc076, 0xc076, 0xc076, 0xc076, 0xc076, + 0xc076, 0xc076, 0xc076, 0xc077, 0xc077, 0xc077, 0xc077, 0xc077, + 0xc077, 0xc077, 0xc077, 0xc078, 0xc078, 0xc078, 0xc078, 0xc078, + 0xc078, 0xc078, 0xc078, 0xc079, 0xc079, 0xc079, 0xc079, 0xc079, + 0xc079, 0xc079, 0xc079, 0xc079, 0xc07a, 0xc07a, 0xc07a, 0xc07a, + 0xc07a, 0xc07a, 0xc07a, 0xc07a, 0xc07b, 0xc07b, 0xc07b, 0xc07b, + 0xc07b, 0xc07b, 0xc07b, 0xc07b, 0xc07c, 0xc07c, 0xc07c, 0xc07c, + 0xc07c, 0xc07c, 0xc07c, 0xc07c, 0xc07c, 0xc07d, 0xc07d, 0xc07d, + 0xc07d, 0xc07d, 0xc07d, 0xc07d, 0xc07d, 0xc07e, 0xc07e, 0xc07e, + 0xc07e, 0xc07e, 0xc07e, 0xc07e, 0xc07e, 0xc07e, 0xc07f, 0xc07f, + 0xc07f, 0xc07f, 0xc07f, 0xc07f, 0xc07f, 0xc07f, 0xc080, 0xc080, + 0xc080, 0xc080, 0xc080, 0xc080, 0xc080, 0xc080, 0xc080, 0xc081, + 0xc081, 0xc081, 0xc081, 0xc081, 0xc081, 0xc081, 0xc081, 0xc081, + 0xc082, 0xc082, 0xc082, 0xc082, 0xc082, 0xc082, 0xc082, 0xc082, + 0xc083, 0xc083, 0xc083, 0xc083, 0xc083, 0xc083, 0xc083, 0xc083, + 0xc083, 0xc084, 0xc084, 0xc084, 0xc084, 0xc084, 0xc084, 0xc084, + 0xc084, 0xc084, 0xc085, 0xc085, 0xc085, 0xc085, 0xc085, 0xc085, + 0xc085, 0xc085, 0xc086, 0xc086, 0xc086, 0xc086, 0xc087, 0xc087, + 0xc087, 0xc087, 0xc088, 0xc088, 0xc088, 0xc088, 0xc088, 0xc089, + 0xc089, 0xc089, 0xc089, 0xc08a, 0xc08a, 0xc08a, 0xc08a, 0xc08a, + 0xc08b, 0xc08b, 0xc08b, 0xc08b, 0xc08c, 0xc08c, 0xc08c, 0xc08c, + 0xc08c, 0xc08d, 0xc08d, 0xc08d, 0xc08d, 0xc08e, 0xc08e, 0xc08e, + 0xc08e, 0xc08e, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc08f, 0xc090, + 0xc090, 0xc090, 0xc090, 0xc091, 0xc091, 0xc091, 0xc091, 0xc091, + 0xc092, 0xc092, 0xc092, 0xc092, 0xc093, 0xc093, 0xc093, 0xc093, + 0xc093, 0xc094, 0xc094, 0xc094, 0xc094, 0xc094, 0xc095, 0xc095, + 0xc095, 0xc095, 0xc095, 0xc096, 0xc096, 0xc096, 0xc096, 0xc097, + 0xc097, 0xc097, 0xc097, 0xc097, 0xc098, 0xc098, 0xc098, 0xc098, + 0xc098, 0xc099, 0xc099, 0xc099, 0xc099, 0xc099, 0xc09a, 0xc09a, + 0xc09a, 0xc09a, 0xc09b, 0xc09b, 0xc09b, 0xc09b, 0xc09b, 0xc09c, + 0xc09c, 0xc09c, 0xc09c, 0xc09c, 0xc09d, 0xc09d, 0xc09d, 0xc09d, + 0xc09d, 0xc09e, 0xc09e, 0xc09e, 0xc09e, 0xc09e, 0xc09f, 0xc09f, + 0xc09f, 0xc09f, 0xc09f, 0xc0a0, 0xc0a0, 0xc0a0, 0xc0a0, 0xc0a0, + 0xc0a1, 0xc0a1, 0xc0a1, 0xc0a1, 0xc0a1, 0xc0a2, 0xc0a2, 0xc0a2, + 0xc0a2, 0xc0a2, 0xc0a3, 0xc0a3, 0xc0a3, 0xc0a3, 0xc0a3, 0xc0a4, + 0xc0a4, 0xc0a4, 0xc0a4, 0xc0a4, 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, + 0xc0a5, 0xc0a6, 0xc0a6, 0xc0a6, 0xc0a6, 0xc0a6, 0xc0a7, 0xc0a7, + 0xc0a7, 0xc0a7, 0xc0a7, 0xc0a8, 0xc0a8, 0xc0a8, 0xc0a8, 0xc0a8, + 0xc0a9, 0xc0a9, 0xc0a9, 0xc0a9, 0xc0a9, 0xc0aa, 0xc0aa, 0xc0aa, + 0xc0aa, 0xc0aa, 0xc0ab, 0xc0ab, 0xc0ab, 0xc0ab, 0xc0ab, 0xc0ac, + 0xc0ac, 0xc0ac, 0xc0ac, 0xc0ac, 0xc0ac, 0xc0ad, 0xc0ad, 0xc0ad, + 0xc0ad, 0xc0ad, 0xc0ae, 0xc0ae, 0xc0ae, 0xc0ae, 0xc0ae, 0xc0af, + 0xc0af, 0xc0af, 0xc0af, 0xc0af, 0xc0b0, 0xc0b0, 0xc0b0, 0xc0b0, + 0xc0b0, 0xc0b0, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b2, + 0xc0b2, 0xc0b2, 0xc0b2, 0xc0b2, 0xc0b3, 0xc0b3, 0xc0b3, 0xc0b3, + 0xc0b3, 0xc0b3, 0xc0b4, 0xc0b4, 0xc0b4, 0xc0b4, 0xc0b4, 0xc0b5, + 0xc0b5, 0xc0b5, 0xc0b5, 0xc0b5, 0xc0b6, 0xc0b6, 0xc0b6, 0xc0b6, + 0xc0b6, 0xc0b6, 0xc0b7, 0xc0b7, 0xc0b7, 0xc0b7, 0xc0b7, 0xc0b8, + 0xc0b8, 0xc0b8, 0xc0b8, 0xc0b8, 0xc0b8, 0xc0b9, 0xc0b9, 0xc0b9, + 0xc0b9, 0xc0b9, 0xc0ba, 0xc0ba, 0xc0ba, 0xc0ba, 0xc0ba, 0xc0ba, + 0xc0bb, 0xc0bb, 0xc0bb, 0xc0bb, 0xc0bb, 0xc0bc, 0xc0bc, 0xc0bc, + 0xc0bc, 0xc0bc, 0xc0bc, 0xc0bd, 0xc0bd, 0xc0bd, 0xc0bd, 0xc0bd, + 0xc0be, 0xc0be, 0xc0be, 0xc0be, 0xc0be, 0xc0be, 0xc0bf, 0xc0bf, + 0xc0bf, 0xc0bf, 0xc0bf, 0xc0bf, 0xc0c0, 0xc0c0, 0xc0c0, 0xc0c0, + 0xc0c0, 0xc0c1, 0xc0c1, 0xc0c1, 0xc0c1, 0xc0c1, 0xc0c1, 0xc0c2, + 0xc0c2, 0xc0c2, 0xc0c2, 0xc0c2, 0xc0c2, 0xc0c3, 0xc0c3, 0xc0c3, + 0xc0c3, 0xc0c3, 0xc0c4, 0xc0c4, 0xc0c4, 0xc0c4, 0xc0c4, 0xc0c4, + 0xc0c5, 0xc0c5, 0xc0c5, 0xc0c5, 0xc0c5, 0xc0c5, 0xc0c6, 0xc0c6, + 0xc0c6, 0xc0c6, 0xc0c6, 0xc0c6, 0xc0c7, 0xc0c7, 0xc0c7, 0xc0c7, + 0xc0c7, 0xc0c7, 0xc0c8, 0xc0c8, 0xc0c8, 0xc0c8, 0xc0c8, 0xc0c8, + 0xc0c9, 0xc0c9, 0xc0c9, 0xc0c9, 0xc0c9, 0xc0ca, 0xc0ca, 0xc0ca, + 0xc0ca, 0xc0ca, 0xc0ca, 0xc0cb, 0xc0cb, 0xc0cb, 0xc0cb, 0xc0cb, + 0xc0cb, 0xc0cc, 0xc0cc, 0xc0cc, 0xc0cc, 0xc0cc, 0xc0cc, 0xc0cd, + 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0ce, 0xc0ce, 0xc0ce, + 0xc0ce, 0xc0ce, 0xc0ce, 0xc0cf, 0xc0cf, 0xc0cf, 0xc0cf, 0xc0cf, + 0xc0cf, 0xc0d0, 0xc0d0, 0xc0d0, 0xc0d0, 0xc0d0, 0xc0d0, 0xc0d1, + 0xc0d1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc0d2, 0xc0d2, 0xc0d2, + 0xc0d2, 0xc0d2, 0xc0d2, 0xc0d2, 0xc0d3, 0xc0d3, 0xc0d3, 0xc0d3, + 0xc0d3, 0xc0d3, 0xc0d4, 0xc0d4, 0xc0d4, 0xc0d4, 0xc0d4, 0xc0d4, + 0xc0d5, 0xc0d5, 0xc0d5, 0xc0d5, 0xc0d5, 0xc0d5, 0xc0d6, 0xc0d6, + 0xc0d6, 0xc0d6, 0xc0d6, 0xc0d6, 0xc0d7, 0xc0d7, 0xc0d7, 0xc0d7, + 0xc0d7, 0xc0d7, 0xc0d7, 0xc0d8, 0xc0d8, 0xc0d8, 0xc0d8, 0xc0d8, + 0xc0d8, 0xc0d9, 0xc0d9, 0xc0d9, 0xc0d9, 0xc0d9, 0xc0d9, 0xc0da, + 0xc0da, 0xc0da, 0xc0da, 0xc0da, 0xc0da, 0xc0db, 0xc0db, 0xc0db, + 0xc0db, 0xc0db, 0xc0db, 0xc0db, 0xc0dc, 0xc0dc, 0xc0dc, 0xc0dc, + 0xc0dc, 0xc0dc, 0xc0dd, 0xc0dd, 0xc0dd, 0xc0dd, 0xc0dd, 0xc0dd, + 0xc0dd, 0xc0de, 0xc0de, 0xc0de, 0xc0de, 0xc0de, 0xc0de, 0xc0df, + 0xc0df, 0xc0df, 0xc0df, 0xc0df, 0xc0df, 0xc0df, 0xc0e0, 0xc0e0, + 0xc0e0, 0xc0e0, 0xc0e0, 0xc0e0, 0xc0e1, 0xc0e1, 0xc0e1, 0xc0e1, + 0xc0e1, 0xc0e1, 0xc0e1, 0xc0e2, 0xc0e2, 0xc0e2, 0xc0e2, 0xc0e2, + 0xc0e2, 0xc0e3, 0xc0e3, 0xc0e3, 0xc0e3, 0xc0e3, 0xc0e3, 0xc0e3, + 0xc0e4, 0xc0e4, 0xc0e4, 0xc0e4, 0xc0e4, 0xc0e4, 0xc0e5, 0xc0e5, + 0xc0e5, 0xc0e5, 0xc0e5, 0xc0e5, 0xc0e5, 0xc0e6, 0xc0e6, 0xc0e6, + 0xc0e6, 0xc0e6, 0xc0e6, 0xc0e6, 0xc0e7, 0xc0e7, 0xc0e7, 0xc0e7, + 0xc0e7, 0xc0e7, 0xc0e8, 0xc0e8, 0xc0e8, 0xc0e8, 0xc0e8, 0xc0e8, + 0xc0e8, 0xc0e9, 0xc0e9, 0xc0e9, 0xc0e9, 0xc0e9, 0xc0e9, 0xc0e9, + 0xc0ea, 0xc0ea, 0xc0ea, 0xc0ea, 0xc0ea, 0xc0ea, 0xc0ea, 0xc0eb, + 0xc0eb, 0xc0eb, 0xc0eb, 0xc0eb, 0xc0eb, 0xc0ec, 0xc0ec, 0xc0ec, + 0xc0ec, 0xc0ec, 0xc0ec, 0xc0ec, 0xc0ed, 0xc0ed, 0xc0ed, 0xc0ed, + 0xc0ed, 0xc0ed, 0xc0ed, 0xc0ee, 0xc0ee, 0xc0ee, 0xc0ee, 0xc0ee, + 0xc0ee, 0xc0ee, 0xc0ef, 0xc0ef, 0xc0ef, 0xc0ef, 0xc0ef, 0xc0ef, + 0xc0ef, 0xc0f0, 0xc0f0, 0xc0f0, 0xc0f0, 0xc0f0, 0xc0f0, 0xc0f0, + 0xc0f1, 0xc0f1, 0xc0f1, 0xc0f1, 0xc0f1, 0xc0f1, 0xc0f1, 0xc0f2, + 0xc0f2, 0xc0f2, 0xc0f2, 0xc0f2, 0xc0f2, 0xc0f2, 0xc0f3, 0xc0f3, + 0xc0f3, 0xc0f3, 0xc0f3, 0xc0f3, 0xc0f3, 0xc0f4, 0xc0f4, 0xc0f4, + 0xc0f4, 0xc0f4, 0xc0f4, 0xc0f4, 0xc0f5, 0xc0f5, 0xc0f5, 0xc0f5, + 0xc0f5, 0xc0f5, 0xc0f5, 0xc0f6, 0xc0f6, 0xc0f6, 0xc0f6, 0xc0f6, + 0xc0f6, 0xc0f6, 0xc0f7, 0xc0f7, 0xc0f7, 0xc0f7, 0xc0f7, 0xc0f7, + 0xc0f7, 0xc0f8, 0xc0f8, 0xc0f8, 0xc0f8, 0xc0f8, 0xc0f8, 0xc0f8, + 0xc0f8, 0xc0f9, 0xc0f9, 0xc0f9, 0xc0f9, 0xc0f9, 0xc0f9, 0xc0f9, + 0xc0fa, 0xc0fa, 0xc0fa, 0xc0fa, 0xc0fa, 0xc0fa, 0xc0fa, 0xc0fb, + 0xc0fb, 0xc0fb, 0xc0fb, 0xc0fb, 0xc0fb, 0xc0fb, 0xc0fc, 0xc0fc, + 0xc0fc, 0xc0fc, 0xc0fc, 0xc0fc, 0xc0fc, 0xc0fc, 0xc0fd, 0xc0fd, + 0xc0fd, 0xc0fd, 0xc0fd, 0xc0fd, 0xc0fd, 0xc0fe, 0xc0fe, 0xc0fe, + 0xc0fe, 0xc0fe, 0xc0fe, 0xc0fe, 0xc0fe, 0xc0ff, 0xc0ff, 0xc0ff, + 0xc0ff, 0xc0ff, 0xc0ff, 0xc0ff, 0xc100, 0xc100, 0xc100, 0xc100, + 0xc100, 0xc100, 0xc100, 0xc101, 0xc101, 0xc101, 0xc101, 0xc101, + 0xc101, 0xc101, 0xc101, 0xc102, 0xc102, 0xc102, 0xc102, 0xc102, + 0xc102, 0xc102, 0xc103, 0xc103, 0xc103, 0xc103, 0xc103, 0xc103, + 0xc103, 0xc103, 0xc104, 0xc104, 0xc104, 0xc104, 0xc104, 0xc104, + 0xc104, 0xc104, 0xc105, 0xc105, 0xc105, 0xc105, 0xc105, 0xc105, + 0xc105, 0xc106, 0xc106, 0xc106, 0xc106, 0xc106, 0xc106, 0xc106, + 0xc106, 0xc107, 0xc107, 0xc107, 0xc107, 0xc107, 0xc107, 0xc107, + 0xc107, 0xc108, 0xc108, 0xc108, 0xc108, 0xc108, 0xc108, 0xc108, + 0xc109, 0xc109, 0xc109, 0xc109, 0xc109, 0xc109, 0xc109, 0xc109, + 0xc10a, 0xc10a, 0xc10a, 0xc10a, 0xc10a, 0xc10a, 0xc10a, 0xc10a, + 0xc10b, 0xc10b, 0xc10b, 0xc10b, 0xc10b, 0xc10b, 0xc10b, 0xc10b, + 0xc10c, 0xc10c, 0xc10c, 0xc10c, 0xc10c, 0xc10c, 0xc10c, 0xc10d, + 0xc10d, 0xc10d, 0xc10d, 0xc10d, 0xc10d, 0xc10d, 0xc10d, 0xc10e, + 0xc10e, 0xc10e, 0xc10e, 0xc10e, 0xc10e, 0xc10e, 0xc10e, 0xc10f, + 0xc10f, 0xc10f, 0xc10f, 0xc10f, 0xc10f, 0xc10f, 0xc10f, 0xc110, + 0xc110, 0xc110, 0xc110, 0xc110, 0xc110, 0xc110, 0xc110, 0xc111, + 0xc111, 0xc111, 0xc111, 0xc111, 0xc111, 0xc111, 0xc111, 0xc112, + 0xc112, 0xc112, 0xc112, 0xc112, 0xc112, 0xc112, 0xc112, 0xc113, + 0xc113, 0xc113, 0xc113, 0xc113, 0xc113, 0xc113, 0xc113, 0xc114, + 0xc114, 0xc114, 0xc114, 0xc114, 0xc114, 0xc114, 0xc114, 0xc115, + 0xc115, 0xc115, 0xc115, 0xc115, 0xc115, 0xc115, 0xc115, 0xc115, + 0xc116, 0xc116, 0xc116, 0xc116, 0xc116, 0xc116, 0xc116, 0xc116, + 0xc117, 0xc117, 0xc117, 0xc117, 0xc117, 0xc117, 0xc117, 0xc117, + 0xc118, 0xc118, 0xc118, 0xc118, 0xc118, 0xc118, 0xc118, 0xc118, + 0xc119, 0xc119, 0xc119, 0xc119, 0xc119, 0xc119, 0xc119, 0xc119, + 0xc119, 0xc11a, 0xc11a, 0xc11a, 0xc11a, 0xc11a, 0xc11a, 0xc11a, + 0xc11a, 0xc11b, 0xc11b, 0xc11b, 0xc11b, 0xc11b, 0xc11b, 0xc11b, + 0xc11b, 0xc11c, 0xc11c, 0xc11c, 0xc11c, 0xc11c, 0xc11c, 0xc11c, + 0xc11c, 0xc11c, 0xc11d, 0xc11d, 0xc11d, 0xc11d, 0xc11d, 0xc11d, + 0xc11d, 0xc11d, 0xc11e, 0xc11e, 0xc11e, 0xc11e, 0xc11e, 0xc11e, + 0xc11e, 0xc11e, 0xc11e, 0xc11f, 0xc11f, 0xc11f, 0xc11f, 0xc11f, + 0xc11f, 0xc11f, 0xc11f, 0xc120, 0xc120, 0xc120, 0xc120, 0xc120, + 0xc120, 0xc120, 0xc120, 0xc120, 0xc121, 0xc121, 0xc121, 0xc121, + 0xc121, 0xc121, 0xc121, 0xc121, 0xc122, 0xc122, 0xc122, 0xc122, + 0xc122, 0xc122, 0xc122, 0xc122, 0xc122, 0xc123, 0xc123, 0xc123, + 0xc123, 0xc123, 0xc123, 0xc123, 0xc123, 0xc123, 0xc124, 0xc124, + 0xc124, 0xc124, 0xc124, 0xc124, 0xc124, 0xc124, 0xc125, 0xc125, + 0xc125, 0xc125, 0xc125, 0xc125, 0xc125, 0xc125, 0xc125, 0xc126, + 0xc126, 0xc126, 0xc126, 0xc126, 0xc126, 0xc126, 0xc126, 0xc126, + 0xc127, 0xc127, 0xc127, 0xc127, 0xc127, 0xc128, 0xc128, 0xc128, + 0xc128, 0xc129, 0xc129, 0xc129, 0xc129, 0xc12a, 0xc12a, 0xc12a, + 0xc12a, 0xc12a, 0xc12b, 0xc12b, 0xc12b, 0xc12b, 0xc12c, 0xc12c, + 0xc12c, 0xc12c, 0xc12c, 0xc12d, 0xc12d, 0xc12d, 0xc12d, 0xc12e, + 0xc12e, 0xc12e, 0xc12e, 0xc12e, 0xc12f, 0xc12f, 0xc12f, 0xc12f, + 0xc12f, 0xc130, 0xc130, 0xc130, 0xc130, 0xc131, 0xc131, 0xc131, + 0xc131, 0xc131, 0xc132, 0xc132, 0xc132, 0xc132, 0xc133, 0xc133, + 0xc133, 0xc133, 0xc133, 0xc134, 0xc134, 0xc134, 0xc134, 0xc134, + 0xc135, 0xc135, 0xc135, 0xc135, 0xc136, 0xc136, 0xc136, 0xc136, + 0xc136, 0xc137, 0xc137, 0xc137, 0xc137, 0xc137, 0xc138, 0xc138, + 0xc138, 0xc138, 0xc138, 0xc139, 0xc139, 0xc139, 0xc139, 0xc13a, + 0xc13a, 0xc13a, 0xc13a, 0xc13a, 0xc13b, 0xc13b, 0xc13b, 0xc13b, + 0xc13b, 0xc13c, 0xc13c, 0xc13c, 0xc13c, 0xc13c, 0xc13d, 0xc13d, + 0xc13d, 0xc13d, 0xc13d, 0xc13e, 0xc13e, 0xc13e, 0xc13e, 0xc13f, + 0xc13f, 0xc13f, 0xc13f, 0xc13f, 0xc140, 0xc140, 0xc140, 0xc140, + 0xc140, 0xc141, 0xc141, 0xc141, 0xc141, 0xc141, 0xc142, 0xc142, + 0xc142, 0xc142, 0xc142, 0xc143, 0xc143, 0xc143, 0xc143, 0xc143, + 0xc144, 0xc144, 0xc144, 0xc144, 0xc144, 0xc145, 0xc145, 0xc145, + 0xc145, 0xc145, 0xc146, 0xc146, 0xc146, 0xc146, 0xc146, 0xc147, + 0xc147, 0xc147, 0xc147, 0xc147, 0xc148, 0xc148, 0xc148, 0xc148, + 0xc148, 0xc149, 0xc149, 0xc149, 0xc149, 0xc149, 0xc14a, 0xc14a, + 0xc14a, 0xc14a, 0xc14a, 0xc14b, 0xc14b, 0xc14b, 0xc14b, 0xc14b, + 0xc14b, 0xc14c, 0xc14c, 0xc14c, 0xc14c, 0xc14c, 0xc14d, 0xc14d, + 0xc14d, 0xc14d, 0xc14d, 0xc14e, 0xc14e, 0xc14e, 0xc14e, 0xc14e, + 0xc14f, 0xc14f, 0xc14f, 0xc14f, 0xc14f, 0xc150, 0xc150, 0xc150, + 0xc150, 0xc150, 0xc150, 0xc151, 0xc151, 0xc151, 0xc151, 0xc151, + 0xc152, 0xc152, 0xc152, 0xc152, 0xc152, 0xc153, 0xc153, 0xc153, + 0xc153, 0xc153, 0xc153, 0xc154, 0xc154, 0xc154, 0xc154, 0xc154, + 0xc155, 0xc155, 0xc155, 0xc155, 0xc155, 0xc156, 0xc156, 0xc156, + 0xc156, 0xc156, 0xc156, 0xc157, 0xc157, 0xc157, 0xc157, 0xc157, + 0xc158, 0xc158, 0xc158, 0xc158, 0xc158, 0xc158, 0xc159, 0xc159, + 0xc159, 0xc159, 0xc159, 0xc15a, 0xc15a, 0xc15a, 0xc15a, 0xc15a, + 0xc15b, 0xc15b, 0xc15b, 0xc15b, 0xc15b, 0xc15b, 0xc15c, 0xc15c, + 0xc15c, 0xc15c, 0xc15c, 0xc15c, 0xc15d, 0xc15d, 0xc15d, 0xc15d, + 0xc15d, 0xc15e, 0xc15e, 0xc15e, 0xc15e, 0xc15e, 0xc15e, 0xc15f, + 0xc15f, 0xc15f, 0xc15f, 0xc15f, 0xc160, 0xc160, 0xc160, 0xc160, + 0xc160, 0xc160, 0xc161, 0xc161, 0xc161, 0xc161, 0xc161, 0xc161, + 0xc162, 0xc162, 0xc162, 0xc162, 0xc162, 0xc163, 0xc163, 0xc163, + 0xc163, 0xc163, 0xc163, 0xc164, 0xc164, 0xc164, 0xc164, 0xc164, + 0xc164, 0xc165, 0xc165, 0xc165, 0xc165, 0xc165, 0xc166, 0xc166, + 0xc166, 0xc166, 0xc166, 0xc166, 0xc167, 0xc167, 0xc167, 0xc167, + 0xc167, 0xc167, 0xc168, 0xc168, 0xc168, 0xc168, 0xc168, 0xc168, + 0xc169, 0xc169, 0xc169, 0xc169, 0xc169, 0xc169, 0xc16a, 0xc16a, + 0xc16a, 0xc16a, 0xc16a, 0xc16a, 0xc16b, 0xc16b, 0xc16b, 0xc16b, + 0xc16b, 0xc16c, 0xc16c, 0xc16c, 0xc16c, 0xc16c, 0xc16c, 0xc16d, + 0xc16d, 0xc16d, 0xc16d, 0xc16d, 0xc16d, 0xc16e, 0xc16e, 0xc16e, + 0xc16e, 0xc16e, 0xc16e, 0xc16f, 0xc16f, 0xc16f, 0xc16f, 0xc16f, + 0xc16f, 0xc170, 0xc170, 0xc170, 0xc170, 0xc170, 0xc170, 0xc171, + 0xc171, 0xc171, 0xc171, 0xc171, 0xc171, 0xc172, 0xc172, 0xc172, + 0xc172, 0xc172, 0xc172, 0xc172, 0xc173, 0xc173, 0xc173, 0xc173, + 0xc173, 0xc173, 0xc174, 0xc174, 0xc174, 0xc174, 0xc174, 0xc174, + 0xc175, 0xc175, 0xc175, 0xc175, 0xc175, 0xc175, 0xc176, 0xc176, + 0xc176, 0xc176, 0xc176, 0xc176, 0xc177, 0xc177, 0xc177, 0xc177, + 0xc177, 0xc177, 0xc178, 0xc178, 0xc178, 0xc178, 0xc178, 0xc178, + 0xc178, 0xc179, 0xc179, 0xc179, 0xc179, 0xc179, 0xc179, 0xc17a, + 0xc17a, 0xc17a, 0xc17a, 0xc17a, 0xc17a, 0xc17b, 0xc17b, 0xc17b, + 0xc17b, 0xc17b, 0xc17b, 0xc17c, 0xc17c, 0xc17c, 0xc17c, 0xc17c, + 0xc17c, 0xc17c, 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, + 0xc17e, 0xc17e, 0xc17e, 0xc17e, 0xc17e, 0xc17e, 0xc17e, 0xc17f, + 0xc17f, 0xc17f, 0xc17f, 0xc17f, 0xc17f, 0xc180, 0xc180, 0xc180, + 0xc180, 0xc180, 0xc180, 0xc180, 0xc181, 0xc181, 0xc181, 0xc181, + 0xc181, 0xc181, 0xc182, 0xc182, 0xc182, 0xc182, 0xc182, 0xc182, + 0xc182, 0xc183, 0xc183, 0xc183, 0xc183, 0xc183, 0xc183, 0xc184, + 0xc184, 0xc184, 0xc184, 0xc184, 0xc184, 0xc184, 0xc185, 0xc185, + 0xc185, 0xc185, 0xc185, 0xc185, 0xc186, 0xc186, 0xc186, 0xc186, + 0xc186, 0xc186, 0xc186, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, + 0xc187, 0xc187, 0xc188, 0xc188, 0xc188, 0xc188, 0xc188, 0xc188, + 0xc189, 0xc189, 0xc189, 0xc189, 0xc189, 0xc189, 0xc189, 0xc18a, + 0xc18a, 0xc18a, 0xc18a, 0xc18a, 0xc18a, 0xc18a, 0xc18b, 0xc18b, + 0xc18b, 0xc18b, 0xc18b, 0xc18b, 0xc18c, 0xc18c, 0xc18c, 0xc18c, + 0xc18c, 0xc18c, 0xc18c, 0xc18d, 0xc18d, 0xc18d, 0xc18d, 0xc18d, + 0xc18d, 0xc18d, 0xc18e, 0xc18e, 0xc18e, 0xc18e, 0xc18e, 0xc18e, + 0xc18e, 0xc18f, 0xc18f, 0xc18f, 0xc18f, 0xc18f, 0xc18f, 0xc18f, + 0xc190, 0xc190, 0xc190, 0xc190, 0xc190, 0xc190, 0xc190, 0xc191, + 0xc191, 0xc191, 0xc191, 0xc191, 0xc191, 0xc191, 0xc192, 0xc192, + 0xc192, 0xc192, 0xc192, 0xc192, 0xc192, 0xc193, 0xc193, 0xc193, + 0xc193, 0xc193, 0xc193, 0xc193, 0xc194, 0xc194, 0xc194, 0xc194, + 0xc194, 0xc194, 0xc194, 0xc195, 0xc195, 0xc195, 0xc195, 0xc195, + 0xc195, 0xc195, 0xc196, 0xc196, 0xc196, 0xc196, 0xc196, 0xc196, + 0xc196, 0xc197, 0xc197, 0xc197, 0xc197, 0xc197, 0xc197, 0xc197, + 0xc198, 0xc198, 0xc198, 0xc198, 0xc198, 0xc198, 0xc198, 0xc199, + 0xc199, 0xc199, 0xc199, 0xc199, 0xc199, 0xc199, 0xc19a, 0xc19a, + 0xc19a, 0xc19a, 0xc19a, 0xc19a, 0xc19a, 0xc19a, 0xc19b, 0xc19b, + 0xc19b, 0xc19b, 0xc19b, 0xc19b, 0xc19b, 0xc19c, 0xc19c, 0xc19c, + 0xc19c, 0xc19c, 0xc19c, 0xc19c, 0xc19d, 0xc19d, 0xc19d, 0xc19d, + 0xc19d, 0xc19d, 0xc19d, 0xc19d, 0xc19e, 0xc19e, 0xc19e, 0xc19e, + 0xc19e, 0xc19e, 0xc19e, 0xc19f, 0xc19f, 0xc19f, 0xc19f, 0xc19f, + 0xc19f, 0xc19f, 0xc1a0, 0xc1a0, 0xc1a0, 0xc1a0, 0xc1a0, 0xc1a0, + 0xc1a0, 0xc1a0, 0xc1a1, 0xc1a1, 0xc1a1, 0xc1a1, 0xc1a1, 0xc1a1, + 0xc1a1, 0xc1a2, 0xc1a2, 0xc1a2, 0xc1a2, 0xc1a2, 0xc1a2, 0xc1a2, + 0xc1a2, 0xc1a3, 0xc1a3, 0xc1a3, 0xc1a3, 0xc1a3, 0xc1a3, 0xc1a3, + 0xc1a4, 0xc1a4, 0xc1a4, 0xc1a4, 0xc1a4, 0xc1a4, 0xc1a4, 0xc1a4, + 0xc1a5, 0xc1a5, 0xc1a5, 0xc1a5, 0xc1a5, 0xc1a5, 0xc1a5, 0xc1a6, + 0xc1a6, 0xc1a6, 0xc1a6, 0xc1a6, 0xc1a6, 0xc1a6, 0xc1a6, 0xc1a7, + 0xc1a7, 0xc1a7, 0xc1a7, 0xc1a7, 0xc1a7, 0xc1a7, 0xc1a8, 0xc1a8, + 0xc1a8, 0xc1a8, 0xc1a8, 0xc1a8, 0xc1a8, 0xc1a8, 0xc1a9, 0xc1a9, + 0xc1a9, 0xc1a9, 0xc1a9, 0xc1a9, 0xc1a9, 0xc1a9, 0xc1aa, 0xc1aa, + 0xc1aa, 0xc1aa, 0xc1aa, 0xc1aa, 0xc1aa, 0xc1aa, 0xc1ab, 0xc1ab, + 0xc1ab, 0xc1ab, 0xc1ab, 0xc1ab, 0xc1ab, 0xc1ac, 0xc1ac, 0xc1ac, + 0xc1ac, 0xc1ac, 0xc1ac, 0xc1ac, 0xc1ac, 0xc1ad, 0xc1ad, 0xc1ad, + 0xc1ad, 0xc1ad, 0xc1ad, 0xc1ad, 0xc1ad, 0xc1ae, 0xc1ae, 0xc1ae, + 0xc1ae, 0xc1ae, 0xc1ae, 0xc1ae, 0xc1ae, 0xc1af, 0xc1af, 0xc1af, + 0xc1af, 0xc1af, 0xc1af, 0xc1af, 0xc1af, 0xc1b0, 0xc1b0, 0xc1b0, + 0xc1b0, 0xc1b0, 0xc1b0, 0xc1b0, 0xc1b0, 0xc1b1, 0xc1b1, 0xc1b1, + 0xc1b1, 0xc1b1, 0xc1b1, 0xc1b1, 0xc1b1, 0xc1b2, 0xc1b2, 0xc1b2, + 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b3, 0xc1b3, 0xc1b3, + 0xc1b3, 0xc1b3, 0xc1b3, 0xc1b3, 0xc1b3, 0xc1b4, 0xc1b4, 0xc1b4, + 0xc1b4, 0xc1b4, 0xc1b4, 0xc1b4, 0xc1b4, 0xc1b5, 0xc1b5, 0xc1b5, + 0xc1b5, 0xc1b5, 0xc1b5, 0xc1b5, 0xc1b5, 0xc1b6, 0xc1b6, 0xc1b6, + 0xc1b6, 0xc1b6, 0xc1b6, 0xc1b6, 0xc1b6, 0xc1b7, 0xc1b7, 0xc1b7, + 0xc1b7, 0xc1b7, 0xc1b7, 0xc1b7, 0xc1b7, 0xc1b8, 0xc1b8, 0xc1b8, + 0xc1b8, 0xc1b8, 0xc1b8, 0xc1b8, 0xc1b8, 0xc1b9, 0xc1b9, 0xc1b9, + 0xc1b9, 0xc1b9, 0xc1b9, 0xc1b9, 0xc1b9, 0xc1b9, 0xc1ba, 0xc1ba, + 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1bb, 0xc1bb, + 0xc1bb, 0xc1bb, 0xc1bb, 0xc1bb, 0xc1bb, 0xc1bb, 0xc1bc, 0xc1bc, + 0xc1bc, 0xc1bc, 0xc1bc, 0xc1bc, 0xc1bc, 0xc1bc, 0xc1bc, 0xc1bd, + 0xc1bd, 0xc1bd, 0xc1bd, 0xc1bd, 0xc1bd, 0xc1bd, 0xc1bd, 0xc1be, + 0xc1be, 0xc1be, 0xc1be, 0xc1be, 0xc1be, 0xc1be, 0xc1be, 0xc1be, + 0xc1bf, 0xc1bf, 0xc1bf, 0xc1bf, 0xc1bf, 0xc1bf, 0xc1bf, 0xc1bf, + 0xc1c0, 0xc1c0, 0xc1c0, 0xc1c0, 0xc1c0, 0xc1c0, 0xc1c0, 0xc1c0, + 0xc1c0, 0xc1c1, 0xc1c1, 0xc1c1, 0xc1c1, 0xc1c1, 0xc1c1, 0xc1c1, + 0xc1c1, 0xc1c2, 0xc1c2, 0xc1c2, 0xc1c2, 0xc1c2, 0xc1c2, 0xc1c2, + 0xc1c2, 0xc1c2, 0xc1c3, 0xc1c3, 0xc1c3, 0xc1c3, 0xc1c3, 0xc1c3, + 0xc1c3, 0xc1c3, 0xc1c4, 0xc1c4, 0xc1c4, 0xc1c4, 0xc1c4, 0xc1c4, + 0xc1c4, 0xc1c4, 0xc1c4, 0xc1c5, 0xc1c5, 0xc1c5, 0xc1c5, 0xc1c5, + 0xc1c5, 0xc1c5, 0xc1c5, 0xc1c5, 0xc1c6, 0xc1c6, 0xc1c6, 0xc1c6, + 0xc1c6, 0xc1c6, 0xc1c6, 0xc1c6, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, + 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c8, 0xc1c8, 0xc1c8, + 0xc1c8, 0xc1c8, 0xc1c8, 0xc1c9, 0xc1c9, 0xc1c9, 0xc1c9, 0xc1c9, + 0xc1ca, 0xc1ca, 0xc1ca, 0xc1ca, 0xc1cb, 0xc1cb, 0xc1cb, 0xc1cb, + 0xc1cb, 0xc1cc, 0xc1cc, 0xc1cc, 0xc1cc, 0xc1cd, 0xc1cd, 0xc1cd, + 0xc1cd, 0xc1cd, 0xc1ce, 0xc1ce, 0xc1ce, 0xc1ce, 0xc1cf, 0xc1cf, + 0xc1cf, 0xc1cf, 0xc1cf, 0xc1d0, 0xc1d0, 0xc1d0, 0xc1d0, 0xc1d1, + 0xc1d1, 0xc1d1, 0xc1d1, 0xc1d1, 0xc1d2, 0xc1d2, 0xc1d2, 0xc1d2, + 0xc1d3, 0xc1d3, 0xc1d3, 0xc1d3, 0xc1d3, 0xc1d4, 0xc1d4, 0xc1d4, + 0xc1d4, 0xc1d4, 0xc1d5, 0xc1d5, 0xc1d5, 0xc1d5, 0xc1d6, 0xc1d6, + 0xc1d6, 0xc1d6, 0xc1d6, 0xc1d7, 0xc1d7, 0xc1d7, 0xc1d7, 0xc1d7, + 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d8, 0xc1d9, 0xc1d9, 0xc1d9, 0xc1d9, + 0xc1d9, 0xc1da, 0xc1da, 0xc1da, 0xc1da, 0xc1da, 0xc1db, 0xc1db, + 0xc1db, 0xc1db, 0xc1db, 0xc1dc, 0xc1dc, 0xc1dc, 0xc1dc, 0xc1dd, + 0xc1dd, 0xc1dd, 0xc1dd, 0xc1dd, 0xc1de, 0xc1de, 0xc1de, 0xc1de, + 0xc1de, 0xc1df, 0xc1df, 0xc1df, 0xc1df, 0xc1df, 0xc1e0, 0xc1e0, + 0xc1e0, 0xc1e0, 0xc1e0, 0xc1e1, 0xc1e1, 0xc1e1, 0xc1e1, 0xc1e1, + 0xc1e2, 0xc1e2, 0xc1e2, 0xc1e2, 0xc1e2, 0xc1e3, 0xc1e3, 0xc1e3, + 0xc1e3, 0xc1e3, 0xc1e4, 0xc1e4, 0xc1e4, 0xc1e4, 0xc1e5, 0xc1e5, + 0xc1e5, 0xc1e5, 0xc1e5, 0xc1e6, 0xc1e6, 0xc1e6, 0xc1e6, 0xc1e6, + 0xc1e7, 0xc1e7, 0xc1e7, 0xc1e7, 0xc1e7, 0xc1e8, 0xc1e8, 0xc1e8, + 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e9, 0xc1e9, 0xc1e9, 0xc1e9, 0xc1e9, + 0xc1ea, 0xc1ea, 0xc1ea, 0xc1ea, 0xc1ea, 0xc1eb, 0xc1eb, 0xc1eb, + 0xc1eb, 0xc1eb, 0xc1ec, 0xc1ec, 0xc1ec, 0xc1ec, 0xc1ec, 0xc1ed, + 0xc1ed, 0xc1ed, 0xc1ed, 0xc1ed, 0xc1ee, 0xc1ee, 0xc1ee, 0xc1ee, + 0xc1ee, 0xc1ef, 0xc1ef, 0xc1ef, 0xc1ef, 0xc1ef, 0xc1ef, 0xc1f0, + 0xc1f0, 0xc1f0, 0xc1f0, 0xc1f0, 0xc1f1, 0xc1f1, 0xc1f1, 0xc1f1, + 0xc1f1, 0xc1f2, 0xc1f2, 0xc1f2, 0xc1f2, 0xc1f2, 0xc1f3, 0xc1f3, + 0xc1f3, 0xc1f3, 0xc1f3, 0xc1f3, 0xc1f4, 0xc1f4, 0xc1f4, 0xc1f4, + 0xc1f4, 0xc1f5, 0xc1f5, 0xc1f5, 0xc1f5, 0xc1f5, 0xc1f6, 0xc1f6, + 0xc1f6, 0xc1f6, 0xc1f6, 0xc1f6, 0xc1f7, 0xc1f7, 0xc1f7, 0xc1f7, + 0xc1f7, 0xc1f8, 0xc1f8, 0xc1f8, 0xc1f8, 0xc1f8, 0xc1f9, 0xc1f9, + 0xc1f9, 0xc1f9, 0xc1f9, 0xc1f9, 0xc1fa, 0xc1fa, 0xc1fa, 0xc1fa, + 0xc1fa, 0xc1fb, 0xc1fb, 0xc1fb, 0xc1fb, 0xc1fb, 0xc1fb, 0xc1fc, + 0xc1fc, 0xc1fc, 0xc1fc, 0xc1fc, 0xc1fd, 0xc1fd, 0xc1fd, 0xc1fd, + 0xc1fd, 0xc1fd, 0xc1fe, 0xc1fe, 0xc1fe, 0xc1fe, 0xc1fe, 0xc1ff, + 0xc1ff, 0xc1ff, 0xc1ff, 0xc1ff, 0xc1ff, 0xc200, 0xc200, 0xc200, + 0xc200, 0xc200, 0xc200, 0xc201, 0xc201, 0xc201, 0xc201, 0xc201, + 0xc202, 0xc202, 0xc202, 0xc202, 0xc202, 0xc202, 0xc203, 0xc203, + 0xc203, 0xc203, 0xc203, 0xc204, 0xc204, 0xc204, 0xc204, 0xc204, + 0xc204, 0xc205, 0xc205, 0xc205, 0xc205, 0xc205, 0xc205, 0xc206, + 0xc206, 0xc206, 0xc206, 0xc206, 0xc206, 0xc207, 0xc207, 0xc207, + 0xc207, 0xc207, 0xc208, 0xc208, 0xc208, 0xc208, 0xc208, 0xc208, + 0xc209, 0xc209, 0xc209, 0xc209, 0xc209, 0xc209, 0xc20a, 0xc20a, + 0xc20a, 0xc20a, 0xc20a, 0xc20a, 0xc20b, 0xc20b, 0xc20b, 0xc20b, + 0xc20b, 0xc20b, 0xc20c, 0xc20c, 0xc20c, 0xc20c, 0xc20c, 0xc20c, + 0xc20d, 0xc20d, 0xc20d, 0xc20d, 0xc20d, 0xc20d, 0xc20e, 0xc20e, + 0xc20e, 0xc20e, 0xc20e, 0xc20f, 0xc20f, 0xc20f, 0xc20f, 0xc20f, + 0xc20f, 0xc210, 0xc210, 0xc210, 0xc210, 0xc210, 0xc210, 0xc211, + 0xc211, 0xc211, 0xc211, 0xc211, 0xc211, 0xc212, 0xc212, 0xc212, + 0xc212, 0xc212, 0xc212, 0xc212, 0xc213, 0xc213, 0xc213, 0xc213, + 0xc213, 0xc213, 0xc214, 0xc214, 0xc214, 0xc214, 0xc214, 0xc214, + 0xc215, 0xc215, 0xc215, 0xc215, 0xc215, 0xc215, 0xc216, 0xc216, + 0xc216, 0xc216, 0xc216, 0xc216, 0xc217, 0xc217, 0xc217, 0xc217, + 0xc217, 0xc217, 0xc218, 0xc218, 0xc218, 0xc218, 0xc218, 0xc218, + 0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc21a, + 0xc21a, 0xc21a, 0xc21a, 0xc21a, 0xc21a, 0xc21b, 0xc21b, 0xc21b, + 0xc21b, 0xc21b, 0xc21b, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, + 0xc21c, 0xc21d, 0xc21d, 0xc21d, 0xc21d, 0xc21d, 0xc21d, 0xc21d, + 0xc21e, 0xc21e, 0xc21e, 0xc21e, 0xc21e, 0xc21e, 0xc21f, 0xc21f, + 0xc21f, 0xc21f, 0xc21f, 0xc21f, 0xc21f, 0xc220, 0xc220, 0xc220, + 0xc220, 0xc220, 0xc220, 0xc221, 0xc221, 0xc221, 0xc221, 0xc221, + 0xc221, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, + 0xc223, 0xc223, 0xc223, 0xc223, 0xc223, 0xc223, 0xc224, 0xc224, + 0xc224, 0xc224, 0xc224, 0xc224, 0xc224, 0xc225, 0xc225, 0xc225, + 0xc225, 0xc225, 0xc225, 0xc225, 0xc226, 0xc226, 0xc226, 0xc226, + 0xc226, 0xc226, 0xc227, 0xc227, 0xc227, 0xc227, 0xc227, 0xc227, + 0xc227, 0xc228, 0xc228, 0xc228, 0xc228, 0xc228, 0xc228, 0xc229, + 0xc229, 0xc229, 0xc229, 0xc229, 0xc229, 0xc229, 0xc22a, 0xc22a, + 0xc22a, 0xc22a, 0xc22a, 0xc22a, 0xc22a, 0xc22b, 0xc22b, 0xc22b, + 0xc22b, 0xc22b, 0xc22b, 0xc22b, 0xc22c, 0xc22c, 0xc22c, 0xc22c, + 0xc22c, 0xc22c, 0xc22d, 0xc22d, 0xc22d, 0xc22d, 0xc22d, 0xc22d, + 0xc22d, 0xc22e, 0xc22e, 0xc22e, 0xc22e, 0xc22e, 0xc22e, 0xc22e, + 0xc22f, 0xc22f, 0xc22f, 0xc22f, 0xc22f, 0xc22f, 0xc22f, 0xc230, + 0xc230, 0xc230, 0xc230, 0xc230, 0xc230, 0xc230, 0xc231, 0xc231, + 0xc231, 0xc231, 0xc231, 0xc231, 0xc231, 0xc232, 0xc232, 0xc232, + 0xc232, 0xc232, 0xc232, 0xc232, 0xc233, 0xc233, 0xc233, 0xc233, + 0xc233, 0xc233, 0xc234, 0xc234, 0xc234, 0xc234, 0xc234, 0xc234, + 0xc234, 0xc234, 0xc235, 0xc235, 0xc235, 0xc235, 0xc235, 0xc235, + 0xc235, 0xc236, 0xc236, 0xc236, 0xc236, 0xc236, 0xc236, 0xc236, + 0xc237, 0xc237, 0xc237, 0xc237, 0xc237, 0xc237, 0xc237, 0xc238, + 0xc238, 0xc238, 0xc238, 0xc238, 0xc238, 0xc238, 0xc239, 0xc239, + 0xc239, 0xc239, 0xc239, 0xc239, 0xc239, 0xc23a, 0xc23a, 0xc23a, + 0xc23a, 0xc23a, 0xc23a, 0xc23a, 0xc23b, 0xc23b, 0xc23b, 0xc23b, + 0xc23b, 0xc23b, 0xc23b, 0xc23c, 0xc23c, 0xc23c, 0xc23c, 0xc23c, + 0xc23c, 0xc23c, 0xc23c, 0xc23d, 0xc23d, 0xc23d, 0xc23d, 0xc23d, + 0xc23d, 0xc23d, 0xc23e, 0xc23e, 0xc23e, 0xc23e, 0xc23e, 0xc23e, + 0xc23e, 0xc23f, 0xc23f, 0xc23f, 0xc23f, 0xc23f, 0xc23f, 0xc23f, + 0xc23f, 0xc240, 0xc240, 0xc240, 0xc240, 0xc240, 0xc240, 0xc240, + 0xc241, 0xc241, 0xc241, 0xc241, 0xc241, 0xc241, 0xc241, 0xc242, + 0xc242, 0xc242, 0xc242, 0xc242, 0xc242, 0xc242, 0xc242, 0xc243, + 0xc243, 0xc243, 0xc243, 0xc243, 0xc243, 0xc243, 0xc244, 0xc244, + 0xc244, 0xc244, 0xc244, 0xc244, 0xc244, 0xc244, 0xc245, 0xc245, + 0xc245, 0xc245, 0xc245, 0xc245, 0xc245, 0xc246, 0xc246, 0xc246, + 0xc246, 0xc246, 0xc246, 0xc246, 0xc246, 0xc247, 0xc247, 0xc247, + 0xc247, 0xc247, 0xc247, 0xc247, 0xc248, 0xc248, 0xc248, 0xc248, + 0xc248, 0xc248, 0xc248, 0xc248, 0xc249, 0xc249, 0xc249, 0xc249, + 0xc249, 0xc249, 0xc249, 0xc249, 0xc24a, 0xc24a, 0xc24a, 0xc24a, + 0xc24a, 0xc24a, 0xc24a, 0xc24b, 0xc24b, 0xc24b, 0xc24b, 0xc24b, + 0xc24b, 0xc24b, 0xc24b, 0xc24c, 0xc24c, 0xc24c, 0xc24c, 0xc24c, + 0xc24c, 0xc24c, 0xc24c, 0xc24d, 0xc24d, 0xc24d, 0xc24d, 0xc24d, + 0xc24d, 0xc24d, 0xc24d, 0xc24e, 0xc24e, 0xc24e, 0xc24e, 0xc24e, + 0xc24e, 0xc24e, 0xc24e, 0xc24f, 0xc24f, 0xc24f, 0xc24f, 0xc24f, + 0xc24f, 0xc24f, 0xc250, 0xc250, 0xc250, 0xc250, 0xc250, 0xc250, + 0xc250, 0xc250, 0xc251, 0xc251, 0xc251, 0xc251, 0xc251, 0xc251, + 0xc251, 0xc251, 0xc252, 0xc252, 0xc252, 0xc252, 0xc252, 0xc252, + 0xc252, 0xc252, 0xc253, 0xc253, 0xc253, 0xc253, 0xc253, 0xc253, + 0xc253, 0xc253, 0xc254, 0xc254, 0xc254, 0xc254, 0xc254, 0xc254, + 0xc254, 0xc254, 0xc255, 0xc255, 0xc255, 0xc255, 0xc255, 0xc255, + 0xc255, 0xc255, 0xc256, 0xc256, 0xc256, 0xc256, 0xc256, 0xc256, + 0xc256, 0xc256, 0xc257, 0xc257, 0xc257, 0xc257, 0xc257, 0xc257, + 0xc257, 0xc257, 0xc257, 0xc258, 0xc258, 0xc258, 0xc258, 0xc258, + 0xc258, 0xc258, 0xc258, 0xc259, 0xc259, 0xc259, 0xc259, 0xc259, + 0xc259, 0xc259, 0xc259, 0xc25a, 0xc25a, 0xc25a, 0xc25a, 0xc25a, + 0xc25a, 0xc25a, 0xc25a, 0xc25b, 0xc25b, 0xc25b, 0xc25b, 0xc25b, + 0xc25b, 0xc25b, 0xc25b, 0xc25c, 0xc25c, 0xc25c, 0xc25c, 0xc25c, + 0xc25c, 0xc25c, 0xc25c, 0xc25c, 0xc25d, 0xc25d, 0xc25d, 0xc25d, + 0xc25d, 0xc25d, 0xc25d, 0xc25d, 0xc25e, 0xc25e, 0xc25e, 0xc25e, + 0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc25f, 0xc25f, 0xc25f, 0xc25f, + 0xc25f, 0xc25f, 0xc25f, 0xc25f, 0xc25f, 0xc260, 0xc260, 0xc260, + 0xc260, 0xc260, 0xc260, 0xc260, 0xc260, 0xc261, 0xc261, 0xc261, + 0xc261, 0xc261, 0xc261, 0xc261, 0xc261, 0xc261, 0xc262, 0xc262, + 0xc262, 0xc262, 0xc262, 0xc262, 0xc262, 0xc262, 0xc263, 0xc263, + 0xc263, 0xc263, 0xc263, 0xc263, 0xc263, 0xc263, 0xc263, 0xc264, + 0xc264, 0xc264, 0xc264, 0xc264, 0xc264, 0xc264, 0xc264, 0xc264, + 0xc265, 0xc265, 0xc265, 0xc265, 0xc265, 0xc265, 0xc265, 0xc265, + 0xc266, 0xc266, 0xc266, 0xc266, 0xc266, 0xc266, 0xc266, 0xc266, + 0xc266, 0xc267, 0xc267, 0xc267, 0xc267, 0xc267, 0xc267, 0xc267, + 0xc267, 0xc267, 0xc268, 0xc268, 0xc268, 0xc268, 0xc268, 0xc268, + 0xc268, 0xc268, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, + 0xc269, 0xc269, 0xc26a, 0xc26a, 0xc26a, 0xc26a, 0xc26b, 0xc26b, + 0xc26b, 0xc26b, 0xc26b, 0xc26c, 0xc26c, 0xc26c, 0xc26c, 0xc26d, + 0xc26d, 0xc26d, 0xc26d, 0xc26d, 0xc26e, 0xc26e, 0xc26e, 0xc26e, + 0xc26f, 0xc26f, 0xc26f, 0xc26f, 0xc26f, 0xc270, 0xc270, 0xc270, + 0xc270, 0xc271, 0xc271, 0xc271, 0xc271, 0xc271, 0xc272, 0xc272, + 0xc272, 0xc272, 0xc273, 0xc273, 0xc273, 0xc273, 0xc273, 0xc274, + 0xc274, 0xc274, 0xc274, 0xc275, 0xc275, 0xc275, 0xc275, 0xc275, + 0xc276, 0xc276, 0xc276, 0xc276, 0xc276, 0xc277, 0xc277, 0xc277, + 0xc277, 0xc278, 0xc278, 0xc278, 0xc278, 0xc278, 0xc279, 0xc279, + 0xc279, 0xc279, 0xc279, 0xc27a, 0xc27a, 0xc27a, 0xc27a, 0xc27a, + 0xc27b, 0xc27b, 0xc27b, 0xc27b, 0xc27c, 0xc27c, 0xc27c, 0xc27c, + 0xc27c, 0xc27d, 0xc27d, 0xc27d, 0xc27d, 0xc27d, 0xc27e, 0xc27e, + 0xc27e, 0xc27e, 0xc27e, 0xc27f, 0xc27f, 0xc27f, 0xc27f, 0xc280, + 0xc280, 0xc280, 0xc280, 0xc280, 0xc281, 0xc281, 0xc281, 0xc281, + 0xc281, 0xc282, 0xc282, 0xc282, 0xc282, 0xc282, 0xc283, 0xc283, + 0xc283, 0xc283, 0xc283, 0xc284, 0xc284, 0xc284, 0xc284, 0xc284, + 0xc285, 0xc285, 0xc285, 0xc285, 0xc285, 0xc286, 0xc286, 0xc286, + 0xc286, 0xc286, 0xc287, 0xc287, 0xc287, 0xc287, 0xc287, 0xc288, + 0xc288, 0xc288, 0xc288, 0xc288, 0xc289, 0xc289, 0xc289, 0xc289, + 0xc289, 0xc28a, 0xc28a, 0xc28a, 0xc28a, 0xc28a, 0xc28b, 0xc28b, + 0xc28b, 0xc28b, 0xc28b, 0xc28c, 0xc28c, 0xc28c, 0xc28c, 0xc28c, + 0xc28d, 0xc28d, 0xc28d, 0xc28d, 0xc28d, 0xc28e, 0xc28e, 0xc28e, + 0xc28e, 0xc28e, 0xc28e, 0xc28f, 0xc28f, 0xc28f, 0xc28f, 0xc28f, + 0xc290, 0xc290, 0xc290, 0xc290, 0xc290, 0xc291, 0xc291, 0xc291, + 0xc291, 0xc291, 0xc292, 0xc292, 0xc292, 0xc292, 0xc292, 0xc293, + 0xc293, 0xc293, 0xc293, 0xc293, 0xc293, 0xc294, 0xc294, 0xc294, + 0xc294, 0xc294, 0xc295, 0xc295, 0xc295, 0xc295, 0xc295, 0xc296, + 0xc296, 0xc296, 0xc296, 0xc296, 0xc296, 0xc297, 0xc297, 0xc297, + 0xc297, 0xc297, 0xc298, 0xc298, 0xc298, 0xc298, 0xc298, 0xc299, + 0xc299, 0xc299, 0xc299, 0xc299, 0xc299, 0xc29a, 0xc29a, 0xc29a, + 0xc29a, 0xc29a, 0xc29b, 0xc29b, 0xc29b, 0xc29b, 0xc29b, 0xc29b, + 0xc29c, 0xc29c, 0xc29c, 0xc29c, 0xc29c, 0xc29d, 0xc29d, 0xc29d, + 0xc29d, 0xc29d, 0xc29d, 0xc29e, 0xc29e, 0xc29e, 0xc29e, 0xc29e, + 0xc29f, 0xc29f, 0xc29f, 0xc29f, 0xc29f, 0xc29f, 0xc2a0, 0xc2a0, + 0xc2a0, 0xc2a0, 0xc2a0, 0xc2a1, 0xc2a1, 0xc2a1, 0xc2a1, 0xc2a1, + 0xc2a1, 0xc2a2, 0xc2a2, 0xc2a2, 0xc2a2, 0xc2a2, 0xc2a3, 0xc2a3, + 0xc2a3, 0xc2a3, 0xc2a3, 0xc2a3, 0xc2a4, 0xc2a4, 0xc2a4, 0xc2a4, + 0xc2a4, 0xc2a4, 0xc2a5, 0xc2a5, 0xc2a5, 0xc2a5, 0xc2a5, 0xc2a6, + 0xc2a6, 0xc2a6, 0xc2a6, 0xc2a6, 0xc2a6, 0xc2a7, 0xc2a7, 0xc2a7, + 0xc2a7, 0xc2a7, 0xc2a7, 0xc2a8, 0xc2a8, 0xc2a8, 0xc2a8, 0xc2a8, + 0xc2a8, 0xc2a9, 0xc2a9, 0xc2a9, 0xc2a9, 0xc2a9, 0xc2aa, 0xc2aa, + 0xc2aa, 0xc2aa, 0xc2aa, 0xc2aa, 0xc2ab, 0xc2ab, 0xc2ab, 0xc2ab, + 0xc2ab, 0xc2ab, 0xc2ac, 0xc2ac, 0xc2ac, 0xc2ac, 0xc2ac, 0xc2ac, + 0xc2ad, 0xc2ad, 0xc2ad, 0xc2ad, 0xc2ad, 0xc2ad, 0xc2ae, 0xc2ae, + 0xc2ae, 0xc2ae, 0xc2ae, 0xc2ae, 0xc2af, 0xc2af, 0xc2af, 0xc2af, + 0xc2af, 0xc2af, 0xc2b0, 0xc2b0, 0xc2b0, 0xc2b0, 0xc2b0, 0xc2b0, + 0xc2b1, 0xc2b1, 0xc2b1, 0xc2b1, 0xc2b1, 0xc2b1, 0xc2b2, 0xc2b2, + 0xc2b2, 0xc2b2, 0xc2b2, 0xc2b2, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, + 0xc2b3, 0xc2b3, 0xc2b4, 0xc2b4, 0xc2b4, 0xc2b4, 0xc2b4, 0xc2b4, + 0xc2b5, 0xc2b5, 0xc2b5, 0xc2b5, 0xc2b5, 0xc2b5, 0xc2b6, 0xc2b6, + 0xc2b6, 0xc2b6, 0xc2b6, 0xc2b6, 0xc2b7, 0xc2b7, 0xc2b7, 0xc2b7, + 0xc2b7, 0xc2b7, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, + 0xc2b9, 0xc2b9, 0xc2b9, 0xc2b9, 0xc2b9, 0xc2b9, 0xc2ba, 0xc2ba, + 0xc2ba, 0xc2ba, 0xc2ba, 0xc2ba, 0xc2ba, 0xc2bb, 0xc2bb, 0xc2bb, + 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bc, 0xc2bc, 0xc2bc, 0xc2bc, 0xc2bc, + 0xc2bc, 0xc2bd, 0xc2bd, 0xc2bd, 0xc2bd, 0xc2bd, 0xc2bd, 0xc2bd, + 0xc2be, 0xc2be, 0xc2be, 0xc2be, 0xc2be, 0xc2be, 0xc2bf, 0xc2bf, + 0xc2bf, 0xc2bf, 0xc2bf, 0xc2bf, 0xc2c0, 0xc2c0, 0xc2c0, 0xc2c0, + 0xc2c0, 0xc2c0, 0xc2c0, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1, + 0xc2c1, 0xc2c2, 0xc2c2, 0xc2c2, 0xc2c2, 0xc2c2, 0xc2c2, 0xc2c3, + 0xc2c3, 0xc2c3, 0xc2c3, 0xc2c3, 0xc2c3, 0xc2c3, 0xc2c4, 0xc2c4, + 0xc2c4, 0xc2c4, 0xc2c4, 0xc2c4, 0xc2c5, 0xc2c5, 0xc2c5, 0xc2c5, + 0xc2c5, 0xc2c5, 0xc2c5, 0xc2c6, 0xc2c6, 0xc2c6, 0xc2c6, 0xc2c6, + 0xc2c6, 0xc2c6, 0xc2c7, 0xc2c7, 0xc2c7, 0xc2c7, 0xc2c7, 0xc2c7, + 0xc2c8, 0xc2c8, 0xc2c8, 0xc2c8, 0xc2c8, 0xc2c8, 0xc2c8, 0xc2c9, + 0xc2c9, 0xc2c9, 0xc2c9, 0xc2c9, 0xc2c9, 0xc2ca, 0xc2ca, 0xc2ca, + 0xc2ca, 0xc2ca, 0xc2ca, 0xc2ca, 0xc2cb, 0xc2cb, 0xc2cb, 0xc2cb, + 0xc2cb, 0xc2cb, 0xc2cb, 0xc2cc, 0xc2cc, 0xc2cc, 0xc2cc, 0xc2cc, + 0xc2cc, 0xc2cd, 0xc2cd, 0xc2cd, 0xc2cd, 0xc2cd, 0xc2cd, 0xc2cd, + 0xc2ce, 0xc2ce, 0xc2ce, 0xc2ce, 0xc2ce, 0xc2ce, 0xc2ce, 0xc2cf, + 0xc2cf, 0xc2cf, 0xc2cf, 0xc2cf, 0xc2cf, 0xc2cf, 0xc2d0, 0xc2d0, + 0xc2d0, 0xc2d0, 0xc2d0, 0xc2d0, 0xc2d0, 0xc2d1, 0xc2d1, 0xc2d1, + 0xc2d1, 0xc2d1, 0xc2d1, 0xc2d1, 0xc2d2, 0xc2d2, 0xc2d2, 0xc2d2, + 0xc2d2, 0xc2d2, 0xc2d3, 0xc2d3, 0xc2d3, 0xc2d3, 0xc2d3, 0xc2d3, + 0xc2d3, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, + 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d6, + 0xc2d6, 0xc2d6, 0xc2d6, 0xc2d6, 0xc2d6, 0xc2d6, 0xc2d7, 0xc2d7, + 0xc2d7, 0xc2d7, 0xc2d7, 0xc2d7, 0xc2d7, 0xc2d8, 0xc2d8, 0xc2d8, + 0xc2d8, 0xc2d8, 0xc2d8, 0xc2d8, 0xc2d9, 0xc2d9, 0xc2d9, 0xc2d9, + 0xc2d9, 0xc2d9, 0xc2d9, 0xc2d9, 0xc2da, 0xc2da, 0xc2da, 0xc2da, + 0xc2da, 0xc2da, 0xc2da, 0xc2db, 0xc2db, 0xc2db, 0xc2db, 0xc2db, + 0xc2db, 0xc2db, 0xc2dc, 0xc2dc, 0xc2dc, 0xc2dc, 0xc2dc, 0xc2dc, + 0xc2dc, 0xc2dd, 0xc2dd, 0xc2dd, 0xc2dd, 0xc2dd, 0xc2dd, 0xc2dd, + 0xc2de, 0xc2de, 0xc2de, 0xc2de, 0xc2de, 0xc2de, 0xc2de, 0xc2de, + 0xc2df, 0xc2df, 0xc2df, 0xc2df, 0xc2df, 0xc2df, 0xc2df, 0xc2e0, + 0xc2e0, 0xc2e0, 0xc2e0, 0xc2e0, 0xc2e0, 0xc2e0, 0xc2e1, 0xc2e1, + 0xc2e1, 0xc2e1, 0xc2e1, 0xc2e1, 0xc2e1, 0xc2e1, 0xc2e2, 0xc2e2, + 0xc2e2, 0xc2e2, 0xc2e2, 0xc2e2, 0xc2e2, 0xc2e3, 0xc2e3, 0xc2e3, + 0xc2e3, 0xc2e3, 0xc2e3, 0xc2e3, 0xc2e4, 0xc2e4, 0xc2e4, 0xc2e4, + 0xc2e4, 0xc2e4, 0xc2e4, 0xc2e4, 0xc2e5, 0xc2e5, 0xc2e5, 0xc2e5, + 0xc2e5, 0xc2e5, 0xc2e5, 0xc2e6, 0xc2e6, 0xc2e6, 0xc2e6, 0xc2e6, + 0xc2e6, 0xc2e6, 0xc2e6, 0xc2e7, 0xc2e7, 0xc2e7, 0xc2e7, 0xc2e7, + 0xc2e7, 0xc2e7, 0xc2e8, 0xc2e8, 0xc2e8, 0xc2e8, 0xc2e8, 0xc2e8, + 0xc2e8, 0xc2e8, 0xc2e9, 0xc2e9, 0xc2e9, 0xc2e9, 0xc2e9, 0xc2e9, + 0xc2e9, 0xc2e9, 0xc2ea, 0xc2ea, 0xc2ea, 0xc2ea, 0xc2ea, 0xc2ea, + 0xc2ea, 0xc2eb, 0xc2eb, 0xc2eb, 0xc2eb, 0xc2eb, 0xc2eb, 0xc2eb, + 0xc2eb, 0xc2ec, 0xc2ec, 0xc2ec, 0xc2ec, 0xc2ec, 0xc2ec, 0xc2ec, + 0xc2ec, 0xc2ed, 0xc2ed, 0xc2ed, 0xc2ed, 0xc2ed, 0xc2ed, 0xc2ed, + 0xc2ee, 0xc2ee, 0xc2ee, 0xc2ee, 0xc2ee, 0xc2ee, 0xc2ee, 0xc2ee, + 0xc2ef, 0xc2ef, 0xc2ef, 0xc2ef, 0xc2ef, 0xc2ef, 0xc2ef, 0xc2ef, + 0xc2f0, 0xc2f0, 0xc2f0, 0xc2f0, 0xc2f0, 0xc2f0, 0xc2f0, 0xc2f0, + 0xc2f1, 0xc2f1, 0xc2f1, 0xc2f1, 0xc2f1, 0xc2f1, 0xc2f1, 0xc2f1, + 0xc2f2, 0xc2f2, 0xc2f2, 0xc2f2, 0xc2f2, 0xc2f2, 0xc2f2, 0xc2f2, + 0xc2f3, 0xc2f3, 0xc2f3, 0xc2f3, 0xc2f3, 0xc2f3, 0xc2f3, 0xc2f3, + 0xc2f4, 0xc2f4, 0xc2f4, 0xc2f4, 0xc2f4, 0xc2f4, 0xc2f4, 0xc2f4, + 0xc2f5, 0xc2f5, 0xc2f5, 0xc2f5, 0xc2f5, 0xc2f5, 0xc2f5, 0xc2f5, + 0xc2f6, 0xc2f6, 0xc2f6, 0xc2f6, 0xc2f6, 0xc2f6, 0xc2f6, 0xc2f6, + 0xc2f7, 0xc2f7, 0xc2f7, 0xc2f7, 0xc2f7, 0xc2f7, 0xc2f7, 0xc2f7, + 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, + 0xc2f9, 0xc2f9, 0xc2f9, 0xc2f9, 0xc2f9, 0xc2f9, 0xc2f9, 0xc2f9, + 0xc2fa, 0xc2fa, 0xc2fa, 0xc2fa, 0xc2fa, 0xc2fa, 0xc2fa, 0xc2fa, + 0xc2fb, 0xc2fb, 0xc2fb, 0xc2fb, 0xc2fb, 0xc2fb, 0xc2fb, 0xc2fb, + 0xc2fb, 0xc2fc, 0xc2fc, 0xc2fc, 0xc2fc, 0xc2fc, 0xc2fc, 0xc2fc, + 0xc2fc, 0xc2fd, 0xc2fd, 0xc2fd, 0xc2fd, 0xc2fd, 0xc2fd, 0xc2fd, + 0xc2fd, 0xc2fe, 0xc2fe, 0xc2fe, 0xc2fe, 0xc2fe, 0xc2fe, 0xc2fe, + 0xc2fe, 0xc2ff, 0xc2ff, 0xc2ff, 0xc2ff, 0xc2ff, 0xc2ff, 0xc2ff, + 0xc2ff, 0xc2ff, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, 0xc300, + 0xc300, 0xc300, 0xc301, 0xc301, 0xc301, 0xc301, 0xc301, 0xc301, + 0xc301, 0xc301, 0xc301, 0xc302, 0xc302, 0xc302, 0xc302, 0xc302, + 0xc302, 0xc302, 0xc302, 0xc303, 0xc303, 0xc303, 0xc303, 0xc303, + 0xc303, 0xc303, 0xc303, 0xc303, 0xc304, 0xc304, 0xc304, 0xc304, + 0xc304, 0xc304, 0xc304, 0xc304, 0xc305, 0xc305, 0xc305, 0xc305, + 0xc305, 0xc305, 0xc305, 0xc305, 0xc305, 0xc306, 0xc306, 0xc306, + 0xc306, 0xc306, 0xc306, 0xc306, 0xc306, 0xc307, 0xc307, 0xc307, + 0xc307, 0xc307, 0xc307, 0xc307, 0xc307, 0xc307, 0xc308, 0xc308, + 0xc308, 0xc308, 0xc308, 0xc308, 0xc308, 0xc308, 0xc308, 0xc309, + 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, + 0xc30a, 0xc30a, 0xc30a, 0xc30a, 0xc30a, 0xc30a, 0xc30a, 0xc30a, + 0xc30b, 0xc30b, 0xc30b, 0xc30b, 0xc30b, 0xc30c, 0xc30c, 0xc30c, + 0xc30c, 0xc30d, 0xc30d, 0xc30d, 0xc30d, 0xc30d, 0xc30e, 0xc30e, + 0xc30e, 0xc30e, 0xc30f, 0xc30f, 0xc30f, 0xc30f, 0xc30f, 0xc310, + 0xc310, 0xc310, 0xc310, 0xc311, 0xc311, 0xc311, 0xc311, 0xc311, + 0xc312, 0xc312, 0xc312, 0xc312, 0xc313, 0xc313, 0xc313, 0xc313, + 0xc313, 0xc314, 0xc314, 0xc314, 0xc314, 0xc315, 0xc315, 0xc315, + 0xc315, 0xc315, 0xc316, 0xc316, 0xc316, 0xc316, 0xc316, 0xc317, + 0xc317, 0xc317, 0xc317, 0xc318, 0xc318, 0xc318, 0xc318, 0xc318, + 0xc319, 0xc319, 0xc319, 0xc319, 0xc319, 0xc31a, 0xc31a, 0xc31a, + 0xc31a, 0xc31b, 0xc31b, 0xc31b, 0xc31b, 0xc31b, 0xc31c, 0xc31c, + 0xc31c, 0xc31c, 0xc31c, 0xc31d, 0xc31d, 0xc31d, 0xc31d, 0xc31d, + 0xc31e, 0xc31e, 0xc31e, 0xc31e, 0xc31f, 0xc31f, 0xc31f, 0xc31f, + 0xc31f, 0xc320, 0xc320, 0xc320, 0xc320, 0xc320, 0xc321, 0xc321, + 0xc321, 0xc321, 0xc321, 0xc322, 0xc322, 0xc322, 0xc322, 0xc322, + 0xc323, 0xc323, 0xc323, 0xc323, 0xc323, 0xc324, 0xc324, 0xc324, + 0xc324, 0xc325, 0xc325, 0xc325, 0xc325, 0xc325, 0xc326, 0xc326, + 0xc326, 0xc326, 0xc326, 0xc327, 0xc327, 0xc327, 0xc327, 0xc327, + 0xc328, 0xc328, 0xc328, 0xc328, 0xc328, 0xc329, 0xc329, 0xc329, + 0xc329, 0xc329, 0xc32a, 0xc32a, 0xc32a, 0xc32a, 0xc32a, 0xc32b, + 0xc32b, 0xc32b, 0xc32b, 0xc32b, 0xc32c, 0xc32c, 0xc32c, 0xc32c, + 0xc32c, 0xc32c, 0xc32d, 0xc32d, 0xc32d, 0xc32d, 0xc32d, 0xc32e, + 0xc32e, 0xc32e, 0xc32e, 0xc32e, 0xc32f, 0xc32f, 0xc32f, 0xc32f, + 0xc32f, 0xc330, 0xc330, 0xc330, 0xc330, 0xc330, 0xc331, 0xc331, + 0xc331, 0xc331, 0xc331, 0xc332, 0xc332, 0xc332, 0xc332, 0xc332, + 0xc333, 0xc333, 0xc333, 0xc333, 0xc333, 0xc333, 0xc334, 0xc334, + 0xc334, 0xc334, 0xc334, 0xc335, 0xc335, 0xc335, 0xc335, 0xc335, + 0xc336, 0xc336, 0xc336, 0xc336, 0xc336, 0xc336, 0xc337, 0xc337, + 0xc337, 0xc337, 0xc337, 0xc338, 0xc338, 0xc338, 0xc338, 0xc338, + 0xc339, 0xc339, 0xc339, 0xc339, 0xc339, 0xc339, 0xc33a, 0xc33a, + 0xc33a, 0xc33a, 0xc33a, 0xc33b, 0xc33b, 0xc33b, 0xc33b, 0xc33b, + 0xc33c, 0xc33c, 0xc33c, 0xc33c, 0xc33c, 0xc33c, 0xc33d, 0xc33d, + 0xc33d, 0xc33d, 0xc33d, 0xc33e, 0xc33e, 0xc33e, 0xc33e, 0xc33e, + 0xc33e, 0xc33f, 0xc33f, 0xc33f, 0xc33f, 0xc33f, 0xc340, 0xc340, + 0xc340, 0xc340, 0xc340, 0xc340, 0xc341, 0xc341, 0xc341, 0xc341, + 0xc341, 0xc342, 0xc342, 0xc342, 0xc342, 0xc342, 0xc342, 0xc343, + 0xc343, 0xc343, 0xc343, 0xc343, 0xc343, 0xc344, 0xc344, 0xc344, + 0xc344, 0xc344, 0xc345, 0xc345, 0xc345, 0xc345, 0xc345, 0xc345, + 0xc346, 0xc346, 0xc346, 0xc346, 0xc346, 0xc346, 0xc347, 0xc347, + 0xc347, 0xc347, 0xc347, 0xc348, 0xc348, 0xc348, 0xc348, 0xc348, + 0xc348, 0xc349, 0xc349, 0xc349, 0xc349, 0xc349, 0xc349, 0xc34a, + 0xc34a, 0xc34a, 0xc34a, 0xc34a, 0xc34a, 0xc34b, 0xc34b, 0xc34b, + 0xc34b, 0xc34b, 0xc34c, 0xc34c, 0xc34c, 0xc34c, 0xc34c, 0xc34c, + 0xc34d, 0xc34d, 0xc34d, 0xc34d, 0xc34d, 0xc34d, 0xc34e, 0xc34e, + 0xc34e, 0xc34e, 0xc34e, 0xc34e, 0xc34f, 0xc34f, 0xc34f, 0xc34f, + 0xc34f, 0xc34f, 0xc350, 0xc350, 0xc350, 0xc350, 0xc350, 0xc350, + 0xc351, 0xc351, 0xc351, 0xc351, 0xc351, 0xc351, 0xc352, 0xc352, + 0xc352, 0xc352, 0xc352, 0xc352, 0xc353, 0xc353, 0xc353, 0xc353, + 0xc353, 0xc353, 0xc354, 0xc354, 0xc354, 0xc354, 0xc354, 0xc354, + 0xc355, 0xc355, 0xc355, 0xc355, 0xc355, 0xc355, 0xc356, 0xc356, + 0xc356, 0xc356, 0xc356, 0xc356, 0xc357, 0xc357, 0xc357, 0xc357, + 0xc357, 0xc357, 0xc358, 0xc358, 0xc358, 0xc358, 0xc358, 0xc358, + 0xc359, 0xc359, 0xc359, 0xc359, 0xc359, 0xc359, 0xc35a, 0xc35a, + 0xc35a, 0xc35a, 0xc35a, 0xc35a, 0xc35b, 0xc35b, 0xc35b, 0xc35b, + 0xc35b, 0xc35b, 0xc35b, 0xc35c, 0xc35c, 0xc35c, 0xc35c, 0xc35c, + 0xc35c, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35e, + 0xc35e, 0xc35e, 0xc35e, 0xc35e, 0xc35e, 0xc35e, 0xc35f, 0xc35f, + 0xc35f, 0xc35f, 0xc35f, 0xc35f, 0xc360, 0xc360, 0xc360, 0xc360, + 0xc360, 0xc360, 0xc361, 0xc361, 0xc361, 0xc361, 0xc361, 0xc361, + 0xc361, 0xc362, 0xc362, 0xc362, 0xc362, 0xc362, 0xc362, 0xc363, + 0xc363, 0xc363, 0xc363, 0xc363, 0xc363, 0xc364, 0xc364, 0xc364, + 0xc364, 0xc364, 0xc364, 0xc364, 0xc365, 0xc365, 0xc365, 0xc365, + 0xc365, 0xc365, 0xc366, 0xc366, 0xc366, 0xc366, 0xc366, 0xc366, + 0xc366, 0xc367, 0xc367, 0xc367, 0xc367, 0xc367, 0xc367, 0xc368, + 0xc368, 0xc368, 0xc368, 0xc368, 0xc368, 0xc368, 0xc369, 0xc369, + 0xc369, 0xc369, 0xc369, 0xc369, 0xc369, 0xc36a, 0xc36a, 0xc36a, + 0xc36a, 0xc36a, 0xc36a, 0xc36b, 0xc36b, 0xc36b, 0xc36b, 0xc36b, + 0xc36b, 0xc36b, 0xc36c, 0xc36c, 0xc36c, 0xc36c, 0xc36c, 0xc36c, + 0xc36c, 0xc36d, 0xc36d, 0xc36d, 0xc36d, 0xc36d, 0xc36d, 0xc36e, + 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36f, 0xc36f, + 0xc36f, 0xc36f, 0xc36f, 0xc36f, 0xc36f, 0xc370, 0xc370, 0xc370, + 0xc370, 0xc370, 0xc370, 0xc370, 0xc371, 0xc371, 0xc371, 0xc371, + 0xc371, 0xc371, 0xc372, 0xc372, 0xc372, 0xc372, 0xc372, 0xc372, + 0xc372, 0xc373, 0xc373, 0xc373, 0xc373, 0xc373, 0xc373, 0xc373, + 0xc374, 0xc374, 0xc374, 0xc374, 0xc374, 0xc374, 0xc374, 0xc375, + 0xc375, 0xc375, 0xc375, 0xc375, 0xc375, 0xc375, 0xc376, 0xc376, + 0xc376, 0xc376, 0xc376, 0xc376, 0xc376, 0xc377, 0xc377, 0xc377, + 0xc377, 0xc377, 0xc377, 0xc377, 0xc378, 0xc378, 0xc378, 0xc378, + 0xc378, 0xc378, 0xc378, 0xc379, 0xc379, 0xc379, 0xc379, 0xc379, + 0xc379, 0xc379, 0xc37a, 0xc37a, 0xc37a, 0xc37a, 0xc37a, 0xc37a, + 0xc37a, 0xc37b, 0xc37b, 0xc37b, 0xc37b, 0xc37b, 0xc37b, 0xc37b, + 0xc37c, 0xc37c, 0xc37c, 0xc37c, 0xc37c, 0xc37c, 0xc37c, 0xc37c, + 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37e, + 0xc37e, 0xc37e, 0xc37e, 0xc37e, 0xc37e, 0xc37e, 0xc37f, 0xc37f, + 0xc37f, 0xc37f, 0xc37f, 0xc37f, 0xc37f, 0xc380, 0xc380, 0xc380, + 0xc380, 0xc380, 0xc380, 0xc380, 0xc380, 0xc381, 0xc381, 0xc381, + 0xc381, 0xc381, 0xc381, 0xc381, 0xc382, 0xc382, 0xc382, 0xc382, + 0xc382, 0xc382, 0xc382, 0xc383, 0xc383, 0xc383, 0xc383, 0xc383, + 0xc383, 0xc383, 0xc383, 0xc384, 0xc384, 0xc384, 0xc384, 0xc384, + 0xc384, 0xc384, 0xc385, 0xc385, 0xc385, 0xc385, 0xc385, 0xc385, + 0xc385, 0xc385, 0xc386, 0xc386, 0xc386, 0xc386, 0xc386, 0xc386, + 0xc386, 0xc387, 0xc387, 0xc387, 0xc387, 0xc387, 0xc387, 0xc387, + 0xc387, 0xc388, 0xc388, 0xc388, 0xc388, 0xc388, 0xc388, 0xc388, + 0xc389, 0xc389, 0xc389, 0xc389, 0xc389, 0xc389, 0xc389, 0xc389, + 0xc38a, 0xc38a, 0xc38a, 0xc38a, 0xc38a, 0xc38a, 0xc38a, 0xc38b, + 0xc38b, 0xc38b, 0xc38b, 0xc38b, 0xc38b, 0xc38b, 0xc38b, 0xc38c, + 0xc38c, 0xc38c, 0xc38c, 0xc38c, 0xc38c, 0xc38c, 0xc38c, 0xc38d, + 0xc38d, 0xc38d, 0xc38d, 0xc38d, 0xc38d, 0xc38d, 0xc38e, 0xc38e, + 0xc38e, 0xc38e, 0xc38e, 0xc38e, 0xc38e, 0xc38e, 0xc38f, 0xc38f, + 0xc38f, 0xc38f, 0xc38f, 0xc38f, 0xc38f, 0xc38f, 0xc390, 0xc390, + 0xc390, 0xc390, 0xc390, 0xc390, 0xc390, 0xc390, 0xc391, 0xc391, + 0xc391, 0xc391, 0xc391, 0xc391, 0xc391, 0xc392, 0xc392, 0xc392, + 0xc392, 0xc392, 0xc392, 0xc392, 0xc392, 0xc393, 0xc393, 0xc393, + 0xc393, 0xc393, 0xc393, 0xc393, 0xc393, 0xc394, 0xc394, 0xc394, + 0xc394, 0xc394, 0xc394, 0xc394, 0xc394, 0xc395, 0xc395, 0xc395, + 0xc395, 0xc395, 0xc395, 0xc395, 0xc395, 0xc396, 0xc396, 0xc396, + 0xc396, 0xc396, 0xc396, 0xc396, 0xc396, 0xc397, 0xc397, 0xc397, + 0xc397, 0xc397, 0xc397, 0xc397, 0xc397, 0xc398, 0xc398, 0xc398, + 0xc398, 0xc398, 0xc398, 0xc398, 0xc398, 0xc399, 0xc399, 0xc399, + 0xc399, 0xc399, 0xc399, 0xc399, 0xc399, 0xc39a, 0xc39a, 0xc39a, + 0xc39a, 0xc39a, 0xc39a, 0xc39a, 0xc39a, 0xc39a, 0xc39b, 0xc39b, + 0xc39b, 0xc39b, 0xc39b, 0xc39b, 0xc39b, 0xc39b, 0xc39c, 0xc39c, + 0xc39c, 0xc39c, 0xc39c, 0xc39c, 0xc39c, 0xc39c, 0xc39d, 0xc39d, + 0xc39d, 0xc39d, 0xc39d, 0xc39d, 0xc39d, 0xc39d, 0xc39e, 0xc39e, + 0xc39e, 0xc39e, 0xc39e, 0xc39e, 0xc39e, 0xc39e, 0xc39e, 0xc39f, + 0xc39f, 0xc39f, 0xc39f, 0xc39f, 0xc39f, 0xc39f, 0xc39f, 0xc3a0, + 0xc3a0, 0xc3a0, 0xc3a0, 0xc3a0, 0xc3a0, 0xc3a0, 0xc3a0, 0xc3a1, + 0xc3a1, 0xc3a1, 0xc3a1, 0xc3a1, 0xc3a1, 0xc3a1, 0xc3a1, 0xc3a1, + 0xc3a2, 0xc3a2, 0xc3a2, 0xc3a2, 0xc3a2, 0xc3a2, 0xc3a2, 0xc3a2, + 0xc3a3, 0xc3a3, 0xc3a3, 0xc3a3, 0xc3a3, 0xc3a3, 0xc3a3, 0xc3a3, + 0xc3a3, 0xc3a4, 0xc3a4, 0xc3a4, 0xc3a4, 0xc3a4, 0xc3a4, 0xc3a4, + 0xc3a4, 0xc3a5, 0xc3a5, 0xc3a5, 0xc3a5, 0xc3a5, 0xc3a5, 0xc3a5, + 0xc3a5, 0xc3a5, 0xc3a6, 0xc3a6, 0xc3a6, 0xc3a6, 0xc3a6, 0xc3a6, + 0xc3a6, 0xc3a6, 0xc3a7, 0xc3a7, 0xc3a7, 0xc3a7, 0xc3a7, 0xc3a7, + 0xc3a7, 0xc3a7, 0xc3a7, 0xc3a8, 0xc3a8, 0xc3a8, 0xc3a8, 0xc3a8, + 0xc3a8, 0xc3a8, 0xc3a8, 0xc3a9, 0xc3a9, 0xc3a9, 0xc3a9, 0xc3a9, + 0xc3a9, 0xc3a9, 0xc3a9, 0xc3a9, 0xc3aa, 0xc3aa, 0xc3aa, 0xc3aa, + 0xc3aa, 0xc3aa, 0xc3aa, 0xc3aa, 0xc3aa, 0xc3ab, 0xc3ab, 0xc3ab, + 0xc3ab, 0xc3ab, 0xc3ab, 0xc3ab, 0xc3ab, 0xc3ab, 0xc3ac, 0xc3ac, + 0xc3ac, 0xc3ac, 0xc3ac, 0xc3ad, 0xc3ad, 0xc3ad, 0xc3ad, 0xc3ad, + 0xc3ae, 0xc3ae, 0xc3ae, 0xc3ae, 0xc3af, 0xc3af, 0xc3af, 0xc3af, + 0xc3af, 0xc3b0, 0xc3b0, 0xc3b0, 0xc3b0, 0xc3b1, 0xc3b1, 0xc3b1, + 0xc3b1, 0xc3b1, 0xc3b2, 0xc3b2, 0xc3b2, 0xc3b2, 0xc3b3, 0xc3b3, + 0xc3b3, 0xc3b3, 0xc3b3, 0xc3b4, 0xc3b4, 0xc3b4, 0xc3b4, 0xc3b5, + 0xc3b5, 0xc3b5, 0xc3b5, 0xc3b5, 0xc3b6, 0xc3b6, 0xc3b6, 0xc3b6, + 0xc3b6, 0xc3b7, 0xc3b7, 0xc3b7, 0xc3b7, 0xc3b8, 0xc3b8, 0xc3b8, + 0xc3b8, 0xc3b8, 0xc3b9, 0xc3b9, 0xc3b9, 0xc3b9, 0xc3ba, 0xc3ba, + 0xc3ba, 0xc3ba, 0xc3ba, 0xc3bb, 0xc3bb, 0xc3bb, 0xc3bb, 0xc3bb, + 0xc3bc, 0xc3bc, 0xc3bc, 0xc3bc, 0xc3bc, 0xc3bd, 0xc3bd, 0xc3bd, + 0xc3bd, 0xc3be, 0xc3be, 0xc3be, 0xc3be, 0xc3be, 0xc3bf, 0xc3bf, + 0xc3bf, 0xc3bf, 0xc3bf, 0xc3c0, 0xc3c0, 0xc3c0, 0xc3c0, 0xc3c0, + 0xc3c1, 0xc3c1, 0xc3c1, 0xc3c1, 0xc3c2, 0xc3c2, 0xc3c2, 0xc3c2, + 0xc3c2, 0xc3c3, 0xc3c3, 0xc3c3, 0xc3c3, 0xc3c3, 0xc3c4, 0xc3c4, + 0xc3c4, 0xc3c4, 0xc3c4, 0xc3c5, 0xc3c5, 0xc3c5, 0xc3c5, 0xc3c5, + 0xc3c6, 0xc3c6, 0xc3c6, 0xc3c6, 0xc3c6, 0xc3c7, 0xc3c7, 0xc3c7, + 0xc3c7, 0xc3c7, 0xc3c8, 0xc3c8, 0xc3c8, 0xc3c8, 0xc3c8, 0xc3c9, + 0xc3c9, 0xc3c9, 0xc3c9, 0xc3c9, 0xc3ca, 0xc3ca, 0xc3ca, 0xc3ca, + 0xc3ca, 0xc3cb, 0xc3cb, 0xc3cb, 0xc3cb, 0xc3cb, 0xc3cc, 0xc3cc, + 0xc3cc, 0xc3cc, 0xc3cc, 0xc3cd, 0xc3cd, 0xc3cd, 0xc3cd, 0xc3cd, + 0xc3ce, 0xc3ce, 0xc3ce, 0xc3ce, 0xc3ce, 0xc3cf, 0xc3cf, 0xc3cf, + 0xc3cf, 0xc3cf, 0xc3d0, 0xc3d0, 0xc3d0, 0xc3d0, 0xc3d0, 0xc3d1, + 0xc3d1, 0xc3d1, 0xc3d1, 0xc3d1, 0xc3d2, 0xc3d2, 0xc3d2, 0xc3d2, + 0xc3d2, 0xc3d2, 0xc3d3, 0xc3d3, 0xc3d3, 0xc3d3, 0xc3d3, 0xc3d4, + 0xc3d4, 0xc3d4, 0xc3d4, 0xc3d4, 0xc3d5, 0xc3d5, 0xc3d5, 0xc3d5, + 0xc3d5, 0xc3d6, 0xc3d6, 0xc3d6, 0xc3d6, 0xc3d6, 0xc3d6, 0xc3d7, + 0xc3d7, 0xc3d7, 0xc3d7, 0xc3d7, 0xc3d8, 0xc3d8, 0xc3d8, 0xc3d8, + 0xc3d8, 0xc3d9, 0xc3d9, 0xc3d9, 0xc3d9, 0xc3d9, 0xc3d9, 0xc3da, + 0xc3da, 0xc3da, 0xc3da, 0xc3da, 0xc3db, 0xc3db, 0xc3db, 0xc3db, + 0xc3db, 0xc3dc, 0xc3dc, 0xc3dc, 0xc3dc, 0xc3dc, 0xc3dc, 0xc3dd, + 0xc3dd, 0xc3dd, 0xc3dd, 0xc3dd, 0xc3de, 0xc3de, 0xc3de, 0xc3de, + 0xc3de, 0xc3de, 0xc3df, 0xc3df, 0xc3df, 0xc3df, 0xc3df, 0xc3e0, + 0xc3e0, 0xc3e0, 0xc3e0, 0xc3e0, 0xc3e0, 0xc3e1, 0xc3e1, 0xc3e1, + 0xc3e1, 0xc3e1, 0xc3e2, 0xc3e2, 0xc3e2, 0xc3e2, 0xc3e2, 0xc3e2, + 0xc3e3, 0xc3e3, 0xc3e3, 0xc3e3, 0xc3e3, 0xc3e4, 0xc3e4, 0xc3e4, + 0xc3e4, 0xc3e4, 0xc3e4, 0xc3e5, 0xc3e5, 0xc3e5, 0xc3e5, 0xc3e5, + 0xc3e6, 0xc3e6, 0xc3e6, 0xc3e6, 0xc3e6, 0xc3e6, 0xc3e7, 0xc3e7, + 0xc3e7, 0xc3e7, 0xc3e7, 0xc3e7, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, + 0xc3e8, 0xc3e9, 0xc3e9, 0xc3e9, 0xc3e9, 0xc3e9, 0xc3e9, 0xc3ea, + 0xc3ea, 0xc3ea, 0xc3ea, 0xc3ea, 0xc3ea, 0xc3eb, 0xc3eb, 0xc3eb, + 0xc3eb, 0xc3eb, 0xc3eb, 0xc3ec, 0xc3ec, 0xc3ec, 0xc3ec, 0xc3ec, + 0xc3ec, 0xc3ed, 0xc3ed, 0xc3ed, 0xc3ed, 0xc3ed, 0xc3ee, 0xc3ee, + 0xc3ee, 0xc3ee, 0xc3ee, 0xc3ee, 0xc3ef, 0xc3ef, 0xc3ef, 0xc3ef, + 0xc3ef, 0xc3ef, 0xc3f0, 0xc3f0, 0xc3f0, 0xc3f0, 0xc3f0, 0xc3f0, + 0xc3f1, 0xc3f1, 0xc3f1, 0xc3f1, 0xc3f1, 0xc3f1, 0xc3f2, 0xc3f2, + 0xc3f2, 0xc3f2, 0xc3f2, 0xc3f2, 0xc3f3, 0xc3f3, 0xc3f3, 0xc3f3, + 0xc3f3, 0xc3f3, 0xc3f4, 0xc3f4, 0xc3f4, 0xc3f4, 0xc3f4, 0xc3f4, + 0xc3f5, 0xc3f5, 0xc3f5, 0xc3f5, 0xc3f5, 0xc3f5, 0xc3f6, 0xc3f6, + 0xc3f6, 0xc3f6, 0xc3f6, 0xc3f6, 0xc3f7, 0xc3f7, 0xc3f7, 0xc3f7, + 0xc3f7, 0xc3f7, 0xc3f8, 0xc3f8, 0xc3f8, 0xc3f8, 0xc3f8, 0xc3f8, + 0xc3f9, 0xc3f9, 0xc3f9, 0xc3f9, 0xc3f9, 0xc3f9, 0xc3fa, 0xc3fa, + 0xc3fa, 0xc3fa, 0xc3fa, 0xc3fa, 0xc3fb, 0xc3fb, 0xc3fb, 0xc3fb, + 0xc3fb, 0xc3fb, 0xc3fb, 0xc3fc, 0xc3fc, 0xc3fc, 0xc3fc, 0xc3fc, + 0xc3fc, 0xc3fd, 0xc3fd, 0xc3fd, 0xc3fd, 0xc3fd, 0xc3fd, 0xc3fe, + 0xc3fe, 0xc3fe, 0xc3fe, 0xc3fe, 0xc3fe, 0xc3ff, 0xc3ff, 0xc3ff, + 0xc3ff, 0xc3ff, 0xc3ff, 0xc3ff, 0xc400, 0xc400, 0xc400, 0xc400, + 0xc400, 0xc400, 0xc400, 0xc400, 0xc400, 0xc401, 0xc401, 0xc401, + 0xc401, 0xc401, 0xc401, 0xc401, 0xc401, 0xc401, 0xc401, 0xc401, + 0xc401, 0xc401, 0xc402, 0xc402, 0xc402, 0xc402, 0xc402, 0xc402, + 0xc402, 0xc402, 0xc402, 0xc402, 0xc402, 0xc402, 0xc402, 0xc403, + 0xc403, 0xc403, 0xc403, 0xc403, 0xc403, 0xc403, 0xc403, 0xc403, + 0xc403, 0xc403, 0xc403, 0xc403, 0xc404, 0xc404, 0xc404, 0xc404, + 0xc404, 0xc404, 0xc404, 0xc404, 0xc404, 0xc404, 0xc404, 0xc404, + 0xc404, 0xc405, 0xc405, 0xc405, 0xc405, 0xc405, 0xc405, 0xc405, + 0xc405, 0xc405, 0xc405, 0xc405, 0xc405, 0xc405, 0xc406, 0xc406, + 0xc406, 0xc406, 0xc406, 0xc406, 0xc406, 0xc406, 0xc406, 0xc406, + 0xc406, 0xc406, 0xc406, 0xc407, 0xc407, 0xc407, 0xc407, 0xc407, + 0xc407, 0xc407, 0xc407, 0xc407, 0xc407, 0xc407, 0xc407, 0xc407, + 0xc407, 0xc408, 0xc408, 0xc408, 0xc408, 0xc408, 0xc408, 0xc408, + 0xc408, 0xc408, 0xc408, 0xc408, 0xc408, 0xc408, 0xc409, 0xc409, + 0xc409, 0xc409, 0xc409, 0xc409, 0xc409, 0xc409, 0xc409, 0xc409, + 0xc409, 0xc409, 0xc409, 0xc409, 0xc40a, 0xc40a, 0xc40a, 0xc40a, + 0xc40a, 0xc40a, 0xc40a, 0xc40a, 0xc40a, 0xc40a, 0xc40a, 0xc40a, + 0xc40a, 0xc40a, 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40b, + 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40b, 0xc40c, + 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40c, + 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40c, 0xc40d, 0xc40d, 0xc40d, + 0xc40d, 0xc40d, 0xc40d, 0xc40d, 0xc40d, 0xc40d, 0xc40d, 0xc40d, + 0xc40d, 0xc40d, 0xc40d, 0xc40d, 0xc40e, 0xc40e, 0xc40e, 0xc40e, + 0xc40e, 0xc40e, 0xc40e, 0xc40e, 0xc40e, 0xc40e, 0xc40e, 0xc40e, + 0xc40e, 0xc40e, 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, + 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, 0xc40f, + 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, + 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc410, 0xc411, + 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, + 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc412, 0xc412, 0xc412, + 0xc412, 0xc412, 0xc412, 0xc412, 0xc412, 0xc412, 0xc412, 0xc412, + 0xc412, 0xc412, 0xc412, 0xc412, 0xc413, 0xc413, 0xc413, 0xc413, + 0xc413, 0xc413, 0xc413, 0xc413, 0xc413, 0xc413, 0xc413, 0xc413, + 0xc413, 0xc413, 0xc413, 0xc414, 0xc414, 0xc414, 0xc414, 0xc414, + 0xc414, 0xc414, 0xc414, 0xc414, 0xc414, 0xc414, 0xc414, 0xc414, + 0xc414, 0xc414, 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, + 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, 0xc415, + 0xc415, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, + 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, 0xc416, + 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, + 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, 0xc417, + 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, + 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc418, 0xc419, + 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, + 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc419, 0xc41a, + 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, + 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41a, 0xc41b, + 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, + 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41b, 0xc41c, + 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, + 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41c, 0xc41d, + 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, + 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41d, 0xc41e, + 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, + 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41e, 0xc41f, + 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, + 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, 0xc41f, + 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, + 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, 0xc420, + 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, + 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, 0xc421, + 0xc421, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, + 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, 0xc422, + 0xc422, 0xc422, 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, + 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, 0xc423, + 0xc423, 0xc423, 0xc423, 0xc424, 0xc424, 0xc424, 0xc424, 0xc424, + 0xc424, 0xc424, 0xc424, 0xc424, 0xc424, 0xc424, 0xc424, 0xc424, + 0xc424, 0xc424, 0xc424, 0xc424, 0xc425, 0xc425, 0xc425, 0xc425, + 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, + 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, 0xc425, 0xc426, 0xc426, + 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, + 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc426, 0xc427, + 0xc427, 0xc427, 0xc427, 0xc427, 0xc427, 0xc427, 0xc427, 0xc427, + 0xc427, 0xc428, 0xc428, 0xc428, 0xc428, 0xc428, 0xc428, 0xc428, + 0xc428, 0xc428, 0xc429, 0xc429, 0xc429, 0xc429, 0xc429, 0xc429, + 0xc429, 0xc429, 0xc429, 0xc42a, 0xc42a, 0xc42a, 0xc42a, 0xc42a, + 0xc42a, 0xc42a, 0xc42a, 0xc42a, 0xc42b, 0xc42b, 0xc42b, 0xc42b, + 0xc42b, 0xc42b, 0xc42b, 0xc42b, 0xc42b, 0xc42c, 0xc42c, 0xc42c, + 0xc42c, 0xc42c, 0xc42c, 0xc42c, 0xc42c, 0xc42c, 0xc42d, 0xc42d, + 0xc42d, 0xc42d, 0xc42d, 0xc42d, 0xc42d, 0xc42d, 0xc42d, 0xc42e, + 0xc42e, 0xc42e, 0xc42e, 0xc42e, 0xc42e, 0xc42e, 0xc42e, 0xc42e, + 0xc42e, 0xc42f, 0xc42f, 0xc42f, 0xc42f, 0xc42f, 0xc42f, 0xc42f, + 0xc42f, 0xc42f, 0xc430, 0xc430, 0xc430, 0xc430, 0xc430, 0xc430, + 0xc430, 0xc430, 0xc430, 0xc430, 0xc431, 0xc431, 0xc431, 0xc431, + 0xc431, 0xc431, 0xc431, 0xc431, 0xc431, 0xc432, 0xc432, 0xc432, + 0xc432, 0xc432, 0xc432, 0xc432, 0xc432, 0xc432, 0xc432, 0xc433, + 0xc433, 0xc433, 0xc433, 0xc433, 0xc433, 0xc433, 0xc433, 0xc433, + 0xc433, 0xc434, 0xc434, 0xc434, 0xc434, 0xc434, 0xc434, 0xc434, + 0xc434, 0xc434, 0xc434, 0xc435, 0xc435, 0xc435, 0xc435, 0xc435, + 0xc435, 0xc435, 0xc435, 0xc435, 0xc435, 0xc436, 0xc436, 0xc436, + 0xc436, 0xc436, 0xc436, 0xc436, 0xc436, 0xc436, 0xc436, 0xc437, + 0xc437, 0xc437, 0xc437, 0xc437, 0xc437, 0xc437, 0xc437, 0xc437, + 0xc437, 0xc438, 0xc438, 0xc438, 0xc438, 0xc438, 0xc438, 0xc438, + 0xc438, 0xc438, 0xc438, 0xc439, 0xc439, 0xc439, 0xc439, 0xc439, + 0xc439, 0xc439, 0xc439, 0xc439, 0xc439, 0xc43a, 0xc43a, 0xc43a, + 0xc43a, 0xc43a, 0xc43a, 0xc43a, 0xc43a, 0xc43a, 0xc43a, 0xc43a, + 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43b, + 0xc43b, 0xc43b, 0xc43c, 0xc43c, 0xc43c, 0xc43c, 0xc43c, 0xc43c, + 0xc43c, 0xc43c, 0xc43c, 0xc43c, 0xc43c, 0xc43d, 0xc43d, 0xc43d, + 0xc43d, 0xc43d, 0xc43d, 0xc43d, 0xc43d, 0xc43d, 0xc43d, 0xc43d, + 0xc43e, 0xc43e, 0xc43e, 0xc43e, 0xc43e, 0xc43e, 0xc43e, 0xc43e, + 0xc43e, 0xc43e, 0xc43f, 0xc43f, 0xc43f, 0xc43f, 0xc43f, 0xc43f, + 0xc43f, 0xc43f, 0xc43f, 0xc43f, 0xc43f, 0xc440, 0xc440, 0xc440, + 0xc440, 0xc440, 0xc440, 0xc440, 0xc440, 0xc440, 0xc440, 0xc440, + 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, + 0xc441, 0xc441, 0xc441, 0xc442, 0xc442, 0xc442, 0xc442, 0xc442, + 0xc442, 0xc442, 0xc442, 0xc442, 0xc442, 0xc442, 0xc443, 0xc443, + 0xc443, 0xc443, 0xc443, 0xc443, 0xc443, 0xc443, 0xc443, 0xc443, + 0xc443, 0xc443, 0xc444, 0xc444, 0xc444, 0xc444, 0xc444, 0xc444, + 0xc444, 0xc444, 0xc444, 0xc444, 0xc444, 0xc445, 0xc445, 0xc445, + 0xc445, 0xc445, 0xc445, 0xc445, 0xc445, 0xc445, 0xc445, 0xc445, + 0xc446, 0xc446, 0xc446, 0xc446, 0xc446, 0xc446, 0xc446, 0xc446, + 0xc446, 0xc446, 0xc446, 0xc446, 0xc447, 0xc447, 0xc447, 0xc447, + 0xc447, 0xc447, 0xc447, 0xc447, 0xc447, 0xc447, 0xc447, 0xc448, + 0xc448, 0xc448, 0xc448, 0xc448, 0xc448, 0xc448, 0xc448, 0xc448, + 0xc448, 0xc448, 0xc448, 0xc449, 0xc449, 0xc449, 0xc449, 0xc449, + 0xc449, 0xc449, 0xc449, 0xc449, 0xc449, 0xc449, 0xc449, 0xc44a, + 0xc44a, 0xc44a, 0xc44a, 0xc44a, 0xc44a, 0xc44a, 0xc44a, 0xc44a, + 0xc44a, 0xc44a, 0xc44a, 0xc44b, 0xc44b, 0xc44b, 0xc44b, 0xc44b, + 0xc44b, 0xc44b, 0xc44b, 0xc44b, 0xc44b, 0xc44b, 0xc44b, 0xc44c, + 0xc44c, 0xc44c, 0xc44c, 0xc44c, 0xc44c, 0xc44c, 0xc44c, 0xc44c, + 0xc44c, 0xc44c, 0xc44c, 0xc44d, 0xc44d, 0xc44d, 0xc44d, 0xc44d, + 0xc44d, 0xc44d, 0xc44d, 0xc44d, 0xc44d, 0xc44d, 0xc44d, 0xc44e, + 0xc44e, 0xc44e, 0xc44e, 0xc44e, 0xc44e, 0xc44e, 0xc44e, 0xc44e, + 0xc44e, 0xc44e, 0xc44e, 0xc44e, 0xc44f, 0xc44f, 0xc44f, 0xc44f, + 0xc44f, 0xc44f, 0xc44f, 0xc44f, 0xc44f, 0xc44f, 0xc44f, 0xc44f, + 0xc450, 0xc450, 0xc450, 0xc450, 0xc450, 0xc450, 0xc450, 0xc450, + 0xc450, 0xc450, 0xc450, 0xc450, 0xc450, 0xc451, 0xc451, 0xc451, + 0xc451, 0xc451, 0xc451, 0xc451, 0xc451, 0xc451, 0xc451, 0xc451, + 0xc451, 0xc452, 0xc452, 0xc452, 0xc452, 0xc452, 0xc452, 0xc452, + 0xc452, 0xc452, 0xc452, 0xc452, 0xc452, 0xc452, 0xc453, 0xc453, + 0xc453, 0xc453, 0xc453, 0xc453, 0xc453, 0xc453, 0xc453, 0xc453, + 0xc453, 0xc453, 0xc453, 0xc454, 0xc454, 0xc454, 0xc454, 0xc454, + 0xc454, 0xc454, 0xc454, 0xc454, 0xc454, 0xc454, 0xc454, 0xc454, + 0xc455, 0xc455, 0xc455, 0xc455, 0xc455, 0xc455, 0xc455, 0xc455, + 0xc455, 0xc455, 0xc455, 0xc455, 0xc455, 0xc456, 0xc456, 0xc456, + 0xc456, 0xc456, 0xc456, 0xc456, 0xc456, 0xc456, 0xc456, 0xc456, + 0xc456, 0xc456, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, + 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, 0xc457, + 0xc458, 0xc458, 0xc458, 0xc458, 0xc458, 0xc458, 0xc458, 0xc458, + 0xc458, 0xc458, 0xc458, 0xc458, 0xc458, 0xc459, 0xc459, 0xc459, + 0xc459, 0xc459, 0xc459, 0xc459, 0xc459, 0xc459, 0xc459, 0xc459, + 0xc459, 0xc459, 0xc459, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, + 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, + 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, + 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45c, 0xc45c, + 0xc45c, 0xc45c, 0xc45c, 0xc45c, 0xc45c, 0xc45c, 0xc45c, 0xc45c, + 0xc45c, 0xc45c, 0xc45c, 0xc45c, 0xc45d, 0xc45d, 0xc45d, 0xc45d, + 0xc45d, 0xc45d, 0xc45d, 0xc45d, 0xc45d, 0xc45d, 0xc45d, 0xc45d, + 0xc45d, 0xc45d, 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, + 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, 0xc45e, + 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, + 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc460, + 0xc460, 0xc460, 0xc460, 0xc460, 0xc460, 0xc460, 0xc460, 0xc460, + 0xc460, 0xc460, 0xc460, 0xc460, 0xc460, 0xc461, 0xc461, 0xc461, + 0xc461, 0xc461, 0xc461, 0xc461, 0xc461, 0xc461, 0xc461, 0xc461, + 0xc461, 0xc461, 0xc461, 0xc461, 0xc462, 0xc462, 0xc462, 0xc462, + 0xc462, 0xc462, 0xc462, 0xc462, 0xc462, 0xc462, 0xc462, 0xc462, + 0xc462, 0xc462, 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, + 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, 0xc463, + 0xc463, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, + 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, 0xc464, + 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, + 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc465, 0xc466, + 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, + 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, 0xc466, 0xc467, 0xc467, + 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, + 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, 0xc467, 0xc468, 0xc468, + 0xc468, 0xc468, 0xc468, 0xc468, 0xc468, 0xc468, 0xc468, 0xc468, + 0xc468, 0xc468, 0xc468, 0xc468, 0xc468, 0xc469, 0xc469, 0xc469, + 0xc469, 0xc469, 0xc469, 0xc469, 0xc469, 0xc469, 0xc469, 0xc469, + 0xc469, 0xc469, 0xc469, 0xc469, 0xc469, 0xc46a, 0xc46a, 0xc46a, + 0xc46a, 0xc46a, 0xc46a, 0xc46a, 0xc46a, 0xc46a, 0xc46a, 0xc46a, + 0xc46a, 0xc46a, 0xc46a, 0xc46a, 0xc46b, 0xc46b, 0xc46b, 0xc46b, + 0xc46b, 0xc46b, 0xc46b, 0xc46b, 0xc46b, 0xc46b, 0xc46b, 0xc46b, + 0xc46b, 0xc46b, 0xc46b, 0xc46b, 0xc46c, 0xc46c, 0xc46c, 0xc46c, + 0xc46c, 0xc46c, 0xc46c, 0xc46c, 0xc46c, 0xc46c, 0xc46c, 0xc46c, + 0xc46c, 0xc46c, 0xc46c, 0xc46c, 0xc46d, 0xc46d, 0xc46d, 0xc46d, + 0xc46d, 0xc46d, 0xc46d, 0xc46d, 0xc46d, 0xc46d, 0xc46d, 0xc46d, + 0xc46d, 0xc46d, 0xc46d, 0xc46d, 0xc46e, 0xc46e, 0xc46e, 0xc46e, + 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46e, + 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc46f, 0xc46f, 0xc46f, + 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc46f, + 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc46f, 0xc470, 0xc470, 0xc470, + 0xc470, 0xc470, 0xc470, 0xc470, 0xc470, 0xc470, 0xc470, 0xc470, + 0xc470, 0xc470, 0xc470, 0xc470, 0xc470, 0xc471, 0xc471, 0xc471, + 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, + 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, 0xc471, 0xc472, 0xc472, + 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, + 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc472, 0xc473, + 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, + 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, 0xc473, + 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, + 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, 0xc474, + 0xc474, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, + 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, 0xc475, + 0xc475, 0xc475, 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, + 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, 0xc476, + 0xc476, 0xc476, 0xc476, 0xc476, 0xc477, 0xc477, 0xc477, 0xc477, + 0xc477, 0xc477, 0xc477, 0xc477, 0xc477, 0xc477, 0xc477, 0xc477, + 0xc477, 0xc477, 0xc477, 0xc478, 0xc478, 0xc478, 0xc478, 0xc478, + 0xc478, 0xc478, 0xc478, 0xc478, 0xc479, 0xc479, 0xc479, 0xc479, + 0xc479, 0xc479, 0xc479, 0xc479, 0xc479, 0xc47a, 0xc47a, 0xc47a, + 0xc47a, 0xc47a, 0xc47a, 0xc47a, 0xc47a, 0xc47a, 0xc47b, 0xc47b, + 0xc47b, 0xc47b, 0xc47b, 0xc47b, 0xc47b, 0xc47b, 0xc47b, 0xc47c, + 0xc47c, 0xc47c, 0xc47c, 0xc47c, 0xc47c, 0xc47c, 0xc47c, 0xc47c, + 0xc47d, 0xc47d, 0xc47d, 0xc47d, 0xc47d, 0xc47d, 0xc47d, 0xc47d, + 0xc47d, 0xc47e, 0xc47e, 0xc47e, 0xc47e, 0xc47e, 0xc47e, 0xc47e, + 0xc47e, 0xc47e, 0xc47e, 0xc47f, 0xc47f, 0xc47f, 0xc47f, 0xc47f, + 0xc47f, 0xc47f, 0xc47f, 0xc47f, 0xc480, 0xc480, 0xc480, 0xc480, + 0xc480, 0xc480, 0xc480, 0xc480, 0xc480, 0xc481, 0xc481, 0xc481, + 0xc481, 0xc481, 0xc481, 0xc481, 0xc481, 0xc481, 0xc481, 0xc482, + 0xc482, 0xc482, 0xc482, 0xc482, 0xc482, 0xc482, 0xc482, 0xc482, + 0xc482, 0xc483, 0xc483, 0xc483, 0xc483, 0xc483, 0xc483, 0xc483, + 0xc483, 0xc483, 0xc484, 0xc484, 0xc484, 0xc484, 0xc484, 0xc484, + 0xc484, 0xc484, 0xc484, 0xc484, 0xc485, 0xc485, 0xc485, 0xc485, + 0xc485, 0xc485, 0xc485, 0xc485, 0xc485, 0xc485, 0xc486, 0xc486, + 0xc486, 0xc486, 0xc486, 0xc486, 0xc486, 0xc486, 0xc486, 0xc486, + 0xc487, 0xc487, 0xc487, 0xc487, 0xc487, 0xc487, 0xc487, 0xc487, + 0xc487, 0xc487, 0xc488, 0xc488, 0xc488, 0xc488, 0xc488, 0xc488, + 0xc488, 0xc488, 0xc488, 0xc488, 0xc489, 0xc489, 0xc489, 0xc489, + 0xc489, 0xc489, 0xc489, 0xc489, 0xc489, 0xc489, 0xc489, 0xc48a, + 0xc48a, 0xc48a, 0xc48a, 0xc48a, 0xc48a, 0xc48a, 0xc48a, 0xc48a, + 0xc48a, 0xc48b, 0xc48b, 0xc48b, 0xc48b, 0xc48b, 0xc48b, 0xc48b, + 0xc48b, 0xc48b, 0xc48b, 0xc48c, 0xc48c, 0xc48c, 0xc48c, 0xc48c, + 0xc48c, 0xc48c, 0xc48c, 0xc48c, 0xc48c, 0xc48c, 0xc48d, 0xc48d, + 0xc48d, 0xc48d, 0xc48d, 0xc48d, 0xc48d, 0xc48d, 0xc48d, 0xc48d, + 0xc48d, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, + 0xc48e, 0xc48e, 0xc48e, 0xc48f, 0xc48f, 0xc48f, 0xc48f, 0xc48f, + 0xc48f, 0xc48f, 0xc48f, 0xc48f, 0xc48f, 0xc48f, 0xc490, 0xc490, + 0xc490, 0xc490, 0xc490, 0xc490, 0xc490, 0xc490, 0xc490, 0xc490, + 0xc490, 0xc491, 0xc491, 0xc491, 0xc491, 0xc491, 0xc491, 0xc491, + 0xc491, 0xc491, 0xc491, 0xc491, 0xc492, 0xc492, 0xc492, 0xc492, + 0xc492, 0xc492, 0xc492, 0xc492, 0xc492, 0xc492, 0xc492, 0xc493, + 0xc493, 0xc493, 0xc493, 0xc493, 0xc493, 0xc493, 0xc493, 0xc493, + 0xc493, 0xc493, 0xc494, 0xc494, 0xc494, 0xc494, 0xc494, 0xc494, + 0xc494, 0xc494, 0xc494, 0xc494, 0xc494, 0xc495, 0xc495, 0xc495, + 0xc495, 0xc495, 0xc495, 0xc495, 0xc495, 0xc495, 0xc495, 0xc495, + 0xc495, 0xc496, 0xc496, 0xc496, 0xc496, 0xc496, 0xc496, 0xc496, + 0xc496, 0xc496, 0xc496, 0xc496, 0xc497, 0xc497, 0xc497, 0xc497, + 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, + 0xc498, 0xc498, 0xc498, 0xc498, 0xc498, 0xc498, 0xc498, 0xc498, + 0xc498, 0xc498, 0xc498, 0xc499, 0xc499, 0xc499, 0xc499, 0xc499, + 0xc499, 0xc499, 0xc499, 0xc499, 0xc499, 0xc499, 0xc499, 0xc49a, + 0xc49a, 0xc49a, 0xc49a, 0xc49a, 0xc49a, 0xc49a, 0xc49a, 0xc49a, + 0xc49a, 0xc49a, 0xc49a, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, + 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49c, + 0xc49c, 0xc49c, 0xc49c, 0xc49c, 0xc49c, 0xc49c, 0xc49c, 0xc49c, + 0xc49c, 0xc49c, 0xc49c, 0xc49d, 0xc49d, 0xc49d, 0xc49d, 0xc49d, + 0xc49d, 0xc49d, 0xc49d, 0xc49d, 0xc49d, 0xc49d, 0xc49d, 0xc49e, + 0xc49e, 0xc49e, 0xc49e, 0xc49e, 0xc49e, 0xc49e, 0xc49e, 0xc49e, + 0xc49e, 0xc49e, 0xc49e, 0xc49e, 0xc49f, 0xc49f, 0xc49f, 0xc49f, + 0xc49f, 0xc49f, 0xc49f, 0xc49f, 0xc49f, 0xc49f, 0xc49f, 0xc49f, + 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, + 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a0, 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, + 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, 0xc4a1, + 0xc4a1, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, + 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a2, 0xc4a3, 0xc4a3, + 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a3, + 0xc4a3, 0xc4a3, 0xc4a3, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, + 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a4, 0xc4a5, + 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, + 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a5, 0xc4a6, 0xc4a6, 0xc4a6, + 0xc4a6, 0xc4a6, 0xc4a6, 0xc4a6, 0xc4a6, 0xc4a6, 0xc4a6, 0xc4a6, + 0xc4a6, 0xc4a6, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, + 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a7, 0xc4a8, + 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, + 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, + 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, 0xc4a9, + 0xc4a9, 0xc4a9, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, + 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4aa, 0xc4ab, + 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, + 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ab, 0xc4ac, 0xc4ac, 0xc4ac, + 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ac, + 0xc4ac, 0xc4ac, 0xc4ac, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, + 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, 0xc4ad, + 0xc4ad, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, + 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4ae, 0xc4af, + 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4af, + 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4af, 0xc4b0, 0xc4b0, 0xc4b0, + 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, + 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b0, 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, + 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, 0xc4b1, + 0xc4b1, 0xc4b1, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, + 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, 0xc4b2, + 0xc4b2, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, + 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b3, 0xc4b4, + 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, + 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b4, 0xc4b5, 0xc4b5, + 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, + 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b5, 0xc4b6, 0xc4b6, 0xc4b6, + 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, + 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b6, 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, + 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b7, + 0xc4b7, 0xc4b7, 0xc4b7, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, + 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b8, + 0xc4b8, 0xc4b8, 0xc4b8, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, + 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, 0xc4b9, + 0xc4b9, 0xc4b9, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, + 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, 0xc4ba, + 0xc4ba, 0xc4ba, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, + 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, 0xc4bb, + 0xc4bb, 0xc4bb, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, + 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, 0xc4bc, + 0xc4bc, 0xc4bc, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, + 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, 0xc4bd, + 0xc4bd, 0xc4bd, 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, + 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, 0xc4be, + 0xc4be, 0xc4be, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, + 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, 0xc4bf, + 0xc4bf, 0xc4bf, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, + 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c0, + 0xc4c0, 0xc4c0, 0xc4c0, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, + 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c1, + 0xc4c1, 0xc4c1, 0xc4c1, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, + 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, + 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c2, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, + 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, + 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c3, 0xc4c4, 0xc4c4, 0xc4c4, + 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, + 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c5, 0xc4c5, + 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, + 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c5, 0xc4c6, + 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, + 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, 0xc4c6, + 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, + 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, 0xc4c7, + 0xc4c7, 0xc4c7, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, + 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c8, 0xc4c9, 0xc4c9, + 0xc4c9, 0xc4c9, 0xc4c9, 0xc4c9, 0xc4c9, 0xc4c9, 0xc4c9, 0xc4ca, + 0xc4ca, 0xc4ca, 0xc4ca, 0xc4ca, 0xc4ca, 0xc4ca, 0xc4ca, 0xc4ca, + 0xc4cb, 0xc4cb, 0xc4cb, 0xc4cb, 0xc4cb, 0xc4cb, 0xc4cb, 0xc4cb, + 0xc4cb, 0xc4cc, 0xc4cc, 0xc4cc, 0xc4cc, 0xc4cc, 0xc4cc, 0xc4cc, + 0xc4cc, 0xc4cc, 0xc4cd, 0xc4cd, 0xc4cd, 0xc4cd, 0xc4cd, 0xc4cd, + 0xc4cd, 0xc4cd, 0xc4cd, 0xc4ce, 0xc4ce, 0xc4ce, 0xc4ce, 0xc4ce, + 0xc4ce, 0xc4ce, 0xc4ce, 0xc4ce, 0xc4cf, 0xc4cf, 0xc4cf, 0xc4cf, + 0xc4cf, 0xc4cf, 0xc4cf, 0xc4cf, 0xc4cf, 0xc4cf, 0xc4d0, 0xc4d0, + 0xc4d0, 0xc4d0, 0xc4d0, 0xc4d0, 0xc4d0, 0xc4d0, 0xc4d0, 0xc4d1, + 0xc4d1, 0xc4d1, 0xc4d1, 0xc4d1, 0xc4d1, 0xc4d1, 0xc4d1, 0xc4d1, + 0xc4d1, 0xc4d2, 0xc4d2, 0xc4d2, 0xc4d2, 0xc4d2, 0xc4d2, 0xc4d2, + 0xc4d2, 0xc4d2, 0xc4d3, 0xc4d3, 0xc4d3, 0xc4d3, 0xc4d3, 0xc4d3, + 0xc4d3, 0xc4d3, 0xc4d3, 0xc4d3, 0xc4d4, 0xc4d4, 0xc4d4, 0xc4d4, + 0xc4d4, 0xc4d4, 0xc4d4, 0xc4d4, 0xc4d4, 0xc4d4, 0xc4d5, 0xc4d5, + 0xc4d5, 0xc4d5, 0xc4d5, 0xc4d5, 0xc4d5, 0xc4d5, 0xc4d5, 0xc4d5, + 0xc4d6, 0xc4d6, 0xc4d6, 0xc4d6, 0xc4d6, 0xc4d6, 0xc4d6, 0xc4d6, + 0xc4d6, 0xc4d6, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, + 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d7, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, + 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d9, 0xc4d9, + 0xc4d9, 0xc4d9, 0xc4d9, 0xc4d9, 0xc4d9, 0xc4d9, 0xc4d9, 0xc4d9, + 0xc4da, 0xc4da, 0xc4da, 0xc4da, 0xc4da, 0xc4da, 0xc4da, 0xc4da, + 0xc4da, 0xc4da, 0xc4db, 0xc4db, 0xc4db, 0xc4db, 0xc4db, 0xc4db, + 0xc4db, 0xc4db, 0xc4db, 0xc4db, 0xc4db, 0xc4dc, 0xc4dc, 0xc4dc, + 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dd, + 0xc4dd, 0xc4dd, 0xc4dd, 0xc4dd, 0xc4dd, 0xc4dd, 0xc4dd, 0xc4dd, + 0xc4dd, 0xc4dd, 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0xc4de, + 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0xc4df, 0xc4df, 0xc4df, 0xc4df, + 0xc4df, 0xc4df, 0xc4df, 0xc4df, 0xc4df, 0xc4df, 0xc4df, 0xc4e0, + 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, + 0xc4e0, 0xc4e0, 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e1, + 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e1, 0xc4e2, 0xc4e2, 0xc4e2, + 0xc4e2, 0xc4e2, 0xc4e2, 0xc4e2, 0xc4e2, 0xc4e2, 0xc4e2, 0xc4e2, + 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e3, + 0xc4e3, 0xc4e3, 0xc4e3, 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e4, + 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e4, 0xc4e5, 0xc4e5, + 0xc4e5, 0xc4e5, 0xc4e5, 0xc4e5, 0xc4e5, 0xc4e5, 0xc4e5, 0xc4e5, + 0xc4e5, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, + 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e6, 0xc4e7, 0xc4e7, 0xc4e7, + 0xc4e7, 0xc4e7, 0xc4e7, 0xc4e7, 0xc4e7, 0xc4e7, 0xc4e7, 0xc4e7, + 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, + 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e8, 0xc4e9, 0xc4e9, 0xc4e9, 0xc4e9, + 0xc4e9, 0xc4e9, 0xc4e9, 0xc4e9, 0xc4e9, 0xc4e9, 0xc4e9, 0xc4ea, + 0xc4ea, 0xc4ea, 0xc4ea, 0xc4ea, 0xc4ea, 0xc4ea, 0xc4ea, 0xc4ea, + 0xc4ea, 0xc4ea, 0xc4ea, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, + 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4eb, 0xc4ec, + 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ec, + 0xc4ec, 0xc4ec, 0xc4ec, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, + 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ed, 0xc4ee, + 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ee, + 0xc4ee, 0xc4ee, 0xc4ee, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, + 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, 0xc4ef, + 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, + 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f0, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, + 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, 0xc4f1, + 0xc4f1, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, + 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f2, 0xc4f3, 0xc4f3, 0xc4f3, + 0xc4f3, 0xc4f3, 0xc4f3, 0xc4f3, 0xc4f3, 0xc4f3, 0xc4f3, 0xc4f3, + 0xc4f3, 0xc4f3, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, + 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f4, 0xc4f5, + 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, + 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f5, 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, + 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, 0xc4f6, + 0xc4f6, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, + 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f7, 0xc4f8, 0xc4f8, + 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, + 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f8, 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, + 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, 0xc4f9, + 0xc4f9, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, + 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fa, 0xc4fb, 0xc4fb, + 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, + 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fb, 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, + 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, 0xc4fc, + 0xc4fc, 0xc4fc, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, + 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, 0xc4fd, + 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, + 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4fe, 0xc4ff, 0xc4ff, + 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, + 0xc4ff, 0xc4ff, 0xc4ff, 0xc4ff, 0xc500, 0xc500, 0xc500, 0xc500, + 0xc500, 0xc500, 0xc500, 0xc500, 0xc500, 0xc500, 0xc500, 0xc500, + 0xc500, 0xc500, 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, + 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, 0xc501, + 0xc501, 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, + 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, 0xc502, 0xc503, + 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, + 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, 0xc503, 0xc504, 0xc504, + 0xc504, 0xc504, 0xc504, 0xc504, 0xc504, 0xc504, 0xc504, 0xc504, + 0xc504, 0xc504, 0xc504, 0xc504, 0xc505, 0xc505, 0xc505, 0xc505, + 0xc505, 0xc505, 0xc505, 0xc505, 0xc505, 0xc505, 0xc505, 0xc505, + 0xc505, 0xc505, 0xc505, 0xc506, 0xc506, 0xc506, 0xc506, 0xc506, + 0xc506, 0xc506, 0xc506, 0xc506, 0xc506, 0xc506, 0xc506, 0xc506, + 0xc506, 0xc506, 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, + 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, 0xc507, + 0xc507, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, + 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, 0xc508, + 0xc508, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, + 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, 0xc509, + 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, + 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, 0xc50a, + 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, + 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50b, 0xc50c, + 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, + 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50c, 0xc50d, + 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, + 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50d, 0xc50e, + 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, + 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50e, 0xc50f, + 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, + 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc50f, 0xc510, + 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, + 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, 0xc510, + 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, + 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, 0xc511, + 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, + 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, 0xc512, + 0xc512, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, + 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, 0xc513, + 0xc513, 0xc513, 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, + 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, 0xc514, + 0xc514, 0xc514, 0xc514, 0xc515, 0xc515, 0xc515, 0xc515, 0xc515, + 0xc515, 0xc515, 0xc515, 0xc515, 0xc515, 0xc515, 0xc515, 0xc515, + 0xc515, 0xc515, 0xc515, 0xc515, 0xc516, 0xc516, 0xc516, 0xc516, + 0xc516, 0xc516, 0xc516, 0xc516, 0xc516, 0xc516, 0xc516, 0xc516, + 0xc516, 0xc516, 0xc516, 0xc516, 0xc516, 0xc517, 0xc517, 0xc517, + 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, + 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, 0xc517, 0xc518, 0xc518, + 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, + 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, 0xc518, + 0xc519, 0xc519, 0xc519, 0xc519, 0xc519, 0xc519, 0xc519, 0xc519, + 0xc519, 0xc51a, 0xc51a, 0xc51a, 0xc51a, 0xc51a, 0xc51a, 0xc51a, + 0xc51a, 0xc51a, 0xc51b, 0xc51b, 0xc51b, 0xc51b, 0xc51b, 0xc51b, + 0xc51b, 0xc51b, 0xc51b, 0xc51c, 0xc51c, 0xc51c, 0xc51c, 0xc51c, + 0xc51c, 0xc51c, 0xc51c, 0xc51c, 0xc51d, 0xc51d, 0xc51d, 0xc51d, + 0xc51d, 0xc51d, 0xc51d, 0xc51d, 0xc51d, 0xc51e, 0xc51e, 0xc51e, + 0xc51e, 0xc51e, 0xc51e, 0xc51e, 0xc51e, 0xc51e, 0xc51f, 0xc51f, + 0xc51f, 0xc51f, 0xc51f, 0xc51f, 0xc51f, 0xc51f, 0xc51f, 0xc51f, + 0xc520, 0xc520, 0xc520, 0xc520, 0xc520, 0xc520, 0xc520, 0xc520, + 0xc520, 0xc521, 0xc521, 0xc521, 0xc521, 0xc521, 0xc521, 0xc521, + 0xc521, 0xc521, 0xc522, 0xc522, 0xc522, 0xc522, 0xc522, 0xc522, + 0xc522, 0xc522, 0xc522, 0xc522, 0xc523, 0xc523, 0xc523, 0xc523, + 0xc523, 0xc523, 0xc523, 0xc523, 0xc523, 0xc523, 0xc524, 0xc524, + 0xc524, 0xc524, 0xc524, 0xc524, 0xc524, 0xc524, 0xc524, 0xc525, + 0xc525, 0xc525, 0xc525, 0xc525, 0xc525, 0xc525, 0xc525, 0xc525, + 0xc525, 0xc526, 0xc526, 0xc526, 0xc526, 0xc526, 0xc526, 0xc526, + 0xc526, 0xc526, 0xc526, 0xc527, 0xc527, 0xc527, 0xc527, 0xc527, + 0xc527, 0xc527, 0xc527, 0xc527, 0xc527, 0xc528, 0xc528, 0xc528, + 0xc528, 0xc528, 0xc528, 0xc528, 0xc528, 0xc528, 0xc528, 0xc529, + 0xc529, 0xc529, 0xc529, 0xc529, 0xc529, 0xc529, 0xc529, 0xc529, + 0xc529, 0xc52a, 0xc52a, 0xc52a, 0xc52a, 0xc52a, 0xc52a, 0xc52a, + 0xc52a, 0xc52a, 0xc52a, 0xc52b, 0xc52b, 0xc52b, 0xc52b, 0xc52b, + 0xc52b, 0xc52b, 0xc52b, 0xc52b, 0xc52b, 0xc52b, 0xc52c, 0xc52c, + 0xc52c, 0xc52c, 0xc52c, 0xc52c, 0xc52c, 0xc52c, 0xc52c, 0xc52c, + 0xc52d, 0xc52d, 0xc52d, 0xc52d, 0xc52d, 0xc52d, 0xc52d, 0xc52d, + 0xc52d, 0xc52d, 0xc52d, 0xc52e, 0xc52e, 0xc52e, 0xc52e, 0xc52e, + 0xc52e, 0xc52e, 0xc52e, 0xc52e, 0xc52e, 0xc52f, 0xc52f, 0xc52f, + 0xc52f, 0xc52f, 0xc52f, 0xc52f, 0xc52f, 0xc52f, 0xc52f, 0xc52f, + 0xc530, 0xc530, 0xc530, 0xc530, 0xc530, 0xc530, 0xc530, 0xc530, + 0xc530, 0xc530, 0xc530, 0xc531, 0xc531, 0xc531, 0xc531, 0xc531, + 0xc531, 0xc531, 0xc531, 0xc531, 0xc531, 0xc532, 0xc532, 0xc532, + 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, + 0xc533, 0xc533, 0xc533, 0xc533, 0xc533, 0xc533, 0xc533, 0xc533, + 0xc533, 0xc533, 0xc533, 0xc534, 0xc534, 0xc534, 0xc534, 0xc534, + 0xc534, 0xc534, 0xc534, 0xc534, 0xc534, 0xc534, 0xc534, 0xc535, + 0xc535, 0xc535, 0xc535, 0xc535, 0xc535, 0xc535, 0xc535, 0xc535, + 0xc535, 0xc535, 0xc536, 0xc536, 0xc536, 0xc536, 0xc536, 0xc536, + 0xc536, 0xc536, 0xc536, 0xc536, 0xc536, 0xc537, 0xc537, 0xc537, + 0xc537, 0xc537, 0xc537, 0xc537, 0xc537, 0xc537, 0xc537, 0xc537, + 0xc537, 0xc538, 0xc538, 0xc538, 0xc538, 0xc538, 0xc538, 0xc538, + 0xc538, 0xc538, 0xc538, 0xc538, 0xc539, 0xc539, 0xc539, 0xc539, + 0xc539, 0xc539, 0xc539, 0xc539, 0xc539, 0xc539, 0xc539, 0xc539, + 0xc53a, 0xc53a, 0xc53a, 0xc53a, 0xc53a, 0xc53a, 0xc53a, 0xc53a, + 0xc53a, 0xc53a, 0xc53a, 0xc53b, 0xc53b, 0xc53b, 0xc53b, 0xc53b, + 0xc53b, 0xc53b, 0xc53b, 0xc53b, 0xc53b, 0xc53b, 0xc53b, 0xc53c, + 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, 0xc53c, + 0xc53c, 0xc53c, 0xc53c, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, + 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53d, 0xc53e, + 0xc53e, 0xc53e, 0xc53e, 0xc53e, 0xc53e, 0xc53e, 0xc53e, 0xc53e, + 0xc53e, 0xc53e, 0xc53e, 0xc53f, 0xc53f, 0xc53f, 0xc53f, 0xc53f, + 0xc53f, 0xc53f, 0xc53f, 0xc53f, 0xc53f, 0xc53f, 0xc53f, 0xc53f, + 0xc540, 0xc540, 0xc540, 0xc540, 0xc540, 0xc540, 0xc540, 0xc540, + 0xc540, 0xc540, 0xc540, 0xc540, 0xc541, 0xc541, 0xc541, 0xc541, + 0xc541, 0xc541, 0xc541, 0xc541, 0xc541, 0xc541, 0xc541, 0xc541, + 0xc541, 0xc542, 0xc542, 0xc542, 0xc542, 0xc542, 0xc542, 0xc542, + 0xc542, 0xc542, 0xc542, 0xc542, 0xc542, 0xc543, 0xc543, 0xc543, + 0xc543, 0xc543, 0xc543, 0xc543, 0xc543, 0xc543, 0xc543, 0xc543, + 0xc543, 0xc543, 0xc544, 0xc544, 0xc544, 0xc544, 0xc544, 0xc544, + 0xc544, 0xc544, 0xc544, 0xc544, 0xc544, 0xc544, 0xc544, 0xc545, + 0xc545, 0xc545, 0xc545, 0xc545, 0xc545, 0xc545, 0xc545, 0xc545, + 0xc545, 0xc545, 0xc545, 0xc546, 0xc546, 0xc546, 0xc546, 0xc546, + 0xc546, 0xc546, 0xc546, 0xc546, 0xc546, 0xc546, 0xc546, 0xc546, + 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, + 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc548, 0xc548, + 0xc548, 0xc548, 0xc548, 0xc548, 0xc548, 0xc548, 0xc548, 0xc548, + 0xc548, 0xc548, 0xc548, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, + 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, + 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, + 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54a, 0xc54b, 0xc54b, + 0xc54b, 0xc54b, 0xc54b, 0xc54b, 0xc54b, 0xc54b, 0xc54b, 0xc54b, + 0xc54b, 0xc54b, 0xc54b, 0xc54c, 0xc54c, 0xc54c, 0xc54c, 0xc54c, + 0xc54c, 0xc54c, 0xc54c, 0xc54c, 0xc54c, 0xc54c, 0xc54c, 0xc54c, + 0xc54c, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, + 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54d, 0xc54e, + 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, + 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54e, 0xc54f, 0xc54f, 0xc54f, + 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, + 0xc54f, 0xc54f, 0xc54f, 0xc550, 0xc550, 0xc550, 0xc550, 0xc550, + 0xc550, 0xc550, 0xc550, 0xc550, 0xc550, 0xc550, 0xc550, 0xc550, + 0xc550, 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, + 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, 0xc551, 0xc552, + 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, + 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, 0xc552, 0xc553, 0xc553, + 0xc553, 0xc553, 0xc553, 0xc553, 0xc553, 0xc553, 0xc553, 0xc553, + 0xc553, 0xc553, 0xc553, 0xc553, 0xc554, 0xc554, 0xc554, 0xc554, + 0xc554, 0xc554, 0xc554, 0xc554, 0xc554, 0xc554, 0xc554, 0xc554, + 0xc554, 0xc554, 0xc554, 0xc555, 0xc555, 0xc555, 0xc555, 0xc555, + 0xc555, 0xc555, 0xc555, 0xc555, 0xc555, 0xc555, 0xc555, 0xc555, + 0xc555, 0xc555, 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, + 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, + 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, + 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, 0xc557, + 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, + 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc558, 0xc559, + 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, + 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, 0xc559, 0xc55a, 0xc55a, + 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, + 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55b, 0xc55b, 0xc55b, + 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55b, + 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55b, 0xc55c, 0xc55c, 0xc55c, + 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55c, + 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55c, 0xc55d, 0xc55d, 0xc55d, + 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55d, + 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55d, 0xc55e, 0xc55e, 0xc55e, + 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55e, + 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55e, 0xc55f, 0xc55f, 0xc55f, + 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc55f, + 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc560, 0xc560, 0xc560, + 0xc560, 0xc560, 0xc560, 0xc560, 0xc560, 0xc560, 0xc560, 0xc560, + 0xc560, 0xc560, 0xc560, 0xc560, 0xc560, 0xc561, 0xc561, 0xc561, + 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, + 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc562, 0xc562, 0xc562, + 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, + 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, 0xc562, 0xc563, 0xc563, + 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, + 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc563, 0xc564, + 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, + 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc564, 0xc565, + 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, + 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, 0xc565, + 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, + 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, + 0xc566, 0xc566, 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, + 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, 0xc567, + 0xc567, 0xc567, 0xc567, 0xc568, 0xc568, 0xc568, 0xc568, 0xc568, + 0xc568, 0xc568, 0xc568, 0xc568, 0xc568, 0xc568, 0xc568, 0xc568, + 0xc568, 0xc568, 0xc568, 0xc568, 0xc569, 0xc569, 0xc569, 0xc569, + 0xc569, 0xc569, 0xc569, 0xc569, 0xc569, 0xc569, 0xc569, 0xc569, + 0xc569, 0xc569, 0xc569, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, + 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56b, 0xc56b, 0xc56b, 0xc56b, + 0xc56b, 0xc56b, 0xc56b, 0xc56b, 0xc56b, 0xc56c, 0xc56c, 0xc56c, + 0xc56c, 0xc56c, 0xc56c, 0xc56c, 0xc56c, 0xc56c, 0xc56d, 0xc56d, + 0xc56d, 0xc56d, 0xc56d, 0xc56d, 0xc56d, 0xc56d, 0xc56d, 0xc56e, + 0xc56e, 0xc56e, 0xc56e, 0xc56e, 0xc56e, 0xc56e, 0xc56e, 0xc56e, + 0xc56f, 0xc56f, 0xc56f, 0xc56f, 0xc56f, 0xc56f, 0xc56f, 0xc56f, + 0xc56f, 0xc570, 0xc570, 0xc570, 0xc570, 0xc570, 0xc570, 0xc570, + 0xc570, 0xc570, 0xc570, 0xc571, 0xc571, 0xc571, 0xc571, 0xc571, + 0xc571, 0xc571, 0xc571, 0xc571, 0xc572, 0xc572, 0xc572, 0xc572, + 0xc572, 0xc572, 0xc572, 0xc572, 0xc572, 0xc572, 0xc573, 0xc573, + 0xc573, 0xc573, 0xc573, 0xc573, 0xc573, 0xc573, 0xc573, 0xc574, + 0xc574, 0xc574, 0xc574, 0xc574, 0xc574, 0xc574, 0xc574, 0xc574, + 0xc574, 0xc575, 0xc575, 0xc575, 0xc575, 0xc575, 0xc575, 0xc575, + 0xc575, 0xc575, 0xc575, 0xc576, 0xc576, 0xc576, 0xc576, 0xc576, + 0xc576, 0xc576, 0xc576, 0xc576, 0xc577, 0xc577, 0xc577, 0xc577, + 0xc577, 0xc577, 0xc577, 0xc577, 0xc577, 0xc577, 0xc578, 0xc578, + 0xc578, 0xc578, 0xc578, 0xc578, 0xc578, 0xc578, 0xc578, 0xc578, + 0xc579, 0xc579, 0xc579, 0xc579, 0xc579, 0xc579, 0xc579, 0xc579, + 0xc579, 0xc579, 0xc57a, 0xc57a, 0xc57a, 0xc57a, 0xc57a, 0xc57a, + 0xc57a, 0xc57a, 0xc57a, 0xc57a, 0xc57a, 0xc57b, 0xc57b, 0xc57b, + 0xc57b, 0xc57b, 0xc57b, 0xc57b, 0xc57b, 0xc57b, 0xc57b, 0xc57c, + 0xc57c, 0xc57c, 0xc57c, 0xc57c, 0xc57c, 0xc57c, 0xc57c, 0xc57c, + 0xc57c, 0xc57d, 0xc57d, 0xc57d, 0xc57d, 0xc57d, 0xc57d, 0xc57d, + 0xc57d, 0xc57d, 0xc57d, 0xc57d, 0xc57e, 0xc57e, 0xc57e, 0xc57e, + 0xc57e, 0xc57e, 0xc57e, 0xc57e, 0xc57e, 0xc57e, 0xc57f, 0xc57f, + 0xc57f, 0xc57f, 0xc57f, 0xc57f, 0xc57f, 0xc57f, 0xc57f, 0xc57f, + 0xc57f, 0xc580, 0xc580, 0xc580, 0xc580, 0xc580, 0xc580, 0xc580, + 0xc580, 0xc580, 0xc580, 0xc580, 0xc581, 0xc581, 0xc581, 0xc581, + 0xc581, 0xc581, 0xc581, 0xc581, 0xc581, 0xc581, 0xc582, 0xc582, + 0xc582, 0xc582, 0xc582, 0xc582, 0xc582, 0xc582, 0xc582, 0xc582, + 0xc582, 0xc583, 0xc583, 0xc583, 0xc583, 0xc583, 0xc583, 0xc583, + 0xc583, 0xc583, 0xc583, 0xc583, 0xc584, 0xc584, 0xc584, 0xc584, + 0xc584, 0xc584, 0xc584, 0xc584, 0xc584, 0xc584, 0xc584, 0xc585, + 0xc585, 0xc585, 0xc585, 0xc585, 0xc585, 0xc585, 0xc585, 0xc585, + 0xc585, 0xc585, 0xc586, 0xc586, 0xc586, 0xc586, 0xc586, 0xc586, + 0xc586, 0xc586, 0xc586, 0xc586, 0xc586, 0xc586, 0xc587, 0xc587, + 0xc587, 0xc587, 0xc587, 0xc587, 0xc587, 0xc587, 0xc587, 0xc587, + 0xc587, 0xc588, 0xc588, 0xc588, 0xc588, 0xc588, 0xc588, 0xc588, + 0xc588, 0xc588, 0xc588, 0xc588, 0xc588, 0xc589, 0xc589, 0xc589, + 0xc589, 0xc589, 0xc589, 0xc589, 0xc589, 0xc589, 0xc589, 0xc589, + 0xc58a, 0xc58a, 0xc58a, 0xc58a, 0xc58a, 0xc58a, 0xc58a, 0xc58a, + 0xc58a, 0xc58a, 0xc58a, 0xc58a, 0xc58b, 0xc58b, 0xc58b, 0xc58b, + 0xc58b, 0xc58b, 0xc58b, 0xc58b, 0xc58b, 0xc58b, 0xc58b, 0xc58b, + 0xc58c, 0xc58c, 0xc58c, 0xc58c, 0xc58c, 0xc58c, 0xc58c, 0xc58c, + 0xc58c, 0xc58c, 0xc58c, 0xc58d, 0xc58d, 0xc58d, 0xc58d, 0xc58d, + 0xc58d, 0xc58d, 0xc58d, 0xc58d, 0xc58d, 0xc58d, 0xc58d, 0xc58e, + 0xc58e, 0xc58e, 0xc58e, 0xc58e, 0xc58e, 0xc58e, 0xc58e, 0xc58e, + 0xc58e, 0xc58e, 0xc58e, 0xc58f, 0xc58f, 0xc58f, 0xc58f, 0xc58f, + 0xc58f, 0xc58f, 0xc58f, 0xc58f, 0xc58f, 0xc58f, 0xc58f, 0xc58f, + 0xc590, 0xc590, 0xc590, 0xc590, 0xc590, 0xc590, 0xc590, 0xc590, + 0xc590, 0xc590, 0xc590, 0xc590, 0xc591, 0xc591, 0xc591, 0xc591, + 0xc591, 0xc591, 0xc591, 0xc591, 0xc591, 0xc591, 0xc591, 0xc591, + 0xc592, 0xc592, 0xc592, 0xc592, 0xc592, 0xc592, 0xc592, 0xc592, + 0xc592, 0xc592, 0xc592, 0xc592, 0xc592, 0xc593, 0xc593, 0xc593, + 0xc593, 0xc593, 0xc593, 0xc593, 0xc593, 0xc593, 0xc593, 0xc593, + 0xc593, 0xc594, 0xc594, 0xc594, 0xc594, 0xc594, 0xc594, 0xc594, + 0xc594, 0xc594, 0xc594, 0xc594, 0xc594, 0xc594, 0xc595, 0xc595, + 0xc595, 0xc595, 0xc595, 0xc595, 0xc595, 0xc595, 0xc595, 0xc595, + 0xc595, 0xc595, 0xc595, 0xc596, 0xc596, 0xc596, 0xc596, 0xc596, + 0xc596, 0xc596, 0xc596, 0xc596, 0xc596, 0xc596, 0xc596, 0xc596, + 0xc597, 0xc597, 0xc597, 0xc597, 0xc597, 0xc597, 0xc597, 0xc597, + 0xc597, 0xc597, 0xc597, 0xc597, 0xc597, 0xc598, 0xc598, 0xc598, + 0xc598, 0xc598, 0xc598, 0xc598, 0xc598, 0xc598, 0xc598, 0xc598, + 0xc598, 0xc598, 0xc599, 0xc599, 0xc599, 0xc599, 0xc599, 0xc599, + 0xc599, 0xc599, 0xc599, 0xc599, 0xc599, 0xc599, 0xc599, 0xc59a, + 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59a, + 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59a, 0xc59b, 0xc59b, 0xc59b, + 0xc59b, 0xc59b, 0xc59b, 0xc59b, 0xc59b, 0xc59b, 0xc59b, 0xc59b, + 0xc59b, 0xc59b, 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, + 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, 0xc59c, + 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, + 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59e, 0xc59e, + 0xc59e, 0xc59e, 0xc59e, 0xc59e, 0xc59e, 0xc59e, 0xc59e, 0xc59e, + 0xc59e, 0xc59e, 0xc59e, 0xc59f, 0xc59f, 0xc59f, 0xc59f, 0xc59f, + 0xc59f, 0xc59f, 0xc59f, 0xc59f, 0xc59f, 0xc59f, 0xc59f, 0xc59f, + 0xc59f, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, + 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a0, 0xc5a1, + 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, + 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a1, 0xc5a2, 0xc5a2, + 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, + 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a2, 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, + 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a3, + 0xc5a3, 0xc5a3, 0xc5a3, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, + 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, 0xc5a4, + 0xc5a4, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, + 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, 0xc5a5, + 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, + 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a6, 0xc5a7, + 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, + 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a7, 0xc5a8, 0xc5a8, + 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, + 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a8, 0xc5a9, 0xc5a9, 0xc5a9, + 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, + 0xc5a9, 0xc5a9, 0xc5a9, 0xc5a9, 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, + 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, 0xc5aa, + 0xc5aa, 0xc5aa, 0xc5aa, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, + 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ab, + 0xc5ab, 0xc5ab, 0xc5ab, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, + 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, 0xc5ac, + 0xc5ac, 0xc5ac, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, + 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, 0xc5ad, + 0xc5ad, 0xc5ad, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, + 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, 0xc5ae, + 0xc5ae, 0xc5ae, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, + 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, 0xc5af, + 0xc5af, 0xc5af, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, + 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, 0xc5b0, + 0xc5b0, 0xc5b0, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, + 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b1, + 0xc5b1, 0xc5b1, 0xc5b1, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, + 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b2, + 0xc5b2, 0xc5b2, 0xc5b2, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, + 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, + 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b3, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, + 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, + 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b4, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, + 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, + 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b5, 0xc5b6, 0xc5b6, 0xc5b6, + 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, + 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b6, 0xc5b7, 0xc5b7, + 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, + 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b8, + 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, + 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, 0xc5b8, + 0xc5b8, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, + 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, 0xc5b9, + 0xc5b9, 0xc5b9, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, + 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5ba, 0xc5bb, 0xc5bb, + 0xc5bb, 0xc5bb, 0xc5bb, 0xc5bb, 0xc5bb, 0xc5bb, 0xc5bb, 0xc5bc, + 0xc5bc, 0xc5bc, 0xc5bc, 0xc5bc, 0xc5bc, 0xc5bc, 0xc5bc, 0xc5bc, + 0xc5bd, 0xc5bd, 0xc5bd, 0xc5bd, 0xc5bd, 0xc5bd, 0xc5bd, 0xc5bd, + 0xc5bd, 0xc5be, 0xc5be, 0xc5be, 0xc5be, 0xc5be, 0xc5be, 0xc5be, + 0xc5be, 0xc5be, 0xc5bf, 0xc5bf, 0xc5bf, 0xc5bf, 0xc5bf, 0xc5bf, + 0xc5bf, 0xc5bf, 0xc5bf, 0xc5c0, 0xc5c0, 0xc5c0, 0xc5c0, 0xc5c0, + 0xc5c0, 0xc5c0, 0xc5c0, 0xc5c0, 0xc5c0, 0xc5c1, 0xc5c1, 0xc5c1, + 0xc5c1, 0xc5c1, 0xc5c1, 0xc5c1, 0xc5c1, 0xc5c1, 0xc5c2, 0xc5c2, + 0xc5c2, 0xc5c2, 0xc5c2, 0xc5c2, 0xc5c2, 0xc5c2, 0xc5c2, 0xc5c3, + 0xc5c3, 0xc5c3, 0xc5c3, 0xc5c3, 0xc5c3, 0xc5c3, 0xc5c3, 0xc5c3, + 0xc5c3, 0xc5c4, 0xc5c4, 0xc5c4, 0xc5c4, 0xc5c4, 0xc5c4, 0xc5c4, + 0xc5c4, 0xc5c4, 0xc5c4, 0xc5c5, 0xc5c5, 0xc5c5, 0xc5c5, 0xc5c5, + 0xc5c5, 0xc5c5, 0xc5c5, 0xc5c5, 0xc5c6, 0xc5c6, 0xc5c6, 0xc5c6, + 0xc5c6, 0xc5c6, 0xc5c6, 0xc5c6, 0xc5c6, 0xc5c6, 0xc5c7, 0xc5c7, + 0xc5c7, 0xc5c7, 0xc5c7, 0xc5c7, 0xc5c7, 0xc5c7, 0xc5c7, 0xc5c7, + 0xc5c8, 0xc5c8, 0xc5c8, 0xc5c8, 0xc5c8, 0xc5c8, 0xc5c8, 0xc5c8, + 0xc5c8, 0xc5c8, 0xc5c9, 0xc5c9, 0xc5c9, 0xc5c9, 0xc5c9, 0xc5c9, + 0xc5c9, 0xc5c9, 0xc5c9, 0xc5c9, 0xc5ca, 0xc5ca, 0xc5ca, 0xc5ca, + 0xc5ca, 0xc5ca, 0xc5ca, 0xc5ca, 0xc5ca, 0xc5ca, 0xc5cb, 0xc5cb, + 0xc5cb, 0xc5cb, 0xc5cb, 0xc5cb, 0xc5cb, 0xc5cb, 0xc5cb, 0xc5cb, + 0xc5cc, 0xc5cc, 0xc5cc, 0xc5cc, 0xc5cc, 0xc5cc, 0xc5cc, 0xc5cc, + 0xc5cc, 0xc5cc, 0xc5cd, 0xc5cd, 0xc5cd, 0xc5cd, 0xc5cd, 0xc5cd, + 0xc5cd, 0xc5cd, 0xc5cd, 0xc5cd, 0xc5cd, 0xc5ce, 0xc5ce, 0xc5ce, + 0xc5ce, 0xc5ce, 0xc5ce, 0xc5ce, 0xc5ce, 0xc5ce, 0xc5ce, 0xc5cf, + 0xc5cf, 0xc5cf, 0xc5cf, 0xc5cf, 0xc5cf, 0xc5cf, 0xc5cf, 0xc5cf, + 0xc5cf, 0xc5cf, 0xc5d0, 0xc5d0, 0xc5d0, 0xc5d0, 0xc5d0, 0xc5d0, + 0xc5d0, 0xc5d0, 0xc5d0, 0xc5d0, 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d1, + 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d1, 0xc5d2, + 0xc5d2, 0xc5d2, 0xc5d2, 0xc5d2, 0xc5d2, 0xc5d2, 0xc5d2, 0xc5d2, + 0xc5d2, 0xc5d2, 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d3, + 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d3, 0xc5d4, 0xc5d4, 0xc5d4, + 0xc5d4, 0xc5d4, 0xc5d4, 0xc5d4, 0xc5d4, 0xc5d4, 0xc5d4, 0xc5d4, + 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d5, + 0xc5d5, 0xc5d5, 0xc5d5, 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d6, + 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d6, 0xc5d7, 0xc5d7, + 0xc5d7, 0xc5d7, 0xc5d7, 0xc5d7, 0xc5d7, 0xc5d7, 0xc5d7, 0xc5d7, + 0xc5d7, 0xc5d7, 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d8, + 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d8, 0xc5d9, 0xc5d9, 0xc5d9, + 0xc5d9, 0xc5d9, 0xc5d9, 0xc5d9, 0xc5d9, 0xc5d9, 0xc5d9, 0xc5d9, + 0xc5da, 0xc5da, 0xc5da, 0xc5da, 0xc5da, 0xc5da, 0xc5da, 0xc5da, + 0xc5da, 0xc5da, 0xc5da, 0xc5da, 0xc5db, 0xc5db, 0xc5db, 0xc5db, + 0xc5db, 0xc5db, 0xc5db, 0xc5db, 0xc5db, 0xc5db, 0xc5db, 0xc5db, + 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, + 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dc, 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, + 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, 0xc5dd, + 0xc5de, 0xc5de, 0xc5de, 0xc5de, 0xc5de, 0xc5de, 0xc5de, 0xc5de, + 0xc5de, 0xc5de, 0xc5de, 0xc5de, 0xc5df, 0xc5df, 0xc5df, 0xc5df, + 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, 0xc5df, + 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, + 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e0, 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, + 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, 0xc5e1, + 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, + 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e2, 0xc5e3, 0xc5e3, 0xc5e3, + 0xc5e3, 0xc5e3, 0xc5e3, 0xc5e3, 0xc5e3, 0xc5e3, 0xc5e3, 0xc5e3, + 0xc5e3, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, + 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e4, 0xc5e5, 0xc5e5, + 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, + 0xc5e5, 0xc5e5, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, + 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e6, 0xc5e7, + 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, + 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e7, 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, + 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, 0xc5e8, + 0xc5e8, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, + 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5e9, 0xc5ea, + 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, + 0xc5ea, 0xc5ea, 0xc5ea, 0xc5ea, 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, + 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, 0xc5eb, + 0xc5eb, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, + 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ec, 0xc5ed, + 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, + 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ed, 0xc5ee, 0xc5ee, 0xc5ee, + 0xc5ee, 0xc5ee, 0xc5ee, 0xc5ee, 0xc5ee, 0xc5ee, 0xc5ee, 0xc5ee, + 0xc5ee, 0xc5ee, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, + 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, + 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, + 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f0, 0xc5f1, 0xc5f1, + 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, + 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f1, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, + 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f2, + 0xc5f2, 0xc5f2, 0xc5f2, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, + 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, 0xc5f3, + 0xc5f3, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, + 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f4, 0xc5f5, + 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, + 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f5, 0xc5f6, 0xc5f6, + 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, + 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f6, 0xc5f7, 0xc5f7, 0xc5f7, + 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, + 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f7, 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, + 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f8, + 0xc5f8, 0xc5f8, 0xc5f8, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, + 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, 0xc5f9, + 0xc5f9, 0xc5f9, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, + 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, 0xc5fa, + 0xc5fa, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, + 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, 0xc5fb, + 0xc5fb, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, + 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, 0xc5fc, + 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, + 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, 0xc5fd, + 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, + 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, 0xc5fe, + 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, + 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, + 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, + 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, 0xc600, + 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, + 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, 0xc601, + 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, + 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, 0xc602, + 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, + 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, 0xc603, + 0xc603, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, + 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, 0xc604, + 0xc604, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, + 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, 0xc605, + 0xc605, 0xc605, 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, + 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, 0xc606, + 0xc606, 0xc606, 0xc606, 0xc607, 0xc607, 0xc607, 0xc607, 0xc607, + 0xc607, 0xc607, 0xc607, 0xc607, 0xc607, 0xc607, 0xc607, 0xc607, + 0xc607, 0xc607, 0xc607, 0xc607, 0xc608, 0xc608, 0xc608, 0xc608, + 0xc608, 0xc608, 0xc608, 0xc608, 0xc608, 0xc608, 0xc608, 0xc608, + 0xc608, 0xc608, 0xc608, 0xc608, 0xc608, 0xc609, 0xc609, 0xc609, + 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, + 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc609, 0xc60a, + 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, + 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, 0xc60a, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + + + +static unsigned int closestDataOffset[] = { + 0, 0, 1, 2, 4, 5, 7, 9, + 12, 13, 15, 17, 20, 22, 25, 28, + 32, 33, 35, 37, 40, 42, 45, 48, + 52, 54, 57, 60, 64, 67, 71, 75, + 80, 81, 83, 85, 88, 90, 93, 96, + 100, 102, 105, 108, 112, 115, 119, 123, + 128, 130, 133, 136, 140, 143, 147, 151, + 156, 159, 163, 167, 172, 176, 181, 186, + 192, 193, 195, 197, 200, 202, 205, 208, + 212, 214, 217, 220, 224, 227, 231, 235, + 240, 242, 245, 248, 252, 255, 259, 263, + 268, 271, 275, 279, 284, 288, 293, 298, + 304, 306, 309, 312, 316, 319, 323, 327, + 332, 335, 339, 343, 348, 352, 357, 362, + 368, 371, 375, 379, 384, 388, 393, 398, + 404, 408, 413, 418, 424, 429, 435, 441, + 448, 449, 451, 453, 456, 458, 461, 464, + 468, 470, 473, 476, 480, 483, 487, 491, + 496, 498, 501, 504, 508, 511, 515, 519, + 524, 527, 531, 535, 540, 544, 549, 554, + 560, 562, 565, 568, 572, 575, 579, 583, + 588, 591, 595, 599, 604, 608, 613, 618, + 624, 627, 631, 635, 640, 644, 649, 654, + 660, 664, 669, 674, 680, 685, 691, 697, + 704, 706, 709, 712, 716, 719, 723, 727, + 732, 735, 739, 743, 748, 752, 757, 762, + 768, 771, 775, 779, 784, 788, 793, 798, + 804, 808, 813, 818, 824, 829, 835, 841, + 848, 851, 855, 859, 864, 868, 873, 878, + 884, 888, 893, 898, 904, 909, 915, 921, + 928, 932, 937, 942, 948, 953, 959, 965, + 972, 977, 983, 989, 996, 1002, 1009, 1016, + 1024, 1025, 1027, 1029, 1032, 1034, 1037, 1040, + 1044, 1046, 1049, 1052, 1056, 1059, 1063, 1067, + 1072, 1074, 1077, 1080, 1084, 1087, 1091, 1095, + 1100, 1103, 1107, 1111, 1116, 1120, 1125, 1130, + 1136, 1138, 1141, 1144, 1148, 1151, 1155, 1159, + 1164, 1167, 1171, 1175, 1180, 1184, 1189, 1194, + 1200, 1203, 1207, 1211, 1216, 1220, 1225, 1230, + 1236, 1240, 1245, 1250, 1256, 1261, 1267, 1273, + 1280, 1282, 1285, 1288, 1292, 1295, 1299, 1303, + 1308, 1311, 1315, 1319, 1324, 1328, 1333, 1338, + 1344, 1347, 1351, 1355, 1360, 1364, 1369, 1374, + 1380, 1384, 1389, 1394, 1400, 1405, 1411, 1417, + 1424, 1427, 1431, 1435, 1440, 1444, 1449, 1454, + 1460, 1464, 1469, 1474, 1480, 1485, 1491, 1497, + 1504, 1508, 1513, 1518, 1524, 1529, 1535, 1541, + 1548, 1553, 1559, 1565, 1572, 1578, 1585, 1592, + 1600, 1602, 1605, 1608, 1612, 1615, 1619, 1623, + 1628, 1631, 1635, 1639, 1644, 1648, 1653, 1658, + 1664, 1667, 1671, 1675, 1680, 1684, 1689, 1694, + 1700, 1704, 1709, 1714, 1720, 1725, 1731, 1737, + 1744, 1747, 1751, 1755, 1760, 1764, 1769, 1774, + 1780, 1784, 1789, 1794, 1800, 1805, 1811, 1817, + 1824, 1828, 1833, 1838, 1844, 1849, 1855, 1861, + 1868, 1873, 1879, 1885, 1892, 1898, 1905, 1912, + 1920, 1923, 1927, 1931, 1936, 1940, 1945, 1950, + 1956, 1960, 1965, 1970, 1976, 1981, 1987, 1993, + 2000, 2004, 2009, 2014, 2020, 2025, 2031, 2037, + 2044, 2049, 2055, 2061, 2068, 2074, 2081, 2088, + 2096, 2100, 2105, 2110, 2116, 2121, 2127, 2133, + 2140, 2145, 2151, 2157, 2164, 2170, 2177, 2184, + 2192, 2197, 2203, 2209, 2216, 2222, 2229, 2236, + 2244, 2250, 2257, 2264, 2272, 2279, 2287, 2295, + 2304, 2305, 2307, 2309, 2312, 2314, 2317, 2320, + 2324, 2326, 2329, 2332, 2336, 2339, 2343, 2347, + 2352, 2354, 2357, 2360, 2364, 2367, 2371, 2375, + 2380, 2383, 2387, 2391, 2396, 2400, 2405, 2410, + 2416, 2418, 2421, 2424, 2428, 2431, 2435, 2439, + 2444, 2447, 2451, 2455, 2460, 2464, 2469, 2474, + 2480, 2483, 2487, 2491, 2496, 2500, 2505, 2510, + 2516, 2520, 2525, 2530, 2536, 2541, 2547, 2553, + 2560, 2562, 2565, 2568, 2572, 2575, 2579, 2583, + 2588, 2591, 2595, 2599, 2604, 2608, 2613, 2618, + 2624, 2627, 2631, 2635, 2640, 2644, 2649, 2654, + 2660, 2664, 2669, 2674, 2680, 2685, 2691, 2697, + 2704, 2707, 2711, 2715, 2720, 2724, 2729, 2734, + 2740, 2744, 2749, 2754, 2760, 2765, 2771, 2777, + 2784, 2788, 2793, 2798, 2804, 2809, 2815, 2821, + 2828, 2833, 2839, 2845, 2852, 2858, 2865, 2872, + 2880, 2882, 2885, 2888, 2892, 2895, 2899, 2903, + 2908, 2911, 2915, 2919, 2924, 2928, 2933, 2938, + 2944, 2947, 2951, 2955, 2960, 2964, 2969, 2974, + 2980, 2984, 2989, 2994, 3000, 3005, 3011, 3017, + 3024, 3027, 3031, 3035, 3040, 3044, 3049, 3054, + 3060, 3064, 3069, 3074, 3080, 3085, 3091, 3097, + 3104, 3108, 3113, 3118, 3124, 3129, 3135, 3141, + 3148, 3153, 3159, 3165, 3172, 3178, 3185, 3192, + 3200, 3203, 3207, 3211, 3216, 3220, 3225, 3230, + 3236, 3240, 3245, 3250, 3256, 3261, 3267, 3273, + 3280, 3284, 3289, 3294, 3300, 3305, 3311, 3317, + 3324, 3329, 3335, 3341, 3348, 3354, 3361, 3368, + 3376, 3380, 3385, 3390, 3396, 3401, 3407, 3413, + 3420, 3425, 3431, 3437, 3444, 3450, 3457, 3464, + 3472, 3477, 3483, 3489, 3496, 3502, 3509, 3516, + 3524, 3530, 3537, 3544, 3552, 3559, 3567, 3575, + 3584, 3586, 3589, 3592, 3596, 3599, 3603, 3607, + 3612, 3615, 3619, 3623, 3628, 3632, 3637, 3642, + 3648, 3651, 3655, 3659, 3664, 3668, 3673, 3678, + 3684, 3688, 3693, 3698, 3704, 3709, 3715, 3721, + 3728, 3731, 3735, 3739, 3744, 3748, 3753, 3758, + 3764, 3768, 3773, 3778, 3784, 3789, 3795, 3801, + 3808, 3812, 3817, 3822, 3828, 3833, 3839, 3845, + 3852, 3857, 3863, 3869, 3876, 3882, 3889, 3896, + 3904, 3907, 3911, 3915, 3920, 3924, 3929, 3934, + 3940, 3944, 3949, 3954, 3960, 3965, 3971, 3977, + 3984, 3988, 3993, 3998, 4004, 4009, 4015, 4021, + 4028, 4033, 4039, 4045, 4052, 4058, 4065, 4072, + 4080, 4084, 4089, 4094, 4100, 4105, 4111, 4117, + 4124, 4129, 4135, 4141, 4148, 4154, 4161, 4168, + 4176, 4181, 4187, 4193, 4200, 4206, 4213, 4220, + 4228, 4234, 4241, 4248, 4256, 4263, 4271, 4279, + 4288, 4291, 4295, 4299, 4304, 4308, 4313, 4318, + 4324, 4328, 4333, 4338, 4344, 4349, 4355, 4361, + 4368, 4372, 4377, 4382, 4388, 4393, 4399, 4405, + 4412, 4417, 4423, 4429, 4436, 4442, 4449, 4456, + 4464, 4468, 4473, 4478, 4484, 4489, 4495, 4501, + 4508, 4513, 4519, 4525, 4532, 4538, 4545, 4552, + 4560, 4565, 4571, 4577, 4584, 4590, 4597, 4604, + 4612, 4618, 4625, 4632, 4640, 4647, 4655, 4663, + 4672, 4676, 4681, 4686, 4692, 4697, 4703, 4709, + 4716, 4721, 4727, 4733, 4740, 4746, 4753, 4760, + 4768, 4773, 4779, 4785, 4792, 4798, 4805, 4812, + 4820, 4826, 4833, 4840, 4848, 4855, 4863, 4871, + 4880, 4885, 4891, 4897, 4904, 4910, 4917, 4924, + 4932, 4938, 4945, 4952, 4960, 4967, 4975, 4983, + 4992, 4998, 5005, 5012, 5020, 5027, 5035, 5043, + 5052, 5059, 5067, 5075, 5084, 5092, 5101, 5110, + 5120, 5121, 5123, 5125, 5128, 5130, 5133, 5136, + 5140, 5142, 5145, 5148, 5152, 5155, 5159, 5163, + 5168, 5170, 5173, 5176, 5180, 5183, 5187, 5191, + 5196, 5199, 5203, 5207, 5212, 5216, 5221, 5226, + 5232, 5234, 5237, 5240, 5244, 5247, 5251, 5255, + 5260, 5263, 5267, 5271, 5276, 5280, 5285, 5290, + 5296, 5299, 5303, 5307, 5312, 5316, 5321, 5326, + 5332, 5336, 5341, 5346, 5352, 5357, 5363, 5369, + 5376, 5378, 5381, 5384, 5388, 5391, 5395, 5399, + 5404, 5407, 5411, 5415, 5420, 5424, 5429, 5434, + 5440, 5443, 5447, 5451, 5456, 5460, 5465, 5470, + 5476, 5480, 5485, 5490, 5496, 5501, 5507, 5513, + 5520, 5523, 5527, 5531, 5536, 5540, 5545, 5550, + 5556, 5560, 5565, 5570, 5576, 5581, 5587, 5593, + 5600, 5604, 5609, 5614, 5620, 5625, 5631, 5637, + 5644, 5649, 5655, 5661, 5668, 5674, 5681, 5688, + 5696, 5698, 5701, 5704, 5708, 5711, 5715, 5719, + 5724, 5727, 5731, 5735, 5740, 5744, 5749, 5754, + 5760, 5763, 5767, 5771, 5776, 5780, 5785, 5790, + 5796, 5800, 5805, 5810, 5816, 5821, 5827, 5833, + 5840, 5843, 5847, 5851, 5856, 5860, 5865, 5870, + 5876, 5880, 5885, 5890, 5896, 5901, 5907, 5913, + 5920, 5924, 5929, 5934, 5940, 5945, 5951, 5957, + 5964, 5969, 5975, 5981, 5988, 5994, 6001, 6008, + 6016, 6019, 6023, 6027, 6032, 6036, 6041, 6046, + 6052, 6056, 6061, 6066, 6072, 6077, 6083, 6089, + 6096, 6100, 6105, 6110, 6116, 6121, 6127, 6133, + 6140, 6145, 6151, 6157, 6164, 6170, 6177, 6184, + 6192, 6196, 6201, 6206, 6212, 6217, 6223, 6229, + 6236, 6241, 6247, 6253, 6260, 6266, 6273, 6280, + 6288, 6293, 6299, 6305, 6312, 6318, 6325, 6332, + 6340, 6346, 6353, 6360, 6368, 6375, 6383, 6391, + 6400, 6402, 6405, 6408, 6412, 6415, 6419, 6423, + 6428, 6431, 6435, 6439, 6444, 6448, 6453, 6458, + 6464, 6467, 6471, 6475, 6480, 6484, 6489, 6494, + 6500, 6504, 6509, 6514, 6520, 6525, 6531, 6537, + 6544, 6547, 6551, 6555, 6560, 6564, 6569, 6574, + 6580, 6584, 6589, 6594, 6600, 6605, 6611, 6617, + 6624, 6628, 6633, 6638, 6644, 6649, 6655, 6661, + 6668, 6673, 6679, 6685, 6692, 6698, 6705, 6712, + 6720, 6723, 6727, 6731, 6736, 6740, 6745, 6750, + 6756, 6760, 6765, 6770, 6776, 6781, 6787, 6793, + 6800, 6804, 6809, 6814, 6820, 6825, 6831, 6837, + 6844, 6849, 6855, 6861, 6868, 6874, 6881, 6888, + 6896, 6900, 6905, 6910, 6916, 6921, 6927, 6933, + 6940, 6945, 6951, 6957, 6964, 6970, 6977, 6984, + 6992, 6997, 7003, 7009, 7016, 7022, 7029, 7036, + 7044, 7050, 7057, 7064, 7072, 7079, 7087, 7095, + 7104, 7107, 7111, 7115, 7120, 7124, 7129, 7134, + 7140, 7144, 7149, 7154, 7160, 7165, 7171, 7177, + 7184, 7188, 7193, 7198, 7204, 7209, 7215, 7221, + 7228, 7233, 7239, 7245, 7252, 7258, 7265, 7272, + 7280, 7284, 7289, 7294, 7300, 7305, 7311, 7317, + 7324, 7329, 7335, 7341, 7348, 7354, 7361, 7368, + 7376, 7381, 7387, 7393, 7400, 7406, 7413, 7420, + 7428, 7434, 7441, 7448, 7456, 7463, 7471, 7479, + 7488, 7492, 7497, 7502, 7508, 7513, 7519, 7525, + 7532, 7537, 7543, 7549, 7556, 7562, 7569, 7576, + 7584, 7589, 7595, 7601, 7608, 7614, 7621, 7628, + 7636, 7642, 7649, 7656, 7664, 7671, 7679, 7687, + 7696, 7701, 7707, 7713, 7720, 7726, 7733, 7740, + 7748, 7754, 7761, 7768, 7776, 7783, 7791, 7799, + 7808, 7814, 7821, 7828, 7836, 7843, 7851, 7859, + 7868, 7875, 7883, 7891, 7900, 7908, 7917, 7926, + 7936, 7938, 7941, 7944, 7948, 7951, 7955, 7959, + 7964, 7967, 7971, 7975, 7980, 7984, 7989, 7994, + 8000, 8003, 8007, 8011, 8016, 8020, 8025, 8030, + 8036, 8040, 8045, 8050, 8056, 8061, 8067, 8073, + 8080, 8083, 8087, 8091, 8096, 8100, 8105, 8110, + 8116, 8120, 8125, 8130, 8136, 8141, 8147, 8153, + 8160, 8164, 8169, 8174, 8180, 8185, 8191, 8197, + 8204, 8209, 8215, 8221, 8228, 8234, 8241, 8248, + 8256, 8259, 8263, 8267, 8272, 8276, 8281, 8286, + 8292, 8296, 8301, 8306, 8312, 8317, 8323, 8329, + 8336, 8340, 8345, 8350, 8356, 8361, 8367, 8373, + 8380, 8385, 8391, 8397, 8404, 8410, 8417, 8424, + 8432, 8436, 8441, 8446, 8452, 8457, 8463, 8469, + 8476, 8481, 8487, 8493, 8500, 8506, 8513, 8520, + 8528, 8533, 8539, 8545, 8552, 8558, 8565, 8572, + 8580, 8586, 8593, 8600, 8608, 8615, 8623, 8631, + 8640, 8643, 8647, 8651, 8656, 8660, 8665, 8670, + 8676, 8680, 8685, 8690, 8696, 8701, 8707, 8713, + 8720, 8724, 8729, 8734, 8740, 8745, 8751, 8757, + 8764, 8769, 8775, 8781, 8788, 8794, 8801, 8808, + 8816, 8820, 8825, 8830, 8836, 8841, 8847, 8853, + 8860, 8865, 8871, 8877, 8884, 8890, 8897, 8904, + 8912, 8917, 8923, 8929, 8936, 8942, 8949, 8956, + 8964, 8970, 8977, 8984, 8992, 8999, 9007, 9015, + 9024, 9028, 9033, 9038, 9044, 9049, 9055, 9061, + 9068, 9073, 9079, 9085, 9092, 9098, 9105, 9112, + 9120, 9125, 9131, 9137, 9144, 9150, 9157, 9164, + 9172, 9178, 9185, 9192, 9200, 9207, 9215, 9223, + 9232, 9237, 9243, 9249, 9256, 9262, 9269, 9276, + 9284, 9290, 9297, 9304, 9312, 9319, 9327, 9335, + 9344, 9350, 9357, 9364, 9372, 9379, 9387, 9395, + 9404, 9411, 9419, 9427, 9436, 9444, 9453, 9462, + 9472, 9475, 9479, 9483, 9488, 9492, 9497, 9502, + 9508, 9512, 9517, 9522, 9528, 9533, 9539, 9545, + 9552, 9556, 9561, 9566, 9572, 9577, 9583, 9589, + 9596, 9601, 9607, 9613, 9620, 9626, 9633, 9640, + 9648, 9652, 9657, 9662, 9668, 9673, 9679, 9685, + 9692, 9697, 9703, 9709, 9716, 9722, 9729, 9736, + 9744, 9749, 9755, 9761, 9768, 9774, 9781, 9788, + 9796, 9802, 9809, 9816, 9824, 9831, 9839, 9847, + 9856, 9860, 9865, 9870, 9876, 9881, 9887, 9893, + 9900, 9905, 9911, 9917, 9924, 9930, 9937, 9944, + 9952, 9957, 9963, 9969, 9976, 9982, 9989, 9996, + 10004, 10010, 10017, 10024, 10032, 10039, 10047, 10055, + 10064, 10069, 10075, 10081, 10088, 10094, 10101, 10108, + 10116, 10122, 10129, 10136, 10144, 10151, 10159, 10167, + 10176, 10182, 10189, 10196, 10204, 10211, 10219, 10227, + 10236, 10243, 10251, 10259, 10268, 10276, 10285, 10294, + 10304, 10308, 10313, 10318, 10324, 10329, 10335, 10341, + 10348, 10353, 10359, 10365, 10372, 10378, 10385, 10392, + 10400, 10405, 10411, 10417, 10424, 10430, 10437, 10444, + 10452, 10458, 10465, 10472, 10480, 10487, 10495, 10503, + 10512, 10517, 10523, 10529, 10536, 10542, 10549, 10556, + 10564, 10570, 10577, 10584, 10592, 10599, 10607, 10615, + 10624, 10630, 10637, 10644, 10652, 10659, 10667, 10675, + 10684, 10691, 10699, 10707, 10716, 10724, 10733, 10742, + 10752, 10757, 10763, 10769, 10776, 10782, 10789, 10796, + 10804, 10810, 10817, 10824, 10832, 10839, 10847, 10855, + 10864, 10870, 10877, 10884, 10892, 10899, 10907, 10915, + 10924, 10931, 10939, 10947, 10956, 10964, 10973, 10982, + 10992, 10998, 11005, 11012, 11020, 11027, 11035, 11043, + 11052, 11059, 11067, 11075, 11084, 11092, 11101, 11110, + 11120, 11127, 11135, 11143, 11152, 11160, 11169, 11178, + 11188, 11196, 11205, 11214, 11224, 11233, 11243, 11253, + 11264, 11265, 11267, 11269, 11272, 11274, 11277, 11280, + 11284, 11286, 11289, 11292, 11296, 11299, 11303, 11307, + 11312, 11314, 11317, 11320, 11324, 11327, 11331, 11335, + 11340, 11343, 11347, 11351, 11356, 11360, 11365, 11370, + 11376, 11378, 11381, 11384, 11388, 11391, 11395, 11399, + 11404, 11407, 11411, 11415, 11420, 11424, 11429, 11434, + 11440, 11443, 11447, 11451, 11456, 11460, 11465, 11470, + 11476, 11480, 11485, 11490, 11496, 11501, 11507, 11513, + 11520, 11522, 11525, 11528, 11532, 11535, 11539, 11543, + 11548, 11551, 11555, 11559, 11564, 11568, 11573, 11578, + 11584, 11587, 11591, 11595, 11600, 11604, 11609, 11614, + 11620, 11624, 11629, 11634, 11640, 11645, 11651, 11657, + 11664, 11667, 11671, 11675, 11680, 11684, 11689, 11694, + 11700, 11704, 11709, 11714, 11720, 11725, 11731, 11737, + 11744, 11748, 11753, 11758, 11764, 11769, 11775, 11781, + 11788, 11793, 11799, 11805, 11812, 11818, 11825, 11832, + 11840, 11842, 11845, 11848, 11852, 11855, 11859, 11863, + 11868, 11871, 11875, 11879, 11884, 11888, 11893, 11898, + 11904, 11907, 11911, 11915, 11920, 11924, 11929, 11934, + 11940, 11944, 11949, 11954, 11960, 11965, 11971, 11977, + 11984, 11987, 11991, 11995, 12000, 12004, 12009, 12014, + 12020, 12024, 12029, 12034, 12040, 12045, 12051, 12057, + 12064, 12068, 12073, 12078, 12084, 12089, 12095, 12101, + 12108, 12113, 12119, 12125, 12132, 12138, 12145, 12152, + 12160, 12163, 12167, 12171, 12176, 12180, 12185, 12190, + 12196, 12200, 12205, 12210, 12216, 12221, 12227, 12233, + 12240, 12244, 12249, 12254, 12260, 12265, 12271, 12277, + 12284, 12289, 12295, 12301, 12308, 12314, 12321, 12328, + 12336, 12340, 12345, 12350, 12356, 12361, 12367, 12373, + 12380, 12385, 12391, 12397, 12404, 12410, 12417, 12424, + 12432, 12437, 12443, 12449, 12456, 12462, 12469, 12476, + 12484, 12490, 12497, 12504, 12512, 12519, 12527, 12535, + 12544, 12546, 12549, 12552, 12556, 12559, 12563, 12567, + 12572, 12575, 12579, 12583, 12588, 12592, 12597, 12602, + 12608, 12611, 12615, 12619, 12624, 12628, 12633, 12638, + 12644, 12648, 12653, 12658, 12664, 12669, 12675, 12681, + 12688, 12691, 12695, 12699, 12704, 12708, 12713, 12718, + 12724, 12728, 12733, 12738, 12744, 12749, 12755, 12761, + 12768, 12772, 12777, 12782, 12788, 12793, 12799, 12805, + 12812, 12817, 12823, 12829, 12836, 12842, 12849, 12856, + 12864, 12867, 12871, 12875, 12880, 12884, 12889, 12894, + 12900, 12904, 12909, 12914, 12920, 12925, 12931, 12937, + 12944, 12948, 12953, 12958, 12964, 12969, 12975, 12981, + 12988, 12993, 12999, 13005, 13012, 13018, 13025, 13032, + 13040, 13044, 13049, 13054, 13060, 13065, 13071, 13077, + 13084, 13089, 13095, 13101, 13108, 13114, 13121, 13128, + 13136, 13141, 13147, 13153, 13160, 13166, 13173, 13180, + 13188, 13194, 13201, 13208, 13216, 13223, 13231, 13239, + 13248, 13251, 13255, 13259, 13264, 13268, 13273, 13278, + 13284, 13288, 13293, 13298, 13304, 13309, 13315, 13321, + 13328, 13332, 13337, 13342, 13348, 13353, 13359, 13365, + 13372, 13377, 13383, 13389, 13396, 13402, 13409, 13416, + 13424, 13428, 13433, 13438, 13444, 13449, 13455, 13461, + 13468, 13473, 13479, 13485, 13492, 13498, 13505, 13512, + 13520, 13525, 13531, 13537, 13544, 13550, 13557, 13564, + 13572, 13578, 13585, 13592, 13600, 13607, 13615, 13623, + 13632, 13636, 13641, 13646, 13652, 13657, 13663, 13669, + 13676, 13681, 13687, 13693, 13700, 13706, 13713, 13720, + 13728, 13733, 13739, 13745, 13752, 13758, 13765, 13772, + 13780, 13786, 13793, 13800, 13808, 13815, 13823, 13831, + 13840, 13845, 13851, 13857, 13864, 13870, 13877, 13884, + 13892, 13898, 13905, 13912, 13920, 13927, 13935, 13943, + 13952, 13958, 13965, 13972, 13980, 13987, 13995, 14003, + 14012, 14019, 14027, 14035, 14044, 14052, 14061, 14070, + 14080, 14082, 14085, 14088, 14092, 14095, 14099, 14103, + 14108, 14111, 14115, 14119, 14124, 14128, 14133, 14138, + 14144, 14147, 14151, 14155, 14160, 14164, 14169, 14174, + 14180, 14184, 14189, 14194, 14200, 14205, 14211, 14217, + 14224, 14227, 14231, 14235, 14240, 14244, 14249, 14254, + 14260, 14264, 14269, 14274, 14280, 14285, 14291, 14297, + 14304, 14308, 14313, 14318, 14324, 14329, 14335, 14341, + 14348, 14353, 14359, 14365, 14372, 14378, 14385, 14392, + 14400, 14403, 14407, 14411, 14416, 14420, 14425, 14430, + 14436, 14440, 14445, 14450, 14456, 14461, 14467, 14473, + 14480, 14484, 14489, 14494, 14500, 14505, 14511, 14517, + 14524, 14529, 14535, 14541, 14548, 14554, 14561, 14568, + 14576, 14580, 14585, 14590, 14596, 14601, 14607, 14613, + 14620, 14625, 14631, 14637, 14644, 14650, 14657, 14664, + 14672, 14677, 14683, 14689, 14696, 14702, 14709, 14716, + 14724, 14730, 14737, 14744, 14752, 14759, 14767, 14775, + 14784, 14787, 14791, 14795, 14800, 14804, 14809, 14814, + 14820, 14824, 14829, 14834, 14840, 14845, 14851, 14857, + 14864, 14868, 14873, 14878, 14884, 14889, 14895, 14901, + 14908, 14913, 14919, 14925, 14932, 14938, 14945, 14952, + 14960, 14964, 14969, 14974, 14980, 14985, 14991, 14997, + 15004, 15009, 15015, 15021, 15028, 15034, 15041, 15048, + 15056, 15061, 15067, 15073, 15080, 15086, 15093, 15100, + 15108, 15114, 15121, 15128, 15136, 15143, 15151, 15159, + 15168, 15172, 15177, 15182, 15188, 15193, 15199, 15205, + 15212, 15217, 15223, 15229, 15236, 15242, 15249, 15256, + 15264, 15269, 15275, 15281, 15288, 15294, 15301, 15308, + 15316, 15322, 15329, 15336, 15344, 15351, 15359, 15367, + 15376, 15381, 15387, 15393, 15400, 15406, 15413, 15420, + 15428, 15434, 15441, 15448, 15456, 15463, 15471, 15479, + 15488, 15494, 15501, 15508, 15516, 15523, 15531, 15539, + 15548, 15555, 15563, 15571, 15580, 15588, 15597, 15606, + 15616, 15619, 15623, 15627, 15632, 15636, 15641, 15646, + 15652, 15656, 15661, 15666, 15672, 15677, 15683, 15689, + 15696, 15700, 15705, 15710, 15716, 15721, 15727, 15733, + 15740, 15745, 15751, 15757, 15764, 15770, 15777, 15784, + 15792, 15796, 15801, 15806, 15812, 15817, 15823, 15829, + 15836, 15841, 15847, 15853, 15860, 15866, 15873, 15880, + 15888, 15893, 15899, 15905, 15912, 15918, 15925, 15932, + 15940, 15946, 15953, 15960, 15968, 15975, 15983, 15991, + 16000, 16004, 16009, 16014, 16020, 16025, 16031, 16037, + 16044, 16049, 16055, 16061, 16068, 16074, 16081, 16088, + 16096, 16101, 16107, 16113, 16120, 16126, 16133, 16140, + 16148, 16154, 16161, 16168, 16176, 16183, 16191, 16199, + 16208, 16213, 16219, 16225, 16232, 16238, 16245, 16252, + 16260, 16266, 16273, 16280, 16288, 16295, 16303, 16311, + 16320, 16326, 16333, 16340, 16348, 16355, 16363, 16371, + 16380, 16387, 16395, 16403, 16412, 16420, 16429, 16438, + 16448, 16452, 16457, 16462, 16468, 16473, 16479, 16485, + 16492, 16497, 16503, 16509, 16516, 16522, 16529, 16536, + 16544, 16549, 16555, 16561, 16568, 16574, 16581, 16588, + 16596, 16602, 16609, 16616, 16624, 16631, 16639, 16647, + 16656, 16661, 16667, 16673, 16680, 16686, 16693, 16700, + 16708, 16714, 16721, 16728, 16736, 16743, 16751, 16759, + 16768, 16774, 16781, 16788, 16796, 16803, 16811, 16819, + 16828, 16835, 16843, 16851, 16860, 16868, 16877, 16886, + 16896, 16901, 16907, 16913, 16920, 16926, 16933, 16940, + 16948, 16954, 16961, 16968, 16976, 16983, 16991, 16999, + 17008, 17014, 17021, 17028, 17036, 17043, 17051, 17059, + 17068, 17075, 17083, 17091, 17100, 17108, 17117, 17126, + 17136, 17142, 17149, 17156, 17164, 17171, 17179, 17187, + 17196, 17203, 17211, 17219, 17228, 17236, 17245, 17254, + 17264, 17271, 17279, 17287, 17296, 17304, 17313, 17322, + 17332, 17340, 17349, 17358, 17368, 17377, 17387, 17397, + 17408, 17410, 17413, 17416, 17420, 17423, 17427, 17431, + 17436, 17439, 17443, 17447, 17452, 17456, 17461, 17466, + 17472, 17475, 17479, 17483, 17488, 17492, 17497, 17502, + 17508, 17512, 17517, 17522, 17528, 17533, 17539, 17545, + 17552, 17555, 17559, 17563, 17568, 17572, 17577, 17582, + 17588, 17592, 17597, 17602, 17608, 17613, 17619, 17625, + 17632, 17636, 17641, 17646, 17652, 17657, 17663, 17669, + 17676, 17681, 17687, 17693, 17700, 17706, 17713, 17720, + 17728, 17731, 17735, 17739, 17744, 17748, 17753, 17758, + 17764, 17768, 17773, 17778, 17784, 17789, 17795, 17801, + 17808, 17812, 17817, 17822, 17828, 17833, 17839, 17845, + 17852, 17857, 17863, 17869, 17876, 17882, 17889, 17896, + 17904, 17908, 17913, 17918, 17924, 17929, 17935, 17941, + 17948, 17953, 17959, 17965, 17972, 17978, 17985, 17992, + 18000, 18005, 18011, 18017, 18024, 18030, 18037, 18044, + 18052, 18058, 18065, 18072, 18080, 18087, 18095, 18103, + 18112, 18115, 18119, 18123, 18128, 18132, 18137, 18142, + 18148, 18152, 18157, 18162, 18168, 18173, 18179, 18185, + 18192, 18196, 18201, 18206, 18212, 18217, 18223, 18229, + 18236, 18241, 18247, 18253, 18260, 18266, 18273, 18280, + 18288, 18292, 18297, 18302, 18308, 18313, 18319, 18325, + 18332, 18337, 18343, 18349, 18356, 18362, 18369, 18376, + 18384, 18389, 18395, 18401, 18408, 18414, 18421, 18428, + 18436, 18442, 18449, 18456, 18464, 18471, 18479, 18487, + 18496, 18500, 18505, 18510, 18516, 18521, 18527, 18533, + 18540, 18545, 18551, 18557, 18564, 18570, 18577, 18584, + 18592, 18597, 18603, 18609, 18616, 18622, 18629, 18636, + 18644, 18650, 18657, 18664, 18672, 18679, 18687, 18695, + 18704, 18709, 18715, 18721, 18728, 18734, 18741, 18748, + 18756, 18762, 18769, 18776, 18784, 18791, 18799, 18807, + 18816, 18822, 18829, 18836, 18844, 18851, 18859, 18867, + 18876, 18883, 18891, 18899, 18908, 18916, 18925, 18934, + 18944, 18947, 18951, 18955, 18960, 18964, 18969, 18974, + 18980, 18984, 18989, 18994, 19000, 19005, 19011, 19017, + 19024, 19028, 19033, 19038, 19044, 19049, 19055, 19061, + 19068, 19073, 19079, 19085, 19092, 19098, 19105, 19112, + 19120, 19124, 19129, 19134, 19140, 19145, 19151, 19157, + 19164, 19169, 19175, 19181, 19188, 19194, 19201, 19208, + 19216, 19221, 19227, 19233, 19240, 19246, 19253, 19260, + 19268, 19274, 19281, 19288, 19296, 19303, 19311, 19319, + 19328, 19332, 19337, 19342, 19348, 19353, 19359, 19365, + 19372, 19377, 19383, 19389, 19396, 19402, 19409, 19416, + 19424, 19429, 19435, 19441, 19448, 19454, 19461, 19468, + 19476, 19482, 19489, 19496, 19504, 19511, 19519, 19527, + 19536, 19541, 19547, 19553, 19560, 19566, 19573, 19580, + 19588, 19594, 19601, 19608, 19616, 19623, 19631, 19639, + 19648, 19654, 19661, 19668, 19676, 19683, 19691, 19699, + 19708, 19715, 19723, 19731, 19740, 19748, 19757, 19766, + 19776, 19780, 19785, 19790, 19796, 19801, 19807, 19813, + 19820, 19825, 19831, 19837, 19844, 19850, 19857, 19864, + 19872, 19877, 19883, 19889, 19896, 19902, 19909, 19916, + 19924, 19930, 19937, 19944, 19952, 19959, 19967, 19975, + 19984, 19989, 19995, 20001, 20008, 20014, 20021, 20028, + 20036, 20042, 20049, 20056, 20064, 20071, 20079, 20087, + 20096, 20102, 20109, 20116, 20124, 20131, 20139, 20147, + 20156, 20163, 20171, 20179, 20188, 20196, 20205, 20214, + 20224, 20229, 20235, 20241, 20248, 20254, 20261, 20268, + 20276, 20282, 20289, 20296, 20304, 20311, 20319, 20327, + 20336, 20342, 20349, 20356, 20364, 20371, 20379, 20387, + 20396, 20403, 20411, 20419, 20428, 20436, 20445, 20454, + 20464, 20470, 20477, 20484, 20492, 20499, 20507, 20515, + 20524, 20531, 20539, 20547, 20556, 20564, 20573, 20582, + 20592, 20599, 20607, 20615, 20624, 20632, 20641, 20650, + 20660, 20668, 20677, 20686, 20696, 20705, 20715, 20725, + 20736, 20739, 20743, 20747, 20752, 20756, 20761, 20766, + 20772, 20776, 20781, 20786, 20792, 20797, 20803, 20809, + 20816, 20820, 20825, 20830, 20836, 20841, 20847, 20853, + 20860, 20865, 20871, 20877, 20884, 20890, 20897, 20904, + 20912, 20916, 20921, 20926, 20932, 20937, 20943, 20949, + 20956, 20961, 20967, 20973, 20980, 20986, 20993, 21000, + 21008, 21013, 21019, 21025, 21032, 21038, 21045, 21052, + 21060, 21066, 21073, 21080, 21088, 21095, 21103, 21111, + 21120, 21124, 21129, 21134, 21140, 21145, 21151, 21157, + 21164, 21169, 21175, 21181, 21188, 21194, 21201, 21208, + 21216, 21221, 21227, 21233, 21240, 21246, 21253, 21260, + 21268, 21274, 21281, 21288, 21296, 21303, 21311, 21319, + 21328, 21333, 21339, 21345, 21352, 21358, 21365, 21372, + 21380, 21386, 21393, 21400, 21408, 21415, 21423, 21431, + 21440, 21446, 21453, 21460, 21468, 21475, 21483, 21491, + 21500, 21507, 21515, 21523, 21532, 21540, 21549, 21558, + 21568, 21572, 21577, 21582, 21588, 21593, 21599, 21605, + 21612, 21617, 21623, 21629, 21636, 21642, 21649, 21656, + 21664, 21669, 21675, 21681, 21688, 21694, 21701, 21708, + 21716, 21722, 21729, 21736, 21744, 21751, 21759, 21767, + 21776, 21781, 21787, 21793, 21800, 21806, 21813, 21820, + 21828, 21834, 21841, 21848, 21856, 21863, 21871, 21879, + 21888, 21894, 21901, 21908, 21916, 21923, 21931, 21939, + 21948, 21955, 21963, 21971, 21980, 21988, 21997, 22006, + 22016, 22021, 22027, 22033, 22040, 22046, 22053, 22060, + 22068, 22074, 22081, 22088, 22096, 22103, 22111, 22119, + 22128, 22134, 22141, 22148, 22156, 22163, 22171, 22179, + 22188, 22195, 22203, 22211, 22220, 22228, 22237, 22246, + 22256, 22262, 22269, 22276, 22284, 22291, 22299, 22307, + 22316, 22323, 22331, 22339, 22348, 22356, 22365, 22374, + 22384, 22391, 22399, 22407, 22416, 22424, 22433, 22442, + 22452, 22460, 22469, 22478, 22488, 22497, 22507, 22517, + 22528, 22532, 22537, 22542, 22548, 22553, 22559, 22565, + 22572, 22577, 22583, 22589, 22596, 22602, 22609, 22616, + 22624, 22629, 22635, 22641, 22648, 22654, 22661, 22668, + 22676, 22682, 22689, 22696, 22704, 22711, 22719, 22727, + 22736, 22741, 22747, 22753, 22760, 22766, 22773, 22780, + 22788, 22794, 22801, 22808, 22816, 22823, 22831, 22839, + 22848, 22854, 22861, 22868, 22876, 22883, 22891, 22899, + 22908, 22915, 22923, 22931, 22940, 22948, 22957, 22966, + 22976, 22981, 22987, 22993, 23000, 23006, 23013, 23020, + 23028, 23034, 23041, 23048, 23056, 23063, 23071, 23079, + 23088, 23094, 23101, 23108, 23116, 23123, 23131, 23139, + 23148, 23155, 23163, 23171, 23180, 23188, 23197, 23206, + 23216, 23222, 23229, 23236, 23244, 23251, 23259, 23267, + 23276, 23283, 23291, 23299, 23308, 23316, 23325, 23334, + 23344, 23351, 23359, 23367, 23376, 23384, 23393, 23402, + 23412, 23420, 23429, 23438, 23448, 23457, 23467, 23477, + 23488, 23493, 23499, 23505, 23512, 23518, 23525, 23532, + 23540, 23546, 23553, 23560, 23568, 23575, 23583, 23591, + 23600, 23606, 23613, 23620, 23628, 23635, 23643, 23651, + 23660, 23667, 23675, 23683, 23692, 23700, 23709, 23718, + 23728, 23734, 23741, 23748, 23756, 23763, 23771, 23779, + 23788, 23795, 23803, 23811, 23820, 23828, 23837, 23846, + 23856, 23863, 23871, 23879, 23888, 23896, 23905, 23914, + 23924, 23932, 23941, 23950, 23960, 23969, 23979, 23989, + 24000, 24006, 24013, 24020, 24028, 24035, 24043, 24051, + 24060, 24067, 24075, 24083, 24092, 24100, 24109, 24118, + 24128, 24135, 24143, 24151, 24160, 24168, 24177, 24186, + 24196, 24204, 24213, 24222, 24232, 24241, 24251, 24261, + 24272, 24279, 24287, 24295, 24304, 24312, 24321, 24330, + 24340, 24348, 24357, 24366, 24376, 24385, 24395, 24405, + 24416, 24424, 24433, 24442, 24452, 24461, 24471, 24481, + 24492, 24501, 24511, 24521, 24532, 24542, 24553, 24564, + 24576, 24577, 24579, 24581, 24584, 24586, 24589, 24592, + 24596, 24598, 24601, 24604, 24608, 24611, 24615, 24619, + 24624, 24626, 24629, 24632, 24636, 24639, 24643, 24647, + 24652, 24655, 24659, 24663, 24668, 24672, 24677, 24682, + 24688, 24690, 24693, 24696, 24700, 24703, 24707, 24711, + 24716, 24719, 24723, 24727, 24732, 24736, 24741, 24746, + 24752, 24755, 24759, 24763, 24768, 24772, 24777, 24782, + 24788, 24792, 24797, 24802, 24808, 24813, 24819, 24825, + 24832, 24834, 24837, 24840, 24844, 24847, 24851, 24855, + 24860, 24863, 24867, 24871, 24876, 24880, 24885, 24890, + 24896, 24899, 24903, 24907, 24912, 24916, 24921, 24926, + 24932, 24936, 24941, 24946, 24952, 24957, 24963, 24969, + 24976, 24979, 24983, 24987, 24992, 24996, 25001, 25006, + 25012, 25016, 25021, 25026, 25032, 25037, 25043, 25049, + 25056, 25060, 25065, 25070, 25076, 25081, 25087, 25093, + 25100, 25105, 25111, 25117, 25124, 25130, 25137, 25144, + 25152, 25154, 25157, 25160, 25164, 25167, 25171, 25175, + 25180, 25183, 25187, 25191, 25196, 25200, 25205, 25210, + 25216, 25219, 25223, 25227, 25232, 25236, 25241, 25246, + 25252, 25256, 25261, 25266, 25272, 25277, 25283, 25289, + 25296, 25299, 25303, 25307, 25312, 25316, 25321, 25326, + 25332, 25336, 25341, 25346, 25352, 25357, 25363, 25369, + 25376, 25380, 25385, 25390, 25396, 25401, 25407, 25413, + 25420, 25425, 25431, 25437, 25444, 25450, 25457, 25464, + 25472, 25475, 25479, 25483, 25488, 25492, 25497, 25502, + 25508, 25512, 25517, 25522, 25528, 25533, 25539, 25545, + 25552, 25556, 25561, 25566, 25572, 25577, 25583, 25589, + 25596, 25601, 25607, 25613, 25620, 25626, 25633, 25640, + 25648, 25652, 25657, 25662, 25668, 25673, 25679, 25685, + 25692, 25697, 25703, 25709, 25716, 25722, 25729, 25736, + 25744, 25749, 25755, 25761, 25768, 25774, 25781, 25788, + 25796, 25802, 25809, 25816, 25824, 25831, 25839, 25847, + 25856, 25858, 25861, 25864, 25868, 25871, 25875, 25879, + 25884, 25887, 25891, 25895, 25900, 25904, 25909, 25914, + 25920, 25923, 25927, 25931, 25936, 25940, 25945, 25950, + 25956, 25960, 25965, 25970, 25976, 25981, 25987, 25993, + 26000, 26003, 26007, 26011, 26016, 26020, 26025, 26030, + 26036, 26040, 26045, 26050, 26056, 26061, 26067, 26073, + 26080, 26084, 26089, 26094, 26100, 26105, 26111, 26117, + 26124, 26129, 26135, 26141, 26148, 26154, 26161, 26168, + 26176, 26179, 26183, 26187, 26192, 26196, 26201, 26206, + 26212, 26216, 26221, 26226, 26232, 26237, 26243, 26249, + 26256, 26260, 26265, 26270, 26276, 26281, 26287, 26293, + 26300, 26305, 26311, 26317, 26324, 26330, 26337, 26344, + 26352, 26356, 26361, 26366, 26372, 26377, 26383, 26389, + 26396, 26401, 26407, 26413, 26420, 26426, 26433, 26440, + 26448, 26453, 26459, 26465, 26472, 26478, 26485, 26492, + 26500, 26506, 26513, 26520, 26528, 26535, 26543, 26551, + 26560, 26563, 26567, 26571, 26576, 26580, 26585, 26590, + 26596, 26600, 26605, 26610, 26616, 26621, 26627, 26633, + 26640, 26644, 26649, 26654, 26660, 26665, 26671, 26677, + 26684, 26689, 26695, 26701, 26708, 26714, 26721, 26728, + 26736, 26740, 26745, 26750, 26756, 26761, 26767, 26773, + 26780, 26785, 26791, 26797, 26804, 26810, 26817, 26824, + 26832, 26837, 26843, 26849, 26856, 26862, 26869, 26876, + 26884, 26890, 26897, 26904, 26912, 26919, 26927, 26935, + 26944, 26948, 26953, 26958, 26964, 26969, 26975, 26981, + 26988, 26993, 26999, 27005, 27012, 27018, 27025, 27032, + 27040, 27045, 27051, 27057, 27064, 27070, 27077, 27084, + 27092, 27098, 27105, 27112, 27120, 27127, 27135, 27143, + 27152, 27157, 27163, 27169, 27176, 27182, 27189, 27196, + 27204, 27210, 27217, 27224, 27232, 27239, 27247, 27255, + 27264, 27270, 27277, 27284, 27292, 27299, 27307, 27315, + 27324, 27331, 27339, 27347, 27356, 27364, 27373, 27382, + 27392, 27394, 27397, 27400, 27404, 27407, 27411, 27415, + 27420, 27423, 27427, 27431, 27436, 27440, 27445, 27450, + 27456, 27459, 27463, 27467, 27472, 27476, 27481, 27486, + 27492, 27496, 27501, 27506, 27512, 27517, 27523, 27529, + 27536, 27539, 27543, 27547, 27552, 27556, 27561, 27566, + 27572, 27576, 27581, 27586, 27592, 27597, 27603, 27609, + 27616, 27620, 27625, 27630, 27636, 27641, 27647, 27653, + 27660, 27665, 27671, 27677, 27684, 27690, 27697, 27704, + 27712, 27715, 27719, 27723, 27728, 27732, 27737, 27742, + 27748, 27752, 27757, 27762, 27768, 27773, 27779, 27785, + 27792, 27796, 27801, 27806, 27812, 27817, 27823, 27829, + 27836, 27841, 27847, 27853, 27860, 27866, 27873, 27880, + 27888, 27892, 27897, 27902, 27908, 27913, 27919, 27925, + 27932, 27937, 27943, 27949, 27956, 27962, 27969, 27976, + 27984, 27989, 27995, 28001, 28008, 28014, 28021, 28028, + 28036, 28042, 28049, 28056, 28064, 28071, 28079, 28087, + 28096, 28099, 28103, 28107, 28112, 28116, 28121, 28126, + 28132, 28136, 28141, 28146, 28152, 28157, 28163, 28169, + 28176, 28180, 28185, 28190, 28196, 28201, 28207, 28213, + 28220, 28225, 28231, 28237, 28244, 28250, 28257, 28264, + 28272, 28276, 28281, 28286, 28292, 28297, 28303, 28309, + 28316, 28321, 28327, 28333, 28340, 28346, 28353, 28360, + 28368, 28373, 28379, 28385, 28392, 28398, 28405, 28412, + 28420, 28426, 28433, 28440, 28448, 28455, 28463, 28471, + 28480, 28484, 28489, 28494, 28500, 28505, 28511, 28517, + 28524, 28529, 28535, 28541, 28548, 28554, 28561, 28568, + 28576, 28581, 28587, 28593, 28600, 28606, 28613, 28620, + 28628, 28634, 28641, 28648, 28656, 28663, 28671, 28679, + 28688, 28693, 28699, 28705, 28712, 28718, 28725, 28732, + 28740, 28746, 28753, 28760, 28768, 28775, 28783, 28791, + 28800, 28806, 28813, 28820, 28828, 28835, 28843, 28851, + 28860, 28867, 28875, 28883, 28892, 28900, 28909, 28918, + 28928, 28931, 28935, 28939, 28944, 28948, 28953, 28958, + 28964, 28968, 28973, 28978, 28984, 28989, 28995, 29001, + 29008, 29012, 29017, 29022, 29028, 29033, 29039, 29045, + 29052, 29057, 29063, 29069, 29076, 29082, 29089, 29096, + 29104, 29108, 29113, 29118, 29124, 29129, 29135, 29141, + 29148, 29153, 29159, 29165, 29172, 29178, 29185, 29192, + 29200, 29205, 29211, 29217, 29224, 29230, 29237, 29244, + 29252, 29258, 29265, 29272, 29280, 29287, 29295, 29303, + 29312, 29316, 29321, 29326, 29332, 29337, 29343, 29349, + 29356, 29361, 29367, 29373, 29380, 29386, 29393, 29400, + 29408, 29413, 29419, 29425, 29432, 29438, 29445, 29452, + 29460, 29466, 29473, 29480, 29488, 29495, 29503, 29511, + 29520, 29525, 29531, 29537, 29544, 29550, 29557, 29564, + 29572, 29578, 29585, 29592, 29600, 29607, 29615, 29623, + 29632, 29638, 29645, 29652, 29660, 29667, 29675, 29683, + 29692, 29699, 29707, 29715, 29724, 29732, 29741, 29750, + 29760, 29764, 29769, 29774, 29780, 29785, 29791, 29797, + 29804, 29809, 29815, 29821, 29828, 29834, 29841, 29848, + 29856, 29861, 29867, 29873, 29880, 29886, 29893, 29900, + 29908, 29914, 29921, 29928, 29936, 29943, 29951, 29959, + 29968, 29973, 29979, 29985, 29992, 29998, 30005, 30012, + 30020, 30026, 30033, 30040, 30048, 30055, 30063, 30071, + 30080, 30086, 30093, 30100, 30108, 30115, 30123, 30131, + 30140, 30147, 30155, 30163, 30172, 30180, 30189, 30198, + 30208, 30213, 30219, 30225, 30232, 30238, 30245, 30252, + 30260, 30266, 30273, 30280, 30288, 30295, 30303, 30311, + 30320, 30326, 30333, 30340, 30348, 30355, 30363, 30371, + 30380, 30387, 30395, 30403, 30412, 30420, 30429, 30438, + 30448, 30454, 30461, 30468, 30476, 30483, 30491, 30499, + 30508, 30515, 30523, 30531, 30540, 30548, 30557, 30566, + 30576, 30583, 30591, 30599, 30608, 30616, 30625, 30634, + 30644, 30652, 30661, 30670, 30680, 30689, 30699, 30709, + 30720, 30722, 30725, 30728, 30732, 30735, 30739, 30743, + 30748, 30751, 30755, 30759, 30764, 30768, 30773, 30778, + 30784, 30787, 30791, 30795, 30800, 30804, 30809, 30814, + 30820, 30824, 30829, 30834, 30840, 30845, 30851, 30857, + 30864, 30867, 30871, 30875, 30880, 30884, 30889, 30894, + 30900, 30904, 30909, 30914, 30920, 30925, 30931, 30937, + 30944, 30948, 30953, 30958, 30964, 30969, 30975, 30981, + 30988, 30993, 30999, 31005, 31012, 31018, 31025, 31032, + 31040, 31043, 31047, 31051, 31056, 31060, 31065, 31070, + 31076, 31080, 31085, 31090, 31096, 31101, 31107, 31113, + 31120, 31124, 31129, 31134, 31140, 31145, 31151, 31157, + 31164, 31169, 31175, 31181, 31188, 31194, 31201, 31208, + 31216, 31220, 31225, 31230, 31236, 31241, 31247, 31253, + 31260, 31265, 31271, 31277, 31284, 31290, 31297, 31304, + 31312, 31317, 31323, 31329, 31336, 31342, 31349, 31356, + 31364, 31370, 31377, 31384, 31392, 31399, 31407, 31415, + 31424, 31427, 31431, 31435, 31440, 31444, 31449, 31454, + 31460, 31464, 31469, 31474, 31480, 31485, 31491, 31497, + 31504, 31508, 31513, 31518, 31524, 31529, 31535, 31541, + 31548, 31553, 31559, 31565, 31572, 31578, 31585, 31592, + 31600, 31604, 31609, 31614, 31620, 31625, 31631, 31637, + 31644, 31649, 31655, 31661, 31668, 31674, 31681, 31688, + 31696, 31701, 31707, 31713, 31720, 31726, 31733, 31740, + 31748, 31754, 31761, 31768, 31776, 31783, 31791, 31799, + 31808, 31812, 31817, 31822, 31828, 31833, 31839, 31845, + 31852, 31857, 31863, 31869, 31876, 31882, 31889, 31896, + 31904, 31909, 31915, 31921, 31928, 31934, 31941, 31948, + 31956, 31962, 31969, 31976, 31984, 31991, 31999, 32007, + 32016, 32021, 32027, 32033, 32040, 32046, 32053, 32060, + 32068, 32074, 32081, 32088, 32096, 32103, 32111, 32119, + 32128, 32134, 32141, 32148, 32156, 32163, 32171, 32179, + 32188, 32195, 32203, 32211, 32220, 32228, 32237, 32246, + 32256, 32259, 32263, 32267, 32272, 32276, 32281, 32286, + 32292, 32296, 32301, 32306, 32312, 32317, 32323, 32329, + 32336, 32340, 32345, 32350, 32356, 32361, 32367, 32373, + 32380, 32385, 32391, 32397, 32404, 32410, 32417, 32424, + 32432, 32436, 32441, 32446, 32452, 32457, 32463, 32469, + 32476, 32481, 32487, 32493, 32500, 32506, 32513, 32520, + 32528, 32533, 32539, 32545, 32552, 32558, 32565, 32572, + 32580, 32586, 32593, 32600, 32608, 32615, 32623, 32631, + 32640, 32644, 32649, 32654, 32660, 32665, 32671, 32677, + 32684, 32689, 32695, 32701, 32708, 32714, 32721, 32728, + 32736, 32741, 32747, 32753, 32760, 32766, 32773, 32780, + 32788, 32794, 32801, 32808, 32816, 32823, 32831, 32839, + 32848, 32853, 32859, 32865, 32872, 32878, 32885, 32892, + 32900, 32906, 32913, 32920, 32928, 32935, 32943, 32951, + 32960, 32966, 32973, 32980, 32988, 32995, 33003, 33011, + 33020, 33027, 33035, 33043, 33052, 33060, 33069, 33078, + 33088, 33092, 33097, 33102, 33108, 33113, 33119, 33125, + 33132, 33137, 33143, 33149, 33156, 33162, 33169, 33176, + 33184, 33189, 33195, 33201, 33208, 33214, 33221, 33228, + 33236, 33242, 33249, 33256, 33264, 33271, 33279, 33287, + 33296, 33301, 33307, 33313, 33320, 33326, 33333, 33340, + 33348, 33354, 33361, 33368, 33376, 33383, 33391, 33399, + 33408, 33414, 33421, 33428, 33436, 33443, 33451, 33459, + 33468, 33475, 33483, 33491, 33500, 33508, 33517, 33526, + 33536, 33541, 33547, 33553, 33560, 33566, 33573, 33580, + 33588, 33594, 33601, 33608, 33616, 33623, 33631, 33639, + 33648, 33654, 33661, 33668, 33676, 33683, 33691, 33699, + 33708, 33715, 33723, 33731, 33740, 33748, 33757, 33766, + 33776, 33782, 33789, 33796, 33804, 33811, 33819, 33827, + 33836, 33843, 33851, 33859, 33868, 33876, 33885, 33894, + 33904, 33911, 33919, 33927, 33936, 33944, 33953, 33962, + 33972, 33980, 33989, 33998, 34008, 34017, 34027, 34037, + 34048, 34051, 34055, 34059, 34064, 34068, 34073, 34078, + 34084, 34088, 34093, 34098, 34104, 34109, 34115, 34121, + 34128, 34132, 34137, 34142, 34148, 34153, 34159, 34165, + 34172, 34177, 34183, 34189, 34196, 34202, 34209, 34216, + 34224, 34228, 34233, 34238, 34244, 34249, 34255, 34261, + 34268, 34273, 34279, 34285, 34292, 34298, 34305, 34312, + 34320, 34325, 34331, 34337, 34344, 34350, 34357, 34364, + 34372, 34378, 34385, 34392, 34400, 34407, 34415, 34423, + 34432, 34436, 34441, 34446, 34452, 34457, 34463, 34469, + 34476, 34481, 34487, 34493, 34500, 34506, 34513, 34520, + 34528, 34533, 34539, 34545, 34552, 34558, 34565, 34572, + 34580, 34586, 34593, 34600, 34608, 34615, 34623, 34631, + 34640, 34645, 34651, 34657, 34664, 34670, 34677, 34684, + 34692, 34698, 34705, 34712, 34720, 34727, 34735, 34743, + 34752, 34758, 34765, 34772, 34780, 34787, 34795, 34803, + 34812, 34819, 34827, 34835, 34844, 34852, 34861, 34870, + 34880, 34884, 34889, 34894, 34900, 34905, 34911, 34917, + 34924, 34929, 34935, 34941, 34948, 34954, 34961, 34968, + 34976, 34981, 34987, 34993, 35000, 35006, 35013, 35020, + 35028, 35034, 35041, 35048, 35056, 35063, 35071, 35079, + 35088, 35093, 35099, 35105, 35112, 35118, 35125, 35132, + 35140, 35146, 35153, 35160, 35168, 35175, 35183, 35191, + 35200, 35206, 35213, 35220, 35228, 35235, 35243, 35251, + 35260, 35267, 35275, 35283, 35292, 35300, 35309, 35318, + 35328, 35333, 35339, 35345, 35352, 35358, 35365, 35372, + 35380, 35386, 35393, 35400, 35408, 35415, 35423, 35431, + 35440, 35446, 35453, 35460, 35468, 35475, 35483, 35491, + 35500, 35507, 35515, 35523, 35532, 35540, 35549, 35558, + 35568, 35574, 35581, 35588, 35596, 35603, 35611, 35619, + 35628, 35635, 35643, 35651, 35660, 35668, 35677, 35686, + 35696, 35703, 35711, 35719, 35728, 35736, 35745, 35754, + 35764, 35772, 35781, 35790, 35800, 35809, 35819, 35829, + 35840, 35844, 35849, 35854, 35860, 35865, 35871, 35877, + 35884, 35889, 35895, 35901, 35908, 35914, 35921, 35928, + 35936, 35941, 35947, 35953, 35960, 35966, 35973, 35980, + 35988, 35994, 36001, 36008, 36016, 36023, 36031, 36039, + 36048, 36053, 36059, 36065, 36072, 36078, 36085, 36092, + 36100, 36106, 36113, 36120, 36128, 36135, 36143, 36151, + 36160, 36166, 36173, 36180, 36188, 36195, 36203, 36211, + 36220, 36227, 36235, 36243, 36252, 36260, 36269, 36278, + 36288, 36293, 36299, 36305, 36312, 36318, 36325, 36332, + 36340, 36346, 36353, 36360, 36368, 36375, 36383, 36391, + 36400, 36406, 36413, 36420, 36428, 36435, 36443, 36451, + 36460, 36467, 36475, 36483, 36492, 36500, 36509, 36518, + 36528, 36534, 36541, 36548, 36556, 36563, 36571, 36579, + 36588, 36595, 36603, 36611, 36620, 36628, 36637, 36646, + 36656, 36663, 36671, 36679, 36688, 36696, 36705, 36714, + 36724, 36732, 36741, 36750, 36760, 36769, 36779, 36789, + 36800, 36805, 36811, 36817, 36824, 36830, 36837, 36844, + 36852, 36858, 36865, 36872, 36880, 36887, 36895, 36903, + 36912, 36918, 36925, 36932, 36940, 36947, 36955, 36963, + 36972, 36979, 36987, 36995, 37004, 37012, 37021, 37030, + 37040, 37046, 37053, 37060, 37068, 37075, 37083, 37091, + 37100, 37107, 37115, 37123, 37132, 37140, 37149, 37158, + 37168, 37175, 37183, 37191, 37200, 37208, 37217, 37226, + 37236, 37244, 37253, 37262, 37272, 37281, 37291, 37301, + 37312, 37318, 37325, 37332, 37340, 37347, 37355, 37363, + 37372, 37379, 37387, 37395, 37404, 37412, 37421, 37430, + 37440, 37447, 37455, 37463, 37472, 37480, 37489, 37498, + 37508, 37516, 37525, 37534, 37544, 37553, 37563, 37573, + 37584, 37591, 37599, 37607, 37616, 37624, 37633, 37642, + 37652, 37660, 37669, 37678, 37688, 37697, 37707, 37717, + 37728, 37736, 37745, 37754, 37764, 37773, 37783, 37793, + 37804, 37813, 37823, 37833, 37844, 37854, 37865, 37876, + 37888, 37890, 37893, 37896, 37900, 37903, 37907, 37911, + 37916, 37919, 37923, 37927, 37932, 37936, 37941, 37946, + 37952, 37955, 37959, 37963, 37968, 37972, 37977, 37982, + 37988, 37992, 37997, 38002, 38008, 38013, 38019, 38025, + 38032, 38035, 38039, 38043, 38048, 38052, 38057, 38062, + 38068, 38072, 38077, 38082, 38088, 38093, 38099, 38105, + 38112, 38116, 38121, 38126, 38132, 38137, 38143, 38149, + 38156, 38161, 38167, 38173, 38180, 38186, 38193, 38200, + 38208, 38211, 38215, 38219, 38224, 38228, 38233, 38238, + 38244, 38248, 38253, 38258, 38264, 38269, 38275, 38281, + 38288, 38292, 38297, 38302, 38308, 38313, 38319, 38325, + 38332, 38337, 38343, 38349, 38356, 38362, 38369, 38376, + 38384, 38388, 38393, 38398, 38404, 38409, 38415, 38421, + 38428, 38433, 38439, 38445, 38452, 38458, 38465, 38472, + 38480, 38485, 38491, 38497, 38504, 38510, 38517, 38524, + 38532, 38538, 38545, 38552, 38560, 38567, 38575, 38583, + 38592, 38595, 38599, 38603, 38608, 38612, 38617, 38622, + 38628, 38632, 38637, 38642, 38648, 38653, 38659, 38665, + 38672, 38676, 38681, 38686, 38692, 38697, 38703, 38709, + 38716, 38721, 38727, 38733, 38740, 38746, 38753, 38760, + 38768, 38772, 38777, 38782, 38788, 38793, 38799, 38805, + 38812, 38817, 38823, 38829, 38836, 38842, 38849, 38856, + 38864, 38869, 38875, 38881, 38888, 38894, 38901, 38908, + 38916, 38922, 38929, 38936, 38944, 38951, 38959, 38967, + 38976, 38980, 38985, 38990, 38996, 39001, 39007, 39013, + 39020, 39025, 39031, 39037, 39044, 39050, 39057, 39064, + 39072, 39077, 39083, 39089, 39096, 39102, 39109, 39116, + 39124, 39130, 39137, 39144, 39152, 39159, 39167, 39175, + 39184, 39189, 39195, 39201, 39208, 39214, 39221, 39228, + 39236, 39242, 39249, 39256, 39264, 39271, 39279, 39287, + 39296, 39302, 39309, 39316, 39324, 39331, 39339, 39347, + 39356, 39363, 39371, 39379, 39388, 39396, 39405, 39414, + 39424, 39427, 39431, 39435, 39440, 39444, 39449, 39454, + 39460, 39464, 39469, 39474, 39480, 39485, 39491, 39497, + 39504, 39508, 39513, 39518, 39524, 39529, 39535, 39541, + 39548, 39553, 39559, 39565, 39572, 39578, 39585, 39592, + 39600, 39604, 39609, 39614, 39620, 39625, 39631, 39637, + 39644, 39649, 39655, 39661, 39668, 39674, 39681, 39688, + 39696, 39701, 39707, 39713, 39720, 39726, 39733, 39740, + 39748, 39754, 39761, 39768, 39776, 39783, 39791, 39799, + 39808, 39812, 39817, 39822, 39828, 39833, 39839, 39845, + 39852, 39857, 39863, 39869, 39876, 39882, 39889, 39896, + 39904, 39909, 39915, 39921, 39928, 39934, 39941, 39948, + 39956, 39962, 39969, 39976, 39984, 39991, 39999, 40007, + 40016, 40021, 40027, 40033, 40040, 40046, 40053, 40060, + 40068, 40074, 40081, 40088, 40096, 40103, 40111, 40119, + 40128, 40134, 40141, 40148, 40156, 40163, 40171, 40179, + 40188, 40195, 40203, 40211, 40220, 40228, 40237, 40246, + 40256, 40260, 40265, 40270, 40276, 40281, 40287, 40293, + 40300, 40305, 40311, 40317, 40324, 40330, 40337, 40344, + 40352, 40357, 40363, 40369, 40376, 40382, 40389, 40396, + 40404, 40410, 40417, 40424, 40432, 40439, 40447, 40455, + 40464, 40469, 40475, 40481, 40488, 40494, 40501, 40508, + 40516, 40522, 40529, 40536, 40544, 40551, 40559, 40567, + 40576, 40582, 40589, 40596, 40604, 40611, 40619, 40627, + 40636, 40643, 40651, 40659, 40668, 40676, 40685, 40694, + 40704, 40709, 40715, 40721, 40728, 40734, 40741, 40748, + 40756, 40762, 40769, 40776, 40784, 40791, 40799, 40807, + 40816, 40822, 40829, 40836, 40844, 40851, 40859, 40867, + 40876, 40883, 40891, 40899, 40908, 40916, 40925, 40934, + 40944, 40950, 40957, 40964, 40972, 40979, 40987, 40995, + 41004, 41011, 41019, 41027, 41036, 41044, 41053, 41062, + 41072, 41079, 41087, 41095, 41104, 41112, 41121, 41130, + 41140, 41148, 41157, 41166, 41176, 41185, 41195, 41205, + 41216, 41219, 41223, 41227, 41232, 41236, 41241, 41246, + 41252, 41256, 41261, 41266, 41272, 41277, 41283, 41289, + 41296, 41300, 41305, 41310, 41316, 41321, 41327, 41333, + 41340, 41345, 41351, 41357, 41364, 41370, 41377, 41384, + 41392, 41396, 41401, 41406, 41412, 41417, 41423, 41429, + 41436, 41441, 41447, 41453, 41460, 41466, 41473, 41480, + 41488, 41493, 41499, 41505, 41512, 41518, 41525, 41532, + 41540, 41546, 41553, 41560, 41568, 41575, 41583, 41591, + 41600, 41604, 41609, 41614, 41620, 41625, 41631, 41637, + 41644, 41649, 41655, 41661, 41668, 41674, 41681, 41688, + 41696, 41701, 41707, 41713, 41720, 41726, 41733, 41740, + 41748, 41754, 41761, 41768, 41776, 41783, 41791, 41799, + 41808, 41813, 41819, 41825, 41832, 41838, 41845, 41852, + 41860, 41866, 41873, 41880, 41888, 41895, 41903, 41911, + 41920, 41926, 41933, 41940, 41948, 41955, 41963, 41971, + 41980, 41987, 41995, 42003, 42012, 42020, 42029, 42038, + 42048, 42052, 42057, 42062, 42068, 42073, 42079, 42085, + 42092, 42097, 42103, 42109, 42116, 42122, 42129, 42136, + 42144, 42149, 42155, 42161, 42168, 42174, 42181, 42188, + 42196, 42202, 42209, 42216, 42224, 42231, 42239, 42247, + 42256, 42261, 42267, 42273, 42280, 42286, 42293, 42300, + 42308, 42314, 42321, 42328, 42336, 42343, 42351, 42359, + 42368, 42374, 42381, 42388, 42396, 42403, 42411, 42419, + 42428, 42435, 42443, 42451, 42460, 42468, 42477, 42486, + 42496, 42501, 42507, 42513, 42520, 42526, 42533, 42540, + 42548, 42554, 42561, 42568, 42576, 42583, 42591, 42599, + 42608, 42614, 42621, 42628, 42636, 42643, 42651, 42659, + 42668, 42675, 42683, 42691, 42700, 42708, 42717, 42726, + 42736, 42742, 42749, 42756, 42764, 42771, 42779, 42787, + 42796, 42803, 42811, 42819, 42828, 42836, 42845, 42854, + 42864, 42871, 42879, 42887, 42896, 42904, 42913, 42922, + 42932, 42940, 42949, 42958, 42968, 42977, 42987, 42997, + 43008, 43012, 43017, 43022, 43028, 43033, 43039, 43045, + 43052, 43057, 43063, 43069, 43076, 43082, 43089, 43096, + 43104, 43109, 43115, 43121, 43128, 43134, 43141, 43148, + 43156, 43162, 43169, 43176, 43184, 43191, 43199, 43207, + 43216, 43221, 43227, 43233, 43240, 43246, 43253, 43260, + 43268, 43274, 43281, 43288, 43296, 43303, 43311, 43319, + 43328, 43334, 43341, 43348, 43356, 43363, 43371, 43379, + 43388, 43395, 43403, 43411, 43420, 43428, 43437, 43446, + 43456, 43461, 43467, 43473, 43480, 43486, 43493, 43500, + 43508, 43514, 43521, 43528, 43536, 43543, 43551, 43559, + 43568, 43574, 43581, 43588, 43596, 43603, 43611, 43619, + 43628, 43635, 43643, 43651, 43660, 43668, 43677, 43686, + 43696, 43702, 43709, 43716, 43724, 43731, 43739, 43747, + 43756, 43763, 43771, 43779, 43788, 43796, 43805, 43814, + 43824, 43831, 43839, 43847, 43856, 43864, 43873, 43882, + 43892, 43900, 43909, 43918, 43928, 43937, 43947, 43957, + 43968, 43973, 43979, 43985, 43992, 43998, 44005, 44012, + 44020, 44026, 44033, 44040, 44048, 44055, 44063, 44071, + 44080, 44086, 44093, 44100, 44108, 44115, 44123, 44131, + 44140, 44147, 44155, 44163, 44172, 44180, 44189, 44198, + 44208, 44214, 44221, 44228, 44236, 44243, 44251, 44259, + 44268, 44275, 44283, 44291, 44300, 44308, 44317, 44326, + 44336, 44343, 44351, 44359, 44368, 44376, 44385, 44394, + 44404, 44412, 44421, 44430, 44440, 44449, 44459, 44469, + 44480, 44486, 44493, 44500, 44508, 44515, 44523, 44531, + 44540, 44547, 44555, 44563, 44572, 44580, 44589, 44598, + 44608, 44615, 44623, 44631, 44640, 44648, 44657, 44666, + 44676, 44684, 44693, 44702, 44712, 44721, 44731, 44741, + 44752, 44759, 44767, 44775, 44784, 44792, 44801, 44810, + 44820, 44828, 44837, 44846, 44856, 44865, 44875, 44885, + 44896, 44904, 44913, 44922, 44932, 44941, 44951, 44961, + 44972, 44981, 44991, 45001, 45012, 45022, 45033, 45044, + 45056, 45059, 45063, 45067, 45072, 45076, 45081, 45086, + 45092, 45096, 45101, 45106, 45112, 45117, 45123, 45129, + 45136, 45140, 45145, 45150, 45156, 45161, 45167, 45173, + 45180, 45185, 45191, 45197, 45204, 45210, 45217, 45224, + 45232, 45236, 45241, 45246, 45252, 45257, 45263, 45269, + 45276, 45281, 45287, 45293, 45300, 45306, 45313, 45320, + 45328, 45333, 45339, 45345, 45352, 45358, 45365, 45372, + 45380, 45386, 45393, 45400, 45408, 45415, 45423, 45431, + 45440, 45444, 45449, 45454, 45460, 45465, 45471, 45477, + 45484, 45489, 45495, 45501, 45508, 45514, 45521, 45528, + 45536, 45541, 45547, 45553, 45560, 45566, 45573, 45580, + 45588, 45594, 45601, 45608, 45616, 45623, 45631, 45639, + 45648, 45653, 45659, 45665, 45672, 45678, 45685, 45692, + 45700, 45706, 45713, 45720, 45728, 45735, 45743, 45751, + 45760, 45766, 45773, 45780, 45788, 45795, 45803, 45811, + 45820, 45827, 45835, 45843, 45852, 45860, 45869, 45878, + 45888, 45892, 45897, 45902, 45908, 45913, 45919, 45925, + 45932, 45937, 45943, 45949, 45956, 45962, 45969, 45976, + 45984, 45989, 45995, 46001, 46008, 46014, 46021, 46028, + 46036, 46042, 46049, 46056, 46064, 46071, 46079, 46087, + 46096, 46101, 46107, 46113, 46120, 46126, 46133, 46140, + 46148, 46154, 46161, 46168, 46176, 46183, 46191, 46199, + 46208, 46214, 46221, 46228, 46236, 46243, 46251, 46259, + 46268, 46275, 46283, 46291, 46300, 46308, 46317, 46326, + 46336, 46341, 46347, 46353, 46360, 46366, 46373, 46380, + 46388, 46394, 46401, 46408, 46416, 46423, 46431, 46439, + 46448, 46454, 46461, 46468, 46476, 46483, 46491, 46499, + 46508, 46515, 46523, 46531, 46540, 46548, 46557, 46566, + 46576, 46582, 46589, 46596, 46604, 46611, 46619, 46627, + 46636, 46643, 46651, 46659, 46668, 46676, 46685, 46694, + 46704, 46711, 46719, 46727, 46736, 46744, 46753, 46762, + 46772, 46780, 46789, 46798, 46808, 46817, 46827, 46837, + 46848, 46852, 46857, 46862, 46868, 46873, 46879, 46885, + 46892, 46897, 46903, 46909, 46916, 46922, 46929, 46936, + 46944, 46949, 46955, 46961, 46968, 46974, 46981, 46988, + 46996, 47002, 47009, 47016, 47024, 47031, 47039, 47047, + 47056, 47061, 47067, 47073, 47080, 47086, 47093, 47100, + 47108, 47114, 47121, 47128, 47136, 47143, 47151, 47159, + 47168, 47174, 47181, 47188, 47196, 47203, 47211, 47219, + 47228, 47235, 47243, 47251, 47260, 47268, 47277, 47286, + 47296, 47301, 47307, 47313, 47320, 47326, 47333, 47340, + 47348, 47354, 47361, 47368, 47376, 47383, 47391, 47399, + 47408, 47414, 47421, 47428, 47436, 47443, 47451, 47459, + 47468, 47475, 47483, 47491, 47500, 47508, 47517, 47526, + 47536, 47542, 47549, 47556, 47564, 47571, 47579, 47587, + 47596, 47603, 47611, 47619, 47628, 47636, 47645, 47654, + 47664, 47671, 47679, 47687, 47696, 47704, 47713, 47722, + 47732, 47740, 47749, 47758, 47768, 47777, 47787, 47797, + 47808, 47813, 47819, 47825, 47832, 47838, 47845, 47852, + 47860, 47866, 47873, 47880, 47888, 47895, 47903, 47911, + 47920, 47926, 47933, 47940, 47948, 47955, 47963, 47971, + 47980, 47987, 47995, 48003, 48012, 48020, 48029, 48038, + 48048, 48054, 48061, 48068, 48076, 48083, 48091, 48099, + 48108, 48115, 48123, 48131, 48140, 48148, 48157, 48166, + 48176, 48183, 48191, 48199, 48208, 48216, 48225, 48234, + 48244, 48252, 48261, 48270, 48280, 48289, 48299, 48309, + 48320, 48326, 48333, 48340, 48348, 48355, 48363, 48371, + 48380, 48387, 48395, 48403, 48412, 48420, 48429, 48438, + 48448, 48455, 48463, 48471, 48480, 48488, 48497, 48506, + 48516, 48524, 48533, 48542, 48552, 48561, 48571, 48581, + 48592, 48599, 48607, 48615, 48624, 48632, 48641, 48650, + 48660, 48668, 48677, 48686, 48696, 48705, 48715, 48725, + 48736, 48744, 48753, 48762, 48772, 48781, 48791, 48801, + 48812, 48821, 48831, 48841, 48852, 48862, 48873, 48884, + 48896, 48900, 48905, 48910, 48916, 48921, 48927, 48933, + 48940, 48945, 48951, 48957, 48964, 48970, 48977, 48984, + 48992, 48997, 49003, 49009, 49016, 49022, 49029, 49036, + 49044, 49050, 49057, 49064, 49072, 49079, 49087, 49095, + 49104, 49109, 49115, 49121, 49128, 49134, 49141, 49148, + 49156, 49162, 49169, 49176, 49184, 49191, 49199, 49207, + 49216, 49222, 49229, 49236, 49244, 49251, 49259, 49267, + 49276, 49283, 49291, 49299, 49308, 49316, 49325, 49334, + 49344, 49349, 49355, 49361, 49368, 49374, 49381, 49388, + 49396, 49402, 49409, 49416, 49424, 49431, 49439, 49447, + 49456, 49462, 49469, 49476, 49484, 49491, 49499, 49507, + 49516, 49523, 49531, 49539, 49548, 49556, 49565, 49574, + 49584, 49590, 49597, 49604, 49612, 49619, 49627, 49635, + 49644, 49651, 49659, 49667, 49676, 49684, 49693, 49702, + 49712, 49719, 49727, 49735, 49744, 49752, 49761, 49770, + 49780, 49788, 49797, 49806, 49816, 49825, 49835, 49845, + 49856, 49861, 49867, 49873, 49880, 49886, 49893, 49900, + 49908, 49914, 49921, 49928, 49936, 49943, 49951, 49959, + 49968, 49974, 49981, 49988, 49996, 50003, 50011, 50019, + 50028, 50035, 50043, 50051, 50060, 50068, 50077, 50086, + 50096, 50102, 50109, 50116, 50124, 50131, 50139, 50147, + 50156, 50163, 50171, 50179, 50188, 50196, 50205, 50214, + 50224, 50231, 50239, 50247, 50256, 50264, 50273, 50282, + 50292, 50300, 50309, 50318, 50328, 50337, 50347, 50357, + 50368, 50374, 50381, 50388, 50396, 50403, 50411, 50419, + 50428, 50435, 50443, 50451, 50460, 50468, 50477, 50486, + 50496, 50503, 50511, 50519, 50528, 50536, 50545, 50554, + 50564, 50572, 50581, 50590, 50600, 50609, 50619, 50629, + 50640, 50647, 50655, 50663, 50672, 50680, 50689, 50698, + 50708, 50716, 50725, 50734, 50744, 50753, 50763, 50773, + 50784, 50792, 50801, 50810, 50820, 50829, 50839, 50849, + 50860, 50869, 50879, 50889, 50900, 50910, 50921, 50932, + 50944, 50949, 50955, 50961, 50968, 50974, 50981, 50988, + 50996, 51002, 51009, 51016, 51024, 51031, 51039, 51047, + 51056, 51062, 51069, 51076, 51084, 51091, 51099, 51107, + 51116, 51123, 51131, 51139, 51148, 51156, 51165, 51174, + 51184, 51190, 51197, 51204, 51212, 51219, 51227, 51235, + 51244, 51251, 51259, 51267, 51276, 51284, 51293, 51302, + 51312, 51319, 51327, 51335, 51344, 51352, 51361, 51370, + 51380, 51388, 51397, 51406, 51416, 51425, 51435, 51445, + 51456, 51462, 51469, 51476, 51484, 51491, 51499, 51507, + 51516, 51523, 51531, 51539, 51548, 51556, 51565, 51574, + 51584, 51591, 51599, 51607, 51616, 51624, 51633, 51642, + 51652, 51660, 51669, 51678, 51688, 51697, 51707, 51717, + 51728, 51735, 51743, 51751, 51760, 51768, 51777, 51786, + 51796, 51804, 51813, 51822, 51832, 51841, 51851, 51861, + 51872, 51880, 51889, 51898, 51908, 51917, 51927, 51937, + 51948, 51957, 51967, 51977, 51988, 51998, 52009, 52020, + 52032, 52038, 52045, 52052, 52060, 52067, 52075, 52083, + 52092, 52099, 52107, 52115, 52124, 52132, 52141, 52150, + 52160, 52167, 52175, 52183, 52192, 52200, 52209, 52218, + 52228, 52236, 52245, 52254, 52264, 52273, 52283, 52293, + 52304, 52311, 52319, 52327, 52336, 52344, 52353, 52362, + 52372, 52380, 52389, 52398, 52408, 52417, 52427, 52437, + 52448, 52456, 52465, 52474, 52484, 52493, 52503, 52513, + 52524, 52533, 52543, 52553, 52564, 52574, 52585, 52596, + 52608, 52615, 52623, 52631, 52640, 52648, 52657, 52666, + 52676, 52684, 52693, 52702, 52712, 52721, 52731, 52741, + 52752, 52760, 52769, 52778, 52788, 52797, 52807, 52817, + 52828, 52837, 52847, 52857, 52868, 52878, 52889, 52900, + 52912, 52920, 52929, 52938, 52948, 52957, 52967, 52977, + 52988, 52997, 53007, 53017, 53028, 53038, 53049, 53060, + 53072, 53081, 53091, 53101, 53112, 53122, 53133, 53144, + 53156, 53166, 53177, 53188, 53200, 53211, 53223, 53235, + 53248, 53249, 53251, 53253, 53256, 53258, 53261, 53264, + 53268, 53270, 53273, 53276, 53280, 53283, 53287, 53291, + 53296, 53298, 53301, 53304, 53308, 53311, 53315, 53319, + 53324, 53327, 53331, 53335, 53340, 53344, 53349, 53354, + 53360, 53362, 53365, 53368, 53372, 53375, 53379, 53383, + 53388, 53391, 53395, 53399, 53404, 53408, 53413, 53418, + 53424, 53427, 53431, 53435, 53440, 53444, 53449, 53454, + 53460, 53464, 53469, 53474, 53480, 53485, 53491, 53497, + 53504, 53506, 53509, 53512, 53516, 53519, 53523, 53527, + 53532, 53535, 53539, 53543, 53548, 53552, 53557, 53562, + 53568, 53571, 53575, 53579, 53584, 53588, 53593, 53598, + 53604, 53608, 53613, 53618, 53624, 53629, 53635, 53641, + 53648, 53651, 53655, 53659, 53664, 53668, 53673, 53678, + 53684, 53688, 53693, 53698, 53704, 53709, 53715, 53721, + 53728, 53732, 53737, 53742, 53748, 53753, 53759, 53765, + 53772, 53777, 53783, 53789, 53796, 53802, 53809, 53816, + 53824, 53826, 53829, 53832, 53836, 53839, 53843, 53847, + 53852, 53855, 53859, 53863, 53868, 53872, 53877, 53882, + 53888, 53891, 53895, 53899, 53904, 53908, 53913, 53918, + 53924, 53928, 53933, 53938, 53944, 53949, 53955, 53961, + 53968, 53971, 53975, 53979, 53984, 53988, 53993, 53998, + 54004, 54008, 54013, 54018, 54024, 54029, 54035, 54041, + 54048, 54052, 54057, 54062, 54068, 54073, 54079, 54085, + 54092, 54097, 54103, 54109, 54116, 54122, 54129, 54136, + 54144, 54147, 54151, 54155, 54160, 54164, 54169, 54174, + 54180, 54184, 54189, 54194, 54200, 54205, 54211, 54217, + 54224, 54228, 54233, 54238, 54244, 54249, 54255, 54261, + 54268, 54273, 54279, 54285, 54292, 54298, 54305, 54312, + 54320, 54324, 54329, 54334, 54340, 54345, 54351, 54357, + 54364, 54369, 54375, 54381, 54388, 54394, 54401, 54408, + 54416, 54421, 54427, 54433, 54440, 54446, 54453, 54460, + 54468, 54474, 54481, 54488, 54496, 54503, 54511, 54519, + 54528, 54530, 54533, 54536, 54540, 54543, 54547, 54551, + 54556, 54559, 54563, 54567, 54572, 54576, 54581, 54586, + 54592, 54595, 54599, 54603, 54608, 54612, 54617, 54622, + 54628, 54632, 54637, 54642, 54648, 54653, 54659, 54665, + 54672, 54675, 54679, 54683, 54688, 54692, 54697, 54702, + 54708, 54712, 54717, 54722, 54728, 54733, 54739, 54745, + 54752, 54756, 54761, 54766, 54772, 54777, 54783, 54789, + 54796, 54801, 54807, 54813, 54820, 54826, 54833, 54840, + 54848, 54851, 54855, 54859, 54864, 54868, 54873, 54878, + 54884, 54888, 54893, 54898, 54904, 54909, 54915, 54921, + 54928, 54932, 54937, 54942, 54948, 54953, 54959, 54965, + 54972, 54977, 54983, 54989, 54996, 55002, 55009, 55016, + 55024, 55028, 55033, 55038, 55044, 55049, 55055, 55061, + 55068, 55073, 55079, 55085, 55092, 55098, 55105, 55112, + 55120, 55125, 55131, 55137, 55144, 55150, 55157, 55164, + 55172, 55178, 55185, 55192, 55200, 55207, 55215, 55223, + 55232, 55235, 55239, 55243, 55248, 55252, 55257, 55262, + 55268, 55272, 55277, 55282, 55288, 55293, 55299, 55305, + 55312, 55316, 55321, 55326, 55332, 55337, 55343, 55349, + 55356, 55361, 55367, 55373, 55380, 55386, 55393, 55400, + 55408, 55412, 55417, 55422, 55428, 55433, 55439, 55445, + 55452, 55457, 55463, 55469, 55476, 55482, 55489, 55496, + 55504, 55509, 55515, 55521, 55528, 55534, 55541, 55548, + 55556, 55562, 55569, 55576, 55584, 55591, 55599, 55607, + 55616, 55620, 55625, 55630, 55636, 55641, 55647, 55653, + 55660, 55665, 55671, 55677, 55684, 55690, 55697, 55704, + 55712, 55717, 55723, 55729, 55736, 55742, 55749, 55756, + 55764, 55770, 55777, 55784, 55792, 55799, 55807, 55815, + 55824, 55829, 55835, 55841, 55848, 55854, 55861, 55868, + 55876, 55882, 55889, 55896, 55904, 55911, 55919, 55927, + 55936, 55942, 55949, 55956, 55964, 55971, 55979, 55987, + 55996, 56003, 56011, 56019, 56028, 56036, 56045, 56054, + 56064, 56066, 56069, 56072, 56076, 56079, 56083, 56087, + 56092, 56095, 56099, 56103, 56108, 56112, 56117, 56122, + 56128, 56131, 56135, 56139, 56144, 56148, 56153, 56158, + 56164, 56168, 56173, 56178, 56184, 56189, 56195, 56201, + 56208, 56211, 56215, 56219, 56224, 56228, 56233, 56238, + 56244, 56248, 56253, 56258, 56264, 56269, 56275, 56281, + 56288, 56292, 56297, 56302, 56308, 56313, 56319, 56325, + 56332, 56337, 56343, 56349, 56356, 56362, 56369, 56376, + 56384, 56387, 56391, 56395, 56400, 56404, 56409, 56414, + 56420, 56424, 56429, 56434, 56440, 56445, 56451, 56457, + 56464, 56468, 56473, 56478, 56484, 56489, 56495, 56501, + 56508, 56513, 56519, 56525, 56532, 56538, 56545, 56552, + 56560, 56564, 56569, 56574, 56580, 56585, 56591, 56597, + 56604, 56609, 56615, 56621, 56628, 56634, 56641, 56648, + 56656, 56661, 56667, 56673, 56680, 56686, 56693, 56700, + 56708, 56714, 56721, 56728, 56736, 56743, 56751, 56759, + 56768, 56771, 56775, 56779, 56784, 56788, 56793, 56798, + 56804, 56808, 56813, 56818, 56824, 56829, 56835, 56841, + 56848, 56852, 56857, 56862, 56868, 56873, 56879, 56885, + 56892, 56897, 56903, 56909, 56916, 56922, 56929, 56936, + 56944, 56948, 56953, 56958, 56964, 56969, 56975, 56981, + 56988, 56993, 56999, 57005, 57012, 57018, 57025, 57032, + 57040, 57045, 57051, 57057, 57064, 57070, 57077, 57084, + 57092, 57098, 57105, 57112, 57120, 57127, 57135, 57143, + 57152, 57156, 57161, 57166, 57172, 57177, 57183, 57189, + 57196, 57201, 57207, 57213, 57220, 57226, 57233, 57240, + 57248, 57253, 57259, 57265, 57272, 57278, 57285, 57292, + 57300, 57306, 57313, 57320, 57328, 57335, 57343, 57351, + 57360, 57365, 57371, 57377, 57384, 57390, 57397, 57404, + 57412, 57418, 57425, 57432, 57440, 57447, 57455, 57463, + 57472, 57478, 57485, 57492, 57500, 57507, 57515, 57523, + 57532, 57539, 57547, 57555, 57564, 57572, 57581, 57590, + 57600, 57603, 57607, 57611, 57616, 57620, 57625, 57630, + 57636, 57640, 57645, 57650, 57656, 57661, 57667, 57673, + 57680, 57684, 57689, 57694, 57700, 57705, 57711, 57717, + 57724, 57729, 57735, 57741, 57748, 57754, 57761, 57768, + 57776, 57780, 57785, 57790, 57796, 57801, 57807, 57813, + 57820, 57825, 57831, 57837, 57844, 57850, 57857, 57864, + 57872, 57877, 57883, 57889, 57896, 57902, 57909, 57916, + 57924, 57930, 57937, 57944, 57952, 57959, 57967, 57975, + 57984, 57988, 57993, 57998, 58004, 58009, 58015, 58021, + 58028, 58033, 58039, 58045, 58052, 58058, 58065, 58072, + 58080, 58085, 58091, 58097, 58104, 58110, 58117, 58124, + 58132, 58138, 58145, 58152, 58160, 58167, 58175, 58183, + 58192, 58197, 58203, 58209, 58216, 58222, 58229, 58236, + 58244, 58250, 58257, 58264, 58272, 58279, 58287, 58295, + 58304, 58310, 58317, 58324, 58332, 58339, 58347, 58355, + 58364, 58371, 58379, 58387, 58396, 58404, 58413, 58422, + 58432, 58436, 58441, 58446, 58452, 58457, 58463, 58469, + 58476, 58481, 58487, 58493, 58500, 58506, 58513, 58520, + 58528, 58533, 58539, 58545, 58552, 58558, 58565, 58572, + 58580, 58586, 58593, 58600, 58608, 58615, 58623, 58631, + 58640, 58645, 58651, 58657, 58664, 58670, 58677, 58684, + 58692, 58698, 58705, 58712, 58720, 58727, 58735, 58743, + 58752, 58758, 58765, 58772, 58780, 58787, 58795, 58803, + 58812, 58819, 58827, 58835, 58844, 58852, 58861, 58870, + 58880, 58885, 58891, 58897, 58904, 58910, 58917, 58924, + 58932, 58938, 58945, 58952, 58960, 58967, 58975, 58983, + 58992, 58998, 59005, 59012, 59020, 59027, 59035, 59043, + 59052, 59059, 59067, 59075, 59084, 59092, 59101, 59110, + 59120, 59126, 59133, 59140, 59148, 59155, 59163, 59171, + 59180, 59187, 59195, 59203, 59212, 59220, 59229, 59238, + 59248, 59255, 59263, 59271, 59280, 59288, 59297, 59306, + 59316, 59324, 59333, 59342, 59352, 59361, 59371, 59381, + 59392, 59394, 59397, 59400, 59404, 59407, 59411, 59415, + 59420, 59423, 59427, 59431, 59436, 59440, 59445, 59450, + 59456, 59459, 59463, 59467, 59472, 59476, 59481, 59486, + 59492, 59496, 59501, 59506, 59512, 59517, 59523, 59529, + 59536, 59539, 59543, 59547, 59552, 59556, 59561, 59566, + 59572, 59576, 59581, 59586, 59592, 59597, 59603, 59609, + 59616, 59620, 59625, 59630, 59636, 59641, 59647, 59653, + 59660, 59665, 59671, 59677, 59684, 59690, 59697, 59704, + 59712, 59715, 59719, 59723, 59728, 59732, 59737, 59742, + 59748, 59752, 59757, 59762, 59768, 59773, 59779, 59785, + 59792, 59796, 59801, 59806, 59812, 59817, 59823, 59829, + 59836, 59841, 59847, 59853, 59860, 59866, 59873, 59880, + 59888, 59892, 59897, 59902, 59908, 59913, 59919, 59925, + 59932, 59937, 59943, 59949, 59956, 59962, 59969, 59976, + 59984, 59989, 59995, 60001, 60008, 60014, 60021, 60028, + 60036, 60042, 60049, 60056, 60064, 60071, 60079, 60087, + 60096, 60099, 60103, 60107, 60112, 60116, 60121, 60126, + 60132, 60136, 60141, 60146, 60152, 60157, 60163, 60169, + 60176, 60180, 60185, 60190, 60196, 60201, 60207, 60213, + 60220, 60225, 60231, 60237, 60244, 60250, 60257, 60264, + 60272, 60276, 60281, 60286, 60292, 60297, 60303, 60309, + 60316, 60321, 60327, 60333, 60340, 60346, 60353, 60360, + 60368, 60373, 60379, 60385, 60392, 60398, 60405, 60412, + 60420, 60426, 60433, 60440, 60448, 60455, 60463, 60471, + 60480, 60484, 60489, 60494, 60500, 60505, 60511, 60517, + 60524, 60529, 60535, 60541, 60548, 60554, 60561, 60568, + 60576, 60581, 60587, 60593, 60600, 60606, 60613, 60620, + 60628, 60634, 60641, 60648, 60656, 60663, 60671, 60679, + 60688, 60693, 60699, 60705, 60712, 60718, 60725, 60732, + 60740, 60746, 60753, 60760, 60768, 60775, 60783, 60791, + 60800, 60806, 60813, 60820, 60828, 60835, 60843, 60851, + 60860, 60867, 60875, 60883, 60892, 60900, 60909, 60918, + 60928, 60931, 60935, 60939, 60944, 60948, 60953, 60958, + 60964, 60968, 60973, 60978, 60984, 60989, 60995, 61001, + 61008, 61012, 61017, 61022, 61028, 61033, 61039, 61045, + 61052, 61057, 61063, 61069, 61076, 61082, 61089, 61096, + 61104, 61108, 61113, 61118, 61124, 61129, 61135, 61141, + 61148, 61153, 61159, 61165, 61172, 61178, 61185, 61192, + 61200, 61205, 61211, 61217, 61224, 61230, 61237, 61244, + 61252, 61258, 61265, 61272, 61280, 61287, 61295, 61303, + 61312, 61316, 61321, 61326, 61332, 61337, 61343, 61349, + 61356, 61361, 61367, 61373, 61380, 61386, 61393, 61400, + 61408, 61413, 61419, 61425, 61432, 61438, 61445, 61452, + 61460, 61466, 61473, 61480, 61488, 61495, 61503, 61511, + 61520, 61525, 61531, 61537, 61544, 61550, 61557, 61564, + 61572, 61578, 61585, 61592, 61600, 61607, 61615, 61623, + 61632, 61638, 61645, 61652, 61660, 61667, 61675, 61683, + 61692, 61699, 61707, 61715, 61724, 61732, 61741, 61750, + 61760, 61764, 61769, 61774, 61780, 61785, 61791, 61797, + 61804, 61809, 61815, 61821, 61828, 61834, 61841, 61848, + 61856, 61861, 61867, 61873, 61880, 61886, 61893, 61900, + 61908, 61914, 61921, 61928, 61936, 61943, 61951, 61959, + 61968, 61973, 61979, 61985, 61992, 61998, 62005, 62012, + 62020, 62026, 62033, 62040, 62048, 62055, 62063, 62071, + 62080, 62086, 62093, 62100, 62108, 62115, 62123, 62131, + 62140, 62147, 62155, 62163, 62172, 62180, 62189, 62198, + 62208, 62213, 62219, 62225, 62232, 62238, 62245, 62252, + 62260, 62266, 62273, 62280, 62288, 62295, 62303, 62311, + 62320, 62326, 62333, 62340, 62348, 62355, 62363, 62371, + 62380, 62387, 62395, 62403, 62412, 62420, 62429, 62438, + 62448, 62454, 62461, 62468, 62476, 62483, 62491, 62499, + 62508, 62515, 62523, 62531, 62540, 62548, 62557, 62566, + 62576, 62583, 62591, 62599, 62608, 62616, 62625, 62634, + 62644, 62652, 62661, 62670, 62680, 62689, 62699, 62709, + 62720, 62723, 62727, 62731, 62736, 62740, 62745, 62750, + 62756, 62760, 62765, 62770, 62776, 62781, 62787, 62793, + 62800, 62804, 62809, 62814, 62820, 62825, 62831, 62837, + 62844, 62849, 62855, 62861, 62868, 62874, 62881, 62888, + 62896, 62900, 62905, 62910, 62916, 62921, 62927, 62933, + 62940, 62945, 62951, 62957, 62964, 62970, 62977, 62984, + 62992, 62997, 63003, 63009, 63016, 63022, 63029, 63036, + 63044, 63050, 63057, 63064, 63072, 63079, 63087, 63095, + 63104, 63108, 63113, 63118, 63124, 63129, 63135, 63141, + 63148, 63153, 63159, 63165, 63172, 63178, 63185, 63192, + 63200, 63205, 63211, 63217, 63224, 63230, 63237, 63244, + 63252, 63258, 63265, 63272, 63280, 63287, 63295, 63303, + 63312, 63317, 63323, 63329, 63336, 63342, 63349, 63356, + 63364, 63370, 63377, 63384, 63392, 63399, 63407, 63415, + 63424, 63430, 63437, 63444, 63452, 63459, 63467, 63475, + 63484, 63491, 63499, 63507, 63516, 63524, 63533, 63542, + 63552, 63556, 63561, 63566, 63572, 63577, 63583, 63589, + 63596, 63601, 63607, 63613, 63620, 63626, 63633, 63640, + 63648, 63653, 63659, 63665, 63672, 63678, 63685, 63692, + 63700, 63706, 63713, 63720, 63728, 63735, 63743, 63751, + 63760, 63765, 63771, 63777, 63784, 63790, 63797, 63804, + 63812, 63818, 63825, 63832, 63840, 63847, 63855, 63863, + 63872, 63878, 63885, 63892, 63900, 63907, 63915, 63923, + 63932, 63939, 63947, 63955, 63964, 63972, 63981, 63990, + 64000, 64005, 64011, 64017, 64024, 64030, 64037, 64044, + 64052, 64058, 64065, 64072, 64080, 64087, 64095, 64103, + 64112, 64118, 64125, 64132, 64140, 64147, 64155, 64163, + 64172, 64179, 64187, 64195, 64204, 64212, 64221, 64230, + 64240, 64246, 64253, 64260, 64268, 64275, 64283, 64291, + 64300, 64307, 64315, 64323, 64332, 64340, 64349, 64358, + 64368, 64375, 64383, 64391, 64400, 64408, 64417, 64426, + 64436, 64444, 64453, 64462, 64472, 64481, 64491, 64501, + 64512, 64516, 64521, 64526, 64532, 64537, 64543, 64549, + 64556, 64561, 64567, 64573, 64580, 64586, 64593, 64600, + 64608, 64613, 64619, 64625, 64632, 64638, 64645, 64652, + 64660, 64666, 64673, 64680, 64688, 64695, 64703, 64711, + 64720, 64725, 64731, 64737, 64744, 64750, 64757, 64764, + 64772, 64778, 64785, 64792, 64800, 64807, 64815, 64823, + 64832, 64838, 64845, 64852, 64860, 64867, 64875, 64883, + 64892, 64899, 64907, 64915, 64924, 64932, 64941, 64950, + 64960, 64965, 64971, 64977, 64984, 64990, 64997, 65004, + 65012, 65018, 65025, 65032, 65040, 65047, 65055, 65063, + 65072, 65078, 65085, 65092, 65100, 65107, 65115, 65123, + 65132, 65139, 65147, 65155, 65164, 65172, 65181, 65190, + 65200, 65206, 65213, 65220, 65228, 65235, 65243, 65251, + 65260, 65267, 65275, 65283, 65292, 65300, 65309, 65318, + 65328, 65335, 65343, 65351, 65360, 65368, 65377, 65386, + 65396, 65404, 65413, 65422, 65432, 65441, 65451, 65461, + 65472, 65477, 65483, 65489, 65496, 65502, 65509, 65516, + 65524, 65530, 65537, 65544, 65552, 65559, 65567, 65575, + 65584, 65590, 65597, 65604, 65612, 65619, 65627, 65635, + 65644, 65651, 65659, 65667, 65676, 65684, 65693, 65702, + 65712, 65718, 65725, 65732, 65740, 65747, 65755, 65763, + 65772, 65779, 65787, 65795, 65804, 65812, 65821, 65830, + 65840, 65847, 65855, 65863, 65872, 65880, 65889, 65898, + 65908, 65916, 65925, 65934, 65944, 65953, 65963, 65973, + 65984, 65990, 65997, 66004, 66012, 66019, 66027, 66035, + 66044, 66051, 66059, 66067, 66076, 66084, 66093, 66102, + 66112, 66119, 66127, 66135, 66144, 66152, 66161, 66170, + 66180, 66188, 66197, 66206, 66216, 66225, 66235, 66245, + 66256, 66263, 66271, 66279, 66288, 66296, 66305, 66314, + 66324, 66332, 66341, 66350, 66360, 66369, 66379, 66389, + 66400, 66408, 66417, 66426, 66436, 66445, 66455, 66465, + 66476, 66485, 66495, 66505, 66516, 66526, 66537, 66548, + 66560, 66562, 66565, 66568, 66572, 66575, 66579, 66583, + 66588, 66591, 66595, 66599, 66604, 66608, 66613, 66618, + 66624, 66627, 66631, 66635, 66640, 66644, 66649, 66654, + 66660, 66664, 66669, 66674, 66680, 66685, 66691, 66697, + 66704, 66707, 66711, 66715, 66720, 66724, 66729, 66734, + 66740, 66744, 66749, 66754, 66760, 66765, 66771, 66777, + 66784, 66788, 66793, 66798, 66804, 66809, 66815, 66821, + 66828, 66833, 66839, 66845, 66852, 66858, 66865, 66872, + 66880, 66883, 66887, 66891, 66896, 66900, 66905, 66910, + 66916, 66920, 66925, 66930, 66936, 66941, 66947, 66953, + 66960, 66964, 66969, 66974, 66980, 66985, 66991, 66997, + 67004, 67009, 67015, 67021, 67028, 67034, 67041, 67048, + 67056, 67060, 67065, 67070, 67076, 67081, 67087, 67093, + 67100, 67105, 67111, 67117, 67124, 67130, 67137, 67144, + 67152, 67157, 67163, 67169, 67176, 67182, 67189, 67196, + 67204, 67210, 67217, 67224, 67232, 67239, 67247, 67255, + 67264, 67267, 67271, 67275, 67280, 67284, 67289, 67294, + 67300, 67304, 67309, 67314, 67320, 67325, 67331, 67337, + 67344, 67348, 67353, 67358, 67364, 67369, 67375, 67381, + 67388, 67393, 67399, 67405, 67412, 67418, 67425, 67432, + 67440, 67444, 67449, 67454, 67460, 67465, 67471, 67477, + 67484, 67489, 67495, 67501, 67508, 67514, 67521, 67528, + 67536, 67541, 67547, 67553, 67560, 67566, 67573, 67580, + 67588, 67594, 67601, 67608, 67616, 67623, 67631, 67639, + 67648, 67652, 67657, 67662, 67668, 67673, 67679, 67685, + 67692, 67697, 67703, 67709, 67716, 67722, 67729, 67736, + 67744, 67749, 67755, 67761, 67768, 67774, 67781, 67788, + 67796, 67802, 67809, 67816, 67824, 67831, 67839, 67847, + 67856, 67861, 67867, 67873, 67880, 67886, 67893, 67900, + 67908, 67914, 67921, 67928, 67936, 67943, 67951, 67959, + 67968, 67974, 67981, 67988, 67996, 68003, 68011, 68019, + 68028, 68035, 68043, 68051, 68060, 68068, 68077, 68086, + 68096, 68099, 68103, 68107, 68112, 68116, 68121, 68126, + 68132, 68136, 68141, 68146, 68152, 68157, 68163, 68169, + 68176, 68180, 68185, 68190, 68196, 68201, 68207, 68213, + 68220, 68225, 68231, 68237, 68244, 68250, 68257, 68264, + 68272, 68276, 68281, 68286, 68292, 68297, 68303, 68309, + 68316, 68321, 68327, 68333, 68340, 68346, 68353, 68360, + 68368, 68373, 68379, 68385, 68392, 68398, 68405, 68412, + 68420, 68426, 68433, 68440, 68448, 68455, 68463, 68471, + 68480, 68484, 68489, 68494, 68500, 68505, 68511, 68517, + 68524, 68529, 68535, 68541, 68548, 68554, 68561, 68568, + 68576, 68581, 68587, 68593, 68600, 68606, 68613, 68620, + 68628, 68634, 68641, 68648, 68656, 68663, 68671, 68679, + 68688, 68693, 68699, 68705, 68712, 68718, 68725, 68732, + 68740, 68746, 68753, 68760, 68768, 68775, 68783, 68791, + 68800, 68806, 68813, 68820, 68828, 68835, 68843, 68851, + 68860, 68867, 68875, 68883, 68892, 68900, 68909, 68918, + 68928, 68932, 68937, 68942, 68948, 68953, 68959, 68965, + 68972, 68977, 68983, 68989, 68996, 69002, 69009, 69016, + 69024, 69029, 69035, 69041, 69048, 69054, 69061, 69068, + 69076, 69082, 69089, 69096, 69104, 69111, 69119, 69127, + 69136, 69141, 69147, 69153, 69160, 69166, 69173, 69180, + 69188, 69194, 69201, 69208, 69216, 69223, 69231, 69239, + 69248, 69254, 69261, 69268, 69276, 69283, 69291, 69299, + 69308, 69315, 69323, 69331, 69340, 69348, 69357, 69366, + 69376, 69381, 69387, 69393, 69400, 69406, 69413, 69420, + 69428, 69434, 69441, 69448, 69456, 69463, 69471, 69479, + 69488, 69494, 69501, 69508, 69516, 69523, 69531, 69539, + 69548, 69555, 69563, 69571, 69580, 69588, 69597, 69606, + 69616, 69622, 69629, 69636, 69644, 69651, 69659, 69667, + 69676, 69683, 69691, 69699, 69708, 69716, 69725, 69734, + 69744, 69751, 69759, 69767, 69776, 69784, 69793, 69802, + 69812, 69820, 69829, 69838, 69848, 69857, 69867, 69877, + 69888, 69891, 69895, 69899, 69904, 69908, 69913, 69918, + 69924, 69928, 69933, 69938, 69944, 69949, 69955, 69961, + 69968, 69972, 69977, 69982, 69988, 69993, 69999, 70005, + 70012, 70017, 70023, 70029, 70036, 70042, 70049, 70056, + 70064, 70068, 70073, 70078, 70084, 70089, 70095, 70101, + 70108, 70113, 70119, 70125, 70132, 70138, 70145, 70152, + 70160, 70165, 70171, 70177, 70184, 70190, 70197, 70204, + 70212, 70218, 70225, 70232, 70240, 70247, 70255, 70263, + 70272, 70276, 70281, 70286, 70292, 70297, 70303, 70309, + 70316, 70321, 70327, 70333, 70340, 70346, 70353, 70360, + 70368, 70373, 70379, 70385, 70392, 70398, 70405, 70412, + 70420, 70426, 70433, 70440, 70448, 70455, 70463, 70471, + 70480, 70485, 70491, 70497, 70504, 70510, 70517, 70524, + 70532, 70538, 70545, 70552, 70560, 70567, 70575, 70583, + 70592, 70598, 70605, 70612, 70620, 70627, 70635, 70643, + 70652, 70659, 70667, 70675, 70684, 70692, 70701, 70710, + 70720, 70724, 70729, 70734, 70740, 70745, 70751, 70757, + 70764, 70769, 70775, 70781, 70788, 70794, 70801, 70808, + 70816, 70821, 70827, 70833, 70840, 70846, 70853, 70860, + 70868, 70874, 70881, 70888, 70896, 70903, 70911, 70919, + 70928, 70933, 70939, 70945, 70952, 70958, 70965, 70972, + 70980, 70986, 70993, 71000, 71008, 71015, 71023, 71031, + 71040, 71046, 71053, 71060, 71068, 71075, 71083, 71091, + 71100, 71107, 71115, 71123, 71132, 71140, 71149, 71158, + 71168, 71173, 71179, 71185, 71192, 71198, 71205, 71212, + 71220, 71226, 71233, 71240, 71248, 71255, 71263, 71271, + 71280, 71286, 71293, 71300, 71308, 71315, 71323, 71331, + 71340, 71347, 71355, 71363, 71372, 71380, 71389, 71398, + 71408, 71414, 71421, 71428, 71436, 71443, 71451, 71459, + 71468, 71475, 71483, 71491, 71500, 71508, 71517, 71526, + 71536, 71543, 71551, 71559, 71568, 71576, 71585, 71594, + 71604, 71612, 71621, 71630, 71640, 71649, 71659, 71669, + 71680, 71684, 71689, 71694, 71700, 71705, 71711, 71717, + 71724, 71729, 71735, 71741, 71748, 71754, 71761, 71768, + 71776, 71781, 71787, 71793, 71800, 71806, 71813, 71820, + 71828, 71834, 71841, 71848, 71856, 71863, 71871, 71879, + 71888, 71893, 71899, 71905, 71912, 71918, 71925, 71932, + 71940, 71946, 71953, 71960, 71968, 71975, 71983, 71991, + 72000, 72006, 72013, 72020, 72028, 72035, 72043, 72051, + 72060, 72067, 72075, 72083, 72092, 72100, 72109, 72118, + 72128, 72133, 72139, 72145, 72152, 72158, 72165, 72172, + 72180, 72186, 72193, 72200, 72208, 72215, 72223, 72231, + 72240, 72246, 72253, 72260, 72268, 72275, 72283, 72291, + 72300, 72307, 72315, 72323, 72332, 72340, 72349, 72358, + 72368, 72374, 72381, 72388, 72396, 72403, 72411, 72419, + 72428, 72435, 72443, 72451, 72460, 72468, 72477, 72486, + 72496, 72503, 72511, 72519, 72528, 72536, 72545, 72554, + 72564, 72572, 72581, 72590, 72600, 72609, 72619, 72629, + 72640, 72645, 72651, 72657, 72664, 72670, 72677, 72684, + 72692, 72698, 72705, 72712, 72720, 72727, 72735, 72743, + 72752, 72758, 72765, 72772, 72780, 72787, 72795, 72803, + 72812, 72819, 72827, 72835, 72844, 72852, 72861, 72870, + 72880, 72886, 72893, 72900, 72908, 72915, 72923, 72931, + 72940, 72947, 72955, 72963, 72972, 72980, 72989, 72998, + 73008, 73015, 73023, 73031, 73040, 73048, 73057, 73066, + 73076, 73084, 73093, 73102, 73112, 73121, 73131, 73141, + 73152, 73158, 73165, 73172, 73180, 73187, 73195, 73203, + 73212, 73219, 73227, 73235, 73244, 73252, 73261, 73270, + 73280, 73287, 73295, 73303, 73312, 73320, 73329, 73338, + 73348, 73356, 73365, 73374, 73384, 73393, 73403, 73413, + 73424, 73431, 73439, 73447, 73456, 73464, 73473, 73482, + 73492, 73500, 73509, 73518, 73528, 73537, 73547, 73557, + 73568, 73576, 73585, 73594, 73604, 73613, 73623, 73633, + 73644, 73653, 73663, 73673, 73684, 73694, 73705, 73716, + 73728, 73731, 73735, 73739, 73744, 73748, 73753, 73758, + 73764, 73768, 73773, 73778, 73784, 73789, 73795, 73801, + 73808, 73812, 73817, 73822, 73828, 73833, 73839, 73845, + 73852, 73857, 73863, 73869, 73876, 73882, 73889, 73896, + 73904, 73908, 73913, 73918, 73924, 73929, 73935, 73941, + 73948, 73953, 73959, 73965, 73972, 73978, 73985, 73992, + 74000, 74005, 74011, 74017, 74024, 74030, 74037, 74044, + 74052, 74058, 74065, 74072, 74080, 74087, 74095, 74103, + 74112, 74116, 74121, 74126, 74132, 74137, 74143, 74149, + 74156, 74161, 74167, 74173, 74180, 74186, 74193, 74200, + 74208, 74213, 74219, 74225, 74232, 74238, 74245, 74252, + 74260, 74266, 74273, 74280, 74288, 74295, 74303, 74311, + 74320, 74325, 74331, 74337, 74344, 74350, 74357, 74364, + 74372, 74378, 74385, 74392, 74400, 74407, 74415, 74423, + 74432, 74438, 74445, 74452, 74460, 74467, 74475, 74483, + 74492, 74499, 74507, 74515, 74524, 74532, 74541, 74550, + 74560, 74564, 74569, 74574, 74580, 74585, 74591, 74597, + 74604, 74609, 74615, 74621, 74628, 74634, 74641, 74648, + 74656, 74661, 74667, 74673, 74680, 74686, 74693, 74700, + 74708, 74714, 74721, 74728, 74736, 74743, 74751, 74759, + 74768, 74773, 74779, 74785, 74792, 74798, 74805, 74812, + 74820, 74826, 74833, 74840, 74848, 74855, 74863, 74871, + 74880, 74886, 74893, 74900, 74908, 74915, 74923, 74931, + 74940, 74947, 74955, 74963, 74972, 74980, 74989, 74998, + 75008, 75013, 75019, 75025, 75032, 75038, 75045, 75052, + 75060, 75066, 75073, 75080, 75088, 75095, 75103, 75111, + 75120, 75126, 75133, 75140, 75148, 75155, 75163, 75171, + 75180, 75187, 75195, 75203, 75212, 75220, 75229, 75238, + 75248, 75254, 75261, 75268, 75276, 75283, 75291, 75299, + 75308, 75315, 75323, 75331, 75340, 75348, 75357, 75366, + 75376, 75383, 75391, 75399, 75408, 75416, 75425, 75434, + 75444, 75452, 75461, 75470, 75480, 75489, 75499, 75509, + 75520, 75524, 75529, 75534, 75540, 75545, 75551, 75557, + 75564, 75569, 75575, 75581, 75588, 75594, 75601, 75608, + 75616, 75621, 75627, 75633, 75640, 75646, 75653, 75660, + 75668, 75674, 75681, 75688, 75696, 75703, 75711, 75719, + 75728, 75733, 75739, 75745, 75752, 75758, 75765, 75772, + 75780, 75786, 75793, 75800, 75808, 75815, 75823, 75831, + 75840, 75846, 75853, 75860, 75868, 75875, 75883, 75891, + 75900, 75907, 75915, 75923, 75932, 75940, 75949, 75958, + 75968, 75973, 75979, 75985, 75992, 75998, 76005, 76012, + 76020, 76026, 76033, 76040, 76048, 76055, 76063, 76071, + 76080, 76086, 76093, 76100, 76108, 76115, 76123, 76131, + 76140, 76147, 76155, 76163, 76172, 76180, 76189, 76198, + 76208, 76214, 76221, 76228, 76236, 76243, 76251, 76259, + 76268, 76275, 76283, 76291, 76300, 76308, 76317, 76326, + 76336, 76343, 76351, 76359, 76368, 76376, 76385, 76394, + 76404, 76412, 76421, 76430, 76440, 76449, 76459, 76469, + 76480, 76485, 76491, 76497, 76504, 76510, 76517, 76524, + 76532, 76538, 76545, 76552, 76560, 76567, 76575, 76583, + 76592, 76598, 76605, 76612, 76620, 76627, 76635, 76643, + 76652, 76659, 76667, 76675, 76684, 76692, 76701, 76710, + 76720, 76726, 76733, 76740, 76748, 76755, 76763, 76771, + 76780, 76787, 76795, 76803, 76812, 76820, 76829, 76838, + 76848, 76855, 76863, 76871, 76880, 76888, 76897, 76906, + 76916, 76924, 76933, 76942, 76952, 76961, 76971, 76981, + 76992, 76998, 77005, 77012, 77020, 77027, 77035, 77043, + 77052, 77059, 77067, 77075, 77084, 77092, 77101, 77110, + 77120, 77127, 77135, 77143, 77152, 77160, 77169, 77178, + 77188, 77196, 77205, 77214, 77224, 77233, 77243, 77253, + 77264, 77271, 77279, 77287, 77296, 77304, 77313, 77322, + 77332, 77340, 77349, 77358, 77368, 77377, 77387, 77397, + 77408, 77416, 77425, 77434, 77444, 77453, 77463, 77473, + 77484, 77493, 77503, 77513, 77524, 77534, 77545, 77556, + 77568, 77572, 77577, 77582, 77588, 77593, 77599, 77605, + 77612, 77617, 77623, 77629, 77636, 77642, 77649, 77656, + 77664, 77669, 77675, 77681, 77688, 77694, 77701, 77708, + 77716, 77722, 77729, 77736, 77744, 77751, 77759, 77767, + 77776, 77781, 77787, 77793, 77800, 77806, 77813, 77820, + 77828, 77834, 77841, 77848, 77856, 77863, 77871, 77879, + 77888, 77894, 77901, 77908, 77916, 77923, 77931, 77939, + 77948, 77955, 77963, 77971, 77980, 77988, 77997, 78006, + 78016, 78021, 78027, 78033, 78040, 78046, 78053, 78060, + 78068, 78074, 78081, 78088, 78096, 78103, 78111, 78119, + 78128, 78134, 78141, 78148, 78156, 78163, 78171, 78179, + 78188, 78195, 78203, 78211, 78220, 78228, 78237, 78246, + 78256, 78262, 78269, 78276, 78284, 78291, 78299, 78307, + 78316, 78323, 78331, 78339, 78348, 78356, 78365, 78374, + 78384, 78391, 78399, 78407, 78416, 78424, 78433, 78442, + 78452, 78460, 78469, 78478, 78488, 78497, 78507, 78517, + 78528, 78533, 78539, 78545, 78552, 78558, 78565, 78572, + 78580, 78586, 78593, 78600, 78608, 78615, 78623, 78631, + 78640, 78646, 78653, 78660, 78668, 78675, 78683, 78691, + 78700, 78707, 78715, 78723, 78732, 78740, 78749, 78758, + 78768, 78774, 78781, 78788, 78796, 78803, 78811, 78819, + 78828, 78835, 78843, 78851, 78860, 78868, 78877, 78886, + 78896, 78903, 78911, 78919, 78928, 78936, 78945, 78954, + 78964, 78972, 78981, 78990, 79000, 79009, 79019, 79029, + 79040, 79046, 79053, 79060, 79068, 79075, 79083, 79091, + 79100, 79107, 79115, 79123, 79132, 79140, 79149, 79158, + 79168, 79175, 79183, 79191, 79200, 79208, 79217, 79226, + 79236, 79244, 79253, 79262, 79272, 79281, 79291, 79301, + 79312, 79319, 79327, 79335, 79344, 79352, 79361, 79370, + 79380, 79388, 79397, 79406, 79416, 79425, 79435, 79445, + 79456, 79464, 79473, 79482, 79492, 79501, 79511, 79521, + 79532, 79541, 79551, 79561, 79572, 79582, 79593, 79604, + 79616, 79621, 79627, 79633, 79640, 79646, 79653, 79660, + 79668, 79674, 79681, 79688, 79696, 79703, 79711, 79719, + 79728, 79734, 79741, 79748, 79756, 79763, 79771, 79779, + 79788, 79795, 79803, 79811, 79820, 79828, 79837, 79846, + 79856, 79862, 79869, 79876, 79884, 79891, 79899, 79907, + 79916, 79923, 79931, 79939, 79948, 79956, 79965, 79974, + 79984, 79991, 79999, 80007, 80016, 80024, 80033, 80042, + 80052, 80060, 80069, 80078, 80088, 80097, 80107, 80117, + 80128, 80134, 80141, 80148, 80156, 80163, 80171, 80179, + 80188, 80195, 80203, 80211, 80220, 80228, 80237, 80246, + 80256, 80263, 80271, 80279, 80288, 80296, 80305, 80314, + 80324, 80332, 80341, 80350, 80360, 80369, 80379, 80389, + 80400, 80407, 80415, 80423, 80432, 80440, 80449, 80458, + 80468, 80476, 80485, 80494, 80504, 80513, 80523, 80533, + 80544, 80552, 80561, 80570, 80580, 80589, 80599, 80609, + 80620, 80629, 80639, 80649, 80660, 80670, 80681, 80692, + 80704, 80710, 80717, 80724, 80732, 80739, 80747, 80755, + 80764, 80771, 80779, 80787, 80796, 80804, 80813, 80822, + 80832, 80839, 80847, 80855, 80864, 80872, 80881, 80890, + 80900, 80908, 80917, 80926, 80936, 80945, 80955, 80965, + 80976, 80983, 80991, 80999, 81008, 81016, 81025, 81034, + 81044, 81052, 81061, 81070, 81080, 81089, 81099, 81109, + 81120, 81128, 81137, 81146, 81156, 81165, 81175, 81185, + 81196, 81205, 81215, 81225, 81236, 81246, 81257, 81268, + 81280, 81287, 81295, 81303, 81312, 81320, 81329, 81338, + 81348, 81356, 81365, 81374, 81384, 81393, 81403, 81413, + 81424, 81432, 81441, 81450, 81460, 81469, 81479, 81489, + 81500, 81509, 81519, 81529, 81540, 81550, 81561, 81572, + 81584, 81592, 81601, 81610, 81620, 81629, 81639, 81649, + 81660, 81669, 81679, 81689, 81700, 81710, 81721, 81732, + 81744, 81753, 81763, 81773, 81784, 81794, 81805, 81816, + 81828, 81838, 81849, 81860, 81872, 81883, 81895, 81907, + 81920, 81922, 81925, 81928, 81932, 81935, 81939, 81943, + 81948, 81951, 81955, 81959, 81964, 81968, 81973, 81978, + 81984, 81987, 81991, 81995, 82000, 82004, 82009, 82014, + 82020, 82024, 82029, 82034, 82040, 82045, 82051, 82057, + 82064, 82067, 82071, 82075, 82080, 82084, 82089, 82094, + 82100, 82104, 82109, 82114, 82120, 82125, 82131, 82137, + 82144, 82148, 82153, 82158, 82164, 82169, 82175, 82181, + 82188, 82193, 82199, 82205, 82212, 82218, 82225, 82232, + 82240, 82243, 82247, 82251, 82256, 82260, 82265, 82270, + 82276, 82280, 82285, 82290, 82296, 82301, 82307, 82313, + 82320, 82324, 82329, 82334, 82340, 82345, 82351, 82357, + 82364, 82369, 82375, 82381, 82388, 82394, 82401, 82408, + 82416, 82420, 82425, 82430, 82436, 82441, 82447, 82453, + 82460, 82465, 82471, 82477, 82484, 82490, 82497, 82504, + 82512, 82517, 82523, 82529, 82536, 82542, 82549, 82556, + 82564, 82570, 82577, 82584, 82592, 82599, 82607, 82615, + 82624, 82627, 82631, 82635, 82640, 82644, 82649, 82654, + 82660, 82664, 82669, 82674, 82680, 82685, 82691, 82697, + 82704, 82708, 82713, 82718, 82724, 82729, 82735, 82741, + 82748, 82753, 82759, 82765, 82772, 82778, 82785, 82792, + 82800, 82804, 82809, 82814, 82820, 82825, 82831, 82837, + 82844, 82849, 82855, 82861, 82868, 82874, 82881, 82888, + 82896, 82901, 82907, 82913, 82920, 82926, 82933, 82940, + 82948, 82954, 82961, 82968, 82976, 82983, 82991, 82999, + 83008, 83012, 83017, 83022, 83028, 83033, 83039, 83045, + 83052, 83057, 83063, 83069, 83076, 83082, 83089, 83096, + 83104, 83109, 83115, 83121, 83128, 83134, 83141, 83148, + 83156, 83162, 83169, 83176, 83184, 83191, 83199, 83207, + 83216, 83221, 83227, 83233, 83240, 83246, 83253, 83260, + 83268, 83274, 83281, 83288, 83296, 83303, 83311, 83319, + 83328, 83334, 83341, 83348, 83356, 83363, 83371, 83379, + 83388, 83395, 83403, 83411, 83420, 83428, 83437, 83446, + 83456, 83459, 83463, 83467, 83472, 83476, 83481, 83486, + 83492, 83496, 83501, 83506, 83512, 83517, 83523, 83529, + 83536, 83540, 83545, 83550, 83556, 83561, 83567, 83573, + 83580, 83585, 83591, 83597, 83604, 83610, 83617, 83624, + 83632, 83636, 83641, 83646, 83652, 83657, 83663, 83669, + 83676, 83681, 83687, 83693, 83700, 83706, 83713, 83720, + 83728, 83733, 83739, 83745, 83752, 83758, 83765, 83772, + 83780, 83786, 83793, 83800, 83808, 83815, 83823, 83831, + 83840, 83844, 83849, 83854, 83860, 83865, 83871, 83877, + 83884, 83889, 83895, 83901, 83908, 83914, 83921, 83928, + 83936, 83941, 83947, 83953, 83960, 83966, 83973, 83980, + 83988, 83994, 84001, 84008, 84016, 84023, 84031, 84039, + 84048, 84053, 84059, 84065, 84072, 84078, 84085, 84092, + 84100, 84106, 84113, 84120, 84128, 84135, 84143, 84151, + 84160, 84166, 84173, 84180, 84188, 84195, 84203, 84211, + 84220, 84227, 84235, 84243, 84252, 84260, 84269, 84278, + 84288, 84292, 84297, 84302, 84308, 84313, 84319, 84325, + 84332, 84337, 84343, 84349, 84356, 84362, 84369, 84376, + 84384, 84389, 84395, 84401, 84408, 84414, 84421, 84428, + 84436, 84442, 84449, 84456, 84464, 84471, 84479, 84487, + 84496, 84501, 84507, 84513, 84520, 84526, 84533, 84540, + 84548, 84554, 84561, 84568, 84576, 84583, 84591, 84599, + 84608, 84614, 84621, 84628, 84636, 84643, 84651, 84659, + 84668, 84675, 84683, 84691, 84700, 84708, 84717, 84726, + 84736, 84741, 84747, 84753, 84760, 84766, 84773, 84780, + 84788, 84794, 84801, 84808, 84816, 84823, 84831, 84839, + 84848, 84854, 84861, 84868, 84876, 84883, 84891, 84899, + 84908, 84915, 84923, 84931, 84940, 84948, 84957, 84966, + 84976, 84982, 84989, 84996, 85004, 85011, 85019, 85027, + 85036, 85043, 85051, 85059, 85068, 85076, 85085, 85094, + 85104, 85111, 85119, 85127, 85136, 85144, 85153, 85162, + 85172, 85180, 85189, 85198, 85208, 85217, 85227, 85237, + 85248, 85251, 85255, 85259, 85264, 85268, 85273, 85278, + 85284, 85288, 85293, 85298, 85304, 85309, 85315, 85321, + 85328, 85332, 85337, 85342, 85348, 85353, 85359, 85365, + 85372, 85377, 85383, 85389, 85396, 85402, 85409, 85416, + 85424, 85428, 85433, 85438, 85444, 85449, 85455, 85461, + 85468, 85473, 85479, 85485, 85492, 85498, 85505, 85512, + 85520, 85525, 85531, 85537, 85544, 85550, 85557, 85564, + 85572, 85578, 85585, 85592, 85600, 85607, 85615, 85623, + 85632, 85636, 85641, 85646, 85652, 85657, 85663, 85669, + 85676, 85681, 85687, 85693, 85700, 85706, 85713, 85720, + 85728, 85733, 85739, 85745, 85752, 85758, 85765, 85772, + 85780, 85786, 85793, 85800, 85808, 85815, 85823, 85831, + 85840, 85845, 85851, 85857, 85864, 85870, 85877, 85884, + 85892, 85898, 85905, 85912, 85920, 85927, 85935, 85943, + 85952, 85958, 85965, 85972, 85980, 85987, 85995, 86003, + 86012, 86019, 86027, 86035, 86044, 86052, 86061, 86070, + 86080, 86084, 86089, 86094, 86100, 86105, 86111, 86117, + 86124, 86129, 86135, 86141, 86148, 86154, 86161, 86168, + 86176, 86181, 86187, 86193, 86200, 86206, 86213, 86220, + 86228, 86234, 86241, 86248, 86256, 86263, 86271, 86279, + 86288, 86293, 86299, 86305, 86312, 86318, 86325, 86332, + 86340, 86346, 86353, 86360, 86368, 86375, 86383, 86391, + 86400, 86406, 86413, 86420, 86428, 86435, 86443, 86451, + 86460, 86467, 86475, 86483, 86492, 86500, 86509, 86518, + 86528, 86533, 86539, 86545, 86552, 86558, 86565, 86572, + 86580, 86586, 86593, 86600, 86608, 86615, 86623, 86631, + 86640, 86646, 86653, 86660, 86668, 86675, 86683, 86691, + 86700, 86707, 86715, 86723, 86732, 86740, 86749, 86758, + 86768, 86774, 86781, 86788, 86796, 86803, 86811, 86819, + 86828, 86835, 86843, 86851, 86860, 86868, 86877, 86886, + 86896, 86903, 86911, 86919, 86928, 86936, 86945, 86954, + 86964, 86972, 86981, 86990, 87000, 87009, 87019, 87029, + 87040, 87044, 87049, 87054, 87060, 87065, 87071, 87077, + 87084, 87089, 87095, 87101, 87108, 87114, 87121, 87128, + 87136, 87141, 87147, 87153, 87160, 87166, 87173, 87180, + 87188, 87194, 87201, 87208, 87216, 87223, 87231, 87239, + 87248, 87253, 87259, 87265, 87272, 87278, 87285, 87292, + 87300, 87306, 87313, 87320, 87328, 87335, 87343, 87351, + 87360, 87366, 87373, 87380, 87388, 87395, 87403, 87411, + 87420, 87427, 87435, 87443, 87452, 87460, 87469, 87478, + 87488, 87493, 87499, 87505, 87512, 87518, 87525, 87532, + 87540, 87546, 87553, 87560, 87568, 87575, 87583, 87591, + 87600, 87606, 87613, 87620, 87628, 87635, 87643, 87651, + 87660, 87667, 87675, 87683, 87692, 87700, 87709, 87718, + 87728, 87734, 87741, 87748, 87756, 87763, 87771, 87779, + 87788, 87795, 87803, 87811, 87820, 87828, 87837, 87846, + 87856, 87863, 87871, 87879, 87888, 87896, 87905, 87914, + 87924, 87932, 87941, 87950, 87960, 87969, 87979, 87989, + 88000, 88005, 88011, 88017, 88024, 88030, 88037, 88044, + 88052, 88058, 88065, 88072, 88080, 88087, 88095, 88103, + 88112, 88118, 88125, 88132, 88140, 88147, 88155, 88163, + 88172, 88179, 88187, 88195, 88204, 88212, 88221, 88230, + 88240, 88246, 88253, 88260, 88268, 88275, 88283, 88291, + 88300, 88307, 88315, 88323, 88332, 88340, 88349, 88358, + 88368, 88375, 88383, 88391, 88400, 88408, 88417, 88426, + 88436, 88444, 88453, 88462, 88472, 88481, 88491, 88501, + 88512, 88518, 88525, 88532, 88540, 88547, 88555, 88563, + 88572, 88579, 88587, 88595, 88604, 88612, 88621, 88630, + 88640, 88647, 88655, 88663, 88672, 88680, 88689, 88698, + 88708, 88716, 88725, 88734, 88744, 88753, 88763, 88773, + 88784, 88791, 88799, 88807, 88816, 88824, 88833, 88842, + 88852, 88860, 88869, 88878, 88888, 88897, 88907, 88917, + 88928, 88936, 88945, 88954, 88964, 88973, 88983, 88993, + 89004, 89013, 89023, 89033, 89044, 89054, 89065, 89076, + 89088, 89091, 89095, 89099, 89104, 89108, 89113, 89118, + 89124, 89128, 89133, 89138, 89144, 89149, 89155, 89161, + 89168, 89172, 89177, 89182, 89188, 89193, 89199, 89205, + 89212, 89217, 89223, 89229, 89236, 89242, 89249, 89256, + 89264, 89268, 89273, 89278, 89284, 89289, 89295, 89301, + 89308, 89313, 89319, 89325, 89332, 89338, 89345, 89352, + 89360, 89365, 89371, 89377, 89384, 89390, 89397, 89404, + 89412, 89418, 89425, 89432, 89440, 89447, 89455, 89463, + 89472, 89476, 89481, 89486, 89492, 89497, 89503, 89509, + 89516, 89521, 89527, 89533, 89540, 89546, 89553, 89560, + 89568, 89573, 89579, 89585, 89592, 89598, 89605, 89612, + 89620, 89626, 89633, 89640, 89648, 89655, 89663, 89671, + 89680, 89685, 89691, 89697, 89704, 89710, 89717, 89724, + 89732, 89738, 89745, 89752, 89760, 89767, 89775, 89783, + 89792, 89798, 89805, 89812, 89820, 89827, 89835, 89843, + 89852, 89859, 89867, 89875, 89884, 89892, 89901, 89910, + 89920, 89924, 89929, 89934, 89940, 89945, 89951, 89957, + 89964, 89969, 89975, 89981, 89988, 89994, 90001, 90008, + 90016, 90021, 90027, 90033, 90040, 90046, 90053, 90060, + 90068, 90074, 90081, 90088, 90096, 90103, 90111, 90119, + 90128, 90133, 90139, 90145, 90152, 90158, 90165, 90172, + 90180, 90186, 90193, 90200, 90208, 90215, 90223, 90231, + 90240, 90246, 90253, 90260, 90268, 90275, 90283, 90291, + 90300, 90307, 90315, 90323, 90332, 90340, 90349, 90358, + 90368, 90373, 90379, 90385, 90392, 90398, 90405, 90412, + 90420, 90426, 90433, 90440, 90448, 90455, 90463, 90471, + 90480, 90486, 90493, 90500, 90508, 90515, 90523, 90531, + 90540, 90547, 90555, 90563, 90572, 90580, 90589, 90598, + 90608, 90614, 90621, 90628, 90636, 90643, 90651, 90659, + 90668, 90675, 90683, 90691, 90700, 90708, 90717, 90726, + 90736, 90743, 90751, 90759, 90768, 90776, 90785, 90794, + 90804, 90812, 90821, 90830, 90840, 90849, 90859, 90869, + 90880, 90884, 90889, 90894, 90900, 90905, 90911, 90917, + 90924, 90929, 90935, 90941, 90948, 90954, 90961, 90968, + 90976, 90981, 90987, 90993, 91000, 91006, 91013, 91020, + 91028, 91034, 91041, 91048, 91056, 91063, 91071, 91079, + 91088, 91093, 91099, 91105, 91112, 91118, 91125, 91132, + 91140, 91146, 91153, 91160, 91168, 91175, 91183, 91191, + 91200, 91206, 91213, 91220, 91228, 91235, 91243, 91251, + 91260, 91267, 91275, 91283, 91292, 91300, 91309, 91318, + 91328, 91333, 91339, 91345, 91352, 91358, 91365, 91372, + 91380, 91386, 91393, 91400, 91408, 91415, 91423, 91431, + 91440, 91446, 91453, 91460, 91468, 91475, 91483, 91491, + 91500, 91507, 91515, 91523, 91532, 91540, 91549, 91558, + 91568, 91574, 91581, 91588, 91596, 91603, 91611, 91619, + 91628, 91635, 91643, 91651, 91660, 91668, 91677, 91686, + 91696, 91703, 91711, 91719, 91728, 91736, 91745, 91754, + 91764, 91772, 91781, 91790, 91800, 91809, 91819, 91829, + 91840, 91845, 91851, 91857, 91864, 91870, 91877, 91884, + 91892, 91898, 91905, 91912, 91920, 91927, 91935, 91943, + 91952, 91958, 91965, 91972, 91980, 91987, 91995, 92003, + 92012, 92019, 92027, 92035, 92044, 92052, 92061, 92070, + 92080, 92086, 92093, 92100, 92108, 92115, 92123, 92131, + 92140, 92147, 92155, 92163, 92172, 92180, 92189, 92198, + 92208, 92215, 92223, 92231, 92240, 92248, 92257, 92266, + 92276, 92284, 92293, 92302, 92312, 92321, 92331, 92341, + 92352, 92358, 92365, 92372, 92380, 92387, 92395, 92403, + 92412, 92419, 92427, 92435, 92444, 92452, 92461, 92470, + 92480, 92487, 92495, 92503, 92512, 92520, 92529, 92538, + 92548, 92556, 92565, 92574, 92584, 92593, 92603, 92613, + 92624, 92631, 92639, 92647, 92656, 92664, 92673, 92682, + 92692, 92700, 92709, 92718, 92728, 92737, 92747, 92757, + 92768, 92776, 92785, 92794, 92804, 92813, 92823, 92833, + 92844, 92853, 92863, 92873, 92884, 92894, 92905, 92916, + 92928, 92932, 92937, 92942, 92948, 92953, 92959, 92965, + 92972, 92977, 92983, 92989, 92996, 93002, 93009, 93016, + 93024, 93029, 93035, 93041, 93048, 93054, 93061, 93068, + 93076, 93082, 93089, 93096, 93104, 93111, 93119, 93127, + 93136, 93141, 93147, 93153, 93160, 93166, 93173, 93180, + 93188, 93194, 93201, 93208, 93216, 93223, 93231, 93239, + 93248, 93254, 93261, 93268, 93276, 93283, 93291, 93299, + 93308, 93315, 93323, 93331, 93340, 93348, 93357, 93366, + 93376, 93381, 93387, 93393, 93400, 93406, 93413, 93420, + 93428, 93434, 93441, 93448, 93456, 93463, 93471, 93479, + 93488, 93494, 93501, 93508, 93516, 93523, 93531, 93539, + 93548, 93555, 93563, 93571, 93580, 93588, 93597, 93606, + 93616, 93622, 93629, 93636, 93644, 93651, 93659, 93667, + 93676, 93683, 93691, 93699, 93708, 93716, 93725, 93734, + 93744, 93751, 93759, 93767, 93776, 93784, 93793, 93802, + 93812, 93820, 93829, 93838, 93848, 93857, 93867, 93877, + 93888, 93893, 93899, 93905, 93912, 93918, 93925, 93932, + 93940, 93946, 93953, 93960, 93968, 93975, 93983, 93991, + 94000, 94006, 94013, 94020, 94028, 94035, 94043, 94051, + 94060, 94067, 94075, 94083, 94092, 94100, 94109, 94118, + 94128, 94134, 94141, 94148, 94156, 94163, 94171, 94179, + 94188, 94195, 94203, 94211, 94220, 94228, 94237, 94246, + 94256, 94263, 94271, 94279, 94288, 94296, 94305, 94314, + 94324, 94332, 94341, 94350, 94360, 94369, 94379, 94389, + 94400, 94406, 94413, 94420, 94428, 94435, 94443, 94451, + 94460, 94467, 94475, 94483, 94492, 94500, 94509, 94518, + 94528, 94535, 94543, 94551, 94560, 94568, 94577, 94586, + 94596, 94604, 94613, 94622, 94632, 94641, 94651, 94661, + 94672, 94679, 94687, 94695, 94704, 94712, 94721, 94730, + 94740, 94748, 94757, 94766, 94776, 94785, 94795, 94805, + 94816, 94824, 94833, 94842, 94852, 94861, 94871, 94881, + 94892, 94901, 94911, 94921, 94932, 94942, 94953, 94964, + 94976, 94981, 94987, 94993, 95000, 95006, 95013, 95020, + 95028, 95034, 95041, 95048, 95056, 95063, 95071, 95079, + 95088, 95094, 95101, 95108, 95116, 95123, 95131, 95139, + 95148, 95155, 95163, 95171, 95180, 95188, 95197, 95206, + 95216, 95222, 95229, 95236, 95244, 95251, 95259, 95267, + 95276, 95283, 95291, 95299, 95308, 95316, 95325, 95334, + 95344, 95351, 95359, 95367, 95376, 95384, 95393, 95402, + 95412, 95420, 95429, 95438, 95448, 95457, 95467, 95477, + 95488, 95494, 95501, 95508, 95516, 95523, 95531, 95539, + 95548, 95555, 95563, 95571, 95580, 95588, 95597, 95606, + 95616, 95623, 95631, 95639, 95648, 95656, 95665, 95674, + 95684, 95692, 95701, 95710, 95720, 95729, 95739, 95749, + 95760, 95767, 95775, 95783, 95792, 95800, 95809, 95818, + 95828, 95836, 95845, 95854, 95864, 95873, 95883, 95893, + 95904, 95912, 95921, 95930, 95940, 95949, 95959, 95969, + 95980, 95989, 95999, 96009, 96020, 96030, 96041, 96052, + 96064, 96070, 96077, 96084, 96092, 96099, 96107, 96115, + 96124, 96131, 96139, 96147, 96156, 96164, 96173, 96182, + 96192, 96199, 96207, 96215, 96224, 96232, 96241, 96250, + 96260, 96268, 96277, 96286, 96296, 96305, 96315, 96325, + 96336, 96343, 96351, 96359, 96368, 96376, 96385, 96394, + 96404, 96412, 96421, 96430, 96440, 96449, 96459, 96469, + 96480, 96488, 96497, 96506, 96516, 96525, 96535, 96545, + 96556, 96565, 96575, 96585, 96596, 96606, 96617, 96628, + 96640, 96647, 96655, 96663, 96672, 96680, 96689, 96698, + 96708, 96716, 96725, 96734, 96744, 96753, 96763, 96773, + 96784, 96792, 96801, 96810, 96820, 96829, 96839, 96849, + 96860, 96869, 96879, 96889, 96900, 96910, 96921, 96932, + 96944, 96952, 96961, 96970, 96980, 96989, 96999, 97009, + 97020, 97029, 97039, 97049, 97060, 97070, 97081, 97092, + 97104, 97113, 97123, 97133, 97144, 97154, 97165, 97176, + 97188, 97198, 97209, 97220, 97232, 97243, 97255, 97267, + 97280, 97283, 97287, 97291, 97296, 97300, 97305, 97310, + 97316, 97320, 97325, 97330, 97336, 97341, 97347, 97353, + 97360, 97364, 97369, 97374, 97380, 97385, 97391, 97397, + 97404, 97409, 97415, 97421, 97428, 97434, 97441, 97448, + 97456, 97460, 97465, 97470, 97476, 97481, 97487, 97493, + 97500, 97505, 97511, 97517, 97524, 97530, 97537, 97544, + 97552, 97557, 97563, 97569, 97576, 97582, 97589, 97596, + 97604, 97610, 97617, 97624, 97632, 97639, 97647, 97655, + 97664, 97668, 97673, 97678, 97684, 97689, 97695, 97701, + 97708, 97713, 97719, 97725, 97732, 97738, 97745, 97752, + 97760, 97765, 97771, 97777, 97784, 97790, 97797, 97804, + 97812, 97818, 97825, 97832, 97840, 97847, 97855, 97863, + 97872, 97877, 97883, 97889, 97896, 97902, 97909, 97916, + 97924, 97930, 97937, 97944, 97952, 97959, 97967, 97975, + 97984, 97990, 97997, 98004, 98012, 98019, 98027, 98035, + 98044, 98051, 98059, 98067, 98076, 98084, 98093, 98102, + 98112, 98116, 98121, 98126, 98132, 98137, 98143, 98149, + 98156, 98161, 98167, 98173, 98180, 98186, 98193, 98200, + 98208, 98213, 98219, 98225, 98232, 98238, 98245, 98252, + 98260, 98266, 98273, 98280, 98288, 98295, 98303, 98311, + 98320, 98325, 98331, 98337, 98344, 98350, 98357, 98364, + 98372, 98378, 98385, 98392, 98400, 98407, 98415, 98423, + 98432, 98438, 98445, 98452, 98460, 98467, 98475, 98483, + 98492, 98499, 98507, 98515, 98524, 98532, 98541, 98550, + 98560, 98565, 98571, 98577, 98584, 98590, 98597, 98604, + 98612, 98618, 98625, 98632, 98640, 98647, 98655, 98663, + 98672, 98678, 98685, 98692, 98700, 98707, 98715, 98723, + 98732, 98739, 98747, 98755, 98764, 98772, 98781, 98790, + 98800, 98806, 98813, 98820, 98828, 98835, 98843, 98851, + 98860, 98867, 98875, 98883, 98892, 98900, 98909, 98918, + 98928, 98935, 98943, 98951, 98960, 98968, 98977, 98986, + 98996, 99004, 99013, 99022, 99032, 99041, 99051, 99061, + 99072, 99076, 99081, 99086, 99092, 99097, 99103, 99109, + 99116, 99121, 99127, 99133, 99140, 99146, 99153, 99160, + 99168, 99173, 99179, 99185, 99192, 99198, 99205, 99212, + 99220, 99226, 99233, 99240, 99248, 99255, 99263, 99271, + 99280, 99285, 99291, 99297, 99304, 99310, 99317, 99324, + 99332, 99338, 99345, 99352, 99360, 99367, 99375, 99383, + 99392, 99398, 99405, 99412, 99420, 99427, 99435, 99443, + 99452, 99459, 99467, 99475, 99484, 99492, 99501, 99510, + 99520, 99525, 99531, 99537, 99544, 99550, 99557, 99564, + 99572, 99578, 99585, 99592, 99600, 99607, 99615, 99623, + 99632, 99638, 99645, 99652, 99660, 99667, 99675, 99683, + 99692, 99699, 99707, 99715, 99724, 99732, 99741, 99750, + 99760, 99766, 99773, 99780, 99788, 99795, 99803, 99811, + 99820, 99827, 99835, 99843, 99852, 99860, 99869, 99878, + 99888, 99895, 99903, 99911, 99920, 99928, 99937, 99946, + 99956, 99964, 99973, 99982, 99992, 100001, 100011, 100021, + 100032, 100037, 100043, 100049, 100056, 100062, 100069, 100076, + 100084, 100090, 100097, 100104, 100112, 100119, 100127, 100135, + 100144, 100150, 100157, 100164, 100172, 100179, 100187, 100195, + 100204, 100211, 100219, 100227, 100236, 100244, 100253, 100262, + 100272, 100278, 100285, 100292, 100300, 100307, 100315, 100323, + 100332, 100339, 100347, 100355, 100364, 100372, 100381, 100390, + 100400, 100407, 100415, 100423, 100432, 100440, 100449, 100458, + 100468, 100476, 100485, 100494, 100504, 100513, 100523, 100533, + 100544, 100550, 100557, 100564, 100572, 100579, 100587, 100595, + 100604, 100611, 100619, 100627, 100636, 100644, 100653, 100662, + 100672, 100679, 100687, 100695, 100704, 100712, 100721, 100730, + 100740, 100748, 100757, 100766, 100776, 100785, 100795, 100805, + 100816, 100823, 100831, 100839, 100848, 100856, 100865, 100874, + 100884, 100892, 100901, 100910, 100920, 100929, 100939, 100949, + 100960, 100968, 100977, 100986, 100996, 101005, 101015, 101025, + 101036, 101045, 101055, 101065, 101076, 101086, 101097, 101108, + 101120, 101124, 101129, 101134, 101140, 101145, 101151, 101157, + 101164, 101169, 101175, 101181, 101188, 101194, 101201, 101208, + 101216, 101221, 101227, 101233, 101240, 101246, 101253, 101260, + 101268, 101274, 101281, 101288, 101296, 101303, 101311, 101319, + 101328, 101333, 101339, 101345, 101352, 101358, 101365, 101372, + 101380, 101386, 101393, 101400, 101408, 101415, 101423, 101431, + 101440, 101446, 101453, 101460, 101468, 101475, 101483, 101491, + 101500, 101507, 101515, 101523, 101532, 101540, 101549, 101558, + 101568, 101573, 101579, 101585, 101592, 101598, 101605, 101612, + 101620, 101626, 101633, 101640, 101648, 101655, 101663, 101671, + 101680, 101686, 101693, 101700, 101708, 101715, 101723, 101731, + 101740, 101747, 101755, 101763, 101772, 101780, 101789, 101798, + 101808, 101814, 101821, 101828, 101836, 101843, 101851, 101859, + 101868, 101875, 101883, 101891, 101900, 101908, 101917, 101926, + 101936, 101943, 101951, 101959, 101968, 101976, 101985, 101994, + 102004, 102012, 102021, 102030, 102040, 102049, 102059, 102069, + 102080, 102085, 102091, 102097, 102104, 102110, 102117, 102124, + 102132, 102138, 102145, 102152, 102160, 102167, 102175, 102183, + 102192, 102198, 102205, 102212, 102220, 102227, 102235, 102243, + 102252, 102259, 102267, 102275, 102284, 102292, 102301, 102310, + 102320, 102326, 102333, 102340, 102348, 102355, 102363, 102371, + 102380, 102387, 102395, 102403, 102412, 102420, 102429, 102438, + 102448, 102455, 102463, 102471, 102480, 102488, 102497, 102506, + 102516, 102524, 102533, 102542, 102552, 102561, 102571, 102581, + 102592, 102598, 102605, 102612, 102620, 102627, 102635, 102643, + 102652, 102659, 102667, 102675, 102684, 102692, 102701, 102710, + 102720, 102727, 102735, 102743, 102752, 102760, 102769, 102778, + 102788, 102796, 102805, 102814, 102824, 102833, 102843, 102853, + 102864, 102871, 102879, 102887, 102896, 102904, 102913, 102922, + 102932, 102940, 102949, 102958, 102968, 102977, 102987, 102997, + 103008, 103016, 103025, 103034, 103044, 103053, 103063, 103073, + 103084, 103093, 103103, 103113, 103124, 103134, 103145, 103156, + 103168, 103173, 103179, 103185, 103192, 103198, 103205, 103212, + 103220, 103226, 103233, 103240, 103248, 103255, 103263, 103271, + 103280, 103286, 103293, 103300, 103308, 103315, 103323, 103331, + 103340, 103347, 103355, 103363, 103372, 103380, 103389, 103398, + 103408, 103414, 103421, 103428, 103436, 103443, 103451, 103459, + 103468, 103475, 103483, 103491, 103500, 103508, 103517, 103526, + 103536, 103543, 103551, 103559, 103568, 103576, 103585, 103594, + 103604, 103612, 103621, 103630, 103640, 103649, 103659, 103669, + 103680, 103686, 103693, 103700, 103708, 103715, 103723, 103731, + 103740, 103747, 103755, 103763, 103772, 103780, 103789, 103798, + 103808, 103815, 103823, 103831, 103840, 103848, 103857, 103866, + 103876, 103884, 103893, 103902, 103912, 103921, 103931, 103941, + 103952, 103959, 103967, 103975, 103984, 103992, 104001, 104010, + 104020, 104028, 104037, 104046, 104056, 104065, 104075, 104085, + 104096, 104104, 104113, 104122, 104132, 104141, 104151, 104161, + 104172, 104181, 104191, 104201, 104212, 104222, 104233, 104244, + 104256, 104262, 104269, 104276, 104284, 104291, 104299, 104307, + 104316, 104323, 104331, 104339, 104348, 104356, 104365, 104374, + 104384, 104391, 104399, 104407, 104416, 104424, 104433, 104442, + 104452, 104460, 104469, 104478, 104488, 104497, 104507, 104517, + 104528, 104535, 104543, 104551, 104560, 104568, 104577, 104586, + 104596, 104604, 104613, 104622, 104632, 104641, 104651, 104661, + 104672, 104680, 104689, 104698, 104708, 104717, 104727, 104737, + 104748, 104757, 104767, 104777, 104788, 104798, 104809, 104820, + 104832, 104839, 104847, 104855, 104864, 104872, 104881, 104890, + 104900, 104908, 104917, 104926, 104936, 104945, 104955, 104965, + 104976, 104984, 104993, 105002, 105012, 105021, 105031, 105041, + 105052, 105061, 105071, 105081, 105092, 105102, 105113, 105124, + 105136, 105144, 105153, 105162, 105172, 105181, 105191, 105201, + 105212, 105221, 105231, 105241, 105252, 105262, 105273, 105284, + 105296, 105305, 105315, 105325, 105336, 105346, 105357, 105368, + 105380, 105390, 105401, 105412, 105424, 105435, 105447, 105459, + 105472, 105476, 105481, 105486, 105492, 105497, 105503, 105509, + 105516, 105521, 105527, 105533, 105540, 105546, 105553, 105560, + 105568, 105573, 105579, 105585, 105592, 105598, 105605, 105612, + 105620, 105626, 105633, 105640, 105648, 105655, 105663, 105671, + 105680, 105685, 105691, 105697, 105704, 105710, 105717, 105724, + 105732, 105738, 105745, 105752, 105760, 105767, 105775, 105783, + 105792, 105798, 105805, 105812, 105820, 105827, 105835, 105843, + 105852, 105859, 105867, 105875, 105884, 105892, 105901, 105910, + 105920, 105925, 105931, 105937, 105944, 105950, 105957, 105964, + 105972, 105978, 105985, 105992, 106000, 106007, 106015, 106023, + 106032, 106038, 106045, 106052, 106060, 106067, 106075, 106083, + 106092, 106099, 106107, 106115, 106124, 106132, 106141, 106150, + 106160, 106166, 106173, 106180, 106188, 106195, 106203, 106211, + 106220, 106227, 106235, 106243, 106252, 106260, 106269, 106278, + 106288, 106295, 106303, 106311, 106320, 106328, 106337, 106346, + 106356, 106364, 106373, 106382, 106392, 106401, 106411, 106421, + 106432, 106437, 106443, 106449, 106456, 106462, 106469, 106476, + 106484, 106490, 106497, 106504, 106512, 106519, 106527, 106535, + 106544, 106550, 106557, 106564, 106572, 106579, 106587, 106595, + 106604, 106611, 106619, 106627, 106636, 106644, 106653, 106662, + 106672, 106678, 106685, 106692, 106700, 106707, 106715, 106723, + 106732, 106739, 106747, 106755, 106764, 106772, 106781, 106790, + 106800, 106807, 106815, 106823, 106832, 106840, 106849, 106858, + 106868, 106876, 106885, 106894, 106904, 106913, 106923, 106933, + 106944, 106950, 106957, 106964, 106972, 106979, 106987, 106995, + 107004, 107011, 107019, 107027, 107036, 107044, 107053, 107062, + 107072, 107079, 107087, 107095, 107104, 107112, 107121, 107130, + 107140, 107148, 107157, 107166, 107176, 107185, 107195, 107205, + 107216, 107223, 107231, 107239, 107248, 107256, 107265, 107274, + 107284, 107292, 107301, 107310, 107320, 107329, 107339, 107349, + 107360, 107368, 107377, 107386, 107396, 107405, 107415, 107425, + 107436, 107445, 107455, 107465, 107476, 107486, 107497, 107508, + 107520, 107525, 107531, 107537, 107544, 107550, 107557, 107564, + 107572, 107578, 107585, 107592, 107600, 107607, 107615, 107623, + 107632, 107638, 107645, 107652, 107660, 107667, 107675, 107683, + 107692, 107699, 107707, 107715, 107724, 107732, 107741, 107750, + 107760, 107766, 107773, 107780, 107788, 107795, 107803, 107811, + 107820, 107827, 107835, 107843, 107852, 107860, 107869, 107878, + 107888, 107895, 107903, 107911, 107920, 107928, 107937, 107946, + 107956, 107964, 107973, 107982, 107992, 108001, 108011, 108021, + 108032, 108038, 108045, 108052, 108060, 108067, 108075, 108083, + 108092, 108099, 108107, 108115, 108124, 108132, 108141, 108150, + 108160, 108167, 108175, 108183, 108192, 108200, 108209, 108218, + 108228, 108236, 108245, 108254, 108264, 108273, 108283, 108293, + 108304, 108311, 108319, 108327, 108336, 108344, 108353, 108362, + 108372, 108380, 108389, 108398, 108408, 108417, 108427, 108437, + 108448, 108456, 108465, 108474, 108484, 108493, 108503, 108513, + 108524, 108533, 108543, 108553, 108564, 108574, 108585, 108596, + 108608, 108614, 108621, 108628, 108636, 108643, 108651, 108659, + 108668, 108675, 108683, 108691, 108700, 108708, 108717, 108726, + 108736, 108743, 108751, 108759, 108768, 108776, 108785, 108794, + 108804, 108812, 108821, 108830, 108840, 108849, 108859, 108869, + 108880, 108887, 108895, 108903, 108912, 108920, 108929, 108938, + 108948, 108956, 108965, 108974, 108984, 108993, 109003, 109013, + 109024, 109032, 109041, 109050, 109060, 109069, 109079, 109089, + 109100, 109109, 109119, 109129, 109140, 109150, 109161, 109172, + 109184, 109191, 109199, 109207, 109216, 109224, 109233, 109242, + 109252, 109260, 109269, 109278, 109288, 109297, 109307, 109317, + 109328, 109336, 109345, 109354, 109364, 109373, 109383, 109393, + 109404, 109413, 109423, 109433, 109444, 109454, 109465, 109476, + 109488, 109496, 109505, 109514, 109524, 109533, 109543, 109553, + 109564, 109573, 109583, 109593, 109604, 109614, 109625, 109636, + 109648, 109657, 109667, 109677, 109688, 109698, 109709, 109720, + 109732, 109742, 109753, 109764, 109776, 109787, 109799, 109811, + 109824, 109829, 109835, 109841, 109848, 109854, 109861, 109868, + 109876, 109882, 109889, 109896, 109904, 109911, 109919, 109927, + 109936, 109942, 109949, 109956, 109964, 109971, 109979, 109987, + 109996, 110003, 110011, 110019, 110028, 110036, 110045, 110054, + 110064, 110070, 110077, 110084, 110092, 110099, 110107, 110115, + 110124, 110131, 110139, 110147, 110156, 110164, 110173, 110182, + 110192, 110199, 110207, 110215, 110224, 110232, 110241, 110250, + 110260, 110268, 110277, 110286, 110296, 110305, 110315, 110325, + 110336, 110342, 110349, 110356, 110364, 110371, 110379, 110387, + 110396, 110403, 110411, 110419, 110428, 110436, 110445, 110454, + 110464, 110471, 110479, 110487, 110496, 110504, 110513, 110522, + 110532, 110540, 110549, 110558, 110568, 110577, 110587, 110597, + 110608, 110615, 110623, 110631, 110640, 110648, 110657, 110666, + 110676, 110684, 110693, 110702, 110712, 110721, 110731, 110741, + 110752, 110760, 110769, 110778, 110788, 110797, 110807, 110817, + 110828, 110837, 110847, 110857, 110868, 110878, 110889, 110900, + 110912, 110918, 110925, 110932, 110940, 110947, 110955, 110963, + 110972, 110979, 110987, 110995, 111004, 111012, 111021, 111030, + 111040, 111047, 111055, 111063, 111072, 111080, 111089, 111098, + 111108, 111116, 111125, 111134, 111144, 111153, 111163, 111173, + 111184, 111191, 111199, 111207, 111216, 111224, 111233, 111242, + 111252, 111260, 111269, 111278, 111288, 111297, 111307, 111317, + 111328, 111336, 111345, 111354, 111364, 111373, 111383, 111393, + 111404, 111413, 111423, 111433, 111444, 111454, 111465, 111476, + 111488, 111495, 111503, 111511, 111520, 111528, 111537, 111546, + 111556, 111564, 111573, 111582, 111592, 111601, 111611, 111621, + 111632, 111640, 111649, 111658, 111668, 111677, 111687, 111697, + 111708, 111717, 111727, 111737, 111748, 111758, 111769, 111780, + 111792, 111800, 111809, 111818, 111828, 111837, 111847, 111857, + 111868, 111877, 111887, 111897, 111908, 111918, 111929, 111940, + 111952, 111961, 111971, 111981, 111992, 112002, 112013, 112024, + 112036, 112046, 112057, 112068, 112080, 112091, 112103, 112115, + 112128, 112134, 112141, 112148, 112156, 112163, 112171, 112179, + 112188, 112195, 112203, 112211, 112220, 112228, 112237, 112246, + 112256, 112263, 112271, 112279, 112288, 112296, 112305, 112314, + 112324, 112332, 112341, 112350, 112360, 112369, 112379, 112389, + 112400, 112407, 112415, 112423, 112432, 112440, 112449, 112458, + 112468, 112476, 112485, 112494, 112504, 112513, 112523, 112533, + 112544, 112552, 112561, 112570, 112580, 112589, 112599, 112609, + 112620, 112629, 112639, 112649, 112660, 112670, 112681, 112692, + 112704, 112711, 112719, 112727, 112736, 112744, 112753, 112762, + 112772, 112780, 112789, 112798, 112808, 112817, 112827, 112837, + 112848, 112856, 112865, 112874, 112884, 112893, 112903, 112913, + 112924, 112933, 112943, 112953, 112964, 112974, 112985, 112996, + 113008, 113016, 113025, 113034, 113044, 113053, 113063, 113073, + 113084, 113093, 113103, 113113, 113124, 113134, 113145, 113156, + 113168, 113177, 113187, 113197, 113208, 113218, 113229, 113240, + 113252, 113262, 113273, 113284, 113296, 113307, 113319, 113331, + 113344, 113351, 113359, 113367, 113376, 113384, 113393, 113402, + 113412, 113420, 113429, 113438, 113448, 113457, 113467, 113477, + 113488, 113496, 113505, 113514, 113524, 113533, 113543, 113553, + 113564, 113573, 113583, 113593, 113604, 113614, 113625, 113636, + 113648, 113656, 113665, 113674, 113684, 113693, 113703, 113713, + 113724, 113733, 113743, 113753, 113764, 113774, 113785, 113796, + 113808, 113817, 113827, 113837, 113848, 113858, 113869, 113880, + 113892, 113902, 113913, 113924, 113936, 113947, 113959, 113971, + 113984, 113992, 114001, 114010, 114020, 114029, 114039, 114049, + 114060, 114069, 114079, 114089, 114100, 114110, 114121, 114132, + 114144, 114153, 114163, 114173, 114184, 114194, 114205, 114216, + 114228, 114238, 114249, 114260, 114272, 114283, 114295, 114307, + 114320, 114329, 114339, 114349, 114360, 114370, 114381, 114392, + 114404, 114414, 114425, 114436, 114448, 114459, 114471, 114483, + 114496, 114506, 114517, 114528, 114540, 114551, 114563, 114575, + 114588, 114599, 114611, 114623, 114636, 114648, 114661, 114674, + 114688, 114689, 114691, 114693, 114696, 114698, 114701, 114704, + 114708, 114710, 114713, 114716, 114720, 114723, 114727, 114731, + 114736, 114738, 114741, 114744, 114748, 114751, 114755, 114759, + 114764, 114767, 114771, 114775, 114780, 114784, 114789, 114794, + 114800, 114802, 114805, 114808, 114812, 114815, 114819, 114823, + 114828, 114831, 114835, 114839, 114844, 114848, 114853, 114858, + 114864, 114867, 114871, 114875, 114880, 114884, 114889, 114894, + 114900, 114904, 114909, 114914, 114920, 114925, 114931, 114937, + 114944, 114946, 114949, 114952, 114956, 114959, 114963, 114967, + 114972, 114975, 114979, 114983, 114988, 114992, 114997, 115002, + 115008, 115011, 115015, 115019, 115024, 115028, 115033, 115038, + 115044, 115048, 115053, 115058, 115064, 115069, 115075, 115081, + 115088, 115091, 115095, 115099, 115104, 115108, 115113, 115118, + 115124, 115128, 115133, 115138, 115144, 115149, 115155, 115161, + 115168, 115172, 115177, 115182, 115188, 115193, 115199, 115205, + 115212, 115217, 115223, 115229, 115236, 115242, 115249, 115256, + 115264, 115266, 115269, 115272, 115276, 115279, 115283, 115287, + 115292, 115295, 115299, 115303, 115308, 115312, 115317, 115322, + 115328, 115331, 115335, 115339, 115344, 115348, 115353, 115358, + 115364, 115368, 115373, 115378, 115384, 115389, 115395, 115401, + 115408, 115411, 115415, 115419, 115424, 115428, 115433, 115438, + 115444, 115448, 115453, 115458, 115464, 115469, 115475, 115481, + 115488, 115492, 115497, 115502, 115508, 115513, 115519, 115525, + 115532, 115537, 115543, 115549, 115556, 115562, 115569, 115576, + 115584, 115587, 115591, 115595, 115600, 115604, 115609, 115614, + 115620, 115624, 115629, 115634, 115640, 115645, 115651, 115657, + 115664, 115668, 115673, 115678, 115684, 115689, 115695, 115701, + 115708, 115713, 115719, 115725, 115732, 115738, 115745, 115752, + 115760, 115764, 115769, 115774, 115780, 115785, 115791, 115797, + 115804, 115809, 115815, 115821, 115828, 115834, 115841, 115848, + 115856, 115861, 115867, 115873, 115880, 115886, 115893, 115900, + 115908, 115914, 115921, 115928, 115936, 115943, 115951, 115959, + 115968, 115970, 115973, 115976, 115980, 115983, 115987, 115991, + 115996, 115999, 116003, 116007, 116012, 116016, 116021, 116026, + 116032, 116035, 116039, 116043, 116048, 116052, 116057, 116062, + 116068, 116072, 116077, 116082, 116088, 116093, 116099, 116105, + 116112, 116115, 116119, 116123, 116128, 116132, 116137, 116142, + 116148, 116152, 116157, 116162, 116168, 116173, 116179, 116185, + 116192, 116196, 116201, 116206, 116212, 116217, 116223, 116229, + 116236, 116241, 116247, 116253, 116260, 116266, 116273, 116280, + 116288, 116291, 116295, 116299, 116304, 116308, 116313, 116318, + 116324, 116328, 116333, 116338, 116344, 116349, 116355, 116361, + 116368, 116372, 116377, 116382, 116388, 116393, 116399, 116405, + 116412, 116417, 116423, 116429, 116436, 116442, 116449, 116456, + 116464, 116468, 116473, 116478, 116484, 116489, 116495, 116501, + 116508, 116513, 116519, 116525, 116532, 116538, 116545, 116552, + 116560, 116565, 116571, 116577, 116584, 116590, 116597, 116604, + 116612, 116618, 116625, 116632, 116640, 116647, 116655, 116663, + 116672, 116675, 116679, 116683, 116688, 116692, 116697, 116702, + 116708, 116712, 116717, 116722, 116728, 116733, 116739, 116745, + 116752, 116756, 116761, 116766, 116772, 116777, 116783, 116789, + 116796, 116801, 116807, 116813, 116820, 116826, 116833, 116840, + 116848, 116852, 116857, 116862, 116868, 116873, 116879, 116885, + 116892, 116897, 116903, 116909, 116916, 116922, 116929, 116936, + 116944, 116949, 116955, 116961, 116968, 116974, 116981, 116988, + 116996, 117002, 117009, 117016, 117024, 117031, 117039, 117047, + 117056, 117060, 117065, 117070, 117076, 117081, 117087, 117093, + 117100, 117105, 117111, 117117, 117124, 117130, 117137, 117144, + 117152, 117157, 117163, 117169, 117176, 117182, 117189, 117196, + 117204, 117210, 117217, 117224, 117232, 117239, 117247, 117255, + 117264, 117269, 117275, 117281, 117288, 117294, 117301, 117308, + 117316, 117322, 117329, 117336, 117344, 117351, 117359, 117367, + 117376, 117382, 117389, 117396, 117404, 117411, 117419, 117427, + 117436, 117443, 117451, 117459, 117468, 117476, 117485, 117494, + 117504, 117506, 117509, 117512, 117516, 117519, 117523, 117527, + 117532, 117535, 117539, 117543, 117548, 117552, 117557, 117562, + 117568, 117571, 117575, 117579, 117584, 117588, 117593, 117598, + 117604, 117608, 117613, 117618, 117624, 117629, 117635, 117641, + 117648, 117651, 117655, 117659, 117664, 117668, 117673, 117678, + 117684, 117688, 117693, 117698, 117704, 117709, 117715, 117721, + 117728, 117732, 117737, 117742, 117748, 117753, 117759, 117765, + 117772, 117777, 117783, 117789, 117796, 117802, 117809, 117816, + 117824, 117827, 117831, 117835, 117840, 117844, 117849, 117854, + 117860, 117864, 117869, 117874, 117880, 117885, 117891, 117897, + 117904, 117908, 117913, 117918, 117924, 117929, 117935, 117941, + 117948, 117953, 117959, 117965, 117972, 117978, 117985, 117992, + 118000, 118004, 118009, 118014, 118020, 118025, 118031, 118037, + 118044, 118049, 118055, 118061, 118068, 118074, 118081, 118088, + 118096, 118101, 118107, 118113, 118120, 118126, 118133, 118140, + 118148, 118154, 118161, 118168, 118176, 118183, 118191, 118199, + 118208, 118211, 118215, 118219, 118224, 118228, 118233, 118238, + 118244, 118248, 118253, 118258, 118264, 118269, 118275, 118281, + 118288, 118292, 118297, 118302, 118308, 118313, 118319, 118325, + 118332, 118337, 118343, 118349, 118356, 118362, 118369, 118376, + 118384, 118388, 118393, 118398, 118404, 118409, 118415, 118421, + 118428, 118433, 118439, 118445, 118452, 118458, 118465, 118472, + 118480, 118485, 118491, 118497, 118504, 118510, 118517, 118524, + 118532, 118538, 118545, 118552, 118560, 118567, 118575, 118583, + 118592, 118596, 118601, 118606, 118612, 118617, 118623, 118629, + 118636, 118641, 118647, 118653, 118660, 118666, 118673, 118680, + 118688, 118693, 118699, 118705, 118712, 118718, 118725, 118732, + 118740, 118746, 118753, 118760, 118768, 118775, 118783, 118791, + 118800, 118805, 118811, 118817, 118824, 118830, 118837, 118844, + 118852, 118858, 118865, 118872, 118880, 118887, 118895, 118903, + 118912, 118918, 118925, 118932, 118940, 118947, 118955, 118963, + 118972, 118979, 118987, 118995, 119004, 119012, 119021, 119030, + 119040, 119043, 119047, 119051, 119056, 119060, 119065, 119070, + 119076, 119080, 119085, 119090, 119096, 119101, 119107, 119113, + 119120, 119124, 119129, 119134, 119140, 119145, 119151, 119157, + 119164, 119169, 119175, 119181, 119188, 119194, 119201, 119208, + 119216, 119220, 119225, 119230, 119236, 119241, 119247, 119253, + 119260, 119265, 119271, 119277, 119284, 119290, 119297, 119304, + 119312, 119317, 119323, 119329, 119336, 119342, 119349, 119356, + 119364, 119370, 119377, 119384, 119392, 119399, 119407, 119415, + 119424, 119428, 119433, 119438, 119444, 119449, 119455, 119461, + 119468, 119473, 119479, 119485, 119492, 119498, 119505, 119512, + 119520, 119525, 119531, 119537, 119544, 119550, 119557, 119564, + 119572, 119578, 119585, 119592, 119600, 119607, 119615, 119623, + 119632, 119637, 119643, 119649, 119656, 119662, 119669, 119676, + 119684, 119690, 119697, 119704, 119712, 119719, 119727, 119735, + 119744, 119750, 119757, 119764, 119772, 119779, 119787, 119795, + 119804, 119811, 119819, 119827, 119836, 119844, 119853, 119862, + 119872, 119876, 119881, 119886, 119892, 119897, 119903, 119909, + 119916, 119921, 119927, 119933, 119940, 119946, 119953, 119960, + 119968, 119973, 119979, 119985, 119992, 119998, 120005, 120012, + 120020, 120026, 120033, 120040, 120048, 120055, 120063, 120071, + 120080, 120085, 120091, 120097, 120104, 120110, 120117, 120124, + 120132, 120138, 120145, 120152, 120160, 120167, 120175, 120183, + 120192, 120198, 120205, 120212, 120220, 120227, 120235, 120243, + 120252, 120259, 120267, 120275, 120284, 120292, 120301, 120310, + 120320, 120325, 120331, 120337, 120344, 120350, 120357, 120364, + 120372, 120378, 120385, 120392, 120400, 120407, 120415, 120423, + 120432, 120438, 120445, 120452, 120460, 120467, 120475, 120483, + 120492, 120499, 120507, 120515, 120524, 120532, 120541, 120550, + 120560, 120566, 120573, 120580, 120588, 120595, 120603, 120611, + 120620, 120627, 120635, 120643, 120652, 120660, 120669, 120678, + 120688, 120695, 120703, 120711, 120720, 120728, 120737, 120746, + 120756, 120764, 120773, 120782, 120792, 120801, 120811, 120821, + 120832, 120834, 120837, 120840, 120844, 120847, 120851, 120855, + 120860, 120863, 120867, 120871, 120876, 120880, 120885, 120890, + 120896, 120899, 120903, 120907, 120912, 120916, 120921, 120926, + 120932, 120936, 120941, 120946, 120952, 120957, 120963, 120969, + 120976, 120979, 120983, 120987, 120992, 120996, 121001, 121006, + 121012, 121016, 121021, 121026, 121032, 121037, 121043, 121049, + 121056, 121060, 121065, 121070, 121076, 121081, 121087, 121093, + 121100, 121105, 121111, 121117, 121124, 121130, 121137, 121144, + 121152, 121155, 121159, 121163, 121168, 121172, 121177, 121182, + 121188, 121192, 121197, 121202, 121208, 121213, 121219, 121225, + 121232, 121236, 121241, 121246, 121252, 121257, 121263, 121269, + 121276, 121281, 121287, 121293, 121300, 121306, 121313, 121320, + 121328, 121332, 121337, 121342, 121348, 121353, 121359, 121365, + 121372, 121377, 121383, 121389, 121396, 121402, 121409, 121416, + 121424, 121429, 121435, 121441, 121448, 121454, 121461, 121468, + 121476, 121482, 121489, 121496, 121504, 121511, 121519, 121527, + 121536, 121539, 121543, 121547, 121552, 121556, 121561, 121566, + 121572, 121576, 121581, 121586, 121592, 121597, 121603, 121609, + 121616, 121620, 121625, 121630, 121636, 121641, 121647, 121653, + 121660, 121665, 121671, 121677, 121684, 121690, 121697, 121704, + 121712, 121716, 121721, 121726, 121732, 121737, 121743, 121749, + 121756, 121761, 121767, 121773, 121780, 121786, 121793, 121800, + 121808, 121813, 121819, 121825, 121832, 121838, 121845, 121852, + 121860, 121866, 121873, 121880, 121888, 121895, 121903, 121911, + 121920, 121924, 121929, 121934, 121940, 121945, 121951, 121957, + 121964, 121969, 121975, 121981, 121988, 121994, 122001, 122008, + 122016, 122021, 122027, 122033, 122040, 122046, 122053, 122060, + 122068, 122074, 122081, 122088, 122096, 122103, 122111, 122119, + 122128, 122133, 122139, 122145, 122152, 122158, 122165, 122172, + 122180, 122186, 122193, 122200, 122208, 122215, 122223, 122231, + 122240, 122246, 122253, 122260, 122268, 122275, 122283, 122291, + 122300, 122307, 122315, 122323, 122332, 122340, 122349, 122358, + 122368, 122371, 122375, 122379, 122384, 122388, 122393, 122398, + 122404, 122408, 122413, 122418, 122424, 122429, 122435, 122441, + 122448, 122452, 122457, 122462, 122468, 122473, 122479, 122485, + 122492, 122497, 122503, 122509, 122516, 122522, 122529, 122536, + 122544, 122548, 122553, 122558, 122564, 122569, 122575, 122581, + 122588, 122593, 122599, 122605, 122612, 122618, 122625, 122632, + 122640, 122645, 122651, 122657, 122664, 122670, 122677, 122684, + 122692, 122698, 122705, 122712, 122720, 122727, 122735, 122743, + 122752, 122756, 122761, 122766, 122772, 122777, 122783, 122789, + 122796, 122801, 122807, 122813, 122820, 122826, 122833, 122840, + 122848, 122853, 122859, 122865, 122872, 122878, 122885, 122892, + 122900, 122906, 122913, 122920, 122928, 122935, 122943, 122951, + 122960, 122965, 122971, 122977, 122984, 122990, 122997, 123004, + 123012, 123018, 123025, 123032, 123040, 123047, 123055, 123063, + 123072, 123078, 123085, 123092, 123100, 123107, 123115, 123123, + 123132, 123139, 123147, 123155, 123164, 123172, 123181, 123190, + 123200, 123204, 123209, 123214, 123220, 123225, 123231, 123237, + 123244, 123249, 123255, 123261, 123268, 123274, 123281, 123288, + 123296, 123301, 123307, 123313, 123320, 123326, 123333, 123340, + 123348, 123354, 123361, 123368, 123376, 123383, 123391, 123399, + 123408, 123413, 123419, 123425, 123432, 123438, 123445, 123452, + 123460, 123466, 123473, 123480, 123488, 123495, 123503, 123511, + 123520, 123526, 123533, 123540, 123548, 123555, 123563, 123571, + 123580, 123587, 123595, 123603, 123612, 123620, 123629, 123638, + 123648, 123653, 123659, 123665, 123672, 123678, 123685, 123692, + 123700, 123706, 123713, 123720, 123728, 123735, 123743, 123751, + 123760, 123766, 123773, 123780, 123788, 123795, 123803, 123811, + 123820, 123827, 123835, 123843, 123852, 123860, 123869, 123878, + 123888, 123894, 123901, 123908, 123916, 123923, 123931, 123939, + 123948, 123955, 123963, 123971, 123980, 123988, 123997, 124006, + 124016, 124023, 124031, 124039, 124048, 124056, 124065, 124074, + 124084, 124092, 124101, 124110, 124120, 124129, 124139, 124149, + 124160, 124163, 124167, 124171, 124176, 124180, 124185, 124190, + 124196, 124200, 124205, 124210, 124216, 124221, 124227, 124233, + 124240, 124244, 124249, 124254, 124260, 124265, 124271, 124277, + 124284, 124289, 124295, 124301, 124308, 124314, 124321, 124328, + 124336, 124340, 124345, 124350, 124356, 124361, 124367, 124373, + 124380, 124385, 124391, 124397, 124404, 124410, 124417, 124424, + 124432, 124437, 124443, 124449, 124456, 124462, 124469, 124476, + 124484, 124490, 124497, 124504, 124512, 124519, 124527, 124535, + 124544, 124548, 124553, 124558, 124564, 124569, 124575, 124581, + 124588, 124593, 124599, 124605, 124612, 124618, 124625, 124632, + 124640, 124645, 124651, 124657, 124664, 124670, 124677, 124684, + 124692, 124698, 124705, 124712, 124720, 124727, 124735, 124743, + 124752, 124757, 124763, 124769, 124776, 124782, 124789, 124796, + 124804, 124810, 124817, 124824, 124832, 124839, 124847, 124855, + 124864, 124870, 124877, 124884, 124892, 124899, 124907, 124915, + 124924, 124931, 124939, 124947, 124956, 124964, 124973, 124982, + 124992, 124996, 125001, 125006, 125012, 125017, 125023, 125029, + 125036, 125041, 125047, 125053, 125060, 125066, 125073, 125080, + 125088, 125093, 125099, 125105, 125112, 125118, 125125, 125132, + 125140, 125146, 125153, 125160, 125168, 125175, 125183, 125191, + 125200, 125205, 125211, 125217, 125224, 125230, 125237, 125244, + 125252, 125258, 125265, 125272, 125280, 125287, 125295, 125303, + 125312, 125318, 125325, 125332, 125340, 125347, 125355, 125363, + 125372, 125379, 125387, 125395, 125404, 125412, 125421, 125430, + 125440, 125445, 125451, 125457, 125464, 125470, 125477, 125484, + 125492, 125498, 125505, 125512, 125520, 125527, 125535, 125543, + 125552, 125558, 125565, 125572, 125580, 125587, 125595, 125603, + 125612, 125619, 125627, 125635, 125644, 125652, 125661, 125670, + 125680, 125686, 125693, 125700, 125708, 125715, 125723, 125731, + 125740, 125747, 125755, 125763, 125772, 125780, 125789, 125798, + 125808, 125815, 125823, 125831, 125840, 125848, 125857, 125866, + 125876, 125884, 125893, 125902, 125912, 125921, 125931, 125941, + 125952, 125956, 125961, 125966, 125972, 125977, 125983, 125989, + 125996, 126001, 126007, 126013, 126020, 126026, 126033, 126040, + 126048, 126053, 126059, 126065, 126072, 126078, 126085, 126092, + 126100, 126106, 126113, 126120, 126128, 126135, 126143, 126151, + 126160, 126165, 126171, 126177, 126184, 126190, 126197, 126204, + 126212, 126218, 126225, 126232, 126240, 126247, 126255, 126263, + 126272, 126278, 126285, 126292, 126300, 126307, 126315, 126323, + 126332, 126339, 126347, 126355, 126364, 126372, 126381, 126390, + 126400, 126405, 126411, 126417, 126424, 126430, 126437, 126444, + 126452, 126458, 126465, 126472, 126480, 126487, 126495, 126503, + 126512, 126518, 126525, 126532, 126540, 126547, 126555, 126563, + 126572, 126579, 126587, 126595, 126604, 126612, 126621, 126630, + 126640, 126646, 126653, 126660, 126668, 126675, 126683, 126691, + 126700, 126707, 126715, 126723, 126732, 126740, 126749, 126758, + 126768, 126775, 126783, 126791, 126800, 126808, 126817, 126826, + 126836, 126844, 126853, 126862, 126872, 126881, 126891, 126901, + 126912, 126917, 126923, 126929, 126936, 126942, 126949, 126956, + 126964, 126970, 126977, 126984, 126992, 126999, 127007, 127015, + 127024, 127030, 127037, 127044, 127052, 127059, 127067, 127075, + 127084, 127091, 127099, 127107, 127116, 127124, 127133, 127142, + 127152, 127158, 127165, 127172, 127180, 127187, 127195, 127203, + 127212, 127219, 127227, 127235, 127244, 127252, 127261, 127270, + 127280, 127287, 127295, 127303, 127312, 127320, 127329, 127338, + 127348, 127356, 127365, 127374, 127384, 127393, 127403, 127413, + 127424, 127430, 127437, 127444, 127452, 127459, 127467, 127475, + 127484, 127491, 127499, 127507, 127516, 127524, 127533, 127542, + 127552, 127559, 127567, 127575, 127584, 127592, 127601, 127610, + 127620, 127628, 127637, 127646, 127656, 127665, 127675, 127685, + 127696, 127703, 127711, 127719, 127728, 127736, 127745, 127754, + 127764, 127772, 127781, 127790, 127800, 127809, 127819, 127829, + 127840, 127848, 127857, 127866, 127876, 127885, 127895, 127905, + 127916, 127925, 127935, 127945, 127956, 127966, 127977, 127988, + 128000, 128002, 128005, 128008, 128012, 128015, 128019, 128023, + 128028, 128031, 128035, 128039, 128044, 128048, 128053, 128058, + 128064, 128067, 128071, 128075, 128080, 128084, 128089, 128094, + 128100, 128104, 128109, 128114, 128120, 128125, 128131, 128137, + 128144, 128147, 128151, 128155, 128160, 128164, 128169, 128174, + 128180, 128184, 128189, 128194, 128200, 128205, 128211, 128217, + 128224, 128228, 128233, 128238, 128244, 128249, 128255, 128261, + 128268, 128273, 128279, 128285, 128292, 128298, 128305, 128312, + 128320, 128323, 128327, 128331, 128336, 128340, 128345, 128350, + 128356, 128360, 128365, 128370, 128376, 128381, 128387, 128393, + 128400, 128404, 128409, 128414, 128420, 128425, 128431, 128437, + 128444, 128449, 128455, 128461, 128468, 128474, 128481, 128488, + 128496, 128500, 128505, 128510, 128516, 128521, 128527, 128533, + 128540, 128545, 128551, 128557, 128564, 128570, 128577, 128584, + 128592, 128597, 128603, 128609, 128616, 128622, 128629, 128636, + 128644, 128650, 128657, 128664, 128672, 128679, 128687, 128695, + 128704, 128707, 128711, 128715, 128720, 128724, 128729, 128734, + 128740, 128744, 128749, 128754, 128760, 128765, 128771, 128777, + 128784, 128788, 128793, 128798, 128804, 128809, 128815, 128821, + 128828, 128833, 128839, 128845, 128852, 128858, 128865, 128872, + 128880, 128884, 128889, 128894, 128900, 128905, 128911, 128917, + 128924, 128929, 128935, 128941, 128948, 128954, 128961, 128968, + 128976, 128981, 128987, 128993, 129000, 129006, 129013, 129020, + 129028, 129034, 129041, 129048, 129056, 129063, 129071, 129079, + 129088, 129092, 129097, 129102, 129108, 129113, 129119, 129125, + 129132, 129137, 129143, 129149, 129156, 129162, 129169, 129176, + 129184, 129189, 129195, 129201, 129208, 129214, 129221, 129228, + 129236, 129242, 129249, 129256, 129264, 129271, 129279, 129287, + 129296, 129301, 129307, 129313, 129320, 129326, 129333, 129340, + 129348, 129354, 129361, 129368, 129376, 129383, 129391, 129399, + 129408, 129414, 129421, 129428, 129436, 129443, 129451, 129459, + 129468, 129475, 129483, 129491, 129500, 129508, 129517, 129526, + 129536, 129539, 129543, 129547, 129552, 129556, 129561, 129566, + 129572, 129576, 129581, 129586, 129592, 129597, 129603, 129609, + 129616, 129620, 129625, 129630, 129636, 129641, 129647, 129653, + 129660, 129665, 129671, 129677, 129684, 129690, 129697, 129704, + 129712, 129716, 129721, 129726, 129732, 129737, 129743, 129749, + 129756, 129761, 129767, 129773, 129780, 129786, 129793, 129800, + 129808, 129813, 129819, 129825, 129832, 129838, 129845, 129852, + 129860, 129866, 129873, 129880, 129888, 129895, 129903, 129911, + 129920, 129924, 129929, 129934, 129940, 129945, 129951, 129957, + 129964, 129969, 129975, 129981, 129988, 129994, 130001, 130008, + 130016, 130021, 130027, 130033, 130040, 130046, 130053, 130060, + 130068, 130074, 130081, 130088, 130096, 130103, 130111, 130119, + 130128, 130133, 130139, 130145, 130152, 130158, 130165, 130172, + 130180, 130186, 130193, 130200, 130208, 130215, 130223, 130231, + 130240, 130246, 130253, 130260, 130268, 130275, 130283, 130291, + 130300, 130307, 130315, 130323, 130332, 130340, 130349, 130358, + 130368, 130372, 130377, 130382, 130388, 130393, 130399, 130405, + 130412, 130417, 130423, 130429, 130436, 130442, 130449, 130456, + 130464, 130469, 130475, 130481, 130488, 130494, 130501, 130508, + 130516, 130522, 130529, 130536, 130544, 130551, 130559, 130567, + 130576, 130581, 130587, 130593, 130600, 130606, 130613, 130620, + 130628, 130634, 130641, 130648, 130656, 130663, 130671, 130679, + 130688, 130694, 130701, 130708, 130716, 130723, 130731, 130739, + 130748, 130755, 130763, 130771, 130780, 130788, 130797, 130806, + 130816, 130821, 130827, 130833, 130840, 130846, 130853, 130860, + 130868, 130874, 130881, 130888, 130896, 130903, 130911, 130919, + 130928, 130934, 130941, 130948, 130956, 130963, 130971, 130979, + 130988, 130995, 131003, 131011, 131020, 131028, 131037, 131046, + 131056, 131062, 131069, 131076, 131084, 131091, 131099, 131107, + 131116, 131123, 131131, 131139, 131148, 131156, 131165, 131174, + 131184, 131191, 131199, 131207, 131216, 131224, 131233, 131242, + 131252, 131260, 131269, 131278, 131288, 131297, 131307, 131317, + 131328, 131331, 131335, 131339, 131344, 131348, 131353, 131358, + 131364, 131368, 131373, 131378, 131384, 131389, 131395, 131401, + 131408, 131412, 131417, 131422, 131428, 131433, 131439, 131445, + 131452, 131457, 131463, 131469, 131476, 131482, 131489, 131496, + 131504, 131508, 131513, 131518, 131524, 131529, 131535, 131541, + 131548, 131553, 131559, 131565, 131572, 131578, 131585, 131592, + 131600, 131605, 131611, 131617, 131624, 131630, 131637, 131644, + 131652, 131658, 131665, 131672, 131680, 131687, 131695, 131703, + 131712, 131716, 131721, 131726, 131732, 131737, 131743, 131749, + 131756, 131761, 131767, 131773, 131780, 131786, 131793, 131800, + 131808, 131813, 131819, 131825, 131832, 131838, 131845, 131852, + 131860, 131866, 131873, 131880, 131888, 131895, 131903, 131911, + 131920, 131925, 131931, 131937, 131944, 131950, 131957, 131964, + 131972, 131978, 131985, 131992, 132000, 132007, 132015, 132023, + 132032, 132038, 132045, 132052, 132060, 132067, 132075, 132083, + 132092, 132099, 132107, 132115, 132124, 132132, 132141, 132150, + 132160, 132164, 132169, 132174, 132180, 132185, 132191, 132197, + 132204, 132209, 132215, 132221, 132228, 132234, 132241, 132248, + 132256, 132261, 132267, 132273, 132280, 132286, 132293, 132300, + 132308, 132314, 132321, 132328, 132336, 132343, 132351, 132359, + 132368, 132373, 132379, 132385, 132392, 132398, 132405, 132412, + 132420, 132426, 132433, 132440, 132448, 132455, 132463, 132471, + 132480, 132486, 132493, 132500, 132508, 132515, 132523, 132531, + 132540, 132547, 132555, 132563, 132572, 132580, 132589, 132598, + 132608, 132613, 132619, 132625, 132632, 132638, 132645, 132652, + 132660, 132666, 132673, 132680, 132688, 132695, 132703, 132711, + 132720, 132726, 132733, 132740, 132748, 132755, 132763, 132771, + 132780, 132787, 132795, 132803, 132812, 132820, 132829, 132838, + 132848, 132854, 132861, 132868, 132876, 132883, 132891, 132899, + 132908, 132915, 132923, 132931, 132940, 132948, 132957, 132966, + 132976, 132983, 132991, 132999, 133008, 133016, 133025, 133034, + 133044, 133052, 133061, 133070, 133080, 133089, 133099, 133109, + 133120, 133124, 133129, 133134, 133140, 133145, 133151, 133157, + 133164, 133169, 133175, 133181, 133188, 133194, 133201, 133208, + 133216, 133221, 133227, 133233, 133240, 133246, 133253, 133260, + 133268, 133274, 133281, 133288, 133296, 133303, 133311, 133319, + 133328, 133333, 133339, 133345, 133352, 133358, 133365, 133372, + 133380, 133386, 133393, 133400, 133408, 133415, 133423, 133431, + 133440, 133446, 133453, 133460, 133468, 133475, 133483, 133491, + 133500, 133507, 133515, 133523, 133532, 133540, 133549, 133558, + 133568, 133573, 133579, 133585, 133592, 133598, 133605, 133612, + 133620, 133626, 133633, 133640, 133648, 133655, 133663, 133671, + 133680, 133686, 133693, 133700, 133708, 133715, 133723, 133731, + 133740, 133747, 133755, 133763, 133772, 133780, 133789, 133798, + 133808, 133814, 133821, 133828, 133836, 133843, 133851, 133859, + 133868, 133875, 133883, 133891, 133900, 133908, 133917, 133926, + 133936, 133943, 133951, 133959, 133968, 133976, 133985, 133994, + 134004, 134012, 134021, 134030, 134040, 134049, 134059, 134069, + 134080, 134085, 134091, 134097, 134104, 134110, 134117, 134124, + 134132, 134138, 134145, 134152, 134160, 134167, 134175, 134183, + 134192, 134198, 134205, 134212, 134220, 134227, 134235, 134243, + 134252, 134259, 134267, 134275, 134284, 134292, 134301, 134310, + 134320, 134326, 134333, 134340, 134348, 134355, 134363, 134371, + 134380, 134387, 134395, 134403, 134412, 134420, 134429, 134438, + 134448, 134455, 134463, 134471, 134480, 134488, 134497, 134506, + 134516, 134524, 134533, 134542, 134552, 134561, 134571, 134581, + 134592, 134598, 134605, 134612, 134620, 134627, 134635, 134643, + 134652, 134659, 134667, 134675, 134684, 134692, 134701, 134710, + 134720, 134727, 134735, 134743, 134752, 134760, 134769, 134778, + 134788, 134796, 134805, 134814, 134824, 134833, 134843, 134853, + 134864, 134871, 134879, 134887, 134896, 134904, 134913, 134922, + 134932, 134940, 134949, 134958, 134968, 134977, 134987, 134997, + 135008, 135016, 135025, 135034, 135044, 135053, 135063, 135073, + 135084, 135093, 135103, 135113, 135124, 135134, 135145, 135156, + 135168, 135171, 135175, 135179, 135184, 135188, 135193, 135198, + 135204, 135208, 135213, 135218, 135224, 135229, 135235, 135241, + 135248, 135252, 135257, 135262, 135268, 135273, 135279, 135285, + 135292, 135297, 135303, 135309, 135316, 135322, 135329, 135336, + 135344, 135348, 135353, 135358, 135364, 135369, 135375, 135381, + 135388, 135393, 135399, 135405, 135412, 135418, 135425, 135432, + 135440, 135445, 135451, 135457, 135464, 135470, 135477, 135484, + 135492, 135498, 135505, 135512, 135520, 135527, 135535, 135543, + 135552, 135556, 135561, 135566, 135572, 135577, 135583, 135589, + 135596, 135601, 135607, 135613, 135620, 135626, 135633, 135640, + 135648, 135653, 135659, 135665, 135672, 135678, 135685, 135692, + 135700, 135706, 135713, 135720, 135728, 135735, 135743, 135751, + 135760, 135765, 135771, 135777, 135784, 135790, 135797, 135804, + 135812, 135818, 135825, 135832, 135840, 135847, 135855, 135863, + 135872, 135878, 135885, 135892, 135900, 135907, 135915, 135923, + 135932, 135939, 135947, 135955, 135964, 135972, 135981, 135990, + 136000, 136004, 136009, 136014, 136020, 136025, 136031, 136037, + 136044, 136049, 136055, 136061, 136068, 136074, 136081, 136088, + 136096, 136101, 136107, 136113, 136120, 136126, 136133, 136140, + 136148, 136154, 136161, 136168, 136176, 136183, 136191, 136199, + 136208, 136213, 136219, 136225, 136232, 136238, 136245, 136252, + 136260, 136266, 136273, 136280, 136288, 136295, 136303, 136311, + 136320, 136326, 136333, 136340, 136348, 136355, 136363, 136371, + 136380, 136387, 136395, 136403, 136412, 136420, 136429, 136438, + 136448, 136453, 136459, 136465, 136472, 136478, 136485, 136492, + 136500, 136506, 136513, 136520, 136528, 136535, 136543, 136551, + 136560, 136566, 136573, 136580, 136588, 136595, 136603, 136611, + 136620, 136627, 136635, 136643, 136652, 136660, 136669, 136678, + 136688, 136694, 136701, 136708, 136716, 136723, 136731, 136739, + 136748, 136755, 136763, 136771, 136780, 136788, 136797, 136806, + 136816, 136823, 136831, 136839, 136848, 136856, 136865, 136874, + 136884, 136892, 136901, 136910, 136920, 136929, 136939, 136949, + 136960, 136964, 136969, 136974, 136980, 136985, 136991, 136997, + 137004, 137009, 137015, 137021, 137028, 137034, 137041, 137048, + 137056, 137061, 137067, 137073, 137080, 137086, 137093, 137100, + 137108, 137114, 137121, 137128, 137136, 137143, 137151, 137159, + 137168, 137173, 137179, 137185, 137192, 137198, 137205, 137212, + 137220, 137226, 137233, 137240, 137248, 137255, 137263, 137271, + 137280, 137286, 137293, 137300, 137308, 137315, 137323, 137331, + 137340, 137347, 137355, 137363, 137372, 137380, 137389, 137398, + 137408, 137413, 137419, 137425, 137432, 137438, 137445, 137452, + 137460, 137466, 137473, 137480, 137488, 137495, 137503, 137511, + 137520, 137526, 137533, 137540, 137548, 137555, 137563, 137571, + 137580, 137587, 137595, 137603, 137612, 137620, 137629, 137638, + 137648, 137654, 137661, 137668, 137676, 137683, 137691, 137699, + 137708, 137715, 137723, 137731, 137740, 137748, 137757, 137766, + 137776, 137783, 137791, 137799, 137808, 137816, 137825, 137834, + 137844, 137852, 137861, 137870, 137880, 137889, 137899, 137909, + 137920, 137925, 137931, 137937, 137944, 137950, 137957, 137964, + 137972, 137978, 137985, 137992, 138000, 138007, 138015, 138023, + 138032, 138038, 138045, 138052, 138060, 138067, 138075, 138083, + 138092, 138099, 138107, 138115, 138124, 138132, 138141, 138150, + 138160, 138166, 138173, 138180, 138188, 138195, 138203, 138211, + 138220, 138227, 138235, 138243, 138252, 138260, 138269, 138278, + 138288, 138295, 138303, 138311, 138320, 138328, 138337, 138346, + 138356, 138364, 138373, 138382, 138392, 138401, 138411, 138421, + 138432, 138438, 138445, 138452, 138460, 138467, 138475, 138483, + 138492, 138499, 138507, 138515, 138524, 138532, 138541, 138550, + 138560, 138567, 138575, 138583, 138592, 138600, 138609, 138618, + 138628, 138636, 138645, 138654, 138664, 138673, 138683, 138693, + 138704, 138711, 138719, 138727, 138736, 138744, 138753, 138762, + 138772, 138780, 138789, 138798, 138808, 138817, 138827, 138837, + 138848, 138856, 138865, 138874, 138884, 138893, 138903, 138913, + 138924, 138933, 138943, 138953, 138964, 138974, 138985, 138996, + 139008, 139012, 139017, 139022, 139028, 139033, 139039, 139045, + 139052, 139057, 139063, 139069, 139076, 139082, 139089, 139096, + 139104, 139109, 139115, 139121, 139128, 139134, 139141, 139148, + 139156, 139162, 139169, 139176, 139184, 139191, 139199, 139207, + 139216, 139221, 139227, 139233, 139240, 139246, 139253, 139260, + 139268, 139274, 139281, 139288, 139296, 139303, 139311, 139319, + 139328, 139334, 139341, 139348, 139356, 139363, 139371, 139379, + 139388, 139395, 139403, 139411, 139420, 139428, 139437, 139446, + 139456, 139461, 139467, 139473, 139480, 139486, 139493, 139500, + 139508, 139514, 139521, 139528, 139536, 139543, 139551, 139559, + 139568, 139574, 139581, 139588, 139596, 139603, 139611, 139619, + 139628, 139635, 139643, 139651, 139660, 139668, 139677, 139686, + 139696, 139702, 139709, 139716, 139724, 139731, 139739, 139747, + 139756, 139763, 139771, 139779, 139788, 139796, 139805, 139814, + 139824, 139831, 139839, 139847, 139856, 139864, 139873, 139882, + 139892, 139900, 139909, 139918, 139928, 139937, 139947, 139957, + 139968, 139973, 139979, 139985, 139992, 139998, 140005, 140012, + 140020, 140026, 140033, 140040, 140048, 140055, 140063, 140071, + 140080, 140086, 140093, 140100, 140108, 140115, 140123, 140131, + 140140, 140147, 140155, 140163, 140172, 140180, 140189, 140198, + 140208, 140214, 140221, 140228, 140236, 140243, 140251, 140259, + 140268, 140275, 140283, 140291, 140300, 140308, 140317, 140326, + 140336, 140343, 140351, 140359, 140368, 140376, 140385, 140394, + 140404, 140412, 140421, 140430, 140440, 140449, 140459, 140469, + 140480, 140486, 140493, 140500, 140508, 140515, 140523, 140531, + 140540, 140547, 140555, 140563, 140572, 140580, 140589, 140598, + 140608, 140615, 140623, 140631, 140640, 140648, 140657, 140666, + 140676, 140684, 140693, 140702, 140712, 140721, 140731, 140741, + 140752, 140759, 140767, 140775, 140784, 140792, 140801, 140810, + 140820, 140828, 140837, 140846, 140856, 140865, 140875, 140885, + 140896, 140904, 140913, 140922, 140932, 140941, 140951, 140961, + 140972, 140981, 140991, 141001, 141012, 141022, 141033, 141044, + 141056, 141061, 141067, 141073, 141080, 141086, 141093, 141100, + 141108, 141114, 141121, 141128, 141136, 141143, 141151, 141159, + 141168, 141174, 141181, 141188, 141196, 141203, 141211, 141219, + 141228, 141235, 141243, 141251, 141260, 141268, 141277, 141286, + 141296, 141302, 141309, 141316, 141324, 141331, 141339, 141347, + 141356, 141363, 141371, 141379, 141388, 141396, 141405, 141414, + 141424, 141431, 141439, 141447, 141456, 141464, 141473, 141482, + 141492, 141500, 141509, 141518, 141528, 141537, 141547, 141557, + 141568, 141574, 141581, 141588, 141596, 141603, 141611, 141619, + 141628, 141635, 141643, 141651, 141660, 141668, 141677, 141686, + 141696, 141703, 141711, 141719, 141728, 141736, 141745, 141754, + 141764, 141772, 141781, 141790, 141800, 141809, 141819, 141829, + 141840, 141847, 141855, 141863, 141872, 141880, 141889, 141898, + 141908, 141916, 141925, 141934, 141944, 141953, 141963, 141973, + 141984, 141992, 142001, 142010, 142020, 142029, 142039, 142049, + 142060, 142069, 142079, 142089, 142100, 142110, 142121, 142132, + 142144, 142150, 142157, 142164, 142172, 142179, 142187, 142195, + 142204, 142211, 142219, 142227, 142236, 142244, 142253, 142262, + 142272, 142279, 142287, 142295, 142304, 142312, 142321, 142330, + 142340, 142348, 142357, 142366, 142376, 142385, 142395, 142405, + 142416, 142423, 142431, 142439, 142448, 142456, 142465, 142474, + 142484, 142492, 142501, 142510, 142520, 142529, 142539, 142549, + 142560, 142568, 142577, 142586, 142596, 142605, 142615, 142625, + 142636, 142645, 142655, 142665, 142676, 142686, 142697, 142708, + 142720, 142727, 142735, 142743, 142752, 142760, 142769, 142778, + 142788, 142796, 142805, 142814, 142824, 142833, 142843, 142853, + 142864, 142872, 142881, 142890, 142900, 142909, 142919, 142929, + 142940, 142949, 142959, 142969, 142980, 142990, 143001, 143012, + 143024, 143032, 143041, 143050, 143060, 143069, 143079, 143089, + 143100, 143109, 143119, 143129, 143140, 143150, 143161, 143172, + 143184, 143193, 143203, 143213, 143224, 143234, 143245, 143256, + 143268, 143278, 143289, 143300, 143312, 143323, 143335, 143347, + 143360, 143362, 143365, 143368, 143372, 143375, 143379, 143383, + 143388, 143391, 143395, 143399, 143404, 143408, 143413, 143418, + 143424, 143427, 143431, 143435, 143440, 143444, 143449, 143454, + 143460, 143464, 143469, 143474, 143480, 143485, 143491, 143497, + 143504, 143507, 143511, 143515, 143520, 143524, 143529, 143534, + 143540, 143544, 143549, 143554, 143560, 143565, 143571, 143577, + 143584, 143588, 143593, 143598, 143604, 143609, 143615, 143621, + 143628, 143633, 143639, 143645, 143652, 143658, 143665, 143672, + 143680, 143683, 143687, 143691, 143696, 143700, 143705, 143710, + 143716, 143720, 143725, 143730, 143736, 143741, 143747, 143753, + 143760, 143764, 143769, 143774, 143780, 143785, 143791, 143797, + 143804, 143809, 143815, 143821, 143828, 143834, 143841, 143848, + 143856, 143860, 143865, 143870, 143876, 143881, 143887, 143893, + 143900, 143905, 143911, 143917, 143924, 143930, 143937, 143944, + 143952, 143957, 143963, 143969, 143976, 143982, 143989, 143996, + 144004, 144010, 144017, 144024, 144032, 144039, 144047, 144055, + 144064, 144067, 144071, 144075, 144080, 144084, 144089, 144094, + 144100, 144104, 144109, 144114, 144120, 144125, 144131, 144137, + 144144, 144148, 144153, 144158, 144164, 144169, 144175, 144181, + 144188, 144193, 144199, 144205, 144212, 144218, 144225, 144232, + 144240, 144244, 144249, 144254, 144260, 144265, 144271, 144277, + 144284, 144289, 144295, 144301, 144308, 144314, 144321, 144328, + 144336, 144341, 144347, 144353, 144360, 144366, 144373, 144380, + 144388, 144394, 144401, 144408, 144416, 144423, 144431, 144439, + 144448, 144452, 144457, 144462, 144468, 144473, 144479, 144485, + 144492, 144497, 144503, 144509, 144516, 144522, 144529, 144536, + 144544, 144549, 144555, 144561, 144568, 144574, 144581, 144588, + 144596, 144602, 144609, 144616, 144624, 144631, 144639, 144647, + 144656, 144661, 144667, 144673, 144680, 144686, 144693, 144700, + 144708, 144714, 144721, 144728, 144736, 144743, 144751, 144759, + 144768, 144774, 144781, 144788, 144796, 144803, 144811, 144819, + 144828, 144835, 144843, 144851, 144860, 144868, 144877, 144886, + 144896, 144899, 144903, 144907, 144912, 144916, 144921, 144926, + 144932, 144936, 144941, 144946, 144952, 144957, 144963, 144969, + 144976, 144980, 144985, 144990, 144996, 145001, 145007, 145013, + 145020, 145025, 145031, 145037, 145044, 145050, 145057, 145064, + 145072, 145076, 145081, 145086, 145092, 145097, 145103, 145109, + 145116, 145121, 145127, 145133, 145140, 145146, 145153, 145160, + 145168, 145173, 145179, 145185, 145192, 145198, 145205, 145212, + 145220, 145226, 145233, 145240, 145248, 145255, 145263, 145271, + 145280, 145284, 145289, 145294, 145300, 145305, 145311, 145317, + 145324, 145329, 145335, 145341, 145348, 145354, 145361, 145368, + 145376, 145381, 145387, 145393, 145400, 145406, 145413, 145420, + 145428, 145434, 145441, 145448, 145456, 145463, 145471, 145479, + 145488, 145493, 145499, 145505, 145512, 145518, 145525, 145532, + 145540, 145546, 145553, 145560, 145568, 145575, 145583, 145591, + 145600, 145606, 145613, 145620, 145628, 145635, 145643, 145651, + 145660, 145667, 145675, 145683, 145692, 145700, 145709, 145718, + 145728, 145732, 145737, 145742, 145748, 145753, 145759, 145765, + 145772, 145777, 145783, 145789, 145796, 145802, 145809, 145816, + 145824, 145829, 145835, 145841, 145848, 145854, 145861, 145868, + 145876, 145882, 145889, 145896, 145904, 145911, 145919, 145927, + 145936, 145941, 145947, 145953, 145960, 145966, 145973, 145980, + 145988, 145994, 146001, 146008, 146016, 146023, 146031, 146039, + 146048, 146054, 146061, 146068, 146076, 146083, 146091, 146099, + 146108, 146115, 146123, 146131, 146140, 146148, 146157, 146166, + 146176, 146181, 146187, 146193, 146200, 146206, 146213, 146220, + 146228, 146234, 146241, 146248, 146256, 146263, 146271, 146279, + 146288, 146294, 146301, 146308, 146316, 146323, 146331, 146339, + 146348, 146355, 146363, 146371, 146380, 146388, 146397, 146406, + 146416, 146422, 146429, 146436, 146444, 146451, 146459, 146467, + 146476, 146483, 146491, 146499, 146508, 146516, 146525, 146534, + 146544, 146551, 146559, 146567, 146576, 146584, 146593, 146602, + 146612, 146620, 146629, 146638, 146648, 146657, 146667, 146677, + 146688, 146691, 146695, 146699, 146704, 146708, 146713, 146718, + 146724, 146728, 146733, 146738, 146744, 146749, 146755, 146761, + 146768, 146772, 146777, 146782, 146788, 146793, 146799, 146805, + 146812, 146817, 146823, 146829, 146836, 146842, 146849, 146856, + 146864, 146868, 146873, 146878, 146884, 146889, 146895, 146901, + 146908, 146913, 146919, 146925, 146932, 146938, 146945, 146952, + 146960, 146965, 146971, 146977, 146984, 146990, 146997, 147004, + 147012, 147018, 147025, 147032, 147040, 147047, 147055, 147063, + 147072, 147076, 147081, 147086, 147092, 147097, 147103, 147109, + 147116, 147121, 147127, 147133, 147140, 147146, 147153, 147160, + 147168, 147173, 147179, 147185, 147192, 147198, 147205, 147212, + 147220, 147226, 147233, 147240, 147248, 147255, 147263, 147271, + 147280, 147285, 147291, 147297, 147304, 147310, 147317, 147324, + 147332, 147338, 147345, 147352, 147360, 147367, 147375, 147383, + 147392, 147398, 147405, 147412, 147420, 147427, 147435, 147443, + 147452, 147459, 147467, 147475, 147484, 147492, 147501, 147510, + 147520, 147524, 147529, 147534, 147540, 147545, 147551, 147557, + 147564, 147569, 147575, 147581, 147588, 147594, 147601, 147608, + 147616, 147621, 147627, 147633, 147640, 147646, 147653, 147660, + 147668, 147674, 147681, 147688, 147696, 147703, 147711, 147719, + 147728, 147733, 147739, 147745, 147752, 147758, 147765, 147772, + 147780, 147786, 147793, 147800, 147808, 147815, 147823, 147831, + 147840, 147846, 147853, 147860, 147868, 147875, 147883, 147891, + 147900, 147907, 147915, 147923, 147932, 147940, 147949, 147958, + 147968, 147973, 147979, 147985, 147992, 147998, 148005, 148012, + 148020, 148026, 148033, 148040, 148048, 148055, 148063, 148071, + 148080, 148086, 148093, 148100, 148108, 148115, 148123, 148131, + 148140, 148147, 148155, 148163, 148172, 148180, 148189, 148198, + 148208, 148214, 148221, 148228, 148236, 148243, 148251, 148259, + 148268, 148275, 148283, 148291, 148300, 148308, 148317, 148326, + 148336, 148343, 148351, 148359, 148368, 148376, 148385, 148394, + 148404, 148412, 148421, 148430, 148440, 148449, 148459, 148469, + 148480, 148484, 148489, 148494, 148500, 148505, 148511, 148517, + 148524, 148529, 148535, 148541, 148548, 148554, 148561, 148568, + 148576, 148581, 148587, 148593, 148600, 148606, 148613, 148620, + 148628, 148634, 148641, 148648, 148656, 148663, 148671, 148679, + 148688, 148693, 148699, 148705, 148712, 148718, 148725, 148732, + 148740, 148746, 148753, 148760, 148768, 148775, 148783, 148791, + 148800, 148806, 148813, 148820, 148828, 148835, 148843, 148851, + 148860, 148867, 148875, 148883, 148892, 148900, 148909, 148918, + 148928, 148933, 148939, 148945, 148952, 148958, 148965, 148972, + 148980, 148986, 148993, 149000, 149008, 149015, 149023, 149031, + 149040, 149046, 149053, 149060, 149068, 149075, 149083, 149091, + 149100, 149107, 149115, 149123, 149132, 149140, 149149, 149158, + 149168, 149174, 149181, 149188, 149196, 149203, 149211, 149219, + 149228, 149235, 149243, 149251, 149260, 149268, 149277, 149286, + 149296, 149303, 149311, 149319, 149328, 149336, 149345, 149354, + 149364, 149372, 149381, 149390, 149400, 149409, 149419, 149429, + 149440, 149445, 149451, 149457, 149464, 149470, 149477, 149484, + 149492, 149498, 149505, 149512, 149520, 149527, 149535, 149543, + 149552, 149558, 149565, 149572, 149580, 149587, 149595, 149603, + 149612, 149619, 149627, 149635, 149644, 149652, 149661, 149670, + 149680, 149686, 149693, 149700, 149708, 149715, 149723, 149731, + 149740, 149747, 149755, 149763, 149772, 149780, 149789, 149798, + 149808, 149815, 149823, 149831, 149840, 149848, 149857, 149866, + 149876, 149884, 149893, 149902, 149912, 149921, 149931, 149941, + 149952, 149958, 149965, 149972, 149980, 149987, 149995, 150003, + 150012, 150019, 150027, 150035, 150044, 150052, 150061, 150070, + 150080, 150087, 150095, 150103, 150112, 150120, 150129, 150138, + 150148, 150156, 150165, 150174, 150184, 150193, 150203, 150213, + 150224, 150231, 150239, 150247, 150256, 150264, 150273, 150282, + 150292, 150300, 150309, 150318, 150328, 150337, 150347, 150357, + 150368, 150376, 150385, 150394, 150404, 150413, 150423, 150433, + 150444, 150453, 150463, 150473, 150484, 150494, 150505, 150516, + 150528, 150531, 150535, 150539, 150544, 150548, 150553, 150558, + 150564, 150568, 150573, 150578, 150584, 150589, 150595, 150601, + 150608, 150612, 150617, 150622, 150628, 150633, 150639, 150645, + 150652, 150657, 150663, 150669, 150676, 150682, 150689, 150696, + 150704, 150708, 150713, 150718, 150724, 150729, 150735, 150741, + 150748, 150753, 150759, 150765, 150772, 150778, 150785, 150792, + 150800, 150805, 150811, 150817, 150824, 150830, 150837, 150844, + 150852, 150858, 150865, 150872, 150880, 150887, 150895, 150903, + 150912, 150916, 150921, 150926, 150932, 150937, 150943, 150949, + 150956, 150961, 150967, 150973, 150980, 150986, 150993, 151000, + 151008, 151013, 151019, 151025, 151032, 151038, 151045, 151052, + 151060, 151066, 151073, 151080, 151088, 151095, 151103, 151111, + 151120, 151125, 151131, 151137, 151144, 151150, 151157, 151164, + 151172, 151178, 151185, 151192, 151200, 151207, 151215, 151223, + 151232, 151238, 151245, 151252, 151260, 151267, 151275, 151283, + 151292, 151299, 151307, 151315, 151324, 151332, 151341, 151350, + 151360, 151364, 151369, 151374, 151380, 151385, 151391, 151397, + 151404, 151409, 151415, 151421, 151428, 151434, 151441, 151448, + 151456, 151461, 151467, 151473, 151480, 151486, 151493, 151500, + 151508, 151514, 151521, 151528, 151536, 151543, 151551, 151559, + 151568, 151573, 151579, 151585, 151592, 151598, 151605, 151612, + 151620, 151626, 151633, 151640, 151648, 151655, 151663, 151671, + 151680, 151686, 151693, 151700, 151708, 151715, 151723, 151731, + 151740, 151747, 151755, 151763, 151772, 151780, 151789, 151798, + 151808, 151813, 151819, 151825, 151832, 151838, 151845, 151852, + 151860, 151866, 151873, 151880, 151888, 151895, 151903, 151911, + 151920, 151926, 151933, 151940, 151948, 151955, 151963, 151971, + 151980, 151987, 151995, 152003, 152012, 152020, 152029, 152038, + 152048, 152054, 152061, 152068, 152076, 152083, 152091, 152099, + 152108, 152115, 152123, 152131, 152140, 152148, 152157, 152166, + 152176, 152183, 152191, 152199, 152208, 152216, 152225, 152234, + 152244, 152252, 152261, 152270, 152280, 152289, 152299, 152309, + 152320, 152324, 152329, 152334, 152340, 152345, 152351, 152357, + 152364, 152369, 152375, 152381, 152388, 152394, 152401, 152408, + 152416, 152421, 152427, 152433, 152440, 152446, 152453, 152460, + 152468, 152474, 152481, 152488, 152496, 152503, 152511, 152519, + 152528, 152533, 152539, 152545, 152552, 152558, 152565, 152572, + 152580, 152586, 152593, 152600, 152608, 152615, 152623, 152631, + 152640, 152646, 152653, 152660, 152668, 152675, 152683, 152691, + 152700, 152707, 152715, 152723, 152732, 152740, 152749, 152758, + 152768, 152773, 152779, 152785, 152792, 152798, 152805, 152812, + 152820, 152826, 152833, 152840, 152848, 152855, 152863, 152871, + 152880, 152886, 152893, 152900, 152908, 152915, 152923, 152931, + 152940, 152947, 152955, 152963, 152972, 152980, 152989, 152998, + 153008, 153014, 153021, 153028, 153036, 153043, 153051, 153059, + 153068, 153075, 153083, 153091, 153100, 153108, 153117, 153126, + 153136, 153143, 153151, 153159, 153168, 153176, 153185, 153194, + 153204, 153212, 153221, 153230, 153240, 153249, 153259, 153269, + 153280, 153285, 153291, 153297, 153304, 153310, 153317, 153324, + 153332, 153338, 153345, 153352, 153360, 153367, 153375, 153383, + 153392, 153398, 153405, 153412, 153420, 153427, 153435, 153443, + 153452, 153459, 153467, 153475, 153484, 153492, 153501, 153510, + 153520, 153526, 153533, 153540, 153548, 153555, 153563, 153571, + 153580, 153587, 153595, 153603, 153612, 153620, 153629, 153638, + 153648, 153655, 153663, 153671, 153680, 153688, 153697, 153706, + 153716, 153724, 153733, 153742, 153752, 153761, 153771, 153781, + 153792, 153798, 153805, 153812, 153820, 153827, 153835, 153843, + 153852, 153859, 153867, 153875, 153884, 153892, 153901, 153910, + 153920, 153927, 153935, 153943, 153952, 153960, 153969, 153978, + 153988, 153996, 154005, 154014, 154024, 154033, 154043, 154053, + 154064, 154071, 154079, 154087, 154096, 154104, 154113, 154122, + 154132, 154140, 154149, 154158, 154168, 154177, 154187, 154197, + 154208, 154216, 154225, 154234, 154244, 154253, 154263, 154273, + 154284, 154293, 154303, 154313, 154324, 154334, 154345, 154356, + 154368, 154372, 154377, 154382, 154388, 154393, 154399, 154405, + 154412, 154417, 154423, 154429, 154436, 154442, 154449, 154456, + 154464, 154469, 154475, 154481, 154488, 154494, 154501, 154508, + 154516, 154522, 154529, 154536, 154544, 154551, 154559, 154567, + 154576, 154581, 154587, 154593, 154600, 154606, 154613, 154620, + 154628, 154634, 154641, 154648, 154656, 154663, 154671, 154679, + 154688, 154694, 154701, 154708, 154716, 154723, 154731, 154739, + 154748, 154755, 154763, 154771, 154780, 154788, 154797, 154806, + 154816, 154821, 154827, 154833, 154840, 154846, 154853, 154860, + 154868, 154874, 154881, 154888, 154896, 154903, 154911, 154919, + 154928, 154934, 154941, 154948, 154956, 154963, 154971, 154979, + 154988, 154995, 155003, 155011, 155020, 155028, 155037, 155046, + 155056, 155062, 155069, 155076, 155084, 155091, 155099, 155107, + 155116, 155123, 155131, 155139, 155148, 155156, 155165, 155174, + 155184, 155191, 155199, 155207, 155216, 155224, 155233, 155242, + 155252, 155260, 155269, 155278, 155288, 155297, 155307, 155317, + 155328, 155333, 155339, 155345, 155352, 155358, 155365, 155372, + 155380, 155386, 155393, 155400, 155408, 155415, 155423, 155431, + 155440, 155446, 155453, 155460, 155468, 155475, 155483, 155491, + 155500, 155507, 155515, 155523, 155532, 155540, 155549, 155558, + 155568, 155574, 155581, 155588, 155596, 155603, 155611, 155619, + 155628, 155635, 155643, 155651, 155660, 155668, 155677, 155686, + 155696, 155703, 155711, 155719, 155728, 155736, 155745, 155754, + 155764, 155772, 155781, 155790, 155800, 155809, 155819, 155829, + 155840, 155846, 155853, 155860, 155868, 155875, 155883, 155891, + 155900, 155907, 155915, 155923, 155932, 155940, 155949, 155958, + 155968, 155975, 155983, 155991, 156000, 156008, 156017, 156026, + 156036, 156044, 156053, 156062, 156072, 156081, 156091, 156101, + 156112, 156119, 156127, 156135, 156144, 156152, 156161, 156170, + 156180, 156188, 156197, 156206, 156216, 156225, 156235, 156245, + 156256, 156264, 156273, 156282, 156292, 156301, 156311, 156321, + 156332, 156341, 156351, 156361, 156372, 156382, 156393, 156404, + 156416, 156421, 156427, 156433, 156440, 156446, 156453, 156460, + 156468, 156474, 156481, 156488, 156496, 156503, 156511, 156519, + 156528, 156534, 156541, 156548, 156556, 156563, 156571, 156579, + 156588, 156595, 156603, 156611, 156620, 156628, 156637, 156646, + 156656, 156662, 156669, 156676, 156684, 156691, 156699, 156707, + 156716, 156723, 156731, 156739, 156748, 156756, 156765, 156774, + 156784, 156791, 156799, 156807, 156816, 156824, 156833, 156842, + 156852, 156860, 156869, 156878, 156888, 156897, 156907, 156917, + 156928, 156934, 156941, 156948, 156956, 156963, 156971, 156979, + 156988, 156995, 157003, 157011, 157020, 157028, 157037, 157046, + 157056, 157063, 157071, 157079, 157088, 157096, 157105, 157114, + 157124, 157132, 157141, 157150, 157160, 157169, 157179, 157189, + 157200, 157207, 157215, 157223, 157232, 157240, 157249, 157258, + 157268, 157276, 157285, 157294, 157304, 157313, 157323, 157333, + 157344, 157352, 157361, 157370, 157380, 157389, 157399, 157409, + 157420, 157429, 157439, 157449, 157460, 157470, 157481, 157492, + 157504, 157510, 157517, 157524, 157532, 157539, 157547, 157555, + 157564, 157571, 157579, 157587, 157596, 157604, 157613, 157622, + 157632, 157639, 157647, 157655, 157664, 157672, 157681, 157690, + 157700, 157708, 157717, 157726, 157736, 157745, 157755, 157765, + 157776, 157783, 157791, 157799, 157808, 157816, 157825, 157834, + 157844, 157852, 157861, 157870, 157880, 157889, 157899, 157909, + 157920, 157928, 157937, 157946, 157956, 157965, 157975, 157985, + 157996, 158005, 158015, 158025, 158036, 158046, 158057, 158068, + 158080, 158087, 158095, 158103, 158112, 158120, 158129, 158138, + 158148, 158156, 158165, 158174, 158184, 158193, 158203, 158213, + 158224, 158232, 158241, 158250, 158260, 158269, 158279, 158289, + 158300, 158309, 158319, 158329, 158340, 158350, 158361, 158372, + 158384, 158392, 158401, 158410, 158420, 158429, 158439, 158449, + 158460, 158469, 158479, 158489, 158500, 158510, 158521, 158532, + 158544, 158553, 158563, 158573, 158584, 158594, 158605, 158616, + 158628, 158638, 158649, 158660, 158672, 158683, 158695, 158707, + 158720, 158723, 158727, 158731, 158736, 158740, 158745, 158750, + 158756, 158760, 158765, 158770, 158776, 158781, 158787, 158793, + 158800, 158804, 158809, 158814, 158820, 158825, 158831, 158837, + 158844, 158849, 158855, 158861, 158868, 158874, 158881, 158888, + 158896, 158900, 158905, 158910, 158916, 158921, 158927, 158933, + 158940, 158945, 158951, 158957, 158964, 158970, 158977, 158984, + 158992, 158997, 159003, 159009, 159016, 159022, 159029, 159036, + 159044, 159050, 159057, 159064, 159072, 159079, 159087, 159095, + 159104, 159108, 159113, 159118, 159124, 159129, 159135, 159141, + 159148, 159153, 159159, 159165, 159172, 159178, 159185, 159192, + 159200, 159205, 159211, 159217, 159224, 159230, 159237, 159244, + 159252, 159258, 159265, 159272, 159280, 159287, 159295, 159303, + 159312, 159317, 159323, 159329, 159336, 159342, 159349, 159356, + 159364, 159370, 159377, 159384, 159392, 159399, 159407, 159415, + 159424, 159430, 159437, 159444, 159452, 159459, 159467, 159475, + 159484, 159491, 159499, 159507, 159516, 159524, 159533, 159542, + 159552, 159556, 159561, 159566, 159572, 159577, 159583, 159589, + 159596, 159601, 159607, 159613, 159620, 159626, 159633, 159640, + 159648, 159653, 159659, 159665, 159672, 159678, 159685, 159692, + 159700, 159706, 159713, 159720, 159728, 159735, 159743, 159751, + 159760, 159765, 159771, 159777, 159784, 159790, 159797, 159804, + 159812, 159818, 159825, 159832, 159840, 159847, 159855, 159863, + 159872, 159878, 159885, 159892, 159900, 159907, 159915, 159923, + 159932, 159939, 159947, 159955, 159964, 159972, 159981, 159990, + 160000, 160005, 160011, 160017, 160024, 160030, 160037, 160044, + 160052, 160058, 160065, 160072, 160080, 160087, 160095, 160103, + 160112, 160118, 160125, 160132, 160140, 160147, 160155, 160163, + 160172, 160179, 160187, 160195, 160204, 160212, 160221, 160230, + 160240, 160246, 160253, 160260, 160268, 160275, 160283, 160291, + 160300, 160307, 160315, 160323, 160332, 160340, 160349, 160358, + 160368, 160375, 160383, 160391, 160400, 160408, 160417, 160426, + 160436, 160444, 160453, 160462, 160472, 160481, 160491, 160501, + 160512, 160516, 160521, 160526, 160532, 160537, 160543, 160549, + 160556, 160561, 160567, 160573, 160580, 160586, 160593, 160600, + 160608, 160613, 160619, 160625, 160632, 160638, 160645, 160652, + 160660, 160666, 160673, 160680, 160688, 160695, 160703, 160711, + 160720, 160725, 160731, 160737, 160744, 160750, 160757, 160764, + 160772, 160778, 160785, 160792, 160800, 160807, 160815, 160823, + 160832, 160838, 160845, 160852, 160860, 160867, 160875, 160883, + 160892, 160899, 160907, 160915, 160924, 160932, 160941, 160950, + 160960, 160965, 160971, 160977, 160984, 160990, 160997, 161004, + 161012, 161018, 161025, 161032, 161040, 161047, 161055, 161063, + 161072, 161078, 161085, 161092, 161100, 161107, 161115, 161123, + 161132, 161139, 161147, 161155, 161164, 161172, 161181, 161190, + 161200, 161206, 161213, 161220, 161228, 161235, 161243, 161251, + 161260, 161267, 161275, 161283, 161292, 161300, 161309, 161318, + 161328, 161335, 161343, 161351, 161360, 161368, 161377, 161386, + 161396, 161404, 161413, 161422, 161432, 161441, 161451, 161461, + 161472, 161477, 161483, 161489, 161496, 161502, 161509, 161516, + 161524, 161530, 161537, 161544, 161552, 161559, 161567, 161575, + 161584, 161590, 161597, 161604, 161612, 161619, 161627, 161635, + 161644, 161651, 161659, 161667, 161676, 161684, 161693, 161702, + 161712, 161718, 161725, 161732, 161740, 161747, 161755, 161763, + 161772, 161779, 161787, 161795, 161804, 161812, 161821, 161830, + 161840, 161847, 161855, 161863, 161872, 161880, 161889, 161898, + 161908, 161916, 161925, 161934, 161944, 161953, 161963, 161973, + 161984, 161990, 161997, 162004, 162012, 162019, 162027, 162035, + 162044, 162051, 162059, 162067, 162076, 162084, 162093, 162102, + 162112, 162119, 162127, 162135, 162144, 162152, 162161, 162170, + 162180, 162188, 162197, 162206, 162216, 162225, 162235, 162245, + 162256, 162263, 162271, 162279, 162288, 162296, 162305, 162314, + 162324, 162332, 162341, 162350, 162360, 162369, 162379, 162389, + 162400, 162408, 162417, 162426, 162436, 162445, 162455, 162465, + 162476, 162485, 162495, 162505, 162516, 162526, 162537, 162548, + 162560, 162564, 162569, 162574, 162580, 162585, 162591, 162597, + 162604, 162609, 162615, 162621, 162628, 162634, 162641, 162648, + 162656, 162661, 162667, 162673, 162680, 162686, 162693, 162700, + 162708, 162714, 162721, 162728, 162736, 162743, 162751, 162759, + 162768, 162773, 162779, 162785, 162792, 162798, 162805, 162812, + 162820, 162826, 162833, 162840, 162848, 162855, 162863, 162871, + 162880, 162886, 162893, 162900, 162908, 162915, 162923, 162931, + 162940, 162947, 162955, 162963, 162972, 162980, 162989, 162998, + 163008, 163013, 163019, 163025, 163032, 163038, 163045, 163052, + 163060, 163066, 163073, 163080, 163088, 163095, 163103, 163111, + 163120, 163126, 163133, 163140, 163148, 163155, 163163, 163171, + 163180, 163187, 163195, 163203, 163212, 163220, 163229, 163238, + 163248, 163254, 163261, 163268, 163276, 163283, 163291, 163299, + 163308, 163315, 163323, 163331, 163340, 163348, 163357, 163366, + 163376, 163383, 163391, 163399, 163408, 163416, 163425, 163434, + 163444, 163452, 163461, 163470, 163480, 163489, 163499, 163509, + 163520, 163525, 163531, 163537, 163544, 163550, 163557, 163564, + 163572, 163578, 163585, 163592, 163600, 163607, 163615, 163623, + 163632, 163638, 163645, 163652, 163660, 163667, 163675, 163683, + 163692, 163699, 163707, 163715, 163724, 163732, 163741, 163750, + 163760, 163766, 163773, 163780, 163788, 163795, 163803, 163811, + 163820, 163827, 163835, 163843, 163852, 163860, 163869, 163878, + 163888, 163895, 163903, 163911, 163920, 163928, 163937, 163946, + 163956, 163964, 163973, 163982, 163992, 164001, 164011, 164021, + 164032, 164038, 164045, 164052, 164060, 164067, 164075, 164083, + 164092, 164099, 164107, 164115, 164124, 164132, 164141, 164150, + 164160, 164167, 164175, 164183, 164192, 164200, 164209, 164218, + 164228, 164236, 164245, 164254, 164264, 164273, 164283, 164293, + 164304, 164311, 164319, 164327, 164336, 164344, 164353, 164362, + 164372, 164380, 164389, 164398, 164408, 164417, 164427, 164437, + 164448, 164456, 164465, 164474, 164484, 164493, 164503, 164513, + 164524, 164533, 164543, 164553, 164564, 164574, 164585, 164596, + 164608, 164613, 164619, 164625, 164632, 164638, 164645, 164652, + 164660, 164666, 164673, 164680, 164688, 164695, 164703, 164711, + 164720, 164726, 164733, 164740, 164748, 164755, 164763, 164771, + 164780, 164787, 164795, 164803, 164812, 164820, 164829, 164838, + 164848, 164854, 164861, 164868, 164876, 164883, 164891, 164899, + 164908, 164915, 164923, 164931, 164940, 164948, 164957, 164966, + 164976, 164983, 164991, 164999, 165008, 165016, 165025, 165034, + 165044, 165052, 165061, 165070, 165080, 165089, 165099, 165109, + 165120, 165126, 165133, 165140, 165148, 165155, 165163, 165171, + 165180, 165187, 165195, 165203, 165212, 165220, 165229, 165238, + 165248, 165255, 165263, 165271, 165280, 165288, 165297, 165306, + 165316, 165324, 165333, 165342, 165352, 165361, 165371, 165381, + 165392, 165399, 165407, 165415, 165424, 165432, 165441, 165450, + 165460, 165468, 165477, 165486, 165496, 165505, 165515, 165525, + 165536, 165544, 165553, 165562, 165572, 165581, 165591, 165601, + 165612, 165621, 165631, 165641, 165652, 165662, 165673, 165684, + 165696, 165702, 165709, 165716, 165724, 165731, 165739, 165747, + 165756, 165763, 165771, 165779, 165788, 165796, 165805, 165814, + 165824, 165831, 165839, 165847, 165856, 165864, 165873, 165882, + 165892, 165900, 165909, 165918, 165928, 165937, 165947, 165957, + 165968, 165975, 165983, 165991, 166000, 166008, 166017, 166026, + 166036, 166044, 166053, 166062, 166072, 166081, 166091, 166101, + 166112, 166120, 166129, 166138, 166148, 166157, 166167, 166177, + 166188, 166197, 166207, 166217, 166228, 166238, 166249, 166260, + 166272, 166279, 166287, 166295, 166304, 166312, 166321, 166330, + 166340, 166348, 166357, 166366, 166376, 166385, 166395, 166405, + 166416, 166424, 166433, 166442, 166452, 166461, 166471, 166481, + 166492, 166501, 166511, 166521, 166532, 166542, 166553, 166564, + 166576, 166584, 166593, 166602, 166612, 166621, 166631, 166641, + 166652, 166661, 166671, 166681, 166692, 166702, 166713, 166724, + 166736, 166745, 166755, 166765, 166776, 166786, 166797, 166808, + 166820, 166830, 166841, 166852, 166864, 166875, 166887, 166899, + 166912, 166916, 166921, 166926, 166932, 166937, 166943, 166949, + 166956, 166961, 166967, 166973, 166980, 166986, 166993, 167000, + 167008, 167013, 167019, 167025, 167032, 167038, 167045, 167052, + 167060, 167066, 167073, 167080, 167088, 167095, 167103, 167111, + 167120, 167125, 167131, 167137, 167144, 167150, 167157, 167164, + 167172, 167178, 167185, 167192, 167200, 167207, 167215, 167223, + 167232, 167238, 167245, 167252, 167260, 167267, 167275, 167283, + 167292, 167299, 167307, 167315, 167324, 167332, 167341, 167350, + 167360, 167365, 167371, 167377, 167384, 167390, 167397, 167404, + 167412, 167418, 167425, 167432, 167440, 167447, 167455, 167463, + 167472, 167478, 167485, 167492, 167500, 167507, 167515, 167523, + 167532, 167539, 167547, 167555, 167564, 167572, 167581, 167590, + 167600, 167606, 167613, 167620, 167628, 167635, 167643, 167651, + 167660, 167667, 167675, 167683, 167692, 167700, 167709, 167718, + 167728, 167735, 167743, 167751, 167760, 167768, 167777, 167786, + 167796, 167804, 167813, 167822, 167832, 167841, 167851, 167861, + 167872, 167877, 167883, 167889, 167896, 167902, 167909, 167916, + 167924, 167930, 167937, 167944, 167952, 167959, 167967, 167975, + 167984, 167990, 167997, 168004, 168012, 168019, 168027, 168035, + 168044, 168051, 168059, 168067, 168076, 168084, 168093, 168102, + 168112, 168118, 168125, 168132, 168140, 168147, 168155, 168163, + 168172, 168179, 168187, 168195, 168204, 168212, 168221, 168230, + 168240, 168247, 168255, 168263, 168272, 168280, 168289, 168298, + 168308, 168316, 168325, 168334, 168344, 168353, 168363, 168373, + 168384, 168390, 168397, 168404, 168412, 168419, 168427, 168435, + 168444, 168451, 168459, 168467, 168476, 168484, 168493, 168502, + 168512, 168519, 168527, 168535, 168544, 168552, 168561, 168570, + 168580, 168588, 168597, 168606, 168616, 168625, 168635, 168645, + 168656, 168663, 168671, 168679, 168688, 168696, 168705, 168714, + 168724, 168732, 168741, 168750, 168760, 168769, 168779, 168789, + 168800, 168808, 168817, 168826, 168836, 168845, 168855, 168865, + 168876, 168885, 168895, 168905, 168916, 168926, 168937, 168948, + 168960, 168965, 168971, 168977, 168984, 168990, 168997, 169004, + 169012, 169018, 169025, 169032, 169040, 169047, 169055, 169063, + 169072, 169078, 169085, 169092, 169100, 169107, 169115, 169123, + 169132, 169139, 169147, 169155, 169164, 169172, 169181, 169190, + 169200, 169206, 169213, 169220, 169228, 169235, 169243, 169251, + 169260, 169267, 169275, 169283, 169292, 169300, 169309, 169318, + 169328, 169335, 169343, 169351, 169360, 169368, 169377, 169386, + 169396, 169404, 169413, 169422, 169432, 169441, 169451, 169461, + 169472, 169478, 169485, 169492, 169500, 169507, 169515, 169523, + 169532, 169539, 169547, 169555, 169564, 169572, 169581, 169590, + 169600, 169607, 169615, 169623, 169632, 169640, 169649, 169658, + 169668, 169676, 169685, 169694, 169704, 169713, 169723, 169733, + 169744, 169751, 169759, 169767, 169776, 169784, 169793, 169802, + 169812, 169820, 169829, 169838, 169848, 169857, 169867, 169877, + 169888, 169896, 169905, 169914, 169924, 169933, 169943, 169953, + 169964, 169973, 169983, 169993, 170004, 170014, 170025, 170036, + 170048, 170054, 170061, 170068, 170076, 170083, 170091, 170099, + 170108, 170115, 170123, 170131, 170140, 170148, 170157, 170166, + 170176, 170183, 170191, 170199, 170208, 170216, 170225, 170234, + 170244, 170252, 170261, 170270, 170280, 170289, 170299, 170309, + 170320, 170327, 170335, 170343, 170352, 170360, 170369, 170378, + 170388, 170396, 170405, 170414, 170424, 170433, 170443, 170453, + 170464, 170472, 170481, 170490, 170500, 170509, 170519, 170529, + 170540, 170549, 170559, 170569, 170580, 170590, 170601, 170612, + 170624, 170631, 170639, 170647, 170656, 170664, 170673, 170682, + 170692, 170700, 170709, 170718, 170728, 170737, 170747, 170757, + 170768, 170776, 170785, 170794, 170804, 170813, 170823, 170833, + 170844, 170853, 170863, 170873, 170884, 170894, 170905, 170916, + 170928, 170936, 170945, 170954, 170964, 170973, 170983, 170993, + 171004, 171013, 171023, 171033, 171044, 171054, 171065, 171076, + 171088, 171097, 171107, 171117, 171128, 171138, 171149, 171160, + 171172, 171182, 171193, 171204, 171216, 171227, 171239, 171251, + 171264, 171269, 171275, 171281, 171288, 171294, 171301, 171308, + 171316, 171322, 171329, 171336, 171344, 171351, 171359, 171367, + 171376, 171382, 171389, 171396, 171404, 171411, 171419, 171427, + 171436, 171443, 171451, 171459, 171468, 171476, 171485, 171494, + 171504, 171510, 171517, 171524, 171532, 171539, 171547, 171555, + 171564, 171571, 171579, 171587, 171596, 171604, 171613, 171622, + 171632, 171639, 171647, 171655, 171664, 171672, 171681, 171690, + 171700, 171708, 171717, 171726, 171736, 171745, 171755, 171765, + 171776, 171782, 171789, 171796, 171804, 171811, 171819, 171827, + 171836, 171843, 171851, 171859, 171868, 171876, 171885, 171894, + 171904, 171911, 171919, 171927, 171936, 171944, 171953, 171962, + 171972, 171980, 171989, 171998, 172008, 172017, 172027, 172037, + 172048, 172055, 172063, 172071, 172080, 172088, 172097, 172106, + 172116, 172124, 172133, 172142, 172152, 172161, 172171, 172181, + 172192, 172200, 172209, 172218, 172228, 172237, 172247, 172257, + 172268, 172277, 172287, 172297, 172308, 172318, 172329, 172340, + 172352, 172358, 172365, 172372, 172380, 172387, 172395, 172403, + 172412, 172419, 172427, 172435, 172444, 172452, 172461, 172470, + 172480, 172487, 172495, 172503, 172512, 172520, 172529, 172538, + 172548, 172556, 172565, 172574, 172584, 172593, 172603, 172613, + 172624, 172631, 172639, 172647, 172656, 172664, 172673, 172682, + 172692, 172700, 172709, 172718, 172728, 172737, 172747, 172757, + 172768, 172776, 172785, 172794, 172804, 172813, 172823, 172833, + 172844, 172853, 172863, 172873, 172884, 172894, 172905, 172916, + 172928, 172935, 172943, 172951, 172960, 172968, 172977, 172986, + 172996, 173004, 173013, 173022, 173032, 173041, 173051, 173061, + 173072, 173080, 173089, 173098, 173108, 173117, 173127, 173137, + 173148, 173157, 173167, 173177, 173188, 173198, 173209, 173220, + 173232, 173240, 173249, 173258, 173268, 173277, 173287, 173297, + 173308, 173317, 173327, 173337, 173348, 173358, 173369, 173380, + 173392, 173401, 173411, 173421, 173432, 173442, 173453, 173464, + 173476, 173486, 173497, 173508, 173520, 173531, 173543, 173555, + 173568, 173574, 173581, 173588, 173596, 173603, 173611, 173619, + 173628, 173635, 173643, 173651, 173660, 173668, 173677, 173686, + 173696, 173703, 173711, 173719, 173728, 173736, 173745, 173754, + 173764, 173772, 173781, 173790, 173800, 173809, 173819, 173829, + 173840, 173847, 173855, 173863, 173872, 173880, 173889, 173898, + 173908, 173916, 173925, 173934, 173944, 173953, 173963, 173973, + 173984, 173992, 174001, 174010, 174020, 174029, 174039, 174049, + 174060, 174069, 174079, 174089, 174100, 174110, 174121, 174132, + 174144, 174151, 174159, 174167, 174176, 174184, 174193, 174202, + 174212, 174220, 174229, 174238, 174248, 174257, 174267, 174277, + 174288, 174296, 174305, 174314, 174324, 174333, 174343, 174353, + 174364, 174373, 174383, 174393, 174404, 174414, 174425, 174436, + 174448, 174456, 174465, 174474, 174484, 174493, 174503, 174513, + 174524, 174533, 174543, 174553, 174564, 174574, 174585, 174596, + 174608, 174617, 174627, 174637, 174648, 174658, 174669, 174680, + 174692, 174702, 174713, 174724, 174736, 174747, 174759, 174771, + 174784, 174791, 174799, 174807, 174816, 174824, 174833, 174842, + 174852, 174860, 174869, 174878, 174888, 174897, 174907, 174917, + 174928, 174936, 174945, 174954, 174964, 174973, 174983, 174993, + 175004, 175013, 175023, 175033, 175044, 175054, 175065, 175076, + 175088, 175096, 175105, 175114, 175124, 175133, 175143, 175153, + 175164, 175173, 175183, 175193, 175204, 175214, 175225, 175236, + 175248, 175257, 175267, 175277, 175288, 175298, 175309, 175320, + 175332, 175342, 175353, 175364, 175376, 175387, 175399, 175411, + 175424, 175432, 175441, 175450, 175460, 175469, 175479, 175489, + 175500, 175509, 175519, 175529, 175540, 175550, 175561, 175572, + 175584, 175593, 175603, 175613, 175624, 175634, 175645, 175656, + 175668, 175678, 175689, 175700, 175712, 175723, 175735, 175747, + 175760, 175769, 175779, 175789, 175800, 175810, 175821, 175832, + 175844, 175854, 175865, 175876, 175888, 175899, 175911, 175923, + 175936, 175946, 175957, 175968, 175980, 175991, 176003, 176015, + 176028, 176039, 176051, 176063, 176076, 176088, 176101, 176114, + 176128, 176130, 176133, 176136, 176140, 176143, 176147, 176151, + 176156, 176159, 176163, 176167, 176172, 176176, 176181, 176186, + 176192, 176195, 176199, 176203, 176208, 176212, 176217, 176222, + 176228, 176232, 176237, 176242, 176248, 176253, 176259, 176265, + 176272, 176275, 176279, 176283, 176288, 176292, 176297, 176302, + 176308, 176312, 176317, 176322, 176328, 176333, 176339, 176345, + 176352, 176356, 176361, 176366, 176372, 176377, 176383, 176389, + 176396, 176401, 176407, 176413, 176420, 176426, 176433, 176440, + 176448, 176451, 176455, 176459, 176464, 176468, 176473, 176478, + 176484, 176488, 176493, 176498, 176504, 176509, 176515, 176521, + 176528, 176532, 176537, 176542, 176548, 176553, 176559, 176565, + 176572, 176577, 176583, 176589, 176596, 176602, 176609, 176616, + 176624, 176628, 176633, 176638, 176644, 176649, 176655, 176661, + 176668, 176673, 176679, 176685, 176692, 176698, 176705, 176712, + 176720, 176725, 176731, 176737, 176744, 176750, 176757, 176764, + 176772, 176778, 176785, 176792, 176800, 176807, 176815, 176823, + 176832, 176835, 176839, 176843, 176848, 176852, 176857, 176862, + 176868, 176872, 176877, 176882, 176888, 176893, 176899, 176905, + 176912, 176916, 176921, 176926, 176932, 176937, 176943, 176949, + 176956, 176961, 176967, 176973, 176980, 176986, 176993, 177000, + 177008, 177012, 177017, 177022, 177028, 177033, 177039, 177045, + 177052, 177057, 177063, 177069, 177076, 177082, 177089, 177096, + 177104, 177109, 177115, 177121, 177128, 177134, 177141, 177148, + 177156, 177162, 177169, 177176, 177184, 177191, 177199, 177207, + 177216, 177220, 177225, 177230, 177236, 177241, 177247, 177253, + 177260, 177265, 177271, 177277, 177284, 177290, 177297, 177304, + 177312, 177317, 177323, 177329, 177336, 177342, 177349, 177356, + 177364, 177370, 177377, 177384, 177392, 177399, 177407, 177415, + 177424, 177429, 177435, 177441, 177448, 177454, 177461, 177468, + 177476, 177482, 177489, 177496, 177504, 177511, 177519, 177527, + 177536, 177542, 177549, 177556, 177564, 177571, 177579, 177587, + 177596, 177603, 177611, 177619, 177628, 177636, 177645, 177654, + 177664, 177667, 177671, 177675, 177680, 177684, 177689, 177694, + 177700, 177704, 177709, 177714, 177720, 177725, 177731, 177737, + 177744, 177748, 177753, 177758, 177764, 177769, 177775, 177781, + 177788, 177793, 177799, 177805, 177812, 177818, 177825, 177832, + 177840, 177844, 177849, 177854, 177860, 177865, 177871, 177877, + 177884, 177889, 177895, 177901, 177908, 177914, 177921, 177928, + 177936, 177941, 177947, 177953, 177960, 177966, 177973, 177980, + 177988, 177994, 178001, 178008, 178016, 178023, 178031, 178039, + 178048, 178052, 178057, 178062, 178068, 178073, 178079, 178085, + 178092, 178097, 178103, 178109, 178116, 178122, 178129, 178136, + 178144, 178149, 178155, 178161, 178168, 178174, 178181, 178188, + 178196, 178202, 178209, 178216, 178224, 178231, 178239, 178247, + 178256, 178261, 178267, 178273, 178280, 178286, 178293, 178300, + 178308, 178314, 178321, 178328, 178336, 178343, 178351, 178359, + 178368, 178374, 178381, 178388, 178396, 178403, 178411, 178419, + 178428, 178435, 178443, 178451, 178460, 178468, 178477, 178486, + 178496, 178500, 178505, 178510, 178516, 178521, 178527, 178533, + 178540, 178545, 178551, 178557, 178564, 178570, 178577, 178584, + 178592, 178597, 178603, 178609, 178616, 178622, 178629, 178636, + 178644, 178650, 178657, 178664, 178672, 178679, 178687, 178695, + 178704, 178709, 178715, 178721, 178728, 178734, 178741, 178748, + 178756, 178762, 178769, 178776, 178784, 178791, 178799, 178807, + 178816, 178822, 178829, 178836, 178844, 178851, 178859, 178867, + 178876, 178883, 178891, 178899, 178908, 178916, 178925, 178934, + 178944, 178949, 178955, 178961, 178968, 178974, 178981, 178988, + 178996, 179002, 179009, 179016, 179024, 179031, 179039, 179047, + 179056, 179062, 179069, 179076, 179084, 179091, 179099, 179107, + 179116, 179123, 179131, 179139, 179148, 179156, 179165, 179174, + 179184, 179190, 179197, 179204, 179212, 179219, 179227, 179235, + 179244, 179251, 179259, 179267, 179276, 179284, 179293, 179302, + 179312, 179319, 179327, 179335, 179344, 179352, 179361, 179370, + 179380, 179388, 179397, 179406, 179416, 179425, 179435, 179445, + 179456, 179459, 179463, 179467, 179472, 179476, 179481, 179486, + 179492, 179496, 179501, 179506, 179512, 179517, 179523, 179529, + 179536, 179540, 179545, 179550, 179556, 179561, 179567, 179573, + 179580, 179585, 179591, 179597, 179604, 179610, 179617, 179624, + 179632, 179636, 179641, 179646, 179652, 179657, 179663, 179669, + 179676, 179681, 179687, 179693, 179700, 179706, 179713, 179720, + 179728, 179733, 179739, 179745, 179752, 179758, 179765, 179772, + 179780, 179786, 179793, 179800, 179808, 179815, 179823, 179831, + 179840, 179844, 179849, 179854, 179860, 179865, 179871, 179877, + 179884, 179889, 179895, 179901, 179908, 179914, 179921, 179928, + 179936, 179941, 179947, 179953, 179960, 179966, 179973, 179980, + 179988, 179994, 180001, 180008, 180016, 180023, 180031, 180039, + 180048, 180053, 180059, 180065, 180072, 180078, 180085, 180092, + 180100, 180106, 180113, 180120, 180128, 180135, 180143, 180151, + 180160, 180166, 180173, 180180, 180188, 180195, 180203, 180211, + 180220, 180227, 180235, 180243, 180252, 180260, 180269, 180278, + 180288, 180292, 180297, 180302, 180308, 180313, 180319, 180325, + 180332, 180337, 180343, 180349, 180356, 180362, 180369, 180376, + 180384, 180389, 180395, 180401, 180408, 180414, 180421, 180428, + 180436, 180442, 180449, 180456, 180464, 180471, 180479, 180487, + 180496, 180501, 180507, 180513, 180520, 180526, 180533, 180540, + 180548, 180554, 180561, 180568, 180576, 180583, 180591, 180599, + 180608, 180614, 180621, 180628, 180636, 180643, 180651, 180659, + 180668, 180675, 180683, 180691, 180700, 180708, 180717, 180726, + 180736, 180741, 180747, 180753, 180760, 180766, 180773, 180780, + 180788, 180794, 180801, 180808, 180816, 180823, 180831, 180839, + 180848, 180854, 180861, 180868, 180876, 180883, 180891, 180899, + 180908, 180915, 180923, 180931, 180940, 180948, 180957, 180966, + 180976, 180982, 180989, 180996, 181004, 181011, 181019, 181027, + 181036, 181043, 181051, 181059, 181068, 181076, 181085, 181094, + 181104, 181111, 181119, 181127, 181136, 181144, 181153, 181162, + 181172, 181180, 181189, 181198, 181208, 181217, 181227, 181237, + 181248, 181252, 181257, 181262, 181268, 181273, 181279, 181285, + 181292, 181297, 181303, 181309, 181316, 181322, 181329, 181336, + 181344, 181349, 181355, 181361, 181368, 181374, 181381, 181388, + 181396, 181402, 181409, 181416, 181424, 181431, 181439, 181447, + 181456, 181461, 181467, 181473, 181480, 181486, 181493, 181500, + 181508, 181514, 181521, 181528, 181536, 181543, 181551, 181559, + 181568, 181574, 181581, 181588, 181596, 181603, 181611, 181619, + 181628, 181635, 181643, 181651, 181660, 181668, 181677, 181686, + 181696, 181701, 181707, 181713, 181720, 181726, 181733, 181740, + 181748, 181754, 181761, 181768, 181776, 181783, 181791, 181799, + 181808, 181814, 181821, 181828, 181836, 181843, 181851, 181859, + 181868, 181875, 181883, 181891, 181900, 181908, 181917, 181926, + 181936, 181942, 181949, 181956, 181964, 181971, 181979, 181987, + 181996, 182003, 182011, 182019, 182028, 182036, 182045, 182054, + 182064, 182071, 182079, 182087, 182096, 182104, 182113, 182122, + 182132, 182140, 182149, 182158, 182168, 182177, 182187, 182197, + 182208, 182213, 182219, 182225, 182232, 182238, 182245, 182252, + 182260, 182266, 182273, 182280, 182288, 182295, 182303, 182311, + 182320, 182326, 182333, 182340, 182348, 182355, 182363, 182371, + 182380, 182387, 182395, 182403, 182412, 182420, 182429, 182438, + 182448, 182454, 182461, 182468, 182476, 182483, 182491, 182499, + 182508, 182515, 182523, 182531, 182540, 182548, 182557, 182566, + 182576, 182583, 182591, 182599, 182608, 182616, 182625, 182634, + 182644, 182652, 182661, 182670, 182680, 182689, 182699, 182709, + 182720, 182726, 182733, 182740, 182748, 182755, 182763, 182771, + 182780, 182787, 182795, 182803, 182812, 182820, 182829, 182838, + 182848, 182855, 182863, 182871, 182880, 182888, 182897, 182906, + 182916, 182924, 182933, 182942, 182952, 182961, 182971, 182981, + 182992, 182999, 183007, 183015, 183024, 183032, 183041, 183050, + 183060, 183068, 183077, 183086, 183096, 183105, 183115, 183125, + 183136, 183144, 183153, 183162, 183172, 183181, 183191, 183201, + 183212, 183221, 183231, 183241, 183252, 183262, 183273, 183284, + 183296, 183299, 183303, 183307, 183312, 183316, 183321, 183326, + 183332, 183336, 183341, 183346, 183352, 183357, 183363, 183369, + 183376, 183380, 183385, 183390, 183396, 183401, 183407, 183413, + 183420, 183425, 183431, 183437, 183444, 183450, 183457, 183464, + 183472, 183476, 183481, 183486, 183492, 183497, 183503, 183509, + 183516, 183521, 183527, 183533, 183540, 183546, 183553, 183560, + 183568, 183573, 183579, 183585, 183592, 183598, 183605, 183612, + 183620, 183626, 183633, 183640, 183648, 183655, 183663, 183671, + 183680, 183684, 183689, 183694, 183700, 183705, 183711, 183717, + 183724, 183729, 183735, 183741, 183748, 183754, 183761, 183768, + 183776, 183781, 183787, 183793, 183800, 183806, 183813, 183820, + 183828, 183834, 183841, 183848, 183856, 183863, 183871, 183879, + 183888, 183893, 183899, 183905, 183912, 183918, 183925, 183932, + 183940, 183946, 183953, 183960, 183968, 183975, 183983, 183991, + 184000, 184006, 184013, 184020, 184028, 184035, 184043, 184051, + 184060, 184067, 184075, 184083, 184092, 184100, 184109, 184118, + 184128, 184132, 184137, 184142, 184148, 184153, 184159, 184165, + 184172, 184177, 184183, 184189, 184196, 184202, 184209, 184216, + 184224, 184229, 184235, 184241, 184248, 184254, 184261, 184268, + 184276, 184282, 184289, 184296, 184304, 184311, 184319, 184327, + 184336, 184341, 184347, 184353, 184360, 184366, 184373, 184380, + 184388, 184394, 184401, 184408, 184416, 184423, 184431, 184439, + 184448, 184454, 184461, 184468, 184476, 184483, 184491, 184499, + 184508, 184515, 184523, 184531, 184540, 184548, 184557, 184566, + 184576, 184581, 184587, 184593, 184600, 184606, 184613, 184620, + 184628, 184634, 184641, 184648, 184656, 184663, 184671, 184679, + 184688, 184694, 184701, 184708, 184716, 184723, 184731, 184739, + 184748, 184755, 184763, 184771, 184780, 184788, 184797, 184806, + 184816, 184822, 184829, 184836, 184844, 184851, 184859, 184867, + 184876, 184883, 184891, 184899, 184908, 184916, 184925, 184934, + 184944, 184951, 184959, 184967, 184976, 184984, 184993, 185002, + 185012, 185020, 185029, 185038, 185048, 185057, 185067, 185077, + 185088, 185092, 185097, 185102, 185108, 185113, 185119, 185125, + 185132, 185137, 185143, 185149, 185156, 185162, 185169, 185176, + 185184, 185189, 185195, 185201, 185208, 185214, 185221, 185228, + 185236, 185242, 185249, 185256, 185264, 185271, 185279, 185287, + 185296, 185301, 185307, 185313, 185320, 185326, 185333, 185340, + 185348, 185354, 185361, 185368, 185376, 185383, 185391, 185399, + 185408, 185414, 185421, 185428, 185436, 185443, 185451, 185459, + 185468, 185475, 185483, 185491, 185500, 185508, 185517, 185526, + 185536, 185541, 185547, 185553, 185560, 185566, 185573, 185580, + 185588, 185594, 185601, 185608, 185616, 185623, 185631, 185639, + 185648, 185654, 185661, 185668, 185676, 185683, 185691, 185699, + 185708, 185715, 185723, 185731, 185740, 185748, 185757, 185766, + 185776, 185782, 185789, 185796, 185804, 185811, 185819, 185827, + 185836, 185843, 185851, 185859, 185868, 185876, 185885, 185894, + 185904, 185911, 185919, 185927, 185936, 185944, 185953, 185962, + 185972, 185980, 185989, 185998, 186008, 186017, 186027, 186037, + 186048, 186053, 186059, 186065, 186072, 186078, 186085, 186092, + 186100, 186106, 186113, 186120, 186128, 186135, 186143, 186151, + 186160, 186166, 186173, 186180, 186188, 186195, 186203, 186211, + 186220, 186227, 186235, 186243, 186252, 186260, 186269, 186278, + 186288, 186294, 186301, 186308, 186316, 186323, 186331, 186339, + 186348, 186355, 186363, 186371, 186380, 186388, 186397, 186406, + 186416, 186423, 186431, 186439, 186448, 186456, 186465, 186474, + 186484, 186492, 186501, 186510, 186520, 186529, 186539, 186549, + 186560, 186566, 186573, 186580, 186588, 186595, 186603, 186611, + 186620, 186627, 186635, 186643, 186652, 186660, 186669, 186678, + 186688, 186695, 186703, 186711, 186720, 186728, 186737, 186746, + 186756, 186764, 186773, 186782, 186792, 186801, 186811, 186821, + 186832, 186839, 186847, 186855, 186864, 186872, 186881, 186890, + 186900, 186908, 186917, 186926, 186936, 186945, 186955, 186965, + 186976, 186984, 186993, 187002, 187012, 187021, 187031, 187041, + 187052, 187061, 187071, 187081, 187092, 187102, 187113, 187124, + 187136, 187140, 187145, 187150, 187156, 187161, 187167, 187173, + 187180, 187185, 187191, 187197, 187204, 187210, 187217, 187224, + 187232, 187237, 187243, 187249, 187256, 187262, 187269, 187276, + 187284, 187290, 187297, 187304, 187312, 187319, 187327, 187335, + 187344, 187349, 187355, 187361, 187368, 187374, 187381, 187388, + 187396, 187402, 187409, 187416, 187424, 187431, 187439, 187447, + 187456, 187462, 187469, 187476, 187484, 187491, 187499, 187507, + 187516, 187523, 187531, 187539, 187548, 187556, 187565, 187574, + 187584, 187589, 187595, 187601, 187608, 187614, 187621, 187628, + 187636, 187642, 187649, 187656, 187664, 187671, 187679, 187687, + 187696, 187702, 187709, 187716, 187724, 187731, 187739, 187747, + 187756, 187763, 187771, 187779, 187788, 187796, 187805, 187814, + 187824, 187830, 187837, 187844, 187852, 187859, 187867, 187875, + 187884, 187891, 187899, 187907, 187916, 187924, 187933, 187942, + 187952, 187959, 187967, 187975, 187984, 187992, 188001, 188010, + 188020, 188028, 188037, 188046, 188056, 188065, 188075, 188085, + 188096, 188101, 188107, 188113, 188120, 188126, 188133, 188140, + 188148, 188154, 188161, 188168, 188176, 188183, 188191, 188199, + 188208, 188214, 188221, 188228, 188236, 188243, 188251, 188259, + 188268, 188275, 188283, 188291, 188300, 188308, 188317, 188326, + 188336, 188342, 188349, 188356, 188364, 188371, 188379, 188387, + 188396, 188403, 188411, 188419, 188428, 188436, 188445, 188454, + 188464, 188471, 188479, 188487, 188496, 188504, 188513, 188522, + 188532, 188540, 188549, 188558, 188568, 188577, 188587, 188597, + 188608, 188614, 188621, 188628, 188636, 188643, 188651, 188659, + 188668, 188675, 188683, 188691, 188700, 188708, 188717, 188726, + 188736, 188743, 188751, 188759, 188768, 188776, 188785, 188794, + 188804, 188812, 188821, 188830, 188840, 188849, 188859, 188869, + 188880, 188887, 188895, 188903, 188912, 188920, 188929, 188938, + 188948, 188956, 188965, 188974, 188984, 188993, 189003, 189013, + 189024, 189032, 189041, 189050, 189060, 189069, 189079, 189089, + 189100, 189109, 189119, 189129, 189140, 189150, 189161, 189172, + 189184, 189189, 189195, 189201, 189208, 189214, 189221, 189228, + 189236, 189242, 189249, 189256, 189264, 189271, 189279, 189287, + 189296, 189302, 189309, 189316, 189324, 189331, 189339, 189347, + 189356, 189363, 189371, 189379, 189388, 189396, 189405, 189414, + 189424, 189430, 189437, 189444, 189452, 189459, 189467, 189475, + 189484, 189491, 189499, 189507, 189516, 189524, 189533, 189542, + 189552, 189559, 189567, 189575, 189584, 189592, 189601, 189610, + 189620, 189628, 189637, 189646, 189656, 189665, 189675, 189685, + 189696, 189702, 189709, 189716, 189724, 189731, 189739, 189747, + 189756, 189763, 189771, 189779, 189788, 189796, 189805, 189814, + 189824, 189831, 189839, 189847, 189856, 189864, 189873, 189882, + 189892, 189900, 189909, 189918, 189928, 189937, 189947, 189957, + 189968, 189975, 189983, 189991, 190000, 190008, 190017, 190026, + 190036, 190044, 190053, 190062, 190072, 190081, 190091, 190101, + 190112, 190120, 190129, 190138, 190148, 190157, 190167, 190177, + 190188, 190197, 190207, 190217, 190228, 190238, 190249, 190260, + 190272, 190278, 190285, 190292, 190300, 190307, 190315, 190323, + 190332, 190339, 190347, 190355, 190364, 190372, 190381, 190390, + 190400, 190407, 190415, 190423, 190432, 190440, 190449, 190458, + 190468, 190476, 190485, 190494, 190504, 190513, 190523, 190533, + 190544, 190551, 190559, 190567, 190576, 190584, 190593, 190602, + 190612, 190620, 190629, 190638, 190648, 190657, 190667, 190677, + 190688, 190696, 190705, 190714, 190724, 190733, 190743, 190753, + 190764, 190773, 190783, 190793, 190804, 190814, 190825, 190836, + 190848, 190855, 190863, 190871, 190880, 190888, 190897, 190906, + 190916, 190924, 190933, 190942, 190952, 190961, 190971, 190981, + 190992, 191000, 191009, 191018, 191028, 191037, 191047, 191057, + 191068, 191077, 191087, 191097, 191108, 191118, 191129, 191140, + 191152, 191160, 191169, 191178, 191188, 191197, 191207, 191217, + 191228, 191237, 191247, 191257, 191268, 191278, 191289, 191300, + 191312, 191321, 191331, 191341, 191352, 191362, 191373, 191384, + 191396, 191406, 191417, 191428, 191440, 191451, 191463, 191475, + 191488, 191491, 191495, 191499, 191504, 191508, 191513, 191518, + 191524, 191528, 191533, 191538, 191544, 191549, 191555, 191561, + 191568, 191572, 191577, 191582, 191588, 191593, 191599, 191605, + 191612, 191617, 191623, 191629, 191636, 191642, 191649, 191656, + 191664, 191668, 191673, 191678, 191684, 191689, 191695, 191701, + 191708, 191713, 191719, 191725, 191732, 191738, 191745, 191752, + 191760, 191765, 191771, 191777, 191784, 191790, 191797, 191804, + 191812, 191818, 191825, 191832, 191840, 191847, 191855, 191863, + 191872, 191876, 191881, 191886, 191892, 191897, 191903, 191909, + 191916, 191921, 191927, 191933, 191940, 191946, 191953, 191960, + 191968, 191973, 191979, 191985, 191992, 191998, 192005, 192012, + 192020, 192026, 192033, 192040, 192048, 192055, 192063, 192071, + 192080, 192085, 192091, 192097, 192104, 192110, 192117, 192124, + 192132, 192138, 192145, 192152, 192160, 192167, 192175, 192183, + 192192, 192198, 192205, 192212, 192220, 192227, 192235, 192243, + 192252, 192259, 192267, 192275, 192284, 192292, 192301, 192310, + 192320, 192324, 192329, 192334, 192340, 192345, 192351, 192357, + 192364, 192369, 192375, 192381, 192388, 192394, 192401, 192408, + 192416, 192421, 192427, 192433, 192440, 192446, 192453, 192460, + 192468, 192474, 192481, 192488, 192496, 192503, 192511, 192519, + 192528, 192533, 192539, 192545, 192552, 192558, 192565, 192572, + 192580, 192586, 192593, 192600, 192608, 192615, 192623, 192631, + 192640, 192646, 192653, 192660, 192668, 192675, 192683, 192691, + 192700, 192707, 192715, 192723, 192732, 192740, 192749, 192758, + 192768, 192773, 192779, 192785, 192792, 192798, 192805, 192812, + 192820, 192826, 192833, 192840, 192848, 192855, 192863, 192871, + 192880, 192886, 192893, 192900, 192908, 192915, 192923, 192931, + 192940, 192947, 192955, 192963, 192972, 192980, 192989, 192998, + 193008, 193014, 193021, 193028, 193036, 193043, 193051, 193059, + 193068, 193075, 193083, 193091, 193100, 193108, 193117, 193126, + 193136, 193143, 193151, 193159, 193168, 193176, 193185, 193194, + 193204, 193212, 193221, 193230, 193240, 193249, 193259, 193269, + 193280, 193284, 193289, 193294, 193300, 193305, 193311, 193317, + 193324, 193329, 193335, 193341, 193348, 193354, 193361, 193368, + 193376, 193381, 193387, 193393, 193400, 193406, 193413, 193420, + 193428, 193434, 193441, 193448, 193456, 193463, 193471, 193479, + 193488, 193493, 193499, 193505, 193512, 193518, 193525, 193532, + 193540, 193546, 193553, 193560, 193568, 193575, 193583, 193591, + 193600, 193606, 193613, 193620, 193628, 193635, 193643, 193651, + 193660, 193667, 193675, 193683, 193692, 193700, 193709, 193718, + 193728, 193733, 193739, 193745, 193752, 193758, 193765, 193772, + 193780, 193786, 193793, 193800, 193808, 193815, 193823, 193831, + 193840, 193846, 193853, 193860, 193868, 193875, 193883, 193891, + 193900, 193907, 193915, 193923, 193932, 193940, 193949, 193958, + 193968, 193974, 193981, 193988, 193996, 194003, 194011, 194019, + 194028, 194035, 194043, 194051, 194060, 194068, 194077, 194086, + 194096, 194103, 194111, 194119, 194128, 194136, 194145, 194154, + 194164, 194172, 194181, 194190, 194200, 194209, 194219, 194229, + 194240, 194245, 194251, 194257, 194264, 194270, 194277, 194284, + 194292, 194298, 194305, 194312, 194320, 194327, 194335, 194343, + 194352, 194358, 194365, 194372, 194380, 194387, 194395, 194403, + 194412, 194419, 194427, 194435, 194444, 194452, 194461, 194470, + 194480, 194486, 194493, 194500, 194508, 194515, 194523, 194531, + 194540, 194547, 194555, 194563, 194572, 194580, 194589, 194598, + 194608, 194615, 194623, 194631, 194640, 194648, 194657, 194666, + 194676, 194684, 194693, 194702, 194712, 194721, 194731, 194741, + 194752, 194758, 194765, 194772, 194780, 194787, 194795, 194803, + 194812, 194819, 194827, 194835, 194844, 194852, 194861, 194870, + 194880, 194887, 194895, 194903, 194912, 194920, 194929, 194938, + 194948, 194956, 194965, 194974, 194984, 194993, 195003, 195013, + 195024, 195031, 195039, 195047, 195056, 195064, 195073, 195082, + 195092, 195100, 195109, 195118, 195128, 195137, 195147, 195157, + 195168, 195176, 195185, 195194, 195204, 195213, 195223, 195233, + 195244, 195253, 195263, 195273, 195284, 195294, 195305, 195316, + 195328, 195332, 195337, 195342, 195348, 195353, 195359, 195365, + 195372, 195377, 195383, 195389, 195396, 195402, 195409, 195416, + 195424, 195429, 195435, 195441, 195448, 195454, 195461, 195468, + 195476, 195482, 195489, 195496, 195504, 195511, 195519, 195527, + 195536, 195541, 195547, 195553, 195560, 195566, 195573, 195580, + 195588, 195594, 195601, 195608, 195616, 195623, 195631, 195639, + 195648, 195654, 195661, 195668, 195676, 195683, 195691, 195699, + 195708, 195715, 195723, 195731, 195740, 195748, 195757, 195766, + 195776, 195781, 195787, 195793, 195800, 195806, 195813, 195820, + 195828, 195834, 195841, 195848, 195856, 195863, 195871, 195879, + 195888, 195894, 195901, 195908, 195916, 195923, 195931, 195939, + 195948, 195955, 195963, 195971, 195980, 195988, 195997, 196006, + 196016, 196022, 196029, 196036, 196044, 196051, 196059, 196067, + 196076, 196083, 196091, 196099, 196108, 196116, 196125, 196134, + 196144, 196151, 196159, 196167, 196176, 196184, 196193, 196202, + 196212, 196220, 196229, 196238, 196248, 196257, 196267, 196277, + 196288, 196293, 196299, 196305, 196312, 196318, 196325, 196332, + 196340, 196346, 196353, 196360, 196368, 196375, 196383, 196391, + 196400, 196406, 196413, 196420, 196428, 196435, 196443, 196451, + 196460, 196467, 196475, 196483, 196492, 196500, 196509, 196518, + 196528, 196534, 196541, 196548, 196556, 196563, 196571, 196579, + 196588, 196595, 196603, 196611, 196620, 196628, 196637, 196646, + 196656, 196663, 196671, 196679, 196688, 196696, 196705, 196714, + 196724, 196732, 196741, 196750, 196760, 196769, 196779, 196789, + 196800, 196806, 196813, 196820, 196828, 196835, 196843, 196851, + 196860, 196867, 196875, 196883, 196892, 196900, 196909, 196918, + 196928, 196935, 196943, 196951, 196960, 196968, 196977, 196986, + 196996, 197004, 197013, 197022, 197032, 197041, 197051, 197061, + 197072, 197079, 197087, 197095, 197104, 197112, 197121, 197130, + 197140, 197148, 197157, 197166, 197176, 197185, 197195, 197205, + 197216, 197224, 197233, 197242, 197252, 197261, 197271, 197281, + 197292, 197301, 197311, 197321, 197332, 197342, 197353, 197364, + 197376, 197381, 197387, 197393, 197400, 197406, 197413, 197420, + 197428, 197434, 197441, 197448, 197456, 197463, 197471, 197479, + 197488, 197494, 197501, 197508, 197516, 197523, 197531, 197539, + 197548, 197555, 197563, 197571, 197580, 197588, 197597, 197606, + 197616, 197622, 197629, 197636, 197644, 197651, 197659, 197667, + 197676, 197683, 197691, 197699, 197708, 197716, 197725, 197734, + 197744, 197751, 197759, 197767, 197776, 197784, 197793, 197802, + 197812, 197820, 197829, 197838, 197848, 197857, 197867, 197877, + 197888, 197894, 197901, 197908, 197916, 197923, 197931, 197939, + 197948, 197955, 197963, 197971, 197980, 197988, 197997, 198006, + 198016, 198023, 198031, 198039, 198048, 198056, 198065, 198074, + 198084, 198092, 198101, 198110, 198120, 198129, 198139, 198149, + 198160, 198167, 198175, 198183, 198192, 198200, 198209, 198218, + 198228, 198236, 198245, 198254, 198264, 198273, 198283, 198293, + 198304, 198312, 198321, 198330, 198340, 198349, 198359, 198369, + 198380, 198389, 198399, 198409, 198420, 198430, 198441, 198452, + 198464, 198470, 198477, 198484, 198492, 198499, 198507, 198515, + 198524, 198531, 198539, 198547, 198556, 198564, 198573, 198582, + 198592, 198599, 198607, 198615, 198624, 198632, 198641, 198650, + 198660, 198668, 198677, 198686, 198696, 198705, 198715, 198725, + 198736, 198743, 198751, 198759, 198768, 198776, 198785, 198794, + 198804, 198812, 198821, 198830, 198840, 198849, 198859, 198869, + 198880, 198888, 198897, 198906, 198916, 198925, 198935, 198945, + 198956, 198965, 198975, 198985, 198996, 199006, 199017, 199028, + 199040, 199047, 199055, 199063, 199072, 199080, 199089, 199098, + 199108, 199116, 199125, 199134, 199144, 199153, 199163, 199173, + 199184, 199192, 199201, 199210, 199220, 199229, 199239, 199249, + 199260, 199269, 199279, 199289, 199300, 199310, 199321, 199332, + 199344, 199352, 199361, 199370, 199380, 199389, 199399, 199409, + 199420, 199429, 199439, 199449, 199460, 199470, 199481, 199492, + 199504, 199513, 199523, 199533, 199544, 199554, 199565, 199576, + 199588, 199598, 199609, 199620, 199632, 199643, 199655, 199667, + 199680, 199684, 199689, 199694, 199700, 199705, 199711, 199717, + 199724, 199729, 199735, 199741, 199748, 199754, 199761, 199768, + 199776, 199781, 199787, 199793, 199800, 199806, 199813, 199820, + 199828, 199834, 199841, 199848, 199856, 199863, 199871, 199879, + 199888, 199893, 199899, 199905, 199912, 199918, 199925, 199932, + 199940, 199946, 199953, 199960, 199968, 199975, 199983, 199991, + 200000, 200006, 200013, 200020, 200028, 200035, 200043, 200051, + 200060, 200067, 200075, 200083, 200092, 200100, 200109, 200118, + 200128, 200133, 200139, 200145, 200152, 200158, 200165, 200172, + 200180, 200186, 200193, 200200, 200208, 200215, 200223, 200231, + 200240, 200246, 200253, 200260, 200268, 200275, 200283, 200291, + 200300, 200307, 200315, 200323, 200332, 200340, 200349, 200358, + 200368, 200374, 200381, 200388, 200396, 200403, 200411, 200419, + 200428, 200435, 200443, 200451, 200460, 200468, 200477, 200486, + 200496, 200503, 200511, 200519, 200528, 200536, 200545, 200554, + 200564, 200572, 200581, 200590, 200600, 200609, 200619, 200629, + 200640, 200645, 200651, 200657, 200664, 200670, 200677, 200684, + 200692, 200698, 200705, 200712, 200720, 200727, 200735, 200743, + 200752, 200758, 200765, 200772, 200780, 200787, 200795, 200803, + 200812, 200819, 200827, 200835, 200844, 200852, 200861, 200870, + 200880, 200886, 200893, 200900, 200908, 200915, 200923, 200931, + 200940, 200947, 200955, 200963, 200972, 200980, 200989, 200998, + 201008, 201015, 201023, 201031, 201040, 201048, 201057, 201066, + 201076, 201084, 201093, 201102, 201112, 201121, 201131, 201141, + 201152, 201158, 201165, 201172, 201180, 201187, 201195, 201203, + 201212, 201219, 201227, 201235, 201244, 201252, 201261, 201270, + 201280, 201287, 201295, 201303, 201312, 201320, 201329, 201338, + 201348, 201356, 201365, 201374, 201384, 201393, 201403, 201413, + 201424, 201431, 201439, 201447, 201456, 201464, 201473, 201482, + 201492, 201500, 201509, 201518, 201528, 201537, 201547, 201557, + 201568, 201576, 201585, 201594, 201604, 201613, 201623, 201633, + 201644, 201653, 201663, 201673, 201684, 201694, 201705, 201716, + 201728, 201733, 201739, 201745, 201752, 201758, 201765, 201772, + 201780, 201786, 201793, 201800, 201808, 201815, 201823, 201831, + 201840, 201846, 201853, 201860, 201868, 201875, 201883, 201891, + 201900, 201907, 201915, 201923, 201932, 201940, 201949, 201958, + 201968, 201974, 201981, 201988, 201996, 202003, 202011, 202019, + 202028, 202035, 202043, 202051, 202060, 202068, 202077, 202086, + 202096, 202103, 202111, 202119, 202128, 202136, 202145, 202154, + 202164, 202172, 202181, 202190, 202200, 202209, 202219, 202229, + 202240, 202246, 202253, 202260, 202268, 202275, 202283, 202291, + 202300, 202307, 202315, 202323, 202332, 202340, 202349, 202358, + 202368, 202375, 202383, 202391, 202400, 202408, 202417, 202426, + 202436, 202444, 202453, 202462, 202472, 202481, 202491, 202501, + 202512, 202519, 202527, 202535, 202544, 202552, 202561, 202570, + 202580, 202588, 202597, 202606, 202616, 202625, 202635, 202645, + 202656, 202664, 202673, 202682, 202692, 202701, 202711, 202721, + 202732, 202741, 202751, 202761, 202772, 202782, 202793, 202804, + 202816, 202822, 202829, 202836, 202844, 202851, 202859, 202867, + 202876, 202883, 202891, 202899, 202908, 202916, 202925, 202934, + 202944, 202951, 202959, 202967, 202976, 202984, 202993, 203002, + 203012, 203020, 203029, 203038, 203048, 203057, 203067, 203077, + 203088, 203095, 203103, 203111, 203120, 203128, 203137, 203146, + 203156, 203164, 203173, 203182, 203192, 203201, 203211, 203221, + 203232, 203240, 203249, 203258, 203268, 203277, 203287, 203297, + 203308, 203317, 203327, 203337, 203348, 203358, 203369, 203380, + 203392, 203399, 203407, 203415, 203424, 203432, 203441, 203450, + 203460, 203468, 203477, 203486, 203496, 203505, 203515, 203525, + 203536, 203544, 203553, 203562, 203572, 203581, 203591, 203601, + 203612, 203621, 203631, 203641, 203652, 203662, 203673, 203684, + 203696, 203704, 203713, 203722, 203732, 203741, 203751, 203761, + 203772, 203781, 203791, 203801, 203812, 203822, 203833, 203844, + 203856, 203865, 203875, 203885, 203896, 203906, 203917, 203928, + 203940, 203950, 203961, 203972, 203984, 203995, 204007, 204019, + 204032, 204037, 204043, 204049, 204056, 204062, 204069, 204076, + 204084, 204090, 204097, 204104, 204112, 204119, 204127, 204135, + 204144, 204150, 204157, 204164, 204172, 204179, 204187, 204195, + 204204, 204211, 204219, 204227, 204236, 204244, 204253, 204262, + 204272, 204278, 204285, 204292, 204300, 204307, 204315, 204323, + 204332, 204339, 204347, 204355, 204364, 204372, 204381, 204390, + 204400, 204407, 204415, 204423, 204432, 204440, 204449, 204458, + 204468, 204476, 204485, 204494, 204504, 204513, 204523, 204533, + 204544, 204550, 204557, 204564, 204572, 204579, 204587, 204595, + 204604, 204611, 204619, 204627, 204636, 204644, 204653, 204662, + 204672, 204679, 204687, 204695, 204704, 204712, 204721, 204730, + 204740, 204748, 204757, 204766, 204776, 204785, 204795, 204805, + 204816, 204823, 204831, 204839, 204848, 204856, 204865, 204874, + 204884, 204892, 204901, 204910, 204920, 204929, 204939, 204949, + 204960, 204968, 204977, 204986, 204996, 205005, 205015, 205025, + 205036, 205045, 205055, 205065, 205076, 205086, 205097, 205108, + 205120, 205126, 205133, 205140, 205148, 205155, 205163, 205171, + 205180, 205187, 205195, 205203, 205212, 205220, 205229, 205238, + 205248, 205255, 205263, 205271, 205280, 205288, 205297, 205306, + 205316, 205324, 205333, 205342, 205352, 205361, 205371, 205381, + 205392, 205399, 205407, 205415, 205424, 205432, 205441, 205450, + 205460, 205468, 205477, 205486, 205496, 205505, 205515, 205525, + 205536, 205544, 205553, 205562, 205572, 205581, 205591, 205601, + 205612, 205621, 205631, 205641, 205652, 205662, 205673, 205684, + 205696, 205703, 205711, 205719, 205728, 205736, 205745, 205754, + 205764, 205772, 205781, 205790, 205800, 205809, 205819, 205829, + 205840, 205848, 205857, 205866, 205876, 205885, 205895, 205905, + 205916, 205925, 205935, 205945, 205956, 205966, 205977, 205988, + 206000, 206008, 206017, 206026, 206036, 206045, 206055, 206065, + 206076, 206085, 206095, 206105, 206116, 206126, 206137, 206148, + 206160, 206169, 206179, 206189, 206200, 206210, 206221, 206232, + 206244, 206254, 206265, 206276, 206288, 206299, 206311, 206323, + 206336, 206342, 206349, 206356, 206364, 206371, 206379, 206387, + 206396, 206403, 206411, 206419, 206428, 206436, 206445, 206454, + 206464, 206471, 206479, 206487, 206496, 206504, 206513, 206522, + 206532, 206540, 206549, 206558, 206568, 206577, 206587, 206597, + 206608, 206615, 206623, 206631, 206640, 206648, 206657, 206666, + 206676, 206684, 206693, 206702, 206712, 206721, 206731, 206741, + 206752, 206760, 206769, 206778, 206788, 206797, 206807, 206817, + 206828, 206837, 206847, 206857, 206868, 206878, 206889, 206900, + 206912, 206919, 206927, 206935, 206944, 206952, 206961, 206970, + 206980, 206988, 206997, 207006, 207016, 207025, 207035, 207045, + 207056, 207064, 207073, 207082, 207092, 207101, 207111, 207121, + 207132, 207141, 207151, 207161, 207172, 207182, 207193, 207204, + 207216, 207224, 207233, 207242, 207252, 207261, 207271, 207281, + 207292, 207301, 207311, 207321, 207332, 207342, 207353, 207364, + 207376, 207385, 207395, 207405, 207416, 207426, 207437, 207448, + 207460, 207470, 207481, 207492, 207504, 207515, 207527, 207539, + 207552, 207559, 207567, 207575, 207584, 207592, 207601, 207610, + 207620, 207628, 207637, 207646, 207656, 207665, 207675, 207685, + 207696, 207704, 207713, 207722, 207732, 207741, 207751, 207761, + 207772, 207781, 207791, 207801, 207812, 207822, 207833, 207844, + 207856, 207864, 207873, 207882, 207892, 207901, 207911, 207921, + 207932, 207941, 207951, 207961, 207972, 207982, 207993, 208004, + 208016, 208025, 208035, 208045, 208056, 208066, 208077, 208088, + 208100, 208110, 208121, 208132, 208144, 208155, 208167, 208179, + 208192, 208200, 208209, 208218, 208228, 208237, 208247, 208257, + 208268, 208277, 208287, 208297, 208308, 208318, 208329, 208340, + 208352, 208361, 208371, 208381, 208392, 208402, 208413, 208424, + 208436, 208446, 208457, 208468, 208480, 208491, 208503, 208515, + 208528, 208537, 208547, 208557, 208568, 208578, 208589, 208600, + 208612, 208622, 208633, 208644, 208656, 208667, 208679, 208691, + 208704, 208714, 208725, 208736, 208748, 208759, 208771, 208783, + 208796, 208807, 208819, 208831, 208844, 208856, 208869, 208882, + 208896, 208899, 208903, 208907, 208912, 208916, 208921, 208926, + 208932, 208936, 208941, 208946, 208952, 208957, 208963, 208969, + 208976, 208980, 208985, 208990, 208996, 209001, 209007, 209013, + 209020, 209025, 209031, 209037, 209044, 209050, 209057, 209064, + 209072, 209076, 209081, 209086, 209092, 209097, 209103, 209109, + 209116, 209121, 209127, 209133, 209140, 209146, 209153, 209160, + 209168, 209173, 209179, 209185, 209192, 209198, 209205, 209212, + 209220, 209226, 209233, 209240, 209248, 209255, 209263, 209271, + 209280, 209284, 209289, 209294, 209300, 209305, 209311, 209317, + 209324, 209329, 209335, 209341, 209348, 209354, 209361, 209368, + 209376, 209381, 209387, 209393, 209400, 209406, 209413, 209420, + 209428, 209434, 209441, 209448, 209456, 209463, 209471, 209479, + 209488, 209493, 209499, 209505, 209512, 209518, 209525, 209532, + 209540, 209546, 209553, 209560, 209568, 209575, 209583, 209591, + 209600, 209606, 209613, 209620, 209628, 209635, 209643, 209651, + 209660, 209667, 209675, 209683, 209692, 209700, 209709, 209718, + 209728, 209732, 209737, 209742, 209748, 209753, 209759, 209765, + 209772, 209777, 209783, 209789, 209796, 209802, 209809, 209816, + 209824, 209829, 209835, 209841, 209848, 209854, 209861, 209868, + 209876, 209882, 209889, 209896, 209904, 209911, 209919, 209927, + 209936, 209941, 209947, 209953, 209960, 209966, 209973, 209980, + 209988, 209994, 210001, 210008, 210016, 210023, 210031, 210039, + 210048, 210054, 210061, 210068, 210076, 210083, 210091, 210099, + 210108, 210115, 210123, 210131, 210140, 210148, 210157, 210166, + 210176, 210181, 210187, 210193, 210200, 210206, 210213, 210220, + 210228, 210234, 210241, 210248, 210256, 210263, 210271, 210279, + 210288, 210294, 210301, 210308, 210316, 210323, 210331, 210339, + 210348, 210355, 210363, 210371, 210380, 210388, 210397, 210406, + 210416, 210422, 210429, 210436, 210444, 210451, 210459, 210467, + 210476, 210483, 210491, 210499, 210508, 210516, 210525, 210534, + 210544, 210551, 210559, 210567, 210576, 210584, 210593, 210602, + 210612, 210620, 210629, 210638, 210648, 210657, 210667, 210677, + 210688, 210692, 210697, 210702, 210708, 210713, 210719, 210725, + 210732, 210737, 210743, 210749, 210756, 210762, 210769, 210776, + 210784, 210789, 210795, 210801, 210808, 210814, 210821, 210828, + 210836, 210842, 210849, 210856, 210864, 210871, 210879, 210887, + 210896, 210901, 210907, 210913, 210920, 210926, 210933, 210940, + 210948, 210954, 210961, 210968, 210976, 210983, 210991, 210999, + 211008, 211014, 211021, 211028, 211036, 211043, 211051, 211059, + 211068, 211075, 211083, 211091, 211100, 211108, 211117, 211126, + 211136, 211141, 211147, 211153, 211160, 211166, 211173, 211180, + 211188, 211194, 211201, 211208, 211216, 211223, 211231, 211239, + 211248, 211254, 211261, 211268, 211276, 211283, 211291, 211299, + 211308, 211315, 211323, 211331, 211340, 211348, 211357, 211366, + 211376, 211382, 211389, 211396, 211404, 211411, 211419, 211427, + 211436, 211443, 211451, 211459, 211468, 211476, 211485, 211494, + 211504, 211511, 211519, 211527, 211536, 211544, 211553, 211562, + 211572, 211580, 211589, 211598, 211608, 211617, 211627, 211637, + 211648, 211653, 211659, 211665, 211672, 211678, 211685, 211692, + 211700, 211706, 211713, 211720, 211728, 211735, 211743, 211751, + 211760, 211766, 211773, 211780, 211788, 211795, 211803, 211811, + 211820, 211827, 211835, 211843, 211852, 211860, 211869, 211878, + 211888, 211894, 211901, 211908, 211916, 211923, 211931, 211939, + 211948, 211955, 211963, 211971, 211980, 211988, 211997, 212006, + 212016, 212023, 212031, 212039, 212048, 212056, 212065, 212074, + 212084, 212092, 212101, 212110, 212120, 212129, 212139, 212149, + 212160, 212166, 212173, 212180, 212188, 212195, 212203, 212211, + 212220, 212227, 212235, 212243, 212252, 212260, 212269, 212278, + 212288, 212295, 212303, 212311, 212320, 212328, 212337, 212346, + 212356, 212364, 212373, 212382, 212392, 212401, 212411, 212421, + 212432, 212439, 212447, 212455, 212464, 212472, 212481, 212490, + 212500, 212508, 212517, 212526, 212536, 212545, 212555, 212565, + 212576, 212584, 212593, 212602, 212612, 212621, 212631, 212641, + 212652, 212661, 212671, 212681, 212692, 212702, 212713, 212724, + 212736, 212740, 212745, 212750, 212756, 212761, 212767, 212773, + 212780, 212785, 212791, 212797, 212804, 212810, 212817, 212824, + 212832, 212837, 212843, 212849, 212856, 212862, 212869, 212876, + 212884, 212890, 212897, 212904, 212912, 212919, 212927, 212935, + 212944, 212949, 212955, 212961, 212968, 212974, 212981, 212988, + 212996, 213002, 213009, 213016, 213024, 213031, 213039, 213047, + 213056, 213062, 213069, 213076, 213084, 213091, 213099, 213107, + 213116, 213123, 213131, 213139, 213148, 213156, 213165, 213174, + 213184, 213189, 213195, 213201, 213208, 213214, 213221, 213228, + 213236, 213242, 213249, 213256, 213264, 213271, 213279, 213287, + 213296, 213302, 213309, 213316, 213324, 213331, 213339, 213347, + 213356, 213363, 213371, 213379, 213388, 213396, 213405, 213414, + 213424, 213430, 213437, 213444, 213452, 213459, 213467, 213475, + 213484, 213491, 213499, 213507, 213516, 213524, 213533, 213542, + 213552, 213559, 213567, 213575, 213584, 213592, 213601, 213610, + 213620, 213628, 213637, 213646, 213656, 213665, 213675, 213685, + 213696, 213701, 213707, 213713, 213720, 213726, 213733, 213740, + 213748, 213754, 213761, 213768, 213776, 213783, 213791, 213799, + 213808, 213814, 213821, 213828, 213836, 213843, 213851, 213859, + 213868, 213875, 213883, 213891, 213900, 213908, 213917, 213926, + 213936, 213942, 213949, 213956, 213964, 213971, 213979, 213987, + 213996, 214003, 214011, 214019, 214028, 214036, 214045, 214054, + 214064, 214071, 214079, 214087, 214096, 214104, 214113, 214122, + 214132, 214140, 214149, 214158, 214168, 214177, 214187, 214197, + 214208, 214214, 214221, 214228, 214236, 214243, 214251, 214259, + 214268, 214275, 214283, 214291, 214300, 214308, 214317, 214326, + 214336, 214343, 214351, 214359, 214368, 214376, 214385, 214394, + 214404, 214412, 214421, 214430, 214440, 214449, 214459, 214469, + 214480, 214487, 214495, 214503, 214512, 214520, 214529, 214538, + 214548, 214556, 214565, 214574, 214584, 214593, 214603, 214613, + 214624, 214632, 214641, 214650, 214660, 214669, 214679, 214689, + 214700, 214709, 214719, 214729, 214740, 214750, 214761, 214772, + 214784, 214789, 214795, 214801, 214808, 214814, 214821, 214828, + 214836, 214842, 214849, 214856, 214864, 214871, 214879, 214887, + 214896, 214902, 214909, 214916, 214924, 214931, 214939, 214947, + 214956, 214963, 214971, 214979, 214988, 214996, 215005, 215014, + 215024, 215030, 215037, 215044, 215052, 215059, 215067, 215075, + 215084, 215091, 215099, 215107, 215116, 215124, 215133, 215142, + 215152, 215159, 215167, 215175, 215184, 215192, 215201, 215210, + 215220, 215228, 215237, 215246, 215256, 215265, 215275, 215285, + 215296, 215302, 215309, 215316, 215324, 215331, 215339, 215347, + 215356, 215363, 215371, 215379, 215388, 215396, 215405, 215414, + 215424, 215431, 215439, 215447, 215456, 215464, 215473, 215482, + 215492, 215500, 215509, 215518, 215528, 215537, 215547, 215557, + 215568, 215575, 215583, 215591, 215600, 215608, 215617, 215626, + 215636, 215644, 215653, 215662, 215672, 215681, 215691, 215701, + 215712, 215720, 215729, 215738, 215748, 215757, 215767, 215777, + 215788, 215797, 215807, 215817, 215828, 215838, 215849, 215860, + 215872, 215878, 215885, 215892, 215900, 215907, 215915, 215923, + 215932, 215939, 215947, 215955, 215964, 215972, 215981, 215990, + 216000, 216007, 216015, 216023, 216032, 216040, 216049, 216058, + 216068, 216076, 216085, 216094, 216104, 216113, 216123, 216133, + 216144, 216151, 216159, 216167, 216176, 216184, 216193, 216202, + 216212, 216220, 216229, 216238, 216248, 216257, 216267, 216277, + 216288, 216296, 216305, 216314, 216324, 216333, 216343, 216353, + 216364, 216373, 216383, 216393, 216404, 216414, 216425, 216436, + 216448, 216455, 216463, 216471, 216480, 216488, 216497, 216506, + 216516, 216524, 216533, 216542, 216552, 216561, 216571, 216581, + 216592, 216600, 216609, 216618, 216628, 216637, 216647, 216657, + 216668, 216677, 216687, 216697, 216708, 216718, 216729, 216740, + 216752, 216760, 216769, 216778, 216788, 216797, 216807, 216817, + 216828, 216837, 216847, 216857, 216868, 216878, 216889, 216900, + 216912, 216921, 216931, 216941, 216952, 216962, 216973, 216984, + 216996, 217006, 217017, 217028, 217040, 217051, 217063, 217075, + 217088, 217092, 217097, 217102, 217108, 217113, 217119, 217125, + 217132, 217137, 217143, 217149, 217156, 217162, 217169, 217176, + 217184, 217189, 217195, 217201, 217208, 217214, 217221, 217228, + 217236, 217242, 217249, 217256, 217264, 217271, 217279, 217287, + 217296, 217301, 217307, 217313, 217320, 217326, 217333, 217340, + 217348, 217354, 217361, 217368, 217376, 217383, 217391, 217399, + 217408, 217414, 217421, 217428, 217436, 217443, 217451, 217459, + 217468, 217475, 217483, 217491, 217500, 217508, 217517, 217526, + 217536, 217541, 217547, 217553, 217560, 217566, 217573, 217580, + 217588, 217594, 217601, 217608, 217616, 217623, 217631, 217639, + 217648, 217654, 217661, 217668, 217676, 217683, 217691, 217699, + 217708, 217715, 217723, 217731, 217740, 217748, 217757, 217766, + 217776, 217782, 217789, 217796, 217804, 217811, 217819, 217827, + 217836, 217843, 217851, 217859, 217868, 217876, 217885, 217894, + 217904, 217911, 217919, 217927, 217936, 217944, 217953, 217962, + 217972, 217980, 217989, 217998, 218008, 218017, 218027, 218037, + 218048, 218053, 218059, 218065, 218072, 218078, 218085, 218092, + 218100, 218106, 218113, 218120, 218128, 218135, 218143, 218151, + 218160, 218166, 218173, 218180, 218188, 218195, 218203, 218211, + 218220, 218227, 218235, 218243, 218252, 218260, 218269, 218278, + 218288, 218294, 218301, 218308, 218316, 218323, 218331, 218339, + 218348, 218355, 218363, 218371, 218380, 218388, 218397, 218406, + 218416, 218423, 218431, 218439, 218448, 218456, 218465, 218474, + 218484, 218492, 218501, 218510, 218520, 218529, 218539, 218549, + 218560, 218566, 218573, 218580, 218588, 218595, 218603, 218611, + 218620, 218627, 218635, 218643, 218652, 218660, 218669, 218678, + 218688, 218695, 218703, 218711, 218720, 218728, 218737, 218746, + 218756, 218764, 218773, 218782, 218792, 218801, 218811, 218821, + 218832, 218839, 218847, 218855, 218864, 218872, 218881, 218890, + 218900, 218908, 218917, 218926, 218936, 218945, 218955, 218965, + 218976, 218984, 218993, 219002, 219012, 219021, 219031, 219041, + 219052, 219061, 219071, 219081, 219092, 219102, 219113, 219124, + 219136, 219141, 219147, 219153, 219160, 219166, 219173, 219180, + 219188, 219194, 219201, 219208, 219216, 219223, 219231, 219239, + 219248, 219254, 219261, 219268, 219276, 219283, 219291, 219299, + 219308, 219315, 219323, 219331, 219340, 219348, 219357, 219366, + 219376, 219382, 219389, 219396, 219404, 219411, 219419, 219427, + 219436, 219443, 219451, 219459, 219468, 219476, 219485, 219494, + 219504, 219511, 219519, 219527, 219536, 219544, 219553, 219562, + 219572, 219580, 219589, 219598, 219608, 219617, 219627, 219637, + 219648, 219654, 219661, 219668, 219676, 219683, 219691, 219699, + 219708, 219715, 219723, 219731, 219740, 219748, 219757, 219766, + 219776, 219783, 219791, 219799, 219808, 219816, 219825, 219834, + 219844, 219852, 219861, 219870, 219880, 219889, 219899, 219909, + 219920, 219927, 219935, 219943, 219952, 219960, 219969, 219978, + 219988, 219996, 220005, 220014, 220024, 220033, 220043, 220053, + 220064, 220072, 220081, 220090, 220100, 220109, 220119, 220129, + 220140, 220149, 220159, 220169, 220180, 220190, 220201, 220212, + 220224, 220230, 220237, 220244, 220252, 220259, 220267, 220275, + 220284, 220291, 220299, 220307, 220316, 220324, 220333, 220342, + 220352, 220359, 220367, 220375, 220384, 220392, 220401, 220410, + 220420, 220428, 220437, 220446, 220456, 220465, 220475, 220485, + 220496, 220503, 220511, 220519, 220528, 220536, 220545, 220554, + 220564, 220572, 220581, 220590, 220600, 220609, 220619, 220629, + 220640, 220648, 220657, 220666, 220676, 220685, 220695, 220705, + 220716, 220725, 220735, 220745, 220756, 220766, 220777, 220788, + 220800, 220807, 220815, 220823, 220832, 220840, 220849, 220858, + 220868, 220876, 220885, 220894, 220904, 220913, 220923, 220933, + 220944, 220952, 220961, 220970, 220980, 220989, 220999, 221009, + 221020, 221029, 221039, 221049, 221060, 221070, 221081, 221092, + 221104, 221112, 221121, 221130, 221140, 221149, 221159, 221169, + 221180, 221189, 221199, 221209, 221220, 221230, 221241, 221252, + 221264, 221273, 221283, 221293, 221304, 221314, 221325, 221336, + 221348, 221358, 221369, 221380, 221392, 221403, 221415, 221427, + 221440, 221445, 221451, 221457, 221464, 221470, 221477, 221484, + 221492, 221498, 221505, 221512, 221520, 221527, 221535, 221543, + 221552, 221558, 221565, 221572, 221580, 221587, 221595, 221603, + 221612, 221619, 221627, 221635, 221644, 221652, 221661, 221670, + 221680, 221686, 221693, 221700, 221708, 221715, 221723, 221731, + 221740, 221747, 221755, 221763, 221772, 221780, 221789, 221798, + 221808, 221815, 221823, 221831, 221840, 221848, 221857, 221866, + 221876, 221884, 221893, 221902, 221912, 221921, 221931, 221941, + 221952, 221958, 221965, 221972, 221980, 221987, 221995, 222003, + 222012, 222019, 222027, 222035, 222044, 222052, 222061, 222070, + 222080, 222087, 222095, 222103, 222112, 222120, 222129, 222138, + 222148, 222156, 222165, 222174, 222184, 222193, 222203, 222213, + 222224, 222231, 222239, 222247, 222256, 222264, 222273, 222282, + 222292, 222300, 222309, 222318, 222328, 222337, 222347, 222357, + 222368, 222376, 222385, 222394, 222404, 222413, 222423, 222433, + 222444, 222453, 222463, 222473, 222484, 222494, 222505, 222516, + 222528, 222534, 222541, 222548, 222556, 222563, 222571, 222579, + 222588, 222595, 222603, 222611, 222620, 222628, 222637, 222646, + 222656, 222663, 222671, 222679, 222688, 222696, 222705, 222714, + 222724, 222732, 222741, 222750, 222760, 222769, 222779, 222789, + 222800, 222807, 222815, 222823, 222832, 222840, 222849, 222858, + 222868, 222876, 222885, 222894, 222904, 222913, 222923, 222933, + 222944, 222952, 222961, 222970, 222980, 222989, 222999, 223009, + 223020, 223029, 223039, 223049, 223060, 223070, 223081, 223092, + 223104, 223111, 223119, 223127, 223136, 223144, 223153, 223162, + 223172, 223180, 223189, 223198, 223208, 223217, 223227, 223237, + 223248, 223256, 223265, 223274, 223284, 223293, 223303, 223313, + 223324, 223333, 223343, 223353, 223364, 223374, 223385, 223396, + 223408, 223416, 223425, 223434, 223444, 223453, 223463, 223473, + 223484, 223493, 223503, 223513, 223524, 223534, 223545, 223556, + 223568, 223577, 223587, 223597, 223608, 223618, 223629, 223640, + 223652, 223662, 223673, 223684, 223696, 223707, 223719, 223731, + 223744, 223750, 223757, 223764, 223772, 223779, 223787, 223795, + 223804, 223811, 223819, 223827, 223836, 223844, 223853, 223862, + 223872, 223879, 223887, 223895, 223904, 223912, 223921, 223930, + 223940, 223948, 223957, 223966, 223976, 223985, 223995, 224005, + 224016, 224023, 224031, 224039, 224048, 224056, 224065, 224074, + 224084, 224092, 224101, 224110, 224120, 224129, 224139, 224149, + 224160, 224168, 224177, 224186, 224196, 224205, 224215, 224225, + 224236, 224245, 224255, 224265, 224276, 224286, 224297, 224308, + 224320, 224327, 224335, 224343, 224352, 224360, 224369, 224378, + 224388, 224396, 224405, 224414, 224424, 224433, 224443, 224453, + 224464, 224472, 224481, 224490, 224500, 224509, 224519, 224529, + 224540, 224549, 224559, 224569, 224580, 224590, 224601, 224612, + 224624, 224632, 224641, 224650, 224660, 224669, 224679, 224689, + 224700, 224709, 224719, 224729, 224740, 224750, 224761, 224772, + 224784, 224793, 224803, 224813, 224824, 224834, 224845, 224856, + 224868, 224878, 224889, 224900, 224912, 224923, 224935, 224947, + 224960, 224967, 224975, 224983, 224992, 225000, 225009, 225018, + 225028, 225036, 225045, 225054, 225064, 225073, 225083, 225093, + 225104, 225112, 225121, 225130, 225140, 225149, 225159, 225169, + 225180, 225189, 225199, 225209, 225220, 225230, 225241, 225252, + 225264, 225272, 225281, 225290, 225300, 225309, 225319, 225329, + 225340, 225349, 225359, 225369, 225380, 225390, 225401, 225412, + 225424, 225433, 225443, 225453, 225464, 225474, 225485, 225496, + 225508, 225518, 225529, 225540, 225552, 225563, 225575, 225587, + 225600, 225608, 225617, 225626, 225636, 225645, 225655, 225665, + 225676, 225685, 225695, 225705, 225716, 225726, 225737, 225748, + 225760, 225769, 225779, 225789, 225800, 225810, 225821, 225832, + 225844, 225854, 225865, 225876, 225888, 225899, 225911, 225923, + 225936, 225945, 225955, 225965, 225976, 225986, 225997, 226008, + 226020, 226030, 226041, 226052, 226064, 226075, 226087, 226099, + 226112, 226122, 226133, 226144, 226156, 226167, 226179, 226191, + 226204, 226215, 226227, 226239, 226252, 226264, 226277, 226290, + 226304, 226308, 226313, 226318, 226324, 226329, 226335, 226341, + 226348, 226353, 226359, 226365, 226372, 226378, 226385, 226392, + 226400, 226405, 226411, 226417, 226424, 226430, 226437, 226444, + 226452, 226458, 226465, 226472, 226480, 226487, 226495, 226503, + 226512, 226517, 226523, 226529, 226536, 226542, 226549, 226556, + 226564, 226570, 226577, 226584, 226592, 226599, 226607, 226615, + 226624, 226630, 226637, 226644, 226652, 226659, 226667, 226675, + 226684, 226691, 226699, 226707, 226716, 226724, 226733, 226742, + 226752, 226757, 226763, 226769, 226776, 226782, 226789, 226796, + 226804, 226810, 226817, 226824, 226832, 226839, 226847, 226855, + 226864, 226870, 226877, 226884, 226892, 226899, 226907, 226915, + 226924, 226931, 226939, 226947, 226956, 226964, 226973, 226982, + 226992, 226998, 227005, 227012, 227020, 227027, 227035, 227043, + 227052, 227059, 227067, 227075, 227084, 227092, 227101, 227110, + 227120, 227127, 227135, 227143, 227152, 227160, 227169, 227178, + 227188, 227196, 227205, 227214, 227224, 227233, 227243, 227253, + 227264, 227269, 227275, 227281, 227288, 227294, 227301, 227308, + 227316, 227322, 227329, 227336, 227344, 227351, 227359, 227367, + 227376, 227382, 227389, 227396, 227404, 227411, 227419, 227427, + 227436, 227443, 227451, 227459, 227468, 227476, 227485, 227494, + 227504, 227510, 227517, 227524, 227532, 227539, 227547, 227555, + 227564, 227571, 227579, 227587, 227596, 227604, 227613, 227622, + 227632, 227639, 227647, 227655, 227664, 227672, 227681, 227690, + 227700, 227708, 227717, 227726, 227736, 227745, 227755, 227765, + 227776, 227782, 227789, 227796, 227804, 227811, 227819, 227827, + 227836, 227843, 227851, 227859, 227868, 227876, 227885, 227894, + 227904, 227911, 227919, 227927, 227936, 227944, 227953, 227962, + 227972, 227980, 227989, 227998, 228008, 228017, 228027, 228037, + 228048, 228055, 228063, 228071, 228080, 228088, 228097, 228106, + 228116, 228124, 228133, 228142, 228152, 228161, 228171, 228181, + 228192, 228200, 228209, 228218, 228228, 228237, 228247, 228257, + 228268, 228277, 228287, 228297, 228308, 228318, 228329, 228340, + 228352, 228357, 228363, 228369, 228376, 228382, 228389, 228396, + 228404, 228410, 228417, 228424, 228432, 228439, 228447, 228455, + 228464, 228470, 228477, 228484, 228492, 228499, 228507, 228515, + 228524, 228531, 228539, 228547, 228556, 228564, 228573, 228582, + 228592, 228598, 228605, 228612, 228620, 228627, 228635, 228643, + 228652, 228659, 228667, 228675, 228684, 228692, 228701, 228710, + 228720, 228727, 228735, 228743, 228752, 228760, 228769, 228778, + 228788, 228796, 228805, 228814, 228824, 228833, 228843, 228853, + 228864, 228870, 228877, 228884, 228892, 228899, 228907, 228915, + 228924, 228931, 228939, 228947, 228956, 228964, 228973, 228982, + 228992, 228999, 229007, 229015, 229024, 229032, 229041, 229050, + 229060, 229068, 229077, 229086, 229096, 229105, 229115, 229125, + 229136, 229143, 229151, 229159, 229168, 229176, 229185, 229194, + 229204, 229212, 229221, 229230, 229240, 229249, 229259, 229269, + 229280, 229288, 229297, 229306, 229316, 229325, 229335, 229345, + 229356, 229365, 229375, 229385, 229396, 229406, 229417, 229428, + 229440, 229446, 229453, 229460, 229468, 229475, 229483, 229491, + 229500, 229507, 229515, 229523, 229532, 229540, 229549, 229558, + 229568, 229575, 229583, 229591, 229600, 229608, 229617, 229626, + 229636, 229644, 229653, 229662, 229672, 229681, 229691, 229701, + 229712, 229719, 229727, 229735, 229744, 229752, 229761, 229770, + 229780, 229788, 229797, 229806, 229816, 229825, 229835, 229845, + 229856, 229864, 229873, 229882, 229892, 229901, 229911, 229921, + 229932, 229941, 229951, 229961, 229972, 229982, 229993, 230004, + 230016, 230023, 230031, 230039, 230048, 230056, 230065, 230074, + 230084, 230092, 230101, 230110, 230120, 230129, 230139, 230149, + 230160, 230168, 230177, 230186, 230196, 230205, 230215, 230225, + 230236, 230245, 230255, 230265, 230276, 230286, 230297, 230308, + 230320, 230328, 230337, 230346, 230356, 230365, 230375, 230385, + 230396, 230405, 230415, 230425, 230436, 230446, 230457, 230468, + 230480, 230489, 230499, 230509, 230520, 230530, 230541, 230552, + 230564, 230574, 230585, 230596, 230608, 230619, 230631, 230643, + 230656, 230661, 230667, 230673, 230680, 230686, 230693, 230700, + 230708, 230714, 230721, 230728, 230736, 230743, 230751, 230759, + 230768, 230774, 230781, 230788, 230796, 230803, 230811, 230819, + 230828, 230835, 230843, 230851, 230860, 230868, 230877, 230886, + 230896, 230902, 230909, 230916, 230924, 230931, 230939, 230947, + 230956, 230963, 230971, 230979, 230988, 230996, 231005, 231014, + 231024, 231031, 231039, 231047, 231056, 231064, 231073, 231082, + 231092, 231100, 231109, 231118, 231128, 231137, 231147, 231157, + 231168, 231174, 231181, 231188, 231196, 231203, 231211, 231219, + 231228, 231235, 231243, 231251, 231260, 231268, 231277, 231286, + 231296, 231303, 231311, 231319, 231328, 231336, 231345, 231354, + 231364, 231372, 231381, 231390, 231400, 231409, 231419, 231429, + 231440, 231447, 231455, 231463, 231472, 231480, 231489, 231498, + 231508, 231516, 231525, 231534, 231544, 231553, 231563, 231573, + 231584, 231592, 231601, 231610, 231620, 231629, 231639, 231649, + 231660, 231669, 231679, 231689, 231700, 231710, 231721, 231732, + 231744, 231750, 231757, 231764, 231772, 231779, 231787, 231795, + 231804, 231811, 231819, 231827, 231836, 231844, 231853, 231862, + 231872, 231879, 231887, 231895, 231904, 231912, 231921, 231930, + 231940, 231948, 231957, 231966, 231976, 231985, 231995, 232005, + 232016, 232023, 232031, 232039, 232048, 232056, 232065, 232074, + 232084, 232092, 232101, 232110, 232120, 232129, 232139, 232149, + 232160, 232168, 232177, 232186, 232196, 232205, 232215, 232225, + 232236, 232245, 232255, 232265, 232276, 232286, 232297, 232308, + 232320, 232327, 232335, 232343, 232352, 232360, 232369, 232378, + 232388, 232396, 232405, 232414, 232424, 232433, 232443, 232453, + 232464, 232472, 232481, 232490, 232500, 232509, 232519, 232529, + 232540, 232549, 232559, 232569, 232580, 232590, 232601, 232612, + 232624, 232632, 232641, 232650, 232660, 232669, 232679, 232689, + 232700, 232709, 232719, 232729, 232740, 232750, 232761, 232772, + 232784, 232793, 232803, 232813, 232824, 232834, 232845, 232856, + 232868, 232878, 232889, 232900, 232912, 232923, 232935, 232947, + 232960, 232966, 232973, 232980, 232988, 232995, 233003, 233011, + 233020, 233027, 233035, 233043, 233052, 233060, 233069, 233078, + 233088, 233095, 233103, 233111, 233120, 233128, 233137, 233146, + 233156, 233164, 233173, 233182, 233192, 233201, 233211, 233221, + 233232, 233239, 233247, 233255, 233264, 233272, 233281, 233290, + 233300, 233308, 233317, 233326, 233336, 233345, 233355, 233365, + 233376, 233384, 233393, 233402, 233412, 233421, 233431, 233441, + 233452, 233461, 233471, 233481, 233492, 233502, 233513, 233524, + 233536, 233543, 233551, 233559, 233568, 233576, 233585, 233594, + 233604, 233612, 233621, 233630, 233640, 233649, 233659, 233669, + 233680, 233688, 233697, 233706, 233716, 233725, 233735, 233745, + 233756, 233765, 233775, 233785, 233796, 233806, 233817, 233828, + 233840, 233848, 233857, 233866, 233876, 233885, 233895, 233905, + 233916, 233925, 233935, 233945, 233956, 233966, 233977, 233988, + 234000, 234009, 234019, 234029, 234040, 234050, 234061, 234072, + 234084, 234094, 234105, 234116, 234128, 234139, 234151, 234163, + 234176, 234183, 234191, 234199, 234208, 234216, 234225, 234234, + 234244, 234252, 234261, 234270, 234280, 234289, 234299, 234309, + 234320, 234328, 234337, 234346, 234356, 234365, 234375, 234385, + 234396, 234405, 234415, 234425, 234436, 234446, 234457, 234468, + 234480, 234488, 234497, 234506, 234516, 234525, 234535, 234545, + 234556, 234565, 234575, 234585, 234596, 234606, 234617, 234628, + 234640, 234649, 234659, 234669, 234680, 234690, 234701, 234712, + 234724, 234734, 234745, 234756, 234768, 234779, 234791, 234803, + 234816, 234824, 234833, 234842, 234852, 234861, 234871, 234881, + 234892, 234901, 234911, 234921, 234932, 234942, 234953, 234964, + 234976, 234985, 234995, 235005, 235016, 235026, 235037, 235048, + 235060, 235070, 235081, 235092, 235104, 235115, 235127, 235139, + 235152, 235161, 235171, 235181, 235192, 235202, 235213, 235224, + 235236, 235246, 235257, 235268, 235280, 235291, 235303, 235315, + 235328, 235338, 235349, 235360, 235372, 235383, 235395, 235407, + 235420, 235431, 235443, 235455, 235468, 235480, 235493, 235506, + 235520, 235525, 235531, 235537, 235544, 235550, 235557, 235564, + 235572, 235578, 235585, 235592, 235600, 235607, 235615, 235623, + 235632, 235638, 235645, 235652, 235660, 235667, 235675, 235683, + 235692, 235699, 235707, 235715, 235724, 235732, 235741, 235750, + 235760, 235766, 235773, 235780, 235788, 235795, 235803, 235811, + 235820, 235827, 235835, 235843, 235852, 235860, 235869, 235878, + 235888, 235895, 235903, 235911, 235920, 235928, 235937, 235946, + 235956, 235964, 235973, 235982, 235992, 236001, 236011, 236021, + 236032, 236038, 236045, 236052, 236060, 236067, 236075, 236083, + 236092, 236099, 236107, 236115, 236124, 236132, 236141, 236150, + 236160, 236167, 236175, 236183, 236192, 236200, 236209, 236218, + 236228, 236236, 236245, 236254, 236264, 236273, 236283, 236293, + 236304, 236311, 236319, 236327, 236336, 236344, 236353, 236362, + 236372, 236380, 236389, 236398, 236408, 236417, 236427, 236437, + 236448, 236456, 236465, 236474, 236484, 236493, 236503, 236513, + 236524, 236533, 236543, 236553, 236564, 236574, 236585, 236596, + 236608, 236614, 236621, 236628, 236636, 236643, 236651, 236659, + 236668, 236675, 236683, 236691, 236700, 236708, 236717, 236726, + 236736, 236743, 236751, 236759, 236768, 236776, 236785, 236794, + 236804, 236812, 236821, 236830, 236840, 236849, 236859, 236869, + 236880, 236887, 236895, 236903, 236912, 236920, 236929, 236938, + 236948, 236956, 236965, 236974, 236984, 236993, 237003, 237013, + 237024, 237032, 237041, 237050, 237060, 237069, 237079, 237089, + 237100, 237109, 237119, 237129, 237140, 237150, 237161, 237172, + 237184, 237191, 237199, 237207, 237216, 237224, 237233, 237242, + 237252, 237260, 237269, 237278, 237288, 237297, 237307, 237317, + 237328, 237336, 237345, 237354, 237364, 237373, 237383, 237393, + 237404, 237413, 237423, 237433, 237444, 237454, 237465, 237476, + 237488, 237496, 237505, 237514, 237524, 237533, 237543, 237553, + 237564, 237573, 237583, 237593, 237604, 237614, 237625, 237636, + 237648, 237657, 237667, 237677, 237688, 237698, 237709, 237720, + 237732, 237742, 237753, 237764, 237776, 237787, 237799, 237811, + 237824, 237830, 237837, 237844, 237852, 237859, 237867, 237875, + 237884, 237891, 237899, 237907, 237916, 237924, 237933, 237942, + 237952, 237959, 237967, 237975, 237984, 237992, 238001, 238010, + 238020, 238028, 238037, 238046, 238056, 238065, 238075, 238085, + 238096, 238103, 238111, 238119, 238128, 238136, 238145, 238154, + 238164, 238172, 238181, 238190, 238200, 238209, 238219, 238229, + 238240, 238248, 238257, 238266, 238276, 238285, 238295, 238305, + 238316, 238325, 238335, 238345, 238356, 238366, 238377, 238388, + 238400, 238407, 238415, 238423, 238432, 238440, 238449, 238458, + 238468, 238476, 238485, 238494, 238504, 238513, 238523, 238533, + 238544, 238552, 238561, 238570, 238580, 238589, 238599, 238609, + 238620, 238629, 238639, 238649, 238660, 238670, 238681, 238692, + 238704, 238712, 238721, 238730, 238740, 238749, 238759, 238769, + 238780, 238789, 238799, 238809, 238820, 238830, 238841, 238852, + 238864, 238873, 238883, 238893, 238904, 238914, 238925, 238936, + 238948, 238958, 238969, 238980, 238992, 239003, 239015, 239027, + 239040, 239047, 239055, 239063, 239072, 239080, 239089, 239098, + 239108, 239116, 239125, 239134, 239144, 239153, 239163, 239173, + 239184, 239192, 239201, 239210, 239220, 239229, 239239, 239249, + 239260, 239269, 239279, 239289, 239300, 239310, 239321, 239332, + 239344, 239352, 239361, 239370, 239380, 239389, 239399, 239409, + 239420, 239429, 239439, 239449, 239460, 239470, 239481, 239492, + 239504, 239513, 239523, 239533, 239544, 239554, 239565, 239576, + 239588, 239598, 239609, 239620, 239632, 239643, 239655, 239667, + 239680, 239688, 239697, 239706, 239716, 239725, 239735, 239745, + 239756, 239765, 239775, 239785, 239796, 239806, 239817, 239828, + 239840, 239849, 239859, 239869, 239880, 239890, 239901, 239912, + 239924, 239934, 239945, 239956, 239968, 239979, 239991, 240003, + 240016, 240025, 240035, 240045, 240056, 240066, 240077, 240088, + 240100, 240110, 240121, 240132, 240144, 240155, 240167, 240179, + 240192, 240202, 240213, 240224, 240236, 240247, 240259, 240271, + 240284, 240295, 240307, 240319, 240332, 240344, 240357, 240370, + 240384, 240390, 240397, 240404, 240412, 240419, 240427, 240435, + 240444, 240451, 240459, 240467, 240476, 240484, 240493, 240502, + 240512, 240519, 240527, 240535, 240544, 240552, 240561, 240570, + 240580, 240588, 240597, 240606, 240616, 240625, 240635, 240645, + 240656, 240663, 240671, 240679, 240688, 240696, 240705, 240714, + 240724, 240732, 240741, 240750, 240760, 240769, 240779, 240789, + 240800, 240808, 240817, 240826, 240836, 240845, 240855, 240865, + 240876, 240885, 240895, 240905, 240916, 240926, 240937, 240948, + 240960, 240967, 240975, 240983, 240992, 241000, 241009, 241018, + 241028, 241036, 241045, 241054, 241064, 241073, 241083, 241093, + 241104, 241112, 241121, 241130, 241140, 241149, 241159, 241169, + 241180, 241189, 241199, 241209, 241220, 241230, 241241, 241252, + 241264, 241272, 241281, 241290, 241300, 241309, 241319, 241329, + 241340, 241349, 241359, 241369, 241380, 241390, 241401, 241412, + 241424, 241433, 241443, 241453, 241464, 241474, 241485, 241496, + 241508, 241518, 241529, 241540, 241552, 241563, 241575, 241587, + 241600, 241607, 241615, 241623, 241632, 241640, 241649, 241658, + 241668, 241676, 241685, 241694, 241704, 241713, 241723, 241733, + 241744, 241752, 241761, 241770, 241780, 241789, 241799, 241809, + 241820, 241829, 241839, 241849, 241860, 241870, 241881, 241892, + 241904, 241912, 241921, 241930, 241940, 241949, 241959, 241969, + 241980, 241989, 241999, 242009, 242020, 242030, 242041, 242052, + 242064, 242073, 242083, 242093, 242104, 242114, 242125, 242136, + 242148, 242158, 242169, 242180, 242192, 242203, 242215, 242227, + 242240, 242248, 242257, 242266, 242276, 242285, 242295, 242305, + 242316, 242325, 242335, 242345, 242356, 242366, 242377, 242388, + 242400, 242409, 242419, 242429, 242440, 242450, 242461, 242472, + 242484, 242494, 242505, 242516, 242528, 242539, 242551, 242563, + 242576, 242585, 242595, 242605, 242616, 242626, 242637, 242648, + 242660, 242670, 242681, 242692, 242704, 242715, 242727, 242739, + 242752, 242762, 242773, 242784, 242796, 242807, 242819, 242831, + 242844, 242855, 242867, 242879, 242892, 242904, 242917, 242930, + 242944, 242951, 242959, 242967, 242976, 242984, 242993, 243002, + 243012, 243020, 243029, 243038, 243048, 243057, 243067, 243077, + 243088, 243096, 243105, 243114, 243124, 243133, 243143, 243153, + 243164, 243173, 243183, 243193, 243204, 243214, 243225, 243236, + 243248, 243256, 243265, 243274, 243284, 243293, 243303, 243313, + 243324, 243333, 243343, 243353, 243364, 243374, 243385, 243396, + 243408, 243417, 243427, 243437, 243448, 243458, 243469, 243480, + 243492, 243502, 243513, 243524, 243536, 243547, 243559, 243571, + 243584, 243592, 243601, 243610, 243620, 243629, 243639, 243649, + 243660, 243669, 243679, 243689, 243700, 243710, 243721, 243732, + 243744, 243753, 243763, 243773, 243784, 243794, 243805, 243816, + 243828, 243838, 243849, 243860, 243872, 243883, 243895, 243907, + 243920, 243929, 243939, 243949, 243960, 243970, 243981, 243992, + 244004, 244014, 244025, 244036, 244048, 244059, 244071, 244083, + 244096, 244106, 244117, 244128, 244140, 244151, 244163, 244175, + 244188, 244199, 244211, 244223, 244236, 244248, 244261, 244274, + 244288, 244296, 244305, 244314, 244324, 244333, 244343, 244353, + 244364, 244373, 244383, 244393, 244404, 244414, 244425, 244436, + 244448, 244457, 244467, 244477, 244488, 244498, 244509, 244520, + 244532, 244542, 244553, 244564, 244576, 244587, 244599, 244611, + 244624, 244633, 244643, 244653, 244664, 244674, 244685, 244696, + 244708, 244718, 244729, 244740, 244752, 244763, 244775, 244787, + 244800, 244810, 244821, 244832, 244844, 244855, 244867, 244879, + 244892, 244903, 244915, 244927, 244940, 244952, 244965, 244978, + 244992, 245001, 245011, 245021, 245032, 245042, 245053, 245064, + 245076, 245086, 245097, 245108, 245120, 245131, 245143, 245155, + 245168, 245178, 245189, 245200, 245212, 245223, 245235, 245247, + 245260, 245271, 245283, 245295, 245308, 245320, 245333, 245346, + 245360, 245370, 245381, 245392, 245404, 245415, 245427, 245439, + 245452, 245463, 245475, 245487, 245500, 245512, 245525, 245538, + 245552, 245563, 245575, 245587, 245600, 245612, 245625, 245638, + 245652, 245664, 245677, 245690, 245704, 245717, 245731, 245745, + 245760, 245761, 245763, 245765, 245768, 245770, 245773, 245776, + 245780, 245782, 245785, 245788, 245792, 245795, 245799, 245803, + 245808, 245810, 245813, 245816, 245820, 245823, 245827, 245831, + 245836, 245839, 245843, 245847, 245852, 245856, 245861, 245866, + 245872, 245874, 245877, 245880, 245884, 245887, 245891, 245895, + 245900, 245903, 245907, 245911, 245916, 245920, 245925, 245930, + 245936, 245939, 245943, 245947, 245952, 245956, 245961, 245966, + 245972, 245976, 245981, 245986, 245992, 245997, 246003, 246009, + 246016, 246018, 246021, 246024, 246028, 246031, 246035, 246039, + 246044, 246047, 246051, 246055, 246060, 246064, 246069, 246074, + 246080, 246083, 246087, 246091, 246096, 246100, 246105, 246110, + 246116, 246120, 246125, 246130, 246136, 246141, 246147, 246153, + 246160, 246163, 246167, 246171, 246176, 246180, 246185, 246190, + 246196, 246200, 246205, 246210, 246216, 246221, 246227, 246233, + 246240, 246244, 246249, 246254, 246260, 246265, 246271, 246277, + 246284, 246289, 246295, 246301, 246308, 246314, 246321, 246328, + 246336, 246338, 246341, 246344, 246348, 246351, 246355, 246359, + 246364, 246367, 246371, 246375, 246380, 246384, 246389, 246394, + 246400, 246403, 246407, 246411, 246416, 246420, 246425, 246430, + 246436, 246440, 246445, 246450, 246456, 246461, 246467, 246473, + 246480, 246483, 246487, 246491, 246496, 246500, 246505, 246510, + 246516, 246520, 246525, 246530, 246536, 246541, 246547, 246553, + 246560, 246564, 246569, 246574, 246580, 246585, 246591, 246597, + 246604, 246609, 246615, 246621, 246628, 246634, 246641, 246648, + 246656, 246659, 246663, 246667, 246672, 246676, 246681, 246686, + 246692, 246696, 246701, 246706, 246712, 246717, 246723, 246729, + 246736, 246740, 246745, 246750, 246756, 246761, 246767, 246773, + 246780, 246785, 246791, 246797, 246804, 246810, 246817, 246824, + 246832, 246836, 246841, 246846, 246852, 246857, 246863, 246869, + 246876, 246881, 246887, 246893, 246900, 246906, 246913, 246920, + 246928, 246933, 246939, 246945, 246952, 246958, 246965, 246972, + 246980, 246986, 246993, 247000, 247008, 247015, 247023, 247031, + 247040, 247042, 247045, 247048, 247052, 247055, 247059, 247063, + 247068, 247071, 247075, 247079, 247084, 247088, 247093, 247098, + 247104, 247107, 247111, 247115, 247120, 247124, 247129, 247134, + 247140, 247144, 247149, 247154, 247160, 247165, 247171, 247177, + 247184, 247187, 247191, 247195, 247200, 247204, 247209, 247214, + 247220, 247224, 247229, 247234, 247240, 247245, 247251, 247257, + 247264, 247268, 247273, 247278, 247284, 247289, 247295, 247301, + 247308, 247313, 247319, 247325, 247332, 247338, 247345, 247352, + 247360, 247363, 247367, 247371, 247376, 247380, 247385, 247390, + 247396, 247400, 247405, 247410, 247416, 247421, 247427, 247433, + 247440, 247444, 247449, 247454, 247460, 247465, 247471, 247477, + 247484, 247489, 247495, 247501, 247508, 247514, 247521, 247528, + 247536, 247540, 247545, 247550, 247556, 247561, 247567, 247573, + 247580, 247585, 247591, 247597, 247604, 247610, 247617, 247624, + 247632, 247637, 247643, 247649, 247656, 247662, 247669, 247676, + 247684, 247690, 247697, 247704, 247712, 247719, 247727, 247735, + 247744, 247747, 247751, 247755, 247760, 247764, 247769, 247774, + 247780, 247784, 247789, 247794, 247800, 247805, 247811, 247817, + 247824, 247828, 247833, 247838, 247844, 247849, 247855, 247861, + 247868, 247873, 247879, 247885, 247892, 247898, 247905, 247912, + 247920, 247924, 247929, 247934, 247940, 247945, 247951, 247957, + 247964, 247969, 247975, 247981, 247988, 247994, 248001, 248008, + 248016, 248021, 248027, 248033, 248040, 248046, 248053, 248060, + 248068, 248074, 248081, 248088, 248096, 248103, 248111, 248119, + 248128, 248132, 248137, 248142, 248148, 248153, 248159, 248165, + 248172, 248177, 248183, 248189, 248196, 248202, 248209, 248216, + 248224, 248229, 248235, 248241, 248248, 248254, 248261, 248268, + 248276, 248282, 248289, 248296, 248304, 248311, 248319, 248327, + 248336, 248341, 248347, 248353, 248360, 248366, 248373, 248380, + 248388, 248394, 248401, 248408, 248416, 248423, 248431, 248439, + 248448, 248454, 248461, 248468, 248476, 248483, 248491, 248499, + 248508, 248515, 248523, 248531, 248540, 248548, 248557, 248566, + 248576, 248578, 248581, 248584, 248588, 248591, 248595, 248599, + 248604, 248607, 248611, 248615, 248620, 248624, 248629, 248634, + 248640, 248643, 248647, 248651, 248656, 248660, 248665, 248670, + 248676, 248680, 248685, 248690, 248696, 248701, 248707, 248713, + 248720, 248723, 248727, 248731, 248736, 248740, 248745, 248750, + 248756, 248760, 248765, 248770, 248776, 248781, 248787, 248793, + 248800, 248804, 248809, 248814, 248820, 248825, 248831, 248837, + 248844, 248849, 248855, 248861, 248868, 248874, 248881, 248888, + 248896, 248899, 248903, 248907, 248912, 248916, 248921, 248926, + 248932, 248936, 248941, 248946, 248952, 248957, 248963, 248969, + 248976, 248980, 248985, 248990, 248996, 249001, 249007, 249013, + 249020, 249025, 249031, 249037, 249044, 249050, 249057, 249064, + 249072, 249076, 249081, 249086, 249092, 249097, 249103, 249109, + 249116, 249121, 249127, 249133, 249140, 249146, 249153, 249160, + 249168, 249173, 249179, 249185, 249192, 249198, 249205, 249212, + 249220, 249226, 249233, 249240, 249248, 249255, 249263, 249271, + 249280, 249283, 249287, 249291, 249296, 249300, 249305, 249310, + 249316, 249320, 249325, 249330, 249336, 249341, 249347, 249353, + 249360, 249364, 249369, 249374, 249380, 249385, 249391, 249397, + 249404, 249409, 249415, 249421, 249428, 249434, 249441, 249448, + 249456, 249460, 249465, 249470, 249476, 249481, 249487, 249493, + 249500, 249505, 249511, 249517, 249524, 249530, 249537, 249544, + 249552, 249557, 249563, 249569, 249576, 249582, 249589, 249596, + 249604, 249610, 249617, 249624, 249632, 249639, 249647, 249655, + 249664, 249668, 249673, 249678, 249684, 249689, 249695, 249701, + 249708, 249713, 249719, 249725, 249732, 249738, 249745, 249752, + 249760, 249765, 249771, 249777, 249784, 249790, 249797, 249804, + 249812, 249818, 249825, 249832, 249840, 249847, 249855, 249863, + 249872, 249877, 249883, 249889, 249896, 249902, 249909, 249916, + 249924, 249930, 249937, 249944, 249952, 249959, 249967, 249975, + 249984, 249990, 249997, 250004, 250012, 250019, 250027, 250035, + 250044, 250051, 250059, 250067, 250076, 250084, 250093, 250102, + 250112, 250115, 250119, 250123, 250128, 250132, 250137, 250142, + 250148, 250152, 250157, 250162, 250168, 250173, 250179, 250185, + 250192, 250196, 250201, 250206, 250212, 250217, 250223, 250229, + 250236, 250241, 250247, 250253, 250260, 250266, 250273, 250280, + 250288, 250292, 250297, 250302, 250308, 250313, 250319, 250325, + 250332, 250337, 250343, 250349, 250356, 250362, 250369, 250376, + 250384, 250389, 250395, 250401, 250408, 250414, 250421, 250428, + 250436, 250442, 250449, 250456, 250464, 250471, 250479, 250487, + 250496, 250500, 250505, 250510, 250516, 250521, 250527, 250533, + 250540, 250545, 250551, 250557, 250564, 250570, 250577, 250584, + 250592, 250597, 250603, 250609, 250616, 250622, 250629, 250636, + 250644, 250650, 250657, 250664, 250672, 250679, 250687, 250695, + 250704, 250709, 250715, 250721, 250728, 250734, 250741, 250748, + 250756, 250762, 250769, 250776, 250784, 250791, 250799, 250807, + 250816, 250822, 250829, 250836, 250844, 250851, 250859, 250867, + 250876, 250883, 250891, 250899, 250908, 250916, 250925, 250934, + 250944, 250948, 250953, 250958, 250964, 250969, 250975, 250981, + 250988, 250993, 250999, 251005, 251012, 251018, 251025, 251032, + 251040, 251045, 251051, 251057, 251064, 251070, 251077, 251084, + 251092, 251098, 251105, 251112, 251120, 251127, 251135, 251143, + 251152, 251157, 251163, 251169, 251176, 251182, 251189, 251196, + 251204, 251210, 251217, 251224, 251232, 251239, 251247, 251255, + 251264, 251270, 251277, 251284, 251292, 251299, 251307, 251315, + 251324, 251331, 251339, 251347, 251356, 251364, 251373, 251382, + 251392, 251397, 251403, 251409, 251416, 251422, 251429, 251436, + 251444, 251450, 251457, 251464, 251472, 251479, 251487, 251495, + 251504, 251510, 251517, 251524, 251532, 251539, 251547, 251555, + 251564, 251571, 251579, 251587, 251596, 251604, 251613, 251622, + 251632, 251638, 251645, 251652, 251660, 251667, 251675, 251683, + 251692, 251699, 251707, 251715, 251724, 251732, 251741, 251750, + 251760, 251767, 251775, 251783, 251792, 251800, 251809, 251818, + 251828, 251836, 251845, 251854, 251864, 251873, 251883, 251893, + 251904, 251906, 251909, 251912, 251916, 251919, 251923, 251927, + 251932, 251935, 251939, 251943, 251948, 251952, 251957, 251962, + 251968, 251971, 251975, 251979, 251984, 251988, 251993, 251998, + 252004, 252008, 252013, 252018, 252024, 252029, 252035, 252041, + 252048, 252051, 252055, 252059, 252064, 252068, 252073, 252078, + 252084, 252088, 252093, 252098, 252104, 252109, 252115, 252121, + 252128, 252132, 252137, 252142, 252148, 252153, 252159, 252165, + 252172, 252177, 252183, 252189, 252196, 252202, 252209, 252216, + 252224, 252227, 252231, 252235, 252240, 252244, 252249, 252254, + 252260, 252264, 252269, 252274, 252280, 252285, 252291, 252297, + 252304, 252308, 252313, 252318, 252324, 252329, 252335, 252341, + 252348, 252353, 252359, 252365, 252372, 252378, 252385, 252392, + 252400, 252404, 252409, 252414, 252420, 252425, 252431, 252437, + 252444, 252449, 252455, 252461, 252468, 252474, 252481, 252488, + 252496, 252501, 252507, 252513, 252520, 252526, 252533, 252540, + 252548, 252554, 252561, 252568, 252576, 252583, 252591, 252599, + 252608, 252611, 252615, 252619, 252624, 252628, 252633, 252638, + 252644, 252648, 252653, 252658, 252664, 252669, 252675, 252681, + 252688, 252692, 252697, 252702, 252708, 252713, 252719, 252725, + 252732, 252737, 252743, 252749, 252756, 252762, 252769, 252776, + 252784, 252788, 252793, 252798, 252804, 252809, 252815, 252821, + 252828, 252833, 252839, 252845, 252852, 252858, 252865, 252872, + 252880, 252885, 252891, 252897, 252904, 252910, 252917, 252924, + 252932, 252938, 252945, 252952, 252960, 252967, 252975, 252983, + 252992, 252996, 253001, 253006, 253012, 253017, 253023, 253029, + 253036, 253041, 253047, 253053, 253060, 253066, 253073, 253080, + 253088, 253093, 253099, 253105, 253112, 253118, 253125, 253132, + 253140, 253146, 253153, 253160, 253168, 253175, 253183, 253191, + 253200, 253205, 253211, 253217, 253224, 253230, 253237, 253244, + 253252, 253258, 253265, 253272, 253280, 253287, 253295, 253303, + 253312, 253318, 253325, 253332, 253340, 253347, 253355, 253363, + 253372, 253379, 253387, 253395, 253404, 253412, 253421, 253430, + 253440, 253443, 253447, 253451, 253456, 253460, 253465, 253470, + 253476, 253480, 253485, 253490, 253496, 253501, 253507, 253513, + 253520, 253524, 253529, 253534, 253540, 253545, 253551, 253557, + 253564, 253569, 253575, 253581, 253588, 253594, 253601, 253608, + 253616, 253620, 253625, 253630, 253636, 253641, 253647, 253653, + 253660, 253665, 253671, 253677, 253684, 253690, 253697, 253704, + 253712, 253717, 253723, 253729, 253736, 253742, 253749, 253756, + 253764, 253770, 253777, 253784, 253792, 253799, 253807, 253815, + 253824, 253828, 253833, 253838, 253844, 253849, 253855, 253861, + 253868, 253873, 253879, 253885, 253892, 253898, 253905, 253912, + 253920, 253925, 253931, 253937, 253944, 253950, 253957, 253964, + 253972, 253978, 253985, 253992, 254000, 254007, 254015, 254023, + 254032, 254037, 254043, 254049, 254056, 254062, 254069, 254076, + 254084, 254090, 254097, 254104, 254112, 254119, 254127, 254135, + 254144, 254150, 254157, 254164, 254172, 254179, 254187, 254195, + 254204, 254211, 254219, 254227, 254236, 254244, 254253, 254262, + 254272, 254276, 254281, 254286, 254292, 254297, 254303, 254309, + 254316, 254321, 254327, 254333, 254340, 254346, 254353, 254360, + 254368, 254373, 254379, 254385, 254392, 254398, 254405, 254412, + 254420, 254426, 254433, 254440, 254448, 254455, 254463, 254471, + 254480, 254485, 254491, 254497, 254504, 254510, 254517, 254524, + 254532, 254538, 254545, 254552, 254560, 254567, 254575, 254583, + 254592, 254598, 254605, 254612, 254620, 254627, 254635, 254643, + 254652, 254659, 254667, 254675, 254684, 254692, 254701, 254710, + 254720, 254725, 254731, 254737, 254744, 254750, 254757, 254764, + 254772, 254778, 254785, 254792, 254800, 254807, 254815, 254823, + 254832, 254838, 254845, 254852, 254860, 254867, 254875, 254883, + 254892, 254899, 254907, 254915, 254924, 254932, 254941, 254950, + 254960, 254966, 254973, 254980, 254988, 254995, 255003, 255011, + 255020, 255027, 255035, 255043, 255052, 255060, 255069, 255078, + 255088, 255095, 255103, 255111, 255120, 255128, 255137, 255146, + 255156, 255164, 255173, 255182, 255192, 255201, 255211, 255221, + 255232, 255235, 255239, 255243, 255248, 255252, 255257, 255262, + 255268, 255272, 255277, 255282, 255288, 255293, 255299, 255305, + 255312, 255316, 255321, 255326, 255332, 255337, 255343, 255349, + 255356, 255361, 255367, 255373, 255380, 255386, 255393, 255400, + 255408, 255412, 255417, 255422, 255428, 255433, 255439, 255445, + 255452, 255457, 255463, 255469, 255476, 255482, 255489, 255496, + 255504, 255509, 255515, 255521, 255528, 255534, 255541, 255548, + 255556, 255562, 255569, 255576, 255584, 255591, 255599, 255607, + 255616, 255620, 255625, 255630, 255636, 255641, 255647, 255653, + 255660, 255665, 255671, 255677, 255684, 255690, 255697, 255704, + 255712, 255717, 255723, 255729, 255736, 255742, 255749, 255756, + 255764, 255770, 255777, 255784, 255792, 255799, 255807, 255815, + 255824, 255829, 255835, 255841, 255848, 255854, 255861, 255868, + 255876, 255882, 255889, 255896, 255904, 255911, 255919, 255927, + 255936, 255942, 255949, 255956, 255964, 255971, 255979, 255987, + 255996, 256003, 256011, 256019, 256028, 256036, 256045, 256054, + 256064, 256068, 256073, 256078, 256084, 256089, 256095, 256101, + 256108, 256113, 256119, 256125, 256132, 256138, 256145, 256152, + 256160, 256165, 256171, 256177, 256184, 256190, 256197, 256204, + 256212, 256218, 256225, 256232, 256240, 256247, 256255, 256263, + 256272, 256277, 256283, 256289, 256296, 256302, 256309, 256316, + 256324, 256330, 256337, 256344, 256352, 256359, 256367, 256375, + 256384, 256390, 256397, 256404, 256412, 256419, 256427, 256435, + 256444, 256451, 256459, 256467, 256476, 256484, 256493, 256502, + 256512, 256517, 256523, 256529, 256536, 256542, 256549, 256556, + 256564, 256570, 256577, 256584, 256592, 256599, 256607, 256615, + 256624, 256630, 256637, 256644, 256652, 256659, 256667, 256675, + 256684, 256691, 256699, 256707, 256716, 256724, 256733, 256742, + 256752, 256758, 256765, 256772, 256780, 256787, 256795, 256803, + 256812, 256819, 256827, 256835, 256844, 256852, 256861, 256870, + 256880, 256887, 256895, 256903, 256912, 256920, 256929, 256938, + 256948, 256956, 256965, 256974, 256984, 256993, 257003, 257013, + 257024, 257028, 257033, 257038, 257044, 257049, 257055, 257061, + 257068, 257073, 257079, 257085, 257092, 257098, 257105, 257112, + 257120, 257125, 257131, 257137, 257144, 257150, 257157, 257164, + 257172, 257178, 257185, 257192, 257200, 257207, 257215, 257223, + 257232, 257237, 257243, 257249, 257256, 257262, 257269, 257276, + 257284, 257290, 257297, 257304, 257312, 257319, 257327, 257335, + 257344, 257350, 257357, 257364, 257372, 257379, 257387, 257395, + 257404, 257411, 257419, 257427, 257436, 257444, 257453, 257462, + 257472, 257477, 257483, 257489, 257496, 257502, 257509, 257516, + 257524, 257530, 257537, 257544, 257552, 257559, 257567, 257575, + 257584, 257590, 257597, 257604, 257612, 257619, 257627, 257635, + 257644, 257651, 257659, 257667, 257676, 257684, 257693, 257702, + 257712, 257718, 257725, 257732, 257740, 257747, 257755, 257763, + 257772, 257779, 257787, 257795, 257804, 257812, 257821, 257830, + 257840, 257847, 257855, 257863, 257872, 257880, 257889, 257898, + 257908, 257916, 257925, 257934, 257944, 257953, 257963, 257973, + 257984, 257989, 257995, 258001, 258008, 258014, 258021, 258028, + 258036, 258042, 258049, 258056, 258064, 258071, 258079, 258087, + 258096, 258102, 258109, 258116, 258124, 258131, 258139, 258147, + 258156, 258163, 258171, 258179, 258188, 258196, 258205, 258214, + 258224, 258230, 258237, 258244, 258252, 258259, 258267, 258275, + 258284, 258291, 258299, 258307, 258316, 258324, 258333, 258342, + 258352, 258359, 258367, 258375, 258384, 258392, 258401, 258410, + 258420, 258428, 258437, 258446, 258456, 258465, 258475, 258485, + 258496, 258502, 258509, 258516, 258524, 258531, 258539, 258547, + 258556, 258563, 258571, 258579, 258588, 258596, 258605, 258614, + 258624, 258631, 258639, 258647, 258656, 258664, 258673, 258682, + 258692, 258700, 258709, 258718, 258728, 258737, 258747, 258757, + 258768, 258775, 258783, 258791, 258800, 258808, 258817, 258826, + 258836, 258844, 258853, 258862, 258872, 258881, 258891, 258901, + 258912, 258920, 258929, 258938, 258948, 258957, 258967, 258977, + 258988, 258997, 259007, 259017, 259028, 259038, 259049, 259060, + 259072, 259074, 259077, 259080, 259084, 259087, 259091, 259095, + 259100, 259103, 259107, 259111, 259116, 259120, 259125, 259130, + 259136, 259139, 259143, 259147, 259152, 259156, 259161, 259166, + 259172, 259176, 259181, 259186, 259192, 259197, 259203, 259209, + 259216, 259219, 259223, 259227, 259232, 259236, 259241, 259246, + 259252, 259256, 259261, 259266, 259272, 259277, 259283, 259289, + 259296, 259300, 259305, 259310, 259316, 259321, 259327, 259333, + 259340, 259345, 259351, 259357, 259364, 259370, 259377, 259384, + 259392, 259395, 259399, 259403, 259408, 259412, 259417, 259422, + 259428, 259432, 259437, 259442, 259448, 259453, 259459, 259465, + 259472, 259476, 259481, 259486, 259492, 259497, 259503, 259509, + 259516, 259521, 259527, 259533, 259540, 259546, 259553, 259560, + 259568, 259572, 259577, 259582, 259588, 259593, 259599, 259605, + 259612, 259617, 259623, 259629, 259636, 259642, 259649, 259656, + 259664, 259669, 259675, 259681, 259688, 259694, 259701, 259708, + 259716, 259722, 259729, 259736, 259744, 259751, 259759, 259767, + 259776, 259779, 259783, 259787, 259792, 259796, 259801, 259806, + 259812, 259816, 259821, 259826, 259832, 259837, 259843, 259849, + 259856, 259860, 259865, 259870, 259876, 259881, 259887, 259893, + 259900, 259905, 259911, 259917, 259924, 259930, 259937, 259944, + 259952, 259956, 259961, 259966, 259972, 259977, 259983, 259989, + 259996, 260001, 260007, 260013, 260020, 260026, 260033, 260040, + 260048, 260053, 260059, 260065, 260072, 260078, 260085, 260092, + 260100, 260106, 260113, 260120, 260128, 260135, 260143, 260151, + 260160, 260164, 260169, 260174, 260180, 260185, 260191, 260197, + 260204, 260209, 260215, 260221, 260228, 260234, 260241, 260248, + 260256, 260261, 260267, 260273, 260280, 260286, 260293, 260300, + 260308, 260314, 260321, 260328, 260336, 260343, 260351, 260359, + 260368, 260373, 260379, 260385, 260392, 260398, 260405, 260412, + 260420, 260426, 260433, 260440, 260448, 260455, 260463, 260471, + 260480, 260486, 260493, 260500, 260508, 260515, 260523, 260531, + 260540, 260547, 260555, 260563, 260572, 260580, 260589, 260598, + 260608, 260611, 260615, 260619, 260624, 260628, 260633, 260638, + 260644, 260648, 260653, 260658, 260664, 260669, 260675, 260681, + 260688, 260692, 260697, 260702, 260708, 260713, 260719, 260725, + 260732, 260737, 260743, 260749, 260756, 260762, 260769, 260776, + 260784, 260788, 260793, 260798, 260804, 260809, 260815, 260821, + 260828, 260833, 260839, 260845, 260852, 260858, 260865, 260872, + 260880, 260885, 260891, 260897, 260904, 260910, 260917, 260924, + 260932, 260938, 260945, 260952, 260960, 260967, 260975, 260983, + 260992, 260996, 261001, 261006, 261012, 261017, 261023, 261029, + 261036, 261041, 261047, 261053, 261060, 261066, 261073, 261080, + 261088, 261093, 261099, 261105, 261112, 261118, 261125, 261132, + 261140, 261146, 261153, 261160, 261168, 261175, 261183, 261191, + 261200, 261205, 261211, 261217, 261224, 261230, 261237, 261244, + 261252, 261258, 261265, 261272, 261280, 261287, 261295, 261303, + 261312, 261318, 261325, 261332, 261340, 261347, 261355, 261363, + 261372, 261379, 261387, 261395, 261404, 261412, 261421, 261430, + 261440, 261444, 261449, 261454, 261460, 261465, 261471, 261477, + 261484, 261489, 261495, 261501, 261508, 261514, 261521, 261528, + 261536, 261541, 261547, 261553, 261560, 261566, 261573, 261580, + 261588, 261594, 261601, 261608, 261616, 261623, 261631, 261639, + 261648, 261653, 261659, 261665, 261672, 261678, 261685, 261692, + 261700, 261706, 261713, 261720, 261728, 261735, 261743, 261751, + 261760, 261766, 261773, 261780, 261788, 261795, 261803, 261811, + 261820, 261827, 261835, 261843, 261852, 261860, 261869, 261878, + 261888, 261893, 261899, 261905, 261912, 261918, 261925, 261932, + 261940, 261946, 261953, 261960, 261968, 261975, 261983, 261991, + 262000, 262006, 262013, 262020, 262028, 262035, 262043, 262051, + 262060, 262067, 262075, 262083, 262092, 262100, 262109, 262118, + 262128, 262134, 262141, 262148, 262156, 262163, 262171, 262179, + 262188, 262195, 262203, 262211, 262220, 262228, 262237, 262246, + 262256, 262263, 262271, 262279, 262288, 262296, 262305, 262314, + 262324, 262332, 262341, 262350, 262360, 262369, 262379, 262389, + 262400, 262403, 262407, 262411, 262416, 262420, 262425, 262430, + 262436, 262440, 262445, 262450, 262456, 262461, 262467, 262473, + 262480, 262484, 262489, 262494, 262500, 262505, 262511, 262517, + 262524, 262529, 262535, 262541, 262548, 262554, 262561, 262568, + 262576, 262580, 262585, 262590, 262596, 262601, 262607, 262613, + 262620, 262625, 262631, 262637, 262644, 262650, 262657, 262664, + 262672, 262677, 262683, 262689, 262696, 262702, 262709, 262716, + 262724, 262730, 262737, 262744, 262752, 262759, 262767, 262775, + 262784, 262788, 262793, 262798, 262804, 262809, 262815, 262821, + 262828, 262833, 262839, 262845, 262852, 262858, 262865, 262872, + 262880, 262885, 262891, 262897, 262904, 262910, 262917, 262924, + 262932, 262938, 262945, 262952, 262960, 262967, 262975, 262983, + 262992, 262997, 263003, 263009, 263016, 263022, 263029, 263036, + 263044, 263050, 263057, 263064, 263072, 263079, 263087, 263095, + 263104, 263110, 263117, 263124, 263132, 263139, 263147, 263155, + 263164, 263171, 263179, 263187, 263196, 263204, 263213, 263222, + 263232, 263236, 263241, 263246, 263252, 263257, 263263, 263269, + 263276, 263281, 263287, 263293, 263300, 263306, 263313, 263320, + 263328, 263333, 263339, 263345, 263352, 263358, 263365, 263372, + 263380, 263386, 263393, 263400, 263408, 263415, 263423, 263431, + 263440, 263445, 263451, 263457, 263464, 263470, 263477, 263484, + 263492, 263498, 263505, 263512, 263520, 263527, 263535, 263543, + 263552, 263558, 263565, 263572, 263580, 263587, 263595, 263603, + 263612, 263619, 263627, 263635, 263644, 263652, 263661, 263670, + 263680, 263685, 263691, 263697, 263704, 263710, 263717, 263724, + 263732, 263738, 263745, 263752, 263760, 263767, 263775, 263783, + 263792, 263798, 263805, 263812, 263820, 263827, 263835, 263843, + 263852, 263859, 263867, 263875, 263884, 263892, 263901, 263910, + 263920, 263926, 263933, 263940, 263948, 263955, 263963, 263971, + 263980, 263987, 263995, 264003, 264012, 264020, 264029, 264038, + 264048, 264055, 264063, 264071, 264080, 264088, 264097, 264106, + 264116, 264124, 264133, 264142, 264152, 264161, 264171, 264181, + 264192, 264196, 264201, 264206, 264212, 264217, 264223, 264229, + 264236, 264241, 264247, 264253, 264260, 264266, 264273, 264280, + 264288, 264293, 264299, 264305, 264312, 264318, 264325, 264332, + 264340, 264346, 264353, 264360, 264368, 264375, 264383, 264391, + 264400, 264405, 264411, 264417, 264424, 264430, 264437, 264444, + 264452, 264458, 264465, 264472, 264480, 264487, 264495, 264503, + 264512, 264518, 264525, 264532, 264540, 264547, 264555, 264563, + 264572, 264579, 264587, 264595, 264604, 264612, 264621, 264630, + 264640, 264645, 264651, 264657, 264664, 264670, 264677, 264684, + 264692, 264698, 264705, 264712, 264720, 264727, 264735, 264743, + 264752, 264758, 264765, 264772, 264780, 264787, 264795, 264803, + 264812, 264819, 264827, 264835, 264844, 264852, 264861, 264870, + 264880, 264886, 264893, 264900, 264908, 264915, 264923, 264931, + 264940, 264947, 264955, 264963, 264972, 264980, 264989, 264998, + 265008, 265015, 265023, 265031, 265040, 265048, 265057, 265066, + 265076, 265084, 265093, 265102, 265112, 265121, 265131, 265141, + 265152, 265157, 265163, 265169, 265176, 265182, 265189, 265196, + 265204, 265210, 265217, 265224, 265232, 265239, 265247, 265255, + 265264, 265270, 265277, 265284, 265292, 265299, 265307, 265315, + 265324, 265331, 265339, 265347, 265356, 265364, 265373, 265382, + 265392, 265398, 265405, 265412, 265420, 265427, 265435, 265443, + 265452, 265459, 265467, 265475, 265484, 265492, 265501, 265510, + 265520, 265527, 265535, 265543, 265552, 265560, 265569, 265578, + 265588, 265596, 265605, 265614, 265624, 265633, 265643, 265653, + 265664, 265670, 265677, 265684, 265692, 265699, 265707, 265715, + 265724, 265731, 265739, 265747, 265756, 265764, 265773, 265782, + 265792, 265799, 265807, 265815, 265824, 265832, 265841, 265850, + 265860, 265868, 265877, 265886, 265896, 265905, 265915, 265925, + 265936, 265943, 265951, 265959, 265968, 265976, 265985, 265994, + 266004, 266012, 266021, 266030, 266040, 266049, 266059, 266069, + 266080, 266088, 266097, 266106, 266116, 266125, 266135, 266145, + 266156, 266165, 266175, 266185, 266196, 266206, 266217, 266228, + 266240, 266243, 266247, 266251, 266256, 266260, 266265, 266270, + 266276, 266280, 266285, 266290, 266296, 266301, 266307, 266313, + 266320, 266324, 266329, 266334, 266340, 266345, 266351, 266357, + 266364, 266369, 266375, 266381, 266388, 266394, 266401, 266408, + 266416, 266420, 266425, 266430, 266436, 266441, 266447, 266453, + 266460, 266465, 266471, 266477, 266484, 266490, 266497, 266504, + 266512, 266517, 266523, 266529, 266536, 266542, 266549, 266556, + 266564, 266570, 266577, 266584, 266592, 266599, 266607, 266615, + 266624, 266628, 266633, 266638, 266644, 266649, 266655, 266661, + 266668, 266673, 266679, 266685, 266692, 266698, 266705, 266712, + 266720, 266725, 266731, 266737, 266744, 266750, 266757, 266764, + 266772, 266778, 266785, 266792, 266800, 266807, 266815, 266823, + 266832, 266837, 266843, 266849, 266856, 266862, 266869, 266876, + 266884, 266890, 266897, 266904, 266912, 266919, 266927, 266935, + 266944, 266950, 266957, 266964, 266972, 266979, 266987, 266995, + 267004, 267011, 267019, 267027, 267036, 267044, 267053, 267062, + 267072, 267076, 267081, 267086, 267092, 267097, 267103, 267109, + 267116, 267121, 267127, 267133, 267140, 267146, 267153, 267160, + 267168, 267173, 267179, 267185, 267192, 267198, 267205, 267212, + 267220, 267226, 267233, 267240, 267248, 267255, 267263, 267271, + 267280, 267285, 267291, 267297, 267304, 267310, 267317, 267324, + 267332, 267338, 267345, 267352, 267360, 267367, 267375, 267383, + 267392, 267398, 267405, 267412, 267420, 267427, 267435, 267443, + 267452, 267459, 267467, 267475, 267484, 267492, 267501, 267510, + 267520, 267525, 267531, 267537, 267544, 267550, 267557, 267564, + 267572, 267578, 267585, 267592, 267600, 267607, 267615, 267623, + 267632, 267638, 267645, 267652, 267660, 267667, 267675, 267683, + 267692, 267699, 267707, 267715, 267724, 267732, 267741, 267750, + 267760, 267766, 267773, 267780, 267788, 267795, 267803, 267811, + 267820, 267827, 267835, 267843, 267852, 267860, 267869, 267878, + 267888, 267895, 267903, 267911, 267920, 267928, 267937, 267946, + 267956, 267964, 267973, 267982, 267992, 268001, 268011, 268021, + 268032, 268036, 268041, 268046, 268052, 268057, 268063, 268069, + 268076, 268081, 268087, 268093, 268100, 268106, 268113, 268120, + 268128, 268133, 268139, 268145, 268152, 268158, 268165, 268172, + 268180, 268186, 268193, 268200, 268208, 268215, 268223, 268231, + 268240, 268245, 268251, 268257, 268264, 268270, 268277, 268284, + 268292, 268298, 268305, 268312, 268320, 268327, 268335, 268343, + 268352, 268358, 268365, 268372, 268380, 268387, 268395, 268403, + 268412, 268419, 268427, 268435, 268444, 268452, 268461, 268470, + 268480, 268485, 268491, 268497, 268504, 268510, 268517, 268524, + 268532, 268538, 268545, 268552, 268560, 268567, 268575, 268583, + 268592, 268598, 268605, 268612, 268620, 268627, 268635, 268643, + 268652, 268659, 268667, 268675, 268684, 268692, 268701, 268710, + 268720, 268726, 268733, 268740, 268748, 268755, 268763, 268771, + 268780, 268787, 268795, 268803, 268812, 268820, 268829, 268838, + 268848, 268855, 268863, 268871, 268880, 268888, 268897, 268906, + 268916, 268924, 268933, 268942, 268952, 268961, 268971, 268981, + 268992, 268997, 269003, 269009, 269016, 269022, 269029, 269036, + 269044, 269050, 269057, 269064, 269072, 269079, 269087, 269095, + 269104, 269110, 269117, 269124, 269132, 269139, 269147, 269155, + 269164, 269171, 269179, 269187, 269196, 269204, 269213, 269222, + 269232, 269238, 269245, 269252, 269260, 269267, 269275, 269283, + 269292, 269299, 269307, 269315, 269324, 269332, 269341, 269350, + 269360, 269367, 269375, 269383, 269392, 269400, 269409, 269418, + 269428, 269436, 269445, 269454, 269464, 269473, 269483, 269493, + 269504, 269510, 269517, 269524, 269532, 269539, 269547, 269555, + 269564, 269571, 269579, 269587, 269596, 269604, 269613, 269622, + 269632, 269639, 269647, 269655, 269664, 269672, 269681, 269690, + 269700, 269708, 269717, 269726, 269736, 269745, 269755, 269765, + 269776, 269783, 269791, 269799, 269808, 269816, 269825, 269834, + 269844, 269852, 269861, 269870, 269880, 269889, 269899, 269909, + 269920, 269928, 269937, 269946, 269956, 269965, 269975, 269985, + 269996, 270005, 270015, 270025, 270036, 270046, 270057, 270068, + 270080, 270084, 270089, 270094, 270100, 270105, 270111, 270117, + 270124, 270129, 270135, 270141, 270148, 270154, 270161, 270168, + 270176, 270181, 270187, 270193, 270200, 270206, 270213, 270220, + 270228, 270234, 270241, 270248, 270256, 270263, 270271, 270279, + 270288, 270293, 270299, 270305, 270312, 270318, 270325, 270332, + 270340, 270346, 270353, 270360, 270368, 270375, 270383, 270391, + 270400, 270406, 270413, 270420, 270428, 270435, 270443, 270451, + 270460, 270467, 270475, 270483, 270492, 270500, 270509, 270518, + 270528, 270533, 270539, 270545, 270552, 270558, 270565, 270572, + 270580, 270586, 270593, 270600, 270608, 270615, 270623, 270631, + 270640, 270646, 270653, 270660, 270668, 270675, 270683, 270691, + 270700, 270707, 270715, 270723, 270732, 270740, 270749, 270758, + 270768, 270774, 270781, 270788, 270796, 270803, 270811, 270819, + 270828, 270835, 270843, 270851, 270860, 270868, 270877, 270886, + 270896, 270903, 270911, 270919, 270928, 270936, 270945, 270954, + 270964, 270972, 270981, 270990, 271000, 271009, 271019, 271029, + 271040, 271045, 271051, 271057, 271064, 271070, 271077, 271084, + 271092, 271098, 271105, 271112, 271120, 271127, 271135, 271143, + 271152, 271158, 271165, 271172, 271180, 271187, 271195, 271203, + 271212, 271219, 271227, 271235, 271244, 271252, 271261, 271270, + 271280, 271286, 271293, 271300, 271308, 271315, 271323, 271331, + 271340, 271347, 271355, 271363, 271372, 271380, 271389, 271398, + 271408, 271415, 271423, 271431, 271440, 271448, 271457, 271466, + 271476, 271484, 271493, 271502, 271512, 271521, 271531, 271541, + 271552, 271558, 271565, 271572, 271580, 271587, 271595, 271603, + 271612, 271619, 271627, 271635, 271644, 271652, 271661, 271670, + 271680, 271687, 271695, 271703, 271712, 271720, 271729, 271738, + 271748, 271756, 271765, 271774, 271784, 271793, 271803, 271813, + 271824, 271831, 271839, 271847, 271856, 271864, 271873, 271882, + 271892, 271900, 271909, 271918, 271928, 271937, 271947, 271957, + 271968, 271976, 271985, 271994, 272004, 272013, 272023, 272033, + 272044, 272053, 272063, 272073, 272084, 272094, 272105, 272116, + 272128, 272133, 272139, 272145, 272152, 272158, 272165, 272172, + 272180, 272186, 272193, 272200, 272208, 272215, 272223, 272231, + 272240, 272246, 272253, 272260, 272268, 272275, 272283, 272291, + 272300, 272307, 272315, 272323, 272332, 272340, 272349, 272358, + 272368, 272374, 272381, 272388, 272396, 272403, 272411, 272419, + 272428, 272435, 272443, 272451, 272460, 272468, 272477, 272486, + 272496, 272503, 272511, 272519, 272528, 272536, 272545, 272554, + 272564, 272572, 272581, 272590, 272600, 272609, 272619, 272629, + 272640, 272646, 272653, 272660, 272668, 272675, 272683, 272691, + 272700, 272707, 272715, 272723, 272732, 272740, 272749, 272758, + 272768, 272775, 272783, 272791, 272800, 272808, 272817, 272826, + 272836, 272844, 272853, 272862, 272872, 272881, 272891, 272901, + 272912, 272919, 272927, 272935, 272944, 272952, 272961, 272970, + 272980, 272988, 272997, 273006, 273016, 273025, 273035, 273045, + 273056, 273064, 273073, 273082, 273092, 273101, 273111, 273121, + 273132, 273141, 273151, 273161, 273172, 273182, 273193, 273204, + 273216, 273222, 273229, 273236, 273244, 273251, 273259, 273267, + 273276, 273283, 273291, 273299, 273308, 273316, 273325, 273334, + 273344, 273351, 273359, 273367, 273376, 273384, 273393, 273402, + 273412, 273420, 273429, 273438, 273448, 273457, 273467, 273477, + 273488, 273495, 273503, 273511, 273520, 273528, 273537, 273546, + 273556, 273564, 273573, 273582, 273592, 273601, 273611, 273621, + 273632, 273640, 273649, 273658, 273668, 273677, 273687, 273697, + 273708, 273717, 273727, 273737, 273748, 273758, 273769, 273780, + 273792, 273799, 273807, 273815, 273824, 273832, 273841, 273850, + 273860, 273868, 273877, 273886, 273896, 273905, 273915, 273925, + 273936, 273944, 273953, 273962, 273972, 273981, 273991, 274001, + 274012, 274021, 274031, 274041, 274052, 274062, 274073, 274084, + 274096, 274104, 274113, 274122, 274132, 274141, 274151, 274161, + 274172, 274181, 274191, 274201, 274212, 274222, 274233, 274244, + 274256, 274265, 274275, 274285, 274296, 274306, 274317, 274328, + 274340, 274350, 274361, 274372, 274384, 274395, 274407, 274419, + 274432, 274434, 274437, 274440, 274444, 274447, 274451, 274455, + 274460, 274463, 274467, 274471, 274476, 274480, 274485, 274490, + 274496, 274499, 274503, 274507, 274512, 274516, 274521, 274526, + 274532, 274536, 274541, 274546, 274552, 274557, 274563, 274569, + 274576, 274579, 274583, 274587, 274592, 274596, 274601, 274606, + 274612, 274616, 274621, 274626, 274632, 274637, 274643, 274649, + 274656, 274660, 274665, 274670, 274676, 274681, 274687, 274693, + 274700, 274705, 274711, 274717, 274724, 274730, 274737, 274744, + 274752, 274755, 274759, 274763, 274768, 274772, 274777, 274782, + 274788, 274792, 274797, 274802, 274808, 274813, 274819, 274825, + 274832, 274836, 274841, 274846, 274852, 274857, 274863, 274869, + 274876, 274881, 274887, 274893, 274900, 274906, 274913, 274920, + 274928, 274932, 274937, 274942, 274948, 274953, 274959, 274965, + 274972, 274977, 274983, 274989, 274996, 275002, 275009, 275016, + 275024, 275029, 275035, 275041, 275048, 275054, 275061, 275068, + 275076, 275082, 275089, 275096, 275104, 275111, 275119, 275127, + 275136, 275139, 275143, 275147, 275152, 275156, 275161, 275166, + 275172, 275176, 275181, 275186, 275192, 275197, 275203, 275209, + 275216, 275220, 275225, 275230, 275236, 275241, 275247, 275253, + 275260, 275265, 275271, 275277, 275284, 275290, 275297, 275304, + 275312, 275316, 275321, 275326, 275332, 275337, 275343, 275349, + 275356, 275361, 275367, 275373, 275380, 275386, 275393, 275400, + 275408, 275413, 275419, 275425, 275432, 275438, 275445, 275452, + 275460, 275466, 275473, 275480, 275488, 275495, 275503, 275511, + 275520, 275524, 275529, 275534, 275540, 275545, 275551, 275557, + 275564, 275569, 275575, 275581, 275588, 275594, 275601, 275608, + 275616, 275621, 275627, 275633, 275640, 275646, 275653, 275660, + 275668, 275674, 275681, 275688, 275696, 275703, 275711, 275719, + 275728, 275733, 275739, 275745, 275752, 275758, 275765, 275772, + 275780, 275786, 275793, 275800, 275808, 275815, 275823, 275831, + 275840, 275846, 275853, 275860, 275868, 275875, 275883, 275891, + 275900, 275907, 275915, 275923, 275932, 275940, 275949, 275958, + 275968, 275971, 275975, 275979, 275984, 275988, 275993, 275998, + 276004, 276008, 276013, 276018, 276024, 276029, 276035, 276041, + 276048, 276052, 276057, 276062, 276068, 276073, 276079, 276085, + 276092, 276097, 276103, 276109, 276116, 276122, 276129, 276136, + 276144, 276148, 276153, 276158, 276164, 276169, 276175, 276181, + 276188, 276193, 276199, 276205, 276212, 276218, 276225, 276232, + 276240, 276245, 276251, 276257, 276264, 276270, 276277, 276284, + 276292, 276298, 276305, 276312, 276320, 276327, 276335, 276343, + 276352, 276356, 276361, 276366, 276372, 276377, 276383, 276389, + 276396, 276401, 276407, 276413, 276420, 276426, 276433, 276440, + 276448, 276453, 276459, 276465, 276472, 276478, 276485, 276492, + 276500, 276506, 276513, 276520, 276528, 276535, 276543, 276551, + 276560, 276565, 276571, 276577, 276584, 276590, 276597, 276604, + 276612, 276618, 276625, 276632, 276640, 276647, 276655, 276663, + 276672, 276678, 276685, 276692, 276700, 276707, 276715, 276723, + 276732, 276739, 276747, 276755, 276764, 276772, 276781, 276790, + 276800, 276804, 276809, 276814, 276820, 276825, 276831, 276837, + 276844, 276849, 276855, 276861, 276868, 276874, 276881, 276888, + 276896, 276901, 276907, 276913, 276920, 276926, 276933, 276940, + 276948, 276954, 276961, 276968, 276976, 276983, 276991, 276999, + 277008, 277013, 277019, 277025, 277032, 277038, 277045, 277052, + 277060, 277066, 277073, 277080, 277088, 277095, 277103, 277111, + 277120, 277126, 277133, 277140, 277148, 277155, 277163, 277171, + 277180, 277187, 277195, 277203, 277212, 277220, 277229, 277238, + 277248, 277253, 277259, 277265, 277272, 277278, 277285, 277292, + 277300, 277306, 277313, 277320, 277328, 277335, 277343, 277351, + 277360, 277366, 277373, 277380, 277388, 277395, 277403, 277411, + 277420, 277427, 277435, 277443, 277452, 277460, 277469, 277478, + 277488, 277494, 277501, 277508, 277516, 277523, 277531, 277539, + 277548, 277555, 277563, 277571, 277580, 277588, 277597, 277606, + 277616, 277623, 277631, 277639, 277648, 277656, 277665, 277674, + 277684, 277692, 277701, 277710, 277720, 277729, 277739, 277749, + 277760, 277763, 277767, 277771, 277776, 277780, 277785, 277790, + 277796, 277800, 277805, 277810, 277816, 277821, 277827, 277833, + 277840, 277844, 277849, 277854, 277860, 277865, 277871, 277877, + 277884, 277889, 277895, 277901, 277908, 277914, 277921, 277928, + 277936, 277940, 277945, 277950, 277956, 277961, 277967, 277973, + 277980, 277985, 277991, 277997, 278004, 278010, 278017, 278024, + 278032, 278037, 278043, 278049, 278056, 278062, 278069, 278076, + 278084, 278090, 278097, 278104, 278112, 278119, 278127, 278135, + 278144, 278148, 278153, 278158, 278164, 278169, 278175, 278181, + 278188, 278193, 278199, 278205, 278212, 278218, 278225, 278232, + 278240, 278245, 278251, 278257, 278264, 278270, 278277, 278284, + 278292, 278298, 278305, 278312, 278320, 278327, 278335, 278343, + 278352, 278357, 278363, 278369, 278376, 278382, 278389, 278396, + 278404, 278410, 278417, 278424, 278432, 278439, 278447, 278455, + 278464, 278470, 278477, 278484, 278492, 278499, 278507, 278515, + 278524, 278531, 278539, 278547, 278556, 278564, 278573, 278582, + 278592, 278596, 278601, 278606, 278612, 278617, 278623, 278629, + 278636, 278641, 278647, 278653, 278660, 278666, 278673, 278680, + 278688, 278693, 278699, 278705, 278712, 278718, 278725, 278732, + 278740, 278746, 278753, 278760, 278768, 278775, 278783, 278791, + 278800, 278805, 278811, 278817, 278824, 278830, 278837, 278844, + 278852, 278858, 278865, 278872, 278880, 278887, 278895, 278903, + 278912, 278918, 278925, 278932, 278940, 278947, 278955, 278963, + 278972, 278979, 278987, 278995, 279004, 279012, 279021, 279030, + 279040, 279045, 279051, 279057, 279064, 279070, 279077, 279084, + 279092, 279098, 279105, 279112, 279120, 279127, 279135, 279143, + 279152, 279158, 279165, 279172, 279180, 279187, 279195, 279203, + 279212, 279219, 279227, 279235, 279244, 279252, 279261, 279270, + 279280, 279286, 279293, 279300, 279308, 279315, 279323, 279331, + 279340, 279347, 279355, 279363, 279372, 279380, 279389, 279398, + 279408, 279415, 279423, 279431, 279440, 279448, 279457, 279466, + 279476, 279484, 279493, 279502, 279512, 279521, 279531, 279541, + 279552, 279556, 279561, 279566, 279572, 279577, 279583, 279589, + 279596, 279601, 279607, 279613, 279620, 279626, 279633, 279640, + 279648, 279653, 279659, 279665, 279672, 279678, 279685, 279692, + 279700, 279706, 279713, 279720, 279728, 279735, 279743, 279751, + 279760, 279765, 279771, 279777, 279784, 279790, 279797, 279804, + 279812, 279818, 279825, 279832, 279840, 279847, 279855, 279863, + 279872, 279878, 279885, 279892, 279900, 279907, 279915, 279923, + 279932, 279939, 279947, 279955, 279964, 279972, 279981, 279990, + 280000, 280005, 280011, 280017, 280024, 280030, 280037, 280044, + 280052, 280058, 280065, 280072, 280080, 280087, 280095, 280103, + 280112, 280118, 280125, 280132, 280140, 280147, 280155, 280163, + 280172, 280179, 280187, 280195, 280204, 280212, 280221, 280230, + 280240, 280246, 280253, 280260, 280268, 280275, 280283, 280291, + 280300, 280307, 280315, 280323, 280332, 280340, 280349, 280358, + 280368, 280375, 280383, 280391, 280400, 280408, 280417, 280426, + 280436, 280444, 280453, 280462, 280472, 280481, 280491, 280501, + 280512, 280517, 280523, 280529, 280536, 280542, 280549, 280556, + 280564, 280570, 280577, 280584, 280592, 280599, 280607, 280615, + 280624, 280630, 280637, 280644, 280652, 280659, 280667, 280675, + 280684, 280691, 280699, 280707, 280716, 280724, 280733, 280742, + 280752, 280758, 280765, 280772, 280780, 280787, 280795, 280803, + 280812, 280819, 280827, 280835, 280844, 280852, 280861, 280870, + 280880, 280887, 280895, 280903, 280912, 280920, 280929, 280938, + 280948, 280956, 280965, 280974, 280984, 280993, 281003, 281013, + 281024, 281030, 281037, 281044, 281052, 281059, 281067, 281075, + 281084, 281091, 281099, 281107, 281116, 281124, 281133, 281142, + 281152, 281159, 281167, 281175, 281184, 281192, 281201, 281210, + 281220, 281228, 281237, 281246, 281256, 281265, 281275, 281285, + 281296, 281303, 281311, 281319, 281328, 281336, 281345, 281354, + 281364, 281372, 281381, 281390, 281400, 281409, 281419, 281429, + 281440, 281448, 281457, 281466, 281476, 281485, 281495, 281505, + 281516, 281525, 281535, 281545, 281556, 281566, 281577, 281588, + 281600, 281603, 281607, 281611, 281616, 281620, 281625, 281630, + 281636, 281640, 281645, 281650, 281656, 281661, 281667, 281673, + 281680, 281684, 281689, 281694, 281700, 281705, 281711, 281717, + 281724, 281729, 281735, 281741, 281748, 281754, 281761, 281768, + 281776, 281780, 281785, 281790, 281796, 281801, 281807, 281813, + 281820, 281825, 281831, 281837, 281844, 281850, 281857, 281864, + 281872, 281877, 281883, 281889, 281896, 281902, 281909, 281916, + 281924, 281930, 281937, 281944, 281952, 281959, 281967, 281975, + 281984, 281988, 281993, 281998, 282004, 282009, 282015, 282021, + 282028, 282033, 282039, 282045, 282052, 282058, 282065, 282072, + 282080, 282085, 282091, 282097, 282104, 282110, 282117, 282124, + 282132, 282138, 282145, 282152, 282160, 282167, 282175, 282183, + 282192, 282197, 282203, 282209, 282216, 282222, 282229, 282236, + 282244, 282250, 282257, 282264, 282272, 282279, 282287, 282295, + 282304, 282310, 282317, 282324, 282332, 282339, 282347, 282355, + 282364, 282371, 282379, 282387, 282396, 282404, 282413, 282422, + 282432, 282436, 282441, 282446, 282452, 282457, 282463, 282469, + 282476, 282481, 282487, 282493, 282500, 282506, 282513, 282520, + 282528, 282533, 282539, 282545, 282552, 282558, 282565, 282572, + 282580, 282586, 282593, 282600, 282608, 282615, 282623, 282631, + 282640, 282645, 282651, 282657, 282664, 282670, 282677, 282684, + 282692, 282698, 282705, 282712, 282720, 282727, 282735, 282743, + 282752, 282758, 282765, 282772, 282780, 282787, 282795, 282803, + 282812, 282819, 282827, 282835, 282844, 282852, 282861, 282870, + 282880, 282885, 282891, 282897, 282904, 282910, 282917, 282924, + 282932, 282938, 282945, 282952, 282960, 282967, 282975, 282983, + 282992, 282998, 283005, 283012, 283020, 283027, 283035, 283043, + 283052, 283059, 283067, 283075, 283084, 283092, 283101, 283110, + 283120, 283126, 283133, 283140, 283148, 283155, 283163, 283171, + 283180, 283187, 283195, 283203, 283212, 283220, 283229, 283238, + 283248, 283255, 283263, 283271, 283280, 283288, 283297, 283306, + 283316, 283324, 283333, 283342, 283352, 283361, 283371, 283381, + 283392, 283396, 283401, 283406, 283412, 283417, 283423, 283429, + 283436, 283441, 283447, 283453, 283460, 283466, 283473, 283480, + 283488, 283493, 283499, 283505, 283512, 283518, 283525, 283532, + 283540, 283546, 283553, 283560, 283568, 283575, 283583, 283591, + 283600, 283605, 283611, 283617, 283624, 283630, 283637, 283644, + 283652, 283658, 283665, 283672, 283680, 283687, 283695, 283703, + 283712, 283718, 283725, 283732, 283740, 283747, 283755, 283763, + 283772, 283779, 283787, 283795, 283804, 283812, 283821, 283830, + 283840, 283845, 283851, 283857, 283864, 283870, 283877, 283884, + 283892, 283898, 283905, 283912, 283920, 283927, 283935, 283943, + 283952, 283958, 283965, 283972, 283980, 283987, 283995, 284003, + 284012, 284019, 284027, 284035, 284044, 284052, 284061, 284070, + 284080, 284086, 284093, 284100, 284108, 284115, 284123, 284131, + 284140, 284147, 284155, 284163, 284172, 284180, 284189, 284198, + 284208, 284215, 284223, 284231, 284240, 284248, 284257, 284266, + 284276, 284284, 284293, 284302, 284312, 284321, 284331, 284341, + 284352, 284357, 284363, 284369, 284376, 284382, 284389, 284396, + 284404, 284410, 284417, 284424, 284432, 284439, 284447, 284455, + 284464, 284470, 284477, 284484, 284492, 284499, 284507, 284515, + 284524, 284531, 284539, 284547, 284556, 284564, 284573, 284582, + 284592, 284598, 284605, 284612, 284620, 284627, 284635, 284643, + 284652, 284659, 284667, 284675, 284684, 284692, 284701, 284710, + 284720, 284727, 284735, 284743, 284752, 284760, 284769, 284778, + 284788, 284796, 284805, 284814, 284824, 284833, 284843, 284853, + 284864, 284870, 284877, 284884, 284892, 284899, 284907, 284915, + 284924, 284931, 284939, 284947, 284956, 284964, 284973, 284982, + 284992, 284999, 285007, 285015, 285024, 285032, 285041, 285050, + 285060, 285068, 285077, 285086, 285096, 285105, 285115, 285125, + 285136, 285143, 285151, 285159, 285168, 285176, 285185, 285194, + 285204, 285212, 285221, 285230, 285240, 285249, 285259, 285269, + 285280, 285288, 285297, 285306, 285316, 285325, 285335, 285345, + 285356, 285365, 285375, 285385, 285396, 285406, 285417, 285428, + 285440, 285444, 285449, 285454, 285460, 285465, 285471, 285477, + 285484, 285489, 285495, 285501, 285508, 285514, 285521, 285528, + 285536, 285541, 285547, 285553, 285560, 285566, 285573, 285580, + 285588, 285594, 285601, 285608, 285616, 285623, 285631, 285639, + 285648, 285653, 285659, 285665, 285672, 285678, 285685, 285692, + 285700, 285706, 285713, 285720, 285728, 285735, 285743, 285751, + 285760, 285766, 285773, 285780, 285788, 285795, 285803, 285811, + 285820, 285827, 285835, 285843, 285852, 285860, 285869, 285878, + 285888, 285893, 285899, 285905, 285912, 285918, 285925, 285932, + 285940, 285946, 285953, 285960, 285968, 285975, 285983, 285991, + 286000, 286006, 286013, 286020, 286028, 286035, 286043, 286051, + 286060, 286067, 286075, 286083, 286092, 286100, 286109, 286118, + 286128, 286134, 286141, 286148, 286156, 286163, 286171, 286179, + 286188, 286195, 286203, 286211, 286220, 286228, 286237, 286246, + 286256, 286263, 286271, 286279, 286288, 286296, 286305, 286314, + 286324, 286332, 286341, 286350, 286360, 286369, 286379, 286389, + 286400, 286405, 286411, 286417, 286424, 286430, 286437, 286444, + 286452, 286458, 286465, 286472, 286480, 286487, 286495, 286503, + 286512, 286518, 286525, 286532, 286540, 286547, 286555, 286563, + 286572, 286579, 286587, 286595, 286604, 286612, 286621, 286630, + 286640, 286646, 286653, 286660, 286668, 286675, 286683, 286691, + 286700, 286707, 286715, 286723, 286732, 286740, 286749, 286758, + 286768, 286775, 286783, 286791, 286800, 286808, 286817, 286826, + 286836, 286844, 286853, 286862, 286872, 286881, 286891, 286901, + 286912, 286918, 286925, 286932, 286940, 286947, 286955, 286963, + 286972, 286979, 286987, 286995, 287004, 287012, 287021, 287030, + 287040, 287047, 287055, 287063, 287072, 287080, 287089, 287098, + 287108, 287116, 287125, 287134, 287144, 287153, 287163, 287173, + 287184, 287191, 287199, 287207, 287216, 287224, 287233, 287242, + 287252, 287260, 287269, 287278, 287288, 287297, 287307, 287317, + 287328, 287336, 287345, 287354, 287364, 287373, 287383, 287393, + 287404, 287413, 287423, 287433, 287444, 287454, 287465, 287476, + 287488, 287493, 287499, 287505, 287512, 287518, 287525, 287532, + 287540, 287546, 287553, 287560, 287568, 287575, 287583, 287591, + 287600, 287606, 287613, 287620, 287628, 287635, 287643, 287651, + 287660, 287667, 287675, 287683, 287692, 287700, 287709, 287718, + 287728, 287734, 287741, 287748, 287756, 287763, 287771, 287779, + 287788, 287795, 287803, 287811, 287820, 287828, 287837, 287846, + 287856, 287863, 287871, 287879, 287888, 287896, 287905, 287914, + 287924, 287932, 287941, 287950, 287960, 287969, 287979, 287989, + 288000, 288006, 288013, 288020, 288028, 288035, 288043, 288051, + 288060, 288067, 288075, 288083, 288092, 288100, 288109, 288118, + 288128, 288135, 288143, 288151, 288160, 288168, 288177, 288186, + 288196, 288204, 288213, 288222, 288232, 288241, 288251, 288261, + 288272, 288279, 288287, 288295, 288304, 288312, 288321, 288330, + 288340, 288348, 288357, 288366, 288376, 288385, 288395, 288405, + 288416, 288424, 288433, 288442, 288452, 288461, 288471, 288481, + 288492, 288501, 288511, 288521, 288532, 288542, 288553, 288564, + 288576, 288582, 288589, 288596, 288604, 288611, 288619, 288627, + 288636, 288643, 288651, 288659, 288668, 288676, 288685, 288694, + 288704, 288711, 288719, 288727, 288736, 288744, 288753, 288762, + 288772, 288780, 288789, 288798, 288808, 288817, 288827, 288837, + 288848, 288855, 288863, 288871, 288880, 288888, 288897, 288906, + 288916, 288924, 288933, 288942, 288952, 288961, 288971, 288981, + 288992, 289000, 289009, 289018, 289028, 289037, 289047, 289057, + 289068, 289077, 289087, 289097, 289108, 289118, 289129, 289140, + 289152, 289159, 289167, 289175, 289184, 289192, 289201, 289210, + 289220, 289228, 289237, 289246, 289256, 289265, 289275, 289285, + 289296, 289304, 289313, 289322, 289332, 289341, 289351, 289361, + 289372, 289381, 289391, 289401, 289412, 289422, 289433, 289444, + 289456, 289464, 289473, 289482, 289492, 289501, 289511, 289521, + 289532, 289541, 289551, 289561, 289572, 289582, 289593, 289604, + 289616, 289625, 289635, 289645, 289656, 289666, 289677, 289688, + 289700, 289710, 289721, 289732, 289744, 289755, 289767, 289779, + 289792, 289795, 289799, 289803, 289808, 289812, 289817, 289822, + 289828, 289832, 289837, 289842, 289848, 289853, 289859, 289865, + 289872, 289876, 289881, 289886, 289892, 289897, 289903, 289909, + 289916, 289921, 289927, 289933, 289940, 289946, 289953, 289960, + 289968, 289972, 289977, 289982, 289988, 289993, 289999, 290005, + 290012, 290017, 290023, 290029, 290036, 290042, 290049, 290056, + 290064, 290069, 290075, 290081, 290088, 290094, 290101, 290108, + 290116, 290122, 290129, 290136, 290144, 290151, 290159, 290167, + 290176, 290180, 290185, 290190, 290196, 290201, 290207, 290213, + 290220, 290225, 290231, 290237, 290244, 290250, 290257, 290264, + 290272, 290277, 290283, 290289, 290296, 290302, 290309, 290316, + 290324, 290330, 290337, 290344, 290352, 290359, 290367, 290375, + 290384, 290389, 290395, 290401, 290408, 290414, 290421, 290428, + 290436, 290442, 290449, 290456, 290464, 290471, 290479, 290487, + 290496, 290502, 290509, 290516, 290524, 290531, 290539, 290547, + 290556, 290563, 290571, 290579, 290588, 290596, 290605, 290614, + 290624, 290628, 290633, 290638, 290644, 290649, 290655, 290661, + 290668, 290673, 290679, 290685, 290692, 290698, 290705, 290712, + 290720, 290725, 290731, 290737, 290744, 290750, 290757, 290764, + 290772, 290778, 290785, 290792, 290800, 290807, 290815, 290823, + 290832, 290837, 290843, 290849, 290856, 290862, 290869, 290876, + 290884, 290890, 290897, 290904, 290912, 290919, 290927, 290935, + 290944, 290950, 290957, 290964, 290972, 290979, 290987, 290995, + 291004, 291011, 291019, 291027, 291036, 291044, 291053, 291062, + 291072, 291077, 291083, 291089, 291096, 291102, 291109, 291116, + 291124, 291130, 291137, 291144, 291152, 291159, 291167, 291175, + 291184, 291190, 291197, 291204, 291212, 291219, 291227, 291235, + 291244, 291251, 291259, 291267, 291276, 291284, 291293, 291302, + 291312, 291318, 291325, 291332, 291340, 291347, 291355, 291363, + 291372, 291379, 291387, 291395, 291404, 291412, 291421, 291430, + 291440, 291447, 291455, 291463, 291472, 291480, 291489, 291498, + 291508, 291516, 291525, 291534, 291544, 291553, 291563, 291573, + 291584, 291588, 291593, 291598, 291604, 291609, 291615, 291621, + 291628, 291633, 291639, 291645, 291652, 291658, 291665, 291672, + 291680, 291685, 291691, 291697, 291704, 291710, 291717, 291724, + 291732, 291738, 291745, 291752, 291760, 291767, 291775, 291783, + 291792, 291797, 291803, 291809, 291816, 291822, 291829, 291836, + 291844, 291850, 291857, 291864, 291872, 291879, 291887, 291895, + 291904, 291910, 291917, 291924, 291932, 291939, 291947, 291955, + 291964, 291971, 291979, 291987, 291996, 292004, 292013, 292022, + 292032, 292037, 292043, 292049, 292056, 292062, 292069, 292076, + 292084, 292090, 292097, 292104, 292112, 292119, 292127, 292135, + 292144, 292150, 292157, 292164, 292172, 292179, 292187, 292195, + 292204, 292211, 292219, 292227, 292236, 292244, 292253, 292262, + 292272, 292278, 292285, 292292, 292300, 292307, 292315, 292323, + 292332, 292339, 292347, 292355, 292364, 292372, 292381, 292390, + 292400, 292407, 292415, 292423, 292432, 292440, 292449, 292458, + 292468, 292476, 292485, 292494, 292504, 292513, 292523, 292533, + 292544, 292549, 292555, 292561, 292568, 292574, 292581, 292588, + 292596, 292602, 292609, 292616, 292624, 292631, 292639, 292647, + 292656, 292662, 292669, 292676, 292684, 292691, 292699, 292707, + 292716, 292723, 292731, 292739, 292748, 292756, 292765, 292774, + 292784, 292790, 292797, 292804, 292812, 292819, 292827, 292835, + 292844, 292851, 292859, 292867, 292876, 292884, 292893, 292902, + 292912, 292919, 292927, 292935, 292944, 292952, 292961, 292970, + 292980, 292988, 292997, 293006, 293016, 293025, 293035, 293045, + 293056, 293062, 293069, 293076, 293084, 293091, 293099, 293107, + 293116, 293123, 293131, 293139, 293148, 293156, 293165, 293174, + 293184, 293191, 293199, 293207, 293216, 293224, 293233, 293242, + 293252, 293260, 293269, 293278, 293288, 293297, 293307, 293317, + 293328, 293335, 293343, 293351, 293360, 293368, 293377, 293386, + 293396, 293404, 293413, 293422, 293432, 293441, 293451, 293461, + 293472, 293480, 293489, 293498, 293508, 293517, 293527, 293537, + 293548, 293557, 293567, 293577, 293588, 293598, 293609, 293620, + 293632, 293636, 293641, 293646, 293652, 293657, 293663, 293669, + 293676, 293681, 293687, 293693, 293700, 293706, 293713, 293720, + 293728, 293733, 293739, 293745, 293752, 293758, 293765, 293772, + 293780, 293786, 293793, 293800, 293808, 293815, 293823, 293831, + 293840, 293845, 293851, 293857, 293864, 293870, 293877, 293884, + 293892, 293898, 293905, 293912, 293920, 293927, 293935, 293943, + 293952, 293958, 293965, 293972, 293980, 293987, 293995, 294003, + 294012, 294019, 294027, 294035, 294044, 294052, 294061, 294070, + 294080, 294085, 294091, 294097, 294104, 294110, 294117, 294124, + 294132, 294138, 294145, 294152, 294160, 294167, 294175, 294183, + 294192, 294198, 294205, 294212, 294220, 294227, 294235, 294243, + 294252, 294259, 294267, 294275, 294284, 294292, 294301, 294310, + 294320, 294326, 294333, 294340, 294348, 294355, 294363, 294371, + 294380, 294387, 294395, 294403, 294412, 294420, 294429, 294438, + 294448, 294455, 294463, 294471, 294480, 294488, 294497, 294506, + 294516, 294524, 294533, 294542, 294552, 294561, 294571, 294581, + 294592, 294597, 294603, 294609, 294616, 294622, 294629, 294636, + 294644, 294650, 294657, 294664, 294672, 294679, 294687, 294695, + 294704, 294710, 294717, 294724, 294732, 294739, 294747, 294755, + 294764, 294771, 294779, 294787, 294796, 294804, 294813, 294822, + 294832, 294838, 294845, 294852, 294860, 294867, 294875, 294883, + 294892, 294899, 294907, 294915, 294924, 294932, 294941, 294950, + 294960, 294967, 294975, 294983, 294992, 295000, 295009, 295018, + 295028, 295036, 295045, 295054, 295064, 295073, 295083, 295093, + 295104, 295110, 295117, 295124, 295132, 295139, 295147, 295155, + 295164, 295171, 295179, 295187, 295196, 295204, 295213, 295222, + 295232, 295239, 295247, 295255, 295264, 295272, 295281, 295290, + 295300, 295308, 295317, 295326, 295336, 295345, 295355, 295365, + 295376, 295383, 295391, 295399, 295408, 295416, 295425, 295434, + 295444, 295452, 295461, 295470, 295480, 295489, 295499, 295509, + 295520, 295528, 295537, 295546, 295556, 295565, 295575, 295585, + 295596, 295605, 295615, 295625, 295636, 295646, 295657, 295668, + 295680, 295685, 295691, 295697, 295704, 295710, 295717, 295724, + 295732, 295738, 295745, 295752, 295760, 295767, 295775, 295783, + 295792, 295798, 295805, 295812, 295820, 295827, 295835, 295843, + 295852, 295859, 295867, 295875, 295884, 295892, 295901, 295910, + 295920, 295926, 295933, 295940, 295948, 295955, 295963, 295971, + 295980, 295987, 295995, 296003, 296012, 296020, 296029, 296038, + 296048, 296055, 296063, 296071, 296080, 296088, 296097, 296106, + 296116, 296124, 296133, 296142, 296152, 296161, 296171, 296181, + 296192, 296198, 296205, 296212, 296220, 296227, 296235, 296243, + 296252, 296259, 296267, 296275, 296284, 296292, 296301, 296310, + 296320, 296327, 296335, 296343, 296352, 296360, 296369, 296378, + 296388, 296396, 296405, 296414, 296424, 296433, 296443, 296453, + 296464, 296471, 296479, 296487, 296496, 296504, 296513, 296522, + 296532, 296540, 296549, 296558, 296568, 296577, 296587, 296597, + 296608, 296616, 296625, 296634, 296644, 296653, 296663, 296673, + 296684, 296693, 296703, 296713, 296724, 296734, 296745, 296756, + 296768, 296774, 296781, 296788, 296796, 296803, 296811, 296819, + 296828, 296835, 296843, 296851, 296860, 296868, 296877, 296886, + 296896, 296903, 296911, 296919, 296928, 296936, 296945, 296954, + 296964, 296972, 296981, 296990, 297000, 297009, 297019, 297029, + 297040, 297047, 297055, 297063, 297072, 297080, 297089, 297098, + 297108, 297116, 297125, 297134, 297144, 297153, 297163, 297173, + 297184, 297192, 297201, 297210, 297220, 297229, 297239, 297249, + 297260, 297269, 297279, 297289, 297300, 297310, 297321, 297332, + 297344, 297351, 297359, 297367, 297376, 297384, 297393, 297402, + 297412, 297420, 297429, 297438, 297448, 297457, 297467, 297477, + 297488, 297496, 297505, 297514, 297524, 297533, 297543, 297553, + 297564, 297573, 297583, 297593, 297604, 297614, 297625, 297636, + 297648, 297656, 297665, 297674, 297684, 297693, 297703, 297713, + 297724, 297733, 297743, 297753, 297764, 297774, 297785, 297796, + 297808, 297817, 297827, 297837, 297848, 297858, 297869, 297880, + 297892, 297902, 297913, 297924, 297936, 297947, 297959, 297971, + 297984, 297988, 297993, 297998, 298004, 298009, 298015, 298021, + 298028, 298033, 298039, 298045, 298052, 298058, 298065, 298072, + 298080, 298085, 298091, 298097, 298104, 298110, 298117, 298124, + 298132, 298138, 298145, 298152, 298160, 298167, 298175, 298183, + 298192, 298197, 298203, 298209, 298216, 298222, 298229, 298236, + 298244, 298250, 298257, 298264, 298272, 298279, 298287, 298295, + 298304, 298310, 298317, 298324, 298332, 298339, 298347, 298355, + 298364, 298371, 298379, 298387, 298396, 298404, 298413, 298422, + 298432, 298437, 298443, 298449, 298456, 298462, 298469, 298476, + 298484, 298490, 298497, 298504, 298512, 298519, 298527, 298535, + 298544, 298550, 298557, 298564, 298572, 298579, 298587, 298595, + 298604, 298611, 298619, 298627, 298636, 298644, 298653, 298662, + 298672, 298678, 298685, 298692, 298700, 298707, 298715, 298723, + 298732, 298739, 298747, 298755, 298764, 298772, 298781, 298790, + 298800, 298807, 298815, 298823, 298832, 298840, 298849, 298858, + 298868, 298876, 298885, 298894, 298904, 298913, 298923, 298933, + 298944, 298949, 298955, 298961, 298968, 298974, 298981, 298988, + 298996, 299002, 299009, 299016, 299024, 299031, 299039, 299047, + 299056, 299062, 299069, 299076, 299084, 299091, 299099, 299107, + 299116, 299123, 299131, 299139, 299148, 299156, 299165, 299174, + 299184, 299190, 299197, 299204, 299212, 299219, 299227, 299235, + 299244, 299251, 299259, 299267, 299276, 299284, 299293, 299302, + 299312, 299319, 299327, 299335, 299344, 299352, 299361, 299370, + 299380, 299388, 299397, 299406, 299416, 299425, 299435, 299445, + 299456, 299462, 299469, 299476, 299484, 299491, 299499, 299507, + 299516, 299523, 299531, 299539, 299548, 299556, 299565, 299574, + 299584, 299591, 299599, 299607, 299616, 299624, 299633, 299642, + 299652, 299660, 299669, 299678, 299688, 299697, 299707, 299717, + 299728, 299735, 299743, 299751, 299760, 299768, 299777, 299786, + 299796, 299804, 299813, 299822, 299832, 299841, 299851, 299861, + 299872, 299880, 299889, 299898, 299908, 299917, 299927, 299937, + 299948, 299957, 299967, 299977, 299988, 299998, 300009, 300020, + 300032, 300037, 300043, 300049, 300056, 300062, 300069, 300076, + 300084, 300090, 300097, 300104, 300112, 300119, 300127, 300135, + 300144, 300150, 300157, 300164, 300172, 300179, 300187, 300195, + 300204, 300211, 300219, 300227, 300236, 300244, 300253, 300262, + 300272, 300278, 300285, 300292, 300300, 300307, 300315, 300323, + 300332, 300339, 300347, 300355, 300364, 300372, 300381, 300390, + 300400, 300407, 300415, 300423, 300432, 300440, 300449, 300458, + 300468, 300476, 300485, 300494, 300504, 300513, 300523, 300533, + 300544, 300550, 300557, 300564, 300572, 300579, 300587, 300595, + 300604, 300611, 300619, 300627, 300636, 300644, 300653, 300662, + 300672, 300679, 300687, 300695, 300704, 300712, 300721, 300730, + 300740, 300748, 300757, 300766, 300776, 300785, 300795, 300805, + 300816, 300823, 300831, 300839, 300848, 300856, 300865, 300874, + 300884, 300892, 300901, 300910, 300920, 300929, 300939, 300949, + 300960, 300968, 300977, 300986, 300996, 301005, 301015, 301025, + 301036, 301045, 301055, 301065, 301076, 301086, 301097, 301108, + 301120, 301126, 301133, 301140, 301148, 301155, 301163, 301171, + 301180, 301187, 301195, 301203, 301212, 301220, 301229, 301238, + 301248, 301255, 301263, 301271, 301280, 301288, 301297, 301306, + 301316, 301324, 301333, 301342, 301352, 301361, 301371, 301381, + 301392, 301399, 301407, 301415, 301424, 301432, 301441, 301450, + 301460, 301468, 301477, 301486, 301496, 301505, 301515, 301525, + 301536, 301544, 301553, 301562, 301572, 301581, 301591, 301601, + 301612, 301621, 301631, 301641, 301652, 301662, 301673, 301684, + 301696, 301703, 301711, 301719, 301728, 301736, 301745, 301754, + 301764, 301772, 301781, 301790, 301800, 301809, 301819, 301829, + 301840, 301848, 301857, 301866, 301876, 301885, 301895, 301905, + 301916, 301925, 301935, 301945, 301956, 301966, 301977, 301988, + 302000, 302008, 302017, 302026, 302036, 302045, 302055, 302065, + 302076, 302085, 302095, 302105, 302116, 302126, 302137, 302148, + 302160, 302169, 302179, 302189, 302200, 302210, 302221, 302232, + 302244, 302254, 302265, 302276, 302288, 302299, 302311, 302323, + 302336, 302341, 302347, 302353, 302360, 302366, 302373, 302380, + 302388, 302394, 302401, 302408, 302416, 302423, 302431, 302439, + 302448, 302454, 302461, 302468, 302476, 302483, 302491, 302499, + 302508, 302515, 302523, 302531, 302540, 302548, 302557, 302566, + 302576, 302582, 302589, 302596, 302604, 302611, 302619, 302627, + 302636, 302643, 302651, 302659, 302668, 302676, 302685, 302694, + 302704, 302711, 302719, 302727, 302736, 302744, 302753, 302762, + 302772, 302780, 302789, 302798, 302808, 302817, 302827, 302837, + 302848, 302854, 302861, 302868, 302876, 302883, 302891, 302899, + 302908, 302915, 302923, 302931, 302940, 302948, 302957, 302966, + 302976, 302983, 302991, 302999, 303008, 303016, 303025, 303034, + 303044, 303052, 303061, 303070, 303080, 303089, 303099, 303109, + 303120, 303127, 303135, 303143, 303152, 303160, 303169, 303178, + 303188, 303196, 303205, 303214, 303224, 303233, 303243, 303253, + 303264, 303272, 303281, 303290, 303300, 303309, 303319, 303329, + 303340, 303349, 303359, 303369, 303380, 303390, 303401, 303412, + 303424, 303430, 303437, 303444, 303452, 303459, 303467, 303475, + 303484, 303491, 303499, 303507, 303516, 303524, 303533, 303542, + 303552, 303559, 303567, 303575, 303584, 303592, 303601, 303610, + 303620, 303628, 303637, 303646, 303656, 303665, 303675, 303685, + 303696, 303703, 303711, 303719, 303728, 303736, 303745, 303754, + 303764, 303772, 303781, 303790, 303800, 303809, 303819, 303829, + 303840, 303848, 303857, 303866, 303876, 303885, 303895, 303905, + 303916, 303925, 303935, 303945, 303956, 303966, 303977, 303988, + 304000, 304007, 304015, 304023, 304032, 304040, 304049, 304058, + 304068, 304076, 304085, 304094, 304104, 304113, 304123, 304133, + 304144, 304152, 304161, 304170, 304180, 304189, 304199, 304209, + 304220, 304229, 304239, 304249, 304260, 304270, 304281, 304292, + 304304, 304312, 304321, 304330, 304340, 304349, 304359, 304369, + 304380, 304389, 304399, 304409, 304420, 304430, 304441, 304452, + 304464, 304473, 304483, 304493, 304504, 304514, 304525, 304536, + 304548, 304558, 304569, 304580, 304592, 304603, 304615, 304627, + 304640, 304646, 304653, 304660, 304668, 304675, 304683, 304691, + 304700, 304707, 304715, 304723, 304732, 304740, 304749, 304758, + 304768, 304775, 304783, 304791, 304800, 304808, 304817, 304826, + 304836, 304844, 304853, 304862, 304872, 304881, 304891, 304901, + 304912, 304919, 304927, 304935, 304944, 304952, 304961, 304970, + 304980, 304988, 304997, 305006, 305016, 305025, 305035, 305045, + 305056, 305064, 305073, 305082, 305092, 305101, 305111, 305121, + 305132, 305141, 305151, 305161, 305172, 305182, 305193, 305204, + 305216, 305223, 305231, 305239, 305248, 305256, 305265, 305274, + 305284, 305292, 305301, 305310, 305320, 305329, 305339, 305349, + 305360, 305368, 305377, 305386, 305396, 305405, 305415, 305425, + 305436, 305445, 305455, 305465, 305476, 305486, 305497, 305508, + 305520, 305528, 305537, 305546, 305556, 305565, 305575, 305585, + 305596, 305605, 305615, 305625, 305636, 305646, 305657, 305668, + 305680, 305689, 305699, 305709, 305720, 305730, 305741, 305752, + 305764, 305774, 305785, 305796, 305808, 305819, 305831, 305843, + 305856, 305863, 305871, 305879, 305888, 305896, 305905, 305914, + 305924, 305932, 305941, 305950, 305960, 305969, 305979, 305989, + 306000, 306008, 306017, 306026, 306036, 306045, 306055, 306065, + 306076, 306085, 306095, 306105, 306116, 306126, 306137, 306148, + 306160, 306168, 306177, 306186, 306196, 306205, 306215, 306225, + 306236, 306245, 306255, 306265, 306276, 306286, 306297, 306308, + 306320, 306329, 306339, 306349, 306360, 306370, 306381, 306392, + 306404, 306414, 306425, 306436, 306448, 306459, 306471, 306483, + 306496, 306504, 306513, 306522, 306532, 306541, 306551, 306561, + 306572, 306581, 306591, 306601, 306612, 306622, 306633, 306644, + 306656, 306665, 306675, 306685, 306696, 306706, 306717, 306728, + 306740, 306750, 306761, 306772, 306784, 306795, 306807, 306819, + 306832, 306841, 306851, 306861, 306872, 306882, 306893, 306904, + 306916, 306926, 306937, 306948, 306960, 306971, 306983, 306995, + 307008, 307018, 307029, 307040, 307052, 307063, 307075, 307087, + 307100, 307111, 307123, 307135, 307148, 307160, 307173, 307186, + 307200, 307202, 307205, 307208, 307212, 307215, 307219, 307223, + 307228, 307231, 307235, 307239, 307244, 307248, 307253, 307258, + 307264, 307267, 307271, 307275, 307280, 307284, 307289, 307294, + 307300, 307304, 307309, 307314, 307320, 307325, 307331, 307337, + 307344, 307347, 307351, 307355, 307360, 307364, 307369, 307374, + 307380, 307384, 307389, 307394, 307400, 307405, 307411, 307417, + 307424, 307428, 307433, 307438, 307444, 307449, 307455, 307461, + 307468, 307473, 307479, 307485, 307492, 307498, 307505, 307512, + 307520, 307523, 307527, 307531, 307536, 307540, 307545, 307550, + 307556, 307560, 307565, 307570, 307576, 307581, 307587, 307593, + 307600, 307604, 307609, 307614, 307620, 307625, 307631, 307637, + 307644, 307649, 307655, 307661, 307668, 307674, 307681, 307688, + 307696, 307700, 307705, 307710, 307716, 307721, 307727, 307733, + 307740, 307745, 307751, 307757, 307764, 307770, 307777, 307784, + 307792, 307797, 307803, 307809, 307816, 307822, 307829, 307836, + 307844, 307850, 307857, 307864, 307872, 307879, 307887, 307895, + 307904, 307907, 307911, 307915, 307920, 307924, 307929, 307934, + 307940, 307944, 307949, 307954, 307960, 307965, 307971, 307977, + 307984, 307988, 307993, 307998, 308004, 308009, 308015, 308021, + 308028, 308033, 308039, 308045, 308052, 308058, 308065, 308072, + 308080, 308084, 308089, 308094, 308100, 308105, 308111, 308117, + 308124, 308129, 308135, 308141, 308148, 308154, 308161, 308168, + 308176, 308181, 308187, 308193, 308200, 308206, 308213, 308220, + 308228, 308234, 308241, 308248, 308256, 308263, 308271, 308279, + 308288, 308292, 308297, 308302, 308308, 308313, 308319, 308325, + 308332, 308337, 308343, 308349, 308356, 308362, 308369, 308376, + 308384, 308389, 308395, 308401, 308408, 308414, 308421, 308428, + 308436, 308442, 308449, 308456, 308464, 308471, 308479, 308487, + 308496, 308501, 308507, 308513, 308520, 308526, 308533, 308540, + 308548, 308554, 308561, 308568, 308576, 308583, 308591, 308599, + 308608, 308614, 308621, 308628, 308636, 308643, 308651, 308659, + 308668, 308675, 308683, 308691, 308700, 308708, 308717, 308726, + 308736, 308739, 308743, 308747, 308752, 308756, 308761, 308766, + 308772, 308776, 308781, 308786, 308792, 308797, 308803, 308809, + 308816, 308820, 308825, 308830, 308836, 308841, 308847, 308853, + 308860, 308865, 308871, 308877, 308884, 308890, 308897, 308904, + 308912, 308916, 308921, 308926, 308932, 308937, 308943, 308949, + 308956, 308961, 308967, 308973, 308980, 308986, 308993, 309000, + 309008, 309013, 309019, 309025, 309032, 309038, 309045, 309052, + 309060, 309066, 309073, 309080, 309088, 309095, 309103, 309111, + 309120, 309124, 309129, 309134, 309140, 309145, 309151, 309157, + 309164, 309169, 309175, 309181, 309188, 309194, 309201, 309208, + 309216, 309221, 309227, 309233, 309240, 309246, 309253, 309260, + 309268, 309274, 309281, 309288, 309296, 309303, 309311, 309319, + 309328, 309333, 309339, 309345, 309352, 309358, 309365, 309372, + 309380, 309386, 309393, 309400, 309408, 309415, 309423, 309431, + 309440, 309446, 309453, 309460, 309468, 309475, 309483, 309491, + 309500, 309507, 309515, 309523, 309532, 309540, 309549, 309558, + 309568, 309572, 309577, 309582, 309588, 309593, 309599, 309605, + 309612, 309617, 309623, 309629, 309636, 309642, 309649, 309656, + 309664, 309669, 309675, 309681, 309688, 309694, 309701, 309708, + 309716, 309722, 309729, 309736, 309744, 309751, 309759, 309767, + 309776, 309781, 309787, 309793, 309800, 309806, 309813, 309820, + 309828, 309834, 309841, 309848, 309856, 309863, 309871, 309879, + 309888, 309894, 309901, 309908, 309916, 309923, 309931, 309939, + 309948, 309955, 309963, 309971, 309980, 309988, 309997, 310006, + 310016, 310021, 310027, 310033, 310040, 310046, 310053, 310060, + 310068, 310074, 310081, 310088, 310096, 310103, 310111, 310119, + 310128, 310134, 310141, 310148, 310156, 310163, 310171, 310179, + 310188, 310195, 310203, 310211, 310220, 310228, 310237, 310246, + 310256, 310262, 310269, 310276, 310284, 310291, 310299, 310307, + 310316, 310323, 310331, 310339, 310348, 310356, 310365, 310374, + 310384, 310391, 310399, 310407, 310416, 310424, 310433, 310442, + 310452, 310460, 310469, 310478, 310488, 310497, 310507, 310517, + 310528, 310531, 310535, 310539, 310544, 310548, 310553, 310558, + 310564, 310568, 310573, 310578, 310584, 310589, 310595, 310601, + 310608, 310612, 310617, 310622, 310628, 310633, 310639, 310645, + 310652, 310657, 310663, 310669, 310676, 310682, 310689, 310696, + 310704, 310708, 310713, 310718, 310724, 310729, 310735, 310741, + 310748, 310753, 310759, 310765, 310772, 310778, 310785, 310792, + 310800, 310805, 310811, 310817, 310824, 310830, 310837, 310844, + 310852, 310858, 310865, 310872, 310880, 310887, 310895, 310903, + 310912, 310916, 310921, 310926, 310932, 310937, 310943, 310949, + 310956, 310961, 310967, 310973, 310980, 310986, 310993, 311000, + 311008, 311013, 311019, 311025, 311032, 311038, 311045, 311052, + 311060, 311066, 311073, 311080, 311088, 311095, 311103, 311111, + 311120, 311125, 311131, 311137, 311144, 311150, 311157, 311164, + 311172, 311178, 311185, 311192, 311200, 311207, 311215, 311223, + 311232, 311238, 311245, 311252, 311260, 311267, 311275, 311283, + 311292, 311299, 311307, 311315, 311324, 311332, 311341, 311350, + 311360, 311364, 311369, 311374, 311380, 311385, 311391, 311397, + 311404, 311409, 311415, 311421, 311428, 311434, 311441, 311448, + 311456, 311461, 311467, 311473, 311480, 311486, 311493, 311500, + 311508, 311514, 311521, 311528, 311536, 311543, 311551, 311559, + 311568, 311573, 311579, 311585, 311592, 311598, 311605, 311612, + 311620, 311626, 311633, 311640, 311648, 311655, 311663, 311671, + 311680, 311686, 311693, 311700, 311708, 311715, 311723, 311731, + 311740, 311747, 311755, 311763, 311772, 311780, 311789, 311798, + 311808, 311813, 311819, 311825, 311832, 311838, 311845, 311852, + 311860, 311866, 311873, 311880, 311888, 311895, 311903, 311911, + 311920, 311926, 311933, 311940, 311948, 311955, 311963, 311971, + 311980, 311987, 311995, 312003, 312012, 312020, 312029, 312038, + 312048, 312054, 312061, 312068, 312076, 312083, 312091, 312099, + 312108, 312115, 312123, 312131, 312140, 312148, 312157, 312166, + 312176, 312183, 312191, 312199, 312208, 312216, 312225, 312234, + 312244, 312252, 312261, 312270, 312280, 312289, 312299, 312309, + 312320, 312324, 312329, 312334, 312340, 312345, 312351, 312357, + 312364, 312369, 312375, 312381, 312388, 312394, 312401, 312408, + 312416, 312421, 312427, 312433, 312440, 312446, 312453, 312460, + 312468, 312474, 312481, 312488, 312496, 312503, 312511, 312519, + 312528, 312533, 312539, 312545, 312552, 312558, 312565, 312572, + 312580, 312586, 312593, 312600, 312608, 312615, 312623, 312631, + 312640, 312646, 312653, 312660, 312668, 312675, 312683, 312691, + 312700, 312707, 312715, 312723, 312732, 312740, 312749, 312758, + 312768, 312773, 312779, 312785, 312792, 312798, 312805, 312812, + 312820, 312826, 312833, 312840, 312848, 312855, 312863, 312871, + 312880, 312886, 312893, 312900, 312908, 312915, 312923, 312931, + 312940, 312947, 312955, 312963, 312972, 312980, 312989, 312998, + 313008, 313014, 313021, 313028, 313036, 313043, 313051, 313059, + 313068, 313075, 313083, 313091, 313100, 313108, 313117, 313126, + 313136, 313143, 313151, 313159, 313168, 313176, 313185, 313194, + 313204, 313212, 313221, 313230, 313240, 313249, 313259, 313269, + 313280, 313285, 313291, 313297, 313304, 313310, 313317, 313324, + 313332, 313338, 313345, 313352, 313360, 313367, 313375, 313383, + 313392, 313398, 313405, 313412, 313420, 313427, 313435, 313443, + 313452, 313459, 313467, 313475, 313484, 313492, 313501, 313510, + 313520, 313526, 313533, 313540, 313548, 313555, 313563, 313571, + 313580, 313587, 313595, 313603, 313612, 313620, 313629, 313638, + 313648, 313655, 313663, 313671, 313680, 313688, 313697, 313706, + 313716, 313724, 313733, 313742, 313752, 313761, 313771, 313781, + 313792, 313798, 313805, 313812, 313820, 313827, 313835, 313843, + 313852, 313859, 313867, 313875, 313884, 313892, 313901, 313910, + 313920, 313927, 313935, 313943, 313952, 313960, 313969, 313978, + 313988, 313996, 314005, 314014, 314024, 314033, 314043, 314053, + 314064, 314071, 314079, 314087, 314096, 314104, 314113, 314122, + 314132, 314140, 314149, 314158, 314168, 314177, 314187, 314197, + 314208, 314216, 314225, 314234, 314244, 314253, 314263, 314273, + 314284, 314293, 314303, 314313, 314324, 314334, 314345, 314356, + 314368, 314371, 314375, 314379, 314384, 314388, 314393, 314398, + 314404, 314408, 314413, 314418, 314424, 314429, 314435, 314441, + 314448, 314452, 314457, 314462, 314468, 314473, 314479, 314485, + 314492, 314497, 314503, 314509, 314516, 314522, 314529, 314536, + 314544, 314548, 314553, 314558, 314564, 314569, 314575, 314581, + 314588, 314593, 314599, 314605, 314612, 314618, 314625, 314632, + 314640, 314645, 314651, 314657, 314664, 314670, 314677, 314684, + 314692, 314698, 314705, 314712, 314720, 314727, 314735, 314743, + 314752, 314756, 314761, 314766, 314772, 314777, 314783, 314789, + 314796, 314801, 314807, 314813, 314820, 314826, 314833, 314840, + 314848, 314853, 314859, 314865, 314872, 314878, 314885, 314892, + 314900, 314906, 314913, 314920, 314928, 314935, 314943, 314951, + 314960, 314965, 314971, 314977, 314984, 314990, 314997, 315004, + 315012, 315018, 315025, 315032, 315040, 315047, 315055, 315063, + 315072, 315078, 315085, 315092, 315100, 315107, 315115, 315123, + 315132, 315139, 315147, 315155, 315164, 315172, 315181, 315190, + 315200, 315204, 315209, 315214, 315220, 315225, 315231, 315237, + 315244, 315249, 315255, 315261, 315268, 315274, 315281, 315288, + 315296, 315301, 315307, 315313, 315320, 315326, 315333, 315340, + 315348, 315354, 315361, 315368, 315376, 315383, 315391, 315399, + 315408, 315413, 315419, 315425, 315432, 315438, 315445, 315452, + 315460, 315466, 315473, 315480, 315488, 315495, 315503, 315511, + 315520, 315526, 315533, 315540, 315548, 315555, 315563, 315571, + 315580, 315587, 315595, 315603, 315612, 315620, 315629, 315638, + 315648, 315653, 315659, 315665, 315672, 315678, 315685, 315692, + 315700, 315706, 315713, 315720, 315728, 315735, 315743, 315751, + 315760, 315766, 315773, 315780, 315788, 315795, 315803, 315811, + 315820, 315827, 315835, 315843, 315852, 315860, 315869, 315878, + 315888, 315894, 315901, 315908, 315916, 315923, 315931, 315939, + 315948, 315955, 315963, 315971, 315980, 315988, 315997, 316006, + 316016, 316023, 316031, 316039, 316048, 316056, 316065, 316074, + 316084, 316092, 316101, 316110, 316120, 316129, 316139, 316149, + 316160, 316164, 316169, 316174, 316180, 316185, 316191, 316197, + 316204, 316209, 316215, 316221, 316228, 316234, 316241, 316248, + 316256, 316261, 316267, 316273, 316280, 316286, 316293, 316300, + 316308, 316314, 316321, 316328, 316336, 316343, 316351, 316359, + 316368, 316373, 316379, 316385, 316392, 316398, 316405, 316412, + 316420, 316426, 316433, 316440, 316448, 316455, 316463, 316471, + 316480, 316486, 316493, 316500, 316508, 316515, 316523, 316531, + 316540, 316547, 316555, 316563, 316572, 316580, 316589, 316598, + 316608, 316613, 316619, 316625, 316632, 316638, 316645, 316652, + 316660, 316666, 316673, 316680, 316688, 316695, 316703, 316711, + 316720, 316726, 316733, 316740, 316748, 316755, 316763, 316771, + 316780, 316787, 316795, 316803, 316812, 316820, 316829, 316838, + 316848, 316854, 316861, 316868, 316876, 316883, 316891, 316899, + 316908, 316915, 316923, 316931, 316940, 316948, 316957, 316966, + 316976, 316983, 316991, 316999, 317008, 317016, 317025, 317034, + 317044, 317052, 317061, 317070, 317080, 317089, 317099, 317109, + 317120, 317125, 317131, 317137, 317144, 317150, 317157, 317164, + 317172, 317178, 317185, 317192, 317200, 317207, 317215, 317223, + 317232, 317238, 317245, 317252, 317260, 317267, 317275, 317283, + 317292, 317299, 317307, 317315, 317324, 317332, 317341, 317350, + 317360, 317366, 317373, 317380, 317388, 317395, 317403, 317411, + 317420, 317427, 317435, 317443, 317452, 317460, 317469, 317478, + 317488, 317495, 317503, 317511, 317520, 317528, 317537, 317546, + 317556, 317564, 317573, 317582, 317592, 317601, 317611, 317621, + 317632, 317638, 317645, 317652, 317660, 317667, 317675, 317683, + 317692, 317699, 317707, 317715, 317724, 317732, 317741, 317750, + 317760, 317767, 317775, 317783, 317792, 317800, 317809, 317818, + 317828, 317836, 317845, 317854, 317864, 317873, 317883, 317893, + 317904, 317911, 317919, 317927, 317936, 317944, 317953, 317962, + 317972, 317980, 317989, 317998, 318008, 318017, 318027, 318037, + 318048, 318056, 318065, 318074, 318084, 318093, 318103, 318113, + 318124, 318133, 318143, 318153, 318164, 318174, 318185, 318196, + 318208, 318212, 318217, 318222, 318228, 318233, 318239, 318245, + 318252, 318257, 318263, 318269, 318276, 318282, 318289, 318296, + 318304, 318309, 318315, 318321, 318328, 318334, 318341, 318348, + 318356, 318362, 318369, 318376, 318384, 318391, 318399, 318407, + 318416, 318421, 318427, 318433, 318440, 318446, 318453, 318460, + 318468, 318474, 318481, 318488, 318496, 318503, 318511, 318519, + 318528, 318534, 318541, 318548, 318556, 318563, 318571, 318579, + 318588, 318595, 318603, 318611, 318620, 318628, 318637, 318646, + 318656, 318661, 318667, 318673, 318680, 318686, 318693, 318700, + 318708, 318714, 318721, 318728, 318736, 318743, 318751, 318759, + 318768, 318774, 318781, 318788, 318796, 318803, 318811, 318819, + 318828, 318835, 318843, 318851, 318860, 318868, 318877, 318886, + 318896, 318902, 318909, 318916, 318924, 318931, 318939, 318947, + 318956, 318963, 318971, 318979, 318988, 318996, 319005, 319014, + 319024, 319031, 319039, 319047, 319056, 319064, 319073, 319082, + 319092, 319100, 319109, 319118, 319128, 319137, 319147, 319157, + 319168, 319173, 319179, 319185, 319192, 319198, 319205, 319212, + 319220, 319226, 319233, 319240, 319248, 319255, 319263, 319271, + 319280, 319286, 319293, 319300, 319308, 319315, 319323, 319331, + 319340, 319347, 319355, 319363, 319372, 319380, 319389, 319398, + 319408, 319414, 319421, 319428, 319436, 319443, 319451, 319459, + 319468, 319475, 319483, 319491, 319500, 319508, 319517, 319526, + 319536, 319543, 319551, 319559, 319568, 319576, 319585, 319594, + 319604, 319612, 319621, 319630, 319640, 319649, 319659, 319669, + 319680, 319686, 319693, 319700, 319708, 319715, 319723, 319731, + 319740, 319747, 319755, 319763, 319772, 319780, 319789, 319798, + 319808, 319815, 319823, 319831, 319840, 319848, 319857, 319866, + 319876, 319884, 319893, 319902, 319912, 319921, 319931, 319941, + 319952, 319959, 319967, 319975, 319984, 319992, 320001, 320010, + 320020, 320028, 320037, 320046, 320056, 320065, 320075, 320085, + 320096, 320104, 320113, 320122, 320132, 320141, 320151, 320161, + 320172, 320181, 320191, 320201, 320212, 320222, 320233, 320244, + 320256, 320261, 320267, 320273, 320280, 320286, 320293, 320300, + 320308, 320314, 320321, 320328, 320336, 320343, 320351, 320359, + 320368, 320374, 320381, 320388, 320396, 320403, 320411, 320419, + 320428, 320435, 320443, 320451, 320460, 320468, 320477, 320486, + 320496, 320502, 320509, 320516, 320524, 320531, 320539, 320547, + 320556, 320563, 320571, 320579, 320588, 320596, 320605, 320614, + 320624, 320631, 320639, 320647, 320656, 320664, 320673, 320682, + 320692, 320700, 320709, 320718, 320728, 320737, 320747, 320757, + 320768, 320774, 320781, 320788, 320796, 320803, 320811, 320819, + 320828, 320835, 320843, 320851, 320860, 320868, 320877, 320886, + 320896, 320903, 320911, 320919, 320928, 320936, 320945, 320954, + 320964, 320972, 320981, 320990, 321000, 321009, 321019, 321029, + 321040, 321047, 321055, 321063, 321072, 321080, 321089, 321098, + 321108, 321116, 321125, 321134, 321144, 321153, 321163, 321173, + 321184, 321192, 321201, 321210, 321220, 321229, 321239, 321249, + 321260, 321269, 321279, 321289, 321300, 321310, 321321, 321332, + 321344, 321350, 321357, 321364, 321372, 321379, 321387, 321395, + 321404, 321411, 321419, 321427, 321436, 321444, 321453, 321462, + 321472, 321479, 321487, 321495, 321504, 321512, 321521, 321530, + 321540, 321548, 321557, 321566, 321576, 321585, 321595, 321605, + 321616, 321623, 321631, 321639, 321648, 321656, 321665, 321674, + 321684, 321692, 321701, 321710, 321720, 321729, 321739, 321749, + 321760, 321768, 321777, 321786, 321796, 321805, 321815, 321825, + 321836, 321845, 321855, 321865, 321876, 321886, 321897, 321908, + 321920, 321927, 321935, 321943, 321952, 321960, 321969, 321978, + 321988, 321996, 322005, 322014, 322024, 322033, 322043, 322053, + 322064, 322072, 322081, 322090, 322100, 322109, 322119, 322129, + 322140, 322149, 322159, 322169, 322180, 322190, 322201, 322212, + 322224, 322232, 322241, 322250, 322260, 322269, 322279, 322289, + 322300, 322309, 322319, 322329, 322340, 322350, 322361, 322372, + 322384, 322393, 322403, 322413, 322424, 322434, 322445, 322456, + 322468, 322478, 322489, 322500, 322512, 322523, 322535, 322547, + 322560, 322563, 322567, 322571, 322576, 322580, 322585, 322590, + 322596, 322600, 322605, 322610, 322616, 322621, 322627, 322633, + 322640, 322644, 322649, 322654, 322660, 322665, 322671, 322677, + 322684, 322689, 322695, 322701, 322708, 322714, 322721, 322728, + 322736, 322740, 322745, 322750, 322756, 322761, 322767, 322773, + 322780, 322785, 322791, 322797, 322804, 322810, 322817, 322824, + 322832, 322837, 322843, 322849, 322856, 322862, 322869, 322876, + 322884, 322890, 322897, 322904, 322912, 322919, 322927, 322935, + 322944, 322948, 322953, 322958, 322964, 322969, 322975, 322981, + 322988, 322993, 322999, 323005, 323012, 323018, 323025, 323032, + 323040, 323045, 323051, 323057, 323064, 323070, 323077, 323084, + 323092, 323098, 323105, 323112, 323120, 323127, 323135, 323143, + 323152, 323157, 323163, 323169, 323176, 323182, 323189, 323196, + 323204, 323210, 323217, 323224, 323232, 323239, 323247, 323255, + 323264, 323270, 323277, 323284, 323292, 323299, 323307, 323315, + 323324, 323331, 323339, 323347, 323356, 323364, 323373, 323382, + 323392, 323396, 323401, 323406, 323412, 323417, 323423, 323429, + 323436, 323441, 323447, 323453, 323460, 323466, 323473, 323480, + 323488, 323493, 323499, 323505, 323512, 323518, 323525, 323532, + 323540, 323546, 323553, 323560, 323568, 323575, 323583, 323591, + 323600, 323605, 323611, 323617, 323624, 323630, 323637, 323644, + 323652, 323658, 323665, 323672, 323680, 323687, 323695, 323703, + 323712, 323718, 323725, 323732, 323740, 323747, 323755, 323763, + 323772, 323779, 323787, 323795, 323804, 323812, 323821, 323830, + 323840, 323845, 323851, 323857, 323864, 323870, 323877, 323884, + 323892, 323898, 323905, 323912, 323920, 323927, 323935, 323943, + 323952, 323958, 323965, 323972, 323980, 323987, 323995, 324003, + 324012, 324019, 324027, 324035, 324044, 324052, 324061, 324070, + 324080, 324086, 324093, 324100, 324108, 324115, 324123, 324131, + 324140, 324147, 324155, 324163, 324172, 324180, 324189, 324198, + 324208, 324215, 324223, 324231, 324240, 324248, 324257, 324266, + 324276, 324284, 324293, 324302, 324312, 324321, 324331, 324341, + 324352, 324356, 324361, 324366, 324372, 324377, 324383, 324389, + 324396, 324401, 324407, 324413, 324420, 324426, 324433, 324440, + 324448, 324453, 324459, 324465, 324472, 324478, 324485, 324492, + 324500, 324506, 324513, 324520, 324528, 324535, 324543, 324551, + 324560, 324565, 324571, 324577, 324584, 324590, 324597, 324604, + 324612, 324618, 324625, 324632, 324640, 324647, 324655, 324663, + 324672, 324678, 324685, 324692, 324700, 324707, 324715, 324723, + 324732, 324739, 324747, 324755, 324764, 324772, 324781, 324790, + 324800, 324805, 324811, 324817, 324824, 324830, 324837, 324844, + 324852, 324858, 324865, 324872, 324880, 324887, 324895, 324903, + 324912, 324918, 324925, 324932, 324940, 324947, 324955, 324963, + 324972, 324979, 324987, 324995, 325004, 325012, 325021, 325030, + 325040, 325046, 325053, 325060, 325068, 325075, 325083, 325091, + 325100, 325107, 325115, 325123, 325132, 325140, 325149, 325158, + 325168, 325175, 325183, 325191, 325200, 325208, 325217, 325226, + 325236, 325244, 325253, 325262, 325272, 325281, 325291, 325301, + 325312, 325317, 325323, 325329, 325336, 325342, 325349, 325356, + 325364, 325370, 325377, 325384, 325392, 325399, 325407, 325415, + 325424, 325430, 325437, 325444, 325452, 325459, 325467, 325475, + 325484, 325491, 325499, 325507, 325516, 325524, 325533, 325542, + 325552, 325558, 325565, 325572, 325580, 325587, 325595, 325603, + 325612, 325619, 325627, 325635, 325644, 325652, 325661, 325670, + 325680, 325687, 325695, 325703, 325712, 325720, 325729, 325738, + 325748, 325756, 325765, 325774, 325784, 325793, 325803, 325813, + 325824, 325830, 325837, 325844, 325852, 325859, 325867, 325875, + 325884, 325891, 325899, 325907, 325916, 325924, 325933, 325942, + 325952, 325959, 325967, 325975, 325984, 325992, 326001, 326010, + 326020, 326028, 326037, 326046, 326056, 326065, 326075, 326085, + 326096, 326103, 326111, 326119, 326128, 326136, 326145, 326154, + 326164, 326172, 326181, 326190, 326200, 326209, 326219, 326229, + 326240, 326248, 326257, 326266, 326276, 326285, 326295, 326305, + 326316, 326325, 326335, 326345, 326356, 326366, 326377, 326388, + 326400, 326404, 326409, 326414, 326420, 326425, 326431, 326437, + 326444, 326449, 326455, 326461, 326468, 326474, 326481, 326488, + 326496, 326501, 326507, 326513, 326520, 326526, 326533, 326540, + 326548, 326554, 326561, 326568, 326576, 326583, 326591, 326599, + 326608, 326613, 326619, 326625, 326632, 326638, 326645, 326652, + 326660, 326666, 326673, 326680, 326688, 326695, 326703, 326711, + 326720, 326726, 326733, 326740, 326748, 326755, 326763, 326771, + 326780, 326787, 326795, 326803, 326812, 326820, 326829, 326838, + 326848, 326853, 326859, 326865, 326872, 326878, 326885, 326892, + 326900, 326906, 326913, 326920, 326928, 326935, 326943, 326951, + 326960, 326966, 326973, 326980, 326988, 326995, 327003, 327011, + 327020, 327027, 327035, 327043, 327052, 327060, 327069, 327078, + 327088, 327094, 327101, 327108, 327116, 327123, 327131, 327139, + 327148, 327155, 327163, 327171, 327180, 327188, 327197, 327206, + 327216, 327223, 327231, 327239, 327248, 327256, 327265, 327274, + 327284, 327292, 327301, 327310, 327320, 327329, 327339, 327349, + 327360, 327365, 327371, 327377, 327384, 327390, 327397, 327404, + 327412, 327418, 327425, 327432, 327440, 327447, 327455, 327463, + 327472, 327478, 327485, 327492, 327500, 327507, 327515, 327523, + 327532, 327539, 327547, 327555, 327564, 327572, 327581, 327590, + 327600, 327606, 327613, 327620, 327628, 327635, 327643, 327651, + 327660, 327667, 327675, 327683, 327692, 327700, 327709, 327718, + 327728, 327735, 327743, 327751, 327760, 327768, 327777, 327786, + 327796, 327804, 327813, 327822, 327832, 327841, 327851, 327861, + 327872, 327878, 327885, 327892, 327900, 327907, 327915, 327923, + 327932, 327939, 327947, 327955, 327964, 327972, 327981, 327990, + 328000, 328007, 328015, 328023, 328032, 328040, 328049, 328058, + 328068, 328076, 328085, 328094, 328104, 328113, 328123, 328133, + 328144, 328151, 328159, 328167, 328176, 328184, 328193, 328202, + 328212, 328220, 328229, 328238, 328248, 328257, 328267, 328277, + 328288, 328296, 328305, 328314, 328324, 328333, 328343, 328353, + 328364, 328373, 328383, 328393, 328404, 328414, 328425, 328436, + 328448, 328453, 328459, 328465, 328472, 328478, 328485, 328492, + 328500, 328506, 328513, 328520, 328528, 328535, 328543, 328551, + 328560, 328566, 328573, 328580, 328588, 328595, 328603, 328611, + 328620, 328627, 328635, 328643, 328652, 328660, 328669, 328678, + 328688, 328694, 328701, 328708, 328716, 328723, 328731, 328739, + 328748, 328755, 328763, 328771, 328780, 328788, 328797, 328806, + 328816, 328823, 328831, 328839, 328848, 328856, 328865, 328874, + 328884, 328892, 328901, 328910, 328920, 328929, 328939, 328949, + 328960, 328966, 328973, 328980, 328988, 328995, 329003, 329011, + 329020, 329027, 329035, 329043, 329052, 329060, 329069, 329078, + 329088, 329095, 329103, 329111, 329120, 329128, 329137, 329146, + 329156, 329164, 329173, 329182, 329192, 329201, 329211, 329221, + 329232, 329239, 329247, 329255, 329264, 329272, 329281, 329290, + 329300, 329308, 329317, 329326, 329336, 329345, 329355, 329365, + 329376, 329384, 329393, 329402, 329412, 329421, 329431, 329441, + 329452, 329461, 329471, 329481, 329492, 329502, 329513, 329524, + 329536, 329542, 329549, 329556, 329564, 329571, 329579, 329587, + 329596, 329603, 329611, 329619, 329628, 329636, 329645, 329654, + 329664, 329671, 329679, 329687, 329696, 329704, 329713, 329722, + 329732, 329740, 329749, 329758, 329768, 329777, 329787, 329797, + 329808, 329815, 329823, 329831, 329840, 329848, 329857, 329866, + 329876, 329884, 329893, 329902, 329912, 329921, 329931, 329941, + 329952, 329960, 329969, 329978, 329988, 329997, 330007, 330017, + 330028, 330037, 330047, 330057, 330068, 330078, 330089, 330100, + 330112, 330119, 330127, 330135, 330144, 330152, 330161, 330170, + 330180, 330188, 330197, 330206, 330216, 330225, 330235, 330245, + 330256, 330264, 330273, 330282, 330292, 330301, 330311, 330321, + 330332, 330341, 330351, 330361, 330372, 330382, 330393, 330404, + 330416, 330424, 330433, 330442, 330452, 330461, 330471, 330481, + 330492, 330501, 330511, 330521, 330532, 330542, 330553, 330564, + 330576, 330585, 330595, 330605, 330616, 330626, 330637, 330648, + 330660, 330670, 330681, 330692, 330704, 330715, 330727, 330739, + 330752, 330756, 330761, 330766, 330772, 330777, 330783, 330789, + 330796, 330801, 330807, 330813, 330820, 330826, 330833, 330840, + 330848, 330853, 330859, 330865, 330872, 330878, 330885, 330892, + 330900, 330906, 330913, 330920, 330928, 330935, 330943, 330951, + 330960, 330965, 330971, 330977, 330984, 330990, 330997, 331004, + 331012, 331018, 331025, 331032, 331040, 331047, 331055, 331063, + 331072, 331078, 331085, 331092, 331100, 331107, 331115, 331123, + 331132, 331139, 331147, 331155, 331164, 331172, 331181, 331190, + 331200, 331205, 331211, 331217, 331224, 331230, 331237, 331244, + 331252, 331258, 331265, 331272, 331280, 331287, 331295, 331303, + 331312, 331318, 331325, 331332, 331340, 331347, 331355, 331363, + 331372, 331379, 331387, 331395, 331404, 331412, 331421, 331430, + 331440, 331446, 331453, 331460, 331468, 331475, 331483, 331491, + 331500, 331507, 331515, 331523, 331532, 331540, 331549, 331558, + 331568, 331575, 331583, 331591, 331600, 331608, 331617, 331626, + 331636, 331644, 331653, 331662, 331672, 331681, 331691, 331701, + 331712, 331717, 331723, 331729, 331736, 331742, 331749, 331756, + 331764, 331770, 331777, 331784, 331792, 331799, 331807, 331815, + 331824, 331830, 331837, 331844, 331852, 331859, 331867, 331875, + 331884, 331891, 331899, 331907, 331916, 331924, 331933, 331942, + 331952, 331958, 331965, 331972, 331980, 331987, 331995, 332003, + 332012, 332019, 332027, 332035, 332044, 332052, 332061, 332070, + 332080, 332087, 332095, 332103, 332112, 332120, 332129, 332138, + 332148, 332156, 332165, 332174, 332184, 332193, 332203, 332213, + 332224, 332230, 332237, 332244, 332252, 332259, 332267, 332275, + 332284, 332291, 332299, 332307, 332316, 332324, 332333, 332342, + 332352, 332359, 332367, 332375, 332384, 332392, 332401, 332410, + 332420, 332428, 332437, 332446, 332456, 332465, 332475, 332485, + 332496, 332503, 332511, 332519, 332528, 332536, 332545, 332554, + 332564, 332572, 332581, 332590, 332600, 332609, 332619, 332629, + 332640, 332648, 332657, 332666, 332676, 332685, 332695, 332705, + 332716, 332725, 332735, 332745, 332756, 332766, 332777, 332788, + 332800, 332805, 332811, 332817, 332824, 332830, 332837, 332844, + 332852, 332858, 332865, 332872, 332880, 332887, 332895, 332903, + 332912, 332918, 332925, 332932, 332940, 332947, 332955, 332963, + 332972, 332979, 332987, 332995, 333004, 333012, 333021, 333030, + 333040, 333046, 333053, 333060, 333068, 333075, 333083, 333091, + 333100, 333107, 333115, 333123, 333132, 333140, 333149, 333158, + 333168, 333175, 333183, 333191, 333200, 333208, 333217, 333226, + 333236, 333244, 333253, 333262, 333272, 333281, 333291, 333301, + 333312, 333318, 333325, 333332, 333340, 333347, 333355, 333363, + 333372, 333379, 333387, 333395, 333404, 333412, 333421, 333430, + 333440, 333447, 333455, 333463, 333472, 333480, 333489, 333498, + 333508, 333516, 333525, 333534, 333544, 333553, 333563, 333573, + 333584, 333591, 333599, 333607, 333616, 333624, 333633, 333642, + 333652, 333660, 333669, 333678, 333688, 333697, 333707, 333717, + 333728, 333736, 333745, 333754, 333764, 333773, 333783, 333793, + 333804, 333813, 333823, 333833, 333844, 333854, 333865, 333876, + 333888, 333894, 333901, 333908, 333916, 333923, 333931, 333939, + 333948, 333955, 333963, 333971, 333980, 333988, 333997, 334006, + 334016, 334023, 334031, 334039, 334048, 334056, 334065, 334074, + 334084, 334092, 334101, 334110, 334120, 334129, 334139, 334149, + 334160, 334167, 334175, 334183, 334192, 334200, 334209, 334218, + 334228, 334236, 334245, 334254, 334264, 334273, 334283, 334293, + 334304, 334312, 334321, 334330, 334340, 334349, 334359, 334369, + 334380, 334389, 334399, 334409, 334420, 334430, 334441, 334452, + 334464, 334471, 334479, 334487, 334496, 334504, 334513, 334522, + 334532, 334540, 334549, 334558, 334568, 334577, 334587, 334597, + 334608, 334616, 334625, 334634, 334644, 334653, 334663, 334673, + 334684, 334693, 334703, 334713, 334724, 334734, 334745, 334756, + 334768, 334776, 334785, 334794, 334804, 334813, 334823, 334833, + 334844, 334853, 334863, 334873, 334884, 334894, 334905, 334916, + 334928, 334937, 334947, 334957, 334968, 334978, 334989, 335000, + 335012, 335022, 335033, 335044, 335056, 335067, 335079, 335091, + 335104, 335109, 335115, 335121, 335128, 335134, 335141, 335148, + 335156, 335162, 335169, 335176, 335184, 335191, 335199, 335207, + 335216, 335222, 335229, 335236, 335244, 335251, 335259, 335267, + 335276, 335283, 335291, 335299, 335308, 335316, 335325, 335334, + 335344, 335350, 335357, 335364, 335372, 335379, 335387, 335395, + 335404, 335411, 335419, 335427, 335436, 335444, 335453, 335462, + 335472, 335479, 335487, 335495, 335504, 335512, 335521, 335530, + 335540, 335548, 335557, 335566, 335576, 335585, 335595, 335605, + 335616, 335622, 335629, 335636, 335644, 335651, 335659, 335667, + 335676, 335683, 335691, 335699, 335708, 335716, 335725, 335734, + 335744, 335751, 335759, 335767, 335776, 335784, 335793, 335802, + 335812, 335820, 335829, 335838, 335848, 335857, 335867, 335877, + 335888, 335895, 335903, 335911, 335920, 335928, 335937, 335946, + 335956, 335964, 335973, 335982, 335992, 336001, 336011, 336021, + 336032, 336040, 336049, 336058, 336068, 336077, 336087, 336097, + 336108, 336117, 336127, 336137, 336148, 336158, 336169, 336180, + 336192, 336198, 336205, 336212, 336220, 336227, 336235, 336243, + 336252, 336259, 336267, 336275, 336284, 336292, 336301, 336310, + 336320, 336327, 336335, 336343, 336352, 336360, 336369, 336378, + 336388, 336396, 336405, 336414, 336424, 336433, 336443, 336453, + 336464, 336471, 336479, 336487, 336496, 336504, 336513, 336522, + 336532, 336540, 336549, 336558, 336568, 336577, 336587, 336597, + 336608, 336616, 336625, 336634, 336644, 336653, 336663, 336673, + 336684, 336693, 336703, 336713, 336724, 336734, 336745, 336756, + 336768, 336775, 336783, 336791, 336800, 336808, 336817, 336826, + 336836, 336844, 336853, 336862, 336872, 336881, 336891, 336901, + 336912, 336920, 336929, 336938, 336948, 336957, 336967, 336977, + 336988, 336997, 337007, 337017, 337028, 337038, 337049, 337060, + 337072, 337080, 337089, 337098, 337108, 337117, 337127, 337137, + 337148, 337157, 337167, 337177, 337188, 337198, 337209, 337220, + 337232, 337241, 337251, 337261, 337272, 337282, 337293, 337304, + 337316, 337326, 337337, 337348, 337360, 337371, 337383, 337395, + 337408, 337414, 337421, 337428, 337436, 337443, 337451, 337459, + 337468, 337475, 337483, 337491, 337500, 337508, 337517, 337526, + 337536, 337543, 337551, 337559, 337568, 337576, 337585, 337594, + 337604, 337612, 337621, 337630, 337640, 337649, 337659, 337669, + 337680, 337687, 337695, 337703, 337712, 337720, 337729, 337738, + 337748, 337756, 337765, 337774, 337784, 337793, 337803, 337813, + 337824, 337832, 337841, 337850, 337860, 337869, 337879, 337889, + 337900, 337909, 337919, 337929, 337940, 337950, 337961, 337972, + 337984, 337991, 337999, 338007, 338016, 338024, 338033, 338042, + 338052, 338060, 338069, 338078, 338088, 338097, 338107, 338117, + 338128, 338136, 338145, 338154, 338164, 338173, 338183, 338193, + 338204, 338213, 338223, 338233, 338244, 338254, 338265, 338276, + 338288, 338296, 338305, 338314, 338324, 338333, 338343, 338353, + 338364, 338373, 338383, 338393, 338404, 338414, 338425, 338436, + 338448, 338457, 338467, 338477, 338488, 338498, 338509, 338520, + 338532, 338542, 338553, 338564, 338576, 338587, 338599, 338611, + 338624, 338631, 338639, 338647, 338656, 338664, 338673, 338682, + 338692, 338700, 338709, 338718, 338728, 338737, 338747, 338757, + 338768, 338776, 338785, 338794, 338804, 338813, 338823, 338833, + 338844, 338853, 338863, 338873, 338884, 338894, 338905, 338916, + 338928, 338936, 338945, 338954, 338964, 338973, 338983, 338993, + 339004, 339013, 339023, 339033, 339044, 339054, 339065, 339076, + 339088, 339097, 339107, 339117, 339128, 339138, 339149, 339160, + 339172, 339182, 339193, 339204, 339216, 339227, 339239, 339251, + 339264, 339272, 339281, 339290, 339300, 339309, 339319, 339329, + 339340, 339349, 339359, 339369, 339380, 339390, 339401, 339412, + 339424, 339433, 339443, 339453, 339464, 339474, 339485, 339496, + 339508, 339518, 339529, 339540, 339552, 339563, 339575, 339587, + 339600, 339609, 339619, 339629, 339640, 339650, 339661, 339672, + 339684, 339694, 339705, 339716, 339728, 339739, 339751, 339763, + 339776, 339786, 339797, 339808, 339820, 339831, 339843, 339855, + 339868, 339879, 339891, 339903, 339916, 339928, 339941, 339954, + 339968, 339971, 339975, 339979, 339984, 339988, 339993, 339998, + 340004, 340008, 340013, 340018, 340024, 340029, 340035, 340041, + 340048, 340052, 340057, 340062, 340068, 340073, 340079, 340085, + 340092, 340097, 340103, 340109, 340116, 340122, 340129, 340136, + 340144, 340148, 340153, 340158, 340164, 340169, 340175, 340181, + 340188, 340193, 340199, 340205, 340212, 340218, 340225, 340232, + 340240, 340245, 340251, 340257, 340264, 340270, 340277, 340284, + 340292, 340298, 340305, 340312, 340320, 340327, 340335, 340343, + 340352, 340356, 340361, 340366, 340372, 340377, 340383, 340389, + 340396, 340401, 340407, 340413, 340420, 340426, 340433, 340440, + 340448, 340453, 340459, 340465, 340472, 340478, 340485, 340492, + 340500, 340506, 340513, 340520, 340528, 340535, 340543, 340551, + 340560, 340565, 340571, 340577, 340584, 340590, 340597, 340604, + 340612, 340618, 340625, 340632, 340640, 340647, 340655, 340663, + 340672, 340678, 340685, 340692, 340700, 340707, 340715, 340723, + 340732, 340739, 340747, 340755, 340764, 340772, 340781, 340790, + 340800, 340804, 340809, 340814, 340820, 340825, 340831, 340837, + 340844, 340849, 340855, 340861, 340868, 340874, 340881, 340888, + 340896, 340901, 340907, 340913, 340920, 340926, 340933, 340940, + 340948, 340954, 340961, 340968, 340976, 340983, 340991, 340999, + 341008, 341013, 341019, 341025, 341032, 341038, 341045, 341052, + 341060, 341066, 341073, 341080, 341088, 341095, 341103, 341111, + 341120, 341126, 341133, 341140, 341148, 341155, 341163, 341171, + 341180, 341187, 341195, 341203, 341212, 341220, 341229, 341238, + 341248, 341253, 341259, 341265, 341272, 341278, 341285, 341292, + 341300, 341306, 341313, 341320, 341328, 341335, 341343, 341351, + 341360, 341366, 341373, 341380, 341388, 341395, 341403, 341411, + 341420, 341427, 341435, 341443, 341452, 341460, 341469, 341478, + 341488, 341494, 341501, 341508, 341516, 341523, 341531, 341539, + 341548, 341555, 341563, 341571, 341580, 341588, 341597, 341606, + 341616, 341623, 341631, 341639, 341648, 341656, 341665, 341674, + 341684, 341692, 341701, 341710, 341720, 341729, 341739, 341749, + 341760, 341764, 341769, 341774, 341780, 341785, 341791, 341797, + 341804, 341809, 341815, 341821, 341828, 341834, 341841, 341848, + 341856, 341861, 341867, 341873, 341880, 341886, 341893, 341900, + 341908, 341914, 341921, 341928, 341936, 341943, 341951, 341959, + 341968, 341973, 341979, 341985, 341992, 341998, 342005, 342012, + 342020, 342026, 342033, 342040, 342048, 342055, 342063, 342071, + 342080, 342086, 342093, 342100, 342108, 342115, 342123, 342131, + 342140, 342147, 342155, 342163, 342172, 342180, 342189, 342198, + 342208, 342213, 342219, 342225, 342232, 342238, 342245, 342252, + 342260, 342266, 342273, 342280, 342288, 342295, 342303, 342311, + 342320, 342326, 342333, 342340, 342348, 342355, 342363, 342371, + 342380, 342387, 342395, 342403, 342412, 342420, 342429, 342438, + 342448, 342454, 342461, 342468, 342476, 342483, 342491, 342499, + 342508, 342515, 342523, 342531, 342540, 342548, 342557, 342566, + 342576, 342583, 342591, 342599, 342608, 342616, 342625, 342634, + 342644, 342652, 342661, 342670, 342680, 342689, 342699, 342709, + 342720, 342725, 342731, 342737, 342744, 342750, 342757, 342764, + 342772, 342778, 342785, 342792, 342800, 342807, 342815, 342823, + 342832, 342838, 342845, 342852, 342860, 342867, 342875, 342883, + 342892, 342899, 342907, 342915, 342924, 342932, 342941, 342950, + 342960, 342966, 342973, 342980, 342988, 342995, 343003, 343011, + 343020, 343027, 343035, 343043, 343052, 343060, 343069, 343078, + 343088, 343095, 343103, 343111, 343120, 343128, 343137, 343146, + 343156, 343164, 343173, 343182, 343192, 343201, 343211, 343221, + 343232, 343238, 343245, 343252, 343260, 343267, 343275, 343283, + 343292, 343299, 343307, 343315, 343324, 343332, 343341, 343350, + 343360, 343367, 343375, 343383, 343392, 343400, 343409, 343418, + 343428, 343436, 343445, 343454, 343464, 343473, 343483, 343493, + 343504, 343511, 343519, 343527, 343536, 343544, 343553, 343562, + 343572, 343580, 343589, 343598, 343608, 343617, 343627, 343637, + 343648, 343656, 343665, 343674, 343684, 343693, 343703, 343713, + 343724, 343733, 343743, 343753, 343764, 343774, 343785, 343796, + 343808, 343812, 343817, 343822, 343828, 343833, 343839, 343845, + 343852, 343857, 343863, 343869, 343876, 343882, 343889, 343896, + 343904, 343909, 343915, 343921, 343928, 343934, 343941, 343948, + 343956, 343962, 343969, 343976, 343984, 343991, 343999, 344007, + 344016, 344021, 344027, 344033, 344040, 344046, 344053, 344060, + 344068, 344074, 344081, 344088, 344096, 344103, 344111, 344119, + 344128, 344134, 344141, 344148, 344156, 344163, 344171, 344179, + 344188, 344195, 344203, 344211, 344220, 344228, 344237, 344246, + 344256, 344261, 344267, 344273, 344280, 344286, 344293, 344300, + 344308, 344314, 344321, 344328, 344336, 344343, 344351, 344359, + 344368, 344374, 344381, 344388, 344396, 344403, 344411, 344419, + 344428, 344435, 344443, 344451, 344460, 344468, 344477, 344486, + 344496, 344502, 344509, 344516, 344524, 344531, 344539, 344547, + 344556, 344563, 344571, 344579, 344588, 344596, 344605, 344614, + 344624, 344631, 344639, 344647, 344656, 344664, 344673, 344682, + 344692, 344700, 344709, 344718, 344728, 344737, 344747, 344757, + 344768, 344773, 344779, 344785, 344792, 344798, 344805, 344812, + 344820, 344826, 344833, 344840, 344848, 344855, 344863, 344871, + 344880, 344886, 344893, 344900, 344908, 344915, 344923, 344931, + 344940, 344947, 344955, 344963, 344972, 344980, 344989, 344998, + 345008, 345014, 345021, 345028, 345036, 345043, 345051, 345059, + 345068, 345075, 345083, 345091, 345100, 345108, 345117, 345126, + 345136, 345143, 345151, 345159, 345168, 345176, 345185, 345194, + 345204, 345212, 345221, 345230, 345240, 345249, 345259, 345269, + 345280, 345286, 345293, 345300, 345308, 345315, 345323, 345331, + 345340, 345347, 345355, 345363, 345372, 345380, 345389, 345398, + 345408, 345415, 345423, 345431, 345440, 345448, 345457, 345466, + 345476, 345484, 345493, 345502, 345512, 345521, 345531, 345541, + 345552, 345559, 345567, 345575, 345584, 345592, 345601, 345610, + 345620, 345628, 345637, 345646, 345656, 345665, 345675, 345685, + 345696, 345704, 345713, 345722, 345732, 345741, 345751, 345761, + 345772, 345781, 345791, 345801, 345812, 345822, 345833, 345844, + 345856, 345861, 345867, 345873, 345880, 345886, 345893, 345900, + 345908, 345914, 345921, 345928, 345936, 345943, 345951, 345959, + 345968, 345974, 345981, 345988, 345996, 346003, 346011, 346019, + 346028, 346035, 346043, 346051, 346060, 346068, 346077, 346086, + 346096, 346102, 346109, 346116, 346124, 346131, 346139, 346147, + 346156, 346163, 346171, 346179, 346188, 346196, 346205, 346214, + 346224, 346231, 346239, 346247, 346256, 346264, 346273, 346282, + 346292, 346300, 346309, 346318, 346328, 346337, 346347, 346357, + 346368, 346374, 346381, 346388, 346396, 346403, 346411, 346419, + 346428, 346435, 346443, 346451, 346460, 346468, 346477, 346486, + 346496, 346503, 346511, 346519, 346528, 346536, 346545, 346554, + 346564, 346572, 346581, 346590, 346600, 346609, 346619, 346629, + 346640, 346647, 346655, 346663, 346672, 346680, 346689, 346698, + 346708, 346716, 346725, 346734, 346744, 346753, 346763, 346773, + 346784, 346792, 346801, 346810, 346820, 346829, 346839, 346849, + 346860, 346869, 346879, 346889, 346900, 346910, 346921, 346932, + 346944, 346950, 346957, 346964, 346972, 346979, 346987, 346995, + 347004, 347011, 347019, 347027, 347036, 347044, 347053, 347062, + 347072, 347079, 347087, 347095, 347104, 347112, 347121, 347130, + 347140, 347148, 347157, 347166, 347176, 347185, 347195, 347205, + 347216, 347223, 347231, 347239, 347248, 347256, 347265, 347274, + 347284, 347292, 347301, 347310, 347320, 347329, 347339, 347349, + 347360, 347368, 347377, 347386, 347396, 347405, 347415, 347425, + 347436, 347445, 347455, 347465, 347476, 347486, 347497, 347508, + 347520, 347527, 347535, 347543, 347552, 347560, 347569, 347578, + 347588, 347596, 347605, 347614, 347624, 347633, 347643, 347653, + 347664, 347672, 347681, 347690, 347700, 347709, 347719, 347729, + 347740, 347749, 347759, 347769, 347780, 347790, 347801, 347812, + 347824, 347832, 347841, 347850, 347860, 347869, 347879, 347889, + 347900, 347909, 347919, 347929, 347940, 347950, 347961, 347972, + 347984, 347993, 348003, 348013, 348024, 348034, 348045, 348056, + 348068, 348078, 348089, 348100, 348112, 348123, 348135, 348147, + 348160, 348164, 348169, 348174, 348180, 348185, 348191, 348197, + 348204, 348209, 348215, 348221, 348228, 348234, 348241, 348248, + 348256, 348261, 348267, 348273, 348280, 348286, 348293, 348300, + 348308, 348314, 348321, 348328, 348336, 348343, 348351, 348359, + 348368, 348373, 348379, 348385, 348392, 348398, 348405, 348412, + 348420, 348426, 348433, 348440, 348448, 348455, 348463, 348471, + 348480, 348486, 348493, 348500, 348508, 348515, 348523, 348531, + 348540, 348547, 348555, 348563, 348572, 348580, 348589, 348598, + 348608, 348613, 348619, 348625, 348632, 348638, 348645, 348652, + 348660, 348666, 348673, 348680, 348688, 348695, 348703, 348711, + 348720, 348726, 348733, 348740, 348748, 348755, 348763, 348771, + 348780, 348787, 348795, 348803, 348812, 348820, 348829, 348838, + 348848, 348854, 348861, 348868, 348876, 348883, 348891, 348899, + 348908, 348915, 348923, 348931, 348940, 348948, 348957, 348966, + 348976, 348983, 348991, 348999, 349008, 349016, 349025, 349034, + 349044, 349052, 349061, 349070, 349080, 349089, 349099, 349109, + 349120, 349125, 349131, 349137, 349144, 349150, 349157, 349164, + 349172, 349178, 349185, 349192, 349200, 349207, 349215, 349223, + 349232, 349238, 349245, 349252, 349260, 349267, 349275, 349283, + 349292, 349299, 349307, 349315, 349324, 349332, 349341, 349350, + 349360, 349366, 349373, 349380, 349388, 349395, 349403, 349411, + 349420, 349427, 349435, 349443, 349452, 349460, 349469, 349478, + 349488, 349495, 349503, 349511, 349520, 349528, 349537, 349546, + 349556, 349564, 349573, 349582, 349592, 349601, 349611, 349621, + 349632, 349638, 349645, 349652, 349660, 349667, 349675, 349683, + 349692, 349699, 349707, 349715, 349724, 349732, 349741, 349750, + 349760, 349767, 349775, 349783, 349792, 349800, 349809, 349818, + 349828, 349836, 349845, 349854, 349864, 349873, 349883, 349893, + 349904, 349911, 349919, 349927, 349936, 349944, 349953, 349962, + 349972, 349980, 349989, 349998, 350008, 350017, 350027, 350037, + 350048, 350056, 350065, 350074, 350084, 350093, 350103, 350113, + 350124, 350133, 350143, 350153, 350164, 350174, 350185, 350196, + 350208, 350213, 350219, 350225, 350232, 350238, 350245, 350252, + 350260, 350266, 350273, 350280, 350288, 350295, 350303, 350311, + 350320, 350326, 350333, 350340, 350348, 350355, 350363, 350371, + 350380, 350387, 350395, 350403, 350412, 350420, 350429, 350438, + 350448, 350454, 350461, 350468, 350476, 350483, 350491, 350499, + 350508, 350515, 350523, 350531, 350540, 350548, 350557, 350566, + 350576, 350583, 350591, 350599, 350608, 350616, 350625, 350634, + 350644, 350652, 350661, 350670, 350680, 350689, 350699, 350709, + 350720, 350726, 350733, 350740, 350748, 350755, 350763, 350771, + 350780, 350787, 350795, 350803, 350812, 350820, 350829, 350838, + 350848, 350855, 350863, 350871, 350880, 350888, 350897, 350906, + 350916, 350924, 350933, 350942, 350952, 350961, 350971, 350981, + 350992, 350999, 351007, 351015, 351024, 351032, 351041, 351050, + 351060, 351068, 351077, 351086, 351096, 351105, 351115, 351125, + 351136, 351144, 351153, 351162, 351172, 351181, 351191, 351201, + 351212, 351221, 351231, 351241, 351252, 351262, 351273, 351284, + 351296, 351302, 351309, 351316, 351324, 351331, 351339, 351347, + 351356, 351363, 351371, 351379, 351388, 351396, 351405, 351414, + 351424, 351431, 351439, 351447, 351456, 351464, 351473, 351482, + 351492, 351500, 351509, 351518, 351528, 351537, 351547, 351557, + 351568, 351575, 351583, 351591, 351600, 351608, 351617, 351626, + 351636, 351644, 351653, 351662, 351672, 351681, 351691, 351701, + 351712, 351720, 351729, 351738, 351748, 351757, 351767, 351777, + 351788, 351797, 351807, 351817, 351828, 351838, 351849, 351860, + 351872, 351879, 351887, 351895, 351904, 351912, 351921, 351930, + 351940, 351948, 351957, 351966, 351976, 351985, 351995, 352005, + 352016, 352024, 352033, 352042, 352052, 352061, 352071, 352081, + 352092, 352101, 352111, 352121, 352132, 352142, 352153, 352164, + 352176, 352184, 352193, 352202, 352212, 352221, 352231, 352241, + 352252, 352261, 352271, 352281, 352292, 352302, 352313, 352324, + 352336, 352345, 352355, 352365, 352376, 352386, 352397, 352408, + 352420, 352430, 352441, 352452, 352464, 352475, 352487, 352499, + 352512, 352517, 352523, 352529, 352536, 352542, 352549, 352556, + 352564, 352570, 352577, 352584, 352592, 352599, 352607, 352615, + 352624, 352630, 352637, 352644, 352652, 352659, 352667, 352675, + 352684, 352691, 352699, 352707, 352716, 352724, 352733, 352742, + 352752, 352758, 352765, 352772, 352780, 352787, 352795, 352803, + 352812, 352819, 352827, 352835, 352844, 352852, 352861, 352870, + 352880, 352887, 352895, 352903, 352912, 352920, 352929, 352938, + 352948, 352956, 352965, 352974, 352984, 352993, 353003, 353013, + 353024, 353030, 353037, 353044, 353052, 353059, 353067, 353075, + 353084, 353091, 353099, 353107, 353116, 353124, 353133, 353142, + 353152, 353159, 353167, 353175, 353184, 353192, 353201, 353210, + 353220, 353228, 353237, 353246, 353256, 353265, 353275, 353285, + 353296, 353303, 353311, 353319, 353328, 353336, 353345, 353354, + 353364, 353372, 353381, 353390, 353400, 353409, 353419, 353429, + 353440, 353448, 353457, 353466, 353476, 353485, 353495, 353505, + 353516, 353525, 353535, 353545, 353556, 353566, 353577, 353588, + 353600, 353606, 353613, 353620, 353628, 353635, 353643, 353651, + 353660, 353667, 353675, 353683, 353692, 353700, 353709, 353718, + 353728, 353735, 353743, 353751, 353760, 353768, 353777, 353786, + 353796, 353804, 353813, 353822, 353832, 353841, 353851, 353861, + 353872, 353879, 353887, 353895, 353904, 353912, 353921, 353930, + 353940, 353948, 353957, 353966, 353976, 353985, 353995, 354005, + 354016, 354024, 354033, 354042, 354052, 354061, 354071, 354081, + 354092, 354101, 354111, 354121, 354132, 354142, 354153, 354164, + 354176, 354183, 354191, 354199, 354208, 354216, 354225, 354234, + 354244, 354252, 354261, 354270, 354280, 354289, 354299, 354309, + 354320, 354328, 354337, 354346, 354356, 354365, 354375, 354385, + 354396, 354405, 354415, 354425, 354436, 354446, 354457, 354468, + 354480, 354488, 354497, 354506, 354516, 354525, 354535, 354545, + 354556, 354565, 354575, 354585, 354596, 354606, 354617, 354628, + 354640, 354649, 354659, 354669, 354680, 354690, 354701, 354712, + 354724, 354734, 354745, 354756, 354768, 354779, 354791, 354803, + 354816, 354822, 354829, 354836, 354844, 354851, 354859, 354867, + 354876, 354883, 354891, 354899, 354908, 354916, 354925, 354934, + 354944, 354951, 354959, 354967, 354976, 354984, 354993, 355002, + 355012, 355020, 355029, 355038, 355048, 355057, 355067, 355077, + 355088, 355095, 355103, 355111, 355120, 355128, 355137, 355146, + 355156, 355164, 355173, 355182, 355192, 355201, 355211, 355221, + 355232, 355240, 355249, 355258, 355268, 355277, 355287, 355297, + 355308, 355317, 355327, 355337, 355348, 355358, 355369, 355380, + 355392, 355399, 355407, 355415, 355424, 355432, 355441, 355450, + 355460, 355468, 355477, 355486, 355496, 355505, 355515, 355525, + 355536, 355544, 355553, 355562, 355572, 355581, 355591, 355601, + 355612, 355621, 355631, 355641, 355652, 355662, 355673, 355684, + 355696, 355704, 355713, 355722, 355732, 355741, 355751, 355761, + 355772, 355781, 355791, 355801, 355812, 355822, 355833, 355844, + 355856, 355865, 355875, 355885, 355896, 355906, 355917, 355928, + 355940, 355950, 355961, 355972, 355984, 355995, 356007, 356019, + 356032, 356039, 356047, 356055, 356064, 356072, 356081, 356090, + 356100, 356108, 356117, 356126, 356136, 356145, 356155, 356165, + 356176, 356184, 356193, 356202, 356212, 356221, 356231, 356241, + 356252, 356261, 356271, 356281, 356292, 356302, 356313, 356324, + 356336, 356344, 356353, 356362, 356372, 356381, 356391, 356401, + 356412, 356421, 356431, 356441, 356452, 356462, 356473, 356484, + 356496, 356505, 356515, 356525, 356536, 356546, 356557, 356568, + 356580, 356590, 356601, 356612, 356624, 356635, 356647, 356659, + 356672, 356680, 356689, 356698, 356708, 356717, 356727, 356737, + 356748, 356757, 356767, 356777, 356788, 356798, 356809, 356820, + 356832, 356841, 356851, 356861, 356872, 356882, 356893, 356904, + 356916, 356926, 356937, 356948, 356960, 356971, 356983, 356995, + 357008, 357017, 357027, 357037, 357048, 357058, 357069, 357080, + 357092, 357102, 357113, 357124, 357136, 357147, 357159, 357171, + 357184, 357194, 357205, 357216, 357228, 357239, 357251, 357263, + 357276, 357287, 357299, 357311, 357324, 357336, 357349, 357362, + 357376, 357380, 357385, 357390, 357396, 357401, 357407, 357413, + 357420, 357425, 357431, 357437, 357444, 357450, 357457, 357464, + 357472, 357477, 357483, 357489, 357496, 357502, 357509, 357516, + 357524, 357530, 357537, 357544, 357552, 357559, 357567, 357575, + 357584, 357589, 357595, 357601, 357608, 357614, 357621, 357628, + 357636, 357642, 357649, 357656, 357664, 357671, 357679, 357687, + 357696, 357702, 357709, 357716, 357724, 357731, 357739, 357747, + 357756, 357763, 357771, 357779, 357788, 357796, 357805, 357814, + 357824, 357829, 357835, 357841, 357848, 357854, 357861, 357868, + 357876, 357882, 357889, 357896, 357904, 357911, 357919, 357927, + 357936, 357942, 357949, 357956, 357964, 357971, 357979, 357987, + 357996, 358003, 358011, 358019, 358028, 358036, 358045, 358054, + 358064, 358070, 358077, 358084, 358092, 358099, 358107, 358115, + 358124, 358131, 358139, 358147, 358156, 358164, 358173, 358182, + 358192, 358199, 358207, 358215, 358224, 358232, 358241, 358250, + 358260, 358268, 358277, 358286, 358296, 358305, 358315, 358325, + 358336, 358341, 358347, 358353, 358360, 358366, 358373, 358380, + 358388, 358394, 358401, 358408, 358416, 358423, 358431, 358439, + 358448, 358454, 358461, 358468, 358476, 358483, 358491, 358499, + 358508, 358515, 358523, 358531, 358540, 358548, 358557, 358566, + 358576, 358582, 358589, 358596, 358604, 358611, 358619, 358627, + 358636, 358643, 358651, 358659, 358668, 358676, 358685, 358694, + 358704, 358711, 358719, 358727, 358736, 358744, 358753, 358762, + 358772, 358780, 358789, 358798, 358808, 358817, 358827, 358837, + 358848, 358854, 358861, 358868, 358876, 358883, 358891, 358899, + 358908, 358915, 358923, 358931, 358940, 358948, 358957, 358966, + 358976, 358983, 358991, 358999, 359008, 359016, 359025, 359034, + 359044, 359052, 359061, 359070, 359080, 359089, 359099, 359109, + 359120, 359127, 359135, 359143, 359152, 359160, 359169, 359178, + 359188, 359196, 359205, 359214, 359224, 359233, 359243, 359253, + 359264, 359272, 359281, 359290, 359300, 359309, 359319, 359329, + 359340, 359349, 359359, 359369, 359380, 359390, 359401, 359412, + 359424, 359429, 359435, 359441, 359448, 359454, 359461, 359468, + 359476, 359482, 359489, 359496, 359504, 359511, 359519, 359527, + 359536, 359542, 359549, 359556, 359564, 359571, 359579, 359587, + 359596, 359603, 359611, 359619, 359628, 359636, 359645, 359654, + 359664, 359670, 359677, 359684, 359692, 359699, 359707, 359715, + 359724, 359731, 359739, 359747, 359756, 359764, 359773, 359782, + 359792, 359799, 359807, 359815, 359824, 359832, 359841, 359850, + 359860, 359868, 359877, 359886, 359896, 359905, 359915, 359925, + 359936, 359942, 359949, 359956, 359964, 359971, 359979, 359987, + 359996, 360003, 360011, 360019, 360028, 360036, 360045, 360054, + 360064, 360071, 360079, 360087, 360096, 360104, 360113, 360122, + 360132, 360140, 360149, 360158, 360168, 360177, 360187, 360197, + 360208, 360215, 360223, 360231, 360240, 360248, 360257, 360266, + 360276, 360284, 360293, 360302, 360312, 360321, 360331, 360341, + 360352, 360360, 360369, 360378, 360388, 360397, 360407, 360417, + 360428, 360437, 360447, 360457, 360468, 360478, 360489, 360500, + 360512, 360518, 360525, 360532, 360540, 360547, 360555, 360563, + 360572, 360579, 360587, 360595, 360604, 360612, 360621, 360630, + 360640, 360647, 360655, 360663, 360672, 360680, 360689, 360698, + 360708, 360716, 360725, 360734, 360744, 360753, 360763, 360773, + 360784, 360791, 360799, 360807, 360816, 360824, 360833, 360842, + 360852, 360860, 360869, 360878, 360888, 360897, 360907, 360917, + 360928, 360936, 360945, 360954, 360964, 360973, 360983, 360993, + 361004, 361013, 361023, 361033, 361044, 361054, 361065, 361076, + 361088, 361095, 361103, 361111, 361120, 361128, 361137, 361146, + 361156, 361164, 361173, 361182, 361192, 361201, 361211, 361221, + 361232, 361240, 361249, 361258, 361268, 361277, 361287, 361297, + 361308, 361317, 361327, 361337, 361348, 361358, 361369, 361380, + 361392, 361400, 361409, 361418, 361428, 361437, 361447, 361457, + 361468, 361477, 361487, 361497, 361508, 361518, 361529, 361540, + 361552, 361561, 361571, 361581, 361592, 361602, 361613, 361624, + 361636, 361646, 361657, 361668, 361680, 361691, 361703, 361715, + 361728, 361733, 361739, 361745, 361752, 361758, 361765, 361772, + 361780, 361786, 361793, 361800, 361808, 361815, 361823, 361831, + 361840, 361846, 361853, 361860, 361868, 361875, 361883, 361891, + 361900, 361907, 361915, 361923, 361932, 361940, 361949, 361958, + 361968, 361974, 361981, 361988, 361996, 362003, 362011, 362019, + 362028, 362035, 362043, 362051, 362060, 362068, 362077, 362086, + 362096, 362103, 362111, 362119, 362128, 362136, 362145, 362154, + 362164, 362172, 362181, 362190, 362200, 362209, 362219, 362229, + 362240, 362246, 362253, 362260, 362268, 362275, 362283, 362291, + 362300, 362307, 362315, 362323, 362332, 362340, 362349, 362358, + 362368, 362375, 362383, 362391, 362400, 362408, 362417, 362426, + 362436, 362444, 362453, 362462, 362472, 362481, 362491, 362501, + 362512, 362519, 362527, 362535, 362544, 362552, 362561, 362570, + 362580, 362588, 362597, 362606, 362616, 362625, 362635, 362645, + 362656, 362664, 362673, 362682, 362692, 362701, 362711, 362721, + 362732, 362741, 362751, 362761, 362772, 362782, 362793, 362804, + 362816, 362822, 362829, 362836, 362844, 362851, 362859, 362867, + 362876, 362883, 362891, 362899, 362908, 362916, 362925, 362934, + 362944, 362951, 362959, 362967, 362976, 362984, 362993, 363002, + 363012, 363020, 363029, 363038, 363048, 363057, 363067, 363077, + 363088, 363095, 363103, 363111, 363120, 363128, 363137, 363146, + 363156, 363164, 363173, 363182, 363192, 363201, 363211, 363221, + 363232, 363240, 363249, 363258, 363268, 363277, 363287, 363297, + 363308, 363317, 363327, 363337, 363348, 363358, 363369, 363380, + 363392, 363399, 363407, 363415, 363424, 363432, 363441, 363450, + 363460, 363468, 363477, 363486, 363496, 363505, 363515, 363525, + 363536, 363544, 363553, 363562, 363572, 363581, 363591, 363601, + 363612, 363621, 363631, 363641, 363652, 363662, 363673, 363684, + 363696, 363704, 363713, 363722, 363732, 363741, 363751, 363761, + 363772, 363781, 363791, 363801, 363812, 363822, 363833, 363844, + 363856, 363865, 363875, 363885, 363896, 363906, 363917, 363928, + 363940, 363950, 363961, 363972, 363984, 363995, 364007, 364019, + 364032, 364038, 364045, 364052, 364060, 364067, 364075, 364083, + 364092, 364099, 364107, 364115, 364124, 364132, 364141, 364150, + 364160, 364167, 364175, 364183, 364192, 364200, 364209, 364218, + 364228, 364236, 364245, 364254, 364264, 364273, 364283, 364293, + 364304, 364311, 364319, 364327, 364336, 364344, 364353, 364362, + 364372, 364380, 364389, 364398, 364408, 364417, 364427, 364437, + 364448, 364456, 364465, 364474, 364484, 364493, 364503, 364513, + 364524, 364533, 364543, 364553, 364564, 364574, 364585, 364596, + 364608, 364615, 364623, 364631, 364640, 364648, 364657, 364666, + 364676, 364684, 364693, 364702, 364712, 364721, 364731, 364741, + 364752, 364760, 364769, 364778, 364788, 364797, 364807, 364817, + 364828, 364837, 364847, 364857, 364868, 364878, 364889, 364900, + 364912, 364920, 364929, 364938, 364948, 364957, 364967, 364977, + 364988, 364997, 365007, 365017, 365028, 365038, 365049, 365060, + 365072, 365081, 365091, 365101, 365112, 365122, 365133, 365144, + 365156, 365166, 365177, 365188, 365200, 365211, 365223, 365235, + 365248, 365255, 365263, 365271, 365280, 365288, 365297, 365306, + 365316, 365324, 365333, 365342, 365352, 365361, 365371, 365381, + 365392, 365400, 365409, 365418, 365428, 365437, 365447, 365457, + 365468, 365477, 365487, 365497, 365508, 365518, 365529, 365540, + 365552, 365560, 365569, 365578, 365588, 365597, 365607, 365617, + 365628, 365637, 365647, 365657, 365668, 365678, 365689, 365700, + 365712, 365721, 365731, 365741, 365752, 365762, 365773, 365784, + 365796, 365806, 365817, 365828, 365840, 365851, 365863, 365875, + 365888, 365896, 365905, 365914, 365924, 365933, 365943, 365953, + 365964, 365973, 365983, 365993, 366004, 366014, 366025, 366036, + 366048, 366057, 366067, 366077, 366088, 366098, 366109, 366120, + 366132, 366142, 366153, 366164, 366176, 366187, 366199, 366211, + 366224, 366233, 366243, 366253, 366264, 366274, 366285, 366296, + 366308, 366318, 366329, 366340, 366352, 366363, 366375, 366387, + 366400, 366410, 366421, 366432, 366444, 366455, 366467, 366479, + 366492, 366503, 366515, 366527, 366540, 366552, 366565, 366578, + 366592, 366597, 366603, 366609, 366616, 366622, 366629, 366636, + 366644, 366650, 366657, 366664, 366672, 366679, 366687, 366695, + 366704, 366710, 366717, 366724, 366732, 366739, 366747, 366755, + 366764, 366771, 366779, 366787, 366796, 366804, 366813, 366822, + 366832, 366838, 366845, 366852, 366860, 366867, 366875, 366883, + 366892, 366899, 366907, 366915, 366924, 366932, 366941, 366950, + 366960, 366967, 366975, 366983, 366992, 367000, 367009, 367018, + 367028, 367036, 367045, 367054, 367064, 367073, 367083, 367093, + 367104, 367110, 367117, 367124, 367132, 367139, 367147, 367155, + 367164, 367171, 367179, 367187, 367196, 367204, 367213, 367222, + 367232, 367239, 367247, 367255, 367264, 367272, 367281, 367290, + 367300, 367308, 367317, 367326, 367336, 367345, 367355, 367365, + 367376, 367383, 367391, 367399, 367408, 367416, 367425, 367434, + 367444, 367452, 367461, 367470, 367480, 367489, 367499, 367509, + 367520, 367528, 367537, 367546, 367556, 367565, 367575, 367585, + 367596, 367605, 367615, 367625, 367636, 367646, 367657, 367668, + 367680, 367686, 367693, 367700, 367708, 367715, 367723, 367731, + 367740, 367747, 367755, 367763, 367772, 367780, 367789, 367798, + 367808, 367815, 367823, 367831, 367840, 367848, 367857, 367866, + 367876, 367884, 367893, 367902, 367912, 367921, 367931, 367941, + 367952, 367959, 367967, 367975, 367984, 367992, 368001, 368010, + 368020, 368028, 368037, 368046, 368056, 368065, 368075, 368085, + 368096, 368104, 368113, 368122, 368132, 368141, 368151, 368161, + 368172, 368181, 368191, 368201, 368212, 368222, 368233, 368244, + 368256, 368263, 368271, 368279, 368288, 368296, 368305, 368314, + 368324, 368332, 368341, 368350, 368360, 368369, 368379, 368389, + 368400, 368408, 368417, 368426, 368436, 368445, 368455, 368465, + 368476, 368485, 368495, 368505, 368516, 368526, 368537, 368548, + 368560, 368568, 368577, 368586, 368596, 368605, 368615, 368625, + 368636, 368645, 368655, 368665, 368676, 368686, 368697, 368708, + 368720, 368729, 368739, 368749, 368760, 368770, 368781, 368792, + 368804, 368814, 368825, 368836, 368848, 368859, 368871, 368883, + 368896, 368902, 368909, 368916, 368924, 368931, 368939, 368947, + 368956, 368963, 368971, 368979, 368988, 368996, 369005, 369014, + 369024, 369031, 369039, 369047, 369056, 369064, 369073, 369082, + 369092, 369100, 369109, 369118, 369128, 369137, 369147, 369157, + 369168, 369175, 369183, 369191, 369200, 369208, 369217, 369226, + 369236, 369244, 369253, 369262, 369272, 369281, 369291, 369301, + 369312, 369320, 369329, 369338, 369348, 369357, 369367, 369377, + 369388, 369397, 369407, 369417, 369428, 369438, 369449, 369460, + 369472, 369479, 369487, 369495, 369504, 369512, 369521, 369530, + 369540, 369548, 369557, 369566, 369576, 369585, 369595, 369605, + 369616, 369624, 369633, 369642, 369652, 369661, 369671, 369681, + 369692, 369701, 369711, 369721, 369732, 369742, 369753, 369764, + 369776, 369784, 369793, 369802, 369812, 369821, 369831, 369841, + 369852, 369861, 369871, 369881, 369892, 369902, 369913, 369924, + 369936, 369945, 369955, 369965, 369976, 369986, 369997, 370008, + 370020, 370030, 370041, 370052, 370064, 370075, 370087, 370099, + 370112, 370119, 370127, 370135, 370144, 370152, 370161, 370170, + 370180, 370188, 370197, 370206, 370216, 370225, 370235, 370245, + 370256, 370264, 370273, 370282, 370292, 370301, 370311, 370321, + 370332, 370341, 370351, 370361, 370372, 370382, 370393, 370404, + 370416, 370424, 370433, 370442, 370452, 370461, 370471, 370481, + 370492, 370501, 370511, 370521, 370532, 370542, 370553, 370564, + 370576, 370585, 370595, 370605, 370616, 370626, 370637, 370648, + 370660, 370670, 370681, 370692, 370704, 370715, 370727, 370739, + 370752, 370760, 370769, 370778, 370788, 370797, 370807, 370817, + 370828, 370837, 370847, 370857, 370868, 370878, 370889, 370900, + 370912, 370921, 370931, 370941, 370952, 370962, 370973, 370984, + 370996, 371006, 371017, 371028, 371040, 371051, 371063, 371075, + 371088, 371097, 371107, 371117, 371128, 371138, 371149, 371160, + 371172, 371182, 371193, 371204, 371216, 371227, 371239, 371251, + 371264, 371274, 371285, 371296, 371308, 371319, 371331, 371343, + 371356, 371367, 371379, 371391, 371404, 371416, 371429, 371442, + 371456, 371462, 371469, 371476, 371484, 371491, 371499, 371507, + 371516, 371523, 371531, 371539, 371548, 371556, 371565, 371574, + 371584, 371591, 371599, 371607, 371616, 371624, 371633, 371642, + 371652, 371660, 371669, 371678, 371688, 371697, 371707, 371717, + 371728, 371735, 371743, 371751, 371760, 371768, 371777, 371786, + 371796, 371804, 371813, 371822, 371832, 371841, 371851, 371861, + 371872, 371880, 371889, 371898, 371908, 371917, 371927, 371937, + 371948, 371957, 371967, 371977, 371988, 371998, 372009, 372020, + 372032, 372039, 372047, 372055, 372064, 372072, 372081, 372090, + 372100, 372108, 372117, 372126, 372136, 372145, 372155, 372165, + 372176, 372184, 372193, 372202, 372212, 372221, 372231, 372241, + 372252, 372261, 372271, 372281, 372292, 372302, 372313, 372324, + 372336, 372344, 372353, 372362, 372372, 372381, 372391, 372401, + 372412, 372421, 372431, 372441, 372452, 372462, 372473, 372484, + 372496, 372505, 372515, 372525, 372536, 372546, 372557, 372568, + 372580, 372590, 372601, 372612, 372624, 372635, 372647, 372659, + 372672, 372679, 372687, 372695, 372704, 372712, 372721, 372730, + 372740, 372748, 372757, 372766, 372776, 372785, 372795, 372805, + 372816, 372824, 372833, 372842, 372852, 372861, 372871, 372881, + 372892, 372901, 372911, 372921, 372932, 372942, 372953, 372964, + 372976, 372984, 372993, 373002, 373012, 373021, 373031, 373041, + 373052, 373061, 373071, 373081, 373092, 373102, 373113, 373124, + 373136, 373145, 373155, 373165, 373176, 373186, 373197, 373208, + 373220, 373230, 373241, 373252, 373264, 373275, 373287, 373299, + 373312, 373320, 373329, 373338, 373348, 373357, 373367, 373377, + 373388, 373397, 373407, 373417, 373428, 373438, 373449, 373460, + 373472, 373481, 373491, 373501, 373512, 373522, 373533, 373544, + 373556, 373566, 373577, 373588, 373600, 373611, 373623, 373635, + 373648, 373657, 373667, 373677, 373688, 373698, 373709, 373720, + 373732, 373742, 373753, 373764, 373776, 373787, 373799, 373811, + 373824, 373834, 373845, 373856, 373868, 373879, 373891, 373903, + 373916, 373927, 373939, 373951, 373964, 373976, 373989, 374002, + 374016, 374023, 374031, 374039, 374048, 374056, 374065, 374074, + 374084, 374092, 374101, 374110, 374120, 374129, 374139, 374149, + 374160, 374168, 374177, 374186, 374196, 374205, 374215, 374225, + 374236, 374245, 374255, 374265, 374276, 374286, 374297, 374308, + 374320, 374328, 374337, 374346, 374356, 374365, 374375, 374385, + 374396, 374405, 374415, 374425, 374436, 374446, 374457, 374468, + 374480, 374489, 374499, 374509, 374520, 374530, 374541, 374552, + 374564, 374574, 374585, 374596, 374608, 374619, 374631, 374643, + 374656, 374664, 374673, 374682, 374692, 374701, 374711, 374721, + 374732, 374741, 374751, 374761, 374772, 374782, 374793, 374804, + 374816, 374825, 374835, 374845, 374856, 374866, 374877, 374888, + 374900, 374910, 374921, 374932, 374944, 374955, 374967, 374979, + 374992, 375001, 375011, 375021, 375032, 375042, 375053, 375064, + 375076, 375086, 375097, 375108, 375120, 375131, 375143, 375155, + 375168, 375178, 375189, 375200, 375212, 375223, 375235, 375247, + 375260, 375271, 375283, 375295, 375308, 375320, 375333, 375346, + 375360, 375368, 375377, 375386, 375396, 375405, 375415, 375425, + 375436, 375445, 375455, 375465, 375476, 375486, 375497, 375508, + 375520, 375529, 375539, 375549, 375560, 375570, 375581, 375592, + 375604, 375614, 375625, 375636, 375648, 375659, 375671, 375683, + 375696, 375705, 375715, 375725, 375736, 375746, 375757, 375768, + 375780, 375790, 375801, 375812, 375824, 375835, 375847, 375859, + 375872, 375882, 375893, 375904, 375916, 375927, 375939, 375951, + 375964, 375975, 375987, 375999, 376012, 376024, 376037, 376050, + 376064, 376073, 376083, 376093, 376104, 376114, 376125, 376136, + 376148, 376158, 376169, 376180, 376192, 376203, 376215, 376227, + 376240, 376250, 376261, 376272, 376284, 376295, 376307, 376319, + 376332, 376343, 376355, 376367, 376380, 376392, 376405, 376418, + 376432, 376442, 376453, 376464, 376476, 376487, 376499, 376511, + 376524, 376535, 376547, 376559, 376572, 376584, 376597, 376610, + 376624, 376635, 376647, 376659, 376672, 376684, 376697, 376710, + 376724, 376736, 376749, 376762, 376776, 376789, 376803, 376817, + 376832, 376834, 376837, 376840, 376844, 376847, 376851, 376855, + 376860, 376863, 376867, 376871, 376876, 376880, 376885, 376890, + 376896, 376899, 376903, 376907, 376912, 376916, 376921, 376926, + 376932, 376936, 376941, 376946, 376952, 376957, 376963, 376969, + 376976, 376979, 376983, 376987, 376992, 376996, 377001, 377006, + 377012, 377016, 377021, 377026, 377032, 377037, 377043, 377049, + 377056, 377060, 377065, 377070, 377076, 377081, 377087, 377093, + 377100, 377105, 377111, 377117, 377124, 377130, 377137, 377144, + 377152, 377155, 377159, 377163, 377168, 377172, 377177, 377182, + 377188, 377192, 377197, 377202, 377208, 377213, 377219, 377225, + 377232, 377236, 377241, 377246, 377252, 377257, 377263, 377269, + 377276, 377281, 377287, 377293, 377300, 377306, 377313, 377320, + 377328, 377332, 377337, 377342, 377348, 377353, 377359, 377365, + 377372, 377377, 377383, 377389, 377396, 377402, 377409, 377416, + 377424, 377429, 377435, 377441, 377448, 377454, 377461, 377468, + 377476, 377482, 377489, 377496, 377504, 377511, 377519, 377527, + 377536, 377539, 377543, 377547, 377552, 377556, 377561, 377566, + 377572, 377576, 377581, 377586, 377592, 377597, 377603, 377609, + 377616, 377620, 377625, 377630, 377636, 377641, 377647, 377653, + 377660, 377665, 377671, 377677, 377684, 377690, 377697, 377704, + 377712, 377716, 377721, 377726, 377732, 377737, 377743, 377749, + 377756, 377761, 377767, 377773, 377780, 377786, 377793, 377800, + 377808, 377813, 377819, 377825, 377832, 377838, 377845, 377852, + 377860, 377866, 377873, 377880, 377888, 377895, 377903, 377911, + 377920, 377924, 377929, 377934, 377940, 377945, 377951, 377957, + 377964, 377969, 377975, 377981, 377988, 377994, 378001, 378008, + 378016, 378021, 378027, 378033, 378040, 378046, 378053, 378060, + 378068, 378074, 378081, 378088, 378096, 378103, 378111, 378119, + 378128, 378133, 378139, 378145, 378152, 378158, 378165, 378172, + 378180, 378186, 378193, 378200, 378208, 378215, 378223, 378231, + 378240, 378246, 378253, 378260, 378268, 378275, 378283, 378291, + 378300, 378307, 378315, 378323, 378332, 378340, 378349, 378358, + 378368, 378371, 378375, 378379, 378384, 378388, 378393, 378398, + 378404, 378408, 378413, 378418, 378424, 378429, 378435, 378441, + 378448, 378452, 378457, 378462, 378468, 378473, 378479, 378485, + 378492, 378497, 378503, 378509, 378516, 378522, 378529, 378536, + 378544, 378548, 378553, 378558, 378564, 378569, 378575, 378581, + 378588, 378593, 378599, 378605, 378612, 378618, 378625, 378632, + 378640, 378645, 378651, 378657, 378664, 378670, 378677, 378684, + 378692, 378698, 378705, 378712, 378720, 378727, 378735, 378743, + 378752, 378756, 378761, 378766, 378772, 378777, 378783, 378789, + 378796, 378801, 378807, 378813, 378820, 378826, 378833, 378840, + 378848, 378853, 378859, 378865, 378872, 378878, 378885, 378892, + 378900, 378906, 378913, 378920, 378928, 378935, 378943, 378951, + 378960, 378965, 378971, 378977, 378984, 378990, 378997, 379004, + 379012, 379018, 379025, 379032, 379040, 379047, 379055, 379063, + 379072, 379078, 379085, 379092, 379100, 379107, 379115, 379123, + 379132, 379139, 379147, 379155, 379164, 379172, 379181, 379190, + 379200, 379204, 379209, 379214, 379220, 379225, 379231, 379237, + 379244, 379249, 379255, 379261, 379268, 379274, 379281, 379288, + 379296, 379301, 379307, 379313, 379320, 379326, 379333, 379340, + 379348, 379354, 379361, 379368, 379376, 379383, 379391, 379399, + 379408, 379413, 379419, 379425, 379432, 379438, 379445, 379452, + 379460, 379466, 379473, 379480, 379488, 379495, 379503, 379511, + 379520, 379526, 379533, 379540, 379548, 379555, 379563, 379571, + 379580, 379587, 379595, 379603, 379612, 379620, 379629, 379638, + 379648, 379653, 379659, 379665, 379672, 379678, 379685, 379692, + 379700, 379706, 379713, 379720, 379728, 379735, 379743, 379751, + 379760, 379766, 379773, 379780, 379788, 379795, 379803, 379811, + 379820, 379827, 379835, 379843, 379852, 379860, 379869, 379878, + 379888, 379894, 379901, 379908, 379916, 379923, 379931, 379939, + 379948, 379955, 379963, 379971, 379980, 379988, 379997, 380006, + 380016, 380023, 380031, 380039, 380048, 380056, 380065, 380074, + 380084, 380092, 380101, 380110, 380120, 380129, 380139, 380149, + 380160, 380163, 380167, 380171, 380176, 380180, 380185, 380190, + 380196, 380200, 380205, 380210, 380216, 380221, 380227, 380233, + 380240, 380244, 380249, 380254, 380260, 380265, 380271, 380277, + 380284, 380289, 380295, 380301, 380308, 380314, 380321, 380328, + 380336, 380340, 380345, 380350, 380356, 380361, 380367, 380373, + 380380, 380385, 380391, 380397, 380404, 380410, 380417, 380424, + 380432, 380437, 380443, 380449, 380456, 380462, 380469, 380476, + 380484, 380490, 380497, 380504, 380512, 380519, 380527, 380535, + 380544, 380548, 380553, 380558, 380564, 380569, 380575, 380581, + 380588, 380593, 380599, 380605, 380612, 380618, 380625, 380632, + 380640, 380645, 380651, 380657, 380664, 380670, 380677, 380684, + 380692, 380698, 380705, 380712, 380720, 380727, 380735, 380743, + 380752, 380757, 380763, 380769, 380776, 380782, 380789, 380796, + 380804, 380810, 380817, 380824, 380832, 380839, 380847, 380855, + 380864, 380870, 380877, 380884, 380892, 380899, 380907, 380915, + 380924, 380931, 380939, 380947, 380956, 380964, 380973, 380982, + 380992, 380996, 381001, 381006, 381012, 381017, 381023, 381029, + 381036, 381041, 381047, 381053, 381060, 381066, 381073, 381080, + 381088, 381093, 381099, 381105, 381112, 381118, 381125, 381132, + 381140, 381146, 381153, 381160, 381168, 381175, 381183, 381191, + 381200, 381205, 381211, 381217, 381224, 381230, 381237, 381244, + 381252, 381258, 381265, 381272, 381280, 381287, 381295, 381303, + 381312, 381318, 381325, 381332, 381340, 381347, 381355, 381363, + 381372, 381379, 381387, 381395, 381404, 381412, 381421, 381430, + 381440, 381445, 381451, 381457, 381464, 381470, 381477, 381484, + 381492, 381498, 381505, 381512, 381520, 381527, 381535, 381543, + 381552, 381558, 381565, 381572, 381580, 381587, 381595, 381603, + 381612, 381619, 381627, 381635, 381644, 381652, 381661, 381670, + 381680, 381686, 381693, 381700, 381708, 381715, 381723, 381731, + 381740, 381747, 381755, 381763, 381772, 381780, 381789, 381798, + 381808, 381815, 381823, 381831, 381840, 381848, 381857, 381866, + 381876, 381884, 381893, 381902, 381912, 381921, 381931, 381941, + 381952, 381956, 381961, 381966, 381972, 381977, 381983, 381989, + 381996, 382001, 382007, 382013, 382020, 382026, 382033, 382040, + 382048, 382053, 382059, 382065, 382072, 382078, 382085, 382092, + 382100, 382106, 382113, 382120, 382128, 382135, 382143, 382151, + 382160, 382165, 382171, 382177, 382184, 382190, 382197, 382204, + 382212, 382218, 382225, 382232, 382240, 382247, 382255, 382263, + 382272, 382278, 382285, 382292, 382300, 382307, 382315, 382323, + 382332, 382339, 382347, 382355, 382364, 382372, 382381, 382390, + 382400, 382405, 382411, 382417, 382424, 382430, 382437, 382444, + 382452, 382458, 382465, 382472, 382480, 382487, 382495, 382503, + 382512, 382518, 382525, 382532, 382540, 382547, 382555, 382563, + 382572, 382579, 382587, 382595, 382604, 382612, 382621, 382630, + 382640, 382646, 382653, 382660, 382668, 382675, 382683, 382691, + 382700, 382707, 382715, 382723, 382732, 382740, 382749, 382758, + 382768, 382775, 382783, 382791, 382800, 382808, 382817, 382826, + 382836, 382844, 382853, 382862, 382872, 382881, 382891, 382901, + 382912, 382917, 382923, 382929, 382936, 382942, 382949, 382956, + 382964, 382970, 382977, 382984, 382992, 382999, 383007, 383015, + 383024, 383030, 383037, 383044, 383052, 383059, 383067, 383075, + 383084, 383091, 383099, 383107, 383116, 383124, 383133, 383142, + 383152, 383158, 383165, 383172, 383180, 383187, 383195, 383203, + 383212, 383219, 383227, 383235, 383244, 383252, 383261, 383270, + 383280, 383287, 383295, 383303, 383312, 383320, 383329, 383338, + 383348, 383356, 383365, 383374, 383384, 383393, 383403, 383413, + 383424, 383430, 383437, 383444, 383452, 383459, 383467, 383475, + 383484, 383491, 383499, 383507, 383516, 383524, 383533, 383542, + 383552, 383559, 383567, 383575, 383584, 383592, 383601, 383610, + 383620, 383628, 383637, 383646, 383656, 383665, 383675, 383685, + 383696, 383703, 383711, 383719, 383728, 383736, 383745, 383754, + 383764, 383772, 383781, 383790, 383800, 383809, 383819, 383829, + 383840, 383848, 383857, 383866, 383876, 383885, 383895, 383905, + 383916, 383925, 383935, 383945, 383956, 383966, 383977, 383988, + 384000, 384003, 384007, 384011, 384016, 384020, 384025, 384030, + 384036, 384040, 384045, 384050, 384056, 384061, 384067, 384073, + 384080, 384084, 384089, 384094, 384100, 384105, 384111, 384117, + 384124, 384129, 384135, 384141, 384148, 384154, 384161, 384168, + 384176, 384180, 384185, 384190, 384196, 384201, 384207, 384213, + 384220, 384225, 384231, 384237, 384244, 384250, 384257, 384264, + 384272, 384277, 384283, 384289, 384296, 384302, 384309, 384316, + 384324, 384330, 384337, 384344, 384352, 384359, 384367, 384375, + 384384, 384388, 384393, 384398, 384404, 384409, 384415, 384421, + 384428, 384433, 384439, 384445, 384452, 384458, 384465, 384472, + 384480, 384485, 384491, 384497, 384504, 384510, 384517, 384524, + 384532, 384538, 384545, 384552, 384560, 384567, 384575, 384583, + 384592, 384597, 384603, 384609, 384616, 384622, 384629, 384636, + 384644, 384650, 384657, 384664, 384672, 384679, 384687, 384695, + 384704, 384710, 384717, 384724, 384732, 384739, 384747, 384755, + 384764, 384771, 384779, 384787, 384796, 384804, 384813, 384822, + 384832, 384836, 384841, 384846, 384852, 384857, 384863, 384869, + 384876, 384881, 384887, 384893, 384900, 384906, 384913, 384920, + 384928, 384933, 384939, 384945, 384952, 384958, 384965, 384972, + 384980, 384986, 384993, 385000, 385008, 385015, 385023, 385031, + 385040, 385045, 385051, 385057, 385064, 385070, 385077, 385084, + 385092, 385098, 385105, 385112, 385120, 385127, 385135, 385143, + 385152, 385158, 385165, 385172, 385180, 385187, 385195, 385203, + 385212, 385219, 385227, 385235, 385244, 385252, 385261, 385270, + 385280, 385285, 385291, 385297, 385304, 385310, 385317, 385324, + 385332, 385338, 385345, 385352, 385360, 385367, 385375, 385383, + 385392, 385398, 385405, 385412, 385420, 385427, 385435, 385443, + 385452, 385459, 385467, 385475, 385484, 385492, 385501, 385510, + 385520, 385526, 385533, 385540, 385548, 385555, 385563, 385571, + 385580, 385587, 385595, 385603, 385612, 385620, 385629, 385638, + 385648, 385655, 385663, 385671, 385680, 385688, 385697, 385706, + 385716, 385724, 385733, 385742, 385752, 385761, 385771, 385781, + 385792, 385796, 385801, 385806, 385812, 385817, 385823, 385829, + 385836, 385841, 385847, 385853, 385860, 385866, 385873, 385880, + 385888, 385893, 385899, 385905, 385912, 385918, 385925, 385932, + 385940, 385946, 385953, 385960, 385968, 385975, 385983, 385991, + 386000, 386005, 386011, 386017, 386024, 386030, 386037, 386044, + 386052, 386058, 386065, 386072, 386080, 386087, 386095, 386103, + 386112, 386118, 386125, 386132, 386140, 386147, 386155, 386163, + 386172, 386179, 386187, 386195, 386204, 386212, 386221, 386230, + 386240, 386245, 386251, 386257, 386264, 386270, 386277, 386284, + 386292, 386298, 386305, 386312, 386320, 386327, 386335, 386343, + 386352, 386358, 386365, 386372, 386380, 386387, 386395, 386403, + 386412, 386419, 386427, 386435, 386444, 386452, 386461, 386470, + 386480, 386486, 386493, 386500, 386508, 386515, 386523, 386531, + 386540, 386547, 386555, 386563, 386572, 386580, 386589, 386598, + 386608, 386615, 386623, 386631, 386640, 386648, 386657, 386666, + 386676, 386684, 386693, 386702, 386712, 386721, 386731, 386741, + 386752, 386757, 386763, 386769, 386776, 386782, 386789, 386796, + 386804, 386810, 386817, 386824, 386832, 386839, 386847, 386855, + 386864, 386870, 386877, 386884, 386892, 386899, 386907, 386915, + 386924, 386931, 386939, 386947, 386956, 386964, 386973, 386982, + 386992, 386998, 387005, 387012, 387020, 387027, 387035, 387043, + 387052, 387059, 387067, 387075, 387084, 387092, 387101, 387110, + 387120, 387127, 387135, 387143, 387152, 387160, 387169, 387178, + 387188, 387196, 387205, 387214, 387224, 387233, 387243, 387253, + 387264, 387270, 387277, 387284, 387292, 387299, 387307, 387315, + 387324, 387331, 387339, 387347, 387356, 387364, 387373, 387382, + 387392, 387399, 387407, 387415, 387424, 387432, 387441, 387450, + 387460, 387468, 387477, 387486, 387496, 387505, 387515, 387525, + 387536, 387543, 387551, 387559, 387568, 387576, 387585, 387594, + 387604, 387612, 387621, 387630, 387640, 387649, 387659, 387669, + 387680, 387688, 387697, 387706, 387716, 387725, 387735, 387745, + 387756, 387765, 387775, 387785, 387796, 387806, 387817, 387828, + 387840, 387844, 387849, 387854, 387860, 387865, 387871, 387877, + 387884, 387889, 387895, 387901, 387908, 387914, 387921, 387928, + 387936, 387941, 387947, 387953, 387960, 387966, 387973, 387980, + 387988, 387994, 388001, 388008, 388016, 388023, 388031, 388039, + 388048, 388053, 388059, 388065, 388072, 388078, 388085, 388092, + 388100, 388106, 388113, 388120, 388128, 388135, 388143, 388151, + 388160, 388166, 388173, 388180, 388188, 388195, 388203, 388211, + 388220, 388227, 388235, 388243, 388252, 388260, 388269, 388278, + 388288, 388293, 388299, 388305, 388312, 388318, 388325, 388332, + 388340, 388346, 388353, 388360, 388368, 388375, 388383, 388391, + 388400, 388406, 388413, 388420, 388428, 388435, 388443, 388451, + 388460, 388467, 388475, 388483, 388492, 388500, 388509, 388518, + 388528, 388534, 388541, 388548, 388556, 388563, 388571, 388579, + 388588, 388595, 388603, 388611, 388620, 388628, 388637, 388646, + 388656, 388663, 388671, 388679, 388688, 388696, 388705, 388714, + 388724, 388732, 388741, 388750, 388760, 388769, 388779, 388789, + 388800, 388805, 388811, 388817, 388824, 388830, 388837, 388844, + 388852, 388858, 388865, 388872, 388880, 388887, 388895, 388903, + 388912, 388918, 388925, 388932, 388940, 388947, 388955, 388963, + 388972, 388979, 388987, 388995, 389004, 389012, 389021, 389030, + 389040, 389046, 389053, 389060, 389068, 389075, 389083, 389091, + 389100, 389107, 389115, 389123, 389132, 389140, 389149, 389158, + 389168, 389175, 389183, 389191, 389200, 389208, 389217, 389226, + 389236, 389244, 389253, 389262, 389272, 389281, 389291, 389301, + 389312, 389318, 389325, 389332, 389340, 389347, 389355, 389363, + 389372, 389379, 389387, 389395, 389404, 389412, 389421, 389430, + 389440, 389447, 389455, 389463, 389472, 389480, 389489, 389498, + 389508, 389516, 389525, 389534, 389544, 389553, 389563, 389573, + 389584, 389591, 389599, 389607, 389616, 389624, 389633, 389642, + 389652, 389660, 389669, 389678, 389688, 389697, 389707, 389717, + 389728, 389736, 389745, 389754, 389764, 389773, 389783, 389793, + 389804, 389813, 389823, 389833, 389844, 389854, 389865, 389876, + 389888, 389893, 389899, 389905, 389912, 389918, 389925, 389932, + 389940, 389946, 389953, 389960, 389968, 389975, 389983, 389991, + 390000, 390006, 390013, 390020, 390028, 390035, 390043, 390051, + 390060, 390067, 390075, 390083, 390092, 390100, 390109, 390118, + 390128, 390134, 390141, 390148, 390156, 390163, 390171, 390179, + 390188, 390195, 390203, 390211, 390220, 390228, 390237, 390246, + 390256, 390263, 390271, 390279, 390288, 390296, 390305, 390314, + 390324, 390332, 390341, 390350, 390360, 390369, 390379, 390389, + 390400, 390406, 390413, 390420, 390428, 390435, 390443, 390451, + 390460, 390467, 390475, 390483, 390492, 390500, 390509, 390518, + 390528, 390535, 390543, 390551, 390560, 390568, 390577, 390586, + 390596, 390604, 390613, 390622, 390632, 390641, 390651, 390661, + 390672, 390679, 390687, 390695, 390704, 390712, 390721, 390730, + 390740, 390748, 390757, 390766, 390776, 390785, 390795, 390805, + 390816, 390824, 390833, 390842, 390852, 390861, 390871, 390881, + 390892, 390901, 390911, 390921, 390932, 390942, 390953, 390964, + 390976, 390982, 390989, 390996, 391004, 391011, 391019, 391027, + 391036, 391043, 391051, 391059, 391068, 391076, 391085, 391094, + 391104, 391111, 391119, 391127, 391136, 391144, 391153, 391162, + 391172, 391180, 391189, 391198, 391208, 391217, 391227, 391237, + 391248, 391255, 391263, 391271, 391280, 391288, 391297, 391306, + 391316, 391324, 391333, 391342, 391352, 391361, 391371, 391381, + 391392, 391400, 391409, 391418, 391428, 391437, 391447, 391457, + 391468, 391477, 391487, 391497, 391508, 391518, 391529, 391540, + 391552, 391559, 391567, 391575, 391584, 391592, 391601, 391610, + 391620, 391628, 391637, 391646, 391656, 391665, 391675, 391685, + 391696, 391704, 391713, 391722, 391732, 391741, 391751, 391761, + 391772, 391781, 391791, 391801, 391812, 391822, 391833, 391844, + 391856, 391864, 391873, 391882, 391892, 391901, 391911, 391921, + 391932, 391941, 391951, 391961, 391972, 391982, 391993, 392004, + 392016, 392025, 392035, 392045, 392056, 392066, 392077, 392088, + 392100, 392110, 392121, 392132, 392144, 392155, 392167, 392179, + 392192, 392195, 392199, 392203, 392208, 392212, 392217, 392222, + 392228, 392232, 392237, 392242, 392248, 392253, 392259, 392265, + 392272, 392276, 392281, 392286, 392292, 392297, 392303, 392309, + 392316, 392321, 392327, 392333, 392340, 392346, 392353, 392360, + 392368, 392372, 392377, 392382, 392388, 392393, 392399, 392405, + 392412, 392417, 392423, 392429, 392436, 392442, 392449, 392456, + 392464, 392469, 392475, 392481, 392488, 392494, 392501, 392508, + 392516, 392522, 392529, 392536, 392544, 392551, 392559, 392567, + 392576, 392580, 392585, 392590, 392596, 392601, 392607, 392613, + 392620, 392625, 392631, 392637, 392644, 392650, 392657, 392664, + 392672, 392677, 392683, 392689, 392696, 392702, 392709, 392716, + 392724, 392730, 392737, 392744, 392752, 392759, 392767, 392775, + 392784, 392789, 392795, 392801, 392808, 392814, 392821, 392828, + 392836, 392842, 392849, 392856, 392864, 392871, 392879, 392887, + 392896, 392902, 392909, 392916, 392924, 392931, 392939, 392947, + 392956, 392963, 392971, 392979, 392988, 392996, 393005, 393014, + 393024, 393028, 393033, 393038, 393044, 393049, 393055, 393061, + 393068, 393073, 393079, 393085, 393092, 393098, 393105, 393112, + 393120, 393125, 393131, 393137, 393144, 393150, 393157, 393164, + 393172, 393178, 393185, 393192, 393200, 393207, 393215, 393223, + 393232, 393237, 393243, 393249, 393256, 393262, 393269, 393276, + 393284, 393290, 393297, 393304, 393312, 393319, 393327, 393335, + 393344, 393350, 393357, 393364, 393372, 393379, 393387, 393395, + 393404, 393411, 393419, 393427, 393436, 393444, 393453, 393462, + 393472, 393477, 393483, 393489, 393496, 393502, 393509, 393516, + 393524, 393530, 393537, 393544, 393552, 393559, 393567, 393575, + 393584, 393590, 393597, 393604, 393612, 393619, 393627, 393635, + 393644, 393651, 393659, 393667, 393676, 393684, 393693, 393702, + 393712, 393718, 393725, 393732, 393740, 393747, 393755, 393763, + 393772, 393779, 393787, 393795, 393804, 393812, 393821, 393830, + 393840, 393847, 393855, 393863, 393872, 393880, 393889, 393898, + 393908, 393916, 393925, 393934, 393944, 393953, 393963, 393973, + 393984, 393988, 393993, 393998, 394004, 394009, 394015, 394021, + 394028, 394033, 394039, 394045, 394052, 394058, 394065, 394072, + 394080, 394085, 394091, 394097, 394104, 394110, 394117, 394124, + 394132, 394138, 394145, 394152, 394160, 394167, 394175, 394183, + 394192, 394197, 394203, 394209, 394216, 394222, 394229, 394236, + 394244, 394250, 394257, 394264, 394272, 394279, 394287, 394295, + 394304, 394310, 394317, 394324, 394332, 394339, 394347, 394355, + 394364, 394371, 394379, 394387, 394396, 394404, 394413, 394422, + 394432, 394437, 394443, 394449, 394456, 394462, 394469, 394476, + 394484, 394490, 394497, 394504, 394512, 394519, 394527, 394535, + 394544, 394550, 394557, 394564, 394572, 394579, 394587, 394595, + 394604, 394611, 394619, 394627, 394636, 394644, 394653, 394662, + 394672, 394678, 394685, 394692, 394700, 394707, 394715, 394723, + 394732, 394739, 394747, 394755, 394764, 394772, 394781, 394790, + 394800, 394807, 394815, 394823, 394832, 394840, 394849, 394858, + 394868, 394876, 394885, 394894, 394904, 394913, 394923, 394933, + 394944, 394949, 394955, 394961, 394968, 394974, 394981, 394988, + 394996, 395002, 395009, 395016, 395024, 395031, 395039, 395047, + 395056, 395062, 395069, 395076, 395084, 395091, 395099, 395107, + 395116, 395123, 395131, 395139, 395148, 395156, 395165, 395174, + 395184, 395190, 395197, 395204, 395212, 395219, 395227, 395235, + 395244, 395251, 395259, 395267, 395276, 395284, 395293, 395302, + 395312, 395319, 395327, 395335, 395344, 395352, 395361, 395370, + 395380, 395388, 395397, 395406, 395416, 395425, 395435, 395445, + 395456, 395462, 395469, 395476, 395484, 395491, 395499, 395507, + 395516, 395523, 395531, 395539, 395548, 395556, 395565, 395574, + 395584, 395591, 395599, 395607, 395616, 395624, 395633, 395642, + 395652, 395660, 395669, 395678, 395688, 395697, 395707, 395717, + 395728, 395735, 395743, 395751, 395760, 395768, 395777, 395786, + 395796, 395804, 395813, 395822, 395832, 395841, 395851, 395861, + 395872, 395880, 395889, 395898, 395908, 395917, 395927, 395937, + 395948, 395957, 395967, 395977, 395988, 395998, 396009, 396020, + 396032, 396036, 396041, 396046, 396052, 396057, 396063, 396069, + 396076, 396081, 396087, 396093, 396100, 396106, 396113, 396120, + 396128, 396133, 396139, 396145, 396152, 396158, 396165, 396172, + 396180, 396186, 396193, 396200, 396208, 396215, 396223, 396231, + 396240, 396245, 396251, 396257, 396264, 396270, 396277, 396284, + 396292, 396298, 396305, 396312, 396320, 396327, 396335, 396343, + 396352, 396358, 396365, 396372, 396380, 396387, 396395, 396403, + 396412, 396419, 396427, 396435, 396444, 396452, 396461, 396470, + 396480, 396485, 396491, 396497, 396504, 396510, 396517, 396524, + 396532, 396538, 396545, 396552, 396560, 396567, 396575, 396583, + 396592, 396598, 396605, 396612, 396620, 396627, 396635, 396643, + 396652, 396659, 396667, 396675, 396684, 396692, 396701, 396710, + 396720, 396726, 396733, 396740, 396748, 396755, 396763, 396771, + 396780, 396787, 396795, 396803, 396812, 396820, 396829, 396838, + 396848, 396855, 396863, 396871, 396880, 396888, 396897, 396906, + 396916, 396924, 396933, 396942, 396952, 396961, 396971, 396981, + 396992, 396997, 397003, 397009, 397016, 397022, 397029, 397036, + 397044, 397050, 397057, 397064, 397072, 397079, 397087, 397095, + 397104, 397110, 397117, 397124, 397132, 397139, 397147, 397155, + 397164, 397171, 397179, 397187, 397196, 397204, 397213, 397222, + 397232, 397238, 397245, 397252, 397260, 397267, 397275, 397283, + 397292, 397299, 397307, 397315, 397324, 397332, 397341, 397350, + 397360, 397367, 397375, 397383, 397392, 397400, 397409, 397418, + 397428, 397436, 397445, 397454, 397464, 397473, 397483, 397493, + 397504, 397510, 397517, 397524, 397532, 397539, 397547, 397555, + 397564, 397571, 397579, 397587, 397596, 397604, 397613, 397622, + 397632, 397639, 397647, 397655, 397664, 397672, 397681, 397690, + 397700, 397708, 397717, 397726, 397736, 397745, 397755, 397765, + 397776, 397783, 397791, 397799, 397808, 397816, 397825, 397834, + 397844, 397852, 397861, 397870, 397880, 397889, 397899, 397909, + 397920, 397928, 397937, 397946, 397956, 397965, 397975, 397985, + 397996, 398005, 398015, 398025, 398036, 398046, 398057, 398068, + 398080, 398085, 398091, 398097, 398104, 398110, 398117, 398124, + 398132, 398138, 398145, 398152, 398160, 398167, 398175, 398183, + 398192, 398198, 398205, 398212, 398220, 398227, 398235, 398243, + 398252, 398259, 398267, 398275, 398284, 398292, 398301, 398310, + 398320, 398326, 398333, 398340, 398348, 398355, 398363, 398371, + 398380, 398387, 398395, 398403, 398412, 398420, 398429, 398438, + 398448, 398455, 398463, 398471, 398480, 398488, 398497, 398506, + 398516, 398524, 398533, 398542, 398552, 398561, 398571, 398581, + 398592, 398598, 398605, 398612, 398620, 398627, 398635, 398643, + 398652, 398659, 398667, 398675, 398684, 398692, 398701, 398710, + 398720, 398727, 398735, 398743, 398752, 398760, 398769, 398778, + 398788, 398796, 398805, 398814, 398824, 398833, 398843, 398853, + 398864, 398871, 398879, 398887, 398896, 398904, 398913, 398922, + 398932, 398940, 398949, 398958, 398968, 398977, 398987, 398997, + 399008, 399016, 399025, 399034, 399044, 399053, 399063, 399073, + 399084, 399093, 399103, 399113, 399124, 399134, 399145, 399156, + 399168, 399174, 399181, 399188, 399196, 399203, 399211, 399219, + 399228, 399235, 399243, 399251, 399260, 399268, 399277, 399286, + 399296, 399303, 399311, 399319, 399328, 399336, 399345, 399354, + 399364, 399372, 399381, 399390, 399400, 399409, 399419, 399429, + 399440, 399447, 399455, 399463, 399472, 399480, 399489, 399498, + 399508, 399516, 399525, 399534, 399544, 399553, 399563, 399573, + 399584, 399592, 399601, 399610, 399620, 399629, 399639, 399649, + 399660, 399669, 399679, 399689, 399700, 399710, 399721, 399732, + 399744, 399751, 399759, 399767, 399776, 399784, 399793, 399802, + 399812, 399820, 399829, 399838, 399848, 399857, 399867, 399877, + 399888, 399896, 399905, 399914, 399924, 399933, 399943, 399953, + 399964, 399973, 399983, 399993, 400004, 400014, 400025, 400036, + 400048, 400056, 400065, 400074, 400084, 400093, 400103, 400113, + 400124, 400133, 400143, 400153, 400164, 400174, 400185, 400196, + 400208, 400217, 400227, 400237, 400248, 400258, 400269, 400280, + 400292, 400302, 400313, 400324, 400336, 400347, 400359, 400371, + 400384, 400388, 400393, 400398, 400404, 400409, 400415, 400421, + 400428, 400433, 400439, 400445, 400452, 400458, 400465, 400472, + 400480, 400485, 400491, 400497, 400504, 400510, 400517, 400524, + 400532, 400538, 400545, 400552, 400560, 400567, 400575, 400583, + 400592, 400597, 400603, 400609, 400616, 400622, 400629, 400636, + 400644, 400650, 400657, 400664, 400672, 400679, 400687, 400695, + 400704, 400710, 400717, 400724, 400732, 400739, 400747, 400755, + 400764, 400771, 400779, 400787, 400796, 400804, 400813, 400822, + 400832, 400837, 400843, 400849, 400856, 400862, 400869, 400876, + 400884, 400890, 400897, 400904, 400912, 400919, 400927, 400935, + 400944, 400950, 400957, 400964, 400972, 400979, 400987, 400995, + 401004, 401011, 401019, 401027, 401036, 401044, 401053, 401062, + 401072, 401078, 401085, 401092, 401100, 401107, 401115, 401123, + 401132, 401139, 401147, 401155, 401164, 401172, 401181, 401190, + 401200, 401207, 401215, 401223, 401232, 401240, 401249, 401258, + 401268, 401276, 401285, 401294, 401304, 401313, 401323, 401333, + 401344, 401349, 401355, 401361, 401368, 401374, 401381, 401388, + 401396, 401402, 401409, 401416, 401424, 401431, 401439, 401447, + 401456, 401462, 401469, 401476, 401484, 401491, 401499, 401507, + 401516, 401523, 401531, 401539, 401548, 401556, 401565, 401574, + 401584, 401590, 401597, 401604, 401612, 401619, 401627, 401635, + 401644, 401651, 401659, 401667, 401676, 401684, 401693, 401702, + 401712, 401719, 401727, 401735, 401744, 401752, 401761, 401770, + 401780, 401788, 401797, 401806, 401816, 401825, 401835, 401845, + 401856, 401862, 401869, 401876, 401884, 401891, 401899, 401907, + 401916, 401923, 401931, 401939, 401948, 401956, 401965, 401974, + 401984, 401991, 401999, 402007, 402016, 402024, 402033, 402042, + 402052, 402060, 402069, 402078, 402088, 402097, 402107, 402117, + 402128, 402135, 402143, 402151, 402160, 402168, 402177, 402186, + 402196, 402204, 402213, 402222, 402232, 402241, 402251, 402261, + 402272, 402280, 402289, 402298, 402308, 402317, 402327, 402337, + 402348, 402357, 402367, 402377, 402388, 402398, 402409, 402420, + 402432, 402437, 402443, 402449, 402456, 402462, 402469, 402476, + 402484, 402490, 402497, 402504, 402512, 402519, 402527, 402535, + 402544, 402550, 402557, 402564, 402572, 402579, 402587, 402595, + 402604, 402611, 402619, 402627, 402636, 402644, 402653, 402662, + 402672, 402678, 402685, 402692, 402700, 402707, 402715, 402723, + 402732, 402739, 402747, 402755, 402764, 402772, 402781, 402790, + 402800, 402807, 402815, 402823, 402832, 402840, 402849, 402858, + 402868, 402876, 402885, 402894, 402904, 402913, 402923, 402933, + 402944, 402950, 402957, 402964, 402972, 402979, 402987, 402995, + 403004, 403011, 403019, 403027, 403036, 403044, 403053, 403062, + 403072, 403079, 403087, 403095, 403104, 403112, 403121, 403130, + 403140, 403148, 403157, 403166, 403176, 403185, 403195, 403205, + 403216, 403223, 403231, 403239, 403248, 403256, 403265, 403274, + 403284, 403292, 403301, 403310, 403320, 403329, 403339, 403349, + 403360, 403368, 403377, 403386, 403396, 403405, 403415, 403425, + 403436, 403445, 403455, 403465, 403476, 403486, 403497, 403508, + 403520, 403526, 403533, 403540, 403548, 403555, 403563, 403571, + 403580, 403587, 403595, 403603, 403612, 403620, 403629, 403638, + 403648, 403655, 403663, 403671, 403680, 403688, 403697, 403706, + 403716, 403724, 403733, 403742, 403752, 403761, 403771, 403781, + 403792, 403799, 403807, 403815, 403824, 403832, 403841, 403850, + 403860, 403868, 403877, 403886, 403896, 403905, 403915, 403925, + 403936, 403944, 403953, 403962, 403972, 403981, 403991, 404001, + 404012, 404021, 404031, 404041, 404052, 404062, 404073, 404084, + 404096, 404103, 404111, 404119, 404128, 404136, 404145, 404154, + 404164, 404172, 404181, 404190, 404200, 404209, 404219, 404229, + 404240, 404248, 404257, 404266, 404276, 404285, 404295, 404305, + 404316, 404325, 404335, 404345, 404356, 404366, 404377, 404388, + 404400, 404408, 404417, 404426, 404436, 404445, 404455, 404465, + 404476, 404485, 404495, 404505, 404516, 404526, 404537, 404548, + 404560, 404569, 404579, 404589, 404600, 404610, 404621, 404632, + 404644, 404654, 404665, 404676, 404688, 404699, 404711, 404723, + 404736, 404741, 404747, 404753, 404760, 404766, 404773, 404780, + 404788, 404794, 404801, 404808, 404816, 404823, 404831, 404839, + 404848, 404854, 404861, 404868, 404876, 404883, 404891, 404899, + 404908, 404915, 404923, 404931, 404940, 404948, 404957, 404966, + 404976, 404982, 404989, 404996, 405004, 405011, 405019, 405027, + 405036, 405043, 405051, 405059, 405068, 405076, 405085, 405094, + 405104, 405111, 405119, 405127, 405136, 405144, 405153, 405162, + 405172, 405180, 405189, 405198, 405208, 405217, 405227, 405237, + 405248, 405254, 405261, 405268, 405276, 405283, 405291, 405299, + 405308, 405315, 405323, 405331, 405340, 405348, 405357, 405366, + 405376, 405383, 405391, 405399, 405408, 405416, 405425, 405434, + 405444, 405452, 405461, 405470, 405480, 405489, 405499, 405509, + 405520, 405527, 405535, 405543, 405552, 405560, 405569, 405578, + 405588, 405596, 405605, 405614, 405624, 405633, 405643, 405653, + 405664, 405672, 405681, 405690, 405700, 405709, 405719, 405729, + 405740, 405749, 405759, 405769, 405780, 405790, 405801, 405812, + 405824, 405830, 405837, 405844, 405852, 405859, 405867, 405875, + 405884, 405891, 405899, 405907, 405916, 405924, 405933, 405942, + 405952, 405959, 405967, 405975, 405984, 405992, 406001, 406010, + 406020, 406028, 406037, 406046, 406056, 406065, 406075, 406085, + 406096, 406103, 406111, 406119, 406128, 406136, 406145, 406154, + 406164, 406172, 406181, 406190, 406200, 406209, 406219, 406229, + 406240, 406248, 406257, 406266, 406276, 406285, 406295, 406305, + 406316, 406325, 406335, 406345, 406356, 406366, 406377, 406388, + 406400, 406407, 406415, 406423, 406432, 406440, 406449, 406458, + 406468, 406476, 406485, 406494, 406504, 406513, 406523, 406533, + 406544, 406552, 406561, 406570, 406580, 406589, 406599, 406609, + 406620, 406629, 406639, 406649, 406660, 406670, 406681, 406692, + 406704, 406712, 406721, 406730, 406740, 406749, 406759, 406769, + 406780, 406789, 406799, 406809, 406820, 406830, 406841, 406852, + 406864, 406873, 406883, 406893, 406904, 406914, 406925, 406936, + 406948, 406958, 406969, 406980, 406992, 407003, 407015, 407027, + 407040, 407046, 407053, 407060, 407068, 407075, 407083, 407091, + 407100, 407107, 407115, 407123, 407132, 407140, 407149, 407158, + 407168, 407175, 407183, 407191, 407200, 407208, 407217, 407226, + 407236, 407244, 407253, 407262, 407272, 407281, 407291, 407301, + 407312, 407319, 407327, 407335, 407344, 407352, 407361, 407370, + 407380, 407388, 407397, 407406, 407416, 407425, 407435, 407445, + 407456, 407464, 407473, 407482, 407492, 407501, 407511, 407521, + 407532, 407541, 407551, 407561, 407572, 407582, 407593, 407604, + 407616, 407623, 407631, 407639, 407648, 407656, 407665, 407674, + 407684, 407692, 407701, 407710, 407720, 407729, 407739, 407749, + 407760, 407768, 407777, 407786, 407796, 407805, 407815, 407825, + 407836, 407845, 407855, 407865, 407876, 407886, 407897, 407908, + 407920, 407928, 407937, 407946, 407956, 407965, 407975, 407985, + 407996, 408005, 408015, 408025, 408036, 408046, 408057, 408068, + 408080, 408089, 408099, 408109, 408120, 408130, 408141, 408152, + 408164, 408174, 408185, 408196, 408208, 408219, 408231, 408243, + 408256, 408263, 408271, 408279, 408288, 408296, 408305, 408314, + 408324, 408332, 408341, 408350, 408360, 408369, 408379, 408389, + 408400, 408408, 408417, 408426, 408436, 408445, 408455, 408465, + 408476, 408485, 408495, 408505, 408516, 408526, 408537, 408548, + 408560, 408568, 408577, 408586, 408596, 408605, 408615, 408625, + 408636, 408645, 408655, 408665, 408676, 408686, 408697, 408708, + 408720, 408729, 408739, 408749, 408760, 408770, 408781, 408792, + 408804, 408814, 408825, 408836, 408848, 408859, 408871, 408883, + 408896, 408904, 408913, 408922, 408932, 408941, 408951, 408961, + 408972, 408981, 408991, 409001, 409012, 409022, 409033, 409044, + 409056, 409065, 409075, 409085, 409096, 409106, 409117, 409128, + 409140, 409150, 409161, 409172, 409184, 409195, 409207, 409219, + 409232, 409241, 409251, 409261, 409272, 409282, 409293, 409304, + 409316, 409326, 409337, 409348, 409360, 409371, 409383, 409395, + 409408, 409418, 409429, 409440, 409452, 409463, 409475, 409487, + 409500, 409511, 409523, 409535, 409548, 409560, 409573, 409586, + 409600, 409603, 409607, 409611, 409616, 409620, 409625, 409630, + 409636, 409640, 409645, 409650, 409656, 409661, 409667, 409673, + 409680, 409684, 409689, 409694, 409700, 409705, 409711, 409717, + 409724, 409729, 409735, 409741, 409748, 409754, 409761, 409768, + 409776, 409780, 409785, 409790, 409796, 409801, 409807, 409813, + 409820, 409825, 409831, 409837, 409844, 409850, 409857, 409864, + 409872, 409877, 409883, 409889, 409896, 409902, 409909, 409916, + 409924, 409930, 409937, 409944, 409952, 409959, 409967, 409975, + 409984, 409988, 409993, 409998, 410004, 410009, 410015, 410021, + 410028, 410033, 410039, 410045, 410052, 410058, 410065, 410072, + 410080, 410085, 410091, 410097, 410104, 410110, 410117, 410124, + 410132, 410138, 410145, 410152, 410160, 410167, 410175, 410183, + 410192, 410197, 410203, 410209, 410216, 410222, 410229, 410236, + 410244, 410250, 410257, 410264, 410272, 410279, 410287, 410295, + 410304, 410310, 410317, 410324, 410332, 410339, 410347, 410355, + 410364, 410371, 410379, 410387, 410396, 410404, 410413, 410422, + 410432, 410436, 410441, 410446, 410452, 410457, 410463, 410469, + 410476, 410481, 410487, 410493, 410500, 410506, 410513, 410520, + 410528, 410533, 410539, 410545, 410552, 410558, 410565, 410572, + 410580, 410586, 410593, 410600, 410608, 410615, 410623, 410631, + 410640, 410645, 410651, 410657, 410664, 410670, 410677, 410684, + 410692, 410698, 410705, 410712, 410720, 410727, 410735, 410743, + 410752, 410758, 410765, 410772, 410780, 410787, 410795, 410803, + 410812, 410819, 410827, 410835, 410844, 410852, 410861, 410870, + 410880, 410885, 410891, 410897, 410904, 410910, 410917, 410924, + 410932, 410938, 410945, 410952, 410960, 410967, 410975, 410983, + 410992, 410998, 411005, 411012, 411020, 411027, 411035, 411043, + 411052, 411059, 411067, 411075, 411084, 411092, 411101, 411110, + 411120, 411126, 411133, 411140, 411148, 411155, 411163, 411171, + 411180, 411187, 411195, 411203, 411212, 411220, 411229, 411238, + 411248, 411255, 411263, 411271, 411280, 411288, 411297, 411306, + 411316, 411324, 411333, 411342, 411352, 411361, 411371, 411381, + 411392, 411396, 411401, 411406, 411412, 411417, 411423, 411429, + 411436, 411441, 411447, 411453, 411460, 411466, 411473, 411480, + 411488, 411493, 411499, 411505, 411512, 411518, 411525, 411532, + 411540, 411546, 411553, 411560, 411568, 411575, 411583, 411591, + 411600, 411605, 411611, 411617, 411624, 411630, 411637, 411644, + 411652, 411658, 411665, 411672, 411680, 411687, 411695, 411703, + 411712, 411718, 411725, 411732, 411740, 411747, 411755, 411763, + 411772, 411779, 411787, 411795, 411804, 411812, 411821, 411830, + 411840, 411845, 411851, 411857, 411864, 411870, 411877, 411884, + 411892, 411898, 411905, 411912, 411920, 411927, 411935, 411943, + 411952, 411958, 411965, 411972, 411980, 411987, 411995, 412003, + 412012, 412019, 412027, 412035, 412044, 412052, 412061, 412070, + 412080, 412086, 412093, 412100, 412108, 412115, 412123, 412131, + 412140, 412147, 412155, 412163, 412172, 412180, 412189, 412198, + 412208, 412215, 412223, 412231, 412240, 412248, 412257, 412266, + 412276, 412284, 412293, 412302, 412312, 412321, 412331, 412341, + 412352, 412357, 412363, 412369, 412376, 412382, 412389, 412396, + 412404, 412410, 412417, 412424, 412432, 412439, 412447, 412455, + 412464, 412470, 412477, 412484, 412492, 412499, 412507, 412515, + 412524, 412531, 412539, 412547, 412556, 412564, 412573, 412582, + 412592, 412598, 412605, 412612, 412620, 412627, 412635, 412643, + 412652, 412659, 412667, 412675, 412684, 412692, 412701, 412710, + 412720, 412727, 412735, 412743, 412752, 412760, 412769, 412778, + 412788, 412796, 412805, 412814, 412824, 412833, 412843, 412853, + 412864, 412870, 412877, 412884, 412892, 412899, 412907, 412915, + 412924, 412931, 412939, 412947, 412956, 412964, 412973, 412982, + 412992, 412999, 413007, 413015, 413024, 413032, 413041, 413050, + 413060, 413068, 413077, 413086, 413096, 413105, 413115, 413125, + 413136, 413143, 413151, 413159, 413168, 413176, 413185, 413194, + 413204, 413212, 413221, 413230, 413240, 413249, 413259, 413269, + 413280, 413288, 413297, 413306, 413316, 413325, 413335, 413345, + 413356, 413365, 413375, 413385, 413396, 413406, 413417, 413428, + 413440, 413444, 413449, 413454, 413460, 413465, 413471, 413477, + 413484, 413489, 413495, 413501, 413508, 413514, 413521, 413528, + 413536, 413541, 413547, 413553, 413560, 413566, 413573, 413580, + 413588, 413594, 413601, 413608, 413616, 413623, 413631, 413639, + 413648, 413653, 413659, 413665, 413672, 413678, 413685, 413692, + 413700, 413706, 413713, 413720, 413728, 413735, 413743, 413751, + 413760, 413766, 413773, 413780, 413788, 413795, 413803, 413811, + 413820, 413827, 413835, 413843, 413852, 413860, 413869, 413878, + 413888, 413893, 413899, 413905, 413912, 413918, 413925, 413932, + 413940, 413946, 413953, 413960, 413968, 413975, 413983, 413991, + 414000, 414006, 414013, 414020, 414028, 414035, 414043, 414051, + 414060, 414067, 414075, 414083, 414092, 414100, 414109, 414118, + 414128, 414134, 414141, 414148, 414156, 414163, 414171, 414179, + 414188, 414195, 414203, 414211, 414220, 414228, 414237, 414246, + 414256, 414263, 414271, 414279, 414288, 414296, 414305, 414314, + 414324, 414332, 414341, 414350, 414360, 414369, 414379, 414389, + 414400, 414405, 414411, 414417, 414424, 414430, 414437, 414444, + 414452, 414458, 414465, 414472, 414480, 414487, 414495, 414503, + 414512, 414518, 414525, 414532, 414540, 414547, 414555, 414563, + 414572, 414579, 414587, 414595, 414604, 414612, 414621, 414630, + 414640, 414646, 414653, 414660, 414668, 414675, 414683, 414691, + 414700, 414707, 414715, 414723, 414732, 414740, 414749, 414758, + 414768, 414775, 414783, 414791, 414800, 414808, 414817, 414826, + 414836, 414844, 414853, 414862, 414872, 414881, 414891, 414901, + 414912, 414918, 414925, 414932, 414940, 414947, 414955, 414963, + 414972, 414979, 414987, 414995, 415004, 415012, 415021, 415030, + 415040, 415047, 415055, 415063, 415072, 415080, 415089, 415098, + 415108, 415116, 415125, 415134, 415144, 415153, 415163, 415173, + 415184, 415191, 415199, 415207, 415216, 415224, 415233, 415242, + 415252, 415260, 415269, 415278, 415288, 415297, 415307, 415317, + 415328, 415336, 415345, 415354, 415364, 415373, 415383, 415393, + 415404, 415413, 415423, 415433, 415444, 415454, 415465, 415476, + 415488, 415493, 415499, 415505, 415512, 415518, 415525, 415532, + 415540, 415546, 415553, 415560, 415568, 415575, 415583, 415591, + 415600, 415606, 415613, 415620, 415628, 415635, 415643, 415651, + 415660, 415667, 415675, 415683, 415692, 415700, 415709, 415718, + 415728, 415734, 415741, 415748, 415756, 415763, 415771, 415779, + 415788, 415795, 415803, 415811, 415820, 415828, 415837, 415846, + 415856, 415863, 415871, 415879, 415888, 415896, 415905, 415914, + 415924, 415932, 415941, 415950, 415960, 415969, 415979, 415989, + 416000, 416006, 416013, 416020, 416028, 416035, 416043, 416051, + 416060, 416067, 416075, 416083, 416092, 416100, 416109, 416118, + 416128, 416135, 416143, 416151, 416160, 416168, 416177, 416186, + 416196, 416204, 416213, 416222, 416232, 416241, 416251, 416261, + 416272, 416279, 416287, 416295, 416304, 416312, 416321, 416330, + 416340, 416348, 416357, 416366, 416376, 416385, 416395, 416405, + 416416, 416424, 416433, 416442, 416452, 416461, 416471, 416481, + 416492, 416501, 416511, 416521, 416532, 416542, 416553, 416564, + 416576, 416582, 416589, 416596, 416604, 416611, 416619, 416627, + 416636, 416643, 416651, 416659, 416668, 416676, 416685, 416694, + 416704, 416711, 416719, 416727, 416736, 416744, 416753, 416762, + 416772, 416780, 416789, 416798, 416808, 416817, 416827, 416837, + 416848, 416855, 416863, 416871, 416880, 416888, 416897, 416906, + 416916, 416924, 416933, 416942, 416952, 416961, 416971, 416981, + 416992, 417000, 417009, 417018, 417028, 417037, 417047, 417057, + 417068, 417077, 417087, 417097, 417108, 417118, 417129, 417140, + 417152, 417159, 417167, 417175, 417184, 417192, 417201, 417210, + 417220, 417228, 417237, 417246, 417256, 417265, 417275, 417285, + 417296, 417304, 417313, 417322, 417332, 417341, 417351, 417361, + 417372, 417381, 417391, 417401, 417412, 417422, 417433, 417444, + 417456, 417464, 417473, 417482, 417492, 417501, 417511, 417521, + 417532, 417541, 417551, 417561, 417572, 417582, 417593, 417604, + 417616, 417625, 417635, 417645, 417656, 417666, 417677, 417688, + 417700, 417710, 417721, 417732, 417744, 417755, 417767, 417779, + 417792, 417796, 417801, 417806, 417812, 417817, 417823, 417829, + 417836, 417841, 417847, 417853, 417860, 417866, 417873, 417880, + 417888, 417893, 417899, 417905, 417912, 417918, 417925, 417932, + 417940, 417946, 417953, 417960, 417968, 417975, 417983, 417991, + 418000, 418005, 418011, 418017, 418024, 418030, 418037, 418044, + 418052, 418058, 418065, 418072, 418080, 418087, 418095, 418103, + 418112, 418118, 418125, 418132, 418140, 418147, 418155, 418163, + 418172, 418179, 418187, 418195, 418204, 418212, 418221, 418230, + 418240, 418245, 418251, 418257, 418264, 418270, 418277, 418284, + 418292, 418298, 418305, 418312, 418320, 418327, 418335, 418343, + 418352, 418358, 418365, 418372, 418380, 418387, 418395, 418403, + 418412, 418419, 418427, 418435, 418444, 418452, 418461, 418470, + 418480, 418486, 418493, 418500, 418508, 418515, 418523, 418531, + 418540, 418547, 418555, 418563, 418572, 418580, 418589, 418598, + 418608, 418615, 418623, 418631, 418640, 418648, 418657, 418666, + 418676, 418684, 418693, 418702, 418712, 418721, 418731, 418741, + 418752, 418757, 418763, 418769, 418776, 418782, 418789, 418796, + 418804, 418810, 418817, 418824, 418832, 418839, 418847, 418855, + 418864, 418870, 418877, 418884, 418892, 418899, 418907, 418915, + 418924, 418931, 418939, 418947, 418956, 418964, 418973, 418982, + 418992, 418998, 419005, 419012, 419020, 419027, 419035, 419043, + 419052, 419059, 419067, 419075, 419084, 419092, 419101, 419110, + 419120, 419127, 419135, 419143, 419152, 419160, 419169, 419178, + 419188, 419196, 419205, 419214, 419224, 419233, 419243, 419253, + 419264, 419270, 419277, 419284, 419292, 419299, 419307, 419315, + 419324, 419331, 419339, 419347, 419356, 419364, 419373, 419382, + 419392, 419399, 419407, 419415, 419424, 419432, 419441, 419450, + 419460, 419468, 419477, 419486, 419496, 419505, 419515, 419525, + 419536, 419543, 419551, 419559, 419568, 419576, 419585, 419594, + 419604, 419612, 419621, 419630, 419640, 419649, 419659, 419669, + 419680, 419688, 419697, 419706, 419716, 419725, 419735, 419745, + 419756, 419765, 419775, 419785, 419796, 419806, 419817, 419828, + 419840, 419845, 419851, 419857, 419864, 419870, 419877, 419884, + 419892, 419898, 419905, 419912, 419920, 419927, 419935, 419943, + 419952, 419958, 419965, 419972, 419980, 419987, 419995, 420003, + 420012, 420019, 420027, 420035, 420044, 420052, 420061, 420070, + 420080, 420086, 420093, 420100, 420108, 420115, 420123, 420131, + 420140, 420147, 420155, 420163, 420172, 420180, 420189, 420198, + 420208, 420215, 420223, 420231, 420240, 420248, 420257, 420266, + 420276, 420284, 420293, 420302, 420312, 420321, 420331, 420341, + 420352, 420358, 420365, 420372, 420380, 420387, 420395, 420403, + 420412, 420419, 420427, 420435, 420444, 420452, 420461, 420470, + 420480, 420487, 420495, 420503, 420512, 420520, 420529, 420538, + 420548, 420556, 420565, 420574, 420584, 420593, 420603, 420613, + 420624, 420631, 420639, 420647, 420656, 420664, 420673, 420682, + 420692, 420700, 420709, 420718, 420728, 420737, 420747, 420757, + 420768, 420776, 420785, 420794, 420804, 420813, 420823, 420833, + 420844, 420853, 420863, 420873, 420884, 420894, 420905, 420916, + 420928, 420934, 420941, 420948, 420956, 420963, 420971, 420979, + 420988, 420995, 421003, 421011, 421020, 421028, 421037, 421046, + 421056, 421063, 421071, 421079, 421088, 421096, 421105, 421114, + 421124, 421132, 421141, 421150, 421160, 421169, 421179, 421189, + 421200, 421207, 421215, 421223, 421232, 421240, 421249, 421258, + 421268, 421276, 421285, 421294, 421304, 421313, 421323, 421333, + 421344, 421352, 421361, 421370, 421380, 421389, 421399, 421409, + 421420, 421429, 421439, 421449, 421460, 421470, 421481, 421492, + 421504, 421511, 421519, 421527, 421536, 421544, 421553, 421562, + 421572, 421580, 421589, 421598, 421608, 421617, 421627, 421637, + 421648, 421656, 421665, 421674, 421684, 421693, 421703, 421713, + 421724, 421733, 421743, 421753, 421764, 421774, 421785, 421796, + 421808, 421816, 421825, 421834, 421844, 421853, 421863, 421873, + 421884, 421893, 421903, 421913, 421924, 421934, 421945, 421956, + 421968, 421977, 421987, 421997, 422008, 422018, 422029, 422040, + 422052, 422062, 422073, 422084, 422096, 422107, 422119, 422131, + 422144, 422149, 422155, 422161, 422168, 422174, 422181, 422188, + 422196, 422202, 422209, 422216, 422224, 422231, 422239, 422247, + 422256, 422262, 422269, 422276, 422284, 422291, 422299, 422307, + 422316, 422323, 422331, 422339, 422348, 422356, 422365, 422374, + 422384, 422390, 422397, 422404, 422412, 422419, 422427, 422435, + 422444, 422451, 422459, 422467, 422476, 422484, 422493, 422502, + 422512, 422519, 422527, 422535, 422544, 422552, 422561, 422570, + 422580, 422588, 422597, 422606, 422616, 422625, 422635, 422645, + 422656, 422662, 422669, 422676, 422684, 422691, 422699, 422707, + 422716, 422723, 422731, 422739, 422748, 422756, 422765, 422774, + 422784, 422791, 422799, 422807, 422816, 422824, 422833, 422842, + 422852, 422860, 422869, 422878, 422888, 422897, 422907, 422917, + 422928, 422935, 422943, 422951, 422960, 422968, 422977, 422986, + 422996, 423004, 423013, 423022, 423032, 423041, 423051, 423061, + 423072, 423080, 423089, 423098, 423108, 423117, 423127, 423137, + 423148, 423157, 423167, 423177, 423188, 423198, 423209, 423220, + 423232, 423238, 423245, 423252, 423260, 423267, 423275, 423283, + 423292, 423299, 423307, 423315, 423324, 423332, 423341, 423350, + 423360, 423367, 423375, 423383, 423392, 423400, 423409, 423418, + 423428, 423436, 423445, 423454, 423464, 423473, 423483, 423493, + 423504, 423511, 423519, 423527, 423536, 423544, 423553, 423562, + 423572, 423580, 423589, 423598, 423608, 423617, 423627, 423637, + 423648, 423656, 423665, 423674, 423684, 423693, 423703, 423713, + 423724, 423733, 423743, 423753, 423764, 423774, 423785, 423796, + 423808, 423815, 423823, 423831, 423840, 423848, 423857, 423866, + 423876, 423884, 423893, 423902, 423912, 423921, 423931, 423941, + 423952, 423960, 423969, 423978, 423988, 423997, 424007, 424017, + 424028, 424037, 424047, 424057, 424068, 424078, 424089, 424100, + 424112, 424120, 424129, 424138, 424148, 424157, 424167, 424177, + 424188, 424197, 424207, 424217, 424228, 424238, 424249, 424260, + 424272, 424281, 424291, 424301, 424312, 424322, 424333, 424344, + 424356, 424366, 424377, 424388, 424400, 424411, 424423, 424435, + 424448, 424454, 424461, 424468, 424476, 424483, 424491, 424499, + 424508, 424515, 424523, 424531, 424540, 424548, 424557, 424566, + 424576, 424583, 424591, 424599, 424608, 424616, 424625, 424634, + 424644, 424652, 424661, 424670, 424680, 424689, 424699, 424709, + 424720, 424727, 424735, 424743, 424752, 424760, 424769, 424778, + 424788, 424796, 424805, 424814, 424824, 424833, 424843, 424853, + 424864, 424872, 424881, 424890, 424900, 424909, 424919, 424929, + 424940, 424949, 424959, 424969, 424980, 424990, 425001, 425012, + 425024, 425031, 425039, 425047, 425056, 425064, 425073, 425082, + 425092, 425100, 425109, 425118, 425128, 425137, 425147, 425157, + 425168, 425176, 425185, 425194, 425204, 425213, 425223, 425233, + 425244, 425253, 425263, 425273, 425284, 425294, 425305, 425316, + 425328, 425336, 425345, 425354, 425364, 425373, 425383, 425393, + 425404, 425413, 425423, 425433, 425444, 425454, 425465, 425476, + 425488, 425497, 425507, 425517, 425528, 425538, 425549, 425560, + 425572, 425582, 425593, 425604, 425616, 425627, 425639, 425651, + 425664, 425671, 425679, 425687, 425696, 425704, 425713, 425722, + 425732, 425740, 425749, 425758, 425768, 425777, 425787, 425797, + 425808, 425816, 425825, 425834, 425844, 425853, 425863, 425873, + 425884, 425893, 425903, 425913, 425924, 425934, 425945, 425956, + 425968, 425976, 425985, 425994, 426004, 426013, 426023, 426033, + 426044, 426053, 426063, 426073, 426084, 426094, 426105, 426116, + 426128, 426137, 426147, 426157, 426168, 426178, 426189, 426200, + 426212, 426222, 426233, 426244, 426256, 426267, 426279, 426291, + 426304, 426312, 426321, 426330, 426340, 426349, 426359, 426369, + 426380, 426389, 426399, 426409, 426420, 426430, 426441, 426452, + 426464, 426473, 426483, 426493, 426504, 426514, 426525, 426536, + 426548, 426558, 426569, 426580, 426592, 426603, 426615, 426627, + 426640, 426649, 426659, 426669, 426680, 426690, 426701, 426712, + 426724, 426734, 426745, 426756, 426768, 426779, 426791, 426803, + 426816, 426826, 426837, 426848, 426860, 426871, 426883, 426895, + 426908, 426919, 426931, 426943, 426956, 426968, 426981, 426994, + 427008, 427012, 427017, 427022, 427028, 427033, 427039, 427045, + 427052, 427057, 427063, 427069, 427076, 427082, 427089, 427096, + 427104, 427109, 427115, 427121, 427128, 427134, 427141, 427148, + 427156, 427162, 427169, 427176, 427184, 427191, 427199, 427207, + 427216, 427221, 427227, 427233, 427240, 427246, 427253, 427260, + 427268, 427274, 427281, 427288, 427296, 427303, 427311, 427319, + 427328, 427334, 427341, 427348, 427356, 427363, 427371, 427379, + 427388, 427395, 427403, 427411, 427420, 427428, 427437, 427446, + 427456, 427461, 427467, 427473, 427480, 427486, 427493, 427500, + 427508, 427514, 427521, 427528, 427536, 427543, 427551, 427559, + 427568, 427574, 427581, 427588, 427596, 427603, 427611, 427619, + 427628, 427635, 427643, 427651, 427660, 427668, 427677, 427686, + 427696, 427702, 427709, 427716, 427724, 427731, 427739, 427747, + 427756, 427763, 427771, 427779, 427788, 427796, 427805, 427814, + 427824, 427831, 427839, 427847, 427856, 427864, 427873, 427882, + 427892, 427900, 427909, 427918, 427928, 427937, 427947, 427957, + 427968, 427973, 427979, 427985, 427992, 427998, 428005, 428012, + 428020, 428026, 428033, 428040, 428048, 428055, 428063, 428071, + 428080, 428086, 428093, 428100, 428108, 428115, 428123, 428131, + 428140, 428147, 428155, 428163, 428172, 428180, 428189, 428198, + 428208, 428214, 428221, 428228, 428236, 428243, 428251, 428259, + 428268, 428275, 428283, 428291, 428300, 428308, 428317, 428326, + 428336, 428343, 428351, 428359, 428368, 428376, 428385, 428394, + 428404, 428412, 428421, 428430, 428440, 428449, 428459, 428469, + 428480, 428486, 428493, 428500, 428508, 428515, 428523, 428531, + 428540, 428547, 428555, 428563, 428572, 428580, 428589, 428598, + 428608, 428615, 428623, 428631, 428640, 428648, 428657, 428666, + 428676, 428684, 428693, 428702, 428712, 428721, 428731, 428741, + 428752, 428759, 428767, 428775, 428784, 428792, 428801, 428810, + 428820, 428828, 428837, 428846, 428856, 428865, 428875, 428885, + 428896, 428904, 428913, 428922, 428932, 428941, 428951, 428961, + 428972, 428981, 428991, 429001, 429012, 429022, 429033, 429044, + 429056, 429061, 429067, 429073, 429080, 429086, 429093, 429100, + 429108, 429114, 429121, 429128, 429136, 429143, 429151, 429159, + 429168, 429174, 429181, 429188, 429196, 429203, 429211, 429219, + 429228, 429235, 429243, 429251, 429260, 429268, 429277, 429286, + 429296, 429302, 429309, 429316, 429324, 429331, 429339, 429347, + 429356, 429363, 429371, 429379, 429388, 429396, 429405, 429414, + 429424, 429431, 429439, 429447, 429456, 429464, 429473, 429482, + 429492, 429500, 429509, 429518, 429528, 429537, 429547, 429557, + 429568, 429574, 429581, 429588, 429596, 429603, 429611, 429619, + 429628, 429635, 429643, 429651, 429660, 429668, 429677, 429686, + 429696, 429703, 429711, 429719, 429728, 429736, 429745, 429754, + 429764, 429772, 429781, 429790, 429800, 429809, 429819, 429829, + 429840, 429847, 429855, 429863, 429872, 429880, 429889, 429898, + 429908, 429916, 429925, 429934, 429944, 429953, 429963, 429973, + 429984, 429992, 430001, 430010, 430020, 430029, 430039, 430049, + 430060, 430069, 430079, 430089, 430100, 430110, 430121, 430132, + 430144, 430150, 430157, 430164, 430172, 430179, 430187, 430195, + 430204, 430211, 430219, 430227, 430236, 430244, 430253, 430262, + 430272, 430279, 430287, 430295, 430304, 430312, 430321, 430330, + 430340, 430348, 430357, 430366, 430376, 430385, 430395, 430405, + 430416, 430423, 430431, 430439, 430448, 430456, 430465, 430474, + 430484, 430492, 430501, 430510, 430520, 430529, 430539, 430549, + 430560, 430568, 430577, 430586, 430596, 430605, 430615, 430625, + 430636, 430645, 430655, 430665, 430676, 430686, 430697, 430708, + 430720, 430727, 430735, 430743, 430752, 430760, 430769, 430778, + 430788, 430796, 430805, 430814, 430824, 430833, 430843, 430853, + 430864, 430872, 430881, 430890, 430900, 430909, 430919, 430929, + 430940, 430949, 430959, 430969, 430980, 430990, 431001, 431012, + 431024, 431032, 431041, 431050, 431060, 431069, 431079, 431089, + 431100, 431109, 431119, 431129, 431140, 431150, 431161, 431172, + 431184, 431193, 431203, 431213, 431224, 431234, 431245, 431256, + 431268, 431278, 431289, 431300, 431312, 431323, 431335, 431347, + 431360, 431365, 431371, 431377, 431384, 431390, 431397, 431404, + 431412, 431418, 431425, 431432, 431440, 431447, 431455, 431463, + 431472, 431478, 431485, 431492, 431500, 431507, 431515, 431523, + 431532, 431539, 431547, 431555, 431564, 431572, 431581, 431590, + 431600, 431606, 431613, 431620, 431628, 431635, 431643, 431651, + 431660, 431667, 431675, 431683, 431692, 431700, 431709, 431718, + 431728, 431735, 431743, 431751, 431760, 431768, 431777, 431786, + 431796, 431804, 431813, 431822, 431832, 431841, 431851, 431861, + 431872, 431878, 431885, 431892, 431900, 431907, 431915, 431923, + 431932, 431939, 431947, 431955, 431964, 431972, 431981, 431990, + 432000, 432007, 432015, 432023, 432032, 432040, 432049, 432058, + 432068, 432076, 432085, 432094, 432104, 432113, 432123, 432133, + 432144, 432151, 432159, 432167, 432176, 432184, 432193, 432202, + 432212, 432220, 432229, 432238, 432248, 432257, 432267, 432277, + 432288, 432296, 432305, 432314, 432324, 432333, 432343, 432353, + 432364, 432373, 432383, 432393, 432404, 432414, 432425, 432436, + 432448, 432454, 432461, 432468, 432476, 432483, 432491, 432499, + 432508, 432515, 432523, 432531, 432540, 432548, 432557, 432566, + 432576, 432583, 432591, 432599, 432608, 432616, 432625, 432634, + 432644, 432652, 432661, 432670, 432680, 432689, 432699, 432709, + 432720, 432727, 432735, 432743, 432752, 432760, 432769, 432778, + 432788, 432796, 432805, 432814, 432824, 432833, 432843, 432853, + 432864, 432872, 432881, 432890, 432900, 432909, 432919, 432929, + 432940, 432949, 432959, 432969, 432980, 432990, 433001, 433012, + 433024, 433031, 433039, 433047, 433056, 433064, 433073, 433082, + 433092, 433100, 433109, 433118, 433128, 433137, 433147, 433157, + 433168, 433176, 433185, 433194, 433204, 433213, 433223, 433233, + 433244, 433253, 433263, 433273, 433284, 433294, 433305, 433316, + 433328, 433336, 433345, 433354, 433364, 433373, 433383, 433393, + 433404, 433413, 433423, 433433, 433444, 433454, 433465, 433476, + 433488, 433497, 433507, 433517, 433528, 433538, 433549, 433560, + 433572, 433582, 433593, 433604, 433616, 433627, 433639, 433651, + 433664, 433670, 433677, 433684, 433692, 433699, 433707, 433715, + 433724, 433731, 433739, 433747, 433756, 433764, 433773, 433782, + 433792, 433799, 433807, 433815, 433824, 433832, 433841, 433850, + 433860, 433868, 433877, 433886, 433896, 433905, 433915, 433925, + 433936, 433943, 433951, 433959, 433968, 433976, 433985, 433994, + 434004, 434012, 434021, 434030, 434040, 434049, 434059, 434069, + 434080, 434088, 434097, 434106, 434116, 434125, 434135, 434145, + 434156, 434165, 434175, 434185, 434196, 434206, 434217, 434228, + 434240, 434247, 434255, 434263, 434272, 434280, 434289, 434298, + 434308, 434316, 434325, 434334, 434344, 434353, 434363, 434373, + 434384, 434392, 434401, 434410, 434420, 434429, 434439, 434449, + 434460, 434469, 434479, 434489, 434500, 434510, 434521, 434532, + 434544, 434552, 434561, 434570, 434580, 434589, 434599, 434609, + 434620, 434629, 434639, 434649, 434660, 434670, 434681, 434692, + 434704, 434713, 434723, 434733, 434744, 434754, 434765, 434776, + 434788, 434798, 434809, 434820, 434832, 434843, 434855, 434867, + 434880, 434887, 434895, 434903, 434912, 434920, 434929, 434938, + 434948, 434956, 434965, 434974, 434984, 434993, 435003, 435013, + 435024, 435032, 435041, 435050, 435060, 435069, 435079, 435089, + 435100, 435109, 435119, 435129, 435140, 435150, 435161, 435172, + 435184, 435192, 435201, 435210, 435220, 435229, 435239, 435249, + 435260, 435269, 435279, 435289, 435300, 435310, 435321, 435332, + 435344, 435353, 435363, 435373, 435384, 435394, 435405, 435416, + 435428, 435438, 435449, 435460, 435472, 435483, 435495, 435507, + 435520, 435528, 435537, 435546, 435556, 435565, 435575, 435585, + 435596, 435605, 435615, 435625, 435636, 435646, 435657, 435668, + 435680, 435689, 435699, 435709, 435720, 435730, 435741, 435752, + 435764, 435774, 435785, 435796, 435808, 435819, 435831, 435843, + 435856, 435865, 435875, 435885, 435896, 435906, 435917, 435928, + 435940, 435950, 435961, 435972, 435984, 435995, 436007, 436019, + 436032, 436042, 436053, 436064, 436076, 436087, 436099, 436111, + 436124, 436135, 436147, 436159, 436172, 436184, 436197, 436210, + 436224, 436229, 436235, 436241, 436248, 436254, 436261, 436268, + 436276, 436282, 436289, 436296, 436304, 436311, 436319, 436327, + 436336, 436342, 436349, 436356, 436364, 436371, 436379, 436387, + 436396, 436403, 436411, 436419, 436428, 436436, 436445, 436454, + 436464, 436470, 436477, 436484, 436492, 436499, 436507, 436515, + 436524, 436531, 436539, 436547, 436556, 436564, 436573, 436582, + 436592, 436599, 436607, 436615, 436624, 436632, 436641, 436650, + 436660, 436668, 436677, 436686, 436696, 436705, 436715, 436725, + 436736, 436742, 436749, 436756, 436764, 436771, 436779, 436787, + 436796, 436803, 436811, 436819, 436828, 436836, 436845, 436854, + 436864, 436871, 436879, 436887, 436896, 436904, 436913, 436922, + 436932, 436940, 436949, 436958, 436968, 436977, 436987, 436997, + 437008, 437015, 437023, 437031, 437040, 437048, 437057, 437066, + 437076, 437084, 437093, 437102, 437112, 437121, 437131, 437141, + 437152, 437160, 437169, 437178, 437188, 437197, 437207, 437217, + 437228, 437237, 437247, 437257, 437268, 437278, 437289, 437300, + 437312, 437318, 437325, 437332, 437340, 437347, 437355, 437363, + 437372, 437379, 437387, 437395, 437404, 437412, 437421, 437430, + 437440, 437447, 437455, 437463, 437472, 437480, 437489, 437498, + 437508, 437516, 437525, 437534, 437544, 437553, 437563, 437573, + 437584, 437591, 437599, 437607, 437616, 437624, 437633, 437642, + 437652, 437660, 437669, 437678, 437688, 437697, 437707, 437717, + 437728, 437736, 437745, 437754, 437764, 437773, 437783, 437793, + 437804, 437813, 437823, 437833, 437844, 437854, 437865, 437876, + 437888, 437895, 437903, 437911, 437920, 437928, 437937, 437946, + 437956, 437964, 437973, 437982, 437992, 438001, 438011, 438021, + 438032, 438040, 438049, 438058, 438068, 438077, 438087, 438097, + 438108, 438117, 438127, 438137, 438148, 438158, 438169, 438180, + 438192, 438200, 438209, 438218, 438228, 438237, 438247, 438257, + 438268, 438277, 438287, 438297, 438308, 438318, 438329, 438340, + 438352, 438361, 438371, 438381, 438392, 438402, 438413, 438424, + 438436, 438446, 438457, 438468, 438480, 438491, 438503, 438515, + 438528, 438534, 438541, 438548, 438556, 438563, 438571, 438579, + 438588, 438595, 438603, 438611, 438620, 438628, 438637, 438646, + 438656, 438663, 438671, 438679, 438688, 438696, 438705, 438714, + 438724, 438732, 438741, 438750, 438760, 438769, 438779, 438789, + 438800, 438807, 438815, 438823, 438832, 438840, 438849, 438858, + 438868, 438876, 438885, 438894, 438904, 438913, 438923, 438933, + 438944, 438952, 438961, 438970, 438980, 438989, 438999, 439009, + 439020, 439029, 439039, 439049, 439060, 439070, 439081, 439092, + 439104, 439111, 439119, 439127, 439136, 439144, 439153, 439162, + 439172, 439180, 439189, 439198, 439208, 439217, 439227, 439237, + 439248, 439256, 439265, 439274, 439284, 439293, 439303, 439313, + 439324, 439333, 439343, 439353, 439364, 439374, 439385, 439396, + 439408, 439416, 439425, 439434, 439444, 439453, 439463, 439473, + 439484, 439493, 439503, 439513, 439524, 439534, 439545, 439556, + 439568, 439577, 439587, 439597, 439608, 439618, 439629, 439640, + 439652, 439662, 439673, 439684, 439696, 439707, 439719, 439731, + 439744, 439751, 439759, 439767, 439776, 439784, 439793, 439802, + 439812, 439820, 439829, 439838, 439848, 439857, 439867, 439877, + 439888, 439896, 439905, 439914, 439924, 439933, 439943, 439953, + 439964, 439973, 439983, 439993, 440004, 440014, 440025, 440036, + 440048, 440056, 440065, 440074, 440084, 440093, 440103, 440113, + 440124, 440133, 440143, 440153, 440164, 440174, 440185, 440196, + 440208, 440217, 440227, 440237, 440248, 440258, 440269, 440280, + 440292, 440302, 440313, 440324, 440336, 440347, 440359, 440371, + 440384, 440392, 440401, 440410, 440420, 440429, 440439, 440449, + 440460, 440469, 440479, 440489, 440500, 440510, 440521, 440532, + 440544, 440553, 440563, 440573, 440584, 440594, 440605, 440616, + 440628, 440638, 440649, 440660, 440672, 440683, 440695, 440707, + 440720, 440729, 440739, 440749, 440760, 440770, 440781, 440792, + 440804, 440814, 440825, 440836, 440848, 440859, 440871, 440883, + 440896, 440906, 440917, 440928, 440940, 440951, 440963, 440975, + 440988, 440999, 441011, 441023, 441036, 441048, 441061, 441074, + 441088, 441094, 441101, 441108, 441116, 441123, 441131, 441139, + 441148, 441155, 441163, 441171, 441180, 441188, 441197, 441206, + 441216, 441223, 441231, 441239, 441248, 441256, 441265, 441274, + 441284, 441292, 441301, 441310, 441320, 441329, 441339, 441349, + 441360, 441367, 441375, 441383, 441392, 441400, 441409, 441418, + 441428, 441436, 441445, 441454, 441464, 441473, 441483, 441493, + 441504, 441512, 441521, 441530, 441540, 441549, 441559, 441569, + 441580, 441589, 441599, 441609, 441620, 441630, 441641, 441652, + 441664, 441671, 441679, 441687, 441696, 441704, 441713, 441722, + 441732, 441740, 441749, 441758, 441768, 441777, 441787, 441797, + 441808, 441816, 441825, 441834, 441844, 441853, 441863, 441873, + 441884, 441893, 441903, 441913, 441924, 441934, 441945, 441956, + 441968, 441976, 441985, 441994, 442004, 442013, 442023, 442033, + 442044, 442053, 442063, 442073, 442084, 442094, 442105, 442116, + 442128, 442137, 442147, 442157, 442168, 442178, 442189, 442200, + 442212, 442222, 442233, 442244, 442256, 442267, 442279, 442291, + 442304, 442311, 442319, 442327, 442336, 442344, 442353, 442362, + 442372, 442380, 442389, 442398, 442408, 442417, 442427, 442437, + 442448, 442456, 442465, 442474, 442484, 442493, 442503, 442513, + 442524, 442533, 442543, 442553, 442564, 442574, 442585, 442596, + 442608, 442616, 442625, 442634, 442644, 442653, 442663, 442673, + 442684, 442693, 442703, 442713, 442724, 442734, 442745, 442756, + 442768, 442777, 442787, 442797, 442808, 442818, 442829, 442840, + 442852, 442862, 442873, 442884, 442896, 442907, 442919, 442931, + 442944, 442952, 442961, 442970, 442980, 442989, 442999, 443009, + 443020, 443029, 443039, 443049, 443060, 443070, 443081, 443092, + 443104, 443113, 443123, 443133, 443144, 443154, 443165, 443176, + 443188, 443198, 443209, 443220, 443232, 443243, 443255, 443267, + 443280, 443289, 443299, 443309, 443320, 443330, 443341, 443352, + 443364, 443374, 443385, 443396, 443408, 443419, 443431, 443443, + 443456, 443466, 443477, 443488, 443500, 443511, 443523, 443535, + 443548, 443559, 443571, 443583, 443596, 443608, 443621, 443634, + 443648, 443655, 443663, 443671, 443680, 443688, 443697, 443706, + 443716, 443724, 443733, 443742, 443752, 443761, 443771, 443781, + 443792, 443800, 443809, 443818, 443828, 443837, 443847, 443857, + 443868, 443877, 443887, 443897, 443908, 443918, 443929, 443940, + 443952, 443960, 443969, 443978, 443988, 443997, 444007, 444017, + 444028, 444037, 444047, 444057, 444068, 444078, 444089, 444100, + 444112, 444121, 444131, 444141, 444152, 444162, 444173, 444184, + 444196, 444206, 444217, 444228, 444240, 444251, 444263, 444275, + 444288, 444296, 444305, 444314, 444324, 444333, 444343, 444353, + 444364, 444373, 444383, 444393, 444404, 444414, 444425, 444436, + 444448, 444457, 444467, 444477, 444488, 444498, 444509, 444520, + 444532, 444542, 444553, 444564, 444576, 444587, 444599, 444611, + 444624, 444633, 444643, 444653, 444664, 444674, 444685, 444696, + 444708, 444718, 444729, 444740, 444752, 444763, 444775, 444787, + 444800, 444810, 444821, 444832, 444844, 444855, 444867, 444879, + 444892, 444903, 444915, 444927, 444940, 444952, 444965, 444978, + 444992, 445000, 445009, 445018, 445028, 445037, 445047, 445057, + 445068, 445077, 445087, 445097, 445108, 445118, 445129, 445140, + 445152, 445161, 445171, 445181, 445192, 445202, 445213, 445224, + 445236, 445246, 445257, 445268, 445280, 445291, 445303, 445315, + 445328, 445337, 445347, 445357, 445368, 445378, 445389, 445400, + 445412, 445422, 445433, 445444, 445456, 445467, 445479, 445491, + 445504, 445514, 445525, 445536, 445548, 445559, 445571, 445583, + 445596, 445607, 445619, 445631, 445644, 445656, 445669, 445682, + 445696, 445705, 445715, 445725, 445736, 445746, 445757, 445768, + 445780, 445790, 445801, 445812, 445824, 445835, 445847, 445859, + 445872, 445882, 445893, 445904, 445916, 445927, 445939, 445951, + 445964, 445975, 445987, 445999, 446012, 446024, 446037, 446050, + 446064, 446074, 446085, 446096, 446108, 446119, 446131, 446143, + 446156, 446167, 446179, 446191, 446204, 446216, 446229, 446242, + 446256, 446267, 446279, 446291, 446304, 446316, 446329, 446342, + 446356, 446368, 446381, 446394, 446408, 446421, 446435, 446449, + 446464, 446467, 446471, 446475, 446480, 446484, 446489, 446494, + 446500, 446504, 446509, 446514, 446520, 446525, 446531, 446537, + 446544, 446548, 446553, 446558, 446564, 446569, 446575, 446581, + 446588, 446593, 446599, 446605, 446612, 446618, 446625, 446632, + 446640, 446644, 446649, 446654, 446660, 446665, 446671, 446677, + 446684, 446689, 446695, 446701, 446708, 446714, 446721, 446728, + 446736, 446741, 446747, 446753, 446760, 446766, 446773, 446780, + 446788, 446794, 446801, 446808, 446816, 446823, 446831, 446839, + 446848, 446852, 446857, 446862, 446868, 446873, 446879, 446885, + 446892, 446897, 446903, 446909, 446916, 446922, 446929, 446936, + 446944, 446949, 446955, 446961, 446968, 446974, 446981, 446988, + 446996, 447002, 447009, 447016, 447024, 447031, 447039, 447047, + 447056, 447061, 447067, 447073, 447080, 447086, 447093, 447100, + 447108, 447114, 447121, 447128, 447136, 447143, 447151, 447159, + 447168, 447174, 447181, 447188, 447196, 447203, 447211, 447219, + 447228, 447235, 447243, 447251, 447260, 447268, 447277, 447286, + 447296, 447300, 447305, 447310, 447316, 447321, 447327, 447333, + 447340, 447345, 447351, 447357, 447364, 447370, 447377, 447384, + 447392, 447397, 447403, 447409, 447416, 447422, 447429, 447436, + 447444, 447450, 447457, 447464, 447472, 447479, 447487, 447495, + 447504, 447509, 447515, 447521, 447528, 447534, 447541, 447548, + 447556, 447562, 447569, 447576, 447584, 447591, 447599, 447607, + 447616, 447622, 447629, 447636, 447644, 447651, 447659, 447667, + 447676, 447683, 447691, 447699, 447708, 447716, 447725, 447734, + 447744, 447749, 447755, 447761, 447768, 447774, 447781, 447788, + 447796, 447802, 447809, 447816, 447824, 447831, 447839, 447847, + 447856, 447862, 447869, 447876, 447884, 447891, 447899, 447907, + 447916, 447923, 447931, 447939, 447948, 447956, 447965, 447974, + 447984, 447990, 447997, 448004, 448012, 448019, 448027, 448035, + 448044, 448051, 448059, 448067, 448076, 448084, 448093, 448102, + 448112, 448119, 448127, 448135, 448144, 448152, 448161, 448170, + 448180, 448188, 448197, 448206, 448216, 448225, 448235, 448245, + 448256, 448260, 448265, 448270, 448276, 448281, 448287, 448293, + 448300, 448305, 448311, 448317, 448324, 448330, 448337, 448344, + 448352, 448357, 448363, 448369, 448376, 448382, 448389, 448396, + 448404, 448410, 448417, 448424, 448432, 448439, 448447, 448455, + 448464, 448469, 448475, 448481, 448488, 448494, 448501, 448508, + 448516, 448522, 448529, 448536, 448544, 448551, 448559, 448567, + 448576, 448582, 448589, 448596, 448604, 448611, 448619, 448627, + 448636, 448643, 448651, 448659, 448668, 448676, 448685, 448694, + 448704, 448709, 448715, 448721, 448728, 448734, 448741, 448748, + 448756, 448762, 448769, 448776, 448784, 448791, 448799, 448807, + 448816, 448822, 448829, 448836, 448844, 448851, 448859, 448867, + 448876, 448883, 448891, 448899, 448908, 448916, 448925, 448934, + 448944, 448950, 448957, 448964, 448972, 448979, 448987, 448995, + 449004, 449011, 449019, 449027, 449036, 449044, 449053, 449062, + 449072, 449079, 449087, 449095, 449104, 449112, 449121, 449130, + 449140, 449148, 449157, 449166, 449176, 449185, 449195, 449205, + 449216, 449221, 449227, 449233, 449240, 449246, 449253, 449260, + 449268, 449274, 449281, 449288, 449296, 449303, 449311, 449319, + 449328, 449334, 449341, 449348, 449356, 449363, 449371, 449379, + 449388, 449395, 449403, 449411, 449420, 449428, 449437, 449446, + 449456, 449462, 449469, 449476, 449484, 449491, 449499, 449507, + 449516, 449523, 449531, 449539, 449548, 449556, 449565, 449574, + 449584, 449591, 449599, 449607, 449616, 449624, 449633, 449642, + 449652, 449660, 449669, 449678, 449688, 449697, 449707, 449717, + 449728, 449734, 449741, 449748, 449756, 449763, 449771, 449779, + 449788, 449795, 449803, 449811, 449820, 449828, 449837, 449846, + 449856, 449863, 449871, 449879, 449888, 449896, 449905, 449914, + 449924, 449932, 449941, 449950, 449960, 449969, 449979, 449989, + 450000, 450007, 450015, 450023, 450032, 450040, 450049, 450058, + 450068, 450076, 450085, 450094, 450104, 450113, 450123, 450133, + 450144, 450152, 450161, 450170, 450180, 450189, 450199, 450209, + 450220, 450229, 450239, 450249, 450260, 450270, 450281, 450292, + 450304, 450308, 450313, 450318, 450324, 450329, 450335, 450341, + 450348, 450353, 450359, 450365, 450372, 450378, 450385, 450392, + 450400, 450405, 450411, 450417, 450424, 450430, 450437, 450444, + 450452, 450458, 450465, 450472, 450480, 450487, 450495, 450503, + 450512, 450517, 450523, 450529, 450536, 450542, 450549, 450556, + 450564, 450570, 450577, 450584, 450592, 450599, 450607, 450615, + 450624, 450630, 450637, 450644, 450652, 450659, 450667, 450675, + 450684, 450691, 450699, 450707, 450716, 450724, 450733, 450742, + 450752, 450757, 450763, 450769, 450776, 450782, 450789, 450796, + 450804, 450810, 450817, 450824, 450832, 450839, 450847, 450855, + 450864, 450870, 450877, 450884, 450892, 450899, 450907, 450915, + 450924, 450931, 450939, 450947, 450956, 450964, 450973, 450982, + 450992, 450998, 451005, 451012, 451020, 451027, 451035, 451043, + 451052, 451059, 451067, 451075, 451084, 451092, 451101, 451110, + 451120, 451127, 451135, 451143, 451152, 451160, 451169, 451178, + 451188, 451196, 451205, 451214, 451224, 451233, 451243, 451253, + 451264, 451269, 451275, 451281, 451288, 451294, 451301, 451308, + 451316, 451322, 451329, 451336, 451344, 451351, 451359, 451367, + 451376, 451382, 451389, 451396, 451404, 451411, 451419, 451427, + 451436, 451443, 451451, 451459, 451468, 451476, 451485, 451494, + 451504, 451510, 451517, 451524, 451532, 451539, 451547, 451555, + 451564, 451571, 451579, 451587, 451596, 451604, 451613, 451622, + 451632, 451639, 451647, 451655, 451664, 451672, 451681, 451690, + 451700, 451708, 451717, 451726, 451736, 451745, 451755, 451765, + 451776, 451782, 451789, 451796, 451804, 451811, 451819, 451827, + 451836, 451843, 451851, 451859, 451868, 451876, 451885, 451894, + 451904, 451911, 451919, 451927, 451936, 451944, 451953, 451962, + 451972, 451980, 451989, 451998, 452008, 452017, 452027, 452037, + 452048, 452055, 452063, 452071, 452080, 452088, 452097, 452106, + 452116, 452124, 452133, 452142, 452152, 452161, 452171, 452181, + 452192, 452200, 452209, 452218, 452228, 452237, 452247, 452257, + 452268, 452277, 452287, 452297, 452308, 452318, 452329, 452340, + 452352, 452357, 452363, 452369, 452376, 452382, 452389, 452396, + 452404, 452410, 452417, 452424, 452432, 452439, 452447, 452455, + 452464, 452470, 452477, 452484, 452492, 452499, 452507, 452515, + 452524, 452531, 452539, 452547, 452556, 452564, 452573, 452582, + 452592, 452598, 452605, 452612, 452620, 452627, 452635, 452643, + 452652, 452659, 452667, 452675, 452684, 452692, 452701, 452710, + 452720, 452727, 452735, 452743, 452752, 452760, 452769, 452778, + 452788, 452796, 452805, 452814, 452824, 452833, 452843, 452853, + 452864, 452870, 452877, 452884, 452892, 452899, 452907, 452915, + 452924, 452931, 452939, 452947, 452956, 452964, 452973, 452982, + 452992, 452999, 453007, 453015, 453024, 453032, 453041, 453050, + 453060, 453068, 453077, 453086, 453096, 453105, 453115, 453125, + 453136, 453143, 453151, 453159, 453168, 453176, 453185, 453194, + 453204, 453212, 453221, 453230, 453240, 453249, 453259, 453269, + 453280, 453288, 453297, 453306, 453316, 453325, 453335, 453345, + 453356, 453365, 453375, 453385, 453396, 453406, 453417, 453428, + 453440, 453446, 453453, 453460, 453468, 453475, 453483, 453491, + 453500, 453507, 453515, 453523, 453532, 453540, 453549, 453558, + 453568, 453575, 453583, 453591, 453600, 453608, 453617, 453626, + 453636, 453644, 453653, 453662, 453672, 453681, 453691, 453701, + 453712, 453719, 453727, 453735, 453744, 453752, 453761, 453770, + 453780, 453788, 453797, 453806, 453816, 453825, 453835, 453845, + 453856, 453864, 453873, 453882, 453892, 453901, 453911, 453921, + 453932, 453941, 453951, 453961, 453972, 453982, 453993, 454004, + 454016, 454023, 454031, 454039, 454048, 454056, 454065, 454074, + 454084, 454092, 454101, 454110, 454120, 454129, 454139, 454149, + 454160, 454168, 454177, 454186, 454196, 454205, 454215, 454225, + 454236, 454245, 454255, 454265, 454276, 454286, 454297, 454308, + 454320, 454328, 454337, 454346, 454356, 454365, 454375, 454385, + 454396, 454405, 454415, 454425, 454436, 454446, 454457, 454468, + 454480, 454489, 454499, 454509, 454520, 454530, 454541, 454552, + 454564, 454574, 454585, 454596, 454608, 454619, 454631, 454643, + 454656, 454660, 454665, 454670, 454676, 454681, 454687, 454693, + 454700, 454705, 454711, 454717, 454724, 454730, 454737, 454744, + 454752, 454757, 454763, 454769, 454776, 454782, 454789, 454796, + 454804, 454810, 454817, 454824, 454832, 454839, 454847, 454855, + 454864, 454869, 454875, 454881, 454888, 454894, 454901, 454908, + 454916, 454922, 454929, 454936, 454944, 454951, 454959, 454967, + 454976, 454982, 454989, 454996, 455004, 455011, 455019, 455027, + 455036, 455043, 455051, 455059, 455068, 455076, 455085, 455094, + 455104, 455109, 455115, 455121, 455128, 455134, 455141, 455148, + 455156, 455162, 455169, 455176, 455184, 455191, 455199, 455207, + 455216, 455222, 455229, 455236, 455244, 455251, 455259, 455267, + 455276, 455283, 455291, 455299, 455308, 455316, 455325, 455334, + 455344, 455350, 455357, 455364, 455372, 455379, 455387, 455395, + 455404, 455411, 455419, 455427, 455436, 455444, 455453, 455462, + 455472, 455479, 455487, 455495, 455504, 455512, 455521, 455530, + 455540, 455548, 455557, 455566, 455576, 455585, 455595, 455605, + 455616, 455621, 455627, 455633, 455640, 455646, 455653, 455660, + 455668, 455674, 455681, 455688, 455696, 455703, 455711, 455719, + 455728, 455734, 455741, 455748, 455756, 455763, 455771, 455779, + 455788, 455795, 455803, 455811, 455820, 455828, 455837, 455846, + 455856, 455862, 455869, 455876, 455884, 455891, 455899, 455907, + 455916, 455923, 455931, 455939, 455948, 455956, 455965, 455974, + 455984, 455991, 455999, 456007, 456016, 456024, 456033, 456042, + 456052, 456060, 456069, 456078, 456088, 456097, 456107, 456117, + 456128, 456134, 456141, 456148, 456156, 456163, 456171, 456179, + 456188, 456195, 456203, 456211, 456220, 456228, 456237, 456246, + 456256, 456263, 456271, 456279, 456288, 456296, 456305, 456314, + 456324, 456332, 456341, 456350, 456360, 456369, 456379, 456389, + 456400, 456407, 456415, 456423, 456432, 456440, 456449, 456458, + 456468, 456476, 456485, 456494, 456504, 456513, 456523, 456533, + 456544, 456552, 456561, 456570, 456580, 456589, 456599, 456609, + 456620, 456629, 456639, 456649, 456660, 456670, 456681, 456692, + 456704, 456709, 456715, 456721, 456728, 456734, 456741, 456748, + 456756, 456762, 456769, 456776, 456784, 456791, 456799, 456807, + 456816, 456822, 456829, 456836, 456844, 456851, 456859, 456867, + 456876, 456883, 456891, 456899, 456908, 456916, 456925, 456934, + 456944, 456950, 456957, 456964, 456972, 456979, 456987, 456995, + 457004, 457011, 457019, 457027, 457036, 457044, 457053, 457062, + 457072, 457079, 457087, 457095, 457104, 457112, 457121, 457130, + 457140, 457148, 457157, 457166, 457176, 457185, 457195, 457205, + 457216, 457222, 457229, 457236, 457244, 457251, 457259, 457267, + 457276, 457283, 457291, 457299, 457308, 457316, 457325, 457334, + 457344, 457351, 457359, 457367, 457376, 457384, 457393, 457402, + 457412, 457420, 457429, 457438, 457448, 457457, 457467, 457477, + 457488, 457495, 457503, 457511, 457520, 457528, 457537, 457546, + 457556, 457564, 457573, 457582, 457592, 457601, 457611, 457621, + 457632, 457640, 457649, 457658, 457668, 457677, 457687, 457697, + 457708, 457717, 457727, 457737, 457748, 457758, 457769, 457780, + 457792, 457798, 457805, 457812, 457820, 457827, 457835, 457843, + 457852, 457859, 457867, 457875, 457884, 457892, 457901, 457910, + 457920, 457927, 457935, 457943, 457952, 457960, 457969, 457978, + 457988, 457996, 458005, 458014, 458024, 458033, 458043, 458053, + 458064, 458071, 458079, 458087, 458096, 458104, 458113, 458122, + 458132, 458140, 458149, 458158, 458168, 458177, 458187, 458197, + 458208, 458216, 458225, 458234, 458244, 458253, 458263, 458273, + 458284, 458293, 458303, 458313, 458324, 458334, 458345, 458356, + 458368, 458375, 458383, 458391, 458400, 458408, 458417, 458426, + 458436, 458444, 458453, 458462, 458472, 458481, 458491, 458501, + 458512, 458520, 458529, 458538, 458548, 458557, 458567, 458577, + 458588, 458597, 458607, 458617, 458628, 458638, 458649, 458660, + 458672, 458680, 458689, 458698, 458708, 458717, 458727, 458737, + 458748, 458757, 458767, 458777, 458788, 458798, 458809, 458820, + 458832, 458841, 458851, 458861, 458872, 458882, 458893, 458904, + 458916, 458926, 458937, 458948, 458960, 458971, 458983, 458995, + 459008, 459013, 459019, 459025, 459032, 459038, 459045, 459052, + 459060, 459066, 459073, 459080, 459088, 459095, 459103, 459111, + 459120, 459126, 459133, 459140, 459148, 459155, 459163, 459171, + 459180, 459187, 459195, 459203, 459212, 459220, 459229, 459238, + 459248, 459254, 459261, 459268, 459276, 459283, 459291, 459299, + 459308, 459315, 459323, 459331, 459340, 459348, 459357, 459366, + 459376, 459383, 459391, 459399, 459408, 459416, 459425, 459434, + 459444, 459452, 459461, 459470, 459480, 459489, 459499, 459509, + 459520, 459526, 459533, 459540, 459548, 459555, 459563, 459571, + 459580, 459587, 459595, 459603, 459612, 459620, 459629, 459638, + 459648, 459655, 459663, 459671, 459680, 459688, 459697, 459706, + 459716, 459724, 459733, 459742, 459752, 459761, 459771, 459781, + 459792, 459799, 459807, 459815, 459824, 459832, 459841, 459850, + 459860, 459868, 459877, 459886, 459896, 459905, 459915, 459925, + 459936, 459944, 459953, 459962, 459972, 459981, 459991, 460001, + 460012, 460021, 460031, 460041, 460052, 460062, 460073, 460084, + 460096, 460102, 460109, 460116, 460124, 460131, 460139, 460147, + 460156, 460163, 460171, 460179, 460188, 460196, 460205, 460214, + 460224, 460231, 460239, 460247, 460256, 460264, 460273, 460282, + 460292, 460300, 460309, 460318, 460328, 460337, 460347, 460357, + 460368, 460375, 460383, 460391, 460400, 460408, 460417, 460426, + 460436, 460444, 460453, 460462, 460472, 460481, 460491, 460501, + 460512, 460520, 460529, 460538, 460548, 460557, 460567, 460577, + 460588, 460597, 460607, 460617, 460628, 460638, 460649, 460660, + 460672, 460679, 460687, 460695, 460704, 460712, 460721, 460730, + 460740, 460748, 460757, 460766, 460776, 460785, 460795, 460805, + 460816, 460824, 460833, 460842, 460852, 460861, 460871, 460881, + 460892, 460901, 460911, 460921, 460932, 460942, 460953, 460964, + 460976, 460984, 460993, 461002, 461012, 461021, 461031, 461041, + 461052, 461061, 461071, 461081, 461092, 461102, 461113, 461124, + 461136, 461145, 461155, 461165, 461176, 461186, 461197, 461208, + 461220, 461230, 461241, 461252, 461264, 461275, 461287, 461299, + 461312, 461318, 461325, 461332, 461340, 461347, 461355, 461363, + 461372, 461379, 461387, 461395, 461404, 461412, 461421, 461430, + 461440, 461447, 461455, 461463, 461472, 461480, 461489, 461498, + 461508, 461516, 461525, 461534, 461544, 461553, 461563, 461573, + 461584, 461591, 461599, 461607, 461616, 461624, 461633, 461642, + 461652, 461660, 461669, 461678, 461688, 461697, 461707, 461717, + 461728, 461736, 461745, 461754, 461764, 461773, 461783, 461793, + 461804, 461813, 461823, 461833, 461844, 461854, 461865, 461876, + 461888, 461895, 461903, 461911, 461920, 461928, 461937, 461946, + 461956, 461964, 461973, 461982, 461992, 462001, 462011, 462021, + 462032, 462040, 462049, 462058, 462068, 462077, 462087, 462097, + 462108, 462117, 462127, 462137, 462148, 462158, 462169, 462180, + 462192, 462200, 462209, 462218, 462228, 462237, 462247, 462257, + 462268, 462277, 462287, 462297, 462308, 462318, 462329, 462340, + 462352, 462361, 462371, 462381, 462392, 462402, 462413, 462424, + 462436, 462446, 462457, 462468, 462480, 462491, 462503, 462515, + 462528, 462535, 462543, 462551, 462560, 462568, 462577, 462586, + 462596, 462604, 462613, 462622, 462632, 462641, 462651, 462661, + 462672, 462680, 462689, 462698, 462708, 462717, 462727, 462737, + 462748, 462757, 462767, 462777, 462788, 462798, 462809, 462820, + 462832, 462840, 462849, 462858, 462868, 462877, 462887, 462897, + 462908, 462917, 462927, 462937, 462948, 462958, 462969, 462980, + 462992, 463001, 463011, 463021, 463032, 463042, 463053, 463064, + 463076, 463086, 463097, 463108, 463120, 463131, 463143, 463155, + 463168, 463176, 463185, 463194, 463204, 463213, 463223, 463233, + 463244, 463253, 463263, 463273, 463284, 463294, 463305, 463316, + 463328, 463337, 463347, 463357, 463368, 463378, 463389, 463400, + 463412, 463422, 463433, 463444, 463456, 463467, 463479, 463491, + 463504, 463513, 463523, 463533, 463544, 463554, 463565, 463576, + 463588, 463598, 463609, 463620, 463632, 463643, 463655, 463667, + 463680, 463690, 463701, 463712, 463724, 463735, 463747, 463759, + 463772, 463783, 463795, 463807, 463820, 463832, 463845, 463858, + 463872, 463876, 463881, 463886, 463892, 463897, 463903, 463909, + 463916, 463921, 463927, 463933, 463940, 463946, 463953, 463960, + 463968, 463973, 463979, 463985, 463992, 463998, 464005, 464012, + 464020, 464026, 464033, 464040, 464048, 464055, 464063, 464071, + 464080, 464085, 464091, 464097, 464104, 464110, 464117, 464124, + 464132, 464138, 464145, 464152, 464160, 464167, 464175, 464183, + 464192, 464198, 464205, 464212, 464220, 464227, 464235, 464243, + 464252, 464259, 464267, 464275, 464284, 464292, 464301, 464310, + 464320, 464325, 464331, 464337, 464344, 464350, 464357, 464364, + 464372, 464378, 464385, 464392, 464400, 464407, 464415, 464423, + 464432, 464438, 464445, 464452, 464460, 464467, 464475, 464483, + 464492, 464499, 464507, 464515, 464524, 464532, 464541, 464550, + 464560, 464566, 464573, 464580, 464588, 464595, 464603, 464611, + 464620, 464627, 464635, 464643, 464652, 464660, 464669, 464678, + 464688, 464695, 464703, 464711, 464720, 464728, 464737, 464746, + 464756, 464764, 464773, 464782, 464792, 464801, 464811, 464821, + 464832, 464837, 464843, 464849, 464856, 464862, 464869, 464876, + 464884, 464890, 464897, 464904, 464912, 464919, 464927, 464935, + 464944, 464950, 464957, 464964, 464972, 464979, 464987, 464995, + 465004, 465011, 465019, 465027, 465036, 465044, 465053, 465062, + 465072, 465078, 465085, 465092, 465100, 465107, 465115, 465123, + 465132, 465139, 465147, 465155, 465164, 465172, 465181, 465190, + 465200, 465207, 465215, 465223, 465232, 465240, 465249, 465258, + 465268, 465276, 465285, 465294, 465304, 465313, 465323, 465333, + 465344, 465350, 465357, 465364, 465372, 465379, 465387, 465395, + 465404, 465411, 465419, 465427, 465436, 465444, 465453, 465462, + 465472, 465479, 465487, 465495, 465504, 465512, 465521, 465530, + 465540, 465548, 465557, 465566, 465576, 465585, 465595, 465605, + 465616, 465623, 465631, 465639, 465648, 465656, 465665, 465674, + 465684, 465692, 465701, 465710, 465720, 465729, 465739, 465749, + 465760, 465768, 465777, 465786, 465796, 465805, 465815, 465825, + 465836, 465845, 465855, 465865, 465876, 465886, 465897, 465908, + 465920, 465925, 465931, 465937, 465944, 465950, 465957, 465964, + 465972, 465978, 465985, 465992, 466000, 466007, 466015, 466023, + 466032, 466038, 466045, 466052, 466060, 466067, 466075, 466083, + 466092, 466099, 466107, 466115, 466124, 466132, 466141, 466150, + 466160, 466166, 466173, 466180, 466188, 466195, 466203, 466211, + 466220, 466227, 466235, 466243, 466252, 466260, 466269, 466278, + 466288, 466295, 466303, 466311, 466320, 466328, 466337, 466346, + 466356, 466364, 466373, 466382, 466392, 466401, 466411, 466421, + 466432, 466438, 466445, 466452, 466460, 466467, 466475, 466483, + 466492, 466499, 466507, 466515, 466524, 466532, 466541, 466550, + 466560, 466567, 466575, 466583, 466592, 466600, 466609, 466618, + 466628, 466636, 466645, 466654, 466664, 466673, 466683, 466693, + 466704, 466711, 466719, 466727, 466736, 466744, 466753, 466762, + 466772, 466780, 466789, 466798, 466808, 466817, 466827, 466837, + 466848, 466856, 466865, 466874, 466884, 466893, 466903, 466913, + 466924, 466933, 466943, 466953, 466964, 466974, 466985, 466996, + 467008, 467014, 467021, 467028, 467036, 467043, 467051, 467059, + 467068, 467075, 467083, 467091, 467100, 467108, 467117, 467126, + 467136, 467143, 467151, 467159, 467168, 467176, 467185, 467194, + 467204, 467212, 467221, 467230, 467240, 467249, 467259, 467269, + 467280, 467287, 467295, 467303, 467312, 467320, 467329, 467338, + 467348, 467356, 467365, 467374, 467384, 467393, 467403, 467413, + 467424, 467432, 467441, 467450, 467460, 467469, 467479, 467489, + 467500, 467509, 467519, 467529, 467540, 467550, 467561, 467572, + 467584, 467591, 467599, 467607, 467616, 467624, 467633, 467642, + 467652, 467660, 467669, 467678, 467688, 467697, 467707, 467717, + 467728, 467736, 467745, 467754, 467764, 467773, 467783, 467793, + 467804, 467813, 467823, 467833, 467844, 467854, 467865, 467876, + 467888, 467896, 467905, 467914, 467924, 467933, 467943, 467953, + 467964, 467973, 467983, 467993, 468004, 468014, 468025, 468036, + 468048, 468057, 468067, 468077, 468088, 468098, 468109, 468120, + 468132, 468142, 468153, 468164, 468176, 468187, 468199, 468211, + 468224, 468229, 468235, 468241, 468248, 468254, 468261, 468268, + 468276, 468282, 468289, 468296, 468304, 468311, 468319, 468327, + 468336, 468342, 468349, 468356, 468364, 468371, 468379, 468387, + 468396, 468403, 468411, 468419, 468428, 468436, 468445, 468454, + 468464, 468470, 468477, 468484, 468492, 468499, 468507, 468515, + 468524, 468531, 468539, 468547, 468556, 468564, 468573, 468582, + 468592, 468599, 468607, 468615, 468624, 468632, 468641, 468650, + 468660, 468668, 468677, 468686, 468696, 468705, 468715, 468725, + 468736, 468742, 468749, 468756, 468764, 468771, 468779, 468787, + 468796, 468803, 468811, 468819, 468828, 468836, 468845, 468854, + 468864, 468871, 468879, 468887, 468896, 468904, 468913, 468922, + 468932, 468940, 468949, 468958, 468968, 468977, 468987, 468997, + 469008, 469015, 469023, 469031, 469040, 469048, 469057, 469066, + 469076, 469084, 469093, 469102, 469112, 469121, 469131, 469141, + 469152, 469160, 469169, 469178, 469188, 469197, 469207, 469217, + 469228, 469237, 469247, 469257, 469268, 469278, 469289, 469300, + 469312, 469318, 469325, 469332, 469340, 469347, 469355, 469363, + 469372, 469379, 469387, 469395, 469404, 469412, 469421, 469430, + 469440, 469447, 469455, 469463, 469472, 469480, 469489, 469498, + 469508, 469516, 469525, 469534, 469544, 469553, 469563, 469573, + 469584, 469591, 469599, 469607, 469616, 469624, 469633, 469642, + 469652, 469660, 469669, 469678, 469688, 469697, 469707, 469717, + 469728, 469736, 469745, 469754, 469764, 469773, 469783, 469793, + 469804, 469813, 469823, 469833, 469844, 469854, 469865, 469876, + 469888, 469895, 469903, 469911, 469920, 469928, 469937, 469946, + 469956, 469964, 469973, 469982, 469992, 470001, 470011, 470021, + 470032, 470040, 470049, 470058, 470068, 470077, 470087, 470097, + 470108, 470117, 470127, 470137, 470148, 470158, 470169, 470180, + 470192, 470200, 470209, 470218, 470228, 470237, 470247, 470257, + 470268, 470277, 470287, 470297, 470308, 470318, 470329, 470340, + 470352, 470361, 470371, 470381, 470392, 470402, 470413, 470424, + 470436, 470446, 470457, 470468, 470480, 470491, 470503, 470515, + 470528, 470534, 470541, 470548, 470556, 470563, 470571, 470579, + 470588, 470595, 470603, 470611, 470620, 470628, 470637, 470646, + 470656, 470663, 470671, 470679, 470688, 470696, 470705, 470714, + 470724, 470732, 470741, 470750, 470760, 470769, 470779, 470789, + 470800, 470807, 470815, 470823, 470832, 470840, 470849, 470858, + 470868, 470876, 470885, 470894, 470904, 470913, 470923, 470933, + 470944, 470952, 470961, 470970, 470980, 470989, 470999, 471009, + 471020, 471029, 471039, 471049, 471060, 471070, 471081, 471092, + 471104, 471111, 471119, 471127, 471136, 471144, 471153, 471162, + 471172, 471180, 471189, 471198, 471208, 471217, 471227, 471237, + 471248, 471256, 471265, 471274, 471284, 471293, 471303, 471313, + 471324, 471333, 471343, 471353, 471364, 471374, 471385, 471396, + 471408, 471416, 471425, 471434, 471444, 471453, 471463, 471473, + 471484, 471493, 471503, 471513, 471524, 471534, 471545, 471556, + 471568, 471577, 471587, 471597, 471608, 471618, 471629, 471640, + 471652, 471662, 471673, 471684, 471696, 471707, 471719, 471731, + 471744, 471751, 471759, 471767, 471776, 471784, 471793, 471802, + 471812, 471820, 471829, 471838, 471848, 471857, 471867, 471877, + 471888, 471896, 471905, 471914, 471924, 471933, 471943, 471953, + 471964, 471973, 471983, 471993, 472004, 472014, 472025, 472036, + 472048, 472056, 472065, 472074, 472084, 472093, 472103, 472113, + 472124, 472133, 472143, 472153, 472164, 472174, 472185, 472196, + 472208, 472217, 472227, 472237, 472248, 472258, 472269, 472280, + 472292, 472302, 472313, 472324, 472336, 472347, 472359, 472371, + 472384, 472392, 472401, 472410, 472420, 472429, 472439, 472449, + 472460, 472469, 472479, 472489, 472500, 472510, 472521, 472532, + 472544, 472553, 472563, 472573, 472584, 472594, 472605, 472616, + 472628, 472638, 472649, 472660, 472672, 472683, 472695, 472707, + 472720, 472729, 472739, 472749, 472760, 472770, 472781, 472792, + 472804, 472814, 472825, 472836, 472848, 472859, 472871, 472883, + 472896, 472906, 472917, 472928, 472940, 472951, 472963, 472975, + 472988, 472999, 473011, 473023, 473036, 473048, 473061, 473074, + 473088, 473093, 473099, 473105, 473112, 473118, 473125, 473132, + 473140, 473146, 473153, 473160, 473168, 473175, 473183, 473191, + 473200, 473206, 473213, 473220, 473228, 473235, 473243, 473251, + 473260, 473267, 473275, 473283, 473292, 473300, 473309, 473318, + 473328, 473334, 473341, 473348, 473356, 473363, 473371, 473379, + 473388, 473395, 473403, 473411, 473420, 473428, 473437, 473446, + 473456, 473463, 473471, 473479, 473488, 473496, 473505, 473514, + 473524, 473532, 473541, 473550, 473560, 473569, 473579, 473589, + 473600, 473606, 473613, 473620, 473628, 473635, 473643, 473651, + 473660, 473667, 473675, 473683, 473692, 473700, 473709, 473718, + 473728, 473735, 473743, 473751, 473760, 473768, 473777, 473786, + 473796, 473804, 473813, 473822, 473832, 473841, 473851, 473861, + 473872, 473879, 473887, 473895, 473904, 473912, 473921, 473930, + 473940, 473948, 473957, 473966, 473976, 473985, 473995, 474005, + 474016, 474024, 474033, 474042, 474052, 474061, 474071, 474081, + 474092, 474101, 474111, 474121, 474132, 474142, 474153, 474164, + 474176, 474182, 474189, 474196, 474204, 474211, 474219, 474227, + 474236, 474243, 474251, 474259, 474268, 474276, 474285, 474294, + 474304, 474311, 474319, 474327, 474336, 474344, 474353, 474362, + 474372, 474380, 474389, 474398, 474408, 474417, 474427, 474437, + 474448, 474455, 474463, 474471, 474480, 474488, 474497, 474506, + 474516, 474524, 474533, 474542, 474552, 474561, 474571, 474581, + 474592, 474600, 474609, 474618, 474628, 474637, 474647, 474657, + 474668, 474677, 474687, 474697, 474708, 474718, 474729, 474740, + 474752, 474759, 474767, 474775, 474784, 474792, 474801, 474810, + 474820, 474828, 474837, 474846, 474856, 474865, 474875, 474885, + 474896, 474904, 474913, 474922, 474932, 474941, 474951, 474961, + 474972, 474981, 474991, 475001, 475012, 475022, 475033, 475044, + 475056, 475064, 475073, 475082, 475092, 475101, 475111, 475121, + 475132, 475141, 475151, 475161, 475172, 475182, 475193, 475204, + 475216, 475225, 475235, 475245, 475256, 475266, 475277, 475288, + 475300, 475310, 475321, 475332, 475344, 475355, 475367, 475379, + 475392, 475398, 475405, 475412, 475420, 475427, 475435, 475443, + 475452, 475459, 475467, 475475, 475484, 475492, 475501, 475510, + 475520, 475527, 475535, 475543, 475552, 475560, 475569, 475578, + 475588, 475596, 475605, 475614, 475624, 475633, 475643, 475653, + 475664, 475671, 475679, 475687, 475696, 475704, 475713, 475722, + 475732, 475740, 475749, 475758, 475768, 475777, 475787, 475797, + 475808, 475816, 475825, 475834, 475844, 475853, 475863, 475873, + 475884, 475893, 475903, 475913, 475924, 475934, 475945, 475956, + 475968, 475975, 475983, 475991, 476000, 476008, 476017, 476026, + 476036, 476044, 476053, 476062, 476072, 476081, 476091, 476101, + 476112, 476120, 476129, 476138, 476148, 476157, 476167, 476177, + 476188, 476197, 476207, 476217, 476228, 476238, 476249, 476260, + 476272, 476280, 476289, 476298, 476308, 476317, 476327, 476337, + 476348, 476357, 476367, 476377, 476388, 476398, 476409, 476420, + 476432, 476441, 476451, 476461, 476472, 476482, 476493, 476504, + 476516, 476526, 476537, 476548, 476560, 476571, 476583, 476595, + 476608, 476615, 476623, 476631, 476640, 476648, 476657, 476666, + 476676, 476684, 476693, 476702, 476712, 476721, 476731, 476741, + 476752, 476760, 476769, 476778, 476788, 476797, 476807, 476817, + 476828, 476837, 476847, 476857, 476868, 476878, 476889, 476900, + 476912, 476920, 476929, 476938, 476948, 476957, 476967, 476977, + 476988, 476997, 477007, 477017, 477028, 477038, 477049, 477060, + 477072, 477081, 477091, 477101, 477112, 477122, 477133, 477144, + 477156, 477166, 477177, 477188, 477200, 477211, 477223, 477235, + 477248, 477256, 477265, 477274, 477284, 477293, 477303, 477313, + 477324, 477333, 477343, 477353, 477364, 477374, 477385, 477396, + 477408, 477417, 477427, 477437, 477448, 477458, 477469, 477480, + 477492, 477502, 477513, 477524, 477536, 477547, 477559, 477571, + 477584, 477593, 477603, 477613, 477624, 477634, 477645, 477656, + 477668, 477678, 477689, 477700, 477712, 477723, 477735, 477747, + 477760, 477770, 477781, 477792, 477804, 477815, 477827, 477839, + 477852, 477863, 477875, 477887, 477900, 477912, 477925, 477938, + 477952, 477958, 477965, 477972, 477980, 477987, 477995, 478003, + 478012, 478019, 478027, 478035, 478044, 478052, 478061, 478070, + 478080, 478087, 478095, 478103, 478112, 478120, 478129, 478138, + 478148, 478156, 478165, 478174, 478184, 478193, 478203, 478213, + 478224, 478231, 478239, 478247, 478256, 478264, 478273, 478282, + 478292, 478300, 478309, 478318, 478328, 478337, 478347, 478357, + 478368, 478376, 478385, 478394, 478404, 478413, 478423, 478433, + 478444, 478453, 478463, 478473, 478484, 478494, 478505, 478516, + 478528, 478535, 478543, 478551, 478560, 478568, 478577, 478586, + 478596, 478604, 478613, 478622, 478632, 478641, 478651, 478661, + 478672, 478680, 478689, 478698, 478708, 478717, 478727, 478737, + 478748, 478757, 478767, 478777, 478788, 478798, 478809, 478820, + 478832, 478840, 478849, 478858, 478868, 478877, 478887, 478897, + 478908, 478917, 478927, 478937, 478948, 478958, 478969, 478980, + 478992, 479001, 479011, 479021, 479032, 479042, 479053, 479064, + 479076, 479086, 479097, 479108, 479120, 479131, 479143, 479155, + 479168, 479175, 479183, 479191, 479200, 479208, 479217, 479226, + 479236, 479244, 479253, 479262, 479272, 479281, 479291, 479301, + 479312, 479320, 479329, 479338, 479348, 479357, 479367, 479377, + 479388, 479397, 479407, 479417, 479428, 479438, 479449, 479460, + 479472, 479480, 479489, 479498, 479508, 479517, 479527, 479537, + 479548, 479557, 479567, 479577, 479588, 479598, 479609, 479620, + 479632, 479641, 479651, 479661, 479672, 479682, 479693, 479704, + 479716, 479726, 479737, 479748, 479760, 479771, 479783, 479795, + 479808, 479816, 479825, 479834, 479844, 479853, 479863, 479873, + 479884, 479893, 479903, 479913, 479924, 479934, 479945, 479956, + 479968, 479977, 479987, 479997, 480008, 480018, 480029, 480040, + 480052, 480062, 480073, 480084, 480096, 480107, 480119, 480131, + 480144, 480153, 480163, 480173, 480184, 480194, 480205, 480216, + 480228, 480238, 480249, 480260, 480272, 480283, 480295, 480307, + 480320, 480330, 480341, 480352, 480364, 480375, 480387, 480399, + 480412, 480423, 480435, 480447, 480460, 480472, 480485, 480498, + 480512, 480519, 480527, 480535, 480544, 480552, 480561, 480570, + 480580, 480588, 480597, 480606, 480616, 480625, 480635, 480645, + 480656, 480664, 480673, 480682, 480692, 480701, 480711, 480721, + 480732, 480741, 480751, 480761, 480772, 480782, 480793, 480804, + 480816, 480824, 480833, 480842, 480852, 480861, 480871, 480881, + 480892, 480901, 480911, 480921, 480932, 480942, 480953, 480964, + 480976, 480985, 480995, 481005, 481016, 481026, 481037, 481048, + 481060, 481070, 481081, 481092, 481104, 481115, 481127, 481139, + 481152, 481160, 481169, 481178, 481188, 481197, 481207, 481217, + 481228, 481237, 481247, 481257, 481268, 481278, 481289, 481300, + 481312, 481321, 481331, 481341, 481352, 481362, 481373, 481384, + 481396, 481406, 481417, 481428, 481440, 481451, 481463, 481475, + 481488, 481497, 481507, 481517, 481528, 481538, 481549, 481560, + 481572, 481582, 481593, 481604, 481616, 481627, 481639, 481651, + 481664, 481674, 481685, 481696, 481708, 481719, 481731, 481743, + 481756, 481767, 481779, 481791, 481804, 481816, 481829, 481842, + 481856, 481864, 481873, 481882, 481892, 481901, 481911, 481921, + 481932, 481941, 481951, 481961, 481972, 481982, 481993, 482004, + 482016, 482025, 482035, 482045, 482056, 482066, 482077, 482088, + 482100, 482110, 482121, 482132, 482144, 482155, 482167, 482179, + 482192, 482201, 482211, 482221, 482232, 482242, 482253, 482264, + 482276, 482286, 482297, 482308, 482320, 482331, 482343, 482355, + 482368, 482378, 482389, 482400, 482412, 482423, 482435, 482447, + 482460, 482471, 482483, 482495, 482508, 482520, 482533, 482546, + 482560, 482569, 482579, 482589, 482600, 482610, 482621, 482632, + 482644, 482654, 482665, 482676, 482688, 482699, 482711, 482723, + 482736, 482746, 482757, 482768, 482780, 482791, 482803, 482815, + 482828, 482839, 482851, 482863, 482876, 482888, 482901, 482914, + 482928, 482938, 482949, 482960, 482972, 482983, 482995, 483007, + 483020, 483031, 483043, 483055, 483068, 483080, 483093, 483106, + 483120, 483131, 483143, 483155, 483168, 483180, 483193, 483206, + 483220, 483232, 483245, 483258, 483272, 483285, 483299, 483313, + 483328, 483332, 483337, 483342, 483348, 483353, 483359, 483365, + 483372, 483377, 483383, 483389, 483396, 483402, 483409, 483416, + 483424, 483429, 483435, 483441, 483448, 483454, 483461, 483468, + 483476, 483482, 483489, 483496, 483504, 483511, 483519, 483527, + 483536, 483541, 483547, 483553, 483560, 483566, 483573, 483580, + 483588, 483594, 483601, 483608, 483616, 483623, 483631, 483639, + 483648, 483654, 483661, 483668, 483676, 483683, 483691, 483699, + 483708, 483715, 483723, 483731, 483740, 483748, 483757, 483766, + 483776, 483781, 483787, 483793, 483800, 483806, 483813, 483820, + 483828, 483834, 483841, 483848, 483856, 483863, 483871, 483879, + 483888, 483894, 483901, 483908, 483916, 483923, 483931, 483939, + 483948, 483955, 483963, 483971, 483980, 483988, 483997, 484006, + 484016, 484022, 484029, 484036, 484044, 484051, 484059, 484067, + 484076, 484083, 484091, 484099, 484108, 484116, 484125, 484134, + 484144, 484151, 484159, 484167, 484176, 484184, 484193, 484202, + 484212, 484220, 484229, 484238, 484248, 484257, 484267, 484277, + 484288, 484293, 484299, 484305, 484312, 484318, 484325, 484332, + 484340, 484346, 484353, 484360, 484368, 484375, 484383, 484391, + 484400, 484406, 484413, 484420, 484428, 484435, 484443, 484451, + 484460, 484467, 484475, 484483, 484492, 484500, 484509, 484518, + 484528, 484534, 484541, 484548, 484556, 484563, 484571, 484579, + 484588, 484595, 484603, 484611, 484620, 484628, 484637, 484646, + 484656, 484663, 484671, 484679, 484688, 484696, 484705, 484714, + 484724, 484732, 484741, 484750, 484760, 484769, 484779, 484789, + 484800, 484806, 484813, 484820, 484828, 484835, 484843, 484851, + 484860, 484867, 484875, 484883, 484892, 484900, 484909, 484918, + 484928, 484935, 484943, 484951, 484960, 484968, 484977, 484986, + 484996, 485004, 485013, 485022, 485032, 485041, 485051, 485061, + 485072, 485079, 485087, 485095, 485104, 485112, 485121, 485130, + 485140, 485148, 485157, 485166, 485176, 485185, 485195, 485205, + 485216, 485224, 485233, 485242, 485252, 485261, 485271, 485281, + 485292, 485301, 485311, 485321, 485332, 485342, 485353, 485364, + 485376, 485381, 485387, 485393, 485400, 485406, 485413, 485420, + 485428, 485434, 485441, 485448, 485456, 485463, 485471, 485479, + 485488, 485494, 485501, 485508, 485516, 485523, 485531, 485539, + 485548, 485555, 485563, 485571, 485580, 485588, 485597, 485606, + 485616, 485622, 485629, 485636, 485644, 485651, 485659, 485667, + 485676, 485683, 485691, 485699, 485708, 485716, 485725, 485734, + 485744, 485751, 485759, 485767, 485776, 485784, 485793, 485802, + 485812, 485820, 485829, 485838, 485848, 485857, 485867, 485877, + 485888, 485894, 485901, 485908, 485916, 485923, 485931, 485939, + 485948, 485955, 485963, 485971, 485980, 485988, 485997, 486006, + 486016, 486023, 486031, 486039, 486048, 486056, 486065, 486074, + 486084, 486092, 486101, 486110, 486120, 486129, 486139, 486149, + 486160, 486167, 486175, 486183, 486192, 486200, 486209, 486218, + 486228, 486236, 486245, 486254, 486264, 486273, 486283, 486293, + 486304, 486312, 486321, 486330, 486340, 486349, 486359, 486369, + 486380, 486389, 486399, 486409, 486420, 486430, 486441, 486452, + 486464, 486470, 486477, 486484, 486492, 486499, 486507, 486515, + 486524, 486531, 486539, 486547, 486556, 486564, 486573, 486582, + 486592, 486599, 486607, 486615, 486624, 486632, 486641, 486650, + 486660, 486668, 486677, 486686, 486696, 486705, 486715, 486725, + 486736, 486743, 486751, 486759, 486768, 486776, 486785, 486794, + 486804, 486812, 486821, 486830, 486840, 486849, 486859, 486869, + 486880, 486888, 486897, 486906, 486916, 486925, 486935, 486945, + 486956, 486965, 486975, 486985, 486996, 487006, 487017, 487028, + 487040, 487047, 487055, 487063, 487072, 487080, 487089, 487098, + 487108, 487116, 487125, 487134, 487144, 487153, 487163, 487173, + 487184, 487192, 487201, 487210, 487220, 487229, 487239, 487249, + 487260, 487269, 487279, 487289, 487300, 487310, 487321, 487332, + 487344, 487352, 487361, 487370, 487380, 487389, 487399, 487409, + 487420, 487429, 487439, 487449, 487460, 487470, 487481, 487492, + 487504, 487513, 487523, 487533, 487544, 487554, 487565, 487576, + 487588, 487598, 487609, 487620, 487632, 487643, 487655, 487667, + 487680, 487685, 487691, 487697, 487704, 487710, 487717, 487724, + 487732, 487738, 487745, 487752, 487760, 487767, 487775, 487783, + 487792, 487798, 487805, 487812, 487820, 487827, 487835, 487843, + 487852, 487859, 487867, 487875, 487884, 487892, 487901, 487910, + 487920, 487926, 487933, 487940, 487948, 487955, 487963, 487971, + 487980, 487987, 487995, 488003, 488012, 488020, 488029, 488038, + 488048, 488055, 488063, 488071, 488080, 488088, 488097, 488106, + 488116, 488124, 488133, 488142, 488152, 488161, 488171, 488181, + 488192, 488198, 488205, 488212, 488220, 488227, 488235, 488243, + 488252, 488259, 488267, 488275, 488284, 488292, 488301, 488310, + 488320, 488327, 488335, 488343, 488352, 488360, 488369, 488378, + 488388, 488396, 488405, 488414, 488424, 488433, 488443, 488453, + 488464, 488471, 488479, 488487, 488496, 488504, 488513, 488522, + 488532, 488540, 488549, 488558, 488568, 488577, 488587, 488597, + 488608, 488616, 488625, 488634, 488644, 488653, 488663, 488673, + 488684, 488693, 488703, 488713, 488724, 488734, 488745, 488756, + 488768, 488774, 488781, 488788, 488796, 488803, 488811, 488819, + 488828, 488835, 488843, 488851, 488860, 488868, 488877, 488886, + 488896, 488903, 488911, 488919, 488928, 488936, 488945, 488954, + 488964, 488972, 488981, 488990, 489000, 489009, 489019, 489029, + 489040, 489047, 489055, 489063, 489072, 489080, 489089, 489098, + 489108, 489116, 489125, 489134, 489144, 489153, 489163, 489173, + 489184, 489192, 489201, 489210, 489220, 489229, 489239, 489249, + 489260, 489269, 489279, 489289, 489300, 489310, 489321, 489332, + 489344, 489351, 489359, 489367, 489376, 489384, 489393, 489402, + 489412, 489420, 489429, 489438, 489448, 489457, 489467, 489477, + 489488, 489496, 489505, 489514, 489524, 489533, 489543, 489553, + 489564, 489573, 489583, 489593, 489604, 489614, 489625, 489636, + 489648, 489656, 489665, 489674, 489684, 489693, 489703, 489713, + 489724, 489733, 489743, 489753, 489764, 489774, 489785, 489796, + 489808, 489817, 489827, 489837, 489848, 489858, 489869, 489880, + 489892, 489902, 489913, 489924, 489936, 489947, 489959, 489971, + 489984, 489990, 489997, 490004, 490012, 490019, 490027, 490035, + 490044, 490051, 490059, 490067, 490076, 490084, 490093, 490102, + 490112, 490119, 490127, 490135, 490144, 490152, 490161, 490170, + 490180, 490188, 490197, 490206, 490216, 490225, 490235, 490245, + 490256, 490263, 490271, 490279, 490288, 490296, 490305, 490314, + 490324, 490332, 490341, 490350, 490360, 490369, 490379, 490389, + 490400, 490408, 490417, 490426, 490436, 490445, 490455, 490465, + 490476, 490485, 490495, 490505, 490516, 490526, 490537, 490548, + 490560, 490567, 490575, 490583, 490592, 490600, 490609, 490618, + 490628, 490636, 490645, 490654, 490664, 490673, 490683, 490693, + 490704, 490712, 490721, 490730, 490740, 490749, 490759, 490769, + 490780, 490789, 490799, 490809, 490820, 490830, 490841, 490852, + 490864, 490872, 490881, 490890, 490900, 490909, 490919, 490929, + 490940, 490949, 490959, 490969, 490980, 490990, 491001, 491012, + 491024, 491033, 491043, 491053, 491064, 491074, 491085, 491096, + 491108, 491118, 491129, 491140, 491152, 491163, 491175, 491187, + 491200, 491207, 491215, 491223, 491232, 491240, 491249, 491258, + 491268, 491276, 491285, 491294, 491304, 491313, 491323, 491333, + 491344, 491352, 491361, 491370, 491380, 491389, 491399, 491409, + 491420, 491429, 491439, 491449, 491460, 491470, 491481, 491492, + 491504, 491512, 491521, 491530, 491540, 491549, 491559, 491569, + 491580, 491589, 491599, 491609, 491620, 491630, 491641, 491652, + 491664, 491673, 491683, 491693, 491704, 491714, 491725, 491736, + 491748, 491758, 491769, 491780, 491792, 491803, 491815, 491827, + 491840, 491848, 491857, 491866, 491876, 491885, 491895, 491905, + 491916, 491925, 491935, 491945, 491956, 491966, 491977, 491988, + 492000, 492009, 492019, 492029, 492040, 492050, 492061, 492072, + 492084, 492094, 492105, 492116, 492128, 492139, 492151, 492163, + 492176, 492185, 492195, 492205, 492216, 492226, 492237, 492248, + 492260, 492270, 492281, 492292, 492304, 492315, 492327, 492339, + 492352, 492362, 492373, 492384, 492396, 492407, 492419, 492431, + 492444, 492455, 492467, 492479, 492492, 492504, 492517, 492530, + 492544, 492549, 492555, 492561, 492568, 492574, 492581, 492588, + 492596, 492602, 492609, 492616, 492624, 492631, 492639, 492647, + 492656, 492662, 492669, 492676, 492684, 492691, 492699, 492707, + 492716, 492723, 492731, 492739, 492748, 492756, 492765, 492774, + 492784, 492790, 492797, 492804, 492812, 492819, 492827, 492835, + 492844, 492851, 492859, 492867, 492876, 492884, 492893, 492902, + 492912, 492919, 492927, 492935, 492944, 492952, 492961, 492970, + 492980, 492988, 492997, 493006, 493016, 493025, 493035, 493045, + 493056, 493062, 493069, 493076, 493084, 493091, 493099, 493107, + 493116, 493123, 493131, 493139, 493148, 493156, 493165, 493174, + 493184, 493191, 493199, 493207, 493216, 493224, 493233, 493242, + 493252, 493260, 493269, 493278, 493288, 493297, 493307, 493317, + 493328, 493335, 493343, 493351, 493360, 493368, 493377, 493386, + 493396, 493404, 493413, 493422, 493432, 493441, 493451, 493461, + 493472, 493480, 493489, 493498, 493508, 493517, 493527, 493537, + 493548, 493557, 493567, 493577, 493588, 493598, 493609, 493620, + 493632, 493638, 493645, 493652, 493660, 493667, 493675, 493683, + 493692, 493699, 493707, 493715, 493724, 493732, 493741, 493750, + 493760, 493767, 493775, 493783, 493792, 493800, 493809, 493818, + 493828, 493836, 493845, 493854, 493864, 493873, 493883, 493893, + 493904, 493911, 493919, 493927, 493936, 493944, 493953, 493962, + 493972, 493980, 493989, 493998, 494008, 494017, 494027, 494037, + 494048, 494056, 494065, 494074, 494084, 494093, 494103, 494113, + 494124, 494133, 494143, 494153, 494164, 494174, 494185, 494196, + 494208, 494215, 494223, 494231, 494240, 494248, 494257, 494266, + 494276, 494284, 494293, 494302, 494312, 494321, 494331, 494341, + 494352, 494360, 494369, 494378, 494388, 494397, 494407, 494417, + 494428, 494437, 494447, 494457, 494468, 494478, 494489, 494500, + 494512, 494520, 494529, 494538, 494548, 494557, 494567, 494577, + 494588, 494597, 494607, 494617, 494628, 494638, 494649, 494660, + 494672, 494681, 494691, 494701, 494712, 494722, 494733, 494744, + 494756, 494766, 494777, 494788, 494800, 494811, 494823, 494835, + 494848, 494854, 494861, 494868, 494876, 494883, 494891, 494899, + 494908, 494915, 494923, 494931, 494940, 494948, 494957, 494966, + 494976, 494983, 494991, 494999, 495008, 495016, 495025, 495034, + 495044, 495052, 495061, 495070, 495080, 495089, 495099, 495109, + 495120, 495127, 495135, 495143, 495152, 495160, 495169, 495178, + 495188, 495196, 495205, 495214, 495224, 495233, 495243, 495253, + 495264, 495272, 495281, 495290, 495300, 495309, 495319, 495329, + 495340, 495349, 495359, 495369, 495380, 495390, 495401, 495412, + 495424, 495431, 495439, 495447, 495456, 495464, 495473, 495482, + 495492, 495500, 495509, 495518, 495528, 495537, 495547, 495557, + 495568, 495576, 495585, 495594, 495604, 495613, 495623, 495633, + 495644, 495653, 495663, 495673, 495684, 495694, 495705, 495716, + 495728, 495736, 495745, 495754, 495764, 495773, 495783, 495793, + 495804, 495813, 495823, 495833, 495844, 495854, 495865, 495876, + 495888, 495897, 495907, 495917, 495928, 495938, 495949, 495960, + 495972, 495982, 495993, 496004, 496016, 496027, 496039, 496051, + 496064, 496071, 496079, 496087, 496096, 496104, 496113, 496122, + 496132, 496140, 496149, 496158, 496168, 496177, 496187, 496197, + 496208, 496216, 496225, 496234, 496244, 496253, 496263, 496273, + 496284, 496293, 496303, 496313, 496324, 496334, 496345, 496356, + 496368, 496376, 496385, 496394, 496404, 496413, 496423, 496433, + 496444, 496453, 496463, 496473, 496484, 496494, 496505, 496516, + 496528, 496537, 496547, 496557, 496568, 496578, 496589, 496600, + 496612, 496622, 496633, 496644, 496656, 496667, 496679, 496691, + 496704, 496712, 496721, 496730, 496740, 496749, 496759, 496769, + 496780, 496789, 496799, 496809, 496820, 496830, 496841, 496852, + 496864, 496873, 496883, 496893, 496904, 496914, 496925, 496936, + 496948, 496958, 496969, 496980, 496992, 497003, 497015, 497027, + 497040, 497049, 497059, 497069, 497080, 497090, 497101, 497112, + 497124, 497134, 497145, 497156, 497168, 497179, 497191, 497203, + 497216, 497226, 497237, 497248, 497260, 497271, 497283, 497295, + 497308, 497319, 497331, 497343, 497356, 497368, 497381, 497394, + 497408, 497414, 497421, 497428, 497436, 497443, 497451, 497459, + 497468, 497475, 497483, 497491, 497500, 497508, 497517, 497526, + 497536, 497543, 497551, 497559, 497568, 497576, 497585, 497594, + 497604, 497612, 497621, 497630, 497640, 497649, 497659, 497669, + 497680, 497687, 497695, 497703, 497712, 497720, 497729, 497738, + 497748, 497756, 497765, 497774, 497784, 497793, 497803, 497813, + 497824, 497832, 497841, 497850, 497860, 497869, 497879, 497889, + 497900, 497909, 497919, 497929, 497940, 497950, 497961, 497972, + 497984, 497991, 497999, 498007, 498016, 498024, 498033, 498042, + 498052, 498060, 498069, 498078, 498088, 498097, 498107, 498117, + 498128, 498136, 498145, 498154, 498164, 498173, 498183, 498193, + 498204, 498213, 498223, 498233, 498244, 498254, 498265, 498276, + 498288, 498296, 498305, 498314, 498324, 498333, 498343, 498353, + 498364, 498373, 498383, 498393, 498404, 498414, 498425, 498436, + 498448, 498457, 498467, 498477, 498488, 498498, 498509, 498520, + 498532, 498542, 498553, 498564, 498576, 498587, 498599, 498611, + 498624, 498631, 498639, 498647, 498656, 498664, 498673, 498682, + 498692, 498700, 498709, 498718, 498728, 498737, 498747, 498757, + 498768, 498776, 498785, 498794, 498804, 498813, 498823, 498833, + 498844, 498853, 498863, 498873, 498884, 498894, 498905, 498916, + 498928, 498936, 498945, 498954, 498964, 498973, 498983, 498993, + 499004, 499013, 499023, 499033, 499044, 499054, 499065, 499076, + 499088, 499097, 499107, 499117, 499128, 499138, 499149, 499160, + 499172, 499182, 499193, 499204, 499216, 499227, 499239, 499251, + 499264, 499272, 499281, 499290, 499300, 499309, 499319, 499329, + 499340, 499349, 499359, 499369, 499380, 499390, 499401, 499412, + 499424, 499433, 499443, 499453, 499464, 499474, 499485, 499496, + 499508, 499518, 499529, 499540, 499552, 499563, 499575, 499587, + 499600, 499609, 499619, 499629, 499640, 499650, 499661, 499672, + 499684, 499694, 499705, 499716, 499728, 499739, 499751, 499763, + 499776, 499786, 499797, 499808, 499820, 499831, 499843, 499855, + 499868, 499879, 499891, 499903, 499916, 499928, 499941, 499954, + 499968, 499975, 499983, 499991, 500000, 500008, 500017, 500026, + 500036, 500044, 500053, 500062, 500072, 500081, 500091, 500101, + 500112, 500120, 500129, 500138, 500148, 500157, 500167, 500177, + 500188, 500197, 500207, 500217, 500228, 500238, 500249, 500260, + 500272, 500280, 500289, 500298, 500308, 500317, 500327, 500337, + 500348, 500357, 500367, 500377, 500388, 500398, 500409, 500420, + 500432, 500441, 500451, 500461, 500472, 500482, 500493, 500504, + 500516, 500526, 500537, 500548, 500560, 500571, 500583, 500595, + 500608, 500616, 500625, 500634, 500644, 500653, 500663, 500673, + 500684, 500693, 500703, 500713, 500724, 500734, 500745, 500756, + 500768, 500777, 500787, 500797, 500808, 500818, 500829, 500840, + 500852, 500862, 500873, 500884, 500896, 500907, 500919, 500931, + 500944, 500953, 500963, 500973, 500984, 500994, 501005, 501016, + 501028, 501038, 501049, 501060, 501072, 501083, 501095, 501107, + 501120, 501130, 501141, 501152, 501164, 501175, 501187, 501199, + 501212, 501223, 501235, 501247, 501260, 501272, 501285, 501298, + 501312, 501320, 501329, 501338, 501348, 501357, 501367, 501377, + 501388, 501397, 501407, 501417, 501428, 501438, 501449, 501460, + 501472, 501481, 501491, 501501, 501512, 501522, 501533, 501544, + 501556, 501566, 501577, 501588, 501600, 501611, 501623, 501635, + 501648, 501657, 501667, 501677, 501688, 501698, 501709, 501720, + 501732, 501742, 501753, 501764, 501776, 501787, 501799, 501811, + 501824, 501834, 501845, 501856, 501868, 501879, 501891, 501903, + 501916, 501927, 501939, 501951, 501964, 501976, 501989, 502002, + 502016, 502025, 502035, 502045, 502056, 502066, 502077, 502088, + 502100, 502110, 502121, 502132, 502144, 502155, 502167, 502179, + 502192, 502202, 502213, 502224, 502236, 502247, 502259, 502271, + 502284, 502295, 502307, 502319, 502332, 502344, 502357, 502370, + 502384, 502394, 502405, 502416, 502428, 502439, 502451, 502463, + 502476, 502487, 502499, 502511, 502524, 502536, 502549, 502562, + 502576, 502587, 502599, 502611, 502624, 502636, 502649, 502662, + 502676, 502688, 502701, 502714, 502728, 502741, 502755, 502769, + 502784, 502789, 502795, 502801, 502808, 502814, 502821, 502828, + 502836, 502842, 502849, 502856, 502864, 502871, 502879, 502887, + 502896, 502902, 502909, 502916, 502924, 502931, 502939, 502947, + 502956, 502963, 502971, 502979, 502988, 502996, 503005, 503014, + 503024, 503030, 503037, 503044, 503052, 503059, 503067, 503075, + 503084, 503091, 503099, 503107, 503116, 503124, 503133, 503142, + 503152, 503159, 503167, 503175, 503184, 503192, 503201, 503210, + 503220, 503228, 503237, 503246, 503256, 503265, 503275, 503285, + 503296, 503302, 503309, 503316, 503324, 503331, 503339, 503347, + 503356, 503363, 503371, 503379, 503388, 503396, 503405, 503414, + 503424, 503431, 503439, 503447, 503456, 503464, 503473, 503482, + 503492, 503500, 503509, 503518, 503528, 503537, 503547, 503557, + 503568, 503575, 503583, 503591, 503600, 503608, 503617, 503626, + 503636, 503644, 503653, 503662, 503672, 503681, 503691, 503701, + 503712, 503720, 503729, 503738, 503748, 503757, 503767, 503777, + 503788, 503797, 503807, 503817, 503828, 503838, 503849, 503860, + 503872, 503878, 503885, 503892, 503900, 503907, 503915, 503923, + 503932, 503939, 503947, 503955, 503964, 503972, 503981, 503990, + 504000, 504007, 504015, 504023, 504032, 504040, 504049, 504058, + 504068, 504076, 504085, 504094, 504104, 504113, 504123, 504133, + 504144, 504151, 504159, 504167, 504176, 504184, 504193, 504202, + 504212, 504220, 504229, 504238, 504248, 504257, 504267, 504277, + 504288, 504296, 504305, 504314, 504324, 504333, 504343, 504353, + 504364, 504373, 504383, 504393, 504404, 504414, 504425, 504436, + 504448, 504455, 504463, 504471, 504480, 504488, 504497, 504506, + 504516, 504524, 504533, 504542, 504552, 504561, 504571, 504581, + 504592, 504600, 504609, 504618, 504628, 504637, 504647, 504657, + 504668, 504677, 504687, 504697, 504708, 504718, 504729, 504740, + 504752, 504760, 504769, 504778, 504788, 504797, 504807, 504817, + 504828, 504837, 504847, 504857, 504868, 504878, 504889, 504900, + 504912, 504921, 504931, 504941, 504952, 504962, 504973, 504984, + 504996, 505006, 505017, 505028, 505040, 505051, 505063, 505075, + 505088, 505094, 505101, 505108, 505116, 505123, 505131, 505139, + 505148, 505155, 505163, 505171, 505180, 505188, 505197, 505206, + 505216, 505223, 505231, 505239, 505248, 505256, 505265, 505274, + 505284, 505292, 505301, 505310, 505320, 505329, 505339, 505349, + 505360, 505367, 505375, 505383, 505392, 505400, 505409, 505418, + 505428, 505436, 505445, 505454, 505464, 505473, 505483, 505493, + 505504, 505512, 505521, 505530, 505540, 505549, 505559, 505569, + 505580, 505589, 505599, 505609, 505620, 505630, 505641, 505652, + 505664, 505671, 505679, 505687, 505696, 505704, 505713, 505722, + 505732, 505740, 505749, 505758, 505768, 505777, 505787, 505797, + 505808, 505816, 505825, 505834, 505844, 505853, 505863, 505873, + 505884, 505893, 505903, 505913, 505924, 505934, 505945, 505956, + 505968, 505976, 505985, 505994, 506004, 506013, 506023, 506033, + 506044, 506053, 506063, 506073, 506084, 506094, 506105, 506116, + 506128, 506137, 506147, 506157, 506168, 506178, 506189, 506200, + 506212, 506222, 506233, 506244, 506256, 506267, 506279, 506291, + 506304, 506311, 506319, 506327, 506336, 506344, 506353, 506362, + 506372, 506380, 506389, 506398, 506408, 506417, 506427, 506437, + 506448, 506456, 506465, 506474, 506484, 506493, 506503, 506513, + 506524, 506533, 506543, 506553, 506564, 506574, 506585, 506596, + 506608, 506616, 506625, 506634, 506644, 506653, 506663, 506673, + 506684, 506693, 506703, 506713, 506724, 506734, 506745, 506756, + 506768, 506777, 506787, 506797, 506808, 506818, 506829, 506840, + 506852, 506862, 506873, 506884, 506896, 506907, 506919, 506931, + 506944, 506952, 506961, 506970, 506980, 506989, 506999, 507009, + 507020, 507029, 507039, 507049, 507060, 507070, 507081, 507092, + 507104, 507113, 507123, 507133, 507144, 507154, 507165, 507176, + 507188, 507198, 507209, 507220, 507232, 507243, 507255, 507267, + 507280, 507289, 507299, 507309, 507320, 507330, 507341, 507352, + 507364, 507374, 507385, 507396, 507408, 507419, 507431, 507443, + 507456, 507466, 507477, 507488, 507500, 507511, 507523, 507535, + 507548, 507559, 507571, 507583, 507596, 507608, 507621, 507634, + 507648, 507654, 507661, 507668, 507676, 507683, 507691, 507699, + 507708, 507715, 507723, 507731, 507740, 507748, 507757, 507766, + 507776, 507783, 507791, 507799, 507808, 507816, 507825, 507834, + 507844, 507852, 507861, 507870, 507880, 507889, 507899, 507909, + 507920, 507927, 507935, 507943, 507952, 507960, 507969, 507978, + 507988, 507996, 508005, 508014, 508024, 508033, 508043, 508053, + 508064, 508072, 508081, 508090, 508100, 508109, 508119, 508129, + 508140, 508149, 508159, 508169, 508180, 508190, 508201, 508212, + 508224, 508231, 508239, 508247, 508256, 508264, 508273, 508282, + 508292, 508300, 508309, 508318, 508328, 508337, 508347, 508357, + 508368, 508376, 508385, 508394, 508404, 508413, 508423, 508433, + 508444, 508453, 508463, 508473, 508484, 508494, 508505, 508516, + 508528, 508536, 508545, 508554, 508564, 508573, 508583, 508593, + 508604, 508613, 508623, 508633, 508644, 508654, 508665, 508676, + 508688, 508697, 508707, 508717, 508728, 508738, 508749, 508760, + 508772, 508782, 508793, 508804, 508816, 508827, 508839, 508851, + 508864, 508871, 508879, 508887, 508896, 508904, 508913, 508922, + 508932, 508940, 508949, 508958, 508968, 508977, 508987, 508997, + 509008, 509016, 509025, 509034, 509044, 509053, 509063, 509073, + 509084, 509093, 509103, 509113, 509124, 509134, 509145, 509156, + 509168, 509176, 509185, 509194, 509204, 509213, 509223, 509233, + 509244, 509253, 509263, 509273, 509284, 509294, 509305, 509316, + 509328, 509337, 509347, 509357, 509368, 509378, 509389, 509400, + 509412, 509422, 509433, 509444, 509456, 509467, 509479, 509491, + 509504, 509512, 509521, 509530, 509540, 509549, 509559, 509569, + 509580, 509589, 509599, 509609, 509620, 509630, 509641, 509652, + 509664, 509673, 509683, 509693, 509704, 509714, 509725, 509736, + 509748, 509758, 509769, 509780, 509792, 509803, 509815, 509827, + 509840, 509849, 509859, 509869, 509880, 509890, 509901, 509912, + 509924, 509934, 509945, 509956, 509968, 509979, 509991, 510003, + 510016, 510026, 510037, 510048, 510060, 510071, 510083, 510095, + 510108, 510119, 510131, 510143, 510156, 510168, 510181, 510194, + 510208, 510215, 510223, 510231, 510240, 510248, 510257, 510266, + 510276, 510284, 510293, 510302, 510312, 510321, 510331, 510341, + 510352, 510360, 510369, 510378, 510388, 510397, 510407, 510417, + 510428, 510437, 510447, 510457, 510468, 510478, 510489, 510500, + 510512, 510520, 510529, 510538, 510548, 510557, 510567, 510577, + 510588, 510597, 510607, 510617, 510628, 510638, 510649, 510660, + 510672, 510681, 510691, 510701, 510712, 510722, 510733, 510744, + 510756, 510766, 510777, 510788, 510800, 510811, 510823, 510835, + 510848, 510856, 510865, 510874, 510884, 510893, 510903, 510913, + 510924, 510933, 510943, 510953, 510964, 510974, 510985, 510996, + 511008, 511017, 511027, 511037, 511048, 511058, 511069, 511080, + 511092, 511102, 511113, 511124, 511136, 511147, 511159, 511171, + 511184, 511193, 511203, 511213, 511224, 511234, 511245, 511256, + 511268, 511278, 511289, 511300, 511312, 511323, 511335, 511347, + 511360, 511370, 511381, 511392, 511404, 511415, 511427, 511439, + 511452, 511463, 511475, 511487, 511500, 511512, 511525, 511538, + 511552, 511560, 511569, 511578, 511588, 511597, 511607, 511617, + 511628, 511637, 511647, 511657, 511668, 511678, 511689, 511700, + 511712, 511721, 511731, 511741, 511752, 511762, 511773, 511784, + 511796, 511806, 511817, 511828, 511840, 511851, 511863, 511875, + 511888, 511897, 511907, 511917, 511928, 511938, 511949, 511960, + 511972, 511982, 511993, 512004, 512016, 512027, 512039, 512051, + 512064, 512074, 512085, 512096, 512108, 512119, 512131, 512143, + 512156, 512167, 512179, 512191, 512204, 512216, 512229, 512242, + 512256, 512265, 512275, 512285, 512296, 512306, 512317, 512328, + 512340, 512350, 512361, 512372, 512384, 512395, 512407, 512419, + 512432, 512442, 512453, 512464, 512476, 512487, 512499, 512511, + 512524, 512535, 512547, 512559, 512572, 512584, 512597, 512610, + 512624, 512634, 512645, 512656, 512668, 512679, 512691, 512703, + 512716, 512727, 512739, 512751, 512764, 512776, 512789, 512802, + 512816, 512827, 512839, 512851, 512864, 512876, 512889, 512902, + 512916, 512928, 512941, 512954, 512968, 512981, 512995, 513009, + 513024, 513030, 513037, 513044, 513052, 513059, 513067, 513075, + 513084, 513091, 513099, 513107, 513116, 513124, 513133, 513142, + 513152, 513159, 513167, 513175, 513184, 513192, 513201, 513210, + 513220, 513228, 513237, 513246, 513256, 513265, 513275, 513285, + 513296, 513303, 513311, 513319, 513328, 513336, 513345, 513354, + 513364, 513372, 513381, 513390, 513400, 513409, 513419, 513429, + 513440, 513448, 513457, 513466, 513476, 513485, 513495, 513505, + 513516, 513525, 513535, 513545, 513556, 513566, 513577, 513588, + 513600, 513607, 513615, 513623, 513632, 513640, 513649, 513658, + 513668, 513676, 513685, 513694, 513704, 513713, 513723, 513733, + 513744, 513752, 513761, 513770, 513780, 513789, 513799, 513809, + 513820, 513829, 513839, 513849, 513860, 513870, 513881, 513892, + 513904, 513912, 513921, 513930, 513940, 513949, 513959, 513969, + 513980, 513989, 513999, 514009, 514020, 514030, 514041, 514052, + 514064, 514073, 514083, 514093, 514104, 514114, 514125, 514136, + 514148, 514158, 514169, 514180, 514192, 514203, 514215, 514227, + 514240, 514247, 514255, 514263, 514272, 514280, 514289, 514298, + 514308, 514316, 514325, 514334, 514344, 514353, 514363, 514373, + 514384, 514392, 514401, 514410, 514420, 514429, 514439, 514449, + 514460, 514469, 514479, 514489, 514500, 514510, 514521, 514532, + 514544, 514552, 514561, 514570, 514580, 514589, 514599, 514609, + 514620, 514629, 514639, 514649, 514660, 514670, 514681, 514692, + 514704, 514713, 514723, 514733, 514744, 514754, 514765, 514776, + 514788, 514798, 514809, 514820, 514832, 514843, 514855, 514867, + 514880, 514888, 514897, 514906, 514916, 514925, 514935, 514945, + 514956, 514965, 514975, 514985, 514996, 515006, 515017, 515028, + 515040, 515049, 515059, 515069, 515080, 515090, 515101, 515112, + 515124, 515134, 515145, 515156, 515168, 515179, 515191, 515203, + 515216, 515225, 515235, 515245, 515256, 515266, 515277, 515288, + 515300, 515310, 515321, 515332, 515344, 515355, 515367, 515379, + 515392, 515402, 515413, 515424, 515436, 515447, 515459, 515471, + 515484, 515495, 515507, 515519, 515532, 515544, 515557, 515570, + 515584, 515591, 515599, 515607, 515616, 515624, 515633, 515642, + 515652, 515660, 515669, 515678, 515688, 515697, 515707, 515717, + 515728, 515736, 515745, 515754, 515764, 515773, 515783, 515793, + 515804, 515813, 515823, 515833, 515844, 515854, 515865, 515876, + 515888, 515896, 515905, 515914, 515924, 515933, 515943, 515953, + 515964, 515973, 515983, 515993, 516004, 516014, 516025, 516036, + 516048, 516057, 516067, 516077, 516088, 516098, 516109, 516120, + 516132, 516142, 516153, 516164, 516176, 516187, 516199, 516211, + 516224, 516232, 516241, 516250, 516260, 516269, 516279, 516289, + 516300, 516309, 516319, 516329, 516340, 516350, 516361, 516372, + 516384, 516393, 516403, 516413, 516424, 516434, 516445, 516456, + 516468, 516478, 516489, 516500, 516512, 516523, 516535, 516547, + 516560, 516569, 516579, 516589, 516600, 516610, 516621, 516632, + 516644, 516654, 516665, 516676, 516688, 516699, 516711, 516723, + 516736, 516746, 516757, 516768, 516780, 516791, 516803, 516815, + 516828, 516839, 516851, 516863, 516876, 516888, 516901, 516914, + 516928, 516936, 516945, 516954, 516964, 516973, 516983, 516993, + 517004, 517013, 517023, 517033, 517044, 517054, 517065, 517076, + 517088, 517097, 517107, 517117, 517128, 517138, 517149, 517160, + 517172, 517182, 517193, 517204, 517216, 517227, 517239, 517251, + 517264, 517273, 517283, 517293, 517304, 517314, 517325, 517336, + 517348, 517358, 517369, 517380, 517392, 517403, 517415, 517427, + 517440, 517450, 517461, 517472, 517484, 517495, 517507, 517519, + 517532, 517543, 517555, 517567, 517580, 517592, 517605, 517618, + 517632, 517641, 517651, 517661, 517672, 517682, 517693, 517704, + 517716, 517726, 517737, 517748, 517760, 517771, 517783, 517795, + 517808, 517818, 517829, 517840, 517852, 517863, 517875, 517887, + 517900, 517911, 517923, 517935, 517948, 517960, 517973, 517986, + 518000, 518010, 518021, 518032, 518044, 518055, 518067, 518079, + 518092, 518103, 518115, 518127, 518140, 518152, 518165, 518178, + 518192, 518203, 518215, 518227, 518240, 518252, 518265, 518278, + 518292, 518304, 518317, 518330, 518344, 518357, 518371, 518385, + 518400, 518407, 518415, 518423, 518432, 518440, 518449, 518458, + 518468, 518476, 518485, 518494, 518504, 518513, 518523, 518533, + 518544, 518552, 518561, 518570, 518580, 518589, 518599, 518609, + 518620, 518629, 518639, 518649, 518660, 518670, 518681, 518692, + 518704, 518712, 518721, 518730, 518740, 518749, 518759, 518769, + 518780, 518789, 518799, 518809, 518820, 518830, 518841, 518852, + 518864, 518873, 518883, 518893, 518904, 518914, 518925, 518936, + 518948, 518958, 518969, 518980, 518992, 519003, 519015, 519027, + 519040, 519048, 519057, 519066, 519076, 519085, 519095, 519105, + 519116, 519125, 519135, 519145, 519156, 519166, 519177, 519188, + 519200, 519209, 519219, 519229, 519240, 519250, 519261, 519272, + 519284, 519294, 519305, 519316, 519328, 519339, 519351, 519363, + 519376, 519385, 519395, 519405, 519416, 519426, 519437, 519448, + 519460, 519470, 519481, 519492, 519504, 519515, 519527, 519539, + 519552, 519562, 519573, 519584, 519596, 519607, 519619, 519631, + 519644, 519655, 519667, 519679, 519692, 519704, 519717, 519730, + 519744, 519752, 519761, 519770, 519780, 519789, 519799, 519809, + 519820, 519829, 519839, 519849, 519860, 519870, 519881, 519892, + 519904, 519913, 519923, 519933, 519944, 519954, 519965, 519976, + 519988, 519998, 520009, 520020, 520032, 520043, 520055, 520067, + 520080, 520089, 520099, 520109, 520120, 520130, 520141, 520152, + 520164, 520174, 520185, 520196, 520208, 520219, 520231, 520243, + 520256, 520266, 520277, 520288, 520300, 520311, 520323, 520335, + 520348, 520359, 520371, 520383, 520396, 520408, 520421, 520434, + 520448, 520457, 520467, 520477, 520488, 520498, 520509, 520520, + 520532, 520542, 520553, 520564, 520576, 520587, 520599, 520611, + 520624, 520634, 520645, 520656, 520668, 520679, 520691, 520703, + 520716, 520727, 520739, 520751, 520764, 520776, 520789, 520802, + 520816, 520826, 520837, 520848, 520860, 520871, 520883, 520895, + 520908, 520919, 520931, 520943, 520956, 520968, 520981, 520994, + 521008, 521019, 521031, 521043, 521056, 521068, 521081, 521094, + 521108, 521120, 521133, 521146, 521160, 521173, 521187, 521201, + 521216, 521224, 521233, 521242, 521252, 521261, 521271, 521281, + 521292, 521301, 521311, 521321, 521332, 521342, 521353, 521364, + 521376, 521385, 521395, 521405, 521416, 521426, 521437, 521448, + 521460, 521470, 521481, 521492, 521504, 521515, 521527, 521539, + 521552, 521561, 521571, 521581, 521592, 521602, 521613, 521624, + 521636, 521646, 521657, 521668, 521680, 521691, 521703, 521715, + 521728, 521738, 521749, 521760, 521772, 521783, 521795, 521807, + 521820, 521831, 521843, 521855, 521868, 521880, 521893, 521906, + 521920, 521929, 521939, 521949, 521960, 521970, 521981, 521992, + 522004, 522014, 522025, 522036, 522048, 522059, 522071, 522083, + 522096, 522106, 522117, 522128, 522140, 522151, 522163, 522175, + 522188, 522199, 522211, 522223, 522236, 522248, 522261, 522274, + 522288, 522298, 522309, 522320, 522332, 522343, 522355, 522367, + 522380, 522391, 522403, 522415, 522428, 522440, 522453, 522466, + 522480, 522491, 522503, 522515, 522528, 522540, 522553, 522566, + 522580, 522592, 522605, 522618, 522632, 522645, 522659, 522673, + 522688, 522697, 522707, 522717, 522728, 522738, 522749, 522760, + 522772, 522782, 522793, 522804, 522816, 522827, 522839, 522851, + 522864, 522874, 522885, 522896, 522908, 522919, 522931, 522943, + 522956, 522967, 522979, 522991, 523004, 523016, 523029, 523042, + 523056, 523066, 523077, 523088, 523100, 523111, 523123, 523135, + 523148, 523159, 523171, 523183, 523196, 523208, 523221, 523234, + 523248, 523259, 523271, 523283, 523296, 523308, 523321, 523334, + 523348, 523360, 523373, 523386, 523400, 523413, 523427, 523441, + 523456, 523466, 523477, 523488, 523500, 523511, 523523, 523535, + 523548, 523559, 523571, 523583, 523596, 523608, 523621, 523634, + 523648, 523659, 523671, 523683, 523696, 523708, 523721, 523734, + 523748, 523760, 523773, 523786, 523800, 523813, 523827, 523841, + 523856, 523867, 523879, 523891, 523904, 523916, 523929, 523942, + 523956, 523968, 523981, 523994, 524008, 524021, 524035, 524049, + 524064, 524076, 524089, 524102, 524116, 524129, 524143, 524157, + 524172, 524185, 524199, 524213, 524228, 524242, 524257, 524272, +}; + + +static unsigned short closestData[] = { + 0, 0, 0, 2, 0, 0, 4, 0, + 4, 0, 8, 6, 0, 0, 8, 0, + 8, 0, 8, 10, 0, 8, 0, 16, + 12, 0, 16, 12, 0, 16, 17, 14, + 0, 0, 16, 0, 16, 0, 16, 18, + 0, 16, 0, 16, 20, 0, 16, 20, + 0, 16, 24, 22, 0, 16, 0, 32, + 24, 0, 32, 24, 0, 32, 24, 26, + 0, 32, 24, 0, 32, 33, 28, 0, + 32, 33, 28, 0, 32, 33, 28, 30, + 0, 0, 32, 0, 32, 0, 32, 34, + 0, 32, 0, 32, 36, 0, 32, 36, + 0, 32, 40, 38, 0, 32, 0, 32, + 40, 0, 32, 40, 0, 32, 40, 42, + 0, 32, 40, 0, 32, 48, 44, 0, + 32, 48, 44, 0, 32, 48, 49, 46, + 0, 32, 0, 64, 48, 0, 64, 48, + 0, 64, 48, 50, 0, 64, 48, 0, + 64, 48, 52, 0, 64, 48, 52, 0, + 64, 48, 56, 54, 0, 64, 48, 0, + 64, 65, 56, 0, 64, 65, 56, 0, + 64, 65, 56, 58, 0, 64, 65, 56, + 0, 64, 65, 56, 60, 0, 64, 65, + 67, 60, 0, 64, 65, 67, 60, 62, + 0, 0, 64, 0, 64, 0, 64, 66, + 0, 64, 0, 64, 68, 0, 64, 68, + 0, 64, 72, 70, 0, 64, 0, 64, + 72, 0, 64, 72, 0, 64, 72, 74, + 0, 64, 72, 0, 64, 80, 76, 0, + 64, 80, 76, 0, 64, 80, 81, 78, + 0, 64, 0, 64, 80, 0, 64, 80, + 0, 64, 80, 82, 0, 64, 80, 0, + 64, 80, 84, 0, 64, 80, 84, 0, + 64, 80, 88, 86, 0, 64, 80, 0, + 64, 96, 88, 0, 64, 96, 88, 0, + 64, 96, 88, 90, 0, 64, 96, 88, + 0, 64, 96, 97, 92, 0, 64, 96, + 97, 92, 0, 64, 96, 97, 92, 94, + 0, 64, 0, 128, 96, 0, 128, 96, + 0, 128, 96, 98, 0, 128, 96, 0, + 128, 96, 100, 0, 128, 96, 100, 0, + 128, 96, 104, 102, 0, 128, 96, 0, + 128, 96, 104, 0, 128, 96, 104, 0, + 128, 96, 104, 106, 0, 128, 96, 104, + 0, 128, 96, 112, 108, 0, 128, 96, + 112, 108, 0, 128, 96, 112, 113, 110, + 0, 128, 96, 0, 128, 129, 112, 0, + 128, 129, 112, 0, 128, 129, 112, 114, + 0, 128, 129, 112, 0, 128, 129, 112, + 116, 0, 128, 129, 112, 116, 0, 128, + 129, 112, 120, 118, 0, 128, 129, 112, + 0, 128, 129, 112, 120, 0, 128, 129, + 131, 120, 0, 128, 129, 131, 120, 122, + 0, 128, 129, 131, 120, 0, 128, 129, + 131, 120, 124, 0, 128, 129, 131, 120, + 124, 0, 128, 129, 131, 120, 124, 126, + 0, 0, 128, 0, 128, 0, 128, 130, + 0, 128, 0, 128, 132, 0, 128, 132, + 0, 128, 136, 134, 0, 128, 0, 128, + 136, 0, 128, 136, 0, 128, 136, 138, + 0, 128, 136, 0, 128, 144, 140, 0, + 128, 144, 140, 0, 128, 144, 145, 142, + 0, 128, 0, 128, 144, 0, 128, 144, + 0, 128, 144, 146, 0, 128, 144, 0, + 128, 144, 148, 0, 128, 144, 148, 0, + 128, 144, 152, 150, 0, 128, 144, 0, + 128, 160, 152, 0, 128, 160, 152, 0, + 128, 160, 152, 154, 0, 128, 160, 152, + 0, 128, 160, 161, 156, 0, 128, 160, + 161, 156, 0, 128, 160, 161, 156, 158, + 0, 128, 0, 128, 160, 0, 128, 160, + 0, 128, 160, 162, 0, 128, 160, 0, + 128, 160, 164, 0, 128, 160, 164, 0, + 128, 160, 168, 166, 0, 128, 160, 0, + 128, 160, 168, 0, 128, 160, 168, 0, + 128, 160, 168, 170, 0, 128, 160, 168, + 0, 128, 160, 176, 172, 0, 128, 160, + 176, 172, 0, 128, 160, 176, 177, 174, + 0, 128, 160, 0, 128, 192, 176, 0, + 128, 192, 176, 0, 128, 192, 176, 178, + 0, 128, 192, 176, 0, 128, 192, 176, + 180, 0, 128, 192, 176, 180, 0, 128, + 192, 176, 184, 182, 0, 128, 192, 176, + 0, 128, 192, 193, 184, 0, 128, 192, + 193, 184, 0, 128, 192, 193, 184, 186, + 0, 128, 192, 193, 184, 0, 128, 192, + 193, 184, 188, 0, 128, 192, 193, 195, + 188, 0, 128, 192, 193, 195, 188, 190, + 0, 128, 0, 256, 192, 0, 256, 192, + 0, 256, 192, 194, 0, 256, 192, 0, + 256, 192, 196, 0, 256, 192, 196, 0, + 256, 192, 200, 198, 0, 256, 192, 0, + 256, 192, 200, 0, 256, 192, 200, 0, + 256, 192, 200, 202, 0, 256, 192, 200, + 0, 256, 192, 208, 204, 0, 256, 192, + 208, 204, 0, 256, 192, 208, 209, 206, + 0, 256, 192, 0, 256, 192, 208, 0, + 256, 192, 208, 0, 256, 192, 208, 210, + 0, 256, 192, 208, 0, 256, 192, 208, + 212, 0, 256, 192, 208, 212, 0, 256, + 192, 208, 216, 214, 0, 256, 192, 208, + 0, 256, 192, 224, 216, 0, 256, 192, + 224, 216, 0, 256, 192, 224, 216, 218, + 0, 256, 192, 224, 216, 0, 256, 192, + 224, 225, 220, 0, 256, 192, 224, 225, + 220, 0, 256, 192, 224, 225, 220, 222, + 0, 256, 192, 0, 256, 257, 224, 0, + 256, 257, 224, 0, 256, 257, 224, 226, + 0, 256, 257, 224, 0, 256, 257, 224, + 228, 0, 256, 257, 224, 228, 0, 256, + 257, 224, 232, 230, 0, 256, 257, 224, + 0, 256, 257, 224, 232, 0, 256, 257, + 224, 232, 0, 256, 257, 224, 232, 234, + 0, 256, 257, 224, 232, 0, 256, 257, + 224, 240, 236, 0, 256, 257, 224, 240, + 236, 0, 256, 257, 224, 240, 241, 238, + 0, 256, 257, 224, 0, 256, 257, 224, + 240, 0, 256, 257, 259, 240, 0, 256, + 257, 259, 240, 242, 0, 256, 257, 259, + 240, 0, 256, 257, 259, 240, 244, 0, + 256, 257, 259, 240, 244, 0, 256, 257, + 259, 240, 248, 246, 0, 256, 257, 259, + 240, 0, 256, 257, 259, 240, 248, 0, + 256, 257, 259, 240, 248, 0, 256, 257, + 259, 240, 248, 250, 0, 256, 257, 259, + 263, 248, 0, 256, 257, 259, 263, 248, + 252, 0, 256, 257, 259, 263, 248, 252, + 0, 256, 257, 259, 263, 248, 252, 254, + 0, 0, 256, 0, 256, 0, 256, 258, + 0, 256, 0, 256, 260, 0, 256, 260, + 0, 256, 264, 262, 0, 256, 0, 256, + 264, 0, 256, 264, 0, 256, 264, 266, + 0, 256, 264, 0, 256, 272, 268, 0, + 256, 272, 268, 0, 256, 272, 273, 270, + 0, 256, 0, 256, 272, 0, 256, 272, + 0, 256, 272, 274, 0, 256, 272, 0, + 256, 272, 276, 0, 256, 272, 276, 0, + 256, 272, 280, 278, 0, 256, 272, 0, + 256, 288, 280, 0, 256, 288, 280, 0, + 256, 288, 280, 282, 0, 256, 288, 280, + 0, 256, 288, 289, 284, 0, 256, 288, + 289, 284, 0, 256, 288, 289, 284, 286, + 0, 256, 0, 256, 288, 0, 256, 288, + 0, 256, 288, 290, 0, 256, 288, 0, + 256, 288, 292, 0, 256, 288, 292, 0, + 256, 288, 296, 294, 0, 256, 288, 0, + 256, 288, 296, 0, 256, 288, 296, 0, + 256, 288, 296, 298, 0, 256, 288, 296, + 0, 256, 288, 304, 300, 0, 256, 288, + 304, 300, 0, 256, 288, 304, 305, 302, + 0, 256, 288, 0, 256, 320, 304, 0, + 256, 320, 304, 0, 256, 320, 304, 306, + 0, 256, 320, 304, 0, 256, 320, 304, + 308, 0, 256, 320, 304, 308, 0, 256, + 320, 304, 312, 310, 0, 256, 320, 304, + 0, 256, 320, 321, 312, 0, 256, 320, + 321, 312, 0, 256, 320, 321, 312, 314, + 0, 256, 320, 321, 312, 0, 256, 320, + 321, 312, 316, 0, 256, 320, 321, 323, + 316, 0, 256, 320, 321, 323, 316, 318, + 0, 256, 0, 256, 320, 0, 256, 320, + 0, 256, 320, 322, 0, 256, 320, 0, + 256, 320, 324, 0, 256, 320, 324, 0, + 256, 320, 328, 326, 0, 256, 320, 0, + 256, 320, 328, 0, 256, 320, 328, 0, + 256, 320, 328, 330, 0, 256, 320, 328, + 0, 256, 320, 336, 332, 0, 256, 320, + 336, 332, 0, 256, 320, 336, 337, 334, + 0, 256, 320, 0, 256, 320, 336, 0, + 256, 320, 336, 0, 256, 320, 336, 338, + 0, 256, 320, 336, 0, 256, 320, 336, + 340, 0, 256, 320, 336, 340, 0, 256, + 320, 336, 344, 342, 0, 256, 320, 336, + 0, 256, 320, 352, 344, 0, 256, 320, + 352, 344, 0, 256, 320, 352, 344, 346, + 0, 256, 320, 352, 344, 0, 256, 320, + 352, 353, 348, 0, 256, 320, 352, 353, + 348, 0, 256, 320, 352, 353, 348, 350, + 0, 256, 320, 0, 256, 384, 352, 0, + 256, 384, 352, 0, 256, 384, 352, 354, + 0, 256, 384, 352, 0, 256, 384, 352, + 356, 0, 256, 384, 352, 356, 0, 256, + 384, 352, 360, 358, 0, 256, 384, 352, + 0, 256, 384, 352, 360, 0, 256, 384, + 352, 360, 0, 256, 384, 352, 360, 362, + 0, 256, 384, 352, 360, 0, 256, 384, + 352, 368, 364, 0, 256, 384, 352, 368, + 364, 0, 256, 384, 352, 368, 369, 366, + 0, 256, 384, 352, 0, 256, 384, 385, + 368, 0, 256, 384, 385, 368, 0, 256, + 384, 385, 368, 370, 0, 256, 384, 385, + 368, 0, 256, 384, 385, 368, 372, 0, + 256, 384, 385, 368, 372, 0, 256, 384, + 385, 368, 376, 374, 0, 256, 384, 385, + 368, 0, 256, 384, 385, 368, 376, 0, + 256, 384, 385, 387, 376, 0, 256, 384, + 385, 387, 376, 378, 0, 256, 384, 385, + 387, 376, 0, 256, 384, 385, 387, 376, + 380, 0, 256, 384, 385, 387, 376, 380, + 0, 256, 384, 385, 387, 376, 380, 382, + 0, 256, 0, 512, 384, 0, 512, 384, + 0, 512, 384, 386, 0, 512, 384, 0, + 512, 384, 388, 0, 512, 384, 388, 0, + 512, 384, 392, 390, 0, 512, 384, 0, + 512, 384, 392, 0, 512, 384, 392, 0, + 512, 384, 392, 394, 0, 512, 384, 392, + 0, 512, 384, 400, 396, 0, 512, 384, + 400, 396, 0, 512, 384, 400, 401, 398, + 0, 512, 384, 0, 512, 384, 400, 0, + 512, 384, 400, 0, 512, 384, 400, 402, + 0, 512, 384, 400, 0, 512, 384, 400, + 404, 0, 512, 384, 400, 404, 0, 512, + 384, 400, 408, 406, 0, 512, 384, 400, + 0, 512, 384, 416, 408, 0, 512, 384, + 416, 408, 0, 512, 384, 416, 408, 410, + 0, 512, 384, 416, 408, 0, 512, 384, + 416, 417, 412, 0, 512, 384, 416, 417, + 412, 0, 512, 384, 416, 417, 412, 414, + 0, 512, 384, 0, 512, 384, 416, 0, + 512, 384, 416, 0, 512, 384, 416, 418, + 0, 512, 384, 416, 0, 512, 384, 416, + 420, 0, 512, 384, 416, 420, 0, 512, + 384, 416, 424, 422, 0, 512, 384, 416, + 0, 512, 384, 416, 424, 0, 512, 384, + 416, 424, 0, 512, 384, 416, 424, 426, + 0, 512, 384, 416, 424, 0, 512, 384, + 416, 432, 428, 0, 512, 384, 416, 432, + 428, 0, 512, 384, 416, 432, 433, 430, + 0, 512, 384, 416, 0, 512, 384, 448, + 432, 0, 512, 384, 448, 432, 0, 512, + 384, 448, 432, 434, 0, 512, 384, 448, + 432, 0, 512, 384, 448, 432, 436, 0, + 512, 384, 448, 432, 436, 0, 512, 384, + 448, 432, 440, 438, 0, 512, 384, 448, + 432, 0, 512, 384, 448, 449, 440, 0, + 512, 384, 448, 449, 440, 0, 512, 384, + 448, 449, 440, 442, 0, 512, 384, 448, + 449, 440, 0, 512, 384, 448, 449, 440, + 444, 0, 512, 384, 448, 449, 451, 444, + 0, 512, 384, 448, 449, 451, 444, 446, + 0, 512, 384, 0, 512, 513, 448, 0, + 512, 513, 448, 0, 512, 513, 448, 450, + 0, 512, 513, 448, 0, 512, 513, 448, + 452, 0, 512, 513, 448, 452, 0, 512, + 513, 448, 456, 454, 0, 512, 513, 448, + 0, 512, 513, 448, 456, 0, 512, 513, + 448, 456, 0, 512, 513, 448, 456, 458, + 0, 512, 513, 448, 456, 0, 512, 513, + 448, 464, 460, 0, 512, 513, 448, 464, + 460, 0, 512, 513, 448, 464, 465, 462, + 0, 512, 513, 448, 0, 512, 513, 448, + 464, 0, 512, 513, 448, 464, 0, 512, + 513, 448, 464, 466, 0, 512, 513, 448, + 464, 0, 512, 513, 448, 464, 468, 0, + 512, 513, 448, 464, 468, 0, 512, 513, + 448, 464, 472, 470, 0, 512, 513, 448, + 464, 0, 512, 513, 448, 480, 472, 0, + 512, 513, 448, 480, 472, 0, 512, 513, + 448, 480, 472, 474, 0, 512, 513, 448, + 480, 472, 0, 512, 513, 448, 480, 481, + 476, 0, 512, 513, 448, 480, 481, 476, + 0, 512, 513, 448, 480, 481, 476, 478, + 0, 512, 513, 448, 0, 512, 513, 448, + 480, 0, 512, 513, 515, 480, 0, 512, + 513, 515, 480, 482, 0, 512, 513, 515, + 480, 0, 512, 513, 515, 480, 484, 0, + 512, 513, 515, 480, 484, 0, 512, 513, + 515, 480, 488, 486, 0, 512, 513, 515, + 480, 0, 512, 513, 515, 480, 488, 0, + 512, 513, 515, 480, 488, 0, 512, 513, + 515, 480, 488, 490, 0, 512, 513, 515, + 480, 488, 0, 512, 513, 515, 480, 496, + 492, 0, 512, 513, 515, 480, 496, 492, + 0, 512, 513, 515, 480, 496, 497, 494, + 0, 512, 513, 515, 480, 0, 512, 513, + 515, 480, 496, 0, 512, 513, 515, 480, + 496, 0, 512, 513, 515, 480, 496, 498, + 0, 512, 513, 515, 519, 496, 0, 512, + 513, 515, 519, 496, 500, 0, 512, 513, + 515, 519, 496, 500, 0, 512, 513, 515, + 519, 496, 504, 502, 0, 512, 513, 515, + 519, 496, 0, 512, 513, 515, 519, 496, + 504, 0, 512, 513, 515, 519, 496, 504, + 0, 512, 513, 515, 519, 496, 504, 506, + 0, 512, 513, 515, 519, 496, 504, 0, + 512, 513, 515, 519, 496, 504, 508, 0, + 512, 513, 515, 519, 496, 504, 508, 0, + 512, 513, 515, 519, 496, 504, 508, 510, + 0, 0, 512, 0, 512, 0, 512, 514, + 0, 512, 0, 512, 516, 0, 512, 516, + 0, 512, 520, 518, 0, 512, 0, 512, + 520, 0, 512, 520, 0, 512, 520, 522, + 0, 512, 520, 0, 512, 528, 524, 0, + 512, 528, 524, 0, 512, 528, 529, 526, + 0, 512, 0, 512, 528, 0, 512, 528, + 0, 512, 528, 530, 0, 512, 528, 0, + 512, 528, 532, 0, 512, 528, 532, 0, + 512, 528, 536, 534, 0, 512, 528, 0, + 512, 544, 536, 0, 512, 544, 536, 0, + 512, 544, 536, 538, 0, 512, 544, 536, + 0, 512, 544, 545, 540, 0, 512, 544, + 545, 540, 0, 512, 544, 545, 540, 542, + 0, 512, 0, 512, 544, 0, 512, 544, + 0, 512, 544, 546, 0, 512, 544, 0, + 512, 544, 548, 0, 512, 544, 548, 0, + 512, 544, 552, 550, 0, 512, 544, 0, + 512, 544, 552, 0, 512, 544, 552, 0, + 512, 544, 552, 554, 0, 512, 544, 552, + 0, 512, 544, 560, 556, 0, 512, 544, + 560, 556, 0, 512, 544, 560, 561, 558, + 0, 512, 544, 0, 512, 576, 560, 0, + 512, 576, 560, 0, 512, 576, 560, 562, + 0, 512, 576, 560, 0, 512, 576, 560, + 564, 0, 512, 576, 560, 564, 0, 512, + 576, 560, 568, 566, 0, 512, 576, 560, + 0, 512, 576, 577, 568, 0, 512, 576, + 577, 568, 0, 512, 576, 577, 568, 570, + 0, 512, 576, 577, 568, 0, 512, 576, + 577, 568, 572, 0, 512, 576, 577, 579, + 572, 0, 512, 576, 577, 579, 572, 574, + 0, 512, 0, 512, 576, 0, 512, 576, + 0, 512, 576, 578, 0, 512, 576, 0, + 512, 576, 580, 0, 512, 576, 580, 0, + 512, 576, 584, 582, 0, 512, 576, 0, + 512, 576, 584, 0, 512, 576, 584, 0, + 512, 576, 584, 586, 0, 512, 576, 584, + 0, 512, 576, 592, 588, 0, 512, 576, + 592, 588, 0, 512, 576, 592, 593, 590, + 0, 512, 576, 0, 512, 576, 592, 0, + 512, 576, 592, 0, 512, 576, 592, 594, + 0, 512, 576, 592, 0, 512, 576, 592, + 596, 0, 512, 576, 592, 596, 0, 512, + 576, 592, 600, 598, 0, 512, 576, 592, + 0, 512, 576, 608, 600, 0, 512, 576, + 608, 600, 0, 512, 576, 608, 600, 602, + 0, 512, 576, 608, 600, 0, 512, 576, + 608, 609, 604, 0, 512, 576, 608, 609, + 604, 0, 512, 576, 608, 609, 604, 606, + 0, 512, 576, 0, 512, 640, 608, 0, + 512, 640, 608, 0, 512, 640, 608, 610, + 0, 512, 640, 608, 0, 512, 640, 608, + 612, 0, 512, 640, 608, 612, 0, 512, + 640, 608, 616, 614, 0, 512, 640, 608, + 0, 512, 640, 608, 616, 0, 512, 640, + 608, 616, 0, 512, 640, 608, 616, 618, + 0, 512, 640, 608, 616, 0, 512, 640, + 608, 624, 620, 0, 512, 640, 608, 624, + 620, 0, 512, 640, 608, 624, 625, 622, + 0, 512, 640, 608, 0, 512, 640, 641, + 624, 0, 512, 640, 641, 624, 0, 512, + 640, 641, 624, 626, 0, 512, 640, 641, + 624, 0, 512, 640, 641, 624, 628, 0, + 512, 640, 641, 624, 628, 0, 512, 640, + 641, 624, 632, 630, 0, 512, 640, 641, + 624, 0, 512, 640, 641, 624, 632, 0, + 512, 640, 641, 643, 632, 0, 512, 640, + 641, 643, 632, 634, 0, 512, 640, 641, + 643, 632, 0, 512, 640, 641, 643, 632, + 636, 0, 512, 640, 641, 643, 632, 636, + 0, 512, 640, 641, 643, 632, 636, 638, + 0, 512, 0, 512, 640, 0, 512, 640, + 0, 512, 640, 642, 0, 512, 640, 0, + 512, 640, 644, 0, 512, 640, 644, 0, + 512, 640, 648, 646, 0, 512, 640, 0, + 512, 640, 648, 0, 512, 640, 648, 0, + 512, 640, 648, 650, 0, 512, 640, 648, + 0, 512, 640, 656, 652, 0, 512, 640, + 656, 652, 0, 512, 640, 656, 657, 654, + 0, 512, 640, 0, 512, 640, 656, 0, + 512, 640, 656, 0, 512, 640, 656, 658, + 0, 512, 640, 656, 0, 512, 640, 656, + 660, 0, 512, 640, 656, 660, 0, 512, + 640, 656, 664, 662, 0, 512, 640, 656, + 0, 512, 640, 672, 664, 0, 512, 640, + 672, 664, 0, 512, 640, 672, 664, 666, + 0, 512, 640, 672, 664, 0, 512, 640, + 672, 673, 668, 0, 512, 640, 672, 673, + 668, 0, 512, 640, 672, 673, 668, 670, + 0, 512, 640, 0, 512, 640, 672, 0, + 512, 640, 672, 0, 512, 640, 672, 674, + 0, 512, 640, 672, 0, 512, 640, 672, + 676, 0, 512, 640, 672, 676, 0, 512, + 640, 672, 680, 678, 0, 512, 640, 672, + 0, 512, 640, 672, 680, 0, 512, 640, + 672, 680, 0, 512, 640, 672, 680, 682, + 0, 512, 640, 672, 680, 0, 512, 640, + 672, 688, 684, 0, 512, 640, 672, 688, + 684, 0, 512, 640, 672, 688, 689, 686, + 0, 512, 640, 672, 0, 512, 640, 704, + 688, 0, 512, 640, 704, 688, 0, 512, + 640, 704, 688, 690, 0, 512, 640, 704, + 688, 0, 512, 640, 704, 688, 692, 0, + 512, 640, 704, 688, 692, 0, 512, 640, + 704, 688, 696, 694, 0, 512, 640, 704, + 688, 0, 512, 640, 704, 705, 696, 0, + 512, 640, 704, 705, 696, 0, 512, 640, + 704, 705, 696, 698, 0, 512, 640, 704, + 705, 696, 0, 512, 640, 704, 705, 696, + 700, 0, 512, 640, 704, 705, 707, 700, + 0, 512, 640, 704, 705, 707, 700, 702, + 0, 512, 640, 0, 512, 768, 704, 0, + 512, 768, 704, 0, 512, 768, 704, 706, + 0, 512, 768, 704, 0, 512, 768, 704, + 708, 0, 512, 768, 704, 708, 0, 512, + 768, 704, 712, 710, 0, 512, 768, 704, + 0, 512, 768, 704, 712, 0, 512, 768, + 704, 712, 0, 512, 768, 704, 712, 714, + 0, 512, 768, 704, 712, 0, 512, 768, + 704, 720, 716, 0, 512, 768, 704, 720, + 716, 0, 512, 768, 704, 720, 721, 718, + 0, 512, 768, 704, 0, 512, 768, 704, + 720, 0, 512, 768, 704, 720, 0, 512, + 768, 704, 720, 722, 0, 512, 768, 704, + 720, 0, 512, 768, 704, 720, 724, 0, + 512, 768, 704, 720, 724, 0, 512, 768, + 704, 720, 728, 726, 0, 512, 768, 704, + 720, 0, 512, 768, 704, 736, 728, 0, + 512, 768, 704, 736, 728, 0, 512, 768, + 704, 736, 728, 730, 0, 512, 768, 704, + 736, 728, 0, 512, 768, 704, 736, 737, + 732, 0, 512, 768, 704, 736, 737, 732, + 0, 512, 768, 704, 736, 737, 732, 734, + 0, 512, 768, 704, 0, 512, 768, 769, + 736, 0, 512, 768, 769, 736, 0, 512, + 768, 769, 736, 738, 0, 512, 768, 769, + 736, 0, 512, 768, 769, 736, 740, 0, + 512, 768, 769, 736, 740, 0, 512, 768, + 769, 736, 744, 742, 0, 512, 768, 769, + 736, 0, 512, 768, 769, 736, 744, 0, + 512, 768, 769, 736, 744, 0, 512, 768, + 769, 736, 744, 746, 0, 512, 768, 769, + 736, 744, 0, 512, 768, 769, 736, 752, + 748, 0, 512, 768, 769, 736, 752, 748, + 0, 512, 768, 769, 736, 752, 753, 750, + 0, 512, 768, 769, 736, 0, 512, 768, + 769, 736, 752, 0, 512, 768, 769, 771, + 752, 0, 512, 768, 769, 771, 752, 754, + 0, 512, 768, 769, 771, 752, 0, 512, + 768, 769, 771, 752, 756, 0, 512, 768, + 769, 771, 752, 756, 0, 512, 768, 769, + 771, 752, 760, 758, 0, 512, 768, 769, + 771, 752, 0, 512, 768, 769, 771, 752, + 760, 0, 512, 768, 769, 771, 752, 760, + 0, 512, 768, 769, 771, 752, 760, 762, + 0, 512, 768, 769, 771, 775, 760, 0, + 512, 768, 769, 771, 775, 760, 764, 0, + 512, 768, 769, 771, 775, 760, 764, 0, + 512, 768, 769, 771, 775, 760, 764, 766, + 0, 512, 0, 1024, 768, 0, 1024, 768, + 0, 1024, 768, 770, 0, 1024, 768, 0, + 1024, 768, 772, 0, 1024, 768, 772, 0, + 1024, 768, 776, 774, 0, 1024, 768, 0, + 1024, 768, 776, 0, 1024, 768, 776, 0, + 1024, 768, 776, 778, 0, 1024, 768, 776, + 0, 1024, 768, 784, 780, 0, 1024, 768, + 784, 780, 0, 1024, 768, 784, 785, 782, + 0, 1024, 768, 0, 1024, 768, 784, 0, + 1024, 768, 784, 0, 1024, 768, 784, 786, + 0, 1024, 768, 784, 0, 1024, 768, 784, + 788, 0, 1024, 768, 784, 788, 0, 1024, + 768, 784, 792, 790, 0, 1024, 768, 784, + 0, 1024, 768, 800, 792, 0, 1024, 768, + 800, 792, 0, 1024, 768, 800, 792, 794, + 0, 1024, 768, 800, 792, 0, 1024, 768, + 800, 801, 796, 0, 1024, 768, 800, 801, + 796, 0, 1024, 768, 800, 801, 796, 798, + 0, 1024, 768, 0, 1024, 768, 800, 0, + 1024, 768, 800, 0, 1024, 768, 800, 802, + 0, 1024, 768, 800, 0, 1024, 768, 800, + 804, 0, 1024, 768, 800, 804, 0, 1024, + 768, 800, 808, 806, 0, 1024, 768, 800, + 0, 1024, 768, 800, 808, 0, 1024, 768, + 800, 808, 0, 1024, 768, 800, 808, 810, + 0, 1024, 768, 800, 808, 0, 1024, 768, + 800, 816, 812, 0, 1024, 768, 800, 816, + 812, 0, 1024, 768, 800, 816, 817, 814, + 0, 1024, 768, 800, 0, 1024, 768, 832, + 816, 0, 1024, 768, 832, 816, 0, 1024, + 768, 832, 816, 818, 0, 1024, 768, 832, + 816, 0, 1024, 768, 832, 816, 820, 0, + 1024, 768, 832, 816, 820, 0, 1024, 768, + 832, 816, 824, 822, 0, 1024, 768, 832, + 816, 0, 1024, 768, 832, 833, 824, 0, + 1024, 768, 832, 833, 824, 0, 1024, 768, + 832, 833, 824, 826, 0, 1024, 768, 832, + 833, 824, 0, 1024, 768, 832, 833, 824, + 828, 0, 1024, 768, 832, 833, 835, 828, + 0, 1024, 768, 832, 833, 835, 828, 830, + 0, 1024, 768, 0, 1024, 768, 832, 0, + 1024, 768, 832, 0, 1024, 768, 832, 834, + 0, 1024, 768, 832, 0, 1024, 768, 832, + 836, 0, 1024, 768, 832, 836, 0, 1024, + 768, 832, 840, 838, 0, 1024, 768, 832, + 0, 1024, 768, 832, 840, 0, 1024, 768, + 832, 840, 0, 1024, 768, 832, 840, 842, + 0, 1024, 768, 832, 840, 0, 1024, 768, + 832, 848, 844, 0, 1024, 768, 832, 848, + 844, 0, 1024, 768, 832, 848, 849, 846, + 0, 1024, 768, 832, 0, 1024, 768, 832, + 848, 0, 1024, 768, 832, 848, 0, 1024, + 768, 832, 848, 850, 0, 1024, 768, 832, + 848, 0, 1024, 768, 832, 848, 852, 0, + 1024, 768, 832, 848, 852, 0, 1024, 768, + 832, 848, 856, 854, 0, 1024, 768, 832, + 848, 0, 1024, 768, 832, 864, 856, 0, + 1024, 768, 832, 864, 856, 0, 1024, 768, + 832, 864, 856, 858, 0, 1024, 768, 832, + 864, 856, 0, 1024, 768, 832, 864, 865, + 860, 0, 1024, 768, 832, 864, 865, 860, + 0, 1024, 768, 832, 864, 865, 860, 862, + 0, 1024, 768, 832, 0, 1024, 768, 896, + 864, 0, 1024, 768, 896, 864, 0, 1024, + 768, 896, 864, 866, 0, 1024, 768, 896, + 864, 0, 1024, 768, 896, 864, 868, 0, + 1024, 768, 896, 864, 868, 0, 1024, 768, + 896, 864, 872, 870, 0, 1024, 768, 896, + 864, 0, 1024, 768, 896, 864, 872, 0, + 1024, 768, 896, 864, 872, 0, 1024, 768, + 896, 864, 872, 874, 0, 1024, 768, 896, + 864, 872, 0, 1024, 768, 896, 864, 880, + 876, 0, 1024, 768, 896, 864, 880, 876, + 0, 1024, 768, 896, 864, 880, 881, 878, + 0, 1024, 768, 896, 864, 0, 1024, 768, + 896, 897, 880, 0, 1024, 768, 896, 897, + 880, 0, 1024, 768, 896, 897, 880, 882, + 0, 1024, 768, 896, 897, 880, 0, 1024, + 768, 896, 897, 880, 884, 0, 1024, 768, + 896, 897, 880, 884, 0, 1024, 768, 896, + 897, 880, 888, 886, 0, 1024, 768, 896, + 897, 880, 0, 1024, 768, 896, 897, 880, + 888, 0, 1024, 768, 896, 897, 899, 888, + 0, 1024, 768, 896, 897, 899, 888, 890, + 0, 1024, 768, 896, 897, 899, 888, 0, + 1024, 768, 896, 897, 899, 888, 892, 0, + 1024, 768, 896, 897, 899, 888, 892, 0, + 1024, 768, 896, 897, 899, 888, 892, 894, + 0, 1024, 768, 0, 1024, 1025, 896, 0, + 1024, 1025, 896, 0, 1024, 1025, 896, 898, + 0, 1024, 1025, 896, 0, 1024, 1025, 896, + 900, 0, 1024, 1025, 896, 900, 0, 1024, + 1025, 896, 904, 902, 0, 1024, 1025, 896, + 0, 1024, 1025, 896, 904, 0, 1024, 1025, + 896, 904, 0, 1024, 1025, 896, 904, 906, + 0, 1024, 1025, 896, 904, 0, 1024, 1025, + 896, 912, 908, 0, 1024, 1025, 896, 912, + 908, 0, 1024, 1025, 896, 912, 913, 910, + 0, 1024, 1025, 896, 0, 1024, 1025, 896, + 912, 0, 1024, 1025, 896, 912, 0, 1024, + 1025, 896, 912, 914, 0, 1024, 1025, 896, + 912, 0, 1024, 1025, 896, 912, 916, 0, + 1024, 1025, 896, 912, 916, 0, 1024, 1025, + 896, 912, 920, 918, 0, 1024, 1025, 896, + 912, 0, 1024, 1025, 896, 928, 920, 0, + 1024, 1025, 896, 928, 920, 0, 1024, 1025, + 896, 928, 920, 922, 0, 1024, 1025, 896, + 928, 920, 0, 1024, 1025, 896, 928, 929, + 924, 0, 1024, 1025, 896, 928, 929, 924, + 0, 1024, 1025, 896, 928, 929, 924, 926, + 0, 1024, 1025, 896, 0, 1024, 1025, 896, + 928, 0, 1024, 1025, 896, 928, 0, 1024, + 1025, 896, 928, 930, 0, 1024, 1025, 896, + 928, 0, 1024, 1025, 896, 928, 932, 0, + 1024, 1025, 896, 928, 932, 0, 1024, 1025, + 896, 928, 936, 934, 0, 1024, 1025, 896, + 928, 0, 1024, 1025, 896, 928, 936, 0, + 1024, 1025, 896, 928, 936, 0, 1024, 1025, + 896, 928, 936, 938, 0, 1024, 1025, 896, + 928, 936, 0, 1024, 1025, 896, 928, 944, + 940, 0, 1024, 1025, 896, 928, 944, 940, + 0, 1024, 1025, 896, 928, 944, 945, 942, + 0, 1024, 1025, 896, 928, 0, 1024, 1025, + 896, 960, 944, 0, 1024, 1025, 896, 960, + 944, 0, 1024, 1025, 896, 960, 944, 946, + 0, 1024, 1025, 896, 960, 944, 0, 1024, + 1025, 896, 960, 944, 948, 0, 1024, 1025, + 896, 960, 944, 948, 0, 1024, 1025, 896, + 960, 944, 952, 950, 0, 1024, 1025, 896, + 960, 944, 0, 1024, 1025, 896, 960, 961, + 952, 0, 1024, 1025, 896, 960, 961, 952, + 0, 1024, 1025, 896, 960, 961, 952, 954, + 0, 1024, 1025, 896, 960, 961, 952, 0, + 1024, 1025, 896, 960, 961, 952, 956, 0, + 1024, 1025, 896, 960, 961, 963, 956, 0, + 1024, 1025, 896, 960, 961, 963, 956, 958, + 0, 1024, 1025, 896, 0, 1024, 1025, 896, + 960, 0, 1024, 1025, 1027, 960, 0, 1024, + 1025, 1027, 960, 962, 0, 1024, 1025, 1027, + 960, 0, 1024, 1025, 1027, 960, 964, 0, + 1024, 1025, 1027, 960, 964, 0, 1024, 1025, + 1027, 960, 968, 966, 0, 1024, 1025, 1027, + 960, 0, 1024, 1025, 1027, 960, 968, 0, + 1024, 1025, 1027, 960, 968, 0, 1024, 1025, + 1027, 960, 968, 970, 0, 1024, 1025, 1027, + 960, 968, 0, 1024, 1025, 1027, 960, 976, + 972, 0, 1024, 1025, 1027, 960, 976, 972, + 0, 1024, 1025, 1027, 960, 976, 977, 974, + 0, 1024, 1025, 1027, 960, 0, 1024, 1025, + 1027, 960, 976, 0, 1024, 1025, 1027, 960, + 976, 0, 1024, 1025, 1027, 960, 976, 978, + 0, 1024, 1025, 1027, 960, 976, 0, 1024, + 1025, 1027, 960, 976, 980, 0, 1024, 1025, + 1027, 960, 976, 980, 0, 1024, 1025, 1027, + 960, 976, 984, 982, 0, 1024, 1025, 1027, + 960, 976, 0, 1024, 1025, 1027, 960, 992, + 984, 0, 1024, 1025, 1027, 960, 992, 984, + 0, 1024, 1025, 1027, 960, 992, 984, 986, + 0, 1024, 1025, 1027, 960, 992, 984, 0, + 1024, 1025, 1027, 960, 992, 993, 988, 0, + 1024, 1025, 1027, 960, 992, 993, 988, 0, + 1024, 1025, 1027, 960, 992, 993, 988, 990, + 0, 1024, 1025, 1027, 960, 0, 1024, 1025, + 1027, 960, 992, 0, 1024, 1025, 1027, 960, + 992, 0, 1024, 1025, 1027, 960, 992, 994, + 0, 1024, 1025, 1027, 1031, 992, 0, 1024, + 1025, 1027, 1031, 992, 996, 0, 1024, 1025, + 1027, 1031, 992, 996, 0, 1024, 1025, 1027, + 1031, 992, 1000, 998, 0, 1024, 1025, 1027, + 1031, 992, 0, 1024, 1025, 1027, 1031, 992, + 1000, 0, 1024, 1025, 1027, 1031, 992, 1000, + 0, 1024, 1025, 1027, 1031, 992, 1000, 1002, + 0, 1024, 1025, 1027, 1031, 992, 1000, 0, + 1024, 1025, 1027, 1031, 992, 1008, 1004, 0, + 1024, 1025, 1027, 1031, 992, 1008, 1004, 0, + 1024, 1025, 1027, 1031, 992, 1008, 1009, 1006, + 0, 1024, 1025, 1027, 1031, 992, 0, 1024, + 1025, 1027, 1031, 992, 1008, 0, 1024, 1025, + 1027, 1031, 992, 1008, 0, 1024, 1025, 1027, + 1031, 992, 1008, 1010, 0, 1024, 1025, 1027, + 1031, 992, 1008, 0, 1024, 1025, 1027, 1031, + 992, 1008, 1012, 0, 1024, 1025, 1027, 1031, + 992, 1008, 1012, 0, 1024, 1025, 1027, 1031, + 992, 1008, 1016, 1014, 0, 1024, 1025, 1027, + 1031, 1039, 1008, 0, 1024, 1025, 1027, 1031, + 1039, 1008, 1016, 0, 1024, 1025, 1027, 1031, + 1039, 1008, 1016, 0, 1024, 1025, 1027, 1031, + 1039, 1008, 1016, 1018, 0, 1024, 1025, 1027, + 1031, 1039, 1008, 1016, 0, 1024, 1025, 1027, + 1031, 1039, 1008, 1016, 1020, 0, 1024, 1025, + 1027, 1031, 1039, 1008, 1016, 1020, 0, 1024, + 1025, 1027, 1031, 1039, 1008, 1016, 1020, 1022, + 0, 0, 1024, 0, 1024, 0, 1024, 1026, + 0, 1024, 0, 1024, 1028, 0, 1024, 1028, + 0, 1024, 1032, 1030, 0, 1024, 0, 1024, + 1032, 0, 1024, 1032, 0, 1024, 1032, 1034, + 0, 1024, 1032, 0, 1024, 1040, 1036, 0, + 1024, 1040, 1036, 0, 1024, 1040, 1041, 1038, + 0, 1024, 0, 1024, 1040, 0, 1024, 1040, + 0, 1024, 1040, 1042, 0, 1024, 1040, 0, + 1024, 1040, 1044, 0, 1024, 1040, 1044, 0, + 1024, 1040, 1048, 1046, 0, 1024, 1040, 0, + 1024, 1056, 1048, 0, 1024, 1056, 1048, 0, + 1024, 1056, 1048, 1050, 0, 1024, 1056, 1048, + 0, 1024, 1056, 1057, 1052, 0, 1024, 1056, + 1057, 1052, 0, 1024, 1056, 1057, 1052, 1054, + 0, 1024, 0, 1024, 1056, 0, 1024, 1056, + 0, 1024, 1056, 1058, 0, 1024, 1056, 0, + 1024, 1056, 1060, 0, 1024, 1056, 1060, 0, + 1024, 1056, 1064, 1062, 0, 1024, 1056, 0, + 1024, 1056, 1064, 0, 1024, 1056, 1064, 0, + 1024, 1056, 1064, 1066, 0, 1024, 1056, 1064, + 0, 1024, 1056, 1072, 1068, 0, 1024, 1056, + 1072, 1068, 0, 1024, 1056, 1072, 1073, 1070, + 0, 1024, 1056, 0, 1024, 1088, 1072, 0, + 1024, 1088, 1072, 0, 1024, 1088, 1072, 1074, + 0, 1024, 1088, 1072, 0, 1024, 1088, 1072, + 1076, 0, 1024, 1088, 1072, 1076, 0, 1024, + 1088, 1072, 1080, 1078, 0, 1024, 1088, 1072, + 0, 1024, 1088, 1089, 1080, 0, 1024, 1088, + 1089, 1080, 0, 1024, 1088, 1089, 1080, 1082, + 0, 1024, 1088, 1089, 1080, 0, 1024, 1088, + 1089, 1080, 1084, 0, 1024, 1088, 1089, 1091, + 1084, 0, 1024, 1088, 1089, 1091, 1084, 1086, + 0, 1024, 0, 1024, 1088, 0, 1024, 1088, + 0, 1024, 1088, 1090, 0, 1024, 1088, 0, + 1024, 1088, 1092, 0, 1024, 1088, 1092, 0, + 1024, 1088, 1096, 1094, 0, 1024, 1088, 0, + 1024, 1088, 1096, 0, 1024, 1088, 1096, 0, + 1024, 1088, 1096, 1098, 0, 1024, 1088, 1096, + 0, 1024, 1088, 1104, 1100, 0, 1024, 1088, + 1104, 1100, 0, 1024, 1088, 1104, 1105, 1102, + 0, 1024, 1088, 0, 1024, 1088, 1104, 0, + 1024, 1088, 1104, 0, 1024, 1088, 1104, 1106, + 0, 1024, 1088, 1104, 0, 1024, 1088, 1104, + 1108, 0, 1024, 1088, 1104, 1108, 0, 1024, + 1088, 1104, 1112, 1110, 0, 1024, 1088, 1104, + 0, 1024, 1088, 1120, 1112, 0, 1024, 1088, + 1120, 1112, 0, 1024, 1088, 1120, 1112, 1114, + 0, 1024, 1088, 1120, 1112, 0, 1024, 1088, + 1120, 1121, 1116, 0, 1024, 1088, 1120, 1121, + 1116, 0, 1024, 1088, 1120, 1121, 1116, 1118, + 0, 1024, 1088, 0, 1024, 1152, 1120, 0, + 1024, 1152, 1120, 0, 1024, 1152, 1120, 1122, + 0, 1024, 1152, 1120, 0, 1024, 1152, 1120, + 1124, 0, 1024, 1152, 1120, 1124, 0, 1024, + 1152, 1120, 1128, 1126, 0, 1024, 1152, 1120, + 0, 1024, 1152, 1120, 1128, 0, 1024, 1152, + 1120, 1128, 0, 1024, 1152, 1120, 1128, 1130, + 0, 1024, 1152, 1120, 1128, 0, 1024, 1152, + 1120, 1136, 1132, 0, 1024, 1152, 1120, 1136, + 1132, 0, 1024, 1152, 1120, 1136, 1137, 1134, + 0, 1024, 1152, 1120, 0, 1024, 1152, 1153, + 1136, 0, 1024, 1152, 1153, 1136, 0, 1024, + 1152, 1153, 1136, 1138, 0, 1024, 1152, 1153, + 1136, 0, 1024, 1152, 1153, 1136, 1140, 0, + 1024, 1152, 1153, 1136, 1140, 0, 1024, 1152, + 1153, 1136, 1144, 1142, 0, 1024, 1152, 1153, + 1136, 0, 1024, 1152, 1153, 1136, 1144, 0, + 1024, 1152, 1153, 1155, 1144, 0, 1024, 1152, + 1153, 1155, 1144, 1146, 0, 1024, 1152, 1153, + 1155, 1144, 0, 1024, 1152, 1153, 1155, 1144, + 1148, 0, 1024, 1152, 1153, 1155, 1144, 1148, + 0, 1024, 1152, 1153, 1155, 1144, 1148, 1150, + 0, 1024, 0, 1024, 1152, 0, 1024, 1152, + 0, 1024, 1152, 1154, 0, 1024, 1152, 0, + 1024, 1152, 1156, 0, 1024, 1152, 1156, 0, + 1024, 1152, 1160, 1158, 0, 1024, 1152, 0, + 1024, 1152, 1160, 0, 1024, 1152, 1160, 0, + 1024, 1152, 1160, 1162, 0, 1024, 1152, 1160, + 0, 1024, 1152, 1168, 1164, 0, 1024, 1152, + 1168, 1164, 0, 1024, 1152, 1168, 1169, 1166, + 0, 1024, 1152, 0, 1024, 1152, 1168, 0, + 1024, 1152, 1168, 0, 1024, 1152, 1168, 1170, + 0, 1024, 1152, 1168, 0, 1024, 1152, 1168, + 1172, 0, 1024, 1152, 1168, 1172, 0, 1024, + 1152, 1168, 1176, 1174, 0, 1024, 1152, 1168, + 0, 1024, 1152, 1184, 1176, 0, 1024, 1152, + 1184, 1176, 0, 1024, 1152, 1184, 1176, 1178, + 0, 1024, 1152, 1184, 1176, 0, 1024, 1152, + 1184, 1185, 1180, 0, 1024, 1152, 1184, 1185, + 1180, 0, 1024, 1152, 1184, 1185, 1180, 1182, + 0, 1024, 1152, 0, 1024, 1152, 1184, 0, + 1024, 1152, 1184, 0, 1024, 1152, 1184, 1186, + 0, 1024, 1152, 1184, 0, 1024, 1152, 1184, + 1188, 0, 1024, 1152, 1184, 1188, 0, 1024, + 1152, 1184, 1192, 1190, 0, 1024, 1152, 1184, + 0, 1024, 1152, 1184, 1192, 0, 1024, 1152, + 1184, 1192, 0, 1024, 1152, 1184, 1192, 1194, + 0, 1024, 1152, 1184, 1192, 0, 1024, 1152, + 1184, 1200, 1196, 0, 1024, 1152, 1184, 1200, + 1196, 0, 1024, 1152, 1184, 1200, 1201, 1198, + 0, 1024, 1152, 1184, 0, 1024, 1152, 1216, + 1200, 0, 1024, 1152, 1216, 1200, 0, 1024, + 1152, 1216, 1200, 1202, 0, 1024, 1152, 1216, + 1200, 0, 1024, 1152, 1216, 1200, 1204, 0, + 1024, 1152, 1216, 1200, 1204, 0, 1024, 1152, + 1216, 1200, 1208, 1206, 0, 1024, 1152, 1216, + 1200, 0, 1024, 1152, 1216, 1217, 1208, 0, + 1024, 1152, 1216, 1217, 1208, 0, 1024, 1152, + 1216, 1217, 1208, 1210, 0, 1024, 1152, 1216, + 1217, 1208, 0, 1024, 1152, 1216, 1217, 1208, + 1212, 0, 1024, 1152, 1216, 1217, 1219, 1212, + 0, 1024, 1152, 1216, 1217, 1219, 1212, 1214, + 0, 1024, 1152, 0, 1024, 1280, 1216, 0, + 1024, 1280, 1216, 0, 1024, 1280, 1216, 1218, + 0, 1024, 1280, 1216, 0, 1024, 1280, 1216, + 1220, 0, 1024, 1280, 1216, 1220, 0, 1024, + 1280, 1216, 1224, 1222, 0, 1024, 1280, 1216, + 0, 1024, 1280, 1216, 1224, 0, 1024, 1280, + 1216, 1224, 0, 1024, 1280, 1216, 1224, 1226, + 0, 1024, 1280, 1216, 1224, 0, 1024, 1280, + 1216, 1232, 1228, 0, 1024, 1280, 1216, 1232, + 1228, 0, 1024, 1280, 1216, 1232, 1233, 1230, + 0, 1024, 1280, 1216, 0, 1024, 1280, 1216, + 1232, 0, 1024, 1280, 1216, 1232, 0, 1024, + 1280, 1216, 1232, 1234, 0, 1024, 1280, 1216, + 1232, 0, 1024, 1280, 1216, 1232, 1236, 0, + 1024, 1280, 1216, 1232, 1236, 0, 1024, 1280, + 1216, 1232, 1240, 1238, 0, 1024, 1280, 1216, + 1232, 0, 1024, 1280, 1216, 1248, 1240, 0, + 1024, 1280, 1216, 1248, 1240, 0, 1024, 1280, + 1216, 1248, 1240, 1242, 0, 1024, 1280, 1216, + 1248, 1240, 0, 1024, 1280, 1216, 1248, 1249, + 1244, 0, 1024, 1280, 1216, 1248, 1249, 1244, + 0, 1024, 1280, 1216, 1248, 1249, 1244, 1246, + 0, 1024, 1280, 1216, 0, 1024, 1280, 1281, + 1248, 0, 1024, 1280, 1281, 1248, 0, 1024, + 1280, 1281, 1248, 1250, 0, 1024, 1280, 1281, + 1248, 0, 1024, 1280, 1281, 1248, 1252, 0, + 1024, 1280, 1281, 1248, 1252, 0, 1024, 1280, + 1281, 1248, 1256, 1254, 0, 1024, 1280, 1281, + 1248, 0, 1024, 1280, 1281, 1248, 1256, 0, + 1024, 1280, 1281, 1248, 1256, 0, 1024, 1280, + 1281, 1248, 1256, 1258, 0, 1024, 1280, 1281, + 1248, 1256, 0, 1024, 1280, 1281, 1248, 1264, + 1260, 0, 1024, 1280, 1281, 1248, 1264, 1260, + 0, 1024, 1280, 1281, 1248, 1264, 1265, 1262, + 0, 1024, 1280, 1281, 1248, 0, 1024, 1280, + 1281, 1248, 1264, 0, 1024, 1280, 1281, 1283, + 1264, 0, 1024, 1280, 1281, 1283, 1264, 1266, + 0, 1024, 1280, 1281, 1283, 1264, 0, 1024, + 1280, 1281, 1283, 1264, 1268, 0, 1024, 1280, + 1281, 1283, 1264, 1268, 0, 1024, 1280, 1281, + 1283, 1264, 1272, 1270, 0, 1024, 1280, 1281, + 1283, 1264, 0, 1024, 1280, 1281, 1283, 1264, + 1272, 0, 1024, 1280, 1281, 1283, 1264, 1272, + 0, 1024, 1280, 1281, 1283, 1264, 1272, 1274, + 0, 1024, 1280, 1281, 1283, 1287, 1272, 0, + 1024, 1280, 1281, 1283, 1287, 1272, 1276, 0, + 1024, 1280, 1281, 1283, 1287, 1272, 1276, 0, + 1024, 1280, 1281, 1283, 1287, 1272, 1276, 1278, + 0, 1024, 0, 1024, 1280, 0, 1024, 1280, + 0, 1024, 1280, 1282, 0, 1024, 1280, 0, + 1024, 1280, 1284, 0, 1024, 1280, 1284, 0, + 1024, 1280, 1288, 1286, 0, 1024, 1280, 0, + 1024, 1280, 1288, 0, 1024, 1280, 1288, 0, + 1024, 1280, 1288, 1290, 0, 1024, 1280, 1288, + 0, 1024, 1280, 1296, 1292, 0, 1024, 1280, + 1296, 1292, 0, 1024, 1280, 1296, 1297, 1294, + 0, 1024, 1280, 0, 1024, 1280, 1296, 0, + 1024, 1280, 1296, 0, 1024, 1280, 1296, 1298, + 0, 1024, 1280, 1296, 0, 1024, 1280, 1296, + 1300, 0, 1024, 1280, 1296, 1300, 0, 1024, + 1280, 1296, 1304, 1302, 0, 1024, 1280, 1296, + 0, 1024, 1280, 1312, 1304, 0, 1024, 1280, + 1312, 1304, 0, 1024, 1280, 1312, 1304, 1306, + 0, 1024, 1280, 1312, 1304, 0, 1024, 1280, + 1312, 1313, 1308, 0, 1024, 1280, 1312, 1313, + 1308, 0, 1024, 1280, 1312, 1313, 1308, 1310, + 0, 1024, 1280, 0, 1024, 1280, 1312, 0, + 1024, 1280, 1312, 0, 1024, 1280, 1312, 1314, + 0, 1024, 1280, 1312, 0, 1024, 1280, 1312, + 1316, 0, 1024, 1280, 1312, 1316, 0, 1024, + 1280, 1312, 1320, 1318, 0, 1024, 1280, 1312, + 0, 1024, 1280, 1312, 1320, 0, 1024, 1280, + 1312, 1320, 0, 1024, 1280, 1312, 1320, 1322, + 0, 1024, 1280, 1312, 1320, 0, 1024, 1280, + 1312, 1328, 1324, 0, 1024, 1280, 1312, 1328, + 1324, 0, 1024, 1280, 1312, 1328, 1329, 1326, + 0, 1024, 1280, 1312, 0, 1024, 1280, 1344, + 1328, 0, 1024, 1280, 1344, 1328, 0, 1024, + 1280, 1344, 1328, 1330, 0, 1024, 1280, 1344, + 1328, 0, 1024, 1280, 1344, 1328, 1332, 0, + 1024, 1280, 1344, 1328, 1332, 0, 1024, 1280, + 1344, 1328, 1336, 1334, 0, 1024, 1280, 1344, + 1328, 0, 1024, 1280, 1344, 1345, 1336, 0, + 1024, 1280, 1344, 1345, 1336, 0, 1024, 1280, + 1344, 1345, 1336, 1338, 0, 1024, 1280, 1344, + 1345, 1336, 0, 1024, 1280, 1344, 1345, 1336, + 1340, 0, 1024, 1280, 1344, 1345, 1347, 1340, + 0, 1024, 1280, 1344, 1345, 1347, 1340, 1342, + 0, 1024, 1280, 0, 1024, 1280, 1344, 0, + 1024, 1280, 1344, 0, 1024, 1280, 1344, 1346, + 0, 1024, 1280, 1344, 0, 1024, 1280, 1344, + 1348, 0, 1024, 1280, 1344, 1348, 0, 1024, + 1280, 1344, 1352, 1350, 0, 1024, 1280, 1344, + 0, 1024, 1280, 1344, 1352, 0, 1024, 1280, + 1344, 1352, 0, 1024, 1280, 1344, 1352, 1354, + 0, 1024, 1280, 1344, 1352, 0, 1024, 1280, + 1344, 1360, 1356, 0, 1024, 1280, 1344, 1360, + 1356, 0, 1024, 1280, 1344, 1360, 1361, 1358, + 0, 1024, 1280, 1344, 0, 1024, 1280, 1344, + 1360, 0, 1024, 1280, 1344, 1360, 0, 1024, + 1280, 1344, 1360, 1362, 0, 1024, 1280, 1344, + 1360, 0, 1024, 1280, 1344, 1360, 1364, 0, + 1024, 1280, 1344, 1360, 1364, 0, 1024, 1280, + 1344, 1360, 1368, 1366, 0, 1024, 1280, 1344, + 1360, 0, 1024, 1280, 1344, 1376, 1368, 0, + 1024, 1280, 1344, 1376, 1368, 0, 1024, 1280, + 1344, 1376, 1368, 1370, 0, 1024, 1280, 1344, + 1376, 1368, 0, 1024, 1280, 1344, 1376, 1377, + 1372, 0, 1024, 1280, 1344, 1376, 1377, 1372, + 0, 1024, 1280, 1344, 1376, 1377, 1372, 1374, + 0, 1024, 1280, 1344, 0, 1024, 1280, 1408, + 1376, 0, 1024, 1280, 1408, 1376, 0, 1024, + 1280, 1408, 1376, 1378, 0, 1024, 1280, 1408, + 1376, 0, 1024, 1280, 1408, 1376, 1380, 0, + 1024, 1280, 1408, 1376, 1380, 0, 1024, 1280, + 1408, 1376, 1384, 1382, 0, 1024, 1280, 1408, + 1376, 0, 1024, 1280, 1408, 1376, 1384, 0, + 1024, 1280, 1408, 1376, 1384, 0, 1024, 1280, + 1408, 1376, 1384, 1386, 0, 1024, 1280, 1408, + 1376, 1384, 0, 1024, 1280, 1408, 1376, 1392, + 1388, 0, 1024, 1280, 1408, 1376, 1392, 1388, + 0, 1024, 1280, 1408, 1376, 1392, 1393, 1390, + 0, 1024, 1280, 1408, 1376, 0, 1024, 1280, + 1408, 1409, 1392, 0, 1024, 1280, 1408, 1409, + 1392, 0, 1024, 1280, 1408, 1409, 1392, 1394, + 0, 1024, 1280, 1408, 1409, 1392, 0, 1024, + 1280, 1408, 1409, 1392, 1396, 0, 1024, 1280, + 1408, 1409, 1392, 1396, 0, 1024, 1280, 1408, + 1409, 1392, 1400, 1398, 0, 1024, 1280, 1408, + 1409, 1392, 0, 1024, 1280, 1408, 1409, 1392, + 1400, 0, 1024, 1280, 1408, 1409, 1411, 1400, + 0, 1024, 1280, 1408, 1409, 1411, 1400, 1402, + 0, 1024, 1280, 1408, 1409, 1411, 1400, 0, + 1024, 1280, 1408, 1409, 1411, 1400, 1404, 0, + 1024, 1280, 1408, 1409, 1411, 1400, 1404, 0, + 1024, 1280, 1408, 1409, 1411, 1400, 1404, 1406, + 0, 1024, 1280, 0, 1024, 1536, 1408, 0, + 1024, 1536, 1408, 0, 1024, 1536, 1408, 1410, + 0, 1024, 1536, 1408, 0, 1024, 1536, 1408, + 1412, 0, 1024, 1536, 1408, 1412, 0, 1024, + 1536, 1408, 1416, 1414, 0, 1024, 1536, 1408, + 0, 1024, 1536, 1408, 1416, 0, 1024, 1536, + 1408, 1416, 0, 1024, 1536, 1408, 1416, 1418, + 0, 1024, 1536, 1408, 1416, 0, 1024, 1536, + 1408, 1424, 1420, 0, 1024, 1536, 1408, 1424, + 1420, 0, 1024, 1536, 1408, 1424, 1425, 1422, + 0, 1024, 1536, 1408, 0, 1024, 1536, 1408, + 1424, 0, 1024, 1536, 1408, 1424, 0, 1024, + 1536, 1408, 1424, 1426, 0, 1024, 1536, 1408, + 1424, 0, 1024, 1536, 1408, 1424, 1428, 0, + 1024, 1536, 1408, 1424, 1428, 0, 1024, 1536, + 1408, 1424, 1432, 1430, 0, 1024, 1536, 1408, + 1424, 0, 1024, 1536, 1408, 1440, 1432, 0, + 1024, 1536, 1408, 1440, 1432, 0, 1024, 1536, + 1408, 1440, 1432, 1434, 0, 1024, 1536, 1408, + 1440, 1432, 0, 1024, 1536, 1408, 1440, 1441, + 1436, 0, 1024, 1536, 1408, 1440, 1441, 1436, + 0, 1024, 1536, 1408, 1440, 1441, 1436, 1438, + 0, 1024, 1536, 1408, 0, 1024, 1536, 1408, + 1440, 0, 1024, 1536, 1408, 1440, 0, 1024, + 1536, 1408, 1440, 1442, 0, 1024, 1536, 1408, + 1440, 0, 1024, 1536, 1408, 1440, 1444, 0, + 1024, 1536, 1408, 1440, 1444, 0, 1024, 1536, + 1408, 1440, 1448, 1446, 0, 1024, 1536, 1408, + 1440, 0, 1024, 1536, 1408, 1440, 1448, 0, + 1024, 1536, 1408, 1440, 1448, 0, 1024, 1536, + 1408, 1440, 1448, 1450, 0, 1024, 1536, 1408, + 1440, 1448, 0, 1024, 1536, 1408, 1440, 1456, + 1452, 0, 1024, 1536, 1408, 1440, 1456, 1452, + 0, 1024, 1536, 1408, 1440, 1456, 1457, 1454, + 0, 1024, 1536, 1408, 1440, 0, 1024, 1536, + 1408, 1472, 1456, 0, 1024, 1536, 1408, 1472, + 1456, 0, 1024, 1536, 1408, 1472, 1456, 1458, + 0, 1024, 1536, 1408, 1472, 1456, 0, 1024, + 1536, 1408, 1472, 1456, 1460, 0, 1024, 1536, + 1408, 1472, 1456, 1460, 0, 1024, 1536, 1408, + 1472, 1456, 1464, 1462, 0, 1024, 1536, 1408, + 1472, 1456, 0, 1024, 1536, 1408, 1472, 1473, + 1464, 0, 1024, 1536, 1408, 1472, 1473, 1464, + 0, 1024, 1536, 1408, 1472, 1473, 1464, 1466, + 0, 1024, 1536, 1408, 1472, 1473, 1464, 0, + 1024, 1536, 1408, 1472, 1473, 1464, 1468, 0, + 1024, 1536, 1408, 1472, 1473, 1475, 1468, 0, + 1024, 1536, 1408, 1472, 1473, 1475, 1468, 1470, + 0, 1024, 1536, 1408, 0, 1024, 1536, 1537, + 1472, 0, 1024, 1536, 1537, 1472, 0, 1024, + 1536, 1537, 1472, 1474, 0, 1024, 1536, 1537, + 1472, 0, 1024, 1536, 1537, 1472, 1476, 0, + 1024, 1536, 1537, 1472, 1476, 0, 1024, 1536, + 1537, 1472, 1480, 1478, 0, 1024, 1536, 1537, + 1472, 0, 1024, 1536, 1537, 1472, 1480, 0, + 1024, 1536, 1537, 1472, 1480, 0, 1024, 1536, + 1537, 1472, 1480, 1482, 0, 1024, 1536, 1537, + 1472, 1480, 0, 1024, 1536, 1537, 1472, 1488, + 1484, 0, 1024, 1536, 1537, 1472, 1488, 1484, + 0, 1024, 1536, 1537, 1472, 1488, 1489, 1486, + 0, 1024, 1536, 1537, 1472, 0, 1024, 1536, + 1537, 1472, 1488, 0, 1024, 1536, 1537, 1472, + 1488, 0, 1024, 1536, 1537, 1472, 1488, 1490, + 0, 1024, 1536, 1537, 1472, 1488, 0, 1024, + 1536, 1537, 1472, 1488, 1492, 0, 1024, 1536, + 1537, 1472, 1488, 1492, 0, 1024, 1536, 1537, + 1472, 1488, 1496, 1494, 0, 1024, 1536, 1537, + 1472, 1488, 0, 1024, 1536, 1537, 1472, 1504, + 1496, 0, 1024, 1536, 1537, 1472, 1504, 1496, + 0, 1024, 1536, 1537, 1472, 1504, 1496, 1498, + 0, 1024, 1536, 1537, 1472, 1504, 1496, 0, + 1024, 1536, 1537, 1472, 1504, 1505, 1500, 0, + 1024, 1536, 1537, 1472, 1504, 1505, 1500, 0, + 1024, 1536, 1537, 1472, 1504, 1505, 1500, 1502, + 0, 1024, 1536, 1537, 1472, 0, 1024, 1536, + 1537, 1472, 1504, 0, 1024, 1536, 1537, 1539, + 1504, 0, 1024, 1536, 1537, 1539, 1504, 1506, + 0, 1024, 1536, 1537, 1539, 1504, 0, 1024, + 1536, 1537, 1539, 1504, 1508, 0, 1024, 1536, + 1537, 1539, 1504, 1508, 0, 1024, 1536, 1537, + 1539, 1504, 1512, 1510, 0, 1024, 1536, 1537, + 1539, 1504, 0, 1024, 1536, 1537, 1539, 1504, + 1512, 0, 1024, 1536, 1537, 1539, 1504, 1512, + 0, 1024, 1536, 1537, 1539, 1504, 1512, 1514, + 0, 1024, 1536, 1537, 1539, 1504, 1512, 0, + 1024, 1536, 1537, 1539, 1504, 1520, 1516, 0, + 1024, 1536, 1537, 1539, 1504, 1520, 1516, 0, + 1024, 1536, 1537, 1539, 1504, 1520, 1521, 1518, + 0, 1024, 1536, 1537, 1539, 1504, 0, 1024, + 1536, 1537, 1539, 1504, 1520, 0, 1024, 1536, + 1537, 1539, 1504, 1520, 0, 1024, 1536, 1537, + 1539, 1504, 1520, 1522, 0, 1024, 1536, 1537, + 1539, 1543, 1520, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1524, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1524, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1528, 1526, 0, 1024, 1536, 1537, + 1539, 1543, 1520, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1528, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1528, 0, 1024, 1536, 1537, 1539, + 1543, 1520, 1528, 1530, 0, 1024, 1536, 1537, + 1539, 1543, 1520, 1528, 0, 1024, 1536, 1537, + 1539, 1543, 1520, 1528, 1532, 0, 1024, 1536, + 1537, 1539, 1543, 1520, 1528, 1532, 0, 1024, + 1536, 1537, 1539, 1543, 1520, 1528, 1532, 1534, + 0, 1024, 0, 2048, 1536, 0, 2048, 1536, + 0, 2048, 1536, 1538, 0, 2048, 1536, 0, + 2048, 1536, 1540, 0, 2048, 1536, 1540, 0, + 2048, 1536, 1544, 1542, 0, 2048, 1536, 0, + 2048, 1536, 1544, 0, 2048, 1536, 1544, 0, + 2048, 1536, 1544, 1546, 0, 2048, 1536, 1544, + 0, 2048, 1536, 1552, 1548, 0, 2048, 1536, + 1552, 1548, 0, 2048, 1536, 1552, 1553, 1550, + 0, 2048, 1536, 0, 2048, 1536, 1552, 0, + 2048, 1536, 1552, 0, 2048, 1536, 1552, 1554, + 0, 2048, 1536, 1552, 0, 2048, 1536, 1552, + 1556, 0, 2048, 1536, 1552, 1556, 0, 2048, + 1536, 1552, 1560, 1558, 0, 2048, 1536, 1552, + 0, 2048, 1536, 1568, 1560, 0, 2048, 1536, + 1568, 1560, 0, 2048, 1536, 1568, 1560, 1562, + 0, 2048, 1536, 1568, 1560, 0, 2048, 1536, + 1568, 1569, 1564, 0, 2048, 1536, 1568, 1569, + 1564, 0, 2048, 1536, 1568, 1569, 1564, 1566, + 0, 2048, 1536, 0, 2048, 1536, 1568, 0, + 2048, 1536, 1568, 0, 2048, 1536, 1568, 1570, + 0, 2048, 1536, 1568, 0, 2048, 1536, 1568, + 1572, 0, 2048, 1536, 1568, 1572, 0, 2048, + 1536, 1568, 1576, 1574, 0, 2048, 1536, 1568, + 0, 2048, 1536, 1568, 1576, 0, 2048, 1536, + 1568, 1576, 0, 2048, 1536, 1568, 1576, 1578, + 0, 2048, 1536, 1568, 1576, 0, 2048, 1536, + 1568, 1584, 1580, 0, 2048, 1536, 1568, 1584, + 1580, 0, 2048, 1536, 1568, 1584, 1585, 1582, + 0, 2048, 1536, 1568, 0, 2048, 1536, 1600, + 1584, 0, 2048, 1536, 1600, 1584, 0, 2048, + 1536, 1600, 1584, 1586, 0, 2048, 1536, 1600, + 1584, 0, 2048, 1536, 1600, 1584, 1588, 0, + 2048, 1536, 1600, 1584, 1588, 0, 2048, 1536, + 1600, 1584, 1592, 1590, 0, 2048, 1536, 1600, + 1584, 0, 2048, 1536, 1600, 1601, 1592, 0, + 2048, 1536, 1600, 1601, 1592, 0, 2048, 1536, + 1600, 1601, 1592, 1594, 0, 2048, 1536, 1600, + 1601, 1592, 0, 2048, 1536, 1600, 1601, 1592, + 1596, 0, 2048, 1536, 1600, 1601, 1603, 1596, + 0, 2048, 1536, 1600, 1601, 1603, 1596, 1598, + 0, 2048, 1536, 0, 2048, 1536, 1600, 0, + 2048, 1536, 1600, 0, 2048, 1536, 1600, 1602, + 0, 2048, 1536, 1600, 0, 2048, 1536, 1600, + 1604, 0, 2048, 1536, 1600, 1604, 0, 2048, + 1536, 1600, 1608, 1606, 0, 2048, 1536, 1600, + 0, 2048, 1536, 1600, 1608, 0, 2048, 1536, + 1600, 1608, 0, 2048, 1536, 1600, 1608, 1610, + 0, 2048, 1536, 1600, 1608, 0, 2048, 1536, + 1600, 1616, 1612, 0, 2048, 1536, 1600, 1616, + 1612, 0, 2048, 1536, 1600, 1616, 1617, 1614, + 0, 2048, 1536, 1600, 0, 2048, 1536, 1600, + 1616, 0, 2048, 1536, 1600, 1616, 0, 2048, + 1536, 1600, 1616, 1618, 0, 2048, 1536, 1600, + 1616, 0, 2048, 1536, 1600, 1616, 1620, 0, + 2048, 1536, 1600, 1616, 1620, 0, 2048, 1536, + 1600, 1616, 1624, 1622, 0, 2048, 1536, 1600, + 1616, 0, 2048, 1536, 1600, 1632, 1624, 0, + 2048, 1536, 1600, 1632, 1624, 0, 2048, 1536, + 1600, 1632, 1624, 1626, 0, 2048, 1536, 1600, + 1632, 1624, 0, 2048, 1536, 1600, 1632, 1633, + 1628, 0, 2048, 1536, 1600, 1632, 1633, 1628, + 0, 2048, 1536, 1600, 1632, 1633, 1628, 1630, + 0, 2048, 1536, 1600, 0, 2048, 1536, 1664, + 1632, 0, 2048, 1536, 1664, 1632, 0, 2048, + 1536, 1664, 1632, 1634, 0, 2048, 1536, 1664, + 1632, 0, 2048, 1536, 1664, 1632, 1636, 0, + 2048, 1536, 1664, 1632, 1636, 0, 2048, 1536, + 1664, 1632, 1640, 1638, 0, 2048, 1536, 1664, + 1632, 0, 2048, 1536, 1664, 1632, 1640, 0, + 2048, 1536, 1664, 1632, 1640, 0, 2048, 1536, + 1664, 1632, 1640, 1642, 0, 2048, 1536, 1664, + 1632, 1640, 0, 2048, 1536, 1664, 1632, 1648, + 1644, 0, 2048, 1536, 1664, 1632, 1648, 1644, + 0, 2048, 1536, 1664, 1632, 1648, 1649, 1646, + 0, 2048, 1536, 1664, 1632, 0, 2048, 1536, + 1664, 1665, 1648, 0, 2048, 1536, 1664, 1665, + 1648, 0, 2048, 1536, 1664, 1665, 1648, 1650, + 0, 2048, 1536, 1664, 1665, 1648, 0, 2048, + 1536, 1664, 1665, 1648, 1652, 0, 2048, 1536, + 1664, 1665, 1648, 1652, 0, 2048, 1536, 1664, + 1665, 1648, 1656, 1654, 0, 2048, 1536, 1664, + 1665, 1648, 0, 2048, 1536, 1664, 1665, 1648, + 1656, 0, 2048, 1536, 1664, 1665, 1667, 1656, + 0, 2048, 1536, 1664, 1665, 1667, 1656, 1658, + 0, 2048, 1536, 1664, 1665, 1667, 1656, 0, + 2048, 1536, 1664, 1665, 1667, 1656, 1660, 0, + 2048, 1536, 1664, 1665, 1667, 1656, 1660, 0, + 2048, 1536, 1664, 1665, 1667, 1656, 1660, 1662, + 0, 2048, 1536, 0, 2048, 1536, 1664, 0, + 2048, 1536, 1664, 0, 2048, 1536, 1664, 1666, + 0, 2048, 1536, 1664, 0, 2048, 1536, 1664, + 1668, 0, 2048, 1536, 1664, 1668, 0, 2048, + 1536, 1664, 1672, 1670, 0, 2048, 1536, 1664, + 0, 2048, 1536, 1664, 1672, 0, 2048, 1536, + 1664, 1672, 0, 2048, 1536, 1664, 1672, 1674, + 0, 2048, 1536, 1664, 1672, 0, 2048, 1536, + 1664, 1680, 1676, 0, 2048, 1536, 1664, 1680, + 1676, 0, 2048, 1536, 1664, 1680, 1681, 1678, + 0, 2048, 1536, 1664, 0, 2048, 1536, 1664, + 1680, 0, 2048, 1536, 1664, 1680, 0, 2048, + 1536, 1664, 1680, 1682, 0, 2048, 1536, 1664, + 1680, 0, 2048, 1536, 1664, 1680, 1684, 0, + 2048, 1536, 1664, 1680, 1684, 0, 2048, 1536, + 1664, 1680, 1688, 1686, 0, 2048, 1536, 1664, + 1680, 0, 2048, 1536, 1664, 1696, 1688, 0, + 2048, 1536, 1664, 1696, 1688, 0, 2048, 1536, + 1664, 1696, 1688, 1690, 0, 2048, 1536, 1664, + 1696, 1688, 0, 2048, 1536, 1664, 1696, 1697, + 1692, 0, 2048, 1536, 1664, 1696, 1697, 1692, + 0, 2048, 1536, 1664, 1696, 1697, 1692, 1694, + 0, 2048, 1536, 1664, 0, 2048, 1536, 1664, + 1696, 0, 2048, 1536, 1664, 1696, 0, 2048, + 1536, 1664, 1696, 1698, 0, 2048, 1536, 1664, + 1696, 0, 2048, 1536, 1664, 1696, 1700, 0, + 2048, 1536, 1664, 1696, 1700, 0, 2048, 1536, + 1664, 1696, 1704, 1702, 0, 2048, 1536, 1664, + 1696, 0, 2048, 1536, 1664, 1696, 1704, 0, + 2048, 1536, 1664, 1696, 1704, 0, 2048, 1536, + 1664, 1696, 1704, 1706, 0, 2048, 1536, 1664, + 1696, 1704, 0, 2048, 1536, 1664, 1696, 1712, + 1708, 0, 2048, 1536, 1664, 1696, 1712, 1708, + 0, 2048, 1536, 1664, 1696, 1712, 1713, 1710, + 0, 2048, 1536, 1664, 1696, 0, 2048, 1536, + 1664, 1728, 1712, 0, 2048, 1536, 1664, 1728, + 1712, 0, 2048, 1536, 1664, 1728, 1712, 1714, + 0, 2048, 1536, 1664, 1728, 1712, 0, 2048, + 1536, 1664, 1728, 1712, 1716, 0, 2048, 1536, + 1664, 1728, 1712, 1716, 0, 2048, 1536, 1664, + 1728, 1712, 1720, 1718, 0, 2048, 1536, 1664, + 1728, 1712, 0, 2048, 1536, 1664, 1728, 1729, + 1720, 0, 2048, 1536, 1664, 1728, 1729, 1720, + 0, 2048, 1536, 1664, 1728, 1729, 1720, 1722, + 0, 2048, 1536, 1664, 1728, 1729, 1720, 0, + 2048, 1536, 1664, 1728, 1729, 1720, 1724, 0, + 2048, 1536, 1664, 1728, 1729, 1731, 1724, 0, + 2048, 1536, 1664, 1728, 1729, 1731, 1724, 1726, + 0, 2048, 1536, 1664, 0, 2048, 1536, 1792, + 1728, 0, 2048, 1536, 1792, 1728, 0, 2048, + 1536, 1792, 1728, 1730, 0, 2048, 1536, 1792, + 1728, 0, 2048, 1536, 1792, 1728, 1732, 0, + 2048, 1536, 1792, 1728, 1732, 0, 2048, 1536, + 1792, 1728, 1736, 1734, 0, 2048, 1536, 1792, + 1728, 0, 2048, 1536, 1792, 1728, 1736, 0, + 2048, 1536, 1792, 1728, 1736, 0, 2048, 1536, + 1792, 1728, 1736, 1738, 0, 2048, 1536, 1792, + 1728, 1736, 0, 2048, 1536, 1792, 1728, 1744, + 1740, 0, 2048, 1536, 1792, 1728, 1744, 1740, + 0, 2048, 1536, 1792, 1728, 1744, 1745, 1742, + 0, 2048, 1536, 1792, 1728, 0, 2048, 1536, + 1792, 1728, 1744, 0, 2048, 1536, 1792, 1728, + 1744, 0, 2048, 1536, 1792, 1728, 1744, 1746, + 0, 2048, 1536, 1792, 1728, 1744, 0, 2048, + 1536, 1792, 1728, 1744, 1748, 0, 2048, 1536, + 1792, 1728, 1744, 1748, 0, 2048, 1536, 1792, + 1728, 1744, 1752, 1750, 0, 2048, 1536, 1792, + 1728, 1744, 0, 2048, 1536, 1792, 1728, 1760, + 1752, 0, 2048, 1536, 1792, 1728, 1760, 1752, + 0, 2048, 1536, 1792, 1728, 1760, 1752, 1754, + 0, 2048, 1536, 1792, 1728, 1760, 1752, 0, + 2048, 1536, 1792, 1728, 1760, 1761, 1756, 0, + 2048, 1536, 1792, 1728, 1760, 1761, 1756, 0, + 2048, 1536, 1792, 1728, 1760, 1761, 1756, 1758, + 0, 2048, 1536, 1792, 1728, 0, 2048, 1536, + 1792, 1793, 1760, 0, 2048, 1536, 1792, 1793, + 1760, 0, 2048, 1536, 1792, 1793, 1760, 1762, + 0, 2048, 1536, 1792, 1793, 1760, 0, 2048, + 1536, 1792, 1793, 1760, 1764, 0, 2048, 1536, + 1792, 1793, 1760, 1764, 0, 2048, 1536, 1792, + 1793, 1760, 1768, 1766, 0, 2048, 1536, 1792, + 1793, 1760, 0, 2048, 1536, 1792, 1793, 1760, + 1768, 0, 2048, 1536, 1792, 1793, 1760, 1768, + 0, 2048, 1536, 1792, 1793, 1760, 1768, 1770, + 0, 2048, 1536, 1792, 1793, 1760, 1768, 0, + 2048, 1536, 1792, 1793, 1760, 1776, 1772, 0, + 2048, 1536, 1792, 1793, 1760, 1776, 1772, 0, + 2048, 1536, 1792, 1793, 1760, 1776, 1777, 1774, + 0, 2048, 1536, 1792, 1793, 1760, 0, 2048, + 1536, 1792, 1793, 1760, 1776, 0, 2048, 1536, + 1792, 1793, 1795, 1776, 0, 2048, 1536, 1792, + 1793, 1795, 1776, 1778, 0, 2048, 1536, 1792, + 1793, 1795, 1776, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1780, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1780, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1784, 1782, 0, 2048, 1536, 1792, + 1793, 1795, 1776, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1784, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1784, 0, 2048, 1536, 1792, 1793, + 1795, 1776, 1784, 1786, 0, 2048, 1536, 1792, + 1793, 1795, 1799, 1784, 0, 2048, 1536, 1792, + 1793, 1795, 1799, 1784, 1788, 0, 2048, 1536, + 1792, 1793, 1795, 1799, 1784, 1788, 0, 2048, + 1536, 1792, 1793, 1795, 1799, 1784, 1788, 1790, + 0, 2048, 1536, 0, 2048, 1536, 1792, 0, + 2048, 2049, 1792, 0, 2048, 2049, 1792, 1794, + 0, 2048, 2049, 1792, 0, 2048, 2049, 1792, + 1796, 0, 2048, 2049, 1792, 1796, 0, 2048, + 2049, 1792, 1800, 1798, 0, 2048, 2049, 1792, + 0, 2048, 2049, 1792, 1800, 0, 2048, 2049, + 1792, 1800, 0, 2048, 2049, 1792, 1800, 1802, + 0, 2048, 2049, 1792, 1800, 0, 2048, 2049, + 1792, 1808, 1804, 0, 2048, 2049, 1792, 1808, + 1804, 0, 2048, 2049, 1792, 1808, 1809, 1806, + 0, 2048, 2049, 1792, 0, 2048, 2049, 1792, + 1808, 0, 2048, 2049, 1792, 1808, 0, 2048, + 2049, 1792, 1808, 1810, 0, 2048, 2049, 1792, + 1808, 0, 2048, 2049, 1792, 1808, 1812, 0, + 2048, 2049, 1792, 1808, 1812, 0, 2048, 2049, + 1792, 1808, 1816, 1814, 0, 2048, 2049, 1792, + 1808, 0, 2048, 2049, 1792, 1824, 1816, 0, + 2048, 2049, 1792, 1824, 1816, 0, 2048, 2049, + 1792, 1824, 1816, 1818, 0, 2048, 2049, 1792, + 1824, 1816, 0, 2048, 2049, 1792, 1824, 1825, + 1820, 0, 2048, 2049, 1792, 1824, 1825, 1820, + 0, 2048, 2049, 1792, 1824, 1825, 1820, 1822, + 0, 2048, 2049, 1792, 0, 2048, 2049, 1792, + 1824, 0, 2048, 2049, 1792, 1824, 0, 2048, + 2049, 1792, 1824, 1826, 0, 2048, 2049, 1792, + 1824, 0, 2048, 2049, 1792, 1824, 1828, 0, + 2048, 2049, 1792, 1824, 1828, 0, 2048, 2049, + 1792, 1824, 1832, 1830, 0, 2048, 2049, 1792, + 1824, 0, 2048, 2049, 1792, 1824, 1832, 0, + 2048, 2049, 1792, 1824, 1832, 0, 2048, 2049, + 1792, 1824, 1832, 1834, 0, 2048, 2049, 1792, + 1824, 1832, 0, 2048, 2049, 1792, 1824, 1840, + 1836, 0, 2048, 2049, 1792, 1824, 1840, 1836, + 0, 2048, 2049, 1792, 1824, 1840, 1841, 1838, + 0, 2048, 2049, 1792, 1824, 0, 2048, 2049, + 1792, 1856, 1840, 0, 2048, 2049, 1792, 1856, + 1840, 0, 2048, 2049, 1792, 1856, 1840, 1842, + 0, 2048, 2049, 1792, 1856, 1840, 0, 2048, + 2049, 1792, 1856, 1840, 1844, 0, 2048, 2049, + 1792, 1856, 1840, 1844, 0, 2048, 2049, 1792, + 1856, 1840, 1848, 1846, 0, 2048, 2049, 1792, + 1856, 1840, 0, 2048, 2049, 1792, 1856, 1857, + 1848, 0, 2048, 2049, 1792, 1856, 1857, 1848, + 0, 2048, 2049, 1792, 1856, 1857, 1848, 1850, + 0, 2048, 2049, 1792, 1856, 1857, 1848, 0, + 2048, 2049, 1792, 1856, 1857, 1848, 1852, 0, + 2048, 2049, 1792, 1856, 1857, 1859, 1852, 0, + 2048, 2049, 1792, 1856, 1857, 1859, 1852, 1854, + 0, 2048, 2049, 1792, 0, 2048, 2049, 1792, + 1856, 0, 2048, 2049, 1792, 1856, 0, 2048, + 2049, 1792, 1856, 1858, 0, 2048, 2049, 1792, + 1856, 0, 2048, 2049, 1792, 1856, 1860, 0, + 2048, 2049, 1792, 1856, 1860, 0, 2048, 2049, + 1792, 1856, 1864, 1862, 0, 2048, 2049, 1792, + 1856, 0, 2048, 2049, 1792, 1856, 1864, 0, + 2048, 2049, 1792, 1856, 1864, 0, 2048, 2049, + 1792, 1856, 1864, 1866, 0, 2048, 2049, 1792, + 1856, 1864, 0, 2048, 2049, 1792, 1856, 1872, + 1868, 0, 2048, 2049, 1792, 1856, 1872, 1868, + 0, 2048, 2049, 1792, 1856, 1872, 1873, 1870, + 0, 2048, 2049, 1792, 1856, 0, 2048, 2049, + 1792, 1856, 1872, 0, 2048, 2049, 1792, 1856, + 1872, 0, 2048, 2049, 1792, 1856, 1872, 1874, + 0, 2048, 2049, 1792, 1856, 1872, 0, 2048, + 2049, 1792, 1856, 1872, 1876, 0, 2048, 2049, + 1792, 1856, 1872, 1876, 0, 2048, 2049, 1792, + 1856, 1872, 1880, 1878, 0, 2048, 2049, 1792, + 1856, 1872, 0, 2048, 2049, 1792, 1856, 1888, + 1880, 0, 2048, 2049, 1792, 1856, 1888, 1880, + 0, 2048, 2049, 1792, 1856, 1888, 1880, 1882, + 0, 2048, 2049, 1792, 1856, 1888, 1880, 0, + 2048, 2049, 1792, 1856, 1888, 1889, 1884, 0, + 2048, 2049, 1792, 1856, 1888, 1889, 1884, 0, + 2048, 2049, 1792, 1856, 1888, 1889, 1884, 1886, + 0, 2048, 2049, 1792, 1856, 0, 2048, 2049, + 1792, 1920, 1888, 0, 2048, 2049, 1792, 1920, + 1888, 0, 2048, 2049, 1792, 1920, 1888, 1890, + 0, 2048, 2049, 1792, 1920, 1888, 0, 2048, + 2049, 1792, 1920, 1888, 1892, 0, 2048, 2049, + 1792, 1920, 1888, 1892, 0, 2048, 2049, 1792, + 1920, 1888, 1896, 1894, 0, 2048, 2049, 1792, + 1920, 1888, 0, 2048, 2049, 1792, 1920, 1888, + 1896, 0, 2048, 2049, 1792, 1920, 1888, 1896, + 0, 2048, 2049, 1792, 1920, 1888, 1896, 1898, + 0, 2048, 2049, 1792, 1920, 1888, 1896, 0, + 2048, 2049, 1792, 1920, 1888, 1904, 1900, 0, + 2048, 2049, 1792, 1920, 1888, 1904, 1900, 0, + 2048, 2049, 1792, 1920, 1888, 1904, 1905, 1902, + 0, 2048, 2049, 1792, 1920, 1888, 0, 2048, + 2049, 1792, 1920, 1921, 1904, 0, 2048, 2049, + 1792, 1920, 1921, 1904, 0, 2048, 2049, 1792, + 1920, 1921, 1904, 1906, 0, 2048, 2049, 1792, + 1920, 1921, 1904, 0, 2048, 2049, 1792, 1920, + 1921, 1904, 1908, 0, 2048, 2049, 1792, 1920, + 1921, 1904, 1908, 0, 2048, 2049, 1792, 1920, + 1921, 1904, 1912, 1910, 0, 2048, 2049, 1792, + 1920, 1921, 1904, 0, 2048, 2049, 1792, 1920, + 1921, 1904, 1912, 0, 2048, 2049, 1792, 1920, + 1921, 1923, 1912, 0, 2048, 2049, 1792, 1920, + 1921, 1923, 1912, 1914, 0, 2048, 2049, 1792, + 1920, 1921, 1923, 1912, 0, 2048, 2049, 1792, + 1920, 1921, 1923, 1912, 1916, 0, 2048, 2049, + 1792, 1920, 1921, 1923, 1912, 1916, 0, 2048, + 2049, 1792, 1920, 1921, 1923, 1912, 1916, 1918, + 0, 2048, 2049, 1792, 0, 2048, 2049, 1792, + 1920, 0, 2048, 2049, 1792, 1920, 0, 2048, + 2049, 1792, 1920, 1922, 0, 2048, 2049, 2051, + 1920, 0, 2048, 2049, 2051, 1920, 1924, 0, + 2048, 2049, 2051, 1920, 1924, 0, 2048, 2049, + 2051, 1920, 1928, 1926, 0, 2048, 2049, 2051, + 1920, 0, 2048, 2049, 2051, 1920, 1928, 0, + 2048, 2049, 2051, 1920, 1928, 0, 2048, 2049, + 2051, 1920, 1928, 1930, 0, 2048, 2049, 2051, + 1920, 1928, 0, 2048, 2049, 2051, 1920, 1936, + 1932, 0, 2048, 2049, 2051, 1920, 1936, 1932, + 0, 2048, 2049, 2051, 1920, 1936, 1937, 1934, + 0, 2048, 2049, 2051, 1920, 0, 2048, 2049, + 2051, 1920, 1936, 0, 2048, 2049, 2051, 1920, + 1936, 0, 2048, 2049, 2051, 1920, 1936, 1938, + 0, 2048, 2049, 2051, 1920, 1936, 0, 2048, + 2049, 2051, 1920, 1936, 1940, 0, 2048, 2049, + 2051, 1920, 1936, 1940, 0, 2048, 2049, 2051, + 1920, 1936, 1944, 1942, 0, 2048, 2049, 2051, + 1920, 1936, 0, 2048, 2049, 2051, 1920, 1952, + 1944, 0, 2048, 2049, 2051, 1920, 1952, 1944, + 0, 2048, 2049, 2051, 1920, 1952, 1944, 1946, + 0, 2048, 2049, 2051, 1920, 1952, 1944, 0, + 2048, 2049, 2051, 1920, 1952, 1953, 1948, 0, + 2048, 2049, 2051, 1920, 1952, 1953, 1948, 0, + 2048, 2049, 2051, 1920, 1952, 1953, 1948, 1950, + 0, 2048, 2049, 2051, 1920, 0, 2048, 2049, + 2051, 1920, 1952, 0, 2048, 2049, 2051, 1920, + 1952, 0, 2048, 2049, 2051, 1920, 1952, 1954, + 0, 2048, 2049, 2051, 1920, 1952, 0, 2048, + 2049, 2051, 1920, 1952, 1956, 0, 2048, 2049, + 2051, 1920, 1952, 1956, 0, 2048, 2049, 2051, + 1920, 1952, 1960, 1958, 0, 2048, 2049, 2051, + 1920, 1952, 0, 2048, 2049, 2051, 1920, 1952, + 1960, 0, 2048, 2049, 2051, 1920, 1952, 1960, + 0, 2048, 2049, 2051, 1920, 1952, 1960, 1962, + 0, 2048, 2049, 2051, 1920, 1952, 1960, 0, + 2048, 2049, 2051, 1920, 1952, 1968, 1964, 0, + 2048, 2049, 2051, 1920, 1952, 1968, 1964, 0, + 2048, 2049, 2051, 1920, 1952, 1968, 1969, 1966, + 0, 2048, 2049, 2051, 1920, 1952, 0, 2048, + 2049, 2051, 1920, 1984, 1968, 0, 2048, 2049, + 2051, 1920, 1984, 1968, 0, 2048, 2049, 2051, + 1920, 1984, 1968, 1970, 0, 2048, 2049, 2051, + 1920, 1984, 1968, 0, 2048, 2049, 2051, 1920, + 1984, 1968, 1972, 0, 2048, 2049, 2051, 1920, + 1984, 1968, 1972, 0, 2048, 2049, 2051, 1920, + 1984, 1968, 1976, 1974, 0, 2048, 2049, 2051, + 1920, 1984, 1968, 0, 2048, 2049, 2051, 1920, + 1984, 1985, 1976, 0, 2048, 2049, 2051, 1920, + 1984, 1985, 1976, 0, 2048, 2049, 2051, 1920, + 1984, 1985, 1976, 1978, 0, 2048, 2049, 2051, + 1920, 1984, 1985, 1976, 0, 2048, 2049, 2051, + 1920, 1984, 1985, 1976, 1980, 0, 2048, 2049, + 2051, 1920, 1984, 1985, 1987, 1980, 0, 2048, + 2049, 2051, 1920, 1984, 1985, 1987, 1980, 1982, + 0, 2048, 2049, 2051, 1920, 0, 2048, 2049, + 2051, 1920, 1984, 0, 2048, 2049, 2051, 1920, + 1984, 0, 2048, 2049, 2051, 1920, 1984, 1986, + 0, 2048, 2049, 2051, 1920, 1984, 0, 2048, + 2049, 2051, 1920, 1984, 1988, 0, 2048, 2049, + 2051, 1920, 1984, 1988, 0, 2048, 2049, 2051, + 1920, 1984, 1992, 1990, 0, 2048, 2049, 2051, + 2055, 1984, 0, 2048, 2049, 2051, 2055, 1984, + 1992, 0, 2048, 2049, 2051, 2055, 1984, 1992, + 0, 2048, 2049, 2051, 2055, 1984, 1992, 1994, + 0, 2048, 2049, 2051, 2055, 1984, 1992, 0, + 2048, 2049, 2051, 2055, 1984, 2000, 1996, 0, + 2048, 2049, 2051, 2055, 1984, 2000, 1996, 0, + 2048, 2049, 2051, 2055, 1984, 2000, 2001, 1998, + 0, 2048, 2049, 2051, 2055, 1984, 0, 2048, + 2049, 2051, 2055, 1984, 2000, 0, 2048, 2049, + 2051, 2055, 1984, 2000, 0, 2048, 2049, 2051, + 2055, 1984, 2000, 2002, 0, 2048, 2049, 2051, + 2055, 1984, 2000, 0, 2048, 2049, 2051, 2055, + 1984, 2000, 2004, 0, 2048, 2049, 2051, 2055, + 1984, 2000, 2004, 0, 2048, 2049, 2051, 2055, + 1984, 2000, 2008, 2006, 0, 2048, 2049, 2051, + 2055, 1984, 2000, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2008, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2008, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2008, 2010, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 2008, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 2017, 2012, 0, 2048, 2049, + 2051, 2055, 1984, 2016, 2017, 2012, 0, 2048, + 2049, 2051, 2055, 1984, 2016, 2017, 2012, 2014, + 0, 2048, 2049, 2051, 2055, 1984, 0, 2048, + 2049, 2051, 2055, 1984, 2016, 0, 2048, 2049, + 2051, 2055, 1984, 2016, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 2018, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2020, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2020, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2024, 2022, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2024, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2024, 0, 2048, 2049, 2051, 2055, + 1984, 2016, 2024, 2026, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 2024, 0, 2048, 2049, 2051, + 2055, 1984, 2016, 2032, 2028, 0, 2048, 2049, + 2051, 2055, 1984, 2016, 2032, 2028, 0, 2048, + 2049, 2051, 2055, 1984, 2016, 2032, 2033, 2030, + 0, 2048, 2049, 2051, 2055, 2063, 2016, 0, + 2048, 2049, 2051, 2055, 2063, 2016, 2032, 0, + 2048, 2049, 2051, 2055, 2063, 2016, 2032, 0, + 2048, 2049, 2051, 2055, 2063, 2016, 2032, 2034, + 0, 2048, 2049, 2051, 2055, 2063, 2016, 2032, + 0, 2048, 2049, 2051, 2055, 2063, 2016, 2032, + 2036, 0, 2048, 2049, 2051, 2055, 2063, 2016, + 2032, 2036, 0, 2048, 2049, 2051, 2055, 2063, + 2016, 2032, 2040, 2038, 0, 2048, 2049, 2051, + 2055, 2063, 2016, 2032, 0, 2048, 2049, 2051, + 2055, 2063, 2016, 2032, 2040, 0, 2048, 2049, + 2051, 2055, 2063, 2016, 2032, 2040, 0, 2048, + 2049, 2051, 2055, 2063, 2016, 2032, 2040, 2042, + 0, 2048, 2049, 2051, 2055, 2063, 2016, 2032, + 2040, 0, 2048, 2049, 2051, 2055, 2063, 2016, + 2032, 2040, 2044, 0, 2048, 2049, 2051, 2055, + 2063, 2016, 2032, 2040, 2044, 0, 2048, 2049, + 2051, 2055, 2063, 2016, 2032, 2040, 2044, 2046, + 0, 0, 2048, 0, 2048, 0, 2048, 2050, + 0, 2048, 0, 2048, 2052, 0, 2048, 2052, + 0, 2048, 2056, 2054, 0, 2048, 0, 2048, + 2056, 0, 2048, 2056, 0, 2048, 2056, 2058, + 0, 2048, 2056, 0, 2048, 2064, 2060, 0, + 2048, 2064, 2060, 0, 2048, 2064, 2065, 2062, + 0, 2048, 0, 2048, 2064, 0, 2048, 2064, + 0, 2048, 2064, 2066, 0, 2048, 2064, 0, + 2048, 2064, 2068, 0, 2048, 2064, 2068, 0, + 2048, 2064, 2072, 2070, 0, 2048, 2064, 0, + 2048, 2080, 2072, 0, 2048, 2080, 2072, 0, + 2048, 2080, 2072, 2074, 0, 2048, 2080, 2072, + 0, 2048, 2080, 2081, 2076, 0, 2048, 2080, + 2081, 2076, 0, 2048, 2080, 2081, 2076, 2078, + 0, 2048, 0, 2048, 2080, 0, 2048, 2080, + 0, 2048, 2080, 2082, 0, 2048, 2080, 0, + 2048, 2080, 2084, 0, 2048, 2080, 2084, 0, + 2048, 2080, 2088, 2086, 0, 2048, 2080, 0, + 2048, 2080, 2088, 0, 2048, 2080, 2088, 0, + 2048, 2080, 2088, 2090, 0, 2048, 2080, 2088, + 0, 2048, 2080, 2096, 2092, 0, 2048, 2080, + 2096, 2092, 0, 2048, 2080, 2096, 2097, 2094, + 0, 2048, 2080, 0, 2048, 2112, 2096, 0, + 2048, 2112, 2096, 0, 2048, 2112, 2096, 2098, + 0, 2048, 2112, 2096, 0, 2048, 2112, 2096, + 2100, 0, 2048, 2112, 2096, 2100, 0, 2048, + 2112, 2096, 2104, 2102, 0, 2048, 2112, 2096, + 0, 2048, 2112, 2113, 2104, 0, 2048, 2112, + 2113, 2104, 0, 2048, 2112, 2113, 2104, 2106, + 0, 2048, 2112, 2113, 2104, 0, 2048, 2112, + 2113, 2104, 2108, 0, 2048, 2112, 2113, 2115, + 2108, 0, 2048, 2112, 2113, 2115, 2108, 2110, + 0, 2048, 0, 2048, 2112, 0, 2048, 2112, + 0, 2048, 2112, 2114, 0, 2048, 2112, 0, + 2048, 2112, 2116, 0, 2048, 2112, 2116, 0, + 2048, 2112, 2120, 2118, 0, 2048, 2112, 0, + 2048, 2112, 2120, 0, 2048, 2112, 2120, 0, + 2048, 2112, 2120, 2122, 0, 2048, 2112, 2120, + 0, 2048, 2112, 2128, 2124, 0, 2048, 2112, + 2128, 2124, 0, 2048, 2112, 2128, 2129, 2126, + 0, 2048, 2112, 0, 2048, 2112, 2128, 0, + 2048, 2112, 2128, 0, 2048, 2112, 2128, 2130, + 0, 2048, 2112, 2128, 0, 2048, 2112, 2128, + 2132, 0, 2048, 2112, 2128, 2132, 0, 2048, + 2112, 2128, 2136, 2134, 0, 2048, 2112, 2128, + 0, 2048, 2112, 2144, 2136, 0, 2048, 2112, + 2144, 2136, 0, 2048, 2112, 2144, 2136, 2138, + 0, 2048, 2112, 2144, 2136, 0, 2048, 2112, + 2144, 2145, 2140, 0, 2048, 2112, 2144, 2145, + 2140, 0, 2048, 2112, 2144, 2145, 2140, 2142, + 0, 2048, 2112, 0, 2048, 2176, 2144, 0, + 2048, 2176, 2144, 0, 2048, 2176, 2144, 2146, + 0, 2048, 2176, 2144, 0, 2048, 2176, 2144, + 2148, 0, 2048, 2176, 2144, 2148, 0, 2048, + 2176, 2144, 2152, 2150, 0, 2048, 2176, 2144, + 0, 2048, 2176, 2144, 2152, 0, 2048, 2176, + 2144, 2152, 0, 2048, 2176, 2144, 2152, 2154, + 0, 2048, 2176, 2144, 2152, 0, 2048, 2176, + 2144, 2160, 2156, 0, 2048, 2176, 2144, 2160, + 2156, 0, 2048, 2176, 2144, 2160, 2161, 2158, + 0, 2048, 2176, 2144, 0, 2048, 2176, 2177, + 2160, 0, 2048, 2176, 2177, 2160, 0, 2048, + 2176, 2177, 2160, 2162, 0, 2048, 2176, 2177, + 2160, 0, 2048, 2176, 2177, 2160, 2164, 0, + 2048, 2176, 2177, 2160, 2164, 0, 2048, 2176, + 2177, 2160, 2168, 2166, 0, 2048, 2176, 2177, + 2160, 0, 2048, 2176, 2177, 2160, 2168, 0, + 2048, 2176, 2177, 2179, 2168, 0, 2048, 2176, + 2177, 2179, 2168, 2170, 0, 2048, 2176, 2177, + 2179, 2168, 0, 2048, 2176, 2177, 2179, 2168, + 2172, 0, 2048, 2176, 2177, 2179, 2168, 2172, + 0, 2048, 2176, 2177, 2179, 2168, 2172, 2174, + 0, 2048, 0, 2048, 2176, 0, 2048, 2176, + 0, 2048, 2176, 2178, 0, 2048, 2176, 0, + 2048, 2176, 2180, 0, 2048, 2176, 2180, 0, + 2048, 2176, 2184, 2182, 0, 2048, 2176, 0, + 2048, 2176, 2184, 0, 2048, 2176, 2184, 0, + 2048, 2176, 2184, 2186, 0, 2048, 2176, 2184, + 0, 2048, 2176, 2192, 2188, 0, 2048, 2176, + 2192, 2188, 0, 2048, 2176, 2192, 2193, 2190, + 0, 2048, 2176, 0, 2048, 2176, 2192, 0, + 2048, 2176, 2192, 0, 2048, 2176, 2192, 2194, + 0, 2048, 2176, 2192, 0, 2048, 2176, 2192, + 2196, 0, 2048, 2176, 2192, 2196, 0, 2048, + 2176, 2192, 2200, 2198, 0, 2048, 2176, 2192, + 0, 2048, 2176, 2208, 2200, 0, 2048, 2176, + 2208, 2200, 0, 2048, 2176, 2208, 2200, 2202, + 0, 2048, 2176, 2208, 2200, 0, 2048, 2176, + 2208, 2209, 2204, 0, 2048, 2176, 2208, 2209, + 2204, 0, 2048, 2176, 2208, 2209, 2204, 2206, + 0, 2048, 2176, 0, 2048, 2176, 2208, 0, + 2048, 2176, 2208, 0, 2048, 2176, 2208, 2210, + 0, 2048, 2176, 2208, 0, 2048, 2176, 2208, + 2212, 0, 2048, 2176, 2208, 2212, 0, 2048, + 2176, 2208, 2216, 2214, 0, 2048, 2176, 2208, + 0, 2048, 2176, 2208, 2216, 0, 2048, 2176, + 2208, 2216, 0, 2048, 2176, 2208, 2216, 2218, + 0, 2048, 2176, 2208, 2216, 0, 2048, 2176, + 2208, 2224, 2220, 0, 2048, 2176, 2208, 2224, + 2220, 0, 2048, 2176, 2208, 2224, 2225, 2222, + 0, 2048, 2176, 2208, 0, 2048, 2176, 2240, + 2224, 0, 2048, 2176, 2240, 2224, 0, 2048, + 2176, 2240, 2224, 2226, 0, 2048, 2176, 2240, + 2224, 0, 2048, 2176, 2240, 2224, 2228, 0, + 2048, 2176, 2240, 2224, 2228, 0, 2048, 2176, + 2240, 2224, 2232, 2230, 0, 2048, 2176, 2240, + 2224, 0, 2048, 2176, 2240, 2241, 2232, 0, + 2048, 2176, 2240, 2241, 2232, 0, 2048, 2176, + 2240, 2241, 2232, 2234, 0, 2048, 2176, 2240, + 2241, 2232, 0, 2048, 2176, 2240, 2241, 2232, + 2236, 0, 2048, 2176, 2240, 2241, 2243, 2236, + 0, 2048, 2176, 2240, 2241, 2243, 2236, 2238, + 0, 2048, 2176, 0, 2048, 2304, 2240, 0, + 2048, 2304, 2240, 0, 2048, 2304, 2240, 2242, + 0, 2048, 2304, 2240, 0, 2048, 2304, 2240, + 2244, 0, 2048, 2304, 2240, 2244, 0, 2048, + 2304, 2240, 2248, 2246, 0, 2048, 2304, 2240, + 0, 2048, 2304, 2240, 2248, 0, 2048, 2304, + 2240, 2248, 0, 2048, 2304, 2240, 2248, 2250, + 0, 2048, 2304, 2240, 2248, 0, 2048, 2304, + 2240, 2256, 2252, 0, 2048, 2304, 2240, 2256, + 2252, 0, 2048, 2304, 2240, 2256, 2257, 2254, + 0, 2048, 2304, 2240, 0, 2048, 2304, 2240, + 2256, 0, 2048, 2304, 2240, 2256, 0, 2048, + 2304, 2240, 2256, 2258, 0, 2048, 2304, 2240, + 2256, 0, 2048, 2304, 2240, 2256, 2260, 0, + 2048, 2304, 2240, 2256, 2260, 0, 2048, 2304, + 2240, 2256, 2264, 2262, 0, 2048, 2304, 2240, + 2256, 0, 2048, 2304, 2240, 2272, 2264, 0, + 2048, 2304, 2240, 2272, 2264, 0, 2048, 2304, + 2240, 2272, 2264, 2266, 0, 2048, 2304, 2240, + 2272, 2264, 0, 2048, 2304, 2240, 2272, 2273, + 2268, 0, 2048, 2304, 2240, 2272, 2273, 2268, + 0, 2048, 2304, 2240, 2272, 2273, 2268, 2270, + 0, 2048, 2304, 2240, 0, 2048, 2304, 2305, + 2272, 0, 2048, 2304, 2305, 2272, 0, 2048, + 2304, 2305, 2272, 2274, 0, 2048, 2304, 2305, + 2272, 0, 2048, 2304, 2305, 2272, 2276, 0, + 2048, 2304, 2305, 2272, 2276, 0, 2048, 2304, + 2305, 2272, 2280, 2278, 0, 2048, 2304, 2305, + 2272, 0, 2048, 2304, 2305, 2272, 2280, 0, + 2048, 2304, 2305, 2272, 2280, 0, 2048, 2304, + 2305, 2272, 2280, 2282, 0, 2048, 2304, 2305, + 2272, 2280, 0, 2048, 2304, 2305, 2272, 2288, + 2284, 0, 2048, 2304, 2305, 2272, 2288, 2284, + 0, 2048, 2304, 2305, 2272, 2288, 2289, 2286, + 0, 2048, 2304, 2305, 2272, 0, 2048, 2304, + 2305, 2272, 2288, 0, 2048, 2304, 2305, 2307, + 2288, 0, 2048, 2304, 2305, 2307, 2288, 2290, + 0, 2048, 2304, 2305, 2307, 2288, 0, 2048, + 2304, 2305, 2307, 2288, 2292, 0, 2048, 2304, + 2305, 2307, 2288, 2292, 0, 2048, 2304, 2305, + 2307, 2288, 2296, 2294, 0, 2048, 2304, 2305, + 2307, 2288, 0, 2048, 2304, 2305, 2307, 2288, + 2296, 0, 2048, 2304, 2305, 2307, 2288, 2296, + 0, 2048, 2304, 2305, 2307, 2288, 2296, 2298, + 0, 2048, 2304, 2305, 2307, 2311, 2296, 0, + 2048, 2304, 2305, 2307, 2311, 2296, 2300, 0, + 2048, 2304, 2305, 2307, 2311, 2296, 2300, 0, + 2048, 2304, 2305, 2307, 2311, 2296, 2300, 2302, + 0, 2048, 0, 2048, 2304, 0, 2048, 2304, + 0, 2048, 2304, 2306, 0, 2048, 2304, 0, + 2048, 2304, 2308, 0, 2048, 2304, 2308, 0, + 2048, 2304, 2312, 2310, 0, 2048, 2304, 0, + 2048, 2304, 2312, 0, 2048, 2304, 2312, 0, + 2048, 2304, 2312, 2314, 0, 2048, 2304, 2312, + 0, 2048, 2304, 2320, 2316, 0, 2048, 2304, + 2320, 2316, 0, 2048, 2304, 2320, 2321, 2318, + 0, 2048, 2304, 0, 2048, 2304, 2320, 0, + 2048, 2304, 2320, 0, 2048, 2304, 2320, 2322, + 0, 2048, 2304, 2320, 0, 2048, 2304, 2320, + 2324, 0, 2048, 2304, 2320, 2324, 0, 2048, + 2304, 2320, 2328, 2326, 0, 2048, 2304, 2320, + 0, 2048, 2304, 2336, 2328, 0, 2048, 2304, + 2336, 2328, 0, 2048, 2304, 2336, 2328, 2330, + 0, 2048, 2304, 2336, 2328, 0, 2048, 2304, + 2336, 2337, 2332, 0, 2048, 2304, 2336, 2337, + 2332, 0, 2048, 2304, 2336, 2337, 2332, 2334, + 0, 2048, 2304, 0, 2048, 2304, 2336, 0, + 2048, 2304, 2336, 0, 2048, 2304, 2336, 2338, + 0, 2048, 2304, 2336, 0, 2048, 2304, 2336, + 2340, 0, 2048, 2304, 2336, 2340, 0, 2048, + 2304, 2336, 2344, 2342, 0, 2048, 2304, 2336, + 0, 2048, 2304, 2336, 2344, 0, 2048, 2304, + 2336, 2344, 0, 2048, 2304, 2336, 2344, 2346, + 0, 2048, 2304, 2336, 2344, 0, 2048, 2304, + 2336, 2352, 2348, 0, 2048, 2304, 2336, 2352, + 2348, 0, 2048, 2304, 2336, 2352, 2353, 2350, + 0, 2048, 2304, 2336, 0, 2048, 2304, 2368, + 2352, 0, 2048, 2304, 2368, 2352, 0, 2048, + 2304, 2368, 2352, 2354, 0, 2048, 2304, 2368, + 2352, 0, 2048, 2304, 2368, 2352, 2356, 0, + 2048, 2304, 2368, 2352, 2356, 0, 2048, 2304, + 2368, 2352, 2360, 2358, 0, 2048, 2304, 2368, + 2352, 0, 2048, 2304, 2368, 2369, 2360, 0, + 2048, 2304, 2368, 2369, 2360, 0, 2048, 2304, + 2368, 2369, 2360, 2362, 0, 2048, 2304, 2368, + 2369, 2360, 0, 2048, 2304, 2368, 2369, 2360, + 2364, 0, 2048, 2304, 2368, 2369, 2371, 2364, + 0, 2048, 2304, 2368, 2369, 2371, 2364, 2366, + 0, 2048, 2304, 0, 2048, 2304, 2368, 0, + 2048, 2304, 2368, 0, 2048, 2304, 2368, 2370, + 0, 2048, 2304, 2368, 0, 2048, 2304, 2368, + 2372, 0, 2048, 2304, 2368, 2372, 0, 2048, + 2304, 2368, 2376, 2374, 0, 2048, 2304, 2368, + 0, 2048, 2304, 2368, 2376, 0, 2048, 2304, + 2368, 2376, 0, 2048, 2304, 2368, 2376, 2378, + 0, 2048, 2304, 2368, 2376, 0, 2048, 2304, + 2368, 2384, 2380, 0, 2048, 2304, 2368, 2384, + 2380, 0, 2048, 2304, 2368, 2384, 2385, 2382, + 0, 2048, 2304, 2368, 0, 2048, 2304, 2368, + 2384, 0, 2048, 2304, 2368, 2384, 0, 2048, + 2304, 2368, 2384, 2386, 0, 2048, 2304, 2368, + 2384, 0, 2048, 2304, 2368, 2384, 2388, 0, + 2048, 2304, 2368, 2384, 2388, 0, 2048, 2304, + 2368, 2384, 2392, 2390, 0, 2048, 2304, 2368, + 2384, 0, 2048, 2304, 2368, 2400, 2392, 0, + 2048, 2304, 2368, 2400, 2392, 0, 2048, 2304, + 2368, 2400, 2392, 2394, 0, 2048, 2304, 2368, + 2400, 2392, 0, 2048, 2304, 2368, 2400, 2401, + 2396, 0, 2048, 2304, 2368, 2400, 2401, 2396, + 0, 2048, 2304, 2368, 2400, 2401, 2396, 2398, + 0, 2048, 2304, 2368, 0, 2048, 2304, 2432, + 2400, 0, 2048, 2304, 2432, 2400, 0, 2048, + 2304, 2432, 2400, 2402, 0, 2048, 2304, 2432, + 2400, 0, 2048, 2304, 2432, 2400, 2404, 0, + 2048, 2304, 2432, 2400, 2404, 0, 2048, 2304, + 2432, 2400, 2408, 2406, 0, 2048, 2304, 2432, + 2400, 0, 2048, 2304, 2432, 2400, 2408, 0, + 2048, 2304, 2432, 2400, 2408, 0, 2048, 2304, + 2432, 2400, 2408, 2410, 0, 2048, 2304, 2432, + 2400, 2408, 0, 2048, 2304, 2432, 2400, 2416, + 2412, 0, 2048, 2304, 2432, 2400, 2416, 2412, + 0, 2048, 2304, 2432, 2400, 2416, 2417, 2414, + 0, 2048, 2304, 2432, 2400, 0, 2048, 2304, + 2432, 2433, 2416, 0, 2048, 2304, 2432, 2433, + 2416, 0, 2048, 2304, 2432, 2433, 2416, 2418, + 0, 2048, 2304, 2432, 2433, 2416, 0, 2048, + 2304, 2432, 2433, 2416, 2420, 0, 2048, 2304, + 2432, 2433, 2416, 2420, 0, 2048, 2304, 2432, + 2433, 2416, 2424, 2422, 0, 2048, 2304, 2432, + 2433, 2416, 0, 2048, 2304, 2432, 2433, 2416, + 2424, 0, 2048, 2304, 2432, 2433, 2435, 2424, + 0, 2048, 2304, 2432, 2433, 2435, 2424, 2426, + 0, 2048, 2304, 2432, 2433, 2435, 2424, 0, + 2048, 2304, 2432, 2433, 2435, 2424, 2428, 0, + 2048, 2304, 2432, 2433, 2435, 2424, 2428, 0, + 2048, 2304, 2432, 2433, 2435, 2424, 2428, 2430, + 0, 2048, 2304, 0, 2048, 2560, 2432, 0, + 2048, 2560, 2432, 0, 2048, 2560, 2432, 2434, + 0, 2048, 2560, 2432, 0, 2048, 2560, 2432, + 2436, 0, 2048, 2560, 2432, 2436, 0, 2048, + 2560, 2432, 2440, 2438, 0, 2048, 2560, 2432, + 0, 2048, 2560, 2432, 2440, 0, 2048, 2560, + 2432, 2440, 0, 2048, 2560, 2432, 2440, 2442, + 0, 2048, 2560, 2432, 2440, 0, 2048, 2560, + 2432, 2448, 2444, 0, 2048, 2560, 2432, 2448, + 2444, 0, 2048, 2560, 2432, 2448, 2449, 2446, + 0, 2048, 2560, 2432, 0, 2048, 2560, 2432, + 2448, 0, 2048, 2560, 2432, 2448, 0, 2048, + 2560, 2432, 2448, 2450, 0, 2048, 2560, 2432, + 2448, 0, 2048, 2560, 2432, 2448, 2452, 0, + 2048, 2560, 2432, 2448, 2452, 0, 2048, 2560, + 2432, 2448, 2456, 2454, 0, 2048, 2560, 2432, + 2448, 0, 2048, 2560, 2432, 2464, 2456, 0, + 2048, 2560, 2432, 2464, 2456, 0, 2048, 2560, + 2432, 2464, 2456, 2458, 0, 2048, 2560, 2432, + 2464, 2456, 0, 2048, 2560, 2432, 2464, 2465, + 2460, 0, 2048, 2560, 2432, 2464, 2465, 2460, + 0, 2048, 2560, 2432, 2464, 2465, 2460, 2462, + 0, 2048, 2560, 2432, 0, 2048, 2560, 2432, + 2464, 0, 2048, 2560, 2432, 2464, 0, 2048, + 2560, 2432, 2464, 2466, 0, 2048, 2560, 2432, + 2464, 0, 2048, 2560, 2432, 2464, 2468, 0, + 2048, 2560, 2432, 2464, 2468, 0, 2048, 2560, + 2432, 2464, 2472, 2470, 0, 2048, 2560, 2432, + 2464, 0, 2048, 2560, 2432, 2464, 2472, 0, + 2048, 2560, 2432, 2464, 2472, 0, 2048, 2560, + 2432, 2464, 2472, 2474, 0, 2048, 2560, 2432, + 2464, 2472, 0, 2048, 2560, 2432, 2464, 2480, + 2476, 0, 2048, 2560, 2432, 2464, 2480, 2476, + 0, 2048, 2560, 2432, 2464, 2480, 2481, 2478, + 0, 2048, 2560, 2432, 2464, 0, 2048, 2560, + 2432, 2496, 2480, 0, 2048, 2560, 2432, 2496, + 2480, 0, 2048, 2560, 2432, 2496, 2480, 2482, + 0, 2048, 2560, 2432, 2496, 2480, 0, 2048, + 2560, 2432, 2496, 2480, 2484, 0, 2048, 2560, + 2432, 2496, 2480, 2484, 0, 2048, 2560, 2432, + 2496, 2480, 2488, 2486, 0, 2048, 2560, 2432, + 2496, 2480, 0, 2048, 2560, 2432, 2496, 2497, + 2488, 0, 2048, 2560, 2432, 2496, 2497, 2488, + 0, 2048, 2560, 2432, 2496, 2497, 2488, 2490, + 0, 2048, 2560, 2432, 2496, 2497, 2488, 0, + 2048, 2560, 2432, 2496, 2497, 2488, 2492, 0, + 2048, 2560, 2432, 2496, 2497, 2499, 2492, 0, + 2048, 2560, 2432, 2496, 2497, 2499, 2492, 2494, + 0, 2048, 2560, 2432, 0, 2048, 2560, 2561, + 2496, 0, 2048, 2560, 2561, 2496, 0, 2048, + 2560, 2561, 2496, 2498, 0, 2048, 2560, 2561, + 2496, 0, 2048, 2560, 2561, 2496, 2500, 0, + 2048, 2560, 2561, 2496, 2500, 0, 2048, 2560, + 2561, 2496, 2504, 2502, 0, 2048, 2560, 2561, + 2496, 0, 2048, 2560, 2561, 2496, 2504, 0, + 2048, 2560, 2561, 2496, 2504, 0, 2048, 2560, + 2561, 2496, 2504, 2506, 0, 2048, 2560, 2561, + 2496, 2504, 0, 2048, 2560, 2561, 2496, 2512, + 2508, 0, 2048, 2560, 2561, 2496, 2512, 2508, + 0, 2048, 2560, 2561, 2496, 2512, 2513, 2510, + 0, 2048, 2560, 2561, 2496, 0, 2048, 2560, + 2561, 2496, 2512, 0, 2048, 2560, 2561, 2496, + 2512, 0, 2048, 2560, 2561, 2496, 2512, 2514, + 0, 2048, 2560, 2561, 2496, 2512, 0, 2048, + 2560, 2561, 2496, 2512, 2516, 0, 2048, 2560, + 2561, 2496, 2512, 2516, 0, 2048, 2560, 2561, + 2496, 2512, 2520, 2518, 0, 2048, 2560, 2561, + 2496, 2512, 0, 2048, 2560, 2561, 2496, 2528, + 2520, 0, 2048, 2560, 2561, 2496, 2528, 2520, + 0, 2048, 2560, 2561, 2496, 2528, 2520, 2522, + 0, 2048, 2560, 2561, 2496, 2528, 2520, 0, + 2048, 2560, 2561, 2496, 2528, 2529, 2524, 0, + 2048, 2560, 2561, 2496, 2528, 2529, 2524, 0, + 2048, 2560, 2561, 2496, 2528, 2529, 2524, 2526, + 0, 2048, 2560, 2561, 2496, 0, 2048, 2560, + 2561, 2496, 2528, 0, 2048, 2560, 2561, 2563, + 2528, 0, 2048, 2560, 2561, 2563, 2528, 2530, + 0, 2048, 2560, 2561, 2563, 2528, 0, 2048, + 2560, 2561, 2563, 2528, 2532, 0, 2048, 2560, + 2561, 2563, 2528, 2532, 0, 2048, 2560, 2561, + 2563, 2528, 2536, 2534, 0, 2048, 2560, 2561, + 2563, 2528, 0, 2048, 2560, 2561, 2563, 2528, + 2536, 0, 2048, 2560, 2561, 2563, 2528, 2536, + 0, 2048, 2560, 2561, 2563, 2528, 2536, 2538, + 0, 2048, 2560, 2561, 2563, 2528, 2536, 0, + 2048, 2560, 2561, 2563, 2528, 2544, 2540, 0, + 2048, 2560, 2561, 2563, 2528, 2544, 2540, 0, + 2048, 2560, 2561, 2563, 2528, 2544, 2545, 2542, + 0, 2048, 2560, 2561, 2563, 2528, 0, 2048, + 2560, 2561, 2563, 2528, 2544, 0, 2048, 2560, + 2561, 2563, 2528, 2544, 0, 2048, 2560, 2561, + 2563, 2528, 2544, 2546, 0, 2048, 2560, 2561, + 2563, 2567, 2544, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2548, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2548, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2552, 2550, 0, 2048, 2560, 2561, + 2563, 2567, 2544, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2552, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2552, 0, 2048, 2560, 2561, 2563, + 2567, 2544, 2552, 2554, 0, 2048, 2560, 2561, + 2563, 2567, 2544, 2552, 0, 2048, 2560, 2561, + 2563, 2567, 2544, 2552, 2556, 0, 2048, 2560, + 2561, 2563, 2567, 2544, 2552, 2556, 0, 2048, + 2560, 2561, 2563, 2567, 2544, 2552, 2556, 2558, + 0, 2048, 0, 2048, 2560, 0, 2048, 2560, + 0, 2048, 2560, 2562, 0, 2048, 2560, 0, + 2048, 2560, 2564, 0, 2048, 2560, 2564, 0, + 2048, 2560, 2568, 2566, 0, 2048, 2560, 0, + 2048, 2560, 2568, 0, 2048, 2560, 2568, 0, + 2048, 2560, 2568, 2570, 0, 2048, 2560, 2568, + 0, 2048, 2560, 2576, 2572, 0, 2048, 2560, + 2576, 2572, 0, 2048, 2560, 2576, 2577, 2574, + 0, 2048, 2560, 0, 2048, 2560, 2576, 0, + 2048, 2560, 2576, 0, 2048, 2560, 2576, 2578, + 0, 2048, 2560, 2576, 0, 2048, 2560, 2576, + 2580, 0, 2048, 2560, 2576, 2580, 0, 2048, + 2560, 2576, 2584, 2582, 0, 2048, 2560, 2576, + 0, 2048, 2560, 2592, 2584, 0, 2048, 2560, + 2592, 2584, 0, 2048, 2560, 2592, 2584, 2586, + 0, 2048, 2560, 2592, 2584, 0, 2048, 2560, + 2592, 2593, 2588, 0, 2048, 2560, 2592, 2593, + 2588, 0, 2048, 2560, 2592, 2593, 2588, 2590, + 0, 2048, 2560, 0, 2048, 2560, 2592, 0, + 2048, 2560, 2592, 0, 2048, 2560, 2592, 2594, + 0, 2048, 2560, 2592, 0, 2048, 2560, 2592, + 2596, 0, 2048, 2560, 2592, 2596, 0, 2048, + 2560, 2592, 2600, 2598, 0, 2048, 2560, 2592, + 0, 2048, 2560, 2592, 2600, 0, 2048, 2560, + 2592, 2600, 0, 2048, 2560, 2592, 2600, 2602, + 0, 2048, 2560, 2592, 2600, 0, 2048, 2560, + 2592, 2608, 2604, 0, 2048, 2560, 2592, 2608, + 2604, 0, 2048, 2560, 2592, 2608, 2609, 2606, + 0, 2048, 2560, 2592, 0, 2048, 2560, 2624, + 2608, 0, 2048, 2560, 2624, 2608, 0, 2048, + 2560, 2624, 2608, 2610, 0, 2048, 2560, 2624, + 2608, 0, 2048, 2560, 2624, 2608, 2612, 0, + 2048, 2560, 2624, 2608, 2612, 0, 2048, 2560, + 2624, 2608, 2616, 2614, 0, 2048, 2560, 2624, + 2608, 0, 2048, 2560, 2624, 2625, 2616, 0, + 2048, 2560, 2624, 2625, 2616, 0, 2048, 2560, + 2624, 2625, 2616, 2618, 0, 2048, 2560, 2624, + 2625, 2616, 0, 2048, 2560, 2624, 2625, 2616, + 2620, 0, 2048, 2560, 2624, 2625, 2627, 2620, + 0, 2048, 2560, 2624, 2625, 2627, 2620, 2622, + 0, 2048, 2560, 0, 2048, 2560, 2624, 0, + 2048, 2560, 2624, 0, 2048, 2560, 2624, 2626, + 0, 2048, 2560, 2624, 0, 2048, 2560, 2624, + 2628, 0, 2048, 2560, 2624, 2628, 0, 2048, + 2560, 2624, 2632, 2630, 0, 2048, 2560, 2624, + 0, 2048, 2560, 2624, 2632, 0, 2048, 2560, + 2624, 2632, 0, 2048, 2560, 2624, 2632, 2634, + 0, 2048, 2560, 2624, 2632, 0, 2048, 2560, + 2624, 2640, 2636, 0, 2048, 2560, 2624, 2640, + 2636, 0, 2048, 2560, 2624, 2640, 2641, 2638, + 0, 2048, 2560, 2624, 0, 2048, 2560, 2624, + 2640, 0, 2048, 2560, 2624, 2640, 0, 2048, + 2560, 2624, 2640, 2642, 0, 2048, 2560, 2624, + 2640, 0, 2048, 2560, 2624, 2640, 2644, 0, + 2048, 2560, 2624, 2640, 2644, 0, 2048, 2560, + 2624, 2640, 2648, 2646, 0, 2048, 2560, 2624, + 2640, 0, 2048, 2560, 2624, 2656, 2648, 0, + 2048, 2560, 2624, 2656, 2648, 0, 2048, 2560, + 2624, 2656, 2648, 2650, 0, 2048, 2560, 2624, + 2656, 2648, 0, 2048, 2560, 2624, 2656, 2657, + 2652, 0, 2048, 2560, 2624, 2656, 2657, 2652, + 0, 2048, 2560, 2624, 2656, 2657, 2652, 2654, + 0, 2048, 2560, 2624, 0, 2048, 2560, 2688, + 2656, 0, 2048, 2560, 2688, 2656, 0, 2048, + 2560, 2688, 2656, 2658, 0, 2048, 2560, 2688, + 2656, 0, 2048, 2560, 2688, 2656, 2660, 0, + 2048, 2560, 2688, 2656, 2660, 0, 2048, 2560, + 2688, 2656, 2664, 2662, 0, 2048, 2560, 2688, + 2656, 0, 2048, 2560, 2688, 2656, 2664, 0, + 2048, 2560, 2688, 2656, 2664, 0, 2048, 2560, + 2688, 2656, 2664, 2666, 0, 2048, 2560, 2688, + 2656, 2664, 0, 2048, 2560, 2688, 2656, 2672, + 2668, 0, 2048, 2560, 2688, 2656, 2672, 2668, + 0, 2048, 2560, 2688, 2656, 2672, 2673, 2670, + 0, 2048, 2560, 2688, 2656, 0, 2048, 2560, + 2688, 2689, 2672, 0, 2048, 2560, 2688, 2689, + 2672, 0, 2048, 2560, 2688, 2689, 2672, 2674, + 0, 2048, 2560, 2688, 2689, 2672, 0, 2048, + 2560, 2688, 2689, 2672, 2676, 0, 2048, 2560, + 2688, 2689, 2672, 2676, 0, 2048, 2560, 2688, + 2689, 2672, 2680, 2678, 0, 2048, 2560, 2688, + 2689, 2672, 0, 2048, 2560, 2688, 2689, 2672, + 2680, 0, 2048, 2560, 2688, 2689, 2691, 2680, + 0, 2048, 2560, 2688, 2689, 2691, 2680, 2682, + 0, 2048, 2560, 2688, 2689, 2691, 2680, 0, + 2048, 2560, 2688, 2689, 2691, 2680, 2684, 0, + 2048, 2560, 2688, 2689, 2691, 2680, 2684, 0, + 2048, 2560, 2688, 2689, 2691, 2680, 2684, 2686, + 0, 2048, 2560, 0, 2048, 2560, 2688, 0, + 2048, 2560, 2688, 0, 2048, 2560, 2688, 2690, + 0, 2048, 2560, 2688, 0, 2048, 2560, 2688, + 2692, 0, 2048, 2560, 2688, 2692, 0, 2048, + 2560, 2688, 2696, 2694, 0, 2048, 2560, 2688, + 0, 2048, 2560, 2688, 2696, 0, 2048, 2560, + 2688, 2696, 0, 2048, 2560, 2688, 2696, 2698, + 0, 2048, 2560, 2688, 2696, 0, 2048, 2560, + 2688, 2704, 2700, 0, 2048, 2560, 2688, 2704, + 2700, 0, 2048, 2560, 2688, 2704, 2705, 2702, + 0, 2048, 2560, 2688, 0, 2048, 2560, 2688, + 2704, 0, 2048, 2560, 2688, 2704, 0, 2048, + 2560, 2688, 2704, 2706, 0, 2048, 2560, 2688, + 2704, 0, 2048, 2560, 2688, 2704, 2708, 0, + 2048, 2560, 2688, 2704, 2708, 0, 2048, 2560, + 2688, 2704, 2712, 2710, 0, 2048, 2560, 2688, + 2704, 0, 2048, 2560, 2688, 2720, 2712, 0, + 2048, 2560, 2688, 2720, 2712, 0, 2048, 2560, + 2688, 2720, 2712, 2714, 0, 2048, 2560, 2688, + 2720, 2712, 0, 2048, 2560, 2688, 2720, 2721, + 2716, 0, 2048, 2560, 2688, 2720, 2721, 2716, + 0, 2048, 2560, 2688, 2720, 2721, 2716, 2718, + 0, 2048, 2560, 2688, 0, 2048, 2560, 2688, + 2720, 0, 2048, 2560, 2688, 2720, 0, 2048, + 2560, 2688, 2720, 2722, 0, 2048, 2560, 2688, + 2720, 0, 2048, 2560, 2688, 2720, 2724, 0, + 2048, 2560, 2688, 2720, 2724, 0, 2048, 2560, + 2688, 2720, 2728, 2726, 0, 2048, 2560, 2688, + 2720, 0, 2048, 2560, 2688, 2720, 2728, 0, + 2048, 2560, 2688, 2720, 2728, 0, 2048, 2560, + 2688, 2720, 2728, 2730, 0, 2048, 2560, 2688, + 2720, 2728, 0, 2048, 2560, 2688, 2720, 2736, + 2732, 0, 2048, 2560, 2688, 2720, 2736, 2732, + 0, 2048, 2560, 2688, 2720, 2736, 2737, 2734, + 0, 2048, 2560, 2688, 2720, 0, 2048, 2560, + 2688, 2752, 2736, 0, 2048, 2560, 2688, 2752, + 2736, 0, 2048, 2560, 2688, 2752, 2736, 2738, + 0, 2048, 2560, 2688, 2752, 2736, 0, 2048, + 2560, 2688, 2752, 2736, 2740, 0, 2048, 2560, + 2688, 2752, 2736, 2740, 0, 2048, 2560, 2688, + 2752, 2736, 2744, 2742, 0, 2048, 2560, 2688, + 2752, 2736, 0, 2048, 2560, 2688, 2752, 2753, + 2744, 0, 2048, 2560, 2688, 2752, 2753, 2744, + 0, 2048, 2560, 2688, 2752, 2753, 2744, 2746, + 0, 2048, 2560, 2688, 2752, 2753, 2744, 0, + 2048, 2560, 2688, 2752, 2753, 2744, 2748, 0, + 2048, 2560, 2688, 2752, 2753, 2755, 2748, 0, + 2048, 2560, 2688, 2752, 2753, 2755, 2748, 2750, + 0, 2048, 2560, 2688, 0, 2048, 2560, 2816, + 2752, 0, 2048, 2560, 2816, 2752, 0, 2048, + 2560, 2816, 2752, 2754, 0, 2048, 2560, 2816, + 2752, 0, 2048, 2560, 2816, 2752, 2756, 0, + 2048, 2560, 2816, 2752, 2756, 0, 2048, 2560, + 2816, 2752, 2760, 2758, 0, 2048, 2560, 2816, + 2752, 0, 2048, 2560, 2816, 2752, 2760, 0, + 2048, 2560, 2816, 2752, 2760, 0, 2048, 2560, + 2816, 2752, 2760, 2762, 0, 2048, 2560, 2816, + 2752, 2760, 0, 2048, 2560, 2816, 2752, 2768, + 2764, 0, 2048, 2560, 2816, 2752, 2768, 2764, + 0, 2048, 2560, 2816, 2752, 2768, 2769, 2766, + 0, 2048, 2560, 2816, 2752, 0, 2048, 2560, + 2816, 2752, 2768, 0, 2048, 2560, 2816, 2752, + 2768, 0, 2048, 2560, 2816, 2752, 2768, 2770, + 0, 2048, 2560, 2816, 2752, 2768, 0, 2048, + 2560, 2816, 2752, 2768, 2772, 0, 2048, 2560, + 2816, 2752, 2768, 2772, 0, 2048, 2560, 2816, + 2752, 2768, 2776, 2774, 0, 2048, 2560, 2816, + 2752, 2768, 0, 2048, 2560, 2816, 2752, 2784, + 2776, 0, 2048, 2560, 2816, 2752, 2784, 2776, + 0, 2048, 2560, 2816, 2752, 2784, 2776, 2778, + 0, 2048, 2560, 2816, 2752, 2784, 2776, 0, + 2048, 2560, 2816, 2752, 2784, 2785, 2780, 0, + 2048, 2560, 2816, 2752, 2784, 2785, 2780, 0, + 2048, 2560, 2816, 2752, 2784, 2785, 2780, 2782, + 0, 2048, 2560, 2816, 2752, 0, 2048, 2560, + 2816, 2817, 2784, 0, 2048, 2560, 2816, 2817, + 2784, 0, 2048, 2560, 2816, 2817, 2784, 2786, + 0, 2048, 2560, 2816, 2817, 2784, 0, 2048, + 2560, 2816, 2817, 2784, 2788, 0, 2048, 2560, + 2816, 2817, 2784, 2788, 0, 2048, 2560, 2816, + 2817, 2784, 2792, 2790, 0, 2048, 2560, 2816, + 2817, 2784, 0, 2048, 2560, 2816, 2817, 2784, + 2792, 0, 2048, 2560, 2816, 2817, 2784, 2792, + 0, 2048, 2560, 2816, 2817, 2784, 2792, 2794, + 0, 2048, 2560, 2816, 2817, 2784, 2792, 0, + 2048, 2560, 2816, 2817, 2784, 2800, 2796, 0, + 2048, 2560, 2816, 2817, 2784, 2800, 2796, 0, + 2048, 2560, 2816, 2817, 2784, 2800, 2801, 2798, + 0, 2048, 2560, 2816, 2817, 2784, 0, 2048, + 2560, 2816, 2817, 2784, 2800, 0, 2048, 2560, + 2816, 2817, 2819, 2800, 0, 2048, 2560, 2816, + 2817, 2819, 2800, 2802, 0, 2048, 2560, 2816, + 2817, 2819, 2800, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2804, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2804, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2808, 2806, 0, 2048, 2560, 2816, + 2817, 2819, 2800, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2808, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2808, 0, 2048, 2560, 2816, 2817, + 2819, 2800, 2808, 2810, 0, 2048, 2560, 2816, + 2817, 2819, 2823, 2808, 0, 2048, 2560, 2816, + 2817, 2819, 2823, 2808, 2812, 0, 2048, 2560, + 2816, 2817, 2819, 2823, 2808, 2812, 0, 2048, + 2560, 2816, 2817, 2819, 2823, 2808, 2812, 2814, + 0, 2048, 2560, 0, 2048, 3072, 2816, 0, + 2048, 3072, 2816, 0, 2048, 3072, 2816, 2818, + 0, 2048, 3072, 2816, 0, 2048, 3072, 2816, + 2820, 0, 2048, 3072, 2816, 2820, 0, 2048, + 3072, 2816, 2824, 2822, 0, 2048, 3072, 2816, + 0, 2048, 3072, 2816, 2824, 0, 2048, 3072, + 2816, 2824, 0, 2048, 3072, 2816, 2824, 2826, + 0, 2048, 3072, 2816, 2824, 0, 2048, 3072, + 2816, 2832, 2828, 0, 2048, 3072, 2816, 2832, + 2828, 0, 2048, 3072, 2816, 2832, 2833, 2830, + 0, 2048, 3072, 2816, 0, 2048, 3072, 2816, + 2832, 0, 2048, 3072, 2816, 2832, 0, 2048, + 3072, 2816, 2832, 2834, 0, 2048, 3072, 2816, + 2832, 0, 2048, 3072, 2816, 2832, 2836, 0, + 2048, 3072, 2816, 2832, 2836, 0, 2048, 3072, + 2816, 2832, 2840, 2838, 0, 2048, 3072, 2816, + 2832, 0, 2048, 3072, 2816, 2848, 2840, 0, + 2048, 3072, 2816, 2848, 2840, 0, 2048, 3072, + 2816, 2848, 2840, 2842, 0, 2048, 3072, 2816, + 2848, 2840, 0, 2048, 3072, 2816, 2848, 2849, + 2844, 0, 2048, 3072, 2816, 2848, 2849, 2844, + 0, 2048, 3072, 2816, 2848, 2849, 2844, 2846, + 0, 2048, 3072, 2816, 0, 2048, 3072, 2816, + 2848, 0, 2048, 3072, 2816, 2848, 0, 2048, + 3072, 2816, 2848, 2850, 0, 2048, 3072, 2816, + 2848, 0, 2048, 3072, 2816, 2848, 2852, 0, + 2048, 3072, 2816, 2848, 2852, 0, 2048, 3072, + 2816, 2848, 2856, 2854, 0, 2048, 3072, 2816, + 2848, 0, 2048, 3072, 2816, 2848, 2856, 0, + 2048, 3072, 2816, 2848, 2856, 0, 2048, 3072, + 2816, 2848, 2856, 2858, 0, 2048, 3072, 2816, + 2848, 2856, 0, 2048, 3072, 2816, 2848, 2864, + 2860, 0, 2048, 3072, 2816, 2848, 2864, 2860, + 0, 2048, 3072, 2816, 2848, 2864, 2865, 2862, + 0, 2048, 3072, 2816, 2848, 0, 2048, 3072, + 2816, 2880, 2864, 0, 2048, 3072, 2816, 2880, + 2864, 0, 2048, 3072, 2816, 2880, 2864, 2866, + 0, 2048, 3072, 2816, 2880, 2864, 0, 2048, + 3072, 2816, 2880, 2864, 2868, 0, 2048, 3072, + 2816, 2880, 2864, 2868, 0, 2048, 3072, 2816, + 2880, 2864, 2872, 2870, 0, 2048, 3072, 2816, + 2880, 2864, 0, 2048, 3072, 2816, 2880, 2881, + 2872, 0, 2048, 3072, 2816, 2880, 2881, 2872, + 0, 2048, 3072, 2816, 2880, 2881, 2872, 2874, + 0, 2048, 3072, 2816, 2880, 2881, 2872, 0, + 2048, 3072, 2816, 2880, 2881, 2872, 2876, 0, + 2048, 3072, 2816, 2880, 2881, 2883, 2876, 0, + 2048, 3072, 2816, 2880, 2881, 2883, 2876, 2878, + 0, 2048, 3072, 2816, 0, 2048, 3072, 2816, + 2880, 0, 2048, 3072, 2816, 2880, 0, 2048, + 3072, 2816, 2880, 2882, 0, 2048, 3072, 2816, + 2880, 0, 2048, 3072, 2816, 2880, 2884, 0, + 2048, 3072, 2816, 2880, 2884, 0, 2048, 3072, + 2816, 2880, 2888, 2886, 0, 2048, 3072, 2816, + 2880, 0, 2048, 3072, 2816, 2880, 2888, 0, + 2048, 3072, 2816, 2880, 2888, 0, 2048, 3072, + 2816, 2880, 2888, 2890, 0, 2048, 3072, 2816, + 2880, 2888, 0, 2048, 3072, 2816, 2880, 2896, + 2892, 0, 2048, 3072, 2816, 2880, 2896, 2892, + 0, 2048, 3072, 2816, 2880, 2896, 2897, 2894, + 0, 2048, 3072, 2816, 2880, 0, 2048, 3072, + 2816, 2880, 2896, 0, 2048, 3072, 2816, 2880, + 2896, 0, 2048, 3072, 2816, 2880, 2896, 2898, + 0, 2048, 3072, 2816, 2880, 2896, 0, 2048, + 3072, 2816, 2880, 2896, 2900, 0, 2048, 3072, + 2816, 2880, 2896, 2900, 0, 2048, 3072, 2816, + 2880, 2896, 2904, 2902, 0, 2048, 3072, 2816, + 2880, 2896, 0, 2048, 3072, 2816, 2880, 2912, + 2904, 0, 2048, 3072, 2816, 2880, 2912, 2904, + 0, 2048, 3072, 2816, 2880, 2912, 2904, 2906, + 0, 2048, 3072, 2816, 2880, 2912, 2904, 0, + 2048, 3072, 2816, 2880, 2912, 2913, 2908, 0, + 2048, 3072, 2816, 2880, 2912, 2913, 2908, 0, + 2048, 3072, 2816, 2880, 2912, 2913, 2908, 2910, + 0, 2048, 3072, 2816, 2880, 0, 2048, 3072, + 2816, 2944, 2912, 0, 2048, 3072, 2816, 2944, + 2912, 0, 2048, 3072, 2816, 2944, 2912, 2914, + 0, 2048, 3072, 2816, 2944, 2912, 0, 2048, + 3072, 2816, 2944, 2912, 2916, 0, 2048, 3072, + 2816, 2944, 2912, 2916, 0, 2048, 3072, 2816, + 2944, 2912, 2920, 2918, 0, 2048, 3072, 2816, + 2944, 2912, 0, 2048, 3072, 2816, 2944, 2912, + 2920, 0, 2048, 3072, 2816, 2944, 2912, 2920, + 0, 2048, 3072, 2816, 2944, 2912, 2920, 2922, + 0, 2048, 3072, 2816, 2944, 2912, 2920, 0, + 2048, 3072, 2816, 2944, 2912, 2928, 2924, 0, + 2048, 3072, 2816, 2944, 2912, 2928, 2924, 0, + 2048, 3072, 2816, 2944, 2912, 2928, 2929, 2926, + 0, 2048, 3072, 2816, 2944, 2912, 0, 2048, + 3072, 2816, 2944, 2945, 2928, 0, 2048, 3072, + 2816, 2944, 2945, 2928, 0, 2048, 3072, 2816, + 2944, 2945, 2928, 2930, 0, 2048, 3072, 2816, + 2944, 2945, 2928, 0, 2048, 3072, 2816, 2944, + 2945, 2928, 2932, 0, 2048, 3072, 2816, 2944, + 2945, 2928, 2932, 0, 2048, 3072, 2816, 2944, + 2945, 2928, 2936, 2934, 0, 2048, 3072, 2816, + 2944, 2945, 2928, 0, 2048, 3072, 2816, 2944, + 2945, 2928, 2936, 0, 2048, 3072, 2816, 2944, + 2945, 2947, 2936, 0, 2048, 3072, 2816, 2944, + 2945, 2947, 2936, 2938, 0, 2048, 3072, 2816, + 2944, 2945, 2947, 2936, 0, 2048, 3072, 2816, + 2944, 2945, 2947, 2936, 2940, 0, 2048, 3072, + 2816, 2944, 2945, 2947, 2936, 2940, 0, 2048, + 3072, 2816, 2944, 2945, 2947, 2936, 2940, 2942, + 0, 2048, 3072, 2816, 0, 2048, 3072, 2816, + 2944, 0, 2048, 3072, 3073, 2944, 0, 2048, + 3072, 3073, 2944, 2946, 0, 2048, 3072, 3073, + 2944, 0, 2048, 3072, 3073, 2944, 2948, 0, + 2048, 3072, 3073, 2944, 2948, 0, 2048, 3072, + 3073, 2944, 2952, 2950, 0, 2048, 3072, 3073, + 2944, 0, 2048, 3072, 3073, 2944, 2952, 0, + 2048, 3072, 3073, 2944, 2952, 0, 2048, 3072, + 3073, 2944, 2952, 2954, 0, 2048, 3072, 3073, + 2944, 2952, 0, 2048, 3072, 3073, 2944, 2960, + 2956, 0, 2048, 3072, 3073, 2944, 2960, 2956, + 0, 2048, 3072, 3073, 2944, 2960, 2961, 2958, + 0, 2048, 3072, 3073, 2944, 0, 2048, 3072, + 3073, 2944, 2960, 0, 2048, 3072, 3073, 2944, + 2960, 0, 2048, 3072, 3073, 2944, 2960, 2962, + 0, 2048, 3072, 3073, 2944, 2960, 0, 2048, + 3072, 3073, 2944, 2960, 2964, 0, 2048, 3072, + 3073, 2944, 2960, 2964, 0, 2048, 3072, 3073, + 2944, 2960, 2968, 2966, 0, 2048, 3072, 3073, + 2944, 2960, 0, 2048, 3072, 3073, 2944, 2976, + 2968, 0, 2048, 3072, 3073, 2944, 2976, 2968, + 0, 2048, 3072, 3073, 2944, 2976, 2968, 2970, + 0, 2048, 3072, 3073, 2944, 2976, 2968, 0, + 2048, 3072, 3073, 2944, 2976, 2977, 2972, 0, + 2048, 3072, 3073, 2944, 2976, 2977, 2972, 0, + 2048, 3072, 3073, 2944, 2976, 2977, 2972, 2974, + 0, 2048, 3072, 3073, 2944, 0, 2048, 3072, + 3073, 2944, 2976, 0, 2048, 3072, 3073, 2944, + 2976, 0, 2048, 3072, 3073, 2944, 2976, 2978, + 0, 2048, 3072, 3073, 2944, 2976, 0, 2048, + 3072, 3073, 2944, 2976, 2980, 0, 2048, 3072, + 3073, 2944, 2976, 2980, 0, 2048, 3072, 3073, + 2944, 2976, 2984, 2982, 0, 2048, 3072, 3073, + 2944, 2976, 0, 2048, 3072, 3073, 2944, 2976, + 2984, 0, 2048, 3072, 3073, 2944, 2976, 2984, + 0, 2048, 3072, 3073, 2944, 2976, 2984, 2986, + 0, 2048, 3072, 3073, 2944, 2976, 2984, 0, + 2048, 3072, 3073, 2944, 2976, 2992, 2988, 0, + 2048, 3072, 3073, 2944, 2976, 2992, 2988, 0, + 2048, 3072, 3073, 2944, 2976, 2992, 2993, 2990, + 0, 2048, 3072, 3073, 2944, 2976, 0, 2048, + 3072, 3073, 2944, 3008, 2992, 0, 2048, 3072, + 3073, 2944, 3008, 2992, 0, 2048, 3072, 3073, + 2944, 3008, 2992, 2994, 0, 2048, 3072, 3073, + 2944, 3008, 2992, 0, 2048, 3072, 3073, 2944, + 3008, 2992, 2996, 0, 2048, 3072, 3073, 2944, + 3008, 2992, 2996, 0, 2048, 3072, 3073, 2944, + 3008, 2992, 3000, 2998, 0, 2048, 3072, 3073, + 2944, 3008, 2992, 0, 2048, 3072, 3073, 2944, + 3008, 3009, 3000, 0, 2048, 3072, 3073, 2944, + 3008, 3009, 3000, 0, 2048, 3072, 3073, 2944, + 3008, 3009, 3000, 3002, 0, 2048, 3072, 3073, + 2944, 3008, 3009, 3000, 0, 2048, 3072, 3073, + 2944, 3008, 3009, 3000, 3004, 0, 2048, 3072, + 3073, 2944, 3008, 3009, 3011, 3004, 0, 2048, + 3072, 3073, 2944, 3008, 3009, 3011, 3004, 3006, + 0, 2048, 3072, 3073, 2944, 0, 2048, 3072, + 3073, 2944, 3008, 0, 2048, 3072, 3073, 2944, + 3008, 0, 2048, 3072, 3073, 2944, 3008, 3010, + 0, 2048, 3072, 3073, 3075, 3008, 0, 2048, + 3072, 3073, 3075, 3008, 3012, 0, 2048, 3072, + 3073, 3075, 3008, 3012, 0, 2048, 3072, 3073, + 3075, 3008, 3016, 3014, 0, 2048, 3072, 3073, + 3075, 3008, 0, 2048, 3072, 3073, 3075, 3008, + 3016, 0, 2048, 3072, 3073, 3075, 3008, 3016, + 0, 2048, 3072, 3073, 3075, 3008, 3016, 3018, + 0, 2048, 3072, 3073, 3075, 3008, 3016, 0, + 2048, 3072, 3073, 3075, 3008, 3024, 3020, 0, + 2048, 3072, 3073, 3075, 3008, 3024, 3020, 0, + 2048, 3072, 3073, 3075, 3008, 3024, 3025, 3022, + 0, 2048, 3072, 3073, 3075, 3008, 0, 2048, + 3072, 3073, 3075, 3008, 3024, 0, 2048, 3072, + 3073, 3075, 3008, 3024, 0, 2048, 3072, 3073, + 3075, 3008, 3024, 3026, 0, 2048, 3072, 3073, + 3075, 3008, 3024, 0, 2048, 3072, 3073, 3075, + 3008, 3024, 3028, 0, 2048, 3072, 3073, 3075, + 3008, 3024, 3028, 0, 2048, 3072, 3073, 3075, + 3008, 3024, 3032, 3030, 0, 2048, 3072, 3073, + 3075, 3008, 3024, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3032, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3032, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3032, 3034, 0, 2048, 3072, 3073, + 3075, 3008, 3040, 3032, 0, 2048, 3072, 3073, + 3075, 3008, 3040, 3041, 3036, 0, 2048, 3072, + 3073, 3075, 3008, 3040, 3041, 3036, 0, 2048, + 3072, 3073, 3075, 3008, 3040, 3041, 3036, 3038, + 0, 2048, 3072, 3073, 3075, 3008, 0, 2048, + 3072, 3073, 3075, 3008, 3040, 0, 2048, 3072, + 3073, 3075, 3008, 3040, 0, 2048, 3072, 3073, + 3075, 3008, 3040, 3042, 0, 2048, 3072, 3073, + 3075, 3008, 3040, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3044, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3044, 0, 2048, 3072, 3073, 3075, + 3008, 3040, 3048, 3046, 0, 2048, 3072, 3073, + 3075, 3079, 3040, 0, 2048, 3072, 3073, 3075, + 3079, 3040, 3048, 0, 2048, 3072, 3073, 3075, + 3079, 3040, 3048, 0, 2048, 3072, 3073, 3075, + 3079, 3040, 3048, 3050, 0, 2048, 3072, 3073, + 3075, 3079, 3040, 3048, 0, 2048, 3072, 3073, + 3075, 3079, 3040, 3056, 3052, 0, 2048, 3072, + 3073, 3075, 3079, 3040, 3056, 3052, 0, 2048, + 3072, 3073, 3075, 3079, 3040, 3056, 3057, 3054, + 0, 2048, 3072, 3073, 3075, 3079, 3040, 0, + 2048, 3072, 3073, 3075, 3079, 3040, 3056, 0, + 2048, 3072, 3073, 3075, 3079, 3040, 3056, 0, + 2048, 3072, 3073, 3075, 3079, 3040, 3056, 3058, + 0, 2048, 3072, 3073, 3075, 3079, 3040, 3056, + 0, 2048, 3072, 3073, 3075, 3079, 3040, 3056, + 3060, 0, 2048, 3072, 3073, 3075, 3079, 3040, + 3056, 3060, 0, 2048, 3072, 3073, 3075, 3079, + 3040, 3056, 3064, 3062, 0, 2048, 3072, 3073, + 3075, 3079, 3040, 3056, 0, 2048, 3072, 3073, + 3075, 3079, 3040, 3056, 3064, 0, 2048, 3072, + 3073, 3075, 3079, 3040, 3056, 3064, 0, 2048, + 3072, 3073, 3075, 3079, 3040, 3056, 3064, 3066, + 0, 2048, 3072, 3073, 3075, 3079, 3040, 3056, + 3064, 0, 2048, 3072, 3073, 3075, 3079, 3040, + 3056, 3064, 3068, 0, 2048, 3072, 3073, 3075, + 3079, 3040, 3056, 3064, 3068, 0, 2048, 3072, + 3073, 3075, 3079, 3040, 3056, 3064, 3068, 3070, + 0, 2048, 0, 2048, 3072, 0, 2048, 3072, + 0, 2048, 3072, 3074, 0, 2048, 3072, 0, + 2048, 3072, 3076, 0, 2048, 3072, 3076, 0, + 2048, 3072, 3080, 3078, 0, 2048, 3072, 0, + 2048, 3072, 3080, 0, 2048, 3072, 3080, 0, + 2048, 3072, 3080, 3082, 0, 2048, 3072, 3080, + 0, 2048, 3072, 3088, 3084, 0, 2048, 3072, + 3088, 3084, 0, 2048, 3072, 3088, 3089, 3086, + 0, 2048, 3072, 0, 2048, 3072, 3088, 0, + 2048, 3072, 3088, 0, 2048, 3072, 3088, 3090, + 0, 2048, 3072, 3088, 0, 2048, 3072, 3088, + 3092, 0, 2048, 3072, 3088, 3092, 0, 2048, + 3072, 3088, 3096, 3094, 0, 2048, 3072, 3088, + 0, 2048, 3072, 3104, 3096, 0, 2048, 3072, + 3104, 3096, 0, 2048, 3072, 3104, 3096, 3098, + 0, 2048, 3072, 3104, 3096, 0, 2048, 3072, + 3104, 3105, 3100, 0, 2048, 3072, 3104, 3105, + 3100, 0, 2048, 3072, 3104, 3105, 3100, 3102, + 0, 2048, 3072, 0, 2048, 3072, 3104, 0, + 2048, 3072, 3104, 0, 2048, 3072, 3104, 3106, + 0, 2048, 3072, 3104, 0, 2048, 3072, 3104, + 3108, 0, 2048, 3072, 3104, 3108, 0, 2048, + 3072, 3104, 3112, 3110, 0, 2048, 3072, 3104, + 0, 2048, 3072, 3104, 3112, 0, 2048, 3072, + 3104, 3112, 0, 2048, 3072, 3104, 3112, 3114, + 0, 2048, 3072, 3104, 3112, 0, 2048, 3072, + 3104, 3120, 3116, 0, 2048, 3072, 3104, 3120, + 3116, 0, 2048, 3072, 3104, 3120, 3121, 3118, + 0, 2048, 3072, 3104, 0, 2048, 3072, 3136, + 3120, 0, 2048, 3072, 3136, 3120, 0, 2048, + 3072, 3136, 3120, 3122, 0, 2048, 3072, 3136, + 3120, 0, 2048, 3072, 3136, 3120, 3124, 0, + 2048, 3072, 3136, 3120, 3124, 0, 2048, 3072, + 3136, 3120, 3128, 3126, 0, 2048, 3072, 3136, + 3120, 0, 2048, 3072, 3136, 3137, 3128, 0, + 2048, 3072, 3136, 3137, 3128, 0, 2048, 3072, + 3136, 3137, 3128, 3130, 0, 2048, 3072, 3136, + 3137, 3128, 0, 2048, 3072, 3136, 3137, 3128, + 3132, 0, 2048, 3072, 3136, 3137, 3139, 3132, + 0, 2048, 3072, 3136, 3137, 3139, 3132, 3134, + 0, 2048, 3072, 0, 2048, 3072, 3136, 0, + 2048, 3072, 3136, 0, 2048, 3072, 3136, 3138, + 0, 2048, 3072, 3136, 0, 2048, 3072, 3136, + 3140, 0, 2048, 3072, 3136, 3140, 0, 2048, + 3072, 3136, 3144, 3142, 0, 2048, 3072, 3136, + 0, 2048, 3072, 3136, 3144, 0, 2048, 3072, + 3136, 3144, 0, 2048, 3072, 3136, 3144, 3146, + 0, 2048, 3072, 3136, 3144, 0, 2048, 3072, + 3136, 3152, 3148, 0, 2048, 3072, 3136, 3152, + 3148, 0, 2048, 3072, 3136, 3152, 3153, 3150, + 0, 2048, 3072, 3136, 0, 2048, 3072, 3136, + 3152, 0, 2048, 3072, 3136, 3152, 0, 2048, + 3072, 3136, 3152, 3154, 0, 2048, 3072, 3136, + 3152, 0, 2048, 3072, 3136, 3152, 3156, 0, + 2048, 3072, 3136, 3152, 3156, 0, 2048, 3072, + 3136, 3152, 3160, 3158, 0, 2048, 3072, 3136, + 3152, 0, 2048, 3072, 3136, 3168, 3160, 0, + 2048, 3072, 3136, 3168, 3160, 0, 2048, 3072, + 3136, 3168, 3160, 3162, 0, 2048, 3072, 3136, + 3168, 3160, 0, 2048, 3072, 3136, 3168, 3169, + 3164, 0, 2048, 3072, 3136, 3168, 3169, 3164, + 0, 2048, 3072, 3136, 3168, 3169, 3164, 3166, + 0, 2048, 3072, 3136, 0, 2048, 3072, 3200, + 3168, 0, 2048, 3072, 3200, 3168, 0, 2048, + 3072, 3200, 3168, 3170, 0, 2048, 3072, 3200, + 3168, 0, 2048, 3072, 3200, 3168, 3172, 0, + 2048, 3072, 3200, 3168, 3172, 0, 2048, 3072, + 3200, 3168, 3176, 3174, 0, 2048, 3072, 3200, + 3168, 0, 2048, 3072, 3200, 3168, 3176, 0, + 2048, 3072, 3200, 3168, 3176, 0, 2048, 3072, + 3200, 3168, 3176, 3178, 0, 2048, 3072, 3200, + 3168, 3176, 0, 2048, 3072, 3200, 3168, 3184, + 3180, 0, 2048, 3072, 3200, 3168, 3184, 3180, + 0, 2048, 3072, 3200, 3168, 3184, 3185, 3182, + 0, 2048, 3072, 3200, 3168, 0, 2048, 3072, + 3200, 3201, 3184, 0, 2048, 3072, 3200, 3201, + 3184, 0, 2048, 3072, 3200, 3201, 3184, 3186, + 0, 2048, 3072, 3200, 3201, 3184, 0, 2048, + 3072, 3200, 3201, 3184, 3188, 0, 2048, 3072, + 3200, 3201, 3184, 3188, 0, 2048, 3072, 3200, + 3201, 3184, 3192, 3190, 0, 2048, 3072, 3200, + 3201, 3184, 0, 2048, 3072, 3200, 3201, 3184, + 3192, 0, 2048, 3072, 3200, 3201, 3203, 3192, + 0, 2048, 3072, 3200, 3201, 3203, 3192, 3194, + 0, 2048, 3072, 3200, 3201, 3203, 3192, 0, + 2048, 3072, 3200, 3201, 3203, 3192, 3196, 0, + 2048, 3072, 3200, 3201, 3203, 3192, 3196, 0, + 2048, 3072, 3200, 3201, 3203, 3192, 3196, 3198, + 0, 2048, 3072, 0, 2048, 3072, 3200, 0, + 2048, 3072, 3200, 0, 2048, 3072, 3200, 3202, + 0, 2048, 3072, 3200, 0, 2048, 3072, 3200, + 3204, 0, 2048, 3072, 3200, 3204, 0, 2048, + 3072, 3200, 3208, 3206, 0, 2048, 3072, 3200, + 0, 2048, 3072, 3200, 3208, 0, 2048, 3072, + 3200, 3208, 0, 2048, 3072, 3200, 3208, 3210, + 0, 2048, 3072, 3200, 3208, 0, 2048, 3072, + 3200, 3216, 3212, 0, 2048, 3072, 3200, 3216, + 3212, 0, 2048, 3072, 3200, 3216, 3217, 3214, + 0, 2048, 3072, 3200, 0, 2048, 3072, 3200, + 3216, 0, 2048, 3072, 3200, 3216, 0, 2048, + 3072, 3200, 3216, 3218, 0, 2048, 3072, 3200, + 3216, 0, 2048, 3072, 3200, 3216, 3220, 0, + 2048, 3072, 3200, 3216, 3220, 0, 2048, 3072, + 3200, 3216, 3224, 3222, 0, 2048, 3072, 3200, + 3216, 0, 2048, 3072, 3200, 3232, 3224, 0, + 2048, 3072, 3200, 3232, 3224, 0, 2048, 3072, + 3200, 3232, 3224, 3226, 0, 2048, 3072, 3200, + 3232, 3224, 0, 2048, 3072, 3200, 3232, 3233, + 3228, 0, 2048, 3072, 3200, 3232, 3233, 3228, + 0, 2048, 3072, 3200, 3232, 3233, 3228, 3230, + 0, 2048, 3072, 3200, 0, 2048, 3072, 3200, + 3232, 0, 2048, 3072, 3200, 3232, 0, 2048, + 3072, 3200, 3232, 3234, 0, 2048, 3072, 3200, + 3232, 0, 2048, 3072, 3200, 3232, 3236, 0, + 2048, 3072, 3200, 3232, 3236, 0, 2048, 3072, + 3200, 3232, 3240, 3238, 0, 2048, 3072, 3200, + 3232, 0, 2048, 3072, 3200, 3232, 3240, 0, + 2048, 3072, 3200, 3232, 3240, 0, 2048, 3072, + 3200, 3232, 3240, 3242, 0, 2048, 3072, 3200, + 3232, 3240, 0, 2048, 3072, 3200, 3232, 3248, + 3244, 0, 2048, 3072, 3200, 3232, 3248, 3244, + 0, 2048, 3072, 3200, 3232, 3248, 3249, 3246, + 0, 2048, 3072, 3200, 3232, 0, 2048, 3072, + 3200, 3264, 3248, 0, 2048, 3072, 3200, 3264, + 3248, 0, 2048, 3072, 3200, 3264, 3248, 3250, + 0, 2048, 3072, 3200, 3264, 3248, 0, 2048, + 3072, 3200, 3264, 3248, 3252, 0, 2048, 3072, + 3200, 3264, 3248, 3252, 0, 2048, 3072, 3200, + 3264, 3248, 3256, 3254, 0, 2048, 3072, 3200, + 3264, 3248, 0, 2048, 3072, 3200, 3264, 3265, + 3256, 0, 2048, 3072, 3200, 3264, 3265, 3256, + 0, 2048, 3072, 3200, 3264, 3265, 3256, 3258, + 0, 2048, 3072, 3200, 3264, 3265, 3256, 0, + 2048, 3072, 3200, 3264, 3265, 3256, 3260, 0, + 2048, 3072, 3200, 3264, 3265, 3267, 3260, 0, + 2048, 3072, 3200, 3264, 3265, 3267, 3260, 3262, + 0, 2048, 3072, 3200, 0, 2048, 3072, 3328, + 3264, 0, 2048, 3072, 3328, 3264, 0, 2048, + 3072, 3328, 3264, 3266, 0, 2048, 3072, 3328, + 3264, 0, 2048, 3072, 3328, 3264, 3268, 0, + 2048, 3072, 3328, 3264, 3268, 0, 2048, 3072, + 3328, 3264, 3272, 3270, 0, 2048, 3072, 3328, + 3264, 0, 2048, 3072, 3328, 3264, 3272, 0, + 2048, 3072, 3328, 3264, 3272, 0, 2048, 3072, + 3328, 3264, 3272, 3274, 0, 2048, 3072, 3328, + 3264, 3272, 0, 2048, 3072, 3328, 3264, 3280, + 3276, 0, 2048, 3072, 3328, 3264, 3280, 3276, + 0, 2048, 3072, 3328, 3264, 3280, 3281, 3278, + 0, 2048, 3072, 3328, 3264, 0, 2048, 3072, + 3328, 3264, 3280, 0, 2048, 3072, 3328, 3264, + 3280, 0, 2048, 3072, 3328, 3264, 3280, 3282, + 0, 2048, 3072, 3328, 3264, 3280, 0, 2048, + 3072, 3328, 3264, 3280, 3284, 0, 2048, 3072, + 3328, 3264, 3280, 3284, 0, 2048, 3072, 3328, + 3264, 3280, 3288, 3286, 0, 2048, 3072, 3328, + 3264, 3280, 0, 2048, 3072, 3328, 3264, 3296, + 3288, 0, 2048, 3072, 3328, 3264, 3296, 3288, + 0, 2048, 3072, 3328, 3264, 3296, 3288, 3290, + 0, 2048, 3072, 3328, 3264, 3296, 3288, 0, + 2048, 3072, 3328, 3264, 3296, 3297, 3292, 0, + 2048, 3072, 3328, 3264, 3296, 3297, 3292, 0, + 2048, 3072, 3328, 3264, 3296, 3297, 3292, 3294, + 0, 2048, 3072, 3328, 3264, 0, 2048, 3072, + 3328, 3329, 3296, 0, 2048, 3072, 3328, 3329, + 3296, 0, 2048, 3072, 3328, 3329, 3296, 3298, + 0, 2048, 3072, 3328, 3329, 3296, 0, 2048, + 3072, 3328, 3329, 3296, 3300, 0, 2048, 3072, + 3328, 3329, 3296, 3300, 0, 2048, 3072, 3328, + 3329, 3296, 3304, 3302, 0, 2048, 3072, 3328, + 3329, 3296, 0, 2048, 3072, 3328, 3329, 3296, + 3304, 0, 2048, 3072, 3328, 3329, 3296, 3304, + 0, 2048, 3072, 3328, 3329, 3296, 3304, 3306, + 0, 2048, 3072, 3328, 3329, 3296, 3304, 0, + 2048, 3072, 3328, 3329, 3296, 3312, 3308, 0, + 2048, 3072, 3328, 3329, 3296, 3312, 3308, 0, + 2048, 3072, 3328, 3329, 3296, 3312, 3313, 3310, + 0, 2048, 3072, 3328, 3329, 3296, 0, 2048, + 3072, 3328, 3329, 3296, 3312, 0, 2048, 3072, + 3328, 3329, 3331, 3312, 0, 2048, 3072, 3328, + 3329, 3331, 3312, 3314, 0, 2048, 3072, 3328, + 3329, 3331, 3312, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3316, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3316, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3320, 3318, 0, 2048, 3072, 3328, + 3329, 3331, 3312, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3320, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3320, 0, 2048, 3072, 3328, 3329, + 3331, 3312, 3320, 3322, 0, 2048, 3072, 3328, + 3329, 3331, 3335, 3320, 0, 2048, 3072, 3328, + 3329, 3331, 3335, 3320, 3324, 0, 2048, 3072, + 3328, 3329, 3331, 3335, 3320, 3324, 0, 2048, + 3072, 3328, 3329, 3331, 3335, 3320, 3324, 3326, + 0, 2048, 3072, 0, 4096, 3072, 3328, 0, + 4096, 3072, 3328, 0, 4096, 3072, 3328, 3330, + 0, 4096, 3072, 3328, 0, 4096, 3072, 3328, + 3332, 0, 4096, 3072, 3328, 3332, 0, 4096, + 3072, 3328, 3336, 3334, 0, 4096, 3072, 3328, + 0, 4096, 3072, 3328, 3336, 0, 4096, 3072, + 3328, 3336, 0, 4096, 3072, 3328, 3336, 3338, + 0, 4096, 3072, 3328, 3336, 0, 4096, 3072, + 3328, 3344, 3340, 0, 4096, 3072, 3328, 3344, + 3340, 0, 4096, 3072, 3328, 3344, 3345, 3342, + 0, 4096, 3072, 3328, 0, 4096, 3072, 3328, + 3344, 0, 4096, 3072, 3328, 3344, 0, 4096, + 3072, 3328, 3344, 3346, 0, 4096, 3072, 3328, + 3344, 0, 4096, 3072, 3328, 3344, 3348, 0, + 4096, 3072, 3328, 3344, 3348, 0, 4096, 3072, + 3328, 3344, 3352, 3350, 0, 4096, 3072, 3328, + 3344, 0, 4096, 3072, 3328, 3360, 3352, 0, + 4096, 3072, 3328, 3360, 3352, 0, 4096, 3072, + 3328, 3360, 3352, 3354, 0, 4096, 3072, 3328, + 3360, 3352, 0, 4096, 3072, 3328, 3360, 3361, + 3356, 0, 4096, 3072, 3328, 3360, 3361, 3356, + 0, 4096, 3072, 3328, 3360, 3361, 3356, 3358, + 0, 4096, 3072, 3328, 0, 4096, 3072, 3328, + 3360, 0, 4096, 3072, 3328, 3360, 0, 4096, + 3072, 3328, 3360, 3362, 0, 4096, 3072, 3328, + 3360, 0, 4096, 3072, 3328, 3360, 3364, 0, + 4096, 3072, 3328, 3360, 3364, 0, 4096, 3072, + 3328, 3360, 3368, 3366, 0, 4096, 3072, 3328, + 3360, 0, 4096, 3072, 3328, 3360, 3368, 0, + 4096, 3072, 3328, 3360, 3368, 0, 4096, 3072, + 3328, 3360, 3368, 3370, 0, 4096, 3072, 3328, + 3360, 3368, 0, 4096, 3072, 3328, 3360, 3376, + 3372, 0, 4096, 3072, 3328, 3360, 3376, 3372, + 0, 4096, 3072, 3328, 3360, 3376, 3377, 3374, + 0, 4096, 3072, 3328, 3360, 0, 4096, 3072, + 3328, 3392, 3376, 0, 4096, 3072, 3328, 3392, + 3376, 0, 4096, 3072, 3328, 3392, 3376, 3378, + 0, 4096, 3072, 3328, 3392, 3376, 0, 4096, + 3072, 3328, 3392, 3376, 3380, 0, 4096, 3072, + 3328, 3392, 3376, 3380, 0, 4096, 3072, 3328, + 3392, 3376, 3384, 3382, 0, 4096, 3072, 3328, + 3392, 3376, 0, 4096, 3072, 3328, 3392, 3393, + 3384, 0, 4096, 3072, 3328, 3392, 3393, 3384, + 0, 4096, 3072, 3328, 3392, 3393, 3384, 3386, + 0, 4096, 3072, 3328, 3392, 3393, 3384, 0, + 4096, 3072, 3328, 3392, 3393, 3384, 3388, 0, + 4096, 3072, 3328, 3392, 3393, 3395, 3388, 0, + 4096, 3072, 3328, 3392, 3393, 3395, 3388, 3390, + 0, 4096, 3072, 3328, 0, 4096, 3072, 3328, + 3392, 0, 4096, 3072, 3328, 3392, 0, 4096, + 3072, 3328, 3392, 3394, 0, 4096, 3072, 3328, + 3392, 0, 4096, 3072, 3328, 3392, 3396, 0, + 4096, 3072, 3328, 3392, 3396, 0, 4096, 3072, + 3328, 3392, 3400, 3398, 0, 4096, 3072, 3328, + 3392, 0, 4096, 3072, 3328, 3392, 3400, 0, + 4096, 3072, 3328, 3392, 3400, 0, 4096, 3072, + 3328, 3392, 3400, 3402, 0, 4096, 3072, 3328, + 3392, 3400, 0, 4096, 3072, 3328, 3392, 3408, + 3404, 0, 4096, 3072, 3328, 3392, 3408, 3404, + 0, 4096, 3072, 3328, 3392, 3408, 3409, 3406, + 0, 4096, 3072, 3328, 3392, 0, 4096, 3072, + 3328, 3392, 3408, 0, 4096, 3072, 3328, 3392, + 3408, 0, 4096, 3072, 3328, 3392, 3408, 3410, + 0, 4096, 3072, 3328, 3392, 3408, 0, 4096, + 3072, 3328, 3392, 3408, 3412, 0, 4096, 3072, + 3328, 3392, 3408, 3412, 0, 4096, 3072, 3328, + 3392, 3408, 3416, 3414, 0, 4096, 3072, 3328, + 3392, 3408, 0, 4096, 3072, 3328, 3392, 3424, + 3416, 0, 4096, 3072, 3328, 3392, 3424, 3416, + 0, 4096, 3072, 3328, 3392, 3424, 3416, 3418, + 0, 4096, 3072, 3328, 3392, 3424, 3416, 0, + 4096, 3072, 3328, 3392, 3424, 3425, 3420, 0, + 4096, 3072, 3328, 3392, 3424, 3425, 3420, 0, + 4096, 3072, 3328, 3392, 3424, 3425, 3420, 3422, + 0, 4096, 3072, 3328, 3392, 0, 4096, 3072, + 3328, 3456, 3424, 0, 4096, 3072, 3328, 3456, + 3424, 0, 4096, 3072, 3328, 3456, 3424, 3426, + 0, 4096, 3072, 3328, 3456, 3424, 0, 4096, + 3072, 3328, 3456, 3424, 3428, 0, 4096, 3072, + 3328, 3456, 3424, 3428, 0, 4096, 3072, 3328, + 3456, 3424, 3432, 3430, 0, 4096, 3072, 3328, + 3456, 3424, 0, 4096, 3072, 3328, 3456, 3424, + 3432, 0, 4096, 3072, 3328, 3456, 3424, 3432, + 0, 4096, 3072, 3328, 3456, 3424, 3432, 3434, + 0, 4096, 3072, 3328, 3456, 3424, 3432, 0, + 4096, 3072, 3328, 3456, 3424, 3440, 3436, 0, + 4096, 3072, 3328, 3456, 3424, 3440, 3436, 0, + 4096, 3072, 3328, 3456, 3424, 3440, 3441, 3438, + 0, 4096, 3072, 3328, 3456, 3424, 0, 4096, + 3072, 3328, 3456, 3457, 3440, 0, 4096, 3072, + 3328, 3456, 3457, 3440, 0, 4096, 3072, 3328, + 3456, 3457, 3440, 3442, 0, 4096, 3072, 3328, + 3456, 3457, 3440, 0, 4096, 3072, 3328, 3456, + 3457, 3440, 3444, 0, 4096, 3072, 3328, 3456, + 3457, 3440, 3444, 0, 4096, 3072, 3328, 3456, + 3457, 3440, 3448, 3446, 0, 4096, 3072, 3328, + 3456, 3457, 3440, 0, 4096, 3072, 3328, 3456, + 3457, 3440, 3448, 0, 4096, 3072, 3328, 3456, + 3457, 3459, 3448, 0, 4096, 3072, 3328, 3456, + 3457, 3459, 3448, 3450, 0, 4096, 3072, 3328, + 3456, 3457, 3459, 3448, 0, 4096, 3072, 3328, + 3456, 3457, 3459, 3448, 3452, 0, 4096, 3072, + 3328, 3456, 3457, 3459, 3448, 3452, 0, 4096, + 3072, 3328, 3456, 3457, 3459, 3448, 3452, 3454, + 0, 4096, 3072, 3328, 0, 4096, 3072, 3584, + 3456, 0, 4096, 3072, 3584, 3456, 0, 4096, + 3072, 3584, 3456, 3458, 0, 4096, 3072, 3584, + 3456, 0, 4096, 3072, 3584, 3456, 3460, 0, + 4096, 3072, 3584, 3456, 3460, 0, 4096, 3072, + 3584, 3456, 3464, 3462, 0, 4096, 3072, 3584, + 3456, 0, 4096, 3072, 3584, 3456, 3464, 0, + 4096, 3072, 3584, 3456, 3464, 0, 4096, 3072, + 3584, 3456, 3464, 3466, 0, 4096, 3072, 3584, + 3456, 3464, 0, 4096, 3072, 3584, 3456, 3472, + 3468, 0, 4096, 3072, 3584, 3456, 3472, 3468, + 0, 4096, 3072, 3584, 3456, 3472, 3473, 3470, + 0, 4096, 3072, 3584, 3456, 0, 4096, 3072, + 3584, 3456, 3472, 0, 4096, 3072, 3584, 3456, + 3472, 0, 4096, 3072, 3584, 3456, 3472, 3474, + 0, 4096, 3072, 3584, 3456, 3472, 0, 4096, + 3072, 3584, 3456, 3472, 3476, 0, 4096, 3072, + 3584, 3456, 3472, 3476, 0, 4096, 3072, 3584, + 3456, 3472, 3480, 3478, 0, 4096, 3072, 3584, + 3456, 3472, 0, 4096, 3072, 3584, 3456, 3488, + 3480, 0, 4096, 3072, 3584, 3456, 3488, 3480, + 0, 4096, 3072, 3584, 3456, 3488, 3480, 3482, + 0, 4096, 3072, 3584, 3456, 3488, 3480, 0, + 4096, 3072, 3584, 3456, 3488, 3489, 3484, 0, + 4096, 3072, 3584, 3456, 3488, 3489, 3484, 0, + 4096, 3072, 3584, 3456, 3488, 3489, 3484, 3486, + 0, 4096, 3072, 3584, 3456, 0, 4096, 3072, + 3584, 3456, 3488, 0, 4096, 3072, 3584, 3456, + 3488, 0, 4096, 3072, 3584, 3456, 3488, 3490, + 0, 4096, 3072, 3584, 3456, 3488, 0, 4096, + 3072, 3584, 3456, 3488, 3492, 0, 4096, 3072, + 3584, 3456, 3488, 3492, 0, 4096, 3072, 3584, + 3456, 3488, 3496, 3494, 0, 4096, 3072, 3584, + 3456, 3488, 0, 4096, 3072, 3584, 3456, 3488, + 3496, 0, 4096, 3072, 3584, 3456, 3488, 3496, + 0, 4096, 3072, 3584, 3456, 3488, 3496, 3498, + 0, 4096, 3072, 3584, 3456, 3488, 3496, 0, + 4096, 3072, 3584, 3456, 3488, 3504, 3500, 0, + 4096, 3072, 3584, 3456, 3488, 3504, 3500, 0, + 4096, 3072, 3584, 3456, 3488, 3504, 3505, 3502, + 0, 4096, 3072, 3584, 3456, 3488, 0, 4096, + 3072, 3584, 3456, 3520, 3504, 0, 4096, 3072, + 3584, 3456, 3520, 3504, 0, 4096, 3072, 3584, + 3456, 3520, 3504, 3506, 0, 4096, 3072, 3584, + 3456, 3520, 3504, 0, 4096, 3072, 3584, 3456, + 3520, 3504, 3508, 0, 4096, 3072, 3584, 3456, + 3520, 3504, 3508, 0, 4096, 3072, 3584, 3456, + 3520, 3504, 3512, 3510, 0, 4096, 3072, 3584, + 3456, 3520, 3504, 0, 4096, 3072, 3584, 3456, + 3520, 3521, 3512, 0, 4096, 3072, 3584, 3456, + 3520, 3521, 3512, 0, 4096, 3072, 3584, 3456, + 3520, 3521, 3512, 3514, 0, 4096, 3072, 3584, + 3456, 3520, 3521, 3512, 0, 4096, 3072, 3584, + 3456, 3520, 3521, 3512, 3516, 0, 4096, 3072, + 3584, 3456, 3520, 3521, 3523, 3516, 0, 4096, + 3072, 3584, 3456, 3520, 3521, 3523, 3516, 3518, + 0, 4096, 3072, 3584, 3456, 0, 4096, 3072, + 3584, 3585, 3520, 0, 4096, 3072, 3584, 3585, + 3520, 0, 4096, 3072, 3584, 3585, 3520, 3522, + 0, 4096, 3072, 3584, 3585, 3520, 0, 4096, + 3072, 3584, 3585, 3520, 3524, 0, 4096, 3072, + 3584, 3585, 3520, 3524, 0, 4096, 3072, 3584, + 3585, 3520, 3528, 3526, 0, 4096, 3072, 3584, + 3585, 3520, 0, 4096, 3072, 3584, 3585, 3520, + 3528, 0, 4096, 3072, 3584, 3585, 3520, 3528, + 0, 4096, 3072, 3584, 3585, 3520, 3528, 3530, + 0, 4096, 3072, 3584, 3585, 3520, 3528, 0, + 4096, 3072, 3584, 3585, 3520, 3536, 3532, 0, + 4096, 3072, 3584, 3585, 3520, 3536, 3532, 0, + 4096, 3072, 3584, 3585, 3520, 3536, 3537, 3534, + 0, 4096, 3072, 3584, 3585, 3520, 0, 4096, + 3072, 3584, 3585, 3520, 3536, 0, 4096, 3072, + 3584, 3585, 3520, 3536, 0, 4096, 3072, 3584, + 3585, 3520, 3536, 3538, 0, 4096, 3072, 3584, + 3585, 3520, 3536, 0, 4096, 3072, 3584, 3585, + 3520, 3536, 3540, 0, 4096, 3072, 3584, 3585, + 3520, 3536, 3540, 0, 4096, 3072, 3584, 3585, + 3520, 3536, 3544, 3542, 0, 4096, 3072, 3584, + 3585, 3520, 3536, 0, 4096, 3072, 3584, 3585, + 3520, 3552, 3544, 0, 4096, 3072, 3584, 3585, + 3520, 3552, 3544, 0, 4096, 3072, 3584, 3585, + 3520, 3552, 3544, 3546, 0, 4096, 3072, 3584, + 3585, 3520, 3552, 3544, 0, 4096, 3072, 3584, + 3585, 3520, 3552, 3553, 3548, 0, 4096, 3072, + 3584, 3585, 3520, 3552, 3553, 3548, 0, 4096, + 3072, 3584, 3585, 3520, 3552, 3553, 3548, 3550, + 0, 4096, 3072, 3584, 3585, 3520, 0, 4096, + 3072, 3584, 3585, 3520, 3552, 0, 4096, 3072, + 3584, 3585, 3587, 3552, 0, 4096, 3072, 3584, + 3585, 3587, 3552, 3554, 0, 4096, 3072, 3584, + 3585, 3587, 3552, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3556, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3556, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3560, 3558, 0, 4096, 3072, 3584, + 3585, 3587, 3552, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3560, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3560, 0, 4096, 3072, 3584, 3585, + 3587, 3552, 3560, 3562, 0, 4096, 3072, 3584, + 3585, 3587, 3552, 3560, 0, 4096, 3072, 3584, + 3585, 3587, 3552, 3568, 3564, 0, 4096, 3072, + 3584, 3585, 3587, 3552, 3568, 3564, 0, 4096, + 3072, 3584, 3585, 3587, 3552, 3568, 3569, 3566, + 0, 4096, 3072, 3584, 3585, 3587, 3552, 0, + 4096, 3072, 3584, 3585, 3587, 3552, 3568, 0, + 4096, 3072, 3584, 3585, 3587, 3552, 3568, 0, + 4096, 3072, 3584, 3585, 3587, 3552, 3568, 3570, + 0, 4096, 3072, 3584, 3585, 3587, 3591, 3568, + 0, 4096, 3072, 3584, 3585, 3587, 3591, 3568, + 3572, 0, 4096, 3072, 3584, 3585, 3587, 3591, + 3568, 3572, 0, 4096, 3072, 3584, 3585, 3587, + 3591, 3568, 3576, 3574, 0, 4096, 3072, 3584, + 3585, 3587, 3591, 3568, 0, 4096, 3072, 3584, + 3585, 3587, 3591, 3568, 3576, 0, 4096, 3072, + 3584, 3585, 3587, 3591, 3568, 3576, 0, 4096, + 3072, 3584, 3585, 3587, 3591, 3568, 3576, 3578, + 0, 4096, 3072, 3584, 3585, 3587, 3591, 3568, + 3576, 0, 4096, 3072, 3584, 3585, 3587, 3591, + 3568, 3576, 3580, 0, 4096, 3072, 3584, 3585, + 3587, 3591, 3568, 3576, 3580, 0, 4096, 3072, + 3584, 3585, 3587, 3591, 3568, 3576, 3580, 3582, + 0, 4096, 3072, 0, 4096, 3072, 3584, 0, + 4096, 4097, 3584, 0, 4096, 4097, 3584, 3586, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3588, 0, 4096, 4097, 3584, 3588, 0, 4096, + 4097, 3584, 3592, 3590, 0, 4096, 4097, 3584, + 0, 4096, 4097, 3584, 3592, 0, 4096, 4097, + 3584, 3592, 0, 4096, 4097, 3584, 3592, 3594, + 0, 4096, 4097, 3584, 3592, 0, 4096, 4097, + 3584, 3600, 3596, 0, 4096, 4097, 3584, 3600, + 3596, 0, 4096, 4097, 3584, 3600, 3601, 3598, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3600, 0, 4096, 4097, 3584, 3600, 0, 4096, + 4097, 3584, 3600, 3602, 0, 4096, 4097, 3584, + 3600, 0, 4096, 4097, 3584, 3600, 3604, 0, + 4096, 4097, 3584, 3600, 3604, 0, 4096, 4097, + 3584, 3600, 3608, 3606, 0, 4096, 4097, 3584, + 3600, 0, 4096, 4097, 3584, 3616, 3608, 0, + 4096, 4097, 3584, 3616, 3608, 0, 4096, 4097, + 3584, 3616, 3608, 3610, 0, 4096, 4097, 3584, + 3616, 3608, 0, 4096, 4097, 3584, 3616, 3617, + 3612, 0, 4096, 4097, 3584, 3616, 3617, 3612, + 0, 4096, 4097, 3584, 3616, 3617, 3612, 3614, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3616, 0, 4096, 4097, 3584, 3616, 0, 4096, + 4097, 3584, 3616, 3618, 0, 4096, 4097, 3584, + 3616, 0, 4096, 4097, 3584, 3616, 3620, 0, + 4096, 4097, 3584, 3616, 3620, 0, 4096, 4097, + 3584, 3616, 3624, 3622, 0, 4096, 4097, 3584, + 3616, 0, 4096, 4097, 3584, 3616, 3624, 0, + 4096, 4097, 3584, 3616, 3624, 0, 4096, 4097, + 3584, 3616, 3624, 3626, 0, 4096, 4097, 3584, + 3616, 3624, 0, 4096, 4097, 3584, 3616, 3632, + 3628, 0, 4096, 4097, 3584, 3616, 3632, 3628, + 0, 4096, 4097, 3584, 3616, 3632, 3633, 3630, + 0, 4096, 4097, 3584, 3616, 0, 4096, 4097, + 3584, 3648, 3632, 0, 4096, 4097, 3584, 3648, + 3632, 0, 4096, 4097, 3584, 3648, 3632, 3634, + 0, 4096, 4097, 3584, 3648, 3632, 0, 4096, + 4097, 3584, 3648, 3632, 3636, 0, 4096, 4097, + 3584, 3648, 3632, 3636, 0, 4096, 4097, 3584, + 3648, 3632, 3640, 3638, 0, 4096, 4097, 3584, + 3648, 3632, 0, 4096, 4097, 3584, 3648, 3649, + 3640, 0, 4096, 4097, 3584, 3648, 3649, 3640, + 0, 4096, 4097, 3584, 3648, 3649, 3640, 3642, + 0, 4096, 4097, 3584, 3648, 3649, 3640, 0, + 4096, 4097, 3584, 3648, 3649, 3640, 3644, 0, + 4096, 4097, 3584, 3648, 3649, 3651, 3644, 0, + 4096, 4097, 3584, 3648, 3649, 3651, 3644, 3646, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3648, 0, 4096, 4097, 3584, 3648, 0, 4096, + 4097, 3584, 3648, 3650, 0, 4096, 4097, 3584, + 3648, 0, 4096, 4097, 3584, 3648, 3652, 0, + 4096, 4097, 3584, 3648, 3652, 0, 4096, 4097, + 3584, 3648, 3656, 3654, 0, 4096, 4097, 3584, + 3648, 0, 4096, 4097, 3584, 3648, 3656, 0, + 4096, 4097, 3584, 3648, 3656, 0, 4096, 4097, + 3584, 3648, 3656, 3658, 0, 4096, 4097, 3584, + 3648, 3656, 0, 4096, 4097, 3584, 3648, 3664, + 3660, 0, 4096, 4097, 3584, 3648, 3664, 3660, + 0, 4096, 4097, 3584, 3648, 3664, 3665, 3662, + 0, 4096, 4097, 3584, 3648, 0, 4096, 4097, + 3584, 3648, 3664, 0, 4096, 4097, 3584, 3648, + 3664, 0, 4096, 4097, 3584, 3648, 3664, 3666, + 0, 4096, 4097, 3584, 3648, 3664, 0, 4096, + 4097, 3584, 3648, 3664, 3668, 0, 4096, 4097, + 3584, 3648, 3664, 3668, 0, 4096, 4097, 3584, + 3648, 3664, 3672, 3670, 0, 4096, 4097, 3584, + 3648, 3664, 0, 4096, 4097, 3584, 3648, 3680, + 3672, 0, 4096, 4097, 3584, 3648, 3680, 3672, + 0, 4096, 4097, 3584, 3648, 3680, 3672, 3674, + 0, 4096, 4097, 3584, 3648, 3680, 3672, 0, + 4096, 4097, 3584, 3648, 3680, 3681, 3676, 0, + 4096, 4097, 3584, 3648, 3680, 3681, 3676, 0, + 4096, 4097, 3584, 3648, 3680, 3681, 3676, 3678, + 0, 4096, 4097, 3584, 3648, 0, 4096, 4097, + 3584, 3712, 3680, 0, 4096, 4097, 3584, 3712, + 3680, 0, 4096, 4097, 3584, 3712, 3680, 3682, + 0, 4096, 4097, 3584, 3712, 3680, 0, 4096, + 4097, 3584, 3712, 3680, 3684, 0, 4096, 4097, + 3584, 3712, 3680, 3684, 0, 4096, 4097, 3584, + 3712, 3680, 3688, 3686, 0, 4096, 4097, 3584, + 3712, 3680, 0, 4096, 4097, 3584, 3712, 3680, + 3688, 0, 4096, 4097, 3584, 3712, 3680, 3688, + 0, 4096, 4097, 3584, 3712, 3680, 3688, 3690, + 0, 4096, 4097, 3584, 3712, 3680, 3688, 0, + 4096, 4097, 3584, 3712, 3680, 3696, 3692, 0, + 4096, 4097, 3584, 3712, 3680, 3696, 3692, 0, + 4096, 4097, 3584, 3712, 3680, 3696, 3697, 3694, + 0, 4096, 4097, 3584, 3712, 3680, 0, 4096, + 4097, 3584, 3712, 3713, 3696, 0, 4096, 4097, + 3584, 3712, 3713, 3696, 0, 4096, 4097, 3584, + 3712, 3713, 3696, 3698, 0, 4096, 4097, 3584, + 3712, 3713, 3696, 0, 4096, 4097, 3584, 3712, + 3713, 3696, 3700, 0, 4096, 4097, 3584, 3712, + 3713, 3696, 3700, 0, 4096, 4097, 3584, 3712, + 3713, 3696, 3704, 3702, 0, 4096, 4097, 3584, + 3712, 3713, 3696, 0, 4096, 4097, 3584, 3712, + 3713, 3696, 3704, 0, 4096, 4097, 3584, 3712, + 3713, 3715, 3704, 0, 4096, 4097, 3584, 3712, + 3713, 3715, 3704, 3706, 0, 4096, 4097, 3584, + 3712, 3713, 3715, 3704, 0, 4096, 4097, 3584, + 3712, 3713, 3715, 3704, 3708, 0, 4096, 4097, + 3584, 3712, 3713, 3715, 3704, 3708, 0, 4096, + 4097, 3584, 3712, 3713, 3715, 3704, 3708, 3710, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3712, 0, 4096, 4097, 3584, 3712, 0, 4096, + 4097, 3584, 3712, 3714, 0, 4096, 4097, 3584, + 3712, 0, 4096, 4097, 3584, 3712, 3716, 0, + 4096, 4097, 3584, 3712, 3716, 0, 4096, 4097, + 3584, 3712, 3720, 3718, 0, 4096, 4097, 3584, + 3712, 0, 4096, 4097, 3584, 3712, 3720, 0, + 4096, 4097, 3584, 3712, 3720, 0, 4096, 4097, + 3584, 3712, 3720, 3722, 0, 4096, 4097, 3584, + 3712, 3720, 0, 4096, 4097, 3584, 3712, 3728, + 3724, 0, 4096, 4097, 3584, 3712, 3728, 3724, + 0, 4096, 4097, 3584, 3712, 3728, 3729, 3726, + 0, 4096, 4097, 3584, 3712, 0, 4096, 4097, + 3584, 3712, 3728, 0, 4096, 4097, 3584, 3712, + 3728, 0, 4096, 4097, 3584, 3712, 3728, 3730, + 0, 4096, 4097, 3584, 3712, 3728, 0, 4096, + 4097, 3584, 3712, 3728, 3732, 0, 4096, 4097, + 3584, 3712, 3728, 3732, 0, 4096, 4097, 3584, + 3712, 3728, 3736, 3734, 0, 4096, 4097, 3584, + 3712, 3728, 0, 4096, 4097, 3584, 3712, 3744, + 3736, 0, 4096, 4097, 3584, 3712, 3744, 3736, + 0, 4096, 4097, 3584, 3712, 3744, 3736, 3738, + 0, 4096, 4097, 3584, 3712, 3744, 3736, 0, + 4096, 4097, 3584, 3712, 3744, 3745, 3740, 0, + 4096, 4097, 3584, 3712, 3744, 3745, 3740, 0, + 4096, 4097, 3584, 3712, 3744, 3745, 3740, 3742, + 0, 4096, 4097, 3584, 3712, 0, 4096, 4097, + 3584, 3712, 3744, 0, 4096, 4097, 3584, 3712, + 3744, 0, 4096, 4097, 3584, 3712, 3744, 3746, + 0, 4096, 4097, 3584, 3712, 3744, 0, 4096, + 4097, 3584, 3712, 3744, 3748, 0, 4096, 4097, + 3584, 3712, 3744, 3748, 0, 4096, 4097, 3584, + 3712, 3744, 3752, 3750, 0, 4096, 4097, 3584, + 3712, 3744, 0, 4096, 4097, 3584, 3712, 3744, + 3752, 0, 4096, 4097, 3584, 3712, 3744, 3752, + 0, 4096, 4097, 3584, 3712, 3744, 3752, 3754, + 0, 4096, 4097, 3584, 3712, 3744, 3752, 0, + 4096, 4097, 3584, 3712, 3744, 3760, 3756, 0, + 4096, 4097, 3584, 3712, 3744, 3760, 3756, 0, + 4096, 4097, 3584, 3712, 3744, 3760, 3761, 3758, + 0, 4096, 4097, 3584, 3712, 3744, 0, 4096, + 4097, 3584, 3712, 3776, 3760, 0, 4096, 4097, + 3584, 3712, 3776, 3760, 0, 4096, 4097, 3584, + 3712, 3776, 3760, 3762, 0, 4096, 4097, 3584, + 3712, 3776, 3760, 0, 4096, 4097, 3584, 3712, + 3776, 3760, 3764, 0, 4096, 4097, 3584, 3712, + 3776, 3760, 3764, 0, 4096, 4097, 3584, 3712, + 3776, 3760, 3768, 3766, 0, 4096, 4097, 3584, + 3712, 3776, 3760, 0, 4096, 4097, 3584, 3712, + 3776, 3777, 3768, 0, 4096, 4097, 3584, 3712, + 3776, 3777, 3768, 0, 4096, 4097, 3584, 3712, + 3776, 3777, 3768, 3770, 0, 4096, 4097, 3584, + 3712, 3776, 3777, 3768, 0, 4096, 4097, 3584, + 3712, 3776, 3777, 3768, 3772, 0, 4096, 4097, + 3584, 3712, 3776, 3777, 3779, 3772, 0, 4096, + 4097, 3584, 3712, 3776, 3777, 3779, 3772, 3774, + 0, 4096, 4097, 3584, 3712, 0, 4096, 4097, + 3584, 3840, 3776, 0, 4096, 4097, 3584, 3840, + 3776, 0, 4096, 4097, 3584, 3840, 3776, 3778, + 0, 4096, 4097, 3584, 3840, 3776, 0, 4096, + 4097, 3584, 3840, 3776, 3780, 0, 4096, 4097, + 3584, 3840, 3776, 3780, 0, 4096, 4097, 3584, + 3840, 3776, 3784, 3782, 0, 4096, 4097, 3584, + 3840, 3776, 0, 4096, 4097, 3584, 3840, 3776, + 3784, 0, 4096, 4097, 3584, 3840, 3776, 3784, + 0, 4096, 4097, 3584, 3840, 3776, 3784, 3786, + 0, 4096, 4097, 3584, 3840, 3776, 3784, 0, + 4096, 4097, 3584, 3840, 3776, 3792, 3788, 0, + 4096, 4097, 3584, 3840, 3776, 3792, 3788, 0, + 4096, 4097, 3584, 3840, 3776, 3792, 3793, 3790, + 0, 4096, 4097, 3584, 3840, 3776, 0, 4096, + 4097, 3584, 3840, 3776, 3792, 0, 4096, 4097, + 3584, 3840, 3776, 3792, 0, 4096, 4097, 3584, + 3840, 3776, 3792, 3794, 0, 4096, 4097, 3584, + 3840, 3776, 3792, 0, 4096, 4097, 3584, 3840, + 3776, 3792, 3796, 0, 4096, 4097, 3584, 3840, + 3776, 3792, 3796, 0, 4096, 4097, 3584, 3840, + 3776, 3792, 3800, 3798, 0, 4096, 4097, 3584, + 3840, 3776, 3792, 0, 4096, 4097, 3584, 3840, + 3776, 3808, 3800, 0, 4096, 4097, 3584, 3840, + 3776, 3808, 3800, 0, 4096, 4097, 3584, 3840, + 3776, 3808, 3800, 3802, 0, 4096, 4097, 3584, + 3840, 3776, 3808, 3800, 0, 4096, 4097, 3584, + 3840, 3776, 3808, 3809, 3804, 0, 4096, 4097, + 3584, 3840, 3776, 3808, 3809, 3804, 0, 4096, + 4097, 3584, 3840, 3776, 3808, 3809, 3804, 3806, + 0, 4096, 4097, 3584, 3840, 3776, 0, 4096, + 4097, 3584, 3840, 3841, 3808, 0, 4096, 4097, + 3584, 3840, 3841, 3808, 0, 4096, 4097, 3584, + 3840, 3841, 3808, 3810, 0, 4096, 4097, 3584, + 3840, 3841, 3808, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3812, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3812, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3816, 3814, 0, 4096, 4097, 3584, + 3840, 3841, 3808, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3816, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3816, 0, 4096, 4097, 3584, 3840, + 3841, 3808, 3816, 3818, 0, 4096, 4097, 3584, + 3840, 3841, 3808, 3816, 0, 4096, 4097, 3584, + 3840, 3841, 3808, 3824, 3820, 0, 4096, 4097, + 3584, 3840, 3841, 3808, 3824, 3820, 0, 4096, + 4097, 3584, 3840, 3841, 3808, 3824, 3825, 3822, + 0, 4096, 4097, 3584, 3840, 3841, 3808, 0, + 4096, 4097, 3584, 3840, 3841, 3808, 3824, 0, + 4096, 4097, 3584, 3840, 3841, 3843, 3824, 0, + 4096, 4097, 3584, 3840, 3841, 3843, 3824, 3826, + 0, 4096, 4097, 3584, 3840, 3841, 3843, 3824, + 0, 4096, 4097, 3584, 3840, 3841, 3843, 3824, + 3828, 0, 4096, 4097, 3584, 3840, 3841, 3843, + 3824, 3828, 0, 4096, 4097, 3584, 3840, 3841, + 3843, 3824, 3832, 3830, 0, 4096, 4097, 3584, + 3840, 3841, 3843, 3824, 0, 4096, 4097, 3584, + 3840, 3841, 3843, 3824, 3832, 0, 4096, 4097, + 3584, 3840, 3841, 3843, 3824, 3832, 0, 4096, + 4097, 3584, 3840, 3841, 3843, 3824, 3832, 3834, + 0, 4096, 4097, 3584, 3840, 3841, 3843, 3847, + 3832, 0, 4096, 4097, 3584, 3840, 3841, 3843, + 3847, 3832, 3836, 0, 4096, 4097, 3584, 3840, + 3841, 3843, 3847, 3832, 3836, 0, 4096, 4097, + 3584, 3840, 3841, 3843, 3847, 3832, 3836, 3838, + 0, 4096, 4097, 3584, 0, 4096, 4097, 3584, + 3840, 0, 4096, 4097, 3584, 3840, 0, 4096, + 4097, 3584, 3840, 3842, 0, 4096, 4097, 4099, + 3840, 0, 4096, 4097, 4099, 3840, 3844, 0, + 4096, 4097, 4099, 3840, 3844, 0, 4096, 4097, + 4099, 3840, 3848, 3846, 0, 4096, 4097, 4099, + 3840, 0, 4096, 4097, 4099, 3840, 3848, 0, + 4096, 4097, 4099, 3840, 3848, 0, 4096, 4097, + 4099, 3840, 3848, 3850, 0, 4096, 4097, 4099, + 3840, 3848, 0, 4096, 4097, 4099, 3840, 3856, + 3852, 0, 4096, 4097, 4099, 3840, 3856, 3852, + 0, 4096, 4097, 4099, 3840, 3856, 3857, 3854, + 0, 4096, 4097, 4099, 3840, 0, 4096, 4097, + 4099, 3840, 3856, 0, 4096, 4097, 4099, 3840, + 3856, 0, 4096, 4097, 4099, 3840, 3856, 3858, + 0, 4096, 4097, 4099, 3840, 3856, 0, 4096, + 4097, 4099, 3840, 3856, 3860, 0, 4096, 4097, + 4099, 3840, 3856, 3860, 0, 4096, 4097, 4099, + 3840, 3856, 3864, 3862, 0, 4096, 4097, 4099, + 3840, 3856, 0, 4096, 4097, 4099, 3840, 3872, + 3864, 0, 4096, 4097, 4099, 3840, 3872, 3864, + 0, 4096, 4097, 4099, 3840, 3872, 3864, 3866, + 0, 4096, 4097, 4099, 3840, 3872, 3864, 0, + 4096, 4097, 4099, 3840, 3872, 3873, 3868, 0, + 4096, 4097, 4099, 3840, 3872, 3873, 3868, 0, + 4096, 4097, 4099, 3840, 3872, 3873, 3868, 3870, + 0, 4096, 4097, 4099, 3840, 0, 4096, 4097, + 4099, 3840, 3872, 0, 4096, 4097, 4099, 3840, + 3872, 0, 4096, 4097, 4099, 3840, 3872, 3874, + 0, 4096, 4097, 4099, 3840, 3872, 0, 4096, + 4097, 4099, 3840, 3872, 3876, 0, 4096, 4097, + 4099, 3840, 3872, 3876, 0, 4096, 4097, 4099, + 3840, 3872, 3880, 3878, 0, 4096, 4097, 4099, + 3840, 3872, 0, 4096, 4097, 4099, 3840, 3872, + 3880, 0, 4096, 4097, 4099, 3840, 3872, 3880, + 0, 4096, 4097, 4099, 3840, 3872, 3880, 3882, + 0, 4096, 4097, 4099, 3840, 3872, 3880, 0, + 4096, 4097, 4099, 3840, 3872, 3888, 3884, 0, + 4096, 4097, 4099, 3840, 3872, 3888, 3884, 0, + 4096, 4097, 4099, 3840, 3872, 3888, 3889, 3886, + 0, 4096, 4097, 4099, 3840, 3872, 0, 4096, + 4097, 4099, 3840, 3904, 3888, 0, 4096, 4097, + 4099, 3840, 3904, 3888, 0, 4096, 4097, 4099, + 3840, 3904, 3888, 3890, 0, 4096, 4097, 4099, + 3840, 3904, 3888, 0, 4096, 4097, 4099, 3840, + 3904, 3888, 3892, 0, 4096, 4097, 4099, 3840, + 3904, 3888, 3892, 0, 4096, 4097, 4099, 3840, + 3904, 3888, 3896, 3894, 0, 4096, 4097, 4099, + 3840, 3904, 3888, 0, 4096, 4097, 4099, 3840, + 3904, 3905, 3896, 0, 4096, 4097, 4099, 3840, + 3904, 3905, 3896, 0, 4096, 4097, 4099, 3840, + 3904, 3905, 3896, 3898, 0, 4096, 4097, 4099, + 3840, 3904, 3905, 3896, 0, 4096, 4097, 4099, + 3840, 3904, 3905, 3896, 3900, 0, 4096, 4097, + 4099, 3840, 3904, 3905, 3907, 3900, 0, 4096, + 4097, 4099, 3840, 3904, 3905, 3907, 3900, 3902, + 0, 4096, 4097, 4099, 3840, 0, 4096, 4097, + 4099, 3840, 3904, 0, 4096, 4097, 4099, 3840, + 3904, 0, 4096, 4097, 4099, 3840, 3904, 3906, + 0, 4096, 4097, 4099, 3840, 3904, 0, 4096, + 4097, 4099, 3840, 3904, 3908, 0, 4096, 4097, + 4099, 3840, 3904, 3908, 0, 4096, 4097, 4099, + 3840, 3904, 3912, 3910, 0, 4096, 4097, 4099, + 3840, 3904, 0, 4096, 4097, 4099, 3840, 3904, + 3912, 0, 4096, 4097, 4099, 3840, 3904, 3912, + 0, 4096, 4097, 4099, 3840, 3904, 3912, 3914, + 0, 4096, 4097, 4099, 3840, 3904, 3912, 0, + 4096, 4097, 4099, 3840, 3904, 3920, 3916, 0, + 4096, 4097, 4099, 3840, 3904, 3920, 3916, 0, + 4096, 4097, 4099, 3840, 3904, 3920, 3921, 3918, + 0, 4096, 4097, 4099, 3840, 3904, 0, 4096, + 4097, 4099, 3840, 3904, 3920, 0, 4096, 4097, + 4099, 3840, 3904, 3920, 0, 4096, 4097, 4099, + 3840, 3904, 3920, 3922, 0, 4096, 4097, 4099, + 3840, 3904, 3920, 0, 4096, 4097, 4099, 3840, + 3904, 3920, 3924, 0, 4096, 4097, 4099, 3840, + 3904, 3920, 3924, 0, 4096, 4097, 4099, 3840, + 3904, 3920, 3928, 3926, 0, 4096, 4097, 4099, + 3840, 3904, 3920, 0, 4096, 4097, 4099, 3840, + 3904, 3936, 3928, 0, 4096, 4097, 4099, 3840, + 3904, 3936, 3928, 0, 4096, 4097, 4099, 3840, + 3904, 3936, 3928, 3930, 0, 4096, 4097, 4099, + 3840, 3904, 3936, 3928, 0, 4096, 4097, 4099, + 3840, 3904, 3936, 3937, 3932, 0, 4096, 4097, + 4099, 3840, 3904, 3936, 3937, 3932, 0, 4096, + 4097, 4099, 3840, 3904, 3936, 3937, 3932, 3934, + 0, 4096, 4097, 4099, 3840, 3904, 0, 4096, + 4097, 4099, 3840, 3968, 3936, 0, 4096, 4097, + 4099, 3840, 3968, 3936, 0, 4096, 4097, 4099, + 3840, 3968, 3936, 3938, 0, 4096, 4097, 4099, + 3840, 3968, 3936, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3940, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3940, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3944, 3942, 0, 4096, 4097, 4099, + 3840, 3968, 3936, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3944, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3944, 0, 4096, 4097, 4099, 3840, + 3968, 3936, 3944, 3946, 0, 4096, 4097, 4099, + 3840, 3968, 3936, 3944, 0, 4096, 4097, 4099, + 3840, 3968, 3936, 3952, 3948, 0, 4096, 4097, + 4099, 3840, 3968, 3936, 3952, 3948, 0, 4096, + 4097, 4099, 3840, 3968, 3936, 3952, 3953, 3950, + 0, 4096, 4097, 4099, 3840, 3968, 3936, 0, + 4096, 4097, 4099, 3840, 3968, 3969, 3952, 0, + 4096, 4097, 4099, 3840, 3968, 3969, 3952, 0, + 4096, 4097, 4099, 3840, 3968, 3969, 3952, 3954, + 0, 4096, 4097, 4099, 3840, 3968, 3969, 3952, + 0, 4096, 4097, 4099, 3840, 3968, 3969, 3952, + 3956, 0, 4096, 4097, 4099, 3840, 3968, 3969, + 3952, 3956, 0, 4096, 4097, 4099, 3840, 3968, + 3969, 3952, 3960, 3958, 0, 4096, 4097, 4099, + 3840, 3968, 3969, 3952, 0, 4096, 4097, 4099, + 3840, 3968, 3969, 3952, 3960, 0, 4096, 4097, + 4099, 3840, 3968, 3969, 3971, 3960, 0, 4096, + 4097, 4099, 3840, 3968, 3969, 3971, 3960, 3962, + 0, 4096, 4097, 4099, 3840, 3968, 3969, 3971, + 3960, 0, 4096, 4097, 4099, 3840, 3968, 3969, + 3971, 3960, 3964, 0, 4096, 4097, 4099, 3840, + 3968, 3969, 3971, 3960, 3964, 0, 4096, 4097, + 4099, 3840, 3968, 3969, 3971, 3960, 3964, 3966, + 0, 4096, 4097, 4099, 3840, 0, 4096, 4097, + 4099, 3840, 3968, 0, 4096, 4097, 4099, 3840, + 3968, 0, 4096, 4097, 4099, 3840, 3968, 3970, + 0, 4096, 4097, 4099, 3840, 3968, 0, 4096, + 4097, 4099, 3840, 3968, 3972, 0, 4096, 4097, + 4099, 3840, 3968, 3972, 0, 4096, 4097, 4099, + 3840, 3968, 3976, 3974, 0, 4096, 4097, 4099, + 4103, 3968, 0, 4096, 4097, 4099, 4103, 3968, + 3976, 0, 4096, 4097, 4099, 4103, 3968, 3976, + 0, 4096, 4097, 4099, 4103, 3968, 3976, 3978, + 0, 4096, 4097, 4099, 4103, 3968, 3976, 0, + 4096, 4097, 4099, 4103, 3968, 3984, 3980, 0, + 4096, 4097, 4099, 4103, 3968, 3984, 3980, 0, + 4096, 4097, 4099, 4103, 3968, 3984, 3985, 3982, + 0, 4096, 4097, 4099, 4103, 3968, 0, 4096, + 4097, 4099, 4103, 3968, 3984, 0, 4096, 4097, + 4099, 4103, 3968, 3984, 0, 4096, 4097, 4099, + 4103, 3968, 3984, 3986, 0, 4096, 4097, 4099, + 4103, 3968, 3984, 0, 4096, 4097, 4099, 4103, + 3968, 3984, 3988, 0, 4096, 4097, 4099, 4103, + 3968, 3984, 3988, 0, 4096, 4097, 4099, 4103, + 3968, 3984, 3992, 3990, 0, 4096, 4097, 4099, + 4103, 3968, 3984, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 3992, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 3992, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 3992, 3994, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 3992, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 4001, 3996, 0, 4096, 4097, + 4099, 4103, 3968, 4000, 4001, 3996, 0, 4096, + 4097, 4099, 4103, 3968, 4000, 4001, 3996, 3998, + 0, 4096, 4097, 4099, 4103, 3968, 0, 4096, + 4097, 4099, 4103, 3968, 4000, 0, 4096, 4097, + 4099, 4103, 3968, 4000, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 4002, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4004, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4004, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4008, 4006, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4008, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4008, 0, 4096, 4097, 4099, 4103, + 3968, 4000, 4008, 4010, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 4008, 0, 4096, 4097, 4099, + 4103, 3968, 4000, 4016, 4012, 0, 4096, 4097, + 4099, 4103, 3968, 4000, 4016, 4012, 0, 4096, + 4097, 4099, 4103, 3968, 4000, 4016, 4017, 4014, + 0, 4096, 4097, 4099, 4103, 3968, 4000, 0, + 4096, 4097, 4099, 4103, 3968, 4032, 4016, 0, + 4096, 4097, 4099, 4103, 3968, 4032, 4016, 0, + 4096, 4097, 4099, 4103, 3968, 4032, 4016, 4018, + 0, 4096, 4097, 4099, 4103, 3968, 4032, 4016, + 0, 4096, 4097, 4099, 4103, 3968, 4032, 4016, + 4020, 0, 4096, 4097, 4099, 4103, 3968, 4032, + 4016, 4020, 0, 4096, 4097, 4099, 4103, 3968, + 4032, 4016, 4024, 4022, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 4016, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 4033, 4024, 0, 4096, 4097, + 4099, 4103, 3968, 4032, 4033, 4024, 0, 4096, + 4097, 4099, 4103, 3968, 4032, 4033, 4024, 4026, + 0, 4096, 4097, 4099, 4103, 3968, 4032, 4033, + 4024, 0, 4096, 4097, 4099, 4103, 3968, 4032, + 4033, 4024, 4028, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4033, 4035, 4028, 0, 4096, 4097, + 4099, 4103, 3968, 4032, 4033, 4035, 4028, 4030, + 0, 4096, 4097, 4099, 4103, 3968, 0, 4096, + 4097, 4099, 4103, 3968, 4032, 0, 4096, 4097, + 4099, 4103, 3968, 4032, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 4034, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4036, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4036, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4040, 4038, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4040, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4040, 0, 4096, 4097, 4099, 4103, + 3968, 4032, 4040, 4042, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 4040, 0, 4096, 4097, 4099, + 4103, 3968, 4032, 4048, 4044, 0, 4096, 4097, + 4099, 4103, 3968, 4032, 4048, 4044, 0, 4096, + 4097, 4099, 4103, 3968, 4032, 4048, 4049, 4046, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4048, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4048, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4048, 4050, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4048, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4048, + 4052, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4048, 4052, 0, 4096, 4097, 4099, 4103, 4111, + 4032, 4048, 4056, 4054, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4048, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4056, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4056, 0, 4096, + 4097, 4099, 4103, 4111, 4032, 4064, 4056, 4058, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 4056, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4065, 4060, 0, 4096, 4097, 4099, 4103, + 4111, 4032, 4064, 4065, 4060, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4065, 4060, 4062, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4064, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4064, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4064, 4066, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 4068, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4068, 0, 4096, 4097, 4099, 4103, 4111, + 4032, 4064, 4072, 4070, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4072, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4072, 0, 4096, + 4097, 4099, 4103, 4111, 4032, 4064, 4072, 4074, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 4072, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4080, 4076, 0, 4096, 4097, 4099, 4103, + 4111, 4032, 4064, 4080, 4076, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4080, 4081, 4078, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 0, 4096, 4097, 4099, 4103, 4111, 4032, 4064, + 4080, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4080, 0, 4096, 4097, 4099, 4103, 4111, + 4032, 4064, 4080, 4082, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4080, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4080, 4084, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4064, 4080, + 4084, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4080, 4088, 4086, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4080, 0, 4096, 4097, + 4099, 4103, 4111, 4032, 4064, 4080, 4088, 0, + 4096, 4097, 4099, 4103, 4111, 4032, 4064, 4080, + 4088, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4080, 4088, 4090, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4080, 4088, 0, 4096, + 4097, 4099, 4103, 4111, 4032, 4064, 4080, 4088, + 4092, 0, 4096, 4097, 4099, 4103, 4111, 4032, + 4064, 4080, 4088, 4092, 0, 4096, 4097, 4099, + 4103, 4111, 4032, 4064, 4080, 4088, 4092, 4094, + 0, 0, 4096, 0, 4096, 0, 4096, 4098, + 0, 4096, 0, 4096, 4100, 0, 4096, 4100, + 0, 4096, 4104, 4102, 0, 4096, 0, 4096, + 4104, 0, 4096, 4104, 0, 4096, 4104, 4106, + 0, 4096, 4104, 0, 4096, 4112, 4108, 0, + 4096, 4112, 4108, 0, 4096, 4112, 4113, 4110, + 0, 4096, 0, 4096, 4112, 0, 4096, 4112, + 0, 4096, 4112, 4114, 0, 4096, 4112, 0, + 4096, 4112, 4116, 0, 4096, 4112, 4116, 0, + 4096, 4112, 4120, 4118, 0, 4096, 4112, 0, + 4096, 4128, 4120, 0, 4096, 4128, 4120, 0, + 4096, 4128, 4120, 4122, 0, 4096, 4128, 4120, + 0, 4096, 4128, 4129, 4124, 0, 4096, 4128, + 4129, 4124, 0, 4096, 4128, 4129, 4124, 4126, + 0, 4096, 0, 4096, 4128, 0, 4096, 4128, + 0, 4096, 4128, 4130, 0, 4096, 4128, 0, + 4096, 4128, 4132, 0, 4096, 4128, 4132, 0, + 4096, 4128, 4136, 4134, 0, 4096, 4128, 0, + 4096, 4128, 4136, 0, 4096, 4128, 4136, 0, + 4096, 4128, 4136, 4138, 0, 4096, 4128, 4136, + 0, 4096, 4128, 4144, 4140, 0, 4096, 4128, + 4144, 4140, 0, 4096, 4128, 4144, 4145, 4142, + 0, 4096, 4128, 0, 4096, 4160, 4144, 0, + 4096, 4160, 4144, 0, 4096, 4160, 4144, 4146, + 0, 4096, 4160, 4144, 0, 4096, 4160, 4144, + 4148, 0, 4096, 4160, 4144, 4148, 0, 4096, + 4160, 4144, 4152, 4150, 0, 4096, 4160, 4144, + 0, 4096, 4160, 4161, 4152, 0, 4096, 4160, + 4161, 4152, 0, 4096, 4160, 4161, 4152, 4154, + 0, 4096, 4160, 4161, 4152, 0, 4096, 4160, + 4161, 4152, 4156, 0, 4096, 4160, 4161, 4163, + 4156, 0, 4096, 4160, 4161, 4163, 4156, 4158, + 0, 4096, 0, 4096, 4160, 0, 4096, 4160, + 0, 4096, 4160, 4162, 0, 4096, 4160, 0, + 4096, 4160, 4164, 0, 4096, 4160, 4164, 0, + 4096, 4160, 4168, 4166, 0, 4096, 4160, 0, + 4096, 4160, 4168, 0, 4096, 4160, 4168, 0, + 4096, 4160, 4168, 4170, 0, 4096, 4160, 4168, + 0, 4096, 4160, 4176, 4172, 0, 4096, 4160, + 4176, 4172, 0, 4096, 4160, 4176, 4177, 4174, + 0, 4096, 4160, 0, 4096, 4160, 4176, 0, + 4096, 4160, 4176, 0, 4096, 4160, 4176, 4178, + 0, 4096, 4160, 4176, 0, 4096, 4160, 4176, + 4180, 0, 4096, 4160, 4176, 4180, 0, 4096, + 4160, 4176, 4184, 4182, 0, 4096, 4160, 4176, + 0, 4096, 4160, 4192, 4184, 0, 4096, 4160, + 4192, 4184, 0, 4096, 4160, 4192, 4184, 4186, + 0, 4096, 4160, 4192, 4184, 0, 4096, 4160, + 4192, 4193, 4188, 0, 4096, 4160, 4192, 4193, + 4188, 0, 4096, 4160, 4192, 4193, 4188, 4190, + 0, 4096, 4160, 0, 4096, 4224, 4192, 0, + 4096, 4224, 4192, 0, 4096, 4224, 4192, 4194, + 0, 4096, 4224, 4192, 0, 4096, 4224, 4192, + 4196, 0, 4096, 4224, 4192, 4196, 0, 4096, + 4224, 4192, 4200, 4198, 0, 4096, 4224, 4192, + 0, 4096, 4224, 4192, 4200, 0, 4096, 4224, + 4192, 4200, 0, 4096, 4224, 4192, 4200, 4202, + 0, 4096, 4224, 4192, 4200, 0, 4096, 4224, + 4192, 4208, 4204, 0, 4096, 4224, 4192, 4208, + 4204, 0, 4096, 4224, 4192, 4208, 4209, 4206, + 0, 4096, 4224, 4192, 0, 4096, 4224, 4225, + 4208, 0, 4096, 4224, 4225, 4208, 0, 4096, + 4224, 4225, 4208, 4210, 0, 4096, 4224, 4225, + 4208, 0, 4096, 4224, 4225, 4208, 4212, 0, + 4096, 4224, 4225, 4208, 4212, 0, 4096, 4224, + 4225, 4208, 4216, 4214, 0, 4096, 4224, 4225, + 4208, 0, 4096, 4224, 4225, 4208, 4216, 0, + 4096, 4224, 4225, 4227, 4216, 0, 4096, 4224, + 4225, 4227, 4216, 4218, 0, 4096, 4224, 4225, + 4227, 4216, 0, 4096, 4224, 4225, 4227, 4216, + 4220, 0, 4096, 4224, 4225, 4227, 4216, 4220, + 0, 4096, 4224, 4225, 4227, 4216, 4220, 4222, + 0, 4096, 0, 4096, 4224, 0, 4096, 4224, + 0, 4096, 4224, 4226, 0, 4096, 4224, 0, + 4096, 4224, 4228, 0, 4096, 4224, 4228, 0, + 4096, 4224, 4232, 4230, 0, 4096, 4224, 0, + 4096, 4224, 4232, 0, 4096, 4224, 4232, 0, + 4096, 4224, 4232, 4234, 0, 4096, 4224, 4232, + 0, 4096, 4224, 4240, 4236, 0, 4096, 4224, + 4240, 4236, 0, 4096, 4224, 4240, 4241, 4238, + 0, 4096, 4224, 0, 4096, 4224, 4240, 0, + 4096, 4224, 4240, 0, 4096, 4224, 4240, 4242, + 0, 4096, 4224, 4240, 0, 4096, 4224, 4240, + 4244, 0, 4096, 4224, 4240, 4244, 0, 4096, + 4224, 4240, 4248, 4246, 0, 4096, 4224, 4240, + 0, 4096, 4224, 4256, 4248, 0, 4096, 4224, + 4256, 4248, 0, 4096, 4224, 4256, 4248, 4250, + 0, 4096, 4224, 4256, 4248, 0, 4096, 4224, + 4256, 4257, 4252, 0, 4096, 4224, 4256, 4257, + 4252, 0, 4096, 4224, 4256, 4257, 4252, 4254, + 0, 4096, 4224, 0, 4096, 4224, 4256, 0, + 4096, 4224, 4256, 0, 4096, 4224, 4256, 4258, + 0, 4096, 4224, 4256, 0, 4096, 4224, 4256, + 4260, 0, 4096, 4224, 4256, 4260, 0, 4096, + 4224, 4256, 4264, 4262, 0, 4096, 4224, 4256, + 0, 4096, 4224, 4256, 4264, 0, 4096, 4224, + 4256, 4264, 0, 4096, 4224, 4256, 4264, 4266, + 0, 4096, 4224, 4256, 4264, 0, 4096, 4224, + 4256, 4272, 4268, 0, 4096, 4224, 4256, 4272, + 4268, 0, 4096, 4224, 4256, 4272, 4273, 4270, + 0, 4096, 4224, 4256, 0, 4096, 4224, 4288, + 4272, 0, 4096, 4224, 4288, 4272, 0, 4096, + 4224, 4288, 4272, 4274, 0, 4096, 4224, 4288, + 4272, 0, 4096, 4224, 4288, 4272, 4276, 0, + 4096, 4224, 4288, 4272, 4276, 0, 4096, 4224, + 4288, 4272, 4280, 4278, 0, 4096, 4224, 4288, + 4272, 0, 4096, 4224, 4288, 4289, 4280, 0, + 4096, 4224, 4288, 4289, 4280, 0, 4096, 4224, + 4288, 4289, 4280, 4282, 0, 4096, 4224, 4288, + 4289, 4280, 0, 4096, 4224, 4288, 4289, 4280, + 4284, 0, 4096, 4224, 4288, 4289, 4291, 4284, + 0, 4096, 4224, 4288, 4289, 4291, 4284, 4286, + 0, 4096, 4224, 0, 4096, 4352, 4288, 0, + 4096, 4352, 4288, 0, 4096, 4352, 4288, 4290, + 0, 4096, 4352, 4288, 0, 4096, 4352, 4288, + 4292, 0, 4096, 4352, 4288, 4292, 0, 4096, + 4352, 4288, 4296, 4294, 0, 4096, 4352, 4288, + 0, 4096, 4352, 4288, 4296, 0, 4096, 4352, + 4288, 4296, 0, 4096, 4352, 4288, 4296, 4298, + 0, 4096, 4352, 4288, 4296, 0, 4096, 4352, + 4288, 4304, 4300, 0, 4096, 4352, 4288, 4304, + 4300, 0, 4096, 4352, 4288, 4304, 4305, 4302, + 0, 4096, 4352, 4288, 0, 4096, 4352, 4288, + 4304, 0, 4096, 4352, 4288, 4304, 0, 4096, + 4352, 4288, 4304, 4306, 0, 4096, 4352, 4288, + 4304, 0, 4096, 4352, 4288, 4304, 4308, 0, + 4096, 4352, 4288, 4304, 4308, 0, 4096, 4352, + 4288, 4304, 4312, 4310, 0, 4096, 4352, 4288, + 4304, 0, 4096, 4352, 4288, 4320, 4312, 0, + 4096, 4352, 4288, 4320, 4312, 0, 4096, 4352, + 4288, 4320, 4312, 4314, 0, 4096, 4352, 4288, + 4320, 4312, 0, 4096, 4352, 4288, 4320, 4321, + 4316, 0, 4096, 4352, 4288, 4320, 4321, 4316, + 0, 4096, 4352, 4288, 4320, 4321, 4316, 4318, + 0, 4096, 4352, 4288, 0, 4096, 4352, 4353, + 4320, 0, 4096, 4352, 4353, 4320, 0, 4096, + 4352, 4353, 4320, 4322, 0, 4096, 4352, 4353, + 4320, 0, 4096, 4352, 4353, 4320, 4324, 0, + 4096, 4352, 4353, 4320, 4324, 0, 4096, 4352, + 4353, 4320, 4328, 4326, 0, 4096, 4352, 4353, + 4320, 0, 4096, 4352, 4353, 4320, 4328, 0, + 4096, 4352, 4353, 4320, 4328, 0, 4096, 4352, + 4353, 4320, 4328, 4330, 0, 4096, 4352, 4353, + 4320, 4328, 0, 4096, 4352, 4353, 4320, 4336, + 4332, 0, 4096, 4352, 4353, 4320, 4336, 4332, + 0, 4096, 4352, 4353, 4320, 4336, 4337, 4334, + 0, 4096, 4352, 4353, 4320, 0, 4096, 4352, + 4353, 4320, 4336, 0, 4096, 4352, 4353, 4355, + 4336, 0, 4096, 4352, 4353, 4355, 4336, 4338, + 0, 4096, 4352, 4353, 4355, 4336, 0, 4096, + 4352, 4353, 4355, 4336, 4340, 0, 4096, 4352, + 4353, 4355, 4336, 4340, 0, 4096, 4352, 4353, + 4355, 4336, 4344, 4342, 0, 4096, 4352, 4353, + 4355, 4336, 0, 4096, 4352, 4353, 4355, 4336, + 4344, 0, 4096, 4352, 4353, 4355, 4336, 4344, + 0, 4096, 4352, 4353, 4355, 4336, 4344, 4346, + 0, 4096, 4352, 4353, 4355, 4359, 4344, 0, + 4096, 4352, 4353, 4355, 4359, 4344, 4348, 0, + 4096, 4352, 4353, 4355, 4359, 4344, 4348, 0, + 4096, 4352, 4353, 4355, 4359, 4344, 4348, 4350, + 0, 4096, 0, 4096, 4352, 0, 4096, 4352, + 0, 4096, 4352, 4354, 0, 4096, 4352, 0, + 4096, 4352, 4356, 0, 4096, 4352, 4356, 0, + 4096, 4352, 4360, 4358, 0, 4096, 4352, 0, + 4096, 4352, 4360, 0, 4096, 4352, 4360, 0, + 4096, 4352, 4360, 4362, 0, 4096, 4352, 4360, + 0, 4096, 4352, 4368, 4364, 0, 4096, 4352, + 4368, 4364, 0, 4096, 4352, 4368, 4369, 4366, + 0, 4096, 4352, 0, 4096, 4352, 4368, 0, + 4096, 4352, 4368, 0, 4096, 4352, 4368, 4370, + 0, 4096, 4352, 4368, 0, 4096, 4352, 4368, + 4372, 0, 4096, 4352, 4368, 4372, 0, 4096, + 4352, 4368, 4376, 4374, 0, 4096, 4352, 4368, + 0, 4096, 4352, 4384, 4376, 0, 4096, 4352, + 4384, 4376, 0, 4096, 4352, 4384, 4376, 4378, + 0, 4096, 4352, 4384, 4376, 0, 4096, 4352, + 4384, 4385, 4380, 0, 4096, 4352, 4384, 4385, + 4380, 0, 4096, 4352, 4384, 4385, 4380, 4382, + 0, 4096, 4352, 0, 4096, 4352, 4384, 0, + 4096, 4352, 4384, 0, 4096, 4352, 4384, 4386, + 0, 4096, 4352, 4384, 0, 4096, 4352, 4384, + 4388, 0, 4096, 4352, 4384, 4388, 0, 4096, + 4352, 4384, 4392, 4390, 0, 4096, 4352, 4384, + 0, 4096, 4352, 4384, 4392, 0, 4096, 4352, + 4384, 4392, 0, 4096, 4352, 4384, 4392, 4394, + 0, 4096, 4352, 4384, 4392, 0, 4096, 4352, + 4384, 4400, 4396, 0, 4096, 4352, 4384, 4400, + 4396, 0, 4096, 4352, 4384, 4400, 4401, 4398, + 0, 4096, 4352, 4384, 0, 4096, 4352, 4416, + 4400, 0, 4096, 4352, 4416, 4400, 0, 4096, + 4352, 4416, 4400, 4402, 0, 4096, 4352, 4416, + 4400, 0, 4096, 4352, 4416, 4400, 4404, 0, + 4096, 4352, 4416, 4400, 4404, 0, 4096, 4352, + 4416, 4400, 4408, 4406, 0, 4096, 4352, 4416, + 4400, 0, 4096, 4352, 4416, 4417, 4408, 0, + 4096, 4352, 4416, 4417, 4408, 0, 4096, 4352, + 4416, 4417, 4408, 4410, 0, 4096, 4352, 4416, + 4417, 4408, 0, 4096, 4352, 4416, 4417, 4408, + 4412, 0, 4096, 4352, 4416, 4417, 4419, 4412, + 0, 4096, 4352, 4416, 4417, 4419, 4412, 4414, + 0, 4096, 4352, 0, 4096, 4352, 4416, 0, + 4096, 4352, 4416, 0, 4096, 4352, 4416, 4418, + 0, 4096, 4352, 4416, 0, 4096, 4352, 4416, + 4420, 0, 4096, 4352, 4416, 4420, 0, 4096, + 4352, 4416, 4424, 4422, 0, 4096, 4352, 4416, + 0, 4096, 4352, 4416, 4424, 0, 4096, 4352, + 4416, 4424, 0, 4096, 4352, 4416, 4424, 4426, + 0, 4096, 4352, 4416, 4424, 0, 4096, 4352, + 4416, 4432, 4428, 0, 4096, 4352, 4416, 4432, + 4428, 0, 4096, 4352, 4416, 4432, 4433, 4430, + 0, 4096, 4352, 4416, 0, 4096, 4352, 4416, + 4432, 0, 4096, 4352, 4416, 4432, 0, 4096, + 4352, 4416, 4432, 4434, 0, 4096, 4352, 4416, + 4432, 0, 4096, 4352, 4416, 4432, 4436, 0, + 4096, 4352, 4416, 4432, 4436, 0, 4096, 4352, + 4416, 4432, 4440, 4438, 0, 4096, 4352, 4416, + 4432, 0, 4096, 4352, 4416, 4448, 4440, 0, + 4096, 4352, 4416, 4448, 4440, 0, 4096, 4352, + 4416, 4448, 4440, 4442, 0, 4096, 4352, 4416, + 4448, 4440, 0, 4096, 4352, 4416, 4448, 4449, + 4444, 0, 4096, 4352, 4416, 4448, 4449, 4444, + 0, 4096, 4352, 4416, 4448, 4449, 4444, 4446, + 0, 4096, 4352, 4416, 0, 4096, 4352, 4480, + 4448, 0, 4096, 4352, 4480, 4448, 0, 4096, + 4352, 4480, 4448, 4450, 0, 4096, 4352, 4480, + 4448, 0, 4096, 4352, 4480, 4448, 4452, 0, + 4096, 4352, 4480, 4448, 4452, 0, 4096, 4352, + 4480, 4448, 4456, 4454, 0, 4096, 4352, 4480, + 4448, 0, 4096, 4352, 4480, 4448, 4456, 0, + 4096, 4352, 4480, 4448, 4456, 0, 4096, 4352, + 4480, 4448, 4456, 4458, 0, 4096, 4352, 4480, + 4448, 4456, 0, 4096, 4352, 4480, 4448, 4464, + 4460, 0, 4096, 4352, 4480, 4448, 4464, 4460, + 0, 4096, 4352, 4480, 4448, 4464, 4465, 4462, + 0, 4096, 4352, 4480, 4448, 0, 4096, 4352, + 4480, 4481, 4464, 0, 4096, 4352, 4480, 4481, + 4464, 0, 4096, 4352, 4480, 4481, 4464, 4466, + 0, 4096, 4352, 4480, 4481, 4464, 0, 4096, + 4352, 4480, 4481, 4464, 4468, 0, 4096, 4352, + 4480, 4481, 4464, 4468, 0, 4096, 4352, 4480, + 4481, 4464, 4472, 4470, 0, 4096, 4352, 4480, + 4481, 4464, 0, 4096, 4352, 4480, 4481, 4464, + 4472, 0, 4096, 4352, 4480, 4481, 4483, 4472, + 0, 4096, 4352, 4480, 4481, 4483, 4472, 4474, + 0, 4096, 4352, 4480, 4481, 4483, 4472, 0, + 4096, 4352, 4480, 4481, 4483, 4472, 4476, 0, + 4096, 4352, 4480, 4481, 4483, 4472, 4476, 0, + 4096, 4352, 4480, 4481, 4483, 4472, 4476, 4478, + 0, 4096, 4352, 0, 4096, 4608, 4480, 0, + 4096, 4608, 4480, 0, 4096, 4608, 4480, 4482, + 0, 4096, 4608, 4480, 0, 4096, 4608, 4480, + 4484, 0, 4096, 4608, 4480, 4484, 0, 4096, + 4608, 4480, 4488, 4486, 0, 4096, 4608, 4480, + 0, 4096, 4608, 4480, 4488, 0, 4096, 4608, + 4480, 4488, 0, 4096, 4608, 4480, 4488, 4490, + 0, 4096, 4608, 4480, 4488, 0, 4096, 4608, + 4480, 4496, 4492, 0, 4096, 4608, 4480, 4496, + 4492, 0, 4096, 4608, 4480, 4496, 4497, 4494, + 0, 4096, 4608, 4480, 0, 4096, 4608, 4480, + 4496, 0, 4096, 4608, 4480, 4496, 0, 4096, + 4608, 4480, 4496, 4498, 0, 4096, 4608, 4480, + 4496, 0, 4096, 4608, 4480, 4496, 4500, 0, + 4096, 4608, 4480, 4496, 4500, 0, 4096, 4608, + 4480, 4496, 4504, 4502, 0, 4096, 4608, 4480, + 4496, 0, 4096, 4608, 4480, 4512, 4504, 0, + 4096, 4608, 4480, 4512, 4504, 0, 4096, 4608, + 4480, 4512, 4504, 4506, 0, 4096, 4608, 4480, + 4512, 4504, 0, 4096, 4608, 4480, 4512, 4513, + 4508, 0, 4096, 4608, 4480, 4512, 4513, 4508, + 0, 4096, 4608, 4480, 4512, 4513, 4508, 4510, + 0, 4096, 4608, 4480, 0, 4096, 4608, 4480, + 4512, 0, 4096, 4608, 4480, 4512, 0, 4096, + 4608, 4480, 4512, 4514, 0, 4096, 4608, 4480, + 4512, 0, 4096, 4608, 4480, 4512, 4516, 0, + 4096, 4608, 4480, 4512, 4516, 0, 4096, 4608, + 4480, 4512, 4520, 4518, 0, 4096, 4608, 4480, + 4512, 0, 4096, 4608, 4480, 4512, 4520, 0, + 4096, 4608, 4480, 4512, 4520, 0, 4096, 4608, + 4480, 4512, 4520, 4522, 0, 4096, 4608, 4480, + 4512, 4520, 0, 4096, 4608, 4480, 4512, 4528, + 4524, 0, 4096, 4608, 4480, 4512, 4528, 4524, + 0, 4096, 4608, 4480, 4512, 4528, 4529, 4526, + 0, 4096, 4608, 4480, 4512, 0, 4096, 4608, + 4480, 4544, 4528, 0, 4096, 4608, 4480, 4544, + 4528, 0, 4096, 4608, 4480, 4544, 4528, 4530, + 0, 4096, 4608, 4480, 4544, 4528, 0, 4096, + 4608, 4480, 4544, 4528, 4532, 0, 4096, 4608, + 4480, 4544, 4528, 4532, 0, 4096, 4608, 4480, + 4544, 4528, 4536, 4534, 0, 4096, 4608, 4480, + 4544, 4528, 0, 4096, 4608, 4480, 4544, 4545, + 4536, 0, 4096, 4608, 4480, 4544, 4545, 4536, + 0, 4096, 4608, 4480, 4544, 4545, 4536, 4538, + 0, 4096, 4608, 4480, 4544, 4545, 4536, 0, + 4096, 4608, 4480, 4544, 4545, 4536, 4540, 0, + 4096, 4608, 4480, 4544, 4545, 4547, 4540, 0, + 4096, 4608, 4480, 4544, 4545, 4547, 4540, 4542, + 0, 4096, 4608, 4480, 0, 4096, 4608, 4609, + 4544, 0, 4096, 4608, 4609, 4544, 0, 4096, + 4608, 4609, 4544, 4546, 0, 4096, 4608, 4609, + 4544, 0, 4096, 4608, 4609, 4544, 4548, 0, + 4096, 4608, 4609, 4544, 4548, 0, 4096, 4608, + 4609, 4544, 4552, 4550, 0, 4096, 4608, 4609, + 4544, 0, 4096, 4608, 4609, 4544, 4552, 0, + 4096, 4608, 4609, 4544, 4552, 0, 4096, 4608, + 4609, 4544, 4552, 4554, 0, 4096, 4608, 4609, + 4544, 4552, 0, 4096, 4608, 4609, 4544, 4560, + 4556, 0, 4096, 4608, 4609, 4544, 4560, 4556, + 0, 4096, 4608, 4609, 4544, 4560, 4561, 4558, + 0, 4096, 4608, 4609, 4544, 0, 4096, 4608, + 4609, 4544, 4560, 0, 4096, 4608, 4609, 4544, + 4560, 0, 4096, 4608, 4609, 4544, 4560, 4562, + 0, 4096, 4608, 4609, 4544, 4560, 0, 4096, + 4608, 4609, 4544, 4560, 4564, 0, 4096, 4608, + 4609, 4544, 4560, 4564, 0, 4096, 4608, 4609, + 4544, 4560, 4568, 4566, 0, 4096, 4608, 4609, + 4544, 4560, 0, 4096, 4608, 4609, 4544, 4576, + 4568, 0, 4096, 4608, 4609, 4544, 4576, 4568, + 0, 4096, 4608, 4609, 4544, 4576, 4568, 4570, + 0, 4096, 4608, 4609, 4544, 4576, 4568, 0, + 4096, 4608, 4609, 4544, 4576, 4577, 4572, 0, + 4096, 4608, 4609, 4544, 4576, 4577, 4572, 0, + 4096, 4608, 4609, 4544, 4576, 4577, 4572, 4574, + 0, 4096, 4608, 4609, 4544, 0, 4096, 4608, + 4609, 4544, 4576, 0, 4096, 4608, 4609, 4611, + 4576, 0, 4096, 4608, 4609, 4611, 4576, 4578, + 0, 4096, 4608, 4609, 4611, 4576, 0, 4096, + 4608, 4609, 4611, 4576, 4580, 0, 4096, 4608, + 4609, 4611, 4576, 4580, 0, 4096, 4608, 4609, + 4611, 4576, 4584, 4582, 0, 4096, 4608, 4609, + 4611, 4576, 0, 4096, 4608, 4609, 4611, 4576, + 4584, 0, 4096, 4608, 4609, 4611, 4576, 4584, + 0, 4096, 4608, 4609, 4611, 4576, 4584, 4586, + 0, 4096, 4608, 4609, 4611, 4576, 4584, 0, + 4096, 4608, 4609, 4611, 4576, 4592, 4588, 0, + 4096, 4608, 4609, 4611, 4576, 4592, 4588, 0, + 4096, 4608, 4609, 4611, 4576, 4592, 4593, 4590, + 0, 4096, 4608, 4609, 4611, 4576, 0, 4096, + 4608, 4609, 4611, 4576, 4592, 0, 4096, 4608, + 4609, 4611, 4576, 4592, 0, 4096, 4608, 4609, + 4611, 4576, 4592, 4594, 0, 4096, 4608, 4609, + 4611, 4615, 4592, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4596, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4596, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4600, 4598, 0, 4096, 4608, 4609, + 4611, 4615, 4592, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4600, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4600, 0, 4096, 4608, 4609, 4611, + 4615, 4592, 4600, 4602, 0, 4096, 4608, 4609, + 4611, 4615, 4592, 4600, 0, 4096, 4608, 4609, + 4611, 4615, 4592, 4600, 4604, 0, 4096, 4608, + 4609, 4611, 4615, 4592, 4600, 4604, 0, 4096, + 4608, 4609, 4611, 4615, 4592, 4600, 4604, 4606, + 0, 4096, 0, 4096, 4608, 0, 4096, 4608, + 0, 4096, 4608, 4610, 0, 4096, 4608, 0, + 4096, 4608, 4612, 0, 4096, 4608, 4612, 0, + 4096, 4608, 4616, 4614, 0, 4096, 4608, 0, + 4096, 4608, 4616, 0, 4096, 4608, 4616, 0, + 4096, 4608, 4616, 4618, 0, 4096, 4608, 4616, + 0, 4096, 4608, 4624, 4620, 0, 4096, 4608, + 4624, 4620, 0, 4096, 4608, 4624, 4625, 4622, + 0, 4096, 4608, 0, 4096, 4608, 4624, 0, + 4096, 4608, 4624, 0, 4096, 4608, 4624, 4626, + 0, 4096, 4608, 4624, 0, 4096, 4608, 4624, + 4628, 0, 4096, 4608, 4624, 4628, 0, 4096, + 4608, 4624, 4632, 4630, 0, 4096, 4608, 4624, + 0, 4096, 4608, 4640, 4632, 0, 4096, 4608, + 4640, 4632, 0, 4096, 4608, 4640, 4632, 4634, + 0, 4096, 4608, 4640, 4632, 0, 4096, 4608, + 4640, 4641, 4636, 0, 4096, 4608, 4640, 4641, + 4636, 0, 4096, 4608, 4640, 4641, 4636, 4638, + 0, 4096, 4608, 0, 4096, 4608, 4640, 0, + 4096, 4608, 4640, 0, 4096, 4608, 4640, 4642, + 0, 4096, 4608, 4640, 0, 4096, 4608, 4640, + 4644, 0, 4096, 4608, 4640, 4644, 0, 4096, + 4608, 4640, 4648, 4646, 0, 4096, 4608, 4640, + 0, 4096, 4608, 4640, 4648, 0, 4096, 4608, + 4640, 4648, 0, 4096, 4608, 4640, 4648, 4650, + 0, 4096, 4608, 4640, 4648, 0, 4096, 4608, + 4640, 4656, 4652, 0, 4096, 4608, 4640, 4656, + 4652, 0, 4096, 4608, 4640, 4656, 4657, 4654, + 0, 4096, 4608, 4640, 0, 4096, 4608, 4672, + 4656, 0, 4096, 4608, 4672, 4656, 0, 4096, + 4608, 4672, 4656, 4658, 0, 4096, 4608, 4672, + 4656, 0, 4096, 4608, 4672, 4656, 4660, 0, + 4096, 4608, 4672, 4656, 4660, 0, 4096, 4608, + 4672, 4656, 4664, 4662, 0, 4096, 4608, 4672, + 4656, 0, 4096, 4608, 4672, 4673, 4664, 0, + 4096, 4608, 4672, 4673, 4664, 0, 4096, 4608, + 4672, 4673, 4664, 4666, 0, 4096, 4608, 4672, + 4673, 4664, 0, 4096, 4608, 4672, 4673, 4664, + 4668, 0, 4096, 4608, 4672, 4673, 4675, 4668, + 0, 4096, 4608, 4672, 4673, 4675, 4668, 4670, + 0, 4096, 4608, 0, 4096, 4608, 4672, 0, + 4096, 4608, 4672, 0, 4096, 4608, 4672, 4674, + 0, 4096, 4608, 4672, 0, 4096, 4608, 4672, + 4676, 0, 4096, 4608, 4672, 4676, 0, 4096, + 4608, 4672, 4680, 4678, 0, 4096, 4608, 4672, + 0, 4096, 4608, 4672, 4680, 0, 4096, 4608, + 4672, 4680, 0, 4096, 4608, 4672, 4680, 4682, + 0, 4096, 4608, 4672, 4680, 0, 4096, 4608, + 4672, 4688, 4684, 0, 4096, 4608, 4672, 4688, + 4684, 0, 4096, 4608, 4672, 4688, 4689, 4686, + 0, 4096, 4608, 4672, 0, 4096, 4608, 4672, + 4688, 0, 4096, 4608, 4672, 4688, 0, 4096, + 4608, 4672, 4688, 4690, 0, 4096, 4608, 4672, + 4688, 0, 4096, 4608, 4672, 4688, 4692, 0, + 4096, 4608, 4672, 4688, 4692, 0, 4096, 4608, + 4672, 4688, 4696, 4694, 0, 4096, 4608, 4672, + 4688, 0, 4096, 4608, 4672, 4704, 4696, 0, + 4096, 4608, 4672, 4704, 4696, 0, 4096, 4608, + 4672, 4704, 4696, 4698, 0, 4096, 4608, 4672, + 4704, 4696, 0, 4096, 4608, 4672, 4704, 4705, + 4700, 0, 4096, 4608, 4672, 4704, 4705, 4700, + 0, 4096, 4608, 4672, 4704, 4705, 4700, 4702, + 0, 4096, 4608, 4672, 0, 4096, 4608, 4736, + 4704, 0, 4096, 4608, 4736, 4704, 0, 4096, + 4608, 4736, 4704, 4706, 0, 4096, 4608, 4736, + 4704, 0, 4096, 4608, 4736, 4704, 4708, 0, + 4096, 4608, 4736, 4704, 4708, 0, 4096, 4608, + 4736, 4704, 4712, 4710, 0, 4096, 4608, 4736, + 4704, 0, 4096, 4608, 4736, 4704, 4712, 0, + 4096, 4608, 4736, 4704, 4712, 0, 4096, 4608, + 4736, 4704, 4712, 4714, 0, 4096, 4608, 4736, + 4704, 4712, 0, 4096, 4608, 4736, 4704, 4720, + 4716, 0, 4096, 4608, 4736, 4704, 4720, 4716, + 0, 4096, 4608, 4736, 4704, 4720, 4721, 4718, + 0, 4096, 4608, 4736, 4704, 0, 4096, 4608, + 4736, 4737, 4720, 0, 4096, 4608, 4736, 4737, + 4720, 0, 4096, 4608, 4736, 4737, 4720, 4722, + 0, 4096, 4608, 4736, 4737, 4720, 0, 4096, + 4608, 4736, 4737, 4720, 4724, 0, 4096, 4608, + 4736, 4737, 4720, 4724, 0, 4096, 4608, 4736, + 4737, 4720, 4728, 4726, 0, 4096, 4608, 4736, + 4737, 4720, 0, 4096, 4608, 4736, 4737, 4720, + 4728, 0, 4096, 4608, 4736, 4737, 4739, 4728, + 0, 4096, 4608, 4736, 4737, 4739, 4728, 4730, + 0, 4096, 4608, 4736, 4737, 4739, 4728, 0, + 4096, 4608, 4736, 4737, 4739, 4728, 4732, 0, + 4096, 4608, 4736, 4737, 4739, 4728, 4732, 0, + 4096, 4608, 4736, 4737, 4739, 4728, 4732, 4734, + 0, 4096, 4608, 0, 4096, 4608, 4736, 0, + 4096, 4608, 4736, 0, 4096, 4608, 4736, 4738, + 0, 4096, 4608, 4736, 0, 4096, 4608, 4736, + 4740, 0, 4096, 4608, 4736, 4740, 0, 4096, + 4608, 4736, 4744, 4742, 0, 4096, 4608, 4736, + 0, 4096, 4608, 4736, 4744, 0, 4096, 4608, + 4736, 4744, 0, 4096, 4608, 4736, 4744, 4746, + 0, 4096, 4608, 4736, 4744, 0, 4096, 4608, + 4736, 4752, 4748, 0, 4096, 4608, 4736, 4752, + 4748, 0, 4096, 4608, 4736, 4752, 4753, 4750, + 0, 4096, 4608, 4736, 0, 4096, 4608, 4736, + 4752, 0, 4096, 4608, 4736, 4752, 0, 4096, + 4608, 4736, 4752, 4754, 0, 4096, 4608, 4736, + 4752, 0, 4096, 4608, 4736, 4752, 4756, 0, + 4096, 4608, 4736, 4752, 4756, 0, 4096, 4608, + 4736, 4752, 4760, 4758, 0, 4096, 4608, 4736, + 4752, 0, 4096, 4608, 4736, 4768, 4760, 0, + 4096, 4608, 4736, 4768, 4760, 0, 4096, 4608, + 4736, 4768, 4760, 4762, 0, 4096, 4608, 4736, + 4768, 4760, 0, 4096, 4608, 4736, 4768, 4769, + 4764, 0, 4096, 4608, 4736, 4768, 4769, 4764, + 0, 4096, 4608, 4736, 4768, 4769, 4764, 4766, + 0, 4096, 4608, 4736, 0, 4096, 4608, 4736, + 4768, 0, 4096, 4608, 4736, 4768, 0, 4096, + 4608, 4736, 4768, 4770, 0, 4096, 4608, 4736, + 4768, 0, 4096, 4608, 4736, 4768, 4772, 0, + 4096, 4608, 4736, 4768, 4772, 0, 4096, 4608, + 4736, 4768, 4776, 4774, 0, 4096, 4608, 4736, + 4768, 0, 4096, 4608, 4736, 4768, 4776, 0, + 4096, 4608, 4736, 4768, 4776, 0, 4096, 4608, + 4736, 4768, 4776, 4778, 0, 4096, 4608, 4736, + 4768, 4776, 0, 4096, 4608, 4736, 4768, 4784, + 4780, 0, 4096, 4608, 4736, 4768, 4784, 4780, + 0, 4096, 4608, 4736, 4768, 4784, 4785, 4782, + 0, 4096, 4608, 4736, 4768, 0, 4096, 4608, + 4736, 4800, 4784, 0, 4096, 4608, 4736, 4800, + 4784, 0, 4096, 4608, 4736, 4800, 4784, 4786, + 0, 4096, 4608, 4736, 4800, 4784, 0, 4096, + 4608, 4736, 4800, 4784, 4788, 0, 4096, 4608, + 4736, 4800, 4784, 4788, 0, 4096, 4608, 4736, + 4800, 4784, 4792, 4790, 0, 4096, 4608, 4736, + 4800, 4784, 0, 4096, 4608, 4736, 4800, 4801, + 4792, 0, 4096, 4608, 4736, 4800, 4801, 4792, + 0, 4096, 4608, 4736, 4800, 4801, 4792, 4794, + 0, 4096, 4608, 4736, 4800, 4801, 4792, 0, + 4096, 4608, 4736, 4800, 4801, 4792, 4796, 0, + 4096, 4608, 4736, 4800, 4801, 4803, 4796, 0, + 4096, 4608, 4736, 4800, 4801, 4803, 4796, 4798, + 0, 4096, 4608, 4736, 0, 4096, 4608, 4864, + 4800, 0, 4096, 4608, 4864, 4800, 0, 4096, + 4608, 4864, 4800, 4802, 0, 4096, 4608, 4864, + 4800, 0, 4096, 4608, 4864, 4800, 4804, 0, + 4096, 4608, 4864, 4800, 4804, 0, 4096, 4608, + 4864, 4800, 4808, 4806, 0, 4096, 4608, 4864, + 4800, 0, 4096, 4608, 4864, 4800, 4808, 0, + 4096, 4608, 4864, 4800, 4808, 0, 4096, 4608, + 4864, 4800, 4808, 4810, 0, 4096, 4608, 4864, + 4800, 4808, 0, 4096, 4608, 4864, 4800, 4816, + 4812, 0, 4096, 4608, 4864, 4800, 4816, 4812, + 0, 4096, 4608, 4864, 4800, 4816, 4817, 4814, + 0, 4096, 4608, 4864, 4800, 0, 4096, 4608, + 4864, 4800, 4816, 0, 4096, 4608, 4864, 4800, + 4816, 0, 4096, 4608, 4864, 4800, 4816, 4818, + 0, 4096, 4608, 4864, 4800, 4816, 0, 4096, + 4608, 4864, 4800, 4816, 4820, 0, 4096, 4608, + 4864, 4800, 4816, 4820, 0, 4096, 4608, 4864, + 4800, 4816, 4824, 4822, 0, 4096, 4608, 4864, + 4800, 4816, 0, 4096, 4608, 4864, 4800, 4832, + 4824, 0, 4096, 4608, 4864, 4800, 4832, 4824, + 0, 4096, 4608, 4864, 4800, 4832, 4824, 4826, + 0, 4096, 4608, 4864, 4800, 4832, 4824, 0, + 4096, 4608, 4864, 4800, 4832, 4833, 4828, 0, + 4096, 4608, 4864, 4800, 4832, 4833, 4828, 0, + 4096, 4608, 4864, 4800, 4832, 4833, 4828, 4830, + 0, 4096, 4608, 4864, 4800, 0, 4096, 4608, + 4864, 4865, 4832, 0, 4096, 4608, 4864, 4865, + 4832, 0, 4096, 4608, 4864, 4865, 4832, 4834, + 0, 4096, 4608, 4864, 4865, 4832, 0, 4096, + 4608, 4864, 4865, 4832, 4836, 0, 4096, 4608, + 4864, 4865, 4832, 4836, 0, 4096, 4608, 4864, + 4865, 4832, 4840, 4838, 0, 4096, 4608, 4864, + 4865, 4832, 0, 4096, 4608, 4864, 4865, 4832, + 4840, 0, 4096, 4608, 4864, 4865, 4832, 4840, + 0, 4096, 4608, 4864, 4865, 4832, 4840, 4842, + 0, 4096, 4608, 4864, 4865, 4832, 4840, 0, + 4096, 4608, 4864, 4865, 4832, 4848, 4844, 0, + 4096, 4608, 4864, 4865, 4832, 4848, 4844, 0, + 4096, 4608, 4864, 4865, 4832, 4848, 4849, 4846, + 0, 4096, 4608, 4864, 4865, 4832, 0, 4096, + 4608, 4864, 4865, 4832, 4848, 0, 4096, 4608, + 4864, 4865, 4867, 4848, 0, 4096, 4608, 4864, + 4865, 4867, 4848, 4850, 0, 4096, 4608, 4864, + 4865, 4867, 4848, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4852, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4852, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4856, 4854, 0, 4096, 4608, 4864, + 4865, 4867, 4848, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4856, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4856, 0, 4096, 4608, 4864, 4865, + 4867, 4848, 4856, 4858, 0, 4096, 4608, 4864, + 4865, 4867, 4871, 4856, 0, 4096, 4608, 4864, + 4865, 4867, 4871, 4856, 4860, 0, 4096, 4608, + 4864, 4865, 4867, 4871, 4856, 4860, 0, 4096, + 4608, 4864, 4865, 4867, 4871, 4856, 4860, 4862, + 0, 4096, 4608, 0, 4096, 5120, 4864, 0, + 4096, 5120, 4864, 0, 4096, 5120, 4864, 4866, + 0, 4096, 5120, 4864, 0, 4096, 5120, 4864, + 4868, 0, 4096, 5120, 4864, 4868, 0, 4096, + 5120, 4864, 4872, 4870, 0, 4096, 5120, 4864, + 0, 4096, 5120, 4864, 4872, 0, 4096, 5120, + 4864, 4872, 0, 4096, 5120, 4864, 4872, 4874, + 0, 4096, 5120, 4864, 4872, 0, 4096, 5120, + 4864, 4880, 4876, 0, 4096, 5120, 4864, 4880, + 4876, 0, 4096, 5120, 4864, 4880, 4881, 4878, + 0, 4096, 5120, 4864, 0, 4096, 5120, 4864, + 4880, 0, 4096, 5120, 4864, 4880, 0, 4096, + 5120, 4864, 4880, 4882, 0, 4096, 5120, 4864, + 4880, 0, 4096, 5120, 4864, 4880, 4884, 0, + 4096, 5120, 4864, 4880, 4884, 0, 4096, 5120, + 4864, 4880, 4888, 4886, 0, 4096, 5120, 4864, + 4880, 0, 4096, 5120, 4864, 4896, 4888, 0, + 4096, 5120, 4864, 4896, 4888, 0, 4096, 5120, + 4864, 4896, 4888, 4890, 0, 4096, 5120, 4864, + 4896, 4888, 0, 4096, 5120, 4864, 4896, 4897, + 4892, 0, 4096, 5120, 4864, 4896, 4897, 4892, + 0, 4096, 5120, 4864, 4896, 4897, 4892, 4894, + 0, 4096, 5120, 4864, 0, 4096, 5120, 4864, + 4896, 0, 4096, 5120, 4864, 4896, 0, 4096, + 5120, 4864, 4896, 4898, 0, 4096, 5120, 4864, + 4896, 0, 4096, 5120, 4864, 4896, 4900, 0, + 4096, 5120, 4864, 4896, 4900, 0, 4096, 5120, + 4864, 4896, 4904, 4902, 0, 4096, 5120, 4864, + 4896, 0, 4096, 5120, 4864, 4896, 4904, 0, + 4096, 5120, 4864, 4896, 4904, 0, 4096, 5120, + 4864, 4896, 4904, 4906, 0, 4096, 5120, 4864, + 4896, 4904, 0, 4096, 5120, 4864, 4896, 4912, + 4908, 0, 4096, 5120, 4864, 4896, 4912, 4908, + 0, 4096, 5120, 4864, 4896, 4912, 4913, 4910, + 0, 4096, 5120, 4864, 4896, 0, 4096, 5120, + 4864, 4928, 4912, 0, 4096, 5120, 4864, 4928, + 4912, 0, 4096, 5120, 4864, 4928, 4912, 4914, + 0, 4096, 5120, 4864, 4928, 4912, 0, 4096, + 5120, 4864, 4928, 4912, 4916, 0, 4096, 5120, + 4864, 4928, 4912, 4916, 0, 4096, 5120, 4864, + 4928, 4912, 4920, 4918, 0, 4096, 5120, 4864, + 4928, 4912, 0, 4096, 5120, 4864, 4928, 4929, + 4920, 0, 4096, 5120, 4864, 4928, 4929, 4920, + 0, 4096, 5120, 4864, 4928, 4929, 4920, 4922, + 0, 4096, 5120, 4864, 4928, 4929, 4920, 0, + 4096, 5120, 4864, 4928, 4929, 4920, 4924, 0, + 4096, 5120, 4864, 4928, 4929, 4931, 4924, 0, + 4096, 5120, 4864, 4928, 4929, 4931, 4924, 4926, + 0, 4096, 5120, 4864, 0, 4096, 5120, 4864, + 4928, 0, 4096, 5120, 4864, 4928, 0, 4096, + 5120, 4864, 4928, 4930, 0, 4096, 5120, 4864, + 4928, 0, 4096, 5120, 4864, 4928, 4932, 0, + 4096, 5120, 4864, 4928, 4932, 0, 4096, 5120, + 4864, 4928, 4936, 4934, 0, 4096, 5120, 4864, + 4928, 0, 4096, 5120, 4864, 4928, 4936, 0, + 4096, 5120, 4864, 4928, 4936, 0, 4096, 5120, + 4864, 4928, 4936, 4938, 0, 4096, 5120, 4864, + 4928, 4936, 0, 4096, 5120, 4864, 4928, 4944, + 4940, 0, 4096, 5120, 4864, 4928, 4944, 4940, + 0, 4096, 5120, 4864, 4928, 4944, 4945, 4942, + 0, 4096, 5120, 4864, 4928, 0, 4096, 5120, + 4864, 4928, 4944, 0, 4096, 5120, 4864, 4928, + 4944, 0, 4096, 5120, 4864, 4928, 4944, 4946, + 0, 4096, 5120, 4864, 4928, 4944, 0, 4096, + 5120, 4864, 4928, 4944, 4948, 0, 4096, 5120, + 4864, 4928, 4944, 4948, 0, 4096, 5120, 4864, + 4928, 4944, 4952, 4950, 0, 4096, 5120, 4864, + 4928, 4944, 0, 4096, 5120, 4864, 4928, 4960, + 4952, 0, 4096, 5120, 4864, 4928, 4960, 4952, + 0, 4096, 5120, 4864, 4928, 4960, 4952, 4954, + 0, 4096, 5120, 4864, 4928, 4960, 4952, 0, + 4096, 5120, 4864, 4928, 4960, 4961, 4956, 0, + 4096, 5120, 4864, 4928, 4960, 4961, 4956, 0, + 4096, 5120, 4864, 4928, 4960, 4961, 4956, 4958, + 0, 4096, 5120, 4864, 4928, 0, 4096, 5120, + 4864, 4992, 4960, 0, 4096, 5120, 4864, 4992, + 4960, 0, 4096, 5120, 4864, 4992, 4960, 4962, + 0, 4096, 5120, 4864, 4992, 4960, 0, 4096, + 5120, 4864, 4992, 4960, 4964, 0, 4096, 5120, + 4864, 4992, 4960, 4964, 0, 4096, 5120, 4864, + 4992, 4960, 4968, 4966, 0, 4096, 5120, 4864, + 4992, 4960, 0, 4096, 5120, 4864, 4992, 4960, + 4968, 0, 4096, 5120, 4864, 4992, 4960, 4968, + 0, 4096, 5120, 4864, 4992, 4960, 4968, 4970, + 0, 4096, 5120, 4864, 4992, 4960, 4968, 0, + 4096, 5120, 4864, 4992, 4960, 4976, 4972, 0, + 4096, 5120, 4864, 4992, 4960, 4976, 4972, 0, + 4096, 5120, 4864, 4992, 4960, 4976, 4977, 4974, + 0, 4096, 5120, 4864, 4992, 4960, 0, 4096, + 5120, 4864, 4992, 4993, 4976, 0, 4096, 5120, + 4864, 4992, 4993, 4976, 0, 4096, 5120, 4864, + 4992, 4993, 4976, 4978, 0, 4096, 5120, 4864, + 4992, 4993, 4976, 0, 4096, 5120, 4864, 4992, + 4993, 4976, 4980, 0, 4096, 5120, 4864, 4992, + 4993, 4976, 4980, 0, 4096, 5120, 4864, 4992, + 4993, 4976, 4984, 4982, 0, 4096, 5120, 4864, + 4992, 4993, 4976, 0, 4096, 5120, 4864, 4992, + 4993, 4976, 4984, 0, 4096, 5120, 4864, 4992, + 4993, 4995, 4984, 0, 4096, 5120, 4864, 4992, + 4993, 4995, 4984, 4986, 0, 4096, 5120, 4864, + 4992, 4993, 4995, 4984, 0, 4096, 5120, 4864, + 4992, 4993, 4995, 4984, 4988, 0, 4096, 5120, + 4864, 4992, 4993, 4995, 4984, 4988, 0, 4096, + 5120, 4864, 4992, 4993, 4995, 4984, 4988, 4990, + 0, 4096, 5120, 4864, 0, 4096, 5120, 4864, + 4992, 0, 4096, 5120, 5121, 4992, 0, 4096, + 5120, 5121, 4992, 4994, 0, 4096, 5120, 5121, + 4992, 0, 4096, 5120, 5121, 4992, 4996, 0, + 4096, 5120, 5121, 4992, 4996, 0, 4096, 5120, + 5121, 4992, 5000, 4998, 0, 4096, 5120, 5121, + 4992, 0, 4096, 5120, 5121, 4992, 5000, 0, + 4096, 5120, 5121, 4992, 5000, 0, 4096, 5120, + 5121, 4992, 5000, 5002, 0, 4096, 5120, 5121, + 4992, 5000, 0, 4096, 5120, 5121, 4992, 5008, + 5004, 0, 4096, 5120, 5121, 4992, 5008, 5004, + 0, 4096, 5120, 5121, 4992, 5008, 5009, 5006, + 0, 4096, 5120, 5121, 4992, 0, 4096, 5120, + 5121, 4992, 5008, 0, 4096, 5120, 5121, 4992, + 5008, 0, 4096, 5120, 5121, 4992, 5008, 5010, + 0, 4096, 5120, 5121, 4992, 5008, 0, 4096, + 5120, 5121, 4992, 5008, 5012, 0, 4096, 5120, + 5121, 4992, 5008, 5012, 0, 4096, 5120, 5121, + 4992, 5008, 5016, 5014, 0, 4096, 5120, 5121, + 4992, 5008, 0, 4096, 5120, 5121, 4992, 5024, + 5016, 0, 4096, 5120, 5121, 4992, 5024, 5016, + 0, 4096, 5120, 5121, 4992, 5024, 5016, 5018, + 0, 4096, 5120, 5121, 4992, 5024, 5016, 0, + 4096, 5120, 5121, 4992, 5024, 5025, 5020, 0, + 4096, 5120, 5121, 4992, 5024, 5025, 5020, 0, + 4096, 5120, 5121, 4992, 5024, 5025, 5020, 5022, + 0, 4096, 5120, 5121, 4992, 0, 4096, 5120, + 5121, 4992, 5024, 0, 4096, 5120, 5121, 4992, + 5024, 0, 4096, 5120, 5121, 4992, 5024, 5026, + 0, 4096, 5120, 5121, 4992, 5024, 0, 4096, + 5120, 5121, 4992, 5024, 5028, 0, 4096, 5120, + 5121, 4992, 5024, 5028, 0, 4096, 5120, 5121, + 4992, 5024, 5032, 5030, 0, 4096, 5120, 5121, + 4992, 5024, 0, 4096, 5120, 5121, 4992, 5024, + 5032, 0, 4096, 5120, 5121, 4992, 5024, 5032, + 0, 4096, 5120, 5121, 4992, 5024, 5032, 5034, + 0, 4096, 5120, 5121, 4992, 5024, 5032, 0, + 4096, 5120, 5121, 4992, 5024, 5040, 5036, 0, + 4096, 5120, 5121, 4992, 5024, 5040, 5036, 0, + 4096, 5120, 5121, 4992, 5024, 5040, 5041, 5038, + 0, 4096, 5120, 5121, 4992, 5024, 0, 4096, + 5120, 5121, 4992, 5056, 5040, 0, 4096, 5120, + 5121, 4992, 5056, 5040, 0, 4096, 5120, 5121, + 4992, 5056, 5040, 5042, 0, 4096, 5120, 5121, + 4992, 5056, 5040, 0, 4096, 5120, 5121, 4992, + 5056, 5040, 5044, 0, 4096, 5120, 5121, 4992, + 5056, 5040, 5044, 0, 4096, 5120, 5121, 4992, + 5056, 5040, 5048, 5046, 0, 4096, 5120, 5121, + 4992, 5056, 5040, 0, 4096, 5120, 5121, 4992, + 5056, 5057, 5048, 0, 4096, 5120, 5121, 4992, + 5056, 5057, 5048, 0, 4096, 5120, 5121, 4992, + 5056, 5057, 5048, 5050, 0, 4096, 5120, 5121, + 4992, 5056, 5057, 5048, 0, 4096, 5120, 5121, + 4992, 5056, 5057, 5048, 5052, 0, 4096, 5120, + 5121, 4992, 5056, 5057, 5059, 5052, 0, 4096, + 5120, 5121, 4992, 5056, 5057, 5059, 5052, 5054, + 0, 4096, 5120, 5121, 4992, 0, 4096, 5120, + 5121, 4992, 5056, 0, 4096, 5120, 5121, 4992, + 5056, 0, 4096, 5120, 5121, 4992, 5056, 5058, + 0, 4096, 5120, 5121, 5123, 5056, 0, 4096, + 5120, 5121, 5123, 5056, 5060, 0, 4096, 5120, + 5121, 5123, 5056, 5060, 0, 4096, 5120, 5121, + 5123, 5056, 5064, 5062, 0, 4096, 5120, 5121, + 5123, 5056, 0, 4096, 5120, 5121, 5123, 5056, + 5064, 0, 4096, 5120, 5121, 5123, 5056, 5064, + 0, 4096, 5120, 5121, 5123, 5056, 5064, 5066, + 0, 4096, 5120, 5121, 5123, 5056, 5064, 0, + 4096, 5120, 5121, 5123, 5056, 5072, 5068, 0, + 4096, 5120, 5121, 5123, 5056, 5072, 5068, 0, + 4096, 5120, 5121, 5123, 5056, 5072, 5073, 5070, + 0, 4096, 5120, 5121, 5123, 5056, 0, 4096, + 5120, 5121, 5123, 5056, 5072, 0, 4096, 5120, + 5121, 5123, 5056, 5072, 0, 4096, 5120, 5121, + 5123, 5056, 5072, 5074, 0, 4096, 5120, 5121, + 5123, 5056, 5072, 0, 4096, 5120, 5121, 5123, + 5056, 5072, 5076, 0, 4096, 5120, 5121, 5123, + 5056, 5072, 5076, 0, 4096, 5120, 5121, 5123, + 5056, 5072, 5080, 5078, 0, 4096, 5120, 5121, + 5123, 5056, 5072, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5080, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5080, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5080, 5082, 0, 4096, 5120, 5121, + 5123, 5056, 5088, 5080, 0, 4096, 5120, 5121, + 5123, 5056, 5088, 5089, 5084, 0, 4096, 5120, + 5121, 5123, 5056, 5088, 5089, 5084, 0, 4096, + 5120, 5121, 5123, 5056, 5088, 5089, 5084, 5086, + 0, 4096, 5120, 5121, 5123, 5056, 0, 4096, + 5120, 5121, 5123, 5056, 5088, 0, 4096, 5120, + 5121, 5123, 5056, 5088, 0, 4096, 5120, 5121, + 5123, 5056, 5088, 5090, 0, 4096, 5120, 5121, + 5123, 5056, 5088, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5092, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5092, 0, 4096, 5120, 5121, 5123, + 5056, 5088, 5096, 5094, 0, 4096, 5120, 5121, + 5123, 5127, 5088, 0, 4096, 5120, 5121, 5123, + 5127, 5088, 5096, 0, 4096, 5120, 5121, 5123, + 5127, 5088, 5096, 0, 4096, 5120, 5121, 5123, + 5127, 5088, 5096, 5098, 0, 4096, 5120, 5121, + 5123, 5127, 5088, 5096, 0, 4096, 5120, 5121, + 5123, 5127, 5088, 5104, 5100, 0, 4096, 5120, + 5121, 5123, 5127, 5088, 5104, 5100, 0, 4096, + 5120, 5121, 5123, 5127, 5088, 5104, 5105, 5102, + 0, 4096, 5120, 5121, 5123, 5127, 5088, 0, + 4096, 5120, 5121, 5123, 5127, 5088, 5104, 0, + 4096, 5120, 5121, 5123, 5127, 5088, 5104, 0, + 4096, 5120, 5121, 5123, 5127, 5088, 5104, 5106, + 0, 4096, 5120, 5121, 5123, 5127, 5088, 5104, + 0, 4096, 5120, 5121, 5123, 5127, 5088, 5104, + 5108, 0, 4096, 5120, 5121, 5123, 5127, 5088, + 5104, 5108, 0, 4096, 5120, 5121, 5123, 5127, + 5088, 5104, 5112, 5110, 0, 4096, 5120, 5121, + 5123, 5127, 5088, 5104, 0, 4096, 5120, 5121, + 5123, 5127, 5088, 5104, 5112, 0, 4096, 5120, + 5121, 5123, 5127, 5088, 5104, 5112, 0, 4096, + 5120, 5121, 5123, 5127, 5088, 5104, 5112, 5114, + 0, 4096, 5120, 5121, 5123, 5127, 5088, 5104, + 5112, 0, 4096, 5120, 5121, 5123, 5127, 5088, + 5104, 5112, 5116, 0, 4096, 5120, 5121, 5123, + 5127, 5088, 5104, 5112, 5116, 0, 4096, 5120, + 5121, 5123, 5127, 5088, 5104, 5112, 5116, 5118, + 0, 4096, 0, 4096, 5120, 0, 4096, 5120, + 0, 4096, 5120, 5122, 0, 4096, 5120, 0, + 4096, 5120, 5124, 0, 4096, 5120, 5124, 0, + 4096, 5120, 5128, 5126, 0, 4096, 5120, 0, + 4096, 5120, 5128, 0, 4096, 5120, 5128, 0, + 4096, 5120, 5128, 5130, 0, 4096, 5120, 5128, + 0, 4096, 5120, 5136, 5132, 0, 4096, 5120, + 5136, 5132, 0, 4096, 5120, 5136, 5137, 5134, + 0, 4096, 5120, 0, 4096, 5120, 5136, 0, + 4096, 5120, 5136, 0, 4096, 5120, 5136, 5138, + 0, 4096, 5120, 5136, 0, 4096, 5120, 5136, + 5140, 0, 4096, 5120, 5136, 5140, 0, 4096, + 5120, 5136, 5144, 5142, 0, 4096, 5120, 5136, + 0, 4096, 5120, 5152, 5144, 0, 4096, 5120, + 5152, 5144, 0, 4096, 5120, 5152, 5144, 5146, + 0, 4096, 5120, 5152, 5144, 0, 4096, 5120, + 5152, 5153, 5148, 0, 4096, 5120, 5152, 5153, + 5148, 0, 4096, 5120, 5152, 5153, 5148, 5150, + 0, 4096, 5120, 0, 4096, 5120, 5152, 0, + 4096, 5120, 5152, 0, 4096, 5120, 5152, 5154, + 0, 4096, 5120, 5152, 0, 4096, 5120, 5152, + 5156, 0, 4096, 5120, 5152, 5156, 0, 4096, + 5120, 5152, 5160, 5158, 0, 4096, 5120, 5152, + 0, 4096, 5120, 5152, 5160, 0, 4096, 5120, + 5152, 5160, 0, 4096, 5120, 5152, 5160, 5162, + 0, 4096, 5120, 5152, 5160, 0, 4096, 5120, + 5152, 5168, 5164, 0, 4096, 5120, 5152, 5168, + 5164, 0, 4096, 5120, 5152, 5168, 5169, 5166, + 0, 4096, 5120, 5152, 0, 4096, 5120, 5184, + 5168, 0, 4096, 5120, 5184, 5168, 0, 4096, + 5120, 5184, 5168, 5170, 0, 4096, 5120, 5184, + 5168, 0, 4096, 5120, 5184, 5168, 5172, 0, + 4096, 5120, 5184, 5168, 5172, 0, 4096, 5120, + 5184, 5168, 5176, 5174, 0, 4096, 5120, 5184, + 5168, 0, 4096, 5120, 5184, 5185, 5176, 0, + 4096, 5120, 5184, 5185, 5176, 0, 4096, 5120, + 5184, 5185, 5176, 5178, 0, 4096, 5120, 5184, + 5185, 5176, 0, 4096, 5120, 5184, 5185, 5176, + 5180, 0, 4096, 5120, 5184, 5185, 5187, 5180, + 0, 4096, 5120, 5184, 5185, 5187, 5180, 5182, + 0, 4096, 5120, 0, 4096, 5120, 5184, 0, + 4096, 5120, 5184, 0, 4096, 5120, 5184, 5186, + 0, 4096, 5120, 5184, 0, 4096, 5120, 5184, + 5188, 0, 4096, 5120, 5184, 5188, 0, 4096, + 5120, 5184, 5192, 5190, 0, 4096, 5120, 5184, + 0, 4096, 5120, 5184, 5192, 0, 4096, 5120, + 5184, 5192, 0, 4096, 5120, 5184, 5192, 5194, + 0, 4096, 5120, 5184, 5192, 0, 4096, 5120, + 5184, 5200, 5196, 0, 4096, 5120, 5184, 5200, + 5196, 0, 4096, 5120, 5184, 5200, 5201, 5198, + 0, 4096, 5120, 5184, 0, 4096, 5120, 5184, + 5200, 0, 4096, 5120, 5184, 5200, 0, 4096, + 5120, 5184, 5200, 5202, 0, 4096, 5120, 5184, + 5200, 0, 4096, 5120, 5184, 5200, 5204, 0, + 4096, 5120, 5184, 5200, 5204, 0, 4096, 5120, + 5184, 5200, 5208, 5206, 0, 4096, 5120, 5184, + 5200, 0, 4096, 5120, 5184, 5216, 5208, 0, + 4096, 5120, 5184, 5216, 5208, 0, 4096, 5120, + 5184, 5216, 5208, 5210, 0, 4096, 5120, 5184, + 5216, 5208, 0, 4096, 5120, 5184, 5216, 5217, + 5212, 0, 4096, 5120, 5184, 5216, 5217, 5212, + 0, 4096, 5120, 5184, 5216, 5217, 5212, 5214, + 0, 4096, 5120, 5184, 0, 4096, 5120, 5248, + 5216, 0, 4096, 5120, 5248, 5216, 0, 4096, + 5120, 5248, 5216, 5218, 0, 4096, 5120, 5248, + 5216, 0, 4096, 5120, 5248, 5216, 5220, 0, + 4096, 5120, 5248, 5216, 5220, 0, 4096, 5120, + 5248, 5216, 5224, 5222, 0, 4096, 5120, 5248, + 5216, 0, 4096, 5120, 5248, 5216, 5224, 0, + 4096, 5120, 5248, 5216, 5224, 0, 4096, 5120, + 5248, 5216, 5224, 5226, 0, 4096, 5120, 5248, + 5216, 5224, 0, 4096, 5120, 5248, 5216, 5232, + 5228, 0, 4096, 5120, 5248, 5216, 5232, 5228, + 0, 4096, 5120, 5248, 5216, 5232, 5233, 5230, + 0, 4096, 5120, 5248, 5216, 0, 4096, 5120, + 5248, 5249, 5232, 0, 4096, 5120, 5248, 5249, + 5232, 0, 4096, 5120, 5248, 5249, 5232, 5234, + 0, 4096, 5120, 5248, 5249, 5232, 0, 4096, + 5120, 5248, 5249, 5232, 5236, 0, 4096, 5120, + 5248, 5249, 5232, 5236, 0, 4096, 5120, 5248, + 5249, 5232, 5240, 5238, 0, 4096, 5120, 5248, + 5249, 5232, 0, 4096, 5120, 5248, 5249, 5232, + 5240, 0, 4096, 5120, 5248, 5249, 5251, 5240, + 0, 4096, 5120, 5248, 5249, 5251, 5240, 5242, + 0, 4096, 5120, 5248, 5249, 5251, 5240, 0, + 4096, 5120, 5248, 5249, 5251, 5240, 5244, 0, + 4096, 5120, 5248, 5249, 5251, 5240, 5244, 0, + 4096, 5120, 5248, 5249, 5251, 5240, 5244, 5246, + 0, 4096, 5120, 0, 4096, 5120, 5248, 0, + 4096, 5120, 5248, 0, 4096, 5120, 5248, 5250, + 0, 4096, 5120, 5248, 0, 4096, 5120, 5248, + 5252, 0, 4096, 5120, 5248, 5252, 0, 4096, + 5120, 5248, 5256, 5254, 0, 4096, 5120, 5248, + 0, 4096, 5120, 5248, 5256, 0, 4096, 5120, + 5248, 5256, 0, 4096, 5120, 5248, 5256, 5258, + 0, 4096, 5120, 5248, 5256, 0, 4096, 5120, + 5248, 5264, 5260, 0, 4096, 5120, 5248, 5264, + 5260, 0, 4096, 5120, 5248, 5264, 5265, 5262, + 0, 4096, 5120, 5248, 0, 4096, 5120, 5248, + 5264, 0, 4096, 5120, 5248, 5264, 0, 4096, + 5120, 5248, 5264, 5266, 0, 4096, 5120, 5248, + 5264, 0, 4096, 5120, 5248, 5264, 5268, 0, + 4096, 5120, 5248, 5264, 5268, 0, 4096, 5120, + 5248, 5264, 5272, 5270, 0, 4096, 5120, 5248, + 5264, 0, 4096, 5120, 5248, 5280, 5272, 0, + 4096, 5120, 5248, 5280, 5272, 0, 4096, 5120, + 5248, 5280, 5272, 5274, 0, 4096, 5120, 5248, + 5280, 5272, 0, 4096, 5120, 5248, 5280, 5281, + 5276, 0, 4096, 5120, 5248, 5280, 5281, 5276, + 0, 4096, 5120, 5248, 5280, 5281, 5276, 5278, + 0, 4096, 5120, 5248, 0, 4096, 5120, 5248, + 5280, 0, 4096, 5120, 5248, 5280, 0, 4096, + 5120, 5248, 5280, 5282, 0, 4096, 5120, 5248, + 5280, 0, 4096, 5120, 5248, 5280, 5284, 0, + 4096, 5120, 5248, 5280, 5284, 0, 4096, 5120, + 5248, 5280, 5288, 5286, 0, 4096, 5120, 5248, + 5280, 0, 4096, 5120, 5248, 5280, 5288, 0, + 4096, 5120, 5248, 5280, 5288, 0, 4096, 5120, + 5248, 5280, 5288, 5290, 0, 4096, 5120, 5248, + 5280, 5288, 0, 4096, 5120, 5248, 5280, 5296, + 5292, 0, 4096, 5120, 5248, 5280, 5296, 5292, + 0, 4096, 5120, 5248, 5280, 5296, 5297, 5294, + 0, 4096, 5120, 5248, 5280, 0, 4096, 5120, + 5248, 5312, 5296, 0, 4096, 5120, 5248, 5312, + 5296, 0, 4096, 5120, 5248, 5312, 5296, 5298, + 0, 4096, 5120, 5248, 5312, 5296, 0, 4096, + 5120, 5248, 5312, 5296, 5300, 0, 4096, 5120, + 5248, 5312, 5296, 5300, 0, 4096, 5120, 5248, + 5312, 5296, 5304, 5302, 0, 4096, 5120, 5248, + 5312, 5296, 0, 4096, 5120, 5248, 5312, 5313, + 5304, 0, 4096, 5120, 5248, 5312, 5313, 5304, + 0, 4096, 5120, 5248, 5312, 5313, 5304, 5306, + 0, 4096, 5120, 5248, 5312, 5313, 5304, 0, + 4096, 5120, 5248, 5312, 5313, 5304, 5308, 0, + 4096, 5120, 5248, 5312, 5313, 5315, 5308, 0, + 4096, 5120, 5248, 5312, 5313, 5315, 5308, 5310, + 0, 4096, 5120, 5248, 0, 4096, 5120, 5376, + 5312, 0, 4096, 5120, 5376, 5312, 0, 4096, + 5120, 5376, 5312, 5314, 0, 4096, 5120, 5376, + 5312, 0, 4096, 5120, 5376, 5312, 5316, 0, + 4096, 5120, 5376, 5312, 5316, 0, 4096, 5120, + 5376, 5312, 5320, 5318, 0, 4096, 5120, 5376, + 5312, 0, 4096, 5120, 5376, 5312, 5320, 0, + 4096, 5120, 5376, 5312, 5320, 0, 4096, 5120, + 5376, 5312, 5320, 5322, 0, 4096, 5120, 5376, + 5312, 5320, 0, 4096, 5120, 5376, 5312, 5328, + 5324, 0, 4096, 5120, 5376, 5312, 5328, 5324, + 0, 4096, 5120, 5376, 5312, 5328, 5329, 5326, + 0, 4096, 5120, 5376, 5312, 0, 4096, 5120, + 5376, 5312, 5328, 0, 4096, 5120, 5376, 5312, + 5328, 0, 4096, 5120, 5376, 5312, 5328, 5330, + 0, 4096, 5120, 5376, 5312, 5328, 0, 4096, + 5120, 5376, 5312, 5328, 5332, 0, 4096, 5120, + 5376, 5312, 5328, 5332, 0, 4096, 5120, 5376, + 5312, 5328, 5336, 5334, 0, 4096, 5120, 5376, + 5312, 5328, 0, 4096, 5120, 5376, 5312, 5344, + 5336, 0, 4096, 5120, 5376, 5312, 5344, 5336, + 0, 4096, 5120, 5376, 5312, 5344, 5336, 5338, + 0, 4096, 5120, 5376, 5312, 5344, 5336, 0, + 4096, 5120, 5376, 5312, 5344, 5345, 5340, 0, + 4096, 5120, 5376, 5312, 5344, 5345, 5340, 0, + 4096, 5120, 5376, 5312, 5344, 5345, 5340, 5342, + 0, 4096, 5120, 5376, 5312, 0, 4096, 5120, + 5376, 5377, 5344, 0, 4096, 5120, 5376, 5377, + 5344, 0, 4096, 5120, 5376, 5377, 5344, 5346, + 0, 4096, 5120, 5376, 5377, 5344, 0, 4096, + 5120, 5376, 5377, 5344, 5348, 0, 4096, 5120, + 5376, 5377, 5344, 5348, 0, 4096, 5120, 5376, + 5377, 5344, 5352, 5350, 0, 4096, 5120, 5376, + 5377, 5344, 0, 4096, 5120, 5376, 5377, 5344, + 5352, 0, 4096, 5120, 5376, 5377, 5344, 5352, + 0, 4096, 5120, 5376, 5377, 5344, 5352, 5354, + 0, 4096, 5120, 5376, 5377, 5344, 5352, 0, + 4096, 5120, 5376, 5377, 5344, 5360, 5356, 0, + 4096, 5120, 5376, 5377, 5344, 5360, 5356, 0, + 4096, 5120, 5376, 5377, 5344, 5360, 5361, 5358, + 0, 4096, 5120, 5376, 5377, 5344, 0, 4096, + 5120, 5376, 5377, 5344, 5360, 0, 4096, 5120, + 5376, 5377, 5379, 5360, 0, 4096, 5120, 5376, + 5377, 5379, 5360, 5362, 0, 4096, 5120, 5376, + 5377, 5379, 5360, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5364, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5364, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5368, 5366, 0, 4096, 5120, 5376, + 5377, 5379, 5360, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5368, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5368, 0, 4096, 5120, 5376, 5377, + 5379, 5360, 5368, 5370, 0, 4096, 5120, 5376, + 5377, 5379, 5383, 5368, 0, 4096, 5120, 5376, + 5377, 5379, 5383, 5368, 5372, 0, 4096, 5120, + 5376, 5377, 5379, 5383, 5368, 5372, 0, 4096, + 5120, 5376, 5377, 5379, 5383, 5368, 5372, 5374, + 0, 4096, 5120, 0, 4096, 5120, 5376, 0, + 4096, 5120, 5376, 0, 4096, 5120, 5376, 5378, + 0, 4096, 5120, 5376, 0, 4096, 5120, 5376, + 5380, 0, 4096, 5120, 5376, 5380, 0, 4096, + 5120, 5376, 5384, 5382, 0, 4096, 5120, 5376, + 0, 4096, 5120, 5376, 5384, 0, 4096, 5120, + 5376, 5384, 0, 4096, 5120, 5376, 5384, 5386, + 0, 4096, 5120, 5376, 5384, 0, 4096, 5120, + 5376, 5392, 5388, 0, 4096, 5120, 5376, 5392, + 5388, 0, 4096, 5120, 5376, 5392, 5393, 5390, + 0, 4096, 5120, 5376, 0, 4096, 5120, 5376, + 5392, 0, 4096, 5120, 5376, 5392, 0, 4096, + 5120, 5376, 5392, 5394, 0, 4096, 5120, 5376, + 5392, 0, 4096, 5120, 5376, 5392, 5396, 0, + 4096, 5120, 5376, 5392, 5396, 0, 4096, 5120, + 5376, 5392, 5400, 5398, 0, 4096, 5120, 5376, + 5392, 0, 4096, 5120, 5376, 5408, 5400, 0, + 4096, 5120, 5376, 5408, 5400, 0, 4096, 5120, + 5376, 5408, 5400, 5402, 0, 4096, 5120, 5376, + 5408, 5400, 0, 4096, 5120, 5376, 5408, 5409, + 5404, 0, 4096, 5120, 5376, 5408, 5409, 5404, + 0, 4096, 5120, 5376, 5408, 5409, 5404, 5406, + 0, 4096, 5120, 5376, 0, 4096, 5120, 5376, + 5408, 0, 4096, 5120, 5376, 5408, 0, 4096, + 5120, 5376, 5408, 5410, 0, 4096, 5120, 5376, + 5408, 0, 4096, 5120, 5376, 5408, 5412, 0, + 4096, 5120, 5376, 5408, 5412, 0, 4096, 5120, + 5376, 5408, 5416, 5414, 0, 4096, 5120, 5376, + 5408, 0, 4096, 5120, 5376, 5408, 5416, 0, + 4096, 5120, 5376, 5408, 5416, 0, 4096, 5120, + 5376, 5408, 5416, 5418, 0, 4096, 5120, 5376, + 5408, 5416, 0, 4096, 5120, 5376, 5408, 5424, + 5420, 0, 4096, 5120, 5376, 5408, 5424, 5420, + 0, 4096, 5120, 5376, 5408, 5424, 5425, 5422, + 0, 4096, 5120, 5376, 5408, 0, 4096, 5120, + 5376, 5440, 5424, 0, 4096, 5120, 5376, 5440, + 5424, 0, 4096, 5120, 5376, 5440, 5424, 5426, + 0, 4096, 5120, 5376, 5440, 5424, 0, 4096, + 5120, 5376, 5440, 5424, 5428, 0, 4096, 5120, + 5376, 5440, 5424, 5428, 0, 4096, 5120, 5376, + 5440, 5424, 5432, 5430, 0, 4096, 5120, 5376, + 5440, 5424, 0, 4096, 5120, 5376, 5440, 5441, + 5432, 0, 4096, 5120, 5376, 5440, 5441, 5432, + 0, 4096, 5120, 5376, 5440, 5441, 5432, 5434, + 0, 4096, 5120, 5376, 5440, 5441, 5432, 0, + 4096, 5120, 5376, 5440, 5441, 5432, 5436, 0, + 4096, 5120, 5376, 5440, 5441, 5443, 5436, 0, + 4096, 5120, 5376, 5440, 5441, 5443, 5436, 5438, + 0, 4096, 5120, 5376, 0, 4096, 5120, 5376, + 5440, 0, 4096, 5120, 5376, 5440, 0, 4096, + 5120, 5376, 5440, 5442, 0, 4096, 5120, 5376, + 5440, 0, 4096, 5120, 5376, 5440, 5444, 0, + 4096, 5120, 5376, 5440, 5444, 0, 4096, 5120, + 5376, 5440, 5448, 5446, 0, 4096, 5120, 5376, + 5440, 0, 4096, 5120, 5376, 5440, 5448, 0, + 4096, 5120, 5376, 5440, 5448, 0, 4096, 5120, + 5376, 5440, 5448, 5450, 0, 4096, 5120, 5376, + 5440, 5448, 0, 4096, 5120, 5376, 5440, 5456, + 5452, 0, 4096, 5120, 5376, 5440, 5456, 5452, + 0, 4096, 5120, 5376, 5440, 5456, 5457, 5454, + 0, 4096, 5120, 5376, 5440, 0, 4096, 5120, + 5376, 5440, 5456, 0, 4096, 5120, 5376, 5440, + 5456, 0, 4096, 5120, 5376, 5440, 5456, 5458, + 0, 4096, 5120, 5376, 5440, 5456, 0, 4096, + 5120, 5376, 5440, 5456, 5460, 0, 4096, 5120, + 5376, 5440, 5456, 5460, 0, 4096, 5120, 5376, + 5440, 5456, 5464, 5462, 0, 4096, 5120, 5376, + 5440, 5456, 0, 4096, 5120, 5376, 5440, 5472, + 5464, 0, 4096, 5120, 5376, 5440, 5472, 5464, + 0, 4096, 5120, 5376, 5440, 5472, 5464, 5466, + 0, 4096, 5120, 5376, 5440, 5472, 5464, 0, + 4096, 5120, 5376, 5440, 5472, 5473, 5468, 0, + 4096, 5120, 5376, 5440, 5472, 5473, 5468, 0, + 4096, 5120, 5376, 5440, 5472, 5473, 5468, 5470, + 0, 4096, 5120, 5376, 5440, 0, 4096, 5120, + 5376, 5504, 5472, 0, 4096, 5120, 5376, 5504, + 5472, 0, 4096, 5120, 5376, 5504, 5472, 5474, + 0, 4096, 5120, 5376, 5504, 5472, 0, 4096, + 5120, 5376, 5504, 5472, 5476, 0, 4096, 5120, + 5376, 5504, 5472, 5476, 0, 4096, 5120, 5376, + 5504, 5472, 5480, 5478, 0, 4096, 5120, 5376, + 5504, 5472, 0, 4096, 5120, 5376, 5504, 5472, + 5480, 0, 4096, 5120, 5376, 5504, 5472, 5480, + 0, 4096, 5120, 5376, 5504, 5472, 5480, 5482, + 0, 4096, 5120, 5376, 5504, 5472, 5480, 0, + 4096, 5120, 5376, 5504, 5472, 5488, 5484, 0, + 4096, 5120, 5376, 5504, 5472, 5488, 5484, 0, + 4096, 5120, 5376, 5504, 5472, 5488, 5489, 5486, + 0, 4096, 5120, 5376, 5504, 5472, 0, 4096, + 5120, 5376, 5504, 5505, 5488, 0, 4096, 5120, + 5376, 5504, 5505, 5488, 0, 4096, 5120, 5376, + 5504, 5505, 5488, 5490, 0, 4096, 5120, 5376, + 5504, 5505, 5488, 0, 4096, 5120, 5376, 5504, + 5505, 5488, 5492, 0, 4096, 5120, 5376, 5504, + 5505, 5488, 5492, 0, 4096, 5120, 5376, 5504, + 5505, 5488, 5496, 5494, 0, 4096, 5120, 5376, + 5504, 5505, 5488, 0, 4096, 5120, 5376, 5504, + 5505, 5488, 5496, 0, 4096, 5120, 5376, 5504, + 5505, 5507, 5496, 0, 4096, 5120, 5376, 5504, + 5505, 5507, 5496, 5498, 0, 4096, 5120, 5376, + 5504, 5505, 5507, 5496, 0, 4096, 5120, 5376, + 5504, 5505, 5507, 5496, 5500, 0, 4096, 5120, + 5376, 5504, 5505, 5507, 5496, 5500, 0, 4096, + 5120, 5376, 5504, 5505, 5507, 5496, 5500, 5502, + 0, 4096, 5120, 5376, 0, 4096, 5120, 5632, + 5504, 0, 4096, 5120, 5632, 5504, 0, 4096, + 5120, 5632, 5504, 5506, 0, 4096, 5120, 5632, + 5504, 0, 4096, 5120, 5632, 5504, 5508, 0, + 4096, 5120, 5632, 5504, 5508, 0, 4096, 5120, + 5632, 5504, 5512, 5510, 0, 4096, 5120, 5632, + 5504, 0, 4096, 5120, 5632, 5504, 5512, 0, + 4096, 5120, 5632, 5504, 5512, 0, 4096, 5120, + 5632, 5504, 5512, 5514, 0, 4096, 5120, 5632, + 5504, 5512, 0, 4096, 5120, 5632, 5504, 5520, + 5516, 0, 4096, 5120, 5632, 5504, 5520, 5516, + 0, 4096, 5120, 5632, 5504, 5520, 5521, 5518, + 0, 4096, 5120, 5632, 5504, 0, 4096, 5120, + 5632, 5504, 5520, 0, 4096, 5120, 5632, 5504, + 5520, 0, 4096, 5120, 5632, 5504, 5520, 5522, + 0, 4096, 5120, 5632, 5504, 5520, 0, 4096, + 5120, 5632, 5504, 5520, 5524, 0, 4096, 5120, + 5632, 5504, 5520, 5524, 0, 4096, 5120, 5632, + 5504, 5520, 5528, 5526, 0, 4096, 5120, 5632, + 5504, 5520, 0, 4096, 5120, 5632, 5504, 5536, + 5528, 0, 4096, 5120, 5632, 5504, 5536, 5528, + 0, 4096, 5120, 5632, 5504, 5536, 5528, 5530, + 0, 4096, 5120, 5632, 5504, 5536, 5528, 0, + 4096, 5120, 5632, 5504, 5536, 5537, 5532, 0, + 4096, 5120, 5632, 5504, 5536, 5537, 5532, 0, + 4096, 5120, 5632, 5504, 5536, 5537, 5532, 5534, + 0, 4096, 5120, 5632, 5504, 0, 4096, 5120, + 5632, 5504, 5536, 0, 4096, 5120, 5632, 5504, + 5536, 0, 4096, 5120, 5632, 5504, 5536, 5538, + 0, 4096, 5120, 5632, 5504, 5536, 0, 4096, + 5120, 5632, 5504, 5536, 5540, 0, 4096, 5120, + 5632, 5504, 5536, 5540, 0, 4096, 5120, 5632, + 5504, 5536, 5544, 5542, 0, 4096, 5120, 5632, + 5504, 5536, 0, 4096, 5120, 5632, 5504, 5536, + 5544, 0, 4096, 5120, 5632, 5504, 5536, 5544, + 0, 4096, 5120, 5632, 5504, 5536, 5544, 5546, + 0, 4096, 5120, 5632, 5504, 5536, 5544, 0, + 4096, 5120, 5632, 5504, 5536, 5552, 5548, 0, + 4096, 5120, 5632, 5504, 5536, 5552, 5548, 0, + 4096, 5120, 5632, 5504, 5536, 5552, 5553, 5550, + 0, 4096, 5120, 5632, 5504, 5536, 0, 4096, + 5120, 5632, 5504, 5568, 5552, 0, 4096, 5120, + 5632, 5504, 5568, 5552, 0, 4096, 5120, 5632, + 5504, 5568, 5552, 5554, 0, 4096, 5120, 5632, + 5504, 5568, 5552, 0, 4096, 5120, 5632, 5504, + 5568, 5552, 5556, 0, 4096, 5120, 5632, 5504, + 5568, 5552, 5556, 0, 4096, 5120, 5632, 5504, + 5568, 5552, 5560, 5558, 0, 4096, 5120, 5632, + 5504, 5568, 5552, 0, 4096, 5120, 5632, 5504, + 5568, 5569, 5560, 0, 4096, 5120, 5632, 5504, + 5568, 5569, 5560, 0, 4096, 5120, 5632, 5504, + 5568, 5569, 5560, 5562, 0, 4096, 5120, 5632, + 5504, 5568, 5569, 5560, 0, 4096, 5120, 5632, + 5504, 5568, 5569, 5560, 5564, 0, 4096, 5120, + 5632, 5504, 5568, 5569, 5571, 5564, 0, 4096, + 5120, 5632, 5504, 5568, 5569, 5571, 5564, 5566, + 0, 4096, 5120, 5632, 5504, 0, 4096, 5120, + 5632, 5633, 5568, 0, 4096, 5120, 5632, 5633, + 5568, 0, 4096, 5120, 5632, 5633, 5568, 5570, + 0, 4096, 5120, 5632, 5633, 5568, 0, 4096, + 5120, 5632, 5633, 5568, 5572, 0, 4096, 5120, + 5632, 5633, 5568, 5572, 0, 4096, 5120, 5632, + 5633, 5568, 5576, 5574, 0, 4096, 5120, 5632, + 5633, 5568, 0, 4096, 5120, 5632, 5633, 5568, + 5576, 0, 4096, 5120, 5632, 5633, 5568, 5576, + 0, 4096, 5120, 5632, 5633, 5568, 5576, 5578, + 0, 4096, 5120, 5632, 5633, 5568, 5576, 0, + 4096, 5120, 5632, 5633, 5568, 5584, 5580, 0, + 4096, 5120, 5632, 5633, 5568, 5584, 5580, 0, + 4096, 5120, 5632, 5633, 5568, 5584, 5585, 5582, + 0, 4096, 5120, 5632, 5633, 5568, 0, 4096, + 5120, 5632, 5633, 5568, 5584, 0, 4096, 5120, + 5632, 5633, 5568, 5584, 0, 4096, 5120, 5632, + 5633, 5568, 5584, 5586, 0, 4096, 5120, 5632, + 5633, 5568, 5584, 0, 4096, 5120, 5632, 5633, + 5568, 5584, 5588, 0, 4096, 5120, 5632, 5633, + 5568, 5584, 5588, 0, 4096, 5120, 5632, 5633, + 5568, 5584, 5592, 5590, 0, 4096, 5120, 5632, + 5633, 5568, 5584, 0, 4096, 5120, 5632, 5633, + 5568, 5600, 5592, 0, 4096, 5120, 5632, 5633, + 5568, 5600, 5592, 0, 4096, 5120, 5632, 5633, + 5568, 5600, 5592, 5594, 0, 4096, 5120, 5632, + 5633, 5568, 5600, 5592, 0, 4096, 5120, 5632, + 5633, 5568, 5600, 5601, 5596, 0, 4096, 5120, + 5632, 5633, 5568, 5600, 5601, 5596, 0, 4096, + 5120, 5632, 5633, 5568, 5600, 5601, 5596, 5598, + 0, 4096, 5120, 5632, 5633, 5568, 0, 4096, + 5120, 5632, 5633, 5568, 5600, 0, 4096, 5120, + 5632, 5633, 5635, 5600, 0, 4096, 5120, 5632, + 5633, 5635, 5600, 5602, 0, 4096, 5120, 5632, + 5633, 5635, 5600, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5604, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5604, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5608, 5606, 0, 4096, 5120, 5632, + 5633, 5635, 5600, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5608, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5608, 0, 4096, 5120, 5632, 5633, + 5635, 5600, 5608, 5610, 0, 4096, 5120, 5632, + 5633, 5635, 5600, 5608, 0, 4096, 5120, 5632, + 5633, 5635, 5600, 5616, 5612, 0, 4096, 5120, + 5632, 5633, 5635, 5600, 5616, 5612, 0, 4096, + 5120, 5632, 5633, 5635, 5600, 5616, 5617, 5614, + 0, 4096, 5120, 5632, 5633, 5635, 5600, 0, + 4096, 5120, 5632, 5633, 5635, 5600, 5616, 0, + 4096, 5120, 5632, 5633, 5635, 5600, 5616, 0, + 4096, 5120, 5632, 5633, 5635, 5600, 5616, 5618, + 0, 4096, 5120, 5632, 5633, 5635, 5639, 5616, + 0, 4096, 5120, 5632, 5633, 5635, 5639, 5616, + 5620, 0, 4096, 5120, 5632, 5633, 5635, 5639, + 5616, 5620, 0, 4096, 5120, 5632, 5633, 5635, + 5639, 5616, 5624, 5622, 0, 4096, 5120, 5632, + 5633, 5635, 5639, 5616, 0, 4096, 5120, 5632, + 5633, 5635, 5639, 5616, 5624, 0, 4096, 5120, + 5632, 5633, 5635, 5639, 5616, 5624, 0, 4096, + 5120, 5632, 5633, 5635, 5639, 5616, 5624, 5626, + 0, 4096, 5120, 5632, 5633, 5635, 5639, 5616, + 5624, 0, 4096, 5120, 5632, 5633, 5635, 5639, + 5616, 5624, 5628, 0, 4096, 5120, 5632, 5633, + 5635, 5639, 5616, 5624, 5628, 0, 4096, 5120, + 5632, 5633, 5635, 5639, 5616, 5624, 5628, 5630, + 0, 4096, 5120, 0, 4096, 6144, 5632, 0, + 4096, 6144, 5632, 0, 4096, 6144, 5632, 5634, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5636, 0, 4096, 6144, 5632, 5636, 0, 4096, + 6144, 5632, 5640, 5638, 0, 4096, 6144, 5632, + 0, 4096, 6144, 5632, 5640, 0, 4096, 6144, + 5632, 5640, 0, 4096, 6144, 5632, 5640, 5642, + 0, 4096, 6144, 5632, 5640, 0, 4096, 6144, + 5632, 5648, 5644, 0, 4096, 6144, 5632, 5648, + 5644, 0, 4096, 6144, 5632, 5648, 5649, 5646, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5648, 0, 4096, 6144, 5632, 5648, 0, 4096, + 6144, 5632, 5648, 5650, 0, 4096, 6144, 5632, + 5648, 0, 4096, 6144, 5632, 5648, 5652, 0, + 4096, 6144, 5632, 5648, 5652, 0, 4096, 6144, + 5632, 5648, 5656, 5654, 0, 4096, 6144, 5632, + 5648, 0, 4096, 6144, 5632, 5664, 5656, 0, + 4096, 6144, 5632, 5664, 5656, 0, 4096, 6144, + 5632, 5664, 5656, 5658, 0, 4096, 6144, 5632, + 5664, 5656, 0, 4096, 6144, 5632, 5664, 5665, + 5660, 0, 4096, 6144, 5632, 5664, 5665, 5660, + 0, 4096, 6144, 5632, 5664, 5665, 5660, 5662, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5664, 0, 4096, 6144, 5632, 5664, 0, 4096, + 6144, 5632, 5664, 5666, 0, 4096, 6144, 5632, + 5664, 0, 4096, 6144, 5632, 5664, 5668, 0, + 4096, 6144, 5632, 5664, 5668, 0, 4096, 6144, + 5632, 5664, 5672, 5670, 0, 4096, 6144, 5632, + 5664, 0, 4096, 6144, 5632, 5664, 5672, 0, + 4096, 6144, 5632, 5664, 5672, 0, 4096, 6144, + 5632, 5664, 5672, 5674, 0, 4096, 6144, 5632, + 5664, 5672, 0, 4096, 6144, 5632, 5664, 5680, + 5676, 0, 4096, 6144, 5632, 5664, 5680, 5676, + 0, 4096, 6144, 5632, 5664, 5680, 5681, 5678, + 0, 4096, 6144, 5632, 5664, 0, 4096, 6144, + 5632, 5696, 5680, 0, 4096, 6144, 5632, 5696, + 5680, 0, 4096, 6144, 5632, 5696, 5680, 5682, + 0, 4096, 6144, 5632, 5696, 5680, 0, 4096, + 6144, 5632, 5696, 5680, 5684, 0, 4096, 6144, + 5632, 5696, 5680, 5684, 0, 4096, 6144, 5632, + 5696, 5680, 5688, 5686, 0, 4096, 6144, 5632, + 5696, 5680, 0, 4096, 6144, 5632, 5696, 5697, + 5688, 0, 4096, 6144, 5632, 5696, 5697, 5688, + 0, 4096, 6144, 5632, 5696, 5697, 5688, 5690, + 0, 4096, 6144, 5632, 5696, 5697, 5688, 0, + 4096, 6144, 5632, 5696, 5697, 5688, 5692, 0, + 4096, 6144, 5632, 5696, 5697, 5699, 5692, 0, + 4096, 6144, 5632, 5696, 5697, 5699, 5692, 5694, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5696, 0, 4096, 6144, 5632, 5696, 0, 4096, + 6144, 5632, 5696, 5698, 0, 4096, 6144, 5632, + 5696, 0, 4096, 6144, 5632, 5696, 5700, 0, + 4096, 6144, 5632, 5696, 5700, 0, 4096, 6144, + 5632, 5696, 5704, 5702, 0, 4096, 6144, 5632, + 5696, 0, 4096, 6144, 5632, 5696, 5704, 0, + 4096, 6144, 5632, 5696, 5704, 0, 4096, 6144, + 5632, 5696, 5704, 5706, 0, 4096, 6144, 5632, + 5696, 5704, 0, 4096, 6144, 5632, 5696, 5712, + 5708, 0, 4096, 6144, 5632, 5696, 5712, 5708, + 0, 4096, 6144, 5632, 5696, 5712, 5713, 5710, + 0, 4096, 6144, 5632, 5696, 0, 4096, 6144, + 5632, 5696, 5712, 0, 4096, 6144, 5632, 5696, + 5712, 0, 4096, 6144, 5632, 5696, 5712, 5714, + 0, 4096, 6144, 5632, 5696, 5712, 0, 4096, + 6144, 5632, 5696, 5712, 5716, 0, 4096, 6144, + 5632, 5696, 5712, 5716, 0, 4096, 6144, 5632, + 5696, 5712, 5720, 5718, 0, 4096, 6144, 5632, + 5696, 5712, 0, 4096, 6144, 5632, 5696, 5728, + 5720, 0, 4096, 6144, 5632, 5696, 5728, 5720, + 0, 4096, 6144, 5632, 5696, 5728, 5720, 5722, + 0, 4096, 6144, 5632, 5696, 5728, 5720, 0, + 4096, 6144, 5632, 5696, 5728, 5729, 5724, 0, + 4096, 6144, 5632, 5696, 5728, 5729, 5724, 0, + 4096, 6144, 5632, 5696, 5728, 5729, 5724, 5726, + 0, 4096, 6144, 5632, 5696, 0, 4096, 6144, + 5632, 5760, 5728, 0, 4096, 6144, 5632, 5760, + 5728, 0, 4096, 6144, 5632, 5760, 5728, 5730, + 0, 4096, 6144, 5632, 5760, 5728, 0, 4096, + 6144, 5632, 5760, 5728, 5732, 0, 4096, 6144, + 5632, 5760, 5728, 5732, 0, 4096, 6144, 5632, + 5760, 5728, 5736, 5734, 0, 4096, 6144, 5632, + 5760, 5728, 0, 4096, 6144, 5632, 5760, 5728, + 5736, 0, 4096, 6144, 5632, 5760, 5728, 5736, + 0, 4096, 6144, 5632, 5760, 5728, 5736, 5738, + 0, 4096, 6144, 5632, 5760, 5728, 5736, 0, + 4096, 6144, 5632, 5760, 5728, 5744, 5740, 0, + 4096, 6144, 5632, 5760, 5728, 5744, 5740, 0, + 4096, 6144, 5632, 5760, 5728, 5744, 5745, 5742, + 0, 4096, 6144, 5632, 5760, 5728, 0, 4096, + 6144, 5632, 5760, 5761, 5744, 0, 4096, 6144, + 5632, 5760, 5761, 5744, 0, 4096, 6144, 5632, + 5760, 5761, 5744, 5746, 0, 4096, 6144, 5632, + 5760, 5761, 5744, 0, 4096, 6144, 5632, 5760, + 5761, 5744, 5748, 0, 4096, 6144, 5632, 5760, + 5761, 5744, 5748, 0, 4096, 6144, 5632, 5760, + 5761, 5744, 5752, 5750, 0, 4096, 6144, 5632, + 5760, 5761, 5744, 0, 4096, 6144, 5632, 5760, + 5761, 5744, 5752, 0, 4096, 6144, 5632, 5760, + 5761, 5763, 5752, 0, 4096, 6144, 5632, 5760, + 5761, 5763, 5752, 5754, 0, 4096, 6144, 5632, + 5760, 5761, 5763, 5752, 0, 4096, 6144, 5632, + 5760, 5761, 5763, 5752, 5756, 0, 4096, 6144, + 5632, 5760, 5761, 5763, 5752, 5756, 0, 4096, + 6144, 5632, 5760, 5761, 5763, 5752, 5756, 5758, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5760, 0, 4096, 6144, 5632, 5760, 0, 4096, + 6144, 5632, 5760, 5762, 0, 4096, 6144, 5632, + 5760, 0, 4096, 6144, 5632, 5760, 5764, 0, + 4096, 6144, 5632, 5760, 5764, 0, 4096, 6144, + 5632, 5760, 5768, 5766, 0, 4096, 6144, 5632, + 5760, 0, 4096, 6144, 5632, 5760, 5768, 0, + 4096, 6144, 5632, 5760, 5768, 0, 4096, 6144, + 5632, 5760, 5768, 5770, 0, 4096, 6144, 5632, + 5760, 5768, 0, 4096, 6144, 5632, 5760, 5776, + 5772, 0, 4096, 6144, 5632, 5760, 5776, 5772, + 0, 4096, 6144, 5632, 5760, 5776, 5777, 5774, + 0, 4096, 6144, 5632, 5760, 0, 4096, 6144, + 5632, 5760, 5776, 0, 4096, 6144, 5632, 5760, + 5776, 0, 4096, 6144, 5632, 5760, 5776, 5778, + 0, 4096, 6144, 5632, 5760, 5776, 0, 4096, + 6144, 5632, 5760, 5776, 5780, 0, 4096, 6144, + 5632, 5760, 5776, 5780, 0, 4096, 6144, 5632, + 5760, 5776, 5784, 5782, 0, 4096, 6144, 5632, + 5760, 5776, 0, 4096, 6144, 5632, 5760, 5792, + 5784, 0, 4096, 6144, 5632, 5760, 5792, 5784, + 0, 4096, 6144, 5632, 5760, 5792, 5784, 5786, + 0, 4096, 6144, 5632, 5760, 5792, 5784, 0, + 4096, 6144, 5632, 5760, 5792, 5793, 5788, 0, + 4096, 6144, 5632, 5760, 5792, 5793, 5788, 0, + 4096, 6144, 5632, 5760, 5792, 5793, 5788, 5790, + 0, 4096, 6144, 5632, 5760, 0, 4096, 6144, + 5632, 5760, 5792, 0, 4096, 6144, 5632, 5760, + 5792, 0, 4096, 6144, 5632, 5760, 5792, 5794, + 0, 4096, 6144, 5632, 5760, 5792, 0, 4096, + 6144, 5632, 5760, 5792, 5796, 0, 4096, 6144, + 5632, 5760, 5792, 5796, 0, 4096, 6144, 5632, + 5760, 5792, 5800, 5798, 0, 4096, 6144, 5632, + 5760, 5792, 0, 4096, 6144, 5632, 5760, 5792, + 5800, 0, 4096, 6144, 5632, 5760, 5792, 5800, + 0, 4096, 6144, 5632, 5760, 5792, 5800, 5802, + 0, 4096, 6144, 5632, 5760, 5792, 5800, 0, + 4096, 6144, 5632, 5760, 5792, 5808, 5804, 0, + 4096, 6144, 5632, 5760, 5792, 5808, 5804, 0, + 4096, 6144, 5632, 5760, 5792, 5808, 5809, 5806, + 0, 4096, 6144, 5632, 5760, 5792, 0, 4096, + 6144, 5632, 5760, 5824, 5808, 0, 4096, 6144, + 5632, 5760, 5824, 5808, 0, 4096, 6144, 5632, + 5760, 5824, 5808, 5810, 0, 4096, 6144, 5632, + 5760, 5824, 5808, 0, 4096, 6144, 5632, 5760, + 5824, 5808, 5812, 0, 4096, 6144, 5632, 5760, + 5824, 5808, 5812, 0, 4096, 6144, 5632, 5760, + 5824, 5808, 5816, 5814, 0, 4096, 6144, 5632, + 5760, 5824, 5808, 0, 4096, 6144, 5632, 5760, + 5824, 5825, 5816, 0, 4096, 6144, 5632, 5760, + 5824, 5825, 5816, 0, 4096, 6144, 5632, 5760, + 5824, 5825, 5816, 5818, 0, 4096, 6144, 5632, + 5760, 5824, 5825, 5816, 0, 4096, 6144, 5632, + 5760, 5824, 5825, 5816, 5820, 0, 4096, 6144, + 5632, 5760, 5824, 5825, 5827, 5820, 0, 4096, + 6144, 5632, 5760, 5824, 5825, 5827, 5820, 5822, + 0, 4096, 6144, 5632, 5760, 0, 4096, 6144, + 5632, 5888, 5824, 0, 4096, 6144, 5632, 5888, + 5824, 0, 4096, 6144, 5632, 5888, 5824, 5826, + 0, 4096, 6144, 5632, 5888, 5824, 0, 4096, + 6144, 5632, 5888, 5824, 5828, 0, 4096, 6144, + 5632, 5888, 5824, 5828, 0, 4096, 6144, 5632, + 5888, 5824, 5832, 5830, 0, 4096, 6144, 5632, + 5888, 5824, 0, 4096, 6144, 5632, 5888, 5824, + 5832, 0, 4096, 6144, 5632, 5888, 5824, 5832, + 0, 4096, 6144, 5632, 5888, 5824, 5832, 5834, + 0, 4096, 6144, 5632, 5888, 5824, 5832, 0, + 4096, 6144, 5632, 5888, 5824, 5840, 5836, 0, + 4096, 6144, 5632, 5888, 5824, 5840, 5836, 0, + 4096, 6144, 5632, 5888, 5824, 5840, 5841, 5838, + 0, 4096, 6144, 5632, 5888, 5824, 0, 4096, + 6144, 5632, 5888, 5824, 5840, 0, 4096, 6144, + 5632, 5888, 5824, 5840, 0, 4096, 6144, 5632, + 5888, 5824, 5840, 5842, 0, 4096, 6144, 5632, + 5888, 5824, 5840, 0, 4096, 6144, 5632, 5888, + 5824, 5840, 5844, 0, 4096, 6144, 5632, 5888, + 5824, 5840, 5844, 0, 4096, 6144, 5632, 5888, + 5824, 5840, 5848, 5846, 0, 4096, 6144, 5632, + 5888, 5824, 5840, 0, 4096, 6144, 5632, 5888, + 5824, 5856, 5848, 0, 4096, 6144, 5632, 5888, + 5824, 5856, 5848, 0, 4096, 6144, 5632, 5888, + 5824, 5856, 5848, 5850, 0, 4096, 6144, 5632, + 5888, 5824, 5856, 5848, 0, 4096, 6144, 5632, + 5888, 5824, 5856, 5857, 5852, 0, 4096, 6144, + 5632, 5888, 5824, 5856, 5857, 5852, 0, 4096, + 6144, 5632, 5888, 5824, 5856, 5857, 5852, 5854, + 0, 4096, 6144, 5632, 5888, 5824, 0, 4096, + 6144, 5632, 5888, 5889, 5856, 0, 4096, 6144, + 5632, 5888, 5889, 5856, 0, 4096, 6144, 5632, + 5888, 5889, 5856, 5858, 0, 4096, 6144, 5632, + 5888, 5889, 5856, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5860, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5860, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5864, 5862, 0, 4096, 6144, 5632, + 5888, 5889, 5856, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5864, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5864, 0, 4096, 6144, 5632, 5888, + 5889, 5856, 5864, 5866, 0, 4096, 6144, 5632, + 5888, 5889, 5856, 5864, 0, 4096, 6144, 5632, + 5888, 5889, 5856, 5872, 5868, 0, 4096, 6144, + 5632, 5888, 5889, 5856, 5872, 5868, 0, 4096, + 6144, 5632, 5888, 5889, 5856, 5872, 5873, 5870, + 0, 4096, 6144, 5632, 5888, 5889, 5856, 0, + 4096, 6144, 5632, 5888, 5889, 5856, 5872, 0, + 4096, 6144, 5632, 5888, 5889, 5891, 5872, 0, + 4096, 6144, 5632, 5888, 5889, 5891, 5872, 5874, + 0, 4096, 6144, 5632, 5888, 5889, 5891, 5872, + 0, 4096, 6144, 5632, 5888, 5889, 5891, 5872, + 5876, 0, 4096, 6144, 5632, 5888, 5889, 5891, + 5872, 5876, 0, 4096, 6144, 5632, 5888, 5889, + 5891, 5872, 5880, 5878, 0, 4096, 6144, 5632, + 5888, 5889, 5891, 5872, 0, 4096, 6144, 5632, + 5888, 5889, 5891, 5872, 5880, 0, 4096, 6144, + 5632, 5888, 5889, 5891, 5872, 5880, 0, 4096, + 6144, 5632, 5888, 5889, 5891, 5872, 5880, 5882, + 0, 4096, 6144, 5632, 5888, 5889, 5891, 5895, + 5880, 0, 4096, 6144, 5632, 5888, 5889, 5891, + 5895, 5880, 5884, 0, 4096, 6144, 5632, 5888, + 5889, 5891, 5895, 5880, 5884, 0, 4096, 6144, + 5632, 5888, 5889, 5891, 5895, 5880, 5884, 5886, + 0, 4096, 6144, 5632, 0, 4096, 6144, 5632, + 5888, 0, 4096, 6144, 6145, 5888, 0, 4096, + 6144, 6145, 5888, 5890, 0, 4096, 6144, 6145, + 5888, 0, 4096, 6144, 6145, 5888, 5892, 0, + 4096, 6144, 6145, 5888, 5892, 0, 4096, 6144, + 6145, 5888, 5896, 5894, 0, 4096, 6144, 6145, + 5888, 0, 4096, 6144, 6145, 5888, 5896, 0, + 4096, 6144, 6145, 5888, 5896, 0, 4096, 6144, + 6145, 5888, 5896, 5898, 0, 4096, 6144, 6145, + 5888, 5896, 0, 4096, 6144, 6145, 5888, 5904, + 5900, 0, 4096, 6144, 6145, 5888, 5904, 5900, + 0, 4096, 6144, 6145, 5888, 5904, 5905, 5902, + 0, 4096, 6144, 6145, 5888, 0, 4096, 6144, + 6145, 5888, 5904, 0, 4096, 6144, 6145, 5888, + 5904, 0, 4096, 6144, 6145, 5888, 5904, 5906, + 0, 4096, 6144, 6145, 5888, 5904, 0, 4096, + 6144, 6145, 5888, 5904, 5908, 0, 4096, 6144, + 6145, 5888, 5904, 5908, 0, 4096, 6144, 6145, + 5888, 5904, 5912, 5910, 0, 4096, 6144, 6145, + 5888, 5904, 0, 4096, 6144, 6145, 5888, 5920, + 5912, 0, 4096, 6144, 6145, 5888, 5920, 5912, + 0, 4096, 6144, 6145, 5888, 5920, 5912, 5914, + 0, 4096, 6144, 6145, 5888, 5920, 5912, 0, + 4096, 6144, 6145, 5888, 5920, 5921, 5916, 0, + 4096, 6144, 6145, 5888, 5920, 5921, 5916, 0, + 4096, 6144, 6145, 5888, 5920, 5921, 5916, 5918, + 0, 4096, 6144, 6145, 5888, 0, 4096, 6144, + 6145, 5888, 5920, 0, 4096, 6144, 6145, 5888, + 5920, 0, 4096, 6144, 6145, 5888, 5920, 5922, + 0, 4096, 6144, 6145, 5888, 5920, 0, 4096, + 6144, 6145, 5888, 5920, 5924, 0, 4096, 6144, + 6145, 5888, 5920, 5924, 0, 4096, 6144, 6145, + 5888, 5920, 5928, 5926, 0, 4096, 6144, 6145, + 5888, 5920, 0, 4096, 6144, 6145, 5888, 5920, + 5928, 0, 4096, 6144, 6145, 5888, 5920, 5928, + 0, 4096, 6144, 6145, 5888, 5920, 5928, 5930, + 0, 4096, 6144, 6145, 5888, 5920, 5928, 0, + 4096, 6144, 6145, 5888, 5920, 5936, 5932, 0, + 4096, 6144, 6145, 5888, 5920, 5936, 5932, 0, + 4096, 6144, 6145, 5888, 5920, 5936, 5937, 5934, + 0, 4096, 6144, 6145, 5888, 5920, 0, 4096, + 6144, 6145, 5888, 5952, 5936, 0, 4096, 6144, + 6145, 5888, 5952, 5936, 0, 4096, 6144, 6145, + 5888, 5952, 5936, 5938, 0, 4096, 6144, 6145, + 5888, 5952, 5936, 0, 4096, 6144, 6145, 5888, + 5952, 5936, 5940, 0, 4096, 6144, 6145, 5888, + 5952, 5936, 5940, 0, 4096, 6144, 6145, 5888, + 5952, 5936, 5944, 5942, 0, 4096, 6144, 6145, + 5888, 5952, 5936, 0, 4096, 6144, 6145, 5888, + 5952, 5953, 5944, 0, 4096, 6144, 6145, 5888, + 5952, 5953, 5944, 0, 4096, 6144, 6145, 5888, + 5952, 5953, 5944, 5946, 0, 4096, 6144, 6145, + 5888, 5952, 5953, 5944, 0, 4096, 6144, 6145, + 5888, 5952, 5953, 5944, 5948, 0, 4096, 6144, + 6145, 5888, 5952, 5953, 5955, 5948, 0, 4096, + 6144, 6145, 5888, 5952, 5953, 5955, 5948, 5950, + 0, 4096, 6144, 6145, 5888, 0, 4096, 6144, + 6145, 5888, 5952, 0, 4096, 6144, 6145, 5888, + 5952, 0, 4096, 6144, 6145, 5888, 5952, 5954, + 0, 4096, 6144, 6145, 5888, 5952, 0, 4096, + 6144, 6145, 5888, 5952, 5956, 0, 4096, 6144, + 6145, 5888, 5952, 5956, 0, 4096, 6144, 6145, + 5888, 5952, 5960, 5958, 0, 4096, 6144, 6145, + 5888, 5952, 0, 4096, 6144, 6145, 5888, 5952, + 5960, 0, 4096, 6144, 6145, 5888, 5952, 5960, + 0, 4096, 6144, 6145, 5888, 5952, 5960, 5962, + 0, 4096, 6144, 6145, 5888, 5952, 5960, 0, + 4096, 6144, 6145, 5888, 5952, 5968, 5964, 0, + 4096, 6144, 6145, 5888, 5952, 5968, 5964, 0, + 4096, 6144, 6145, 5888, 5952, 5968, 5969, 5966, + 0, 4096, 6144, 6145, 5888, 5952, 0, 4096, + 6144, 6145, 5888, 5952, 5968, 0, 4096, 6144, + 6145, 5888, 5952, 5968, 0, 4096, 6144, 6145, + 5888, 5952, 5968, 5970, 0, 4096, 6144, 6145, + 5888, 5952, 5968, 0, 4096, 6144, 6145, 5888, + 5952, 5968, 5972, 0, 4096, 6144, 6145, 5888, + 5952, 5968, 5972, 0, 4096, 6144, 6145, 5888, + 5952, 5968, 5976, 5974, 0, 4096, 6144, 6145, + 5888, 5952, 5968, 0, 4096, 6144, 6145, 5888, + 5952, 5984, 5976, 0, 4096, 6144, 6145, 5888, + 5952, 5984, 5976, 0, 4096, 6144, 6145, 5888, + 5952, 5984, 5976, 5978, 0, 4096, 6144, 6145, + 5888, 5952, 5984, 5976, 0, 4096, 6144, 6145, + 5888, 5952, 5984, 5985, 5980, 0, 4096, 6144, + 6145, 5888, 5952, 5984, 5985, 5980, 0, 4096, + 6144, 6145, 5888, 5952, 5984, 5985, 5980, 5982, + 0, 4096, 6144, 6145, 5888, 5952, 0, 4096, + 6144, 6145, 5888, 6016, 5984, 0, 4096, 6144, + 6145, 5888, 6016, 5984, 0, 4096, 6144, 6145, + 5888, 6016, 5984, 5986, 0, 4096, 6144, 6145, + 5888, 6016, 5984, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5988, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5988, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5992, 5990, 0, 4096, 6144, 6145, + 5888, 6016, 5984, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5992, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5992, 0, 4096, 6144, 6145, 5888, + 6016, 5984, 5992, 5994, 0, 4096, 6144, 6145, + 5888, 6016, 5984, 5992, 0, 4096, 6144, 6145, + 5888, 6016, 5984, 6000, 5996, 0, 4096, 6144, + 6145, 5888, 6016, 5984, 6000, 5996, 0, 4096, + 6144, 6145, 5888, 6016, 5984, 6000, 6001, 5998, + 0, 4096, 6144, 6145, 5888, 6016, 5984, 0, + 4096, 6144, 6145, 5888, 6016, 6017, 6000, 0, + 4096, 6144, 6145, 5888, 6016, 6017, 6000, 0, + 4096, 6144, 6145, 5888, 6016, 6017, 6000, 6002, + 0, 4096, 6144, 6145, 5888, 6016, 6017, 6000, + 0, 4096, 6144, 6145, 5888, 6016, 6017, 6000, + 6004, 0, 4096, 6144, 6145, 5888, 6016, 6017, + 6000, 6004, 0, 4096, 6144, 6145, 5888, 6016, + 6017, 6000, 6008, 6006, 0, 4096, 6144, 6145, + 5888, 6016, 6017, 6000, 0, 4096, 6144, 6145, + 5888, 6016, 6017, 6000, 6008, 0, 4096, 6144, + 6145, 5888, 6016, 6017, 6019, 6008, 0, 4096, + 6144, 6145, 5888, 6016, 6017, 6019, 6008, 6010, + 0, 4096, 6144, 6145, 5888, 6016, 6017, 6019, + 6008, 0, 4096, 6144, 6145, 5888, 6016, 6017, + 6019, 6008, 6012, 0, 4096, 6144, 6145, 5888, + 6016, 6017, 6019, 6008, 6012, 0, 4096, 6144, + 6145, 5888, 6016, 6017, 6019, 6008, 6012, 6014, + 0, 4096, 6144, 6145, 5888, 0, 4096, 6144, + 6145, 5888, 6016, 0, 4096, 6144, 6145, 5888, + 6016, 0, 4096, 6144, 6145, 5888, 6016, 6018, + 0, 4096, 6144, 6145, 6147, 6016, 0, 4096, + 6144, 6145, 6147, 6016, 6020, 0, 4096, 6144, + 6145, 6147, 6016, 6020, 0, 4096, 6144, 6145, + 6147, 6016, 6024, 6022, 0, 4096, 6144, 6145, + 6147, 6016, 0, 4096, 6144, 6145, 6147, 6016, + 6024, 0, 4096, 6144, 6145, 6147, 6016, 6024, + 0, 4096, 6144, 6145, 6147, 6016, 6024, 6026, + 0, 4096, 6144, 6145, 6147, 6016, 6024, 0, + 4096, 6144, 6145, 6147, 6016, 6032, 6028, 0, + 4096, 6144, 6145, 6147, 6016, 6032, 6028, 0, + 4096, 6144, 6145, 6147, 6016, 6032, 6033, 6030, + 0, 4096, 6144, 6145, 6147, 6016, 0, 4096, + 6144, 6145, 6147, 6016, 6032, 0, 4096, 6144, + 6145, 6147, 6016, 6032, 0, 4096, 6144, 6145, + 6147, 6016, 6032, 6034, 0, 4096, 6144, 6145, + 6147, 6016, 6032, 0, 4096, 6144, 6145, 6147, + 6016, 6032, 6036, 0, 4096, 6144, 6145, 6147, + 6016, 6032, 6036, 0, 4096, 6144, 6145, 6147, + 6016, 6032, 6040, 6038, 0, 4096, 6144, 6145, + 6147, 6016, 6032, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6040, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6040, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6040, 6042, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 6040, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 6049, 6044, 0, 4096, 6144, + 6145, 6147, 6016, 6048, 6049, 6044, 0, 4096, + 6144, 6145, 6147, 6016, 6048, 6049, 6044, 6046, + 0, 4096, 6144, 6145, 6147, 6016, 0, 4096, + 6144, 6145, 6147, 6016, 6048, 0, 4096, 6144, + 6145, 6147, 6016, 6048, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 6050, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6052, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6052, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6056, 6054, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6056, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6056, 0, 4096, 6144, 6145, 6147, + 6016, 6048, 6056, 6058, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 6056, 0, 4096, 6144, 6145, + 6147, 6016, 6048, 6064, 6060, 0, 4096, 6144, + 6145, 6147, 6016, 6048, 6064, 6060, 0, 4096, + 6144, 6145, 6147, 6016, 6048, 6064, 6065, 6062, + 0, 4096, 6144, 6145, 6147, 6016, 6048, 0, + 4096, 6144, 6145, 6147, 6016, 6080, 6064, 0, + 4096, 6144, 6145, 6147, 6016, 6080, 6064, 0, + 4096, 6144, 6145, 6147, 6016, 6080, 6064, 6066, + 0, 4096, 6144, 6145, 6147, 6016, 6080, 6064, + 0, 4096, 6144, 6145, 6147, 6016, 6080, 6064, + 6068, 0, 4096, 6144, 6145, 6147, 6016, 6080, + 6064, 6068, 0, 4096, 6144, 6145, 6147, 6016, + 6080, 6064, 6072, 6070, 0, 4096, 6144, 6145, + 6147, 6016, 6080, 6064, 0, 4096, 6144, 6145, + 6147, 6016, 6080, 6081, 6072, 0, 4096, 6144, + 6145, 6147, 6016, 6080, 6081, 6072, 0, 4096, + 6144, 6145, 6147, 6016, 6080, 6081, 6072, 6074, + 0, 4096, 6144, 6145, 6147, 6016, 6080, 6081, + 6072, 0, 4096, 6144, 6145, 6147, 6016, 6080, + 6081, 6072, 6076, 0, 4096, 6144, 6145, 6147, + 6016, 6080, 6081, 6083, 6076, 0, 4096, 6144, + 6145, 6147, 6016, 6080, 6081, 6083, 6076, 6078, + 0, 4096, 6144, 6145, 6147, 6016, 0, 4096, + 6144, 6145, 6147, 6016, 6080, 0, 4096, 6144, + 6145, 6147, 6016, 6080, 0, 4096, 6144, 6145, + 6147, 6016, 6080, 6082, 0, 4096, 6144, 6145, + 6147, 6016, 6080, 0, 4096, 6144, 6145, 6147, + 6016, 6080, 6084, 0, 4096, 6144, 6145, 6147, + 6016, 6080, 6084, 0, 4096, 6144, 6145, 6147, + 6016, 6080, 6088, 6086, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 0, 4096, 6144, 6145, 6147, + 6151, 6080, 6088, 0, 4096, 6144, 6145, 6147, + 6151, 6080, 6088, 0, 4096, 6144, 6145, 6147, + 6151, 6080, 6088, 6090, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6088, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6096, 6092, 0, 4096, 6144, + 6145, 6147, 6151, 6080, 6096, 6092, 0, 4096, + 6144, 6145, 6147, 6151, 6080, 6096, 6097, 6094, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6096, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6096, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6096, 6098, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6096, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6096, + 6100, 0, 4096, 6144, 6145, 6147, 6151, 6080, + 6096, 6100, 0, 4096, 6144, 6145, 6147, 6151, + 6080, 6096, 6104, 6102, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6096, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6112, 6104, 0, 4096, 6144, + 6145, 6147, 6151, 6080, 6112, 6104, 0, 4096, + 6144, 6145, 6147, 6151, 6080, 6112, 6104, 6106, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6112, + 6104, 0, 4096, 6144, 6145, 6147, 6151, 6080, + 6112, 6113, 6108, 0, 4096, 6144, 6145, 6147, + 6151, 6080, 6112, 6113, 6108, 0, 4096, 6144, + 6145, 6147, 6151, 6080, 6112, 6113, 6108, 6110, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6112, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6112, 0, + 4096, 6144, 6145, 6147, 6151, 6080, 6112, 6114, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6112, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6112, + 6116, 0, 4096, 6144, 6145, 6147, 6151, 6080, + 6112, 6116, 0, 4096, 6144, 6145, 6147, 6151, + 6080, 6112, 6120, 6118, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6112, 0, 4096, 6144, 6145, + 6147, 6151, 6080, 6112, 6120, 0, 4096, 6144, + 6145, 6147, 6151, 6080, 6112, 6120, 0, 4096, + 6144, 6145, 6147, 6151, 6080, 6112, 6120, 6122, + 0, 4096, 6144, 6145, 6147, 6151, 6080, 6112, + 6120, 0, 4096, 6144, 6145, 6147, 6151, 6080, + 6112, 6128, 6124, 0, 4096, 6144, 6145, 6147, + 6151, 6080, 6112, 6128, 6124, 0, 4096, 6144, + 6145, 6147, 6151, 6080, 6112, 6128, 6129, 6126, + 0, 4096, 6144, 6145, 6147, 6151, 6159, 6112, + 0, 4096, 6144, 6145, 6147, 6151, 6159, 6112, + 6128, 0, 4096, 6144, 6145, 6147, 6151, 6159, + 6112, 6128, 0, 4096, 6144, 6145, 6147, 6151, + 6159, 6112, 6128, 6130, 0, 4096, 6144, 6145, + 6147, 6151, 6159, 6112, 6128, 0, 4096, 6144, + 6145, 6147, 6151, 6159, 6112, 6128, 6132, 0, + 4096, 6144, 6145, 6147, 6151, 6159, 6112, 6128, + 6132, 0, 4096, 6144, 6145, 6147, 6151, 6159, + 6112, 6128, 6136, 6134, 0, 4096, 6144, 6145, + 6147, 6151, 6159, 6112, 6128, 0, 4096, 6144, + 6145, 6147, 6151, 6159, 6112, 6128, 6136, 0, + 4096, 6144, 6145, 6147, 6151, 6159, 6112, 6128, + 6136, 0, 4096, 6144, 6145, 6147, 6151, 6159, + 6112, 6128, 6136, 6138, 0, 4096, 6144, 6145, + 6147, 6151, 6159, 6112, 6128, 6136, 0, 4096, + 6144, 6145, 6147, 6151, 6159, 6112, 6128, 6136, + 6140, 0, 4096, 6144, 6145, 6147, 6151, 6159, + 6112, 6128, 6136, 6140, 0, 4096, 6144, 6145, + 6147, 6151, 6159, 6112, 6128, 6136, 6140, 6142, + 0, 4096, 0, 4096, 6144, 0, 4096, 6144, + 0, 4096, 6144, 6146, 0, 4096, 6144, 0, + 4096, 6144, 6148, 0, 4096, 6144, 6148, 0, + 4096, 6144, 6152, 6150, 0, 4096, 6144, 0, + 4096, 6144, 6152, 0, 4096, 6144, 6152, 0, + 4096, 6144, 6152, 6154, 0, 4096, 6144, 6152, + 0, 4096, 6144, 6160, 6156, 0, 4096, 6144, + 6160, 6156, 0, 4096, 6144, 6160, 6161, 6158, + 0, 4096, 6144, 0, 4096, 6144, 6160, 0, + 4096, 6144, 6160, 0, 4096, 6144, 6160, 6162, + 0, 4096, 6144, 6160, 0, 4096, 6144, 6160, + 6164, 0, 4096, 6144, 6160, 6164, 0, 4096, + 6144, 6160, 6168, 6166, 0, 4096, 6144, 6160, + 0, 4096, 6144, 6176, 6168, 0, 4096, 6144, + 6176, 6168, 0, 4096, 6144, 6176, 6168, 6170, + 0, 4096, 6144, 6176, 6168, 0, 4096, 6144, + 6176, 6177, 6172, 0, 4096, 6144, 6176, 6177, + 6172, 0, 4096, 6144, 6176, 6177, 6172, 6174, + 0, 4096, 6144, 0, 4096, 6144, 6176, 0, + 4096, 6144, 6176, 0, 4096, 6144, 6176, 6178, + 0, 4096, 6144, 6176, 0, 4096, 6144, 6176, + 6180, 0, 4096, 6144, 6176, 6180, 0, 4096, + 6144, 6176, 6184, 6182, 0, 4096, 6144, 6176, + 0, 4096, 6144, 6176, 6184, 0, 4096, 6144, + 6176, 6184, 0, 4096, 6144, 6176, 6184, 6186, + 0, 4096, 6144, 6176, 6184, 0, 4096, 6144, + 6176, 6192, 6188, 0, 4096, 6144, 6176, 6192, + 6188, 0, 4096, 6144, 6176, 6192, 6193, 6190, + 0, 4096, 6144, 6176, 0, 4096, 6144, 6208, + 6192, 0, 4096, 6144, 6208, 6192, 0, 4096, + 6144, 6208, 6192, 6194, 0, 4096, 6144, 6208, + 6192, 0, 4096, 6144, 6208, 6192, 6196, 0, + 4096, 6144, 6208, 6192, 6196, 0, 4096, 6144, + 6208, 6192, 6200, 6198, 0, 4096, 6144, 6208, + 6192, 0, 4096, 6144, 6208, 6209, 6200, 0, + 4096, 6144, 6208, 6209, 6200, 0, 4096, 6144, + 6208, 6209, 6200, 6202, 0, 4096, 6144, 6208, + 6209, 6200, 0, 4096, 6144, 6208, 6209, 6200, + 6204, 0, 4096, 6144, 6208, 6209, 6211, 6204, + 0, 4096, 6144, 6208, 6209, 6211, 6204, 6206, + 0, 4096, 6144, 0, 4096, 6144, 6208, 0, + 4096, 6144, 6208, 0, 4096, 6144, 6208, 6210, + 0, 4096, 6144, 6208, 0, 4096, 6144, 6208, + 6212, 0, 4096, 6144, 6208, 6212, 0, 4096, + 6144, 6208, 6216, 6214, 0, 4096, 6144, 6208, + 0, 4096, 6144, 6208, 6216, 0, 4096, 6144, + 6208, 6216, 0, 4096, 6144, 6208, 6216, 6218, + 0, 4096, 6144, 6208, 6216, 0, 4096, 6144, + 6208, 6224, 6220, 0, 4096, 6144, 6208, 6224, + 6220, 0, 4096, 6144, 6208, 6224, 6225, 6222, + 0, 4096, 6144, 6208, 0, 4096, 6144, 6208, + 6224, 0, 4096, 6144, 6208, 6224, 0, 4096, + 6144, 6208, 6224, 6226, 0, 4096, 6144, 6208, + 6224, 0, 4096, 6144, 6208, 6224, 6228, 0, + 4096, 6144, 6208, 6224, 6228, 0, 4096, 6144, + 6208, 6224, 6232, 6230, 0, 4096, 6144, 6208, + 6224, 0, 4096, 6144, 6208, 6240, 6232, 0, + 4096, 6144, 6208, 6240, 6232, 0, 4096, 6144, + 6208, 6240, 6232, 6234, 0, 4096, 6144, 6208, + 6240, 6232, 0, 4096, 6144, 6208, 6240, 6241, + 6236, 0, 4096, 6144, 6208, 6240, 6241, 6236, + 0, 4096, 6144, 6208, 6240, 6241, 6236, 6238, + 0, 4096, 6144, 6208, 0, 4096, 6144, 6272, + 6240, 0, 4096, 6144, 6272, 6240, 0, 4096, + 6144, 6272, 6240, 6242, 0, 4096, 6144, 6272, + 6240, 0, 4096, 6144, 6272, 6240, 6244, 0, + 4096, 6144, 6272, 6240, 6244, 0, 4096, 6144, + 6272, 6240, 6248, 6246, 0, 4096, 6144, 6272, + 6240, 0, 4096, 6144, 6272, 6240, 6248, 0, + 4096, 6144, 6272, 6240, 6248, 0, 4096, 6144, + 6272, 6240, 6248, 6250, 0, 4096, 6144, 6272, + 6240, 6248, 0, 4096, 6144, 6272, 6240, 6256, + 6252, 0, 4096, 6144, 6272, 6240, 6256, 6252, + 0, 4096, 6144, 6272, 6240, 6256, 6257, 6254, + 0, 4096, 6144, 6272, 6240, 0, 4096, 6144, + 6272, 6273, 6256, 0, 4096, 6144, 6272, 6273, + 6256, 0, 4096, 6144, 6272, 6273, 6256, 6258, + 0, 4096, 6144, 6272, 6273, 6256, 0, 4096, + 6144, 6272, 6273, 6256, 6260, 0, 4096, 6144, + 6272, 6273, 6256, 6260, 0, 4096, 6144, 6272, + 6273, 6256, 6264, 6262, 0, 4096, 6144, 6272, + 6273, 6256, 0, 4096, 6144, 6272, 6273, 6256, + 6264, 0, 4096, 6144, 6272, 6273, 6275, 6264, + 0, 4096, 6144, 6272, 6273, 6275, 6264, 6266, + 0, 4096, 6144, 6272, 6273, 6275, 6264, 0, + 4096, 6144, 6272, 6273, 6275, 6264, 6268, 0, + 4096, 6144, 6272, 6273, 6275, 6264, 6268, 0, + 4096, 6144, 6272, 6273, 6275, 6264, 6268, 6270, + 0, 4096, 6144, 0, 4096, 6144, 6272, 0, + 4096, 6144, 6272, 0, 4096, 6144, 6272, 6274, + 0, 4096, 6144, 6272, 0, 4096, 6144, 6272, + 6276, 0, 4096, 6144, 6272, 6276, 0, 4096, + 6144, 6272, 6280, 6278, 0, 4096, 6144, 6272, + 0, 4096, 6144, 6272, 6280, 0, 4096, 6144, + 6272, 6280, 0, 4096, 6144, 6272, 6280, 6282, + 0, 4096, 6144, 6272, 6280, 0, 4096, 6144, + 6272, 6288, 6284, 0, 4096, 6144, 6272, 6288, + 6284, 0, 4096, 6144, 6272, 6288, 6289, 6286, + 0, 4096, 6144, 6272, 0, 4096, 6144, 6272, + 6288, 0, 4096, 6144, 6272, 6288, 0, 4096, + 6144, 6272, 6288, 6290, 0, 4096, 6144, 6272, + 6288, 0, 4096, 6144, 6272, 6288, 6292, 0, + 4096, 6144, 6272, 6288, 6292, 0, 4096, 6144, + 6272, 6288, 6296, 6294, 0, 4096, 6144, 6272, + 6288, 0, 4096, 6144, 6272, 6304, 6296, 0, + 4096, 6144, 6272, 6304, 6296, 0, 4096, 6144, + 6272, 6304, 6296, 6298, 0, 4096, 6144, 6272, + 6304, 6296, 0, 4096, 6144, 6272, 6304, 6305, + 6300, 0, 4096, 6144, 6272, 6304, 6305, 6300, + 0, 4096, 6144, 6272, 6304, 6305, 6300, 6302, + 0, 4096, 6144, 6272, 0, 4096, 6144, 6272, + 6304, 0, 4096, 6144, 6272, 6304, 0, 4096, + 6144, 6272, 6304, 6306, 0, 4096, 6144, 6272, + 6304, 0, 4096, 6144, 6272, 6304, 6308, 0, + 4096, 6144, 6272, 6304, 6308, 0, 4096, 6144, + 6272, 6304, 6312, 6310, 0, 4096, 6144, 6272, + 6304, 0, 4096, 6144, 6272, 6304, 6312, 0, + 4096, 6144, 6272, 6304, 6312, 0, 4096, 6144, + 6272, 6304, 6312, 6314, 0, 4096, 6144, 6272, + 6304, 6312, 0, 4096, 6144, 6272, 6304, 6320, + 6316, 0, 4096, 6144, 6272, 6304, 6320, 6316, + 0, 4096, 6144, 6272, 6304, 6320, 6321, 6318, + 0, 4096, 6144, 6272, 6304, 0, 4096, 6144, + 6272, 6336, 6320, 0, 4096, 6144, 6272, 6336, + 6320, 0, 4096, 6144, 6272, 6336, 6320, 6322, + 0, 4096, 6144, 6272, 6336, 6320, 0, 4096, + 6144, 6272, 6336, 6320, 6324, 0, 4096, 6144, + 6272, 6336, 6320, 6324, 0, 4096, 6144, 6272, + 6336, 6320, 6328, 6326, 0, 4096, 6144, 6272, + 6336, 6320, 0, 4096, 6144, 6272, 6336, 6337, + 6328, 0, 4096, 6144, 6272, 6336, 6337, 6328, + 0, 4096, 6144, 6272, 6336, 6337, 6328, 6330, + 0, 4096, 6144, 6272, 6336, 6337, 6328, 0, + 4096, 6144, 6272, 6336, 6337, 6328, 6332, 0, + 4096, 6144, 6272, 6336, 6337, 6339, 6332, 0, + 4096, 6144, 6272, 6336, 6337, 6339, 6332, 6334, + 0, 4096, 6144, 6272, 0, 4096, 6144, 6400, + 6336, 0, 4096, 6144, 6400, 6336, 0, 4096, + 6144, 6400, 6336, 6338, 0, 4096, 6144, 6400, + 6336, 0, 4096, 6144, 6400, 6336, 6340, 0, + 4096, 6144, 6400, 6336, 6340, 0, 4096, 6144, + 6400, 6336, 6344, 6342, 0, 4096, 6144, 6400, + 6336, 0, 4096, 6144, 6400, 6336, 6344, 0, + 4096, 6144, 6400, 6336, 6344, 0, 4096, 6144, + 6400, 6336, 6344, 6346, 0, 4096, 6144, 6400, + 6336, 6344, 0, 4096, 6144, 6400, 6336, 6352, + 6348, 0, 4096, 6144, 6400, 6336, 6352, 6348, + 0, 4096, 6144, 6400, 6336, 6352, 6353, 6350, + 0, 4096, 6144, 6400, 6336, 0, 4096, 6144, + 6400, 6336, 6352, 0, 4096, 6144, 6400, 6336, + 6352, 0, 4096, 6144, 6400, 6336, 6352, 6354, + 0, 4096, 6144, 6400, 6336, 6352, 0, 4096, + 6144, 6400, 6336, 6352, 6356, 0, 4096, 6144, + 6400, 6336, 6352, 6356, 0, 4096, 6144, 6400, + 6336, 6352, 6360, 6358, 0, 4096, 6144, 6400, + 6336, 6352, 0, 4096, 6144, 6400, 6336, 6368, + 6360, 0, 4096, 6144, 6400, 6336, 6368, 6360, + 0, 4096, 6144, 6400, 6336, 6368, 6360, 6362, + 0, 4096, 6144, 6400, 6336, 6368, 6360, 0, + 4096, 6144, 6400, 6336, 6368, 6369, 6364, 0, + 4096, 6144, 6400, 6336, 6368, 6369, 6364, 0, + 4096, 6144, 6400, 6336, 6368, 6369, 6364, 6366, + 0, 4096, 6144, 6400, 6336, 0, 4096, 6144, + 6400, 6401, 6368, 0, 4096, 6144, 6400, 6401, + 6368, 0, 4096, 6144, 6400, 6401, 6368, 6370, + 0, 4096, 6144, 6400, 6401, 6368, 0, 4096, + 6144, 6400, 6401, 6368, 6372, 0, 4096, 6144, + 6400, 6401, 6368, 6372, 0, 4096, 6144, 6400, + 6401, 6368, 6376, 6374, 0, 4096, 6144, 6400, + 6401, 6368, 0, 4096, 6144, 6400, 6401, 6368, + 6376, 0, 4096, 6144, 6400, 6401, 6368, 6376, + 0, 4096, 6144, 6400, 6401, 6368, 6376, 6378, + 0, 4096, 6144, 6400, 6401, 6368, 6376, 0, + 4096, 6144, 6400, 6401, 6368, 6384, 6380, 0, + 4096, 6144, 6400, 6401, 6368, 6384, 6380, 0, + 4096, 6144, 6400, 6401, 6368, 6384, 6385, 6382, + 0, 4096, 6144, 6400, 6401, 6368, 0, 4096, + 6144, 6400, 6401, 6368, 6384, 0, 4096, 6144, + 6400, 6401, 6403, 6384, 0, 4096, 6144, 6400, + 6401, 6403, 6384, 6386, 0, 4096, 6144, 6400, + 6401, 6403, 6384, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6388, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6388, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6392, 6390, 0, 4096, 6144, 6400, + 6401, 6403, 6384, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6392, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6392, 0, 4096, 6144, 6400, 6401, + 6403, 6384, 6392, 6394, 0, 4096, 6144, 6400, + 6401, 6403, 6407, 6392, 0, 4096, 6144, 6400, + 6401, 6403, 6407, 6392, 6396, 0, 4096, 6144, + 6400, 6401, 6403, 6407, 6392, 6396, 0, 4096, + 6144, 6400, 6401, 6403, 6407, 6392, 6396, 6398, + 0, 4096, 6144, 0, 4096, 6144, 6400, 0, + 4096, 6144, 6400, 0, 4096, 6144, 6400, 6402, + 0, 4096, 6144, 6400, 0, 4096, 6144, 6400, + 6404, 0, 4096, 6144, 6400, 6404, 0, 4096, + 6144, 6400, 6408, 6406, 0, 4096, 6144, 6400, + 0, 4096, 6144, 6400, 6408, 0, 4096, 6144, + 6400, 6408, 0, 4096, 6144, 6400, 6408, 6410, + 0, 4096, 6144, 6400, 6408, 0, 4096, 6144, + 6400, 6416, 6412, 0, 4096, 6144, 6400, 6416, + 6412, 0, 4096, 6144, 6400, 6416, 6417, 6414, + 0, 4096, 6144, 6400, 0, 4096, 6144, 6400, + 6416, 0, 4096, 6144, 6400, 6416, 0, 4096, + 6144, 6400, 6416, 6418, 0, 4096, 6144, 6400, + 6416, 0, 4096, 6144, 6400, 6416, 6420, 0, + 4096, 6144, 6400, 6416, 6420, 0, 4096, 6144, + 6400, 6416, 6424, 6422, 0, 4096, 6144, 6400, + 6416, 0, 4096, 6144, 6400, 6432, 6424, 0, + 4096, 6144, 6400, 6432, 6424, 0, 4096, 6144, + 6400, 6432, 6424, 6426, 0, 4096, 6144, 6400, + 6432, 6424, 0, 4096, 6144, 6400, 6432, 6433, + 6428, 0, 4096, 6144, 6400, 6432, 6433, 6428, + 0, 4096, 6144, 6400, 6432, 6433, 6428, 6430, + 0, 4096, 6144, 6400, 0, 4096, 6144, 6400, + 6432, 0, 4096, 6144, 6400, 6432, 0, 4096, + 6144, 6400, 6432, 6434, 0, 4096, 6144, 6400, + 6432, 0, 4096, 6144, 6400, 6432, 6436, 0, + 4096, 6144, 6400, 6432, 6436, 0, 4096, 6144, + 6400, 6432, 6440, 6438, 0, 4096, 6144, 6400, + 6432, 0, 4096, 6144, 6400, 6432, 6440, 0, + 4096, 6144, 6400, 6432, 6440, 0, 4096, 6144, + 6400, 6432, 6440, 6442, 0, 4096, 6144, 6400, + 6432, 6440, 0, 4096, 6144, 6400, 6432, 6448, + 6444, 0, 4096, 6144, 6400, 6432, 6448, 6444, + 0, 4096, 6144, 6400, 6432, 6448, 6449, 6446, + 0, 4096, 6144, 6400, 6432, 0, 4096, 6144, + 6400, 6464, 6448, 0, 4096, 6144, 6400, 6464, + 6448, 0, 4096, 6144, 6400, 6464, 6448, 6450, + 0, 4096, 6144, 6400, 6464, 6448, 0, 4096, + 6144, 6400, 6464, 6448, 6452, 0, 4096, 6144, + 6400, 6464, 6448, 6452, 0, 4096, 6144, 6400, + 6464, 6448, 6456, 6454, 0, 4096, 6144, 6400, + 6464, 6448, 0, 4096, 6144, 6400, 6464, 6465, + 6456, 0, 4096, 6144, 6400, 6464, 6465, 6456, + 0, 4096, 6144, 6400, 6464, 6465, 6456, 6458, + 0, 4096, 6144, 6400, 6464, 6465, 6456, 0, + 4096, 6144, 6400, 6464, 6465, 6456, 6460, 0, + 4096, 6144, 6400, 6464, 6465, 6467, 6460, 0, + 4096, 6144, 6400, 6464, 6465, 6467, 6460, 6462, + 0, 4096, 6144, 6400, 0, 4096, 6144, 6400, + 6464, 0, 4096, 6144, 6400, 6464, 0, 4096, + 6144, 6400, 6464, 6466, 0, 4096, 6144, 6400, + 6464, 0, 4096, 6144, 6400, 6464, 6468, 0, + 4096, 6144, 6400, 6464, 6468, 0, 4096, 6144, + 6400, 6464, 6472, 6470, 0, 4096, 6144, 6400, + 6464, 0, 4096, 6144, 6400, 6464, 6472, 0, + 4096, 6144, 6400, 6464, 6472, 0, 4096, 6144, + 6400, 6464, 6472, 6474, 0, 4096, 6144, 6400, + 6464, 6472, 0, 4096, 6144, 6400, 6464, 6480, + 6476, 0, 4096, 6144, 6400, 6464, 6480, 6476, + 0, 4096, 6144, 6400, 6464, 6480, 6481, 6478, + 0, 4096, 6144, 6400, 6464, 0, 4096, 6144, + 6400, 6464, 6480, 0, 4096, 6144, 6400, 6464, + 6480, 0, 4096, 6144, 6400, 6464, 6480, 6482, + 0, 4096, 6144, 6400, 6464, 6480, 0, 4096, + 6144, 6400, 6464, 6480, 6484, 0, 4096, 6144, + 6400, 6464, 6480, 6484, 0, 4096, 6144, 6400, + 6464, 6480, 6488, 6486, 0, 4096, 6144, 6400, + 6464, 6480, 0, 4096, 6144, 6400, 6464, 6496, + 6488, 0, 4096, 6144, 6400, 6464, 6496, 6488, + 0, 4096, 6144, 6400, 6464, 6496, 6488, 6490, + 0, 4096, 6144, 6400, 6464, 6496, 6488, 0, + 4096, 6144, 6400, 6464, 6496, 6497, 6492, 0, + 4096, 6144, 6400, 6464, 6496, 6497, 6492, 0, + 4096, 6144, 6400, 6464, 6496, 6497, 6492, 6494, + 0, 4096, 6144, 6400, 6464, 0, 4096, 6144, + 6400, 6528, 6496, 0, 4096, 6144, 6400, 6528, + 6496, 0, 4096, 6144, 6400, 6528, 6496, 6498, + 0, 4096, 6144, 6400, 6528, 6496, 0, 4096, + 6144, 6400, 6528, 6496, 6500, 0, 4096, 6144, + 6400, 6528, 6496, 6500, 0, 4096, 6144, 6400, + 6528, 6496, 6504, 6502, 0, 4096, 6144, 6400, + 6528, 6496, 0, 4096, 6144, 6400, 6528, 6496, + 6504, 0, 4096, 6144, 6400, 6528, 6496, 6504, + 0, 4096, 6144, 6400, 6528, 6496, 6504, 6506, + 0, 4096, 6144, 6400, 6528, 6496, 6504, 0, + 4096, 6144, 6400, 6528, 6496, 6512, 6508, 0, + 4096, 6144, 6400, 6528, 6496, 6512, 6508, 0, + 4096, 6144, 6400, 6528, 6496, 6512, 6513, 6510, + 0, 4096, 6144, 6400, 6528, 6496, 0, 4096, + 6144, 6400, 6528, 6529, 6512, 0, 4096, 6144, + 6400, 6528, 6529, 6512, 0, 4096, 6144, 6400, + 6528, 6529, 6512, 6514, 0, 4096, 6144, 6400, + 6528, 6529, 6512, 0, 4096, 6144, 6400, 6528, + 6529, 6512, 6516, 0, 4096, 6144, 6400, 6528, + 6529, 6512, 6516, 0, 4096, 6144, 6400, 6528, + 6529, 6512, 6520, 6518, 0, 4096, 6144, 6400, + 6528, 6529, 6512, 0, 4096, 6144, 6400, 6528, + 6529, 6512, 6520, 0, 4096, 6144, 6400, 6528, + 6529, 6531, 6520, 0, 4096, 6144, 6400, 6528, + 6529, 6531, 6520, 6522, 0, 4096, 6144, 6400, + 6528, 6529, 6531, 6520, 0, 4096, 6144, 6400, + 6528, 6529, 6531, 6520, 6524, 0, 4096, 6144, + 6400, 6528, 6529, 6531, 6520, 6524, 0, 4096, + 6144, 6400, 6528, 6529, 6531, 6520, 6524, 6526, + 0, 4096, 6144, 6400, 0, 4096, 6144, 6656, + 6528, 0, 4096, 6144, 6656, 6528, 0, 4096, + 6144, 6656, 6528, 6530, 0, 4096, 6144, 6656, + 6528, 0, 4096, 6144, 6656, 6528, 6532, 0, + 4096, 6144, 6656, 6528, 6532, 0, 4096, 6144, + 6656, 6528, 6536, 6534, 0, 4096, 6144, 6656, + 6528, 0, 4096, 6144, 6656, 6528, 6536, 0, + 4096, 6144, 6656, 6528, 6536, 0, 4096, 6144, + 6656, 6528, 6536, 6538, 0, 4096, 6144, 6656, + 6528, 6536, 0, 4096, 6144, 6656, 6528, 6544, + 6540, 0, 4096, 6144, 6656, 6528, 6544, 6540, + 0, 4096, 6144, 6656, 6528, 6544, 6545, 6542, + 0, 4096, 6144, 6656, 6528, 0, 4096, 6144, + 6656, 6528, 6544, 0, 4096, 6144, 6656, 6528, + 6544, 0, 4096, 6144, 6656, 6528, 6544, 6546, + 0, 4096, 6144, 6656, 6528, 6544, 0, 4096, + 6144, 6656, 6528, 6544, 6548, 0, 4096, 6144, + 6656, 6528, 6544, 6548, 0, 4096, 6144, 6656, + 6528, 6544, 6552, 6550, 0, 4096, 6144, 6656, + 6528, 6544, 0, 4096, 6144, 6656, 6528, 6560, + 6552, 0, 4096, 6144, 6656, 6528, 6560, 6552, + 0, 4096, 6144, 6656, 6528, 6560, 6552, 6554, + 0, 4096, 6144, 6656, 6528, 6560, 6552, 0, + 4096, 6144, 6656, 6528, 6560, 6561, 6556, 0, + 4096, 6144, 6656, 6528, 6560, 6561, 6556, 0, + 4096, 6144, 6656, 6528, 6560, 6561, 6556, 6558, + 0, 4096, 6144, 6656, 6528, 0, 4096, 6144, + 6656, 6528, 6560, 0, 4096, 6144, 6656, 6528, + 6560, 0, 4096, 6144, 6656, 6528, 6560, 6562, + 0, 4096, 6144, 6656, 6528, 6560, 0, 4096, + 6144, 6656, 6528, 6560, 6564, 0, 4096, 6144, + 6656, 6528, 6560, 6564, 0, 4096, 6144, 6656, + 6528, 6560, 6568, 6566, 0, 4096, 6144, 6656, + 6528, 6560, 0, 4096, 6144, 6656, 6528, 6560, + 6568, 0, 4096, 6144, 6656, 6528, 6560, 6568, + 0, 4096, 6144, 6656, 6528, 6560, 6568, 6570, + 0, 4096, 6144, 6656, 6528, 6560, 6568, 0, + 4096, 6144, 6656, 6528, 6560, 6576, 6572, 0, + 4096, 6144, 6656, 6528, 6560, 6576, 6572, 0, + 4096, 6144, 6656, 6528, 6560, 6576, 6577, 6574, + 0, 4096, 6144, 6656, 6528, 6560, 0, 4096, + 6144, 6656, 6528, 6592, 6576, 0, 4096, 6144, + 6656, 6528, 6592, 6576, 0, 4096, 6144, 6656, + 6528, 6592, 6576, 6578, 0, 4096, 6144, 6656, + 6528, 6592, 6576, 0, 4096, 6144, 6656, 6528, + 6592, 6576, 6580, 0, 4096, 6144, 6656, 6528, + 6592, 6576, 6580, 0, 4096, 6144, 6656, 6528, + 6592, 6576, 6584, 6582, 0, 4096, 6144, 6656, + 6528, 6592, 6576, 0, 4096, 6144, 6656, 6528, + 6592, 6593, 6584, 0, 4096, 6144, 6656, 6528, + 6592, 6593, 6584, 0, 4096, 6144, 6656, 6528, + 6592, 6593, 6584, 6586, 0, 4096, 6144, 6656, + 6528, 6592, 6593, 6584, 0, 4096, 6144, 6656, + 6528, 6592, 6593, 6584, 6588, 0, 4096, 6144, + 6656, 6528, 6592, 6593, 6595, 6588, 0, 4096, + 6144, 6656, 6528, 6592, 6593, 6595, 6588, 6590, + 0, 4096, 6144, 6656, 6528, 0, 4096, 6144, + 6656, 6657, 6592, 0, 4096, 6144, 6656, 6657, + 6592, 0, 4096, 6144, 6656, 6657, 6592, 6594, + 0, 4096, 6144, 6656, 6657, 6592, 0, 4096, + 6144, 6656, 6657, 6592, 6596, 0, 4096, 6144, + 6656, 6657, 6592, 6596, 0, 4096, 6144, 6656, + 6657, 6592, 6600, 6598, 0, 4096, 6144, 6656, + 6657, 6592, 0, 4096, 6144, 6656, 6657, 6592, + 6600, 0, 4096, 6144, 6656, 6657, 6592, 6600, + 0, 4096, 6144, 6656, 6657, 6592, 6600, 6602, + 0, 4096, 6144, 6656, 6657, 6592, 6600, 0, + 4096, 6144, 6656, 6657, 6592, 6608, 6604, 0, + 4096, 6144, 6656, 6657, 6592, 6608, 6604, 0, + 4096, 6144, 6656, 6657, 6592, 6608, 6609, 6606, + 0, 4096, 6144, 6656, 6657, 6592, 0, 4096, + 6144, 6656, 6657, 6592, 6608, 0, 4096, 6144, + 6656, 6657, 6592, 6608, 0, 4096, 6144, 6656, + 6657, 6592, 6608, 6610, 0, 4096, 6144, 6656, + 6657, 6592, 6608, 0, 4096, 6144, 6656, 6657, + 6592, 6608, 6612, 0, 4096, 6144, 6656, 6657, + 6592, 6608, 6612, 0, 4096, 6144, 6656, 6657, + 6592, 6608, 6616, 6614, 0, 4096, 6144, 6656, + 6657, 6592, 6608, 0, 4096, 6144, 6656, 6657, + 6592, 6624, 6616, 0, 4096, 6144, 6656, 6657, + 6592, 6624, 6616, 0, 4096, 6144, 6656, 6657, + 6592, 6624, 6616, 6618, 0, 4096, 6144, 6656, + 6657, 6592, 6624, 6616, 0, 4096, 6144, 6656, + 6657, 6592, 6624, 6625, 6620, 0, 4096, 6144, + 6656, 6657, 6592, 6624, 6625, 6620, 0, 4096, + 6144, 6656, 6657, 6592, 6624, 6625, 6620, 6622, + 0, 4096, 6144, 6656, 6657, 6592, 0, 4096, + 6144, 6656, 6657, 6592, 6624, 0, 4096, 6144, + 6656, 6657, 6659, 6624, 0, 4096, 6144, 6656, + 6657, 6659, 6624, 6626, 0, 4096, 6144, 6656, + 6657, 6659, 6624, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6628, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6628, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6632, 6630, 0, 4096, 6144, 6656, + 6657, 6659, 6624, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6632, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6632, 0, 4096, 6144, 6656, 6657, + 6659, 6624, 6632, 6634, 0, 4096, 6144, 6656, + 6657, 6659, 6624, 6632, 0, 4096, 6144, 6656, + 6657, 6659, 6624, 6640, 6636, 0, 4096, 6144, + 6656, 6657, 6659, 6624, 6640, 6636, 0, 4096, + 6144, 6656, 6657, 6659, 6624, 6640, 6641, 6638, + 0, 4096, 6144, 6656, 6657, 6659, 6624, 0, + 4096, 6144, 6656, 6657, 6659, 6624, 6640, 0, + 4096, 6144, 6656, 6657, 6659, 6624, 6640, 0, + 4096, 6144, 6656, 6657, 6659, 6624, 6640, 6642, + 0, 4096, 6144, 6656, 6657, 6659, 6663, 6640, + 0, 4096, 6144, 6656, 6657, 6659, 6663, 6640, + 6644, 0, 4096, 6144, 6656, 6657, 6659, 6663, + 6640, 6644, 0, 4096, 6144, 6656, 6657, 6659, + 6663, 6640, 6648, 6646, 0, 4096, 6144, 6656, + 6657, 6659, 6663, 6640, 0, 4096, 6144, 6656, + 6657, 6659, 6663, 6640, 6648, 0, 4096, 6144, + 6656, 6657, 6659, 6663, 6640, 6648, 0, 4096, + 6144, 6656, 6657, 6659, 6663, 6640, 6648, 6650, + 0, 4096, 6144, 6656, 6657, 6659, 6663, 6640, + 6648, 0, 4096, 6144, 6656, 6657, 6659, 6663, + 6640, 6648, 6652, 0, 4096, 6144, 6656, 6657, + 6659, 6663, 6640, 6648, 6652, 0, 4096, 6144, + 6656, 6657, 6659, 6663, 6640, 6648, 6652, 6654, + 0, 4096, 6144, 0, 4096, 6144, 6656, 0, + 4096, 6144, 6656, 0, 4096, 6144, 6656, 6658, + 0, 4096, 6144, 6656, 0, 4096, 6144, 6656, + 6660, 0, 4096, 6144, 6656, 6660, 0, 4096, + 6144, 6656, 6664, 6662, 0, 4096, 6144, 6656, + 0, 4096, 6144, 6656, 6664, 0, 4096, 6144, + 6656, 6664, 0, 4096, 6144, 6656, 6664, 6666, + 0, 4096, 6144, 6656, 6664, 0, 4096, 6144, + 6656, 6672, 6668, 0, 4096, 6144, 6656, 6672, + 6668, 0, 4096, 6144, 6656, 6672, 6673, 6670, + 0, 4096, 6144, 6656, 0, 4096, 6144, 6656, + 6672, 0, 4096, 6144, 6656, 6672, 0, 4096, + 6144, 6656, 6672, 6674, 0, 4096, 6144, 6656, + 6672, 0, 4096, 6144, 6656, 6672, 6676, 0, + 4096, 6144, 6656, 6672, 6676, 0, 4096, 6144, + 6656, 6672, 6680, 6678, 0, 4096, 6144, 6656, + 6672, 0, 4096, 6144, 6656, 6688, 6680, 0, + 4096, 6144, 6656, 6688, 6680, 0, 4096, 6144, + 6656, 6688, 6680, 6682, 0, 4096, 6144, 6656, + 6688, 6680, 0, 4096, 6144, 6656, 6688, 6689, + 6684, 0, 4096, 6144, 6656, 6688, 6689, 6684, + 0, 4096, 6144, 6656, 6688, 6689, 6684, 6686, + 0, 4096, 6144, 6656, 0, 4096, 6144, 6656, + 6688, 0, 4096, 6144, 6656, 6688, 0, 4096, + 6144, 6656, 6688, 6690, 0, 4096, 6144, 6656, + 6688, 0, 4096, 6144, 6656, 6688, 6692, 0, + 4096, 6144, 6656, 6688, 6692, 0, 4096, 6144, + 6656, 6688, 6696, 6694, 0, 4096, 6144, 6656, + 6688, 0, 4096, 6144, 6656, 6688, 6696, 0, + 4096, 6144, 6656, 6688, 6696, 0, 4096, 6144, + 6656, 6688, 6696, 6698, 0, 4096, 6144, 6656, + 6688, 6696, 0, 4096, 6144, 6656, 6688, 6704, + 6700, 0, 4096, 6144, 6656, 6688, 6704, 6700, + 0, 4096, 6144, 6656, 6688, 6704, 6705, 6702, + 0, 4096, 6144, 6656, 6688, 0, 4096, 6144, + 6656, 6720, 6704, 0, 4096, 6144, 6656, 6720, + 6704, 0, 4096, 6144, 6656, 6720, 6704, 6706, + 0, 4096, 6144, 6656, 6720, 6704, 0, 4096, + 6144, 6656, 6720, 6704, 6708, 0, 4096, 6144, + 6656, 6720, 6704, 6708, 0, 4096, 6144, 6656, + 6720, 6704, 6712, 6710, 0, 4096, 6144, 6656, + 6720, 6704, 0, 4096, 6144, 6656, 6720, 6721, + 6712, 0, 4096, 6144, 6656, 6720, 6721, 6712, + 0, 4096, 6144, 6656, 6720, 6721, 6712, 6714, + 0, 4096, 6144, 6656, 6720, 6721, 6712, 0, + 4096, 6144, 6656, 6720, 6721, 6712, 6716, 0, + 4096, 6144, 6656, 6720, 6721, 6723, 6716, 0, + 4096, 6144, 6656, 6720, 6721, 6723, 6716, 6718, + 0, 4096, 6144, 6656, 0, 4096, 6144, 6656, + 6720, 0, 4096, 6144, 6656, 6720, 0, 4096, + 6144, 6656, 6720, 6722, 0, 4096, 6144, 6656, + 6720, 0, 4096, 6144, 6656, 6720, 6724, 0, + 4096, 6144, 6656, 6720, 6724, 0, 4096, 6144, + 6656, 6720, 6728, 6726, 0, 4096, 6144, 6656, + 6720, 0, 4096, 6144, 6656, 6720, 6728, 0, + 4096, 6144, 6656, 6720, 6728, 0, 4096, 6144, + 6656, 6720, 6728, 6730, 0, 4096, 6144, 6656, + 6720, 6728, 0, 4096, 6144, 6656, 6720, 6736, + 6732, 0, 4096, 6144, 6656, 6720, 6736, 6732, + 0, 4096, 6144, 6656, 6720, 6736, 6737, 6734, + 0, 4096, 6144, 6656, 6720, 0, 4096, 6144, + 6656, 6720, 6736, 0, 4096, 6144, 6656, 6720, + 6736, 0, 4096, 6144, 6656, 6720, 6736, 6738, + 0, 4096, 6144, 6656, 6720, 6736, 0, 4096, + 6144, 6656, 6720, 6736, 6740, 0, 4096, 6144, + 6656, 6720, 6736, 6740, 0, 4096, 6144, 6656, + 6720, 6736, 6744, 6742, 0, 4096, 6144, 6656, + 6720, 6736, 0, 4096, 6144, 6656, 6720, 6752, + 6744, 0, 4096, 6144, 6656, 6720, 6752, 6744, + 0, 4096, 6144, 6656, 6720, 6752, 6744, 6746, + 0, 4096, 6144, 6656, 6720, 6752, 6744, 0, + 4096, 6144, 6656, 6720, 6752, 6753, 6748, 0, + 4096, 6144, 6656, 6720, 6752, 6753, 6748, 0, + 4096, 6144, 6656, 6720, 6752, 6753, 6748, 6750, + 0, 4096, 6144, 6656, 6720, 0, 4096, 6144, + 6656, 6784, 6752, 0, 4096, 6144, 6656, 6784, + 6752, 0, 4096, 6144, 6656, 6784, 6752, 6754, + 0, 4096, 6144, 6656, 6784, 6752, 0, 4096, + 6144, 6656, 6784, 6752, 6756, 0, 4096, 6144, + 6656, 6784, 6752, 6756, 0, 4096, 6144, 6656, + 6784, 6752, 6760, 6758, 0, 4096, 6144, 6656, + 6784, 6752, 0, 4096, 6144, 6656, 6784, 6752, + 6760, 0, 4096, 6144, 6656, 6784, 6752, 6760, + 0, 4096, 6144, 6656, 6784, 6752, 6760, 6762, + 0, 4096, 6144, 6656, 6784, 6752, 6760, 0, + 4096, 6144, 6656, 6784, 6752, 6768, 6764, 0, + 4096, 6144, 6656, 6784, 6752, 6768, 6764, 0, + 4096, 6144, 6656, 6784, 6752, 6768, 6769, 6766, + 0, 4096, 6144, 6656, 6784, 6752, 0, 4096, + 6144, 6656, 6784, 6785, 6768, 0, 4096, 6144, + 6656, 6784, 6785, 6768, 0, 4096, 6144, 6656, + 6784, 6785, 6768, 6770, 0, 4096, 6144, 6656, + 6784, 6785, 6768, 0, 4096, 6144, 6656, 6784, + 6785, 6768, 6772, 0, 4096, 6144, 6656, 6784, + 6785, 6768, 6772, 0, 4096, 6144, 6656, 6784, + 6785, 6768, 6776, 6774, 0, 4096, 6144, 6656, + 6784, 6785, 6768, 0, 4096, 6144, 6656, 6784, + 6785, 6768, 6776, 0, 4096, 6144, 6656, 6784, + 6785, 6787, 6776, 0, 4096, 6144, 6656, 6784, + 6785, 6787, 6776, 6778, 0, 4096, 6144, 6656, + 6784, 6785, 6787, 6776, 0, 4096, 6144, 6656, + 6784, 6785, 6787, 6776, 6780, 0, 4096, 6144, + 6656, 6784, 6785, 6787, 6776, 6780, 0, 4096, + 6144, 6656, 6784, 6785, 6787, 6776, 6780, 6782, + 0, 4096, 6144, 6656, 0, 4096, 6144, 6656, + 6784, 0, 4096, 6144, 6656, 6784, 0, 4096, + 6144, 6656, 6784, 6786, 0, 4096, 6144, 6656, + 6784, 0, 4096, 6144, 6656, 6784, 6788, 0, + 4096, 6144, 6656, 6784, 6788, 0, 4096, 6144, + 6656, 6784, 6792, 6790, 0, 4096, 6144, 6656, + 6784, 0, 4096, 6144, 6656, 6784, 6792, 0, + 4096, 6144, 6656, 6784, 6792, 0, 4096, 6144, + 6656, 6784, 6792, 6794, 0, 4096, 6144, 6656, + 6784, 6792, 0, 4096, 6144, 6656, 6784, 6800, + 6796, 0, 4096, 6144, 6656, 6784, 6800, 6796, + 0, 4096, 6144, 6656, 6784, 6800, 6801, 6798, + 0, 4096, 6144, 6656, 6784, 0, 4096, 6144, + 6656, 6784, 6800, 0, 4096, 6144, 6656, 6784, + 6800, 0, 4096, 6144, 6656, 6784, 6800, 6802, + 0, 4096, 6144, 6656, 6784, 6800, 0, 4096, + 6144, 6656, 6784, 6800, 6804, 0, 4096, 6144, + 6656, 6784, 6800, 6804, 0, 4096, 6144, 6656, + 6784, 6800, 6808, 6806, 0, 4096, 6144, 6656, + 6784, 6800, 0, 4096, 6144, 6656, 6784, 6816, + 6808, 0, 4096, 6144, 6656, 6784, 6816, 6808, + 0, 4096, 6144, 6656, 6784, 6816, 6808, 6810, + 0, 4096, 6144, 6656, 6784, 6816, 6808, 0, + 4096, 6144, 6656, 6784, 6816, 6817, 6812, 0, + 4096, 6144, 6656, 6784, 6816, 6817, 6812, 0, + 4096, 6144, 6656, 6784, 6816, 6817, 6812, 6814, + 0, 4096, 6144, 6656, 6784, 0, 4096, 6144, + 6656, 6784, 6816, 0, 4096, 6144, 6656, 6784, + 6816, 0, 4096, 6144, 6656, 6784, 6816, 6818, + 0, 4096, 6144, 6656, 6784, 6816, 0, 4096, + 6144, 6656, 6784, 6816, 6820, 0, 4096, 6144, + 6656, 6784, 6816, 6820, 0, 4096, 6144, 6656, + 6784, 6816, 6824, 6822, 0, 4096, 6144, 6656, + 6784, 6816, 0, 4096, 6144, 6656, 6784, 6816, + 6824, 0, 4096, 6144, 6656, 6784, 6816, 6824, + 0, 4096, 6144, 6656, 6784, 6816, 6824, 6826, + 0, 4096, 6144, 6656, 6784, 6816, 6824, 0, + 4096, 6144, 6656, 6784, 6816, 6832, 6828, 0, + 4096, 6144, 6656, 6784, 6816, 6832, 6828, 0, + 4096, 6144, 6656, 6784, 6816, 6832, 6833, 6830, + 0, 4096, 6144, 6656, 6784, 6816, 0, 4096, + 6144, 6656, 6784, 6848, 6832, 0, 4096, 6144, + 6656, 6784, 6848, 6832, 0, 4096, 6144, 6656, + 6784, 6848, 6832, 6834, 0, 4096, 6144, 6656, + 6784, 6848, 6832, 0, 4096, 6144, 6656, 6784, + 6848, 6832, 6836, 0, 4096, 6144, 6656, 6784, + 6848, 6832, 6836, 0, 4096, 6144, 6656, 6784, + 6848, 6832, 6840, 6838, 0, 4096, 6144, 6656, + 6784, 6848, 6832, 0, 4096, 6144, 6656, 6784, + 6848, 6849, 6840, 0, 4096, 6144, 6656, 6784, + 6848, 6849, 6840, 0, 4096, 6144, 6656, 6784, + 6848, 6849, 6840, 6842, 0, 4096, 6144, 6656, + 6784, 6848, 6849, 6840, 0, 4096, 6144, 6656, + 6784, 6848, 6849, 6840, 6844, 0, 4096, 6144, + 6656, 6784, 6848, 6849, 6851, 6844, 0, 4096, + 6144, 6656, 6784, 6848, 6849, 6851, 6844, 6846, + 0, 4096, 6144, 6656, 6784, 0, 4096, 6144, + 6656, 6912, 6848, 0, 4096, 6144, 6656, 6912, + 6848, 0, 4096, 6144, 6656, 6912, 6848, 6850, + 0, 4096, 6144, 6656, 6912, 6848, 0, 4096, + 6144, 6656, 6912, 6848, 6852, 0, 4096, 6144, + 6656, 6912, 6848, 6852, 0, 4096, 6144, 6656, + 6912, 6848, 6856, 6854, 0, 4096, 6144, 6656, + 6912, 6848, 0, 4096, 6144, 6656, 6912, 6848, + 6856, 0, 4096, 6144, 6656, 6912, 6848, 6856, + 0, 4096, 6144, 6656, 6912, 6848, 6856, 6858, + 0, 4096, 6144, 6656, 6912, 6848, 6856, 0, + 4096, 6144, 6656, 6912, 6848, 6864, 6860, 0, + 4096, 6144, 6656, 6912, 6848, 6864, 6860, 0, + 4096, 6144, 6656, 6912, 6848, 6864, 6865, 6862, + 0, 4096, 6144, 6656, 6912, 6848, 0, 4096, + 6144, 6656, 6912, 6848, 6864, 0, 4096, 6144, + 6656, 6912, 6848, 6864, 0, 4096, 6144, 6656, + 6912, 6848, 6864, 6866, 0, 4096, 6144, 6656, + 6912, 6848, 6864, 0, 4096, 6144, 6656, 6912, + 6848, 6864, 6868, 0, 4096, 6144, 6656, 6912, + 6848, 6864, 6868, 0, 4096, 6144, 6656, 6912, + 6848, 6864, 6872, 6870, 0, 4096, 6144, 6656, + 6912, 6848, 6864, 0, 4096, 6144, 6656, 6912, + 6848, 6880, 6872, 0, 4096, 6144, 6656, 6912, + 6848, 6880, 6872, 0, 4096, 6144, 6656, 6912, + 6848, 6880, 6872, 6874, 0, 4096, 6144, 6656, + 6912, 6848, 6880, 6872, 0, 4096, 6144, 6656, + 6912, 6848, 6880, 6881, 6876, 0, 4096, 6144, + 6656, 6912, 6848, 6880, 6881, 6876, 0, 4096, + 6144, 6656, 6912, 6848, 6880, 6881, 6876, 6878, + 0, 4096, 6144, 6656, 6912, 6848, 0, 4096, + 6144, 6656, 6912, 6913, 6880, 0, 4096, 6144, + 6656, 6912, 6913, 6880, 0, 4096, 6144, 6656, + 6912, 6913, 6880, 6882, 0, 4096, 6144, 6656, + 6912, 6913, 6880, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6884, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6884, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6888, 6886, 0, 4096, 6144, 6656, + 6912, 6913, 6880, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6888, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6888, 0, 4096, 6144, 6656, 6912, + 6913, 6880, 6888, 6890, 0, 4096, 6144, 6656, + 6912, 6913, 6880, 6888, 0, 4096, 6144, 6656, + 6912, 6913, 6880, 6896, 6892, 0, 4096, 6144, + 6656, 6912, 6913, 6880, 6896, 6892, 0, 4096, + 6144, 6656, 6912, 6913, 6880, 6896, 6897, 6894, + 0, 4096, 6144, 6656, 6912, 6913, 6880, 0, + 4096, 6144, 6656, 6912, 6913, 6880, 6896, 0, + 4096, 6144, 6656, 6912, 6913, 6915, 6896, 0, + 4096, 6144, 6656, 6912, 6913, 6915, 6896, 6898, + 0, 4096, 6144, 6656, 6912, 6913, 6915, 6896, + 0, 4096, 6144, 6656, 6912, 6913, 6915, 6896, + 6900, 0, 4096, 6144, 6656, 6912, 6913, 6915, + 6896, 6900, 0, 4096, 6144, 6656, 6912, 6913, + 6915, 6896, 6904, 6902, 0, 4096, 6144, 6656, + 6912, 6913, 6915, 6896, 0, 4096, 6144, 6656, + 6912, 6913, 6915, 6896, 6904, 0, 4096, 6144, + 6656, 6912, 6913, 6915, 6896, 6904, 0, 4096, + 6144, 6656, 6912, 6913, 6915, 6896, 6904, 6906, + 0, 4096, 6144, 6656, 6912, 6913, 6915, 6919, + 6904, 0, 4096, 6144, 6656, 6912, 6913, 6915, + 6919, 6904, 6908, 0, 4096, 6144, 6656, 6912, + 6913, 6915, 6919, 6904, 6908, 0, 4096, 6144, + 6656, 6912, 6913, 6915, 6919, 6904, 6908, 6910, + 0, 4096, 6144, 6656, 0, 4096, 6144, 7168, + 6912, 0, 4096, 6144, 7168, 6912, 0, 4096, + 6144, 7168, 6912, 6914, 0, 4096, 6144, 7168, + 6912, 0, 4096, 6144, 7168, 6912, 6916, 0, + 4096, 6144, 7168, 6912, 6916, 0, 4096, 6144, + 7168, 6912, 6920, 6918, 0, 4096, 6144, 7168, + 6912, 0, 4096, 6144, 7168, 6912, 6920, 0, + 4096, 6144, 7168, 6912, 6920, 0, 4096, 6144, + 7168, 6912, 6920, 6922, 0, 4096, 6144, 7168, + 6912, 6920, 0, 4096, 6144, 7168, 6912, 6928, + 6924, 0, 4096, 6144, 7168, 6912, 6928, 6924, + 0, 4096, 6144, 7168, 6912, 6928, 6929, 6926, + 0, 4096, 6144, 7168, 6912, 0, 4096, 6144, + 7168, 6912, 6928, 0, 4096, 6144, 7168, 6912, + 6928, 0, 4096, 6144, 7168, 6912, 6928, 6930, + 0, 4096, 6144, 7168, 6912, 6928, 0, 4096, + 6144, 7168, 6912, 6928, 6932, 0, 4096, 6144, + 7168, 6912, 6928, 6932, 0, 4096, 6144, 7168, + 6912, 6928, 6936, 6934, 0, 4096, 6144, 7168, + 6912, 6928, 0, 4096, 6144, 7168, 6912, 6944, + 6936, 0, 4096, 6144, 7168, 6912, 6944, 6936, + 0, 4096, 6144, 7168, 6912, 6944, 6936, 6938, + 0, 4096, 6144, 7168, 6912, 6944, 6936, 0, + 4096, 6144, 7168, 6912, 6944, 6945, 6940, 0, + 4096, 6144, 7168, 6912, 6944, 6945, 6940, 0, + 4096, 6144, 7168, 6912, 6944, 6945, 6940, 6942, + 0, 4096, 6144, 7168, 6912, 0, 4096, 6144, + 7168, 6912, 6944, 0, 4096, 6144, 7168, 6912, + 6944, 0, 4096, 6144, 7168, 6912, 6944, 6946, + 0, 4096, 6144, 7168, 6912, 6944, 0, 4096, + 6144, 7168, 6912, 6944, 6948, 0, 4096, 6144, + 7168, 6912, 6944, 6948, 0, 4096, 6144, 7168, + 6912, 6944, 6952, 6950, 0, 4096, 6144, 7168, + 6912, 6944, 0, 4096, 6144, 7168, 6912, 6944, + 6952, 0, 4096, 6144, 7168, 6912, 6944, 6952, + 0, 4096, 6144, 7168, 6912, 6944, 6952, 6954, + 0, 4096, 6144, 7168, 6912, 6944, 6952, 0, + 4096, 6144, 7168, 6912, 6944, 6960, 6956, 0, + 4096, 6144, 7168, 6912, 6944, 6960, 6956, 0, + 4096, 6144, 7168, 6912, 6944, 6960, 6961, 6958, + 0, 4096, 6144, 7168, 6912, 6944, 0, 4096, + 6144, 7168, 6912, 6976, 6960, 0, 4096, 6144, + 7168, 6912, 6976, 6960, 0, 4096, 6144, 7168, + 6912, 6976, 6960, 6962, 0, 4096, 6144, 7168, + 6912, 6976, 6960, 0, 4096, 6144, 7168, 6912, + 6976, 6960, 6964, 0, 4096, 6144, 7168, 6912, + 6976, 6960, 6964, 0, 4096, 6144, 7168, 6912, + 6976, 6960, 6968, 6966, 0, 4096, 6144, 7168, + 6912, 6976, 6960, 0, 4096, 6144, 7168, 6912, + 6976, 6977, 6968, 0, 4096, 6144, 7168, 6912, + 6976, 6977, 6968, 0, 4096, 6144, 7168, 6912, + 6976, 6977, 6968, 6970, 0, 4096, 6144, 7168, + 6912, 6976, 6977, 6968, 0, 4096, 6144, 7168, + 6912, 6976, 6977, 6968, 6972, 0, 4096, 6144, + 7168, 6912, 6976, 6977, 6979, 6972, 0, 4096, + 6144, 7168, 6912, 6976, 6977, 6979, 6972, 6974, + 0, 4096, 6144, 7168, 6912, 0, 4096, 6144, + 7168, 6912, 6976, 0, 4096, 6144, 7168, 6912, + 6976, 0, 4096, 6144, 7168, 6912, 6976, 6978, + 0, 4096, 6144, 7168, 6912, 6976, 0, 4096, + 6144, 7168, 6912, 6976, 6980, 0, 4096, 6144, + 7168, 6912, 6976, 6980, 0, 4096, 6144, 7168, + 6912, 6976, 6984, 6982, 0, 4096, 6144, 7168, + 6912, 6976, 0, 4096, 6144, 7168, 6912, 6976, + 6984, 0, 4096, 6144, 7168, 6912, 6976, 6984, + 0, 4096, 6144, 7168, 6912, 6976, 6984, 6986, + 0, 4096, 6144, 7168, 6912, 6976, 6984, 0, + 4096, 6144, 7168, 6912, 6976, 6992, 6988, 0, + 4096, 6144, 7168, 6912, 6976, 6992, 6988, 0, + 4096, 6144, 7168, 6912, 6976, 6992, 6993, 6990, + 0, 4096, 6144, 7168, 6912, 6976, 0, 4096, + 6144, 7168, 6912, 6976, 6992, 0, 4096, 6144, + 7168, 6912, 6976, 6992, 0, 4096, 6144, 7168, + 6912, 6976, 6992, 6994, 0, 4096, 6144, 7168, + 6912, 6976, 6992, 0, 4096, 6144, 7168, 6912, + 6976, 6992, 6996, 0, 4096, 6144, 7168, 6912, + 6976, 6992, 6996, 0, 4096, 6144, 7168, 6912, + 6976, 6992, 7000, 6998, 0, 4096, 6144, 7168, + 6912, 6976, 6992, 0, 4096, 6144, 7168, 6912, + 6976, 7008, 7000, 0, 4096, 6144, 7168, 6912, + 6976, 7008, 7000, 0, 4096, 6144, 7168, 6912, + 6976, 7008, 7000, 7002, 0, 4096, 6144, 7168, + 6912, 6976, 7008, 7000, 0, 4096, 6144, 7168, + 6912, 6976, 7008, 7009, 7004, 0, 4096, 6144, + 7168, 6912, 6976, 7008, 7009, 7004, 0, 4096, + 6144, 7168, 6912, 6976, 7008, 7009, 7004, 7006, + 0, 4096, 6144, 7168, 6912, 6976, 0, 4096, + 6144, 7168, 6912, 7040, 7008, 0, 4096, 6144, + 7168, 6912, 7040, 7008, 0, 4096, 6144, 7168, + 6912, 7040, 7008, 7010, 0, 4096, 6144, 7168, + 6912, 7040, 7008, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7012, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7012, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7016, 7014, 0, 4096, 6144, 7168, + 6912, 7040, 7008, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7016, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7016, 0, 4096, 6144, 7168, 6912, + 7040, 7008, 7016, 7018, 0, 4096, 6144, 7168, + 6912, 7040, 7008, 7016, 0, 4096, 6144, 7168, + 6912, 7040, 7008, 7024, 7020, 0, 4096, 6144, + 7168, 6912, 7040, 7008, 7024, 7020, 0, 4096, + 6144, 7168, 6912, 7040, 7008, 7024, 7025, 7022, + 0, 4096, 6144, 7168, 6912, 7040, 7008, 0, + 4096, 6144, 7168, 6912, 7040, 7041, 7024, 0, + 4096, 6144, 7168, 6912, 7040, 7041, 7024, 0, + 4096, 6144, 7168, 6912, 7040, 7041, 7024, 7026, + 0, 4096, 6144, 7168, 6912, 7040, 7041, 7024, + 0, 4096, 6144, 7168, 6912, 7040, 7041, 7024, + 7028, 0, 4096, 6144, 7168, 6912, 7040, 7041, + 7024, 7028, 0, 4096, 6144, 7168, 6912, 7040, + 7041, 7024, 7032, 7030, 0, 4096, 6144, 7168, + 6912, 7040, 7041, 7024, 0, 4096, 6144, 7168, + 6912, 7040, 7041, 7024, 7032, 0, 4096, 6144, + 7168, 6912, 7040, 7041, 7043, 7032, 0, 4096, + 6144, 7168, 6912, 7040, 7041, 7043, 7032, 7034, + 0, 4096, 6144, 7168, 6912, 7040, 7041, 7043, + 7032, 0, 4096, 6144, 7168, 6912, 7040, 7041, + 7043, 7032, 7036, 0, 4096, 6144, 7168, 6912, + 7040, 7041, 7043, 7032, 7036, 0, 4096, 6144, + 7168, 6912, 7040, 7041, 7043, 7032, 7036, 7038, + 0, 4096, 6144, 7168, 6912, 0, 4096, 6144, + 7168, 6912, 7040, 0, 4096, 6144, 7168, 7169, + 7040, 0, 4096, 6144, 7168, 7169, 7040, 7042, + 0, 4096, 6144, 7168, 7169, 7040, 0, 4096, + 6144, 7168, 7169, 7040, 7044, 0, 4096, 6144, + 7168, 7169, 7040, 7044, 0, 4096, 6144, 7168, + 7169, 7040, 7048, 7046, 0, 4096, 6144, 7168, + 7169, 7040, 0, 4096, 6144, 7168, 7169, 7040, + 7048, 0, 4096, 6144, 7168, 7169, 7040, 7048, + 0, 4096, 6144, 7168, 7169, 7040, 7048, 7050, + 0, 4096, 6144, 7168, 7169, 7040, 7048, 0, + 4096, 6144, 7168, 7169, 7040, 7056, 7052, 0, + 4096, 6144, 7168, 7169, 7040, 7056, 7052, 0, + 4096, 6144, 7168, 7169, 7040, 7056, 7057, 7054, + 0, 4096, 6144, 7168, 7169, 7040, 0, 4096, + 6144, 7168, 7169, 7040, 7056, 0, 4096, 6144, + 7168, 7169, 7040, 7056, 0, 4096, 6144, 7168, + 7169, 7040, 7056, 7058, 0, 4096, 6144, 7168, + 7169, 7040, 7056, 0, 4096, 6144, 7168, 7169, + 7040, 7056, 7060, 0, 4096, 6144, 7168, 7169, + 7040, 7056, 7060, 0, 4096, 6144, 7168, 7169, + 7040, 7056, 7064, 7062, 0, 4096, 6144, 7168, + 7169, 7040, 7056, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7064, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7064, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7064, 7066, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 7064, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 7073, 7068, 0, 4096, 6144, + 7168, 7169, 7040, 7072, 7073, 7068, 0, 4096, + 6144, 7168, 7169, 7040, 7072, 7073, 7068, 7070, + 0, 4096, 6144, 7168, 7169, 7040, 0, 4096, + 6144, 7168, 7169, 7040, 7072, 0, 4096, 6144, + 7168, 7169, 7040, 7072, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 7074, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7076, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7076, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7080, 7078, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7080, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7080, 0, 4096, 6144, 7168, 7169, + 7040, 7072, 7080, 7082, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 7080, 0, 4096, 6144, 7168, + 7169, 7040, 7072, 7088, 7084, 0, 4096, 6144, + 7168, 7169, 7040, 7072, 7088, 7084, 0, 4096, + 6144, 7168, 7169, 7040, 7072, 7088, 7089, 7086, + 0, 4096, 6144, 7168, 7169, 7040, 7072, 0, + 4096, 6144, 7168, 7169, 7040, 7104, 7088, 0, + 4096, 6144, 7168, 7169, 7040, 7104, 7088, 0, + 4096, 6144, 7168, 7169, 7040, 7104, 7088, 7090, + 0, 4096, 6144, 7168, 7169, 7040, 7104, 7088, + 0, 4096, 6144, 7168, 7169, 7040, 7104, 7088, + 7092, 0, 4096, 6144, 7168, 7169, 7040, 7104, + 7088, 7092, 0, 4096, 6144, 7168, 7169, 7040, + 7104, 7088, 7096, 7094, 0, 4096, 6144, 7168, + 7169, 7040, 7104, 7088, 0, 4096, 6144, 7168, + 7169, 7040, 7104, 7105, 7096, 0, 4096, 6144, + 7168, 7169, 7040, 7104, 7105, 7096, 0, 4096, + 6144, 7168, 7169, 7040, 7104, 7105, 7096, 7098, + 0, 4096, 6144, 7168, 7169, 7040, 7104, 7105, + 7096, 0, 4096, 6144, 7168, 7169, 7040, 7104, + 7105, 7096, 7100, 0, 4096, 6144, 7168, 7169, + 7040, 7104, 7105, 7107, 7100, 0, 4096, 6144, + 7168, 7169, 7040, 7104, 7105, 7107, 7100, 7102, + 0, 4096, 6144, 7168, 7169, 7040, 0, 4096, + 6144, 7168, 7169, 7040, 7104, 0, 4096, 6144, + 7168, 7169, 7040, 7104, 0, 4096, 6144, 7168, + 7169, 7040, 7104, 7106, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7108, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7108, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7112, 7110, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7112, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7112, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7112, 7114, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 7112, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 7120, 7116, 0, 4096, 6144, + 7168, 7169, 7171, 7104, 7120, 7116, 0, 4096, + 6144, 7168, 7169, 7171, 7104, 7120, 7121, 7118, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7120, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7120, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7120, 7122, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 7120, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 7120, + 7124, 0, 4096, 6144, 7168, 7169, 7171, 7104, + 7120, 7124, 0, 4096, 6144, 7168, 7169, 7171, + 7104, 7120, 7128, 7126, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 7120, 0, 4096, 6144, 7168, + 7169, 7171, 7104, 7136, 7128, 0, 4096, 6144, + 7168, 7169, 7171, 7104, 7136, 7128, 0, 4096, + 6144, 7168, 7169, 7171, 7104, 7136, 7128, 7130, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 7136, + 7128, 0, 4096, 6144, 7168, 7169, 7171, 7104, + 7136, 7137, 7132, 0, 4096, 6144, 7168, 7169, + 7171, 7104, 7136, 7137, 7132, 0, 4096, 6144, + 7168, 7169, 7171, 7104, 7136, 7137, 7132, 7134, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7136, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7136, 0, + 4096, 6144, 7168, 7169, 7171, 7104, 7136, 7138, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 7136, + 0, 4096, 6144, 7168, 7169, 7171, 7104, 7136, + 7140, 0, 4096, 6144, 7168, 7169, 7171, 7104, + 7136, 7140, 0, 4096, 6144, 7168, 7169, 7171, + 7104, 7136, 7144, 7142, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 7144, 0, 4096, 6144, + 7168, 7169, 7171, 7175, 7136, 7144, 0, 4096, + 6144, 7168, 7169, 7171, 7175, 7136, 7144, 7146, + 0, 4096, 6144, 7168, 7169, 7171, 7175, 7136, + 7144, 0, 4096, 6144, 7168, 7169, 7171, 7175, + 7136, 7152, 7148, 0, 4096, 6144, 7168, 7169, + 7171, 7175, 7136, 7152, 7148, 0, 4096, 6144, + 7168, 7169, 7171, 7175, 7136, 7152, 7153, 7150, + 0, 4096, 6144, 7168, 7169, 7171, 7175, 7136, + 0, 4096, 6144, 7168, 7169, 7171, 7175, 7136, + 7152, 0, 4096, 6144, 7168, 7169, 7171, 7175, + 7136, 7152, 0, 4096, 6144, 7168, 7169, 7171, + 7175, 7136, 7152, 7154, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 7152, 0, 4096, 6144, + 7168, 7169, 7171, 7175, 7136, 7152, 7156, 0, + 4096, 6144, 7168, 7169, 7171, 7175, 7136, 7152, + 7156, 0, 4096, 6144, 7168, 7169, 7171, 7175, + 7136, 7152, 7160, 7158, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 7152, 0, 4096, 6144, + 7168, 7169, 7171, 7175, 7136, 7152, 7160, 0, + 4096, 6144, 7168, 7169, 7171, 7175, 7136, 7152, + 7160, 0, 4096, 6144, 7168, 7169, 7171, 7175, + 7136, 7152, 7160, 7162, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 7152, 7160, 0, 4096, + 6144, 7168, 7169, 7171, 7175, 7136, 7152, 7160, + 7164, 0, 4096, 6144, 7168, 7169, 7171, 7175, + 7136, 7152, 7160, 7164, 0, 4096, 6144, 7168, + 7169, 7171, 7175, 7136, 7152, 7160, 7164, 7166, + 0, 4096, 6144, 0, 4096, 6144, 7168, 0, + 4096, 6144, 7168, 0, 4096, 6144, 7168, 7170, + 0, 4096, 6144, 7168, 0, 4096, 6144, 7168, + 7172, 0, 4096, 6144, 7168, 7172, 0, 4096, + 6144, 7168, 7176, 7174, 0, 4096, 6144, 7168, + 0, 4096, 6144, 7168, 7176, 0, 4096, 6144, + 7168, 7176, 0, 4096, 6144, 7168, 7176, 7178, + 0, 4096, 6144, 7168, 7176, 0, 4096, 6144, + 7168, 7184, 7180, 0, 4096, 6144, 7168, 7184, + 7180, 0, 4096, 6144, 7168, 7184, 7185, 7182, + 0, 4096, 6144, 7168, 0, 4096, 6144, 7168, + 7184, 0, 4096, 6144, 7168, 7184, 0, 4096, + 6144, 7168, 7184, 7186, 0, 4096, 6144, 7168, + 7184, 0, 4096, 6144, 7168, 7184, 7188, 0, + 4096, 6144, 7168, 7184, 7188, 0, 4096, 6144, + 7168, 7184, 7192, 7190, 0, 4096, 6144, 7168, + 7184, 0, 4096, 6144, 7168, 7200, 7192, 0, + 4096, 6144, 7168, 7200, 7192, 0, 4096, 6144, + 7168, 7200, 7192, 7194, 0, 4096, 6144, 7168, + 7200, 7192, 0, 4096, 6144, 7168, 7200, 7201, + 7196, 0, 4096, 6144, 7168, 7200, 7201, 7196, + 0, 4096, 6144, 7168, 7200, 7201, 7196, 7198, + 0, 4096, 6144, 7168, 0, 4096, 6144, 7168, + 7200, 0, 4096, 6144, 7168, 7200, 0, 4096, + 6144, 7168, 7200, 7202, 0, 4096, 6144, 7168, + 7200, 0, 4096, 6144, 7168, 7200, 7204, 0, + 4096, 6144, 7168, 7200, 7204, 0, 4096, 6144, + 7168, 7200, 7208, 7206, 0, 4096, 6144, 7168, + 7200, 0, 4096, 6144, 7168, 7200, 7208, 0, + 4096, 6144, 7168, 7200, 7208, 0, 4096, 6144, + 7168, 7200, 7208, 7210, 0, 4096, 6144, 7168, + 7200, 7208, 0, 4096, 6144, 7168, 7200, 7216, + 7212, 0, 4096, 6144, 7168, 7200, 7216, 7212, + 0, 4096, 6144, 7168, 7200, 7216, 7217, 7214, + 0, 4096, 6144, 7168, 7200, 0, 4096, 6144, + 7168, 7232, 7216, 0, 4096, 6144, 7168, 7232, + 7216, 0, 4096, 6144, 7168, 7232, 7216, 7218, + 0, 4096, 6144, 7168, 7232, 7216, 0, 4096, + 6144, 7168, 7232, 7216, 7220, 0, 4096, 6144, + 7168, 7232, 7216, 7220, 0, 4096, 6144, 7168, + 7232, 7216, 7224, 7222, 0, 4096, 6144, 7168, + 7232, 7216, 0, 4096, 6144, 7168, 7232, 7233, + 7224, 0, 4096, 6144, 7168, 7232, 7233, 7224, + 0, 4096, 6144, 7168, 7232, 7233, 7224, 7226, + 0, 4096, 6144, 7168, 7232, 7233, 7224, 0, + 4096, 6144, 7168, 7232, 7233, 7224, 7228, 0, + 4096, 6144, 7168, 7232, 7233, 7235, 7228, 0, + 4096, 6144, 7168, 7232, 7233, 7235, 7228, 7230, + 0, 4096, 6144, 7168, 0, 8192, 6144, 7168, + 7232, 0, 8192, 6144, 7168, 7232, 0, 8192, + 6144, 7168, 7232, 7234, 0, 8192, 6144, 7168, + 7232, 0, 8192, 6144, 7168, 7232, 7236, 0, + 8192, 6144, 7168, 7232, 7236, 0, 8192, 6144, + 7168, 7232, 7240, 7238, 0, 8192, 6144, 7168, + 7232, 0, 8192, 6144, 7168, 7232, 7240, 0, + 8192, 6144, 7168, 7232, 7240, 0, 8192, 6144, + 7168, 7232, 7240, 7242, 0, 8192, 6144, 7168, + 7232, 7240, 0, 8192, 6144, 7168, 7232, 7248, + 7244, 0, 8192, 6144, 7168, 7232, 7248, 7244, + 0, 8192, 6144, 7168, 7232, 7248, 7249, 7246, + 0, 8192, 6144, 7168, 7232, 0, 8192, 6144, + 7168, 7232, 7248, 0, 8192, 6144, 7168, 7232, + 7248, 0, 8192, 6144, 7168, 7232, 7248, 7250, + 0, 8192, 6144, 7168, 7232, 7248, 0, 8192, + 6144, 7168, 7232, 7248, 7252, 0, 8192, 6144, + 7168, 7232, 7248, 7252, 0, 8192, 6144, 7168, + 7232, 7248, 7256, 7254, 0, 8192, 6144, 7168, + 7232, 7248, 0, 8192, 6144, 7168, 7232, 7264, + 7256, 0, 8192, 6144, 7168, 7232, 7264, 7256, + 0, 8192, 6144, 7168, 7232, 7264, 7256, 7258, + 0, 8192, 6144, 7168, 7232, 7264, 7256, 0, + 8192, 6144, 7168, 7232, 7264, 7265, 7260, 0, + 8192, 6144, 7168, 7232, 7264, 7265, 7260, 0, + 8192, 6144, 7168, 7232, 7264, 7265, 7260, 7262, + 0, 8192, 6144, 7168, 7232, 0, 8192, 6144, + 7168, 7296, 7264, 0, 8192, 6144, 7168, 7296, + 7264, 0, 8192, 6144, 7168, 7296, 7264, 7266, + 0, 8192, 6144, 7168, 7296, 7264, 0, 8192, + 6144, 7168, 7296, 7264, 7268, 0, 8192, 6144, + 7168, 7296, 7264, 7268, 0, 8192, 6144, 7168, + 7296, 7264, 7272, 7270, 0, 8192, 6144, 7168, + 7296, 7264, 0, 8192, 6144, 7168, 7296, 7264, + 7272, 0, 8192, 6144, 7168, 7296, 7264, 7272, + 0, 8192, 6144, 7168, 7296, 7264, 7272, 7274, + 0, 8192, 6144, 7168, 7296, 7264, 7272, 0, + 8192, 6144, 7168, 7296, 7264, 7280, 7276, 0, + 8192, 6144, 7168, 7296, 7264, 7280, 7276, 0, + 8192, 6144, 7168, 7296, 7264, 7280, 7281, 7278, + 0, 8192, 6144, 7168, 7296, 7264, 0, 8192, + 6144, 7168, 7296, 7297, 7280, 0, 8192, 6144, + 7168, 7296, 7297, 7280, 0, 8192, 6144, 7168, + 7296, 7297, 7280, 7282, 0, 8192, 6144, 7168, + 7296, 7297, 7280, 0, 8192, 6144, 7168, 7296, + 7297, 7280, 7284, 0, 8192, 6144, 7168, 7296, + 7297, 7280, 7284, 0, 8192, 6144, 7168, 7296, + 7297, 7280, 7288, 7286, 0, 8192, 6144, 7168, + 7296, 7297, 7280, 0, 8192, 6144, 7168, 7296, + 7297, 7280, 7288, 0, 8192, 6144, 7168, 7296, + 7297, 7299, 7288, 0, 8192, 6144, 7168, 7296, + 7297, 7299, 7288, 7290, 0, 8192, 6144, 7168, + 7296, 7297, 7299, 7288, 0, 8192, 6144, 7168, + 7296, 7297, 7299, 7288, 7292, 0, 8192, 6144, + 7168, 7296, 7297, 7299, 7288, 7292, 0, 8192, + 6144, 7168, 7296, 7297, 7299, 7288, 7292, 7294, + 0, 8192, 6144, 7168, 0, 8192, 6144, 7168, + 7296, 0, 8192, 6144, 7168, 7296, 0, 8192, + 6144, 7168, 7296, 7298, 0, 8192, 6144, 7168, + 7296, 0, 8192, 6144, 7168, 7296, 7300, 0, + 8192, 6144, 7168, 7296, 7300, 0, 8192, 6144, + 7168, 7296, 7304, 7302, 0, 8192, 6144, 7168, + 7296, 0, 8192, 6144, 7168, 7296, 7304, 0, + 8192, 6144, 7168, 7296, 7304, 0, 8192, 6144, + 7168, 7296, 7304, 7306, 0, 8192, 6144, 7168, + 7296, 7304, 0, 8192, 6144, 7168, 7296, 7312, + 7308, 0, 8192, 6144, 7168, 7296, 7312, 7308, + 0, 8192, 6144, 7168, 7296, 7312, 7313, 7310, + 0, 8192, 6144, 7168, 7296, 0, 8192, 6144, + 7168, 7296, 7312, 0, 8192, 6144, 7168, 7296, + 7312, 0, 8192, 6144, 7168, 7296, 7312, 7314, + 0, 8192, 6144, 7168, 7296, 7312, 0, 8192, + 6144, 7168, 7296, 7312, 7316, 0, 8192, 6144, + 7168, 7296, 7312, 7316, 0, 8192, 6144, 7168, + 7296, 7312, 7320, 7318, 0, 8192, 6144, 7168, + 7296, 7312, 0, 8192, 6144, 7168, 7296, 7328, + 7320, 0, 8192, 6144, 7168, 7296, 7328, 7320, + 0, 8192, 6144, 7168, 7296, 7328, 7320, 7322, + 0, 8192, 6144, 7168, 7296, 7328, 7320, 0, + 8192, 6144, 7168, 7296, 7328, 7329, 7324, 0, + 8192, 6144, 7168, 7296, 7328, 7329, 7324, 0, + 8192, 6144, 7168, 7296, 7328, 7329, 7324, 7326, + 0, 8192, 6144, 7168, 7296, 0, 8192, 6144, + 7168, 7296, 7328, 0, 8192, 6144, 7168, 7296, + 7328, 0, 8192, 6144, 7168, 7296, 7328, 7330, + 0, 8192, 6144, 7168, 7296, 7328, 0, 8192, + 6144, 7168, 7296, 7328, 7332, 0, 8192, 6144, + 7168, 7296, 7328, 7332, 0, 8192, 6144, 7168, + 7296, 7328, 7336, 7334, 0, 8192, 6144, 7168, + 7296, 7328, 0, 8192, 6144, 7168, 7296, 7328, + 7336, 0, 8192, 6144, 7168, 7296, 7328, 7336, + 0, 8192, 6144, 7168, 7296, 7328, 7336, 7338, + 0, 8192, 6144, 7168, 7296, 7328, 7336, 0, + 8192, 6144, 7168, 7296, 7328, 7344, 7340, 0, + 8192, 6144, 7168, 7296, 7328, 7344, 7340, 0, + 8192, 6144, 7168, 7296, 7328, 7344, 7345, 7342, + 0, 8192, 6144, 7168, 7296, 7328, 0, 8192, + 6144, 7168, 7296, 7360, 7344, 0, 8192, 6144, + 7168, 7296, 7360, 7344, 0, 8192, 6144, 7168, + 7296, 7360, 7344, 7346, 0, 8192, 6144, 7168, + 7296, 7360, 7344, 0, 8192, 6144, 7168, 7296, + 7360, 7344, 7348, 0, 8192, 6144, 7168, 7296, + 7360, 7344, 7348, 0, 8192, 6144, 7168, 7296, + 7360, 7344, 7352, 7350, 0, 8192, 6144, 7168, + 7296, 7360, 7344, 0, 8192, 6144, 7168, 7296, + 7360, 7361, 7352, 0, 8192, 6144, 7168, 7296, + 7360, 7361, 7352, 0, 8192, 6144, 7168, 7296, + 7360, 7361, 7352, 7354, 0, 8192, 6144, 7168, + 7296, 7360, 7361, 7352, 0, 8192, 6144, 7168, + 7296, 7360, 7361, 7352, 7356, 0, 8192, 6144, + 7168, 7296, 7360, 7361, 7363, 7356, 0, 8192, + 6144, 7168, 7296, 7360, 7361, 7363, 7356, 7358, + 0, 8192, 6144, 7168, 7296, 0, 8192, 6144, + 7168, 7424, 7360, 0, 8192, 6144, 7168, 7424, + 7360, 0, 8192, 6144, 7168, 7424, 7360, 7362, + 0, 8192, 6144, 7168, 7424, 7360, 0, 8192, + 6144, 7168, 7424, 7360, 7364, 0, 8192, 6144, + 7168, 7424, 7360, 7364, 0, 8192, 6144, 7168, + 7424, 7360, 7368, 7366, 0, 8192, 6144, 7168, + 7424, 7360, 0, 8192, 6144, 7168, 7424, 7360, + 7368, 0, 8192, 6144, 7168, 7424, 7360, 7368, + 0, 8192, 6144, 7168, 7424, 7360, 7368, 7370, + 0, 8192, 6144, 7168, 7424, 7360, 7368, 0, + 8192, 6144, 7168, 7424, 7360, 7376, 7372, 0, + 8192, 6144, 7168, 7424, 7360, 7376, 7372, 0, + 8192, 6144, 7168, 7424, 7360, 7376, 7377, 7374, + 0, 8192, 6144, 7168, 7424, 7360, 0, 8192, + 6144, 7168, 7424, 7360, 7376, 0, 8192, 6144, + 7168, 7424, 7360, 7376, 0, 8192, 6144, 7168, + 7424, 7360, 7376, 7378, 0, 8192, 6144, 7168, + 7424, 7360, 7376, 0, 8192, 6144, 7168, 7424, + 7360, 7376, 7380, 0, 8192, 6144, 7168, 7424, + 7360, 7376, 7380, 0, 8192, 6144, 7168, 7424, + 7360, 7376, 7384, 7382, 0, 8192, 6144, 7168, + 7424, 7360, 7376, 0, 8192, 6144, 7168, 7424, + 7360, 7392, 7384, 0, 8192, 6144, 7168, 7424, + 7360, 7392, 7384, 0, 8192, 6144, 7168, 7424, + 7360, 7392, 7384, 7386, 0, 8192, 6144, 7168, + 7424, 7360, 7392, 7384, 0, 8192, 6144, 7168, + 7424, 7360, 7392, 7393, 7388, 0, 8192, 6144, + 7168, 7424, 7360, 7392, 7393, 7388, 0, 8192, + 6144, 7168, 7424, 7360, 7392, 7393, 7388, 7390, + 0, 8192, 6144, 7168, 7424, 7360, 0, 8192, + 6144, 7168, 7424, 7425, 7392, 0, 8192, 6144, + 7168, 7424, 7425, 7392, 0, 8192, 6144, 7168, + 7424, 7425, 7392, 7394, 0, 8192, 6144, 7168, + 7424, 7425, 7392, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7396, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7396, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7400, 7398, 0, 8192, 6144, 7168, + 7424, 7425, 7392, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7400, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7400, 0, 8192, 6144, 7168, 7424, + 7425, 7392, 7400, 7402, 0, 8192, 6144, 7168, + 7424, 7425, 7392, 7400, 0, 8192, 6144, 7168, + 7424, 7425, 7392, 7408, 7404, 0, 8192, 6144, + 7168, 7424, 7425, 7392, 7408, 7404, 0, 8192, + 6144, 7168, 7424, 7425, 7392, 7408, 7409, 7406, + 0, 8192, 6144, 7168, 7424, 7425, 7392, 0, + 8192, 6144, 7168, 7424, 7425, 7392, 7408, 0, + 8192, 6144, 7168, 7424, 7425, 7427, 7408, 0, + 8192, 6144, 7168, 7424, 7425, 7427, 7408, 7410, + 0, 8192, 6144, 7168, 7424, 7425, 7427, 7408, + 0, 8192, 6144, 7168, 7424, 7425, 7427, 7408, + 7412, 0, 8192, 6144, 7168, 7424, 7425, 7427, + 7408, 7412, 0, 8192, 6144, 7168, 7424, 7425, + 7427, 7408, 7416, 7414, 0, 8192, 6144, 7168, + 7424, 7425, 7427, 7408, 0, 8192, 6144, 7168, + 7424, 7425, 7427, 7408, 7416, 0, 8192, 6144, + 7168, 7424, 7425, 7427, 7408, 7416, 0, 8192, + 6144, 7168, 7424, 7425, 7427, 7408, 7416, 7418, + 0, 8192, 6144, 7168, 7424, 7425, 7427, 7431, + 7416, 0, 8192, 6144, 7168, 7424, 7425, 7427, + 7431, 7416, 7420, 0, 8192, 6144, 7168, 7424, + 7425, 7427, 7431, 7416, 7420, 0, 8192, 6144, + 7168, 7424, 7425, 7427, 7431, 7416, 7420, 7422, + 0, 8192, 6144, 7168, 0, 8192, 6144, 7168, + 7424, 0, 8192, 8193, 7168, 7424, 0, 8192, + 8193, 7168, 7424, 7426, 0, 8192, 8193, 7168, + 7424, 0, 8192, 8193, 7168, 7424, 7428, 0, + 8192, 8193, 7168, 7424, 7428, 0, 8192, 8193, + 7168, 7424, 7432, 7430, 0, 8192, 8193, 7168, + 7424, 0, 8192, 8193, 7168, 7424, 7432, 0, + 8192, 8193, 7168, 7424, 7432, 0, 8192, 8193, + 7168, 7424, 7432, 7434, 0, 8192, 8193, 7168, + 7424, 7432, 0, 8192, 8193, 7168, 7424, 7440, + 7436, 0, 8192, 8193, 7168, 7424, 7440, 7436, + 0, 8192, 8193, 7168, 7424, 7440, 7441, 7438, + 0, 8192, 8193, 7168, 7424, 0, 8192, 8193, + 7168, 7424, 7440, 0, 8192, 8193, 7168, 7424, + 7440, 0, 8192, 8193, 7168, 7424, 7440, 7442, + 0, 8192, 8193, 7168, 7424, 7440, 0, 8192, + 8193, 7168, 7424, 7440, 7444, 0, 8192, 8193, + 7168, 7424, 7440, 7444, 0, 8192, 8193, 7168, + 7424, 7440, 7448, 7446, 0, 8192, 8193, 7168, + 7424, 7440, 0, 8192, 8193, 7168, 7424, 7456, + 7448, 0, 8192, 8193, 7168, 7424, 7456, 7448, + 0, 8192, 8193, 7168, 7424, 7456, 7448, 7450, + 0, 8192, 8193, 7168, 7424, 7456, 7448, 0, + 8192, 8193, 7168, 7424, 7456, 7457, 7452, 0, + 8192, 8193, 7168, 7424, 7456, 7457, 7452, 0, + 8192, 8193, 7168, 7424, 7456, 7457, 7452, 7454, + 0, 8192, 8193, 7168, 7424, 0, 8192, 8193, + 7168, 7424, 7456, 0, 8192, 8193, 7168, 7424, + 7456, 0, 8192, 8193, 7168, 7424, 7456, 7458, + 0, 8192, 8193, 7168, 7424, 7456, 0, 8192, + 8193, 7168, 7424, 7456, 7460, 0, 8192, 8193, + 7168, 7424, 7456, 7460, 0, 8192, 8193, 7168, + 7424, 7456, 7464, 7462, 0, 8192, 8193, 7168, + 7424, 7456, 0, 8192, 8193, 7168, 7424, 7456, + 7464, 0, 8192, 8193, 7168, 7424, 7456, 7464, + 0, 8192, 8193, 7168, 7424, 7456, 7464, 7466, + 0, 8192, 8193, 7168, 7424, 7456, 7464, 0, + 8192, 8193, 7168, 7424, 7456, 7472, 7468, 0, + 8192, 8193, 7168, 7424, 7456, 7472, 7468, 0, + 8192, 8193, 7168, 7424, 7456, 7472, 7473, 7470, + 0, 8192, 8193, 7168, 7424, 7456, 0, 8192, + 8193, 7168, 7424, 7488, 7472, 0, 8192, 8193, + 7168, 7424, 7488, 7472, 0, 8192, 8193, 7168, + 7424, 7488, 7472, 7474, 0, 8192, 8193, 7168, + 7424, 7488, 7472, 0, 8192, 8193, 7168, 7424, + 7488, 7472, 7476, 0, 8192, 8193, 7168, 7424, + 7488, 7472, 7476, 0, 8192, 8193, 7168, 7424, + 7488, 7472, 7480, 7478, 0, 8192, 8193, 7168, + 7424, 7488, 7472, 0, 8192, 8193, 7168, 7424, + 7488, 7489, 7480, 0, 8192, 8193, 7168, 7424, + 7488, 7489, 7480, 0, 8192, 8193, 7168, 7424, + 7488, 7489, 7480, 7482, 0, 8192, 8193, 7168, + 7424, 7488, 7489, 7480, 0, 8192, 8193, 7168, + 7424, 7488, 7489, 7480, 7484, 0, 8192, 8193, + 7168, 7424, 7488, 7489, 7491, 7484, 0, 8192, + 8193, 7168, 7424, 7488, 7489, 7491, 7484, 7486, + 0, 8192, 8193, 7168, 7424, 0, 8192, 8193, + 7168, 7424, 7488, 0, 8192, 8193, 7168, 7424, + 7488, 0, 8192, 8193, 7168, 7424, 7488, 7490, + 0, 8192, 8193, 7168, 7424, 7488, 0, 8192, + 8193, 7168, 7424, 7488, 7492, 0, 8192, 8193, + 7168, 7424, 7488, 7492, 0, 8192, 8193, 7168, + 7424, 7488, 7496, 7494, 0, 8192, 8193, 7168, + 7424, 7488, 0, 8192, 8193, 7168, 7424, 7488, + 7496, 0, 8192, 8193, 7168, 7424, 7488, 7496, + 0, 8192, 8193, 7168, 7424, 7488, 7496, 7498, + 0, 8192, 8193, 7168, 7424, 7488, 7496, 0, + 8192, 8193, 7168, 7424, 7488, 7504, 7500, 0, + 8192, 8193, 7168, 7424, 7488, 7504, 7500, 0, + 8192, 8193, 7168, 7424, 7488, 7504, 7505, 7502, + 0, 8192, 8193, 7168, 7424, 7488, 0, 8192, + 8193, 7168, 7424, 7488, 7504, 0, 8192, 8193, + 7168, 7424, 7488, 7504, 0, 8192, 8193, 7168, + 7424, 7488, 7504, 7506, 0, 8192, 8193, 7168, + 7424, 7488, 7504, 0, 8192, 8193, 7168, 7424, + 7488, 7504, 7508, 0, 8192, 8193, 7168, 7424, + 7488, 7504, 7508, 0, 8192, 8193, 7168, 7424, + 7488, 7504, 7512, 7510, 0, 8192, 8193, 7168, + 7424, 7488, 7504, 0, 8192, 8193, 7168, 7424, + 7488, 7520, 7512, 0, 8192, 8193, 7168, 7424, + 7488, 7520, 7512, 0, 8192, 8193, 7168, 7424, + 7488, 7520, 7512, 7514, 0, 8192, 8193, 7168, + 7424, 7488, 7520, 7512, 0, 8192, 8193, 7168, + 7424, 7488, 7520, 7521, 7516, 0, 8192, 8193, + 7168, 7424, 7488, 7520, 7521, 7516, 0, 8192, + 8193, 7168, 7424, 7488, 7520, 7521, 7516, 7518, + 0, 8192, 8193, 7168, 7424, 7488, 0, 8192, + 8193, 7168, 7424, 7552, 7520, 0, 8192, 8193, + 7168, 7424, 7552, 7520, 0, 8192, 8193, 7168, + 7424, 7552, 7520, 7522, 0, 8192, 8193, 7168, + 7424, 7552, 7520, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7524, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7524, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7528, 7526, 0, 8192, 8193, 7168, + 7424, 7552, 7520, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7528, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7528, 0, 8192, 8193, 7168, 7424, + 7552, 7520, 7528, 7530, 0, 8192, 8193, 7168, + 7424, 7552, 7520, 7528, 0, 8192, 8193, 7168, + 7424, 7552, 7520, 7536, 7532, 0, 8192, 8193, + 7168, 7424, 7552, 7520, 7536, 7532, 0, 8192, + 8193, 7168, 7424, 7552, 7520, 7536, 7537, 7534, + 0, 8192, 8193, 7168, 7424, 7552, 7520, 0, + 8192, 8193, 7168, 7424, 7552, 7553, 7536, 0, + 8192, 8193, 7168, 7424, 7552, 7553, 7536, 0, + 8192, 8193, 7168, 7424, 7552, 7553, 7536, 7538, + 0, 8192, 8193, 7168, 7424, 7552, 7553, 7536, + 0, 8192, 8193, 7168, 7424, 7552, 7553, 7536, + 7540, 0, 8192, 8193, 7168, 7424, 7552, 7553, + 7536, 7540, 0, 8192, 8193, 7168, 7424, 7552, + 7553, 7536, 7544, 7542, 0, 8192, 8193, 7168, + 7424, 7552, 7553, 7536, 0, 8192, 8193, 7168, + 7424, 7552, 7553, 7536, 7544, 0, 8192, 8193, + 7168, 7424, 7552, 7553, 7555, 7544, 0, 8192, + 8193, 7168, 7424, 7552, 7553, 7555, 7544, 7546, + 0, 8192, 8193, 7168, 7424, 7552, 7553, 7555, + 7544, 0, 8192, 8193, 7168, 7424, 7552, 7553, + 7555, 7544, 7548, 0, 8192, 8193, 7168, 7424, + 7552, 7553, 7555, 7544, 7548, 0, 8192, 8193, + 7168, 7424, 7552, 7553, 7555, 7544, 7548, 7550, + 0, 8192, 8193, 7168, 7424, 0, 8192, 8193, + 7168, 7680, 7552, 0, 8192, 8193, 7168, 7680, + 7552, 0, 8192, 8193, 7168, 7680, 7552, 7554, + 0, 8192, 8193, 7168, 7680, 7552, 0, 8192, + 8193, 7168, 7680, 7552, 7556, 0, 8192, 8193, + 7168, 7680, 7552, 7556, 0, 8192, 8193, 7168, + 7680, 7552, 7560, 7558, 0, 8192, 8193, 7168, + 7680, 7552, 0, 8192, 8193, 7168, 7680, 7552, + 7560, 0, 8192, 8193, 7168, 7680, 7552, 7560, + 0, 8192, 8193, 7168, 7680, 7552, 7560, 7562, + 0, 8192, 8193, 7168, 7680, 7552, 7560, 0, + 8192, 8193, 7168, 7680, 7552, 7568, 7564, 0, + 8192, 8193, 7168, 7680, 7552, 7568, 7564, 0, + 8192, 8193, 7168, 7680, 7552, 7568, 7569, 7566, + 0, 8192, 8193, 7168, 7680, 7552, 0, 8192, + 8193, 7168, 7680, 7552, 7568, 0, 8192, 8193, + 7168, 7680, 7552, 7568, 0, 8192, 8193, 7168, + 7680, 7552, 7568, 7570, 0, 8192, 8193, 7168, + 7680, 7552, 7568, 0, 8192, 8193, 7168, 7680, + 7552, 7568, 7572, 0, 8192, 8193, 7168, 7680, + 7552, 7568, 7572, 0, 8192, 8193, 7168, 7680, + 7552, 7568, 7576, 7574, 0, 8192, 8193, 7168, + 7680, 7552, 7568, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7576, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7576, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7576, 7578, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 7576, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 7585, 7580, 0, 8192, 8193, + 7168, 7680, 7552, 7584, 7585, 7580, 0, 8192, + 8193, 7168, 7680, 7552, 7584, 7585, 7580, 7582, + 0, 8192, 8193, 7168, 7680, 7552, 0, 8192, + 8193, 7168, 7680, 7552, 7584, 0, 8192, 8193, + 7168, 7680, 7552, 7584, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 7586, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7588, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7588, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7592, 7590, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7592, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7592, 0, 8192, 8193, 7168, 7680, + 7552, 7584, 7592, 7594, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 7592, 0, 8192, 8193, 7168, + 7680, 7552, 7584, 7600, 7596, 0, 8192, 8193, + 7168, 7680, 7552, 7584, 7600, 7596, 0, 8192, + 8193, 7168, 7680, 7552, 7584, 7600, 7601, 7598, + 0, 8192, 8193, 7168, 7680, 7552, 7584, 0, + 8192, 8193, 7168, 7680, 7552, 7616, 7600, 0, + 8192, 8193, 7168, 7680, 7552, 7616, 7600, 0, + 8192, 8193, 7168, 7680, 7552, 7616, 7600, 7602, + 0, 8192, 8193, 7168, 7680, 7552, 7616, 7600, + 0, 8192, 8193, 7168, 7680, 7552, 7616, 7600, + 7604, 0, 8192, 8193, 7168, 7680, 7552, 7616, + 7600, 7604, 0, 8192, 8193, 7168, 7680, 7552, + 7616, 7600, 7608, 7606, 0, 8192, 8193, 7168, + 7680, 7552, 7616, 7600, 0, 8192, 8193, 7168, + 7680, 7552, 7616, 7617, 7608, 0, 8192, 8193, + 7168, 7680, 7552, 7616, 7617, 7608, 0, 8192, + 8193, 7168, 7680, 7552, 7616, 7617, 7608, 7610, + 0, 8192, 8193, 7168, 7680, 7552, 7616, 7617, + 7608, 0, 8192, 8193, 7168, 7680, 7552, 7616, + 7617, 7608, 7612, 0, 8192, 8193, 7168, 7680, + 7552, 7616, 7617, 7619, 7612, 0, 8192, 8193, + 7168, 7680, 7552, 7616, 7617, 7619, 7612, 7614, + 0, 8192, 8193, 7168, 7680, 7552, 0, 8192, + 8193, 7168, 7680, 7681, 7616, 0, 8192, 8193, + 7168, 7680, 7681, 7616, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 7618, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7620, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7620, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7624, 7622, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7624, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7624, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7624, 7626, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 7624, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 7632, 7628, 0, 8192, 8193, + 7168, 7680, 7681, 7616, 7632, 7628, 0, 8192, + 8193, 7168, 7680, 7681, 7616, 7632, 7633, 7630, + 0, 8192, 8193, 7168, 7680, 7681, 7616, 0, + 8192, 8193, 7168, 7680, 7681, 7616, 7632, 0, + 8192, 8193, 7168, 7680, 7681, 7616, 7632, 0, + 8192, 8193, 7168, 7680, 7681, 7616, 7632, 7634, + 0, 8192, 8193, 7168, 7680, 7681, 7616, 7632, + 0, 8192, 8193, 7168, 7680, 7681, 7616, 7632, + 7636, 0, 8192, 8193, 7168, 7680, 7681, 7616, + 7632, 7636, 0, 8192, 8193, 7168, 7680, 7681, + 7616, 7632, 7640, 7638, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 7632, 0, 8192, 8193, 7168, + 7680, 7681, 7616, 7648, 7640, 0, 8192, 8193, + 7168, 7680, 7681, 7616, 7648, 7640, 0, 8192, + 8193, 7168, 7680, 7681, 7616, 7648, 7640, 7642, + 0, 8192, 8193, 7168, 7680, 7681, 7616, 7648, + 7640, 0, 8192, 8193, 7168, 7680, 7681, 7616, + 7648, 7649, 7644, 0, 8192, 8193, 7168, 7680, + 7681, 7616, 7648, 7649, 7644, 0, 8192, 8193, + 7168, 7680, 7681, 7616, 7648, 7649, 7644, 7646, + 0, 8192, 8193, 7168, 7680, 7681, 7616, 0, + 8192, 8193, 7168, 7680, 7681, 7616, 7648, 0, + 8192, 8193, 7168, 7680, 7681, 7683, 7648, 0, + 8192, 8193, 7168, 7680, 7681, 7683, 7648, 7650, + 0, 8192, 8193, 7168, 7680, 7681, 7683, 7648, + 0, 8192, 8193, 7168, 7680, 7681, 7683, 7648, + 7652, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7648, 7652, 0, 8192, 8193, 7168, 7680, 7681, + 7683, 7648, 7656, 7654, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7648, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7648, 7656, 0, 8192, 8193, + 7168, 7680, 7681, 7683, 7648, 7656, 0, 8192, + 8193, 7168, 7680, 7681, 7683, 7648, 7656, 7658, + 0, 8192, 8193, 7168, 7680, 7681, 7683, 7648, + 7656, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7648, 7664, 7660, 0, 8192, 8193, 7168, 7680, + 7681, 7683, 7648, 7664, 7660, 0, 8192, 8193, + 7168, 7680, 7681, 7683, 7648, 7664, 7665, 7662, + 0, 8192, 8193, 7168, 7680, 7681, 7683, 7648, + 0, 8192, 8193, 7168, 7680, 7681, 7683, 7648, + 7664, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7648, 7664, 0, 8192, 8193, 7168, 7680, 7681, + 7683, 7648, 7664, 7666, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7687, 7664, 0, 8192, 8193, + 7168, 7680, 7681, 7683, 7687, 7664, 7668, 0, + 8192, 8193, 7168, 7680, 7681, 7683, 7687, 7664, + 7668, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7687, 7664, 7672, 7670, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7687, 7664, 0, 8192, 8193, + 7168, 7680, 7681, 7683, 7687, 7664, 7672, 0, + 8192, 8193, 7168, 7680, 7681, 7683, 7687, 7664, + 7672, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7687, 7664, 7672, 7674, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7687, 7664, 7672, 0, 8192, + 8193, 7168, 7680, 7681, 7683, 7687, 7664, 7672, + 7676, 0, 8192, 8193, 7168, 7680, 7681, 7683, + 7687, 7664, 7672, 7676, 0, 8192, 8193, 7168, + 7680, 7681, 7683, 7687, 7664, 7672, 7676, 7678, + 0, 8192, 8193, 7168, 0, 8192, 8193, 7168, + 7680, 0, 8192, 8193, 7168, 7680, 0, 8192, + 8193, 7168, 7680, 7682, 0, 8192, 8193, 8195, + 7680, 0, 8192, 8193, 8195, 7680, 7684, 0, + 8192, 8193, 8195, 7680, 7684, 0, 8192, 8193, + 8195, 7680, 7688, 7686, 0, 8192, 8193, 8195, + 7680, 0, 8192, 8193, 8195, 7680, 7688, 0, + 8192, 8193, 8195, 7680, 7688, 0, 8192, 8193, + 8195, 7680, 7688, 7690, 0, 8192, 8193, 8195, + 7680, 7688, 0, 8192, 8193, 8195, 7680, 7696, + 7692, 0, 8192, 8193, 8195, 7680, 7696, 7692, + 0, 8192, 8193, 8195, 7680, 7696, 7697, 7694, + 0, 8192, 8193, 8195, 7680, 0, 8192, 8193, + 8195, 7680, 7696, 0, 8192, 8193, 8195, 7680, + 7696, 0, 8192, 8193, 8195, 7680, 7696, 7698, + 0, 8192, 8193, 8195, 7680, 7696, 0, 8192, + 8193, 8195, 7680, 7696, 7700, 0, 8192, 8193, + 8195, 7680, 7696, 7700, 0, 8192, 8193, 8195, + 7680, 7696, 7704, 7702, 0, 8192, 8193, 8195, + 7680, 7696, 0, 8192, 8193, 8195, 7680, 7712, + 7704, 0, 8192, 8193, 8195, 7680, 7712, 7704, + 0, 8192, 8193, 8195, 7680, 7712, 7704, 7706, + 0, 8192, 8193, 8195, 7680, 7712, 7704, 0, + 8192, 8193, 8195, 7680, 7712, 7713, 7708, 0, + 8192, 8193, 8195, 7680, 7712, 7713, 7708, 0, + 8192, 8193, 8195, 7680, 7712, 7713, 7708, 7710, + 0, 8192, 8193, 8195, 7680, 0, 8192, 8193, + 8195, 7680, 7712, 0, 8192, 8193, 8195, 7680, + 7712, 0, 8192, 8193, 8195, 7680, 7712, 7714, + 0, 8192, 8193, 8195, 7680, 7712, 0, 8192, + 8193, 8195, 7680, 7712, 7716, 0, 8192, 8193, + 8195, 7680, 7712, 7716, 0, 8192, 8193, 8195, + 7680, 7712, 7720, 7718, 0, 8192, 8193, 8195, + 7680, 7712, 0, 8192, 8193, 8195, 7680, 7712, + 7720, 0, 8192, 8193, 8195, 7680, 7712, 7720, + 0, 8192, 8193, 8195, 7680, 7712, 7720, 7722, + 0, 8192, 8193, 8195, 7680, 7712, 7720, 0, + 8192, 8193, 8195, 7680, 7712, 7728, 7724, 0, + 8192, 8193, 8195, 7680, 7712, 7728, 7724, 0, + 8192, 8193, 8195, 7680, 7712, 7728, 7729, 7726, + 0, 8192, 8193, 8195, 7680, 7712, 0, 8192, + 8193, 8195, 7680, 7744, 7728, 0, 8192, 8193, + 8195, 7680, 7744, 7728, 0, 8192, 8193, 8195, + 7680, 7744, 7728, 7730, 0, 8192, 8193, 8195, + 7680, 7744, 7728, 0, 8192, 8193, 8195, 7680, + 7744, 7728, 7732, 0, 8192, 8193, 8195, 7680, + 7744, 7728, 7732, 0, 8192, 8193, 8195, 7680, + 7744, 7728, 7736, 7734, 0, 8192, 8193, 8195, + 7680, 7744, 7728, 0, 8192, 8193, 8195, 7680, + 7744, 7745, 7736, 0, 8192, 8193, 8195, 7680, + 7744, 7745, 7736, 0, 8192, 8193, 8195, 7680, + 7744, 7745, 7736, 7738, 0, 8192, 8193, 8195, + 7680, 7744, 7745, 7736, 0, 8192, 8193, 8195, + 7680, 7744, 7745, 7736, 7740, 0, 8192, 8193, + 8195, 7680, 7744, 7745, 7747, 7740, 0, 8192, + 8193, 8195, 7680, 7744, 7745, 7747, 7740, 7742, + 0, 8192, 8193, 8195, 7680, 0, 8192, 8193, + 8195, 7680, 7744, 0, 8192, 8193, 8195, 7680, + 7744, 0, 8192, 8193, 8195, 7680, 7744, 7746, + 0, 8192, 8193, 8195, 7680, 7744, 0, 8192, + 8193, 8195, 7680, 7744, 7748, 0, 8192, 8193, + 8195, 7680, 7744, 7748, 0, 8192, 8193, 8195, + 7680, 7744, 7752, 7750, 0, 8192, 8193, 8195, + 7680, 7744, 0, 8192, 8193, 8195, 7680, 7744, + 7752, 0, 8192, 8193, 8195, 7680, 7744, 7752, + 0, 8192, 8193, 8195, 7680, 7744, 7752, 7754, + 0, 8192, 8193, 8195, 7680, 7744, 7752, 0, + 8192, 8193, 8195, 7680, 7744, 7760, 7756, 0, + 8192, 8193, 8195, 7680, 7744, 7760, 7756, 0, + 8192, 8193, 8195, 7680, 7744, 7760, 7761, 7758, + 0, 8192, 8193, 8195, 7680, 7744, 0, 8192, + 8193, 8195, 7680, 7744, 7760, 0, 8192, 8193, + 8195, 7680, 7744, 7760, 0, 8192, 8193, 8195, + 7680, 7744, 7760, 7762, 0, 8192, 8193, 8195, + 7680, 7744, 7760, 0, 8192, 8193, 8195, 7680, + 7744, 7760, 7764, 0, 8192, 8193, 8195, 7680, + 7744, 7760, 7764, 0, 8192, 8193, 8195, 7680, + 7744, 7760, 7768, 7766, 0, 8192, 8193, 8195, + 7680, 7744, 7760, 0, 8192, 8193, 8195, 7680, + 7744, 7776, 7768, 0, 8192, 8193, 8195, 7680, + 7744, 7776, 7768, 0, 8192, 8193, 8195, 7680, + 7744, 7776, 7768, 7770, 0, 8192, 8193, 8195, + 7680, 7744, 7776, 7768, 0, 8192, 8193, 8195, + 7680, 7744, 7776, 7777, 7772, 0, 8192, 8193, + 8195, 7680, 7744, 7776, 7777, 7772, 0, 8192, + 8193, 8195, 7680, 7744, 7776, 7777, 7772, 7774, + 0, 8192, 8193, 8195, 7680, 7744, 0, 8192, + 8193, 8195, 7680, 7808, 7776, 0, 8192, 8193, + 8195, 7680, 7808, 7776, 0, 8192, 8193, 8195, + 7680, 7808, 7776, 7778, 0, 8192, 8193, 8195, + 7680, 7808, 7776, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7780, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7780, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7784, 7782, 0, 8192, 8193, 8195, + 7680, 7808, 7776, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7784, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7784, 0, 8192, 8193, 8195, 7680, + 7808, 7776, 7784, 7786, 0, 8192, 8193, 8195, + 7680, 7808, 7776, 7784, 0, 8192, 8193, 8195, + 7680, 7808, 7776, 7792, 7788, 0, 8192, 8193, + 8195, 7680, 7808, 7776, 7792, 7788, 0, 8192, + 8193, 8195, 7680, 7808, 7776, 7792, 7793, 7790, + 0, 8192, 8193, 8195, 7680, 7808, 7776, 0, + 8192, 8193, 8195, 7680, 7808, 7809, 7792, 0, + 8192, 8193, 8195, 7680, 7808, 7809, 7792, 0, + 8192, 8193, 8195, 7680, 7808, 7809, 7792, 7794, + 0, 8192, 8193, 8195, 7680, 7808, 7809, 7792, + 0, 8192, 8193, 8195, 7680, 7808, 7809, 7792, + 7796, 0, 8192, 8193, 8195, 7680, 7808, 7809, + 7792, 7796, 0, 8192, 8193, 8195, 7680, 7808, + 7809, 7792, 7800, 7798, 0, 8192, 8193, 8195, + 7680, 7808, 7809, 7792, 0, 8192, 8193, 8195, + 7680, 7808, 7809, 7792, 7800, 0, 8192, 8193, + 8195, 7680, 7808, 7809, 7811, 7800, 0, 8192, + 8193, 8195, 7680, 7808, 7809, 7811, 7800, 7802, + 0, 8192, 8193, 8195, 7680, 7808, 7809, 7811, + 7800, 0, 8192, 8193, 8195, 7680, 7808, 7809, + 7811, 7800, 7804, 0, 8192, 8193, 8195, 7680, + 7808, 7809, 7811, 7800, 7804, 0, 8192, 8193, + 8195, 7680, 7808, 7809, 7811, 7800, 7804, 7806, + 0, 8192, 8193, 8195, 7680, 0, 8192, 8193, + 8195, 7680, 7808, 0, 8192, 8193, 8195, 7680, + 7808, 0, 8192, 8193, 8195, 7680, 7808, 7810, + 0, 8192, 8193, 8195, 7680, 7808, 0, 8192, + 8193, 8195, 7680, 7808, 7812, 0, 8192, 8193, + 8195, 7680, 7808, 7812, 0, 8192, 8193, 8195, + 7680, 7808, 7816, 7814, 0, 8192, 8193, 8195, + 7680, 7808, 0, 8192, 8193, 8195, 7680, 7808, + 7816, 0, 8192, 8193, 8195, 7680, 7808, 7816, + 0, 8192, 8193, 8195, 7680, 7808, 7816, 7818, + 0, 8192, 8193, 8195, 7680, 7808, 7816, 0, + 8192, 8193, 8195, 7680, 7808, 7824, 7820, 0, + 8192, 8193, 8195, 7680, 7808, 7824, 7820, 0, + 8192, 8193, 8195, 7680, 7808, 7824, 7825, 7822, + 0, 8192, 8193, 8195, 7680, 7808, 0, 8192, + 8193, 8195, 7680, 7808, 7824, 0, 8192, 8193, + 8195, 7680, 7808, 7824, 0, 8192, 8193, 8195, + 7680, 7808, 7824, 7826, 0, 8192, 8193, 8195, + 7680, 7808, 7824, 0, 8192, 8193, 8195, 7680, + 7808, 7824, 7828, 0, 8192, 8193, 8195, 7680, + 7808, 7824, 7828, 0, 8192, 8193, 8195, 7680, + 7808, 7824, 7832, 7830, 0, 8192, 8193, 8195, + 7680, 7808, 7824, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7832, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7832, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7832, 7834, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 7832, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 7841, 7836, 0, 8192, 8193, + 8195, 7680, 7808, 7840, 7841, 7836, 0, 8192, + 8193, 8195, 7680, 7808, 7840, 7841, 7836, 7838, + 0, 8192, 8193, 8195, 7680, 7808, 0, 8192, + 8193, 8195, 7680, 7808, 7840, 0, 8192, 8193, + 8195, 7680, 7808, 7840, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 7842, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7844, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7844, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7848, 7846, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7848, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7848, 0, 8192, 8193, 8195, 7680, + 7808, 7840, 7848, 7850, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 7848, 0, 8192, 8193, 8195, + 7680, 7808, 7840, 7856, 7852, 0, 8192, 8193, + 8195, 7680, 7808, 7840, 7856, 7852, 0, 8192, + 8193, 8195, 7680, 7808, 7840, 7856, 7857, 7854, + 0, 8192, 8193, 8195, 7680, 7808, 7840, 0, + 8192, 8193, 8195, 7680, 7808, 7872, 7856, 0, + 8192, 8193, 8195, 7680, 7808, 7872, 7856, 0, + 8192, 8193, 8195, 7680, 7808, 7872, 7856, 7858, + 0, 8192, 8193, 8195, 7680, 7808, 7872, 7856, + 0, 8192, 8193, 8195, 7680, 7808, 7872, 7856, + 7860, 0, 8192, 8193, 8195, 7680, 7808, 7872, + 7856, 7860, 0, 8192, 8193, 8195, 7680, 7808, + 7872, 7856, 7864, 7862, 0, 8192, 8193, 8195, + 7680, 7808, 7872, 7856, 0, 8192, 8193, 8195, + 7680, 7808, 7872, 7873, 7864, 0, 8192, 8193, + 8195, 7680, 7808, 7872, 7873, 7864, 0, 8192, + 8193, 8195, 7680, 7808, 7872, 7873, 7864, 7866, + 0, 8192, 8193, 8195, 7680, 7808, 7872, 7873, + 7864, 0, 8192, 8193, 8195, 7680, 7808, 7872, + 7873, 7864, 7868, 0, 8192, 8193, 8195, 7680, + 7808, 7872, 7873, 7875, 7868, 0, 8192, 8193, + 8195, 7680, 7808, 7872, 7873, 7875, 7868, 7870, + 0, 8192, 8193, 8195, 7680, 7808, 0, 8192, + 8193, 8195, 7680, 7936, 7872, 0, 8192, 8193, + 8195, 7680, 7936, 7872, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 7874, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7876, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7876, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7880, 7878, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7880, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7880, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7880, 7882, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 7880, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 7888, 7884, 0, 8192, 8193, + 8195, 7680, 7936, 7872, 7888, 7884, 0, 8192, + 8193, 8195, 7680, 7936, 7872, 7888, 7889, 7886, + 0, 8192, 8193, 8195, 7680, 7936, 7872, 0, + 8192, 8193, 8195, 7680, 7936, 7872, 7888, 0, + 8192, 8193, 8195, 7680, 7936, 7872, 7888, 0, + 8192, 8193, 8195, 7680, 7936, 7872, 7888, 7890, + 0, 8192, 8193, 8195, 7680, 7936, 7872, 7888, + 0, 8192, 8193, 8195, 7680, 7936, 7872, 7888, + 7892, 0, 8192, 8193, 8195, 7680, 7936, 7872, + 7888, 7892, 0, 8192, 8193, 8195, 7680, 7936, + 7872, 7888, 7896, 7894, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 7888, 0, 8192, 8193, 8195, + 7680, 7936, 7872, 7904, 7896, 0, 8192, 8193, + 8195, 7680, 7936, 7872, 7904, 7896, 0, 8192, + 8193, 8195, 7680, 7936, 7872, 7904, 7896, 7898, + 0, 8192, 8193, 8195, 7680, 7936, 7872, 7904, + 7896, 0, 8192, 8193, 8195, 7680, 7936, 7872, + 7904, 7905, 7900, 0, 8192, 8193, 8195, 7680, + 7936, 7872, 7904, 7905, 7900, 0, 8192, 8193, + 8195, 7680, 7936, 7872, 7904, 7905, 7900, 7902, + 0, 8192, 8193, 8195, 7680, 7936, 7872, 0, + 8192, 8193, 8195, 7680, 7936, 7937, 7904, 0, + 8192, 8193, 8195, 7680, 7936, 7937, 7904, 0, + 8192, 8193, 8195, 7680, 7936, 7937, 7904, 7906, + 0, 8192, 8193, 8195, 7680, 7936, 7937, 7904, + 0, 8192, 8193, 8195, 7680, 7936, 7937, 7904, + 7908, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7904, 7908, 0, 8192, 8193, 8195, 7680, 7936, + 7937, 7904, 7912, 7910, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7904, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7904, 7912, 0, 8192, 8193, + 8195, 7680, 7936, 7937, 7904, 7912, 0, 8192, + 8193, 8195, 7680, 7936, 7937, 7904, 7912, 7914, + 0, 8192, 8193, 8195, 7680, 7936, 7937, 7904, + 7912, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7904, 7920, 7916, 0, 8192, 8193, 8195, 7680, + 7936, 7937, 7904, 7920, 7916, 0, 8192, 8193, + 8195, 7680, 7936, 7937, 7904, 7920, 7921, 7918, + 0, 8192, 8193, 8195, 7680, 7936, 7937, 7904, + 0, 8192, 8193, 8195, 7680, 7936, 7937, 7904, + 7920, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7939, 7920, 0, 8192, 8193, 8195, 7680, 7936, + 7937, 7939, 7920, 7922, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7939, 7920, 0, 8192, 8193, + 8195, 7680, 7936, 7937, 7939, 7920, 7924, 0, + 8192, 8193, 8195, 7680, 7936, 7937, 7939, 7920, + 7924, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7939, 7920, 7928, 7926, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7939, 7920, 0, 8192, 8193, + 8195, 7680, 7936, 7937, 7939, 7920, 7928, 0, + 8192, 8193, 8195, 7680, 7936, 7937, 7939, 7920, + 7928, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7939, 7920, 7928, 7930, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7939, 7943, 7928, 0, 8192, + 8193, 8195, 7680, 7936, 7937, 7939, 7943, 7928, + 7932, 0, 8192, 8193, 8195, 7680, 7936, 7937, + 7939, 7943, 7928, 7932, 0, 8192, 8193, 8195, + 7680, 7936, 7937, 7939, 7943, 7928, 7932, 7934, + 0, 8192, 8193, 8195, 7680, 0, 8192, 8193, + 8195, 7680, 7936, 0, 8192, 8193, 8195, 7680, + 7936, 0, 8192, 8193, 8195, 7680, 7936, 7938, + 0, 8192, 8193, 8195, 7680, 7936, 0, 8192, + 8193, 8195, 7680, 7936, 7940, 0, 8192, 8193, + 8195, 7680, 7936, 7940, 0, 8192, 8193, 8195, + 7680, 7936, 7944, 7942, 0, 8192, 8193, 8195, + 8199, 7936, 0, 8192, 8193, 8195, 8199, 7936, + 7944, 0, 8192, 8193, 8195, 8199, 7936, 7944, + 0, 8192, 8193, 8195, 8199, 7936, 7944, 7946, + 0, 8192, 8193, 8195, 8199, 7936, 7944, 0, + 8192, 8193, 8195, 8199, 7936, 7952, 7948, 0, + 8192, 8193, 8195, 8199, 7936, 7952, 7948, 0, + 8192, 8193, 8195, 8199, 7936, 7952, 7953, 7950, + 0, 8192, 8193, 8195, 8199, 7936, 0, 8192, + 8193, 8195, 8199, 7936, 7952, 0, 8192, 8193, + 8195, 8199, 7936, 7952, 0, 8192, 8193, 8195, + 8199, 7936, 7952, 7954, 0, 8192, 8193, 8195, + 8199, 7936, 7952, 0, 8192, 8193, 8195, 8199, + 7936, 7952, 7956, 0, 8192, 8193, 8195, 8199, + 7936, 7952, 7956, 0, 8192, 8193, 8195, 8199, + 7936, 7952, 7960, 7958, 0, 8192, 8193, 8195, + 8199, 7936, 7952, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7960, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7960, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7960, 7962, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 7960, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 7969, 7964, 0, 8192, 8193, + 8195, 8199, 7936, 7968, 7969, 7964, 0, 8192, + 8193, 8195, 8199, 7936, 7968, 7969, 7964, 7966, + 0, 8192, 8193, 8195, 8199, 7936, 0, 8192, + 8193, 8195, 8199, 7936, 7968, 0, 8192, 8193, + 8195, 8199, 7936, 7968, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 7970, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7972, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7972, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7976, 7974, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7976, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7976, 0, 8192, 8193, 8195, 8199, + 7936, 7968, 7976, 7978, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 7976, 0, 8192, 8193, 8195, + 8199, 7936, 7968, 7984, 7980, 0, 8192, 8193, + 8195, 8199, 7936, 7968, 7984, 7980, 0, 8192, + 8193, 8195, 8199, 7936, 7968, 7984, 7985, 7982, + 0, 8192, 8193, 8195, 8199, 7936, 7968, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 7984, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 7984, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 7984, 7986, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 7984, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 7984, + 7988, 0, 8192, 8193, 8195, 8199, 7936, 8000, + 7984, 7988, 0, 8192, 8193, 8195, 8199, 7936, + 8000, 7984, 7992, 7990, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 7984, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8001, 7992, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 8001, 7992, 0, 8192, + 8193, 8195, 8199, 7936, 8000, 8001, 7992, 7994, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 8001, + 7992, 0, 8192, 8193, 8195, 8199, 7936, 8000, + 8001, 7992, 7996, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8001, 8003, 7996, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 8001, 8003, 7996, 7998, + 0, 8192, 8193, 8195, 8199, 7936, 0, 8192, + 8193, 8195, 8199, 7936, 8000, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8002, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8004, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8004, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8008, 8006, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8008, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8008, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8008, 8010, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8008, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8016, 8012, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 8016, 8012, 0, 8192, + 8193, 8195, 8199, 7936, 8000, 8016, 8017, 8014, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 8016, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 8016, 0, + 8192, 8193, 8195, 8199, 7936, 8000, 8016, 8018, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 8016, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 8016, + 8020, 0, 8192, 8193, 8195, 8199, 7936, 8000, + 8016, 8020, 0, 8192, 8193, 8195, 8199, 7936, + 8000, 8016, 8024, 8022, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8016, 0, 8192, 8193, 8195, + 8199, 7936, 8000, 8032, 8024, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 8032, 8024, 0, 8192, + 8193, 8195, 8199, 7936, 8000, 8032, 8024, 8026, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 8032, + 8024, 0, 8192, 8193, 8195, 8199, 7936, 8000, + 8032, 8033, 8028, 0, 8192, 8193, 8195, 8199, + 7936, 8000, 8032, 8033, 8028, 0, 8192, 8193, + 8195, 8199, 7936, 8000, 8032, 8033, 8028, 8030, + 0, 8192, 8193, 8195, 8199, 7936, 8000, 0, + 8192, 8193, 8195, 8199, 7936, 8064, 8032, 0, + 8192, 8193, 8195, 8199, 7936, 8064, 8032, 0, + 8192, 8193, 8195, 8199, 7936, 8064, 8032, 8034, + 0, 8192, 8193, 8195, 8199, 7936, 8064, 8032, + 0, 8192, 8193, 8195, 8199, 7936, 8064, 8032, + 8036, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8032, 8036, 0, 8192, 8193, 8195, 8199, 7936, + 8064, 8032, 8040, 8038, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8032, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8032, 8040, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 8032, 8040, 0, 8192, + 8193, 8195, 8199, 7936, 8064, 8032, 8040, 8042, + 0, 8192, 8193, 8195, 8199, 7936, 8064, 8032, + 8040, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8032, 8048, 8044, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8032, 8048, 8044, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 8032, 8048, 8049, 8046, + 0, 8192, 8193, 8195, 8199, 7936, 8064, 8032, + 0, 8192, 8193, 8195, 8199, 7936, 8064, 8065, + 8048, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8065, 8048, 0, 8192, 8193, 8195, 8199, 7936, + 8064, 8065, 8048, 8050, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8065, 8048, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 8065, 8048, 8052, 0, + 8192, 8193, 8195, 8199, 7936, 8064, 8065, 8048, + 8052, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8065, 8048, 8056, 8054, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8065, 8048, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 8065, 8048, 8056, 0, + 8192, 8193, 8195, 8199, 7936, 8064, 8065, 8067, + 8056, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8065, 8067, 8056, 8058, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8065, 8067, 8056, 0, 8192, + 8193, 8195, 8199, 7936, 8064, 8065, 8067, 8056, + 8060, 0, 8192, 8193, 8195, 8199, 7936, 8064, + 8065, 8067, 8056, 8060, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8065, 8067, 8056, 8060, 8062, + 0, 8192, 8193, 8195, 8199, 7936, 0, 8192, + 8193, 8195, 8199, 7936, 8064, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8066, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8068, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8068, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8072, 8070, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8072, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8072, 0, 8192, 8193, 8195, 8199, + 7936, 8064, 8072, 8074, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8072, 0, 8192, 8193, 8195, + 8199, 7936, 8064, 8080, 8076, 0, 8192, 8193, + 8195, 8199, 7936, 8064, 8080, 8076, 0, 8192, + 8193, 8195, 8199, 7936, 8064, 8080, 8081, 8078, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8080, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8080, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8080, 8082, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8080, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8080, + 8084, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8080, 8084, 0, 8192, 8193, 8195, 8199, 8207, + 8064, 8080, 8088, 8086, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8080, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8096, 8088, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8096, 8088, 0, 8192, + 8193, 8195, 8199, 8207, 8064, 8096, 8088, 8090, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8096, + 8088, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8096, 8097, 8092, 0, 8192, 8193, 8195, 8199, + 8207, 8064, 8096, 8097, 8092, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8096, 8097, 8092, 8094, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8096, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8096, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8096, 8098, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8096, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8096, + 8100, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8096, 8100, 0, 8192, 8193, 8195, 8199, 8207, + 8064, 8096, 8104, 8102, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8096, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8096, 8104, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8096, 8104, 0, 8192, + 8193, 8195, 8199, 8207, 8064, 8096, 8104, 8106, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8096, + 8104, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8096, 8112, 8108, 0, 8192, 8193, 8195, 8199, + 8207, 8064, 8096, 8112, 8108, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8096, 8112, 8113, 8110, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8096, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 8112, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8112, 0, 8192, 8193, 8195, 8199, 8207, + 8064, 8128, 8112, 8114, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8112, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8112, 8116, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 8112, + 8116, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8112, 8120, 8118, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8112, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8129, 8120, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 8129, + 8120, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8129, 8120, 8122, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8129, 8120, 0, 8192, + 8193, 8195, 8199, 8207, 8064, 8128, 8129, 8120, + 8124, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8129, 8131, 8124, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8129, 8131, 8124, 8126, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 8130, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 8132, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8132, 0, 8192, 8193, 8195, 8199, 8207, + 8064, 8128, 8136, 8134, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8136, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8136, 0, 8192, + 8193, 8195, 8199, 8207, 8064, 8128, 8136, 8138, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 8136, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8144, 8140, 0, 8192, 8193, 8195, 8199, + 8207, 8064, 8128, 8144, 8140, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8144, 8145, 8142, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 0, 8192, 8193, 8195, 8199, 8207, 8064, 8128, + 8144, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8144, 0, 8192, 8193, 8195, 8199, 8207, + 8064, 8128, 8144, 8146, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8144, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8144, 8148, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 8144, + 8148, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8144, 8152, 8150, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8144, 0, 8192, 8193, + 8195, 8199, 8207, 8064, 8128, 8160, 8152, 0, + 8192, 8193, 8195, 8199, 8207, 8064, 8128, 8160, + 8152, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8160, 8152, 8154, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8160, 8152, 0, 8192, + 8193, 8195, 8199, 8207, 8064, 8128, 8160, 8161, + 8156, 0, 8192, 8193, 8195, 8199, 8207, 8064, + 8128, 8160, 8161, 8156, 0, 8192, 8193, 8195, + 8199, 8207, 8064, 8128, 8160, 8161, 8156, 8158, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 8160, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 0, 8192, 8193, 8195, 8199, 8207, + 8223, 8128, 8160, 8162, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 0, 8192, 8193, + 8195, 8199, 8207, 8223, 8128, 8160, 8164, 0, + 8192, 8193, 8195, 8199, 8207, 8223, 8128, 8160, + 8164, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 8168, 8166, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 0, 8192, 8193, + 8195, 8199, 8207, 8223, 8128, 8160, 8168, 0, + 8192, 8193, 8195, 8199, 8207, 8223, 8128, 8160, + 8168, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 8168, 8170, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 8168, 0, 8192, + 8193, 8195, 8199, 8207, 8223, 8128, 8160, 8176, + 8172, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 8176, 8172, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 8176, 8177, 8174, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 8160, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 8176, 0, 8192, 8193, 8195, 8199, + 8207, 8223, 8128, 8160, 8176, 0, 8192, 8193, + 8195, 8199, 8207, 8223, 8128, 8160, 8176, 8178, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 8160, 8176, 0, 8192, 8193, 8195, 8199, 8207, + 8223, 8128, 8160, 8176, 8180, 0, 8192, 8193, + 8195, 8199, 8207, 8223, 8128, 8160, 8176, 8180, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 8160, 8176, 8184, 8182, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 8176, 0, 8192, + 8193, 8195, 8199, 8207, 8223, 8128, 8160, 8176, + 8184, 0, 8192, 8193, 8195, 8199, 8207, 8223, + 8128, 8160, 8176, 8184, 0, 8192, 8193, 8195, + 8199, 8207, 8223, 8128, 8160, 8176, 8184, 8186, + 0, 8192, 8193, 8195, 8199, 8207, 8223, 8128, + 8160, 8176, 8184, 0, 8192, 8193, 8195, 8199, + 8207, 8223, 8128, 8160, 8176, 8184, 8188, 0, + 8192, 8193, 8195, 8199, 8207, 8223, 8128, 8160, + 8176, 8184, 8188, 0, 8192, 8193, 8195, 8199, + 8207, 8223, 8128, 8160, 8176, 8184, 8188, 8190, + 0, 0, 8192, 0, 8192, 0, 8192, 8194, + 0, 8192, 0, 8192, 8196, 0, 8192, 8196, + 0, 8192, 8200, 8198, 0, 8192, 0, 8192, + 8200, 0, 8192, 8200, 0, 8192, 8200, 8202, + 0, 8192, 8200, 0, 8192, 8208, 8204, 0, + 8192, 8208, 8204, 0, 8192, 8208, 8209, 8206, + 0, 8192, 0, 8192, 8208, 0, 8192, 8208, + 0, 8192, 8208, 8210, 0, 8192, 8208, 0, + 8192, 8208, 8212, 0, 8192, 8208, 8212, 0, + 8192, 8208, 8216, 8214, 0, 8192, 8208, 0, + 8192, 8224, 8216, 0, 8192, 8224, 8216, 0, + 8192, 8224, 8216, 8218, 0, 8192, 8224, 8216, + 0, 8192, 8224, 8225, 8220, 0, 8192, 8224, + 8225, 8220, 0, 8192, 8224, 8225, 8220, 8222, + 0, 8192, 0, 8192, 8224, 0, 8192, 8224, + 0, 8192, 8224, 8226, 0, 8192, 8224, 0, + 8192, 8224, 8228, 0, 8192, 8224, 8228, 0, + 8192, 8224, 8232, 8230, 0, 8192, 8224, 0, + 8192, 8224, 8232, 0, 8192, 8224, 8232, 0, + 8192, 8224, 8232, 8234, 0, 8192, 8224, 8232, + 0, 8192, 8224, 8240, 8236, 0, 8192, 8224, + 8240, 8236, 0, 8192, 8224, 8240, 8241, 8238, + 0, 8192, 8224, 0, 8192, 8256, 8240, 0, + 8192, 8256, 8240, 0, 8192, 8256, 8240, 8242, + 0, 8192, 8256, 8240, 0, 8192, 8256, 8240, + 8244, 0, 8192, 8256, 8240, 8244, 0, 8192, + 8256, 8240, 8248, 8246, 0, 8192, 8256, 8240, + 0, 8192, 8256, 8257, 8248, 0, 8192, 8256, + 8257, 8248, 0, 8192, 8256, 8257, 8248, 8250, + 0, 8192, 8256, 8257, 8248, 0, 8192, 8256, + 8257, 8248, 8252, 0, 8192, 8256, 8257, 8259, + 8252, 0, 8192, 8256, 8257, 8259, 8252, 8254, + 0, 8192, 0, 8192, 8256, 0, 8192, 8256, + 0, 8192, 8256, 8258, 0, 8192, 8256, 0, + 8192, 8256, 8260, 0, 8192, 8256, 8260, 0, + 8192, 8256, 8264, 8262, 0, 8192, 8256, 0, + 8192, 8256, 8264, 0, 8192, 8256, 8264, 0, + 8192, 8256, 8264, 8266, 0, 8192, 8256, 8264, + 0, 8192, 8256, 8272, 8268, 0, 8192, 8256, + 8272, 8268, 0, 8192, 8256, 8272, 8273, 8270, + 0, 8192, 8256, 0, 8192, 8256, 8272, 0, + 8192, 8256, 8272, 0, 8192, 8256, 8272, 8274, + 0, 8192, 8256, 8272, 0, 8192, 8256, 8272, + 8276, 0, 8192, 8256, 8272, 8276, 0, 8192, + 8256, 8272, 8280, 8278, 0, 8192, 8256, 8272, + 0, 8192, 8256, 8288, 8280, 0, 8192, 8256, + 8288, 8280, 0, 8192, 8256, 8288, 8280, 8282, + 0, 8192, 8256, 8288, 8280, 0, 8192, 8256, + 8288, 8289, 8284, 0, 8192, 8256, 8288, 8289, + 8284, 0, 8192, 8256, 8288, 8289, 8284, 8286, + 0, 8192, 8256, 0, 8192, 8320, 8288, 0, + 8192, 8320, 8288, 0, 8192, 8320, 8288, 8290, + 0, 8192, 8320, 8288, 0, 8192, 8320, 8288, + 8292, 0, 8192, 8320, 8288, 8292, 0, 8192, + 8320, 8288, 8296, 8294, 0, 8192, 8320, 8288, + 0, 8192, 8320, 8288, 8296, 0, 8192, 8320, + 8288, 8296, 0, 8192, 8320, 8288, 8296, 8298, + 0, 8192, 8320, 8288, 8296, 0, 8192, 8320, + 8288, 8304, 8300, 0, 8192, 8320, 8288, 8304, + 8300, 0, 8192, 8320, 8288, 8304, 8305, 8302, + 0, 8192, 8320, 8288, 0, 8192, 8320, 8321, + 8304, 0, 8192, 8320, 8321, 8304, 0, 8192, + 8320, 8321, 8304, 8306, 0, 8192, 8320, 8321, + 8304, 0, 8192, 8320, 8321, 8304, 8308, 0, + 8192, 8320, 8321, 8304, 8308, 0, 8192, 8320, + 8321, 8304, 8312, 8310, 0, 8192, 8320, 8321, + 8304, 0, 8192, 8320, 8321, 8304, 8312, 0, + 8192, 8320, 8321, 8323, 8312, 0, 8192, 8320, + 8321, 8323, 8312, 8314, 0, 8192, 8320, 8321, + 8323, 8312, 0, 8192, 8320, 8321, 8323, 8312, + 8316, 0, 8192, 8320, 8321, 8323, 8312, 8316, + 0, 8192, 8320, 8321, 8323, 8312, 8316, 8318, + 0, 8192, 0, 8192, 8320, 0, 8192, 8320, + 0, 8192, 8320, 8322, 0, 8192, 8320, 0, + 8192, 8320, 8324, 0, 8192, 8320, 8324, 0, + 8192, 8320, 8328, 8326, 0, 8192, 8320, 0, + 8192, 8320, 8328, 0, 8192, 8320, 8328, 0, + 8192, 8320, 8328, 8330, 0, 8192, 8320, 8328, + 0, 8192, 8320, 8336, 8332, 0, 8192, 8320, + 8336, 8332, 0, 8192, 8320, 8336, 8337, 8334, + 0, 8192, 8320, 0, 8192, 8320, 8336, 0, + 8192, 8320, 8336, 0, 8192, 8320, 8336, 8338, + 0, 8192, 8320, 8336, 0, 8192, 8320, 8336, + 8340, 0, 8192, 8320, 8336, 8340, 0, 8192, + 8320, 8336, 8344, 8342, 0, 8192, 8320, 8336, + 0, 8192, 8320, 8352, 8344, 0, 8192, 8320, + 8352, 8344, 0, 8192, 8320, 8352, 8344, 8346, + 0, 8192, 8320, 8352, 8344, 0, 8192, 8320, + 8352, 8353, 8348, 0, 8192, 8320, 8352, 8353, + 8348, 0, 8192, 8320, 8352, 8353, 8348, 8350, + 0, 8192, 8320, 0, 8192, 8320, 8352, 0, + 8192, 8320, 8352, 0, 8192, 8320, 8352, 8354, + 0, 8192, 8320, 8352, 0, 8192, 8320, 8352, + 8356, 0, 8192, 8320, 8352, 8356, 0, 8192, + 8320, 8352, 8360, 8358, 0, 8192, 8320, 8352, + 0, 8192, 8320, 8352, 8360, 0, 8192, 8320, + 8352, 8360, 0, 8192, 8320, 8352, 8360, 8362, + 0, 8192, 8320, 8352, 8360, 0, 8192, 8320, + 8352, 8368, 8364, 0, 8192, 8320, 8352, 8368, + 8364, 0, 8192, 8320, 8352, 8368, 8369, 8366, + 0, 8192, 8320, 8352, 0, 8192, 8320, 8384, + 8368, 0, 8192, 8320, 8384, 8368, 0, 8192, + 8320, 8384, 8368, 8370, 0, 8192, 8320, 8384, + 8368, 0, 8192, 8320, 8384, 8368, 8372, 0, + 8192, 8320, 8384, 8368, 8372, 0, 8192, 8320, + 8384, 8368, 8376, 8374, 0, 8192, 8320, 8384, + 8368, 0, 8192, 8320, 8384, 8385, 8376, 0, + 8192, 8320, 8384, 8385, 8376, 0, 8192, 8320, + 8384, 8385, 8376, 8378, 0, 8192, 8320, 8384, + 8385, 8376, 0, 8192, 8320, 8384, 8385, 8376, + 8380, 0, 8192, 8320, 8384, 8385, 8387, 8380, + 0, 8192, 8320, 8384, 8385, 8387, 8380, 8382, + 0, 8192, 8320, 0, 8192, 8448, 8384, 0, + 8192, 8448, 8384, 0, 8192, 8448, 8384, 8386, + 0, 8192, 8448, 8384, 0, 8192, 8448, 8384, + 8388, 0, 8192, 8448, 8384, 8388, 0, 8192, + 8448, 8384, 8392, 8390, 0, 8192, 8448, 8384, + 0, 8192, 8448, 8384, 8392, 0, 8192, 8448, + 8384, 8392, 0, 8192, 8448, 8384, 8392, 8394, + 0, 8192, 8448, 8384, 8392, 0, 8192, 8448, + 8384, 8400, 8396, 0, 8192, 8448, 8384, 8400, + 8396, 0, 8192, 8448, 8384, 8400, 8401, 8398, + 0, 8192, 8448, 8384, 0, 8192, 8448, 8384, + 8400, 0, 8192, 8448, 8384, 8400, 0, 8192, + 8448, 8384, 8400, 8402, 0, 8192, 8448, 8384, + 8400, 0, 8192, 8448, 8384, 8400, 8404, 0, + 8192, 8448, 8384, 8400, 8404, 0, 8192, 8448, + 8384, 8400, 8408, 8406, 0, 8192, 8448, 8384, + 8400, 0, 8192, 8448, 8384, 8416, 8408, 0, + 8192, 8448, 8384, 8416, 8408, 0, 8192, 8448, + 8384, 8416, 8408, 8410, 0, 8192, 8448, 8384, + 8416, 8408, 0, 8192, 8448, 8384, 8416, 8417, + 8412, 0, 8192, 8448, 8384, 8416, 8417, 8412, + 0, 8192, 8448, 8384, 8416, 8417, 8412, 8414, + 0, 8192, 8448, 8384, 0, 8192, 8448, 8449, + 8416, 0, 8192, 8448, 8449, 8416, 0, 8192, + 8448, 8449, 8416, 8418, 0, 8192, 8448, 8449, + 8416, 0, 8192, 8448, 8449, 8416, 8420, 0, + 8192, 8448, 8449, 8416, 8420, 0, 8192, 8448, + 8449, 8416, 8424, 8422, 0, 8192, 8448, 8449, + 8416, 0, 8192, 8448, 8449, 8416, 8424, 0, + 8192, 8448, 8449, 8416, 8424, 0, 8192, 8448, + 8449, 8416, 8424, 8426, 0, 8192, 8448, 8449, + 8416, 8424, 0, 8192, 8448, 8449, 8416, 8432, + 8428, 0, 8192, 8448, 8449, 8416, 8432, 8428, + 0, 8192, 8448, 8449, 8416, 8432, 8433, 8430, + 0, 8192, 8448, 8449, 8416, 0, 8192, 8448, + 8449, 8416, 8432, 0, 8192, 8448, 8449, 8451, + 8432, 0, 8192, 8448, 8449, 8451, 8432, 8434, + 0, 8192, 8448, 8449, 8451, 8432, 0, 8192, + 8448, 8449, 8451, 8432, 8436, 0, 8192, 8448, + 8449, 8451, 8432, 8436, 0, 8192, 8448, 8449, + 8451, 8432, 8440, 8438, 0, 8192, 8448, 8449, + 8451, 8432, 0, 8192, 8448, 8449, 8451, 8432, + 8440, 0, 8192, 8448, 8449, 8451, 8432, 8440, + 0, 8192, 8448, 8449, 8451, 8432, 8440, 8442, + 0, 8192, 8448, 8449, 8451, 8455, 8440, 0, + 8192, 8448, 8449, 8451, 8455, 8440, 8444, 0, + 8192, 8448, 8449, 8451, 8455, 8440, 8444, 0, + 8192, 8448, 8449, 8451, 8455, 8440, 8444, 8446, + 0, 8192, 0, 8192, 8448, 0, 8192, 8448, + 0, 8192, 8448, 8450, 0, 8192, 8448, 0, + 8192, 8448, 8452, 0, 8192, 8448, 8452, 0, + 8192, 8448, 8456, 8454, 0, 8192, 8448, 0, + 8192, 8448, 8456, 0, 8192, 8448, 8456, 0, + 8192, 8448, 8456, 8458, 0, 8192, 8448, 8456, + 0, 8192, 8448, 8464, 8460, 0, 8192, 8448, + 8464, 8460, 0, 8192, 8448, 8464, 8465, 8462, + 0, 8192, 8448, 0, 8192, 8448, 8464, 0, + 8192, 8448, 8464, 0, 8192, 8448, 8464, 8466, + 0, 8192, 8448, 8464, 0, 8192, 8448, 8464, + 8468, 0, 8192, 8448, 8464, 8468, 0, 8192, + 8448, 8464, 8472, 8470, 0, 8192, 8448, 8464, + 0, 8192, 8448, 8480, 8472, 0, 8192, 8448, + 8480, 8472, 0, 8192, 8448, 8480, 8472, 8474, + 0, 8192, 8448, 8480, 8472, 0, 8192, 8448, + 8480, 8481, 8476, 0, 8192, 8448, 8480, 8481, + 8476, 0, 8192, 8448, 8480, 8481, 8476, 8478, + 0, 8192, 8448, 0, 8192, 8448, 8480, 0, + 8192, 8448, 8480, 0, 8192, 8448, 8480, 8482, + 0, 8192, 8448, 8480, 0, 8192, 8448, 8480, + 8484, 0, 8192, 8448, 8480, 8484, 0, 8192, + 8448, 8480, 8488, 8486, 0, 8192, 8448, 8480, + 0, 8192, 8448, 8480, 8488, 0, 8192, 8448, + 8480, 8488, 0, 8192, 8448, 8480, 8488, 8490, + 0, 8192, 8448, 8480, 8488, 0, 8192, 8448, + 8480, 8496, 8492, 0, 8192, 8448, 8480, 8496, + 8492, 0, 8192, 8448, 8480, 8496, 8497, 8494, + 0, 8192, 8448, 8480, 0, 8192, 8448, 8512, + 8496, 0, 8192, 8448, 8512, 8496, 0, 8192, + 8448, 8512, 8496, 8498, 0, 8192, 8448, 8512, + 8496, 0, 8192, 8448, 8512, 8496, 8500, 0, + 8192, 8448, 8512, 8496, 8500, 0, 8192, 8448, + 8512, 8496, 8504, 8502, 0, 8192, 8448, 8512, + 8496, 0, 8192, 8448, 8512, 8513, 8504, 0, + 8192, 8448, 8512, 8513, 8504, 0, 8192, 8448, + 8512, 8513, 8504, 8506, 0, 8192, 8448, 8512, + 8513, 8504, 0, 8192, 8448, 8512, 8513, 8504, + 8508, 0, 8192, 8448, 8512, 8513, 8515, 8508, + 0, 8192, 8448, 8512, 8513, 8515, 8508, 8510, + 0, 8192, 8448, 0, 8192, 8448, 8512, 0, + 8192, 8448, 8512, 0, 8192, 8448, 8512, 8514, + 0, 8192, 8448, 8512, 0, 8192, 8448, 8512, + 8516, 0, 8192, 8448, 8512, 8516, 0, 8192, + 8448, 8512, 8520, 8518, 0, 8192, 8448, 8512, + 0, 8192, 8448, 8512, 8520, 0, 8192, 8448, + 8512, 8520, 0, 8192, 8448, 8512, 8520, 8522, + 0, 8192, 8448, 8512, 8520, 0, 8192, 8448, + 8512, 8528, 8524, 0, 8192, 8448, 8512, 8528, + 8524, 0, 8192, 8448, 8512, 8528, 8529, 8526, + 0, 8192, 8448, 8512, 0, 8192, 8448, 8512, + 8528, 0, 8192, 8448, 8512, 8528, 0, 8192, + 8448, 8512, 8528, 8530, 0, 8192, 8448, 8512, + 8528, 0, 8192, 8448, 8512, 8528, 8532, 0, + 8192, 8448, 8512, 8528, 8532, 0, 8192, 8448, + 8512, 8528, 8536, 8534, 0, 8192, 8448, 8512, + 8528, 0, 8192, 8448, 8512, 8544, 8536, 0, + 8192, 8448, 8512, 8544, 8536, 0, 8192, 8448, + 8512, 8544, 8536, 8538, 0, 8192, 8448, 8512, + 8544, 8536, 0, 8192, 8448, 8512, 8544, 8545, + 8540, 0, 8192, 8448, 8512, 8544, 8545, 8540, + 0, 8192, 8448, 8512, 8544, 8545, 8540, 8542, + 0, 8192, 8448, 8512, 0, 8192, 8448, 8576, + 8544, 0, 8192, 8448, 8576, 8544, 0, 8192, + 8448, 8576, 8544, 8546, 0, 8192, 8448, 8576, + 8544, 0, 8192, 8448, 8576, 8544, 8548, 0, + 8192, 8448, 8576, 8544, 8548, 0, 8192, 8448, + 8576, 8544, 8552, 8550, 0, 8192, 8448, 8576, + 8544, 0, 8192, 8448, 8576, 8544, 8552, 0, + 8192, 8448, 8576, 8544, 8552, 0, 8192, 8448, + 8576, 8544, 8552, 8554, 0, 8192, 8448, 8576, + 8544, 8552, 0, 8192, 8448, 8576, 8544, 8560, + 8556, 0, 8192, 8448, 8576, 8544, 8560, 8556, + 0, 8192, 8448, 8576, 8544, 8560, 8561, 8558, + 0, 8192, 8448, 8576, 8544, 0, 8192, 8448, + 8576, 8577, 8560, 0, 8192, 8448, 8576, 8577, + 8560, 0, 8192, 8448, 8576, 8577, 8560, 8562, + 0, 8192, 8448, 8576, 8577, 8560, 0, 8192, + 8448, 8576, 8577, 8560, 8564, 0, 8192, 8448, + 8576, 8577, 8560, 8564, 0, 8192, 8448, 8576, + 8577, 8560, 8568, 8566, 0, 8192, 8448, 8576, + 8577, 8560, 0, 8192, 8448, 8576, 8577, 8560, + 8568, 0, 8192, 8448, 8576, 8577, 8579, 8568, + 0, 8192, 8448, 8576, 8577, 8579, 8568, 8570, + 0, 8192, 8448, 8576, 8577, 8579, 8568, 0, + 8192, 8448, 8576, 8577, 8579, 8568, 8572, 0, + 8192, 8448, 8576, 8577, 8579, 8568, 8572, 0, + 8192, 8448, 8576, 8577, 8579, 8568, 8572, 8574, + 0, 8192, 8448, 0, 8192, 8704, 8576, 0, + 8192, 8704, 8576, 0, 8192, 8704, 8576, 8578, + 0, 8192, 8704, 8576, 0, 8192, 8704, 8576, + 8580, 0, 8192, 8704, 8576, 8580, 0, 8192, + 8704, 8576, 8584, 8582, 0, 8192, 8704, 8576, + 0, 8192, 8704, 8576, 8584, 0, 8192, 8704, + 8576, 8584, 0, 8192, 8704, 8576, 8584, 8586, + 0, 8192, 8704, 8576, 8584, 0, 8192, 8704, + 8576, 8592, 8588, 0, 8192, 8704, 8576, 8592, + 8588, 0, 8192, 8704, 8576, 8592, 8593, 8590, + 0, 8192, 8704, 8576, 0, 8192, 8704, 8576, + 8592, 0, 8192, 8704, 8576, 8592, 0, 8192, + 8704, 8576, 8592, 8594, 0, 8192, 8704, 8576, + 8592, 0, 8192, 8704, 8576, 8592, 8596, 0, + 8192, 8704, 8576, 8592, 8596, 0, 8192, 8704, + 8576, 8592, 8600, 8598, 0, 8192, 8704, 8576, + 8592, 0, 8192, 8704, 8576, 8608, 8600, 0, + 8192, 8704, 8576, 8608, 8600, 0, 8192, 8704, + 8576, 8608, 8600, 8602, 0, 8192, 8704, 8576, + 8608, 8600, 0, 8192, 8704, 8576, 8608, 8609, + 8604, 0, 8192, 8704, 8576, 8608, 8609, 8604, + 0, 8192, 8704, 8576, 8608, 8609, 8604, 8606, + 0, 8192, 8704, 8576, 0, 8192, 8704, 8576, + 8608, 0, 8192, 8704, 8576, 8608, 0, 8192, + 8704, 8576, 8608, 8610, 0, 8192, 8704, 8576, + 8608, 0, 8192, 8704, 8576, 8608, 8612, 0, + 8192, 8704, 8576, 8608, 8612, 0, 8192, 8704, + 8576, 8608, 8616, 8614, 0, 8192, 8704, 8576, + 8608, 0, 8192, 8704, 8576, 8608, 8616, 0, + 8192, 8704, 8576, 8608, 8616, 0, 8192, 8704, + 8576, 8608, 8616, 8618, 0, 8192, 8704, 8576, + 8608, 8616, 0, 8192, 8704, 8576, 8608, 8624, + 8620, 0, 8192, 8704, 8576, 8608, 8624, 8620, + 0, 8192, 8704, 8576, 8608, 8624, 8625, 8622, + 0, 8192, 8704, 8576, 8608, 0, 8192, 8704, + 8576, 8640, 8624, 0, 8192, 8704, 8576, 8640, + 8624, 0, 8192, 8704, 8576, 8640, 8624, 8626, + 0, 8192, 8704, 8576, 8640, 8624, 0, 8192, + 8704, 8576, 8640, 8624, 8628, 0, 8192, 8704, + 8576, 8640, 8624, 8628, 0, 8192, 8704, 8576, + 8640, 8624, 8632, 8630, 0, 8192, 8704, 8576, + 8640, 8624, 0, 8192, 8704, 8576, 8640, 8641, + 8632, 0, 8192, 8704, 8576, 8640, 8641, 8632, + 0, 8192, 8704, 8576, 8640, 8641, 8632, 8634, + 0, 8192, 8704, 8576, 8640, 8641, 8632, 0, + 8192, 8704, 8576, 8640, 8641, 8632, 8636, 0, + 8192, 8704, 8576, 8640, 8641, 8643, 8636, 0, + 8192, 8704, 8576, 8640, 8641, 8643, 8636, 8638, + 0, 8192, 8704, 8576, 0, 8192, 8704, 8705, + 8640, 0, 8192, 8704, 8705, 8640, 0, 8192, + 8704, 8705, 8640, 8642, 0, 8192, 8704, 8705, + 8640, 0, 8192, 8704, 8705, 8640, 8644, 0, + 8192, 8704, 8705, 8640, 8644, 0, 8192, 8704, + 8705, 8640, 8648, 8646, 0, 8192, 8704, 8705, + 8640, 0, 8192, 8704, 8705, 8640, 8648, 0, + 8192, 8704, 8705, 8640, 8648, 0, 8192, 8704, + 8705, 8640, 8648, 8650, 0, 8192, 8704, 8705, + 8640, 8648, 0, 8192, 8704, 8705, 8640, 8656, + 8652, 0, 8192, 8704, 8705, 8640, 8656, 8652, + 0, 8192, 8704, 8705, 8640, 8656, 8657, 8654, + 0, 8192, 8704, 8705, 8640, 0, 8192, 8704, + 8705, 8640, 8656, 0, 8192, 8704, 8705, 8640, + 8656, 0, 8192, 8704, 8705, 8640, 8656, 8658, + 0, 8192, 8704, 8705, 8640, 8656, 0, 8192, + 8704, 8705, 8640, 8656, 8660, 0, 8192, 8704, + 8705, 8640, 8656, 8660, 0, 8192, 8704, 8705, + 8640, 8656, 8664, 8662, 0, 8192, 8704, 8705, + 8640, 8656, 0, 8192, 8704, 8705, 8640, 8672, + 8664, 0, 8192, 8704, 8705, 8640, 8672, 8664, + 0, 8192, 8704, 8705, 8640, 8672, 8664, 8666, + 0, 8192, 8704, 8705, 8640, 8672, 8664, 0, + 8192, 8704, 8705, 8640, 8672, 8673, 8668, 0, + 8192, 8704, 8705, 8640, 8672, 8673, 8668, 0, + 8192, 8704, 8705, 8640, 8672, 8673, 8668, 8670, + 0, 8192, 8704, 8705, 8640, 0, 8192, 8704, + 8705, 8640, 8672, 0, 8192, 8704, 8705, 8707, + 8672, 0, 8192, 8704, 8705, 8707, 8672, 8674, + 0, 8192, 8704, 8705, 8707, 8672, 0, 8192, + 8704, 8705, 8707, 8672, 8676, 0, 8192, 8704, + 8705, 8707, 8672, 8676, 0, 8192, 8704, 8705, + 8707, 8672, 8680, 8678, 0, 8192, 8704, 8705, + 8707, 8672, 0, 8192, 8704, 8705, 8707, 8672, + 8680, 0, 8192, 8704, 8705, 8707, 8672, 8680, + 0, 8192, 8704, 8705, 8707, 8672, 8680, 8682, + 0, 8192, 8704, 8705, 8707, 8672, 8680, 0, + 8192, 8704, 8705, 8707, 8672, 8688, 8684, 0, + 8192, 8704, 8705, 8707, 8672, 8688, 8684, 0, + 8192, 8704, 8705, 8707, 8672, 8688, 8689, 8686, + 0, 8192, 8704, 8705, 8707, 8672, 0, 8192, + 8704, 8705, 8707, 8672, 8688, 0, 8192, 8704, + 8705, 8707, 8672, 8688, 0, 8192, 8704, 8705, + 8707, 8672, 8688, 8690, 0, 8192, 8704, 8705, + 8707, 8711, 8688, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8692, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8692, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8696, 8694, 0, 8192, 8704, 8705, + 8707, 8711, 8688, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8696, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8696, 0, 8192, 8704, 8705, 8707, + 8711, 8688, 8696, 8698, 0, 8192, 8704, 8705, + 8707, 8711, 8688, 8696, 0, 8192, 8704, 8705, + 8707, 8711, 8688, 8696, 8700, 0, 8192, 8704, + 8705, 8707, 8711, 8688, 8696, 8700, 0, 8192, + 8704, 8705, 8707, 8711, 8688, 8696, 8700, 8702, + 0, 8192, 0, 8192, 8704, 0, 8192, 8704, + 0, 8192, 8704, 8706, 0, 8192, 8704, 0, + 8192, 8704, 8708, 0, 8192, 8704, 8708, 0, + 8192, 8704, 8712, 8710, 0, 8192, 8704, 0, + 8192, 8704, 8712, 0, 8192, 8704, 8712, 0, + 8192, 8704, 8712, 8714, 0, 8192, 8704, 8712, + 0, 8192, 8704, 8720, 8716, 0, 8192, 8704, + 8720, 8716, 0, 8192, 8704, 8720, 8721, 8718, + 0, 8192, 8704, 0, 8192, 8704, 8720, 0, + 8192, 8704, 8720, 0, 8192, 8704, 8720, 8722, + 0, 8192, 8704, 8720, 0, 8192, 8704, 8720, + 8724, 0, 8192, 8704, 8720, 8724, 0, 8192, + 8704, 8720, 8728, 8726, 0, 8192, 8704, 8720, + 0, 8192, 8704, 8736, 8728, 0, 8192, 8704, + 8736, 8728, 0, 8192, 8704, 8736, 8728, 8730, + 0, 8192, 8704, 8736, 8728, 0, 8192, 8704, + 8736, 8737, 8732, 0, 8192, 8704, 8736, 8737, + 8732, 0, 8192, 8704, 8736, 8737, 8732, 8734, + 0, 8192, 8704, 0, 8192, 8704, 8736, 0, + 8192, 8704, 8736, 0, 8192, 8704, 8736, 8738, + 0, 8192, 8704, 8736, 0, 8192, 8704, 8736, + 8740, 0, 8192, 8704, 8736, 8740, 0, 8192, + 8704, 8736, 8744, 8742, 0, 8192, 8704, 8736, + 0, 8192, 8704, 8736, 8744, 0, 8192, 8704, + 8736, 8744, 0, 8192, 8704, 8736, 8744, 8746, + 0, 8192, 8704, 8736, 8744, 0, 8192, 8704, + 8736, 8752, 8748, 0, 8192, 8704, 8736, 8752, + 8748, 0, 8192, 8704, 8736, 8752, 8753, 8750, + 0, 8192, 8704, 8736, 0, 8192, 8704, 8768, + 8752, 0, 8192, 8704, 8768, 8752, 0, 8192, + 8704, 8768, 8752, 8754, 0, 8192, 8704, 8768, + 8752, 0, 8192, 8704, 8768, 8752, 8756, 0, + 8192, 8704, 8768, 8752, 8756, 0, 8192, 8704, + 8768, 8752, 8760, 8758, 0, 8192, 8704, 8768, + 8752, 0, 8192, 8704, 8768, 8769, 8760, 0, + 8192, 8704, 8768, 8769, 8760, 0, 8192, 8704, + 8768, 8769, 8760, 8762, 0, 8192, 8704, 8768, + 8769, 8760, 0, 8192, 8704, 8768, 8769, 8760, + 8764, 0, 8192, 8704, 8768, 8769, 8771, 8764, + 0, 8192, 8704, 8768, 8769, 8771, 8764, 8766, + 0, 8192, 8704, 0, 8192, 8704, 8768, 0, + 8192, 8704, 8768, 0, 8192, 8704, 8768, 8770, + 0, 8192, 8704, 8768, 0, 8192, 8704, 8768, + 8772, 0, 8192, 8704, 8768, 8772, 0, 8192, + 8704, 8768, 8776, 8774, 0, 8192, 8704, 8768, + 0, 8192, 8704, 8768, 8776, 0, 8192, 8704, + 8768, 8776, 0, 8192, 8704, 8768, 8776, 8778, + 0, 8192, 8704, 8768, 8776, 0, 8192, 8704, + 8768, 8784, 8780, 0, 8192, 8704, 8768, 8784, + 8780, 0, 8192, 8704, 8768, 8784, 8785, 8782, + 0, 8192, 8704, 8768, 0, 8192, 8704, 8768, + 8784, 0, 8192, 8704, 8768, 8784, 0, 8192, + 8704, 8768, 8784, 8786, 0, 8192, 8704, 8768, + 8784, 0, 8192, 8704, 8768, 8784, 8788, 0, + 8192, 8704, 8768, 8784, 8788, 0, 8192, 8704, + 8768, 8784, 8792, 8790, 0, 8192, 8704, 8768, + 8784, 0, 8192, 8704, 8768, 8800, 8792, 0, + 8192, 8704, 8768, 8800, 8792, 0, 8192, 8704, + 8768, 8800, 8792, 8794, 0, 8192, 8704, 8768, + 8800, 8792, 0, 8192, 8704, 8768, 8800, 8801, + 8796, 0, 8192, 8704, 8768, 8800, 8801, 8796, + 0, 8192, 8704, 8768, 8800, 8801, 8796, 8798, + 0, 8192, 8704, 8768, 0, 8192, 8704, 8832, + 8800, 0, 8192, 8704, 8832, 8800, 0, 8192, + 8704, 8832, 8800, 8802, 0, 8192, 8704, 8832, + 8800, 0, 8192, 8704, 8832, 8800, 8804, 0, + 8192, 8704, 8832, 8800, 8804, 0, 8192, 8704, + 8832, 8800, 8808, 8806, 0, 8192, 8704, 8832, + 8800, 0, 8192, 8704, 8832, 8800, 8808, 0, + 8192, 8704, 8832, 8800, 8808, 0, 8192, 8704, + 8832, 8800, 8808, 8810, 0, 8192, 8704, 8832, + 8800, 8808, 0, 8192, 8704, 8832, 8800, 8816, + 8812, 0, 8192, 8704, 8832, 8800, 8816, 8812, + 0, 8192, 8704, 8832, 8800, 8816, 8817, 8814, + 0, 8192, 8704, 8832, 8800, 0, 8192, 8704, + 8832, 8833, 8816, 0, 8192, 8704, 8832, 8833, + 8816, 0, 8192, 8704, 8832, 8833, 8816, 8818, + 0, 8192, 8704, 8832, 8833, 8816, 0, 8192, + 8704, 8832, 8833, 8816, 8820, 0, 8192, 8704, + 8832, 8833, 8816, 8820, 0, 8192, 8704, 8832, + 8833, 8816, 8824, 8822, 0, 8192, 8704, 8832, + 8833, 8816, 0, 8192, 8704, 8832, 8833, 8816, + 8824, 0, 8192, 8704, 8832, 8833, 8835, 8824, + 0, 8192, 8704, 8832, 8833, 8835, 8824, 8826, + 0, 8192, 8704, 8832, 8833, 8835, 8824, 0, + 8192, 8704, 8832, 8833, 8835, 8824, 8828, 0, + 8192, 8704, 8832, 8833, 8835, 8824, 8828, 0, + 8192, 8704, 8832, 8833, 8835, 8824, 8828, 8830, + 0, 8192, 8704, 0, 8192, 8704, 8832, 0, + 8192, 8704, 8832, 0, 8192, 8704, 8832, 8834, + 0, 8192, 8704, 8832, 0, 8192, 8704, 8832, + 8836, 0, 8192, 8704, 8832, 8836, 0, 8192, + 8704, 8832, 8840, 8838, 0, 8192, 8704, 8832, + 0, 8192, 8704, 8832, 8840, 0, 8192, 8704, + 8832, 8840, 0, 8192, 8704, 8832, 8840, 8842, + 0, 8192, 8704, 8832, 8840, 0, 8192, 8704, + 8832, 8848, 8844, 0, 8192, 8704, 8832, 8848, + 8844, 0, 8192, 8704, 8832, 8848, 8849, 8846, + 0, 8192, 8704, 8832, 0, 8192, 8704, 8832, + 8848, 0, 8192, 8704, 8832, 8848, 0, 8192, + 8704, 8832, 8848, 8850, 0, 8192, 8704, 8832, + 8848, 0, 8192, 8704, 8832, 8848, 8852, 0, + 8192, 8704, 8832, 8848, 8852, 0, 8192, 8704, + 8832, 8848, 8856, 8854, 0, 8192, 8704, 8832, + 8848, 0, 8192, 8704, 8832, 8864, 8856, 0, + 8192, 8704, 8832, 8864, 8856, 0, 8192, 8704, + 8832, 8864, 8856, 8858, 0, 8192, 8704, 8832, + 8864, 8856, 0, 8192, 8704, 8832, 8864, 8865, + 8860, 0, 8192, 8704, 8832, 8864, 8865, 8860, + 0, 8192, 8704, 8832, 8864, 8865, 8860, 8862, + 0, 8192, 8704, 8832, 0, 8192, 8704, 8832, + 8864, 0, 8192, 8704, 8832, 8864, 0, 8192, + 8704, 8832, 8864, 8866, 0, 8192, 8704, 8832, + 8864, 0, 8192, 8704, 8832, 8864, 8868, 0, + 8192, 8704, 8832, 8864, 8868, 0, 8192, 8704, + 8832, 8864, 8872, 8870, 0, 8192, 8704, 8832, + 8864, 0, 8192, 8704, 8832, 8864, 8872, 0, + 8192, 8704, 8832, 8864, 8872, 0, 8192, 8704, + 8832, 8864, 8872, 8874, 0, 8192, 8704, 8832, + 8864, 8872, 0, 8192, 8704, 8832, 8864, 8880, + 8876, 0, 8192, 8704, 8832, 8864, 8880, 8876, + 0, 8192, 8704, 8832, 8864, 8880, 8881, 8878, + 0, 8192, 8704, 8832, 8864, 0, 8192, 8704, + 8832, 8896, 8880, 0, 8192, 8704, 8832, 8896, + 8880, 0, 8192, 8704, 8832, 8896, 8880, 8882, + 0, 8192, 8704, 8832, 8896, 8880, 0, 8192, + 8704, 8832, 8896, 8880, 8884, 0, 8192, 8704, + 8832, 8896, 8880, 8884, 0, 8192, 8704, 8832, + 8896, 8880, 8888, 8886, 0, 8192, 8704, 8832, + 8896, 8880, 0, 8192, 8704, 8832, 8896, 8897, + 8888, 0, 8192, 8704, 8832, 8896, 8897, 8888, + 0, 8192, 8704, 8832, 8896, 8897, 8888, 8890, + 0, 8192, 8704, 8832, 8896, 8897, 8888, 0, + 8192, 8704, 8832, 8896, 8897, 8888, 8892, 0, + 8192, 8704, 8832, 8896, 8897, 8899, 8892, 0, + 8192, 8704, 8832, 8896, 8897, 8899, 8892, 8894, + 0, 8192, 8704, 8832, 0, 8192, 8704, 8960, + 8896, 0, 8192, 8704, 8960, 8896, 0, 8192, + 8704, 8960, 8896, 8898, 0, 8192, 8704, 8960, + 8896, 0, 8192, 8704, 8960, 8896, 8900, 0, + 8192, 8704, 8960, 8896, 8900, 0, 8192, 8704, + 8960, 8896, 8904, 8902, 0, 8192, 8704, 8960, + 8896, 0, 8192, 8704, 8960, 8896, 8904, 0, + 8192, 8704, 8960, 8896, 8904, 0, 8192, 8704, + 8960, 8896, 8904, 8906, 0, 8192, 8704, 8960, + 8896, 8904, 0, 8192, 8704, 8960, 8896, 8912, + 8908, 0, 8192, 8704, 8960, 8896, 8912, 8908, + 0, 8192, 8704, 8960, 8896, 8912, 8913, 8910, + 0, 8192, 8704, 8960, 8896, 0, 8192, 8704, + 8960, 8896, 8912, 0, 8192, 8704, 8960, 8896, + 8912, 0, 8192, 8704, 8960, 8896, 8912, 8914, + 0, 8192, 8704, 8960, 8896, 8912, 0, 8192, + 8704, 8960, 8896, 8912, 8916, 0, 8192, 8704, + 8960, 8896, 8912, 8916, 0, 8192, 8704, 8960, + 8896, 8912, 8920, 8918, 0, 8192, 8704, 8960, + 8896, 8912, 0, 8192, 8704, 8960, 8896, 8928, + 8920, 0, 8192, 8704, 8960, 8896, 8928, 8920, + 0, 8192, 8704, 8960, 8896, 8928, 8920, 8922, + 0, 8192, 8704, 8960, 8896, 8928, 8920, 0, + 8192, 8704, 8960, 8896, 8928, 8929, 8924, 0, + 8192, 8704, 8960, 8896, 8928, 8929, 8924, 0, + 8192, 8704, 8960, 8896, 8928, 8929, 8924, 8926, + 0, 8192, 8704, 8960, 8896, 0, 8192, 8704, + 8960, 8961, 8928, 0, 8192, 8704, 8960, 8961, + 8928, 0, 8192, 8704, 8960, 8961, 8928, 8930, + 0, 8192, 8704, 8960, 8961, 8928, 0, 8192, + 8704, 8960, 8961, 8928, 8932, 0, 8192, 8704, + 8960, 8961, 8928, 8932, 0, 8192, 8704, 8960, + 8961, 8928, 8936, 8934, 0, 8192, 8704, 8960, + 8961, 8928, 0, 8192, 8704, 8960, 8961, 8928, + 8936, 0, 8192, 8704, 8960, 8961, 8928, 8936, + 0, 8192, 8704, 8960, 8961, 8928, 8936, 8938, + 0, 8192, 8704, 8960, 8961, 8928, 8936, 0, + 8192, 8704, 8960, 8961, 8928, 8944, 8940, 0, + 8192, 8704, 8960, 8961, 8928, 8944, 8940, 0, + 8192, 8704, 8960, 8961, 8928, 8944, 8945, 8942, + 0, 8192, 8704, 8960, 8961, 8928, 0, 8192, + 8704, 8960, 8961, 8928, 8944, 0, 8192, 8704, + 8960, 8961, 8963, 8944, 0, 8192, 8704, 8960, + 8961, 8963, 8944, 8946, 0, 8192, 8704, 8960, + 8961, 8963, 8944, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8948, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8948, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8952, 8950, 0, 8192, 8704, 8960, + 8961, 8963, 8944, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8952, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8952, 0, 8192, 8704, 8960, 8961, + 8963, 8944, 8952, 8954, 0, 8192, 8704, 8960, + 8961, 8963, 8967, 8952, 0, 8192, 8704, 8960, + 8961, 8963, 8967, 8952, 8956, 0, 8192, 8704, + 8960, 8961, 8963, 8967, 8952, 8956, 0, 8192, + 8704, 8960, 8961, 8963, 8967, 8952, 8956, 8958, + 0, 8192, 8704, 0, 8192, 9216, 8960, 0, + 8192, 9216, 8960, 0, 8192, 9216, 8960, 8962, + 0, 8192, 9216, 8960, 0, 8192, 9216, 8960, + 8964, 0, 8192, 9216, 8960, 8964, 0, 8192, + 9216, 8960, 8968, 8966, 0, 8192, 9216, 8960, + 0, 8192, 9216, 8960, 8968, 0, 8192, 9216, + 8960, 8968, 0, 8192, 9216, 8960, 8968, 8970, + 0, 8192, 9216, 8960, 8968, 0, 8192, 9216, + 8960, 8976, 8972, 0, 8192, 9216, 8960, 8976, + 8972, 0, 8192, 9216, 8960, 8976, 8977, 8974, + 0, 8192, 9216, 8960, 0, 8192, 9216, 8960, + 8976, 0, 8192, 9216, 8960, 8976, 0, 8192, + 9216, 8960, 8976, 8978, 0, 8192, 9216, 8960, + 8976, 0, 8192, 9216, 8960, 8976, 8980, 0, + 8192, 9216, 8960, 8976, 8980, 0, 8192, 9216, + 8960, 8976, 8984, 8982, 0, 8192, 9216, 8960, + 8976, 0, 8192, 9216, 8960, 8992, 8984, 0, + 8192, 9216, 8960, 8992, 8984, 0, 8192, 9216, + 8960, 8992, 8984, 8986, 0, 8192, 9216, 8960, + 8992, 8984, 0, 8192, 9216, 8960, 8992, 8993, + 8988, 0, 8192, 9216, 8960, 8992, 8993, 8988, + 0, 8192, 9216, 8960, 8992, 8993, 8988, 8990, + 0, 8192, 9216, 8960, 0, 8192, 9216, 8960, + 8992, 0, 8192, 9216, 8960, 8992, 0, 8192, + 9216, 8960, 8992, 8994, 0, 8192, 9216, 8960, + 8992, 0, 8192, 9216, 8960, 8992, 8996, 0, + 8192, 9216, 8960, 8992, 8996, 0, 8192, 9216, + 8960, 8992, 9000, 8998, 0, 8192, 9216, 8960, + 8992, 0, 8192, 9216, 8960, 8992, 9000, 0, + 8192, 9216, 8960, 8992, 9000, 0, 8192, 9216, + 8960, 8992, 9000, 9002, 0, 8192, 9216, 8960, + 8992, 9000, 0, 8192, 9216, 8960, 8992, 9008, + 9004, 0, 8192, 9216, 8960, 8992, 9008, 9004, + 0, 8192, 9216, 8960, 8992, 9008, 9009, 9006, + 0, 8192, 9216, 8960, 8992, 0, 8192, 9216, + 8960, 9024, 9008, 0, 8192, 9216, 8960, 9024, + 9008, 0, 8192, 9216, 8960, 9024, 9008, 9010, + 0, 8192, 9216, 8960, 9024, 9008, 0, 8192, + 9216, 8960, 9024, 9008, 9012, 0, 8192, 9216, + 8960, 9024, 9008, 9012, 0, 8192, 9216, 8960, + 9024, 9008, 9016, 9014, 0, 8192, 9216, 8960, + 9024, 9008, 0, 8192, 9216, 8960, 9024, 9025, + 9016, 0, 8192, 9216, 8960, 9024, 9025, 9016, + 0, 8192, 9216, 8960, 9024, 9025, 9016, 9018, + 0, 8192, 9216, 8960, 9024, 9025, 9016, 0, + 8192, 9216, 8960, 9024, 9025, 9016, 9020, 0, + 8192, 9216, 8960, 9024, 9025, 9027, 9020, 0, + 8192, 9216, 8960, 9024, 9025, 9027, 9020, 9022, + 0, 8192, 9216, 8960, 0, 8192, 9216, 8960, + 9024, 0, 8192, 9216, 8960, 9024, 0, 8192, + 9216, 8960, 9024, 9026, 0, 8192, 9216, 8960, + 9024, 0, 8192, 9216, 8960, 9024, 9028, 0, + 8192, 9216, 8960, 9024, 9028, 0, 8192, 9216, + 8960, 9024, 9032, 9030, 0, 8192, 9216, 8960, + 9024, 0, 8192, 9216, 8960, 9024, 9032, 0, + 8192, 9216, 8960, 9024, 9032, 0, 8192, 9216, + 8960, 9024, 9032, 9034, 0, 8192, 9216, 8960, + 9024, 9032, 0, 8192, 9216, 8960, 9024, 9040, + 9036, 0, 8192, 9216, 8960, 9024, 9040, 9036, + 0, 8192, 9216, 8960, 9024, 9040, 9041, 9038, + 0, 8192, 9216, 8960, 9024, 0, 8192, 9216, + 8960, 9024, 9040, 0, 8192, 9216, 8960, 9024, + 9040, 0, 8192, 9216, 8960, 9024, 9040, 9042, + 0, 8192, 9216, 8960, 9024, 9040, 0, 8192, + 9216, 8960, 9024, 9040, 9044, 0, 8192, 9216, + 8960, 9024, 9040, 9044, 0, 8192, 9216, 8960, + 9024, 9040, 9048, 9046, 0, 8192, 9216, 8960, + 9024, 9040, 0, 8192, 9216, 8960, 9024, 9056, + 9048, 0, 8192, 9216, 8960, 9024, 9056, 9048, + 0, 8192, 9216, 8960, 9024, 9056, 9048, 9050, + 0, 8192, 9216, 8960, 9024, 9056, 9048, 0, + 8192, 9216, 8960, 9024, 9056, 9057, 9052, 0, + 8192, 9216, 8960, 9024, 9056, 9057, 9052, 0, + 8192, 9216, 8960, 9024, 9056, 9057, 9052, 9054, + 0, 8192, 9216, 8960, 9024, 0, 8192, 9216, + 8960, 9088, 9056, 0, 8192, 9216, 8960, 9088, + 9056, 0, 8192, 9216, 8960, 9088, 9056, 9058, + 0, 8192, 9216, 8960, 9088, 9056, 0, 8192, + 9216, 8960, 9088, 9056, 9060, 0, 8192, 9216, + 8960, 9088, 9056, 9060, 0, 8192, 9216, 8960, + 9088, 9056, 9064, 9062, 0, 8192, 9216, 8960, + 9088, 9056, 0, 8192, 9216, 8960, 9088, 9056, + 9064, 0, 8192, 9216, 8960, 9088, 9056, 9064, + 0, 8192, 9216, 8960, 9088, 9056, 9064, 9066, + 0, 8192, 9216, 8960, 9088, 9056, 9064, 0, + 8192, 9216, 8960, 9088, 9056, 9072, 9068, 0, + 8192, 9216, 8960, 9088, 9056, 9072, 9068, 0, + 8192, 9216, 8960, 9088, 9056, 9072, 9073, 9070, + 0, 8192, 9216, 8960, 9088, 9056, 0, 8192, + 9216, 8960, 9088, 9089, 9072, 0, 8192, 9216, + 8960, 9088, 9089, 9072, 0, 8192, 9216, 8960, + 9088, 9089, 9072, 9074, 0, 8192, 9216, 8960, + 9088, 9089, 9072, 0, 8192, 9216, 8960, 9088, + 9089, 9072, 9076, 0, 8192, 9216, 8960, 9088, + 9089, 9072, 9076, 0, 8192, 9216, 8960, 9088, + 9089, 9072, 9080, 9078, 0, 8192, 9216, 8960, + 9088, 9089, 9072, 0, 8192, 9216, 8960, 9088, + 9089, 9072, 9080, 0, 8192, 9216, 8960, 9088, + 9089, 9091, 9080, 0, 8192, 9216, 8960, 9088, + 9089, 9091, 9080, 9082, 0, 8192, 9216, 8960, + 9088, 9089, 9091, 9080, 0, 8192, 9216, 8960, + 9088, 9089, 9091, 9080, 9084, 0, 8192, 9216, + 8960, 9088, 9089, 9091, 9080, 9084, 0, 8192, + 9216, 8960, 9088, 9089, 9091, 9080, 9084, 9086, + 0, 8192, 9216, 8960, 0, 8192, 9216, 8960, + 9088, 0, 8192, 9216, 9217, 9088, 0, 8192, + 9216, 9217, 9088, 9090, 0, 8192, 9216, 9217, + 9088, 0, 8192, 9216, 9217, 9088, 9092, 0, + 8192, 9216, 9217, 9088, 9092, 0, 8192, 9216, + 9217, 9088, 9096, 9094, 0, 8192, 9216, 9217, + 9088, 0, 8192, 9216, 9217, 9088, 9096, 0, + 8192, 9216, 9217, 9088, 9096, 0, 8192, 9216, + 9217, 9088, 9096, 9098, 0, 8192, 9216, 9217, + 9088, 9096, 0, 8192, 9216, 9217, 9088, 9104, + 9100, 0, 8192, 9216, 9217, 9088, 9104, 9100, + 0, 8192, 9216, 9217, 9088, 9104, 9105, 9102, + 0, 8192, 9216, 9217, 9088, 0, 8192, 9216, + 9217, 9088, 9104, 0, 8192, 9216, 9217, 9088, + 9104, 0, 8192, 9216, 9217, 9088, 9104, 9106, + 0, 8192, 9216, 9217, 9088, 9104, 0, 8192, + 9216, 9217, 9088, 9104, 9108, 0, 8192, 9216, + 9217, 9088, 9104, 9108, 0, 8192, 9216, 9217, + 9088, 9104, 9112, 9110, 0, 8192, 9216, 9217, + 9088, 9104, 0, 8192, 9216, 9217, 9088, 9120, + 9112, 0, 8192, 9216, 9217, 9088, 9120, 9112, + 0, 8192, 9216, 9217, 9088, 9120, 9112, 9114, + 0, 8192, 9216, 9217, 9088, 9120, 9112, 0, + 8192, 9216, 9217, 9088, 9120, 9121, 9116, 0, + 8192, 9216, 9217, 9088, 9120, 9121, 9116, 0, + 8192, 9216, 9217, 9088, 9120, 9121, 9116, 9118, + 0, 8192, 9216, 9217, 9088, 0, 8192, 9216, + 9217, 9088, 9120, 0, 8192, 9216, 9217, 9088, + 9120, 0, 8192, 9216, 9217, 9088, 9120, 9122, + 0, 8192, 9216, 9217, 9088, 9120, 0, 8192, + 9216, 9217, 9088, 9120, 9124, 0, 8192, 9216, + 9217, 9088, 9120, 9124, 0, 8192, 9216, 9217, + 9088, 9120, 9128, 9126, 0, 8192, 9216, 9217, + 9088, 9120, 0, 8192, 9216, 9217, 9088, 9120, + 9128, 0, 8192, 9216, 9217, 9088, 9120, 9128, + 0, 8192, 9216, 9217, 9088, 9120, 9128, 9130, + 0, 8192, 9216, 9217, 9088, 9120, 9128, 0, + 8192, 9216, 9217, 9088, 9120, 9136, 9132, 0, + 8192, 9216, 9217, 9088, 9120, 9136, 9132, 0, + 8192, 9216, 9217, 9088, 9120, 9136, 9137, 9134, + 0, 8192, 9216, 9217, 9088, 9120, 0, 8192, + 9216, 9217, 9088, 9152, 9136, 0, 8192, 9216, + 9217, 9088, 9152, 9136, 0, 8192, 9216, 9217, + 9088, 9152, 9136, 9138, 0, 8192, 9216, 9217, + 9088, 9152, 9136, 0, 8192, 9216, 9217, 9088, + 9152, 9136, 9140, 0, 8192, 9216, 9217, 9088, + 9152, 9136, 9140, 0, 8192, 9216, 9217, 9088, + 9152, 9136, 9144, 9142, 0, 8192, 9216, 9217, + 9088, 9152, 9136, 0, 8192, 9216, 9217, 9088, + 9152, 9153, 9144, 0, 8192, 9216, 9217, 9088, + 9152, 9153, 9144, 0, 8192, 9216, 9217, 9088, + 9152, 9153, 9144, 9146, 0, 8192, 9216, 9217, + 9088, 9152, 9153, 9144, 0, 8192, 9216, 9217, + 9088, 9152, 9153, 9144, 9148, 0, 8192, 9216, + 9217, 9088, 9152, 9153, 9155, 9148, 0, 8192, + 9216, 9217, 9088, 9152, 9153, 9155, 9148, 9150, + 0, 8192, 9216, 9217, 9088, 0, 8192, 9216, + 9217, 9088, 9152, 0, 8192, 9216, 9217, 9088, + 9152, 0, 8192, 9216, 9217, 9088, 9152, 9154, + 0, 8192, 9216, 9217, 9219, 9152, 0, 8192, + 9216, 9217, 9219, 9152, 9156, 0, 8192, 9216, + 9217, 9219, 9152, 9156, 0, 8192, 9216, 9217, + 9219, 9152, 9160, 9158, 0, 8192, 9216, 9217, + 9219, 9152, 0, 8192, 9216, 9217, 9219, 9152, + 9160, 0, 8192, 9216, 9217, 9219, 9152, 9160, + 0, 8192, 9216, 9217, 9219, 9152, 9160, 9162, + 0, 8192, 9216, 9217, 9219, 9152, 9160, 0, + 8192, 9216, 9217, 9219, 9152, 9168, 9164, 0, + 8192, 9216, 9217, 9219, 9152, 9168, 9164, 0, + 8192, 9216, 9217, 9219, 9152, 9168, 9169, 9166, + 0, 8192, 9216, 9217, 9219, 9152, 0, 8192, + 9216, 9217, 9219, 9152, 9168, 0, 8192, 9216, + 9217, 9219, 9152, 9168, 0, 8192, 9216, 9217, + 9219, 9152, 9168, 9170, 0, 8192, 9216, 9217, + 9219, 9152, 9168, 0, 8192, 9216, 9217, 9219, + 9152, 9168, 9172, 0, 8192, 9216, 9217, 9219, + 9152, 9168, 9172, 0, 8192, 9216, 9217, 9219, + 9152, 9168, 9176, 9174, 0, 8192, 9216, 9217, + 9219, 9152, 9168, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9176, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9176, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9176, 9178, 0, 8192, 9216, 9217, + 9219, 9152, 9184, 9176, 0, 8192, 9216, 9217, + 9219, 9152, 9184, 9185, 9180, 0, 8192, 9216, + 9217, 9219, 9152, 9184, 9185, 9180, 0, 8192, + 9216, 9217, 9219, 9152, 9184, 9185, 9180, 9182, + 0, 8192, 9216, 9217, 9219, 9152, 0, 8192, + 9216, 9217, 9219, 9152, 9184, 0, 8192, 9216, + 9217, 9219, 9152, 9184, 0, 8192, 9216, 9217, + 9219, 9152, 9184, 9186, 0, 8192, 9216, 9217, + 9219, 9152, 9184, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9188, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9188, 0, 8192, 9216, 9217, 9219, + 9152, 9184, 9192, 9190, 0, 8192, 9216, 9217, + 9219, 9223, 9184, 0, 8192, 9216, 9217, 9219, + 9223, 9184, 9192, 0, 8192, 9216, 9217, 9219, + 9223, 9184, 9192, 0, 8192, 9216, 9217, 9219, + 9223, 9184, 9192, 9194, 0, 8192, 9216, 9217, + 9219, 9223, 9184, 9192, 0, 8192, 9216, 9217, + 9219, 9223, 9184, 9200, 9196, 0, 8192, 9216, + 9217, 9219, 9223, 9184, 9200, 9196, 0, 8192, + 9216, 9217, 9219, 9223, 9184, 9200, 9201, 9198, + 0, 8192, 9216, 9217, 9219, 9223, 9184, 0, + 8192, 9216, 9217, 9219, 9223, 9184, 9200, 0, + 8192, 9216, 9217, 9219, 9223, 9184, 9200, 0, + 8192, 9216, 9217, 9219, 9223, 9184, 9200, 9202, + 0, 8192, 9216, 9217, 9219, 9223, 9184, 9200, + 0, 8192, 9216, 9217, 9219, 9223, 9184, 9200, + 9204, 0, 8192, 9216, 9217, 9219, 9223, 9184, + 9200, 9204, 0, 8192, 9216, 9217, 9219, 9223, + 9184, 9200, 9208, 9206, 0, 8192, 9216, 9217, + 9219, 9223, 9184, 9200, 0, 8192, 9216, 9217, + 9219, 9223, 9184, 9200, 9208, 0, 8192, 9216, + 9217, 9219, 9223, 9184, 9200, 9208, 0, 8192, + 9216, 9217, 9219, 9223, 9184, 9200, 9208, 9210, + 0, 8192, 9216, 9217, 9219, 9223, 9184, 9200, + 9208, 0, 8192, 9216, 9217, 9219, 9223, 9184, + 9200, 9208, 9212, 0, 8192, 9216, 9217, 9219, + 9223, 9184, 9200, 9208, 9212, 0, 8192, 9216, + 9217, 9219, 9223, 9184, 9200, 9208, 9212, 9214, + 0, 8192, 0, 8192, 9216, 0, 8192, 9216, + 0, 8192, 9216, 9218, 0, 8192, 9216, 0, + 8192, 9216, 9220, 0, 8192, 9216, 9220, 0, + 8192, 9216, 9224, 9222, 0, 8192, 9216, 0, + 8192, 9216, 9224, 0, 8192, 9216, 9224, 0, + 8192, 9216, 9224, 9226, 0, 8192, 9216, 9224, + 0, 8192, 9216, 9232, 9228, 0, 8192, 9216, + 9232, 9228, 0, 8192, 9216, 9232, 9233, 9230, + 0, 8192, 9216, 0, 8192, 9216, 9232, 0, + 8192, 9216, 9232, 0, 8192, 9216, 9232, 9234, + 0, 8192, 9216, 9232, 0, 8192, 9216, 9232, + 9236, 0, 8192, 9216, 9232, 9236, 0, 8192, + 9216, 9232, 9240, 9238, 0, 8192, 9216, 9232, + 0, 8192, 9216, 9248, 9240, 0, 8192, 9216, + 9248, 9240, 0, 8192, 9216, 9248, 9240, 9242, + 0, 8192, 9216, 9248, 9240, 0, 8192, 9216, + 9248, 9249, 9244, 0, 8192, 9216, 9248, 9249, + 9244, 0, 8192, 9216, 9248, 9249, 9244, 9246, + 0, 8192, 9216, 0, 8192, 9216, 9248, 0, + 8192, 9216, 9248, 0, 8192, 9216, 9248, 9250, + 0, 8192, 9216, 9248, 0, 8192, 9216, 9248, + 9252, 0, 8192, 9216, 9248, 9252, 0, 8192, + 9216, 9248, 9256, 9254, 0, 8192, 9216, 9248, + 0, 8192, 9216, 9248, 9256, 0, 8192, 9216, + 9248, 9256, 0, 8192, 9216, 9248, 9256, 9258, + 0, 8192, 9216, 9248, 9256, 0, 8192, 9216, + 9248, 9264, 9260, 0, 8192, 9216, 9248, 9264, + 9260, 0, 8192, 9216, 9248, 9264, 9265, 9262, + 0, 8192, 9216, 9248, 0, 8192, 9216, 9280, + 9264, 0, 8192, 9216, 9280, 9264, 0, 8192, + 9216, 9280, 9264, 9266, 0, 8192, 9216, 9280, + 9264, 0, 8192, 9216, 9280, 9264, 9268, 0, + 8192, 9216, 9280, 9264, 9268, 0, 8192, 9216, + 9280, 9264, 9272, 9270, 0, 8192, 9216, 9280, + 9264, 0, 8192, 9216, 9280, 9281, 9272, 0, + 8192, 9216, 9280, 9281, 9272, 0, 8192, 9216, + 9280, 9281, 9272, 9274, 0, 8192, 9216, 9280, + 9281, 9272, 0, 8192, 9216, 9280, 9281, 9272, + 9276, 0, 8192, 9216, 9280, 9281, 9283, 9276, + 0, 8192, 9216, 9280, 9281, 9283, 9276, 9278, + 0, 8192, 9216, 0, 8192, 9216, 9280, 0, + 8192, 9216, 9280, 0, 8192, 9216, 9280, 9282, + 0, 8192, 9216, 9280, 0, 8192, 9216, 9280, + 9284, 0, 8192, 9216, 9280, 9284, 0, 8192, + 9216, 9280, 9288, 9286, 0, 8192, 9216, 9280, + 0, 8192, 9216, 9280, 9288, 0, 8192, 9216, + 9280, 9288, 0, 8192, 9216, 9280, 9288, 9290, + 0, 8192, 9216, 9280, 9288, 0, 8192, 9216, + 9280, 9296, 9292, 0, 8192, 9216, 9280, 9296, + 9292, 0, 8192, 9216, 9280, 9296, 9297, 9294, + 0, 8192, 9216, 9280, 0, 8192, 9216, 9280, + 9296, 0, 8192, 9216, 9280, 9296, 0, 8192, + 9216, 9280, 9296, 9298, 0, 8192, 9216, 9280, + 9296, 0, 8192, 9216, 9280, 9296, 9300, 0, + 8192, 9216, 9280, 9296, 9300, 0, 8192, 9216, + 9280, 9296, 9304, 9302, 0, 8192, 9216, 9280, + 9296, 0, 8192, 9216, 9280, 9312, 9304, 0, + 8192, 9216, 9280, 9312, 9304, 0, 8192, 9216, + 9280, 9312, 9304, 9306, 0, 8192, 9216, 9280, + 9312, 9304, 0, 8192, 9216, 9280, 9312, 9313, + 9308, 0, 8192, 9216, 9280, 9312, 9313, 9308, + 0, 8192, 9216, 9280, 9312, 9313, 9308, 9310, + 0, 8192, 9216, 9280, 0, 8192, 9216, 9344, + 9312, 0, 8192, 9216, 9344, 9312, 0, 8192, + 9216, 9344, 9312, 9314, 0, 8192, 9216, 9344, + 9312, 0, 8192, 9216, 9344, 9312, 9316, 0, + 8192, 9216, 9344, 9312, 9316, 0, 8192, 9216, + 9344, 9312, 9320, 9318, 0, 8192, 9216, 9344, + 9312, 0, 8192, 9216, 9344, 9312, 9320, 0, + 8192, 9216, 9344, 9312, 9320, 0, 8192, 9216, + 9344, 9312, 9320, 9322, 0, 8192, 9216, 9344, + 9312, 9320, 0, 8192, 9216, 9344, 9312, 9328, + 9324, 0, 8192, 9216, 9344, 9312, 9328, 9324, + 0, 8192, 9216, 9344, 9312, 9328, 9329, 9326, + 0, 8192, 9216, 9344, 9312, 0, 8192, 9216, + 9344, 9345, 9328, 0, 8192, 9216, 9344, 9345, + 9328, 0, 8192, 9216, 9344, 9345, 9328, 9330, + 0, 8192, 9216, 9344, 9345, 9328, 0, 8192, + 9216, 9344, 9345, 9328, 9332, 0, 8192, 9216, + 9344, 9345, 9328, 9332, 0, 8192, 9216, 9344, + 9345, 9328, 9336, 9334, 0, 8192, 9216, 9344, + 9345, 9328, 0, 8192, 9216, 9344, 9345, 9328, + 9336, 0, 8192, 9216, 9344, 9345, 9347, 9336, + 0, 8192, 9216, 9344, 9345, 9347, 9336, 9338, + 0, 8192, 9216, 9344, 9345, 9347, 9336, 0, + 8192, 9216, 9344, 9345, 9347, 9336, 9340, 0, + 8192, 9216, 9344, 9345, 9347, 9336, 9340, 0, + 8192, 9216, 9344, 9345, 9347, 9336, 9340, 9342, + 0, 8192, 9216, 0, 8192, 9216, 9344, 0, + 8192, 9216, 9344, 0, 8192, 9216, 9344, 9346, + 0, 8192, 9216, 9344, 0, 8192, 9216, 9344, + 9348, 0, 8192, 9216, 9344, 9348, 0, 8192, + 9216, 9344, 9352, 9350, 0, 8192, 9216, 9344, + 0, 8192, 9216, 9344, 9352, 0, 8192, 9216, + 9344, 9352, 0, 8192, 9216, 9344, 9352, 9354, + 0, 8192, 9216, 9344, 9352, 0, 8192, 9216, + 9344, 9360, 9356, 0, 8192, 9216, 9344, 9360, + 9356, 0, 8192, 9216, 9344, 9360, 9361, 9358, + 0, 8192, 9216, 9344, 0, 8192, 9216, 9344, + 9360, 0, 8192, 9216, 9344, 9360, 0, 8192, + 9216, 9344, 9360, 9362, 0, 8192, 9216, 9344, + 9360, 0, 8192, 9216, 9344, 9360, 9364, 0, + 8192, 9216, 9344, 9360, 9364, 0, 8192, 9216, + 9344, 9360, 9368, 9366, 0, 8192, 9216, 9344, + 9360, 0, 8192, 9216, 9344, 9376, 9368, 0, + 8192, 9216, 9344, 9376, 9368, 0, 8192, 9216, + 9344, 9376, 9368, 9370, 0, 8192, 9216, 9344, + 9376, 9368, 0, 8192, 9216, 9344, 9376, 9377, + 9372, 0, 8192, 9216, 9344, 9376, 9377, 9372, + 0, 8192, 9216, 9344, 9376, 9377, 9372, 9374, + 0, 8192, 9216, 9344, 0, 8192, 9216, 9344, + 9376, 0, 8192, 9216, 9344, 9376, 0, 8192, + 9216, 9344, 9376, 9378, 0, 8192, 9216, 9344, + 9376, 0, 8192, 9216, 9344, 9376, 9380, 0, + 8192, 9216, 9344, 9376, 9380, 0, 8192, 9216, + 9344, 9376, 9384, 9382, 0, 8192, 9216, 9344, + 9376, 0, 8192, 9216, 9344, 9376, 9384, 0, + 8192, 9216, 9344, 9376, 9384, 0, 8192, 9216, + 9344, 9376, 9384, 9386, 0, 8192, 9216, 9344, + 9376, 9384, 0, 8192, 9216, 9344, 9376, 9392, + 9388, 0, 8192, 9216, 9344, 9376, 9392, 9388, + 0, 8192, 9216, 9344, 9376, 9392, 9393, 9390, + 0, 8192, 9216, 9344, 9376, 0, 8192, 9216, + 9344, 9408, 9392, 0, 8192, 9216, 9344, 9408, + 9392, 0, 8192, 9216, 9344, 9408, 9392, 9394, + 0, 8192, 9216, 9344, 9408, 9392, 0, 8192, + 9216, 9344, 9408, 9392, 9396, 0, 8192, 9216, + 9344, 9408, 9392, 9396, 0, 8192, 9216, 9344, + 9408, 9392, 9400, 9398, 0, 8192, 9216, 9344, + 9408, 9392, 0, 8192, 9216, 9344, 9408, 9409, + 9400, 0, 8192, 9216, 9344, 9408, 9409, 9400, + 0, 8192, 9216, 9344, 9408, 9409, 9400, 9402, + 0, 8192, 9216, 9344, 9408, 9409, 9400, 0, + 8192, 9216, 9344, 9408, 9409, 9400, 9404, 0, + 8192, 9216, 9344, 9408, 9409, 9411, 9404, 0, + 8192, 9216, 9344, 9408, 9409, 9411, 9404, 9406, + 0, 8192, 9216, 9344, 0, 8192, 9216, 9472, + 9408, 0, 8192, 9216, 9472, 9408, 0, 8192, + 9216, 9472, 9408, 9410, 0, 8192, 9216, 9472, + 9408, 0, 8192, 9216, 9472, 9408, 9412, 0, + 8192, 9216, 9472, 9408, 9412, 0, 8192, 9216, + 9472, 9408, 9416, 9414, 0, 8192, 9216, 9472, + 9408, 0, 8192, 9216, 9472, 9408, 9416, 0, + 8192, 9216, 9472, 9408, 9416, 0, 8192, 9216, + 9472, 9408, 9416, 9418, 0, 8192, 9216, 9472, + 9408, 9416, 0, 8192, 9216, 9472, 9408, 9424, + 9420, 0, 8192, 9216, 9472, 9408, 9424, 9420, + 0, 8192, 9216, 9472, 9408, 9424, 9425, 9422, + 0, 8192, 9216, 9472, 9408, 0, 8192, 9216, + 9472, 9408, 9424, 0, 8192, 9216, 9472, 9408, + 9424, 0, 8192, 9216, 9472, 9408, 9424, 9426, + 0, 8192, 9216, 9472, 9408, 9424, 0, 8192, + 9216, 9472, 9408, 9424, 9428, 0, 8192, 9216, + 9472, 9408, 9424, 9428, 0, 8192, 9216, 9472, + 9408, 9424, 9432, 9430, 0, 8192, 9216, 9472, + 9408, 9424, 0, 8192, 9216, 9472, 9408, 9440, + 9432, 0, 8192, 9216, 9472, 9408, 9440, 9432, + 0, 8192, 9216, 9472, 9408, 9440, 9432, 9434, + 0, 8192, 9216, 9472, 9408, 9440, 9432, 0, + 8192, 9216, 9472, 9408, 9440, 9441, 9436, 0, + 8192, 9216, 9472, 9408, 9440, 9441, 9436, 0, + 8192, 9216, 9472, 9408, 9440, 9441, 9436, 9438, + 0, 8192, 9216, 9472, 9408, 0, 8192, 9216, + 9472, 9473, 9440, 0, 8192, 9216, 9472, 9473, + 9440, 0, 8192, 9216, 9472, 9473, 9440, 9442, + 0, 8192, 9216, 9472, 9473, 9440, 0, 8192, + 9216, 9472, 9473, 9440, 9444, 0, 8192, 9216, + 9472, 9473, 9440, 9444, 0, 8192, 9216, 9472, + 9473, 9440, 9448, 9446, 0, 8192, 9216, 9472, + 9473, 9440, 0, 8192, 9216, 9472, 9473, 9440, + 9448, 0, 8192, 9216, 9472, 9473, 9440, 9448, + 0, 8192, 9216, 9472, 9473, 9440, 9448, 9450, + 0, 8192, 9216, 9472, 9473, 9440, 9448, 0, + 8192, 9216, 9472, 9473, 9440, 9456, 9452, 0, + 8192, 9216, 9472, 9473, 9440, 9456, 9452, 0, + 8192, 9216, 9472, 9473, 9440, 9456, 9457, 9454, + 0, 8192, 9216, 9472, 9473, 9440, 0, 8192, + 9216, 9472, 9473, 9440, 9456, 0, 8192, 9216, + 9472, 9473, 9475, 9456, 0, 8192, 9216, 9472, + 9473, 9475, 9456, 9458, 0, 8192, 9216, 9472, + 9473, 9475, 9456, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9460, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9460, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9464, 9462, 0, 8192, 9216, 9472, + 9473, 9475, 9456, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9464, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9464, 0, 8192, 9216, 9472, 9473, + 9475, 9456, 9464, 9466, 0, 8192, 9216, 9472, + 9473, 9475, 9479, 9464, 0, 8192, 9216, 9472, + 9473, 9475, 9479, 9464, 9468, 0, 8192, 9216, + 9472, 9473, 9475, 9479, 9464, 9468, 0, 8192, + 9216, 9472, 9473, 9475, 9479, 9464, 9468, 9470, + 0, 8192, 9216, 0, 8192, 9216, 9472, 0, + 8192, 9216, 9472, 0, 8192, 9216, 9472, 9474, + 0, 8192, 9216, 9472, 0, 8192, 9216, 9472, + 9476, 0, 8192, 9216, 9472, 9476, 0, 8192, + 9216, 9472, 9480, 9478, 0, 8192, 9216, 9472, + 0, 8192, 9216, 9472, 9480, 0, 8192, 9216, + 9472, 9480, 0, 8192, 9216, 9472, 9480, 9482, + 0, 8192, 9216, 9472, 9480, 0, 8192, 9216, + 9472, 9488, 9484, 0, 8192, 9216, 9472, 9488, + 9484, 0, 8192, 9216, 9472, 9488, 9489, 9486, + 0, 8192, 9216, 9472, 0, 8192, 9216, 9472, + 9488, 0, 8192, 9216, 9472, 9488, 0, 8192, + 9216, 9472, 9488, 9490, 0, 8192, 9216, 9472, + 9488, 0, 8192, 9216, 9472, 9488, 9492, 0, + 8192, 9216, 9472, 9488, 9492, 0, 8192, 9216, + 9472, 9488, 9496, 9494, 0, 8192, 9216, 9472, + 9488, 0, 8192, 9216, 9472, 9504, 9496, 0, + 8192, 9216, 9472, 9504, 9496, 0, 8192, 9216, + 9472, 9504, 9496, 9498, 0, 8192, 9216, 9472, + 9504, 9496, 0, 8192, 9216, 9472, 9504, 9505, + 9500, 0, 8192, 9216, 9472, 9504, 9505, 9500, + 0, 8192, 9216, 9472, 9504, 9505, 9500, 9502, + 0, 8192, 9216, 9472, 0, 8192, 9216, 9472, + 9504, 0, 8192, 9216, 9472, 9504, 0, 8192, + 9216, 9472, 9504, 9506, 0, 8192, 9216, 9472, + 9504, 0, 8192, 9216, 9472, 9504, 9508, 0, + 8192, 9216, 9472, 9504, 9508, 0, 8192, 9216, + 9472, 9504, 9512, 9510, 0, 8192, 9216, 9472, + 9504, 0, 8192, 9216, 9472, 9504, 9512, 0, + 8192, 9216, 9472, 9504, 9512, 0, 8192, 9216, + 9472, 9504, 9512, 9514, 0, 8192, 9216, 9472, + 9504, 9512, 0, 8192, 9216, 9472, 9504, 9520, + 9516, 0, 8192, 9216, 9472, 9504, 9520, 9516, + 0, 8192, 9216, 9472, 9504, 9520, 9521, 9518, + 0, 8192, 9216, 9472, 9504, 0, 8192, 9216, + 9472, 9536, 9520, 0, 8192, 9216, 9472, 9536, + 9520, 0, 8192, 9216, 9472, 9536, 9520, 9522, + 0, 8192, 9216, 9472, 9536, 9520, 0, 8192, + 9216, 9472, 9536, 9520, 9524, 0, 8192, 9216, + 9472, 9536, 9520, 9524, 0, 8192, 9216, 9472, + 9536, 9520, 9528, 9526, 0, 8192, 9216, 9472, + 9536, 9520, 0, 8192, 9216, 9472, 9536, 9537, + 9528, 0, 8192, 9216, 9472, 9536, 9537, 9528, + 0, 8192, 9216, 9472, 9536, 9537, 9528, 9530, + 0, 8192, 9216, 9472, 9536, 9537, 9528, 0, + 8192, 9216, 9472, 9536, 9537, 9528, 9532, 0, + 8192, 9216, 9472, 9536, 9537, 9539, 9532, 0, + 8192, 9216, 9472, 9536, 9537, 9539, 9532, 9534, + 0, 8192, 9216, 9472, 0, 8192, 9216, 9472, + 9536, 0, 8192, 9216, 9472, 9536, 0, 8192, + 9216, 9472, 9536, 9538, 0, 8192, 9216, 9472, + 9536, 0, 8192, 9216, 9472, 9536, 9540, 0, + 8192, 9216, 9472, 9536, 9540, 0, 8192, 9216, + 9472, 9536, 9544, 9542, 0, 8192, 9216, 9472, + 9536, 0, 8192, 9216, 9472, 9536, 9544, 0, + 8192, 9216, 9472, 9536, 9544, 0, 8192, 9216, + 9472, 9536, 9544, 9546, 0, 8192, 9216, 9472, + 9536, 9544, 0, 8192, 9216, 9472, 9536, 9552, + 9548, 0, 8192, 9216, 9472, 9536, 9552, 9548, + 0, 8192, 9216, 9472, 9536, 9552, 9553, 9550, + 0, 8192, 9216, 9472, 9536, 0, 8192, 9216, + 9472, 9536, 9552, 0, 8192, 9216, 9472, 9536, + 9552, 0, 8192, 9216, 9472, 9536, 9552, 9554, + 0, 8192, 9216, 9472, 9536, 9552, 0, 8192, + 9216, 9472, 9536, 9552, 9556, 0, 8192, 9216, + 9472, 9536, 9552, 9556, 0, 8192, 9216, 9472, + 9536, 9552, 9560, 9558, 0, 8192, 9216, 9472, + 9536, 9552, 0, 8192, 9216, 9472, 9536, 9568, + 9560, 0, 8192, 9216, 9472, 9536, 9568, 9560, + 0, 8192, 9216, 9472, 9536, 9568, 9560, 9562, + 0, 8192, 9216, 9472, 9536, 9568, 9560, 0, + 8192, 9216, 9472, 9536, 9568, 9569, 9564, 0, + 8192, 9216, 9472, 9536, 9568, 9569, 9564, 0, + 8192, 9216, 9472, 9536, 9568, 9569, 9564, 9566, + 0, 8192, 9216, 9472, 9536, 0, 8192, 9216, + 9472, 9600, 9568, 0, 8192, 9216, 9472, 9600, + 9568, 0, 8192, 9216, 9472, 9600, 9568, 9570, + 0, 8192, 9216, 9472, 9600, 9568, 0, 8192, + 9216, 9472, 9600, 9568, 9572, 0, 8192, 9216, + 9472, 9600, 9568, 9572, 0, 8192, 9216, 9472, + 9600, 9568, 9576, 9574, 0, 8192, 9216, 9472, + 9600, 9568, 0, 8192, 9216, 9472, 9600, 9568, + 9576, 0, 8192, 9216, 9472, 9600, 9568, 9576, + 0, 8192, 9216, 9472, 9600, 9568, 9576, 9578, + 0, 8192, 9216, 9472, 9600, 9568, 9576, 0, + 8192, 9216, 9472, 9600, 9568, 9584, 9580, 0, + 8192, 9216, 9472, 9600, 9568, 9584, 9580, 0, + 8192, 9216, 9472, 9600, 9568, 9584, 9585, 9582, + 0, 8192, 9216, 9472, 9600, 9568, 0, 8192, + 9216, 9472, 9600, 9601, 9584, 0, 8192, 9216, + 9472, 9600, 9601, 9584, 0, 8192, 9216, 9472, + 9600, 9601, 9584, 9586, 0, 8192, 9216, 9472, + 9600, 9601, 9584, 0, 8192, 9216, 9472, 9600, + 9601, 9584, 9588, 0, 8192, 9216, 9472, 9600, + 9601, 9584, 9588, 0, 8192, 9216, 9472, 9600, + 9601, 9584, 9592, 9590, 0, 8192, 9216, 9472, + 9600, 9601, 9584, 0, 8192, 9216, 9472, 9600, + 9601, 9584, 9592, 0, 8192, 9216, 9472, 9600, + 9601, 9603, 9592, 0, 8192, 9216, 9472, 9600, + 9601, 9603, 9592, 9594, 0, 8192, 9216, 9472, + 9600, 9601, 9603, 9592, 0, 8192, 9216, 9472, + 9600, 9601, 9603, 9592, 9596, 0, 8192, 9216, + 9472, 9600, 9601, 9603, 9592, 9596, 0, 8192, + 9216, 9472, 9600, 9601, 9603, 9592, 9596, 9598, + 0, 8192, 9216, 9472, 0, 8192, 9216, 9728, + 9600, 0, 8192, 9216, 9728, 9600, 0, 8192, + 9216, 9728, 9600, 9602, 0, 8192, 9216, 9728, + 9600, 0, 8192, 9216, 9728, 9600, 9604, 0, + 8192, 9216, 9728, 9600, 9604, 0, 8192, 9216, + 9728, 9600, 9608, 9606, 0, 8192, 9216, 9728, + 9600, 0, 8192, 9216, 9728, 9600, 9608, 0, + 8192, 9216, 9728, 9600, 9608, 0, 8192, 9216, + 9728, 9600, 9608, 9610, 0, 8192, 9216, 9728, + 9600, 9608, 0, 8192, 9216, 9728, 9600, 9616, + 9612, 0, 8192, 9216, 9728, 9600, 9616, 9612, + 0, 8192, 9216, 9728, 9600, 9616, 9617, 9614, + 0, 8192, 9216, 9728, 9600, 0, 8192, 9216, + 9728, 9600, 9616, 0, 8192, 9216, 9728, 9600, + 9616, 0, 8192, 9216, 9728, 9600, 9616, 9618, + 0, 8192, 9216, 9728, 9600, 9616, 0, 8192, + 9216, 9728, 9600, 9616, 9620, 0, 8192, 9216, + 9728, 9600, 9616, 9620, 0, 8192, 9216, 9728, + 9600, 9616, 9624, 9622, 0, 8192, 9216, 9728, + 9600, 9616, 0, 8192, 9216, 9728, 9600, 9632, + 9624, 0, 8192, 9216, 9728, 9600, 9632, 9624, + 0, 8192, 9216, 9728, 9600, 9632, 9624, 9626, + 0, 8192, 9216, 9728, 9600, 9632, 9624, 0, + 8192, 9216, 9728, 9600, 9632, 9633, 9628, 0, + 8192, 9216, 9728, 9600, 9632, 9633, 9628, 0, + 8192, 9216, 9728, 9600, 9632, 9633, 9628, 9630, + 0, 8192, 9216, 9728, 9600, 0, 8192, 9216, + 9728, 9600, 9632, 0, 8192, 9216, 9728, 9600, + 9632, 0, 8192, 9216, 9728, 9600, 9632, 9634, + 0, 8192, 9216, 9728, 9600, 9632, 0, 8192, + 9216, 9728, 9600, 9632, 9636, 0, 8192, 9216, + 9728, 9600, 9632, 9636, 0, 8192, 9216, 9728, + 9600, 9632, 9640, 9638, 0, 8192, 9216, 9728, + 9600, 9632, 0, 8192, 9216, 9728, 9600, 9632, + 9640, 0, 8192, 9216, 9728, 9600, 9632, 9640, + 0, 8192, 9216, 9728, 9600, 9632, 9640, 9642, + 0, 8192, 9216, 9728, 9600, 9632, 9640, 0, + 8192, 9216, 9728, 9600, 9632, 9648, 9644, 0, + 8192, 9216, 9728, 9600, 9632, 9648, 9644, 0, + 8192, 9216, 9728, 9600, 9632, 9648, 9649, 9646, + 0, 8192, 9216, 9728, 9600, 9632, 0, 8192, + 9216, 9728, 9600, 9664, 9648, 0, 8192, 9216, + 9728, 9600, 9664, 9648, 0, 8192, 9216, 9728, + 9600, 9664, 9648, 9650, 0, 8192, 9216, 9728, + 9600, 9664, 9648, 0, 8192, 9216, 9728, 9600, + 9664, 9648, 9652, 0, 8192, 9216, 9728, 9600, + 9664, 9648, 9652, 0, 8192, 9216, 9728, 9600, + 9664, 9648, 9656, 9654, 0, 8192, 9216, 9728, + 9600, 9664, 9648, 0, 8192, 9216, 9728, 9600, + 9664, 9665, 9656, 0, 8192, 9216, 9728, 9600, + 9664, 9665, 9656, 0, 8192, 9216, 9728, 9600, + 9664, 9665, 9656, 9658, 0, 8192, 9216, 9728, + 9600, 9664, 9665, 9656, 0, 8192, 9216, 9728, + 9600, 9664, 9665, 9656, 9660, 0, 8192, 9216, + 9728, 9600, 9664, 9665, 9667, 9660, 0, 8192, + 9216, 9728, 9600, 9664, 9665, 9667, 9660, 9662, + 0, 8192, 9216, 9728, 9600, 0, 8192, 9216, + 9728, 9729, 9664, 0, 8192, 9216, 9728, 9729, + 9664, 0, 8192, 9216, 9728, 9729, 9664, 9666, + 0, 8192, 9216, 9728, 9729, 9664, 0, 8192, + 9216, 9728, 9729, 9664, 9668, 0, 8192, 9216, + 9728, 9729, 9664, 9668, 0, 8192, 9216, 9728, + 9729, 9664, 9672, 9670, 0, 8192, 9216, 9728, + 9729, 9664, 0, 8192, 9216, 9728, 9729, 9664, + 9672, 0, 8192, 9216, 9728, 9729, 9664, 9672, + 0, 8192, 9216, 9728, 9729, 9664, 9672, 9674, + 0, 8192, 9216, 9728, 9729, 9664, 9672, 0, + 8192, 9216, 9728, 9729, 9664, 9680, 9676, 0, + 8192, 9216, 9728, 9729, 9664, 9680, 9676, 0, + 8192, 9216, 9728, 9729, 9664, 9680, 9681, 9678, + 0, 8192, 9216, 9728, 9729, 9664, 0, 8192, + 9216, 9728, 9729, 9664, 9680, 0, 8192, 9216, + 9728, 9729, 9664, 9680, 0, 8192, 9216, 9728, + 9729, 9664, 9680, 9682, 0, 8192, 9216, 9728, + 9729, 9664, 9680, 0, 8192, 9216, 9728, 9729, + 9664, 9680, 9684, 0, 8192, 9216, 9728, 9729, + 9664, 9680, 9684, 0, 8192, 9216, 9728, 9729, + 9664, 9680, 9688, 9686, 0, 8192, 9216, 9728, + 9729, 9664, 9680, 0, 8192, 9216, 9728, 9729, + 9664, 9696, 9688, 0, 8192, 9216, 9728, 9729, + 9664, 9696, 9688, 0, 8192, 9216, 9728, 9729, + 9664, 9696, 9688, 9690, 0, 8192, 9216, 9728, + 9729, 9664, 9696, 9688, 0, 8192, 9216, 9728, + 9729, 9664, 9696, 9697, 9692, 0, 8192, 9216, + 9728, 9729, 9664, 9696, 9697, 9692, 0, 8192, + 9216, 9728, 9729, 9664, 9696, 9697, 9692, 9694, + 0, 8192, 9216, 9728, 9729, 9664, 0, 8192, + 9216, 9728, 9729, 9664, 9696, 0, 8192, 9216, + 9728, 9729, 9731, 9696, 0, 8192, 9216, 9728, + 9729, 9731, 9696, 9698, 0, 8192, 9216, 9728, + 9729, 9731, 9696, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9700, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9700, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9704, 9702, 0, 8192, 9216, 9728, + 9729, 9731, 9696, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9704, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9704, 0, 8192, 9216, 9728, 9729, + 9731, 9696, 9704, 9706, 0, 8192, 9216, 9728, + 9729, 9731, 9696, 9704, 0, 8192, 9216, 9728, + 9729, 9731, 9696, 9712, 9708, 0, 8192, 9216, + 9728, 9729, 9731, 9696, 9712, 9708, 0, 8192, + 9216, 9728, 9729, 9731, 9696, 9712, 9713, 9710, + 0, 8192, 9216, 9728, 9729, 9731, 9696, 0, + 8192, 9216, 9728, 9729, 9731, 9696, 9712, 0, + 8192, 9216, 9728, 9729, 9731, 9696, 9712, 0, + 8192, 9216, 9728, 9729, 9731, 9696, 9712, 9714, + 0, 8192, 9216, 9728, 9729, 9731, 9735, 9712, + 0, 8192, 9216, 9728, 9729, 9731, 9735, 9712, + 9716, 0, 8192, 9216, 9728, 9729, 9731, 9735, + 9712, 9716, 0, 8192, 9216, 9728, 9729, 9731, + 9735, 9712, 9720, 9718, 0, 8192, 9216, 9728, + 9729, 9731, 9735, 9712, 0, 8192, 9216, 9728, + 9729, 9731, 9735, 9712, 9720, 0, 8192, 9216, + 9728, 9729, 9731, 9735, 9712, 9720, 0, 8192, + 9216, 9728, 9729, 9731, 9735, 9712, 9720, 9722, + 0, 8192, 9216, 9728, 9729, 9731, 9735, 9712, + 9720, 0, 8192, 9216, 9728, 9729, 9731, 9735, + 9712, 9720, 9724, 0, 8192, 9216, 9728, 9729, + 9731, 9735, 9712, 9720, 9724, 0, 8192, 9216, + 9728, 9729, 9731, 9735, 9712, 9720, 9724, 9726, + 0, 8192, 9216, 0, 8192, 10240, 9728, 0, + 8192, 10240, 9728, 0, 8192, 10240, 9728, 9730, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9732, 0, 8192, 10240, 9728, 9732, 0, 8192, + 10240, 9728, 9736, 9734, 0, 8192, 10240, 9728, + 0, 8192, 10240, 9728, 9736, 0, 8192, 10240, + 9728, 9736, 0, 8192, 10240, 9728, 9736, 9738, + 0, 8192, 10240, 9728, 9736, 0, 8192, 10240, + 9728, 9744, 9740, 0, 8192, 10240, 9728, 9744, + 9740, 0, 8192, 10240, 9728, 9744, 9745, 9742, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9744, 0, 8192, 10240, 9728, 9744, 0, 8192, + 10240, 9728, 9744, 9746, 0, 8192, 10240, 9728, + 9744, 0, 8192, 10240, 9728, 9744, 9748, 0, + 8192, 10240, 9728, 9744, 9748, 0, 8192, 10240, + 9728, 9744, 9752, 9750, 0, 8192, 10240, 9728, + 9744, 0, 8192, 10240, 9728, 9760, 9752, 0, + 8192, 10240, 9728, 9760, 9752, 0, 8192, 10240, + 9728, 9760, 9752, 9754, 0, 8192, 10240, 9728, + 9760, 9752, 0, 8192, 10240, 9728, 9760, 9761, + 9756, 0, 8192, 10240, 9728, 9760, 9761, 9756, + 0, 8192, 10240, 9728, 9760, 9761, 9756, 9758, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9760, 0, 8192, 10240, 9728, 9760, 0, 8192, + 10240, 9728, 9760, 9762, 0, 8192, 10240, 9728, + 9760, 0, 8192, 10240, 9728, 9760, 9764, 0, + 8192, 10240, 9728, 9760, 9764, 0, 8192, 10240, + 9728, 9760, 9768, 9766, 0, 8192, 10240, 9728, + 9760, 0, 8192, 10240, 9728, 9760, 9768, 0, + 8192, 10240, 9728, 9760, 9768, 0, 8192, 10240, + 9728, 9760, 9768, 9770, 0, 8192, 10240, 9728, + 9760, 9768, 0, 8192, 10240, 9728, 9760, 9776, + 9772, 0, 8192, 10240, 9728, 9760, 9776, 9772, + 0, 8192, 10240, 9728, 9760, 9776, 9777, 9774, + 0, 8192, 10240, 9728, 9760, 0, 8192, 10240, + 9728, 9792, 9776, 0, 8192, 10240, 9728, 9792, + 9776, 0, 8192, 10240, 9728, 9792, 9776, 9778, + 0, 8192, 10240, 9728, 9792, 9776, 0, 8192, + 10240, 9728, 9792, 9776, 9780, 0, 8192, 10240, + 9728, 9792, 9776, 9780, 0, 8192, 10240, 9728, + 9792, 9776, 9784, 9782, 0, 8192, 10240, 9728, + 9792, 9776, 0, 8192, 10240, 9728, 9792, 9793, + 9784, 0, 8192, 10240, 9728, 9792, 9793, 9784, + 0, 8192, 10240, 9728, 9792, 9793, 9784, 9786, + 0, 8192, 10240, 9728, 9792, 9793, 9784, 0, + 8192, 10240, 9728, 9792, 9793, 9784, 9788, 0, + 8192, 10240, 9728, 9792, 9793, 9795, 9788, 0, + 8192, 10240, 9728, 9792, 9793, 9795, 9788, 9790, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9792, 0, 8192, 10240, 9728, 9792, 0, 8192, + 10240, 9728, 9792, 9794, 0, 8192, 10240, 9728, + 9792, 0, 8192, 10240, 9728, 9792, 9796, 0, + 8192, 10240, 9728, 9792, 9796, 0, 8192, 10240, + 9728, 9792, 9800, 9798, 0, 8192, 10240, 9728, + 9792, 0, 8192, 10240, 9728, 9792, 9800, 0, + 8192, 10240, 9728, 9792, 9800, 0, 8192, 10240, + 9728, 9792, 9800, 9802, 0, 8192, 10240, 9728, + 9792, 9800, 0, 8192, 10240, 9728, 9792, 9808, + 9804, 0, 8192, 10240, 9728, 9792, 9808, 9804, + 0, 8192, 10240, 9728, 9792, 9808, 9809, 9806, + 0, 8192, 10240, 9728, 9792, 0, 8192, 10240, + 9728, 9792, 9808, 0, 8192, 10240, 9728, 9792, + 9808, 0, 8192, 10240, 9728, 9792, 9808, 9810, + 0, 8192, 10240, 9728, 9792, 9808, 0, 8192, + 10240, 9728, 9792, 9808, 9812, 0, 8192, 10240, + 9728, 9792, 9808, 9812, 0, 8192, 10240, 9728, + 9792, 9808, 9816, 9814, 0, 8192, 10240, 9728, + 9792, 9808, 0, 8192, 10240, 9728, 9792, 9824, + 9816, 0, 8192, 10240, 9728, 9792, 9824, 9816, + 0, 8192, 10240, 9728, 9792, 9824, 9816, 9818, + 0, 8192, 10240, 9728, 9792, 9824, 9816, 0, + 8192, 10240, 9728, 9792, 9824, 9825, 9820, 0, + 8192, 10240, 9728, 9792, 9824, 9825, 9820, 0, + 8192, 10240, 9728, 9792, 9824, 9825, 9820, 9822, + 0, 8192, 10240, 9728, 9792, 0, 8192, 10240, + 9728, 9856, 9824, 0, 8192, 10240, 9728, 9856, + 9824, 0, 8192, 10240, 9728, 9856, 9824, 9826, + 0, 8192, 10240, 9728, 9856, 9824, 0, 8192, + 10240, 9728, 9856, 9824, 9828, 0, 8192, 10240, + 9728, 9856, 9824, 9828, 0, 8192, 10240, 9728, + 9856, 9824, 9832, 9830, 0, 8192, 10240, 9728, + 9856, 9824, 0, 8192, 10240, 9728, 9856, 9824, + 9832, 0, 8192, 10240, 9728, 9856, 9824, 9832, + 0, 8192, 10240, 9728, 9856, 9824, 9832, 9834, + 0, 8192, 10240, 9728, 9856, 9824, 9832, 0, + 8192, 10240, 9728, 9856, 9824, 9840, 9836, 0, + 8192, 10240, 9728, 9856, 9824, 9840, 9836, 0, + 8192, 10240, 9728, 9856, 9824, 9840, 9841, 9838, + 0, 8192, 10240, 9728, 9856, 9824, 0, 8192, + 10240, 9728, 9856, 9857, 9840, 0, 8192, 10240, + 9728, 9856, 9857, 9840, 0, 8192, 10240, 9728, + 9856, 9857, 9840, 9842, 0, 8192, 10240, 9728, + 9856, 9857, 9840, 0, 8192, 10240, 9728, 9856, + 9857, 9840, 9844, 0, 8192, 10240, 9728, 9856, + 9857, 9840, 9844, 0, 8192, 10240, 9728, 9856, + 9857, 9840, 9848, 9846, 0, 8192, 10240, 9728, + 9856, 9857, 9840, 0, 8192, 10240, 9728, 9856, + 9857, 9840, 9848, 0, 8192, 10240, 9728, 9856, + 9857, 9859, 9848, 0, 8192, 10240, 9728, 9856, + 9857, 9859, 9848, 9850, 0, 8192, 10240, 9728, + 9856, 9857, 9859, 9848, 0, 8192, 10240, 9728, + 9856, 9857, 9859, 9848, 9852, 0, 8192, 10240, + 9728, 9856, 9857, 9859, 9848, 9852, 0, 8192, + 10240, 9728, 9856, 9857, 9859, 9848, 9852, 9854, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9856, 0, 8192, 10240, 9728, 9856, 0, 8192, + 10240, 9728, 9856, 9858, 0, 8192, 10240, 9728, + 9856, 0, 8192, 10240, 9728, 9856, 9860, 0, + 8192, 10240, 9728, 9856, 9860, 0, 8192, 10240, + 9728, 9856, 9864, 9862, 0, 8192, 10240, 9728, + 9856, 0, 8192, 10240, 9728, 9856, 9864, 0, + 8192, 10240, 9728, 9856, 9864, 0, 8192, 10240, + 9728, 9856, 9864, 9866, 0, 8192, 10240, 9728, + 9856, 9864, 0, 8192, 10240, 9728, 9856, 9872, + 9868, 0, 8192, 10240, 9728, 9856, 9872, 9868, + 0, 8192, 10240, 9728, 9856, 9872, 9873, 9870, + 0, 8192, 10240, 9728, 9856, 0, 8192, 10240, + 9728, 9856, 9872, 0, 8192, 10240, 9728, 9856, + 9872, 0, 8192, 10240, 9728, 9856, 9872, 9874, + 0, 8192, 10240, 9728, 9856, 9872, 0, 8192, + 10240, 9728, 9856, 9872, 9876, 0, 8192, 10240, + 9728, 9856, 9872, 9876, 0, 8192, 10240, 9728, + 9856, 9872, 9880, 9878, 0, 8192, 10240, 9728, + 9856, 9872, 0, 8192, 10240, 9728, 9856, 9888, + 9880, 0, 8192, 10240, 9728, 9856, 9888, 9880, + 0, 8192, 10240, 9728, 9856, 9888, 9880, 9882, + 0, 8192, 10240, 9728, 9856, 9888, 9880, 0, + 8192, 10240, 9728, 9856, 9888, 9889, 9884, 0, + 8192, 10240, 9728, 9856, 9888, 9889, 9884, 0, + 8192, 10240, 9728, 9856, 9888, 9889, 9884, 9886, + 0, 8192, 10240, 9728, 9856, 0, 8192, 10240, + 9728, 9856, 9888, 0, 8192, 10240, 9728, 9856, + 9888, 0, 8192, 10240, 9728, 9856, 9888, 9890, + 0, 8192, 10240, 9728, 9856, 9888, 0, 8192, + 10240, 9728, 9856, 9888, 9892, 0, 8192, 10240, + 9728, 9856, 9888, 9892, 0, 8192, 10240, 9728, + 9856, 9888, 9896, 9894, 0, 8192, 10240, 9728, + 9856, 9888, 0, 8192, 10240, 9728, 9856, 9888, + 9896, 0, 8192, 10240, 9728, 9856, 9888, 9896, + 0, 8192, 10240, 9728, 9856, 9888, 9896, 9898, + 0, 8192, 10240, 9728, 9856, 9888, 9896, 0, + 8192, 10240, 9728, 9856, 9888, 9904, 9900, 0, + 8192, 10240, 9728, 9856, 9888, 9904, 9900, 0, + 8192, 10240, 9728, 9856, 9888, 9904, 9905, 9902, + 0, 8192, 10240, 9728, 9856, 9888, 0, 8192, + 10240, 9728, 9856, 9920, 9904, 0, 8192, 10240, + 9728, 9856, 9920, 9904, 0, 8192, 10240, 9728, + 9856, 9920, 9904, 9906, 0, 8192, 10240, 9728, + 9856, 9920, 9904, 0, 8192, 10240, 9728, 9856, + 9920, 9904, 9908, 0, 8192, 10240, 9728, 9856, + 9920, 9904, 9908, 0, 8192, 10240, 9728, 9856, + 9920, 9904, 9912, 9910, 0, 8192, 10240, 9728, + 9856, 9920, 9904, 0, 8192, 10240, 9728, 9856, + 9920, 9921, 9912, 0, 8192, 10240, 9728, 9856, + 9920, 9921, 9912, 0, 8192, 10240, 9728, 9856, + 9920, 9921, 9912, 9914, 0, 8192, 10240, 9728, + 9856, 9920, 9921, 9912, 0, 8192, 10240, 9728, + 9856, 9920, 9921, 9912, 9916, 0, 8192, 10240, + 9728, 9856, 9920, 9921, 9923, 9916, 0, 8192, + 10240, 9728, 9856, 9920, 9921, 9923, 9916, 9918, + 0, 8192, 10240, 9728, 9856, 0, 8192, 10240, + 9728, 9984, 9920, 0, 8192, 10240, 9728, 9984, + 9920, 0, 8192, 10240, 9728, 9984, 9920, 9922, + 0, 8192, 10240, 9728, 9984, 9920, 0, 8192, + 10240, 9728, 9984, 9920, 9924, 0, 8192, 10240, + 9728, 9984, 9920, 9924, 0, 8192, 10240, 9728, + 9984, 9920, 9928, 9926, 0, 8192, 10240, 9728, + 9984, 9920, 0, 8192, 10240, 9728, 9984, 9920, + 9928, 0, 8192, 10240, 9728, 9984, 9920, 9928, + 0, 8192, 10240, 9728, 9984, 9920, 9928, 9930, + 0, 8192, 10240, 9728, 9984, 9920, 9928, 0, + 8192, 10240, 9728, 9984, 9920, 9936, 9932, 0, + 8192, 10240, 9728, 9984, 9920, 9936, 9932, 0, + 8192, 10240, 9728, 9984, 9920, 9936, 9937, 9934, + 0, 8192, 10240, 9728, 9984, 9920, 0, 8192, + 10240, 9728, 9984, 9920, 9936, 0, 8192, 10240, + 9728, 9984, 9920, 9936, 0, 8192, 10240, 9728, + 9984, 9920, 9936, 9938, 0, 8192, 10240, 9728, + 9984, 9920, 9936, 0, 8192, 10240, 9728, 9984, + 9920, 9936, 9940, 0, 8192, 10240, 9728, 9984, + 9920, 9936, 9940, 0, 8192, 10240, 9728, 9984, + 9920, 9936, 9944, 9942, 0, 8192, 10240, 9728, + 9984, 9920, 9936, 0, 8192, 10240, 9728, 9984, + 9920, 9952, 9944, 0, 8192, 10240, 9728, 9984, + 9920, 9952, 9944, 0, 8192, 10240, 9728, 9984, + 9920, 9952, 9944, 9946, 0, 8192, 10240, 9728, + 9984, 9920, 9952, 9944, 0, 8192, 10240, 9728, + 9984, 9920, 9952, 9953, 9948, 0, 8192, 10240, + 9728, 9984, 9920, 9952, 9953, 9948, 0, 8192, + 10240, 9728, 9984, 9920, 9952, 9953, 9948, 9950, + 0, 8192, 10240, 9728, 9984, 9920, 0, 8192, + 10240, 9728, 9984, 9985, 9952, 0, 8192, 10240, + 9728, 9984, 9985, 9952, 0, 8192, 10240, 9728, + 9984, 9985, 9952, 9954, 0, 8192, 10240, 9728, + 9984, 9985, 9952, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9956, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9956, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9960, 9958, 0, 8192, 10240, 9728, + 9984, 9985, 9952, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9960, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9960, 0, 8192, 10240, 9728, 9984, + 9985, 9952, 9960, 9962, 0, 8192, 10240, 9728, + 9984, 9985, 9952, 9960, 0, 8192, 10240, 9728, + 9984, 9985, 9952, 9968, 9964, 0, 8192, 10240, + 9728, 9984, 9985, 9952, 9968, 9964, 0, 8192, + 10240, 9728, 9984, 9985, 9952, 9968, 9969, 9966, + 0, 8192, 10240, 9728, 9984, 9985, 9952, 0, + 8192, 10240, 9728, 9984, 9985, 9952, 9968, 0, + 8192, 10240, 9728, 9984, 9985, 9987, 9968, 0, + 8192, 10240, 9728, 9984, 9985, 9987, 9968, 9970, + 0, 8192, 10240, 9728, 9984, 9985, 9987, 9968, + 0, 8192, 10240, 9728, 9984, 9985, 9987, 9968, + 9972, 0, 8192, 10240, 9728, 9984, 9985, 9987, + 9968, 9972, 0, 8192, 10240, 9728, 9984, 9985, + 9987, 9968, 9976, 9974, 0, 8192, 10240, 9728, + 9984, 9985, 9987, 9968, 0, 8192, 10240, 9728, + 9984, 9985, 9987, 9968, 9976, 0, 8192, 10240, + 9728, 9984, 9985, 9987, 9968, 9976, 0, 8192, + 10240, 9728, 9984, 9985, 9987, 9968, 9976, 9978, + 0, 8192, 10240, 9728, 9984, 9985, 9987, 9991, + 9976, 0, 8192, 10240, 9728, 9984, 9985, 9987, + 9991, 9976, 9980, 0, 8192, 10240, 9728, 9984, + 9985, 9987, 9991, 9976, 9980, 0, 8192, 10240, + 9728, 9984, 9985, 9987, 9991, 9976, 9980, 9982, + 0, 8192, 10240, 9728, 0, 8192, 10240, 9728, + 9984, 0, 8192, 10240, 10241, 9984, 0, 8192, + 10240, 10241, 9984, 9986, 0, 8192, 10240, 10241, + 9984, 0, 8192, 10240, 10241, 9984, 9988, 0, + 8192, 10240, 10241, 9984, 9988, 0, 8192, 10240, + 10241, 9984, 9992, 9990, 0, 8192, 10240, 10241, + 9984, 0, 8192, 10240, 10241, 9984, 9992, 0, + 8192, 10240, 10241, 9984, 9992, 0, 8192, 10240, + 10241, 9984, 9992, 9994, 0, 8192, 10240, 10241, + 9984, 9992, 0, 8192, 10240, 10241, 9984, 10000, + 9996, 0, 8192, 10240, 10241, 9984, 10000, 9996, + 0, 8192, 10240, 10241, 9984, 10000, 10001, 9998, + 0, 8192, 10240, 10241, 9984, 0, 8192, 10240, + 10241, 9984, 10000, 0, 8192, 10240, 10241, 9984, + 10000, 0, 8192, 10240, 10241, 9984, 10000, 10002, + 0, 8192, 10240, 10241, 9984, 10000, 0, 8192, + 10240, 10241, 9984, 10000, 10004, 0, 8192, 10240, + 10241, 9984, 10000, 10004, 0, 8192, 10240, 10241, + 9984, 10000, 10008, 10006, 0, 8192, 10240, 10241, + 9984, 10000, 0, 8192, 10240, 10241, 9984, 10016, + 10008, 0, 8192, 10240, 10241, 9984, 10016, 10008, + 0, 8192, 10240, 10241, 9984, 10016, 10008, 10010, + 0, 8192, 10240, 10241, 9984, 10016, 10008, 0, + 8192, 10240, 10241, 9984, 10016, 10017, 10012, 0, + 8192, 10240, 10241, 9984, 10016, 10017, 10012, 0, + 8192, 10240, 10241, 9984, 10016, 10017, 10012, 10014, + 0, 8192, 10240, 10241, 9984, 0, 8192, 10240, + 10241, 9984, 10016, 0, 8192, 10240, 10241, 9984, + 10016, 0, 8192, 10240, 10241, 9984, 10016, 10018, + 0, 8192, 10240, 10241, 9984, 10016, 0, 8192, + 10240, 10241, 9984, 10016, 10020, 0, 8192, 10240, + 10241, 9984, 10016, 10020, 0, 8192, 10240, 10241, + 9984, 10016, 10024, 10022, 0, 8192, 10240, 10241, + 9984, 10016, 0, 8192, 10240, 10241, 9984, 10016, + 10024, 0, 8192, 10240, 10241, 9984, 10016, 10024, + 0, 8192, 10240, 10241, 9984, 10016, 10024, 10026, + 0, 8192, 10240, 10241, 9984, 10016, 10024, 0, + 8192, 10240, 10241, 9984, 10016, 10032, 10028, 0, + 8192, 10240, 10241, 9984, 10016, 10032, 10028, 0, + 8192, 10240, 10241, 9984, 10016, 10032, 10033, 10030, + 0, 8192, 10240, 10241, 9984, 10016, 0, 8192, + 10240, 10241, 9984, 10048, 10032, 0, 8192, 10240, + 10241, 9984, 10048, 10032, 0, 8192, 10240, 10241, + 9984, 10048, 10032, 10034, 0, 8192, 10240, 10241, + 9984, 10048, 10032, 0, 8192, 10240, 10241, 9984, + 10048, 10032, 10036, 0, 8192, 10240, 10241, 9984, + 10048, 10032, 10036, 0, 8192, 10240, 10241, 9984, + 10048, 10032, 10040, 10038, 0, 8192, 10240, 10241, + 9984, 10048, 10032, 0, 8192, 10240, 10241, 9984, + 10048, 10049, 10040, 0, 8192, 10240, 10241, 9984, + 10048, 10049, 10040, 0, 8192, 10240, 10241, 9984, + 10048, 10049, 10040, 10042, 0, 8192, 10240, 10241, + 9984, 10048, 10049, 10040, 0, 8192, 10240, 10241, + 9984, 10048, 10049, 10040, 10044, 0, 8192, 10240, + 10241, 9984, 10048, 10049, 10051, 10044, 0, 8192, + 10240, 10241, 9984, 10048, 10049, 10051, 10044, 10046, + 0, 8192, 10240, 10241, 9984, 0, 8192, 10240, + 10241, 9984, 10048, 0, 8192, 10240, 10241, 9984, + 10048, 0, 8192, 10240, 10241, 9984, 10048, 10050, + 0, 8192, 10240, 10241, 9984, 10048, 0, 8192, + 10240, 10241, 9984, 10048, 10052, 0, 8192, 10240, + 10241, 9984, 10048, 10052, 0, 8192, 10240, 10241, + 9984, 10048, 10056, 10054, 0, 8192, 10240, 10241, + 9984, 10048, 0, 8192, 10240, 10241, 9984, 10048, + 10056, 0, 8192, 10240, 10241, 9984, 10048, 10056, + 0, 8192, 10240, 10241, 9984, 10048, 10056, 10058, + 0, 8192, 10240, 10241, 9984, 10048, 10056, 0, + 8192, 10240, 10241, 9984, 10048, 10064, 10060, 0, + 8192, 10240, 10241, 9984, 10048, 10064, 10060, 0, + 8192, 10240, 10241, 9984, 10048, 10064, 10065, 10062, + 0, 8192, 10240, 10241, 9984, 10048, 0, 8192, + 10240, 10241, 9984, 10048, 10064, 0, 8192, 10240, + 10241, 9984, 10048, 10064, 0, 8192, 10240, 10241, + 9984, 10048, 10064, 10066, 0, 8192, 10240, 10241, + 9984, 10048, 10064, 0, 8192, 10240, 10241, 9984, + 10048, 10064, 10068, 0, 8192, 10240, 10241, 9984, + 10048, 10064, 10068, 0, 8192, 10240, 10241, 9984, + 10048, 10064, 10072, 10070, 0, 8192, 10240, 10241, + 9984, 10048, 10064, 0, 8192, 10240, 10241, 9984, + 10048, 10080, 10072, 0, 8192, 10240, 10241, 9984, + 10048, 10080, 10072, 0, 8192, 10240, 10241, 9984, + 10048, 10080, 10072, 10074, 0, 8192, 10240, 10241, + 9984, 10048, 10080, 10072, 0, 8192, 10240, 10241, + 9984, 10048, 10080, 10081, 10076, 0, 8192, 10240, + 10241, 9984, 10048, 10080, 10081, 10076, 0, 8192, + 10240, 10241, 9984, 10048, 10080, 10081, 10076, 10078, + 0, 8192, 10240, 10241, 9984, 10048, 0, 8192, + 10240, 10241, 9984, 10112, 10080, 0, 8192, 10240, + 10241, 9984, 10112, 10080, 0, 8192, 10240, 10241, + 9984, 10112, 10080, 10082, 0, 8192, 10240, 10241, + 9984, 10112, 10080, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10084, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10084, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10088, 10086, 0, 8192, 10240, 10241, + 9984, 10112, 10080, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10088, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10088, 0, 8192, 10240, 10241, 9984, + 10112, 10080, 10088, 10090, 0, 8192, 10240, 10241, + 9984, 10112, 10080, 10088, 0, 8192, 10240, 10241, + 9984, 10112, 10080, 10096, 10092, 0, 8192, 10240, + 10241, 9984, 10112, 10080, 10096, 10092, 0, 8192, + 10240, 10241, 9984, 10112, 10080, 10096, 10097, 10094, + 0, 8192, 10240, 10241, 9984, 10112, 10080, 0, + 8192, 10240, 10241, 9984, 10112, 10113, 10096, 0, + 8192, 10240, 10241, 9984, 10112, 10113, 10096, 0, + 8192, 10240, 10241, 9984, 10112, 10113, 10096, 10098, + 0, 8192, 10240, 10241, 9984, 10112, 10113, 10096, + 0, 8192, 10240, 10241, 9984, 10112, 10113, 10096, + 10100, 0, 8192, 10240, 10241, 9984, 10112, 10113, + 10096, 10100, 0, 8192, 10240, 10241, 9984, 10112, + 10113, 10096, 10104, 10102, 0, 8192, 10240, 10241, + 9984, 10112, 10113, 10096, 0, 8192, 10240, 10241, + 9984, 10112, 10113, 10096, 10104, 0, 8192, 10240, + 10241, 9984, 10112, 10113, 10115, 10104, 0, 8192, + 10240, 10241, 9984, 10112, 10113, 10115, 10104, 10106, + 0, 8192, 10240, 10241, 9984, 10112, 10113, 10115, + 10104, 0, 8192, 10240, 10241, 9984, 10112, 10113, + 10115, 10104, 10108, 0, 8192, 10240, 10241, 9984, + 10112, 10113, 10115, 10104, 10108, 0, 8192, 10240, + 10241, 9984, 10112, 10113, 10115, 10104, 10108, 10110, + 0, 8192, 10240, 10241, 9984, 0, 8192, 10240, + 10241, 9984, 10112, 0, 8192, 10240, 10241, 9984, + 10112, 0, 8192, 10240, 10241, 9984, 10112, 10114, + 0, 8192, 10240, 10241, 10243, 10112, 0, 8192, + 10240, 10241, 10243, 10112, 10116, 0, 8192, 10240, + 10241, 10243, 10112, 10116, 0, 8192, 10240, 10241, + 10243, 10112, 10120, 10118, 0, 8192, 10240, 10241, + 10243, 10112, 0, 8192, 10240, 10241, 10243, 10112, + 10120, 0, 8192, 10240, 10241, 10243, 10112, 10120, + 0, 8192, 10240, 10241, 10243, 10112, 10120, 10122, + 0, 8192, 10240, 10241, 10243, 10112, 10120, 0, + 8192, 10240, 10241, 10243, 10112, 10128, 10124, 0, + 8192, 10240, 10241, 10243, 10112, 10128, 10124, 0, + 8192, 10240, 10241, 10243, 10112, 10128, 10129, 10126, + 0, 8192, 10240, 10241, 10243, 10112, 0, 8192, + 10240, 10241, 10243, 10112, 10128, 0, 8192, 10240, + 10241, 10243, 10112, 10128, 0, 8192, 10240, 10241, + 10243, 10112, 10128, 10130, 0, 8192, 10240, 10241, + 10243, 10112, 10128, 0, 8192, 10240, 10241, 10243, + 10112, 10128, 10132, 0, 8192, 10240, 10241, 10243, + 10112, 10128, 10132, 0, 8192, 10240, 10241, 10243, + 10112, 10128, 10136, 10134, 0, 8192, 10240, 10241, + 10243, 10112, 10128, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10136, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10136, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10136, 10138, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 10136, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 10145, 10140, 0, 8192, 10240, + 10241, 10243, 10112, 10144, 10145, 10140, 0, 8192, + 10240, 10241, 10243, 10112, 10144, 10145, 10140, 10142, + 0, 8192, 10240, 10241, 10243, 10112, 0, 8192, + 10240, 10241, 10243, 10112, 10144, 0, 8192, 10240, + 10241, 10243, 10112, 10144, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 10146, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10148, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10148, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10152, 10150, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10152, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10152, 0, 8192, 10240, 10241, 10243, + 10112, 10144, 10152, 10154, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 10152, 0, 8192, 10240, 10241, + 10243, 10112, 10144, 10160, 10156, 0, 8192, 10240, + 10241, 10243, 10112, 10144, 10160, 10156, 0, 8192, + 10240, 10241, 10243, 10112, 10144, 10160, 10161, 10158, + 0, 8192, 10240, 10241, 10243, 10112, 10144, 0, + 8192, 10240, 10241, 10243, 10112, 10176, 10160, 0, + 8192, 10240, 10241, 10243, 10112, 10176, 10160, 0, + 8192, 10240, 10241, 10243, 10112, 10176, 10160, 10162, + 0, 8192, 10240, 10241, 10243, 10112, 10176, 10160, + 0, 8192, 10240, 10241, 10243, 10112, 10176, 10160, + 10164, 0, 8192, 10240, 10241, 10243, 10112, 10176, + 10160, 10164, 0, 8192, 10240, 10241, 10243, 10112, + 10176, 10160, 10168, 10166, 0, 8192, 10240, 10241, + 10243, 10112, 10176, 10160, 0, 8192, 10240, 10241, + 10243, 10112, 10176, 10177, 10168, 0, 8192, 10240, + 10241, 10243, 10112, 10176, 10177, 10168, 0, 8192, + 10240, 10241, 10243, 10112, 10176, 10177, 10168, 10170, + 0, 8192, 10240, 10241, 10243, 10112, 10176, 10177, + 10168, 0, 8192, 10240, 10241, 10243, 10112, 10176, + 10177, 10168, 10172, 0, 8192, 10240, 10241, 10243, + 10112, 10176, 10177, 10179, 10172, 0, 8192, 10240, + 10241, 10243, 10112, 10176, 10177, 10179, 10172, 10174, + 0, 8192, 10240, 10241, 10243, 10112, 0, 8192, + 10240, 10241, 10243, 10112, 10176, 0, 8192, 10240, + 10241, 10243, 10112, 10176, 0, 8192, 10240, 10241, + 10243, 10112, 10176, 10178, 0, 8192, 10240, 10241, + 10243, 10112, 10176, 0, 8192, 10240, 10241, 10243, + 10112, 10176, 10180, 0, 8192, 10240, 10241, 10243, + 10112, 10176, 10180, 0, 8192, 10240, 10241, 10243, + 10112, 10176, 10184, 10182, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 0, 8192, 10240, 10241, 10243, + 10247, 10176, 10184, 0, 8192, 10240, 10241, 10243, + 10247, 10176, 10184, 0, 8192, 10240, 10241, 10243, + 10247, 10176, 10184, 10186, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10184, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10192, 10188, 0, 8192, 10240, + 10241, 10243, 10247, 10176, 10192, 10188, 0, 8192, + 10240, 10241, 10243, 10247, 10176, 10192, 10193, 10190, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10192, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10192, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10192, 10194, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10192, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10192, + 10196, 0, 8192, 10240, 10241, 10243, 10247, 10176, + 10192, 10196, 0, 8192, 10240, 10241, 10243, 10247, + 10176, 10192, 10200, 10198, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10192, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10208, 10200, 0, 8192, 10240, + 10241, 10243, 10247, 10176, 10208, 10200, 0, 8192, + 10240, 10241, 10243, 10247, 10176, 10208, 10200, 10202, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10208, + 10200, 0, 8192, 10240, 10241, 10243, 10247, 10176, + 10208, 10209, 10204, 0, 8192, 10240, 10241, 10243, + 10247, 10176, 10208, 10209, 10204, 0, 8192, 10240, + 10241, 10243, 10247, 10176, 10208, 10209, 10204, 10206, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10208, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10208, 0, + 8192, 10240, 10241, 10243, 10247, 10176, 10208, 10210, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10208, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10208, + 10212, 0, 8192, 10240, 10241, 10243, 10247, 10176, + 10208, 10212, 0, 8192, 10240, 10241, 10243, 10247, + 10176, 10208, 10216, 10214, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10208, 0, 8192, 10240, 10241, + 10243, 10247, 10176, 10208, 10216, 0, 8192, 10240, + 10241, 10243, 10247, 10176, 10208, 10216, 0, 8192, + 10240, 10241, 10243, 10247, 10176, 10208, 10216, 10218, + 0, 8192, 10240, 10241, 10243, 10247, 10176, 10208, + 10216, 0, 8192, 10240, 10241, 10243, 10247, 10176, + 10208, 10224, 10220, 0, 8192, 10240, 10241, 10243, + 10247, 10176, 10208, 10224, 10220, 0, 8192, 10240, + 10241, 10243, 10247, 10176, 10208, 10224, 10225, 10222, + 0, 8192, 10240, 10241, 10243, 10247, 10255, 10208, + 0, 8192, 10240, 10241, 10243, 10247, 10255, 10208, + 10224, 0, 8192, 10240, 10241, 10243, 10247, 10255, + 10208, 10224, 0, 8192, 10240, 10241, 10243, 10247, + 10255, 10208, 10224, 10226, 0, 8192, 10240, 10241, + 10243, 10247, 10255, 10208, 10224, 0, 8192, 10240, + 10241, 10243, 10247, 10255, 10208, 10224, 10228, 0, + 8192, 10240, 10241, 10243, 10247, 10255, 10208, 10224, + 10228, 0, 8192, 10240, 10241, 10243, 10247, 10255, + 10208, 10224, 10232, 10230, 0, 8192, 10240, 10241, + 10243, 10247, 10255, 10208, 10224, 0, 8192, 10240, + 10241, 10243, 10247, 10255, 10208, 10224, 10232, 0, + 8192, 10240, 10241, 10243, 10247, 10255, 10208, 10224, + 10232, 0, 8192, 10240, 10241, 10243, 10247, 10255, + 10208, 10224, 10232, 10234, 0, 8192, 10240, 10241, + 10243, 10247, 10255, 10208, 10224, 10232, 0, 8192, + 10240, 10241, 10243, 10247, 10255, 10208, 10224, 10232, + 10236, 0, 8192, 10240, 10241, 10243, 10247, 10255, + 10208, 10224, 10232, 10236, 0, 8192, 10240, 10241, + 10243, 10247, 10255, 10208, 10224, 10232, 10236, 10238, + 0, 8192, 0, 8192, 10240, 0, 8192, 10240, + 0, 8192, 10240, 10242, 0, 8192, 10240, 0, + 8192, 10240, 10244, 0, 8192, 10240, 10244, 0, + 8192, 10240, 10248, 10246, 0, 8192, 10240, 0, + 8192, 10240, 10248, 0, 8192, 10240, 10248, 0, + 8192, 10240, 10248, 10250, 0, 8192, 10240, 10248, + 0, 8192, 10240, 10256, 10252, 0, 8192, 10240, + 10256, 10252, 0, 8192, 10240, 10256, 10257, 10254, + 0, 8192, 10240, 0, 8192, 10240, 10256, 0, + 8192, 10240, 10256, 0, 8192, 10240, 10256, 10258, + 0, 8192, 10240, 10256, 0, 8192, 10240, 10256, + 10260, 0, 8192, 10240, 10256, 10260, 0, 8192, + 10240, 10256, 10264, 10262, 0, 8192, 10240, 10256, + 0, 8192, 10240, 10272, 10264, 0, 8192, 10240, + 10272, 10264, 0, 8192, 10240, 10272, 10264, 10266, + 0, 8192, 10240, 10272, 10264, 0, 8192, 10240, + 10272, 10273, 10268, 0, 8192, 10240, 10272, 10273, + 10268, 0, 8192, 10240, 10272, 10273, 10268, 10270, + 0, 8192, 10240, 0, 8192, 10240, 10272, 0, + 8192, 10240, 10272, 0, 8192, 10240, 10272, 10274, + 0, 8192, 10240, 10272, 0, 8192, 10240, 10272, + 10276, 0, 8192, 10240, 10272, 10276, 0, 8192, + 10240, 10272, 10280, 10278, 0, 8192, 10240, 10272, + 0, 8192, 10240, 10272, 10280, 0, 8192, 10240, + 10272, 10280, 0, 8192, 10240, 10272, 10280, 10282, + 0, 8192, 10240, 10272, 10280, 0, 8192, 10240, + 10272, 10288, 10284, 0, 8192, 10240, 10272, 10288, + 10284, 0, 8192, 10240, 10272, 10288, 10289, 10286, + 0, 8192, 10240, 10272, 0, 8192, 10240, 10304, + 10288, 0, 8192, 10240, 10304, 10288, 0, 8192, + 10240, 10304, 10288, 10290, 0, 8192, 10240, 10304, + 10288, 0, 8192, 10240, 10304, 10288, 10292, 0, + 8192, 10240, 10304, 10288, 10292, 0, 8192, 10240, + 10304, 10288, 10296, 10294, 0, 8192, 10240, 10304, + 10288, 0, 8192, 10240, 10304, 10305, 10296, 0, + 8192, 10240, 10304, 10305, 10296, 0, 8192, 10240, + 10304, 10305, 10296, 10298, 0, 8192, 10240, 10304, + 10305, 10296, 0, 8192, 10240, 10304, 10305, 10296, + 10300, 0, 8192, 10240, 10304, 10305, 10307, 10300, + 0, 8192, 10240, 10304, 10305, 10307, 10300, 10302, + 0, 8192, 10240, 0, 8192, 10240, 10304, 0, + 8192, 10240, 10304, 0, 8192, 10240, 10304, 10306, + 0, 8192, 10240, 10304, 0, 8192, 10240, 10304, + 10308, 0, 8192, 10240, 10304, 10308, 0, 8192, + 10240, 10304, 10312, 10310, 0, 8192, 10240, 10304, + 0, 8192, 10240, 10304, 10312, 0, 8192, 10240, + 10304, 10312, 0, 8192, 10240, 10304, 10312, 10314, + 0, 8192, 10240, 10304, 10312, 0, 8192, 10240, + 10304, 10320, 10316, 0, 8192, 10240, 10304, 10320, + 10316, 0, 8192, 10240, 10304, 10320, 10321, 10318, + 0, 8192, 10240, 10304, 0, 8192, 10240, 10304, + 10320, 0, 8192, 10240, 10304, 10320, 0, 8192, + 10240, 10304, 10320, 10322, 0, 8192, 10240, 10304, + 10320, 0, 8192, 10240, 10304, 10320, 10324, 0, + 8192, 10240, 10304, 10320, 10324, 0, 8192, 10240, + 10304, 10320, 10328, 10326, 0, 8192, 10240, 10304, + 10320, 0, 8192, 10240, 10304, 10336, 10328, 0, + 8192, 10240, 10304, 10336, 10328, 0, 8192, 10240, + 10304, 10336, 10328, 10330, 0, 8192, 10240, 10304, + 10336, 10328, 0, 8192, 10240, 10304, 10336, 10337, + 10332, 0, 8192, 10240, 10304, 10336, 10337, 10332, + 0, 8192, 10240, 10304, 10336, 10337, 10332, 10334, + 0, 8192, 10240, 10304, 0, 8192, 10240, 10368, + 10336, 0, 8192, 10240, 10368, 10336, 0, 8192, + 10240, 10368, 10336, 10338, 0, 8192, 10240, 10368, + 10336, 0, 8192, 10240, 10368, 10336, 10340, 0, + 8192, 10240, 10368, 10336, 10340, 0, 8192, 10240, + 10368, 10336, 10344, 10342, 0, 8192, 10240, 10368, + 10336, 0, 8192, 10240, 10368, 10336, 10344, 0, + 8192, 10240, 10368, 10336, 10344, 0, 8192, 10240, + 10368, 10336, 10344, 10346, 0, 8192, 10240, 10368, + 10336, 10344, 0, 8192, 10240, 10368, 10336, 10352, + 10348, 0, 8192, 10240, 10368, 10336, 10352, 10348, + 0, 8192, 10240, 10368, 10336, 10352, 10353, 10350, + 0, 8192, 10240, 10368, 10336, 0, 8192, 10240, + 10368, 10369, 10352, 0, 8192, 10240, 10368, 10369, + 10352, 0, 8192, 10240, 10368, 10369, 10352, 10354, + 0, 8192, 10240, 10368, 10369, 10352, 0, 8192, + 10240, 10368, 10369, 10352, 10356, 0, 8192, 10240, + 10368, 10369, 10352, 10356, 0, 8192, 10240, 10368, + 10369, 10352, 10360, 10358, 0, 8192, 10240, 10368, + 10369, 10352, 0, 8192, 10240, 10368, 10369, 10352, + 10360, 0, 8192, 10240, 10368, 10369, 10371, 10360, + 0, 8192, 10240, 10368, 10369, 10371, 10360, 10362, + 0, 8192, 10240, 10368, 10369, 10371, 10360, 0, + 8192, 10240, 10368, 10369, 10371, 10360, 10364, 0, + 8192, 10240, 10368, 10369, 10371, 10360, 10364, 0, + 8192, 10240, 10368, 10369, 10371, 10360, 10364, 10366, + 0, 8192, 10240, 0, 8192, 10240, 10368, 0, + 8192, 10240, 10368, 0, 8192, 10240, 10368, 10370, + 0, 8192, 10240, 10368, 0, 8192, 10240, 10368, + 10372, 0, 8192, 10240, 10368, 10372, 0, 8192, + 10240, 10368, 10376, 10374, 0, 8192, 10240, 10368, + 0, 8192, 10240, 10368, 10376, 0, 8192, 10240, + 10368, 10376, 0, 8192, 10240, 10368, 10376, 10378, + 0, 8192, 10240, 10368, 10376, 0, 8192, 10240, + 10368, 10384, 10380, 0, 8192, 10240, 10368, 10384, + 10380, 0, 8192, 10240, 10368, 10384, 10385, 10382, + 0, 8192, 10240, 10368, 0, 8192, 10240, 10368, + 10384, 0, 8192, 10240, 10368, 10384, 0, 8192, + 10240, 10368, 10384, 10386, 0, 8192, 10240, 10368, + 10384, 0, 8192, 10240, 10368, 10384, 10388, 0, + 8192, 10240, 10368, 10384, 10388, 0, 8192, 10240, + 10368, 10384, 10392, 10390, 0, 8192, 10240, 10368, + 10384, 0, 8192, 10240, 10368, 10400, 10392, 0, + 8192, 10240, 10368, 10400, 10392, 0, 8192, 10240, + 10368, 10400, 10392, 10394, 0, 8192, 10240, 10368, + 10400, 10392, 0, 8192, 10240, 10368, 10400, 10401, + 10396, 0, 8192, 10240, 10368, 10400, 10401, 10396, + 0, 8192, 10240, 10368, 10400, 10401, 10396, 10398, + 0, 8192, 10240, 10368, 0, 8192, 10240, 10368, + 10400, 0, 8192, 10240, 10368, 10400, 0, 8192, + 10240, 10368, 10400, 10402, 0, 8192, 10240, 10368, + 10400, 0, 8192, 10240, 10368, 10400, 10404, 0, + 8192, 10240, 10368, 10400, 10404, 0, 8192, 10240, + 10368, 10400, 10408, 10406, 0, 8192, 10240, 10368, + 10400, 0, 8192, 10240, 10368, 10400, 10408, 0, + 8192, 10240, 10368, 10400, 10408, 0, 8192, 10240, + 10368, 10400, 10408, 10410, 0, 8192, 10240, 10368, + 10400, 10408, 0, 8192, 10240, 10368, 10400, 10416, + 10412, 0, 8192, 10240, 10368, 10400, 10416, 10412, + 0, 8192, 10240, 10368, 10400, 10416, 10417, 10414, + 0, 8192, 10240, 10368, 10400, 0, 8192, 10240, + 10368, 10432, 10416, 0, 8192, 10240, 10368, 10432, + 10416, 0, 8192, 10240, 10368, 10432, 10416, 10418, + 0, 8192, 10240, 10368, 10432, 10416, 0, 8192, + 10240, 10368, 10432, 10416, 10420, 0, 8192, 10240, + 10368, 10432, 10416, 10420, 0, 8192, 10240, 10368, + 10432, 10416, 10424, 10422, 0, 8192, 10240, 10368, + 10432, 10416, 0, 8192, 10240, 10368, 10432, 10433, + 10424, 0, 8192, 10240, 10368, 10432, 10433, 10424, + 0, 8192, 10240, 10368, 10432, 10433, 10424, 10426, + 0, 8192, 10240, 10368, 10432, 10433, 10424, 0, + 8192, 10240, 10368, 10432, 10433, 10424, 10428, 0, + 8192, 10240, 10368, 10432, 10433, 10435, 10428, 0, + 8192, 10240, 10368, 10432, 10433, 10435, 10428, 10430, + 0, 8192, 10240, 10368, 0, 8192, 10240, 10496, + 10432, 0, 8192, 10240, 10496, 10432, 0, 8192, + 10240, 10496, 10432, 10434, 0, 8192, 10240, 10496, + 10432, 0, 8192, 10240, 10496, 10432, 10436, 0, + 8192, 10240, 10496, 10432, 10436, 0, 8192, 10240, + 10496, 10432, 10440, 10438, 0, 8192, 10240, 10496, + 10432, 0, 8192, 10240, 10496, 10432, 10440, 0, + 8192, 10240, 10496, 10432, 10440, 0, 8192, 10240, + 10496, 10432, 10440, 10442, 0, 8192, 10240, 10496, + 10432, 10440, 0, 8192, 10240, 10496, 10432, 10448, + 10444, 0, 8192, 10240, 10496, 10432, 10448, 10444, + 0, 8192, 10240, 10496, 10432, 10448, 10449, 10446, + 0, 8192, 10240, 10496, 10432, 0, 8192, 10240, + 10496, 10432, 10448, 0, 8192, 10240, 10496, 10432, + 10448, 0, 8192, 10240, 10496, 10432, 10448, 10450, + 0, 8192, 10240, 10496, 10432, 10448, 0, 8192, + 10240, 10496, 10432, 10448, 10452, 0, 8192, 10240, + 10496, 10432, 10448, 10452, 0, 8192, 10240, 10496, + 10432, 10448, 10456, 10454, 0, 8192, 10240, 10496, + 10432, 10448, 0, 8192, 10240, 10496, 10432, 10464, + 10456, 0, 8192, 10240, 10496, 10432, 10464, 10456, + 0, 8192, 10240, 10496, 10432, 10464, 10456, 10458, + 0, 8192, 10240, 10496, 10432, 10464, 10456, 0, + 8192, 10240, 10496, 10432, 10464, 10465, 10460, 0, + 8192, 10240, 10496, 10432, 10464, 10465, 10460, 0, + 8192, 10240, 10496, 10432, 10464, 10465, 10460, 10462, + 0, 8192, 10240, 10496, 10432, 0, 8192, 10240, + 10496, 10497, 10464, 0, 8192, 10240, 10496, 10497, + 10464, 0, 8192, 10240, 10496, 10497, 10464, 10466, + 0, 8192, 10240, 10496, 10497, 10464, 0, 8192, + 10240, 10496, 10497, 10464, 10468, 0, 8192, 10240, + 10496, 10497, 10464, 10468, 0, 8192, 10240, 10496, + 10497, 10464, 10472, 10470, 0, 8192, 10240, 10496, + 10497, 10464, 0, 8192, 10240, 10496, 10497, 10464, + 10472, 0, 8192, 10240, 10496, 10497, 10464, 10472, + 0, 8192, 10240, 10496, 10497, 10464, 10472, 10474, + 0, 8192, 10240, 10496, 10497, 10464, 10472, 0, + 8192, 10240, 10496, 10497, 10464, 10480, 10476, 0, + 8192, 10240, 10496, 10497, 10464, 10480, 10476, 0, + 8192, 10240, 10496, 10497, 10464, 10480, 10481, 10478, + 0, 8192, 10240, 10496, 10497, 10464, 0, 8192, + 10240, 10496, 10497, 10464, 10480, 0, 8192, 10240, + 10496, 10497, 10499, 10480, 0, 8192, 10240, 10496, + 10497, 10499, 10480, 10482, 0, 8192, 10240, 10496, + 10497, 10499, 10480, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10484, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10484, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10488, 10486, 0, 8192, 10240, 10496, + 10497, 10499, 10480, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10488, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10488, 0, 8192, 10240, 10496, 10497, + 10499, 10480, 10488, 10490, 0, 8192, 10240, 10496, + 10497, 10499, 10503, 10488, 0, 8192, 10240, 10496, + 10497, 10499, 10503, 10488, 10492, 0, 8192, 10240, + 10496, 10497, 10499, 10503, 10488, 10492, 0, 8192, + 10240, 10496, 10497, 10499, 10503, 10488, 10492, 10494, + 0, 8192, 10240, 0, 8192, 10240, 10496, 0, + 8192, 10240, 10496, 0, 8192, 10240, 10496, 10498, + 0, 8192, 10240, 10496, 0, 8192, 10240, 10496, + 10500, 0, 8192, 10240, 10496, 10500, 0, 8192, + 10240, 10496, 10504, 10502, 0, 8192, 10240, 10496, + 0, 8192, 10240, 10496, 10504, 0, 8192, 10240, + 10496, 10504, 0, 8192, 10240, 10496, 10504, 10506, + 0, 8192, 10240, 10496, 10504, 0, 8192, 10240, + 10496, 10512, 10508, 0, 8192, 10240, 10496, 10512, + 10508, 0, 8192, 10240, 10496, 10512, 10513, 10510, + 0, 8192, 10240, 10496, 0, 8192, 10240, 10496, + 10512, 0, 8192, 10240, 10496, 10512, 0, 8192, + 10240, 10496, 10512, 10514, 0, 8192, 10240, 10496, + 10512, 0, 8192, 10240, 10496, 10512, 10516, 0, + 8192, 10240, 10496, 10512, 10516, 0, 8192, 10240, + 10496, 10512, 10520, 10518, 0, 8192, 10240, 10496, + 10512, 0, 8192, 10240, 10496, 10528, 10520, 0, + 8192, 10240, 10496, 10528, 10520, 0, 8192, 10240, + 10496, 10528, 10520, 10522, 0, 8192, 10240, 10496, + 10528, 10520, 0, 8192, 10240, 10496, 10528, 10529, + 10524, 0, 8192, 10240, 10496, 10528, 10529, 10524, + 0, 8192, 10240, 10496, 10528, 10529, 10524, 10526, + 0, 8192, 10240, 10496, 0, 8192, 10240, 10496, + 10528, 0, 8192, 10240, 10496, 10528, 0, 8192, + 10240, 10496, 10528, 10530, 0, 8192, 10240, 10496, + 10528, 0, 8192, 10240, 10496, 10528, 10532, 0, + 8192, 10240, 10496, 10528, 10532, 0, 8192, 10240, + 10496, 10528, 10536, 10534, 0, 8192, 10240, 10496, + 10528, 0, 8192, 10240, 10496, 10528, 10536, 0, + 8192, 10240, 10496, 10528, 10536, 0, 8192, 10240, + 10496, 10528, 10536, 10538, 0, 8192, 10240, 10496, + 10528, 10536, 0, 8192, 10240, 10496, 10528, 10544, + 10540, 0, 8192, 10240, 10496, 10528, 10544, 10540, + 0, 8192, 10240, 10496, 10528, 10544, 10545, 10542, + 0, 8192, 10240, 10496, 10528, 0, 8192, 10240, + 10496, 10560, 10544, 0, 8192, 10240, 10496, 10560, + 10544, 0, 8192, 10240, 10496, 10560, 10544, 10546, + 0, 8192, 10240, 10496, 10560, 10544, 0, 8192, + 10240, 10496, 10560, 10544, 10548, 0, 8192, 10240, + 10496, 10560, 10544, 10548, 0, 8192, 10240, 10496, + 10560, 10544, 10552, 10550, 0, 8192, 10240, 10496, + 10560, 10544, 0, 8192, 10240, 10496, 10560, 10561, + 10552, 0, 8192, 10240, 10496, 10560, 10561, 10552, + 0, 8192, 10240, 10496, 10560, 10561, 10552, 10554, + 0, 8192, 10240, 10496, 10560, 10561, 10552, 0, + 8192, 10240, 10496, 10560, 10561, 10552, 10556, 0, + 8192, 10240, 10496, 10560, 10561, 10563, 10556, 0, + 8192, 10240, 10496, 10560, 10561, 10563, 10556, 10558, + 0, 8192, 10240, 10496, 0, 8192, 10240, 10496, + 10560, 0, 8192, 10240, 10496, 10560, 0, 8192, + 10240, 10496, 10560, 10562, 0, 8192, 10240, 10496, + 10560, 0, 8192, 10240, 10496, 10560, 10564, 0, + 8192, 10240, 10496, 10560, 10564, 0, 8192, 10240, + 10496, 10560, 10568, 10566, 0, 8192, 10240, 10496, + 10560, 0, 8192, 10240, 10496, 10560, 10568, 0, + 8192, 10240, 10496, 10560, 10568, 0, 8192, 10240, + 10496, 10560, 10568, 10570, 0, 8192, 10240, 10496, + 10560, 10568, 0, 8192, 10240, 10496, 10560, 10576, + 10572, 0, 8192, 10240, 10496, 10560, 10576, 10572, + 0, 8192, 10240, 10496, 10560, 10576, 10577, 10574, + 0, 8192, 10240, 10496, 10560, 0, 8192, 10240, + 10496, 10560, 10576, 0, 8192, 10240, 10496, 10560, + 10576, 0, 8192, 10240, 10496, 10560, 10576, 10578, + 0, 8192, 10240, 10496, 10560, 10576, 0, 8192, + 10240, 10496, 10560, 10576, 10580, 0, 8192, 10240, + 10496, 10560, 10576, 10580, 0, 8192, 10240, 10496, + 10560, 10576, 10584, 10582, 0, 8192, 10240, 10496, + 10560, 10576, 0, 8192, 10240, 10496, 10560, 10592, + 10584, 0, 8192, 10240, 10496, 10560, 10592, 10584, + 0, 8192, 10240, 10496, 10560, 10592, 10584, 10586, + 0, 8192, 10240, 10496, 10560, 10592, 10584, 0, + 8192, 10240, 10496, 10560, 10592, 10593, 10588, 0, + 8192, 10240, 10496, 10560, 10592, 10593, 10588, 0, + 8192, 10240, 10496, 10560, 10592, 10593, 10588, 10590, + 0, 8192, 10240, 10496, 10560, 0, 8192, 10240, + 10496, 10624, 10592, 0, 8192, 10240, 10496, 10624, + 10592, 0, 8192, 10240, 10496, 10624, 10592, 10594, + 0, 8192, 10240, 10496, 10624, 10592, 0, 8192, + 10240, 10496, 10624, 10592, 10596, 0, 8192, 10240, + 10496, 10624, 10592, 10596, 0, 8192, 10240, 10496, + 10624, 10592, 10600, 10598, 0, 8192, 10240, 10496, + 10624, 10592, 0, 8192, 10240, 10496, 10624, 10592, + 10600, 0, 8192, 10240, 10496, 10624, 10592, 10600, + 0, 8192, 10240, 10496, 10624, 10592, 10600, 10602, + 0, 8192, 10240, 10496, 10624, 10592, 10600, 0, + 8192, 10240, 10496, 10624, 10592, 10608, 10604, 0, + 8192, 10240, 10496, 10624, 10592, 10608, 10604, 0, + 8192, 10240, 10496, 10624, 10592, 10608, 10609, 10606, + 0, 8192, 10240, 10496, 10624, 10592, 0, 8192, + 10240, 10496, 10624, 10625, 10608, 0, 8192, 10240, + 10496, 10624, 10625, 10608, 0, 8192, 10240, 10496, + 10624, 10625, 10608, 10610, 0, 8192, 10240, 10496, + 10624, 10625, 10608, 0, 8192, 10240, 10496, 10624, + 10625, 10608, 10612, 0, 8192, 10240, 10496, 10624, + 10625, 10608, 10612, 0, 8192, 10240, 10496, 10624, + 10625, 10608, 10616, 10614, 0, 8192, 10240, 10496, + 10624, 10625, 10608, 0, 8192, 10240, 10496, 10624, + 10625, 10608, 10616, 0, 8192, 10240, 10496, 10624, + 10625, 10627, 10616, 0, 8192, 10240, 10496, 10624, + 10625, 10627, 10616, 10618, 0, 8192, 10240, 10496, + 10624, 10625, 10627, 10616, 0, 8192, 10240, 10496, + 10624, 10625, 10627, 10616, 10620, 0, 8192, 10240, + 10496, 10624, 10625, 10627, 10616, 10620, 0, 8192, + 10240, 10496, 10624, 10625, 10627, 10616, 10620, 10622, + 0, 8192, 10240, 10496, 0, 8192, 10240, 10752, + 10624, 0, 8192, 10240, 10752, 10624, 0, 8192, + 10240, 10752, 10624, 10626, 0, 8192, 10240, 10752, + 10624, 0, 8192, 10240, 10752, 10624, 10628, 0, + 8192, 10240, 10752, 10624, 10628, 0, 8192, 10240, + 10752, 10624, 10632, 10630, 0, 8192, 10240, 10752, + 10624, 0, 8192, 10240, 10752, 10624, 10632, 0, + 8192, 10240, 10752, 10624, 10632, 0, 8192, 10240, + 10752, 10624, 10632, 10634, 0, 8192, 10240, 10752, + 10624, 10632, 0, 8192, 10240, 10752, 10624, 10640, + 10636, 0, 8192, 10240, 10752, 10624, 10640, 10636, + 0, 8192, 10240, 10752, 10624, 10640, 10641, 10638, + 0, 8192, 10240, 10752, 10624, 0, 8192, 10240, + 10752, 10624, 10640, 0, 8192, 10240, 10752, 10624, + 10640, 0, 8192, 10240, 10752, 10624, 10640, 10642, + 0, 8192, 10240, 10752, 10624, 10640, 0, 8192, + 10240, 10752, 10624, 10640, 10644, 0, 8192, 10240, + 10752, 10624, 10640, 10644, 0, 8192, 10240, 10752, + 10624, 10640, 10648, 10646, 0, 8192, 10240, 10752, + 10624, 10640, 0, 8192, 10240, 10752, 10624, 10656, + 10648, 0, 8192, 10240, 10752, 10624, 10656, 10648, + 0, 8192, 10240, 10752, 10624, 10656, 10648, 10650, + 0, 8192, 10240, 10752, 10624, 10656, 10648, 0, + 8192, 10240, 10752, 10624, 10656, 10657, 10652, 0, + 8192, 10240, 10752, 10624, 10656, 10657, 10652, 0, + 8192, 10240, 10752, 10624, 10656, 10657, 10652, 10654, + 0, 8192, 10240, 10752, 10624, 0, 8192, 10240, + 10752, 10624, 10656, 0, 8192, 10240, 10752, 10624, + 10656, 0, 8192, 10240, 10752, 10624, 10656, 10658, + 0, 8192, 10240, 10752, 10624, 10656, 0, 8192, + 10240, 10752, 10624, 10656, 10660, 0, 8192, 10240, + 10752, 10624, 10656, 10660, 0, 8192, 10240, 10752, + 10624, 10656, 10664, 10662, 0, 8192, 10240, 10752, + 10624, 10656, 0, 8192, 10240, 10752, 10624, 10656, + 10664, 0, 8192, 10240, 10752, 10624, 10656, 10664, + 0, 8192, 10240, 10752, 10624, 10656, 10664, 10666, + 0, 8192, 10240, 10752, 10624, 10656, 10664, 0, + 8192, 10240, 10752, 10624, 10656, 10672, 10668, 0, + 8192, 10240, 10752, 10624, 10656, 10672, 10668, 0, + 8192, 10240, 10752, 10624, 10656, 10672, 10673, 10670, + 0, 8192, 10240, 10752, 10624, 10656, 0, 8192, + 10240, 10752, 10624, 10688, 10672, 0, 8192, 10240, + 10752, 10624, 10688, 10672, 0, 8192, 10240, 10752, + 10624, 10688, 10672, 10674, 0, 8192, 10240, 10752, + 10624, 10688, 10672, 0, 8192, 10240, 10752, 10624, + 10688, 10672, 10676, 0, 8192, 10240, 10752, 10624, + 10688, 10672, 10676, 0, 8192, 10240, 10752, 10624, + 10688, 10672, 10680, 10678, 0, 8192, 10240, 10752, + 10624, 10688, 10672, 0, 8192, 10240, 10752, 10624, + 10688, 10689, 10680, 0, 8192, 10240, 10752, 10624, + 10688, 10689, 10680, 0, 8192, 10240, 10752, 10624, + 10688, 10689, 10680, 10682, 0, 8192, 10240, 10752, + 10624, 10688, 10689, 10680, 0, 8192, 10240, 10752, + 10624, 10688, 10689, 10680, 10684, 0, 8192, 10240, + 10752, 10624, 10688, 10689, 10691, 10684, 0, 8192, + 10240, 10752, 10624, 10688, 10689, 10691, 10684, 10686, + 0, 8192, 10240, 10752, 10624, 0, 8192, 10240, + 10752, 10753, 10688, 0, 8192, 10240, 10752, 10753, + 10688, 0, 8192, 10240, 10752, 10753, 10688, 10690, + 0, 8192, 10240, 10752, 10753, 10688, 0, 8192, + 10240, 10752, 10753, 10688, 10692, 0, 8192, 10240, + 10752, 10753, 10688, 10692, 0, 8192, 10240, 10752, + 10753, 10688, 10696, 10694, 0, 8192, 10240, 10752, + 10753, 10688, 0, 8192, 10240, 10752, 10753, 10688, + 10696, 0, 8192, 10240, 10752, 10753, 10688, 10696, + 0, 8192, 10240, 10752, 10753, 10688, 10696, 10698, + 0, 8192, 10240, 10752, 10753, 10688, 10696, 0, + 8192, 10240, 10752, 10753, 10688, 10704, 10700, 0, + 8192, 10240, 10752, 10753, 10688, 10704, 10700, 0, + 8192, 10240, 10752, 10753, 10688, 10704, 10705, 10702, + 0, 8192, 10240, 10752, 10753, 10688, 0, 8192, + 10240, 10752, 10753, 10688, 10704, 0, 8192, 10240, + 10752, 10753, 10688, 10704, 0, 8192, 10240, 10752, + 10753, 10688, 10704, 10706, 0, 8192, 10240, 10752, + 10753, 10688, 10704, 0, 8192, 10240, 10752, 10753, + 10688, 10704, 10708, 0, 8192, 10240, 10752, 10753, + 10688, 10704, 10708, 0, 8192, 10240, 10752, 10753, + 10688, 10704, 10712, 10710, 0, 8192, 10240, 10752, + 10753, 10688, 10704, 0, 8192, 10240, 10752, 10753, + 10688, 10720, 10712, 0, 8192, 10240, 10752, 10753, + 10688, 10720, 10712, 0, 8192, 10240, 10752, 10753, + 10688, 10720, 10712, 10714, 0, 8192, 10240, 10752, + 10753, 10688, 10720, 10712, 0, 8192, 10240, 10752, + 10753, 10688, 10720, 10721, 10716, 0, 8192, 10240, + 10752, 10753, 10688, 10720, 10721, 10716, 0, 8192, + 10240, 10752, 10753, 10688, 10720, 10721, 10716, 10718, + 0, 8192, 10240, 10752, 10753, 10688, 0, 8192, + 10240, 10752, 10753, 10688, 10720, 0, 8192, 10240, + 10752, 10753, 10755, 10720, 0, 8192, 10240, 10752, + 10753, 10755, 10720, 10722, 0, 8192, 10240, 10752, + 10753, 10755, 10720, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10724, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10724, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10728, 10726, 0, 8192, 10240, 10752, + 10753, 10755, 10720, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10728, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10728, 0, 8192, 10240, 10752, 10753, + 10755, 10720, 10728, 10730, 0, 8192, 10240, 10752, + 10753, 10755, 10720, 10728, 0, 8192, 10240, 10752, + 10753, 10755, 10720, 10736, 10732, 0, 8192, 10240, + 10752, 10753, 10755, 10720, 10736, 10732, 0, 8192, + 10240, 10752, 10753, 10755, 10720, 10736, 10737, 10734, + 0, 8192, 10240, 10752, 10753, 10755, 10720, 0, + 8192, 10240, 10752, 10753, 10755, 10720, 10736, 0, + 8192, 10240, 10752, 10753, 10755, 10720, 10736, 0, + 8192, 10240, 10752, 10753, 10755, 10720, 10736, 10738, + 0, 8192, 10240, 10752, 10753, 10755, 10759, 10736, + 0, 8192, 10240, 10752, 10753, 10755, 10759, 10736, + 10740, 0, 8192, 10240, 10752, 10753, 10755, 10759, + 10736, 10740, 0, 8192, 10240, 10752, 10753, 10755, + 10759, 10736, 10744, 10742, 0, 8192, 10240, 10752, + 10753, 10755, 10759, 10736, 0, 8192, 10240, 10752, + 10753, 10755, 10759, 10736, 10744, 0, 8192, 10240, + 10752, 10753, 10755, 10759, 10736, 10744, 0, 8192, + 10240, 10752, 10753, 10755, 10759, 10736, 10744, 10746, + 0, 8192, 10240, 10752, 10753, 10755, 10759, 10736, + 10744, 0, 8192, 10240, 10752, 10753, 10755, 10759, + 10736, 10744, 10748, 0, 8192, 10240, 10752, 10753, + 10755, 10759, 10736, 10744, 10748, 0, 8192, 10240, + 10752, 10753, 10755, 10759, 10736, 10744, 10748, 10750, + 0, 8192, 10240, 0, 8192, 10240, 10752, 0, + 8192, 10240, 10752, 0, 8192, 10240, 10752, 10754, + 0, 8192, 10240, 10752, 0, 8192, 10240, 10752, + 10756, 0, 8192, 10240, 10752, 10756, 0, 8192, + 10240, 10752, 10760, 10758, 0, 8192, 10240, 10752, + 0, 8192, 10240, 10752, 10760, 0, 8192, 10240, + 10752, 10760, 0, 8192, 10240, 10752, 10760, 10762, + 0, 8192, 10240, 10752, 10760, 0, 8192, 10240, + 10752, 10768, 10764, 0, 8192, 10240, 10752, 10768, + 10764, 0, 8192, 10240, 10752, 10768, 10769, 10766, + 0, 8192, 10240, 10752, 0, 8192, 10240, 10752, + 10768, 0, 8192, 10240, 10752, 10768, 0, 8192, + 10240, 10752, 10768, 10770, 0, 8192, 10240, 10752, + 10768, 0, 8192, 10240, 10752, 10768, 10772, 0, + 8192, 10240, 10752, 10768, 10772, 0, 8192, 10240, + 10752, 10768, 10776, 10774, 0, 8192, 10240, 10752, + 10768, 0, 8192, 10240, 10752, 10784, 10776, 0, + 8192, 10240, 10752, 10784, 10776, 0, 8192, 10240, + 10752, 10784, 10776, 10778, 0, 8192, 10240, 10752, + 10784, 10776, 0, 8192, 10240, 10752, 10784, 10785, + 10780, 0, 8192, 10240, 10752, 10784, 10785, 10780, + 0, 8192, 10240, 10752, 10784, 10785, 10780, 10782, + 0, 8192, 10240, 10752, 0, 8192, 10240, 10752, + 10784, 0, 8192, 10240, 10752, 10784, 0, 8192, + 10240, 10752, 10784, 10786, 0, 8192, 10240, 10752, + 10784, 0, 8192, 10240, 10752, 10784, 10788, 0, + 8192, 10240, 10752, 10784, 10788, 0, 8192, 10240, + 10752, 10784, 10792, 10790, 0, 8192, 10240, 10752, + 10784, 0, 8192, 10240, 10752, 10784, 10792, 0, + 8192, 10240, 10752, 10784, 10792, 0, 8192, 10240, + 10752, 10784, 10792, 10794, 0, 8192, 10240, 10752, + 10784, 10792, 0, 8192, 10240, 10752, 10784, 10800, + 10796, 0, 8192, 10240, 10752, 10784, 10800, 10796, + 0, 8192, 10240, 10752, 10784, 10800, 10801, 10798, + 0, 8192, 10240, 10752, 10784, 0, 8192, 10240, + 10752, 10816, 10800, 0, 8192, 10240, 10752, 10816, + 10800, 0, 8192, 10240, 10752, 10816, 10800, 10802, + 0, 8192, 10240, 10752, 10816, 10800, 0, 8192, + 10240, 10752, 10816, 10800, 10804, 0, 8192, 10240, + 10752, 10816, 10800, 10804, 0, 8192, 10240, 10752, + 10816, 10800, 10808, 10806, 0, 8192, 10240, 10752, + 10816, 10800, 0, 8192, 10240, 10752, 10816, 10817, + 10808, 0, 8192, 10240, 10752, 10816, 10817, 10808, + 0, 8192, 10240, 10752, 10816, 10817, 10808, 10810, + 0, 8192, 10240, 10752, 10816, 10817, 10808, 0, + 8192, 10240, 10752, 10816, 10817, 10808, 10812, 0, + 8192, 10240, 10752, 10816, 10817, 10819, 10812, 0, + 8192, 10240, 10752, 10816, 10817, 10819, 10812, 10814, + 0, 8192, 10240, 10752, 0, 8192, 10240, 10752, + 10816, 0, 8192, 10240, 10752, 10816, 0, 8192, + 10240, 10752, 10816, 10818, 0, 8192, 10240, 10752, + 10816, 0, 8192, 10240, 10752, 10816, 10820, 0, + 8192, 10240, 10752, 10816, 10820, 0, 8192, 10240, + 10752, 10816, 10824, 10822, 0, 8192, 10240, 10752, + 10816, 0, 8192, 10240, 10752, 10816, 10824, 0, + 8192, 10240, 10752, 10816, 10824, 0, 8192, 10240, + 10752, 10816, 10824, 10826, 0, 8192, 10240, 10752, + 10816, 10824, 0, 8192, 10240, 10752, 10816, 10832, + 10828, 0, 8192, 10240, 10752, 10816, 10832, 10828, + 0, 8192, 10240, 10752, 10816, 10832, 10833, 10830, + 0, 8192, 10240, 10752, 10816, 0, 8192, 10240, + 10752, 10816, 10832, 0, 8192, 10240, 10752, 10816, + 10832, 0, 8192, 10240, 10752, 10816, 10832, 10834, + 0, 8192, 10240, 10752, 10816, 10832, 0, 8192, + 10240, 10752, 10816, 10832, 10836, 0, 8192, 10240, + 10752, 10816, 10832, 10836, 0, 8192, 10240, 10752, + 10816, 10832, 10840, 10838, 0, 8192, 10240, 10752, + 10816, 10832, 0, 8192, 10240, 10752, 10816, 10848, + 10840, 0, 8192, 10240, 10752, 10816, 10848, 10840, + 0, 8192, 10240, 10752, 10816, 10848, 10840, 10842, + 0, 8192, 10240, 10752, 10816, 10848, 10840, 0, + 8192, 10240, 10752, 10816, 10848, 10849, 10844, 0, + 8192, 10240, 10752, 10816, 10848, 10849, 10844, 0, + 8192, 10240, 10752, 10816, 10848, 10849, 10844, 10846, + 0, 8192, 10240, 10752, 10816, 0, 8192, 10240, + 10752, 10880, 10848, 0, 8192, 10240, 10752, 10880, + 10848, 0, 8192, 10240, 10752, 10880, 10848, 10850, + 0, 8192, 10240, 10752, 10880, 10848, 0, 8192, + 10240, 10752, 10880, 10848, 10852, 0, 8192, 10240, + 10752, 10880, 10848, 10852, 0, 8192, 10240, 10752, + 10880, 10848, 10856, 10854, 0, 8192, 10240, 10752, + 10880, 10848, 0, 8192, 10240, 10752, 10880, 10848, + 10856, 0, 8192, 10240, 10752, 10880, 10848, 10856, + 0, 8192, 10240, 10752, 10880, 10848, 10856, 10858, + 0, 8192, 10240, 10752, 10880, 10848, 10856, 0, + 8192, 10240, 10752, 10880, 10848, 10864, 10860, 0, + 8192, 10240, 10752, 10880, 10848, 10864, 10860, 0, + 8192, 10240, 10752, 10880, 10848, 10864, 10865, 10862, + 0, 8192, 10240, 10752, 10880, 10848, 0, 8192, + 10240, 10752, 10880, 10881, 10864, 0, 8192, 10240, + 10752, 10880, 10881, 10864, 0, 8192, 10240, 10752, + 10880, 10881, 10864, 10866, 0, 8192, 10240, 10752, + 10880, 10881, 10864, 0, 8192, 10240, 10752, 10880, + 10881, 10864, 10868, 0, 8192, 10240, 10752, 10880, + 10881, 10864, 10868, 0, 8192, 10240, 10752, 10880, + 10881, 10864, 10872, 10870, 0, 8192, 10240, 10752, + 10880, 10881, 10864, 0, 8192, 10240, 10752, 10880, + 10881, 10864, 10872, 0, 8192, 10240, 10752, 10880, + 10881, 10883, 10872, 0, 8192, 10240, 10752, 10880, + 10881, 10883, 10872, 10874, 0, 8192, 10240, 10752, + 10880, 10881, 10883, 10872, 0, 8192, 10240, 10752, + 10880, 10881, 10883, 10872, 10876, 0, 8192, 10240, + 10752, 10880, 10881, 10883, 10872, 10876, 0, 8192, + 10240, 10752, 10880, 10881, 10883, 10872, 10876, 10878, + 0, 8192, 10240, 10752, 0, 8192, 10240, 10752, + 10880, 0, 8192, 10240, 10752, 10880, 0, 8192, + 10240, 10752, 10880, 10882, 0, 8192, 10240, 10752, + 10880, 0, 8192, 10240, 10752, 10880, 10884, 0, + 8192, 10240, 10752, 10880, 10884, 0, 8192, 10240, + 10752, 10880, 10888, 10886, 0, 8192, 10240, 10752, + 10880, 0, 8192, 10240, 10752, 10880, 10888, 0, + 8192, 10240, 10752, 10880, 10888, 0, 8192, 10240, + 10752, 10880, 10888, 10890, 0, 8192, 10240, 10752, + 10880, 10888, 0, 8192, 10240, 10752, 10880, 10896, + 10892, 0, 8192, 10240, 10752, 10880, 10896, 10892, + 0, 8192, 10240, 10752, 10880, 10896, 10897, 10894, + 0, 8192, 10240, 10752, 10880, 0, 8192, 10240, + 10752, 10880, 10896, 0, 8192, 10240, 10752, 10880, + 10896, 0, 8192, 10240, 10752, 10880, 10896, 10898, + 0, 8192, 10240, 10752, 10880, 10896, 0, 8192, + 10240, 10752, 10880, 10896, 10900, 0, 8192, 10240, + 10752, 10880, 10896, 10900, 0, 8192, 10240, 10752, + 10880, 10896, 10904, 10902, 0, 8192, 10240, 10752, + 10880, 10896, 0, 8192, 10240, 10752, 10880, 10912, + 10904, 0, 8192, 10240, 10752, 10880, 10912, 10904, + 0, 8192, 10240, 10752, 10880, 10912, 10904, 10906, + 0, 8192, 10240, 10752, 10880, 10912, 10904, 0, + 8192, 10240, 10752, 10880, 10912, 10913, 10908, 0, + 8192, 10240, 10752, 10880, 10912, 10913, 10908, 0, + 8192, 10240, 10752, 10880, 10912, 10913, 10908, 10910, + 0, 8192, 10240, 10752, 10880, 0, 8192, 10240, + 10752, 10880, 10912, 0, 8192, 10240, 10752, 10880, + 10912, 0, 8192, 10240, 10752, 10880, 10912, 10914, + 0, 8192, 10240, 10752, 10880, 10912, 0, 8192, + 10240, 10752, 10880, 10912, 10916, 0, 8192, 10240, + 10752, 10880, 10912, 10916, 0, 8192, 10240, 10752, + 10880, 10912, 10920, 10918, 0, 8192, 10240, 10752, + 10880, 10912, 0, 8192, 10240, 10752, 10880, 10912, + 10920, 0, 8192, 10240, 10752, 10880, 10912, 10920, + 0, 8192, 10240, 10752, 10880, 10912, 10920, 10922, + 0, 8192, 10240, 10752, 10880, 10912, 10920, 0, + 8192, 10240, 10752, 10880, 10912, 10928, 10924, 0, + 8192, 10240, 10752, 10880, 10912, 10928, 10924, 0, + 8192, 10240, 10752, 10880, 10912, 10928, 10929, 10926, + 0, 8192, 10240, 10752, 10880, 10912, 0, 8192, + 10240, 10752, 10880, 10944, 10928, 0, 8192, 10240, + 10752, 10880, 10944, 10928, 0, 8192, 10240, 10752, + 10880, 10944, 10928, 10930, 0, 8192, 10240, 10752, + 10880, 10944, 10928, 0, 8192, 10240, 10752, 10880, + 10944, 10928, 10932, 0, 8192, 10240, 10752, 10880, + 10944, 10928, 10932, 0, 8192, 10240, 10752, 10880, + 10944, 10928, 10936, 10934, 0, 8192, 10240, 10752, + 10880, 10944, 10928, 0, 8192, 10240, 10752, 10880, + 10944, 10945, 10936, 0, 8192, 10240, 10752, 10880, + 10944, 10945, 10936, 0, 8192, 10240, 10752, 10880, + 10944, 10945, 10936, 10938, 0, 8192, 10240, 10752, + 10880, 10944, 10945, 10936, 0, 8192, 10240, 10752, + 10880, 10944, 10945, 10936, 10940, 0, 8192, 10240, + 10752, 10880, 10944, 10945, 10947, 10940, 0, 8192, + 10240, 10752, 10880, 10944, 10945, 10947, 10940, 10942, + 0, 8192, 10240, 10752, 10880, 0, 8192, 10240, + 10752, 11008, 10944, 0, 8192, 10240, 10752, 11008, + 10944, 0, 8192, 10240, 10752, 11008, 10944, 10946, + 0, 8192, 10240, 10752, 11008, 10944, 0, 8192, + 10240, 10752, 11008, 10944, 10948, 0, 8192, 10240, + 10752, 11008, 10944, 10948, 0, 8192, 10240, 10752, + 11008, 10944, 10952, 10950, 0, 8192, 10240, 10752, + 11008, 10944, 0, 8192, 10240, 10752, 11008, 10944, + 10952, 0, 8192, 10240, 10752, 11008, 10944, 10952, + 0, 8192, 10240, 10752, 11008, 10944, 10952, 10954, + 0, 8192, 10240, 10752, 11008, 10944, 10952, 0, + 8192, 10240, 10752, 11008, 10944, 10960, 10956, 0, + 8192, 10240, 10752, 11008, 10944, 10960, 10956, 0, + 8192, 10240, 10752, 11008, 10944, 10960, 10961, 10958, + 0, 8192, 10240, 10752, 11008, 10944, 0, 8192, + 10240, 10752, 11008, 10944, 10960, 0, 8192, 10240, + 10752, 11008, 10944, 10960, 0, 8192, 10240, 10752, + 11008, 10944, 10960, 10962, 0, 8192, 10240, 10752, + 11008, 10944, 10960, 0, 8192, 10240, 10752, 11008, + 10944, 10960, 10964, 0, 8192, 10240, 10752, 11008, + 10944, 10960, 10964, 0, 8192, 10240, 10752, 11008, + 10944, 10960, 10968, 10966, 0, 8192, 10240, 10752, + 11008, 10944, 10960, 0, 8192, 10240, 10752, 11008, + 10944, 10976, 10968, 0, 8192, 10240, 10752, 11008, + 10944, 10976, 10968, 0, 8192, 10240, 10752, 11008, + 10944, 10976, 10968, 10970, 0, 8192, 10240, 10752, + 11008, 10944, 10976, 10968, 0, 8192, 10240, 10752, + 11008, 10944, 10976, 10977, 10972, 0, 8192, 10240, + 10752, 11008, 10944, 10976, 10977, 10972, 0, 8192, + 10240, 10752, 11008, 10944, 10976, 10977, 10972, 10974, + 0, 8192, 10240, 10752, 11008, 10944, 0, 8192, + 10240, 10752, 11008, 11009, 10976, 0, 8192, 10240, + 10752, 11008, 11009, 10976, 0, 8192, 10240, 10752, + 11008, 11009, 10976, 10978, 0, 8192, 10240, 10752, + 11008, 11009, 10976, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10980, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10980, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10984, 10982, 0, 8192, 10240, 10752, + 11008, 11009, 10976, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10984, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10984, 0, 8192, 10240, 10752, 11008, + 11009, 10976, 10984, 10986, 0, 8192, 10240, 10752, + 11008, 11009, 10976, 10984, 0, 8192, 10240, 10752, + 11008, 11009, 10976, 10992, 10988, 0, 8192, 10240, + 10752, 11008, 11009, 10976, 10992, 10988, 0, 8192, + 10240, 10752, 11008, 11009, 10976, 10992, 10993, 10990, + 0, 8192, 10240, 10752, 11008, 11009, 10976, 0, + 8192, 10240, 10752, 11008, 11009, 10976, 10992, 0, + 8192, 10240, 10752, 11008, 11009, 11011, 10992, 0, + 8192, 10240, 10752, 11008, 11009, 11011, 10992, 10994, + 0, 8192, 10240, 10752, 11008, 11009, 11011, 10992, + 0, 8192, 10240, 10752, 11008, 11009, 11011, 10992, + 10996, 0, 8192, 10240, 10752, 11008, 11009, 11011, + 10992, 10996, 0, 8192, 10240, 10752, 11008, 11009, + 11011, 10992, 11000, 10998, 0, 8192, 10240, 10752, + 11008, 11009, 11011, 10992, 0, 8192, 10240, 10752, + 11008, 11009, 11011, 10992, 11000, 0, 8192, 10240, + 10752, 11008, 11009, 11011, 10992, 11000, 0, 8192, + 10240, 10752, 11008, 11009, 11011, 10992, 11000, 11002, + 0, 8192, 10240, 10752, 11008, 11009, 11011, 11015, + 11000, 0, 8192, 10240, 10752, 11008, 11009, 11011, + 11015, 11000, 11004, 0, 8192, 10240, 10752, 11008, + 11009, 11011, 11015, 11000, 11004, 0, 8192, 10240, + 10752, 11008, 11009, 11011, 11015, 11000, 11004, 11006, + 0, 8192, 10240, 10752, 0, 8192, 10240, 11264, + 11008, 0, 8192, 10240, 11264, 11008, 0, 8192, + 10240, 11264, 11008, 11010, 0, 8192, 10240, 11264, + 11008, 0, 8192, 10240, 11264, 11008, 11012, 0, + 8192, 10240, 11264, 11008, 11012, 0, 8192, 10240, + 11264, 11008, 11016, 11014, 0, 8192, 10240, 11264, + 11008, 0, 8192, 10240, 11264, 11008, 11016, 0, + 8192, 10240, 11264, 11008, 11016, 0, 8192, 10240, + 11264, 11008, 11016, 11018, 0, 8192, 10240, 11264, + 11008, 11016, 0, 8192, 10240, 11264, 11008, 11024, + 11020, 0, 8192, 10240, 11264, 11008, 11024, 11020, + 0, 8192, 10240, 11264, 11008, 11024, 11025, 11022, + 0, 8192, 10240, 11264, 11008, 0, 8192, 10240, + 11264, 11008, 11024, 0, 8192, 10240, 11264, 11008, + 11024, 0, 8192, 10240, 11264, 11008, 11024, 11026, + 0, 8192, 10240, 11264, 11008, 11024, 0, 8192, + 10240, 11264, 11008, 11024, 11028, 0, 8192, 10240, + 11264, 11008, 11024, 11028, 0, 8192, 10240, 11264, + 11008, 11024, 11032, 11030, 0, 8192, 10240, 11264, + 11008, 11024, 0, 8192, 10240, 11264, 11008, 11040, + 11032, 0, 8192, 10240, 11264, 11008, 11040, 11032, + 0, 8192, 10240, 11264, 11008, 11040, 11032, 11034, + 0, 8192, 10240, 11264, 11008, 11040, 11032, 0, + 8192, 10240, 11264, 11008, 11040, 11041, 11036, 0, + 8192, 10240, 11264, 11008, 11040, 11041, 11036, 0, + 8192, 10240, 11264, 11008, 11040, 11041, 11036, 11038, + 0, 8192, 10240, 11264, 11008, 0, 8192, 10240, + 11264, 11008, 11040, 0, 8192, 10240, 11264, 11008, + 11040, 0, 8192, 10240, 11264, 11008, 11040, 11042, + 0, 8192, 10240, 11264, 11008, 11040, 0, 8192, + 10240, 11264, 11008, 11040, 11044, 0, 8192, 10240, + 11264, 11008, 11040, 11044, 0, 8192, 10240, 11264, + 11008, 11040, 11048, 11046, 0, 8192, 10240, 11264, + 11008, 11040, 0, 8192, 10240, 11264, 11008, 11040, + 11048, 0, 8192, 10240, 11264, 11008, 11040, 11048, + 0, 8192, 10240, 11264, 11008, 11040, 11048, 11050, + 0, 8192, 10240, 11264, 11008, 11040, 11048, 0, + 8192, 10240, 11264, 11008, 11040, 11056, 11052, 0, + 8192, 10240, 11264, 11008, 11040, 11056, 11052, 0, + 8192, 10240, 11264, 11008, 11040, 11056, 11057, 11054, + 0, 8192, 10240, 11264, 11008, 11040, 0, 8192, + 10240, 11264, 11008, 11072, 11056, 0, 8192, 10240, + 11264, 11008, 11072, 11056, 0, 8192, 10240, 11264, + 11008, 11072, 11056, 11058, 0, 8192, 10240, 11264, + 11008, 11072, 11056, 0, 8192, 10240, 11264, 11008, + 11072, 11056, 11060, 0, 8192, 10240, 11264, 11008, + 11072, 11056, 11060, 0, 8192, 10240, 11264, 11008, + 11072, 11056, 11064, 11062, 0, 8192, 10240, 11264, + 11008, 11072, 11056, 0, 8192, 10240, 11264, 11008, + 11072, 11073, 11064, 0, 8192, 10240, 11264, 11008, + 11072, 11073, 11064, 0, 8192, 10240, 11264, 11008, + 11072, 11073, 11064, 11066, 0, 8192, 10240, 11264, + 11008, 11072, 11073, 11064, 0, 8192, 10240, 11264, + 11008, 11072, 11073, 11064, 11068, 0, 8192, 10240, + 11264, 11008, 11072, 11073, 11075, 11068, 0, 8192, + 10240, 11264, 11008, 11072, 11073, 11075, 11068, 11070, + 0, 8192, 10240, 11264, 11008, 0, 8192, 10240, + 11264, 11008, 11072, 0, 8192, 10240, 11264, 11008, + 11072, 0, 8192, 10240, 11264, 11008, 11072, 11074, + 0, 8192, 10240, 11264, 11008, 11072, 0, 8192, + 10240, 11264, 11008, 11072, 11076, 0, 8192, 10240, + 11264, 11008, 11072, 11076, 0, 8192, 10240, 11264, + 11008, 11072, 11080, 11078, 0, 8192, 10240, 11264, + 11008, 11072, 0, 8192, 10240, 11264, 11008, 11072, + 11080, 0, 8192, 10240, 11264, 11008, 11072, 11080, + 0, 8192, 10240, 11264, 11008, 11072, 11080, 11082, + 0, 8192, 10240, 11264, 11008, 11072, 11080, 0, + 8192, 10240, 11264, 11008, 11072, 11088, 11084, 0, + 8192, 10240, 11264, 11008, 11072, 11088, 11084, 0, + 8192, 10240, 11264, 11008, 11072, 11088, 11089, 11086, + 0, 8192, 10240, 11264, 11008, 11072, 0, 8192, + 10240, 11264, 11008, 11072, 11088, 0, 8192, 10240, + 11264, 11008, 11072, 11088, 0, 8192, 10240, 11264, + 11008, 11072, 11088, 11090, 0, 8192, 10240, 11264, + 11008, 11072, 11088, 0, 8192, 10240, 11264, 11008, + 11072, 11088, 11092, 0, 8192, 10240, 11264, 11008, + 11072, 11088, 11092, 0, 8192, 10240, 11264, 11008, + 11072, 11088, 11096, 11094, 0, 8192, 10240, 11264, + 11008, 11072, 11088, 0, 8192, 10240, 11264, 11008, + 11072, 11104, 11096, 0, 8192, 10240, 11264, 11008, + 11072, 11104, 11096, 0, 8192, 10240, 11264, 11008, + 11072, 11104, 11096, 11098, 0, 8192, 10240, 11264, + 11008, 11072, 11104, 11096, 0, 8192, 10240, 11264, + 11008, 11072, 11104, 11105, 11100, 0, 8192, 10240, + 11264, 11008, 11072, 11104, 11105, 11100, 0, 8192, + 10240, 11264, 11008, 11072, 11104, 11105, 11100, 11102, + 0, 8192, 10240, 11264, 11008, 11072, 0, 8192, + 10240, 11264, 11008, 11136, 11104, 0, 8192, 10240, + 11264, 11008, 11136, 11104, 0, 8192, 10240, 11264, + 11008, 11136, 11104, 11106, 0, 8192, 10240, 11264, + 11008, 11136, 11104, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11108, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11108, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11112, 11110, 0, 8192, 10240, 11264, + 11008, 11136, 11104, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11112, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11112, 0, 8192, 10240, 11264, 11008, + 11136, 11104, 11112, 11114, 0, 8192, 10240, 11264, + 11008, 11136, 11104, 11112, 0, 8192, 10240, 11264, + 11008, 11136, 11104, 11120, 11116, 0, 8192, 10240, + 11264, 11008, 11136, 11104, 11120, 11116, 0, 8192, + 10240, 11264, 11008, 11136, 11104, 11120, 11121, 11118, + 0, 8192, 10240, 11264, 11008, 11136, 11104, 0, + 8192, 10240, 11264, 11008, 11136, 11137, 11120, 0, + 8192, 10240, 11264, 11008, 11136, 11137, 11120, 0, + 8192, 10240, 11264, 11008, 11136, 11137, 11120, 11122, + 0, 8192, 10240, 11264, 11008, 11136, 11137, 11120, + 0, 8192, 10240, 11264, 11008, 11136, 11137, 11120, + 11124, 0, 8192, 10240, 11264, 11008, 11136, 11137, + 11120, 11124, 0, 8192, 10240, 11264, 11008, 11136, + 11137, 11120, 11128, 11126, 0, 8192, 10240, 11264, + 11008, 11136, 11137, 11120, 0, 8192, 10240, 11264, + 11008, 11136, 11137, 11120, 11128, 0, 8192, 10240, + 11264, 11008, 11136, 11137, 11139, 11128, 0, 8192, + 10240, 11264, 11008, 11136, 11137, 11139, 11128, 11130, + 0, 8192, 10240, 11264, 11008, 11136, 11137, 11139, + 11128, 0, 8192, 10240, 11264, 11008, 11136, 11137, + 11139, 11128, 11132, 0, 8192, 10240, 11264, 11008, + 11136, 11137, 11139, 11128, 11132, 0, 8192, 10240, + 11264, 11008, 11136, 11137, 11139, 11128, 11132, 11134, + 0, 8192, 10240, 11264, 11008, 0, 8192, 10240, + 11264, 11008, 11136, 0, 8192, 10240, 11264, 11265, + 11136, 0, 8192, 10240, 11264, 11265, 11136, 11138, + 0, 8192, 10240, 11264, 11265, 11136, 0, 8192, + 10240, 11264, 11265, 11136, 11140, 0, 8192, 10240, + 11264, 11265, 11136, 11140, 0, 8192, 10240, 11264, + 11265, 11136, 11144, 11142, 0, 8192, 10240, 11264, + 11265, 11136, 0, 8192, 10240, 11264, 11265, 11136, + 11144, 0, 8192, 10240, 11264, 11265, 11136, 11144, + 0, 8192, 10240, 11264, 11265, 11136, 11144, 11146, + 0, 8192, 10240, 11264, 11265, 11136, 11144, 0, + 8192, 10240, 11264, 11265, 11136, 11152, 11148, 0, + 8192, 10240, 11264, 11265, 11136, 11152, 11148, 0, + 8192, 10240, 11264, 11265, 11136, 11152, 11153, 11150, + 0, 8192, 10240, 11264, 11265, 11136, 0, 8192, + 10240, 11264, 11265, 11136, 11152, 0, 8192, 10240, + 11264, 11265, 11136, 11152, 0, 8192, 10240, 11264, + 11265, 11136, 11152, 11154, 0, 8192, 10240, 11264, + 11265, 11136, 11152, 0, 8192, 10240, 11264, 11265, + 11136, 11152, 11156, 0, 8192, 10240, 11264, 11265, + 11136, 11152, 11156, 0, 8192, 10240, 11264, 11265, + 11136, 11152, 11160, 11158, 0, 8192, 10240, 11264, + 11265, 11136, 11152, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11160, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11160, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11160, 11162, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 11160, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 11169, 11164, 0, 8192, 10240, + 11264, 11265, 11136, 11168, 11169, 11164, 0, 8192, + 10240, 11264, 11265, 11136, 11168, 11169, 11164, 11166, + 0, 8192, 10240, 11264, 11265, 11136, 0, 8192, + 10240, 11264, 11265, 11136, 11168, 0, 8192, 10240, + 11264, 11265, 11136, 11168, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 11170, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11172, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11172, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11176, 11174, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11176, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11176, 0, 8192, 10240, 11264, 11265, + 11136, 11168, 11176, 11178, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 11176, 0, 8192, 10240, 11264, + 11265, 11136, 11168, 11184, 11180, 0, 8192, 10240, + 11264, 11265, 11136, 11168, 11184, 11180, 0, 8192, + 10240, 11264, 11265, 11136, 11168, 11184, 11185, 11182, + 0, 8192, 10240, 11264, 11265, 11136, 11168, 0, + 8192, 10240, 11264, 11265, 11136, 11200, 11184, 0, + 8192, 10240, 11264, 11265, 11136, 11200, 11184, 0, + 8192, 10240, 11264, 11265, 11136, 11200, 11184, 11186, + 0, 8192, 10240, 11264, 11265, 11136, 11200, 11184, + 0, 8192, 10240, 11264, 11265, 11136, 11200, 11184, + 11188, 0, 8192, 10240, 11264, 11265, 11136, 11200, + 11184, 11188, 0, 8192, 10240, 11264, 11265, 11136, + 11200, 11184, 11192, 11190, 0, 8192, 10240, 11264, + 11265, 11136, 11200, 11184, 0, 8192, 10240, 11264, + 11265, 11136, 11200, 11201, 11192, 0, 8192, 10240, + 11264, 11265, 11136, 11200, 11201, 11192, 0, 8192, + 10240, 11264, 11265, 11136, 11200, 11201, 11192, 11194, + 0, 8192, 10240, 11264, 11265, 11136, 11200, 11201, + 11192, 0, 8192, 10240, 11264, 11265, 11136, 11200, + 11201, 11192, 11196, 0, 8192, 10240, 11264, 11265, + 11136, 11200, 11201, 11203, 11196, 0, 8192, 10240, + 11264, 11265, 11136, 11200, 11201, 11203, 11196, 11198, + 0, 8192, 10240, 11264, 11265, 11136, 0, 8192, + 10240, 11264, 11265, 11136, 11200, 0, 8192, 10240, + 11264, 11265, 11136, 11200, 0, 8192, 10240, 11264, + 11265, 11136, 11200, 11202, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11204, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11204, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11208, 11206, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11208, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11208, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11208, 11210, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 11208, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 11216, 11212, 0, 8192, 10240, + 11264, 11265, 11267, 11200, 11216, 11212, 0, 8192, + 10240, 11264, 11265, 11267, 11200, 11216, 11217, 11214, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11216, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11216, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11216, 11218, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 11216, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 11216, + 11220, 0, 8192, 10240, 11264, 11265, 11267, 11200, + 11216, 11220, 0, 8192, 10240, 11264, 11265, 11267, + 11200, 11216, 11224, 11222, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 11216, 0, 8192, 10240, 11264, + 11265, 11267, 11200, 11232, 11224, 0, 8192, 10240, + 11264, 11265, 11267, 11200, 11232, 11224, 0, 8192, + 10240, 11264, 11265, 11267, 11200, 11232, 11224, 11226, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 11232, + 11224, 0, 8192, 10240, 11264, 11265, 11267, 11200, + 11232, 11233, 11228, 0, 8192, 10240, 11264, 11265, + 11267, 11200, 11232, 11233, 11228, 0, 8192, 10240, + 11264, 11265, 11267, 11200, 11232, 11233, 11228, 11230, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11232, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11232, 0, + 8192, 10240, 11264, 11265, 11267, 11200, 11232, 11234, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 11232, + 0, 8192, 10240, 11264, 11265, 11267, 11200, 11232, + 11236, 0, 8192, 10240, 11264, 11265, 11267, 11200, + 11232, 11236, 0, 8192, 10240, 11264, 11265, 11267, + 11200, 11232, 11240, 11238, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 11240, 0, 8192, 10240, + 11264, 11265, 11267, 11271, 11232, 11240, 0, 8192, + 10240, 11264, 11265, 11267, 11271, 11232, 11240, 11242, + 0, 8192, 10240, 11264, 11265, 11267, 11271, 11232, + 11240, 0, 8192, 10240, 11264, 11265, 11267, 11271, + 11232, 11248, 11244, 0, 8192, 10240, 11264, 11265, + 11267, 11271, 11232, 11248, 11244, 0, 8192, 10240, + 11264, 11265, 11267, 11271, 11232, 11248, 11249, 11246, + 0, 8192, 10240, 11264, 11265, 11267, 11271, 11232, + 0, 8192, 10240, 11264, 11265, 11267, 11271, 11232, + 11248, 0, 8192, 10240, 11264, 11265, 11267, 11271, + 11232, 11248, 0, 8192, 10240, 11264, 11265, 11267, + 11271, 11232, 11248, 11250, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 11248, 0, 8192, 10240, + 11264, 11265, 11267, 11271, 11232, 11248, 11252, 0, + 8192, 10240, 11264, 11265, 11267, 11271, 11232, 11248, + 11252, 0, 8192, 10240, 11264, 11265, 11267, 11271, + 11232, 11248, 11256, 11254, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 11248, 0, 8192, 10240, + 11264, 11265, 11267, 11271, 11232, 11248, 11256, 0, + 8192, 10240, 11264, 11265, 11267, 11271, 11232, 11248, + 11256, 0, 8192, 10240, 11264, 11265, 11267, 11271, + 11232, 11248, 11256, 11258, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 11248, 11256, 0, 8192, + 10240, 11264, 11265, 11267, 11271, 11232, 11248, 11256, + 11260, 0, 8192, 10240, 11264, 11265, 11267, 11271, + 11232, 11248, 11256, 11260, 0, 8192, 10240, 11264, + 11265, 11267, 11271, 11232, 11248, 11256, 11260, 11262, + 0, 8192, 10240, 0, 8192, 10240, 11264, 0, + 8192, 10240, 11264, 0, 8192, 10240, 11264, 11266, + 0, 8192, 10240, 11264, 0, 8192, 10240, 11264, + 11268, 0, 8192, 10240, 11264, 11268, 0, 8192, + 10240, 11264, 11272, 11270, 0, 8192, 10240, 11264, + 0, 8192, 10240, 11264, 11272, 0, 8192, 10240, + 11264, 11272, 0, 8192, 10240, 11264, 11272, 11274, + 0, 8192, 10240, 11264, 11272, 0, 8192, 10240, + 11264, 11280, 11276, 0, 8192, 10240, 11264, 11280, + 11276, 0, 8192, 10240, 11264, 11280, 11281, 11278, + 0, 8192, 10240, 11264, 0, 8192, 10240, 11264, + 11280, 0, 8192, 10240, 11264, 11280, 0, 8192, + 10240, 11264, 11280, 11282, 0, 8192, 10240, 11264, + 11280, 0, 8192, 10240, 11264, 11280, 11284, 0, + 8192, 10240, 11264, 11280, 11284, 0, 8192, 10240, + 11264, 11280, 11288, 11286, 0, 8192, 10240, 11264, + 11280, 0, 8192, 10240, 11264, 11296, 11288, 0, + 8192, 10240, 11264, 11296, 11288, 0, 8192, 10240, + 11264, 11296, 11288, 11290, 0, 8192, 10240, 11264, + 11296, 11288, 0, 8192, 10240, 11264, 11296, 11297, + 11292, 0, 8192, 10240, 11264, 11296, 11297, 11292, + 0, 8192, 10240, 11264, 11296, 11297, 11292, 11294, + 0, 8192, 10240, 11264, 0, 8192, 10240, 11264, + 11296, 0, 8192, 10240, 11264, 11296, 0, 8192, + 10240, 11264, 11296, 11298, 0, 8192, 10240, 11264, + 11296, 0, 8192, 10240, 11264, 11296, 11300, 0, + 8192, 10240, 11264, 11296, 11300, 0, 8192, 10240, + 11264, 11296, 11304, 11302, 0, 8192, 10240, 11264, + 11296, 0, 8192, 10240, 11264, 11296, 11304, 0, + 8192, 10240, 11264, 11296, 11304, 0, 8192, 10240, + 11264, 11296, 11304, 11306, 0, 8192, 10240, 11264, + 11296, 11304, 0, 8192, 10240, 11264, 11296, 11312, + 11308, 0, 8192, 10240, 11264, 11296, 11312, 11308, + 0, 8192, 10240, 11264, 11296, 11312, 11313, 11310, + 0, 8192, 10240, 11264, 11296, 0, 8192, 10240, + 11264, 11328, 11312, 0, 8192, 10240, 11264, 11328, + 11312, 0, 8192, 10240, 11264, 11328, 11312, 11314, + 0, 8192, 10240, 11264, 11328, 11312, 0, 8192, + 10240, 11264, 11328, 11312, 11316, 0, 8192, 10240, + 11264, 11328, 11312, 11316, 0, 8192, 10240, 11264, + 11328, 11312, 11320, 11318, 0, 8192, 10240, 11264, + 11328, 11312, 0, 8192, 10240, 11264, 11328, 11329, + 11320, 0, 8192, 10240, 11264, 11328, 11329, 11320, + 0, 8192, 10240, 11264, 11328, 11329, 11320, 11322, + 0, 8192, 10240, 11264, 11328, 11329, 11320, 0, + 8192, 10240, 11264, 11328, 11329, 11320, 11324, 0, + 8192, 10240, 11264, 11328, 11329, 11331, 11324, 0, + 8192, 10240, 11264, 11328, 11329, 11331, 11324, 11326, + 0, 8192, 10240, 11264, 0, 8192, 10240, 11264, + 11328, 0, 8192, 10240, 11264, 11328, 0, 8192, + 10240, 11264, 11328, 11330, 0, 8192, 10240, 11264, + 11328, 0, 8192, 10240, 11264, 11328, 11332, 0, + 8192, 10240, 11264, 11328, 11332, 0, 8192, 10240, + 11264, 11328, 11336, 11334, 0, 8192, 10240, 11264, + 11328, 0, 8192, 10240, 11264, 11328, 11336, 0, + 8192, 10240, 11264, 11328, 11336, 0, 8192, 10240, + 11264, 11328, 11336, 11338, 0, 8192, 10240, 11264, + 11328, 11336, 0, 8192, 10240, 11264, 11328, 11344, + 11340, 0, 8192, 10240, 11264, 11328, 11344, 11340, + 0, 8192, 10240, 11264, 11328, 11344, 11345, 11342, + 0, 8192, 10240, 11264, 11328, 0, 8192, 10240, + 11264, 11328, 11344, 0, 8192, 10240, 11264, 11328, + 11344, 0, 8192, 10240, 11264, 11328, 11344, 11346, + 0, 8192, 10240, 11264, 11328, 11344, 0, 8192, + 10240, 11264, 11328, 11344, 11348, 0, 8192, 10240, + 11264, 11328, 11344, 11348, 0, 8192, 10240, 11264, + 11328, 11344, 11352, 11350, 0, 8192, 10240, 11264, + 11328, 11344, 0, 8192, 10240, 11264, 11328, 11360, + 11352, 0, 8192, 10240, 11264, 11328, 11360, 11352, + 0, 8192, 10240, 11264, 11328, 11360, 11352, 11354, + 0, 8192, 10240, 11264, 11328, 11360, 11352, 0, + 8192, 10240, 11264, 11328, 11360, 11361, 11356, 0, + 8192, 10240, 11264, 11328, 11360, 11361, 11356, 0, + 8192, 10240, 11264, 11328, 11360, 11361, 11356, 11358, + 0, 8192, 10240, 11264, 11328, 0, 8192, 10240, + 11264, 11392, 11360, 0, 8192, 10240, 11264, 11392, + 11360, 0, 8192, 10240, 11264, 11392, 11360, 11362, + 0, 8192, 10240, 11264, 11392, 11360, 0, 8192, + 10240, 11264, 11392, 11360, 11364, 0, 8192, 10240, + 11264, 11392, 11360, 11364, 0, 8192, 10240, 11264, + 11392, 11360, 11368, 11366, 0, 8192, 10240, 11264, + 11392, 11360, 0, 8192, 10240, 11264, 11392, 11360, + 11368, 0, 8192, 10240, 11264, 11392, 11360, 11368, + 0, 8192, 10240, 11264, 11392, 11360, 11368, 11370, + 0, 8192, 10240, 11264, 11392, 11360, 11368, 0, + 8192, 10240, 11264, 11392, 11360, 11376, 11372, 0, + 8192, 10240, 11264, 11392, 11360, 11376, 11372, 0, + 8192, 10240, 11264, 11392, 11360, 11376, 11377, 11374, + 0, 8192, 10240, 11264, 11392, 11360, 0, 8192, + 10240, 11264, 11392, 11393, 11376, 0, 8192, 10240, + 11264, 11392, 11393, 11376, 0, 8192, 10240, 11264, + 11392, 11393, 11376, 11378, 0, 8192, 10240, 11264, + 11392, 11393, 11376, 0, 8192, 10240, 11264, 11392, + 11393, 11376, 11380, 0, 8192, 10240, 11264, 11392, + 11393, 11376, 11380, 0, 8192, 10240, 11264, 11392, + 11393, 11376, 11384, 11382, 0, 8192, 10240, 11264, + 11392, 11393, 11376, 0, 8192, 10240, 11264, 11392, + 11393, 11376, 11384, 0, 8192, 10240, 11264, 11392, + 11393, 11395, 11384, 0, 8192, 10240, 11264, 11392, + 11393, 11395, 11384, 11386, 0, 8192, 10240, 11264, + 11392, 11393, 11395, 11384, 0, 8192, 10240, 11264, + 11392, 11393, 11395, 11384, 11388, 0, 8192, 10240, + 11264, 11392, 11393, 11395, 11384, 11388, 0, 8192, + 10240, 11264, 11392, 11393, 11395, 11384, 11388, 11390, + 0, 8192, 10240, 11264, 0, 8192, 10240, 11264, + 11392, 0, 8192, 10240, 11264, 11392, 0, 8192, + 10240, 11264, 11392, 11394, 0, 8192, 10240, 11264, + 11392, 0, 8192, 10240, 11264, 11392, 11396, 0, + 8192, 10240, 11264, 11392, 11396, 0, 8192, 10240, + 11264, 11392, 11400, 11398, 0, 8192, 10240, 11264, + 11392, 0, 8192, 10240, 11264, 11392, 11400, 0, + 8192, 10240, 11264, 11392, 11400, 0, 8192, 10240, + 11264, 11392, 11400, 11402, 0, 8192, 10240, 11264, + 11392, 11400, 0, 8192, 10240, 11264, 11392, 11408, + 11404, 0, 8192, 10240, 11264, 11392, 11408, 11404, + 0, 8192, 10240, 11264, 11392, 11408, 11409, 11406, + 0, 8192, 10240, 11264, 11392, 0, 8192, 10240, + 11264, 11392, 11408, 0, 8192, 10240, 11264, 11392, + 11408, 0, 8192, 10240, 11264, 11392, 11408, 11410, + 0, 8192, 10240, 11264, 11392, 11408, 0, 8192, + 10240, 11264, 11392, 11408, 11412, 0, 8192, 10240, + 11264, 11392, 11408, 11412, 0, 8192, 10240, 11264, + 11392, 11408, 11416, 11414, 0, 8192, 10240, 11264, + 11392, 11408, 0, 8192, 10240, 11264, 11392, 11424, + 11416, 0, 8192, 10240, 11264, 11392, 11424, 11416, + 0, 8192, 10240, 11264, 11392, 11424, 11416, 11418, + 0, 8192, 10240, 11264, 11392, 11424, 11416, 0, + 8192, 10240, 11264, 11392, 11424, 11425, 11420, 0, + 8192, 10240, 11264, 11392, 11424, 11425, 11420, 0, + 8192, 10240, 11264, 11392, 11424, 11425, 11420, 11422, + 0, 8192, 10240, 11264, 11392, 0, 8192, 10240, + 11264, 11392, 11424, 0, 8192, 10240, 11264, 11392, + 11424, 0, 8192, 10240, 11264, 11392, 11424, 11426, + 0, 8192, 10240, 11264, 11392, 11424, 0, 8192, + 10240, 11264, 11392, 11424, 11428, 0, 8192, 10240, + 11264, 11392, 11424, 11428, 0, 8192, 10240, 11264, + 11392, 11424, 11432, 11430, 0, 8192, 10240, 11264, + 11392, 11424, 0, 8192, 10240, 11264, 11392, 11424, + 11432, 0, 8192, 10240, 11264, 11392, 11424, 11432, + 0, 8192, 10240, 11264, 11392, 11424, 11432, 11434, + 0, 8192, 10240, 11264, 11392, 11424, 11432, 0, + 8192, 10240, 11264, 11392, 11424, 11440, 11436, 0, + 8192, 10240, 11264, 11392, 11424, 11440, 11436, 0, + 8192, 10240, 11264, 11392, 11424, 11440, 11441, 11438, + 0, 8192, 10240, 11264, 11392, 11424, 0, 8192, + 10240, 11264, 11392, 11456, 11440, 0, 8192, 10240, + 11264, 11392, 11456, 11440, 0, 8192, 10240, 11264, + 11392, 11456, 11440, 11442, 0, 8192, 10240, 11264, + 11392, 11456, 11440, 0, 8192, 10240, 11264, 11392, + 11456, 11440, 11444, 0, 8192, 10240, 11264, 11392, + 11456, 11440, 11444, 0, 8192, 10240, 11264, 11392, + 11456, 11440, 11448, 11446, 0, 8192, 10240, 11264, + 11392, 11456, 11440, 0, 8192, 10240, 11264, 11392, + 11456, 11457, 11448, 0, 8192, 10240, 11264, 11392, + 11456, 11457, 11448, 0, 8192, 10240, 11264, 11392, + 11456, 11457, 11448, 11450, 0, 8192, 10240, 11264, + 11392, 11456, 11457, 11448, 0, 8192, 10240, 11264, + 11392, 11456, 11457, 11448, 11452, 0, 8192, 10240, + 11264, 11392, 11456, 11457, 11459, 11452, 0, 8192, + 10240, 11264, 11392, 11456, 11457, 11459, 11452, 11454, + 0, 8192, 10240, 11264, 11392, 0, 8192, 10240, + 11264, 11520, 11456, 0, 8192, 10240, 11264, 11520, + 11456, 0, 8192, 10240, 11264, 11520, 11456, 11458, + 0, 8192, 10240, 11264, 11520, 11456, 0, 8192, + 10240, 11264, 11520, 11456, 11460, 0, 8192, 10240, + 11264, 11520, 11456, 11460, 0, 8192, 10240, 11264, + 11520, 11456, 11464, 11462, 0, 8192, 10240, 11264, + 11520, 11456, 0, 8192, 10240, 11264, 11520, 11456, + 11464, 0, 8192, 10240, 11264, 11520, 11456, 11464, + 0, 8192, 10240, 11264, 11520, 11456, 11464, 11466, + 0, 8192, 10240, 11264, 11520, 11456, 11464, 0, + 8192, 10240, 11264, 11520, 11456, 11472, 11468, 0, + 8192, 10240, 11264, 11520, 11456, 11472, 11468, 0, + 8192, 10240, 11264, 11520, 11456, 11472, 11473, 11470, + 0, 8192, 10240, 11264, 11520, 11456, 0, 8192, + 10240, 11264, 11520, 11456, 11472, 0, 8192, 10240, + 11264, 11520, 11456, 11472, 0, 8192, 10240, 11264, + 11520, 11456, 11472, 11474, 0, 8192, 10240, 11264, + 11520, 11456, 11472, 0, 8192, 10240, 11264, 11520, + 11456, 11472, 11476, 0, 8192, 10240, 11264, 11520, + 11456, 11472, 11476, 0, 8192, 10240, 11264, 11520, + 11456, 11472, 11480, 11478, 0, 8192, 10240, 11264, + 11520, 11456, 11472, 0, 8192, 10240, 11264, 11520, + 11456, 11488, 11480, 0, 8192, 10240, 11264, 11520, + 11456, 11488, 11480, 0, 8192, 10240, 11264, 11520, + 11456, 11488, 11480, 11482, 0, 8192, 10240, 11264, + 11520, 11456, 11488, 11480, 0, 8192, 10240, 11264, + 11520, 11456, 11488, 11489, 11484, 0, 8192, 10240, + 11264, 11520, 11456, 11488, 11489, 11484, 0, 8192, + 10240, 11264, 11520, 11456, 11488, 11489, 11484, 11486, + 0, 8192, 10240, 11264, 11520, 11456, 0, 8192, + 10240, 11264, 11520, 11521, 11488, 0, 8192, 10240, + 11264, 11520, 11521, 11488, 0, 8192, 10240, 11264, + 11520, 11521, 11488, 11490, 0, 8192, 10240, 11264, + 11520, 11521, 11488, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11492, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11492, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11496, 11494, 0, 8192, 10240, 11264, + 11520, 11521, 11488, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11496, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11496, 0, 8192, 10240, 11264, 11520, + 11521, 11488, 11496, 11498, 0, 8192, 10240, 11264, + 11520, 11521, 11488, 11496, 0, 8192, 10240, 11264, + 11520, 11521, 11488, 11504, 11500, 0, 8192, 10240, + 11264, 11520, 11521, 11488, 11504, 11500, 0, 8192, + 10240, 11264, 11520, 11521, 11488, 11504, 11505, 11502, + 0, 8192, 10240, 11264, 11520, 11521, 11488, 0, + 8192, 10240, 11264, 11520, 11521, 11488, 11504, 0, + 8192, 10240, 11264, 11520, 11521, 11523, 11504, 0, + 8192, 10240, 11264, 11520, 11521, 11523, 11504, 11506, + 0, 8192, 10240, 11264, 11520, 11521, 11523, 11504, + 0, 8192, 10240, 11264, 11520, 11521, 11523, 11504, + 11508, 0, 8192, 10240, 11264, 11520, 11521, 11523, + 11504, 11508, 0, 8192, 10240, 11264, 11520, 11521, + 11523, 11504, 11512, 11510, 0, 8192, 10240, 11264, + 11520, 11521, 11523, 11504, 0, 8192, 10240, 11264, + 11520, 11521, 11523, 11504, 11512, 0, 8192, 10240, + 11264, 11520, 11521, 11523, 11504, 11512, 0, 8192, + 10240, 11264, 11520, 11521, 11523, 11504, 11512, 11514, + 0, 8192, 10240, 11264, 11520, 11521, 11523, 11527, + 11512, 0, 8192, 10240, 11264, 11520, 11521, 11523, + 11527, 11512, 11516, 0, 8192, 10240, 11264, 11520, + 11521, 11523, 11527, 11512, 11516, 0, 8192, 10240, + 11264, 11520, 11521, 11523, 11527, 11512, 11516, 11518, + 0, 8192, 10240, 11264, 0, 8192, 12288, 11264, + 11520, 0, 8192, 12288, 11264, 11520, 0, 8192, + 12288, 11264, 11520, 11522, 0, 8192, 12288, 11264, + 11520, 0, 8192, 12288, 11264, 11520, 11524, 0, + 8192, 12288, 11264, 11520, 11524, 0, 8192, 12288, + 11264, 11520, 11528, 11526, 0, 8192, 12288, 11264, + 11520, 0, 8192, 12288, 11264, 11520, 11528, 0, + 8192, 12288, 11264, 11520, 11528, 0, 8192, 12288, + 11264, 11520, 11528, 11530, 0, 8192, 12288, 11264, + 11520, 11528, 0, 8192, 12288, 11264, 11520, 11536, + 11532, 0, 8192, 12288, 11264, 11520, 11536, 11532, + 0, 8192, 12288, 11264, 11520, 11536, 11537, 11534, + 0, 8192, 12288, 11264, 11520, 0, 8192, 12288, + 11264, 11520, 11536, 0, 8192, 12288, 11264, 11520, + 11536, 0, 8192, 12288, 11264, 11520, 11536, 11538, + 0, 8192, 12288, 11264, 11520, 11536, 0, 8192, + 12288, 11264, 11520, 11536, 11540, 0, 8192, 12288, + 11264, 11520, 11536, 11540, 0, 8192, 12288, 11264, + 11520, 11536, 11544, 11542, 0, 8192, 12288, 11264, + 11520, 11536, 0, 8192, 12288, 11264, 11520, 11552, + 11544, 0, 8192, 12288, 11264, 11520, 11552, 11544, + 0, 8192, 12288, 11264, 11520, 11552, 11544, 11546, + 0, 8192, 12288, 11264, 11520, 11552, 11544, 0, + 8192, 12288, 11264, 11520, 11552, 11553, 11548, 0, + 8192, 12288, 11264, 11520, 11552, 11553, 11548, 0, + 8192, 12288, 11264, 11520, 11552, 11553, 11548, 11550, + 0, 8192, 12288, 11264, 11520, 0, 8192, 12288, + 11264, 11520, 11552, 0, 8192, 12288, 11264, 11520, + 11552, 0, 8192, 12288, 11264, 11520, 11552, 11554, + 0, 8192, 12288, 11264, 11520, 11552, 0, 8192, + 12288, 11264, 11520, 11552, 11556, 0, 8192, 12288, + 11264, 11520, 11552, 11556, 0, 8192, 12288, 11264, + 11520, 11552, 11560, 11558, 0, 8192, 12288, 11264, + 11520, 11552, 0, 8192, 12288, 11264, 11520, 11552, + 11560, 0, 8192, 12288, 11264, 11520, 11552, 11560, + 0, 8192, 12288, 11264, 11520, 11552, 11560, 11562, + 0, 8192, 12288, 11264, 11520, 11552, 11560, 0, + 8192, 12288, 11264, 11520, 11552, 11568, 11564, 0, + 8192, 12288, 11264, 11520, 11552, 11568, 11564, 0, + 8192, 12288, 11264, 11520, 11552, 11568, 11569, 11566, + 0, 8192, 12288, 11264, 11520, 11552, 0, 8192, + 12288, 11264, 11520, 11584, 11568, 0, 8192, 12288, + 11264, 11520, 11584, 11568, 0, 8192, 12288, 11264, + 11520, 11584, 11568, 11570, 0, 8192, 12288, 11264, + 11520, 11584, 11568, 0, 8192, 12288, 11264, 11520, + 11584, 11568, 11572, 0, 8192, 12288, 11264, 11520, + 11584, 11568, 11572, 0, 8192, 12288, 11264, 11520, + 11584, 11568, 11576, 11574, 0, 8192, 12288, 11264, + 11520, 11584, 11568, 0, 8192, 12288, 11264, 11520, + 11584, 11585, 11576, 0, 8192, 12288, 11264, 11520, + 11584, 11585, 11576, 0, 8192, 12288, 11264, 11520, + 11584, 11585, 11576, 11578, 0, 8192, 12288, 11264, + 11520, 11584, 11585, 11576, 0, 8192, 12288, 11264, + 11520, 11584, 11585, 11576, 11580, 0, 8192, 12288, + 11264, 11520, 11584, 11585, 11587, 11580, 0, 8192, + 12288, 11264, 11520, 11584, 11585, 11587, 11580, 11582, + 0, 8192, 12288, 11264, 11520, 0, 8192, 12288, + 11264, 11520, 11584, 0, 8192, 12288, 11264, 11520, + 11584, 0, 8192, 12288, 11264, 11520, 11584, 11586, + 0, 8192, 12288, 11264, 11520, 11584, 0, 8192, + 12288, 11264, 11520, 11584, 11588, 0, 8192, 12288, + 11264, 11520, 11584, 11588, 0, 8192, 12288, 11264, + 11520, 11584, 11592, 11590, 0, 8192, 12288, 11264, + 11520, 11584, 0, 8192, 12288, 11264, 11520, 11584, + 11592, 0, 8192, 12288, 11264, 11520, 11584, 11592, + 0, 8192, 12288, 11264, 11520, 11584, 11592, 11594, + 0, 8192, 12288, 11264, 11520, 11584, 11592, 0, + 8192, 12288, 11264, 11520, 11584, 11600, 11596, 0, + 8192, 12288, 11264, 11520, 11584, 11600, 11596, 0, + 8192, 12288, 11264, 11520, 11584, 11600, 11601, 11598, + 0, 8192, 12288, 11264, 11520, 11584, 0, 8192, + 12288, 11264, 11520, 11584, 11600, 0, 8192, 12288, + 11264, 11520, 11584, 11600, 0, 8192, 12288, 11264, + 11520, 11584, 11600, 11602, 0, 8192, 12288, 11264, + 11520, 11584, 11600, 0, 8192, 12288, 11264, 11520, + 11584, 11600, 11604, 0, 8192, 12288, 11264, 11520, + 11584, 11600, 11604, 0, 8192, 12288, 11264, 11520, + 11584, 11600, 11608, 11606, 0, 8192, 12288, 11264, + 11520, 11584, 11600, 0, 8192, 12288, 11264, 11520, + 11584, 11616, 11608, 0, 8192, 12288, 11264, 11520, + 11584, 11616, 11608, 0, 8192, 12288, 11264, 11520, + 11584, 11616, 11608, 11610, 0, 8192, 12288, 11264, + 11520, 11584, 11616, 11608, 0, 8192, 12288, 11264, + 11520, 11584, 11616, 11617, 11612, 0, 8192, 12288, + 11264, 11520, 11584, 11616, 11617, 11612, 0, 8192, + 12288, 11264, 11520, 11584, 11616, 11617, 11612, 11614, + 0, 8192, 12288, 11264, 11520, 11584, 0, 8192, + 12288, 11264, 11520, 11648, 11616, 0, 8192, 12288, + 11264, 11520, 11648, 11616, 0, 8192, 12288, 11264, + 11520, 11648, 11616, 11618, 0, 8192, 12288, 11264, + 11520, 11648, 11616, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11620, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11620, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11624, 11622, 0, 8192, 12288, 11264, + 11520, 11648, 11616, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11624, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11624, 0, 8192, 12288, 11264, 11520, + 11648, 11616, 11624, 11626, 0, 8192, 12288, 11264, + 11520, 11648, 11616, 11624, 0, 8192, 12288, 11264, + 11520, 11648, 11616, 11632, 11628, 0, 8192, 12288, + 11264, 11520, 11648, 11616, 11632, 11628, 0, 8192, + 12288, 11264, 11520, 11648, 11616, 11632, 11633, 11630, + 0, 8192, 12288, 11264, 11520, 11648, 11616, 0, + 8192, 12288, 11264, 11520, 11648, 11649, 11632, 0, + 8192, 12288, 11264, 11520, 11648, 11649, 11632, 0, + 8192, 12288, 11264, 11520, 11648, 11649, 11632, 11634, + 0, 8192, 12288, 11264, 11520, 11648, 11649, 11632, + 0, 8192, 12288, 11264, 11520, 11648, 11649, 11632, + 11636, 0, 8192, 12288, 11264, 11520, 11648, 11649, + 11632, 11636, 0, 8192, 12288, 11264, 11520, 11648, + 11649, 11632, 11640, 11638, 0, 8192, 12288, 11264, + 11520, 11648, 11649, 11632, 0, 8192, 12288, 11264, + 11520, 11648, 11649, 11632, 11640, 0, 8192, 12288, + 11264, 11520, 11648, 11649, 11651, 11640, 0, 8192, + 12288, 11264, 11520, 11648, 11649, 11651, 11640, 11642, + 0, 8192, 12288, 11264, 11520, 11648, 11649, 11651, + 11640, 0, 8192, 12288, 11264, 11520, 11648, 11649, + 11651, 11640, 11644, 0, 8192, 12288, 11264, 11520, + 11648, 11649, 11651, 11640, 11644, 0, 8192, 12288, + 11264, 11520, 11648, 11649, 11651, 11640, 11644, 11646, + 0, 8192, 12288, 11264, 11520, 0, 8192, 12288, + 11264, 11776, 11648, 0, 8192, 12288, 11264, 11776, + 11648, 0, 8192, 12288, 11264, 11776, 11648, 11650, + 0, 8192, 12288, 11264, 11776, 11648, 0, 8192, + 12288, 11264, 11776, 11648, 11652, 0, 8192, 12288, + 11264, 11776, 11648, 11652, 0, 8192, 12288, 11264, + 11776, 11648, 11656, 11654, 0, 8192, 12288, 11264, + 11776, 11648, 0, 8192, 12288, 11264, 11776, 11648, + 11656, 0, 8192, 12288, 11264, 11776, 11648, 11656, + 0, 8192, 12288, 11264, 11776, 11648, 11656, 11658, + 0, 8192, 12288, 11264, 11776, 11648, 11656, 0, + 8192, 12288, 11264, 11776, 11648, 11664, 11660, 0, + 8192, 12288, 11264, 11776, 11648, 11664, 11660, 0, + 8192, 12288, 11264, 11776, 11648, 11664, 11665, 11662, + 0, 8192, 12288, 11264, 11776, 11648, 0, 8192, + 12288, 11264, 11776, 11648, 11664, 0, 8192, 12288, + 11264, 11776, 11648, 11664, 0, 8192, 12288, 11264, + 11776, 11648, 11664, 11666, 0, 8192, 12288, 11264, + 11776, 11648, 11664, 0, 8192, 12288, 11264, 11776, + 11648, 11664, 11668, 0, 8192, 12288, 11264, 11776, + 11648, 11664, 11668, 0, 8192, 12288, 11264, 11776, + 11648, 11664, 11672, 11670, 0, 8192, 12288, 11264, + 11776, 11648, 11664, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11672, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11672, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11672, 11674, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 11672, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 11681, 11676, 0, 8192, 12288, + 11264, 11776, 11648, 11680, 11681, 11676, 0, 8192, + 12288, 11264, 11776, 11648, 11680, 11681, 11676, 11678, + 0, 8192, 12288, 11264, 11776, 11648, 0, 8192, + 12288, 11264, 11776, 11648, 11680, 0, 8192, 12288, + 11264, 11776, 11648, 11680, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 11682, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11684, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11684, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11688, 11686, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11688, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11688, 0, 8192, 12288, 11264, 11776, + 11648, 11680, 11688, 11690, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 11688, 0, 8192, 12288, 11264, + 11776, 11648, 11680, 11696, 11692, 0, 8192, 12288, + 11264, 11776, 11648, 11680, 11696, 11692, 0, 8192, + 12288, 11264, 11776, 11648, 11680, 11696, 11697, 11694, + 0, 8192, 12288, 11264, 11776, 11648, 11680, 0, + 8192, 12288, 11264, 11776, 11648, 11712, 11696, 0, + 8192, 12288, 11264, 11776, 11648, 11712, 11696, 0, + 8192, 12288, 11264, 11776, 11648, 11712, 11696, 11698, + 0, 8192, 12288, 11264, 11776, 11648, 11712, 11696, + 0, 8192, 12288, 11264, 11776, 11648, 11712, 11696, + 11700, 0, 8192, 12288, 11264, 11776, 11648, 11712, + 11696, 11700, 0, 8192, 12288, 11264, 11776, 11648, + 11712, 11696, 11704, 11702, 0, 8192, 12288, 11264, + 11776, 11648, 11712, 11696, 0, 8192, 12288, 11264, + 11776, 11648, 11712, 11713, 11704, 0, 8192, 12288, + 11264, 11776, 11648, 11712, 11713, 11704, 0, 8192, + 12288, 11264, 11776, 11648, 11712, 11713, 11704, 11706, + 0, 8192, 12288, 11264, 11776, 11648, 11712, 11713, + 11704, 0, 8192, 12288, 11264, 11776, 11648, 11712, + 11713, 11704, 11708, 0, 8192, 12288, 11264, 11776, + 11648, 11712, 11713, 11715, 11708, 0, 8192, 12288, + 11264, 11776, 11648, 11712, 11713, 11715, 11708, 11710, + 0, 8192, 12288, 11264, 11776, 11648, 0, 8192, + 12288, 11264, 11776, 11777, 11712, 0, 8192, 12288, + 11264, 11776, 11777, 11712, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 11714, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11716, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11716, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11720, 11718, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11720, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11720, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11720, 11722, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 11720, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 11728, 11724, 0, 8192, 12288, + 11264, 11776, 11777, 11712, 11728, 11724, 0, 8192, + 12288, 11264, 11776, 11777, 11712, 11728, 11729, 11726, + 0, 8192, 12288, 11264, 11776, 11777, 11712, 0, + 8192, 12288, 11264, 11776, 11777, 11712, 11728, 0, + 8192, 12288, 11264, 11776, 11777, 11712, 11728, 0, + 8192, 12288, 11264, 11776, 11777, 11712, 11728, 11730, + 0, 8192, 12288, 11264, 11776, 11777, 11712, 11728, + 0, 8192, 12288, 11264, 11776, 11777, 11712, 11728, + 11732, 0, 8192, 12288, 11264, 11776, 11777, 11712, + 11728, 11732, 0, 8192, 12288, 11264, 11776, 11777, + 11712, 11728, 11736, 11734, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 11728, 0, 8192, 12288, 11264, + 11776, 11777, 11712, 11744, 11736, 0, 8192, 12288, + 11264, 11776, 11777, 11712, 11744, 11736, 0, 8192, + 12288, 11264, 11776, 11777, 11712, 11744, 11736, 11738, + 0, 8192, 12288, 11264, 11776, 11777, 11712, 11744, + 11736, 0, 8192, 12288, 11264, 11776, 11777, 11712, + 11744, 11745, 11740, 0, 8192, 12288, 11264, 11776, + 11777, 11712, 11744, 11745, 11740, 0, 8192, 12288, + 11264, 11776, 11777, 11712, 11744, 11745, 11740, 11742, + 0, 8192, 12288, 11264, 11776, 11777, 11712, 0, + 8192, 12288, 11264, 11776, 11777, 11712, 11744, 0, + 8192, 12288, 11264, 11776, 11777, 11779, 11744, 0, + 8192, 12288, 11264, 11776, 11777, 11779, 11744, 11746, + 0, 8192, 12288, 11264, 11776, 11777, 11779, 11744, + 0, 8192, 12288, 11264, 11776, 11777, 11779, 11744, + 11748, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11744, 11748, 0, 8192, 12288, 11264, 11776, 11777, + 11779, 11744, 11752, 11750, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11744, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11744, 11752, 0, 8192, 12288, + 11264, 11776, 11777, 11779, 11744, 11752, 0, 8192, + 12288, 11264, 11776, 11777, 11779, 11744, 11752, 11754, + 0, 8192, 12288, 11264, 11776, 11777, 11779, 11744, + 11752, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11744, 11760, 11756, 0, 8192, 12288, 11264, 11776, + 11777, 11779, 11744, 11760, 11756, 0, 8192, 12288, + 11264, 11776, 11777, 11779, 11744, 11760, 11761, 11758, + 0, 8192, 12288, 11264, 11776, 11777, 11779, 11744, + 0, 8192, 12288, 11264, 11776, 11777, 11779, 11744, + 11760, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11744, 11760, 0, 8192, 12288, 11264, 11776, 11777, + 11779, 11744, 11760, 11762, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11783, 11760, 0, 8192, 12288, + 11264, 11776, 11777, 11779, 11783, 11760, 11764, 0, + 8192, 12288, 11264, 11776, 11777, 11779, 11783, 11760, + 11764, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11783, 11760, 11768, 11766, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11783, 11760, 0, 8192, 12288, + 11264, 11776, 11777, 11779, 11783, 11760, 11768, 0, + 8192, 12288, 11264, 11776, 11777, 11779, 11783, 11760, + 11768, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11783, 11760, 11768, 11770, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11783, 11760, 11768, 0, 8192, + 12288, 11264, 11776, 11777, 11779, 11783, 11760, 11768, + 11772, 0, 8192, 12288, 11264, 11776, 11777, 11779, + 11783, 11760, 11768, 11772, 0, 8192, 12288, 11264, + 11776, 11777, 11779, 11783, 11760, 11768, 11772, 11774, + 0, 8192, 12288, 11264, 0, 8192, 12288, 11264, + 11776, 0, 8192, 12288, 12289, 11776, 0, 8192, + 12288, 12289, 11776, 11778, 0, 8192, 12288, 12289, + 11776, 0, 8192, 12288, 12289, 11776, 11780, 0, + 8192, 12288, 12289, 11776, 11780, 0, 8192, 12288, + 12289, 11776, 11784, 11782, 0, 8192, 12288, 12289, + 11776, 0, 8192, 12288, 12289, 11776, 11784, 0, + 8192, 12288, 12289, 11776, 11784, 0, 8192, 12288, + 12289, 11776, 11784, 11786, 0, 8192, 12288, 12289, + 11776, 11784, 0, 8192, 12288, 12289, 11776, 11792, + 11788, 0, 8192, 12288, 12289, 11776, 11792, 11788, + 0, 8192, 12288, 12289, 11776, 11792, 11793, 11790, + 0, 8192, 12288, 12289, 11776, 0, 8192, 12288, + 12289, 11776, 11792, 0, 8192, 12288, 12289, 11776, + 11792, 0, 8192, 12288, 12289, 11776, 11792, 11794, + 0, 8192, 12288, 12289, 11776, 11792, 0, 8192, + 12288, 12289, 11776, 11792, 11796, 0, 8192, 12288, + 12289, 11776, 11792, 11796, 0, 8192, 12288, 12289, + 11776, 11792, 11800, 11798, 0, 8192, 12288, 12289, + 11776, 11792, 0, 8192, 12288, 12289, 11776, 11808, + 11800, 0, 8192, 12288, 12289, 11776, 11808, 11800, + 0, 8192, 12288, 12289, 11776, 11808, 11800, 11802, + 0, 8192, 12288, 12289, 11776, 11808, 11800, 0, + 8192, 12288, 12289, 11776, 11808, 11809, 11804, 0, + 8192, 12288, 12289, 11776, 11808, 11809, 11804, 0, + 8192, 12288, 12289, 11776, 11808, 11809, 11804, 11806, + 0, 8192, 12288, 12289, 11776, 0, 8192, 12288, + 12289, 11776, 11808, 0, 8192, 12288, 12289, 11776, + 11808, 0, 8192, 12288, 12289, 11776, 11808, 11810, + 0, 8192, 12288, 12289, 11776, 11808, 0, 8192, + 12288, 12289, 11776, 11808, 11812, 0, 8192, 12288, + 12289, 11776, 11808, 11812, 0, 8192, 12288, 12289, + 11776, 11808, 11816, 11814, 0, 8192, 12288, 12289, + 11776, 11808, 0, 8192, 12288, 12289, 11776, 11808, + 11816, 0, 8192, 12288, 12289, 11776, 11808, 11816, + 0, 8192, 12288, 12289, 11776, 11808, 11816, 11818, + 0, 8192, 12288, 12289, 11776, 11808, 11816, 0, + 8192, 12288, 12289, 11776, 11808, 11824, 11820, 0, + 8192, 12288, 12289, 11776, 11808, 11824, 11820, 0, + 8192, 12288, 12289, 11776, 11808, 11824, 11825, 11822, + 0, 8192, 12288, 12289, 11776, 11808, 0, 8192, + 12288, 12289, 11776, 11840, 11824, 0, 8192, 12288, + 12289, 11776, 11840, 11824, 0, 8192, 12288, 12289, + 11776, 11840, 11824, 11826, 0, 8192, 12288, 12289, + 11776, 11840, 11824, 0, 8192, 12288, 12289, 11776, + 11840, 11824, 11828, 0, 8192, 12288, 12289, 11776, + 11840, 11824, 11828, 0, 8192, 12288, 12289, 11776, + 11840, 11824, 11832, 11830, 0, 8192, 12288, 12289, + 11776, 11840, 11824, 0, 8192, 12288, 12289, 11776, + 11840, 11841, 11832, 0, 8192, 12288, 12289, 11776, + 11840, 11841, 11832, 0, 8192, 12288, 12289, 11776, + 11840, 11841, 11832, 11834, 0, 8192, 12288, 12289, + 11776, 11840, 11841, 11832, 0, 8192, 12288, 12289, + 11776, 11840, 11841, 11832, 11836, 0, 8192, 12288, + 12289, 11776, 11840, 11841, 11843, 11836, 0, 8192, + 12288, 12289, 11776, 11840, 11841, 11843, 11836, 11838, + 0, 8192, 12288, 12289, 11776, 0, 8192, 12288, + 12289, 11776, 11840, 0, 8192, 12288, 12289, 11776, + 11840, 0, 8192, 12288, 12289, 11776, 11840, 11842, + 0, 8192, 12288, 12289, 11776, 11840, 0, 8192, + 12288, 12289, 11776, 11840, 11844, 0, 8192, 12288, + 12289, 11776, 11840, 11844, 0, 8192, 12288, 12289, + 11776, 11840, 11848, 11846, 0, 8192, 12288, 12289, + 11776, 11840, 0, 8192, 12288, 12289, 11776, 11840, + 11848, 0, 8192, 12288, 12289, 11776, 11840, 11848, + 0, 8192, 12288, 12289, 11776, 11840, 11848, 11850, + 0, 8192, 12288, 12289, 11776, 11840, 11848, 0, + 8192, 12288, 12289, 11776, 11840, 11856, 11852, 0, + 8192, 12288, 12289, 11776, 11840, 11856, 11852, 0, + 8192, 12288, 12289, 11776, 11840, 11856, 11857, 11854, + 0, 8192, 12288, 12289, 11776, 11840, 0, 8192, + 12288, 12289, 11776, 11840, 11856, 0, 8192, 12288, + 12289, 11776, 11840, 11856, 0, 8192, 12288, 12289, + 11776, 11840, 11856, 11858, 0, 8192, 12288, 12289, + 11776, 11840, 11856, 0, 8192, 12288, 12289, 11776, + 11840, 11856, 11860, 0, 8192, 12288, 12289, 11776, + 11840, 11856, 11860, 0, 8192, 12288, 12289, 11776, + 11840, 11856, 11864, 11862, 0, 8192, 12288, 12289, + 11776, 11840, 11856, 0, 8192, 12288, 12289, 11776, + 11840, 11872, 11864, 0, 8192, 12288, 12289, 11776, + 11840, 11872, 11864, 0, 8192, 12288, 12289, 11776, + 11840, 11872, 11864, 11866, 0, 8192, 12288, 12289, + 11776, 11840, 11872, 11864, 0, 8192, 12288, 12289, + 11776, 11840, 11872, 11873, 11868, 0, 8192, 12288, + 12289, 11776, 11840, 11872, 11873, 11868, 0, 8192, + 12288, 12289, 11776, 11840, 11872, 11873, 11868, 11870, + 0, 8192, 12288, 12289, 11776, 11840, 0, 8192, + 12288, 12289, 11776, 11904, 11872, 0, 8192, 12288, + 12289, 11776, 11904, 11872, 0, 8192, 12288, 12289, + 11776, 11904, 11872, 11874, 0, 8192, 12288, 12289, + 11776, 11904, 11872, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11876, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11876, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11880, 11878, 0, 8192, 12288, 12289, + 11776, 11904, 11872, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11880, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11880, 0, 8192, 12288, 12289, 11776, + 11904, 11872, 11880, 11882, 0, 8192, 12288, 12289, + 11776, 11904, 11872, 11880, 0, 8192, 12288, 12289, + 11776, 11904, 11872, 11888, 11884, 0, 8192, 12288, + 12289, 11776, 11904, 11872, 11888, 11884, 0, 8192, + 12288, 12289, 11776, 11904, 11872, 11888, 11889, 11886, + 0, 8192, 12288, 12289, 11776, 11904, 11872, 0, + 8192, 12288, 12289, 11776, 11904, 11905, 11888, 0, + 8192, 12288, 12289, 11776, 11904, 11905, 11888, 0, + 8192, 12288, 12289, 11776, 11904, 11905, 11888, 11890, + 0, 8192, 12288, 12289, 11776, 11904, 11905, 11888, + 0, 8192, 12288, 12289, 11776, 11904, 11905, 11888, + 11892, 0, 8192, 12288, 12289, 11776, 11904, 11905, + 11888, 11892, 0, 8192, 12288, 12289, 11776, 11904, + 11905, 11888, 11896, 11894, 0, 8192, 12288, 12289, + 11776, 11904, 11905, 11888, 0, 8192, 12288, 12289, + 11776, 11904, 11905, 11888, 11896, 0, 8192, 12288, + 12289, 11776, 11904, 11905, 11907, 11896, 0, 8192, + 12288, 12289, 11776, 11904, 11905, 11907, 11896, 11898, + 0, 8192, 12288, 12289, 11776, 11904, 11905, 11907, + 11896, 0, 8192, 12288, 12289, 11776, 11904, 11905, + 11907, 11896, 11900, 0, 8192, 12288, 12289, 11776, + 11904, 11905, 11907, 11896, 11900, 0, 8192, 12288, + 12289, 11776, 11904, 11905, 11907, 11896, 11900, 11902, + 0, 8192, 12288, 12289, 11776, 0, 8192, 12288, + 12289, 11776, 11904, 0, 8192, 12288, 12289, 11776, + 11904, 0, 8192, 12288, 12289, 11776, 11904, 11906, + 0, 8192, 12288, 12289, 11776, 11904, 0, 8192, + 12288, 12289, 11776, 11904, 11908, 0, 8192, 12288, + 12289, 11776, 11904, 11908, 0, 8192, 12288, 12289, + 11776, 11904, 11912, 11910, 0, 8192, 12288, 12289, + 11776, 11904, 0, 8192, 12288, 12289, 11776, 11904, + 11912, 0, 8192, 12288, 12289, 11776, 11904, 11912, + 0, 8192, 12288, 12289, 11776, 11904, 11912, 11914, + 0, 8192, 12288, 12289, 11776, 11904, 11912, 0, + 8192, 12288, 12289, 11776, 11904, 11920, 11916, 0, + 8192, 12288, 12289, 11776, 11904, 11920, 11916, 0, + 8192, 12288, 12289, 11776, 11904, 11920, 11921, 11918, + 0, 8192, 12288, 12289, 11776, 11904, 0, 8192, + 12288, 12289, 11776, 11904, 11920, 0, 8192, 12288, + 12289, 11776, 11904, 11920, 0, 8192, 12288, 12289, + 11776, 11904, 11920, 11922, 0, 8192, 12288, 12289, + 11776, 11904, 11920, 0, 8192, 12288, 12289, 11776, + 11904, 11920, 11924, 0, 8192, 12288, 12289, 11776, + 11904, 11920, 11924, 0, 8192, 12288, 12289, 11776, + 11904, 11920, 11928, 11926, 0, 8192, 12288, 12289, + 11776, 11904, 11920, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11928, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11928, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11928, 11930, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 11928, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 11937, 11932, 0, 8192, 12288, + 12289, 11776, 11904, 11936, 11937, 11932, 0, 8192, + 12288, 12289, 11776, 11904, 11936, 11937, 11932, 11934, + 0, 8192, 12288, 12289, 11776, 11904, 0, 8192, + 12288, 12289, 11776, 11904, 11936, 0, 8192, 12288, + 12289, 11776, 11904, 11936, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 11938, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11940, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11940, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11944, 11942, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11944, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11944, 0, 8192, 12288, 12289, 11776, + 11904, 11936, 11944, 11946, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 11944, 0, 8192, 12288, 12289, + 11776, 11904, 11936, 11952, 11948, 0, 8192, 12288, + 12289, 11776, 11904, 11936, 11952, 11948, 0, 8192, + 12288, 12289, 11776, 11904, 11936, 11952, 11953, 11950, + 0, 8192, 12288, 12289, 11776, 11904, 11936, 0, + 8192, 12288, 12289, 11776, 11904, 11968, 11952, 0, + 8192, 12288, 12289, 11776, 11904, 11968, 11952, 0, + 8192, 12288, 12289, 11776, 11904, 11968, 11952, 11954, + 0, 8192, 12288, 12289, 11776, 11904, 11968, 11952, + 0, 8192, 12288, 12289, 11776, 11904, 11968, 11952, + 11956, 0, 8192, 12288, 12289, 11776, 11904, 11968, + 11952, 11956, 0, 8192, 12288, 12289, 11776, 11904, + 11968, 11952, 11960, 11958, 0, 8192, 12288, 12289, + 11776, 11904, 11968, 11952, 0, 8192, 12288, 12289, + 11776, 11904, 11968, 11969, 11960, 0, 8192, 12288, + 12289, 11776, 11904, 11968, 11969, 11960, 0, 8192, + 12288, 12289, 11776, 11904, 11968, 11969, 11960, 11962, + 0, 8192, 12288, 12289, 11776, 11904, 11968, 11969, + 11960, 0, 8192, 12288, 12289, 11776, 11904, 11968, + 11969, 11960, 11964, 0, 8192, 12288, 12289, 11776, + 11904, 11968, 11969, 11971, 11964, 0, 8192, 12288, + 12289, 11776, 11904, 11968, 11969, 11971, 11964, 11966, + 0, 8192, 12288, 12289, 11776, 11904, 0, 8192, + 12288, 12289, 11776, 12032, 11968, 0, 8192, 12288, + 12289, 11776, 12032, 11968, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 11970, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11972, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11972, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11976, 11974, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11976, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11976, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 11976, 11978, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 11976, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 11984, 11980, 0, 8192, 12288, + 12289, 11776, 12032, 11968, 11984, 11980, 0, 8192, + 12288, 12289, 11776, 12032, 11968, 11984, 11985, 11982, + 0, 8192, 12288, 12289, 11776, 12032, 11968, 0, + 8192, 12288, 12289, 11776, 12032, 11968, 11984, 0, + 8192, 12288, 12289, 11776, 12032, 11968, 11984, 0, + 8192, 12288, 12289, 11776, 12032, 11968, 11984, 11986, + 0, 8192, 12288, 12289, 11776, 12032, 11968, 11984, + 0, 8192, 12288, 12289, 11776, 12032, 11968, 11984, + 11988, 0, 8192, 12288, 12289, 11776, 12032, 11968, + 11984, 11988, 0, 8192, 12288, 12289, 11776, 12032, + 11968, 11984, 11992, 11990, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 11984, 0, 8192, 12288, 12289, + 11776, 12032, 11968, 12000, 11992, 0, 8192, 12288, + 12289, 11776, 12032, 11968, 12000, 11992, 0, 8192, + 12288, 12289, 11776, 12032, 11968, 12000, 11992, 11994, + 0, 8192, 12288, 12289, 11776, 12032, 11968, 12000, + 11992, 0, 8192, 12288, 12289, 11776, 12032, 11968, + 12000, 12001, 11996, 0, 8192, 12288, 12289, 11776, + 12032, 11968, 12000, 12001, 11996, 0, 8192, 12288, + 12289, 11776, 12032, 11968, 12000, 12001, 11996, 11998, + 0, 8192, 12288, 12289, 11776, 12032, 11968, 0, + 8192, 12288, 12289, 11776, 12032, 12033, 12000, 0, + 8192, 12288, 12289, 11776, 12032, 12033, 12000, 0, + 8192, 12288, 12289, 11776, 12032, 12033, 12000, 12002, + 0, 8192, 12288, 12289, 11776, 12032, 12033, 12000, + 0, 8192, 12288, 12289, 11776, 12032, 12033, 12000, + 12004, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12000, 12004, 0, 8192, 12288, 12289, 11776, 12032, + 12033, 12000, 12008, 12006, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12000, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12000, 12008, 0, 8192, 12288, + 12289, 11776, 12032, 12033, 12000, 12008, 0, 8192, + 12288, 12289, 11776, 12032, 12033, 12000, 12008, 12010, + 0, 8192, 12288, 12289, 11776, 12032, 12033, 12000, + 12008, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12000, 12016, 12012, 0, 8192, 12288, 12289, 11776, + 12032, 12033, 12000, 12016, 12012, 0, 8192, 12288, + 12289, 11776, 12032, 12033, 12000, 12016, 12017, 12014, + 0, 8192, 12288, 12289, 11776, 12032, 12033, 12000, + 0, 8192, 12288, 12289, 11776, 12032, 12033, 12000, + 12016, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12035, 12016, 0, 8192, 12288, 12289, 11776, 12032, + 12033, 12035, 12016, 12018, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12035, 12016, 0, 8192, 12288, + 12289, 11776, 12032, 12033, 12035, 12016, 12020, 0, + 8192, 12288, 12289, 11776, 12032, 12033, 12035, 12016, + 12020, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12035, 12016, 12024, 12022, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12035, 12016, 0, 8192, 12288, + 12289, 11776, 12032, 12033, 12035, 12016, 12024, 0, + 8192, 12288, 12289, 11776, 12032, 12033, 12035, 12016, + 12024, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12035, 12016, 12024, 12026, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12035, 12039, 12024, 0, 8192, + 12288, 12289, 11776, 12032, 12033, 12035, 12039, 12024, + 12028, 0, 8192, 12288, 12289, 11776, 12032, 12033, + 12035, 12039, 12024, 12028, 0, 8192, 12288, 12289, + 11776, 12032, 12033, 12035, 12039, 12024, 12028, 12030, + 0, 8192, 12288, 12289, 11776, 0, 8192, 12288, + 12289, 11776, 12032, 0, 8192, 12288, 12289, 11776, + 12032, 0, 8192, 12288, 12289, 11776, 12032, 12034, + 0, 8192, 12288, 12289, 12291, 12032, 0, 8192, + 12288, 12289, 12291, 12032, 12036, 0, 8192, 12288, + 12289, 12291, 12032, 12036, 0, 8192, 12288, 12289, + 12291, 12032, 12040, 12038, 0, 8192, 12288, 12289, + 12291, 12032, 0, 8192, 12288, 12289, 12291, 12032, + 12040, 0, 8192, 12288, 12289, 12291, 12032, 12040, + 0, 8192, 12288, 12289, 12291, 12032, 12040, 12042, + 0, 8192, 12288, 12289, 12291, 12032, 12040, 0, + 8192, 12288, 12289, 12291, 12032, 12048, 12044, 0, + 8192, 12288, 12289, 12291, 12032, 12048, 12044, 0, + 8192, 12288, 12289, 12291, 12032, 12048, 12049, 12046, + 0, 8192, 12288, 12289, 12291, 12032, 0, 8192, + 12288, 12289, 12291, 12032, 12048, 0, 8192, 12288, + 12289, 12291, 12032, 12048, 0, 8192, 12288, 12289, + 12291, 12032, 12048, 12050, 0, 8192, 12288, 12289, + 12291, 12032, 12048, 0, 8192, 12288, 12289, 12291, + 12032, 12048, 12052, 0, 8192, 12288, 12289, 12291, + 12032, 12048, 12052, 0, 8192, 12288, 12289, 12291, + 12032, 12048, 12056, 12054, 0, 8192, 12288, 12289, + 12291, 12032, 12048, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12056, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12056, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12056, 12058, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 12056, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 12065, 12060, 0, 8192, 12288, + 12289, 12291, 12032, 12064, 12065, 12060, 0, 8192, + 12288, 12289, 12291, 12032, 12064, 12065, 12060, 12062, + 0, 8192, 12288, 12289, 12291, 12032, 0, 8192, + 12288, 12289, 12291, 12032, 12064, 0, 8192, 12288, + 12289, 12291, 12032, 12064, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 12066, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12068, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12068, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12072, 12070, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12072, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12072, 0, 8192, 12288, 12289, 12291, + 12032, 12064, 12072, 12074, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 12072, 0, 8192, 12288, 12289, + 12291, 12032, 12064, 12080, 12076, 0, 8192, 12288, + 12289, 12291, 12032, 12064, 12080, 12076, 0, 8192, + 12288, 12289, 12291, 12032, 12064, 12080, 12081, 12078, + 0, 8192, 12288, 12289, 12291, 12032, 12064, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12080, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12080, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12080, 12082, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12080, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12080, + 12084, 0, 8192, 12288, 12289, 12291, 12032, 12096, + 12080, 12084, 0, 8192, 12288, 12289, 12291, 12032, + 12096, 12080, 12088, 12086, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12080, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12097, 12088, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 12097, 12088, 0, 8192, + 12288, 12289, 12291, 12032, 12096, 12097, 12088, 12090, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12097, + 12088, 0, 8192, 12288, 12289, 12291, 12032, 12096, + 12097, 12088, 12092, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12097, 12099, 12092, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 12097, 12099, 12092, 12094, + 0, 8192, 12288, 12289, 12291, 12032, 0, 8192, + 12288, 12289, 12291, 12032, 12096, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12098, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12100, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12100, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12104, 12102, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12104, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12104, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12104, 12106, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12104, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12112, 12108, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 12112, 12108, 0, 8192, + 12288, 12289, 12291, 12032, 12096, 12112, 12113, 12110, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12112, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12112, 0, + 8192, 12288, 12289, 12291, 12032, 12096, 12112, 12114, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12112, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12112, + 12116, 0, 8192, 12288, 12289, 12291, 12032, 12096, + 12112, 12116, 0, 8192, 12288, 12289, 12291, 12032, + 12096, 12112, 12120, 12118, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12112, 0, 8192, 12288, 12289, + 12291, 12032, 12096, 12128, 12120, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 12128, 12120, 0, 8192, + 12288, 12289, 12291, 12032, 12096, 12128, 12120, 12122, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 12128, + 12120, 0, 8192, 12288, 12289, 12291, 12032, 12096, + 12128, 12129, 12124, 0, 8192, 12288, 12289, 12291, + 12032, 12096, 12128, 12129, 12124, 0, 8192, 12288, + 12289, 12291, 12032, 12096, 12128, 12129, 12124, 12126, + 0, 8192, 12288, 12289, 12291, 12032, 12096, 0, + 8192, 12288, 12289, 12291, 12032, 12160, 12128, 0, + 8192, 12288, 12289, 12291, 12032, 12160, 12128, 0, + 8192, 12288, 12289, 12291, 12032, 12160, 12128, 12130, + 0, 8192, 12288, 12289, 12291, 12032, 12160, 12128, + 0, 8192, 12288, 12289, 12291, 12032, 12160, 12128, + 12132, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12128, 12132, 0, 8192, 12288, 12289, 12291, 12032, + 12160, 12128, 12136, 12134, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12128, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12128, 12136, 0, 8192, 12288, + 12289, 12291, 12032, 12160, 12128, 12136, 0, 8192, + 12288, 12289, 12291, 12032, 12160, 12128, 12136, 12138, + 0, 8192, 12288, 12289, 12291, 12032, 12160, 12128, + 12136, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12128, 12144, 12140, 0, 8192, 12288, 12289, 12291, + 12032, 12160, 12128, 12144, 12140, 0, 8192, 12288, + 12289, 12291, 12032, 12160, 12128, 12144, 12145, 12142, + 0, 8192, 12288, 12289, 12291, 12032, 12160, 12128, + 0, 8192, 12288, 12289, 12291, 12032, 12160, 12161, + 12144, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12161, 12144, 0, 8192, 12288, 12289, 12291, 12032, + 12160, 12161, 12144, 12146, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12161, 12144, 0, 8192, 12288, + 12289, 12291, 12032, 12160, 12161, 12144, 12148, 0, + 8192, 12288, 12289, 12291, 12032, 12160, 12161, 12144, + 12148, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12161, 12144, 12152, 12150, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12161, 12144, 0, 8192, 12288, + 12289, 12291, 12032, 12160, 12161, 12144, 12152, 0, + 8192, 12288, 12289, 12291, 12032, 12160, 12161, 12163, + 12152, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12161, 12163, 12152, 12154, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12161, 12163, 12152, 0, 8192, + 12288, 12289, 12291, 12032, 12160, 12161, 12163, 12152, + 12156, 0, 8192, 12288, 12289, 12291, 12032, 12160, + 12161, 12163, 12152, 12156, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12161, 12163, 12152, 12156, 12158, + 0, 8192, 12288, 12289, 12291, 12032, 0, 8192, + 12288, 12289, 12291, 12032, 12160, 0, 8192, 12288, + 12289, 12291, 12032, 12160, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 12162, 0, 8192, 12288, 12289, + 12291, 12032, 12160, 0, 8192, 12288, 12289, 12291, + 12032, 12160, 12164, 0, 8192, 12288, 12289, 12291, + 12032, 12160, 12164, 0, 8192, 12288, 12289, 12291, + 12032, 12160, 12168, 12166, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12168, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12168, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12168, 12170, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12168, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12176, 12172, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12176, 12172, 0, 8192, + 12288, 12289, 12291, 12295, 12160, 12176, 12177, 12174, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12176, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12176, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12176, 12178, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12176, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12176, + 12180, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12176, 12180, 0, 8192, 12288, 12289, 12291, 12295, + 12160, 12176, 12184, 12182, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12176, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12192, 12184, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12192, 12184, 0, 8192, + 12288, 12289, 12291, 12295, 12160, 12192, 12184, 12186, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12192, + 12184, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12192, 12193, 12188, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12192, 12193, 12188, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12192, 12193, 12188, 12190, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12192, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12192, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12192, 12194, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12192, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12192, + 12196, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12192, 12196, 0, 8192, 12288, 12289, 12291, 12295, + 12160, 12192, 12200, 12198, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12192, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12192, 12200, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12192, 12200, 0, 8192, + 12288, 12289, 12291, 12295, 12160, 12192, 12200, 12202, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12192, + 12200, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12192, 12208, 12204, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12192, 12208, 12204, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12192, 12208, 12209, 12206, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12192, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12224, + 12208, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12208, 0, 8192, 12288, 12289, 12291, 12295, + 12160, 12224, 12208, 12210, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 12208, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12224, 12208, 12212, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12224, 12208, + 12212, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12208, 12216, 12214, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 12208, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12224, 12225, 12216, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12224, 12225, + 12216, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12225, 12216, 12218, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 12225, 12216, 0, 8192, + 12288, 12289, 12291, 12295, 12160, 12224, 12225, 12216, + 12220, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12225, 12227, 12220, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 12225, 12227, 12220, 12222, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12224, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12224, 0, + 8192, 12288, 12289, 12291, 12295, 12160, 12224, 12226, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12224, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12224, + 12228, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12228, 0, 8192, 12288, 12289, 12291, 12295, + 12160, 12224, 12232, 12230, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 0, 8192, 12288, 12289, + 12291, 12295, 12160, 12224, 12232, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12224, 12232, 0, 8192, + 12288, 12289, 12291, 12295, 12160, 12224, 12232, 12234, + 0, 8192, 12288, 12289, 12291, 12295, 12160, 12224, + 12232, 0, 8192, 12288, 12289, 12291, 12295, 12160, + 12224, 12240, 12236, 0, 8192, 12288, 12289, 12291, + 12295, 12160, 12224, 12240, 12236, 0, 8192, 12288, + 12289, 12291, 12295, 12160, 12224, 12240, 12241, 12238, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12240, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12240, 0, 8192, 12288, 12289, 12291, 12295, + 12303, 12224, 12240, 12242, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12240, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12240, 12244, 0, + 8192, 12288, 12289, 12291, 12295, 12303, 12224, 12240, + 12244, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12240, 12248, 12246, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12240, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12256, 12248, 0, + 8192, 12288, 12289, 12291, 12295, 12303, 12224, 12256, + 12248, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12248, 12250, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12248, 0, 8192, + 12288, 12289, 12291, 12295, 12303, 12224, 12256, 12257, + 12252, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12257, 12252, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12257, 12252, 12254, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12256, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 0, 8192, 12288, 12289, 12291, 12295, + 12303, 12224, 12256, 12258, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12256, 12260, 0, + 8192, 12288, 12289, 12291, 12295, 12303, 12224, 12256, + 12260, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12264, 12262, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12256, 12264, 0, + 8192, 12288, 12289, 12291, 12295, 12303, 12224, 12256, + 12264, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12264, 12266, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12264, 0, 8192, + 12288, 12289, 12291, 12295, 12303, 12224, 12256, 12272, + 12268, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12272, 12268, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12272, 12273, 12270, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12256, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12272, 0, 8192, 12288, 12289, 12291, + 12295, 12303, 12224, 12256, 12272, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12256, 12272, 12274, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12256, 12272, 0, 8192, 12288, 12289, 12291, 12295, + 12303, 12224, 12256, 12272, 12276, 0, 8192, 12288, + 12289, 12291, 12295, 12303, 12224, 12256, 12272, 12276, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12256, 12272, 12280, 12278, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12272, 0, 8192, + 12288, 12289, 12291, 12295, 12303, 12224, 12256, 12272, + 12280, 0, 8192, 12288, 12289, 12291, 12295, 12303, + 12224, 12256, 12272, 12280, 0, 8192, 12288, 12289, + 12291, 12295, 12303, 12224, 12256, 12272, 12280, 12282, + 0, 8192, 12288, 12289, 12291, 12295, 12303, 12224, + 12256, 12272, 12280, 0, 8192, 12288, 12289, 12291, + 12295, 12303, 12224, 12256, 12272, 12280, 12284, 0, + 8192, 12288, 12289, 12291, 12295, 12303, 12224, 12256, + 12272, 12280, 12284, 0, 8192, 12288, 12289, 12291, + 12295, 12303, 12224, 12256, 12272, 12280, 12284, 12286, + 0, 8192, 0, 8192, 12288, 0, 8192, 12288, + 0, 8192, 12288, 12290, 0, 8192, 12288, 0, + 8192, 12288, 12292, 0, 8192, 12288, 12292, 0, + 8192, 12288, 12296, 12294, 0, 8192, 12288, 0, + 8192, 12288, 12296, 0, 8192, 12288, 12296, 0, + 8192, 12288, 12296, 12298, 0, 8192, 12288, 12296, + 0, 8192, 12288, 12304, 12300, 0, 8192, 12288, + 12304, 12300, 0, 8192, 12288, 12304, 12305, 12302, + 0, 8192, 12288, 0, 8192, 12288, 12304, 0, + 8192, 12288, 12304, 0, 8192, 12288, 12304, 12306, + 0, 8192, 12288, 12304, 0, 8192, 12288, 12304, + 12308, 0, 8192, 12288, 12304, 12308, 0, 8192, + 12288, 12304, 12312, 12310, 0, 8192, 12288, 12304, + 0, 8192, 12288, 12320, 12312, 0, 8192, 12288, + 12320, 12312, 0, 8192, 12288, 12320, 12312, 12314, + 0, 8192, 12288, 12320, 12312, 0, 8192, 12288, + 12320, 12321, 12316, 0, 8192, 12288, 12320, 12321, + 12316, 0, 8192, 12288, 12320, 12321, 12316, 12318, + 0, 8192, 12288, 0, 8192, 12288, 12320, 0, + 8192, 12288, 12320, 0, 8192, 12288, 12320, 12322, + 0, 8192, 12288, 12320, 0, 8192, 12288, 12320, + 12324, 0, 8192, 12288, 12320, 12324, 0, 8192, + 12288, 12320, 12328, 12326, 0, 8192, 12288, 12320, + 0, 8192, 12288, 12320, 12328, 0, 8192, 12288, + 12320, 12328, 0, 8192, 12288, 12320, 12328, 12330, + 0, 8192, 12288, 12320, 12328, 0, 8192, 12288, + 12320, 12336, 12332, 0, 8192, 12288, 12320, 12336, + 12332, 0, 8192, 12288, 12320, 12336, 12337, 12334, + 0, 8192, 12288, 12320, 0, 8192, 12288, 12352, + 12336, 0, 8192, 12288, 12352, 12336, 0, 8192, + 12288, 12352, 12336, 12338, 0, 8192, 12288, 12352, + 12336, 0, 8192, 12288, 12352, 12336, 12340, 0, + 8192, 12288, 12352, 12336, 12340, 0, 8192, 12288, + 12352, 12336, 12344, 12342, 0, 8192, 12288, 12352, + 12336, 0, 8192, 12288, 12352, 12353, 12344, 0, + 8192, 12288, 12352, 12353, 12344, 0, 8192, 12288, + 12352, 12353, 12344, 12346, 0, 8192, 12288, 12352, + 12353, 12344, 0, 8192, 12288, 12352, 12353, 12344, + 12348, 0, 8192, 12288, 12352, 12353, 12355, 12348, + 0, 8192, 12288, 12352, 12353, 12355, 12348, 12350, + 0, 8192, 12288, 0, 8192, 12288, 12352, 0, + 8192, 12288, 12352, 0, 8192, 12288, 12352, 12354, + 0, 8192, 12288, 12352, 0, 8192, 12288, 12352, + 12356, 0, 8192, 12288, 12352, 12356, 0, 8192, + 12288, 12352, 12360, 12358, 0, 8192, 12288, 12352, + 0, 8192, 12288, 12352, 12360, 0, 8192, 12288, + 12352, 12360, 0, 8192, 12288, 12352, 12360, 12362, + 0, 8192, 12288, 12352, 12360, 0, 8192, 12288, + 12352, 12368, 12364, 0, 8192, 12288, 12352, 12368, + 12364, 0, 8192, 12288, 12352, 12368, 12369, 12366, + 0, 8192, 12288, 12352, 0, 8192, 12288, 12352, + 12368, 0, 8192, 12288, 12352, 12368, 0, 8192, + 12288, 12352, 12368, 12370, 0, 8192, 12288, 12352, + 12368, 0, 8192, 12288, 12352, 12368, 12372, 0, + 8192, 12288, 12352, 12368, 12372, 0, 8192, 12288, + 12352, 12368, 12376, 12374, 0, 8192, 12288, 12352, + 12368, 0, 8192, 12288, 12352, 12384, 12376, 0, + 8192, 12288, 12352, 12384, 12376, 0, 8192, 12288, + 12352, 12384, 12376, 12378, 0, 8192, 12288, 12352, + 12384, 12376, 0, 8192, 12288, 12352, 12384, 12385, + 12380, 0, 8192, 12288, 12352, 12384, 12385, 12380, + 0, 8192, 12288, 12352, 12384, 12385, 12380, 12382, + 0, 8192, 12288, 12352, 0, 8192, 12288, 12416, + 12384, 0, 8192, 12288, 12416, 12384, 0, 8192, + 12288, 12416, 12384, 12386, 0, 8192, 12288, 12416, + 12384, 0, 8192, 12288, 12416, 12384, 12388, 0, + 8192, 12288, 12416, 12384, 12388, 0, 8192, 12288, + 12416, 12384, 12392, 12390, 0, 8192, 12288, 12416, + 12384, 0, 8192, 12288, 12416, 12384, 12392, 0, + 8192, 12288, 12416, 12384, 12392, 0, 8192, 12288, + 12416, 12384, 12392, 12394, 0, 8192, 12288, 12416, + 12384, 12392, 0, 8192, 12288, 12416, 12384, 12400, + 12396, 0, 8192, 12288, 12416, 12384, 12400, 12396, + 0, 8192, 12288, 12416, 12384, 12400, 12401, 12398, + 0, 8192, 12288, 12416, 12384, 0, 8192, 12288, + 12416, 12417, 12400, 0, 8192, 12288, 12416, 12417, + 12400, 0, 8192, 12288, 12416, 12417, 12400, 12402, + 0, 8192, 12288, 12416, 12417, 12400, 0, 8192, + 12288, 12416, 12417, 12400, 12404, 0, 8192, 12288, + 12416, 12417, 12400, 12404, 0, 8192, 12288, 12416, + 12417, 12400, 12408, 12406, 0, 8192, 12288, 12416, + 12417, 12400, 0, 8192, 12288, 12416, 12417, 12400, + 12408, 0, 8192, 12288, 12416, 12417, 12419, 12408, + 0, 8192, 12288, 12416, 12417, 12419, 12408, 12410, + 0, 8192, 12288, 12416, 12417, 12419, 12408, 0, + 8192, 12288, 12416, 12417, 12419, 12408, 12412, 0, + 8192, 12288, 12416, 12417, 12419, 12408, 12412, 0, + 8192, 12288, 12416, 12417, 12419, 12408, 12412, 12414, + 0, 8192, 12288, 0, 8192, 12288, 12416, 0, + 8192, 12288, 12416, 0, 8192, 12288, 12416, 12418, + 0, 8192, 12288, 12416, 0, 8192, 12288, 12416, + 12420, 0, 8192, 12288, 12416, 12420, 0, 8192, + 12288, 12416, 12424, 12422, 0, 8192, 12288, 12416, + 0, 8192, 12288, 12416, 12424, 0, 8192, 12288, + 12416, 12424, 0, 8192, 12288, 12416, 12424, 12426, + 0, 8192, 12288, 12416, 12424, 0, 8192, 12288, + 12416, 12432, 12428, 0, 8192, 12288, 12416, 12432, + 12428, 0, 8192, 12288, 12416, 12432, 12433, 12430, + 0, 8192, 12288, 12416, 0, 8192, 12288, 12416, + 12432, 0, 8192, 12288, 12416, 12432, 0, 8192, + 12288, 12416, 12432, 12434, 0, 8192, 12288, 12416, + 12432, 0, 8192, 12288, 12416, 12432, 12436, 0, + 8192, 12288, 12416, 12432, 12436, 0, 8192, 12288, + 12416, 12432, 12440, 12438, 0, 8192, 12288, 12416, + 12432, 0, 8192, 12288, 12416, 12448, 12440, 0, + 8192, 12288, 12416, 12448, 12440, 0, 8192, 12288, + 12416, 12448, 12440, 12442, 0, 8192, 12288, 12416, + 12448, 12440, 0, 8192, 12288, 12416, 12448, 12449, + 12444, 0, 8192, 12288, 12416, 12448, 12449, 12444, + 0, 8192, 12288, 12416, 12448, 12449, 12444, 12446, + 0, 8192, 12288, 12416, 0, 8192, 12288, 12416, + 12448, 0, 8192, 12288, 12416, 12448, 0, 8192, + 12288, 12416, 12448, 12450, 0, 8192, 12288, 12416, + 12448, 0, 8192, 12288, 12416, 12448, 12452, 0, + 8192, 12288, 12416, 12448, 12452, 0, 8192, 12288, + 12416, 12448, 12456, 12454, 0, 8192, 12288, 12416, + 12448, 0, 8192, 12288, 12416, 12448, 12456, 0, + 8192, 12288, 12416, 12448, 12456, 0, 8192, 12288, + 12416, 12448, 12456, 12458, 0, 8192, 12288, 12416, + 12448, 12456, 0, 8192, 12288, 12416, 12448, 12464, + 12460, 0, 8192, 12288, 12416, 12448, 12464, 12460, + 0, 8192, 12288, 12416, 12448, 12464, 12465, 12462, + 0, 8192, 12288, 12416, 12448, 0, 8192, 12288, + 12416, 12480, 12464, 0, 8192, 12288, 12416, 12480, + 12464, 0, 8192, 12288, 12416, 12480, 12464, 12466, + 0, 8192, 12288, 12416, 12480, 12464, 0, 8192, + 12288, 12416, 12480, 12464, 12468, 0, 8192, 12288, + 12416, 12480, 12464, 12468, 0, 8192, 12288, 12416, + 12480, 12464, 12472, 12470, 0, 8192, 12288, 12416, + 12480, 12464, 0, 8192, 12288, 12416, 12480, 12481, + 12472, 0, 8192, 12288, 12416, 12480, 12481, 12472, + 0, 8192, 12288, 12416, 12480, 12481, 12472, 12474, + 0, 8192, 12288, 12416, 12480, 12481, 12472, 0, + 8192, 12288, 12416, 12480, 12481, 12472, 12476, 0, + 8192, 12288, 12416, 12480, 12481, 12483, 12476, 0, + 8192, 12288, 12416, 12480, 12481, 12483, 12476, 12478, + 0, 8192, 12288, 12416, 0, 8192, 12288, 12544, + 12480, 0, 8192, 12288, 12544, 12480, 0, 8192, + 12288, 12544, 12480, 12482, 0, 8192, 12288, 12544, + 12480, 0, 8192, 12288, 12544, 12480, 12484, 0, + 8192, 12288, 12544, 12480, 12484, 0, 8192, 12288, + 12544, 12480, 12488, 12486, 0, 8192, 12288, 12544, + 12480, 0, 8192, 12288, 12544, 12480, 12488, 0, + 8192, 12288, 12544, 12480, 12488, 0, 8192, 12288, + 12544, 12480, 12488, 12490, 0, 8192, 12288, 12544, + 12480, 12488, 0, 8192, 12288, 12544, 12480, 12496, + 12492, 0, 8192, 12288, 12544, 12480, 12496, 12492, + 0, 8192, 12288, 12544, 12480, 12496, 12497, 12494, + 0, 8192, 12288, 12544, 12480, 0, 8192, 12288, + 12544, 12480, 12496, 0, 8192, 12288, 12544, 12480, + 12496, 0, 8192, 12288, 12544, 12480, 12496, 12498, + 0, 8192, 12288, 12544, 12480, 12496, 0, 8192, + 12288, 12544, 12480, 12496, 12500, 0, 8192, 12288, + 12544, 12480, 12496, 12500, 0, 8192, 12288, 12544, + 12480, 12496, 12504, 12502, 0, 8192, 12288, 12544, + 12480, 12496, 0, 8192, 12288, 12544, 12480, 12512, + 12504, 0, 8192, 12288, 12544, 12480, 12512, 12504, + 0, 8192, 12288, 12544, 12480, 12512, 12504, 12506, + 0, 8192, 12288, 12544, 12480, 12512, 12504, 0, + 8192, 12288, 12544, 12480, 12512, 12513, 12508, 0, + 8192, 12288, 12544, 12480, 12512, 12513, 12508, 0, + 8192, 12288, 12544, 12480, 12512, 12513, 12508, 12510, + 0, 8192, 12288, 12544, 12480, 0, 8192, 12288, + 12544, 12545, 12512, 0, 8192, 12288, 12544, 12545, + 12512, 0, 8192, 12288, 12544, 12545, 12512, 12514, + 0, 8192, 12288, 12544, 12545, 12512, 0, 8192, + 12288, 12544, 12545, 12512, 12516, 0, 8192, 12288, + 12544, 12545, 12512, 12516, 0, 8192, 12288, 12544, + 12545, 12512, 12520, 12518, 0, 8192, 12288, 12544, + 12545, 12512, 0, 8192, 12288, 12544, 12545, 12512, + 12520, 0, 8192, 12288, 12544, 12545, 12512, 12520, + 0, 8192, 12288, 12544, 12545, 12512, 12520, 12522, + 0, 8192, 12288, 12544, 12545, 12512, 12520, 0, + 8192, 12288, 12544, 12545, 12512, 12528, 12524, 0, + 8192, 12288, 12544, 12545, 12512, 12528, 12524, 0, + 8192, 12288, 12544, 12545, 12512, 12528, 12529, 12526, + 0, 8192, 12288, 12544, 12545, 12512, 0, 8192, + 12288, 12544, 12545, 12512, 12528, 0, 8192, 12288, + 12544, 12545, 12547, 12528, 0, 8192, 12288, 12544, + 12545, 12547, 12528, 12530, 0, 8192, 12288, 12544, + 12545, 12547, 12528, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12532, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12532, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12536, 12534, 0, 8192, 12288, 12544, + 12545, 12547, 12528, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12536, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12536, 0, 8192, 12288, 12544, 12545, + 12547, 12528, 12536, 12538, 0, 8192, 12288, 12544, + 12545, 12547, 12551, 12536, 0, 8192, 12288, 12544, + 12545, 12547, 12551, 12536, 12540, 0, 8192, 12288, + 12544, 12545, 12547, 12551, 12536, 12540, 0, 8192, + 12288, 12544, 12545, 12547, 12551, 12536, 12540, 12542, + 0, 8192, 12288, 0, 8192, 12288, 12544, 0, + 8192, 12288, 12544, 0, 8192, 12288, 12544, 12546, + 0, 8192, 12288, 12544, 0, 8192, 12288, 12544, + 12548, 0, 8192, 12288, 12544, 12548, 0, 8192, + 12288, 12544, 12552, 12550, 0, 8192, 12288, 12544, + 0, 8192, 12288, 12544, 12552, 0, 8192, 12288, + 12544, 12552, 0, 8192, 12288, 12544, 12552, 12554, + 0, 8192, 12288, 12544, 12552, 0, 8192, 12288, + 12544, 12560, 12556, 0, 8192, 12288, 12544, 12560, + 12556, 0, 8192, 12288, 12544, 12560, 12561, 12558, + 0, 8192, 12288, 12544, 0, 8192, 12288, 12544, + 12560, 0, 8192, 12288, 12544, 12560, 0, 8192, + 12288, 12544, 12560, 12562, 0, 8192, 12288, 12544, + 12560, 0, 8192, 12288, 12544, 12560, 12564, 0, + 8192, 12288, 12544, 12560, 12564, 0, 8192, 12288, + 12544, 12560, 12568, 12566, 0, 8192, 12288, 12544, + 12560, 0, 8192, 12288, 12544, 12576, 12568, 0, + 8192, 12288, 12544, 12576, 12568, 0, 8192, 12288, + 12544, 12576, 12568, 12570, 0, 8192, 12288, 12544, + 12576, 12568, 0, 8192, 12288, 12544, 12576, 12577, + 12572, 0, 8192, 12288, 12544, 12576, 12577, 12572, + 0, 8192, 12288, 12544, 12576, 12577, 12572, 12574, + 0, 8192, 12288, 12544, 0, 8192, 12288, 12544, + 12576, 0, 8192, 12288, 12544, 12576, 0, 8192, + 12288, 12544, 12576, 12578, 0, 8192, 12288, 12544, + 12576, 0, 8192, 12288, 12544, 12576, 12580, 0, + 8192, 12288, 12544, 12576, 12580, 0, 8192, 12288, + 12544, 12576, 12584, 12582, 0, 8192, 12288, 12544, + 12576, 0, 8192, 12288, 12544, 12576, 12584, 0, + 8192, 12288, 12544, 12576, 12584, 0, 8192, 12288, + 12544, 12576, 12584, 12586, 0, 8192, 12288, 12544, + 12576, 12584, 0, 8192, 12288, 12544, 12576, 12592, + 12588, 0, 8192, 12288, 12544, 12576, 12592, 12588, + 0, 8192, 12288, 12544, 12576, 12592, 12593, 12590, + 0, 8192, 12288, 12544, 12576, 0, 8192, 12288, + 12544, 12608, 12592, 0, 8192, 12288, 12544, 12608, + 12592, 0, 8192, 12288, 12544, 12608, 12592, 12594, + 0, 8192, 12288, 12544, 12608, 12592, 0, 8192, + 12288, 12544, 12608, 12592, 12596, 0, 8192, 12288, + 12544, 12608, 12592, 12596, 0, 8192, 12288, 12544, + 12608, 12592, 12600, 12598, 0, 8192, 12288, 12544, + 12608, 12592, 0, 8192, 12288, 12544, 12608, 12609, + 12600, 0, 8192, 12288, 12544, 12608, 12609, 12600, + 0, 8192, 12288, 12544, 12608, 12609, 12600, 12602, + 0, 8192, 12288, 12544, 12608, 12609, 12600, 0, + 8192, 12288, 12544, 12608, 12609, 12600, 12604, 0, + 8192, 12288, 12544, 12608, 12609, 12611, 12604, 0, + 8192, 12288, 12544, 12608, 12609, 12611, 12604, 12606, + 0, 8192, 12288, 12544, 0, 8192, 12288, 12544, + 12608, 0, 8192, 12288, 12544, 12608, 0, 8192, + 12288, 12544, 12608, 12610, 0, 8192, 12288, 12544, + 12608, 0, 8192, 12288, 12544, 12608, 12612, 0, + 8192, 12288, 12544, 12608, 12612, 0, 8192, 12288, + 12544, 12608, 12616, 12614, 0, 8192, 12288, 12544, + 12608, 0, 8192, 12288, 12544, 12608, 12616, 0, + 8192, 12288, 12544, 12608, 12616, 0, 8192, 12288, + 12544, 12608, 12616, 12618, 0, 8192, 12288, 12544, + 12608, 12616, 0, 8192, 12288, 12544, 12608, 12624, + 12620, 0, 8192, 12288, 12544, 12608, 12624, 12620, + 0, 8192, 12288, 12544, 12608, 12624, 12625, 12622, + 0, 8192, 12288, 12544, 12608, 0, 8192, 12288, + 12544, 12608, 12624, 0, 8192, 12288, 12544, 12608, + 12624, 0, 8192, 12288, 12544, 12608, 12624, 12626, + 0, 8192, 12288, 12544, 12608, 12624, 0, 8192, + 12288, 12544, 12608, 12624, 12628, 0, 8192, 12288, + 12544, 12608, 12624, 12628, 0, 8192, 12288, 12544, + 12608, 12624, 12632, 12630, 0, 8192, 12288, 12544, + 12608, 12624, 0, 8192, 12288, 12544, 12608, 12640, + 12632, 0, 8192, 12288, 12544, 12608, 12640, 12632, + 0, 8192, 12288, 12544, 12608, 12640, 12632, 12634, + 0, 8192, 12288, 12544, 12608, 12640, 12632, 0, + 8192, 12288, 12544, 12608, 12640, 12641, 12636, 0, + 8192, 12288, 12544, 12608, 12640, 12641, 12636, 0, + 8192, 12288, 12544, 12608, 12640, 12641, 12636, 12638, + 0, 8192, 12288, 12544, 12608, 0, 8192, 12288, + 12544, 12672, 12640, 0, 8192, 12288, 12544, 12672, + 12640, 0, 8192, 12288, 12544, 12672, 12640, 12642, + 0, 8192, 12288, 12544, 12672, 12640, 0, 8192, + 12288, 12544, 12672, 12640, 12644, 0, 8192, 12288, + 12544, 12672, 12640, 12644, 0, 8192, 12288, 12544, + 12672, 12640, 12648, 12646, 0, 8192, 12288, 12544, + 12672, 12640, 0, 8192, 12288, 12544, 12672, 12640, + 12648, 0, 8192, 12288, 12544, 12672, 12640, 12648, + 0, 8192, 12288, 12544, 12672, 12640, 12648, 12650, + 0, 8192, 12288, 12544, 12672, 12640, 12648, 0, + 8192, 12288, 12544, 12672, 12640, 12656, 12652, 0, + 8192, 12288, 12544, 12672, 12640, 12656, 12652, 0, + 8192, 12288, 12544, 12672, 12640, 12656, 12657, 12654, + 0, 8192, 12288, 12544, 12672, 12640, 0, 8192, + 12288, 12544, 12672, 12673, 12656, 0, 8192, 12288, + 12544, 12672, 12673, 12656, 0, 8192, 12288, 12544, + 12672, 12673, 12656, 12658, 0, 8192, 12288, 12544, + 12672, 12673, 12656, 0, 8192, 12288, 12544, 12672, + 12673, 12656, 12660, 0, 8192, 12288, 12544, 12672, + 12673, 12656, 12660, 0, 8192, 12288, 12544, 12672, + 12673, 12656, 12664, 12662, 0, 8192, 12288, 12544, + 12672, 12673, 12656, 0, 8192, 12288, 12544, 12672, + 12673, 12656, 12664, 0, 8192, 12288, 12544, 12672, + 12673, 12675, 12664, 0, 8192, 12288, 12544, 12672, + 12673, 12675, 12664, 12666, 0, 8192, 12288, 12544, + 12672, 12673, 12675, 12664, 0, 8192, 12288, 12544, + 12672, 12673, 12675, 12664, 12668, 0, 8192, 12288, + 12544, 12672, 12673, 12675, 12664, 12668, 0, 8192, + 12288, 12544, 12672, 12673, 12675, 12664, 12668, 12670, + 0, 8192, 12288, 12544, 0, 8192, 12288, 12800, + 12672, 0, 8192, 12288, 12800, 12672, 0, 8192, + 12288, 12800, 12672, 12674, 0, 8192, 12288, 12800, + 12672, 0, 8192, 12288, 12800, 12672, 12676, 0, + 8192, 12288, 12800, 12672, 12676, 0, 8192, 12288, + 12800, 12672, 12680, 12678, 0, 8192, 12288, 12800, + 12672, 0, 8192, 12288, 12800, 12672, 12680, 0, + 8192, 12288, 12800, 12672, 12680, 0, 8192, 12288, + 12800, 12672, 12680, 12682, 0, 8192, 12288, 12800, + 12672, 12680, 0, 8192, 12288, 12800, 12672, 12688, + 12684, 0, 8192, 12288, 12800, 12672, 12688, 12684, + 0, 8192, 12288, 12800, 12672, 12688, 12689, 12686, + 0, 8192, 12288, 12800, 12672, 0, 8192, 12288, + 12800, 12672, 12688, 0, 8192, 12288, 12800, 12672, + 12688, 0, 8192, 12288, 12800, 12672, 12688, 12690, + 0, 8192, 12288, 12800, 12672, 12688, 0, 8192, + 12288, 12800, 12672, 12688, 12692, 0, 8192, 12288, + 12800, 12672, 12688, 12692, 0, 8192, 12288, 12800, + 12672, 12688, 12696, 12694, 0, 8192, 12288, 12800, + 12672, 12688, 0, 8192, 12288, 12800, 12672, 12704, + 12696, 0, 8192, 12288, 12800, 12672, 12704, 12696, + 0, 8192, 12288, 12800, 12672, 12704, 12696, 12698, + 0, 8192, 12288, 12800, 12672, 12704, 12696, 0, + 8192, 12288, 12800, 12672, 12704, 12705, 12700, 0, + 8192, 12288, 12800, 12672, 12704, 12705, 12700, 0, + 8192, 12288, 12800, 12672, 12704, 12705, 12700, 12702, + 0, 8192, 12288, 12800, 12672, 0, 8192, 12288, + 12800, 12672, 12704, 0, 8192, 12288, 12800, 12672, + 12704, 0, 8192, 12288, 12800, 12672, 12704, 12706, + 0, 8192, 12288, 12800, 12672, 12704, 0, 8192, + 12288, 12800, 12672, 12704, 12708, 0, 8192, 12288, + 12800, 12672, 12704, 12708, 0, 8192, 12288, 12800, + 12672, 12704, 12712, 12710, 0, 8192, 12288, 12800, + 12672, 12704, 0, 8192, 12288, 12800, 12672, 12704, + 12712, 0, 8192, 12288, 12800, 12672, 12704, 12712, + 0, 8192, 12288, 12800, 12672, 12704, 12712, 12714, + 0, 8192, 12288, 12800, 12672, 12704, 12712, 0, + 8192, 12288, 12800, 12672, 12704, 12720, 12716, 0, + 8192, 12288, 12800, 12672, 12704, 12720, 12716, 0, + 8192, 12288, 12800, 12672, 12704, 12720, 12721, 12718, + 0, 8192, 12288, 12800, 12672, 12704, 0, 8192, + 12288, 12800, 12672, 12736, 12720, 0, 8192, 12288, + 12800, 12672, 12736, 12720, 0, 8192, 12288, 12800, + 12672, 12736, 12720, 12722, 0, 8192, 12288, 12800, + 12672, 12736, 12720, 0, 8192, 12288, 12800, 12672, + 12736, 12720, 12724, 0, 8192, 12288, 12800, 12672, + 12736, 12720, 12724, 0, 8192, 12288, 12800, 12672, + 12736, 12720, 12728, 12726, 0, 8192, 12288, 12800, + 12672, 12736, 12720, 0, 8192, 12288, 12800, 12672, + 12736, 12737, 12728, 0, 8192, 12288, 12800, 12672, + 12736, 12737, 12728, 0, 8192, 12288, 12800, 12672, + 12736, 12737, 12728, 12730, 0, 8192, 12288, 12800, + 12672, 12736, 12737, 12728, 0, 8192, 12288, 12800, + 12672, 12736, 12737, 12728, 12732, 0, 8192, 12288, + 12800, 12672, 12736, 12737, 12739, 12732, 0, 8192, + 12288, 12800, 12672, 12736, 12737, 12739, 12732, 12734, + 0, 8192, 12288, 12800, 12672, 0, 8192, 12288, + 12800, 12801, 12736, 0, 8192, 12288, 12800, 12801, + 12736, 0, 8192, 12288, 12800, 12801, 12736, 12738, + 0, 8192, 12288, 12800, 12801, 12736, 0, 8192, + 12288, 12800, 12801, 12736, 12740, 0, 8192, 12288, + 12800, 12801, 12736, 12740, 0, 8192, 12288, 12800, + 12801, 12736, 12744, 12742, 0, 8192, 12288, 12800, + 12801, 12736, 0, 8192, 12288, 12800, 12801, 12736, + 12744, 0, 8192, 12288, 12800, 12801, 12736, 12744, + 0, 8192, 12288, 12800, 12801, 12736, 12744, 12746, + 0, 8192, 12288, 12800, 12801, 12736, 12744, 0, + 8192, 12288, 12800, 12801, 12736, 12752, 12748, 0, + 8192, 12288, 12800, 12801, 12736, 12752, 12748, 0, + 8192, 12288, 12800, 12801, 12736, 12752, 12753, 12750, + 0, 8192, 12288, 12800, 12801, 12736, 0, 8192, + 12288, 12800, 12801, 12736, 12752, 0, 8192, 12288, + 12800, 12801, 12736, 12752, 0, 8192, 12288, 12800, + 12801, 12736, 12752, 12754, 0, 8192, 12288, 12800, + 12801, 12736, 12752, 0, 8192, 12288, 12800, 12801, + 12736, 12752, 12756, 0, 8192, 12288, 12800, 12801, + 12736, 12752, 12756, 0, 8192, 12288, 12800, 12801, + 12736, 12752, 12760, 12758, 0, 8192, 12288, 12800, + 12801, 12736, 12752, 0, 8192, 12288, 12800, 12801, + 12736, 12768, 12760, 0, 8192, 12288, 12800, 12801, + 12736, 12768, 12760, 0, 8192, 12288, 12800, 12801, + 12736, 12768, 12760, 12762, 0, 8192, 12288, 12800, + 12801, 12736, 12768, 12760, 0, 8192, 12288, 12800, + 12801, 12736, 12768, 12769, 12764, 0, 8192, 12288, + 12800, 12801, 12736, 12768, 12769, 12764, 0, 8192, + 12288, 12800, 12801, 12736, 12768, 12769, 12764, 12766, + 0, 8192, 12288, 12800, 12801, 12736, 0, 8192, + 12288, 12800, 12801, 12736, 12768, 0, 8192, 12288, + 12800, 12801, 12803, 12768, 0, 8192, 12288, 12800, + 12801, 12803, 12768, 12770, 0, 8192, 12288, 12800, + 12801, 12803, 12768, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12772, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12772, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12776, 12774, 0, 8192, 12288, 12800, + 12801, 12803, 12768, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12776, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12776, 0, 8192, 12288, 12800, 12801, + 12803, 12768, 12776, 12778, 0, 8192, 12288, 12800, + 12801, 12803, 12768, 12776, 0, 8192, 12288, 12800, + 12801, 12803, 12768, 12784, 12780, 0, 8192, 12288, + 12800, 12801, 12803, 12768, 12784, 12780, 0, 8192, + 12288, 12800, 12801, 12803, 12768, 12784, 12785, 12782, + 0, 8192, 12288, 12800, 12801, 12803, 12768, 0, + 8192, 12288, 12800, 12801, 12803, 12768, 12784, 0, + 8192, 12288, 12800, 12801, 12803, 12768, 12784, 0, + 8192, 12288, 12800, 12801, 12803, 12768, 12784, 12786, + 0, 8192, 12288, 12800, 12801, 12803, 12807, 12784, + 0, 8192, 12288, 12800, 12801, 12803, 12807, 12784, + 12788, 0, 8192, 12288, 12800, 12801, 12803, 12807, + 12784, 12788, 0, 8192, 12288, 12800, 12801, 12803, + 12807, 12784, 12792, 12790, 0, 8192, 12288, 12800, + 12801, 12803, 12807, 12784, 0, 8192, 12288, 12800, + 12801, 12803, 12807, 12784, 12792, 0, 8192, 12288, + 12800, 12801, 12803, 12807, 12784, 12792, 0, 8192, + 12288, 12800, 12801, 12803, 12807, 12784, 12792, 12794, + 0, 8192, 12288, 12800, 12801, 12803, 12807, 12784, + 12792, 0, 8192, 12288, 12800, 12801, 12803, 12807, + 12784, 12792, 12796, 0, 8192, 12288, 12800, 12801, + 12803, 12807, 12784, 12792, 12796, 0, 8192, 12288, + 12800, 12801, 12803, 12807, 12784, 12792, 12796, 12798, + 0, 8192, 12288, 0, 8192, 12288, 12800, 0, + 8192, 12288, 12800, 0, 8192, 12288, 12800, 12802, + 0, 8192, 12288, 12800, 0, 8192, 12288, 12800, + 12804, 0, 8192, 12288, 12800, 12804, 0, 8192, + 12288, 12800, 12808, 12806, 0, 8192, 12288, 12800, + 0, 8192, 12288, 12800, 12808, 0, 8192, 12288, + 12800, 12808, 0, 8192, 12288, 12800, 12808, 12810, + 0, 8192, 12288, 12800, 12808, 0, 8192, 12288, + 12800, 12816, 12812, 0, 8192, 12288, 12800, 12816, + 12812, 0, 8192, 12288, 12800, 12816, 12817, 12814, + 0, 8192, 12288, 12800, 0, 8192, 12288, 12800, + 12816, 0, 8192, 12288, 12800, 12816, 0, 8192, + 12288, 12800, 12816, 12818, 0, 8192, 12288, 12800, + 12816, 0, 8192, 12288, 12800, 12816, 12820, 0, + 8192, 12288, 12800, 12816, 12820, 0, 8192, 12288, + 12800, 12816, 12824, 12822, 0, 8192, 12288, 12800, + 12816, 0, 8192, 12288, 12800, 12832, 12824, 0, + 8192, 12288, 12800, 12832, 12824, 0, 8192, 12288, + 12800, 12832, 12824, 12826, 0, 8192, 12288, 12800, + 12832, 12824, 0, 8192, 12288, 12800, 12832, 12833, + 12828, 0, 8192, 12288, 12800, 12832, 12833, 12828, + 0, 8192, 12288, 12800, 12832, 12833, 12828, 12830, + 0, 8192, 12288, 12800, 0, 8192, 12288, 12800, + 12832, 0, 8192, 12288, 12800, 12832, 0, 8192, + 12288, 12800, 12832, 12834, 0, 8192, 12288, 12800, + 12832, 0, 8192, 12288, 12800, 12832, 12836, 0, + 8192, 12288, 12800, 12832, 12836, 0, 8192, 12288, + 12800, 12832, 12840, 12838, 0, 8192, 12288, 12800, + 12832, 0, 8192, 12288, 12800, 12832, 12840, 0, + 8192, 12288, 12800, 12832, 12840, 0, 8192, 12288, + 12800, 12832, 12840, 12842, 0, 8192, 12288, 12800, + 12832, 12840, 0, 8192, 12288, 12800, 12832, 12848, + 12844, 0, 8192, 12288, 12800, 12832, 12848, 12844, + 0, 8192, 12288, 12800, 12832, 12848, 12849, 12846, + 0, 8192, 12288, 12800, 12832, 0, 8192, 12288, + 12800, 12864, 12848, 0, 8192, 12288, 12800, 12864, + 12848, 0, 8192, 12288, 12800, 12864, 12848, 12850, + 0, 8192, 12288, 12800, 12864, 12848, 0, 8192, + 12288, 12800, 12864, 12848, 12852, 0, 8192, 12288, + 12800, 12864, 12848, 12852, 0, 8192, 12288, 12800, + 12864, 12848, 12856, 12854, 0, 8192, 12288, 12800, + 12864, 12848, 0, 8192, 12288, 12800, 12864, 12865, + 12856, 0, 8192, 12288, 12800, 12864, 12865, 12856, + 0, 8192, 12288, 12800, 12864, 12865, 12856, 12858, + 0, 8192, 12288, 12800, 12864, 12865, 12856, 0, + 8192, 12288, 12800, 12864, 12865, 12856, 12860, 0, + 8192, 12288, 12800, 12864, 12865, 12867, 12860, 0, + 8192, 12288, 12800, 12864, 12865, 12867, 12860, 12862, + 0, 8192, 12288, 12800, 0, 8192, 12288, 12800, + 12864, 0, 8192, 12288, 12800, 12864, 0, 8192, + 12288, 12800, 12864, 12866, 0, 8192, 12288, 12800, + 12864, 0, 8192, 12288, 12800, 12864, 12868, 0, + 8192, 12288, 12800, 12864, 12868, 0, 8192, 12288, + 12800, 12864, 12872, 12870, 0, 8192, 12288, 12800, + 12864, 0, 8192, 12288, 12800, 12864, 12872, 0, + 8192, 12288, 12800, 12864, 12872, 0, 8192, 12288, + 12800, 12864, 12872, 12874, 0, 8192, 12288, 12800, + 12864, 12872, 0, 8192, 12288, 12800, 12864, 12880, + 12876, 0, 8192, 12288, 12800, 12864, 12880, 12876, + 0, 8192, 12288, 12800, 12864, 12880, 12881, 12878, + 0, 8192, 12288, 12800, 12864, 0, 8192, 12288, + 12800, 12864, 12880, 0, 8192, 12288, 12800, 12864, + 12880, 0, 8192, 12288, 12800, 12864, 12880, 12882, + 0, 8192, 12288, 12800, 12864, 12880, 0, 8192, + 12288, 12800, 12864, 12880, 12884, 0, 8192, 12288, + 12800, 12864, 12880, 12884, 0, 8192, 12288, 12800, + 12864, 12880, 12888, 12886, 0, 8192, 12288, 12800, + 12864, 12880, 0, 8192, 12288, 12800, 12864, 12896, + 12888, 0, 8192, 12288, 12800, 12864, 12896, 12888, + 0, 8192, 12288, 12800, 12864, 12896, 12888, 12890, + 0, 8192, 12288, 12800, 12864, 12896, 12888, 0, + 8192, 12288, 12800, 12864, 12896, 12897, 12892, 0, + 8192, 12288, 12800, 12864, 12896, 12897, 12892, 0, + 8192, 12288, 12800, 12864, 12896, 12897, 12892, 12894, + 0, 8192, 12288, 12800, 12864, 0, 8192, 12288, + 12800, 12928, 12896, 0, 8192, 12288, 12800, 12928, + 12896, 0, 8192, 12288, 12800, 12928, 12896, 12898, + 0, 8192, 12288, 12800, 12928, 12896, 0, 8192, + 12288, 12800, 12928, 12896, 12900, 0, 8192, 12288, + 12800, 12928, 12896, 12900, 0, 8192, 12288, 12800, + 12928, 12896, 12904, 12902, 0, 8192, 12288, 12800, + 12928, 12896, 0, 8192, 12288, 12800, 12928, 12896, + 12904, 0, 8192, 12288, 12800, 12928, 12896, 12904, + 0, 8192, 12288, 12800, 12928, 12896, 12904, 12906, + 0, 8192, 12288, 12800, 12928, 12896, 12904, 0, + 8192, 12288, 12800, 12928, 12896, 12912, 12908, 0, + 8192, 12288, 12800, 12928, 12896, 12912, 12908, 0, + 8192, 12288, 12800, 12928, 12896, 12912, 12913, 12910, + 0, 8192, 12288, 12800, 12928, 12896, 0, 8192, + 12288, 12800, 12928, 12929, 12912, 0, 8192, 12288, + 12800, 12928, 12929, 12912, 0, 8192, 12288, 12800, + 12928, 12929, 12912, 12914, 0, 8192, 12288, 12800, + 12928, 12929, 12912, 0, 8192, 12288, 12800, 12928, + 12929, 12912, 12916, 0, 8192, 12288, 12800, 12928, + 12929, 12912, 12916, 0, 8192, 12288, 12800, 12928, + 12929, 12912, 12920, 12918, 0, 8192, 12288, 12800, + 12928, 12929, 12912, 0, 8192, 12288, 12800, 12928, + 12929, 12912, 12920, 0, 8192, 12288, 12800, 12928, + 12929, 12931, 12920, 0, 8192, 12288, 12800, 12928, + 12929, 12931, 12920, 12922, 0, 8192, 12288, 12800, + 12928, 12929, 12931, 12920, 0, 8192, 12288, 12800, + 12928, 12929, 12931, 12920, 12924, 0, 8192, 12288, + 12800, 12928, 12929, 12931, 12920, 12924, 0, 8192, + 12288, 12800, 12928, 12929, 12931, 12920, 12924, 12926, + 0, 8192, 12288, 12800, 0, 8192, 12288, 12800, + 12928, 0, 8192, 12288, 12800, 12928, 0, 8192, + 12288, 12800, 12928, 12930, 0, 8192, 12288, 12800, + 12928, 0, 8192, 12288, 12800, 12928, 12932, 0, + 8192, 12288, 12800, 12928, 12932, 0, 8192, 12288, + 12800, 12928, 12936, 12934, 0, 8192, 12288, 12800, + 12928, 0, 8192, 12288, 12800, 12928, 12936, 0, + 8192, 12288, 12800, 12928, 12936, 0, 8192, 12288, + 12800, 12928, 12936, 12938, 0, 8192, 12288, 12800, + 12928, 12936, 0, 8192, 12288, 12800, 12928, 12944, + 12940, 0, 8192, 12288, 12800, 12928, 12944, 12940, + 0, 8192, 12288, 12800, 12928, 12944, 12945, 12942, + 0, 8192, 12288, 12800, 12928, 0, 8192, 12288, + 12800, 12928, 12944, 0, 8192, 12288, 12800, 12928, + 12944, 0, 8192, 12288, 12800, 12928, 12944, 12946, + 0, 8192, 12288, 12800, 12928, 12944, 0, 8192, + 12288, 12800, 12928, 12944, 12948, 0, 8192, 12288, + 12800, 12928, 12944, 12948, 0, 8192, 12288, 12800, + 12928, 12944, 12952, 12950, 0, 8192, 12288, 12800, + 12928, 12944, 0, 8192, 12288, 12800, 12928, 12960, + 12952, 0, 8192, 12288, 12800, 12928, 12960, 12952, + 0, 8192, 12288, 12800, 12928, 12960, 12952, 12954, + 0, 8192, 12288, 12800, 12928, 12960, 12952, 0, + 8192, 12288, 12800, 12928, 12960, 12961, 12956, 0, + 8192, 12288, 12800, 12928, 12960, 12961, 12956, 0, + 8192, 12288, 12800, 12928, 12960, 12961, 12956, 12958, + 0, 8192, 12288, 12800, 12928, 0, 8192, 12288, + 12800, 12928, 12960, 0, 8192, 12288, 12800, 12928, + 12960, 0, 8192, 12288, 12800, 12928, 12960, 12962, + 0, 8192, 12288, 12800, 12928, 12960, 0, 8192, + 12288, 12800, 12928, 12960, 12964, 0, 8192, 12288, + 12800, 12928, 12960, 12964, 0, 8192, 12288, 12800, + 12928, 12960, 12968, 12966, 0, 8192, 12288, 12800, + 12928, 12960, 0, 8192, 12288, 12800, 12928, 12960, + 12968, 0, 8192, 12288, 12800, 12928, 12960, 12968, + 0, 8192, 12288, 12800, 12928, 12960, 12968, 12970, + 0, 8192, 12288, 12800, 12928, 12960, 12968, 0, + 8192, 12288, 12800, 12928, 12960, 12976, 12972, 0, + 8192, 12288, 12800, 12928, 12960, 12976, 12972, 0, + 8192, 12288, 12800, 12928, 12960, 12976, 12977, 12974, + 0, 8192, 12288, 12800, 12928, 12960, 0, 8192, + 12288, 12800, 12928, 12992, 12976, 0, 8192, 12288, + 12800, 12928, 12992, 12976, 0, 8192, 12288, 12800, + 12928, 12992, 12976, 12978, 0, 8192, 12288, 12800, + 12928, 12992, 12976, 0, 8192, 12288, 12800, 12928, + 12992, 12976, 12980, 0, 8192, 12288, 12800, 12928, + 12992, 12976, 12980, 0, 8192, 12288, 12800, 12928, + 12992, 12976, 12984, 12982, 0, 8192, 12288, 12800, + 12928, 12992, 12976, 0, 8192, 12288, 12800, 12928, + 12992, 12993, 12984, 0, 8192, 12288, 12800, 12928, + 12992, 12993, 12984, 0, 8192, 12288, 12800, 12928, + 12992, 12993, 12984, 12986, 0, 8192, 12288, 12800, + 12928, 12992, 12993, 12984, 0, 8192, 12288, 12800, + 12928, 12992, 12993, 12984, 12988, 0, 8192, 12288, + 12800, 12928, 12992, 12993, 12995, 12988, 0, 8192, + 12288, 12800, 12928, 12992, 12993, 12995, 12988, 12990, + 0, 8192, 12288, 12800, 12928, 0, 8192, 12288, + 12800, 13056, 12992, 0, 8192, 12288, 12800, 13056, + 12992, 0, 8192, 12288, 12800, 13056, 12992, 12994, + 0, 8192, 12288, 12800, 13056, 12992, 0, 8192, + 12288, 12800, 13056, 12992, 12996, 0, 8192, 12288, + 12800, 13056, 12992, 12996, 0, 8192, 12288, 12800, + 13056, 12992, 13000, 12998, 0, 8192, 12288, 12800, + 13056, 12992, 0, 8192, 12288, 12800, 13056, 12992, + 13000, 0, 8192, 12288, 12800, 13056, 12992, 13000, + 0, 8192, 12288, 12800, 13056, 12992, 13000, 13002, + 0, 8192, 12288, 12800, 13056, 12992, 13000, 0, + 8192, 12288, 12800, 13056, 12992, 13008, 13004, 0, + 8192, 12288, 12800, 13056, 12992, 13008, 13004, 0, + 8192, 12288, 12800, 13056, 12992, 13008, 13009, 13006, + 0, 8192, 12288, 12800, 13056, 12992, 0, 8192, + 12288, 12800, 13056, 12992, 13008, 0, 8192, 12288, + 12800, 13056, 12992, 13008, 0, 8192, 12288, 12800, + 13056, 12992, 13008, 13010, 0, 8192, 12288, 12800, + 13056, 12992, 13008, 0, 8192, 12288, 12800, 13056, + 12992, 13008, 13012, 0, 8192, 12288, 12800, 13056, + 12992, 13008, 13012, 0, 8192, 12288, 12800, 13056, + 12992, 13008, 13016, 13014, 0, 8192, 12288, 12800, + 13056, 12992, 13008, 0, 8192, 12288, 12800, 13056, + 12992, 13024, 13016, 0, 8192, 12288, 12800, 13056, + 12992, 13024, 13016, 0, 8192, 12288, 12800, 13056, + 12992, 13024, 13016, 13018, 0, 8192, 12288, 12800, + 13056, 12992, 13024, 13016, 0, 8192, 12288, 12800, + 13056, 12992, 13024, 13025, 13020, 0, 8192, 12288, + 12800, 13056, 12992, 13024, 13025, 13020, 0, 8192, + 12288, 12800, 13056, 12992, 13024, 13025, 13020, 13022, + 0, 8192, 12288, 12800, 13056, 12992, 0, 8192, + 12288, 12800, 13056, 13057, 13024, 0, 8192, 12288, + 12800, 13056, 13057, 13024, 0, 8192, 12288, 12800, + 13056, 13057, 13024, 13026, 0, 8192, 12288, 12800, + 13056, 13057, 13024, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13028, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13028, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13032, 13030, 0, 8192, 12288, 12800, + 13056, 13057, 13024, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13032, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13032, 0, 8192, 12288, 12800, 13056, + 13057, 13024, 13032, 13034, 0, 8192, 12288, 12800, + 13056, 13057, 13024, 13032, 0, 8192, 12288, 12800, + 13056, 13057, 13024, 13040, 13036, 0, 8192, 12288, + 12800, 13056, 13057, 13024, 13040, 13036, 0, 8192, + 12288, 12800, 13056, 13057, 13024, 13040, 13041, 13038, + 0, 8192, 12288, 12800, 13056, 13057, 13024, 0, + 8192, 12288, 12800, 13056, 13057, 13024, 13040, 0, + 8192, 12288, 12800, 13056, 13057, 13059, 13040, 0, + 8192, 12288, 12800, 13056, 13057, 13059, 13040, 13042, + 0, 8192, 12288, 12800, 13056, 13057, 13059, 13040, + 0, 8192, 12288, 12800, 13056, 13057, 13059, 13040, + 13044, 0, 8192, 12288, 12800, 13056, 13057, 13059, + 13040, 13044, 0, 8192, 12288, 12800, 13056, 13057, + 13059, 13040, 13048, 13046, 0, 8192, 12288, 12800, + 13056, 13057, 13059, 13040, 0, 8192, 12288, 12800, + 13056, 13057, 13059, 13040, 13048, 0, 8192, 12288, + 12800, 13056, 13057, 13059, 13040, 13048, 0, 8192, + 12288, 12800, 13056, 13057, 13059, 13040, 13048, 13050, + 0, 8192, 12288, 12800, 13056, 13057, 13059, 13063, + 13048, 0, 8192, 12288, 12800, 13056, 13057, 13059, + 13063, 13048, 13052, 0, 8192, 12288, 12800, 13056, + 13057, 13059, 13063, 13048, 13052, 0, 8192, 12288, + 12800, 13056, 13057, 13059, 13063, 13048, 13052, 13054, + 0, 8192, 12288, 12800, 0, 8192, 12288, 13312, + 13056, 0, 8192, 12288, 13312, 13056, 0, 8192, + 12288, 13312, 13056, 13058, 0, 8192, 12288, 13312, + 13056, 0, 8192, 12288, 13312, 13056, 13060, 0, + 8192, 12288, 13312, 13056, 13060, 0, 8192, 12288, + 13312, 13056, 13064, 13062, 0, 8192, 12288, 13312, + 13056, 0, 8192, 12288, 13312, 13056, 13064, 0, + 8192, 12288, 13312, 13056, 13064, 0, 8192, 12288, + 13312, 13056, 13064, 13066, 0, 8192, 12288, 13312, + 13056, 13064, 0, 8192, 12288, 13312, 13056, 13072, + 13068, 0, 8192, 12288, 13312, 13056, 13072, 13068, + 0, 8192, 12288, 13312, 13056, 13072, 13073, 13070, + 0, 8192, 12288, 13312, 13056, 0, 8192, 12288, + 13312, 13056, 13072, 0, 8192, 12288, 13312, 13056, + 13072, 0, 8192, 12288, 13312, 13056, 13072, 13074, + 0, 8192, 12288, 13312, 13056, 13072, 0, 8192, + 12288, 13312, 13056, 13072, 13076, 0, 8192, 12288, + 13312, 13056, 13072, 13076, 0, 8192, 12288, 13312, + 13056, 13072, 13080, 13078, 0, 8192, 12288, 13312, + 13056, 13072, 0, 8192, 12288, 13312, 13056, 13088, + 13080, 0, 8192, 12288, 13312, 13056, 13088, 13080, + 0, 8192, 12288, 13312, 13056, 13088, 13080, 13082, + 0, 8192, 12288, 13312, 13056, 13088, 13080, 0, + 8192, 12288, 13312, 13056, 13088, 13089, 13084, 0, + 8192, 12288, 13312, 13056, 13088, 13089, 13084, 0, + 8192, 12288, 13312, 13056, 13088, 13089, 13084, 13086, + 0, 8192, 12288, 13312, 13056, 0, 8192, 12288, + 13312, 13056, 13088, 0, 8192, 12288, 13312, 13056, + 13088, 0, 8192, 12288, 13312, 13056, 13088, 13090, + 0, 8192, 12288, 13312, 13056, 13088, 0, 8192, + 12288, 13312, 13056, 13088, 13092, 0, 8192, 12288, + 13312, 13056, 13088, 13092, 0, 8192, 12288, 13312, + 13056, 13088, 13096, 13094, 0, 8192, 12288, 13312, + 13056, 13088, 0, 8192, 12288, 13312, 13056, 13088, + 13096, 0, 8192, 12288, 13312, 13056, 13088, 13096, + 0, 8192, 12288, 13312, 13056, 13088, 13096, 13098, + 0, 8192, 12288, 13312, 13056, 13088, 13096, 0, + 8192, 12288, 13312, 13056, 13088, 13104, 13100, 0, + 8192, 12288, 13312, 13056, 13088, 13104, 13100, 0, + 8192, 12288, 13312, 13056, 13088, 13104, 13105, 13102, + 0, 8192, 12288, 13312, 13056, 13088, 0, 8192, + 12288, 13312, 13056, 13120, 13104, 0, 8192, 12288, + 13312, 13056, 13120, 13104, 0, 8192, 12288, 13312, + 13056, 13120, 13104, 13106, 0, 8192, 12288, 13312, + 13056, 13120, 13104, 0, 8192, 12288, 13312, 13056, + 13120, 13104, 13108, 0, 8192, 12288, 13312, 13056, + 13120, 13104, 13108, 0, 8192, 12288, 13312, 13056, + 13120, 13104, 13112, 13110, 0, 8192, 12288, 13312, + 13056, 13120, 13104, 0, 8192, 12288, 13312, 13056, + 13120, 13121, 13112, 0, 8192, 12288, 13312, 13056, + 13120, 13121, 13112, 0, 8192, 12288, 13312, 13056, + 13120, 13121, 13112, 13114, 0, 8192, 12288, 13312, + 13056, 13120, 13121, 13112, 0, 8192, 12288, 13312, + 13056, 13120, 13121, 13112, 13116, 0, 8192, 12288, + 13312, 13056, 13120, 13121, 13123, 13116, 0, 8192, + 12288, 13312, 13056, 13120, 13121, 13123, 13116, 13118, + 0, 8192, 12288, 13312, 13056, 0, 8192, 12288, + 13312, 13056, 13120, 0, 8192, 12288, 13312, 13056, + 13120, 0, 8192, 12288, 13312, 13056, 13120, 13122, + 0, 8192, 12288, 13312, 13056, 13120, 0, 8192, + 12288, 13312, 13056, 13120, 13124, 0, 8192, 12288, + 13312, 13056, 13120, 13124, 0, 8192, 12288, 13312, + 13056, 13120, 13128, 13126, 0, 8192, 12288, 13312, + 13056, 13120, 0, 8192, 12288, 13312, 13056, 13120, + 13128, 0, 8192, 12288, 13312, 13056, 13120, 13128, + 0, 8192, 12288, 13312, 13056, 13120, 13128, 13130, + 0, 8192, 12288, 13312, 13056, 13120, 13128, 0, + 8192, 12288, 13312, 13056, 13120, 13136, 13132, 0, + 8192, 12288, 13312, 13056, 13120, 13136, 13132, 0, + 8192, 12288, 13312, 13056, 13120, 13136, 13137, 13134, + 0, 8192, 12288, 13312, 13056, 13120, 0, 8192, + 12288, 13312, 13056, 13120, 13136, 0, 8192, 12288, + 13312, 13056, 13120, 13136, 0, 8192, 12288, 13312, + 13056, 13120, 13136, 13138, 0, 8192, 12288, 13312, + 13056, 13120, 13136, 0, 8192, 12288, 13312, 13056, + 13120, 13136, 13140, 0, 8192, 12288, 13312, 13056, + 13120, 13136, 13140, 0, 8192, 12288, 13312, 13056, + 13120, 13136, 13144, 13142, 0, 8192, 12288, 13312, + 13056, 13120, 13136, 0, 8192, 12288, 13312, 13056, + 13120, 13152, 13144, 0, 8192, 12288, 13312, 13056, + 13120, 13152, 13144, 0, 8192, 12288, 13312, 13056, + 13120, 13152, 13144, 13146, 0, 8192, 12288, 13312, + 13056, 13120, 13152, 13144, 0, 8192, 12288, 13312, + 13056, 13120, 13152, 13153, 13148, 0, 8192, 12288, + 13312, 13056, 13120, 13152, 13153, 13148, 0, 8192, + 12288, 13312, 13056, 13120, 13152, 13153, 13148, 13150, + 0, 8192, 12288, 13312, 13056, 13120, 0, 8192, + 12288, 13312, 13056, 13184, 13152, 0, 8192, 12288, + 13312, 13056, 13184, 13152, 0, 8192, 12288, 13312, + 13056, 13184, 13152, 13154, 0, 8192, 12288, 13312, + 13056, 13184, 13152, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13156, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13156, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13160, 13158, 0, 8192, 12288, 13312, + 13056, 13184, 13152, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13160, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13160, 0, 8192, 12288, 13312, 13056, + 13184, 13152, 13160, 13162, 0, 8192, 12288, 13312, + 13056, 13184, 13152, 13160, 0, 8192, 12288, 13312, + 13056, 13184, 13152, 13168, 13164, 0, 8192, 12288, + 13312, 13056, 13184, 13152, 13168, 13164, 0, 8192, + 12288, 13312, 13056, 13184, 13152, 13168, 13169, 13166, + 0, 8192, 12288, 13312, 13056, 13184, 13152, 0, + 8192, 12288, 13312, 13056, 13184, 13185, 13168, 0, + 8192, 12288, 13312, 13056, 13184, 13185, 13168, 0, + 8192, 12288, 13312, 13056, 13184, 13185, 13168, 13170, + 0, 8192, 12288, 13312, 13056, 13184, 13185, 13168, + 0, 8192, 12288, 13312, 13056, 13184, 13185, 13168, + 13172, 0, 8192, 12288, 13312, 13056, 13184, 13185, + 13168, 13172, 0, 8192, 12288, 13312, 13056, 13184, + 13185, 13168, 13176, 13174, 0, 8192, 12288, 13312, + 13056, 13184, 13185, 13168, 0, 8192, 12288, 13312, + 13056, 13184, 13185, 13168, 13176, 0, 8192, 12288, + 13312, 13056, 13184, 13185, 13187, 13176, 0, 8192, + 12288, 13312, 13056, 13184, 13185, 13187, 13176, 13178, + 0, 8192, 12288, 13312, 13056, 13184, 13185, 13187, + 13176, 0, 8192, 12288, 13312, 13056, 13184, 13185, + 13187, 13176, 13180, 0, 8192, 12288, 13312, 13056, + 13184, 13185, 13187, 13176, 13180, 0, 8192, 12288, + 13312, 13056, 13184, 13185, 13187, 13176, 13180, 13182, + 0, 8192, 12288, 13312, 13056, 0, 8192, 12288, + 13312, 13056, 13184, 0, 8192, 12288, 13312, 13313, + 13184, 0, 8192, 12288, 13312, 13313, 13184, 13186, + 0, 8192, 12288, 13312, 13313, 13184, 0, 8192, + 12288, 13312, 13313, 13184, 13188, 0, 8192, 12288, + 13312, 13313, 13184, 13188, 0, 8192, 12288, 13312, + 13313, 13184, 13192, 13190, 0, 8192, 12288, 13312, + 13313, 13184, 0, 8192, 12288, 13312, 13313, 13184, + 13192, 0, 8192, 12288, 13312, 13313, 13184, 13192, + 0, 8192, 12288, 13312, 13313, 13184, 13192, 13194, + 0, 8192, 12288, 13312, 13313, 13184, 13192, 0, + 8192, 12288, 13312, 13313, 13184, 13200, 13196, 0, + 8192, 12288, 13312, 13313, 13184, 13200, 13196, 0, + 8192, 12288, 13312, 13313, 13184, 13200, 13201, 13198, + 0, 8192, 12288, 13312, 13313, 13184, 0, 8192, + 12288, 13312, 13313, 13184, 13200, 0, 8192, 12288, + 13312, 13313, 13184, 13200, 0, 8192, 12288, 13312, + 13313, 13184, 13200, 13202, 0, 8192, 12288, 13312, + 13313, 13184, 13200, 0, 8192, 12288, 13312, 13313, + 13184, 13200, 13204, 0, 8192, 12288, 13312, 13313, + 13184, 13200, 13204, 0, 8192, 12288, 13312, 13313, + 13184, 13200, 13208, 13206, 0, 8192, 12288, 13312, + 13313, 13184, 13200, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13208, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13208, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13208, 13210, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 13208, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 13217, 13212, 0, 8192, 12288, + 13312, 13313, 13184, 13216, 13217, 13212, 0, 8192, + 12288, 13312, 13313, 13184, 13216, 13217, 13212, 13214, + 0, 8192, 12288, 13312, 13313, 13184, 0, 8192, + 12288, 13312, 13313, 13184, 13216, 0, 8192, 12288, + 13312, 13313, 13184, 13216, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 13218, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13220, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13220, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13224, 13222, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13224, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13224, 0, 8192, 12288, 13312, 13313, + 13184, 13216, 13224, 13226, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 13224, 0, 8192, 12288, 13312, + 13313, 13184, 13216, 13232, 13228, 0, 8192, 12288, + 13312, 13313, 13184, 13216, 13232, 13228, 0, 8192, + 12288, 13312, 13313, 13184, 13216, 13232, 13233, 13230, + 0, 8192, 12288, 13312, 13313, 13184, 13216, 0, + 8192, 12288, 13312, 13313, 13184, 13248, 13232, 0, + 8192, 12288, 13312, 13313, 13184, 13248, 13232, 0, + 8192, 12288, 13312, 13313, 13184, 13248, 13232, 13234, + 0, 8192, 12288, 13312, 13313, 13184, 13248, 13232, + 0, 8192, 12288, 13312, 13313, 13184, 13248, 13232, + 13236, 0, 8192, 12288, 13312, 13313, 13184, 13248, + 13232, 13236, 0, 8192, 12288, 13312, 13313, 13184, + 13248, 13232, 13240, 13238, 0, 8192, 12288, 13312, + 13313, 13184, 13248, 13232, 0, 8192, 12288, 13312, + 13313, 13184, 13248, 13249, 13240, 0, 8192, 12288, + 13312, 13313, 13184, 13248, 13249, 13240, 0, 8192, + 12288, 13312, 13313, 13184, 13248, 13249, 13240, 13242, + 0, 8192, 12288, 13312, 13313, 13184, 13248, 13249, + 13240, 0, 8192, 12288, 13312, 13313, 13184, 13248, + 13249, 13240, 13244, 0, 8192, 12288, 13312, 13313, + 13184, 13248, 13249, 13251, 13244, 0, 8192, 12288, + 13312, 13313, 13184, 13248, 13249, 13251, 13244, 13246, + 0, 8192, 12288, 13312, 13313, 13184, 0, 8192, + 12288, 13312, 13313, 13184, 13248, 0, 8192, 12288, + 13312, 13313, 13184, 13248, 0, 8192, 12288, 13312, + 13313, 13184, 13248, 13250, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13252, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13252, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13256, 13254, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13256, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13256, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13256, 13258, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 13256, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 13264, 13260, 0, 8192, 12288, + 13312, 13313, 13315, 13248, 13264, 13260, 0, 8192, + 12288, 13312, 13313, 13315, 13248, 13264, 13265, 13262, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13264, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13264, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13264, 13266, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 13264, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 13264, + 13268, 0, 8192, 12288, 13312, 13313, 13315, 13248, + 13264, 13268, 0, 8192, 12288, 13312, 13313, 13315, + 13248, 13264, 13272, 13270, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 13264, 0, 8192, 12288, 13312, + 13313, 13315, 13248, 13280, 13272, 0, 8192, 12288, + 13312, 13313, 13315, 13248, 13280, 13272, 0, 8192, + 12288, 13312, 13313, 13315, 13248, 13280, 13272, 13274, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 13280, + 13272, 0, 8192, 12288, 13312, 13313, 13315, 13248, + 13280, 13281, 13276, 0, 8192, 12288, 13312, 13313, + 13315, 13248, 13280, 13281, 13276, 0, 8192, 12288, + 13312, 13313, 13315, 13248, 13280, 13281, 13276, 13278, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13280, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13280, 0, + 8192, 12288, 13312, 13313, 13315, 13248, 13280, 13282, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 13280, + 0, 8192, 12288, 13312, 13313, 13315, 13248, 13280, + 13284, 0, 8192, 12288, 13312, 13313, 13315, 13248, + 13280, 13284, 0, 8192, 12288, 13312, 13313, 13315, + 13248, 13280, 13288, 13286, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 13288, 0, 8192, 12288, + 13312, 13313, 13315, 13319, 13280, 13288, 0, 8192, + 12288, 13312, 13313, 13315, 13319, 13280, 13288, 13290, + 0, 8192, 12288, 13312, 13313, 13315, 13319, 13280, + 13288, 0, 8192, 12288, 13312, 13313, 13315, 13319, + 13280, 13296, 13292, 0, 8192, 12288, 13312, 13313, + 13315, 13319, 13280, 13296, 13292, 0, 8192, 12288, + 13312, 13313, 13315, 13319, 13280, 13296, 13297, 13294, + 0, 8192, 12288, 13312, 13313, 13315, 13319, 13280, + 0, 8192, 12288, 13312, 13313, 13315, 13319, 13280, + 13296, 0, 8192, 12288, 13312, 13313, 13315, 13319, + 13280, 13296, 0, 8192, 12288, 13312, 13313, 13315, + 13319, 13280, 13296, 13298, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 13296, 0, 8192, 12288, + 13312, 13313, 13315, 13319, 13280, 13296, 13300, 0, + 8192, 12288, 13312, 13313, 13315, 13319, 13280, 13296, + 13300, 0, 8192, 12288, 13312, 13313, 13315, 13319, + 13280, 13296, 13304, 13302, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 13296, 0, 8192, 12288, + 13312, 13313, 13315, 13319, 13280, 13296, 13304, 0, + 8192, 12288, 13312, 13313, 13315, 13319, 13280, 13296, + 13304, 0, 8192, 12288, 13312, 13313, 13315, 13319, + 13280, 13296, 13304, 13306, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 13296, 13304, 0, 8192, + 12288, 13312, 13313, 13315, 13319, 13280, 13296, 13304, + 13308, 0, 8192, 12288, 13312, 13313, 13315, 13319, + 13280, 13296, 13304, 13308, 0, 8192, 12288, 13312, + 13313, 13315, 13319, 13280, 13296, 13304, 13308, 13310, + 0, 8192, 12288, 0, 8192, 12288, 13312, 0, + 8192, 12288, 13312, 0, 8192, 12288, 13312, 13314, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13316, 0, 8192, 12288, 13312, 13316, 0, 8192, + 12288, 13312, 13320, 13318, 0, 8192, 12288, 13312, + 0, 8192, 12288, 13312, 13320, 0, 8192, 12288, + 13312, 13320, 0, 8192, 12288, 13312, 13320, 13322, + 0, 8192, 12288, 13312, 13320, 0, 8192, 12288, + 13312, 13328, 13324, 0, 8192, 12288, 13312, 13328, + 13324, 0, 8192, 12288, 13312, 13328, 13329, 13326, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13328, 0, 8192, 12288, 13312, 13328, 0, 8192, + 12288, 13312, 13328, 13330, 0, 8192, 12288, 13312, + 13328, 0, 8192, 12288, 13312, 13328, 13332, 0, + 8192, 12288, 13312, 13328, 13332, 0, 8192, 12288, + 13312, 13328, 13336, 13334, 0, 8192, 12288, 13312, + 13328, 0, 8192, 12288, 13312, 13344, 13336, 0, + 8192, 12288, 13312, 13344, 13336, 0, 8192, 12288, + 13312, 13344, 13336, 13338, 0, 8192, 12288, 13312, + 13344, 13336, 0, 8192, 12288, 13312, 13344, 13345, + 13340, 0, 8192, 12288, 13312, 13344, 13345, 13340, + 0, 8192, 12288, 13312, 13344, 13345, 13340, 13342, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13344, 0, 8192, 12288, 13312, 13344, 0, 8192, + 12288, 13312, 13344, 13346, 0, 8192, 12288, 13312, + 13344, 0, 8192, 12288, 13312, 13344, 13348, 0, + 8192, 12288, 13312, 13344, 13348, 0, 8192, 12288, + 13312, 13344, 13352, 13350, 0, 8192, 12288, 13312, + 13344, 0, 8192, 12288, 13312, 13344, 13352, 0, + 8192, 12288, 13312, 13344, 13352, 0, 8192, 12288, + 13312, 13344, 13352, 13354, 0, 8192, 12288, 13312, + 13344, 13352, 0, 8192, 12288, 13312, 13344, 13360, + 13356, 0, 8192, 12288, 13312, 13344, 13360, 13356, + 0, 8192, 12288, 13312, 13344, 13360, 13361, 13358, + 0, 8192, 12288, 13312, 13344, 0, 8192, 12288, + 13312, 13376, 13360, 0, 8192, 12288, 13312, 13376, + 13360, 0, 8192, 12288, 13312, 13376, 13360, 13362, + 0, 8192, 12288, 13312, 13376, 13360, 0, 8192, + 12288, 13312, 13376, 13360, 13364, 0, 8192, 12288, + 13312, 13376, 13360, 13364, 0, 8192, 12288, 13312, + 13376, 13360, 13368, 13366, 0, 8192, 12288, 13312, + 13376, 13360, 0, 8192, 12288, 13312, 13376, 13377, + 13368, 0, 8192, 12288, 13312, 13376, 13377, 13368, + 0, 8192, 12288, 13312, 13376, 13377, 13368, 13370, + 0, 8192, 12288, 13312, 13376, 13377, 13368, 0, + 8192, 12288, 13312, 13376, 13377, 13368, 13372, 0, + 8192, 12288, 13312, 13376, 13377, 13379, 13372, 0, + 8192, 12288, 13312, 13376, 13377, 13379, 13372, 13374, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13376, 0, 8192, 12288, 13312, 13376, 0, 8192, + 12288, 13312, 13376, 13378, 0, 8192, 12288, 13312, + 13376, 0, 8192, 12288, 13312, 13376, 13380, 0, + 8192, 12288, 13312, 13376, 13380, 0, 8192, 12288, + 13312, 13376, 13384, 13382, 0, 8192, 12288, 13312, + 13376, 0, 8192, 12288, 13312, 13376, 13384, 0, + 8192, 12288, 13312, 13376, 13384, 0, 8192, 12288, + 13312, 13376, 13384, 13386, 0, 8192, 12288, 13312, + 13376, 13384, 0, 8192, 12288, 13312, 13376, 13392, + 13388, 0, 8192, 12288, 13312, 13376, 13392, 13388, + 0, 8192, 12288, 13312, 13376, 13392, 13393, 13390, + 0, 8192, 12288, 13312, 13376, 0, 8192, 12288, + 13312, 13376, 13392, 0, 8192, 12288, 13312, 13376, + 13392, 0, 8192, 12288, 13312, 13376, 13392, 13394, + 0, 8192, 12288, 13312, 13376, 13392, 0, 8192, + 12288, 13312, 13376, 13392, 13396, 0, 8192, 12288, + 13312, 13376, 13392, 13396, 0, 8192, 12288, 13312, + 13376, 13392, 13400, 13398, 0, 8192, 12288, 13312, + 13376, 13392, 0, 8192, 12288, 13312, 13376, 13408, + 13400, 0, 8192, 12288, 13312, 13376, 13408, 13400, + 0, 8192, 12288, 13312, 13376, 13408, 13400, 13402, + 0, 8192, 12288, 13312, 13376, 13408, 13400, 0, + 8192, 12288, 13312, 13376, 13408, 13409, 13404, 0, + 8192, 12288, 13312, 13376, 13408, 13409, 13404, 0, + 8192, 12288, 13312, 13376, 13408, 13409, 13404, 13406, + 0, 8192, 12288, 13312, 13376, 0, 8192, 12288, + 13312, 13440, 13408, 0, 8192, 12288, 13312, 13440, + 13408, 0, 8192, 12288, 13312, 13440, 13408, 13410, + 0, 8192, 12288, 13312, 13440, 13408, 0, 8192, + 12288, 13312, 13440, 13408, 13412, 0, 8192, 12288, + 13312, 13440, 13408, 13412, 0, 8192, 12288, 13312, + 13440, 13408, 13416, 13414, 0, 8192, 12288, 13312, + 13440, 13408, 0, 8192, 12288, 13312, 13440, 13408, + 13416, 0, 8192, 12288, 13312, 13440, 13408, 13416, + 0, 8192, 12288, 13312, 13440, 13408, 13416, 13418, + 0, 8192, 12288, 13312, 13440, 13408, 13416, 0, + 8192, 12288, 13312, 13440, 13408, 13424, 13420, 0, + 8192, 12288, 13312, 13440, 13408, 13424, 13420, 0, + 8192, 12288, 13312, 13440, 13408, 13424, 13425, 13422, + 0, 8192, 12288, 13312, 13440, 13408, 0, 8192, + 12288, 13312, 13440, 13441, 13424, 0, 8192, 12288, + 13312, 13440, 13441, 13424, 0, 8192, 12288, 13312, + 13440, 13441, 13424, 13426, 0, 8192, 12288, 13312, + 13440, 13441, 13424, 0, 8192, 12288, 13312, 13440, + 13441, 13424, 13428, 0, 8192, 12288, 13312, 13440, + 13441, 13424, 13428, 0, 8192, 12288, 13312, 13440, + 13441, 13424, 13432, 13430, 0, 8192, 12288, 13312, + 13440, 13441, 13424, 0, 8192, 12288, 13312, 13440, + 13441, 13424, 13432, 0, 8192, 12288, 13312, 13440, + 13441, 13443, 13432, 0, 8192, 12288, 13312, 13440, + 13441, 13443, 13432, 13434, 0, 8192, 12288, 13312, + 13440, 13441, 13443, 13432, 0, 8192, 12288, 13312, + 13440, 13441, 13443, 13432, 13436, 0, 8192, 12288, + 13312, 13440, 13441, 13443, 13432, 13436, 0, 8192, + 12288, 13312, 13440, 13441, 13443, 13432, 13436, 13438, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13440, 0, 8192, 12288, 13312, 13440, 0, 8192, + 12288, 13312, 13440, 13442, 0, 8192, 12288, 13312, + 13440, 0, 8192, 12288, 13312, 13440, 13444, 0, + 8192, 12288, 13312, 13440, 13444, 0, 8192, 12288, + 13312, 13440, 13448, 13446, 0, 8192, 12288, 13312, + 13440, 0, 8192, 12288, 13312, 13440, 13448, 0, + 8192, 12288, 13312, 13440, 13448, 0, 8192, 12288, + 13312, 13440, 13448, 13450, 0, 8192, 12288, 13312, + 13440, 13448, 0, 8192, 12288, 13312, 13440, 13456, + 13452, 0, 8192, 12288, 13312, 13440, 13456, 13452, + 0, 8192, 12288, 13312, 13440, 13456, 13457, 13454, + 0, 8192, 12288, 13312, 13440, 0, 8192, 12288, + 13312, 13440, 13456, 0, 8192, 12288, 13312, 13440, + 13456, 0, 8192, 12288, 13312, 13440, 13456, 13458, + 0, 8192, 12288, 13312, 13440, 13456, 0, 8192, + 12288, 13312, 13440, 13456, 13460, 0, 8192, 12288, + 13312, 13440, 13456, 13460, 0, 8192, 12288, 13312, + 13440, 13456, 13464, 13462, 0, 8192, 12288, 13312, + 13440, 13456, 0, 8192, 12288, 13312, 13440, 13472, + 13464, 0, 8192, 12288, 13312, 13440, 13472, 13464, + 0, 8192, 12288, 13312, 13440, 13472, 13464, 13466, + 0, 8192, 12288, 13312, 13440, 13472, 13464, 0, + 8192, 12288, 13312, 13440, 13472, 13473, 13468, 0, + 8192, 12288, 13312, 13440, 13472, 13473, 13468, 0, + 8192, 12288, 13312, 13440, 13472, 13473, 13468, 13470, + 0, 8192, 12288, 13312, 13440, 0, 8192, 12288, + 13312, 13440, 13472, 0, 8192, 12288, 13312, 13440, + 13472, 0, 8192, 12288, 13312, 13440, 13472, 13474, + 0, 8192, 12288, 13312, 13440, 13472, 0, 8192, + 12288, 13312, 13440, 13472, 13476, 0, 8192, 12288, + 13312, 13440, 13472, 13476, 0, 8192, 12288, 13312, + 13440, 13472, 13480, 13478, 0, 8192, 12288, 13312, + 13440, 13472, 0, 8192, 12288, 13312, 13440, 13472, + 13480, 0, 8192, 12288, 13312, 13440, 13472, 13480, + 0, 8192, 12288, 13312, 13440, 13472, 13480, 13482, + 0, 8192, 12288, 13312, 13440, 13472, 13480, 0, + 8192, 12288, 13312, 13440, 13472, 13488, 13484, 0, + 8192, 12288, 13312, 13440, 13472, 13488, 13484, 0, + 8192, 12288, 13312, 13440, 13472, 13488, 13489, 13486, + 0, 8192, 12288, 13312, 13440, 13472, 0, 8192, + 12288, 13312, 13440, 13504, 13488, 0, 8192, 12288, + 13312, 13440, 13504, 13488, 0, 8192, 12288, 13312, + 13440, 13504, 13488, 13490, 0, 8192, 12288, 13312, + 13440, 13504, 13488, 0, 8192, 12288, 13312, 13440, + 13504, 13488, 13492, 0, 8192, 12288, 13312, 13440, + 13504, 13488, 13492, 0, 8192, 12288, 13312, 13440, + 13504, 13488, 13496, 13494, 0, 8192, 12288, 13312, + 13440, 13504, 13488, 0, 8192, 12288, 13312, 13440, + 13504, 13505, 13496, 0, 8192, 12288, 13312, 13440, + 13504, 13505, 13496, 0, 8192, 12288, 13312, 13440, + 13504, 13505, 13496, 13498, 0, 8192, 12288, 13312, + 13440, 13504, 13505, 13496, 0, 8192, 12288, 13312, + 13440, 13504, 13505, 13496, 13500, 0, 8192, 12288, + 13312, 13440, 13504, 13505, 13507, 13500, 0, 8192, + 12288, 13312, 13440, 13504, 13505, 13507, 13500, 13502, + 0, 8192, 12288, 13312, 13440, 0, 8192, 12288, + 13312, 13568, 13504, 0, 8192, 12288, 13312, 13568, + 13504, 0, 8192, 12288, 13312, 13568, 13504, 13506, + 0, 8192, 12288, 13312, 13568, 13504, 0, 8192, + 12288, 13312, 13568, 13504, 13508, 0, 8192, 12288, + 13312, 13568, 13504, 13508, 0, 8192, 12288, 13312, + 13568, 13504, 13512, 13510, 0, 8192, 12288, 13312, + 13568, 13504, 0, 8192, 12288, 13312, 13568, 13504, + 13512, 0, 8192, 12288, 13312, 13568, 13504, 13512, + 0, 8192, 12288, 13312, 13568, 13504, 13512, 13514, + 0, 8192, 12288, 13312, 13568, 13504, 13512, 0, + 8192, 12288, 13312, 13568, 13504, 13520, 13516, 0, + 8192, 12288, 13312, 13568, 13504, 13520, 13516, 0, + 8192, 12288, 13312, 13568, 13504, 13520, 13521, 13518, + 0, 8192, 12288, 13312, 13568, 13504, 0, 8192, + 12288, 13312, 13568, 13504, 13520, 0, 8192, 12288, + 13312, 13568, 13504, 13520, 0, 8192, 12288, 13312, + 13568, 13504, 13520, 13522, 0, 8192, 12288, 13312, + 13568, 13504, 13520, 0, 8192, 12288, 13312, 13568, + 13504, 13520, 13524, 0, 8192, 12288, 13312, 13568, + 13504, 13520, 13524, 0, 8192, 12288, 13312, 13568, + 13504, 13520, 13528, 13526, 0, 8192, 12288, 13312, + 13568, 13504, 13520, 0, 8192, 12288, 13312, 13568, + 13504, 13536, 13528, 0, 8192, 12288, 13312, 13568, + 13504, 13536, 13528, 0, 8192, 12288, 13312, 13568, + 13504, 13536, 13528, 13530, 0, 8192, 12288, 13312, + 13568, 13504, 13536, 13528, 0, 8192, 12288, 13312, + 13568, 13504, 13536, 13537, 13532, 0, 8192, 12288, + 13312, 13568, 13504, 13536, 13537, 13532, 0, 8192, + 12288, 13312, 13568, 13504, 13536, 13537, 13532, 13534, + 0, 8192, 12288, 13312, 13568, 13504, 0, 8192, + 12288, 13312, 13568, 13569, 13536, 0, 8192, 12288, + 13312, 13568, 13569, 13536, 0, 8192, 12288, 13312, + 13568, 13569, 13536, 13538, 0, 8192, 12288, 13312, + 13568, 13569, 13536, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13540, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13540, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13544, 13542, 0, 8192, 12288, 13312, + 13568, 13569, 13536, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13544, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13544, 0, 8192, 12288, 13312, 13568, + 13569, 13536, 13544, 13546, 0, 8192, 12288, 13312, + 13568, 13569, 13536, 13544, 0, 8192, 12288, 13312, + 13568, 13569, 13536, 13552, 13548, 0, 8192, 12288, + 13312, 13568, 13569, 13536, 13552, 13548, 0, 8192, + 12288, 13312, 13568, 13569, 13536, 13552, 13553, 13550, + 0, 8192, 12288, 13312, 13568, 13569, 13536, 0, + 8192, 12288, 13312, 13568, 13569, 13536, 13552, 0, + 8192, 12288, 13312, 13568, 13569, 13571, 13552, 0, + 8192, 12288, 13312, 13568, 13569, 13571, 13552, 13554, + 0, 8192, 12288, 13312, 13568, 13569, 13571, 13552, + 0, 8192, 12288, 13312, 13568, 13569, 13571, 13552, + 13556, 0, 8192, 12288, 13312, 13568, 13569, 13571, + 13552, 13556, 0, 8192, 12288, 13312, 13568, 13569, + 13571, 13552, 13560, 13558, 0, 8192, 12288, 13312, + 13568, 13569, 13571, 13552, 0, 8192, 12288, 13312, + 13568, 13569, 13571, 13552, 13560, 0, 8192, 12288, + 13312, 13568, 13569, 13571, 13552, 13560, 0, 8192, + 12288, 13312, 13568, 13569, 13571, 13552, 13560, 13562, + 0, 8192, 12288, 13312, 13568, 13569, 13571, 13575, + 13560, 0, 8192, 12288, 13312, 13568, 13569, 13571, + 13575, 13560, 13564, 0, 8192, 12288, 13312, 13568, + 13569, 13571, 13575, 13560, 13564, 0, 8192, 12288, + 13312, 13568, 13569, 13571, 13575, 13560, 13564, 13566, + 0, 8192, 12288, 13312, 0, 8192, 12288, 13312, + 13568, 0, 8192, 12288, 13312, 13568, 0, 8192, + 12288, 13312, 13568, 13570, 0, 8192, 12288, 13312, + 13568, 0, 8192, 12288, 13312, 13568, 13572, 0, + 8192, 12288, 13312, 13568, 13572, 0, 8192, 12288, + 13312, 13568, 13576, 13574, 0, 8192, 12288, 13312, + 13568, 0, 8192, 12288, 13312, 13568, 13576, 0, + 8192, 12288, 13312, 13568, 13576, 0, 8192, 12288, + 13312, 13568, 13576, 13578, 0, 8192, 12288, 13312, + 13568, 13576, 0, 8192, 12288, 13312, 13568, 13584, + 13580, 0, 8192, 12288, 13312, 13568, 13584, 13580, + 0, 8192, 12288, 13312, 13568, 13584, 13585, 13582, + 0, 8192, 12288, 13312, 13568, 0, 8192, 12288, + 13312, 13568, 13584, 0, 8192, 12288, 13312, 13568, + 13584, 0, 8192, 12288, 13312, 13568, 13584, 13586, + 0, 8192, 12288, 13312, 13568, 13584, 0, 8192, + 12288, 13312, 13568, 13584, 13588, 0, 8192, 12288, + 13312, 13568, 13584, 13588, 0, 8192, 12288, 13312, + 13568, 13584, 13592, 13590, 0, 8192, 12288, 13312, + 13568, 13584, 0, 8192, 12288, 13312, 13568, 13600, + 13592, 0, 8192, 12288, 13312, 13568, 13600, 13592, + 0, 8192, 12288, 13312, 13568, 13600, 13592, 13594, + 0, 8192, 12288, 13312, 13568, 13600, 13592, 0, + 8192, 12288, 13312, 13568, 13600, 13601, 13596, 0, + 8192, 12288, 13312, 13568, 13600, 13601, 13596, 0, + 8192, 12288, 13312, 13568, 13600, 13601, 13596, 13598, + 0, 8192, 12288, 13312, 13568, 0, 8192, 12288, + 13312, 13568, 13600, 0, 8192, 12288, 13312, 13568, + 13600, 0, 8192, 12288, 13312, 13568, 13600, 13602, + 0, 8192, 12288, 13312, 13568, 13600, 0, 8192, + 12288, 13312, 13568, 13600, 13604, 0, 8192, 12288, + 13312, 13568, 13600, 13604, 0, 8192, 12288, 13312, + 13568, 13600, 13608, 13606, 0, 8192, 12288, 13312, + 13568, 13600, 0, 8192, 12288, 13312, 13568, 13600, + 13608, 0, 8192, 12288, 13312, 13568, 13600, 13608, + 0, 8192, 12288, 13312, 13568, 13600, 13608, 13610, + 0, 8192, 12288, 13312, 13568, 13600, 13608, 0, + 8192, 12288, 13312, 13568, 13600, 13616, 13612, 0, + 8192, 12288, 13312, 13568, 13600, 13616, 13612, 0, + 8192, 12288, 13312, 13568, 13600, 13616, 13617, 13614, + 0, 8192, 12288, 13312, 13568, 13600, 0, 8192, + 12288, 13312, 13568, 13632, 13616, 0, 8192, 12288, + 13312, 13568, 13632, 13616, 0, 8192, 12288, 13312, + 13568, 13632, 13616, 13618, 0, 8192, 12288, 13312, + 13568, 13632, 13616, 0, 8192, 12288, 13312, 13568, + 13632, 13616, 13620, 0, 8192, 12288, 13312, 13568, + 13632, 13616, 13620, 0, 8192, 12288, 13312, 13568, + 13632, 13616, 13624, 13622, 0, 8192, 12288, 13312, + 13568, 13632, 13616, 0, 8192, 12288, 13312, 13568, + 13632, 13633, 13624, 0, 8192, 12288, 13312, 13568, + 13632, 13633, 13624, 0, 8192, 12288, 13312, 13568, + 13632, 13633, 13624, 13626, 0, 8192, 12288, 13312, + 13568, 13632, 13633, 13624, 0, 8192, 12288, 13312, + 13568, 13632, 13633, 13624, 13628, 0, 8192, 12288, + 13312, 13568, 13632, 13633, 13635, 13628, 0, 8192, + 12288, 13312, 13568, 13632, 13633, 13635, 13628, 13630, + 0, 8192, 12288, 13312, 13568, 0, 8192, 12288, + 13312, 13568, 13632, 0, 8192, 12288, 13312, 13568, + 13632, 0, 8192, 12288, 13312, 13568, 13632, 13634, + 0, 8192, 12288, 13312, 13568, 13632, 0, 8192, + 12288, 13312, 13568, 13632, 13636, 0, 8192, 12288, + 13312, 13568, 13632, 13636, 0, 8192, 12288, 13312, + 13568, 13632, 13640, 13638, 0, 8192, 12288, 13312, + 13568, 13632, 0, 8192, 12288, 13312, 13568, 13632, + 13640, 0, 8192, 12288, 13312, 13568, 13632, 13640, + 0, 8192, 12288, 13312, 13568, 13632, 13640, 13642, + 0, 8192, 12288, 13312, 13568, 13632, 13640, 0, + 8192, 12288, 13312, 13568, 13632, 13648, 13644, 0, + 8192, 12288, 13312, 13568, 13632, 13648, 13644, 0, + 8192, 12288, 13312, 13568, 13632, 13648, 13649, 13646, + 0, 8192, 12288, 13312, 13568, 13632, 0, 8192, + 12288, 13312, 13568, 13632, 13648, 0, 8192, 12288, + 13312, 13568, 13632, 13648, 0, 8192, 12288, 13312, + 13568, 13632, 13648, 13650, 0, 8192, 12288, 13312, + 13568, 13632, 13648, 0, 8192, 12288, 13312, 13568, + 13632, 13648, 13652, 0, 8192, 12288, 13312, 13568, + 13632, 13648, 13652, 0, 8192, 12288, 13312, 13568, + 13632, 13648, 13656, 13654, 0, 8192, 12288, 13312, + 13568, 13632, 13648, 0, 8192, 12288, 13312, 13568, + 13632, 13664, 13656, 0, 8192, 12288, 13312, 13568, + 13632, 13664, 13656, 0, 8192, 12288, 13312, 13568, + 13632, 13664, 13656, 13658, 0, 8192, 12288, 13312, + 13568, 13632, 13664, 13656, 0, 8192, 12288, 13312, + 13568, 13632, 13664, 13665, 13660, 0, 8192, 12288, + 13312, 13568, 13632, 13664, 13665, 13660, 0, 8192, + 12288, 13312, 13568, 13632, 13664, 13665, 13660, 13662, + 0, 8192, 12288, 13312, 13568, 13632, 0, 8192, + 12288, 13312, 13568, 13696, 13664, 0, 8192, 12288, + 13312, 13568, 13696, 13664, 0, 8192, 12288, 13312, + 13568, 13696, 13664, 13666, 0, 8192, 12288, 13312, + 13568, 13696, 13664, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13668, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13668, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13672, 13670, 0, 8192, 12288, 13312, + 13568, 13696, 13664, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13672, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13672, 0, 8192, 12288, 13312, 13568, + 13696, 13664, 13672, 13674, 0, 8192, 12288, 13312, + 13568, 13696, 13664, 13672, 0, 8192, 12288, 13312, + 13568, 13696, 13664, 13680, 13676, 0, 8192, 12288, + 13312, 13568, 13696, 13664, 13680, 13676, 0, 8192, + 12288, 13312, 13568, 13696, 13664, 13680, 13681, 13678, + 0, 8192, 12288, 13312, 13568, 13696, 13664, 0, + 8192, 12288, 13312, 13568, 13696, 13697, 13680, 0, + 8192, 12288, 13312, 13568, 13696, 13697, 13680, 0, + 8192, 12288, 13312, 13568, 13696, 13697, 13680, 13682, + 0, 8192, 12288, 13312, 13568, 13696, 13697, 13680, + 0, 8192, 12288, 13312, 13568, 13696, 13697, 13680, + 13684, 0, 8192, 12288, 13312, 13568, 13696, 13697, + 13680, 13684, 0, 8192, 12288, 13312, 13568, 13696, + 13697, 13680, 13688, 13686, 0, 8192, 12288, 13312, + 13568, 13696, 13697, 13680, 0, 8192, 12288, 13312, + 13568, 13696, 13697, 13680, 13688, 0, 8192, 12288, + 13312, 13568, 13696, 13697, 13699, 13688, 0, 8192, + 12288, 13312, 13568, 13696, 13697, 13699, 13688, 13690, + 0, 8192, 12288, 13312, 13568, 13696, 13697, 13699, + 13688, 0, 8192, 12288, 13312, 13568, 13696, 13697, + 13699, 13688, 13692, 0, 8192, 12288, 13312, 13568, + 13696, 13697, 13699, 13688, 13692, 0, 8192, 12288, + 13312, 13568, 13696, 13697, 13699, 13688, 13692, 13694, + 0, 8192, 12288, 13312, 13568, 0, 8192, 12288, + 13312, 13824, 13696, 0, 8192, 12288, 13312, 13824, + 13696, 0, 8192, 12288, 13312, 13824, 13696, 13698, + 0, 8192, 12288, 13312, 13824, 13696, 0, 8192, + 12288, 13312, 13824, 13696, 13700, 0, 8192, 12288, + 13312, 13824, 13696, 13700, 0, 8192, 12288, 13312, + 13824, 13696, 13704, 13702, 0, 8192, 12288, 13312, + 13824, 13696, 0, 8192, 12288, 13312, 13824, 13696, + 13704, 0, 8192, 12288, 13312, 13824, 13696, 13704, + 0, 8192, 12288, 13312, 13824, 13696, 13704, 13706, + 0, 8192, 12288, 13312, 13824, 13696, 13704, 0, + 8192, 12288, 13312, 13824, 13696, 13712, 13708, 0, + 8192, 12288, 13312, 13824, 13696, 13712, 13708, 0, + 8192, 12288, 13312, 13824, 13696, 13712, 13713, 13710, + 0, 8192, 12288, 13312, 13824, 13696, 0, 8192, + 12288, 13312, 13824, 13696, 13712, 0, 8192, 12288, + 13312, 13824, 13696, 13712, 0, 8192, 12288, 13312, + 13824, 13696, 13712, 13714, 0, 8192, 12288, 13312, + 13824, 13696, 13712, 0, 8192, 12288, 13312, 13824, + 13696, 13712, 13716, 0, 8192, 12288, 13312, 13824, + 13696, 13712, 13716, 0, 8192, 12288, 13312, 13824, + 13696, 13712, 13720, 13718, 0, 8192, 12288, 13312, + 13824, 13696, 13712, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13720, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13720, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13720, 13722, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 13720, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 13729, 13724, 0, 8192, 12288, + 13312, 13824, 13696, 13728, 13729, 13724, 0, 8192, + 12288, 13312, 13824, 13696, 13728, 13729, 13724, 13726, + 0, 8192, 12288, 13312, 13824, 13696, 0, 8192, + 12288, 13312, 13824, 13696, 13728, 0, 8192, 12288, + 13312, 13824, 13696, 13728, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 13730, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13732, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13732, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13736, 13734, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13736, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13736, 0, 8192, 12288, 13312, 13824, + 13696, 13728, 13736, 13738, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 13736, 0, 8192, 12288, 13312, + 13824, 13696, 13728, 13744, 13740, 0, 8192, 12288, + 13312, 13824, 13696, 13728, 13744, 13740, 0, 8192, + 12288, 13312, 13824, 13696, 13728, 13744, 13745, 13742, + 0, 8192, 12288, 13312, 13824, 13696, 13728, 0, + 8192, 12288, 13312, 13824, 13696, 13760, 13744, 0, + 8192, 12288, 13312, 13824, 13696, 13760, 13744, 0, + 8192, 12288, 13312, 13824, 13696, 13760, 13744, 13746, + 0, 8192, 12288, 13312, 13824, 13696, 13760, 13744, + 0, 8192, 12288, 13312, 13824, 13696, 13760, 13744, + 13748, 0, 8192, 12288, 13312, 13824, 13696, 13760, + 13744, 13748, 0, 8192, 12288, 13312, 13824, 13696, + 13760, 13744, 13752, 13750, 0, 8192, 12288, 13312, + 13824, 13696, 13760, 13744, 0, 8192, 12288, 13312, + 13824, 13696, 13760, 13761, 13752, 0, 8192, 12288, + 13312, 13824, 13696, 13760, 13761, 13752, 0, 8192, + 12288, 13312, 13824, 13696, 13760, 13761, 13752, 13754, + 0, 8192, 12288, 13312, 13824, 13696, 13760, 13761, + 13752, 0, 8192, 12288, 13312, 13824, 13696, 13760, + 13761, 13752, 13756, 0, 8192, 12288, 13312, 13824, + 13696, 13760, 13761, 13763, 13756, 0, 8192, 12288, + 13312, 13824, 13696, 13760, 13761, 13763, 13756, 13758, + 0, 8192, 12288, 13312, 13824, 13696, 0, 8192, + 12288, 13312, 13824, 13825, 13760, 0, 8192, 12288, + 13312, 13824, 13825, 13760, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 13762, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13764, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13764, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13768, 13766, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13768, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13768, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13768, 13770, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 13768, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 13776, 13772, 0, 8192, 12288, + 13312, 13824, 13825, 13760, 13776, 13772, 0, 8192, + 12288, 13312, 13824, 13825, 13760, 13776, 13777, 13774, + 0, 8192, 12288, 13312, 13824, 13825, 13760, 0, + 8192, 12288, 13312, 13824, 13825, 13760, 13776, 0, + 8192, 12288, 13312, 13824, 13825, 13760, 13776, 0, + 8192, 12288, 13312, 13824, 13825, 13760, 13776, 13778, + 0, 8192, 12288, 13312, 13824, 13825, 13760, 13776, + 0, 8192, 12288, 13312, 13824, 13825, 13760, 13776, + 13780, 0, 8192, 12288, 13312, 13824, 13825, 13760, + 13776, 13780, 0, 8192, 12288, 13312, 13824, 13825, + 13760, 13776, 13784, 13782, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 13776, 0, 8192, 12288, 13312, + 13824, 13825, 13760, 13792, 13784, 0, 8192, 12288, + 13312, 13824, 13825, 13760, 13792, 13784, 0, 8192, + 12288, 13312, 13824, 13825, 13760, 13792, 13784, 13786, + 0, 8192, 12288, 13312, 13824, 13825, 13760, 13792, + 13784, 0, 8192, 12288, 13312, 13824, 13825, 13760, + 13792, 13793, 13788, 0, 8192, 12288, 13312, 13824, + 13825, 13760, 13792, 13793, 13788, 0, 8192, 12288, + 13312, 13824, 13825, 13760, 13792, 13793, 13788, 13790, + 0, 8192, 12288, 13312, 13824, 13825, 13760, 0, + 8192, 12288, 13312, 13824, 13825, 13760, 13792, 0, + 8192, 12288, 13312, 13824, 13825, 13827, 13792, 0, + 8192, 12288, 13312, 13824, 13825, 13827, 13792, 13794, + 0, 8192, 12288, 13312, 13824, 13825, 13827, 13792, + 0, 8192, 12288, 13312, 13824, 13825, 13827, 13792, + 13796, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13792, 13796, 0, 8192, 12288, 13312, 13824, 13825, + 13827, 13792, 13800, 13798, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13792, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13792, 13800, 0, 8192, 12288, + 13312, 13824, 13825, 13827, 13792, 13800, 0, 8192, + 12288, 13312, 13824, 13825, 13827, 13792, 13800, 13802, + 0, 8192, 12288, 13312, 13824, 13825, 13827, 13792, + 13800, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13792, 13808, 13804, 0, 8192, 12288, 13312, 13824, + 13825, 13827, 13792, 13808, 13804, 0, 8192, 12288, + 13312, 13824, 13825, 13827, 13792, 13808, 13809, 13806, + 0, 8192, 12288, 13312, 13824, 13825, 13827, 13792, + 0, 8192, 12288, 13312, 13824, 13825, 13827, 13792, + 13808, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13792, 13808, 0, 8192, 12288, 13312, 13824, 13825, + 13827, 13792, 13808, 13810, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13831, 13808, 0, 8192, 12288, + 13312, 13824, 13825, 13827, 13831, 13808, 13812, 0, + 8192, 12288, 13312, 13824, 13825, 13827, 13831, 13808, + 13812, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13831, 13808, 13816, 13814, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13831, 13808, 0, 8192, 12288, + 13312, 13824, 13825, 13827, 13831, 13808, 13816, 0, + 8192, 12288, 13312, 13824, 13825, 13827, 13831, 13808, + 13816, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13831, 13808, 13816, 13818, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13831, 13808, 13816, 0, 8192, + 12288, 13312, 13824, 13825, 13827, 13831, 13808, 13816, + 13820, 0, 8192, 12288, 13312, 13824, 13825, 13827, + 13831, 13808, 13816, 13820, 0, 8192, 12288, 13312, + 13824, 13825, 13827, 13831, 13808, 13816, 13820, 13822, + 0, 8192, 12288, 13312, 0, 8192, 12288, 14336, + 13824, 0, 8192, 12288, 14336, 13824, 0, 8192, + 12288, 14336, 13824, 13826, 0, 8192, 12288, 14336, + 13824, 0, 8192, 12288, 14336, 13824, 13828, 0, + 8192, 12288, 14336, 13824, 13828, 0, 8192, 12288, + 14336, 13824, 13832, 13830, 0, 8192, 12288, 14336, + 13824, 0, 8192, 12288, 14336, 13824, 13832, 0, + 8192, 12288, 14336, 13824, 13832, 0, 8192, 12288, + 14336, 13824, 13832, 13834, 0, 8192, 12288, 14336, + 13824, 13832, 0, 8192, 12288, 14336, 13824, 13840, + 13836, 0, 8192, 12288, 14336, 13824, 13840, 13836, + 0, 8192, 12288, 14336, 13824, 13840, 13841, 13838, + 0, 8192, 12288, 14336, 13824, 0, 8192, 12288, + 14336, 13824, 13840, 0, 8192, 12288, 14336, 13824, + 13840, 0, 8192, 12288, 14336, 13824, 13840, 13842, + 0, 8192, 12288, 14336, 13824, 13840, 0, 8192, + 12288, 14336, 13824, 13840, 13844, 0, 8192, 12288, + 14336, 13824, 13840, 13844, 0, 8192, 12288, 14336, + 13824, 13840, 13848, 13846, 0, 8192, 12288, 14336, + 13824, 13840, 0, 8192, 12288, 14336, 13824, 13856, + 13848, 0, 8192, 12288, 14336, 13824, 13856, 13848, + 0, 8192, 12288, 14336, 13824, 13856, 13848, 13850, + 0, 8192, 12288, 14336, 13824, 13856, 13848, 0, + 8192, 12288, 14336, 13824, 13856, 13857, 13852, 0, + 8192, 12288, 14336, 13824, 13856, 13857, 13852, 0, + 8192, 12288, 14336, 13824, 13856, 13857, 13852, 13854, + 0, 8192, 12288, 14336, 13824, 0, 8192, 12288, + 14336, 13824, 13856, 0, 8192, 12288, 14336, 13824, + 13856, 0, 8192, 12288, 14336, 13824, 13856, 13858, + 0, 8192, 12288, 14336, 13824, 13856, 0, 8192, + 12288, 14336, 13824, 13856, 13860, 0, 8192, 12288, + 14336, 13824, 13856, 13860, 0, 8192, 12288, 14336, + 13824, 13856, 13864, 13862, 0, 8192, 12288, 14336, + 13824, 13856, 0, 8192, 12288, 14336, 13824, 13856, + 13864, 0, 8192, 12288, 14336, 13824, 13856, 13864, + 0, 8192, 12288, 14336, 13824, 13856, 13864, 13866, + 0, 8192, 12288, 14336, 13824, 13856, 13864, 0, + 8192, 12288, 14336, 13824, 13856, 13872, 13868, 0, + 8192, 12288, 14336, 13824, 13856, 13872, 13868, 0, + 8192, 12288, 14336, 13824, 13856, 13872, 13873, 13870, + 0, 8192, 12288, 14336, 13824, 13856, 0, 8192, + 12288, 14336, 13824, 13888, 13872, 0, 8192, 12288, + 14336, 13824, 13888, 13872, 0, 8192, 12288, 14336, + 13824, 13888, 13872, 13874, 0, 8192, 12288, 14336, + 13824, 13888, 13872, 0, 8192, 12288, 14336, 13824, + 13888, 13872, 13876, 0, 8192, 12288, 14336, 13824, + 13888, 13872, 13876, 0, 8192, 12288, 14336, 13824, + 13888, 13872, 13880, 13878, 0, 8192, 12288, 14336, + 13824, 13888, 13872, 0, 8192, 12288, 14336, 13824, + 13888, 13889, 13880, 0, 8192, 12288, 14336, 13824, + 13888, 13889, 13880, 0, 8192, 12288, 14336, 13824, + 13888, 13889, 13880, 13882, 0, 8192, 12288, 14336, + 13824, 13888, 13889, 13880, 0, 8192, 12288, 14336, + 13824, 13888, 13889, 13880, 13884, 0, 8192, 12288, + 14336, 13824, 13888, 13889, 13891, 13884, 0, 8192, + 12288, 14336, 13824, 13888, 13889, 13891, 13884, 13886, + 0, 8192, 12288, 14336, 13824, 0, 8192, 12288, + 14336, 13824, 13888, 0, 8192, 12288, 14336, 13824, + 13888, 0, 8192, 12288, 14336, 13824, 13888, 13890, + 0, 8192, 12288, 14336, 13824, 13888, 0, 8192, + 12288, 14336, 13824, 13888, 13892, 0, 8192, 12288, + 14336, 13824, 13888, 13892, 0, 8192, 12288, 14336, + 13824, 13888, 13896, 13894, 0, 8192, 12288, 14336, + 13824, 13888, 0, 8192, 12288, 14336, 13824, 13888, + 13896, 0, 8192, 12288, 14336, 13824, 13888, 13896, + 0, 8192, 12288, 14336, 13824, 13888, 13896, 13898, + 0, 8192, 12288, 14336, 13824, 13888, 13896, 0, + 8192, 12288, 14336, 13824, 13888, 13904, 13900, 0, + 8192, 12288, 14336, 13824, 13888, 13904, 13900, 0, + 8192, 12288, 14336, 13824, 13888, 13904, 13905, 13902, + 0, 8192, 12288, 14336, 13824, 13888, 0, 8192, + 12288, 14336, 13824, 13888, 13904, 0, 8192, 12288, + 14336, 13824, 13888, 13904, 0, 8192, 12288, 14336, + 13824, 13888, 13904, 13906, 0, 8192, 12288, 14336, + 13824, 13888, 13904, 0, 8192, 12288, 14336, 13824, + 13888, 13904, 13908, 0, 8192, 12288, 14336, 13824, + 13888, 13904, 13908, 0, 8192, 12288, 14336, 13824, + 13888, 13904, 13912, 13910, 0, 8192, 12288, 14336, + 13824, 13888, 13904, 0, 8192, 12288, 14336, 13824, + 13888, 13920, 13912, 0, 8192, 12288, 14336, 13824, + 13888, 13920, 13912, 0, 8192, 12288, 14336, 13824, + 13888, 13920, 13912, 13914, 0, 8192, 12288, 14336, + 13824, 13888, 13920, 13912, 0, 8192, 12288, 14336, + 13824, 13888, 13920, 13921, 13916, 0, 8192, 12288, + 14336, 13824, 13888, 13920, 13921, 13916, 0, 8192, + 12288, 14336, 13824, 13888, 13920, 13921, 13916, 13918, + 0, 8192, 12288, 14336, 13824, 13888, 0, 8192, + 12288, 14336, 13824, 13952, 13920, 0, 8192, 12288, + 14336, 13824, 13952, 13920, 0, 8192, 12288, 14336, + 13824, 13952, 13920, 13922, 0, 8192, 12288, 14336, + 13824, 13952, 13920, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13924, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13924, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13928, 13926, 0, 8192, 12288, 14336, + 13824, 13952, 13920, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13928, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13928, 0, 8192, 12288, 14336, 13824, + 13952, 13920, 13928, 13930, 0, 8192, 12288, 14336, + 13824, 13952, 13920, 13928, 0, 8192, 12288, 14336, + 13824, 13952, 13920, 13936, 13932, 0, 8192, 12288, + 14336, 13824, 13952, 13920, 13936, 13932, 0, 8192, + 12288, 14336, 13824, 13952, 13920, 13936, 13937, 13934, + 0, 8192, 12288, 14336, 13824, 13952, 13920, 0, + 8192, 12288, 14336, 13824, 13952, 13953, 13936, 0, + 8192, 12288, 14336, 13824, 13952, 13953, 13936, 0, + 8192, 12288, 14336, 13824, 13952, 13953, 13936, 13938, + 0, 8192, 12288, 14336, 13824, 13952, 13953, 13936, + 0, 8192, 12288, 14336, 13824, 13952, 13953, 13936, + 13940, 0, 8192, 12288, 14336, 13824, 13952, 13953, + 13936, 13940, 0, 8192, 12288, 14336, 13824, 13952, + 13953, 13936, 13944, 13942, 0, 8192, 12288, 14336, + 13824, 13952, 13953, 13936, 0, 8192, 12288, 14336, + 13824, 13952, 13953, 13936, 13944, 0, 8192, 12288, + 14336, 13824, 13952, 13953, 13955, 13944, 0, 8192, + 12288, 14336, 13824, 13952, 13953, 13955, 13944, 13946, + 0, 8192, 12288, 14336, 13824, 13952, 13953, 13955, + 13944, 0, 8192, 12288, 14336, 13824, 13952, 13953, + 13955, 13944, 13948, 0, 8192, 12288, 14336, 13824, + 13952, 13953, 13955, 13944, 13948, 0, 8192, 12288, + 14336, 13824, 13952, 13953, 13955, 13944, 13948, 13950, + 0, 8192, 12288, 14336, 13824, 0, 8192, 12288, + 14336, 13824, 13952, 0, 8192, 12288, 14336, 13824, + 13952, 0, 8192, 12288, 14336, 13824, 13952, 13954, + 0, 8192, 12288, 14336, 13824, 13952, 0, 8192, + 12288, 14336, 13824, 13952, 13956, 0, 8192, 12288, + 14336, 13824, 13952, 13956, 0, 8192, 12288, 14336, + 13824, 13952, 13960, 13958, 0, 8192, 12288, 14336, + 13824, 13952, 0, 8192, 12288, 14336, 13824, 13952, + 13960, 0, 8192, 12288, 14336, 13824, 13952, 13960, + 0, 8192, 12288, 14336, 13824, 13952, 13960, 13962, + 0, 8192, 12288, 14336, 13824, 13952, 13960, 0, + 8192, 12288, 14336, 13824, 13952, 13968, 13964, 0, + 8192, 12288, 14336, 13824, 13952, 13968, 13964, 0, + 8192, 12288, 14336, 13824, 13952, 13968, 13969, 13966, + 0, 8192, 12288, 14336, 13824, 13952, 0, 8192, + 12288, 14336, 13824, 13952, 13968, 0, 8192, 12288, + 14336, 13824, 13952, 13968, 0, 8192, 12288, 14336, + 13824, 13952, 13968, 13970, 0, 8192, 12288, 14336, + 13824, 13952, 13968, 0, 8192, 12288, 14336, 13824, + 13952, 13968, 13972, 0, 8192, 12288, 14336, 13824, + 13952, 13968, 13972, 0, 8192, 12288, 14336, 13824, + 13952, 13968, 13976, 13974, 0, 8192, 12288, 14336, + 13824, 13952, 13968, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13976, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13976, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13976, 13978, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 13976, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 13985, 13980, 0, 8192, 12288, + 14336, 13824, 13952, 13984, 13985, 13980, 0, 8192, + 12288, 14336, 13824, 13952, 13984, 13985, 13980, 13982, + 0, 8192, 12288, 14336, 13824, 13952, 0, 8192, + 12288, 14336, 13824, 13952, 13984, 0, 8192, 12288, + 14336, 13824, 13952, 13984, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 13986, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13988, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13988, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13992, 13990, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13992, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13992, 0, 8192, 12288, 14336, 13824, + 13952, 13984, 13992, 13994, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 13992, 0, 8192, 12288, 14336, + 13824, 13952, 13984, 14000, 13996, 0, 8192, 12288, + 14336, 13824, 13952, 13984, 14000, 13996, 0, 8192, + 12288, 14336, 13824, 13952, 13984, 14000, 14001, 13998, + 0, 8192, 12288, 14336, 13824, 13952, 13984, 0, + 8192, 12288, 14336, 13824, 13952, 14016, 14000, 0, + 8192, 12288, 14336, 13824, 13952, 14016, 14000, 0, + 8192, 12288, 14336, 13824, 13952, 14016, 14000, 14002, + 0, 8192, 12288, 14336, 13824, 13952, 14016, 14000, + 0, 8192, 12288, 14336, 13824, 13952, 14016, 14000, + 14004, 0, 8192, 12288, 14336, 13824, 13952, 14016, + 14000, 14004, 0, 8192, 12288, 14336, 13824, 13952, + 14016, 14000, 14008, 14006, 0, 8192, 12288, 14336, + 13824, 13952, 14016, 14000, 0, 8192, 12288, 14336, + 13824, 13952, 14016, 14017, 14008, 0, 8192, 12288, + 14336, 13824, 13952, 14016, 14017, 14008, 0, 8192, + 12288, 14336, 13824, 13952, 14016, 14017, 14008, 14010, + 0, 8192, 12288, 14336, 13824, 13952, 14016, 14017, + 14008, 0, 8192, 12288, 14336, 13824, 13952, 14016, + 14017, 14008, 14012, 0, 8192, 12288, 14336, 13824, + 13952, 14016, 14017, 14019, 14012, 0, 8192, 12288, + 14336, 13824, 13952, 14016, 14017, 14019, 14012, 14014, + 0, 8192, 12288, 14336, 13824, 13952, 0, 8192, + 12288, 14336, 13824, 14080, 14016, 0, 8192, 12288, + 14336, 13824, 14080, 14016, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 14018, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14020, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14020, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14024, 14022, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14024, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14024, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14024, 14026, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 14024, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 14032, 14028, 0, 8192, 12288, + 14336, 13824, 14080, 14016, 14032, 14028, 0, 8192, + 12288, 14336, 13824, 14080, 14016, 14032, 14033, 14030, + 0, 8192, 12288, 14336, 13824, 14080, 14016, 0, + 8192, 12288, 14336, 13824, 14080, 14016, 14032, 0, + 8192, 12288, 14336, 13824, 14080, 14016, 14032, 0, + 8192, 12288, 14336, 13824, 14080, 14016, 14032, 14034, + 0, 8192, 12288, 14336, 13824, 14080, 14016, 14032, + 0, 8192, 12288, 14336, 13824, 14080, 14016, 14032, + 14036, 0, 8192, 12288, 14336, 13824, 14080, 14016, + 14032, 14036, 0, 8192, 12288, 14336, 13824, 14080, + 14016, 14032, 14040, 14038, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 14032, 0, 8192, 12288, 14336, + 13824, 14080, 14016, 14048, 14040, 0, 8192, 12288, + 14336, 13824, 14080, 14016, 14048, 14040, 0, 8192, + 12288, 14336, 13824, 14080, 14016, 14048, 14040, 14042, + 0, 8192, 12288, 14336, 13824, 14080, 14016, 14048, + 14040, 0, 8192, 12288, 14336, 13824, 14080, 14016, + 14048, 14049, 14044, 0, 8192, 12288, 14336, 13824, + 14080, 14016, 14048, 14049, 14044, 0, 8192, 12288, + 14336, 13824, 14080, 14016, 14048, 14049, 14044, 14046, + 0, 8192, 12288, 14336, 13824, 14080, 14016, 0, + 8192, 12288, 14336, 13824, 14080, 14081, 14048, 0, + 8192, 12288, 14336, 13824, 14080, 14081, 14048, 0, + 8192, 12288, 14336, 13824, 14080, 14081, 14048, 14050, + 0, 8192, 12288, 14336, 13824, 14080, 14081, 14048, + 0, 8192, 12288, 14336, 13824, 14080, 14081, 14048, + 14052, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14048, 14052, 0, 8192, 12288, 14336, 13824, 14080, + 14081, 14048, 14056, 14054, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14048, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14048, 14056, 0, 8192, 12288, + 14336, 13824, 14080, 14081, 14048, 14056, 0, 8192, + 12288, 14336, 13824, 14080, 14081, 14048, 14056, 14058, + 0, 8192, 12288, 14336, 13824, 14080, 14081, 14048, + 14056, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14048, 14064, 14060, 0, 8192, 12288, 14336, 13824, + 14080, 14081, 14048, 14064, 14060, 0, 8192, 12288, + 14336, 13824, 14080, 14081, 14048, 14064, 14065, 14062, + 0, 8192, 12288, 14336, 13824, 14080, 14081, 14048, + 0, 8192, 12288, 14336, 13824, 14080, 14081, 14048, + 14064, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14083, 14064, 0, 8192, 12288, 14336, 13824, 14080, + 14081, 14083, 14064, 14066, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14083, 14064, 0, 8192, 12288, + 14336, 13824, 14080, 14081, 14083, 14064, 14068, 0, + 8192, 12288, 14336, 13824, 14080, 14081, 14083, 14064, + 14068, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14083, 14064, 14072, 14070, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14083, 14064, 0, 8192, 12288, + 14336, 13824, 14080, 14081, 14083, 14064, 14072, 0, + 8192, 12288, 14336, 13824, 14080, 14081, 14083, 14064, + 14072, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14083, 14064, 14072, 14074, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14083, 14087, 14072, 0, 8192, + 12288, 14336, 13824, 14080, 14081, 14083, 14087, 14072, + 14076, 0, 8192, 12288, 14336, 13824, 14080, 14081, + 14083, 14087, 14072, 14076, 0, 8192, 12288, 14336, + 13824, 14080, 14081, 14083, 14087, 14072, 14076, 14078, + 0, 8192, 12288, 14336, 13824, 0, 8192, 12288, + 14336, 13824, 14080, 0, 8192, 12288, 14336, 14337, + 14080, 0, 8192, 12288, 14336, 14337, 14080, 14082, + 0, 8192, 12288, 14336, 14337, 14080, 0, 8192, + 12288, 14336, 14337, 14080, 14084, 0, 8192, 12288, + 14336, 14337, 14080, 14084, 0, 8192, 12288, 14336, + 14337, 14080, 14088, 14086, 0, 8192, 12288, 14336, + 14337, 14080, 0, 8192, 12288, 14336, 14337, 14080, + 14088, 0, 8192, 12288, 14336, 14337, 14080, 14088, + 0, 8192, 12288, 14336, 14337, 14080, 14088, 14090, + 0, 8192, 12288, 14336, 14337, 14080, 14088, 0, + 8192, 12288, 14336, 14337, 14080, 14096, 14092, 0, + 8192, 12288, 14336, 14337, 14080, 14096, 14092, 0, + 8192, 12288, 14336, 14337, 14080, 14096, 14097, 14094, + 0, 8192, 12288, 14336, 14337, 14080, 0, 8192, + 12288, 14336, 14337, 14080, 14096, 0, 8192, 12288, + 14336, 14337, 14080, 14096, 0, 8192, 12288, 14336, + 14337, 14080, 14096, 14098, 0, 8192, 12288, 14336, + 14337, 14080, 14096, 0, 8192, 12288, 14336, 14337, + 14080, 14096, 14100, 0, 8192, 12288, 14336, 14337, + 14080, 14096, 14100, 0, 8192, 12288, 14336, 14337, + 14080, 14096, 14104, 14102, 0, 8192, 12288, 14336, + 14337, 14080, 14096, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14104, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14104, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14104, 14106, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 14104, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 14113, 14108, 0, 8192, 12288, + 14336, 14337, 14080, 14112, 14113, 14108, 0, 8192, + 12288, 14336, 14337, 14080, 14112, 14113, 14108, 14110, + 0, 8192, 12288, 14336, 14337, 14080, 0, 8192, + 12288, 14336, 14337, 14080, 14112, 0, 8192, 12288, + 14336, 14337, 14080, 14112, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 14114, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14116, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14116, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14120, 14118, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14120, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14120, 0, 8192, 12288, 14336, 14337, + 14080, 14112, 14120, 14122, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 14120, 0, 8192, 12288, 14336, + 14337, 14080, 14112, 14128, 14124, 0, 8192, 12288, + 14336, 14337, 14080, 14112, 14128, 14124, 0, 8192, + 12288, 14336, 14337, 14080, 14112, 14128, 14129, 14126, + 0, 8192, 12288, 14336, 14337, 14080, 14112, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14128, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14128, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14128, 14130, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14128, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14128, + 14132, 0, 8192, 12288, 14336, 14337, 14080, 14144, + 14128, 14132, 0, 8192, 12288, 14336, 14337, 14080, + 14144, 14128, 14136, 14134, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14128, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14145, 14136, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 14145, 14136, 0, 8192, + 12288, 14336, 14337, 14080, 14144, 14145, 14136, 14138, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14145, + 14136, 0, 8192, 12288, 14336, 14337, 14080, 14144, + 14145, 14136, 14140, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14145, 14147, 14140, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 14145, 14147, 14140, 14142, + 0, 8192, 12288, 14336, 14337, 14080, 0, 8192, + 12288, 14336, 14337, 14080, 14144, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14146, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14148, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14148, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14152, 14150, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14152, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14152, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14152, 14154, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14152, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14160, 14156, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 14160, 14156, 0, 8192, + 12288, 14336, 14337, 14080, 14144, 14160, 14161, 14158, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14160, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14160, 0, + 8192, 12288, 14336, 14337, 14080, 14144, 14160, 14162, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14160, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14160, + 14164, 0, 8192, 12288, 14336, 14337, 14080, 14144, + 14160, 14164, 0, 8192, 12288, 14336, 14337, 14080, + 14144, 14160, 14168, 14166, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14160, 0, 8192, 12288, 14336, + 14337, 14080, 14144, 14176, 14168, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 14176, 14168, 0, 8192, + 12288, 14336, 14337, 14080, 14144, 14176, 14168, 14170, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 14176, + 14168, 0, 8192, 12288, 14336, 14337, 14080, 14144, + 14176, 14177, 14172, 0, 8192, 12288, 14336, 14337, + 14080, 14144, 14176, 14177, 14172, 0, 8192, 12288, + 14336, 14337, 14080, 14144, 14176, 14177, 14172, 14174, + 0, 8192, 12288, 14336, 14337, 14080, 14144, 0, + 8192, 12288, 14336, 14337, 14080, 14208, 14176, 0, + 8192, 12288, 14336, 14337, 14080, 14208, 14176, 0, + 8192, 12288, 14336, 14337, 14080, 14208, 14176, 14178, + 0, 8192, 12288, 14336, 14337, 14080, 14208, 14176, + 0, 8192, 12288, 14336, 14337, 14080, 14208, 14176, + 14180, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14176, 14180, 0, 8192, 12288, 14336, 14337, 14080, + 14208, 14176, 14184, 14182, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14176, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14176, 14184, 0, 8192, 12288, + 14336, 14337, 14080, 14208, 14176, 14184, 0, 8192, + 12288, 14336, 14337, 14080, 14208, 14176, 14184, 14186, + 0, 8192, 12288, 14336, 14337, 14080, 14208, 14176, + 14184, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14176, 14192, 14188, 0, 8192, 12288, 14336, 14337, + 14080, 14208, 14176, 14192, 14188, 0, 8192, 12288, + 14336, 14337, 14080, 14208, 14176, 14192, 14193, 14190, + 0, 8192, 12288, 14336, 14337, 14080, 14208, 14176, + 0, 8192, 12288, 14336, 14337, 14080, 14208, 14209, + 14192, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14209, 14192, 0, 8192, 12288, 14336, 14337, 14080, + 14208, 14209, 14192, 14194, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14209, 14192, 0, 8192, 12288, + 14336, 14337, 14080, 14208, 14209, 14192, 14196, 0, + 8192, 12288, 14336, 14337, 14080, 14208, 14209, 14192, + 14196, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14209, 14192, 14200, 14198, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14209, 14192, 0, 8192, 12288, + 14336, 14337, 14080, 14208, 14209, 14192, 14200, 0, + 8192, 12288, 14336, 14337, 14080, 14208, 14209, 14211, + 14200, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14209, 14211, 14200, 14202, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14209, 14211, 14200, 0, 8192, + 12288, 14336, 14337, 14080, 14208, 14209, 14211, 14200, + 14204, 0, 8192, 12288, 14336, 14337, 14080, 14208, + 14209, 14211, 14200, 14204, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14209, 14211, 14200, 14204, 14206, + 0, 8192, 12288, 14336, 14337, 14080, 0, 8192, + 12288, 14336, 14337, 14080, 14208, 0, 8192, 12288, + 14336, 14337, 14080, 14208, 0, 8192, 12288, 14336, + 14337, 14080, 14208, 14210, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14212, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14212, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14216, 14214, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14216, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14216, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14216, 14218, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14216, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14224, 14220, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14224, 14220, 0, 8192, + 12288, 14336, 14337, 14339, 14208, 14224, 14225, 14222, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14224, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14224, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14224, 14226, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14224, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14224, + 14228, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14224, 14228, 0, 8192, 12288, 14336, 14337, 14339, + 14208, 14224, 14232, 14230, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14224, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14240, 14232, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14240, 14232, 0, 8192, + 12288, 14336, 14337, 14339, 14208, 14240, 14232, 14234, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14240, + 14232, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14240, 14241, 14236, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14240, 14241, 14236, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14240, 14241, 14236, 14238, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14240, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14240, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14240, 14242, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14240, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14240, + 14244, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14240, 14244, 0, 8192, 12288, 14336, 14337, 14339, + 14208, 14240, 14248, 14246, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14240, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14240, 14248, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14240, 14248, 0, 8192, + 12288, 14336, 14337, 14339, 14208, 14240, 14248, 14250, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14240, + 14248, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14240, 14256, 14252, 0, 8192, 12288, 14336, 14337, + 14339, 14208, 14240, 14256, 14252, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14240, 14256, 14257, 14254, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14240, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14272, + 14256, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14272, 14256, 0, 8192, 12288, 14336, 14337, 14339, + 14208, 14272, 14256, 14258, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14272, 14256, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14272, 14256, 14260, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14272, 14256, + 14260, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14272, 14256, 14264, 14262, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14272, 14256, 0, 8192, 12288, + 14336, 14337, 14339, 14208, 14272, 14273, 14264, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14272, 14273, + 14264, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14272, 14273, 14264, 14266, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14272, 14273, 14264, 0, 8192, + 12288, 14336, 14337, 14339, 14208, 14272, 14273, 14264, + 14268, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14272, 14273, 14275, 14268, 0, 8192, 12288, 14336, + 14337, 14339, 14208, 14272, 14273, 14275, 14268, 14270, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14272, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14272, 0, + 8192, 12288, 14336, 14337, 14339, 14208, 14272, 14274, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14272, + 0, 8192, 12288, 14336, 14337, 14339, 14208, 14272, + 14276, 0, 8192, 12288, 14336, 14337, 14339, 14208, + 14272, 14276, 0, 8192, 12288, 14336, 14337, 14339, + 14208, 14272, 14280, 14278, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14280, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14280, 0, 8192, + 12288, 14336, 14337, 14339, 14343, 14272, 14280, 14282, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14272, + 14280, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14288, 14284, 0, 8192, 12288, 14336, 14337, + 14339, 14343, 14272, 14288, 14284, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14288, 14289, 14286, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14272, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14272, + 14288, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14288, 0, 8192, 12288, 14336, 14337, 14339, + 14343, 14272, 14288, 14290, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14288, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14288, 14292, 0, + 8192, 12288, 14336, 14337, 14339, 14343, 14272, 14288, + 14292, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14288, 14296, 14294, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14288, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14304, 14296, 0, + 8192, 12288, 14336, 14337, 14339, 14343, 14272, 14304, + 14296, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 14296, 14298, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 14296, 0, 8192, + 12288, 14336, 14337, 14339, 14343, 14272, 14304, 14305, + 14300, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 14305, 14300, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 14305, 14300, 14302, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14272, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14272, + 14304, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 0, 8192, 12288, 14336, 14337, 14339, + 14343, 14272, 14304, 14306, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14304, 14308, 0, + 8192, 12288, 14336, 14337, 14339, 14343, 14272, 14304, + 14308, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 14312, 14310, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14272, 14304, 14312, 0, + 8192, 12288, 14336, 14337, 14339, 14343, 14272, 14304, + 14312, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 14312, 14314, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 14312, 0, 8192, + 12288, 14336, 14337, 14339, 14343, 14272, 14304, 14320, + 14316, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14272, 14304, 14320, 14316, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14272, 14304, 14320, 14321, 14318, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14351, + 14304, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14351, 14304, 14320, 0, 8192, 12288, 14336, 14337, + 14339, 14343, 14351, 14304, 14320, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14351, 14304, 14320, 14322, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14351, + 14304, 14320, 0, 8192, 12288, 14336, 14337, 14339, + 14343, 14351, 14304, 14320, 14324, 0, 8192, 12288, + 14336, 14337, 14339, 14343, 14351, 14304, 14320, 14324, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14351, + 14304, 14320, 14328, 14326, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14351, 14304, 14320, 0, 8192, + 12288, 14336, 14337, 14339, 14343, 14351, 14304, 14320, + 14328, 0, 8192, 12288, 14336, 14337, 14339, 14343, + 14351, 14304, 14320, 14328, 0, 8192, 12288, 14336, + 14337, 14339, 14343, 14351, 14304, 14320, 14328, 14330, + 0, 8192, 12288, 14336, 14337, 14339, 14343, 14351, + 14304, 14320, 14328, 0, 8192, 12288, 14336, 14337, + 14339, 14343, 14351, 14304, 14320, 14328, 14332, 0, + 8192, 12288, 14336, 14337, 14339, 14343, 14351, 14304, + 14320, 14328, 14332, 0, 8192, 12288, 14336, 14337, + 14339, 14343, 14351, 14304, 14320, 14328, 14332, 14334, + 0, 8192, 12288, 0, 8192, 12288, 14336, 0, + 8192, 12288, 14336, 0, 8192, 12288, 14336, 14338, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14340, 0, 8192, 12288, 14336, 14340, 0, 8192, + 12288, 14336, 14344, 14342, 0, 8192, 12288, 14336, + 0, 8192, 12288, 14336, 14344, 0, 8192, 12288, + 14336, 14344, 0, 8192, 12288, 14336, 14344, 14346, + 0, 8192, 12288, 14336, 14344, 0, 8192, 12288, + 14336, 14352, 14348, 0, 8192, 12288, 14336, 14352, + 14348, 0, 8192, 12288, 14336, 14352, 14353, 14350, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14352, 0, 8192, 12288, 14336, 14352, 0, 8192, + 12288, 14336, 14352, 14354, 0, 8192, 12288, 14336, + 14352, 0, 8192, 12288, 14336, 14352, 14356, 0, + 8192, 12288, 14336, 14352, 14356, 0, 8192, 12288, + 14336, 14352, 14360, 14358, 0, 8192, 12288, 14336, + 14352, 0, 8192, 12288, 14336, 14368, 14360, 0, + 8192, 12288, 14336, 14368, 14360, 0, 8192, 12288, + 14336, 14368, 14360, 14362, 0, 8192, 12288, 14336, + 14368, 14360, 0, 8192, 12288, 14336, 14368, 14369, + 14364, 0, 8192, 12288, 14336, 14368, 14369, 14364, + 0, 8192, 12288, 14336, 14368, 14369, 14364, 14366, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14368, 0, 8192, 12288, 14336, 14368, 0, 8192, + 12288, 14336, 14368, 14370, 0, 8192, 12288, 14336, + 14368, 0, 8192, 12288, 14336, 14368, 14372, 0, + 8192, 12288, 14336, 14368, 14372, 0, 8192, 12288, + 14336, 14368, 14376, 14374, 0, 8192, 12288, 14336, + 14368, 0, 8192, 12288, 14336, 14368, 14376, 0, + 8192, 12288, 14336, 14368, 14376, 0, 8192, 12288, + 14336, 14368, 14376, 14378, 0, 8192, 12288, 14336, + 14368, 14376, 0, 8192, 12288, 14336, 14368, 14384, + 14380, 0, 8192, 12288, 14336, 14368, 14384, 14380, + 0, 8192, 12288, 14336, 14368, 14384, 14385, 14382, + 0, 8192, 12288, 14336, 14368, 0, 8192, 12288, + 14336, 14400, 14384, 0, 8192, 12288, 14336, 14400, + 14384, 0, 8192, 12288, 14336, 14400, 14384, 14386, + 0, 8192, 12288, 14336, 14400, 14384, 0, 8192, + 12288, 14336, 14400, 14384, 14388, 0, 8192, 12288, + 14336, 14400, 14384, 14388, 0, 8192, 12288, 14336, + 14400, 14384, 14392, 14390, 0, 8192, 12288, 14336, + 14400, 14384, 0, 8192, 12288, 14336, 14400, 14401, + 14392, 0, 8192, 12288, 14336, 14400, 14401, 14392, + 0, 8192, 12288, 14336, 14400, 14401, 14392, 14394, + 0, 8192, 12288, 14336, 14400, 14401, 14392, 0, + 8192, 12288, 14336, 14400, 14401, 14392, 14396, 0, + 8192, 12288, 14336, 14400, 14401, 14403, 14396, 0, + 8192, 12288, 14336, 14400, 14401, 14403, 14396, 14398, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14400, 0, 8192, 12288, 14336, 14400, 0, 8192, + 12288, 14336, 14400, 14402, 0, 8192, 12288, 14336, + 14400, 0, 8192, 12288, 14336, 14400, 14404, 0, + 8192, 12288, 14336, 14400, 14404, 0, 8192, 12288, + 14336, 14400, 14408, 14406, 0, 8192, 12288, 14336, + 14400, 0, 8192, 12288, 14336, 14400, 14408, 0, + 8192, 12288, 14336, 14400, 14408, 0, 8192, 12288, + 14336, 14400, 14408, 14410, 0, 8192, 12288, 14336, + 14400, 14408, 0, 8192, 12288, 14336, 14400, 14416, + 14412, 0, 8192, 12288, 14336, 14400, 14416, 14412, + 0, 8192, 12288, 14336, 14400, 14416, 14417, 14414, + 0, 8192, 12288, 14336, 14400, 0, 8192, 12288, + 14336, 14400, 14416, 0, 8192, 12288, 14336, 14400, + 14416, 0, 8192, 12288, 14336, 14400, 14416, 14418, + 0, 8192, 12288, 14336, 14400, 14416, 0, 8192, + 12288, 14336, 14400, 14416, 14420, 0, 8192, 12288, + 14336, 14400, 14416, 14420, 0, 8192, 12288, 14336, + 14400, 14416, 14424, 14422, 0, 8192, 12288, 14336, + 14400, 14416, 0, 8192, 12288, 14336, 14400, 14432, + 14424, 0, 8192, 12288, 14336, 14400, 14432, 14424, + 0, 8192, 12288, 14336, 14400, 14432, 14424, 14426, + 0, 8192, 12288, 14336, 14400, 14432, 14424, 0, + 8192, 12288, 14336, 14400, 14432, 14433, 14428, 0, + 8192, 12288, 14336, 14400, 14432, 14433, 14428, 0, + 8192, 12288, 14336, 14400, 14432, 14433, 14428, 14430, + 0, 8192, 12288, 14336, 14400, 0, 8192, 12288, + 14336, 14464, 14432, 0, 8192, 12288, 14336, 14464, + 14432, 0, 8192, 12288, 14336, 14464, 14432, 14434, + 0, 8192, 12288, 14336, 14464, 14432, 0, 8192, + 12288, 14336, 14464, 14432, 14436, 0, 8192, 12288, + 14336, 14464, 14432, 14436, 0, 8192, 12288, 14336, + 14464, 14432, 14440, 14438, 0, 8192, 12288, 14336, + 14464, 14432, 0, 8192, 12288, 14336, 14464, 14432, + 14440, 0, 8192, 12288, 14336, 14464, 14432, 14440, + 0, 8192, 12288, 14336, 14464, 14432, 14440, 14442, + 0, 8192, 12288, 14336, 14464, 14432, 14440, 0, + 8192, 12288, 14336, 14464, 14432, 14448, 14444, 0, + 8192, 12288, 14336, 14464, 14432, 14448, 14444, 0, + 8192, 12288, 14336, 14464, 14432, 14448, 14449, 14446, + 0, 8192, 12288, 14336, 14464, 14432, 0, 8192, + 12288, 14336, 14464, 14465, 14448, 0, 8192, 12288, + 14336, 14464, 14465, 14448, 0, 8192, 12288, 14336, + 14464, 14465, 14448, 14450, 0, 8192, 12288, 14336, + 14464, 14465, 14448, 0, 8192, 12288, 14336, 14464, + 14465, 14448, 14452, 0, 8192, 12288, 14336, 14464, + 14465, 14448, 14452, 0, 8192, 12288, 14336, 14464, + 14465, 14448, 14456, 14454, 0, 8192, 12288, 14336, + 14464, 14465, 14448, 0, 8192, 12288, 14336, 14464, + 14465, 14448, 14456, 0, 8192, 12288, 14336, 14464, + 14465, 14467, 14456, 0, 8192, 12288, 14336, 14464, + 14465, 14467, 14456, 14458, 0, 8192, 12288, 14336, + 14464, 14465, 14467, 14456, 0, 8192, 12288, 14336, + 14464, 14465, 14467, 14456, 14460, 0, 8192, 12288, + 14336, 14464, 14465, 14467, 14456, 14460, 0, 8192, + 12288, 14336, 14464, 14465, 14467, 14456, 14460, 14462, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14464, 0, 8192, 12288, 14336, 14464, 0, 8192, + 12288, 14336, 14464, 14466, 0, 8192, 12288, 14336, + 14464, 0, 8192, 12288, 14336, 14464, 14468, 0, + 8192, 12288, 14336, 14464, 14468, 0, 8192, 12288, + 14336, 14464, 14472, 14470, 0, 8192, 12288, 14336, + 14464, 0, 8192, 12288, 14336, 14464, 14472, 0, + 8192, 12288, 14336, 14464, 14472, 0, 8192, 12288, + 14336, 14464, 14472, 14474, 0, 8192, 12288, 14336, + 14464, 14472, 0, 8192, 12288, 14336, 14464, 14480, + 14476, 0, 8192, 12288, 14336, 14464, 14480, 14476, + 0, 8192, 12288, 14336, 14464, 14480, 14481, 14478, + 0, 8192, 12288, 14336, 14464, 0, 8192, 12288, + 14336, 14464, 14480, 0, 8192, 12288, 14336, 14464, + 14480, 0, 8192, 12288, 14336, 14464, 14480, 14482, + 0, 8192, 12288, 14336, 14464, 14480, 0, 8192, + 12288, 14336, 14464, 14480, 14484, 0, 8192, 12288, + 14336, 14464, 14480, 14484, 0, 8192, 12288, 14336, + 14464, 14480, 14488, 14486, 0, 8192, 12288, 14336, + 14464, 14480, 0, 8192, 12288, 14336, 14464, 14496, + 14488, 0, 8192, 12288, 14336, 14464, 14496, 14488, + 0, 8192, 12288, 14336, 14464, 14496, 14488, 14490, + 0, 8192, 12288, 14336, 14464, 14496, 14488, 0, + 8192, 12288, 14336, 14464, 14496, 14497, 14492, 0, + 8192, 12288, 14336, 14464, 14496, 14497, 14492, 0, + 8192, 12288, 14336, 14464, 14496, 14497, 14492, 14494, + 0, 8192, 12288, 14336, 14464, 0, 8192, 12288, + 14336, 14464, 14496, 0, 8192, 12288, 14336, 14464, + 14496, 0, 8192, 12288, 14336, 14464, 14496, 14498, + 0, 8192, 12288, 14336, 14464, 14496, 0, 8192, + 12288, 14336, 14464, 14496, 14500, 0, 8192, 12288, + 14336, 14464, 14496, 14500, 0, 8192, 12288, 14336, + 14464, 14496, 14504, 14502, 0, 8192, 12288, 14336, + 14464, 14496, 0, 8192, 12288, 14336, 14464, 14496, + 14504, 0, 8192, 12288, 14336, 14464, 14496, 14504, + 0, 8192, 12288, 14336, 14464, 14496, 14504, 14506, + 0, 8192, 12288, 14336, 14464, 14496, 14504, 0, + 8192, 12288, 14336, 14464, 14496, 14512, 14508, 0, + 8192, 12288, 14336, 14464, 14496, 14512, 14508, 0, + 8192, 12288, 14336, 14464, 14496, 14512, 14513, 14510, + 0, 8192, 12288, 14336, 14464, 14496, 0, 8192, + 12288, 14336, 14464, 14528, 14512, 0, 8192, 12288, + 14336, 14464, 14528, 14512, 0, 8192, 12288, 14336, + 14464, 14528, 14512, 14514, 0, 8192, 12288, 14336, + 14464, 14528, 14512, 0, 8192, 12288, 14336, 14464, + 14528, 14512, 14516, 0, 8192, 12288, 14336, 14464, + 14528, 14512, 14516, 0, 8192, 12288, 14336, 14464, + 14528, 14512, 14520, 14518, 0, 8192, 12288, 14336, + 14464, 14528, 14512, 0, 8192, 12288, 14336, 14464, + 14528, 14529, 14520, 0, 8192, 12288, 14336, 14464, + 14528, 14529, 14520, 0, 8192, 12288, 14336, 14464, + 14528, 14529, 14520, 14522, 0, 8192, 12288, 14336, + 14464, 14528, 14529, 14520, 0, 8192, 12288, 14336, + 14464, 14528, 14529, 14520, 14524, 0, 8192, 12288, + 14336, 14464, 14528, 14529, 14531, 14524, 0, 8192, + 12288, 14336, 14464, 14528, 14529, 14531, 14524, 14526, + 0, 8192, 12288, 14336, 14464, 0, 8192, 12288, + 14336, 14592, 14528, 0, 8192, 12288, 14336, 14592, + 14528, 0, 8192, 12288, 14336, 14592, 14528, 14530, + 0, 8192, 12288, 14336, 14592, 14528, 0, 8192, + 12288, 14336, 14592, 14528, 14532, 0, 8192, 12288, + 14336, 14592, 14528, 14532, 0, 8192, 12288, 14336, + 14592, 14528, 14536, 14534, 0, 8192, 12288, 14336, + 14592, 14528, 0, 8192, 12288, 14336, 14592, 14528, + 14536, 0, 8192, 12288, 14336, 14592, 14528, 14536, + 0, 8192, 12288, 14336, 14592, 14528, 14536, 14538, + 0, 8192, 12288, 14336, 14592, 14528, 14536, 0, + 8192, 12288, 14336, 14592, 14528, 14544, 14540, 0, + 8192, 12288, 14336, 14592, 14528, 14544, 14540, 0, + 8192, 12288, 14336, 14592, 14528, 14544, 14545, 14542, + 0, 8192, 12288, 14336, 14592, 14528, 0, 8192, + 12288, 14336, 14592, 14528, 14544, 0, 8192, 12288, + 14336, 14592, 14528, 14544, 0, 8192, 12288, 14336, + 14592, 14528, 14544, 14546, 0, 8192, 12288, 14336, + 14592, 14528, 14544, 0, 8192, 12288, 14336, 14592, + 14528, 14544, 14548, 0, 8192, 12288, 14336, 14592, + 14528, 14544, 14548, 0, 8192, 12288, 14336, 14592, + 14528, 14544, 14552, 14550, 0, 8192, 12288, 14336, + 14592, 14528, 14544, 0, 8192, 12288, 14336, 14592, + 14528, 14560, 14552, 0, 8192, 12288, 14336, 14592, + 14528, 14560, 14552, 0, 8192, 12288, 14336, 14592, + 14528, 14560, 14552, 14554, 0, 8192, 12288, 14336, + 14592, 14528, 14560, 14552, 0, 8192, 12288, 14336, + 14592, 14528, 14560, 14561, 14556, 0, 8192, 12288, + 14336, 14592, 14528, 14560, 14561, 14556, 0, 8192, + 12288, 14336, 14592, 14528, 14560, 14561, 14556, 14558, + 0, 8192, 12288, 14336, 14592, 14528, 0, 8192, + 12288, 14336, 14592, 14593, 14560, 0, 8192, 12288, + 14336, 14592, 14593, 14560, 0, 8192, 12288, 14336, + 14592, 14593, 14560, 14562, 0, 8192, 12288, 14336, + 14592, 14593, 14560, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14564, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14564, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14568, 14566, 0, 8192, 12288, 14336, + 14592, 14593, 14560, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14568, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14568, 0, 8192, 12288, 14336, 14592, + 14593, 14560, 14568, 14570, 0, 8192, 12288, 14336, + 14592, 14593, 14560, 14568, 0, 8192, 12288, 14336, + 14592, 14593, 14560, 14576, 14572, 0, 8192, 12288, + 14336, 14592, 14593, 14560, 14576, 14572, 0, 8192, + 12288, 14336, 14592, 14593, 14560, 14576, 14577, 14574, + 0, 8192, 12288, 14336, 14592, 14593, 14560, 0, + 8192, 12288, 14336, 14592, 14593, 14560, 14576, 0, + 8192, 12288, 14336, 14592, 14593, 14595, 14576, 0, + 8192, 12288, 14336, 14592, 14593, 14595, 14576, 14578, + 0, 8192, 12288, 14336, 14592, 14593, 14595, 14576, + 0, 8192, 12288, 14336, 14592, 14593, 14595, 14576, + 14580, 0, 8192, 12288, 14336, 14592, 14593, 14595, + 14576, 14580, 0, 8192, 12288, 14336, 14592, 14593, + 14595, 14576, 14584, 14582, 0, 8192, 12288, 14336, + 14592, 14593, 14595, 14576, 0, 8192, 12288, 14336, + 14592, 14593, 14595, 14576, 14584, 0, 8192, 12288, + 14336, 14592, 14593, 14595, 14576, 14584, 0, 8192, + 12288, 14336, 14592, 14593, 14595, 14576, 14584, 14586, + 0, 8192, 12288, 14336, 14592, 14593, 14595, 14599, + 14584, 0, 8192, 12288, 14336, 14592, 14593, 14595, + 14599, 14584, 14588, 0, 8192, 12288, 14336, 14592, + 14593, 14595, 14599, 14584, 14588, 0, 8192, 12288, + 14336, 14592, 14593, 14595, 14599, 14584, 14588, 14590, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14592, 0, 8192, 12288, 14336, 14592, 0, 8192, + 12288, 14336, 14592, 14594, 0, 8192, 12288, 14336, + 14592, 0, 8192, 12288, 14336, 14592, 14596, 0, + 8192, 12288, 14336, 14592, 14596, 0, 8192, 12288, + 14336, 14592, 14600, 14598, 0, 8192, 12288, 14336, + 14592, 0, 8192, 12288, 14336, 14592, 14600, 0, + 8192, 12288, 14336, 14592, 14600, 0, 8192, 12288, + 14336, 14592, 14600, 14602, 0, 8192, 12288, 14336, + 14592, 14600, 0, 8192, 12288, 14336, 14592, 14608, + 14604, 0, 8192, 12288, 14336, 14592, 14608, 14604, + 0, 8192, 12288, 14336, 14592, 14608, 14609, 14606, + 0, 8192, 12288, 14336, 14592, 0, 8192, 12288, + 14336, 14592, 14608, 0, 8192, 12288, 14336, 14592, + 14608, 0, 8192, 12288, 14336, 14592, 14608, 14610, + 0, 8192, 12288, 14336, 14592, 14608, 0, 8192, + 12288, 14336, 14592, 14608, 14612, 0, 8192, 12288, + 14336, 14592, 14608, 14612, 0, 8192, 12288, 14336, + 14592, 14608, 14616, 14614, 0, 8192, 12288, 14336, + 14592, 14608, 0, 8192, 12288, 14336, 14592, 14624, + 14616, 0, 8192, 12288, 14336, 14592, 14624, 14616, + 0, 8192, 12288, 14336, 14592, 14624, 14616, 14618, + 0, 8192, 12288, 14336, 14592, 14624, 14616, 0, + 8192, 12288, 14336, 14592, 14624, 14625, 14620, 0, + 8192, 12288, 14336, 14592, 14624, 14625, 14620, 0, + 8192, 12288, 14336, 14592, 14624, 14625, 14620, 14622, + 0, 8192, 12288, 14336, 14592, 0, 8192, 12288, + 14336, 14592, 14624, 0, 8192, 12288, 14336, 14592, + 14624, 0, 8192, 12288, 14336, 14592, 14624, 14626, + 0, 8192, 12288, 14336, 14592, 14624, 0, 8192, + 12288, 14336, 14592, 14624, 14628, 0, 8192, 12288, + 14336, 14592, 14624, 14628, 0, 8192, 12288, 14336, + 14592, 14624, 14632, 14630, 0, 8192, 12288, 14336, + 14592, 14624, 0, 8192, 12288, 14336, 14592, 14624, + 14632, 0, 8192, 12288, 14336, 14592, 14624, 14632, + 0, 8192, 12288, 14336, 14592, 14624, 14632, 14634, + 0, 8192, 12288, 14336, 14592, 14624, 14632, 0, + 8192, 12288, 14336, 14592, 14624, 14640, 14636, 0, + 8192, 12288, 14336, 14592, 14624, 14640, 14636, 0, + 8192, 12288, 14336, 14592, 14624, 14640, 14641, 14638, + 0, 8192, 12288, 14336, 14592, 14624, 0, 8192, + 12288, 14336, 14592, 14656, 14640, 0, 8192, 12288, + 14336, 14592, 14656, 14640, 0, 8192, 12288, 14336, + 14592, 14656, 14640, 14642, 0, 8192, 12288, 14336, + 14592, 14656, 14640, 0, 8192, 12288, 14336, 14592, + 14656, 14640, 14644, 0, 8192, 12288, 14336, 14592, + 14656, 14640, 14644, 0, 8192, 12288, 14336, 14592, + 14656, 14640, 14648, 14646, 0, 8192, 12288, 14336, + 14592, 14656, 14640, 0, 8192, 12288, 14336, 14592, + 14656, 14657, 14648, 0, 8192, 12288, 14336, 14592, + 14656, 14657, 14648, 0, 8192, 12288, 14336, 14592, + 14656, 14657, 14648, 14650, 0, 8192, 12288, 14336, + 14592, 14656, 14657, 14648, 0, 8192, 12288, 14336, + 14592, 14656, 14657, 14648, 14652, 0, 8192, 12288, + 14336, 14592, 14656, 14657, 14659, 14652, 0, 8192, + 12288, 14336, 14592, 14656, 14657, 14659, 14652, 14654, + 0, 8192, 12288, 14336, 14592, 0, 8192, 12288, + 14336, 14592, 14656, 0, 8192, 12288, 14336, 14592, + 14656, 0, 8192, 12288, 14336, 14592, 14656, 14658, + 0, 8192, 12288, 14336, 14592, 14656, 0, 8192, + 12288, 14336, 14592, 14656, 14660, 0, 8192, 12288, + 14336, 14592, 14656, 14660, 0, 8192, 12288, 14336, + 14592, 14656, 14664, 14662, 0, 8192, 12288, 14336, + 14592, 14656, 0, 8192, 12288, 14336, 14592, 14656, + 14664, 0, 8192, 12288, 14336, 14592, 14656, 14664, + 0, 8192, 12288, 14336, 14592, 14656, 14664, 14666, + 0, 8192, 12288, 14336, 14592, 14656, 14664, 0, + 8192, 12288, 14336, 14592, 14656, 14672, 14668, 0, + 8192, 12288, 14336, 14592, 14656, 14672, 14668, 0, + 8192, 12288, 14336, 14592, 14656, 14672, 14673, 14670, + 0, 8192, 12288, 14336, 14592, 14656, 0, 8192, + 12288, 14336, 14592, 14656, 14672, 0, 8192, 12288, + 14336, 14592, 14656, 14672, 0, 8192, 12288, 14336, + 14592, 14656, 14672, 14674, 0, 8192, 12288, 14336, + 14592, 14656, 14672, 0, 8192, 12288, 14336, 14592, + 14656, 14672, 14676, 0, 8192, 12288, 14336, 14592, + 14656, 14672, 14676, 0, 8192, 12288, 14336, 14592, + 14656, 14672, 14680, 14678, 0, 8192, 12288, 14336, + 14592, 14656, 14672, 0, 8192, 12288, 14336, 14592, + 14656, 14688, 14680, 0, 8192, 12288, 14336, 14592, + 14656, 14688, 14680, 0, 8192, 12288, 14336, 14592, + 14656, 14688, 14680, 14682, 0, 8192, 12288, 14336, + 14592, 14656, 14688, 14680, 0, 8192, 12288, 14336, + 14592, 14656, 14688, 14689, 14684, 0, 8192, 12288, + 14336, 14592, 14656, 14688, 14689, 14684, 0, 8192, + 12288, 14336, 14592, 14656, 14688, 14689, 14684, 14686, + 0, 8192, 12288, 14336, 14592, 14656, 0, 8192, + 12288, 14336, 14592, 14720, 14688, 0, 8192, 12288, + 14336, 14592, 14720, 14688, 0, 8192, 12288, 14336, + 14592, 14720, 14688, 14690, 0, 8192, 12288, 14336, + 14592, 14720, 14688, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14692, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14692, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14696, 14694, 0, 8192, 12288, 14336, + 14592, 14720, 14688, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14696, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14696, 0, 8192, 12288, 14336, 14592, + 14720, 14688, 14696, 14698, 0, 8192, 12288, 14336, + 14592, 14720, 14688, 14696, 0, 8192, 12288, 14336, + 14592, 14720, 14688, 14704, 14700, 0, 8192, 12288, + 14336, 14592, 14720, 14688, 14704, 14700, 0, 8192, + 12288, 14336, 14592, 14720, 14688, 14704, 14705, 14702, + 0, 8192, 12288, 14336, 14592, 14720, 14688, 0, + 8192, 12288, 14336, 14592, 14720, 14721, 14704, 0, + 8192, 12288, 14336, 14592, 14720, 14721, 14704, 0, + 8192, 12288, 14336, 14592, 14720, 14721, 14704, 14706, + 0, 8192, 12288, 14336, 14592, 14720, 14721, 14704, + 0, 8192, 12288, 14336, 14592, 14720, 14721, 14704, + 14708, 0, 8192, 12288, 14336, 14592, 14720, 14721, + 14704, 14708, 0, 8192, 12288, 14336, 14592, 14720, + 14721, 14704, 14712, 14710, 0, 8192, 12288, 14336, + 14592, 14720, 14721, 14704, 0, 8192, 12288, 14336, + 14592, 14720, 14721, 14704, 14712, 0, 8192, 12288, + 14336, 14592, 14720, 14721, 14723, 14712, 0, 8192, + 12288, 14336, 14592, 14720, 14721, 14723, 14712, 14714, + 0, 8192, 12288, 14336, 14592, 14720, 14721, 14723, + 14712, 0, 8192, 12288, 14336, 14592, 14720, 14721, + 14723, 14712, 14716, 0, 8192, 12288, 14336, 14592, + 14720, 14721, 14723, 14712, 14716, 0, 8192, 12288, + 14336, 14592, 14720, 14721, 14723, 14712, 14716, 14718, + 0, 8192, 12288, 14336, 14592, 0, 8192, 12288, + 14336, 14848, 14720, 0, 8192, 12288, 14336, 14848, + 14720, 0, 8192, 12288, 14336, 14848, 14720, 14722, + 0, 8192, 12288, 14336, 14848, 14720, 0, 8192, + 12288, 14336, 14848, 14720, 14724, 0, 8192, 12288, + 14336, 14848, 14720, 14724, 0, 8192, 12288, 14336, + 14848, 14720, 14728, 14726, 0, 8192, 12288, 14336, + 14848, 14720, 0, 8192, 12288, 14336, 14848, 14720, + 14728, 0, 8192, 12288, 14336, 14848, 14720, 14728, + 0, 8192, 12288, 14336, 14848, 14720, 14728, 14730, + 0, 8192, 12288, 14336, 14848, 14720, 14728, 0, + 8192, 12288, 14336, 14848, 14720, 14736, 14732, 0, + 8192, 12288, 14336, 14848, 14720, 14736, 14732, 0, + 8192, 12288, 14336, 14848, 14720, 14736, 14737, 14734, + 0, 8192, 12288, 14336, 14848, 14720, 0, 8192, + 12288, 14336, 14848, 14720, 14736, 0, 8192, 12288, + 14336, 14848, 14720, 14736, 0, 8192, 12288, 14336, + 14848, 14720, 14736, 14738, 0, 8192, 12288, 14336, + 14848, 14720, 14736, 0, 8192, 12288, 14336, 14848, + 14720, 14736, 14740, 0, 8192, 12288, 14336, 14848, + 14720, 14736, 14740, 0, 8192, 12288, 14336, 14848, + 14720, 14736, 14744, 14742, 0, 8192, 12288, 14336, + 14848, 14720, 14736, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14744, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14744, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14744, 14746, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 14744, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 14753, 14748, 0, 8192, 12288, + 14336, 14848, 14720, 14752, 14753, 14748, 0, 8192, + 12288, 14336, 14848, 14720, 14752, 14753, 14748, 14750, + 0, 8192, 12288, 14336, 14848, 14720, 0, 8192, + 12288, 14336, 14848, 14720, 14752, 0, 8192, 12288, + 14336, 14848, 14720, 14752, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 14754, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14756, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14756, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14760, 14758, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14760, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14760, 0, 8192, 12288, 14336, 14848, + 14720, 14752, 14760, 14762, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 14760, 0, 8192, 12288, 14336, + 14848, 14720, 14752, 14768, 14764, 0, 8192, 12288, + 14336, 14848, 14720, 14752, 14768, 14764, 0, 8192, + 12288, 14336, 14848, 14720, 14752, 14768, 14769, 14766, + 0, 8192, 12288, 14336, 14848, 14720, 14752, 0, + 8192, 12288, 14336, 14848, 14720, 14784, 14768, 0, + 8192, 12288, 14336, 14848, 14720, 14784, 14768, 0, + 8192, 12288, 14336, 14848, 14720, 14784, 14768, 14770, + 0, 8192, 12288, 14336, 14848, 14720, 14784, 14768, + 0, 8192, 12288, 14336, 14848, 14720, 14784, 14768, + 14772, 0, 8192, 12288, 14336, 14848, 14720, 14784, + 14768, 14772, 0, 8192, 12288, 14336, 14848, 14720, + 14784, 14768, 14776, 14774, 0, 8192, 12288, 14336, + 14848, 14720, 14784, 14768, 0, 8192, 12288, 14336, + 14848, 14720, 14784, 14785, 14776, 0, 8192, 12288, + 14336, 14848, 14720, 14784, 14785, 14776, 0, 8192, + 12288, 14336, 14848, 14720, 14784, 14785, 14776, 14778, + 0, 8192, 12288, 14336, 14848, 14720, 14784, 14785, + 14776, 0, 8192, 12288, 14336, 14848, 14720, 14784, + 14785, 14776, 14780, 0, 8192, 12288, 14336, 14848, + 14720, 14784, 14785, 14787, 14780, 0, 8192, 12288, + 14336, 14848, 14720, 14784, 14785, 14787, 14780, 14782, + 0, 8192, 12288, 14336, 14848, 14720, 0, 8192, + 12288, 14336, 14848, 14849, 14784, 0, 8192, 12288, + 14336, 14848, 14849, 14784, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 14786, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14788, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14788, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14792, 14790, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14792, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14792, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14792, 14794, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 14792, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 14800, 14796, 0, 8192, 12288, + 14336, 14848, 14849, 14784, 14800, 14796, 0, 8192, + 12288, 14336, 14848, 14849, 14784, 14800, 14801, 14798, + 0, 8192, 12288, 14336, 14848, 14849, 14784, 0, + 8192, 12288, 14336, 14848, 14849, 14784, 14800, 0, + 8192, 12288, 14336, 14848, 14849, 14784, 14800, 0, + 8192, 12288, 14336, 14848, 14849, 14784, 14800, 14802, + 0, 8192, 12288, 14336, 14848, 14849, 14784, 14800, + 0, 8192, 12288, 14336, 14848, 14849, 14784, 14800, + 14804, 0, 8192, 12288, 14336, 14848, 14849, 14784, + 14800, 14804, 0, 8192, 12288, 14336, 14848, 14849, + 14784, 14800, 14808, 14806, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 14800, 0, 8192, 12288, 14336, + 14848, 14849, 14784, 14816, 14808, 0, 8192, 12288, + 14336, 14848, 14849, 14784, 14816, 14808, 0, 8192, + 12288, 14336, 14848, 14849, 14784, 14816, 14808, 14810, + 0, 8192, 12288, 14336, 14848, 14849, 14784, 14816, + 14808, 0, 8192, 12288, 14336, 14848, 14849, 14784, + 14816, 14817, 14812, 0, 8192, 12288, 14336, 14848, + 14849, 14784, 14816, 14817, 14812, 0, 8192, 12288, + 14336, 14848, 14849, 14784, 14816, 14817, 14812, 14814, + 0, 8192, 12288, 14336, 14848, 14849, 14784, 0, + 8192, 12288, 14336, 14848, 14849, 14784, 14816, 0, + 8192, 12288, 14336, 14848, 14849, 14851, 14816, 0, + 8192, 12288, 14336, 14848, 14849, 14851, 14816, 14818, + 0, 8192, 12288, 14336, 14848, 14849, 14851, 14816, + 0, 8192, 12288, 14336, 14848, 14849, 14851, 14816, + 14820, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14816, 14820, 0, 8192, 12288, 14336, 14848, 14849, + 14851, 14816, 14824, 14822, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14816, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14816, 14824, 0, 8192, 12288, + 14336, 14848, 14849, 14851, 14816, 14824, 0, 8192, + 12288, 14336, 14848, 14849, 14851, 14816, 14824, 14826, + 0, 8192, 12288, 14336, 14848, 14849, 14851, 14816, + 14824, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14816, 14832, 14828, 0, 8192, 12288, 14336, 14848, + 14849, 14851, 14816, 14832, 14828, 0, 8192, 12288, + 14336, 14848, 14849, 14851, 14816, 14832, 14833, 14830, + 0, 8192, 12288, 14336, 14848, 14849, 14851, 14816, + 0, 8192, 12288, 14336, 14848, 14849, 14851, 14816, + 14832, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14816, 14832, 0, 8192, 12288, 14336, 14848, 14849, + 14851, 14816, 14832, 14834, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14855, 14832, 0, 8192, 12288, + 14336, 14848, 14849, 14851, 14855, 14832, 14836, 0, + 8192, 12288, 14336, 14848, 14849, 14851, 14855, 14832, + 14836, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14855, 14832, 14840, 14838, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14855, 14832, 0, 8192, 12288, + 14336, 14848, 14849, 14851, 14855, 14832, 14840, 0, + 8192, 12288, 14336, 14848, 14849, 14851, 14855, 14832, + 14840, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14855, 14832, 14840, 14842, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14855, 14832, 14840, 0, 8192, + 12288, 14336, 14848, 14849, 14851, 14855, 14832, 14840, + 14844, 0, 8192, 12288, 14336, 14848, 14849, 14851, + 14855, 14832, 14840, 14844, 0, 8192, 12288, 14336, + 14848, 14849, 14851, 14855, 14832, 14840, 14844, 14846, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 14848, 0, 8192, 12288, 14336, 14848, 0, 8192, + 12288, 14336, 14848, 14850, 0, 8192, 12288, 14336, + 14848, 0, 8192, 12288, 14336, 14848, 14852, 0, + 8192, 12288, 14336, 14848, 14852, 0, 8192, 12288, + 14336, 14848, 14856, 14854, 0, 8192, 12288, 14336, + 14848, 0, 8192, 12288, 14336, 14848, 14856, 0, + 8192, 12288, 14336, 14848, 14856, 0, 8192, 12288, + 14336, 14848, 14856, 14858, 0, 8192, 12288, 14336, + 14848, 14856, 0, 8192, 12288, 14336, 14848, 14864, + 14860, 0, 8192, 12288, 14336, 14848, 14864, 14860, + 0, 8192, 12288, 14336, 14848, 14864, 14865, 14862, + 0, 8192, 12288, 14336, 14848, 0, 8192, 12288, + 14336, 14848, 14864, 0, 8192, 12288, 14336, 14848, + 14864, 0, 8192, 12288, 14336, 14848, 14864, 14866, + 0, 8192, 12288, 14336, 14848, 14864, 0, 8192, + 12288, 14336, 14848, 14864, 14868, 0, 8192, 12288, + 14336, 14848, 14864, 14868, 0, 8192, 12288, 14336, + 14848, 14864, 14872, 14870, 0, 8192, 12288, 14336, + 14848, 14864, 0, 8192, 12288, 14336, 14848, 14880, + 14872, 0, 8192, 12288, 14336, 14848, 14880, 14872, + 0, 8192, 12288, 14336, 14848, 14880, 14872, 14874, + 0, 8192, 12288, 14336, 14848, 14880, 14872, 0, + 8192, 12288, 14336, 14848, 14880, 14881, 14876, 0, + 8192, 12288, 14336, 14848, 14880, 14881, 14876, 0, + 8192, 12288, 14336, 14848, 14880, 14881, 14876, 14878, + 0, 8192, 12288, 14336, 14848, 0, 8192, 12288, + 14336, 14848, 14880, 0, 8192, 12288, 14336, 14848, + 14880, 0, 8192, 12288, 14336, 14848, 14880, 14882, + 0, 8192, 12288, 14336, 14848, 14880, 0, 8192, + 12288, 14336, 14848, 14880, 14884, 0, 8192, 12288, + 14336, 14848, 14880, 14884, 0, 8192, 12288, 14336, + 14848, 14880, 14888, 14886, 0, 8192, 12288, 14336, + 14848, 14880, 0, 8192, 12288, 14336, 14848, 14880, + 14888, 0, 8192, 12288, 14336, 14848, 14880, 14888, + 0, 8192, 12288, 14336, 14848, 14880, 14888, 14890, + 0, 8192, 12288, 14336, 14848, 14880, 14888, 0, + 8192, 12288, 14336, 14848, 14880, 14896, 14892, 0, + 8192, 12288, 14336, 14848, 14880, 14896, 14892, 0, + 8192, 12288, 14336, 14848, 14880, 14896, 14897, 14894, + 0, 8192, 12288, 14336, 14848, 14880, 0, 8192, + 12288, 14336, 14848, 14912, 14896, 0, 8192, 12288, + 14336, 14848, 14912, 14896, 0, 8192, 12288, 14336, + 14848, 14912, 14896, 14898, 0, 8192, 12288, 14336, + 14848, 14912, 14896, 0, 8192, 12288, 14336, 14848, + 14912, 14896, 14900, 0, 8192, 12288, 14336, 14848, + 14912, 14896, 14900, 0, 8192, 12288, 14336, 14848, + 14912, 14896, 14904, 14902, 0, 8192, 12288, 14336, + 14848, 14912, 14896, 0, 8192, 12288, 14336, 14848, + 14912, 14913, 14904, 0, 8192, 12288, 14336, 14848, + 14912, 14913, 14904, 0, 8192, 12288, 14336, 14848, + 14912, 14913, 14904, 14906, 0, 8192, 12288, 14336, + 14848, 14912, 14913, 14904, 0, 8192, 12288, 14336, + 14848, 14912, 14913, 14904, 14908, 0, 8192, 12288, + 14336, 14848, 14912, 14913, 14915, 14908, 0, 8192, + 12288, 14336, 14848, 14912, 14913, 14915, 14908, 14910, + 0, 8192, 12288, 14336, 14848, 0, 8192, 12288, + 14336, 14848, 14912, 0, 8192, 12288, 14336, 14848, + 14912, 0, 8192, 12288, 14336, 14848, 14912, 14914, + 0, 8192, 12288, 14336, 14848, 14912, 0, 8192, + 12288, 14336, 14848, 14912, 14916, 0, 8192, 12288, + 14336, 14848, 14912, 14916, 0, 8192, 12288, 14336, + 14848, 14912, 14920, 14918, 0, 8192, 12288, 14336, + 14848, 14912, 0, 8192, 12288, 14336, 14848, 14912, + 14920, 0, 8192, 12288, 14336, 14848, 14912, 14920, + 0, 8192, 12288, 14336, 14848, 14912, 14920, 14922, + 0, 8192, 12288, 14336, 14848, 14912, 14920, 0, + 8192, 12288, 14336, 14848, 14912, 14928, 14924, 0, + 8192, 12288, 14336, 14848, 14912, 14928, 14924, 0, + 8192, 12288, 14336, 14848, 14912, 14928, 14929, 14926, + 0, 8192, 12288, 14336, 14848, 14912, 0, 8192, + 12288, 14336, 14848, 14912, 14928, 0, 8192, 12288, + 14336, 14848, 14912, 14928, 0, 8192, 12288, 14336, + 14848, 14912, 14928, 14930, 0, 8192, 12288, 14336, + 14848, 14912, 14928, 0, 8192, 12288, 14336, 14848, + 14912, 14928, 14932, 0, 8192, 12288, 14336, 14848, + 14912, 14928, 14932, 0, 8192, 12288, 14336, 14848, + 14912, 14928, 14936, 14934, 0, 8192, 12288, 14336, + 14848, 14912, 14928, 0, 8192, 12288, 14336, 14848, + 14912, 14944, 14936, 0, 8192, 12288, 14336, 14848, + 14912, 14944, 14936, 0, 8192, 12288, 14336, 14848, + 14912, 14944, 14936, 14938, 0, 8192, 12288, 14336, + 14848, 14912, 14944, 14936, 0, 8192, 12288, 14336, + 14848, 14912, 14944, 14945, 14940, 0, 8192, 12288, + 14336, 14848, 14912, 14944, 14945, 14940, 0, 8192, + 12288, 14336, 14848, 14912, 14944, 14945, 14940, 14942, + 0, 8192, 12288, 14336, 14848, 14912, 0, 8192, + 12288, 14336, 14848, 14976, 14944, 0, 8192, 12288, + 14336, 14848, 14976, 14944, 0, 8192, 12288, 14336, + 14848, 14976, 14944, 14946, 0, 8192, 12288, 14336, + 14848, 14976, 14944, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14948, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14948, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14952, 14950, 0, 8192, 12288, 14336, + 14848, 14976, 14944, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14952, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14952, 0, 8192, 12288, 14336, 14848, + 14976, 14944, 14952, 14954, 0, 8192, 12288, 14336, + 14848, 14976, 14944, 14952, 0, 8192, 12288, 14336, + 14848, 14976, 14944, 14960, 14956, 0, 8192, 12288, + 14336, 14848, 14976, 14944, 14960, 14956, 0, 8192, + 12288, 14336, 14848, 14976, 14944, 14960, 14961, 14958, + 0, 8192, 12288, 14336, 14848, 14976, 14944, 0, + 8192, 12288, 14336, 14848, 14976, 14977, 14960, 0, + 8192, 12288, 14336, 14848, 14976, 14977, 14960, 0, + 8192, 12288, 14336, 14848, 14976, 14977, 14960, 14962, + 0, 8192, 12288, 14336, 14848, 14976, 14977, 14960, + 0, 8192, 12288, 14336, 14848, 14976, 14977, 14960, + 14964, 0, 8192, 12288, 14336, 14848, 14976, 14977, + 14960, 14964, 0, 8192, 12288, 14336, 14848, 14976, + 14977, 14960, 14968, 14966, 0, 8192, 12288, 14336, + 14848, 14976, 14977, 14960, 0, 8192, 12288, 14336, + 14848, 14976, 14977, 14960, 14968, 0, 8192, 12288, + 14336, 14848, 14976, 14977, 14979, 14968, 0, 8192, + 12288, 14336, 14848, 14976, 14977, 14979, 14968, 14970, + 0, 8192, 12288, 14336, 14848, 14976, 14977, 14979, + 14968, 0, 8192, 12288, 14336, 14848, 14976, 14977, + 14979, 14968, 14972, 0, 8192, 12288, 14336, 14848, + 14976, 14977, 14979, 14968, 14972, 0, 8192, 12288, + 14336, 14848, 14976, 14977, 14979, 14968, 14972, 14974, + 0, 8192, 12288, 14336, 14848, 0, 8192, 12288, + 14336, 14848, 14976, 0, 8192, 12288, 14336, 14848, + 14976, 0, 8192, 12288, 14336, 14848, 14976, 14978, + 0, 8192, 12288, 14336, 14848, 14976, 0, 8192, + 12288, 14336, 14848, 14976, 14980, 0, 8192, 12288, + 14336, 14848, 14976, 14980, 0, 8192, 12288, 14336, + 14848, 14976, 14984, 14982, 0, 8192, 12288, 14336, + 14848, 14976, 0, 8192, 12288, 14336, 14848, 14976, + 14984, 0, 8192, 12288, 14336, 14848, 14976, 14984, + 0, 8192, 12288, 14336, 14848, 14976, 14984, 14986, + 0, 8192, 12288, 14336, 14848, 14976, 14984, 0, + 8192, 12288, 14336, 14848, 14976, 14992, 14988, 0, + 8192, 12288, 14336, 14848, 14976, 14992, 14988, 0, + 8192, 12288, 14336, 14848, 14976, 14992, 14993, 14990, + 0, 8192, 12288, 14336, 14848, 14976, 0, 8192, + 12288, 14336, 14848, 14976, 14992, 0, 8192, 12288, + 14336, 14848, 14976, 14992, 0, 8192, 12288, 14336, + 14848, 14976, 14992, 14994, 0, 8192, 12288, 14336, + 14848, 14976, 14992, 0, 8192, 12288, 14336, 14848, + 14976, 14992, 14996, 0, 8192, 12288, 14336, 14848, + 14976, 14992, 14996, 0, 8192, 12288, 14336, 14848, + 14976, 14992, 15000, 14998, 0, 8192, 12288, 14336, + 14848, 14976, 14992, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15000, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15000, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15000, 15002, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 15000, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 15009, 15004, 0, 8192, 12288, + 14336, 14848, 14976, 15008, 15009, 15004, 0, 8192, + 12288, 14336, 14848, 14976, 15008, 15009, 15004, 15006, + 0, 8192, 12288, 14336, 14848, 14976, 0, 8192, + 12288, 14336, 14848, 14976, 15008, 0, 8192, 12288, + 14336, 14848, 14976, 15008, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 15010, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15012, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15012, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15016, 15014, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15016, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15016, 0, 8192, 12288, 14336, 14848, + 14976, 15008, 15016, 15018, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 15016, 0, 8192, 12288, 14336, + 14848, 14976, 15008, 15024, 15020, 0, 8192, 12288, + 14336, 14848, 14976, 15008, 15024, 15020, 0, 8192, + 12288, 14336, 14848, 14976, 15008, 15024, 15025, 15022, + 0, 8192, 12288, 14336, 14848, 14976, 15008, 0, + 8192, 12288, 14336, 14848, 14976, 15040, 15024, 0, + 8192, 12288, 14336, 14848, 14976, 15040, 15024, 0, + 8192, 12288, 14336, 14848, 14976, 15040, 15024, 15026, + 0, 8192, 12288, 14336, 14848, 14976, 15040, 15024, + 0, 8192, 12288, 14336, 14848, 14976, 15040, 15024, + 15028, 0, 8192, 12288, 14336, 14848, 14976, 15040, + 15024, 15028, 0, 8192, 12288, 14336, 14848, 14976, + 15040, 15024, 15032, 15030, 0, 8192, 12288, 14336, + 14848, 14976, 15040, 15024, 0, 8192, 12288, 14336, + 14848, 14976, 15040, 15041, 15032, 0, 8192, 12288, + 14336, 14848, 14976, 15040, 15041, 15032, 0, 8192, + 12288, 14336, 14848, 14976, 15040, 15041, 15032, 15034, + 0, 8192, 12288, 14336, 14848, 14976, 15040, 15041, + 15032, 0, 8192, 12288, 14336, 14848, 14976, 15040, + 15041, 15032, 15036, 0, 8192, 12288, 14336, 14848, + 14976, 15040, 15041, 15043, 15036, 0, 8192, 12288, + 14336, 14848, 14976, 15040, 15041, 15043, 15036, 15038, + 0, 8192, 12288, 14336, 14848, 14976, 0, 8192, + 12288, 14336, 14848, 15104, 15040, 0, 8192, 12288, + 14336, 14848, 15104, 15040, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 15042, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15044, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15044, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15048, 15046, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15048, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15048, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15048, 15050, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 15048, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 15056, 15052, 0, 8192, 12288, + 14336, 14848, 15104, 15040, 15056, 15052, 0, 8192, + 12288, 14336, 14848, 15104, 15040, 15056, 15057, 15054, + 0, 8192, 12288, 14336, 14848, 15104, 15040, 0, + 8192, 12288, 14336, 14848, 15104, 15040, 15056, 0, + 8192, 12288, 14336, 14848, 15104, 15040, 15056, 0, + 8192, 12288, 14336, 14848, 15104, 15040, 15056, 15058, + 0, 8192, 12288, 14336, 14848, 15104, 15040, 15056, + 0, 8192, 12288, 14336, 14848, 15104, 15040, 15056, + 15060, 0, 8192, 12288, 14336, 14848, 15104, 15040, + 15056, 15060, 0, 8192, 12288, 14336, 14848, 15104, + 15040, 15056, 15064, 15062, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 15056, 0, 8192, 12288, 14336, + 14848, 15104, 15040, 15072, 15064, 0, 8192, 12288, + 14336, 14848, 15104, 15040, 15072, 15064, 0, 8192, + 12288, 14336, 14848, 15104, 15040, 15072, 15064, 15066, + 0, 8192, 12288, 14336, 14848, 15104, 15040, 15072, + 15064, 0, 8192, 12288, 14336, 14848, 15104, 15040, + 15072, 15073, 15068, 0, 8192, 12288, 14336, 14848, + 15104, 15040, 15072, 15073, 15068, 0, 8192, 12288, + 14336, 14848, 15104, 15040, 15072, 15073, 15068, 15070, + 0, 8192, 12288, 14336, 14848, 15104, 15040, 0, + 8192, 12288, 14336, 14848, 15104, 15105, 15072, 0, + 8192, 12288, 14336, 14848, 15104, 15105, 15072, 0, + 8192, 12288, 14336, 14848, 15104, 15105, 15072, 15074, + 0, 8192, 12288, 14336, 14848, 15104, 15105, 15072, + 0, 8192, 12288, 14336, 14848, 15104, 15105, 15072, + 15076, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15072, 15076, 0, 8192, 12288, 14336, 14848, 15104, + 15105, 15072, 15080, 15078, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15072, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15072, 15080, 0, 8192, 12288, + 14336, 14848, 15104, 15105, 15072, 15080, 0, 8192, + 12288, 14336, 14848, 15104, 15105, 15072, 15080, 15082, + 0, 8192, 12288, 14336, 14848, 15104, 15105, 15072, + 15080, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15072, 15088, 15084, 0, 8192, 12288, 14336, 14848, + 15104, 15105, 15072, 15088, 15084, 0, 8192, 12288, + 14336, 14848, 15104, 15105, 15072, 15088, 15089, 15086, + 0, 8192, 12288, 14336, 14848, 15104, 15105, 15072, + 0, 8192, 12288, 14336, 14848, 15104, 15105, 15072, + 15088, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15107, 15088, 0, 8192, 12288, 14336, 14848, 15104, + 15105, 15107, 15088, 15090, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15107, 15088, 0, 8192, 12288, + 14336, 14848, 15104, 15105, 15107, 15088, 15092, 0, + 8192, 12288, 14336, 14848, 15104, 15105, 15107, 15088, + 15092, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15107, 15088, 15096, 15094, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15107, 15088, 0, 8192, 12288, + 14336, 14848, 15104, 15105, 15107, 15088, 15096, 0, + 8192, 12288, 14336, 14848, 15104, 15105, 15107, 15088, + 15096, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15107, 15088, 15096, 15098, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15107, 15111, 15096, 0, 8192, + 12288, 14336, 14848, 15104, 15105, 15107, 15111, 15096, + 15100, 0, 8192, 12288, 14336, 14848, 15104, 15105, + 15107, 15111, 15096, 15100, 0, 8192, 12288, 14336, + 14848, 15104, 15105, 15107, 15111, 15096, 15100, 15102, + 0, 8192, 12288, 14336, 14848, 0, 8192, 12288, + 14336, 15360, 15104, 0, 8192, 12288, 14336, 15360, + 15104, 0, 8192, 12288, 14336, 15360, 15104, 15106, + 0, 8192, 12288, 14336, 15360, 15104, 0, 8192, + 12288, 14336, 15360, 15104, 15108, 0, 8192, 12288, + 14336, 15360, 15104, 15108, 0, 8192, 12288, 14336, + 15360, 15104, 15112, 15110, 0, 8192, 12288, 14336, + 15360, 15104, 0, 8192, 12288, 14336, 15360, 15104, + 15112, 0, 8192, 12288, 14336, 15360, 15104, 15112, + 0, 8192, 12288, 14336, 15360, 15104, 15112, 15114, + 0, 8192, 12288, 14336, 15360, 15104, 15112, 0, + 8192, 12288, 14336, 15360, 15104, 15120, 15116, 0, + 8192, 12288, 14336, 15360, 15104, 15120, 15116, 0, + 8192, 12288, 14336, 15360, 15104, 15120, 15121, 15118, + 0, 8192, 12288, 14336, 15360, 15104, 0, 8192, + 12288, 14336, 15360, 15104, 15120, 0, 8192, 12288, + 14336, 15360, 15104, 15120, 0, 8192, 12288, 14336, + 15360, 15104, 15120, 15122, 0, 8192, 12288, 14336, + 15360, 15104, 15120, 0, 8192, 12288, 14336, 15360, + 15104, 15120, 15124, 0, 8192, 12288, 14336, 15360, + 15104, 15120, 15124, 0, 8192, 12288, 14336, 15360, + 15104, 15120, 15128, 15126, 0, 8192, 12288, 14336, + 15360, 15104, 15120, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15128, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15128, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15128, 15130, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 15128, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 15137, 15132, 0, 8192, 12288, + 14336, 15360, 15104, 15136, 15137, 15132, 0, 8192, + 12288, 14336, 15360, 15104, 15136, 15137, 15132, 15134, + 0, 8192, 12288, 14336, 15360, 15104, 0, 8192, + 12288, 14336, 15360, 15104, 15136, 0, 8192, 12288, + 14336, 15360, 15104, 15136, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 15138, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15140, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15140, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15144, 15142, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15144, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15144, 0, 8192, 12288, 14336, 15360, + 15104, 15136, 15144, 15146, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 15144, 0, 8192, 12288, 14336, + 15360, 15104, 15136, 15152, 15148, 0, 8192, 12288, + 14336, 15360, 15104, 15136, 15152, 15148, 0, 8192, + 12288, 14336, 15360, 15104, 15136, 15152, 15153, 15150, + 0, 8192, 12288, 14336, 15360, 15104, 15136, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15152, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15152, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15152, 15154, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15152, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15152, + 15156, 0, 8192, 12288, 14336, 15360, 15104, 15168, + 15152, 15156, 0, 8192, 12288, 14336, 15360, 15104, + 15168, 15152, 15160, 15158, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15152, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15169, 15160, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 15169, 15160, 0, 8192, + 12288, 14336, 15360, 15104, 15168, 15169, 15160, 15162, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15169, + 15160, 0, 8192, 12288, 14336, 15360, 15104, 15168, + 15169, 15160, 15164, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15169, 15171, 15164, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 15169, 15171, 15164, 15166, + 0, 8192, 12288, 14336, 15360, 15104, 0, 8192, + 12288, 14336, 15360, 15104, 15168, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15170, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15172, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15172, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15176, 15174, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15176, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15176, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15176, 15178, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15176, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15184, 15180, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 15184, 15180, 0, 8192, + 12288, 14336, 15360, 15104, 15168, 15184, 15185, 15182, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15184, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15184, 0, + 8192, 12288, 14336, 15360, 15104, 15168, 15184, 15186, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15184, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15184, + 15188, 0, 8192, 12288, 14336, 15360, 15104, 15168, + 15184, 15188, 0, 8192, 12288, 14336, 15360, 15104, + 15168, 15184, 15192, 15190, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15184, 0, 8192, 12288, 14336, + 15360, 15104, 15168, 15200, 15192, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 15200, 15192, 0, 8192, + 12288, 14336, 15360, 15104, 15168, 15200, 15192, 15194, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 15200, + 15192, 0, 8192, 12288, 14336, 15360, 15104, 15168, + 15200, 15201, 15196, 0, 8192, 12288, 14336, 15360, + 15104, 15168, 15200, 15201, 15196, 0, 8192, 12288, + 14336, 15360, 15104, 15168, 15200, 15201, 15196, 15198, + 0, 8192, 12288, 14336, 15360, 15104, 15168, 0, + 8192, 12288, 14336, 15360, 15104, 15232, 15200, 0, + 8192, 12288, 14336, 15360, 15104, 15232, 15200, 0, + 8192, 12288, 14336, 15360, 15104, 15232, 15200, 15202, + 0, 8192, 12288, 14336, 15360, 15104, 15232, 15200, + 0, 8192, 12288, 14336, 15360, 15104, 15232, 15200, + 15204, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15200, 15204, 0, 8192, 12288, 14336, 15360, 15104, + 15232, 15200, 15208, 15206, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15200, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15200, 15208, 0, 8192, 12288, + 14336, 15360, 15104, 15232, 15200, 15208, 0, 8192, + 12288, 14336, 15360, 15104, 15232, 15200, 15208, 15210, + 0, 8192, 12288, 14336, 15360, 15104, 15232, 15200, + 15208, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15200, 15216, 15212, 0, 8192, 12288, 14336, 15360, + 15104, 15232, 15200, 15216, 15212, 0, 8192, 12288, + 14336, 15360, 15104, 15232, 15200, 15216, 15217, 15214, + 0, 8192, 12288, 14336, 15360, 15104, 15232, 15200, + 0, 8192, 12288, 14336, 15360, 15104, 15232, 15233, + 15216, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15233, 15216, 0, 8192, 12288, 14336, 15360, 15104, + 15232, 15233, 15216, 15218, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15233, 15216, 0, 8192, 12288, + 14336, 15360, 15104, 15232, 15233, 15216, 15220, 0, + 8192, 12288, 14336, 15360, 15104, 15232, 15233, 15216, + 15220, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15233, 15216, 15224, 15222, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15233, 15216, 0, 8192, 12288, + 14336, 15360, 15104, 15232, 15233, 15216, 15224, 0, + 8192, 12288, 14336, 15360, 15104, 15232, 15233, 15235, + 15224, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15233, 15235, 15224, 15226, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15233, 15235, 15224, 0, 8192, + 12288, 14336, 15360, 15104, 15232, 15233, 15235, 15224, + 15228, 0, 8192, 12288, 14336, 15360, 15104, 15232, + 15233, 15235, 15224, 15228, 0, 8192, 12288, 14336, + 15360, 15104, 15232, 15233, 15235, 15224, 15228, 15230, + 0, 8192, 12288, 14336, 15360, 15104, 0, 8192, + 12288, 14336, 15360, 15104, 15232, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15234, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15236, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15236, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15240, 15238, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15240, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15240, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15240, 15242, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15240, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15248, 15244, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15248, 15244, 0, 8192, + 12288, 14336, 15360, 15361, 15232, 15248, 15249, 15246, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15248, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15248, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15248, 15250, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15248, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15248, + 15252, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15248, 15252, 0, 8192, 12288, 14336, 15360, 15361, + 15232, 15248, 15256, 15254, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15248, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15264, 15256, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15264, 15256, 0, 8192, + 12288, 14336, 15360, 15361, 15232, 15264, 15256, 15258, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15264, + 15256, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15264, 15265, 15260, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15264, 15265, 15260, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15264, 15265, 15260, 15262, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15264, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15264, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15264, 15266, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15264, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15264, + 15268, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15264, 15268, 0, 8192, 12288, 14336, 15360, 15361, + 15232, 15264, 15272, 15270, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15264, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15264, 15272, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15264, 15272, 0, 8192, + 12288, 14336, 15360, 15361, 15232, 15264, 15272, 15274, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15264, + 15272, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15264, 15280, 15276, 0, 8192, 12288, 14336, 15360, + 15361, 15232, 15264, 15280, 15276, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15264, 15280, 15281, 15278, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15264, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 15296, + 15280, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15296, 15280, 0, 8192, 12288, 14336, 15360, 15361, + 15232, 15296, 15280, 15282, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15296, 15280, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15296, 15280, 15284, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15296, 15280, + 15284, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15296, 15280, 15288, 15286, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15296, 15280, 0, 8192, 12288, + 14336, 15360, 15361, 15232, 15296, 15297, 15288, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15296, 15297, + 15288, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15296, 15297, 15288, 15290, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15296, 15297, 15288, 0, 8192, + 12288, 14336, 15360, 15361, 15232, 15296, 15297, 15288, + 15292, 0, 8192, 12288, 14336, 15360, 15361, 15232, + 15296, 15297, 15299, 15292, 0, 8192, 12288, 14336, + 15360, 15361, 15232, 15296, 15297, 15299, 15292, 15294, + 0, 8192, 12288, 14336, 15360, 15361, 15232, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15296, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15296, 0, + 8192, 12288, 14336, 15360, 15361, 15232, 15296, 15298, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 15300, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15300, 0, 8192, 12288, 14336, 15360, 15361, + 15363, 15296, 15304, 15302, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15304, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15296, 15304, 0, 8192, + 12288, 14336, 15360, 15361, 15363, 15296, 15304, 15306, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 15304, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15312, 15308, 0, 8192, 12288, 14336, 15360, + 15361, 15363, 15296, 15312, 15308, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15296, 15312, 15313, 15310, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 15312, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15312, 0, 8192, 12288, 14336, 15360, 15361, + 15363, 15296, 15312, 15314, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15312, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15296, 15312, 15316, 0, + 8192, 12288, 14336, 15360, 15361, 15363, 15296, 15312, + 15316, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15312, 15320, 15318, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15312, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15296, 15328, 15320, 0, + 8192, 12288, 14336, 15360, 15361, 15363, 15296, 15328, + 15320, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15328, 15320, 15322, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15328, 15320, 0, 8192, + 12288, 14336, 15360, 15361, 15363, 15296, 15328, 15329, + 15324, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15328, 15329, 15324, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15328, 15329, 15324, 15326, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15296, + 15328, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15328, 0, 8192, 12288, 14336, 15360, 15361, + 15363, 15296, 15328, 15330, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15296, 15328, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15296, 15328, 15332, 0, + 8192, 12288, 14336, 15360, 15361, 15363, 15296, 15328, + 15332, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15296, 15328, 15336, 15334, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15367, 15328, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15367, 15328, 15336, 0, + 8192, 12288, 14336, 15360, 15361, 15363, 15367, 15328, + 15336, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15367, 15328, 15336, 15338, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15367, 15328, 15336, 0, 8192, + 12288, 14336, 15360, 15361, 15363, 15367, 15328, 15344, + 15340, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15367, 15328, 15344, 15340, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15367, 15328, 15344, 15345, 15342, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15367, + 15328, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15367, 15328, 15344, 0, 8192, 12288, 14336, 15360, + 15361, 15363, 15367, 15328, 15344, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15367, 15328, 15344, 15346, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15367, + 15328, 15344, 0, 8192, 12288, 14336, 15360, 15361, + 15363, 15367, 15328, 15344, 15348, 0, 8192, 12288, + 14336, 15360, 15361, 15363, 15367, 15328, 15344, 15348, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15367, + 15328, 15344, 15352, 15350, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15367, 15328, 15344, 0, 8192, + 12288, 14336, 15360, 15361, 15363, 15367, 15328, 15344, + 15352, 0, 8192, 12288, 14336, 15360, 15361, 15363, + 15367, 15328, 15344, 15352, 0, 8192, 12288, 14336, + 15360, 15361, 15363, 15367, 15328, 15344, 15352, 15354, + 0, 8192, 12288, 14336, 15360, 15361, 15363, 15367, + 15328, 15344, 15352, 0, 8192, 12288, 14336, 15360, + 15361, 15363, 15367, 15328, 15344, 15352, 15356, 0, + 8192, 12288, 14336, 15360, 15361, 15363, 15367, 15328, + 15344, 15352, 15356, 0, 8192, 12288, 14336, 15360, + 15361, 15363, 15367, 15328, 15344, 15352, 15356, 15358, + 0, 8192, 12288, 14336, 0, 8192, 12288, 14336, + 15360, 0, 8192, 12288, 14336, 15360, 0, 8192, + 12288, 14336, 15360, 15362, 0, 8192, 12288, 14336, + 15360, 0, 16384, 12288, 14336, 15360, 15364, 0, + 16384, 12288, 14336, 15360, 15364, 0, 16384, 12288, + 14336, 15360, 15368, 15366, 0, 16384, 12288, 14336, + 15360, 0, 16384, 12288, 14336, 15360, 15368, 0, + 16384, 12288, 14336, 15360, 15368, 0, 16384, 12288, + 14336, 15360, 15368, 15370, 0, 16384, 12288, 14336, + 15360, 15368, 0, 16384, 12288, 14336, 15360, 15376, + 15372, 0, 16384, 12288, 14336, 15360, 15376, 15372, + 0, 16384, 12288, 14336, 15360, 15376, 15377, 15374, + 0, 16384, 12288, 14336, 15360, 0, 16384, 12288, + 14336, 15360, 15376, 0, 16384, 12288, 14336, 15360, + 15376, 0, 16384, 12288, 14336, 15360, 15376, 15378, + 0, 16384, 12288, 14336, 15360, 15376, 0, 16384, + 12288, 14336, 15360, 15376, 15380, 0, 16384, 12288, + 14336, 15360, 15376, 15380, 0, 16384, 12288, 14336, + 15360, 15376, 15384, 15382, 0, 16384, 12288, 14336, + 15360, 15376, 0, 16384, 12288, 14336, 15360, 15392, + 15384, 0, 16384, 12288, 14336, 15360, 15392, 15384, + 0, 16384, 12288, 14336, 15360, 15392, 15384, 15386, + 0, 16384, 12288, 14336, 15360, 15392, 15384, 0, + 16384, 12288, 14336, 15360, 15392, 15393, 15388, 0, + 16384, 12288, 14336, 15360, 15392, 15393, 15388, 0, + 16384, 12288, 14336, 15360, 15392, 15393, 15388, 15390, + 0, 16384, 12288, 14336, 15360, 0, 16384, 12288, + 14336, 15360, 15392, 0, 16384, 12288, 14336, 15360, + 15392, 0, 16384, 12288, 14336, 15360, 15392, 15394, + 0, 16384, 12288, 14336, 15360, 15392, 0, 16384, + 12288, 14336, 15360, 15392, 15396, 0, 16384, 12288, + 14336, 15360, 15392, 15396, 0, 16384, 12288, 14336, + 15360, 15392, 15400, 15398, 0, 16384, 12288, 14336, + 15360, 15392, 0, 16384, 12288, 14336, 15360, 15392, + 15400, 0, 16384, 12288, 14336, 15360, 15392, 15400, + 0, 16384, 12288, 14336, 15360, 15392, 15400, 15402, + 0, 16384, 12288, 14336, 15360, 15392, 15400, 0, + 16384, 12288, 14336, 15360, 15392, 15408, 15404, 0, + 16384, 12288, 14336, 15360, 15392, 15408, 15404, 0, + 16384, 12288, 14336, 15360, 15392, 15408, 15409, 15406, + 0, 16384, 12288, 14336, 15360, 15392, 0, 16384, + 12288, 14336, 15360, 15424, 15408, 0, 16384, 12288, + 14336, 15360, 15424, 15408, 0, 16384, 12288, 14336, + 15360, 15424, 15408, 15410, 0, 16384, 12288, 14336, + 15360, 15424, 15408, 0, 16384, 12288, 14336, 15360, + 15424, 15408, 15412, 0, 16384, 12288, 14336, 15360, + 15424, 15408, 15412, 0, 16384, 12288, 14336, 15360, + 15424, 15408, 15416, 15414, 0, 16384, 12288, 14336, + 15360, 15424, 15408, 0, 16384, 12288, 14336, 15360, + 15424, 15425, 15416, 0, 16384, 12288, 14336, 15360, + 15424, 15425, 15416, 0, 16384, 12288, 14336, 15360, + 15424, 15425, 15416, 15418, 0, 16384, 12288, 14336, + 15360, 15424, 15425, 15416, 0, 16384, 12288, 14336, + 15360, 15424, 15425, 15416, 15420, 0, 16384, 12288, + 14336, 15360, 15424, 15425, 15427, 15420, 0, 16384, + 12288, 14336, 15360, 15424, 15425, 15427, 15420, 15422, + 0, 16384, 12288, 14336, 15360, 0, 16384, 12288, + 14336, 15360, 15424, 0, 16384, 16385, 14336, 15360, + 15424, 0, 16384, 16385, 14336, 15360, 15424, 15426, + 0, 16384, 16385, 14336, 15360, 15424, 0, 16384, + 16385, 14336, 15360, 15424, 15428, 0, 16384, 16385, + 14336, 15360, 15424, 15428, 0, 16384, 16385, 14336, + 15360, 15424, 15432, 15430, 0, 16384, 16385, 14336, + 15360, 15424, 0, 16384, 16385, 14336, 15360, 15424, + 15432, 0, 16384, 16385, 14336, 15360, 15424, 15432, + 0, 16384, 16385, 14336, 15360, 15424, 15432, 15434, + 0, 16384, 16385, 14336, 15360, 15424, 15432, 0, + 16384, 16385, 14336, 15360, 15424, 15440, 15436, 0, + 16384, 16385, 14336, 15360, 15424, 15440, 15436, 0, + 16384, 16385, 14336, 15360, 15424, 15440, 15441, 15438, + 0, 16384, 16385, 14336, 15360, 15424, 0, 16384, + 16385, 14336, 15360, 15424, 15440, 0, 16384, 16385, + 14336, 15360, 15424, 15440, 0, 16384, 16385, 14336, + 15360, 15424, 15440, 15442, 0, 16384, 16385, 14336, + 15360, 15424, 15440, 0, 16384, 16385, 14336, 15360, + 15424, 15440, 15444, 0, 16384, 16385, 14336, 15360, + 15424, 15440, 15444, 0, 16384, 16385, 14336, 15360, + 15424, 15440, 15448, 15446, 0, 16384, 16385, 14336, + 15360, 15424, 15440, 0, 16384, 16385, 14336, 15360, + 15424, 15456, 15448, 0, 16384, 16385, 14336, 15360, + 15424, 15456, 15448, 0, 16384, 16385, 14336, 15360, + 15424, 15456, 15448, 15450, 0, 16384, 16385, 14336, + 15360, 15424, 15456, 15448, 0, 16384, 16385, 14336, + 15360, 15424, 15456, 15457, 15452, 0, 16384, 16385, + 14336, 15360, 15424, 15456, 15457, 15452, 0, 16384, + 16385, 14336, 15360, 15424, 15456, 15457, 15452, 15454, + 0, 16384, 16385, 14336, 15360, 15424, 0, 16384, + 16385, 14336, 15360, 15488, 15456, 0, 16384, 16385, + 14336, 15360, 15488, 15456, 0, 16384, 16385, 14336, + 15360, 15488, 15456, 15458, 0, 16384, 16385, 14336, + 15360, 15488, 15456, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15460, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15460, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15464, 15462, 0, 16384, 16385, 14336, + 15360, 15488, 15456, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15464, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15464, 0, 16384, 16385, 14336, 15360, + 15488, 15456, 15464, 15466, 0, 16384, 16385, 14336, + 15360, 15488, 15456, 15464, 0, 16384, 16385, 14336, + 15360, 15488, 15456, 15472, 15468, 0, 16384, 16385, + 14336, 15360, 15488, 15456, 15472, 15468, 0, 16384, + 16385, 14336, 15360, 15488, 15456, 15472, 15473, 15470, + 0, 16384, 16385, 14336, 15360, 15488, 15456, 0, + 16384, 16385, 14336, 15360, 15488, 15489, 15472, 0, + 16384, 16385, 14336, 15360, 15488, 15489, 15472, 0, + 16384, 16385, 14336, 15360, 15488, 15489, 15472, 15474, + 0, 16384, 16385, 14336, 15360, 15488, 15489, 15472, + 0, 16384, 16385, 14336, 15360, 15488, 15489, 15472, + 15476, 0, 16384, 16385, 14336, 15360, 15488, 15489, + 15472, 15476, 0, 16384, 16385, 14336, 15360, 15488, + 15489, 15472, 15480, 15478, 0, 16384, 16385, 14336, + 15360, 15488, 15489, 15472, 0, 16384, 16385, 14336, + 15360, 15488, 15489, 15472, 15480, 0, 16384, 16385, + 14336, 15360, 15488, 15489, 15491, 15480, 0, 16384, + 16385, 14336, 15360, 15488, 15489, 15491, 15480, 15482, + 0, 16384, 16385, 14336, 15360, 15488, 15489, 15491, + 15480, 0, 16384, 16385, 14336, 15360, 15488, 15489, + 15491, 15480, 15484, 0, 16384, 16385, 14336, 15360, + 15488, 15489, 15491, 15480, 15484, 0, 16384, 16385, + 14336, 15360, 15488, 15489, 15491, 15480, 15484, 15486, + 0, 16384, 16385, 14336, 15360, 0, 16384, 16385, + 14336, 15360, 15488, 0, 16384, 16385, 14336, 15360, + 15488, 0, 16384, 16385, 14336, 15360, 15488, 15490, + 0, 16384, 16385, 14336, 15360, 15488, 0, 16384, + 16385, 14336, 15360, 15488, 15492, 0, 16384, 16385, + 14336, 15360, 15488, 15492, 0, 16384, 16385, 14336, + 15360, 15488, 15496, 15494, 0, 16384, 16385, 14336, + 15360, 15488, 0, 16384, 16385, 14336, 15360, 15488, + 15496, 0, 16384, 16385, 14336, 15360, 15488, 15496, + 0, 16384, 16385, 14336, 15360, 15488, 15496, 15498, + 0, 16384, 16385, 14336, 15360, 15488, 15496, 0, + 16384, 16385, 14336, 15360, 15488, 15504, 15500, 0, + 16384, 16385, 14336, 15360, 15488, 15504, 15500, 0, + 16384, 16385, 14336, 15360, 15488, 15504, 15505, 15502, + 0, 16384, 16385, 14336, 15360, 15488, 0, 16384, + 16385, 14336, 15360, 15488, 15504, 0, 16384, 16385, + 14336, 15360, 15488, 15504, 0, 16384, 16385, 14336, + 15360, 15488, 15504, 15506, 0, 16384, 16385, 14336, + 15360, 15488, 15504, 0, 16384, 16385, 14336, 15360, + 15488, 15504, 15508, 0, 16384, 16385, 14336, 15360, + 15488, 15504, 15508, 0, 16384, 16385, 14336, 15360, + 15488, 15504, 15512, 15510, 0, 16384, 16385, 14336, + 15360, 15488, 15504, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15512, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15512, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15512, 15514, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 15512, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 15521, 15516, 0, 16384, 16385, + 14336, 15360, 15488, 15520, 15521, 15516, 0, 16384, + 16385, 14336, 15360, 15488, 15520, 15521, 15516, 15518, + 0, 16384, 16385, 14336, 15360, 15488, 0, 16384, + 16385, 14336, 15360, 15488, 15520, 0, 16384, 16385, + 14336, 15360, 15488, 15520, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 15522, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15524, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15524, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15528, 15526, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15528, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15528, 0, 16384, 16385, 14336, 15360, + 15488, 15520, 15528, 15530, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 15528, 0, 16384, 16385, 14336, + 15360, 15488, 15520, 15536, 15532, 0, 16384, 16385, + 14336, 15360, 15488, 15520, 15536, 15532, 0, 16384, + 16385, 14336, 15360, 15488, 15520, 15536, 15537, 15534, + 0, 16384, 16385, 14336, 15360, 15488, 15520, 0, + 16384, 16385, 14336, 15360, 15488, 15552, 15536, 0, + 16384, 16385, 14336, 15360, 15488, 15552, 15536, 0, + 16384, 16385, 14336, 15360, 15488, 15552, 15536, 15538, + 0, 16384, 16385, 14336, 15360, 15488, 15552, 15536, + 0, 16384, 16385, 14336, 15360, 15488, 15552, 15536, + 15540, 0, 16384, 16385, 14336, 15360, 15488, 15552, + 15536, 15540, 0, 16384, 16385, 14336, 15360, 15488, + 15552, 15536, 15544, 15542, 0, 16384, 16385, 14336, + 15360, 15488, 15552, 15536, 0, 16384, 16385, 14336, + 15360, 15488, 15552, 15553, 15544, 0, 16384, 16385, + 14336, 15360, 15488, 15552, 15553, 15544, 0, 16384, + 16385, 14336, 15360, 15488, 15552, 15553, 15544, 15546, + 0, 16384, 16385, 14336, 15360, 15488, 15552, 15553, + 15544, 0, 16384, 16385, 14336, 15360, 15488, 15552, + 15553, 15544, 15548, 0, 16384, 16385, 14336, 15360, + 15488, 15552, 15553, 15555, 15548, 0, 16384, 16385, + 14336, 15360, 15488, 15552, 15553, 15555, 15548, 15550, + 0, 16384, 16385, 14336, 15360, 15488, 0, 16384, + 16385, 14336, 15360, 15616, 15552, 0, 16384, 16385, + 14336, 15360, 15616, 15552, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 15554, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15556, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15556, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15560, 15558, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15560, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15560, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15560, 15562, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 15560, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 15568, 15564, 0, 16384, 16385, + 14336, 15360, 15616, 15552, 15568, 15564, 0, 16384, + 16385, 14336, 15360, 15616, 15552, 15568, 15569, 15566, + 0, 16384, 16385, 14336, 15360, 15616, 15552, 0, + 16384, 16385, 14336, 15360, 15616, 15552, 15568, 0, + 16384, 16385, 14336, 15360, 15616, 15552, 15568, 0, + 16384, 16385, 14336, 15360, 15616, 15552, 15568, 15570, + 0, 16384, 16385, 14336, 15360, 15616, 15552, 15568, + 0, 16384, 16385, 14336, 15360, 15616, 15552, 15568, + 15572, 0, 16384, 16385, 14336, 15360, 15616, 15552, + 15568, 15572, 0, 16384, 16385, 14336, 15360, 15616, + 15552, 15568, 15576, 15574, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 15568, 0, 16384, 16385, 14336, + 15360, 15616, 15552, 15584, 15576, 0, 16384, 16385, + 14336, 15360, 15616, 15552, 15584, 15576, 0, 16384, + 16385, 14336, 15360, 15616, 15552, 15584, 15576, 15578, + 0, 16384, 16385, 14336, 15360, 15616, 15552, 15584, + 15576, 0, 16384, 16385, 14336, 15360, 15616, 15552, + 15584, 15585, 15580, 0, 16384, 16385, 14336, 15360, + 15616, 15552, 15584, 15585, 15580, 0, 16384, 16385, + 14336, 15360, 15616, 15552, 15584, 15585, 15580, 15582, + 0, 16384, 16385, 14336, 15360, 15616, 15552, 0, + 16384, 16385, 14336, 15360, 15616, 15617, 15584, 0, + 16384, 16385, 14336, 15360, 15616, 15617, 15584, 0, + 16384, 16385, 14336, 15360, 15616, 15617, 15584, 15586, + 0, 16384, 16385, 14336, 15360, 15616, 15617, 15584, + 0, 16384, 16385, 14336, 15360, 15616, 15617, 15584, + 15588, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15584, 15588, 0, 16384, 16385, 14336, 15360, 15616, + 15617, 15584, 15592, 15590, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15584, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15584, 15592, 0, 16384, 16385, + 14336, 15360, 15616, 15617, 15584, 15592, 0, 16384, + 16385, 14336, 15360, 15616, 15617, 15584, 15592, 15594, + 0, 16384, 16385, 14336, 15360, 15616, 15617, 15584, + 15592, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15584, 15600, 15596, 0, 16384, 16385, 14336, 15360, + 15616, 15617, 15584, 15600, 15596, 0, 16384, 16385, + 14336, 15360, 15616, 15617, 15584, 15600, 15601, 15598, + 0, 16384, 16385, 14336, 15360, 15616, 15617, 15584, + 0, 16384, 16385, 14336, 15360, 15616, 15617, 15584, + 15600, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15619, 15600, 0, 16384, 16385, 14336, 15360, 15616, + 15617, 15619, 15600, 15602, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15619, 15600, 0, 16384, 16385, + 14336, 15360, 15616, 15617, 15619, 15600, 15604, 0, + 16384, 16385, 14336, 15360, 15616, 15617, 15619, 15600, + 15604, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15619, 15600, 15608, 15606, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15619, 15600, 0, 16384, 16385, + 14336, 15360, 15616, 15617, 15619, 15600, 15608, 0, + 16384, 16385, 14336, 15360, 15616, 15617, 15619, 15600, + 15608, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15619, 15600, 15608, 15610, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15619, 15623, 15608, 0, 16384, + 16385, 14336, 15360, 15616, 15617, 15619, 15623, 15608, + 15612, 0, 16384, 16385, 14336, 15360, 15616, 15617, + 15619, 15623, 15608, 15612, 0, 16384, 16385, 14336, + 15360, 15616, 15617, 15619, 15623, 15608, 15612, 15614, + 0, 16384, 16385, 14336, 15360, 0, 16384, 16385, + 14336, 15360, 15616, 0, 16384, 16385, 14336, 15360, + 15616, 0, 16384, 16385, 14336, 15360, 15616, 15618, + 0, 16384, 16385, 16387, 15360, 15616, 0, 16384, + 16385, 16387, 15360, 15616, 15620, 0, 16384, 16385, + 16387, 15360, 15616, 15620, 0, 16384, 16385, 16387, + 15360, 15616, 15624, 15622, 0, 16384, 16385, 16387, + 15360, 15616, 0, 16384, 16385, 16387, 15360, 15616, + 15624, 0, 16384, 16385, 16387, 15360, 15616, 15624, + 0, 16384, 16385, 16387, 15360, 15616, 15624, 15626, + 0, 16384, 16385, 16387, 15360, 15616, 15624, 0, + 16384, 16385, 16387, 15360, 15616, 15632, 15628, 0, + 16384, 16385, 16387, 15360, 15616, 15632, 15628, 0, + 16384, 16385, 16387, 15360, 15616, 15632, 15633, 15630, + 0, 16384, 16385, 16387, 15360, 15616, 0, 16384, + 16385, 16387, 15360, 15616, 15632, 0, 16384, 16385, + 16387, 15360, 15616, 15632, 0, 16384, 16385, 16387, + 15360, 15616, 15632, 15634, 0, 16384, 16385, 16387, + 15360, 15616, 15632, 0, 16384, 16385, 16387, 15360, + 15616, 15632, 15636, 0, 16384, 16385, 16387, 15360, + 15616, 15632, 15636, 0, 16384, 16385, 16387, 15360, + 15616, 15632, 15640, 15638, 0, 16384, 16385, 16387, + 15360, 15616, 15632, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15640, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15640, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15640, 15642, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 15640, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 15649, 15644, 0, 16384, 16385, + 16387, 15360, 15616, 15648, 15649, 15644, 0, 16384, + 16385, 16387, 15360, 15616, 15648, 15649, 15644, 15646, + 0, 16384, 16385, 16387, 15360, 15616, 0, 16384, + 16385, 16387, 15360, 15616, 15648, 0, 16384, 16385, + 16387, 15360, 15616, 15648, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 15650, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15652, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15652, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15656, 15654, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15656, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15656, 0, 16384, 16385, 16387, 15360, + 15616, 15648, 15656, 15658, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 15656, 0, 16384, 16385, 16387, + 15360, 15616, 15648, 15664, 15660, 0, 16384, 16385, + 16387, 15360, 15616, 15648, 15664, 15660, 0, 16384, + 16385, 16387, 15360, 15616, 15648, 15664, 15665, 15662, + 0, 16384, 16385, 16387, 15360, 15616, 15648, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15664, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15664, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15664, 15666, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15664, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15664, + 15668, 0, 16384, 16385, 16387, 15360, 15616, 15680, + 15664, 15668, 0, 16384, 16385, 16387, 15360, 15616, + 15680, 15664, 15672, 15670, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15664, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15681, 15672, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 15681, 15672, 0, 16384, + 16385, 16387, 15360, 15616, 15680, 15681, 15672, 15674, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15681, + 15672, 0, 16384, 16385, 16387, 15360, 15616, 15680, + 15681, 15672, 15676, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15681, 15683, 15676, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 15681, 15683, 15676, 15678, + 0, 16384, 16385, 16387, 15360, 15616, 0, 16384, + 16385, 16387, 15360, 15616, 15680, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15682, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15684, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15684, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15688, 15686, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15688, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15688, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15688, 15690, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15688, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15696, 15692, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 15696, 15692, 0, 16384, + 16385, 16387, 15360, 15616, 15680, 15696, 15697, 15694, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15696, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15696, 0, + 16384, 16385, 16387, 15360, 15616, 15680, 15696, 15698, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15696, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15696, + 15700, 0, 16384, 16385, 16387, 15360, 15616, 15680, + 15696, 15700, 0, 16384, 16385, 16387, 15360, 15616, + 15680, 15696, 15704, 15702, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15696, 0, 16384, 16385, 16387, + 15360, 15616, 15680, 15712, 15704, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 15712, 15704, 0, 16384, + 16385, 16387, 15360, 15616, 15680, 15712, 15704, 15706, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 15712, + 15704, 0, 16384, 16385, 16387, 15360, 15616, 15680, + 15712, 15713, 15708, 0, 16384, 16385, 16387, 15360, + 15616, 15680, 15712, 15713, 15708, 0, 16384, 16385, + 16387, 15360, 15616, 15680, 15712, 15713, 15708, 15710, + 0, 16384, 16385, 16387, 15360, 15616, 15680, 0, + 16384, 16385, 16387, 15360, 15616, 15744, 15712, 0, + 16384, 16385, 16387, 15360, 15616, 15744, 15712, 0, + 16384, 16385, 16387, 15360, 15616, 15744, 15712, 15714, + 0, 16384, 16385, 16387, 15360, 15616, 15744, 15712, + 0, 16384, 16385, 16387, 15360, 15616, 15744, 15712, + 15716, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15712, 15716, 0, 16384, 16385, 16387, 15360, 15616, + 15744, 15712, 15720, 15718, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15712, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15712, 15720, 0, 16384, 16385, + 16387, 15360, 15616, 15744, 15712, 15720, 0, 16384, + 16385, 16387, 15360, 15616, 15744, 15712, 15720, 15722, + 0, 16384, 16385, 16387, 15360, 15616, 15744, 15712, + 15720, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15712, 15728, 15724, 0, 16384, 16385, 16387, 15360, + 15616, 15744, 15712, 15728, 15724, 0, 16384, 16385, + 16387, 15360, 15616, 15744, 15712, 15728, 15729, 15726, + 0, 16384, 16385, 16387, 15360, 15616, 15744, 15712, + 0, 16384, 16385, 16387, 15360, 15616, 15744, 15745, + 15728, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15745, 15728, 0, 16384, 16385, 16387, 15360, 15616, + 15744, 15745, 15728, 15730, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15745, 15728, 0, 16384, 16385, + 16387, 15360, 15616, 15744, 15745, 15728, 15732, 0, + 16384, 16385, 16387, 15360, 15616, 15744, 15745, 15728, + 15732, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15745, 15728, 15736, 15734, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15745, 15728, 0, 16384, 16385, + 16387, 15360, 15616, 15744, 15745, 15728, 15736, 0, + 16384, 16385, 16387, 15360, 15616, 15744, 15745, 15747, + 15736, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15745, 15747, 15736, 15738, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15745, 15747, 15736, 0, 16384, + 16385, 16387, 15360, 15616, 15744, 15745, 15747, 15736, + 15740, 0, 16384, 16385, 16387, 15360, 15616, 15744, + 15745, 15747, 15736, 15740, 0, 16384, 16385, 16387, + 15360, 15616, 15744, 15745, 15747, 15736, 15740, 15742, + 0, 16384, 16385, 16387, 15360, 15616, 0, 16384, + 16385, 16387, 15360, 15872, 15744, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15746, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15748, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15748, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15752, 15750, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15752, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15752, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15752, 15754, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15752, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15760, 15756, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15760, 15756, 0, 16384, + 16385, 16387, 15360, 15872, 15744, 15760, 15761, 15758, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15760, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15760, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15760, 15762, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15760, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15760, + 15764, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15760, 15764, 0, 16384, 16385, 16387, 15360, 15872, + 15744, 15760, 15768, 15766, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15760, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15776, 15768, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15776, 15768, 0, 16384, + 16385, 16387, 15360, 15872, 15744, 15776, 15768, 15770, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15776, + 15768, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15776, 15777, 15772, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15776, 15777, 15772, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15776, 15777, 15772, 15774, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15776, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15776, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15776, 15778, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15776, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15776, + 15780, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15776, 15780, 0, 16384, 16385, 16387, 15360, 15872, + 15744, 15776, 15784, 15782, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15776, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15776, 15784, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15776, 15784, 0, 16384, + 16385, 16387, 15360, 15872, 15744, 15776, 15784, 15786, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15776, + 15784, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15776, 15792, 15788, 0, 16384, 16385, 16387, 15360, + 15872, 15744, 15776, 15792, 15788, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15776, 15792, 15793, 15790, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15776, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 15808, + 15792, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15808, 15792, 0, 16384, 16385, 16387, 15360, 15872, + 15744, 15808, 15792, 15794, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15808, 15792, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15808, 15792, 15796, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15808, 15792, + 15796, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15808, 15792, 15800, 15798, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15808, 15792, 0, 16384, 16385, + 16387, 15360, 15872, 15744, 15808, 15809, 15800, 0, + 16384, 16385, 16387, 15360, 15872, 15744, 15808, 15809, + 15800, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15808, 15809, 15800, 15802, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15808, 15809, 15800, 0, 16384, + 16385, 16387, 15360, 15872, 15744, 15808, 15809, 15800, + 15804, 0, 16384, 16385, 16387, 15360, 15872, 15744, + 15808, 15809, 15811, 15804, 0, 16384, 16385, 16387, + 15360, 15872, 15744, 15808, 15809, 15811, 15804, 15806, + 0, 16384, 16385, 16387, 15360, 15872, 15744, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15808, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15808, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15808, 15810, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 15812, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15812, 0, 16384, 16385, 16387, 15360, 15872, + 15873, 15808, 15816, 15814, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 15816, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15808, 15816, 0, 16384, + 16385, 16387, 15360, 15872, 15873, 15808, 15816, 15818, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 15816, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15824, 15820, 0, 16384, 16385, 16387, 15360, + 15872, 15873, 15808, 15824, 15820, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15808, 15824, 15825, 15822, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 15824, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15824, 0, 16384, 16385, 16387, 15360, 15872, + 15873, 15808, 15824, 15826, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 15824, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15808, 15824, 15828, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15808, 15824, + 15828, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15824, 15832, 15830, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 15824, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15808, 15840, 15832, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15808, 15840, + 15832, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15840, 15832, 15834, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 15840, 15832, 0, 16384, + 16385, 16387, 15360, 15872, 15873, 15808, 15840, 15841, + 15836, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15808, 15840, 15841, 15836, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15808, 15840, 15841, 15836, 15838, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15808, + 15840, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15840, 0, 16384, 16385, 16387, 15360, 15872, + 15873, 15875, 15840, 15842, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15840, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15875, 15840, 15844, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15875, 15840, + 15844, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15840, 15848, 15846, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15840, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15875, 15840, 15848, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15875, 15840, + 15848, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15840, 15848, 15850, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15840, 15848, 0, 16384, + 16385, 16387, 15360, 15872, 15873, 15875, 15840, 15856, + 15852, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15840, 15856, 15852, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15840, 15856, 15857, 15854, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15875, + 15840, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15840, 15856, 0, 16384, 16385, 16387, 15360, + 15872, 15873, 15875, 15840, 15856, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15875, 15840, 15856, 15858, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15875, + 15879, 15856, 0, 16384, 16385, 16387, 15360, 15872, + 15873, 15875, 15879, 15856, 15860, 0, 16384, 16385, + 16387, 15360, 15872, 15873, 15875, 15879, 15856, 15860, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15875, + 15879, 15856, 15864, 15862, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15879, 15856, 0, 16384, + 16385, 16387, 15360, 15872, 15873, 15875, 15879, 15856, + 15864, 0, 16384, 16385, 16387, 15360, 15872, 15873, + 15875, 15879, 15856, 15864, 0, 16384, 16385, 16387, + 15360, 15872, 15873, 15875, 15879, 15856, 15864, 15866, + 0, 16384, 16385, 16387, 15360, 15872, 15873, 15875, + 15879, 15856, 15864, 0, 16384, 16385, 16387, 15360, + 15872, 15873, 15875, 15879, 15856, 15864, 15868, 0, + 16384, 16385, 16387, 15360, 15872, 15873, 15875, 15879, + 15856, 15864, 15868, 0, 16384, 16385, 16387, 15360, + 15872, 15873, 15875, 15879, 15856, 15864, 15868, 15870, + 0, 16384, 16385, 16387, 15360, 0, 16384, 16385, + 16387, 15360, 15872, 0, 16384, 16385, 16387, 15360, + 15872, 0, 16384, 16385, 16387, 15360, 15872, 15874, + 0, 16384, 16385, 16387, 15360, 15872, 0, 16384, + 16385, 16387, 15360, 15872, 15876, 0, 16384, 16385, + 16387, 15360, 15872, 15876, 0, 16384, 16385, 16387, + 15360, 15872, 15880, 15878, 0, 16384, 16385, 16387, + 16391, 15872, 0, 16384, 16385, 16387, 16391, 15872, + 15880, 0, 16384, 16385, 16387, 16391, 15872, 15880, + 0, 16384, 16385, 16387, 16391, 15872, 15880, 15882, + 0, 16384, 16385, 16387, 16391, 15872, 15880, 0, + 16384, 16385, 16387, 16391, 15872, 15888, 15884, 0, + 16384, 16385, 16387, 16391, 15872, 15888, 15884, 0, + 16384, 16385, 16387, 16391, 15872, 15888, 15889, 15886, + 0, 16384, 16385, 16387, 16391, 15872, 0, 16384, + 16385, 16387, 16391, 15872, 15888, 0, 16384, 16385, + 16387, 16391, 15872, 15888, 0, 16384, 16385, 16387, + 16391, 15872, 15888, 15890, 0, 16384, 16385, 16387, + 16391, 15872, 15888, 0, 16384, 16385, 16387, 16391, + 15872, 15888, 15892, 0, 16384, 16385, 16387, 16391, + 15872, 15888, 15892, 0, 16384, 16385, 16387, 16391, + 15872, 15888, 15896, 15894, 0, 16384, 16385, 16387, + 16391, 15872, 15888, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15896, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15896, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15896, 15898, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 15896, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 15905, 15900, 0, 16384, 16385, + 16387, 16391, 15872, 15904, 15905, 15900, 0, 16384, + 16385, 16387, 16391, 15872, 15904, 15905, 15900, 15902, + 0, 16384, 16385, 16387, 16391, 15872, 0, 16384, + 16385, 16387, 16391, 15872, 15904, 0, 16384, 16385, + 16387, 16391, 15872, 15904, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 15906, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15908, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15908, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15912, 15910, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15912, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15912, 0, 16384, 16385, 16387, 16391, + 15872, 15904, 15912, 15914, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 15912, 0, 16384, 16385, 16387, + 16391, 15872, 15904, 15920, 15916, 0, 16384, 16385, + 16387, 16391, 15872, 15904, 15920, 15916, 0, 16384, + 16385, 16387, 16391, 15872, 15904, 15920, 15921, 15918, + 0, 16384, 16385, 16387, 16391, 15872, 15904, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15920, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15920, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15920, 15922, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15920, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15920, + 15924, 0, 16384, 16385, 16387, 16391, 15872, 15936, + 15920, 15924, 0, 16384, 16385, 16387, 16391, 15872, + 15936, 15920, 15928, 15926, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15920, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15937, 15928, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 15937, 15928, 0, 16384, + 16385, 16387, 16391, 15872, 15936, 15937, 15928, 15930, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15937, + 15928, 0, 16384, 16385, 16387, 16391, 15872, 15936, + 15937, 15928, 15932, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15937, 15939, 15932, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 15937, 15939, 15932, 15934, + 0, 16384, 16385, 16387, 16391, 15872, 0, 16384, + 16385, 16387, 16391, 15872, 15936, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15938, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15940, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15940, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15944, 15942, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15944, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15944, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15944, 15946, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15944, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15952, 15948, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 15952, 15948, 0, 16384, + 16385, 16387, 16391, 15872, 15936, 15952, 15953, 15950, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15952, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15952, 0, + 16384, 16385, 16387, 16391, 15872, 15936, 15952, 15954, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15952, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15952, + 15956, 0, 16384, 16385, 16387, 16391, 15872, 15936, + 15952, 15956, 0, 16384, 16385, 16387, 16391, 15872, + 15936, 15952, 15960, 15958, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15952, 0, 16384, 16385, 16387, + 16391, 15872, 15936, 15968, 15960, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 15968, 15960, 0, 16384, + 16385, 16387, 16391, 15872, 15936, 15968, 15960, 15962, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 15968, + 15960, 0, 16384, 16385, 16387, 16391, 15872, 15936, + 15968, 15969, 15964, 0, 16384, 16385, 16387, 16391, + 15872, 15936, 15968, 15969, 15964, 0, 16384, 16385, + 16387, 16391, 15872, 15936, 15968, 15969, 15964, 15966, + 0, 16384, 16385, 16387, 16391, 15872, 15936, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 15968, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 15968, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 15968, 15970, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 15968, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 15968, + 15972, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 15968, 15972, 0, 16384, 16385, 16387, 16391, 15872, + 16000, 15968, 15976, 15974, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 15968, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 15968, 15976, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 15968, 15976, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 15968, 15976, 15978, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 15968, + 15976, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 15968, 15984, 15980, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 15968, 15984, 15980, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 15968, 15984, 15985, 15982, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 15968, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16001, + 15984, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16001, 15984, 0, 16384, 16385, 16387, 16391, 15872, + 16000, 16001, 15984, 15986, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16001, 15984, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16001, 15984, 15988, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16001, 15984, + 15988, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16001, 15984, 15992, 15990, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16001, 15984, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16001, 15984, 15992, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16001, 16003, + 15992, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16001, 16003, 15992, 15994, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16001, 16003, 15992, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 16001, 16003, 15992, + 15996, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16001, 16003, 15992, 15996, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16001, 16003, 15992, 15996, 15998, + 0, 16384, 16385, 16387, 16391, 15872, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16002, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16004, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16004, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16008, 16006, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16008, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16008, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16008, 16010, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16008, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16016, 16012, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16016, 16012, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 16016, 16017, 16014, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16016, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16016, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16016, 16018, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16016, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16016, + 16020, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16016, 16020, 0, 16384, 16385, 16387, 16391, 15872, + 16000, 16016, 16024, 16022, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16016, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16032, 16024, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16032, 16024, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 16032, 16024, 16026, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16032, + 16024, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16032, 16033, 16028, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16032, 16033, 16028, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16032, 16033, 16028, 16030, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16032, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16032, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16032, 16034, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16032, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16032, + 16036, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16032, 16036, 0, 16384, 16385, 16387, 16391, 15872, + 16000, 16032, 16040, 16038, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16032, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16032, 16040, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16032, 16040, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 16032, 16040, 16042, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16032, + 16040, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16032, 16048, 16044, 0, 16384, 16385, 16387, 16391, + 15872, 16000, 16032, 16048, 16044, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16032, 16048, 16049, 16046, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16032, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 16064, + 16048, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16064, 16048, 0, 16384, 16385, 16387, 16391, 15872, + 16000, 16064, 16048, 16050, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16064, 16048, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16064, 16048, 16052, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16064, 16048, + 16052, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16064, 16048, 16056, 16054, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16064, 16048, 0, 16384, 16385, + 16387, 16391, 15872, 16000, 16064, 16065, 16056, 0, + 16384, 16385, 16387, 16391, 15872, 16000, 16064, 16065, + 16056, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16064, 16065, 16056, 16058, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16064, 16065, 16056, 0, 16384, + 16385, 16387, 16391, 15872, 16000, 16064, 16065, 16056, + 16060, 0, 16384, 16385, 16387, 16391, 15872, 16000, + 16064, 16065, 16067, 16060, 0, 16384, 16385, 16387, + 16391, 15872, 16000, 16064, 16065, 16067, 16060, 16062, + 0, 16384, 16385, 16387, 16391, 15872, 16000, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16064, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16064, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16064, 16066, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 16068, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16068, 0, 16384, 16385, 16387, 16391, 15872, + 16128, 16064, 16072, 16070, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 16072, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16064, 16072, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 16064, 16072, 16074, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 16072, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16080, 16076, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16064, 16080, 16076, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16064, 16080, 16081, 16078, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 16080, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16080, 0, 16384, 16385, 16387, 16391, 15872, + 16128, 16064, 16080, 16082, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 16080, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16064, 16080, 16084, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16064, 16080, + 16084, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16080, 16088, 16086, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 16080, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16064, 16096, 16088, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16064, 16096, + 16088, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16096, 16088, 16090, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 16096, 16088, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 16064, 16096, 16097, + 16092, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16064, 16096, 16097, 16092, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16064, 16096, 16097, 16092, 16094, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16064, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16129, + 16096, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16096, 0, 16384, 16385, 16387, 16391, 15872, + 16128, 16129, 16096, 16098, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16096, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16129, 16096, 16100, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16129, 16096, + 16100, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16096, 16104, 16102, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16096, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16129, 16096, 16104, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16129, 16096, + 16104, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16096, 16104, 16106, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16096, 16104, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 16129, 16096, 16112, + 16108, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16096, 16112, 16108, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16096, 16112, 16113, 16110, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16129, + 16096, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16096, 16112, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16129, 16131, 16112, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16129, 16131, 16112, 16114, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16129, + 16131, 16112, 0, 16384, 16385, 16387, 16391, 15872, + 16128, 16129, 16131, 16112, 16116, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16129, 16131, 16112, 16116, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16129, + 16131, 16112, 16120, 16118, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16131, 16112, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 16129, 16131, 16112, + 16120, 0, 16384, 16385, 16387, 16391, 15872, 16128, + 16129, 16131, 16112, 16120, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16129, 16131, 16112, 16120, 16122, + 0, 16384, 16385, 16387, 16391, 15872, 16128, 16129, + 16131, 16135, 16120, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16129, 16131, 16135, 16120, 16124, 0, + 16384, 16385, 16387, 16391, 15872, 16128, 16129, 16131, + 16135, 16120, 16124, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16129, 16131, 16135, 16120, 16124, 16126, + 0, 16384, 16385, 16387, 16391, 15872, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16130, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16132, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16132, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16136, 16134, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16136, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16136, 0, 16384, 16385, 16387, 16391, + 15872, 16128, 16136, 16138, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16136, 0, 16384, 16385, 16387, + 16391, 15872, 16128, 16144, 16140, 0, 16384, 16385, + 16387, 16391, 15872, 16128, 16144, 16140, 0, 16384, + 16385, 16387, 16391, 15872, 16128, 16144, 16145, 16142, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16144, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16144, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16144, 16146, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16144, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16144, + 16148, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16144, 16148, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16144, 16152, 16150, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16144, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16160, 16152, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16160, 16152, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16160, 16152, 16154, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16160, + 16152, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16160, 16161, 16156, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16160, 16161, 16156, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16160, 16161, 16156, 16158, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16160, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16160, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16160, 16162, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16160, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16160, + 16164, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16160, 16164, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16160, 16168, 16166, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16160, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16160, 16168, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16160, 16168, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16160, 16168, 16170, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16160, + 16168, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16160, 16176, 16172, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16160, 16176, 16172, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16160, 16176, 16177, 16174, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16160, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 16176, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16176, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16192, 16176, 16178, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16176, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16176, 16180, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 16176, + 16180, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16176, 16184, 16182, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16176, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16193, 16184, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 16193, + 16184, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16193, 16184, 16186, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16193, 16184, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16192, 16193, 16184, + 16188, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16193, 16195, 16188, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16193, 16195, 16188, 16190, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 16194, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 16196, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16196, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16192, 16200, 16198, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16200, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16200, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16192, 16200, 16202, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 16200, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16208, 16204, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16192, 16208, 16204, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16208, 16209, 16206, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 16208, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16208, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16192, 16208, 16210, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16208, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16208, 16212, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 16208, + 16212, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16208, 16216, 16214, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16208, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16192, 16224, 16216, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16192, 16224, + 16216, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16224, 16216, 16218, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16224, 16216, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16192, 16224, 16225, + 16220, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16192, 16224, 16225, 16220, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16192, 16224, 16225, 16220, 16222, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16192, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16224, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16224, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16256, 16224, 16226, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16224, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16224, 16228, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16224, + 16228, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16224, 16232, 16230, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16224, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16224, 16232, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16224, + 16232, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16224, 16232, 16234, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16224, 16232, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16256, 16224, 16240, + 16236, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16224, 16240, 16236, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16224, 16240, 16241, 16238, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16224, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16257, 16240, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16256, 16257, 16240, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16257, 16240, 16242, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16257, 16240, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16256, 16257, 16240, 16244, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16257, 16240, 16244, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16257, 16240, 16248, 16246, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16257, 16240, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16256, 16257, 16240, + 16248, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16257, 16259, 16248, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16257, 16259, 16248, 16250, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16257, 16259, 16248, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16256, 16257, 16259, 16248, 16252, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16257, + 16259, 16248, 16252, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16256, 16257, 16259, 16248, 16252, 16254, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16258, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16260, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16260, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16256, 16264, 16262, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16264, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16264, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16256, 16264, 16266, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16264, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16272, 16268, 0, 16384, 16385, 16387, 16391, + 16399, 16128, 16256, 16272, 16268, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16272, 16273, 16270, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 0, 16384, 16385, 16387, 16391, 16399, 16128, 16256, + 16272, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16272, 0, 16384, 16385, 16387, 16391, 16399, + 16128, 16256, 16272, 16274, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16272, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16272, 16276, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16272, + 16276, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16272, 16280, 16278, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16272, 0, 16384, 16385, + 16387, 16391, 16399, 16128, 16256, 16288, 16280, 0, + 16384, 16385, 16387, 16391, 16399, 16128, 16256, 16288, + 16280, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16288, 16280, 16282, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16288, 16280, 0, 16384, + 16385, 16387, 16391, 16399, 16128, 16256, 16288, 16289, + 16284, 0, 16384, 16385, 16387, 16391, 16399, 16128, + 16256, 16288, 16289, 16284, 0, 16384, 16385, 16387, + 16391, 16399, 16128, 16256, 16288, 16289, 16284, 16286, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16288, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16288, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16288, 16290, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16288, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16288, 16292, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16288, + 16292, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16288, 16296, 16294, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16288, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16288, 16296, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16288, + 16296, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16288, 16296, 16298, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16288, 16296, 0, 16384, + 16385, 16387, 16391, 16399, 16415, 16256, 16288, 16304, + 16300, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16288, 16304, 16300, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16288, 16304, 16305, 16302, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16288, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16304, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16304, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16304, 16306, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16304, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16304, 16308, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16304, 16308, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16304, 16312, 16310, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16304, 0, 16384, + 16385, 16387, 16391, 16399, 16415, 16256, 16320, 16321, + 16312, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16321, 16312, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16321, 16312, 16314, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16321, 16312, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16321, 16312, 16316, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16321, 16323, 16316, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16321, 16323, 16316, 16318, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16322, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16324, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16324, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16328, 16326, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16328, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16328, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16328, 16330, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16328, 0, 16384, + 16385, 16387, 16391, 16399, 16415, 16256, 16320, 16336, + 16332, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16336, 16332, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16336, 16337, 16334, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16336, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16336, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16336, 16338, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16336, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16336, 16340, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16336, 16340, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16336, 16344, 16342, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16336, 0, 16384, + 16385, 16387, 16391, 16399, 16415, 16256, 16320, 16352, + 16344, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16352, 16344, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 16344, 16346, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 16344, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16353, 16348, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16353, 16348, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16353, 16348, 16350, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16352, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16352, 16354, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16352, 16356, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16352, 16356, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 16360, 16358, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 0, 16384, + 16385, 16387, 16391, 16399, 16415, 16256, 16320, 16352, + 16360, 0, 16384, 16385, 16387, 16391, 16399, 16415, + 16256, 16320, 16352, 16360, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 16360, 16362, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 16360, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16368, 16364, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16368, 16364, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16368, 16369, 16366, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16352, 16368, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16352, 16368, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 16368, 16370, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 16368, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16368, 16372, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16368, 16372, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16368, 16376, 16374, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 16368, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16368, 16376, 0, 16384, 16385, 16387, 16391, + 16399, 16415, 16256, 16320, 16352, 16368, 16376, 0, + 16384, 16385, 16387, 16391, 16399, 16415, 16256, 16320, + 16352, 16368, 16376, 16378, 0, 16384, 16385, 16387, + 16391, 16399, 16415, 16256, 16320, 16352, 16368, 16376, + 0, 16384, 16385, 16387, 16391, 16399, 16415, 16256, + 16320, 16352, 16368, 16376, 16380, 0, 16384, 16385, + 16387, 16391, 16399, 16415, 16256, 16320, 16352, 16368, + 16376, 16380, 0, 16384, 16385, 16387, 16391, 16399, + 16415, 16256, 16320, 16352, 16368, 16376, 16380, 16382, + 0, 0, 16384, 0, 16384, 0, 16384, 16386, + 0, 16384, 0, 16384, 16388, 0, 16384, 16388, + 0, 16384, 16392, 16390, 0, 16384, 0, 16384, + 16392, 0, 16384, 16392, 0, 16384, 16392, 16394, + 0, 16384, 16392, 0, 16384, 16400, 16396, 0, + 16384, 16400, 16396, 0, 16384, 16400, 16401, 16398, + 0, 16384, 0, 16384, 16400, 0, 16384, 16400, + 0, 16384, 16400, 16402, 0, 16384, 16400, 0, + 16384, 16400, 16404, 0, 16384, 16400, 16404, 0, + 16384, 16400, 16408, 16406, 0, 16384, 16400, 0, + 16384, 16416, 16408, 0, 16384, 16416, 16408, 0, + 16384, 16416, 16408, 16410, 0, 16384, 16416, 16408, + 0, 16384, 16416, 16417, 16412, 0, 16384, 16416, + 16417, 16412, 0, 16384, 16416, 16417, 16412, 16414, + 0, 16384, 0, 16384, 16416, 0, 16384, 16416, + 0, 16384, 16416, 16418, 0, 16384, 16416, 0, + 16384, 16416, 16420, 0, 16384, 16416, 16420, 0, + 16384, 16416, 16424, 16422, 0, 16384, 16416, 0, + 16384, 16416, 16424, 0, 16384, 16416, 16424, 0, + 16384, 16416, 16424, 16426, 0, 16384, 16416, 16424, + 0, 16384, 16416, 16432, 16428, 0, 16384, 16416, + 16432, 16428, 0, 16384, 16416, 16432, 16433, 16430, + 0, 16384, 16416, 0, 16384, 16448, 16432, 0, + 16384, 16448, 16432, 0, 16384, 16448, 16432, 16434, + 0, 16384, 16448, 16432, 0, 16384, 16448, 16432, + 16436, 0, 16384, 16448, 16432, 16436, 0, 16384, + 16448, 16432, 16440, 16438, 0, 16384, 16448, 16432, + 0, 16384, 16448, 16449, 16440, 0, 16384, 16448, + 16449, 16440, 0, 16384, 16448, 16449, 16440, 16442, + 0, 16384, 16448, 16449, 16440, 0, 16384, 16448, + 16449, 16440, 16444, 0, 16384, 16448, 16449, 16451, + 16444, 0, 16384, 16448, 16449, 16451, 16444, 16446, + 0, 16384, 0, 16384, 16448, 0, 16384, 16448, + 0, 16384, 16448, 16450, 0, 16384, 16448, 0, + 16384, 16448, 16452, 0, 16384, 16448, 16452, 0, + 16384, 16448, 16456, 16454, 0, 16384, 16448, 0, + 16384, 16448, 16456, 0, 16384, 16448, 16456, 0, + 16384, 16448, 16456, 16458, 0, 16384, 16448, 16456, + 0, 16384, 16448, 16464, 16460, 0, 16384, 16448, + 16464, 16460, 0, 16384, 16448, 16464, 16465, 16462, + 0, 16384, 16448, 0, 16384, 16448, 16464, 0, + 16384, 16448, 16464, 0, 16384, 16448, 16464, 16466, + 0, 16384, 16448, 16464, 0, 16384, 16448, 16464, + 16468, 0, 16384, 16448, 16464, 16468, 0, 16384, + 16448, 16464, 16472, 16470, 0, 16384, 16448, 16464, + 0, 16384, 16448, 16480, 16472, 0, 16384, 16448, + 16480, 16472, 0, 16384, 16448, 16480, 16472, 16474, + 0, 16384, 16448, 16480, 16472, 0, 16384, 16448, + 16480, 16481, 16476, 0, 16384, 16448, 16480, 16481, + 16476, 0, 16384, 16448, 16480, 16481, 16476, 16478, + 0, 16384, 16448, 0, 16384, 16512, 16480, 0, + 16384, 16512, 16480, 0, 16384, 16512, 16480, 16482, + 0, 16384, 16512, 16480, 0, 16384, 16512, 16480, + 16484, 0, 16384, 16512, 16480, 16484, 0, 16384, + 16512, 16480, 16488, 16486, 0, 16384, 16512, 16480, + 0, 16384, 16512, 16480, 16488, 0, 16384, 16512, + 16480, 16488, 0, 16384, 16512, 16480, 16488, 16490, + 0, 16384, 16512, 16480, 16488, 0, 16384, 16512, + 16480, 16496, 16492, 0, 16384, 16512, 16480, 16496, + 16492, 0, 16384, 16512, 16480, 16496, 16497, 16494, + 0, 16384, 16512, 16480, 0, 16384, 16512, 16513, + 16496, 0, 16384, 16512, 16513, 16496, 0, 16384, + 16512, 16513, 16496, 16498, 0, 16384, 16512, 16513, + 16496, 0, 16384, 16512, 16513, 16496, 16500, 0, + 16384, 16512, 16513, 16496, 16500, 0, 16384, 16512, + 16513, 16496, 16504, 16502, 0, 16384, 16512, 16513, + 16496, 0, 16384, 16512, 16513, 16496, 16504, 0, + 16384, 16512, 16513, 16515, 16504, 0, 16384, 16512, + 16513, 16515, 16504, 16506, 0, 16384, 16512, 16513, + 16515, 16504, 0, 16384, 16512, 16513, 16515, 16504, + 16508, 0, 16384, 16512, 16513, 16515, 16504, 16508, + 0, 16384, 16512, 16513, 16515, 16504, 16508, 16510, + 0, 16384, 0, 16384, 16512, 0, 16384, 16512, + 0, 16384, 16512, 16514, 0, 16384, 16512, 0, + 16384, 16512, 16516, 0, 16384, 16512, 16516, 0, + 16384, 16512, 16520, 16518, 0, 16384, 16512, 0, + 16384, 16512, 16520, 0, 16384, 16512, 16520, 0, + 16384, 16512, 16520, 16522, 0, 16384, 16512, 16520, + 0, 16384, 16512, 16528, 16524, 0, 16384, 16512, + 16528, 16524, 0, 16384, 16512, 16528, 16529, 16526, + 0, 16384, 16512, 0, 16384, 16512, 16528, 0, + 16384, 16512, 16528, 0, 16384, 16512, 16528, 16530, + 0, 16384, 16512, 16528, 0, 16384, 16512, 16528, + 16532, 0, 16384, 16512, 16528, 16532, 0, 16384, + 16512, 16528, 16536, 16534, 0, 16384, 16512, 16528, + 0, 16384, 16512, 16544, 16536, 0, 16384, 16512, + 16544, 16536, 0, 16384, 16512, 16544, 16536, 16538, + 0, 16384, 16512, 16544, 16536, 0, 16384, 16512, + 16544, 16545, 16540, 0, 16384, 16512, 16544, 16545, + 16540, 0, 16384, 16512, 16544, 16545, 16540, 16542, + 0, 16384, 16512, 0, 16384, 16512, 16544, 0, + 16384, 16512, 16544, 0, 16384, 16512, 16544, 16546, + 0, 16384, 16512, 16544, 0, 16384, 16512, 16544, + 16548, 0, 16384, 16512, 16544, 16548, 0, 16384, + 16512, 16544, 16552, 16550, 0, 16384, 16512, 16544, + 0, 16384, 16512, 16544, 16552, 0, 16384, 16512, + 16544, 16552, 0, 16384, 16512, 16544, 16552, 16554, + 0, 16384, 16512, 16544, 16552, 0, 16384, 16512, + 16544, 16560, 16556, 0, 16384, 16512, 16544, 16560, + 16556, 0, 16384, 16512, 16544, 16560, 16561, 16558, + 0, 16384, 16512, 16544, 0, 16384, 16512, 16576, + 16560, 0, 16384, 16512, 16576, 16560, 0, 16384, + 16512, 16576, 16560, 16562, 0, 16384, 16512, 16576, + 16560, 0, 16384, 16512, 16576, 16560, 16564, 0, + 16384, 16512, 16576, 16560, 16564, 0, 16384, 16512, + 16576, 16560, 16568, 16566, 0, 16384, 16512, 16576, + 16560, 0, 16384, 16512, 16576, 16577, 16568, 0, + 16384, 16512, 16576, 16577, 16568, 0, 16384, 16512, + 16576, 16577, 16568, 16570, 0, 16384, 16512, 16576, + 16577, 16568, 0, 16384, 16512, 16576, 16577, 16568, + 16572, 0, 16384, 16512, 16576, 16577, 16579, 16572, + 0, 16384, 16512, 16576, 16577, 16579, 16572, 16574, + 0, 16384, 16512, 0, 16384, 16640, 16576, 0, + 16384, 16640, 16576, 0, 16384, 16640, 16576, 16578, + 0, 16384, 16640, 16576, 0, 16384, 16640, 16576, + 16580, 0, 16384, 16640, 16576, 16580, 0, 16384, + 16640, 16576, 16584, 16582, 0, 16384, 16640, 16576, + 0, 16384, 16640, 16576, 16584, 0, 16384, 16640, + 16576, 16584, 0, 16384, 16640, 16576, 16584, 16586, + 0, 16384, 16640, 16576, 16584, 0, 16384, 16640, + 16576, 16592, 16588, 0, 16384, 16640, 16576, 16592, + 16588, 0, 16384, 16640, 16576, 16592, 16593, 16590, + 0, 16384, 16640, 16576, 0, 16384, 16640, 16576, + 16592, 0, 16384, 16640, 16576, 16592, 0, 16384, + 16640, 16576, 16592, 16594, 0, 16384, 16640, 16576, + 16592, 0, 16384, 16640, 16576, 16592, 16596, 0, + 16384, 16640, 16576, 16592, 16596, 0, 16384, 16640, + 16576, 16592, 16600, 16598, 0, 16384, 16640, 16576, + 16592, 0, 16384, 16640, 16576, 16608, 16600, 0, + 16384, 16640, 16576, 16608, 16600, 0, 16384, 16640, + 16576, 16608, 16600, 16602, 0, 16384, 16640, 16576, + 16608, 16600, 0, 16384, 16640, 16576, 16608, 16609, + 16604, 0, 16384, 16640, 16576, 16608, 16609, 16604, + 0, 16384, 16640, 16576, 16608, 16609, 16604, 16606, + 0, 16384, 16640, 16576, 0, 16384, 16640, 16641, + 16608, 0, 16384, 16640, 16641, 16608, 0, 16384, + 16640, 16641, 16608, 16610, 0, 16384, 16640, 16641, + 16608, 0, 16384, 16640, 16641, 16608, 16612, 0, + 16384, 16640, 16641, 16608, 16612, 0, 16384, 16640, + 16641, 16608, 16616, 16614, 0, 16384, 16640, 16641, + 16608, 0, 16384, 16640, 16641, 16608, 16616, 0, + 16384, 16640, 16641, 16608, 16616, 0, 16384, 16640, + 16641, 16608, 16616, 16618, 0, 16384, 16640, 16641, + 16608, 16616, 0, 16384, 16640, 16641, 16608, 16624, + 16620, 0, 16384, 16640, 16641, 16608, 16624, 16620, + 0, 16384, 16640, 16641, 16608, 16624, 16625, 16622, + 0, 16384, 16640, 16641, 16608, 0, 16384, 16640, + 16641, 16608, 16624, 0, 16384, 16640, 16641, 16643, + 16624, 0, 16384, 16640, 16641, 16643, 16624, 16626, + 0, 16384, 16640, 16641, 16643, 16624, 0, 16384, + 16640, 16641, 16643, 16624, 16628, 0, 16384, 16640, + 16641, 16643, 16624, 16628, 0, 16384, 16640, 16641, + 16643, 16624, 16632, 16630, 0, 16384, 16640, 16641, + 16643, 16624, 0, 16384, 16640, 16641, 16643, 16624, + 16632, 0, 16384, 16640, 16641, 16643, 16624, 16632, + 0, 16384, 16640, 16641, 16643, 16624, 16632, 16634, + 0, 16384, 16640, 16641, 16643, 16647, 16632, 0, + 16384, 16640, 16641, 16643, 16647, 16632, 16636, 0, + 16384, 16640, 16641, 16643, 16647, 16632, 16636, 0, + 16384, 16640, 16641, 16643, 16647, 16632, 16636, 16638, + 0, 16384, 0, 16384, 16640, 0, 16384, 16640, + 0, 16384, 16640, 16642, 0, 16384, 16640, 0, + 16384, 16640, 16644, 0, 16384, 16640, 16644, 0, + 16384, 16640, 16648, 16646, 0, 16384, 16640, 0, + 16384, 16640, 16648, 0, 16384, 16640, 16648, 0, + 16384, 16640, 16648, 16650, 0, 16384, 16640, 16648, + 0, 16384, 16640, 16656, 16652, 0, 16384, 16640, + 16656, 16652, 0, 16384, 16640, 16656, 16657, 16654, + 0, 16384, 16640, 0, 16384, 16640, 16656, 0, + 16384, 16640, 16656, 0, 16384, 16640, 16656, 16658, + 0, 16384, 16640, 16656, 0, 16384, 16640, 16656, + 16660, 0, 16384, 16640, 16656, 16660, 0, 16384, + 16640, 16656, 16664, 16662, 0, 16384, 16640, 16656, + 0, 16384, 16640, 16672, 16664, 0, 16384, 16640, + 16672, 16664, 0, 16384, 16640, 16672, 16664, 16666, + 0, 16384, 16640, 16672, 16664, 0, 16384, 16640, + 16672, 16673, 16668, 0, 16384, 16640, 16672, 16673, + 16668, 0, 16384, 16640, 16672, 16673, 16668, 16670, + 0, 16384, 16640, 0, 16384, 16640, 16672, 0, + 16384, 16640, 16672, 0, 16384, 16640, 16672, 16674, + 0, 16384, 16640, 16672, 0, 16384, 16640, 16672, + 16676, 0, 16384, 16640, 16672, 16676, 0, 16384, + 16640, 16672, 16680, 16678, 0, 16384, 16640, 16672, + 0, 16384, 16640, 16672, 16680, 0, 16384, 16640, + 16672, 16680, 0, 16384, 16640, 16672, 16680, 16682, + 0, 16384, 16640, 16672, 16680, 0, 16384, 16640, + 16672, 16688, 16684, 0, 16384, 16640, 16672, 16688, + 16684, 0, 16384, 16640, 16672, 16688, 16689, 16686, + 0, 16384, 16640, 16672, 0, 16384, 16640, 16704, + 16688, 0, 16384, 16640, 16704, 16688, 0, 16384, + 16640, 16704, 16688, 16690, 0, 16384, 16640, 16704, + 16688, 0, 16384, 16640, 16704, 16688, 16692, 0, + 16384, 16640, 16704, 16688, 16692, 0, 16384, 16640, + 16704, 16688, 16696, 16694, 0, 16384, 16640, 16704, + 16688, 0, 16384, 16640, 16704, 16705, 16696, 0, + 16384, 16640, 16704, 16705, 16696, 0, 16384, 16640, + 16704, 16705, 16696, 16698, 0, 16384, 16640, 16704, + 16705, 16696, 0, 16384, 16640, 16704, 16705, 16696, + 16700, 0, 16384, 16640, 16704, 16705, 16707, 16700, + 0, 16384, 16640, 16704, 16705, 16707, 16700, 16702, + 0, 16384, 16640, 0, 16384, 16640, 16704, 0, + 16384, 16640, 16704, 0, 16384, 16640, 16704, 16706, + 0, 16384, 16640, 16704, 0, 16384, 16640, 16704, + 16708, 0, 16384, 16640, 16704, 16708, 0, 16384, + 16640, 16704, 16712, 16710, 0, 16384, 16640, 16704, + 0, 16384, 16640, 16704, 16712, 0, 16384, 16640, + 16704, 16712, 0, 16384, 16640, 16704, 16712, 16714, + 0, 16384, 16640, 16704, 16712, 0, 16384, 16640, + 16704, 16720, 16716, 0, 16384, 16640, 16704, 16720, + 16716, 0, 16384, 16640, 16704, 16720, 16721, 16718, + 0, 16384, 16640, 16704, 0, 16384, 16640, 16704, + 16720, 0, 16384, 16640, 16704, 16720, 0, 16384, + 16640, 16704, 16720, 16722, 0, 16384, 16640, 16704, + 16720, 0, 16384, 16640, 16704, 16720, 16724, 0, + 16384, 16640, 16704, 16720, 16724, 0, 16384, 16640, + 16704, 16720, 16728, 16726, 0, 16384, 16640, 16704, + 16720, 0, 16384, 16640, 16704, 16736, 16728, 0, + 16384, 16640, 16704, 16736, 16728, 0, 16384, 16640, + 16704, 16736, 16728, 16730, 0, 16384, 16640, 16704, + 16736, 16728, 0, 16384, 16640, 16704, 16736, 16737, + 16732, 0, 16384, 16640, 16704, 16736, 16737, 16732, + 0, 16384, 16640, 16704, 16736, 16737, 16732, 16734, + 0, 16384, 16640, 16704, 0, 16384, 16640, 16768, + 16736, 0, 16384, 16640, 16768, 16736, 0, 16384, + 16640, 16768, 16736, 16738, 0, 16384, 16640, 16768, + 16736, 0, 16384, 16640, 16768, 16736, 16740, 0, + 16384, 16640, 16768, 16736, 16740, 0, 16384, 16640, + 16768, 16736, 16744, 16742, 0, 16384, 16640, 16768, + 16736, 0, 16384, 16640, 16768, 16736, 16744, 0, + 16384, 16640, 16768, 16736, 16744, 0, 16384, 16640, + 16768, 16736, 16744, 16746, 0, 16384, 16640, 16768, + 16736, 16744, 0, 16384, 16640, 16768, 16736, 16752, + 16748, 0, 16384, 16640, 16768, 16736, 16752, 16748, + 0, 16384, 16640, 16768, 16736, 16752, 16753, 16750, + 0, 16384, 16640, 16768, 16736, 0, 16384, 16640, + 16768, 16769, 16752, 0, 16384, 16640, 16768, 16769, + 16752, 0, 16384, 16640, 16768, 16769, 16752, 16754, + 0, 16384, 16640, 16768, 16769, 16752, 0, 16384, + 16640, 16768, 16769, 16752, 16756, 0, 16384, 16640, + 16768, 16769, 16752, 16756, 0, 16384, 16640, 16768, + 16769, 16752, 16760, 16758, 0, 16384, 16640, 16768, + 16769, 16752, 0, 16384, 16640, 16768, 16769, 16752, + 16760, 0, 16384, 16640, 16768, 16769, 16771, 16760, + 0, 16384, 16640, 16768, 16769, 16771, 16760, 16762, + 0, 16384, 16640, 16768, 16769, 16771, 16760, 0, + 16384, 16640, 16768, 16769, 16771, 16760, 16764, 0, + 16384, 16640, 16768, 16769, 16771, 16760, 16764, 0, + 16384, 16640, 16768, 16769, 16771, 16760, 16764, 16766, + 0, 16384, 16640, 0, 16384, 16896, 16768, 0, + 16384, 16896, 16768, 0, 16384, 16896, 16768, 16770, + 0, 16384, 16896, 16768, 0, 16384, 16896, 16768, + 16772, 0, 16384, 16896, 16768, 16772, 0, 16384, + 16896, 16768, 16776, 16774, 0, 16384, 16896, 16768, + 0, 16384, 16896, 16768, 16776, 0, 16384, 16896, + 16768, 16776, 0, 16384, 16896, 16768, 16776, 16778, + 0, 16384, 16896, 16768, 16776, 0, 16384, 16896, + 16768, 16784, 16780, 0, 16384, 16896, 16768, 16784, + 16780, 0, 16384, 16896, 16768, 16784, 16785, 16782, + 0, 16384, 16896, 16768, 0, 16384, 16896, 16768, + 16784, 0, 16384, 16896, 16768, 16784, 0, 16384, + 16896, 16768, 16784, 16786, 0, 16384, 16896, 16768, + 16784, 0, 16384, 16896, 16768, 16784, 16788, 0, + 16384, 16896, 16768, 16784, 16788, 0, 16384, 16896, + 16768, 16784, 16792, 16790, 0, 16384, 16896, 16768, + 16784, 0, 16384, 16896, 16768, 16800, 16792, 0, + 16384, 16896, 16768, 16800, 16792, 0, 16384, 16896, + 16768, 16800, 16792, 16794, 0, 16384, 16896, 16768, + 16800, 16792, 0, 16384, 16896, 16768, 16800, 16801, + 16796, 0, 16384, 16896, 16768, 16800, 16801, 16796, + 0, 16384, 16896, 16768, 16800, 16801, 16796, 16798, + 0, 16384, 16896, 16768, 0, 16384, 16896, 16768, + 16800, 0, 16384, 16896, 16768, 16800, 0, 16384, + 16896, 16768, 16800, 16802, 0, 16384, 16896, 16768, + 16800, 0, 16384, 16896, 16768, 16800, 16804, 0, + 16384, 16896, 16768, 16800, 16804, 0, 16384, 16896, + 16768, 16800, 16808, 16806, 0, 16384, 16896, 16768, + 16800, 0, 16384, 16896, 16768, 16800, 16808, 0, + 16384, 16896, 16768, 16800, 16808, 0, 16384, 16896, + 16768, 16800, 16808, 16810, 0, 16384, 16896, 16768, + 16800, 16808, 0, 16384, 16896, 16768, 16800, 16816, + 16812, 0, 16384, 16896, 16768, 16800, 16816, 16812, + 0, 16384, 16896, 16768, 16800, 16816, 16817, 16814, + 0, 16384, 16896, 16768, 16800, 0, 16384, 16896, + 16768, 16832, 16816, 0, 16384, 16896, 16768, 16832, + 16816, 0, 16384, 16896, 16768, 16832, 16816, 16818, + 0, 16384, 16896, 16768, 16832, 16816, 0, 16384, + 16896, 16768, 16832, 16816, 16820, 0, 16384, 16896, + 16768, 16832, 16816, 16820, 0, 16384, 16896, 16768, + 16832, 16816, 16824, 16822, 0, 16384, 16896, 16768, + 16832, 16816, 0, 16384, 16896, 16768, 16832, 16833, + 16824, 0, 16384, 16896, 16768, 16832, 16833, 16824, + 0, 16384, 16896, 16768, 16832, 16833, 16824, 16826, + 0, 16384, 16896, 16768, 16832, 16833, 16824, 0, + 16384, 16896, 16768, 16832, 16833, 16824, 16828, 0, + 16384, 16896, 16768, 16832, 16833, 16835, 16828, 0, + 16384, 16896, 16768, 16832, 16833, 16835, 16828, 16830, + 0, 16384, 16896, 16768, 0, 16384, 16896, 16897, + 16832, 0, 16384, 16896, 16897, 16832, 0, 16384, + 16896, 16897, 16832, 16834, 0, 16384, 16896, 16897, + 16832, 0, 16384, 16896, 16897, 16832, 16836, 0, + 16384, 16896, 16897, 16832, 16836, 0, 16384, 16896, + 16897, 16832, 16840, 16838, 0, 16384, 16896, 16897, + 16832, 0, 16384, 16896, 16897, 16832, 16840, 0, + 16384, 16896, 16897, 16832, 16840, 0, 16384, 16896, + 16897, 16832, 16840, 16842, 0, 16384, 16896, 16897, + 16832, 16840, 0, 16384, 16896, 16897, 16832, 16848, + 16844, 0, 16384, 16896, 16897, 16832, 16848, 16844, + 0, 16384, 16896, 16897, 16832, 16848, 16849, 16846, + 0, 16384, 16896, 16897, 16832, 0, 16384, 16896, + 16897, 16832, 16848, 0, 16384, 16896, 16897, 16832, + 16848, 0, 16384, 16896, 16897, 16832, 16848, 16850, + 0, 16384, 16896, 16897, 16832, 16848, 0, 16384, + 16896, 16897, 16832, 16848, 16852, 0, 16384, 16896, + 16897, 16832, 16848, 16852, 0, 16384, 16896, 16897, + 16832, 16848, 16856, 16854, 0, 16384, 16896, 16897, + 16832, 16848, 0, 16384, 16896, 16897, 16832, 16864, + 16856, 0, 16384, 16896, 16897, 16832, 16864, 16856, + 0, 16384, 16896, 16897, 16832, 16864, 16856, 16858, + 0, 16384, 16896, 16897, 16832, 16864, 16856, 0, + 16384, 16896, 16897, 16832, 16864, 16865, 16860, 0, + 16384, 16896, 16897, 16832, 16864, 16865, 16860, 0, + 16384, 16896, 16897, 16832, 16864, 16865, 16860, 16862, + 0, 16384, 16896, 16897, 16832, 0, 16384, 16896, + 16897, 16832, 16864, 0, 16384, 16896, 16897, 16899, + 16864, 0, 16384, 16896, 16897, 16899, 16864, 16866, + 0, 16384, 16896, 16897, 16899, 16864, 0, 16384, + 16896, 16897, 16899, 16864, 16868, 0, 16384, 16896, + 16897, 16899, 16864, 16868, 0, 16384, 16896, 16897, + 16899, 16864, 16872, 16870, 0, 16384, 16896, 16897, + 16899, 16864, 0, 16384, 16896, 16897, 16899, 16864, + 16872, 0, 16384, 16896, 16897, 16899, 16864, 16872, + 0, 16384, 16896, 16897, 16899, 16864, 16872, 16874, + 0, 16384, 16896, 16897, 16899, 16864, 16872, 0, + 16384, 16896, 16897, 16899, 16864, 16880, 16876, 0, + 16384, 16896, 16897, 16899, 16864, 16880, 16876, 0, + 16384, 16896, 16897, 16899, 16864, 16880, 16881, 16878, + 0, 16384, 16896, 16897, 16899, 16864, 0, 16384, + 16896, 16897, 16899, 16864, 16880, 0, 16384, 16896, + 16897, 16899, 16864, 16880, 0, 16384, 16896, 16897, + 16899, 16864, 16880, 16882, 0, 16384, 16896, 16897, + 16899, 16903, 16880, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16884, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16884, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16888, 16886, 0, 16384, 16896, 16897, + 16899, 16903, 16880, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16888, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16888, 0, 16384, 16896, 16897, 16899, + 16903, 16880, 16888, 16890, 0, 16384, 16896, 16897, + 16899, 16903, 16880, 16888, 0, 16384, 16896, 16897, + 16899, 16903, 16880, 16888, 16892, 0, 16384, 16896, + 16897, 16899, 16903, 16880, 16888, 16892, 0, 16384, + 16896, 16897, 16899, 16903, 16880, 16888, 16892, 16894, + 0, 16384, 0, 16384, 16896, 0, 16384, 16896, + 0, 16384, 16896, 16898, 0, 16384, 16896, 0, + 16384, 16896, 16900, 0, 16384, 16896, 16900, 0, + 16384, 16896, 16904, 16902, 0, 16384, 16896, 0, + 16384, 16896, 16904, 0, 16384, 16896, 16904, 0, + 16384, 16896, 16904, 16906, 0, 16384, 16896, 16904, + 0, 16384, 16896, 16912, 16908, 0, 16384, 16896, + 16912, 16908, 0, 16384, 16896, 16912, 16913, 16910, + 0, 16384, 16896, 0, 16384, 16896, 16912, 0, + 16384, 16896, 16912, 0, 16384, 16896, 16912, 16914, + 0, 16384, 16896, 16912, 0, 16384, 16896, 16912, + 16916, 0, 16384, 16896, 16912, 16916, 0, 16384, + 16896, 16912, 16920, 16918, 0, 16384, 16896, 16912, + 0, 16384, 16896, 16928, 16920, 0, 16384, 16896, + 16928, 16920, 0, 16384, 16896, 16928, 16920, 16922, + 0, 16384, 16896, 16928, 16920, 0, 16384, 16896, + 16928, 16929, 16924, 0, 16384, 16896, 16928, 16929, + 16924, 0, 16384, 16896, 16928, 16929, 16924, 16926, + 0, 16384, 16896, 0, 16384, 16896, 16928, 0, + 16384, 16896, 16928, 0, 16384, 16896, 16928, 16930, + 0, 16384, 16896, 16928, 0, 16384, 16896, 16928, + 16932, 0, 16384, 16896, 16928, 16932, 0, 16384, + 16896, 16928, 16936, 16934, 0, 16384, 16896, 16928, + 0, 16384, 16896, 16928, 16936, 0, 16384, 16896, + 16928, 16936, 0, 16384, 16896, 16928, 16936, 16938, + 0, 16384, 16896, 16928, 16936, 0, 16384, 16896, + 16928, 16944, 16940, 0, 16384, 16896, 16928, 16944, + 16940, 0, 16384, 16896, 16928, 16944, 16945, 16942, + 0, 16384, 16896, 16928, 0, 16384, 16896, 16960, + 16944, 0, 16384, 16896, 16960, 16944, 0, 16384, + 16896, 16960, 16944, 16946, 0, 16384, 16896, 16960, + 16944, 0, 16384, 16896, 16960, 16944, 16948, 0, + 16384, 16896, 16960, 16944, 16948, 0, 16384, 16896, + 16960, 16944, 16952, 16950, 0, 16384, 16896, 16960, + 16944, 0, 16384, 16896, 16960, 16961, 16952, 0, + 16384, 16896, 16960, 16961, 16952, 0, 16384, 16896, + 16960, 16961, 16952, 16954, 0, 16384, 16896, 16960, + 16961, 16952, 0, 16384, 16896, 16960, 16961, 16952, + 16956, 0, 16384, 16896, 16960, 16961, 16963, 16956, + 0, 16384, 16896, 16960, 16961, 16963, 16956, 16958, + 0, 16384, 16896, 0, 16384, 16896, 16960, 0, + 16384, 16896, 16960, 0, 16384, 16896, 16960, 16962, + 0, 16384, 16896, 16960, 0, 16384, 16896, 16960, + 16964, 0, 16384, 16896, 16960, 16964, 0, 16384, + 16896, 16960, 16968, 16966, 0, 16384, 16896, 16960, + 0, 16384, 16896, 16960, 16968, 0, 16384, 16896, + 16960, 16968, 0, 16384, 16896, 16960, 16968, 16970, + 0, 16384, 16896, 16960, 16968, 0, 16384, 16896, + 16960, 16976, 16972, 0, 16384, 16896, 16960, 16976, + 16972, 0, 16384, 16896, 16960, 16976, 16977, 16974, + 0, 16384, 16896, 16960, 0, 16384, 16896, 16960, + 16976, 0, 16384, 16896, 16960, 16976, 0, 16384, + 16896, 16960, 16976, 16978, 0, 16384, 16896, 16960, + 16976, 0, 16384, 16896, 16960, 16976, 16980, 0, + 16384, 16896, 16960, 16976, 16980, 0, 16384, 16896, + 16960, 16976, 16984, 16982, 0, 16384, 16896, 16960, + 16976, 0, 16384, 16896, 16960, 16992, 16984, 0, + 16384, 16896, 16960, 16992, 16984, 0, 16384, 16896, + 16960, 16992, 16984, 16986, 0, 16384, 16896, 16960, + 16992, 16984, 0, 16384, 16896, 16960, 16992, 16993, + 16988, 0, 16384, 16896, 16960, 16992, 16993, 16988, + 0, 16384, 16896, 16960, 16992, 16993, 16988, 16990, + 0, 16384, 16896, 16960, 0, 16384, 16896, 17024, + 16992, 0, 16384, 16896, 17024, 16992, 0, 16384, + 16896, 17024, 16992, 16994, 0, 16384, 16896, 17024, + 16992, 0, 16384, 16896, 17024, 16992, 16996, 0, + 16384, 16896, 17024, 16992, 16996, 0, 16384, 16896, + 17024, 16992, 17000, 16998, 0, 16384, 16896, 17024, + 16992, 0, 16384, 16896, 17024, 16992, 17000, 0, + 16384, 16896, 17024, 16992, 17000, 0, 16384, 16896, + 17024, 16992, 17000, 17002, 0, 16384, 16896, 17024, + 16992, 17000, 0, 16384, 16896, 17024, 16992, 17008, + 17004, 0, 16384, 16896, 17024, 16992, 17008, 17004, + 0, 16384, 16896, 17024, 16992, 17008, 17009, 17006, + 0, 16384, 16896, 17024, 16992, 0, 16384, 16896, + 17024, 17025, 17008, 0, 16384, 16896, 17024, 17025, + 17008, 0, 16384, 16896, 17024, 17025, 17008, 17010, + 0, 16384, 16896, 17024, 17025, 17008, 0, 16384, + 16896, 17024, 17025, 17008, 17012, 0, 16384, 16896, + 17024, 17025, 17008, 17012, 0, 16384, 16896, 17024, + 17025, 17008, 17016, 17014, 0, 16384, 16896, 17024, + 17025, 17008, 0, 16384, 16896, 17024, 17025, 17008, + 17016, 0, 16384, 16896, 17024, 17025, 17027, 17016, + 0, 16384, 16896, 17024, 17025, 17027, 17016, 17018, + 0, 16384, 16896, 17024, 17025, 17027, 17016, 0, + 16384, 16896, 17024, 17025, 17027, 17016, 17020, 0, + 16384, 16896, 17024, 17025, 17027, 17016, 17020, 0, + 16384, 16896, 17024, 17025, 17027, 17016, 17020, 17022, + 0, 16384, 16896, 0, 16384, 16896, 17024, 0, + 16384, 16896, 17024, 0, 16384, 16896, 17024, 17026, + 0, 16384, 16896, 17024, 0, 16384, 16896, 17024, + 17028, 0, 16384, 16896, 17024, 17028, 0, 16384, + 16896, 17024, 17032, 17030, 0, 16384, 16896, 17024, + 0, 16384, 16896, 17024, 17032, 0, 16384, 16896, + 17024, 17032, 0, 16384, 16896, 17024, 17032, 17034, + 0, 16384, 16896, 17024, 17032, 0, 16384, 16896, + 17024, 17040, 17036, 0, 16384, 16896, 17024, 17040, + 17036, 0, 16384, 16896, 17024, 17040, 17041, 17038, + 0, 16384, 16896, 17024, 0, 16384, 16896, 17024, + 17040, 0, 16384, 16896, 17024, 17040, 0, 16384, + 16896, 17024, 17040, 17042, 0, 16384, 16896, 17024, + 17040, 0, 16384, 16896, 17024, 17040, 17044, 0, + 16384, 16896, 17024, 17040, 17044, 0, 16384, 16896, + 17024, 17040, 17048, 17046, 0, 16384, 16896, 17024, + 17040, 0, 16384, 16896, 17024, 17056, 17048, 0, + 16384, 16896, 17024, 17056, 17048, 0, 16384, 16896, + 17024, 17056, 17048, 17050, 0, 16384, 16896, 17024, + 17056, 17048, 0, 16384, 16896, 17024, 17056, 17057, + 17052, 0, 16384, 16896, 17024, 17056, 17057, 17052, + 0, 16384, 16896, 17024, 17056, 17057, 17052, 17054, + 0, 16384, 16896, 17024, 0, 16384, 16896, 17024, + 17056, 0, 16384, 16896, 17024, 17056, 0, 16384, + 16896, 17024, 17056, 17058, 0, 16384, 16896, 17024, + 17056, 0, 16384, 16896, 17024, 17056, 17060, 0, + 16384, 16896, 17024, 17056, 17060, 0, 16384, 16896, + 17024, 17056, 17064, 17062, 0, 16384, 16896, 17024, + 17056, 0, 16384, 16896, 17024, 17056, 17064, 0, + 16384, 16896, 17024, 17056, 17064, 0, 16384, 16896, + 17024, 17056, 17064, 17066, 0, 16384, 16896, 17024, + 17056, 17064, 0, 16384, 16896, 17024, 17056, 17072, + 17068, 0, 16384, 16896, 17024, 17056, 17072, 17068, + 0, 16384, 16896, 17024, 17056, 17072, 17073, 17070, + 0, 16384, 16896, 17024, 17056, 0, 16384, 16896, + 17024, 17088, 17072, 0, 16384, 16896, 17024, 17088, + 17072, 0, 16384, 16896, 17024, 17088, 17072, 17074, + 0, 16384, 16896, 17024, 17088, 17072, 0, 16384, + 16896, 17024, 17088, 17072, 17076, 0, 16384, 16896, + 17024, 17088, 17072, 17076, 0, 16384, 16896, 17024, + 17088, 17072, 17080, 17078, 0, 16384, 16896, 17024, + 17088, 17072, 0, 16384, 16896, 17024, 17088, 17089, + 17080, 0, 16384, 16896, 17024, 17088, 17089, 17080, + 0, 16384, 16896, 17024, 17088, 17089, 17080, 17082, + 0, 16384, 16896, 17024, 17088, 17089, 17080, 0, + 16384, 16896, 17024, 17088, 17089, 17080, 17084, 0, + 16384, 16896, 17024, 17088, 17089, 17091, 17084, 0, + 16384, 16896, 17024, 17088, 17089, 17091, 17084, 17086, + 0, 16384, 16896, 17024, 0, 16384, 16896, 17152, + 17088, 0, 16384, 16896, 17152, 17088, 0, 16384, + 16896, 17152, 17088, 17090, 0, 16384, 16896, 17152, + 17088, 0, 16384, 16896, 17152, 17088, 17092, 0, + 16384, 16896, 17152, 17088, 17092, 0, 16384, 16896, + 17152, 17088, 17096, 17094, 0, 16384, 16896, 17152, + 17088, 0, 16384, 16896, 17152, 17088, 17096, 0, + 16384, 16896, 17152, 17088, 17096, 0, 16384, 16896, + 17152, 17088, 17096, 17098, 0, 16384, 16896, 17152, + 17088, 17096, 0, 16384, 16896, 17152, 17088, 17104, + 17100, 0, 16384, 16896, 17152, 17088, 17104, 17100, + 0, 16384, 16896, 17152, 17088, 17104, 17105, 17102, + 0, 16384, 16896, 17152, 17088, 0, 16384, 16896, + 17152, 17088, 17104, 0, 16384, 16896, 17152, 17088, + 17104, 0, 16384, 16896, 17152, 17088, 17104, 17106, + 0, 16384, 16896, 17152, 17088, 17104, 0, 16384, + 16896, 17152, 17088, 17104, 17108, 0, 16384, 16896, + 17152, 17088, 17104, 17108, 0, 16384, 16896, 17152, + 17088, 17104, 17112, 17110, 0, 16384, 16896, 17152, + 17088, 17104, 0, 16384, 16896, 17152, 17088, 17120, + 17112, 0, 16384, 16896, 17152, 17088, 17120, 17112, + 0, 16384, 16896, 17152, 17088, 17120, 17112, 17114, + 0, 16384, 16896, 17152, 17088, 17120, 17112, 0, + 16384, 16896, 17152, 17088, 17120, 17121, 17116, 0, + 16384, 16896, 17152, 17088, 17120, 17121, 17116, 0, + 16384, 16896, 17152, 17088, 17120, 17121, 17116, 17118, + 0, 16384, 16896, 17152, 17088, 0, 16384, 16896, + 17152, 17153, 17120, 0, 16384, 16896, 17152, 17153, + 17120, 0, 16384, 16896, 17152, 17153, 17120, 17122, + 0, 16384, 16896, 17152, 17153, 17120, 0, 16384, + 16896, 17152, 17153, 17120, 17124, 0, 16384, 16896, + 17152, 17153, 17120, 17124, 0, 16384, 16896, 17152, + 17153, 17120, 17128, 17126, 0, 16384, 16896, 17152, + 17153, 17120, 0, 16384, 16896, 17152, 17153, 17120, + 17128, 0, 16384, 16896, 17152, 17153, 17120, 17128, + 0, 16384, 16896, 17152, 17153, 17120, 17128, 17130, + 0, 16384, 16896, 17152, 17153, 17120, 17128, 0, + 16384, 16896, 17152, 17153, 17120, 17136, 17132, 0, + 16384, 16896, 17152, 17153, 17120, 17136, 17132, 0, + 16384, 16896, 17152, 17153, 17120, 17136, 17137, 17134, + 0, 16384, 16896, 17152, 17153, 17120, 0, 16384, + 16896, 17152, 17153, 17120, 17136, 0, 16384, 16896, + 17152, 17153, 17155, 17136, 0, 16384, 16896, 17152, + 17153, 17155, 17136, 17138, 0, 16384, 16896, 17152, + 17153, 17155, 17136, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17140, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17140, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17144, 17142, 0, 16384, 16896, 17152, + 17153, 17155, 17136, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17144, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17144, 0, 16384, 16896, 17152, 17153, + 17155, 17136, 17144, 17146, 0, 16384, 16896, 17152, + 17153, 17155, 17159, 17144, 0, 16384, 16896, 17152, + 17153, 17155, 17159, 17144, 17148, 0, 16384, 16896, + 17152, 17153, 17155, 17159, 17144, 17148, 0, 16384, + 16896, 17152, 17153, 17155, 17159, 17144, 17148, 17150, + 0, 16384, 16896, 0, 16384, 17408, 17152, 0, + 16384, 17408, 17152, 0, 16384, 17408, 17152, 17154, + 0, 16384, 17408, 17152, 0, 16384, 17408, 17152, + 17156, 0, 16384, 17408, 17152, 17156, 0, 16384, + 17408, 17152, 17160, 17158, 0, 16384, 17408, 17152, + 0, 16384, 17408, 17152, 17160, 0, 16384, 17408, + 17152, 17160, 0, 16384, 17408, 17152, 17160, 17162, + 0, 16384, 17408, 17152, 17160, 0, 16384, 17408, + 17152, 17168, 17164, 0, 16384, 17408, 17152, 17168, + 17164, 0, 16384, 17408, 17152, 17168, 17169, 17166, + 0, 16384, 17408, 17152, 0, 16384, 17408, 17152, + 17168, 0, 16384, 17408, 17152, 17168, 0, 16384, + 17408, 17152, 17168, 17170, 0, 16384, 17408, 17152, + 17168, 0, 16384, 17408, 17152, 17168, 17172, 0, + 16384, 17408, 17152, 17168, 17172, 0, 16384, 17408, + 17152, 17168, 17176, 17174, 0, 16384, 17408, 17152, + 17168, 0, 16384, 17408, 17152, 17184, 17176, 0, + 16384, 17408, 17152, 17184, 17176, 0, 16384, 17408, + 17152, 17184, 17176, 17178, 0, 16384, 17408, 17152, + 17184, 17176, 0, 16384, 17408, 17152, 17184, 17185, + 17180, 0, 16384, 17408, 17152, 17184, 17185, 17180, + 0, 16384, 17408, 17152, 17184, 17185, 17180, 17182, + 0, 16384, 17408, 17152, 0, 16384, 17408, 17152, + 17184, 0, 16384, 17408, 17152, 17184, 0, 16384, + 17408, 17152, 17184, 17186, 0, 16384, 17408, 17152, + 17184, 0, 16384, 17408, 17152, 17184, 17188, 0, + 16384, 17408, 17152, 17184, 17188, 0, 16384, 17408, + 17152, 17184, 17192, 17190, 0, 16384, 17408, 17152, + 17184, 0, 16384, 17408, 17152, 17184, 17192, 0, + 16384, 17408, 17152, 17184, 17192, 0, 16384, 17408, + 17152, 17184, 17192, 17194, 0, 16384, 17408, 17152, + 17184, 17192, 0, 16384, 17408, 17152, 17184, 17200, + 17196, 0, 16384, 17408, 17152, 17184, 17200, 17196, + 0, 16384, 17408, 17152, 17184, 17200, 17201, 17198, + 0, 16384, 17408, 17152, 17184, 0, 16384, 17408, + 17152, 17216, 17200, 0, 16384, 17408, 17152, 17216, + 17200, 0, 16384, 17408, 17152, 17216, 17200, 17202, + 0, 16384, 17408, 17152, 17216, 17200, 0, 16384, + 17408, 17152, 17216, 17200, 17204, 0, 16384, 17408, + 17152, 17216, 17200, 17204, 0, 16384, 17408, 17152, + 17216, 17200, 17208, 17206, 0, 16384, 17408, 17152, + 17216, 17200, 0, 16384, 17408, 17152, 17216, 17217, + 17208, 0, 16384, 17408, 17152, 17216, 17217, 17208, + 0, 16384, 17408, 17152, 17216, 17217, 17208, 17210, + 0, 16384, 17408, 17152, 17216, 17217, 17208, 0, + 16384, 17408, 17152, 17216, 17217, 17208, 17212, 0, + 16384, 17408, 17152, 17216, 17217, 17219, 17212, 0, + 16384, 17408, 17152, 17216, 17217, 17219, 17212, 17214, + 0, 16384, 17408, 17152, 0, 16384, 17408, 17152, + 17216, 0, 16384, 17408, 17152, 17216, 0, 16384, + 17408, 17152, 17216, 17218, 0, 16384, 17408, 17152, + 17216, 0, 16384, 17408, 17152, 17216, 17220, 0, + 16384, 17408, 17152, 17216, 17220, 0, 16384, 17408, + 17152, 17216, 17224, 17222, 0, 16384, 17408, 17152, + 17216, 0, 16384, 17408, 17152, 17216, 17224, 0, + 16384, 17408, 17152, 17216, 17224, 0, 16384, 17408, + 17152, 17216, 17224, 17226, 0, 16384, 17408, 17152, + 17216, 17224, 0, 16384, 17408, 17152, 17216, 17232, + 17228, 0, 16384, 17408, 17152, 17216, 17232, 17228, + 0, 16384, 17408, 17152, 17216, 17232, 17233, 17230, + 0, 16384, 17408, 17152, 17216, 0, 16384, 17408, + 17152, 17216, 17232, 0, 16384, 17408, 17152, 17216, + 17232, 0, 16384, 17408, 17152, 17216, 17232, 17234, + 0, 16384, 17408, 17152, 17216, 17232, 0, 16384, + 17408, 17152, 17216, 17232, 17236, 0, 16384, 17408, + 17152, 17216, 17232, 17236, 0, 16384, 17408, 17152, + 17216, 17232, 17240, 17238, 0, 16384, 17408, 17152, + 17216, 17232, 0, 16384, 17408, 17152, 17216, 17248, + 17240, 0, 16384, 17408, 17152, 17216, 17248, 17240, + 0, 16384, 17408, 17152, 17216, 17248, 17240, 17242, + 0, 16384, 17408, 17152, 17216, 17248, 17240, 0, + 16384, 17408, 17152, 17216, 17248, 17249, 17244, 0, + 16384, 17408, 17152, 17216, 17248, 17249, 17244, 0, + 16384, 17408, 17152, 17216, 17248, 17249, 17244, 17246, + 0, 16384, 17408, 17152, 17216, 0, 16384, 17408, + 17152, 17280, 17248, 0, 16384, 17408, 17152, 17280, + 17248, 0, 16384, 17408, 17152, 17280, 17248, 17250, + 0, 16384, 17408, 17152, 17280, 17248, 0, 16384, + 17408, 17152, 17280, 17248, 17252, 0, 16384, 17408, + 17152, 17280, 17248, 17252, 0, 16384, 17408, 17152, + 17280, 17248, 17256, 17254, 0, 16384, 17408, 17152, + 17280, 17248, 0, 16384, 17408, 17152, 17280, 17248, + 17256, 0, 16384, 17408, 17152, 17280, 17248, 17256, + 0, 16384, 17408, 17152, 17280, 17248, 17256, 17258, + 0, 16384, 17408, 17152, 17280, 17248, 17256, 0, + 16384, 17408, 17152, 17280, 17248, 17264, 17260, 0, + 16384, 17408, 17152, 17280, 17248, 17264, 17260, 0, + 16384, 17408, 17152, 17280, 17248, 17264, 17265, 17262, + 0, 16384, 17408, 17152, 17280, 17248, 0, 16384, + 17408, 17152, 17280, 17281, 17264, 0, 16384, 17408, + 17152, 17280, 17281, 17264, 0, 16384, 17408, 17152, + 17280, 17281, 17264, 17266, 0, 16384, 17408, 17152, + 17280, 17281, 17264, 0, 16384, 17408, 17152, 17280, + 17281, 17264, 17268, 0, 16384, 17408, 17152, 17280, + 17281, 17264, 17268, 0, 16384, 17408, 17152, 17280, + 17281, 17264, 17272, 17270, 0, 16384, 17408, 17152, + 17280, 17281, 17264, 0, 16384, 17408, 17152, 17280, + 17281, 17264, 17272, 0, 16384, 17408, 17152, 17280, + 17281, 17283, 17272, 0, 16384, 17408, 17152, 17280, + 17281, 17283, 17272, 17274, 0, 16384, 17408, 17152, + 17280, 17281, 17283, 17272, 0, 16384, 17408, 17152, + 17280, 17281, 17283, 17272, 17276, 0, 16384, 17408, + 17152, 17280, 17281, 17283, 17272, 17276, 0, 16384, + 17408, 17152, 17280, 17281, 17283, 17272, 17276, 17278, + 0, 16384, 17408, 17152, 0, 16384, 17408, 17152, + 17280, 0, 16384, 17408, 17409, 17280, 0, 16384, + 17408, 17409, 17280, 17282, 0, 16384, 17408, 17409, + 17280, 0, 16384, 17408, 17409, 17280, 17284, 0, + 16384, 17408, 17409, 17280, 17284, 0, 16384, 17408, + 17409, 17280, 17288, 17286, 0, 16384, 17408, 17409, + 17280, 0, 16384, 17408, 17409, 17280, 17288, 0, + 16384, 17408, 17409, 17280, 17288, 0, 16384, 17408, + 17409, 17280, 17288, 17290, 0, 16384, 17408, 17409, + 17280, 17288, 0, 16384, 17408, 17409, 17280, 17296, + 17292, 0, 16384, 17408, 17409, 17280, 17296, 17292, + 0, 16384, 17408, 17409, 17280, 17296, 17297, 17294, + 0, 16384, 17408, 17409, 17280, 0, 16384, 17408, + 17409, 17280, 17296, 0, 16384, 17408, 17409, 17280, + 17296, 0, 16384, 17408, 17409, 17280, 17296, 17298, + 0, 16384, 17408, 17409, 17280, 17296, 0, 16384, + 17408, 17409, 17280, 17296, 17300, 0, 16384, 17408, + 17409, 17280, 17296, 17300, 0, 16384, 17408, 17409, + 17280, 17296, 17304, 17302, 0, 16384, 17408, 17409, + 17280, 17296, 0, 16384, 17408, 17409, 17280, 17312, + 17304, 0, 16384, 17408, 17409, 17280, 17312, 17304, + 0, 16384, 17408, 17409, 17280, 17312, 17304, 17306, + 0, 16384, 17408, 17409, 17280, 17312, 17304, 0, + 16384, 17408, 17409, 17280, 17312, 17313, 17308, 0, + 16384, 17408, 17409, 17280, 17312, 17313, 17308, 0, + 16384, 17408, 17409, 17280, 17312, 17313, 17308, 17310, + 0, 16384, 17408, 17409, 17280, 0, 16384, 17408, + 17409, 17280, 17312, 0, 16384, 17408, 17409, 17280, + 17312, 0, 16384, 17408, 17409, 17280, 17312, 17314, + 0, 16384, 17408, 17409, 17280, 17312, 0, 16384, + 17408, 17409, 17280, 17312, 17316, 0, 16384, 17408, + 17409, 17280, 17312, 17316, 0, 16384, 17408, 17409, + 17280, 17312, 17320, 17318, 0, 16384, 17408, 17409, + 17280, 17312, 0, 16384, 17408, 17409, 17280, 17312, + 17320, 0, 16384, 17408, 17409, 17280, 17312, 17320, + 0, 16384, 17408, 17409, 17280, 17312, 17320, 17322, + 0, 16384, 17408, 17409, 17280, 17312, 17320, 0, + 16384, 17408, 17409, 17280, 17312, 17328, 17324, 0, + 16384, 17408, 17409, 17280, 17312, 17328, 17324, 0, + 16384, 17408, 17409, 17280, 17312, 17328, 17329, 17326, + 0, 16384, 17408, 17409, 17280, 17312, 0, 16384, + 17408, 17409, 17280, 17344, 17328, 0, 16384, 17408, + 17409, 17280, 17344, 17328, 0, 16384, 17408, 17409, + 17280, 17344, 17328, 17330, 0, 16384, 17408, 17409, + 17280, 17344, 17328, 0, 16384, 17408, 17409, 17280, + 17344, 17328, 17332, 0, 16384, 17408, 17409, 17280, + 17344, 17328, 17332, 0, 16384, 17408, 17409, 17280, + 17344, 17328, 17336, 17334, 0, 16384, 17408, 17409, + 17280, 17344, 17328, 0, 16384, 17408, 17409, 17280, + 17344, 17345, 17336, 0, 16384, 17408, 17409, 17280, + 17344, 17345, 17336, 0, 16384, 17408, 17409, 17280, + 17344, 17345, 17336, 17338, 0, 16384, 17408, 17409, + 17280, 17344, 17345, 17336, 0, 16384, 17408, 17409, + 17280, 17344, 17345, 17336, 17340, 0, 16384, 17408, + 17409, 17280, 17344, 17345, 17347, 17340, 0, 16384, + 17408, 17409, 17280, 17344, 17345, 17347, 17340, 17342, + 0, 16384, 17408, 17409, 17280, 0, 16384, 17408, + 17409, 17280, 17344, 0, 16384, 17408, 17409, 17280, + 17344, 0, 16384, 17408, 17409, 17280, 17344, 17346, + 0, 16384, 17408, 17409, 17411, 17344, 0, 16384, + 17408, 17409, 17411, 17344, 17348, 0, 16384, 17408, + 17409, 17411, 17344, 17348, 0, 16384, 17408, 17409, + 17411, 17344, 17352, 17350, 0, 16384, 17408, 17409, + 17411, 17344, 0, 16384, 17408, 17409, 17411, 17344, + 17352, 0, 16384, 17408, 17409, 17411, 17344, 17352, + 0, 16384, 17408, 17409, 17411, 17344, 17352, 17354, + 0, 16384, 17408, 17409, 17411, 17344, 17352, 0, + 16384, 17408, 17409, 17411, 17344, 17360, 17356, 0, + 16384, 17408, 17409, 17411, 17344, 17360, 17356, 0, + 16384, 17408, 17409, 17411, 17344, 17360, 17361, 17358, + 0, 16384, 17408, 17409, 17411, 17344, 0, 16384, + 17408, 17409, 17411, 17344, 17360, 0, 16384, 17408, + 17409, 17411, 17344, 17360, 0, 16384, 17408, 17409, + 17411, 17344, 17360, 17362, 0, 16384, 17408, 17409, + 17411, 17344, 17360, 0, 16384, 17408, 17409, 17411, + 17344, 17360, 17364, 0, 16384, 17408, 17409, 17411, + 17344, 17360, 17364, 0, 16384, 17408, 17409, 17411, + 17344, 17360, 17368, 17366, 0, 16384, 17408, 17409, + 17411, 17344, 17360, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17368, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17368, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17368, 17370, 0, 16384, 17408, 17409, + 17411, 17344, 17376, 17368, 0, 16384, 17408, 17409, + 17411, 17344, 17376, 17377, 17372, 0, 16384, 17408, + 17409, 17411, 17344, 17376, 17377, 17372, 0, 16384, + 17408, 17409, 17411, 17344, 17376, 17377, 17372, 17374, + 0, 16384, 17408, 17409, 17411, 17344, 0, 16384, + 17408, 17409, 17411, 17344, 17376, 0, 16384, 17408, + 17409, 17411, 17344, 17376, 0, 16384, 17408, 17409, + 17411, 17344, 17376, 17378, 0, 16384, 17408, 17409, + 17411, 17344, 17376, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17380, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17380, 0, 16384, 17408, 17409, 17411, + 17344, 17376, 17384, 17382, 0, 16384, 17408, 17409, + 17411, 17415, 17376, 0, 16384, 17408, 17409, 17411, + 17415, 17376, 17384, 0, 16384, 17408, 17409, 17411, + 17415, 17376, 17384, 0, 16384, 17408, 17409, 17411, + 17415, 17376, 17384, 17386, 0, 16384, 17408, 17409, + 17411, 17415, 17376, 17384, 0, 16384, 17408, 17409, + 17411, 17415, 17376, 17392, 17388, 0, 16384, 17408, + 17409, 17411, 17415, 17376, 17392, 17388, 0, 16384, + 17408, 17409, 17411, 17415, 17376, 17392, 17393, 17390, + 0, 16384, 17408, 17409, 17411, 17415, 17376, 0, + 16384, 17408, 17409, 17411, 17415, 17376, 17392, 0, + 16384, 17408, 17409, 17411, 17415, 17376, 17392, 0, + 16384, 17408, 17409, 17411, 17415, 17376, 17392, 17394, + 0, 16384, 17408, 17409, 17411, 17415, 17376, 17392, + 0, 16384, 17408, 17409, 17411, 17415, 17376, 17392, + 17396, 0, 16384, 17408, 17409, 17411, 17415, 17376, + 17392, 17396, 0, 16384, 17408, 17409, 17411, 17415, + 17376, 17392, 17400, 17398, 0, 16384, 17408, 17409, + 17411, 17415, 17376, 17392, 0, 16384, 17408, 17409, + 17411, 17415, 17376, 17392, 17400, 0, 16384, 17408, + 17409, 17411, 17415, 17376, 17392, 17400, 0, 16384, + 17408, 17409, 17411, 17415, 17376, 17392, 17400, 17402, + 0, 16384, 17408, 17409, 17411, 17415, 17376, 17392, + 17400, 0, 16384, 17408, 17409, 17411, 17415, 17376, + 17392, 17400, 17404, 0, 16384, 17408, 17409, 17411, + 17415, 17376, 17392, 17400, 17404, 0, 16384, 17408, + 17409, 17411, 17415, 17376, 17392, 17400, 17404, 17406, + 0, 16384, 0, 16384, 17408, 0, 16384, 17408, + 0, 16384, 17408, 17410, 0, 16384, 17408, 0, + 16384, 17408, 17412, 0, 16384, 17408, 17412, 0, + 16384, 17408, 17416, 17414, 0, 16384, 17408, 0, + 16384, 17408, 17416, 0, 16384, 17408, 17416, 0, + 16384, 17408, 17416, 17418, 0, 16384, 17408, 17416, + 0, 16384, 17408, 17424, 17420, 0, 16384, 17408, + 17424, 17420, 0, 16384, 17408, 17424, 17425, 17422, + 0, 16384, 17408, 0, 16384, 17408, 17424, 0, + 16384, 17408, 17424, 0, 16384, 17408, 17424, 17426, + 0, 16384, 17408, 17424, 0, 16384, 17408, 17424, + 17428, 0, 16384, 17408, 17424, 17428, 0, 16384, + 17408, 17424, 17432, 17430, 0, 16384, 17408, 17424, + 0, 16384, 17408, 17440, 17432, 0, 16384, 17408, + 17440, 17432, 0, 16384, 17408, 17440, 17432, 17434, + 0, 16384, 17408, 17440, 17432, 0, 16384, 17408, + 17440, 17441, 17436, 0, 16384, 17408, 17440, 17441, + 17436, 0, 16384, 17408, 17440, 17441, 17436, 17438, + 0, 16384, 17408, 0, 16384, 17408, 17440, 0, + 16384, 17408, 17440, 0, 16384, 17408, 17440, 17442, + 0, 16384, 17408, 17440, 0, 16384, 17408, 17440, + 17444, 0, 16384, 17408, 17440, 17444, 0, 16384, + 17408, 17440, 17448, 17446, 0, 16384, 17408, 17440, + 0, 16384, 17408, 17440, 17448, 0, 16384, 17408, + 17440, 17448, 0, 16384, 17408, 17440, 17448, 17450, + 0, 16384, 17408, 17440, 17448, 0, 16384, 17408, + 17440, 17456, 17452, 0, 16384, 17408, 17440, 17456, + 17452, 0, 16384, 17408, 17440, 17456, 17457, 17454, + 0, 16384, 17408, 17440, 0, 16384, 17408, 17472, + 17456, 0, 16384, 17408, 17472, 17456, 0, 16384, + 17408, 17472, 17456, 17458, 0, 16384, 17408, 17472, + 17456, 0, 16384, 17408, 17472, 17456, 17460, 0, + 16384, 17408, 17472, 17456, 17460, 0, 16384, 17408, + 17472, 17456, 17464, 17462, 0, 16384, 17408, 17472, + 17456, 0, 16384, 17408, 17472, 17473, 17464, 0, + 16384, 17408, 17472, 17473, 17464, 0, 16384, 17408, + 17472, 17473, 17464, 17466, 0, 16384, 17408, 17472, + 17473, 17464, 0, 16384, 17408, 17472, 17473, 17464, + 17468, 0, 16384, 17408, 17472, 17473, 17475, 17468, + 0, 16384, 17408, 17472, 17473, 17475, 17468, 17470, + 0, 16384, 17408, 0, 16384, 17408, 17472, 0, + 16384, 17408, 17472, 0, 16384, 17408, 17472, 17474, + 0, 16384, 17408, 17472, 0, 16384, 17408, 17472, + 17476, 0, 16384, 17408, 17472, 17476, 0, 16384, + 17408, 17472, 17480, 17478, 0, 16384, 17408, 17472, + 0, 16384, 17408, 17472, 17480, 0, 16384, 17408, + 17472, 17480, 0, 16384, 17408, 17472, 17480, 17482, + 0, 16384, 17408, 17472, 17480, 0, 16384, 17408, + 17472, 17488, 17484, 0, 16384, 17408, 17472, 17488, + 17484, 0, 16384, 17408, 17472, 17488, 17489, 17486, + 0, 16384, 17408, 17472, 0, 16384, 17408, 17472, + 17488, 0, 16384, 17408, 17472, 17488, 0, 16384, + 17408, 17472, 17488, 17490, 0, 16384, 17408, 17472, + 17488, 0, 16384, 17408, 17472, 17488, 17492, 0, + 16384, 17408, 17472, 17488, 17492, 0, 16384, 17408, + 17472, 17488, 17496, 17494, 0, 16384, 17408, 17472, + 17488, 0, 16384, 17408, 17472, 17504, 17496, 0, + 16384, 17408, 17472, 17504, 17496, 0, 16384, 17408, + 17472, 17504, 17496, 17498, 0, 16384, 17408, 17472, + 17504, 17496, 0, 16384, 17408, 17472, 17504, 17505, + 17500, 0, 16384, 17408, 17472, 17504, 17505, 17500, + 0, 16384, 17408, 17472, 17504, 17505, 17500, 17502, + 0, 16384, 17408, 17472, 0, 16384, 17408, 17536, + 17504, 0, 16384, 17408, 17536, 17504, 0, 16384, + 17408, 17536, 17504, 17506, 0, 16384, 17408, 17536, + 17504, 0, 16384, 17408, 17536, 17504, 17508, 0, + 16384, 17408, 17536, 17504, 17508, 0, 16384, 17408, + 17536, 17504, 17512, 17510, 0, 16384, 17408, 17536, + 17504, 0, 16384, 17408, 17536, 17504, 17512, 0, + 16384, 17408, 17536, 17504, 17512, 0, 16384, 17408, + 17536, 17504, 17512, 17514, 0, 16384, 17408, 17536, + 17504, 17512, 0, 16384, 17408, 17536, 17504, 17520, + 17516, 0, 16384, 17408, 17536, 17504, 17520, 17516, + 0, 16384, 17408, 17536, 17504, 17520, 17521, 17518, + 0, 16384, 17408, 17536, 17504, 0, 16384, 17408, + 17536, 17537, 17520, 0, 16384, 17408, 17536, 17537, + 17520, 0, 16384, 17408, 17536, 17537, 17520, 17522, + 0, 16384, 17408, 17536, 17537, 17520, 0, 16384, + 17408, 17536, 17537, 17520, 17524, 0, 16384, 17408, + 17536, 17537, 17520, 17524, 0, 16384, 17408, 17536, + 17537, 17520, 17528, 17526, 0, 16384, 17408, 17536, + 17537, 17520, 0, 16384, 17408, 17536, 17537, 17520, + 17528, 0, 16384, 17408, 17536, 17537, 17539, 17528, + 0, 16384, 17408, 17536, 17537, 17539, 17528, 17530, + 0, 16384, 17408, 17536, 17537, 17539, 17528, 0, + 16384, 17408, 17536, 17537, 17539, 17528, 17532, 0, + 16384, 17408, 17536, 17537, 17539, 17528, 17532, 0, + 16384, 17408, 17536, 17537, 17539, 17528, 17532, 17534, + 0, 16384, 17408, 0, 16384, 17408, 17536, 0, + 16384, 17408, 17536, 0, 16384, 17408, 17536, 17538, + 0, 16384, 17408, 17536, 0, 16384, 17408, 17536, + 17540, 0, 16384, 17408, 17536, 17540, 0, 16384, + 17408, 17536, 17544, 17542, 0, 16384, 17408, 17536, + 0, 16384, 17408, 17536, 17544, 0, 16384, 17408, + 17536, 17544, 0, 16384, 17408, 17536, 17544, 17546, + 0, 16384, 17408, 17536, 17544, 0, 16384, 17408, + 17536, 17552, 17548, 0, 16384, 17408, 17536, 17552, + 17548, 0, 16384, 17408, 17536, 17552, 17553, 17550, + 0, 16384, 17408, 17536, 0, 16384, 17408, 17536, + 17552, 0, 16384, 17408, 17536, 17552, 0, 16384, + 17408, 17536, 17552, 17554, 0, 16384, 17408, 17536, + 17552, 0, 16384, 17408, 17536, 17552, 17556, 0, + 16384, 17408, 17536, 17552, 17556, 0, 16384, 17408, + 17536, 17552, 17560, 17558, 0, 16384, 17408, 17536, + 17552, 0, 16384, 17408, 17536, 17568, 17560, 0, + 16384, 17408, 17536, 17568, 17560, 0, 16384, 17408, + 17536, 17568, 17560, 17562, 0, 16384, 17408, 17536, + 17568, 17560, 0, 16384, 17408, 17536, 17568, 17569, + 17564, 0, 16384, 17408, 17536, 17568, 17569, 17564, + 0, 16384, 17408, 17536, 17568, 17569, 17564, 17566, + 0, 16384, 17408, 17536, 0, 16384, 17408, 17536, + 17568, 0, 16384, 17408, 17536, 17568, 0, 16384, + 17408, 17536, 17568, 17570, 0, 16384, 17408, 17536, + 17568, 0, 16384, 17408, 17536, 17568, 17572, 0, + 16384, 17408, 17536, 17568, 17572, 0, 16384, 17408, + 17536, 17568, 17576, 17574, 0, 16384, 17408, 17536, + 17568, 0, 16384, 17408, 17536, 17568, 17576, 0, + 16384, 17408, 17536, 17568, 17576, 0, 16384, 17408, + 17536, 17568, 17576, 17578, 0, 16384, 17408, 17536, + 17568, 17576, 0, 16384, 17408, 17536, 17568, 17584, + 17580, 0, 16384, 17408, 17536, 17568, 17584, 17580, + 0, 16384, 17408, 17536, 17568, 17584, 17585, 17582, + 0, 16384, 17408, 17536, 17568, 0, 16384, 17408, + 17536, 17600, 17584, 0, 16384, 17408, 17536, 17600, + 17584, 0, 16384, 17408, 17536, 17600, 17584, 17586, + 0, 16384, 17408, 17536, 17600, 17584, 0, 16384, + 17408, 17536, 17600, 17584, 17588, 0, 16384, 17408, + 17536, 17600, 17584, 17588, 0, 16384, 17408, 17536, + 17600, 17584, 17592, 17590, 0, 16384, 17408, 17536, + 17600, 17584, 0, 16384, 17408, 17536, 17600, 17601, + 17592, 0, 16384, 17408, 17536, 17600, 17601, 17592, + 0, 16384, 17408, 17536, 17600, 17601, 17592, 17594, + 0, 16384, 17408, 17536, 17600, 17601, 17592, 0, + 16384, 17408, 17536, 17600, 17601, 17592, 17596, 0, + 16384, 17408, 17536, 17600, 17601, 17603, 17596, 0, + 16384, 17408, 17536, 17600, 17601, 17603, 17596, 17598, + 0, 16384, 17408, 17536, 0, 16384, 17408, 17664, + 17600, 0, 16384, 17408, 17664, 17600, 0, 16384, + 17408, 17664, 17600, 17602, 0, 16384, 17408, 17664, + 17600, 0, 16384, 17408, 17664, 17600, 17604, 0, + 16384, 17408, 17664, 17600, 17604, 0, 16384, 17408, + 17664, 17600, 17608, 17606, 0, 16384, 17408, 17664, + 17600, 0, 16384, 17408, 17664, 17600, 17608, 0, + 16384, 17408, 17664, 17600, 17608, 0, 16384, 17408, + 17664, 17600, 17608, 17610, 0, 16384, 17408, 17664, + 17600, 17608, 0, 16384, 17408, 17664, 17600, 17616, + 17612, 0, 16384, 17408, 17664, 17600, 17616, 17612, + 0, 16384, 17408, 17664, 17600, 17616, 17617, 17614, + 0, 16384, 17408, 17664, 17600, 0, 16384, 17408, + 17664, 17600, 17616, 0, 16384, 17408, 17664, 17600, + 17616, 0, 16384, 17408, 17664, 17600, 17616, 17618, + 0, 16384, 17408, 17664, 17600, 17616, 0, 16384, + 17408, 17664, 17600, 17616, 17620, 0, 16384, 17408, + 17664, 17600, 17616, 17620, 0, 16384, 17408, 17664, + 17600, 17616, 17624, 17622, 0, 16384, 17408, 17664, + 17600, 17616, 0, 16384, 17408, 17664, 17600, 17632, + 17624, 0, 16384, 17408, 17664, 17600, 17632, 17624, + 0, 16384, 17408, 17664, 17600, 17632, 17624, 17626, + 0, 16384, 17408, 17664, 17600, 17632, 17624, 0, + 16384, 17408, 17664, 17600, 17632, 17633, 17628, 0, + 16384, 17408, 17664, 17600, 17632, 17633, 17628, 0, + 16384, 17408, 17664, 17600, 17632, 17633, 17628, 17630, + 0, 16384, 17408, 17664, 17600, 0, 16384, 17408, + 17664, 17665, 17632, 0, 16384, 17408, 17664, 17665, + 17632, 0, 16384, 17408, 17664, 17665, 17632, 17634, + 0, 16384, 17408, 17664, 17665, 17632, 0, 16384, + 17408, 17664, 17665, 17632, 17636, 0, 16384, 17408, + 17664, 17665, 17632, 17636, 0, 16384, 17408, 17664, + 17665, 17632, 17640, 17638, 0, 16384, 17408, 17664, + 17665, 17632, 0, 16384, 17408, 17664, 17665, 17632, + 17640, 0, 16384, 17408, 17664, 17665, 17632, 17640, + 0, 16384, 17408, 17664, 17665, 17632, 17640, 17642, + 0, 16384, 17408, 17664, 17665, 17632, 17640, 0, + 16384, 17408, 17664, 17665, 17632, 17648, 17644, 0, + 16384, 17408, 17664, 17665, 17632, 17648, 17644, 0, + 16384, 17408, 17664, 17665, 17632, 17648, 17649, 17646, + 0, 16384, 17408, 17664, 17665, 17632, 0, 16384, + 17408, 17664, 17665, 17632, 17648, 0, 16384, 17408, + 17664, 17665, 17667, 17648, 0, 16384, 17408, 17664, + 17665, 17667, 17648, 17650, 0, 16384, 17408, 17664, + 17665, 17667, 17648, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17652, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17652, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17656, 17654, 0, 16384, 17408, 17664, + 17665, 17667, 17648, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17656, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17656, 0, 16384, 17408, 17664, 17665, + 17667, 17648, 17656, 17658, 0, 16384, 17408, 17664, + 17665, 17667, 17671, 17656, 0, 16384, 17408, 17664, + 17665, 17667, 17671, 17656, 17660, 0, 16384, 17408, + 17664, 17665, 17667, 17671, 17656, 17660, 0, 16384, + 17408, 17664, 17665, 17667, 17671, 17656, 17660, 17662, + 0, 16384, 17408, 0, 16384, 17408, 17664, 0, + 16384, 17408, 17664, 0, 16384, 17408, 17664, 17666, + 0, 16384, 17408, 17664, 0, 16384, 17408, 17664, + 17668, 0, 16384, 17408, 17664, 17668, 0, 16384, + 17408, 17664, 17672, 17670, 0, 16384, 17408, 17664, + 0, 16384, 17408, 17664, 17672, 0, 16384, 17408, + 17664, 17672, 0, 16384, 17408, 17664, 17672, 17674, + 0, 16384, 17408, 17664, 17672, 0, 16384, 17408, + 17664, 17680, 17676, 0, 16384, 17408, 17664, 17680, + 17676, 0, 16384, 17408, 17664, 17680, 17681, 17678, + 0, 16384, 17408, 17664, 0, 16384, 17408, 17664, + 17680, 0, 16384, 17408, 17664, 17680, 0, 16384, + 17408, 17664, 17680, 17682, 0, 16384, 17408, 17664, + 17680, 0, 16384, 17408, 17664, 17680, 17684, 0, + 16384, 17408, 17664, 17680, 17684, 0, 16384, 17408, + 17664, 17680, 17688, 17686, 0, 16384, 17408, 17664, + 17680, 0, 16384, 17408, 17664, 17696, 17688, 0, + 16384, 17408, 17664, 17696, 17688, 0, 16384, 17408, + 17664, 17696, 17688, 17690, 0, 16384, 17408, 17664, + 17696, 17688, 0, 16384, 17408, 17664, 17696, 17697, + 17692, 0, 16384, 17408, 17664, 17696, 17697, 17692, + 0, 16384, 17408, 17664, 17696, 17697, 17692, 17694, + 0, 16384, 17408, 17664, 0, 16384, 17408, 17664, + 17696, 0, 16384, 17408, 17664, 17696, 0, 16384, + 17408, 17664, 17696, 17698, 0, 16384, 17408, 17664, + 17696, 0, 16384, 17408, 17664, 17696, 17700, 0, + 16384, 17408, 17664, 17696, 17700, 0, 16384, 17408, + 17664, 17696, 17704, 17702, 0, 16384, 17408, 17664, + 17696, 0, 16384, 17408, 17664, 17696, 17704, 0, + 16384, 17408, 17664, 17696, 17704, 0, 16384, 17408, + 17664, 17696, 17704, 17706, 0, 16384, 17408, 17664, + 17696, 17704, 0, 16384, 17408, 17664, 17696, 17712, + 17708, 0, 16384, 17408, 17664, 17696, 17712, 17708, + 0, 16384, 17408, 17664, 17696, 17712, 17713, 17710, + 0, 16384, 17408, 17664, 17696, 0, 16384, 17408, + 17664, 17728, 17712, 0, 16384, 17408, 17664, 17728, + 17712, 0, 16384, 17408, 17664, 17728, 17712, 17714, + 0, 16384, 17408, 17664, 17728, 17712, 0, 16384, + 17408, 17664, 17728, 17712, 17716, 0, 16384, 17408, + 17664, 17728, 17712, 17716, 0, 16384, 17408, 17664, + 17728, 17712, 17720, 17718, 0, 16384, 17408, 17664, + 17728, 17712, 0, 16384, 17408, 17664, 17728, 17729, + 17720, 0, 16384, 17408, 17664, 17728, 17729, 17720, + 0, 16384, 17408, 17664, 17728, 17729, 17720, 17722, + 0, 16384, 17408, 17664, 17728, 17729, 17720, 0, + 16384, 17408, 17664, 17728, 17729, 17720, 17724, 0, + 16384, 17408, 17664, 17728, 17729, 17731, 17724, 0, + 16384, 17408, 17664, 17728, 17729, 17731, 17724, 17726, + 0, 16384, 17408, 17664, 0, 16384, 17408, 17664, + 17728, 0, 16384, 17408, 17664, 17728, 0, 16384, + 17408, 17664, 17728, 17730, 0, 16384, 17408, 17664, + 17728, 0, 16384, 17408, 17664, 17728, 17732, 0, + 16384, 17408, 17664, 17728, 17732, 0, 16384, 17408, + 17664, 17728, 17736, 17734, 0, 16384, 17408, 17664, + 17728, 0, 16384, 17408, 17664, 17728, 17736, 0, + 16384, 17408, 17664, 17728, 17736, 0, 16384, 17408, + 17664, 17728, 17736, 17738, 0, 16384, 17408, 17664, + 17728, 17736, 0, 16384, 17408, 17664, 17728, 17744, + 17740, 0, 16384, 17408, 17664, 17728, 17744, 17740, + 0, 16384, 17408, 17664, 17728, 17744, 17745, 17742, + 0, 16384, 17408, 17664, 17728, 0, 16384, 17408, + 17664, 17728, 17744, 0, 16384, 17408, 17664, 17728, + 17744, 0, 16384, 17408, 17664, 17728, 17744, 17746, + 0, 16384, 17408, 17664, 17728, 17744, 0, 16384, + 17408, 17664, 17728, 17744, 17748, 0, 16384, 17408, + 17664, 17728, 17744, 17748, 0, 16384, 17408, 17664, + 17728, 17744, 17752, 17750, 0, 16384, 17408, 17664, + 17728, 17744, 0, 16384, 17408, 17664, 17728, 17760, + 17752, 0, 16384, 17408, 17664, 17728, 17760, 17752, + 0, 16384, 17408, 17664, 17728, 17760, 17752, 17754, + 0, 16384, 17408, 17664, 17728, 17760, 17752, 0, + 16384, 17408, 17664, 17728, 17760, 17761, 17756, 0, + 16384, 17408, 17664, 17728, 17760, 17761, 17756, 0, + 16384, 17408, 17664, 17728, 17760, 17761, 17756, 17758, + 0, 16384, 17408, 17664, 17728, 0, 16384, 17408, + 17664, 17792, 17760, 0, 16384, 17408, 17664, 17792, + 17760, 0, 16384, 17408, 17664, 17792, 17760, 17762, + 0, 16384, 17408, 17664, 17792, 17760, 0, 16384, + 17408, 17664, 17792, 17760, 17764, 0, 16384, 17408, + 17664, 17792, 17760, 17764, 0, 16384, 17408, 17664, + 17792, 17760, 17768, 17766, 0, 16384, 17408, 17664, + 17792, 17760, 0, 16384, 17408, 17664, 17792, 17760, + 17768, 0, 16384, 17408, 17664, 17792, 17760, 17768, + 0, 16384, 17408, 17664, 17792, 17760, 17768, 17770, + 0, 16384, 17408, 17664, 17792, 17760, 17768, 0, + 16384, 17408, 17664, 17792, 17760, 17776, 17772, 0, + 16384, 17408, 17664, 17792, 17760, 17776, 17772, 0, + 16384, 17408, 17664, 17792, 17760, 17776, 17777, 17774, + 0, 16384, 17408, 17664, 17792, 17760, 0, 16384, + 17408, 17664, 17792, 17793, 17776, 0, 16384, 17408, + 17664, 17792, 17793, 17776, 0, 16384, 17408, 17664, + 17792, 17793, 17776, 17778, 0, 16384, 17408, 17664, + 17792, 17793, 17776, 0, 16384, 17408, 17664, 17792, + 17793, 17776, 17780, 0, 16384, 17408, 17664, 17792, + 17793, 17776, 17780, 0, 16384, 17408, 17664, 17792, + 17793, 17776, 17784, 17782, 0, 16384, 17408, 17664, + 17792, 17793, 17776, 0, 16384, 17408, 17664, 17792, + 17793, 17776, 17784, 0, 16384, 17408, 17664, 17792, + 17793, 17795, 17784, 0, 16384, 17408, 17664, 17792, + 17793, 17795, 17784, 17786, 0, 16384, 17408, 17664, + 17792, 17793, 17795, 17784, 0, 16384, 17408, 17664, + 17792, 17793, 17795, 17784, 17788, 0, 16384, 17408, + 17664, 17792, 17793, 17795, 17784, 17788, 0, 16384, + 17408, 17664, 17792, 17793, 17795, 17784, 17788, 17790, + 0, 16384, 17408, 17664, 0, 16384, 17408, 17920, + 17792, 0, 16384, 17408, 17920, 17792, 0, 16384, + 17408, 17920, 17792, 17794, 0, 16384, 17408, 17920, + 17792, 0, 16384, 17408, 17920, 17792, 17796, 0, + 16384, 17408, 17920, 17792, 17796, 0, 16384, 17408, + 17920, 17792, 17800, 17798, 0, 16384, 17408, 17920, + 17792, 0, 16384, 17408, 17920, 17792, 17800, 0, + 16384, 17408, 17920, 17792, 17800, 0, 16384, 17408, + 17920, 17792, 17800, 17802, 0, 16384, 17408, 17920, + 17792, 17800, 0, 16384, 17408, 17920, 17792, 17808, + 17804, 0, 16384, 17408, 17920, 17792, 17808, 17804, + 0, 16384, 17408, 17920, 17792, 17808, 17809, 17806, + 0, 16384, 17408, 17920, 17792, 0, 16384, 17408, + 17920, 17792, 17808, 0, 16384, 17408, 17920, 17792, + 17808, 0, 16384, 17408, 17920, 17792, 17808, 17810, + 0, 16384, 17408, 17920, 17792, 17808, 0, 16384, + 17408, 17920, 17792, 17808, 17812, 0, 16384, 17408, + 17920, 17792, 17808, 17812, 0, 16384, 17408, 17920, + 17792, 17808, 17816, 17814, 0, 16384, 17408, 17920, + 17792, 17808, 0, 16384, 17408, 17920, 17792, 17824, + 17816, 0, 16384, 17408, 17920, 17792, 17824, 17816, + 0, 16384, 17408, 17920, 17792, 17824, 17816, 17818, + 0, 16384, 17408, 17920, 17792, 17824, 17816, 0, + 16384, 17408, 17920, 17792, 17824, 17825, 17820, 0, + 16384, 17408, 17920, 17792, 17824, 17825, 17820, 0, + 16384, 17408, 17920, 17792, 17824, 17825, 17820, 17822, + 0, 16384, 17408, 17920, 17792, 0, 16384, 17408, + 17920, 17792, 17824, 0, 16384, 17408, 17920, 17792, + 17824, 0, 16384, 17408, 17920, 17792, 17824, 17826, + 0, 16384, 17408, 17920, 17792, 17824, 0, 16384, + 17408, 17920, 17792, 17824, 17828, 0, 16384, 17408, + 17920, 17792, 17824, 17828, 0, 16384, 17408, 17920, + 17792, 17824, 17832, 17830, 0, 16384, 17408, 17920, + 17792, 17824, 0, 16384, 17408, 17920, 17792, 17824, + 17832, 0, 16384, 17408, 17920, 17792, 17824, 17832, + 0, 16384, 17408, 17920, 17792, 17824, 17832, 17834, + 0, 16384, 17408, 17920, 17792, 17824, 17832, 0, + 16384, 17408, 17920, 17792, 17824, 17840, 17836, 0, + 16384, 17408, 17920, 17792, 17824, 17840, 17836, 0, + 16384, 17408, 17920, 17792, 17824, 17840, 17841, 17838, + 0, 16384, 17408, 17920, 17792, 17824, 0, 16384, + 17408, 17920, 17792, 17856, 17840, 0, 16384, 17408, + 17920, 17792, 17856, 17840, 0, 16384, 17408, 17920, + 17792, 17856, 17840, 17842, 0, 16384, 17408, 17920, + 17792, 17856, 17840, 0, 16384, 17408, 17920, 17792, + 17856, 17840, 17844, 0, 16384, 17408, 17920, 17792, + 17856, 17840, 17844, 0, 16384, 17408, 17920, 17792, + 17856, 17840, 17848, 17846, 0, 16384, 17408, 17920, + 17792, 17856, 17840, 0, 16384, 17408, 17920, 17792, + 17856, 17857, 17848, 0, 16384, 17408, 17920, 17792, + 17856, 17857, 17848, 0, 16384, 17408, 17920, 17792, + 17856, 17857, 17848, 17850, 0, 16384, 17408, 17920, + 17792, 17856, 17857, 17848, 0, 16384, 17408, 17920, + 17792, 17856, 17857, 17848, 17852, 0, 16384, 17408, + 17920, 17792, 17856, 17857, 17859, 17852, 0, 16384, + 17408, 17920, 17792, 17856, 17857, 17859, 17852, 17854, + 0, 16384, 17408, 17920, 17792, 0, 16384, 17408, + 17920, 17921, 17856, 0, 16384, 17408, 17920, 17921, + 17856, 0, 16384, 17408, 17920, 17921, 17856, 17858, + 0, 16384, 17408, 17920, 17921, 17856, 0, 16384, + 17408, 17920, 17921, 17856, 17860, 0, 16384, 17408, + 17920, 17921, 17856, 17860, 0, 16384, 17408, 17920, + 17921, 17856, 17864, 17862, 0, 16384, 17408, 17920, + 17921, 17856, 0, 16384, 17408, 17920, 17921, 17856, + 17864, 0, 16384, 17408, 17920, 17921, 17856, 17864, + 0, 16384, 17408, 17920, 17921, 17856, 17864, 17866, + 0, 16384, 17408, 17920, 17921, 17856, 17864, 0, + 16384, 17408, 17920, 17921, 17856, 17872, 17868, 0, + 16384, 17408, 17920, 17921, 17856, 17872, 17868, 0, + 16384, 17408, 17920, 17921, 17856, 17872, 17873, 17870, + 0, 16384, 17408, 17920, 17921, 17856, 0, 16384, + 17408, 17920, 17921, 17856, 17872, 0, 16384, 17408, + 17920, 17921, 17856, 17872, 0, 16384, 17408, 17920, + 17921, 17856, 17872, 17874, 0, 16384, 17408, 17920, + 17921, 17856, 17872, 0, 16384, 17408, 17920, 17921, + 17856, 17872, 17876, 0, 16384, 17408, 17920, 17921, + 17856, 17872, 17876, 0, 16384, 17408, 17920, 17921, + 17856, 17872, 17880, 17878, 0, 16384, 17408, 17920, + 17921, 17856, 17872, 0, 16384, 17408, 17920, 17921, + 17856, 17888, 17880, 0, 16384, 17408, 17920, 17921, + 17856, 17888, 17880, 0, 16384, 17408, 17920, 17921, + 17856, 17888, 17880, 17882, 0, 16384, 17408, 17920, + 17921, 17856, 17888, 17880, 0, 16384, 17408, 17920, + 17921, 17856, 17888, 17889, 17884, 0, 16384, 17408, + 17920, 17921, 17856, 17888, 17889, 17884, 0, 16384, + 17408, 17920, 17921, 17856, 17888, 17889, 17884, 17886, + 0, 16384, 17408, 17920, 17921, 17856, 0, 16384, + 17408, 17920, 17921, 17856, 17888, 0, 16384, 17408, + 17920, 17921, 17923, 17888, 0, 16384, 17408, 17920, + 17921, 17923, 17888, 17890, 0, 16384, 17408, 17920, + 17921, 17923, 17888, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17892, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17892, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17896, 17894, 0, 16384, 17408, 17920, + 17921, 17923, 17888, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17896, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17896, 0, 16384, 17408, 17920, 17921, + 17923, 17888, 17896, 17898, 0, 16384, 17408, 17920, + 17921, 17923, 17888, 17896, 0, 16384, 17408, 17920, + 17921, 17923, 17888, 17904, 17900, 0, 16384, 17408, + 17920, 17921, 17923, 17888, 17904, 17900, 0, 16384, + 17408, 17920, 17921, 17923, 17888, 17904, 17905, 17902, + 0, 16384, 17408, 17920, 17921, 17923, 17888, 0, + 16384, 17408, 17920, 17921, 17923, 17888, 17904, 0, + 16384, 17408, 17920, 17921, 17923, 17888, 17904, 0, + 16384, 17408, 17920, 17921, 17923, 17888, 17904, 17906, + 0, 16384, 17408, 17920, 17921, 17923, 17927, 17904, + 0, 16384, 17408, 17920, 17921, 17923, 17927, 17904, + 17908, 0, 16384, 17408, 17920, 17921, 17923, 17927, + 17904, 17908, 0, 16384, 17408, 17920, 17921, 17923, + 17927, 17904, 17912, 17910, 0, 16384, 17408, 17920, + 17921, 17923, 17927, 17904, 0, 16384, 17408, 17920, + 17921, 17923, 17927, 17904, 17912, 0, 16384, 17408, + 17920, 17921, 17923, 17927, 17904, 17912, 0, 16384, + 17408, 17920, 17921, 17923, 17927, 17904, 17912, 17914, + 0, 16384, 17408, 17920, 17921, 17923, 17927, 17904, + 17912, 0, 16384, 17408, 17920, 17921, 17923, 17927, + 17904, 17912, 17916, 0, 16384, 17408, 17920, 17921, + 17923, 17927, 17904, 17912, 17916, 0, 16384, 17408, + 17920, 17921, 17923, 17927, 17904, 17912, 17916, 17918, + 0, 16384, 17408, 0, 16384, 18432, 17920, 0, + 16384, 18432, 17920, 0, 16384, 18432, 17920, 17922, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 17924, 0, 16384, 18432, 17920, 17924, 0, 16384, + 18432, 17920, 17928, 17926, 0, 16384, 18432, 17920, + 0, 16384, 18432, 17920, 17928, 0, 16384, 18432, + 17920, 17928, 0, 16384, 18432, 17920, 17928, 17930, + 0, 16384, 18432, 17920, 17928, 0, 16384, 18432, + 17920, 17936, 17932, 0, 16384, 18432, 17920, 17936, + 17932, 0, 16384, 18432, 17920, 17936, 17937, 17934, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 17936, 0, 16384, 18432, 17920, 17936, 0, 16384, + 18432, 17920, 17936, 17938, 0, 16384, 18432, 17920, + 17936, 0, 16384, 18432, 17920, 17936, 17940, 0, + 16384, 18432, 17920, 17936, 17940, 0, 16384, 18432, + 17920, 17936, 17944, 17942, 0, 16384, 18432, 17920, + 17936, 0, 16384, 18432, 17920, 17952, 17944, 0, + 16384, 18432, 17920, 17952, 17944, 0, 16384, 18432, + 17920, 17952, 17944, 17946, 0, 16384, 18432, 17920, + 17952, 17944, 0, 16384, 18432, 17920, 17952, 17953, + 17948, 0, 16384, 18432, 17920, 17952, 17953, 17948, + 0, 16384, 18432, 17920, 17952, 17953, 17948, 17950, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 17952, 0, 16384, 18432, 17920, 17952, 0, 16384, + 18432, 17920, 17952, 17954, 0, 16384, 18432, 17920, + 17952, 0, 16384, 18432, 17920, 17952, 17956, 0, + 16384, 18432, 17920, 17952, 17956, 0, 16384, 18432, + 17920, 17952, 17960, 17958, 0, 16384, 18432, 17920, + 17952, 0, 16384, 18432, 17920, 17952, 17960, 0, + 16384, 18432, 17920, 17952, 17960, 0, 16384, 18432, + 17920, 17952, 17960, 17962, 0, 16384, 18432, 17920, + 17952, 17960, 0, 16384, 18432, 17920, 17952, 17968, + 17964, 0, 16384, 18432, 17920, 17952, 17968, 17964, + 0, 16384, 18432, 17920, 17952, 17968, 17969, 17966, + 0, 16384, 18432, 17920, 17952, 0, 16384, 18432, + 17920, 17984, 17968, 0, 16384, 18432, 17920, 17984, + 17968, 0, 16384, 18432, 17920, 17984, 17968, 17970, + 0, 16384, 18432, 17920, 17984, 17968, 0, 16384, + 18432, 17920, 17984, 17968, 17972, 0, 16384, 18432, + 17920, 17984, 17968, 17972, 0, 16384, 18432, 17920, + 17984, 17968, 17976, 17974, 0, 16384, 18432, 17920, + 17984, 17968, 0, 16384, 18432, 17920, 17984, 17985, + 17976, 0, 16384, 18432, 17920, 17984, 17985, 17976, + 0, 16384, 18432, 17920, 17984, 17985, 17976, 17978, + 0, 16384, 18432, 17920, 17984, 17985, 17976, 0, + 16384, 18432, 17920, 17984, 17985, 17976, 17980, 0, + 16384, 18432, 17920, 17984, 17985, 17987, 17980, 0, + 16384, 18432, 17920, 17984, 17985, 17987, 17980, 17982, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 17984, 0, 16384, 18432, 17920, 17984, 0, 16384, + 18432, 17920, 17984, 17986, 0, 16384, 18432, 17920, + 17984, 0, 16384, 18432, 17920, 17984, 17988, 0, + 16384, 18432, 17920, 17984, 17988, 0, 16384, 18432, + 17920, 17984, 17992, 17990, 0, 16384, 18432, 17920, + 17984, 0, 16384, 18432, 17920, 17984, 17992, 0, + 16384, 18432, 17920, 17984, 17992, 0, 16384, 18432, + 17920, 17984, 17992, 17994, 0, 16384, 18432, 17920, + 17984, 17992, 0, 16384, 18432, 17920, 17984, 18000, + 17996, 0, 16384, 18432, 17920, 17984, 18000, 17996, + 0, 16384, 18432, 17920, 17984, 18000, 18001, 17998, + 0, 16384, 18432, 17920, 17984, 0, 16384, 18432, + 17920, 17984, 18000, 0, 16384, 18432, 17920, 17984, + 18000, 0, 16384, 18432, 17920, 17984, 18000, 18002, + 0, 16384, 18432, 17920, 17984, 18000, 0, 16384, + 18432, 17920, 17984, 18000, 18004, 0, 16384, 18432, + 17920, 17984, 18000, 18004, 0, 16384, 18432, 17920, + 17984, 18000, 18008, 18006, 0, 16384, 18432, 17920, + 17984, 18000, 0, 16384, 18432, 17920, 17984, 18016, + 18008, 0, 16384, 18432, 17920, 17984, 18016, 18008, + 0, 16384, 18432, 17920, 17984, 18016, 18008, 18010, + 0, 16384, 18432, 17920, 17984, 18016, 18008, 0, + 16384, 18432, 17920, 17984, 18016, 18017, 18012, 0, + 16384, 18432, 17920, 17984, 18016, 18017, 18012, 0, + 16384, 18432, 17920, 17984, 18016, 18017, 18012, 18014, + 0, 16384, 18432, 17920, 17984, 0, 16384, 18432, + 17920, 18048, 18016, 0, 16384, 18432, 17920, 18048, + 18016, 0, 16384, 18432, 17920, 18048, 18016, 18018, + 0, 16384, 18432, 17920, 18048, 18016, 0, 16384, + 18432, 17920, 18048, 18016, 18020, 0, 16384, 18432, + 17920, 18048, 18016, 18020, 0, 16384, 18432, 17920, + 18048, 18016, 18024, 18022, 0, 16384, 18432, 17920, + 18048, 18016, 0, 16384, 18432, 17920, 18048, 18016, + 18024, 0, 16384, 18432, 17920, 18048, 18016, 18024, + 0, 16384, 18432, 17920, 18048, 18016, 18024, 18026, + 0, 16384, 18432, 17920, 18048, 18016, 18024, 0, + 16384, 18432, 17920, 18048, 18016, 18032, 18028, 0, + 16384, 18432, 17920, 18048, 18016, 18032, 18028, 0, + 16384, 18432, 17920, 18048, 18016, 18032, 18033, 18030, + 0, 16384, 18432, 17920, 18048, 18016, 0, 16384, + 18432, 17920, 18048, 18049, 18032, 0, 16384, 18432, + 17920, 18048, 18049, 18032, 0, 16384, 18432, 17920, + 18048, 18049, 18032, 18034, 0, 16384, 18432, 17920, + 18048, 18049, 18032, 0, 16384, 18432, 17920, 18048, + 18049, 18032, 18036, 0, 16384, 18432, 17920, 18048, + 18049, 18032, 18036, 0, 16384, 18432, 17920, 18048, + 18049, 18032, 18040, 18038, 0, 16384, 18432, 17920, + 18048, 18049, 18032, 0, 16384, 18432, 17920, 18048, + 18049, 18032, 18040, 0, 16384, 18432, 17920, 18048, + 18049, 18051, 18040, 0, 16384, 18432, 17920, 18048, + 18049, 18051, 18040, 18042, 0, 16384, 18432, 17920, + 18048, 18049, 18051, 18040, 0, 16384, 18432, 17920, + 18048, 18049, 18051, 18040, 18044, 0, 16384, 18432, + 17920, 18048, 18049, 18051, 18040, 18044, 0, 16384, + 18432, 17920, 18048, 18049, 18051, 18040, 18044, 18046, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 18048, 0, 16384, 18432, 17920, 18048, 0, 16384, + 18432, 17920, 18048, 18050, 0, 16384, 18432, 17920, + 18048, 0, 16384, 18432, 17920, 18048, 18052, 0, + 16384, 18432, 17920, 18048, 18052, 0, 16384, 18432, + 17920, 18048, 18056, 18054, 0, 16384, 18432, 17920, + 18048, 0, 16384, 18432, 17920, 18048, 18056, 0, + 16384, 18432, 17920, 18048, 18056, 0, 16384, 18432, + 17920, 18048, 18056, 18058, 0, 16384, 18432, 17920, + 18048, 18056, 0, 16384, 18432, 17920, 18048, 18064, + 18060, 0, 16384, 18432, 17920, 18048, 18064, 18060, + 0, 16384, 18432, 17920, 18048, 18064, 18065, 18062, + 0, 16384, 18432, 17920, 18048, 0, 16384, 18432, + 17920, 18048, 18064, 0, 16384, 18432, 17920, 18048, + 18064, 0, 16384, 18432, 17920, 18048, 18064, 18066, + 0, 16384, 18432, 17920, 18048, 18064, 0, 16384, + 18432, 17920, 18048, 18064, 18068, 0, 16384, 18432, + 17920, 18048, 18064, 18068, 0, 16384, 18432, 17920, + 18048, 18064, 18072, 18070, 0, 16384, 18432, 17920, + 18048, 18064, 0, 16384, 18432, 17920, 18048, 18080, + 18072, 0, 16384, 18432, 17920, 18048, 18080, 18072, + 0, 16384, 18432, 17920, 18048, 18080, 18072, 18074, + 0, 16384, 18432, 17920, 18048, 18080, 18072, 0, + 16384, 18432, 17920, 18048, 18080, 18081, 18076, 0, + 16384, 18432, 17920, 18048, 18080, 18081, 18076, 0, + 16384, 18432, 17920, 18048, 18080, 18081, 18076, 18078, + 0, 16384, 18432, 17920, 18048, 0, 16384, 18432, + 17920, 18048, 18080, 0, 16384, 18432, 17920, 18048, + 18080, 0, 16384, 18432, 17920, 18048, 18080, 18082, + 0, 16384, 18432, 17920, 18048, 18080, 0, 16384, + 18432, 17920, 18048, 18080, 18084, 0, 16384, 18432, + 17920, 18048, 18080, 18084, 0, 16384, 18432, 17920, + 18048, 18080, 18088, 18086, 0, 16384, 18432, 17920, + 18048, 18080, 0, 16384, 18432, 17920, 18048, 18080, + 18088, 0, 16384, 18432, 17920, 18048, 18080, 18088, + 0, 16384, 18432, 17920, 18048, 18080, 18088, 18090, + 0, 16384, 18432, 17920, 18048, 18080, 18088, 0, + 16384, 18432, 17920, 18048, 18080, 18096, 18092, 0, + 16384, 18432, 17920, 18048, 18080, 18096, 18092, 0, + 16384, 18432, 17920, 18048, 18080, 18096, 18097, 18094, + 0, 16384, 18432, 17920, 18048, 18080, 0, 16384, + 18432, 17920, 18048, 18112, 18096, 0, 16384, 18432, + 17920, 18048, 18112, 18096, 0, 16384, 18432, 17920, + 18048, 18112, 18096, 18098, 0, 16384, 18432, 17920, + 18048, 18112, 18096, 0, 16384, 18432, 17920, 18048, + 18112, 18096, 18100, 0, 16384, 18432, 17920, 18048, + 18112, 18096, 18100, 0, 16384, 18432, 17920, 18048, + 18112, 18096, 18104, 18102, 0, 16384, 18432, 17920, + 18048, 18112, 18096, 0, 16384, 18432, 17920, 18048, + 18112, 18113, 18104, 0, 16384, 18432, 17920, 18048, + 18112, 18113, 18104, 0, 16384, 18432, 17920, 18048, + 18112, 18113, 18104, 18106, 0, 16384, 18432, 17920, + 18048, 18112, 18113, 18104, 0, 16384, 18432, 17920, + 18048, 18112, 18113, 18104, 18108, 0, 16384, 18432, + 17920, 18048, 18112, 18113, 18115, 18108, 0, 16384, + 18432, 17920, 18048, 18112, 18113, 18115, 18108, 18110, + 0, 16384, 18432, 17920, 18048, 0, 16384, 18432, + 17920, 18176, 18112, 0, 16384, 18432, 17920, 18176, + 18112, 0, 16384, 18432, 17920, 18176, 18112, 18114, + 0, 16384, 18432, 17920, 18176, 18112, 0, 16384, + 18432, 17920, 18176, 18112, 18116, 0, 16384, 18432, + 17920, 18176, 18112, 18116, 0, 16384, 18432, 17920, + 18176, 18112, 18120, 18118, 0, 16384, 18432, 17920, + 18176, 18112, 0, 16384, 18432, 17920, 18176, 18112, + 18120, 0, 16384, 18432, 17920, 18176, 18112, 18120, + 0, 16384, 18432, 17920, 18176, 18112, 18120, 18122, + 0, 16384, 18432, 17920, 18176, 18112, 18120, 0, + 16384, 18432, 17920, 18176, 18112, 18128, 18124, 0, + 16384, 18432, 17920, 18176, 18112, 18128, 18124, 0, + 16384, 18432, 17920, 18176, 18112, 18128, 18129, 18126, + 0, 16384, 18432, 17920, 18176, 18112, 0, 16384, + 18432, 17920, 18176, 18112, 18128, 0, 16384, 18432, + 17920, 18176, 18112, 18128, 0, 16384, 18432, 17920, + 18176, 18112, 18128, 18130, 0, 16384, 18432, 17920, + 18176, 18112, 18128, 0, 16384, 18432, 17920, 18176, + 18112, 18128, 18132, 0, 16384, 18432, 17920, 18176, + 18112, 18128, 18132, 0, 16384, 18432, 17920, 18176, + 18112, 18128, 18136, 18134, 0, 16384, 18432, 17920, + 18176, 18112, 18128, 0, 16384, 18432, 17920, 18176, + 18112, 18144, 18136, 0, 16384, 18432, 17920, 18176, + 18112, 18144, 18136, 0, 16384, 18432, 17920, 18176, + 18112, 18144, 18136, 18138, 0, 16384, 18432, 17920, + 18176, 18112, 18144, 18136, 0, 16384, 18432, 17920, + 18176, 18112, 18144, 18145, 18140, 0, 16384, 18432, + 17920, 18176, 18112, 18144, 18145, 18140, 0, 16384, + 18432, 17920, 18176, 18112, 18144, 18145, 18140, 18142, + 0, 16384, 18432, 17920, 18176, 18112, 0, 16384, + 18432, 17920, 18176, 18177, 18144, 0, 16384, 18432, + 17920, 18176, 18177, 18144, 0, 16384, 18432, 17920, + 18176, 18177, 18144, 18146, 0, 16384, 18432, 17920, + 18176, 18177, 18144, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18148, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18148, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18152, 18150, 0, 16384, 18432, 17920, + 18176, 18177, 18144, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18152, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18152, 0, 16384, 18432, 17920, 18176, + 18177, 18144, 18152, 18154, 0, 16384, 18432, 17920, + 18176, 18177, 18144, 18152, 0, 16384, 18432, 17920, + 18176, 18177, 18144, 18160, 18156, 0, 16384, 18432, + 17920, 18176, 18177, 18144, 18160, 18156, 0, 16384, + 18432, 17920, 18176, 18177, 18144, 18160, 18161, 18158, + 0, 16384, 18432, 17920, 18176, 18177, 18144, 0, + 16384, 18432, 17920, 18176, 18177, 18144, 18160, 0, + 16384, 18432, 17920, 18176, 18177, 18179, 18160, 0, + 16384, 18432, 17920, 18176, 18177, 18179, 18160, 18162, + 0, 16384, 18432, 17920, 18176, 18177, 18179, 18160, + 0, 16384, 18432, 17920, 18176, 18177, 18179, 18160, + 18164, 0, 16384, 18432, 17920, 18176, 18177, 18179, + 18160, 18164, 0, 16384, 18432, 17920, 18176, 18177, + 18179, 18160, 18168, 18166, 0, 16384, 18432, 17920, + 18176, 18177, 18179, 18160, 0, 16384, 18432, 17920, + 18176, 18177, 18179, 18160, 18168, 0, 16384, 18432, + 17920, 18176, 18177, 18179, 18160, 18168, 0, 16384, + 18432, 17920, 18176, 18177, 18179, 18160, 18168, 18170, + 0, 16384, 18432, 17920, 18176, 18177, 18179, 18183, + 18168, 0, 16384, 18432, 17920, 18176, 18177, 18179, + 18183, 18168, 18172, 0, 16384, 18432, 17920, 18176, + 18177, 18179, 18183, 18168, 18172, 0, 16384, 18432, + 17920, 18176, 18177, 18179, 18183, 18168, 18172, 18174, + 0, 16384, 18432, 17920, 0, 16384, 18432, 17920, + 18176, 0, 16384, 18432, 18433, 18176, 0, 16384, + 18432, 18433, 18176, 18178, 0, 16384, 18432, 18433, + 18176, 0, 16384, 18432, 18433, 18176, 18180, 0, + 16384, 18432, 18433, 18176, 18180, 0, 16384, 18432, + 18433, 18176, 18184, 18182, 0, 16384, 18432, 18433, + 18176, 0, 16384, 18432, 18433, 18176, 18184, 0, + 16384, 18432, 18433, 18176, 18184, 0, 16384, 18432, + 18433, 18176, 18184, 18186, 0, 16384, 18432, 18433, + 18176, 18184, 0, 16384, 18432, 18433, 18176, 18192, + 18188, 0, 16384, 18432, 18433, 18176, 18192, 18188, + 0, 16384, 18432, 18433, 18176, 18192, 18193, 18190, + 0, 16384, 18432, 18433, 18176, 0, 16384, 18432, + 18433, 18176, 18192, 0, 16384, 18432, 18433, 18176, + 18192, 0, 16384, 18432, 18433, 18176, 18192, 18194, + 0, 16384, 18432, 18433, 18176, 18192, 0, 16384, + 18432, 18433, 18176, 18192, 18196, 0, 16384, 18432, + 18433, 18176, 18192, 18196, 0, 16384, 18432, 18433, + 18176, 18192, 18200, 18198, 0, 16384, 18432, 18433, + 18176, 18192, 0, 16384, 18432, 18433, 18176, 18208, + 18200, 0, 16384, 18432, 18433, 18176, 18208, 18200, + 0, 16384, 18432, 18433, 18176, 18208, 18200, 18202, + 0, 16384, 18432, 18433, 18176, 18208, 18200, 0, + 16384, 18432, 18433, 18176, 18208, 18209, 18204, 0, + 16384, 18432, 18433, 18176, 18208, 18209, 18204, 0, + 16384, 18432, 18433, 18176, 18208, 18209, 18204, 18206, + 0, 16384, 18432, 18433, 18176, 0, 16384, 18432, + 18433, 18176, 18208, 0, 16384, 18432, 18433, 18176, + 18208, 0, 16384, 18432, 18433, 18176, 18208, 18210, + 0, 16384, 18432, 18433, 18176, 18208, 0, 16384, + 18432, 18433, 18176, 18208, 18212, 0, 16384, 18432, + 18433, 18176, 18208, 18212, 0, 16384, 18432, 18433, + 18176, 18208, 18216, 18214, 0, 16384, 18432, 18433, + 18176, 18208, 0, 16384, 18432, 18433, 18176, 18208, + 18216, 0, 16384, 18432, 18433, 18176, 18208, 18216, + 0, 16384, 18432, 18433, 18176, 18208, 18216, 18218, + 0, 16384, 18432, 18433, 18176, 18208, 18216, 0, + 16384, 18432, 18433, 18176, 18208, 18224, 18220, 0, + 16384, 18432, 18433, 18176, 18208, 18224, 18220, 0, + 16384, 18432, 18433, 18176, 18208, 18224, 18225, 18222, + 0, 16384, 18432, 18433, 18176, 18208, 0, 16384, + 18432, 18433, 18176, 18240, 18224, 0, 16384, 18432, + 18433, 18176, 18240, 18224, 0, 16384, 18432, 18433, + 18176, 18240, 18224, 18226, 0, 16384, 18432, 18433, + 18176, 18240, 18224, 0, 16384, 18432, 18433, 18176, + 18240, 18224, 18228, 0, 16384, 18432, 18433, 18176, + 18240, 18224, 18228, 0, 16384, 18432, 18433, 18176, + 18240, 18224, 18232, 18230, 0, 16384, 18432, 18433, + 18176, 18240, 18224, 0, 16384, 18432, 18433, 18176, + 18240, 18241, 18232, 0, 16384, 18432, 18433, 18176, + 18240, 18241, 18232, 0, 16384, 18432, 18433, 18176, + 18240, 18241, 18232, 18234, 0, 16384, 18432, 18433, + 18176, 18240, 18241, 18232, 0, 16384, 18432, 18433, + 18176, 18240, 18241, 18232, 18236, 0, 16384, 18432, + 18433, 18176, 18240, 18241, 18243, 18236, 0, 16384, + 18432, 18433, 18176, 18240, 18241, 18243, 18236, 18238, + 0, 16384, 18432, 18433, 18176, 0, 16384, 18432, + 18433, 18176, 18240, 0, 16384, 18432, 18433, 18176, + 18240, 0, 16384, 18432, 18433, 18176, 18240, 18242, + 0, 16384, 18432, 18433, 18176, 18240, 0, 16384, + 18432, 18433, 18176, 18240, 18244, 0, 16384, 18432, + 18433, 18176, 18240, 18244, 0, 16384, 18432, 18433, + 18176, 18240, 18248, 18246, 0, 16384, 18432, 18433, + 18176, 18240, 0, 16384, 18432, 18433, 18176, 18240, + 18248, 0, 16384, 18432, 18433, 18176, 18240, 18248, + 0, 16384, 18432, 18433, 18176, 18240, 18248, 18250, + 0, 16384, 18432, 18433, 18176, 18240, 18248, 0, + 16384, 18432, 18433, 18176, 18240, 18256, 18252, 0, + 16384, 18432, 18433, 18176, 18240, 18256, 18252, 0, + 16384, 18432, 18433, 18176, 18240, 18256, 18257, 18254, + 0, 16384, 18432, 18433, 18176, 18240, 0, 16384, + 18432, 18433, 18176, 18240, 18256, 0, 16384, 18432, + 18433, 18176, 18240, 18256, 0, 16384, 18432, 18433, + 18176, 18240, 18256, 18258, 0, 16384, 18432, 18433, + 18176, 18240, 18256, 0, 16384, 18432, 18433, 18176, + 18240, 18256, 18260, 0, 16384, 18432, 18433, 18176, + 18240, 18256, 18260, 0, 16384, 18432, 18433, 18176, + 18240, 18256, 18264, 18262, 0, 16384, 18432, 18433, + 18176, 18240, 18256, 0, 16384, 18432, 18433, 18176, + 18240, 18272, 18264, 0, 16384, 18432, 18433, 18176, + 18240, 18272, 18264, 0, 16384, 18432, 18433, 18176, + 18240, 18272, 18264, 18266, 0, 16384, 18432, 18433, + 18176, 18240, 18272, 18264, 0, 16384, 18432, 18433, + 18176, 18240, 18272, 18273, 18268, 0, 16384, 18432, + 18433, 18176, 18240, 18272, 18273, 18268, 0, 16384, + 18432, 18433, 18176, 18240, 18272, 18273, 18268, 18270, + 0, 16384, 18432, 18433, 18176, 18240, 0, 16384, + 18432, 18433, 18176, 18304, 18272, 0, 16384, 18432, + 18433, 18176, 18304, 18272, 0, 16384, 18432, 18433, + 18176, 18304, 18272, 18274, 0, 16384, 18432, 18433, + 18176, 18304, 18272, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18276, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18276, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18280, 18278, 0, 16384, 18432, 18433, + 18176, 18304, 18272, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18280, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18280, 0, 16384, 18432, 18433, 18176, + 18304, 18272, 18280, 18282, 0, 16384, 18432, 18433, + 18176, 18304, 18272, 18280, 0, 16384, 18432, 18433, + 18176, 18304, 18272, 18288, 18284, 0, 16384, 18432, + 18433, 18176, 18304, 18272, 18288, 18284, 0, 16384, + 18432, 18433, 18176, 18304, 18272, 18288, 18289, 18286, + 0, 16384, 18432, 18433, 18176, 18304, 18272, 0, + 16384, 18432, 18433, 18176, 18304, 18305, 18288, 0, + 16384, 18432, 18433, 18176, 18304, 18305, 18288, 0, + 16384, 18432, 18433, 18176, 18304, 18305, 18288, 18290, + 0, 16384, 18432, 18433, 18176, 18304, 18305, 18288, + 0, 16384, 18432, 18433, 18176, 18304, 18305, 18288, + 18292, 0, 16384, 18432, 18433, 18176, 18304, 18305, + 18288, 18292, 0, 16384, 18432, 18433, 18176, 18304, + 18305, 18288, 18296, 18294, 0, 16384, 18432, 18433, + 18176, 18304, 18305, 18288, 0, 16384, 18432, 18433, + 18176, 18304, 18305, 18288, 18296, 0, 16384, 18432, + 18433, 18176, 18304, 18305, 18307, 18296, 0, 16384, + 18432, 18433, 18176, 18304, 18305, 18307, 18296, 18298, + 0, 16384, 18432, 18433, 18176, 18304, 18305, 18307, + 18296, 0, 16384, 18432, 18433, 18176, 18304, 18305, + 18307, 18296, 18300, 0, 16384, 18432, 18433, 18176, + 18304, 18305, 18307, 18296, 18300, 0, 16384, 18432, + 18433, 18176, 18304, 18305, 18307, 18296, 18300, 18302, + 0, 16384, 18432, 18433, 18176, 0, 16384, 18432, + 18433, 18176, 18304, 0, 16384, 18432, 18433, 18176, + 18304, 0, 16384, 18432, 18433, 18176, 18304, 18306, + 0, 16384, 18432, 18433, 18435, 18304, 0, 16384, + 18432, 18433, 18435, 18304, 18308, 0, 16384, 18432, + 18433, 18435, 18304, 18308, 0, 16384, 18432, 18433, + 18435, 18304, 18312, 18310, 0, 16384, 18432, 18433, + 18435, 18304, 0, 16384, 18432, 18433, 18435, 18304, + 18312, 0, 16384, 18432, 18433, 18435, 18304, 18312, + 0, 16384, 18432, 18433, 18435, 18304, 18312, 18314, + 0, 16384, 18432, 18433, 18435, 18304, 18312, 0, + 16384, 18432, 18433, 18435, 18304, 18320, 18316, 0, + 16384, 18432, 18433, 18435, 18304, 18320, 18316, 0, + 16384, 18432, 18433, 18435, 18304, 18320, 18321, 18318, + 0, 16384, 18432, 18433, 18435, 18304, 0, 16384, + 18432, 18433, 18435, 18304, 18320, 0, 16384, 18432, + 18433, 18435, 18304, 18320, 0, 16384, 18432, 18433, + 18435, 18304, 18320, 18322, 0, 16384, 18432, 18433, + 18435, 18304, 18320, 0, 16384, 18432, 18433, 18435, + 18304, 18320, 18324, 0, 16384, 18432, 18433, 18435, + 18304, 18320, 18324, 0, 16384, 18432, 18433, 18435, + 18304, 18320, 18328, 18326, 0, 16384, 18432, 18433, + 18435, 18304, 18320, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18328, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18328, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18328, 18330, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 18328, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 18337, 18332, 0, 16384, 18432, + 18433, 18435, 18304, 18336, 18337, 18332, 0, 16384, + 18432, 18433, 18435, 18304, 18336, 18337, 18332, 18334, + 0, 16384, 18432, 18433, 18435, 18304, 0, 16384, + 18432, 18433, 18435, 18304, 18336, 0, 16384, 18432, + 18433, 18435, 18304, 18336, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 18338, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18340, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18340, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18344, 18342, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18344, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18344, 0, 16384, 18432, 18433, 18435, + 18304, 18336, 18344, 18346, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 18344, 0, 16384, 18432, 18433, + 18435, 18304, 18336, 18352, 18348, 0, 16384, 18432, + 18433, 18435, 18304, 18336, 18352, 18348, 0, 16384, + 18432, 18433, 18435, 18304, 18336, 18352, 18353, 18350, + 0, 16384, 18432, 18433, 18435, 18304, 18336, 0, + 16384, 18432, 18433, 18435, 18304, 18368, 18352, 0, + 16384, 18432, 18433, 18435, 18304, 18368, 18352, 0, + 16384, 18432, 18433, 18435, 18304, 18368, 18352, 18354, + 0, 16384, 18432, 18433, 18435, 18304, 18368, 18352, + 0, 16384, 18432, 18433, 18435, 18304, 18368, 18352, + 18356, 0, 16384, 18432, 18433, 18435, 18304, 18368, + 18352, 18356, 0, 16384, 18432, 18433, 18435, 18304, + 18368, 18352, 18360, 18358, 0, 16384, 18432, 18433, + 18435, 18304, 18368, 18352, 0, 16384, 18432, 18433, + 18435, 18304, 18368, 18369, 18360, 0, 16384, 18432, + 18433, 18435, 18304, 18368, 18369, 18360, 0, 16384, + 18432, 18433, 18435, 18304, 18368, 18369, 18360, 18362, + 0, 16384, 18432, 18433, 18435, 18304, 18368, 18369, + 18360, 0, 16384, 18432, 18433, 18435, 18304, 18368, + 18369, 18360, 18364, 0, 16384, 18432, 18433, 18435, + 18304, 18368, 18369, 18371, 18364, 0, 16384, 18432, + 18433, 18435, 18304, 18368, 18369, 18371, 18364, 18366, + 0, 16384, 18432, 18433, 18435, 18304, 0, 16384, + 18432, 18433, 18435, 18304, 18368, 0, 16384, 18432, + 18433, 18435, 18304, 18368, 0, 16384, 18432, 18433, + 18435, 18304, 18368, 18370, 0, 16384, 18432, 18433, + 18435, 18304, 18368, 0, 16384, 18432, 18433, 18435, + 18304, 18368, 18372, 0, 16384, 18432, 18433, 18435, + 18304, 18368, 18372, 0, 16384, 18432, 18433, 18435, + 18304, 18368, 18376, 18374, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 0, 16384, 18432, 18433, 18435, + 18439, 18368, 18376, 0, 16384, 18432, 18433, 18435, + 18439, 18368, 18376, 0, 16384, 18432, 18433, 18435, + 18439, 18368, 18376, 18378, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18376, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18384, 18380, 0, 16384, 18432, + 18433, 18435, 18439, 18368, 18384, 18380, 0, 16384, + 18432, 18433, 18435, 18439, 18368, 18384, 18385, 18382, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18384, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18384, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18384, 18386, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18384, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18384, + 18388, 0, 16384, 18432, 18433, 18435, 18439, 18368, + 18384, 18388, 0, 16384, 18432, 18433, 18435, 18439, + 18368, 18384, 18392, 18390, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18384, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18400, 18392, 0, 16384, 18432, + 18433, 18435, 18439, 18368, 18400, 18392, 0, 16384, + 18432, 18433, 18435, 18439, 18368, 18400, 18392, 18394, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18400, + 18392, 0, 16384, 18432, 18433, 18435, 18439, 18368, + 18400, 18401, 18396, 0, 16384, 18432, 18433, 18435, + 18439, 18368, 18400, 18401, 18396, 0, 16384, 18432, + 18433, 18435, 18439, 18368, 18400, 18401, 18396, 18398, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18400, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18400, 0, + 16384, 18432, 18433, 18435, 18439, 18368, 18400, 18402, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18400, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18400, + 18404, 0, 16384, 18432, 18433, 18435, 18439, 18368, + 18400, 18404, 0, 16384, 18432, 18433, 18435, 18439, + 18368, 18400, 18408, 18406, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18400, 0, 16384, 18432, 18433, + 18435, 18439, 18368, 18400, 18408, 0, 16384, 18432, + 18433, 18435, 18439, 18368, 18400, 18408, 0, 16384, + 18432, 18433, 18435, 18439, 18368, 18400, 18408, 18410, + 0, 16384, 18432, 18433, 18435, 18439, 18368, 18400, + 18408, 0, 16384, 18432, 18433, 18435, 18439, 18368, + 18400, 18416, 18412, 0, 16384, 18432, 18433, 18435, + 18439, 18368, 18400, 18416, 18412, 0, 16384, 18432, + 18433, 18435, 18439, 18368, 18400, 18416, 18417, 18414, + 0, 16384, 18432, 18433, 18435, 18439, 18447, 18400, + 0, 16384, 18432, 18433, 18435, 18439, 18447, 18400, + 18416, 0, 16384, 18432, 18433, 18435, 18439, 18447, + 18400, 18416, 0, 16384, 18432, 18433, 18435, 18439, + 18447, 18400, 18416, 18418, 0, 16384, 18432, 18433, + 18435, 18439, 18447, 18400, 18416, 0, 16384, 18432, + 18433, 18435, 18439, 18447, 18400, 18416, 18420, 0, + 16384, 18432, 18433, 18435, 18439, 18447, 18400, 18416, + 18420, 0, 16384, 18432, 18433, 18435, 18439, 18447, + 18400, 18416, 18424, 18422, 0, 16384, 18432, 18433, + 18435, 18439, 18447, 18400, 18416, 0, 16384, 18432, + 18433, 18435, 18439, 18447, 18400, 18416, 18424, 0, + 16384, 18432, 18433, 18435, 18439, 18447, 18400, 18416, + 18424, 0, 16384, 18432, 18433, 18435, 18439, 18447, + 18400, 18416, 18424, 18426, 0, 16384, 18432, 18433, + 18435, 18439, 18447, 18400, 18416, 18424, 0, 16384, + 18432, 18433, 18435, 18439, 18447, 18400, 18416, 18424, + 18428, 0, 16384, 18432, 18433, 18435, 18439, 18447, + 18400, 18416, 18424, 18428, 0, 16384, 18432, 18433, + 18435, 18439, 18447, 18400, 18416, 18424, 18428, 18430, + 0, 16384, 0, 16384, 18432, 0, 16384, 18432, + 0, 16384, 18432, 18434, 0, 16384, 18432, 0, + 16384, 18432, 18436, 0, 16384, 18432, 18436, 0, + 16384, 18432, 18440, 18438, 0, 16384, 18432, 0, + 16384, 18432, 18440, 0, 16384, 18432, 18440, 0, + 16384, 18432, 18440, 18442, 0, 16384, 18432, 18440, + 0, 16384, 18432, 18448, 18444, 0, 16384, 18432, + 18448, 18444, 0, 16384, 18432, 18448, 18449, 18446, + 0, 16384, 18432, 0, 16384, 18432, 18448, 0, + 16384, 18432, 18448, 0, 16384, 18432, 18448, 18450, + 0, 16384, 18432, 18448, 0, 16384, 18432, 18448, + 18452, 0, 16384, 18432, 18448, 18452, 0, 16384, + 18432, 18448, 18456, 18454, 0, 16384, 18432, 18448, + 0, 16384, 18432, 18464, 18456, 0, 16384, 18432, + 18464, 18456, 0, 16384, 18432, 18464, 18456, 18458, + 0, 16384, 18432, 18464, 18456, 0, 16384, 18432, + 18464, 18465, 18460, 0, 16384, 18432, 18464, 18465, + 18460, 0, 16384, 18432, 18464, 18465, 18460, 18462, + 0, 16384, 18432, 0, 16384, 18432, 18464, 0, + 16384, 18432, 18464, 0, 16384, 18432, 18464, 18466, + 0, 16384, 18432, 18464, 0, 16384, 18432, 18464, + 18468, 0, 16384, 18432, 18464, 18468, 0, 16384, + 18432, 18464, 18472, 18470, 0, 16384, 18432, 18464, + 0, 16384, 18432, 18464, 18472, 0, 16384, 18432, + 18464, 18472, 0, 16384, 18432, 18464, 18472, 18474, + 0, 16384, 18432, 18464, 18472, 0, 16384, 18432, + 18464, 18480, 18476, 0, 16384, 18432, 18464, 18480, + 18476, 0, 16384, 18432, 18464, 18480, 18481, 18478, + 0, 16384, 18432, 18464, 0, 16384, 18432, 18496, + 18480, 0, 16384, 18432, 18496, 18480, 0, 16384, + 18432, 18496, 18480, 18482, 0, 16384, 18432, 18496, + 18480, 0, 16384, 18432, 18496, 18480, 18484, 0, + 16384, 18432, 18496, 18480, 18484, 0, 16384, 18432, + 18496, 18480, 18488, 18486, 0, 16384, 18432, 18496, + 18480, 0, 16384, 18432, 18496, 18497, 18488, 0, + 16384, 18432, 18496, 18497, 18488, 0, 16384, 18432, + 18496, 18497, 18488, 18490, 0, 16384, 18432, 18496, + 18497, 18488, 0, 16384, 18432, 18496, 18497, 18488, + 18492, 0, 16384, 18432, 18496, 18497, 18499, 18492, + 0, 16384, 18432, 18496, 18497, 18499, 18492, 18494, + 0, 16384, 18432, 0, 16384, 18432, 18496, 0, + 16384, 18432, 18496, 0, 16384, 18432, 18496, 18498, + 0, 16384, 18432, 18496, 0, 16384, 18432, 18496, + 18500, 0, 16384, 18432, 18496, 18500, 0, 16384, + 18432, 18496, 18504, 18502, 0, 16384, 18432, 18496, + 0, 16384, 18432, 18496, 18504, 0, 16384, 18432, + 18496, 18504, 0, 16384, 18432, 18496, 18504, 18506, + 0, 16384, 18432, 18496, 18504, 0, 16384, 18432, + 18496, 18512, 18508, 0, 16384, 18432, 18496, 18512, + 18508, 0, 16384, 18432, 18496, 18512, 18513, 18510, + 0, 16384, 18432, 18496, 0, 16384, 18432, 18496, + 18512, 0, 16384, 18432, 18496, 18512, 0, 16384, + 18432, 18496, 18512, 18514, 0, 16384, 18432, 18496, + 18512, 0, 16384, 18432, 18496, 18512, 18516, 0, + 16384, 18432, 18496, 18512, 18516, 0, 16384, 18432, + 18496, 18512, 18520, 18518, 0, 16384, 18432, 18496, + 18512, 0, 16384, 18432, 18496, 18528, 18520, 0, + 16384, 18432, 18496, 18528, 18520, 0, 16384, 18432, + 18496, 18528, 18520, 18522, 0, 16384, 18432, 18496, + 18528, 18520, 0, 16384, 18432, 18496, 18528, 18529, + 18524, 0, 16384, 18432, 18496, 18528, 18529, 18524, + 0, 16384, 18432, 18496, 18528, 18529, 18524, 18526, + 0, 16384, 18432, 18496, 0, 16384, 18432, 18560, + 18528, 0, 16384, 18432, 18560, 18528, 0, 16384, + 18432, 18560, 18528, 18530, 0, 16384, 18432, 18560, + 18528, 0, 16384, 18432, 18560, 18528, 18532, 0, + 16384, 18432, 18560, 18528, 18532, 0, 16384, 18432, + 18560, 18528, 18536, 18534, 0, 16384, 18432, 18560, + 18528, 0, 16384, 18432, 18560, 18528, 18536, 0, + 16384, 18432, 18560, 18528, 18536, 0, 16384, 18432, + 18560, 18528, 18536, 18538, 0, 16384, 18432, 18560, + 18528, 18536, 0, 16384, 18432, 18560, 18528, 18544, + 18540, 0, 16384, 18432, 18560, 18528, 18544, 18540, + 0, 16384, 18432, 18560, 18528, 18544, 18545, 18542, + 0, 16384, 18432, 18560, 18528, 0, 16384, 18432, + 18560, 18561, 18544, 0, 16384, 18432, 18560, 18561, + 18544, 0, 16384, 18432, 18560, 18561, 18544, 18546, + 0, 16384, 18432, 18560, 18561, 18544, 0, 16384, + 18432, 18560, 18561, 18544, 18548, 0, 16384, 18432, + 18560, 18561, 18544, 18548, 0, 16384, 18432, 18560, + 18561, 18544, 18552, 18550, 0, 16384, 18432, 18560, + 18561, 18544, 0, 16384, 18432, 18560, 18561, 18544, + 18552, 0, 16384, 18432, 18560, 18561, 18563, 18552, + 0, 16384, 18432, 18560, 18561, 18563, 18552, 18554, + 0, 16384, 18432, 18560, 18561, 18563, 18552, 0, + 16384, 18432, 18560, 18561, 18563, 18552, 18556, 0, + 16384, 18432, 18560, 18561, 18563, 18552, 18556, 0, + 16384, 18432, 18560, 18561, 18563, 18552, 18556, 18558, + 0, 16384, 18432, 0, 16384, 18432, 18560, 0, + 16384, 18432, 18560, 0, 16384, 18432, 18560, 18562, + 0, 16384, 18432, 18560, 0, 16384, 18432, 18560, + 18564, 0, 16384, 18432, 18560, 18564, 0, 16384, + 18432, 18560, 18568, 18566, 0, 16384, 18432, 18560, + 0, 16384, 18432, 18560, 18568, 0, 16384, 18432, + 18560, 18568, 0, 16384, 18432, 18560, 18568, 18570, + 0, 16384, 18432, 18560, 18568, 0, 16384, 18432, + 18560, 18576, 18572, 0, 16384, 18432, 18560, 18576, + 18572, 0, 16384, 18432, 18560, 18576, 18577, 18574, + 0, 16384, 18432, 18560, 0, 16384, 18432, 18560, + 18576, 0, 16384, 18432, 18560, 18576, 0, 16384, + 18432, 18560, 18576, 18578, 0, 16384, 18432, 18560, + 18576, 0, 16384, 18432, 18560, 18576, 18580, 0, + 16384, 18432, 18560, 18576, 18580, 0, 16384, 18432, + 18560, 18576, 18584, 18582, 0, 16384, 18432, 18560, + 18576, 0, 16384, 18432, 18560, 18592, 18584, 0, + 16384, 18432, 18560, 18592, 18584, 0, 16384, 18432, + 18560, 18592, 18584, 18586, 0, 16384, 18432, 18560, + 18592, 18584, 0, 16384, 18432, 18560, 18592, 18593, + 18588, 0, 16384, 18432, 18560, 18592, 18593, 18588, + 0, 16384, 18432, 18560, 18592, 18593, 18588, 18590, + 0, 16384, 18432, 18560, 0, 16384, 18432, 18560, + 18592, 0, 16384, 18432, 18560, 18592, 0, 16384, + 18432, 18560, 18592, 18594, 0, 16384, 18432, 18560, + 18592, 0, 16384, 18432, 18560, 18592, 18596, 0, + 16384, 18432, 18560, 18592, 18596, 0, 16384, 18432, + 18560, 18592, 18600, 18598, 0, 16384, 18432, 18560, + 18592, 0, 16384, 18432, 18560, 18592, 18600, 0, + 16384, 18432, 18560, 18592, 18600, 0, 16384, 18432, + 18560, 18592, 18600, 18602, 0, 16384, 18432, 18560, + 18592, 18600, 0, 16384, 18432, 18560, 18592, 18608, + 18604, 0, 16384, 18432, 18560, 18592, 18608, 18604, + 0, 16384, 18432, 18560, 18592, 18608, 18609, 18606, + 0, 16384, 18432, 18560, 18592, 0, 16384, 18432, + 18560, 18624, 18608, 0, 16384, 18432, 18560, 18624, + 18608, 0, 16384, 18432, 18560, 18624, 18608, 18610, + 0, 16384, 18432, 18560, 18624, 18608, 0, 16384, + 18432, 18560, 18624, 18608, 18612, 0, 16384, 18432, + 18560, 18624, 18608, 18612, 0, 16384, 18432, 18560, + 18624, 18608, 18616, 18614, 0, 16384, 18432, 18560, + 18624, 18608, 0, 16384, 18432, 18560, 18624, 18625, + 18616, 0, 16384, 18432, 18560, 18624, 18625, 18616, + 0, 16384, 18432, 18560, 18624, 18625, 18616, 18618, + 0, 16384, 18432, 18560, 18624, 18625, 18616, 0, + 16384, 18432, 18560, 18624, 18625, 18616, 18620, 0, + 16384, 18432, 18560, 18624, 18625, 18627, 18620, 0, + 16384, 18432, 18560, 18624, 18625, 18627, 18620, 18622, + 0, 16384, 18432, 18560, 0, 16384, 18432, 18688, + 18624, 0, 16384, 18432, 18688, 18624, 0, 16384, + 18432, 18688, 18624, 18626, 0, 16384, 18432, 18688, + 18624, 0, 16384, 18432, 18688, 18624, 18628, 0, + 16384, 18432, 18688, 18624, 18628, 0, 16384, 18432, + 18688, 18624, 18632, 18630, 0, 16384, 18432, 18688, + 18624, 0, 16384, 18432, 18688, 18624, 18632, 0, + 16384, 18432, 18688, 18624, 18632, 0, 16384, 18432, + 18688, 18624, 18632, 18634, 0, 16384, 18432, 18688, + 18624, 18632, 0, 16384, 18432, 18688, 18624, 18640, + 18636, 0, 16384, 18432, 18688, 18624, 18640, 18636, + 0, 16384, 18432, 18688, 18624, 18640, 18641, 18638, + 0, 16384, 18432, 18688, 18624, 0, 16384, 18432, + 18688, 18624, 18640, 0, 16384, 18432, 18688, 18624, + 18640, 0, 16384, 18432, 18688, 18624, 18640, 18642, + 0, 16384, 18432, 18688, 18624, 18640, 0, 16384, + 18432, 18688, 18624, 18640, 18644, 0, 16384, 18432, + 18688, 18624, 18640, 18644, 0, 16384, 18432, 18688, + 18624, 18640, 18648, 18646, 0, 16384, 18432, 18688, + 18624, 18640, 0, 16384, 18432, 18688, 18624, 18656, + 18648, 0, 16384, 18432, 18688, 18624, 18656, 18648, + 0, 16384, 18432, 18688, 18624, 18656, 18648, 18650, + 0, 16384, 18432, 18688, 18624, 18656, 18648, 0, + 16384, 18432, 18688, 18624, 18656, 18657, 18652, 0, + 16384, 18432, 18688, 18624, 18656, 18657, 18652, 0, + 16384, 18432, 18688, 18624, 18656, 18657, 18652, 18654, + 0, 16384, 18432, 18688, 18624, 0, 16384, 18432, + 18688, 18689, 18656, 0, 16384, 18432, 18688, 18689, + 18656, 0, 16384, 18432, 18688, 18689, 18656, 18658, + 0, 16384, 18432, 18688, 18689, 18656, 0, 16384, + 18432, 18688, 18689, 18656, 18660, 0, 16384, 18432, + 18688, 18689, 18656, 18660, 0, 16384, 18432, 18688, + 18689, 18656, 18664, 18662, 0, 16384, 18432, 18688, + 18689, 18656, 0, 16384, 18432, 18688, 18689, 18656, + 18664, 0, 16384, 18432, 18688, 18689, 18656, 18664, + 0, 16384, 18432, 18688, 18689, 18656, 18664, 18666, + 0, 16384, 18432, 18688, 18689, 18656, 18664, 0, + 16384, 18432, 18688, 18689, 18656, 18672, 18668, 0, + 16384, 18432, 18688, 18689, 18656, 18672, 18668, 0, + 16384, 18432, 18688, 18689, 18656, 18672, 18673, 18670, + 0, 16384, 18432, 18688, 18689, 18656, 0, 16384, + 18432, 18688, 18689, 18656, 18672, 0, 16384, 18432, + 18688, 18689, 18691, 18672, 0, 16384, 18432, 18688, + 18689, 18691, 18672, 18674, 0, 16384, 18432, 18688, + 18689, 18691, 18672, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18676, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18676, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18680, 18678, 0, 16384, 18432, 18688, + 18689, 18691, 18672, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18680, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18680, 0, 16384, 18432, 18688, 18689, + 18691, 18672, 18680, 18682, 0, 16384, 18432, 18688, + 18689, 18691, 18695, 18680, 0, 16384, 18432, 18688, + 18689, 18691, 18695, 18680, 18684, 0, 16384, 18432, + 18688, 18689, 18691, 18695, 18680, 18684, 0, 16384, + 18432, 18688, 18689, 18691, 18695, 18680, 18684, 18686, + 0, 16384, 18432, 0, 16384, 18432, 18688, 0, + 16384, 18432, 18688, 0, 16384, 18432, 18688, 18690, + 0, 16384, 18432, 18688, 0, 16384, 18432, 18688, + 18692, 0, 16384, 18432, 18688, 18692, 0, 16384, + 18432, 18688, 18696, 18694, 0, 16384, 18432, 18688, + 0, 16384, 18432, 18688, 18696, 0, 16384, 18432, + 18688, 18696, 0, 16384, 18432, 18688, 18696, 18698, + 0, 16384, 18432, 18688, 18696, 0, 16384, 18432, + 18688, 18704, 18700, 0, 16384, 18432, 18688, 18704, + 18700, 0, 16384, 18432, 18688, 18704, 18705, 18702, + 0, 16384, 18432, 18688, 0, 16384, 18432, 18688, + 18704, 0, 16384, 18432, 18688, 18704, 0, 16384, + 18432, 18688, 18704, 18706, 0, 16384, 18432, 18688, + 18704, 0, 16384, 18432, 18688, 18704, 18708, 0, + 16384, 18432, 18688, 18704, 18708, 0, 16384, 18432, + 18688, 18704, 18712, 18710, 0, 16384, 18432, 18688, + 18704, 0, 16384, 18432, 18688, 18720, 18712, 0, + 16384, 18432, 18688, 18720, 18712, 0, 16384, 18432, + 18688, 18720, 18712, 18714, 0, 16384, 18432, 18688, + 18720, 18712, 0, 16384, 18432, 18688, 18720, 18721, + 18716, 0, 16384, 18432, 18688, 18720, 18721, 18716, + 0, 16384, 18432, 18688, 18720, 18721, 18716, 18718, + 0, 16384, 18432, 18688, 0, 16384, 18432, 18688, + 18720, 0, 16384, 18432, 18688, 18720, 0, 16384, + 18432, 18688, 18720, 18722, 0, 16384, 18432, 18688, + 18720, 0, 16384, 18432, 18688, 18720, 18724, 0, + 16384, 18432, 18688, 18720, 18724, 0, 16384, 18432, + 18688, 18720, 18728, 18726, 0, 16384, 18432, 18688, + 18720, 0, 16384, 18432, 18688, 18720, 18728, 0, + 16384, 18432, 18688, 18720, 18728, 0, 16384, 18432, + 18688, 18720, 18728, 18730, 0, 16384, 18432, 18688, + 18720, 18728, 0, 16384, 18432, 18688, 18720, 18736, + 18732, 0, 16384, 18432, 18688, 18720, 18736, 18732, + 0, 16384, 18432, 18688, 18720, 18736, 18737, 18734, + 0, 16384, 18432, 18688, 18720, 0, 16384, 18432, + 18688, 18752, 18736, 0, 16384, 18432, 18688, 18752, + 18736, 0, 16384, 18432, 18688, 18752, 18736, 18738, + 0, 16384, 18432, 18688, 18752, 18736, 0, 16384, + 18432, 18688, 18752, 18736, 18740, 0, 16384, 18432, + 18688, 18752, 18736, 18740, 0, 16384, 18432, 18688, + 18752, 18736, 18744, 18742, 0, 16384, 18432, 18688, + 18752, 18736, 0, 16384, 18432, 18688, 18752, 18753, + 18744, 0, 16384, 18432, 18688, 18752, 18753, 18744, + 0, 16384, 18432, 18688, 18752, 18753, 18744, 18746, + 0, 16384, 18432, 18688, 18752, 18753, 18744, 0, + 16384, 18432, 18688, 18752, 18753, 18744, 18748, 0, + 16384, 18432, 18688, 18752, 18753, 18755, 18748, 0, + 16384, 18432, 18688, 18752, 18753, 18755, 18748, 18750, + 0, 16384, 18432, 18688, 0, 16384, 18432, 18688, + 18752, 0, 16384, 18432, 18688, 18752, 0, 16384, + 18432, 18688, 18752, 18754, 0, 16384, 18432, 18688, + 18752, 0, 16384, 18432, 18688, 18752, 18756, 0, + 16384, 18432, 18688, 18752, 18756, 0, 16384, 18432, + 18688, 18752, 18760, 18758, 0, 16384, 18432, 18688, + 18752, 0, 16384, 18432, 18688, 18752, 18760, 0, + 16384, 18432, 18688, 18752, 18760, 0, 16384, 18432, + 18688, 18752, 18760, 18762, 0, 16384, 18432, 18688, + 18752, 18760, 0, 16384, 18432, 18688, 18752, 18768, + 18764, 0, 16384, 18432, 18688, 18752, 18768, 18764, + 0, 16384, 18432, 18688, 18752, 18768, 18769, 18766, + 0, 16384, 18432, 18688, 18752, 0, 16384, 18432, + 18688, 18752, 18768, 0, 16384, 18432, 18688, 18752, + 18768, 0, 16384, 18432, 18688, 18752, 18768, 18770, + 0, 16384, 18432, 18688, 18752, 18768, 0, 16384, + 18432, 18688, 18752, 18768, 18772, 0, 16384, 18432, + 18688, 18752, 18768, 18772, 0, 16384, 18432, 18688, + 18752, 18768, 18776, 18774, 0, 16384, 18432, 18688, + 18752, 18768, 0, 16384, 18432, 18688, 18752, 18784, + 18776, 0, 16384, 18432, 18688, 18752, 18784, 18776, + 0, 16384, 18432, 18688, 18752, 18784, 18776, 18778, + 0, 16384, 18432, 18688, 18752, 18784, 18776, 0, + 16384, 18432, 18688, 18752, 18784, 18785, 18780, 0, + 16384, 18432, 18688, 18752, 18784, 18785, 18780, 0, + 16384, 18432, 18688, 18752, 18784, 18785, 18780, 18782, + 0, 16384, 18432, 18688, 18752, 0, 16384, 18432, + 18688, 18816, 18784, 0, 16384, 18432, 18688, 18816, + 18784, 0, 16384, 18432, 18688, 18816, 18784, 18786, + 0, 16384, 18432, 18688, 18816, 18784, 0, 16384, + 18432, 18688, 18816, 18784, 18788, 0, 16384, 18432, + 18688, 18816, 18784, 18788, 0, 16384, 18432, 18688, + 18816, 18784, 18792, 18790, 0, 16384, 18432, 18688, + 18816, 18784, 0, 16384, 18432, 18688, 18816, 18784, + 18792, 0, 16384, 18432, 18688, 18816, 18784, 18792, + 0, 16384, 18432, 18688, 18816, 18784, 18792, 18794, + 0, 16384, 18432, 18688, 18816, 18784, 18792, 0, + 16384, 18432, 18688, 18816, 18784, 18800, 18796, 0, + 16384, 18432, 18688, 18816, 18784, 18800, 18796, 0, + 16384, 18432, 18688, 18816, 18784, 18800, 18801, 18798, + 0, 16384, 18432, 18688, 18816, 18784, 0, 16384, + 18432, 18688, 18816, 18817, 18800, 0, 16384, 18432, + 18688, 18816, 18817, 18800, 0, 16384, 18432, 18688, + 18816, 18817, 18800, 18802, 0, 16384, 18432, 18688, + 18816, 18817, 18800, 0, 16384, 18432, 18688, 18816, + 18817, 18800, 18804, 0, 16384, 18432, 18688, 18816, + 18817, 18800, 18804, 0, 16384, 18432, 18688, 18816, + 18817, 18800, 18808, 18806, 0, 16384, 18432, 18688, + 18816, 18817, 18800, 0, 16384, 18432, 18688, 18816, + 18817, 18800, 18808, 0, 16384, 18432, 18688, 18816, + 18817, 18819, 18808, 0, 16384, 18432, 18688, 18816, + 18817, 18819, 18808, 18810, 0, 16384, 18432, 18688, + 18816, 18817, 18819, 18808, 0, 16384, 18432, 18688, + 18816, 18817, 18819, 18808, 18812, 0, 16384, 18432, + 18688, 18816, 18817, 18819, 18808, 18812, 0, 16384, + 18432, 18688, 18816, 18817, 18819, 18808, 18812, 18814, + 0, 16384, 18432, 18688, 0, 16384, 18432, 18944, + 18816, 0, 16384, 18432, 18944, 18816, 0, 16384, + 18432, 18944, 18816, 18818, 0, 16384, 18432, 18944, + 18816, 0, 16384, 18432, 18944, 18816, 18820, 0, + 16384, 18432, 18944, 18816, 18820, 0, 16384, 18432, + 18944, 18816, 18824, 18822, 0, 16384, 18432, 18944, + 18816, 0, 16384, 18432, 18944, 18816, 18824, 0, + 16384, 18432, 18944, 18816, 18824, 0, 16384, 18432, + 18944, 18816, 18824, 18826, 0, 16384, 18432, 18944, + 18816, 18824, 0, 16384, 18432, 18944, 18816, 18832, + 18828, 0, 16384, 18432, 18944, 18816, 18832, 18828, + 0, 16384, 18432, 18944, 18816, 18832, 18833, 18830, + 0, 16384, 18432, 18944, 18816, 0, 16384, 18432, + 18944, 18816, 18832, 0, 16384, 18432, 18944, 18816, + 18832, 0, 16384, 18432, 18944, 18816, 18832, 18834, + 0, 16384, 18432, 18944, 18816, 18832, 0, 16384, + 18432, 18944, 18816, 18832, 18836, 0, 16384, 18432, + 18944, 18816, 18832, 18836, 0, 16384, 18432, 18944, + 18816, 18832, 18840, 18838, 0, 16384, 18432, 18944, + 18816, 18832, 0, 16384, 18432, 18944, 18816, 18848, + 18840, 0, 16384, 18432, 18944, 18816, 18848, 18840, + 0, 16384, 18432, 18944, 18816, 18848, 18840, 18842, + 0, 16384, 18432, 18944, 18816, 18848, 18840, 0, + 16384, 18432, 18944, 18816, 18848, 18849, 18844, 0, + 16384, 18432, 18944, 18816, 18848, 18849, 18844, 0, + 16384, 18432, 18944, 18816, 18848, 18849, 18844, 18846, + 0, 16384, 18432, 18944, 18816, 0, 16384, 18432, + 18944, 18816, 18848, 0, 16384, 18432, 18944, 18816, + 18848, 0, 16384, 18432, 18944, 18816, 18848, 18850, + 0, 16384, 18432, 18944, 18816, 18848, 0, 16384, + 18432, 18944, 18816, 18848, 18852, 0, 16384, 18432, + 18944, 18816, 18848, 18852, 0, 16384, 18432, 18944, + 18816, 18848, 18856, 18854, 0, 16384, 18432, 18944, + 18816, 18848, 0, 16384, 18432, 18944, 18816, 18848, + 18856, 0, 16384, 18432, 18944, 18816, 18848, 18856, + 0, 16384, 18432, 18944, 18816, 18848, 18856, 18858, + 0, 16384, 18432, 18944, 18816, 18848, 18856, 0, + 16384, 18432, 18944, 18816, 18848, 18864, 18860, 0, + 16384, 18432, 18944, 18816, 18848, 18864, 18860, 0, + 16384, 18432, 18944, 18816, 18848, 18864, 18865, 18862, + 0, 16384, 18432, 18944, 18816, 18848, 0, 16384, + 18432, 18944, 18816, 18880, 18864, 0, 16384, 18432, + 18944, 18816, 18880, 18864, 0, 16384, 18432, 18944, + 18816, 18880, 18864, 18866, 0, 16384, 18432, 18944, + 18816, 18880, 18864, 0, 16384, 18432, 18944, 18816, + 18880, 18864, 18868, 0, 16384, 18432, 18944, 18816, + 18880, 18864, 18868, 0, 16384, 18432, 18944, 18816, + 18880, 18864, 18872, 18870, 0, 16384, 18432, 18944, + 18816, 18880, 18864, 0, 16384, 18432, 18944, 18816, + 18880, 18881, 18872, 0, 16384, 18432, 18944, 18816, + 18880, 18881, 18872, 0, 16384, 18432, 18944, 18816, + 18880, 18881, 18872, 18874, 0, 16384, 18432, 18944, + 18816, 18880, 18881, 18872, 0, 16384, 18432, 18944, + 18816, 18880, 18881, 18872, 18876, 0, 16384, 18432, + 18944, 18816, 18880, 18881, 18883, 18876, 0, 16384, + 18432, 18944, 18816, 18880, 18881, 18883, 18876, 18878, + 0, 16384, 18432, 18944, 18816, 0, 16384, 18432, + 18944, 18945, 18880, 0, 16384, 18432, 18944, 18945, + 18880, 0, 16384, 18432, 18944, 18945, 18880, 18882, + 0, 16384, 18432, 18944, 18945, 18880, 0, 16384, + 18432, 18944, 18945, 18880, 18884, 0, 16384, 18432, + 18944, 18945, 18880, 18884, 0, 16384, 18432, 18944, + 18945, 18880, 18888, 18886, 0, 16384, 18432, 18944, + 18945, 18880, 0, 16384, 18432, 18944, 18945, 18880, + 18888, 0, 16384, 18432, 18944, 18945, 18880, 18888, + 0, 16384, 18432, 18944, 18945, 18880, 18888, 18890, + 0, 16384, 18432, 18944, 18945, 18880, 18888, 0, + 16384, 18432, 18944, 18945, 18880, 18896, 18892, 0, + 16384, 18432, 18944, 18945, 18880, 18896, 18892, 0, + 16384, 18432, 18944, 18945, 18880, 18896, 18897, 18894, + 0, 16384, 18432, 18944, 18945, 18880, 0, 16384, + 18432, 18944, 18945, 18880, 18896, 0, 16384, 18432, + 18944, 18945, 18880, 18896, 0, 16384, 18432, 18944, + 18945, 18880, 18896, 18898, 0, 16384, 18432, 18944, + 18945, 18880, 18896, 0, 16384, 18432, 18944, 18945, + 18880, 18896, 18900, 0, 16384, 18432, 18944, 18945, + 18880, 18896, 18900, 0, 16384, 18432, 18944, 18945, + 18880, 18896, 18904, 18902, 0, 16384, 18432, 18944, + 18945, 18880, 18896, 0, 16384, 18432, 18944, 18945, + 18880, 18912, 18904, 0, 16384, 18432, 18944, 18945, + 18880, 18912, 18904, 0, 16384, 18432, 18944, 18945, + 18880, 18912, 18904, 18906, 0, 16384, 18432, 18944, + 18945, 18880, 18912, 18904, 0, 16384, 18432, 18944, + 18945, 18880, 18912, 18913, 18908, 0, 16384, 18432, + 18944, 18945, 18880, 18912, 18913, 18908, 0, 16384, + 18432, 18944, 18945, 18880, 18912, 18913, 18908, 18910, + 0, 16384, 18432, 18944, 18945, 18880, 0, 16384, + 18432, 18944, 18945, 18880, 18912, 0, 16384, 18432, + 18944, 18945, 18947, 18912, 0, 16384, 18432, 18944, + 18945, 18947, 18912, 18914, 0, 16384, 18432, 18944, + 18945, 18947, 18912, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18916, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18916, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18920, 18918, 0, 16384, 18432, 18944, + 18945, 18947, 18912, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18920, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18920, 0, 16384, 18432, 18944, 18945, + 18947, 18912, 18920, 18922, 0, 16384, 18432, 18944, + 18945, 18947, 18912, 18920, 0, 16384, 18432, 18944, + 18945, 18947, 18912, 18928, 18924, 0, 16384, 18432, + 18944, 18945, 18947, 18912, 18928, 18924, 0, 16384, + 18432, 18944, 18945, 18947, 18912, 18928, 18929, 18926, + 0, 16384, 18432, 18944, 18945, 18947, 18912, 0, + 16384, 18432, 18944, 18945, 18947, 18912, 18928, 0, + 16384, 18432, 18944, 18945, 18947, 18912, 18928, 0, + 16384, 18432, 18944, 18945, 18947, 18912, 18928, 18930, + 0, 16384, 18432, 18944, 18945, 18947, 18951, 18928, + 0, 16384, 18432, 18944, 18945, 18947, 18951, 18928, + 18932, 0, 16384, 18432, 18944, 18945, 18947, 18951, + 18928, 18932, 0, 16384, 18432, 18944, 18945, 18947, + 18951, 18928, 18936, 18934, 0, 16384, 18432, 18944, + 18945, 18947, 18951, 18928, 0, 16384, 18432, 18944, + 18945, 18947, 18951, 18928, 18936, 0, 16384, 18432, + 18944, 18945, 18947, 18951, 18928, 18936, 0, 16384, + 18432, 18944, 18945, 18947, 18951, 18928, 18936, 18938, + 0, 16384, 18432, 18944, 18945, 18947, 18951, 18928, + 18936, 0, 16384, 18432, 18944, 18945, 18947, 18951, + 18928, 18936, 18940, 0, 16384, 18432, 18944, 18945, + 18947, 18951, 18928, 18936, 18940, 0, 16384, 18432, + 18944, 18945, 18947, 18951, 18928, 18936, 18940, 18942, + 0, 16384, 18432, 0, 16384, 18432, 18944, 0, + 16384, 18432, 18944, 0, 16384, 18432, 18944, 18946, + 0, 16384, 18432, 18944, 0, 16384, 18432, 18944, + 18948, 0, 16384, 18432, 18944, 18948, 0, 16384, + 18432, 18944, 18952, 18950, 0, 16384, 18432, 18944, + 0, 16384, 18432, 18944, 18952, 0, 16384, 18432, + 18944, 18952, 0, 16384, 18432, 18944, 18952, 18954, + 0, 16384, 18432, 18944, 18952, 0, 16384, 18432, + 18944, 18960, 18956, 0, 16384, 18432, 18944, 18960, + 18956, 0, 16384, 18432, 18944, 18960, 18961, 18958, + 0, 16384, 18432, 18944, 0, 16384, 18432, 18944, + 18960, 0, 16384, 18432, 18944, 18960, 0, 16384, + 18432, 18944, 18960, 18962, 0, 16384, 18432, 18944, + 18960, 0, 16384, 18432, 18944, 18960, 18964, 0, + 16384, 18432, 18944, 18960, 18964, 0, 16384, 18432, + 18944, 18960, 18968, 18966, 0, 16384, 18432, 18944, + 18960, 0, 16384, 18432, 18944, 18976, 18968, 0, + 16384, 18432, 18944, 18976, 18968, 0, 16384, 18432, + 18944, 18976, 18968, 18970, 0, 16384, 18432, 18944, + 18976, 18968, 0, 16384, 18432, 18944, 18976, 18977, + 18972, 0, 16384, 18432, 18944, 18976, 18977, 18972, + 0, 16384, 18432, 18944, 18976, 18977, 18972, 18974, + 0, 16384, 18432, 18944, 0, 16384, 18432, 18944, + 18976, 0, 16384, 18432, 18944, 18976, 0, 16384, + 18432, 18944, 18976, 18978, 0, 16384, 18432, 18944, + 18976, 0, 16384, 18432, 18944, 18976, 18980, 0, + 16384, 18432, 18944, 18976, 18980, 0, 16384, 18432, + 18944, 18976, 18984, 18982, 0, 16384, 18432, 18944, + 18976, 0, 16384, 18432, 18944, 18976, 18984, 0, + 16384, 18432, 18944, 18976, 18984, 0, 16384, 18432, + 18944, 18976, 18984, 18986, 0, 16384, 18432, 18944, + 18976, 18984, 0, 16384, 18432, 18944, 18976, 18992, + 18988, 0, 16384, 18432, 18944, 18976, 18992, 18988, + 0, 16384, 18432, 18944, 18976, 18992, 18993, 18990, + 0, 16384, 18432, 18944, 18976, 0, 16384, 18432, + 18944, 19008, 18992, 0, 16384, 18432, 18944, 19008, + 18992, 0, 16384, 18432, 18944, 19008, 18992, 18994, + 0, 16384, 18432, 18944, 19008, 18992, 0, 16384, + 18432, 18944, 19008, 18992, 18996, 0, 16384, 18432, + 18944, 19008, 18992, 18996, 0, 16384, 18432, 18944, + 19008, 18992, 19000, 18998, 0, 16384, 18432, 18944, + 19008, 18992, 0, 16384, 18432, 18944, 19008, 19009, + 19000, 0, 16384, 18432, 18944, 19008, 19009, 19000, + 0, 16384, 18432, 18944, 19008, 19009, 19000, 19002, + 0, 16384, 18432, 18944, 19008, 19009, 19000, 0, + 16384, 18432, 18944, 19008, 19009, 19000, 19004, 0, + 16384, 18432, 18944, 19008, 19009, 19011, 19004, 0, + 16384, 18432, 18944, 19008, 19009, 19011, 19004, 19006, + 0, 16384, 18432, 18944, 0, 16384, 18432, 18944, + 19008, 0, 16384, 18432, 18944, 19008, 0, 16384, + 18432, 18944, 19008, 19010, 0, 16384, 18432, 18944, + 19008, 0, 16384, 18432, 18944, 19008, 19012, 0, + 16384, 18432, 18944, 19008, 19012, 0, 16384, 18432, + 18944, 19008, 19016, 19014, 0, 16384, 18432, 18944, + 19008, 0, 16384, 18432, 18944, 19008, 19016, 0, + 16384, 18432, 18944, 19008, 19016, 0, 16384, 18432, + 18944, 19008, 19016, 19018, 0, 16384, 18432, 18944, + 19008, 19016, 0, 16384, 18432, 18944, 19008, 19024, + 19020, 0, 16384, 18432, 18944, 19008, 19024, 19020, + 0, 16384, 18432, 18944, 19008, 19024, 19025, 19022, + 0, 16384, 18432, 18944, 19008, 0, 16384, 18432, + 18944, 19008, 19024, 0, 16384, 18432, 18944, 19008, + 19024, 0, 16384, 18432, 18944, 19008, 19024, 19026, + 0, 16384, 18432, 18944, 19008, 19024, 0, 16384, + 18432, 18944, 19008, 19024, 19028, 0, 16384, 18432, + 18944, 19008, 19024, 19028, 0, 16384, 18432, 18944, + 19008, 19024, 19032, 19030, 0, 16384, 18432, 18944, + 19008, 19024, 0, 16384, 18432, 18944, 19008, 19040, + 19032, 0, 16384, 18432, 18944, 19008, 19040, 19032, + 0, 16384, 18432, 18944, 19008, 19040, 19032, 19034, + 0, 16384, 18432, 18944, 19008, 19040, 19032, 0, + 16384, 18432, 18944, 19008, 19040, 19041, 19036, 0, + 16384, 18432, 18944, 19008, 19040, 19041, 19036, 0, + 16384, 18432, 18944, 19008, 19040, 19041, 19036, 19038, + 0, 16384, 18432, 18944, 19008, 0, 16384, 18432, + 18944, 19072, 19040, 0, 16384, 18432, 18944, 19072, + 19040, 0, 16384, 18432, 18944, 19072, 19040, 19042, + 0, 16384, 18432, 18944, 19072, 19040, 0, 16384, + 18432, 18944, 19072, 19040, 19044, 0, 16384, 18432, + 18944, 19072, 19040, 19044, 0, 16384, 18432, 18944, + 19072, 19040, 19048, 19046, 0, 16384, 18432, 18944, + 19072, 19040, 0, 16384, 18432, 18944, 19072, 19040, + 19048, 0, 16384, 18432, 18944, 19072, 19040, 19048, + 0, 16384, 18432, 18944, 19072, 19040, 19048, 19050, + 0, 16384, 18432, 18944, 19072, 19040, 19048, 0, + 16384, 18432, 18944, 19072, 19040, 19056, 19052, 0, + 16384, 18432, 18944, 19072, 19040, 19056, 19052, 0, + 16384, 18432, 18944, 19072, 19040, 19056, 19057, 19054, + 0, 16384, 18432, 18944, 19072, 19040, 0, 16384, + 18432, 18944, 19072, 19073, 19056, 0, 16384, 18432, + 18944, 19072, 19073, 19056, 0, 16384, 18432, 18944, + 19072, 19073, 19056, 19058, 0, 16384, 18432, 18944, + 19072, 19073, 19056, 0, 16384, 18432, 18944, 19072, + 19073, 19056, 19060, 0, 16384, 18432, 18944, 19072, + 19073, 19056, 19060, 0, 16384, 18432, 18944, 19072, + 19073, 19056, 19064, 19062, 0, 16384, 18432, 18944, + 19072, 19073, 19056, 0, 16384, 18432, 18944, 19072, + 19073, 19056, 19064, 0, 16384, 18432, 18944, 19072, + 19073, 19075, 19064, 0, 16384, 18432, 18944, 19072, + 19073, 19075, 19064, 19066, 0, 16384, 18432, 18944, + 19072, 19073, 19075, 19064, 0, 16384, 18432, 18944, + 19072, 19073, 19075, 19064, 19068, 0, 16384, 18432, + 18944, 19072, 19073, 19075, 19064, 19068, 0, 16384, + 18432, 18944, 19072, 19073, 19075, 19064, 19068, 19070, + 0, 16384, 18432, 18944, 0, 16384, 18432, 18944, + 19072, 0, 16384, 18432, 18944, 19072, 0, 16384, + 18432, 18944, 19072, 19074, 0, 16384, 18432, 18944, + 19072, 0, 16384, 18432, 18944, 19072, 19076, 0, + 16384, 18432, 18944, 19072, 19076, 0, 16384, 18432, + 18944, 19072, 19080, 19078, 0, 16384, 18432, 18944, + 19072, 0, 16384, 18432, 18944, 19072, 19080, 0, + 16384, 18432, 18944, 19072, 19080, 0, 16384, 18432, + 18944, 19072, 19080, 19082, 0, 16384, 18432, 18944, + 19072, 19080, 0, 16384, 18432, 18944, 19072, 19088, + 19084, 0, 16384, 18432, 18944, 19072, 19088, 19084, + 0, 16384, 18432, 18944, 19072, 19088, 19089, 19086, + 0, 16384, 18432, 18944, 19072, 0, 16384, 18432, + 18944, 19072, 19088, 0, 16384, 18432, 18944, 19072, + 19088, 0, 16384, 18432, 18944, 19072, 19088, 19090, + 0, 16384, 18432, 18944, 19072, 19088, 0, 16384, + 18432, 18944, 19072, 19088, 19092, 0, 16384, 18432, + 18944, 19072, 19088, 19092, 0, 16384, 18432, 18944, + 19072, 19088, 19096, 19094, 0, 16384, 18432, 18944, + 19072, 19088, 0, 16384, 18432, 18944, 19072, 19104, + 19096, 0, 16384, 18432, 18944, 19072, 19104, 19096, + 0, 16384, 18432, 18944, 19072, 19104, 19096, 19098, + 0, 16384, 18432, 18944, 19072, 19104, 19096, 0, + 16384, 18432, 18944, 19072, 19104, 19105, 19100, 0, + 16384, 18432, 18944, 19072, 19104, 19105, 19100, 0, + 16384, 18432, 18944, 19072, 19104, 19105, 19100, 19102, + 0, 16384, 18432, 18944, 19072, 0, 16384, 18432, + 18944, 19072, 19104, 0, 16384, 18432, 18944, 19072, + 19104, 0, 16384, 18432, 18944, 19072, 19104, 19106, + 0, 16384, 18432, 18944, 19072, 19104, 0, 16384, + 18432, 18944, 19072, 19104, 19108, 0, 16384, 18432, + 18944, 19072, 19104, 19108, 0, 16384, 18432, 18944, + 19072, 19104, 19112, 19110, 0, 16384, 18432, 18944, + 19072, 19104, 0, 16384, 18432, 18944, 19072, 19104, + 19112, 0, 16384, 18432, 18944, 19072, 19104, 19112, + 0, 16384, 18432, 18944, 19072, 19104, 19112, 19114, + 0, 16384, 18432, 18944, 19072, 19104, 19112, 0, + 16384, 18432, 18944, 19072, 19104, 19120, 19116, 0, + 16384, 18432, 18944, 19072, 19104, 19120, 19116, 0, + 16384, 18432, 18944, 19072, 19104, 19120, 19121, 19118, + 0, 16384, 18432, 18944, 19072, 19104, 0, 16384, + 18432, 18944, 19072, 19136, 19120, 0, 16384, 18432, + 18944, 19072, 19136, 19120, 0, 16384, 18432, 18944, + 19072, 19136, 19120, 19122, 0, 16384, 18432, 18944, + 19072, 19136, 19120, 0, 16384, 18432, 18944, 19072, + 19136, 19120, 19124, 0, 16384, 18432, 18944, 19072, + 19136, 19120, 19124, 0, 16384, 18432, 18944, 19072, + 19136, 19120, 19128, 19126, 0, 16384, 18432, 18944, + 19072, 19136, 19120, 0, 16384, 18432, 18944, 19072, + 19136, 19137, 19128, 0, 16384, 18432, 18944, 19072, + 19136, 19137, 19128, 0, 16384, 18432, 18944, 19072, + 19136, 19137, 19128, 19130, 0, 16384, 18432, 18944, + 19072, 19136, 19137, 19128, 0, 16384, 18432, 18944, + 19072, 19136, 19137, 19128, 19132, 0, 16384, 18432, + 18944, 19072, 19136, 19137, 19139, 19132, 0, 16384, + 18432, 18944, 19072, 19136, 19137, 19139, 19132, 19134, + 0, 16384, 18432, 18944, 19072, 0, 16384, 18432, + 18944, 19200, 19136, 0, 16384, 18432, 18944, 19200, + 19136, 0, 16384, 18432, 18944, 19200, 19136, 19138, + 0, 16384, 18432, 18944, 19200, 19136, 0, 16384, + 18432, 18944, 19200, 19136, 19140, 0, 16384, 18432, + 18944, 19200, 19136, 19140, 0, 16384, 18432, 18944, + 19200, 19136, 19144, 19142, 0, 16384, 18432, 18944, + 19200, 19136, 0, 16384, 18432, 18944, 19200, 19136, + 19144, 0, 16384, 18432, 18944, 19200, 19136, 19144, + 0, 16384, 18432, 18944, 19200, 19136, 19144, 19146, + 0, 16384, 18432, 18944, 19200, 19136, 19144, 0, + 16384, 18432, 18944, 19200, 19136, 19152, 19148, 0, + 16384, 18432, 18944, 19200, 19136, 19152, 19148, 0, + 16384, 18432, 18944, 19200, 19136, 19152, 19153, 19150, + 0, 16384, 18432, 18944, 19200, 19136, 0, 16384, + 18432, 18944, 19200, 19136, 19152, 0, 16384, 18432, + 18944, 19200, 19136, 19152, 0, 16384, 18432, 18944, + 19200, 19136, 19152, 19154, 0, 16384, 18432, 18944, + 19200, 19136, 19152, 0, 16384, 18432, 18944, 19200, + 19136, 19152, 19156, 0, 16384, 18432, 18944, 19200, + 19136, 19152, 19156, 0, 16384, 18432, 18944, 19200, + 19136, 19152, 19160, 19158, 0, 16384, 18432, 18944, + 19200, 19136, 19152, 0, 16384, 18432, 18944, 19200, + 19136, 19168, 19160, 0, 16384, 18432, 18944, 19200, + 19136, 19168, 19160, 0, 16384, 18432, 18944, 19200, + 19136, 19168, 19160, 19162, 0, 16384, 18432, 18944, + 19200, 19136, 19168, 19160, 0, 16384, 18432, 18944, + 19200, 19136, 19168, 19169, 19164, 0, 16384, 18432, + 18944, 19200, 19136, 19168, 19169, 19164, 0, 16384, + 18432, 18944, 19200, 19136, 19168, 19169, 19164, 19166, + 0, 16384, 18432, 18944, 19200, 19136, 0, 16384, + 18432, 18944, 19200, 19201, 19168, 0, 16384, 18432, + 18944, 19200, 19201, 19168, 0, 16384, 18432, 18944, + 19200, 19201, 19168, 19170, 0, 16384, 18432, 18944, + 19200, 19201, 19168, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19172, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19172, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19176, 19174, 0, 16384, 18432, 18944, + 19200, 19201, 19168, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19176, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19176, 0, 16384, 18432, 18944, 19200, + 19201, 19168, 19176, 19178, 0, 16384, 18432, 18944, + 19200, 19201, 19168, 19176, 0, 16384, 18432, 18944, + 19200, 19201, 19168, 19184, 19180, 0, 16384, 18432, + 18944, 19200, 19201, 19168, 19184, 19180, 0, 16384, + 18432, 18944, 19200, 19201, 19168, 19184, 19185, 19182, + 0, 16384, 18432, 18944, 19200, 19201, 19168, 0, + 16384, 18432, 18944, 19200, 19201, 19168, 19184, 0, + 16384, 18432, 18944, 19200, 19201, 19203, 19184, 0, + 16384, 18432, 18944, 19200, 19201, 19203, 19184, 19186, + 0, 16384, 18432, 18944, 19200, 19201, 19203, 19184, + 0, 16384, 18432, 18944, 19200, 19201, 19203, 19184, + 19188, 0, 16384, 18432, 18944, 19200, 19201, 19203, + 19184, 19188, 0, 16384, 18432, 18944, 19200, 19201, + 19203, 19184, 19192, 19190, 0, 16384, 18432, 18944, + 19200, 19201, 19203, 19184, 0, 16384, 18432, 18944, + 19200, 19201, 19203, 19184, 19192, 0, 16384, 18432, + 18944, 19200, 19201, 19203, 19184, 19192, 0, 16384, + 18432, 18944, 19200, 19201, 19203, 19184, 19192, 19194, + 0, 16384, 18432, 18944, 19200, 19201, 19203, 19207, + 19192, 0, 16384, 18432, 18944, 19200, 19201, 19203, + 19207, 19192, 19196, 0, 16384, 18432, 18944, 19200, + 19201, 19203, 19207, 19192, 19196, 0, 16384, 18432, + 18944, 19200, 19201, 19203, 19207, 19192, 19196, 19198, + 0, 16384, 18432, 18944, 0, 16384, 18432, 19456, + 19200, 0, 16384, 18432, 19456, 19200, 0, 16384, + 18432, 19456, 19200, 19202, 0, 16384, 18432, 19456, + 19200, 0, 16384, 18432, 19456, 19200, 19204, 0, + 16384, 18432, 19456, 19200, 19204, 0, 16384, 18432, + 19456, 19200, 19208, 19206, 0, 16384, 18432, 19456, + 19200, 0, 16384, 18432, 19456, 19200, 19208, 0, + 16384, 18432, 19456, 19200, 19208, 0, 16384, 18432, + 19456, 19200, 19208, 19210, 0, 16384, 18432, 19456, + 19200, 19208, 0, 16384, 18432, 19456, 19200, 19216, + 19212, 0, 16384, 18432, 19456, 19200, 19216, 19212, + 0, 16384, 18432, 19456, 19200, 19216, 19217, 19214, + 0, 16384, 18432, 19456, 19200, 0, 16384, 18432, + 19456, 19200, 19216, 0, 16384, 18432, 19456, 19200, + 19216, 0, 16384, 18432, 19456, 19200, 19216, 19218, + 0, 16384, 18432, 19456, 19200, 19216, 0, 16384, + 18432, 19456, 19200, 19216, 19220, 0, 16384, 18432, + 19456, 19200, 19216, 19220, 0, 16384, 18432, 19456, + 19200, 19216, 19224, 19222, 0, 16384, 18432, 19456, + 19200, 19216, 0, 16384, 18432, 19456, 19200, 19232, + 19224, 0, 16384, 18432, 19456, 19200, 19232, 19224, + 0, 16384, 18432, 19456, 19200, 19232, 19224, 19226, + 0, 16384, 18432, 19456, 19200, 19232, 19224, 0, + 16384, 18432, 19456, 19200, 19232, 19233, 19228, 0, + 16384, 18432, 19456, 19200, 19232, 19233, 19228, 0, + 16384, 18432, 19456, 19200, 19232, 19233, 19228, 19230, + 0, 16384, 18432, 19456, 19200, 0, 16384, 18432, + 19456, 19200, 19232, 0, 16384, 18432, 19456, 19200, + 19232, 0, 16384, 18432, 19456, 19200, 19232, 19234, + 0, 16384, 18432, 19456, 19200, 19232, 0, 16384, + 18432, 19456, 19200, 19232, 19236, 0, 16384, 18432, + 19456, 19200, 19232, 19236, 0, 16384, 18432, 19456, + 19200, 19232, 19240, 19238, 0, 16384, 18432, 19456, + 19200, 19232, 0, 16384, 18432, 19456, 19200, 19232, + 19240, 0, 16384, 18432, 19456, 19200, 19232, 19240, + 0, 16384, 18432, 19456, 19200, 19232, 19240, 19242, + 0, 16384, 18432, 19456, 19200, 19232, 19240, 0, + 16384, 18432, 19456, 19200, 19232, 19248, 19244, 0, + 16384, 18432, 19456, 19200, 19232, 19248, 19244, 0, + 16384, 18432, 19456, 19200, 19232, 19248, 19249, 19246, + 0, 16384, 18432, 19456, 19200, 19232, 0, 16384, + 18432, 19456, 19200, 19264, 19248, 0, 16384, 18432, + 19456, 19200, 19264, 19248, 0, 16384, 18432, 19456, + 19200, 19264, 19248, 19250, 0, 16384, 18432, 19456, + 19200, 19264, 19248, 0, 16384, 18432, 19456, 19200, + 19264, 19248, 19252, 0, 16384, 18432, 19456, 19200, + 19264, 19248, 19252, 0, 16384, 18432, 19456, 19200, + 19264, 19248, 19256, 19254, 0, 16384, 18432, 19456, + 19200, 19264, 19248, 0, 16384, 18432, 19456, 19200, + 19264, 19265, 19256, 0, 16384, 18432, 19456, 19200, + 19264, 19265, 19256, 0, 16384, 18432, 19456, 19200, + 19264, 19265, 19256, 19258, 0, 16384, 18432, 19456, + 19200, 19264, 19265, 19256, 0, 16384, 18432, 19456, + 19200, 19264, 19265, 19256, 19260, 0, 16384, 18432, + 19456, 19200, 19264, 19265, 19267, 19260, 0, 16384, + 18432, 19456, 19200, 19264, 19265, 19267, 19260, 19262, + 0, 16384, 18432, 19456, 19200, 0, 16384, 18432, + 19456, 19200, 19264, 0, 16384, 18432, 19456, 19200, + 19264, 0, 16384, 18432, 19456, 19200, 19264, 19266, + 0, 16384, 18432, 19456, 19200, 19264, 0, 16384, + 18432, 19456, 19200, 19264, 19268, 0, 16384, 18432, + 19456, 19200, 19264, 19268, 0, 16384, 18432, 19456, + 19200, 19264, 19272, 19270, 0, 16384, 18432, 19456, + 19200, 19264, 0, 16384, 18432, 19456, 19200, 19264, + 19272, 0, 16384, 18432, 19456, 19200, 19264, 19272, + 0, 16384, 18432, 19456, 19200, 19264, 19272, 19274, + 0, 16384, 18432, 19456, 19200, 19264, 19272, 0, + 16384, 18432, 19456, 19200, 19264, 19280, 19276, 0, + 16384, 18432, 19456, 19200, 19264, 19280, 19276, 0, + 16384, 18432, 19456, 19200, 19264, 19280, 19281, 19278, + 0, 16384, 18432, 19456, 19200, 19264, 0, 16384, + 18432, 19456, 19200, 19264, 19280, 0, 16384, 18432, + 19456, 19200, 19264, 19280, 0, 16384, 18432, 19456, + 19200, 19264, 19280, 19282, 0, 16384, 18432, 19456, + 19200, 19264, 19280, 0, 16384, 18432, 19456, 19200, + 19264, 19280, 19284, 0, 16384, 18432, 19456, 19200, + 19264, 19280, 19284, 0, 16384, 18432, 19456, 19200, + 19264, 19280, 19288, 19286, 0, 16384, 18432, 19456, + 19200, 19264, 19280, 0, 16384, 18432, 19456, 19200, + 19264, 19296, 19288, 0, 16384, 18432, 19456, 19200, + 19264, 19296, 19288, 0, 16384, 18432, 19456, 19200, + 19264, 19296, 19288, 19290, 0, 16384, 18432, 19456, + 19200, 19264, 19296, 19288, 0, 16384, 18432, 19456, + 19200, 19264, 19296, 19297, 19292, 0, 16384, 18432, + 19456, 19200, 19264, 19296, 19297, 19292, 0, 16384, + 18432, 19456, 19200, 19264, 19296, 19297, 19292, 19294, + 0, 16384, 18432, 19456, 19200, 19264, 0, 16384, + 18432, 19456, 19200, 19328, 19296, 0, 16384, 18432, + 19456, 19200, 19328, 19296, 0, 16384, 18432, 19456, + 19200, 19328, 19296, 19298, 0, 16384, 18432, 19456, + 19200, 19328, 19296, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19300, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19300, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19304, 19302, 0, 16384, 18432, 19456, + 19200, 19328, 19296, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19304, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19304, 0, 16384, 18432, 19456, 19200, + 19328, 19296, 19304, 19306, 0, 16384, 18432, 19456, + 19200, 19328, 19296, 19304, 0, 16384, 18432, 19456, + 19200, 19328, 19296, 19312, 19308, 0, 16384, 18432, + 19456, 19200, 19328, 19296, 19312, 19308, 0, 16384, + 18432, 19456, 19200, 19328, 19296, 19312, 19313, 19310, + 0, 16384, 18432, 19456, 19200, 19328, 19296, 0, + 16384, 18432, 19456, 19200, 19328, 19329, 19312, 0, + 16384, 18432, 19456, 19200, 19328, 19329, 19312, 0, + 16384, 18432, 19456, 19200, 19328, 19329, 19312, 19314, + 0, 16384, 18432, 19456, 19200, 19328, 19329, 19312, + 0, 16384, 18432, 19456, 19200, 19328, 19329, 19312, + 19316, 0, 16384, 18432, 19456, 19200, 19328, 19329, + 19312, 19316, 0, 16384, 18432, 19456, 19200, 19328, + 19329, 19312, 19320, 19318, 0, 16384, 18432, 19456, + 19200, 19328, 19329, 19312, 0, 16384, 18432, 19456, + 19200, 19328, 19329, 19312, 19320, 0, 16384, 18432, + 19456, 19200, 19328, 19329, 19331, 19320, 0, 16384, + 18432, 19456, 19200, 19328, 19329, 19331, 19320, 19322, + 0, 16384, 18432, 19456, 19200, 19328, 19329, 19331, + 19320, 0, 16384, 18432, 19456, 19200, 19328, 19329, + 19331, 19320, 19324, 0, 16384, 18432, 19456, 19200, + 19328, 19329, 19331, 19320, 19324, 0, 16384, 18432, + 19456, 19200, 19328, 19329, 19331, 19320, 19324, 19326, + 0, 16384, 18432, 19456, 19200, 0, 16384, 18432, + 19456, 19200, 19328, 0, 16384, 18432, 19456, 19457, + 19328, 0, 16384, 18432, 19456, 19457, 19328, 19330, + 0, 16384, 18432, 19456, 19457, 19328, 0, 16384, + 18432, 19456, 19457, 19328, 19332, 0, 16384, 18432, + 19456, 19457, 19328, 19332, 0, 16384, 18432, 19456, + 19457, 19328, 19336, 19334, 0, 16384, 18432, 19456, + 19457, 19328, 0, 16384, 18432, 19456, 19457, 19328, + 19336, 0, 16384, 18432, 19456, 19457, 19328, 19336, + 0, 16384, 18432, 19456, 19457, 19328, 19336, 19338, + 0, 16384, 18432, 19456, 19457, 19328, 19336, 0, + 16384, 18432, 19456, 19457, 19328, 19344, 19340, 0, + 16384, 18432, 19456, 19457, 19328, 19344, 19340, 0, + 16384, 18432, 19456, 19457, 19328, 19344, 19345, 19342, + 0, 16384, 18432, 19456, 19457, 19328, 0, 16384, + 18432, 19456, 19457, 19328, 19344, 0, 16384, 18432, + 19456, 19457, 19328, 19344, 0, 16384, 18432, 19456, + 19457, 19328, 19344, 19346, 0, 16384, 18432, 19456, + 19457, 19328, 19344, 0, 16384, 18432, 19456, 19457, + 19328, 19344, 19348, 0, 16384, 18432, 19456, 19457, + 19328, 19344, 19348, 0, 16384, 18432, 19456, 19457, + 19328, 19344, 19352, 19350, 0, 16384, 18432, 19456, + 19457, 19328, 19344, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19352, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19352, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19352, 19354, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 19352, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 19361, 19356, 0, 16384, 18432, + 19456, 19457, 19328, 19360, 19361, 19356, 0, 16384, + 18432, 19456, 19457, 19328, 19360, 19361, 19356, 19358, + 0, 16384, 18432, 19456, 19457, 19328, 0, 16384, + 18432, 19456, 19457, 19328, 19360, 0, 16384, 18432, + 19456, 19457, 19328, 19360, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 19362, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19364, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19364, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19368, 19366, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19368, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19368, 0, 16384, 18432, 19456, 19457, + 19328, 19360, 19368, 19370, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 19368, 0, 16384, 18432, 19456, + 19457, 19328, 19360, 19376, 19372, 0, 16384, 18432, + 19456, 19457, 19328, 19360, 19376, 19372, 0, 16384, + 18432, 19456, 19457, 19328, 19360, 19376, 19377, 19374, + 0, 16384, 18432, 19456, 19457, 19328, 19360, 0, + 16384, 18432, 19456, 19457, 19328, 19392, 19376, 0, + 16384, 18432, 19456, 19457, 19328, 19392, 19376, 0, + 16384, 18432, 19456, 19457, 19328, 19392, 19376, 19378, + 0, 16384, 18432, 19456, 19457, 19328, 19392, 19376, + 0, 16384, 18432, 19456, 19457, 19328, 19392, 19376, + 19380, 0, 16384, 18432, 19456, 19457, 19328, 19392, + 19376, 19380, 0, 16384, 18432, 19456, 19457, 19328, + 19392, 19376, 19384, 19382, 0, 16384, 18432, 19456, + 19457, 19328, 19392, 19376, 0, 16384, 18432, 19456, + 19457, 19328, 19392, 19393, 19384, 0, 16384, 18432, + 19456, 19457, 19328, 19392, 19393, 19384, 0, 16384, + 18432, 19456, 19457, 19328, 19392, 19393, 19384, 19386, + 0, 16384, 18432, 19456, 19457, 19328, 19392, 19393, + 19384, 0, 16384, 18432, 19456, 19457, 19328, 19392, + 19393, 19384, 19388, 0, 16384, 18432, 19456, 19457, + 19328, 19392, 19393, 19395, 19388, 0, 16384, 18432, + 19456, 19457, 19328, 19392, 19393, 19395, 19388, 19390, + 0, 16384, 18432, 19456, 19457, 19328, 0, 16384, + 18432, 19456, 19457, 19328, 19392, 0, 16384, 18432, + 19456, 19457, 19328, 19392, 0, 16384, 18432, 19456, + 19457, 19328, 19392, 19394, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19396, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19396, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19400, 19398, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19400, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19400, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19400, 19402, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 19400, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 19408, 19404, 0, 16384, 18432, + 19456, 19457, 19459, 19392, 19408, 19404, 0, 16384, + 18432, 19456, 19457, 19459, 19392, 19408, 19409, 19406, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19408, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19408, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19408, 19410, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 19408, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 19408, + 19412, 0, 16384, 18432, 19456, 19457, 19459, 19392, + 19408, 19412, 0, 16384, 18432, 19456, 19457, 19459, + 19392, 19408, 19416, 19414, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 19408, 0, 16384, 18432, 19456, + 19457, 19459, 19392, 19424, 19416, 0, 16384, 18432, + 19456, 19457, 19459, 19392, 19424, 19416, 0, 16384, + 18432, 19456, 19457, 19459, 19392, 19424, 19416, 19418, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 19424, + 19416, 0, 16384, 18432, 19456, 19457, 19459, 19392, + 19424, 19425, 19420, 0, 16384, 18432, 19456, 19457, + 19459, 19392, 19424, 19425, 19420, 0, 16384, 18432, + 19456, 19457, 19459, 19392, 19424, 19425, 19420, 19422, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19424, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19424, 0, + 16384, 18432, 19456, 19457, 19459, 19392, 19424, 19426, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 19424, + 0, 16384, 18432, 19456, 19457, 19459, 19392, 19424, + 19428, 0, 16384, 18432, 19456, 19457, 19459, 19392, + 19424, 19428, 0, 16384, 18432, 19456, 19457, 19459, + 19392, 19424, 19432, 19430, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 19432, 0, 16384, 18432, + 19456, 19457, 19459, 19463, 19424, 19432, 0, 16384, + 18432, 19456, 19457, 19459, 19463, 19424, 19432, 19434, + 0, 16384, 18432, 19456, 19457, 19459, 19463, 19424, + 19432, 0, 16384, 18432, 19456, 19457, 19459, 19463, + 19424, 19440, 19436, 0, 16384, 18432, 19456, 19457, + 19459, 19463, 19424, 19440, 19436, 0, 16384, 18432, + 19456, 19457, 19459, 19463, 19424, 19440, 19441, 19438, + 0, 16384, 18432, 19456, 19457, 19459, 19463, 19424, + 0, 16384, 18432, 19456, 19457, 19459, 19463, 19424, + 19440, 0, 16384, 18432, 19456, 19457, 19459, 19463, + 19424, 19440, 0, 16384, 18432, 19456, 19457, 19459, + 19463, 19424, 19440, 19442, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 19440, 0, 16384, 18432, + 19456, 19457, 19459, 19463, 19424, 19440, 19444, 0, + 16384, 18432, 19456, 19457, 19459, 19463, 19424, 19440, + 19444, 0, 16384, 18432, 19456, 19457, 19459, 19463, + 19424, 19440, 19448, 19446, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 19440, 0, 16384, 18432, + 19456, 19457, 19459, 19463, 19424, 19440, 19448, 0, + 16384, 18432, 19456, 19457, 19459, 19463, 19424, 19440, + 19448, 0, 16384, 18432, 19456, 19457, 19459, 19463, + 19424, 19440, 19448, 19450, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 19440, 19448, 0, 16384, + 18432, 19456, 19457, 19459, 19463, 19424, 19440, 19448, + 19452, 0, 16384, 18432, 19456, 19457, 19459, 19463, + 19424, 19440, 19448, 19452, 0, 16384, 18432, 19456, + 19457, 19459, 19463, 19424, 19440, 19448, 19452, 19454, + 0, 16384, 18432, 0, 16384, 18432, 19456, 0, + 16384, 18432, 19456, 0, 16384, 18432, 19456, 19458, + 0, 16384, 18432, 19456, 0, 16384, 18432, 19456, + 19460, 0, 16384, 18432, 19456, 19460, 0, 16384, + 18432, 19456, 19464, 19462, 0, 16384, 18432, 19456, + 0, 16384, 18432, 19456, 19464, 0, 16384, 18432, + 19456, 19464, 0, 16384, 18432, 19456, 19464, 19466, + 0, 16384, 18432, 19456, 19464, 0, 16384, 18432, + 19456, 19472, 19468, 0, 16384, 18432, 19456, 19472, + 19468, 0, 16384, 18432, 19456, 19472, 19473, 19470, + 0, 16384, 18432, 19456, 0, 16384, 18432, 19456, + 19472, 0, 16384, 18432, 19456, 19472, 0, 16384, + 18432, 19456, 19472, 19474, 0, 16384, 18432, 19456, + 19472, 0, 16384, 18432, 19456, 19472, 19476, 0, + 16384, 18432, 19456, 19472, 19476, 0, 16384, 18432, + 19456, 19472, 19480, 19478, 0, 16384, 18432, 19456, + 19472, 0, 16384, 18432, 19456, 19488, 19480, 0, + 16384, 18432, 19456, 19488, 19480, 0, 16384, 18432, + 19456, 19488, 19480, 19482, 0, 16384, 18432, 19456, + 19488, 19480, 0, 16384, 18432, 19456, 19488, 19489, + 19484, 0, 16384, 18432, 19456, 19488, 19489, 19484, + 0, 16384, 18432, 19456, 19488, 19489, 19484, 19486, + 0, 16384, 18432, 19456, 0, 16384, 18432, 19456, + 19488, 0, 16384, 18432, 19456, 19488, 0, 16384, + 18432, 19456, 19488, 19490, 0, 16384, 18432, 19456, + 19488, 0, 16384, 18432, 19456, 19488, 19492, 0, + 16384, 18432, 19456, 19488, 19492, 0, 16384, 18432, + 19456, 19488, 19496, 19494, 0, 16384, 18432, 19456, + 19488, 0, 16384, 18432, 19456, 19488, 19496, 0, + 16384, 18432, 19456, 19488, 19496, 0, 16384, 18432, + 19456, 19488, 19496, 19498, 0, 16384, 18432, 19456, + 19488, 19496, 0, 16384, 18432, 19456, 19488, 19504, + 19500, 0, 16384, 18432, 19456, 19488, 19504, 19500, + 0, 16384, 18432, 19456, 19488, 19504, 19505, 19502, + 0, 16384, 18432, 19456, 19488, 0, 16384, 18432, + 19456, 19520, 19504, 0, 16384, 18432, 19456, 19520, + 19504, 0, 16384, 18432, 19456, 19520, 19504, 19506, + 0, 16384, 18432, 19456, 19520, 19504, 0, 16384, + 18432, 19456, 19520, 19504, 19508, 0, 16384, 18432, + 19456, 19520, 19504, 19508, 0, 16384, 18432, 19456, + 19520, 19504, 19512, 19510, 0, 16384, 18432, 19456, + 19520, 19504, 0, 16384, 18432, 19456, 19520, 19521, + 19512, 0, 16384, 18432, 19456, 19520, 19521, 19512, + 0, 16384, 18432, 19456, 19520, 19521, 19512, 19514, + 0, 16384, 18432, 19456, 19520, 19521, 19512, 0, + 16384, 18432, 19456, 19520, 19521, 19512, 19516, 0, + 16384, 18432, 19456, 19520, 19521, 19523, 19516, 0, + 16384, 18432, 19456, 19520, 19521, 19523, 19516, 19518, + 0, 16384, 18432, 19456, 0, 16384, 18432, 19456, + 19520, 0, 16384, 18432, 19456, 19520, 0, 16384, + 18432, 19456, 19520, 19522, 0, 16384, 18432, 19456, + 19520, 0, 16384, 18432, 19456, 19520, 19524, 0, + 16384, 18432, 19456, 19520, 19524, 0, 16384, 18432, + 19456, 19520, 19528, 19526, 0, 16384, 18432, 19456, + 19520, 0, 16384, 18432, 19456, 19520, 19528, 0, + 16384, 18432, 19456, 19520, 19528, 0, 16384, 18432, + 19456, 19520, 19528, 19530, 0, 16384, 18432, 19456, + 19520, 19528, 0, 16384, 18432, 19456, 19520, 19536, + 19532, 0, 16384, 18432, 19456, 19520, 19536, 19532, + 0, 16384, 18432, 19456, 19520, 19536, 19537, 19534, + 0, 16384, 18432, 19456, 19520, 0, 16384, 18432, + 19456, 19520, 19536, 0, 16384, 18432, 19456, 19520, + 19536, 0, 16384, 18432, 19456, 19520, 19536, 19538, + 0, 16384, 18432, 19456, 19520, 19536, 0, 16384, + 18432, 19456, 19520, 19536, 19540, 0, 16384, 18432, + 19456, 19520, 19536, 19540, 0, 16384, 18432, 19456, + 19520, 19536, 19544, 19542, 0, 16384, 18432, 19456, + 19520, 19536, 0, 16384, 18432, 19456, 19520, 19552, + 19544, 0, 16384, 18432, 19456, 19520, 19552, 19544, + 0, 16384, 18432, 19456, 19520, 19552, 19544, 19546, + 0, 16384, 18432, 19456, 19520, 19552, 19544, 0, + 16384, 18432, 19456, 19520, 19552, 19553, 19548, 0, + 16384, 18432, 19456, 19520, 19552, 19553, 19548, 0, + 16384, 18432, 19456, 19520, 19552, 19553, 19548, 19550, + 0, 16384, 18432, 19456, 19520, 0, 16384, 18432, + 19456, 19584, 19552, 0, 16384, 18432, 19456, 19584, + 19552, 0, 16384, 18432, 19456, 19584, 19552, 19554, + 0, 16384, 18432, 19456, 19584, 19552, 0, 16384, + 18432, 19456, 19584, 19552, 19556, 0, 16384, 18432, + 19456, 19584, 19552, 19556, 0, 16384, 18432, 19456, + 19584, 19552, 19560, 19558, 0, 16384, 18432, 19456, + 19584, 19552, 0, 16384, 18432, 19456, 19584, 19552, + 19560, 0, 16384, 18432, 19456, 19584, 19552, 19560, + 0, 16384, 18432, 19456, 19584, 19552, 19560, 19562, + 0, 16384, 18432, 19456, 19584, 19552, 19560, 0, + 16384, 18432, 19456, 19584, 19552, 19568, 19564, 0, + 16384, 18432, 19456, 19584, 19552, 19568, 19564, 0, + 16384, 18432, 19456, 19584, 19552, 19568, 19569, 19566, + 0, 16384, 18432, 19456, 19584, 19552, 0, 16384, + 18432, 19456, 19584, 19585, 19568, 0, 16384, 18432, + 19456, 19584, 19585, 19568, 0, 16384, 18432, 19456, + 19584, 19585, 19568, 19570, 0, 16384, 18432, 19456, + 19584, 19585, 19568, 0, 16384, 18432, 19456, 19584, + 19585, 19568, 19572, 0, 16384, 18432, 19456, 19584, + 19585, 19568, 19572, 0, 16384, 18432, 19456, 19584, + 19585, 19568, 19576, 19574, 0, 16384, 18432, 19456, + 19584, 19585, 19568, 0, 16384, 18432, 19456, 19584, + 19585, 19568, 19576, 0, 16384, 18432, 19456, 19584, + 19585, 19587, 19576, 0, 16384, 18432, 19456, 19584, + 19585, 19587, 19576, 19578, 0, 16384, 18432, 19456, + 19584, 19585, 19587, 19576, 0, 16384, 18432, 19456, + 19584, 19585, 19587, 19576, 19580, 0, 16384, 18432, + 19456, 19584, 19585, 19587, 19576, 19580, 0, 16384, + 18432, 19456, 19584, 19585, 19587, 19576, 19580, 19582, + 0, 16384, 18432, 19456, 0, 16384, 18432, 19456, + 19584, 0, 16384, 18432, 19456, 19584, 0, 16384, + 18432, 19456, 19584, 19586, 0, 16384, 18432, 19456, + 19584, 0, 16384, 18432, 19456, 19584, 19588, 0, + 16384, 18432, 19456, 19584, 19588, 0, 16384, 18432, + 19456, 19584, 19592, 19590, 0, 16384, 18432, 19456, + 19584, 0, 16384, 18432, 19456, 19584, 19592, 0, + 16384, 18432, 19456, 19584, 19592, 0, 16384, 18432, + 19456, 19584, 19592, 19594, 0, 16384, 18432, 19456, + 19584, 19592, 0, 16384, 18432, 19456, 19584, 19600, + 19596, 0, 16384, 18432, 19456, 19584, 19600, 19596, + 0, 16384, 18432, 19456, 19584, 19600, 19601, 19598, + 0, 16384, 18432, 19456, 19584, 0, 16384, 18432, + 19456, 19584, 19600, 0, 16384, 18432, 19456, 19584, + 19600, 0, 16384, 18432, 19456, 19584, 19600, 19602, + 0, 16384, 18432, 19456, 19584, 19600, 0, 16384, + 18432, 19456, 19584, 19600, 19604, 0, 16384, 18432, + 19456, 19584, 19600, 19604, 0, 16384, 18432, 19456, + 19584, 19600, 19608, 19606, 0, 16384, 18432, 19456, + 19584, 19600, 0, 16384, 18432, 19456, 19584, 19616, + 19608, 0, 16384, 18432, 19456, 19584, 19616, 19608, + 0, 16384, 18432, 19456, 19584, 19616, 19608, 19610, + 0, 16384, 18432, 19456, 19584, 19616, 19608, 0, + 16384, 18432, 19456, 19584, 19616, 19617, 19612, 0, + 16384, 18432, 19456, 19584, 19616, 19617, 19612, 0, + 16384, 18432, 19456, 19584, 19616, 19617, 19612, 19614, + 0, 16384, 18432, 19456, 19584, 0, 16384, 18432, + 19456, 19584, 19616, 0, 16384, 18432, 19456, 19584, + 19616, 0, 16384, 18432, 19456, 19584, 19616, 19618, + 0, 16384, 18432, 19456, 19584, 19616, 0, 16384, + 18432, 19456, 19584, 19616, 19620, 0, 16384, 18432, + 19456, 19584, 19616, 19620, 0, 16384, 18432, 19456, + 19584, 19616, 19624, 19622, 0, 16384, 18432, 19456, + 19584, 19616, 0, 16384, 18432, 19456, 19584, 19616, + 19624, 0, 16384, 18432, 19456, 19584, 19616, 19624, + 0, 16384, 18432, 19456, 19584, 19616, 19624, 19626, + 0, 16384, 18432, 19456, 19584, 19616, 19624, 0, + 16384, 18432, 19456, 19584, 19616, 19632, 19628, 0, + 16384, 18432, 19456, 19584, 19616, 19632, 19628, 0, + 16384, 18432, 19456, 19584, 19616, 19632, 19633, 19630, + 0, 16384, 18432, 19456, 19584, 19616, 0, 16384, + 18432, 19456, 19584, 19648, 19632, 0, 16384, 18432, + 19456, 19584, 19648, 19632, 0, 16384, 18432, 19456, + 19584, 19648, 19632, 19634, 0, 16384, 18432, 19456, + 19584, 19648, 19632, 0, 16384, 18432, 19456, 19584, + 19648, 19632, 19636, 0, 16384, 18432, 19456, 19584, + 19648, 19632, 19636, 0, 16384, 18432, 19456, 19584, + 19648, 19632, 19640, 19638, 0, 16384, 18432, 19456, + 19584, 19648, 19632, 0, 16384, 18432, 19456, 19584, + 19648, 19649, 19640, 0, 16384, 18432, 19456, 19584, + 19648, 19649, 19640, 0, 16384, 18432, 19456, 19584, + 19648, 19649, 19640, 19642, 0, 16384, 18432, 19456, + 19584, 19648, 19649, 19640, 0, 16384, 18432, 19456, + 19584, 19648, 19649, 19640, 19644, 0, 16384, 18432, + 19456, 19584, 19648, 19649, 19651, 19644, 0, 16384, + 18432, 19456, 19584, 19648, 19649, 19651, 19644, 19646, + 0, 16384, 18432, 19456, 19584, 0, 16384, 18432, + 19456, 19712, 19648, 0, 16384, 18432, 19456, 19712, + 19648, 0, 16384, 18432, 19456, 19712, 19648, 19650, + 0, 16384, 18432, 19456, 19712, 19648, 0, 16384, + 18432, 19456, 19712, 19648, 19652, 0, 16384, 18432, + 19456, 19712, 19648, 19652, 0, 16384, 18432, 19456, + 19712, 19648, 19656, 19654, 0, 16384, 18432, 19456, + 19712, 19648, 0, 16384, 18432, 19456, 19712, 19648, + 19656, 0, 16384, 18432, 19456, 19712, 19648, 19656, + 0, 16384, 18432, 19456, 19712, 19648, 19656, 19658, + 0, 16384, 18432, 19456, 19712, 19648, 19656, 0, + 16384, 18432, 19456, 19712, 19648, 19664, 19660, 0, + 16384, 18432, 19456, 19712, 19648, 19664, 19660, 0, + 16384, 18432, 19456, 19712, 19648, 19664, 19665, 19662, + 0, 16384, 18432, 19456, 19712, 19648, 0, 16384, + 18432, 19456, 19712, 19648, 19664, 0, 16384, 18432, + 19456, 19712, 19648, 19664, 0, 16384, 18432, 19456, + 19712, 19648, 19664, 19666, 0, 16384, 18432, 19456, + 19712, 19648, 19664, 0, 16384, 18432, 19456, 19712, + 19648, 19664, 19668, 0, 16384, 18432, 19456, 19712, + 19648, 19664, 19668, 0, 16384, 18432, 19456, 19712, + 19648, 19664, 19672, 19670, 0, 16384, 18432, 19456, + 19712, 19648, 19664, 0, 16384, 18432, 19456, 19712, + 19648, 19680, 19672, 0, 16384, 18432, 19456, 19712, + 19648, 19680, 19672, 0, 16384, 18432, 19456, 19712, + 19648, 19680, 19672, 19674, 0, 16384, 18432, 19456, + 19712, 19648, 19680, 19672, 0, 16384, 18432, 19456, + 19712, 19648, 19680, 19681, 19676, 0, 16384, 18432, + 19456, 19712, 19648, 19680, 19681, 19676, 0, 16384, + 18432, 19456, 19712, 19648, 19680, 19681, 19676, 19678, + 0, 16384, 18432, 19456, 19712, 19648, 0, 16384, + 18432, 19456, 19712, 19713, 19680, 0, 16384, 18432, + 19456, 19712, 19713, 19680, 0, 16384, 18432, 19456, + 19712, 19713, 19680, 19682, 0, 16384, 18432, 19456, + 19712, 19713, 19680, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19684, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19684, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19688, 19686, 0, 16384, 18432, 19456, + 19712, 19713, 19680, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19688, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19688, 0, 16384, 18432, 19456, 19712, + 19713, 19680, 19688, 19690, 0, 16384, 18432, 19456, + 19712, 19713, 19680, 19688, 0, 16384, 18432, 19456, + 19712, 19713, 19680, 19696, 19692, 0, 16384, 18432, + 19456, 19712, 19713, 19680, 19696, 19692, 0, 16384, + 18432, 19456, 19712, 19713, 19680, 19696, 19697, 19694, + 0, 16384, 18432, 19456, 19712, 19713, 19680, 0, + 16384, 18432, 19456, 19712, 19713, 19680, 19696, 0, + 16384, 18432, 19456, 19712, 19713, 19715, 19696, 0, + 16384, 18432, 19456, 19712, 19713, 19715, 19696, 19698, + 0, 16384, 18432, 19456, 19712, 19713, 19715, 19696, + 0, 16384, 18432, 19456, 19712, 19713, 19715, 19696, + 19700, 0, 16384, 18432, 19456, 19712, 19713, 19715, + 19696, 19700, 0, 16384, 18432, 19456, 19712, 19713, + 19715, 19696, 19704, 19702, 0, 16384, 18432, 19456, + 19712, 19713, 19715, 19696, 0, 16384, 18432, 19456, + 19712, 19713, 19715, 19696, 19704, 0, 16384, 18432, + 19456, 19712, 19713, 19715, 19696, 19704, 0, 16384, + 18432, 19456, 19712, 19713, 19715, 19696, 19704, 19706, + 0, 16384, 18432, 19456, 19712, 19713, 19715, 19719, + 19704, 0, 16384, 18432, 19456, 19712, 19713, 19715, + 19719, 19704, 19708, 0, 16384, 18432, 19456, 19712, + 19713, 19715, 19719, 19704, 19708, 0, 16384, 18432, + 19456, 19712, 19713, 19715, 19719, 19704, 19708, 19710, + 0, 16384, 18432, 19456, 0, 16384, 20480, 19456, + 19712, 0, 16384, 20480, 19456, 19712, 0, 16384, + 20480, 19456, 19712, 19714, 0, 16384, 20480, 19456, + 19712, 0, 16384, 20480, 19456, 19712, 19716, 0, + 16384, 20480, 19456, 19712, 19716, 0, 16384, 20480, + 19456, 19712, 19720, 19718, 0, 16384, 20480, 19456, + 19712, 0, 16384, 20480, 19456, 19712, 19720, 0, + 16384, 20480, 19456, 19712, 19720, 0, 16384, 20480, + 19456, 19712, 19720, 19722, 0, 16384, 20480, 19456, + 19712, 19720, 0, 16384, 20480, 19456, 19712, 19728, + 19724, 0, 16384, 20480, 19456, 19712, 19728, 19724, + 0, 16384, 20480, 19456, 19712, 19728, 19729, 19726, + 0, 16384, 20480, 19456, 19712, 0, 16384, 20480, + 19456, 19712, 19728, 0, 16384, 20480, 19456, 19712, + 19728, 0, 16384, 20480, 19456, 19712, 19728, 19730, + 0, 16384, 20480, 19456, 19712, 19728, 0, 16384, + 20480, 19456, 19712, 19728, 19732, 0, 16384, 20480, + 19456, 19712, 19728, 19732, 0, 16384, 20480, 19456, + 19712, 19728, 19736, 19734, 0, 16384, 20480, 19456, + 19712, 19728, 0, 16384, 20480, 19456, 19712, 19744, + 19736, 0, 16384, 20480, 19456, 19712, 19744, 19736, + 0, 16384, 20480, 19456, 19712, 19744, 19736, 19738, + 0, 16384, 20480, 19456, 19712, 19744, 19736, 0, + 16384, 20480, 19456, 19712, 19744, 19745, 19740, 0, + 16384, 20480, 19456, 19712, 19744, 19745, 19740, 0, + 16384, 20480, 19456, 19712, 19744, 19745, 19740, 19742, + 0, 16384, 20480, 19456, 19712, 0, 16384, 20480, + 19456, 19712, 19744, 0, 16384, 20480, 19456, 19712, + 19744, 0, 16384, 20480, 19456, 19712, 19744, 19746, + 0, 16384, 20480, 19456, 19712, 19744, 0, 16384, + 20480, 19456, 19712, 19744, 19748, 0, 16384, 20480, + 19456, 19712, 19744, 19748, 0, 16384, 20480, 19456, + 19712, 19744, 19752, 19750, 0, 16384, 20480, 19456, + 19712, 19744, 0, 16384, 20480, 19456, 19712, 19744, + 19752, 0, 16384, 20480, 19456, 19712, 19744, 19752, + 0, 16384, 20480, 19456, 19712, 19744, 19752, 19754, + 0, 16384, 20480, 19456, 19712, 19744, 19752, 0, + 16384, 20480, 19456, 19712, 19744, 19760, 19756, 0, + 16384, 20480, 19456, 19712, 19744, 19760, 19756, 0, + 16384, 20480, 19456, 19712, 19744, 19760, 19761, 19758, + 0, 16384, 20480, 19456, 19712, 19744, 0, 16384, + 20480, 19456, 19712, 19776, 19760, 0, 16384, 20480, + 19456, 19712, 19776, 19760, 0, 16384, 20480, 19456, + 19712, 19776, 19760, 19762, 0, 16384, 20480, 19456, + 19712, 19776, 19760, 0, 16384, 20480, 19456, 19712, + 19776, 19760, 19764, 0, 16384, 20480, 19456, 19712, + 19776, 19760, 19764, 0, 16384, 20480, 19456, 19712, + 19776, 19760, 19768, 19766, 0, 16384, 20480, 19456, + 19712, 19776, 19760, 0, 16384, 20480, 19456, 19712, + 19776, 19777, 19768, 0, 16384, 20480, 19456, 19712, + 19776, 19777, 19768, 0, 16384, 20480, 19456, 19712, + 19776, 19777, 19768, 19770, 0, 16384, 20480, 19456, + 19712, 19776, 19777, 19768, 0, 16384, 20480, 19456, + 19712, 19776, 19777, 19768, 19772, 0, 16384, 20480, + 19456, 19712, 19776, 19777, 19779, 19772, 0, 16384, + 20480, 19456, 19712, 19776, 19777, 19779, 19772, 19774, + 0, 16384, 20480, 19456, 19712, 0, 16384, 20480, + 19456, 19712, 19776, 0, 16384, 20480, 19456, 19712, + 19776, 0, 16384, 20480, 19456, 19712, 19776, 19778, + 0, 16384, 20480, 19456, 19712, 19776, 0, 16384, + 20480, 19456, 19712, 19776, 19780, 0, 16384, 20480, + 19456, 19712, 19776, 19780, 0, 16384, 20480, 19456, + 19712, 19776, 19784, 19782, 0, 16384, 20480, 19456, + 19712, 19776, 0, 16384, 20480, 19456, 19712, 19776, + 19784, 0, 16384, 20480, 19456, 19712, 19776, 19784, + 0, 16384, 20480, 19456, 19712, 19776, 19784, 19786, + 0, 16384, 20480, 19456, 19712, 19776, 19784, 0, + 16384, 20480, 19456, 19712, 19776, 19792, 19788, 0, + 16384, 20480, 19456, 19712, 19776, 19792, 19788, 0, + 16384, 20480, 19456, 19712, 19776, 19792, 19793, 19790, + 0, 16384, 20480, 19456, 19712, 19776, 0, 16384, + 20480, 19456, 19712, 19776, 19792, 0, 16384, 20480, + 19456, 19712, 19776, 19792, 0, 16384, 20480, 19456, + 19712, 19776, 19792, 19794, 0, 16384, 20480, 19456, + 19712, 19776, 19792, 0, 16384, 20480, 19456, 19712, + 19776, 19792, 19796, 0, 16384, 20480, 19456, 19712, + 19776, 19792, 19796, 0, 16384, 20480, 19456, 19712, + 19776, 19792, 19800, 19798, 0, 16384, 20480, 19456, + 19712, 19776, 19792, 0, 16384, 20480, 19456, 19712, + 19776, 19808, 19800, 0, 16384, 20480, 19456, 19712, + 19776, 19808, 19800, 0, 16384, 20480, 19456, 19712, + 19776, 19808, 19800, 19802, 0, 16384, 20480, 19456, + 19712, 19776, 19808, 19800, 0, 16384, 20480, 19456, + 19712, 19776, 19808, 19809, 19804, 0, 16384, 20480, + 19456, 19712, 19776, 19808, 19809, 19804, 0, 16384, + 20480, 19456, 19712, 19776, 19808, 19809, 19804, 19806, + 0, 16384, 20480, 19456, 19712, 19776, 0, 16384, + 20480, 19456, 19712, 19840, 19808, 0, 16384, 20480, + 19456, 19712, 19840, 19808, 0, 16384, 20480, 19456, + 19712, 19840, 19808, 19810, 0, 16384, 20480, 19456, + 19712, 19840, 19808, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19812, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19812, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19816, 19814, 0, 16384, 20480, 19456, + 19712, 19840, 19808, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19816, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19816, 0, 16384, 20480, 19456, 19712, + 19840, 19808, 19816, 19818, 0, 16384, 20480, 19456, + 19712, 19840, 19808, 19816, 0, 16384, 20480, 19456, + 19712, 19840, 19808, 19824, 19820, 0, 16384, 20480, + 19456, 19712, 19840, 19808, 19824, 19820, 0, 16384, + 20480, 19456, 19712, 19840, 19808, 19824, 19825, 19822, + 0, 16384, 20480, 19456, 19712, 19840, 19808, 0, + 16384, 20480, 19456, 19712, 19840, 19841, 19824, 0, + 16384, 20480, 19456, 19712, 19840, 19841, 19824, 0, + 16384, 20480, 19456, 19712, 19840, 19841, 19824, 19826, + 0, 16384, 20480, 19456, 19712, 19840, 19841, 19824, + 0, 16384, 20480, 19456, 19712, 19840, 19841, 19824, + 19828, 0, 16384, 20480, 19456, 19712, 19840, 19841, + 19824, 19828, 0, 16384, 20480, 19456, 19712, 19840, + 19841, 19824, 19832, 19830, 0, 16384, 20480, 19456, + 19712, 19840, 19841, 19824, 0, 16384, 20480, 19456, + 19712, 19840, 19841, 19824, 19832, 0, 16384, 20480, + 19456, 19712, 19840, 19841, 19843, 19832, 0, 16384, + 20480, 19456, 19712, 19840, 19841, 19843, 19832, 19834, + 0, 16384, 20480, 19456, 19712, 19840, 19841, 19843, + 19832, 0, 16384, 20480, 19456, 19712, 19840, 19841, + 19843, 19832, 19836, 0, 16384, 20480, 19456, 19712, + 19840, 19841, 19843, 19832, 19836, 0, 16384, 20480, + 19456, 19712, 19840, 19841, 19843, 19832, 19836, 19838, + 0, 16384, 20480, 19456, 19712, 0, 16384, 20480, + 19456, 19968, 19840, 0, 16384, 20480, 19456, 19968, + 19840, 0, 16384, 20480, 19456, 19968, 19840, 19842, + 0, 16384, 20480, 19456, 19968, 19840, 0, 16384, + 20480, 19456, 19968, 19840, 19844, 0, 16384, 20480, + 19456, 19968, 19840, 19844, 0, 16384, 20480, 19456, + 19968, 19840, 19848, 19846, 0, 16384, 20480, 19456, + 19968, 19840, 0, 16384, 20480, 19456, 19968, 19840, + 19848, 0, 16384, 20480, 19456, 19968, 19840, 19848, + 0, 16384, 20480, 19456, 19968, 19840, 19848, 19850, + 0, 16384, 20480, 19456, 19968, 19840, 19848, 0, + 16384, 20480, 19456, 19968, 19840, 19856, 19852, 0, + 16384, 20480, 19456, 19968, 19840, 19856, 19852, 0, + 16384, 20480, 19456, 19968, 19840, 19856, 19857, 19854, + 0, 16384, 20480, 19456, 19968, 19840, 0, 16384, + 20480, 19456, 19968, 19840, 19856, 0, 16384, 20480, + 19456, 19968, 19840, 19856, 0, 16384, 20480, 19456, + 19968, 19840, 19856, 19858, 0, 16384, 20480, 19456, + 19968, 19840, 19856, 0, 16384, 20480, 19456, 19968, + 19840, 19856, 19860, 0, 16384, 20480, 19456, 19968, + 19840, 19856, 19860, 0, 16384, 20480, 19456, 19968, + 19840, 19856, 19864, 19862, 0, 16384, 20480, 19456, + 19968, 19840, 19856, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19864, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19864, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19864, 19866, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 19864, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 19873, 19868, 0, 16384, 20480, + 19456, 19968, 19840, 19872, 19873, 19868, 0, 16384, + 20480, 19456, 19968, 19840, 19872, 19873, 19868, 19870, + 0, 16384, 20480, 19456, 19968, 19840, 0, 16384, + 20480, 19456, 19968, 19840, 19872, 0, 16384, 20480, + 19456, 19968, 19840, 19872, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 19874, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19876, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19876, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19880, 19878, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19880, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19880, 0, 16384, 20480, 19456, 19968, + 19840, 19872, 19880, 19882, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 19880, 0, 16384, 20480, 19456, + 19968, 19840, 19872, 19888, 19884, 0, 16384, 20480, + 19456, 19968, 19840, 19872, 19888, 19884, 0, 16384, + 20480, 19456, 19968, 19840, 19872, 19888, 19889, 19886, + 0, 16384, 20480, 19456, 19968, 19840, 19872, 0, + 16384, 20480, 19456, 19968, 19840, 19904, 19888, 0, + 16384, 20480, 19456, 19968, 19840, 19904, 19888, 0, + 16384, 20480, 19456, 19968, 19840, 19904, 19888, 19890, + 0, 16384, 20480, 19456, 19968, 19840, 19904, 19888, + 0, 16384, 20480, 19456, 19968, 19840, 19904, 19888, + 19892, 0, 16384, 20480, 19456, 19968, 19840, 19904, + 19888, 19892, 0, 16384, 20480, 19456, 19968, 19840, + 19904, 19888, 19896, 19894, 0, 16384, 20480, 19456, + 19968, 19840, 19904, 19888, 0, 16384, 20480, 19456, + 19968, 19840, 19904, 19905, 19896, 0, 16384, 20480, + 19456, 19968, 19840, 19904, 19905, 19896, 0, 16384, + 20480, 19456, 19968, 19840, 19904, 19905, 19896, 19898, + 0, 16384, 20480, 19456, 19968, 19840, 19904, 19905, + 19896, 0, 16384, 20480, 19456, 19968, 19840, 19904, + 19905, 19896, 19900, 0, 16384, 20480, 19456, 19968, + 19840, 19904, 19905, 19907, 19900, 0, 16384, 20480, + 19456, 19968, 19840, 19904, 19905, 19907, 19900, 19902, + 0, 16384, 20480, 19456, 19968, 19840, 0, 16384, + 20480, 19456, 19968, 19969, 19904, 0, 16384, 20480, + 19456, 19968, 19969, 19904, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 19906, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19908, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19908, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19912, 19910, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19912, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19912, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19912, 19914, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 19912, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 19920, 19916, 0, 16384, 20480, + 19456, 19968, 19969, 19904, 19920, 19916, 0, 16384, + 20480, 19456, 19968, 19969, 19904, 19920, 19921, 19918, + 0, 16384, 20480, 19456, 19968, 19969, 19904, 0, + 16384, 20480, 19456, 19968, 19969, 19904, 19920, 0, + 16384, 20480, 19456, 19968, 19969, 19904, 19920, 0, + 16384, 20480, 19456, 19968, 19969, 19904, 19920, 19922, + 0, 16384, 20480, 19456, 19968, 19969, 19904, 19920, + 0, 16384, 20480, 19456, 19968, 19969, 19904, 19920, + 19924, 0, 16384, 20480, 19456, 19968, 19969, 19904, + 19920, 19924, 0, 16384, 20480, 19456, 19968, 19969, + 19904, 19920, 19928, 19926, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 19920, 0, 16384, 20480, 19456, + 19968, 19969, 19904, 19936, 19928, 0, 16384, 20480, + 19456, 19968, 19969, 19904, 19936, 19928, 0, 16384, + 20480, 19456, 19968, 19969, 19904, 19936, 19928, 19930, + 0, 16384, 20480, 19456, 19968, 19969, 19904, 19936, + 19928, 0, 16384, 20480, 19456, 19968, 19969, 19904, + 19936, 19937, 19932, 0, 16384, 20480, 19456, 19968, + 19969, 19904, 19936, 19937, 19932, 0, 16384, 20480, + 19456, 19968, 19969, 19904, 19936, 19937, 19932, 19934, + 0, 16384, 20480, 19456, 19968, 19969, 19904, 0, + 16384, 20480, 19456, 19968, 19969, 19904, 19936, 0, + 16384, 20480, 19456, 19968, 19969, 19971, 19936, 0, + 16384, 20480, 19456, 19968, 19969, 19971, 19936, 19938, + 0, 16384, 20480, 19456, 19968, 19969, 19971, 19936, + 0, 16384, 20480, 19456, 19968, 19969, 19971, 19936, + 19940, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19936, 19940, 0, 16384, 20480, 19456, 19968, 19969, + 19971, 19936, 19944, 19942, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19936, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19936, 19944, 0, 16384, 20480, + 19456, 19968, 19969, 19971, 19936, 19944, 0, 16384, + 20480, 19456, 19968, 19969, 19971, 19936, 19944, 19946, + 0, 16384, 20480, 19456, 19968, 19969, 19971, 19936, + 19944, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19936, 19952, 19948, 0, 16384, 20480, 19456, 19968, + 19969, 19971, 19936, 19952, 19948, 0, 16384, 20480, + 19456, 19968, 19969, 19971, 19936, 19952, 19953, 19950, + 0, 16384, 20480, 19456, 19968, 19969, 19971, 19936, + 0, 16384, 20480, 19456, 19968, 19969, 19971, 19936, + 19952, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19936, 19952, 0, 16384, 20480, 19456, 19968, 19969, + 19971, 19936, 19952, 19954, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19975, 19952, 0, 16384, 20480, + 19456, 19968, 19969, 19971, 19975, 19952, 19956, 0, + 16384, 20480, 19456, 19968, 19969, 19971, 19975, 19952, + 19956, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19975, 19952, 19960, 19958, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19975, 19952, 0, 16384, 20480, + 19456, 19968, 19969, 19971, 19975, 19952, 19960, 0, + 16384, 20480, 19456, 19968, 19969, 19971, 19975, 19952, + 19960, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19975, 19952, 19960, 19962, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19975, 19952, 19960, 0, 16384, + 20480, 19456, 19968, 19969, 19971, 19975, 19952, 19960, + 19964, 0, 16384, 20480, 19456, 19968, 19969, 19971, + 19975, 19952, 19960, 19964, 0, 16384, 20480, 19456, + 19968, 19969, 19971, 19975, 19952, 19960, 19964, 19966, + 0, 16384, 20480, 19456, 0, 16384, 20480, 19456, + 19968, 0, 16384, 20480, 20481, 19968, 0, 16384, + 20480, 20481, 19968, 19970, 0, 16384, 20480, 20481, + 19968, 0, 16384, 20480, 20481, 19968, 19972, 0, + 16384, 20480, 20481, 19968, 19972, 0, 16384, 20480, + 20481, 19968, 19976, 19974, 0, 16384, 20480, 20481, + 19968, 0, 16384, 20480, 20481, 19968, 19976, 0, + 16384, 20480, 20481, 19968, 19976, 0, 16384, 20480, + 20481, 19968, 19976, 19978, 0, 16384, 20480, 20481, + 19968, 19976, 0, 16384, 20480, 20481, 19968, 19984, + 19980, 0, 16384, 20480, 20481, 19968, 19984, 19980, + 0, 16384, 20480, 20481, 19968, 19984, 19985, 19982, + 0, 16384, 20480, 20481, 19968, 0, 16384, 20480, + 20481, 19968, 19984, 0, 16384, 20480, 20481, 19968, + 19984, 0, 16384, 20480, 20481, 19968, 19984, 19986, + 0, 16384, 20480, 20481, 19968, 19984, 0, 16384, + 20480, 20481, 19968, 19984, 19988, 0, 16384, 20480, + 20481, 19968, 19984, 19988, 0, 16384, 20480, 20481, + 19968, 19984, 19992, 19990, 0, 16384, 20480, 20481, + 19968, 19984, 0, 16384, 20480, 20481, 19968, 20000, + 19992, 0, 16384, 20480, 20481, 19968, 20000, 19992, + 0, 16384, 20480, 20481, 19968, 20000, 19992, 19994, + 0, 16384, 20480, 20481, 19968, 20000, 19992, 0, + 16384, 20480, 20481, 19968, 20000, 20001, 19996, 0, + 16384, 20480, 20481, 19968, 20000, 20001, 19996, 0, + 16384, 20480, 20481, 19968, 20000, 20001, 19996, 19998, + 0, 16384, 20480, 20481, 19968, 0, 16384, 20480, + 20481, 19968, 20000, 0, 16384, 20480, 20481, 19968, + 20000, 0, 16384, 20480, 20481, 19968, 20000, 20002, + 0, 16384, 20480, 20481, 19968, 20000, 0, 16384, + 20480, 20481, 19968, 20000, 20004, 0, 16384, 20480, + 20481, 19968, 20000, 20004, 0, 16384, 20480, 20481, + 19968, 20000, 20008, 20006, 0, 16384, 20480, 20481, + 19968, 20000, 0, 16384, 20480, 20481, 19968, 20000, + 20008, 0, 16384, 20480, 20481, 19968, 20000, 20008, + 0, 16384, 20480, 20481, 19968, 20000, 20008, 20010, + 0, 16384, 20480, 20481, 19968, 20000, 20008, 0, + 16384, 20480, 20481, 19968, 20000, 20016, 20012, 0, + 16384, 20480, 20481, 19968, 20000, 20016, 20012, 0, + 16384, 20480, 20481, 19968, 20000, 20016, 20017, 20014, + 0, 16384, 20480, 20481, 19968, 20000, 0, 16384, + 20480, 20481, 19968, 20032, 20016, 0, 16384, 20480, + 20481, 19968, 20032, 20016, 0, 16384, 20480, 20481, + 19968, 20032, 20016, 20018, 0, 16384, 20480, 20481, + 19968, 20032, 20016, 0, 16384, 20480, 20481, 19968, + 20032, 20016, 20020, 0, 16384, 20480, 20481, 19968, + 20032, 20016, 20020, 0, 16384, 20480, 20481, 19968, + 20032, 20016, 20024, 20022, 0, 16384, 20480, 20481, + 19968, 20032, 20016, 0, 16384, 20480, 20481, 19968, + 20032, 20033, 20024, 0, 16384, 20480, 20481, 19968, + 20032, 20033, 20024, 0, 16384, 20480, 20481, 19968, + 20032, 20033, 20024, 20026, 0, 16384, 20480, 20481, + 19968, 20032, 20033, 20024, 0, 16384, 20480, 20481, + 19968, 20032, 20033, 20024, 20028, 0, 16384, 20480, + 20481, 19968, 20032, 20033, 20035, 20028, 0, 16384, + 20480, 20481, 19968, 20032, 20033, 20035, 20028, 20030, + 0, 16384, 20480, 20481, 19968, 0, 16384, 20480, + 20481, 19968, 20032, 0, 16384, 20480, 20481, 19968, + 20032, 0, 16384, 20480, 20481, 19968, 20032, 20034, + 0, 16384, 20480, 20481, 19968, 20032, 0, 16384, + 20480, 20481, 19968, 20032, 20036, 0, 16384, 20480, + 20481, 19968, 20032, 20036, 0, 16384, 20480, 20481, + 19968, 20032, 20040, 20038, 0, 16384, 20480, 20481, + 19968, 20032, 0, 16384, 20480, 20481, 19968, 20032, + 20040, 0, 16384, 20480, 20481, 19968, 20032, 20040, + 0, 16384, 20480, 20481, 19968, 20032, 20040, 20042, + 0, 16384, 20480, 20481, 19968, 20032, 20040, 0, + 16384, 20480, 20481, 19968, 20032, 20048, 20044, 0, + 16384, 20480, 20481, 19968, 20032, 20048, 20044, 0, + 16384, 20480, 20481, 19968, 20032, 20048, 20049, 20046, + 0, 16384, 20480, 20481, 19968, 20032, 0, 16384, + 20480, 20481, 19968, 20032, 20048, 0, 16384, 20480, + 20481, 19968, 20032, 20048, 0, 16384, 20480, 20481, + 19968, 20032, 20048, 20050, 0, 16384, 20480, 20481, + 19968, 20032, 20048, 0, 16384, 20480, 20481, 19968, + 20032, 20048, 20052, 0, 16384, 20480, 20481, 19968, + 20032, 20048, 20052, 0, 16384, 20480, 20481, 19968, + 20032, 20048, 20056, 20054, 0, 16384, 20480, 20481, + 19968, 20032, 20048, 0, 16384, 20480, 20481, 19968, + 20032, 20064, 20056, 0, 16384, 20480, 20481, 19968, + 20032, 20064, 20056, 0, 16384, 20480, 20481, 19968, + 20032, 20064, 20056, 20058, 0, 16384, 20480, 20481, + 19968, 20032, 20064, 20056, 0, 16384, 20480, 20481, + 19968, 20032, 20064, 20065, 20060, 0, 16384, 20480, + 20481, 19968, 20032, 20064, 20065, 20060, 0, 16384, + 20480, 20481, 19968, 20032, 20064, 20065, 20060, 20062, + 0, 16384, 20480, 20481, 19968, 20032, 0, 16384, + 20480, 20481, 19968, 20096, 20064, 0, 16384, 20480, + 20481, 19968, 20096, 20064, 0, 16384, 20480, 20481, + 19968, 20096, 20064, 20066, 0, 16384, 20480, 20481, + 19968, 20096, 20064, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20068, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20068, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20072, 20070, 0, 16384, 20480, 20481, + 19968, 20096, 20064, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20072, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20072, 0, 16384, 20480, 20481, 19968, + 20096, 20064, 20072, 20074, 0, 16384, 20480, 20481, + 19968, 20096, 20064, 20072, 0, 16384, 20480, 20481, + 19968, 20096, 20064, 20080, 20076, 0, 16384, 20480, + 20481, 19968, 20096, 20064, 20080, 20076, 0, 16384, + 20480, 20481, 19968, 20096, 20064, 20080, 20081, 20078, + 0, 16384, 20480, 20481, 19968, 20096, 20064, 0, + 16384, 20480, 20481, 19968, 20096, 20097, 20080, 0, + 16384, 20480, 20481, 19968, 20096, 20097, 20080, 0, + 16384, 20480, 20481, 19968, 20096, 20097, 20080, 20082, + 0, 16384, 20480, 20481, 19968, 20096, 20097, 20080, + 0, 16384, 20480, 20481, 19968, 20096, 20097, 20080, + 20084, 0, 16384, 20480, 20481, 19968, 20096, 20097, + 20080, 20084, 0, 16384, 20480, 20481, 19968, 20096, + 20097, 20080, 20088, 20086, 0, 16384, 20480, 20481, + 19968, 20096, 20097, 20080, 0, 16384, 20480, 20481, + 19968, 20096, 20097, 20080, 20088, 0, 16384, 20480, + 20481, 19968, 20096, 20097, 20099, 20088, 0, 16384, + 20480, 20481, 19968, 20096, 20097, 20099, 20088, 20090, + 0, 16384, 20480, 20481, 19968, 20096, 20097, 20099, + 20088, 0, 16384, 20480, 20481, 19968, 20096, 20097, + 20099, 20088, 20092, 0, 16384, 20480, 20481, 19968, + 20096, 20097, 20099, 20088, 20092, 0, 16384, 20480, + 20481, 19968, 20096, 20097, 20099, 20088, 20092, 20094, + 0, 16384, 20480, 20481, 19968, 0, 16384, 20480, + 20481, 19968, 20096, 0, 16384, 20480, 20481, 19968, + 20096, 0, 16384, 20480, 20481, 19968, 20096, 20098, + 0, 16384, 20480, 20481, 19968, 20096, 0, 16384, + 20480, 20481, 19968, 20096, 20100, 0, 16384, 20480, + 20481, 19968, 20096, 20100, 0, 16384, 20480, 20481, + 19968, 20096, 20104, 20102, 0, 16384, 20480, 20481, + 19968, 20096, 0, 16384, 20480, 20481, 19968, 20096, + 20104, 0, 16384, 20480, 20481, 19968, 20096, 20104, + 0, 16384, 20480, 20481, 19968, 20096, 20104, 20106, + 0, 16384, 20480, 20481, 19968, 20096, 20104, 0, + 16384, 20480, 20481, 19968, 20096, 20112, 20108, 0, + 16384, 20480, 20481, 19968, 20096, 20112, 20108, 0, + 16384, 20480, 20481, 19968, 20096, 20112, 20113, 20110, + 0, 16384, 20480, 20481, 19968, 20096, 0, 16384, + 20480, 20481, 19968, 20096, 20112, 0, 16384, 20480, + 20481, 19968, 20096, 20112, 0, 16384, 20480, 20481, + 19968, 20096, 20112, 20114, 0, 16384, 20480, 20481, + 19968, 20096, 20112, 0, 16384, 20480, 20481, 19968, + 20096, 20112, 20116, 0, 16384, 20480, 20481, 19968, + 20096, 20112, 20116, 0, 16384, 20480, 20481, 19968, + 20096, 20112, 20120, 20118, 0, 16384, 20480, 20481, + 19968, 20096, 20112, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20120, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20120, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20120, 20122, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 20120, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 20129, 20124, 0, 16384, 20480, + 20481, 19968, 20096, 20128, 20129, 20124, 0, 16384, + 20480, 20481, 19968, 20096, 20128, 20129, 20124, 20126, + 0, 16384, 20480, 20481, 19968, 20096, 0, 16384, + 20480, 20481, 19968, 20096, 20128, 0, 16384, 20480, + 20481, 19968, 20096, 20128, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 20130, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20132, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20132, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20136, 20134, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20136, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20136, 0, 16384, 20480, 20481, 19968, + 20096, 20128, 20136, 20138, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 20136, 0, 16384, 20480, 20481, + 19968, 20096, 20128, 20144, 20140, 0, 16384, 20480, + 20481, 19968, 20096, 20128, 20144, 20140, 0, 16384, + 20480, 20481, 19968, 20096, 20128, 20144, 20145, 20142, + 0, 16384, 20480, 20481, 19968, 20096, 20128, 0, + 16384, 20480, 20481, 19968, 20096, 20160, 20144, 0, + 16384, 20480, 20481, 19968, 20096, 20160, 20144, 0, + 16384, 20480, 20481, 19968, 20096, 20160, 20144, 20146, + 0, 16384, 20480, 20481, 19968, 20096, 20160, 20144, + 0, 16384, 20480, 20481, 19968, 20096, 20160, 20144, + 20148, 0, 16384, 20480, 20481, 19968, 20096, 20160, + 20144, 20148, 0, 16384, 20480, 20481, 19968, 20096, + 20160, 20144, 20152, 20150, 0, 16384, 20480, 20481, + 19968, 20096, 20160, 20144, 0, 16384, 20480, 20481, + 19968, 20096, 20160, 20161, 20152, 0, 16384, 20480, + 20481, 19968, 20096, 20160, 20161, 20152, 0, 16384, + 20480, 20481, 19968, 20096, 20160, 20161, 20152, 20154, + 0, 16384, 20480, 20481, 19968, 20096, 20160, 20161, + 20152, 0, 16384, 20480, 20481, 19968, 20096, 20160, + 20161, 20152, 20156, 0, 16384, 20480, 20481, 19968, + 20096, 20160, 20161, 20163, 20156, 0, 16384, 20480, + 20481, 19968, 20096, 20160, 20161, 20163, 20156, 20158, + 0, 16384, 20480, 20481, 19968, 20096, 0, 16384, + 20480, 20481, 19968, 20224, 20160, 0, 16384, 20480, + 20481, 19968, 20224, 20160, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 20162, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20164, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20164, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20168, 20166, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20168, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20168, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20168, 20170, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 20168, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 20176, 20172, 0, 16384, 20480, + 20481, 19968, 20224, 20160, 20176, 20172, 0, 16384, + 20480, 20481, 19968, 20224, 20160, 20176, 20177, 20174, + 0, 16384, 20480, 20481, 19968, 20224, 20160, 0, + 16384, 20480, 20481, 19968, 20224, 20160, 20176, 0, + 16384, 20480, 20481, 19968, 20224, 20160, 20176, 0, + 16384, 20480, 20481, 19968, 20224, 20160, 20176, 20178, + 0, 16384, 20480, 20481, 19968, 20224, 20160, 20176, + 0, 16384, 20480, 20481, 19968, 20224, 20160, 20176, + 20180, 0, 16384, 20480, 20481, 19968, 20224, 20160, + 20176, 20180, 0, 16384, 20480, 20481, 19968, 20224, + 20160, 20176, 20184, 20182, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 20176, 0, 16384, 20480, 20481, + 19968, 20224, 20160, 20192, 20184, 0, 16384, 20480, + 20481, 19968, 20224, 20160, 20192, 20184, 0, 16384, + 20480, 20481, 19968, 20224, 20160, 20192, 20184, 20186, + 0, 16384, 20480, 20481, 19968, 20224, 20160, 20192, + 20184, 0, 16384, 20480, 20481, 19968, 20224, 20160, + 20192, 20193, 20188, 0, 16384, 20480, 20481, 19968, + 20224, 20160, 20192, 20193, 20188, 0, 16384, 20480, + 20481, 19968, 20224, 20160, 20192, 20193, 20188, 20190, + 0, 16384, 20480, 20481, 19968, 20224, 20160, 0, + 16384, 20480, 20481, 19968, 20224, 20225, 20192, 0, + 16384, 20480, 20481, 19968, 20224, 20225, 20192, 0, + 16384, 20480, 20481, 19968, 20224, 20225, 20192, 20194, + 0, 16384, 20480, 20481, 19968, 20224, 20225, 20192, + 0, 16384, 20480, 20481, 19968, 20224, 20225, 20192, + 20196, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20192, 20196, 0, 16384, 20480, 20481, 19968, 20224, + 20225, 20192, 20200, 20198, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20192, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20192, 20200, 0, 16384, 20480, + 20481, 19968, 20224, 20225, 20192, 20200, 0, 16384, + 20480, 20481, 19968, 20224, 20225, 20192, 20200, 20202, + 0, 16384, 20480, 20481, 19968, 20224, 20225, 20192, + 20200, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20192, 20208, 20204, 0, 16384, 20480, 20481, 19968, + 20224, 20225, 20192, 20208, 20204, 0, 16384, 20480, + 20481, 19968, 20224, 20225, 20192, 20208, 20209, 20206, + 0, 16384, 20480, 20481, 19968, 20224, 20225, 20192, + 0, 16384, 20480, 20481, 19968, 20224, 20225, 20192, + 20208, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20227, 20208, 0, 16384, 20480, 20481, 19968, 20224, + 20225, 20227, 20208, 20210, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20227, 20208, 0, 16384, 20480, + 20481, 19968, 20224, 20225, 20227, 20208, 20212, 0, + 16384, 20480, 20481, 19968, 20224, 20225, 20227, 20208, + 20212, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20227, 20208, 20216, 20214, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20227, 20208, 0, 16384, 20480, + 20481, 19968, 20224, 20225, 20227, 20208, 20216, 0, + 16384, 20480, 20481, 19968, 20224, 20225, 20227, 20208, + 20216, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20227, 20208, 20216, 20218, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20227, 20231, 20216, 0, 16384, + 20480, 20481, 19968, 20224, 20225, 20227, 20231, 20216, + 20220, 0, 16384, 20480, 20481, 19968, 20224, 20225, + 20227, 20231, 20216, 20220, 0, 16384, 20480, 20481, + 19968, 20224, 20225, 20227, 20231, 20216, 20220, 20222, + 0, 16384, 20480, 20481, 19968, 0, 16384, 20480, + 20481, 19968, 20224, 0, 16384, 20480, 20481, 19968, + 20224, 0, 16384, 20480, 20481, 19968, 20224, 20226, + 0, 16384, 20480, 20481, 20483, 20224, 0, 16384, + 20480, 20481, 20483, 20224, 20228, 0, 16384, 20480, + 20481, 20483, 20224, 20228, 0, 16384, 20480, 20481, + 20483, 20224, 20232, 20230, 0, 16384, 20480, 20481, + 20483, 20224, 0, 16384, 20480, 20481, 20483, 20224, + 20232, 0, 16384, 20480, 20481, 20483, 20224, 20232, + 0, 16384, 20480, 20481, 20483, 20224, 20232, 20234, + 0, 16384, 20480, 20481, 20483, 20224, 20232, 0, + 16384, 20480, 20481, 20483, 20224, 20240, 20236, 0, + 16384, 20480, 20481, 20483, 20224, 20240, 20236, 0, + 16384, 20480, 20481, 20483, 20224, 20240, 20241, 20238, + 0, 16384, 20480, 20481, 20483, 20224, 0, 16384, + 20480, 20481, 20483, 20224, 20240, 0, 16384, 20480, + 20481, 20483, 20224, 20240, 0, 16384, 20480, 20481, + 20483, 20224, 20240, 20242, 0, 16384, 20480, 20481, + 20483, 20224, 20240, 0, 16384, 20480, 20481, 20483, + 20224, 20240, 20244, 0, 16384, 20480, 20481, 20483, + 20224, 20240, 20244, 0, 16384, 20480, 20481, 20483, + 20224, 20240, 20248, 20246, 0, 16384, 20480, 20481, + 20483, 20224, 20240, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20248, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20248, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20248, 20250, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 20248, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 20257, 20252, 0, 16384, 20480, + 20481, 20483, 20224, 20256, 20257, 20252, 0, 16384, + 20480, 20481, 20483, 20224, 20256, 20257, 20252, 20254, + 0, 16384, 20480, 20481, 20483, 20224, 0, 16384, + 20480, 20481, 20483, 20224, 20256, 0, 16384, 20480, + 20481, 20483, 20224, 20256, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 20258, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20260, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20260, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20264, 20262, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20264, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20264, 0, 16384, 20480, 20481, 20483, + 20224, 20256, 20264, 20266, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 20264, 0, 16384, 20480, 20481, + 20483, 20224, 20256, 20272, 20268, 0, 16384, 20480, + 20481, 20483, 20224, 20256, 20272, 20268, 0, 16384, + 20480, 20481, 20483, 20224, 20256, 20272, 20273, 20270, + 0, 16384, 20480, 20481, 20483, 20224, 20256, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20272, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20272, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20272, 20274, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20272, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20272, + 20276, 0, 16384, 20480, 20481, 20483, 20224, 20288, + 20272, 20276, 0, 16384, 20480, 20481, 20483, 20224, + 20288, 20272, 20280, 20278, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20272, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20289, 20280, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 20289, 20280, 0, 16384, + 20480, 20481, 20483, 20224, 20288, 20289, 20280, 20282, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20289, + 20280, 0, 16384, 20480, 20481, 20483, 20224, 20288, + 20289, 20280, 20284, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20289, 20291, 20284, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 20289, 20291, 20284, 20286, + 0, 16384, 20480, 20481, 20483, 20224, 0, 16384, + 20480, 20481, 20483, 20224, 20288, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20290, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20292, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20292, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20296, 20294, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20296, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20296, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20296, 20298, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20296, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20304, 20300, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 20304, 20300, 0, 16384, + 20480, 20481, 20483, 20224, 20288, 20304, 20305, 20302, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20304, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20304, 0, + 16384, 20480, 20481, 20483, 20224, 20288, 20304, 20306, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20304, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20304, + 20308, 0, 16384, 20480, 20481, 20483, 20224, 20288, + 20304, 20308, 0, 16384, 20480, 20481, 20483, 20224, + 20288, 20304, 20312, 20310, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20304, 0, 16384, 20480, 20481, + 20483, 20224, 20288, 20320, 20312, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 20320, 20312, 0, 16384, + 20480, 20481, 20483, 20224, 20288, 20320, 20312, 20314, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 20320, + 20312, 0, 16384, 20480, 20481, 20483, 20224, 20288, + 20320, 20321, 20316, 0, 16384, 20480, 20481, 20483, + 20224, 20288, 20320, 20321, 20316, 0, 16384, 20480, + 20481, 20483, 20224, 20288, 20320, 20321, 20316, 20318, + 0, 16384, 20480, 20481, 20483, 20224, 20288, 0, + 16384, 20480, 20481, 20483, 20224, 20352, 20320, 0, + 16384, 20480, 20481, 20483, 20224, 20352, 20320, 0, + 16384, 20480, 20481, 20483, 20224, 20352, 20320, 20322, + 0, 16384, 20480, 20481, 20483, 20224, 20352, 20320, + 0, 16384, 20480, 20481, 20483, 20224, 20352, 20320, + 20324, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20320, 20324, 0, 16384, 20480, 20481, 20483, 20224, + 20352, 20320, 20328, 20326, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20320, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20320, 20328, 0, 16384, 20480, + 20481, 20483, 20224, 20352, 20320, 20328, 0, 16384, + 20480, 20481, 20483, 20224, 20352, 20320, 20328, 20330, + 0, 16384, 20480, 20481, 20483, 20224, 20352, 20320, + 20328, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20320, 20336, 20332, 0, 16384, 20480, 20481, 20483, + 20224, 20352, 20320, 20336, 20332, 0, 16384, 20480, + 20481, 20483, 20224, 20352, 20320, 20336, 20337, 20334, + 0, 16384, 20480, 20481, 20483, 20224, 20352, 20320, + 0, 16384, 20480, 20481, 20483, 20224, 20352, 20353, + 20336, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20353, 20336, 0, 16384, 20480, 20481, 20483, 20224, + 20352, 20353, 20336, 20338, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20353, 20336, 0, 16384, 20480, + 20481, 20483, 20224, 20352, 20353, 20336, 20340, 0, + 16384, 20480, 20481, 20483, 20224, 20352, 20353, 20336, + 20340, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20353, 20336, 20344, 20342, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20353, 20336, 0, 16384, 20480, + 20481, 20483, 20224, 20352, 20353, 20336, 20344, 0, + 16384, 20480, 20481, 20483, 20224, 20352, 20353, 20355, + 20344, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20353, 20355, 20344, 20346, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20353, 20355, 20344, 0, 16384, + 20480, 20481, 20483, 20224, 20352, 20353, 20355, 20344, + 20348, 0, 16384, 20480, 20481, 20483, 20224, 20352, + 20353, 20355, 20344, 20348, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20353, 20355, 20344, 20348, 20350, + 0, 16384, 20480, 20481, 20483, 20224, 0, 16384, + 20480, 20481, 20483, 20224, 20352, 0, 16384, 20480, + 20481, 20483, 20224, 20352, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 20354, 0, 16384, 20480, 20481, + 20483, 20224, 20352, 0, 16384, 20480, 20481, 20483, + 20224, 20352, 20356, 0, 16384, 20480, 20481, 20483, + 20224, 20352, 20356, 0, 16384, 20480, 20481, 20483, + 20224, 20352, 20360, 20358, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20360, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20360, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20360, 20362, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20360, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20368, 20364, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20368, 20364, 0, 16384, + 20480, 20481, 20483, 20487, 20352, 20368, 20369, 20366, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20368, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20368, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20368, 20370, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20368, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20368, + 20372, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20368, 20372, 0, 16384, 20480, 20481, 20483, 20487, + 20352, 20368, 20376, 20374, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20368, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20384, 20376, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20384, 20376, 0, 16384, + 20480, 20481, 20483, 20487, 20352, 20384, 20376, 20378, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20384, + 20376, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20384, 20385, 20380, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20384, 20385, 20380, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20384, 20385, 20380, 20382, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20384, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20384, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20384, 20386, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20384, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20384, + 20388, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20384, 20388, 0, 16384, 20480, 20481, 20483, 20487, + 20352, 20384, 20392, 20390, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20384, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20384, 20392, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20384, 20392, 0, 16384, + 20480, 20481, 20483, 20487, 20352, 20384, 20392, 20394, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20384, + 20392, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20384, 20400, 20396, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20384, 20400, 20396, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20384, 20400, 20401, 20398, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20384, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20416, + 20400, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20400, 0, 16384, 20480, 20481, 20483, 20487, + 20352, 20416, 20400, 20402, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 20400, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20416, 20400, 20404, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20416, 20400, + 20404, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20400, 20408, 20406, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 20400, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20416, 20417, 20408, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20416, 20417, + 20408, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20417, 20408, 20410, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 20417, 20408, 0, 16384, + 20480, 20481, 20483, 20487, 20352, 20416, 20417, 20408, + 20412, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20417, 20419, 20412, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 20417, 20419, 20412, 20414, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20416, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20416, 0, + 16384, 20480, 20481, 20483, 20487, 20352, 20416, 20418, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20416, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20416, + 20420, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20420, 0, 16384, 20480, 20481, 20483, 20487, + 20352, 20416, 20424, 20422, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 0, 16384, 20480, 20481, + 20483, 20487, 20352, 20416, 20424, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20416, 20424, 0, 16384, + 20480, 20481, 20483, 20487, 20352, 20416, 20424, 20426, + 0, 16384, 20480, 20481, 20483, 20487, 20352, 20416, + 20424, 0, 16384, 20480, 20481, 20483, 20487, 20352, + 20416, 20432, 20428, 0, 16384, 20480, 20481, 20483, + 20487, 20352, 20416, 20432, 20428, 0, 16384, 20480, + 20481, 20483, 20487, 20352, 20416, 20432, 20433, 20430, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20432, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20432, 0, 16384, 20480, 20481, 20483, 20487, + 20495, 20416, 20432, 20434, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20432, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20432, 20436, 0, + 16384, 20480, 20481, 20483, 20487, 20495, 20416, 20432, + 20436, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20432, 20440, 20438, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20432, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20448, 20440, 0, + 16384, 20480, 20481, 20483, 20487, 20495, 20416, 20448, + 20440, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20440, 20442, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20440, 0, 16384, + 20480, 20481, 20483, 20487, 20495, 20416, 20448, 20449, + 20444, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20449, 20444, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20449, 20444, 20446, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20448, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 0, 16384, 20480, 20481, 20483, 20487, + 20495, 20416, 20448, 20450, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20448, 20452, 0, + 16384, 20480, 20481, 20483, 20487, 20495, 20416, 20448, + 20452, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20456, 20454, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20448, 20456, 0, + 16384, 20480, 20481, 20483, 20487, 20495, 20416, 20448, + 20456, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20456, 20458, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20456, 0, 16384, + 20480, 20481, 20483, 20487, 20495, 20416, 20448, 20464, + 20460, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20464, 20460, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20464, 20465, 20462, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20448, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20464, 0, 16384, 20480, 20481, 20483, + 20487, 20495, 20416, 20448, 20464, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20448, 20464, 20466, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20448, 20464, 0, 16384, 20480, 20481, 20483, 20487, + 20495, 20416, 20448, 20464, 20468, 0, 16384, 20480, + 20481, 20483, 20487, 20495, 20416, 20448, 20464, 20468, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20448, 20464, 20472, 20470, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20464, 0, 16384, + 20480, 20481, 20483, 20487, 20495, 20416, 20448, 20464, + 20472, 0, 16384, 20480, 20481, 20483, 20487, 20495, + 20416, 20448, 20464, 20472, 0, 16384, 20480, 20481, + 20483, 20487, 20495, 20416, 20448, 20464, 20472, 20474, + 0, 16384, 20480, 20481, 20483, 20487, 20495, 20416, + 20448, 20464, 20472, 0, 16384, 20480, 20481, 20483, + 20487, 20495, 20416, 20448, 20464, 20472, 20476, 0, + 16384, 20480, 20481, 20483, 20487, 20495, 20416, 20448, + 20464, 20472, 20476, 0, 16384, 20480, 20481, 20483, + 20487, 20495, 20416, 20448, 20464, 20472, 20476, 20478, + 0, 16384, 0, 16384, 20480, 0, 16384, 20480, + 0, 16384, 20480, 20482, 0, 16384, 20480, 0, + 16384, 20480, 20484, 0, 16384, 20480, 20484, 0, + 16384, 20480, 20488, 20486, 0, 16384, 20480, 0, + 16384, 20480, 20488, 0, 16384, 20480, 20488, 0, + 16384, 20480, 20488, 20490, 0, 16384, 20480, 20488, + 0, 16384, 20480, 20496, 20492, 0, 16384, 20480, + 20496, 20492, 0, 16384, 20480, 20496, 20497, 20494, + 0, 16384, 20480, 0, 16384, 20480, 20496, 0, + 16384, 20480, 20496, 0, 16384, 20480, 20496, 20498, + 0, 16384, 20480, 20496, 0, 16384, 20480, 20496, + 20500, 0, 16384, 20480, 20496, 20500, 0, 16384, + 20480, 20496, 20504, 20502, 0, 16384, 20480, 20496, + 0, 16384, 20480, 20512, 20504, 0, 16384, 20480, + 20512, 20504, 0, 16384, 20480, 20512, 20504, 20506, + 0, 16384, 20480, 20512, 20504, 0, 16384, 20480, + 20512, 20513, 20508, 0, 16384, 20480, 20512, 20513, + 20508, 0, 16384, 20480, 20512, 20513, 20508, 20510, + 0, 16384, 20480, 0, 16384, 20480, 20512, 0, + 16384, 20480, 20512, 0, 16384, 20480, 20512, 20514, + 0, 16384, 20480, 20512, 0, 16384, 20480, 20512, + 20516, 0, 16384, 20480, 20512, 20516, 0, 16384, + 20480, 20512, 20520, 20518, 0, 16384, 20480, 20512, + 0, 16384, 20480, 20512, 20520, 0, 16384, 20480, + 20512, 20520, 0, 16384, 20480, 20512, 20520, 20522, + 0, 16384, 20480, 20512, 20520, 0, 16384, 20480, + 20512, 20528, 20524, 0, 16384, 20480, 20512, 20528, + 20524, 0, 16384, 20480, 20512, 20528, 20529, 20526, + 0, 16384, 20480, 20512, 0, 16384, 20480, 20544, + 20528, 0, 16384, 20480, 20544, 20528, 0, 16384, + 20480, 20544, 20528, 20530, 0, 16384, 20480, 20544, + 20528, 0, 16384, 20480, 20544, 20528, 20532, 0, + 16384, 20480, 20544, 20528, 20532, 0, 16384, 20480, + 20544, 20528, 20536, 20534, 0, 16384, 20480, 20544, + 20528, 0, 16384, 20480, 20544, 20545, 20536, 0, + 16384, 20480, 20544, 20545, 20536, 0, 16384, 20480, + 20544, 20545, 20536, 20538, 0, 16384, 20480, 20544, + 20545, 20536, 0, 16384, 20480, 20544, 20545, 20536, + 20540, 0, 16384, 20480, 20544, 20545, 20547, 20540, + 0, 16384, 20480, 20544, 20545, 20547, 20540, 20542, + 0, 16384, 20480, 0, 16384, 20480, 20544, 0, + 16384, 20480, 20544, 0, 16384, 20480, 20544, 20546, + 0, 16384, 20480, 20544, 0, 16384, 20480, 20544, + 20548, 0, 16384, 20480, 20544, 20548, 0, 16384, + 20480, 20544, 20552, 20550, 0, 16384, 20480, 20544, + 0, 16384, 20480, 20544, 20552, 0, 16384, 20480, + 20544, 20552, 0, 16384, 20480, 20544, 20552, 20554, + 0, 16384, 20480, 20544, 20552, 0, 16384, 20480, + 20544, 20560, 20556, 0, 16384, 20480, 20544, 20560, + 20556, 0, 16384, 20480, 20544, 20560, 20561, 20558, + 0, 16384, 20480, 20544, 0, 16384, 20480, 20544, + 20560, 0, 16384, 20480, 20544, 20560, 0, 16384, + 20480, 20544, 20560, 20562, 0, 16384, 20480, 20544, + 20560, 0, 16384, 20480, 20544, 20560, 20564, 0, + 16384, 20480, 20544, 20560, 20564, 0, 16384, 20480, + 20544, 20560, 20568, 20566, 0, 16384, 20480, 20544, + 20560, 0, 16384, 20480, 20544, 20576, 20568, 0, + 16384, 20480, 20544, 20576, 20568, 0, 16384, 20480, + 20544, 20576, 20568, 20570, 0, 16384, 20480, 20544, + 20576, 20568, 0, 16384, 20480, 20544, 20576, 20577, + 20572, 0, 16384, 20480, 20544, 20576, 20577, 20572, + 0, 16384, 20480, 20544, 20576, 20577, 20572, 20574, + 0, 16384, 20480, 20544, 0, 16384, 20480, 20608, + 20576, 0, 16384, 20480, 20608, 20576, 0, 16384, + 20480, 20608, 20576, 20578, 0, 16384, 20480, 20608, + 20576, 0, 16384, 20480, 20608, 20576, 20580, 0, + 16384, 20480, 20608, 20576, 20580, 0, 16384, 20480, + 20608, 20576, 20584, 20582, 0, 16384, 20480, 20608, + 20576, 0, 16384, 20480, 20608, 20576, 20584, 0, + 16384, 20480, 20608, 20576, 20584, 0, 16384, 20480, + 20608, 20576, 20584, 20586, 0, 16384, 20480, 20608, + 20576, 20584, 0, 16384, 20480, 20608, 20576, 20592, + 20588, 0, 16384, 20480, 20608, 20576, 20592, 20588, + 0, 16384, 20480, 20608, 20576, 20592, 20593, 20590, + 0, 16384, 20480, 20608, 20576, 0, 16384, 20480, + 20608, 20609, 20592, 0, 16384, 20480, 20608, 20609, + 20592, 0, 16384, 20480, 20608, 20609, 20592, 20594, + 0, 16384, 20480, 20608, 20609, 20592, 0, 16384, + 20480, 20608, 20609, 20592, 20596, 0, 16384, 20480, + 20608, 20609, 20592, 20596, 0, 16384, 20480, 20608, + 20609, 20592, 20600, 20598, 0, 16384, 20480, 20608, + 20609, 20592, 0, 16384, 20480, 20608, 20609, 20592, + 20600, 0, 16384, 20480, 20608, 20609, 20611, 20600, + 0, 16384, 20480, 20608, 20609, 20611, 20600, 20602, + 0, 16384, 20480, 20608, 20609, 20611, 20600, 0, + 16384, 20480, 20608, 20609, 20611, 20600, 20604, 0, + 16384, 20480, 20608, 20609, 20611, 20600, 20604, 0, + 16384, 20480, 20608, 20609, 20611, 20600, 20604, 20606, + 0, 16384, 20480, 0, 16384, 20480, 20608, 0, + 16384, 20480, 20608, 0, 16384, 20480, 20608, 20610, + 0, 16384, 20480, 20608, 0, 16384, 20480, 20608, + 20612, 0, 16384, 20480, 20608, 20612, 0, 16384, + 20480, 20608, 20616, 20614, 0, 16384, 20480, 20608, + 0, 16384, 20480, 20608, 20616, 0, 16384, 20480, + 20608, 20616, 0, 16384, 20480, 20608, 20616, 20618, + 0, 16384, 20480, 20608, 20616, 0, 16384, 20480, + 20608, 20624, 20620, 0, 16384, 20480, 20608, 20624, + 20620, 0, 16384, 20480, 20608, 20624, 20625, 20622, + 0, 16384, 20480, 20608, 0, 16384, 20480, 20608, + 20624, 0, 16384, 20480, 20608, 20624, 0, 16384, + 20480, 20608, 20624, 20626, 0, 16384, 20480, 20608, + 20624, 0, 16384, 20480, 20608, 20624, 20628, 0, + 16384, 20480, 20608, 20624, 20628, 0, 16384, 20480, + 20608, 20624, 20632, 20630, 0, 16384, 20480, 20608, + 20624, 0, 16384, 20480, 20608, 20640, 20632, 0, + 16384, 20480, 20608, 20640, 20632, 0, 16384, 20480, + 20608, 20640, 20632, 20634, 0, 16384, 20480, 20608, + 20640, 20632, 0, 16384, 20480, 20608, 20640, 20641, + 20636, 0, 16384, 20480, 20608, 20640, 20641, 20636, + 0, 16384, 20480, 20608, 20640, 20641, 20636, 20638, + 0, 16384, 20480, 20608, 0, 16384, 20480, 20608, + 20640, 0, 16384, 20480, 20608, 20640, 0, 16384, + 20480, 20608, 20640, 20642, 0, 16384, 20480, 20608, + 20640, 0, 16384, 20480, 20608, 20640, 20644, 0, + 16384, 20480, 20608, 20640, 20644, 0, 16384, 20480, + 20608, 20640, 20648, 20646, 0, 16384, 20480, 20608, + 20640, 0, 16384, 20480, 20608, 20640, 20648, 0, + 16384, 20480, 20608, 20640, 20648, 0, 16384, 20480, + 20608, 20640, 20648, 20650, 0, 16384, 20480, 20608, + 20640, 20648, 0, 16384, 20480, 20608, 20640, 20656, + 20652, 0, 16384, 20480, 20608, 20640, 20656, 20652, + 0, 16384, 20480, 20608, 20640, 20656, 20657, 20654, + 0, 16384, 20480, 20608, 20640, 0, 16384, 20480, + 20608, 20672, 20656, 0, 16384, 20480, 20608, 20672, + 20656, 0, 16384, 20480, 20608, 20672, 20656, 20658, + 0, 16384, 20480, 20608, 20672, 20656, 0, 16384, + 20480, 20608, 20672, 20656, 20660, 0, 16384, 20480, + 20608, 20672, 20656, 20660, 0, 16384, 20480, 20608, + 20672, 20656, 20664, 20662, 0, 16384, 20480, 20608, + 20672, 20656, 0, 16384, 20480, 20608, 20672, 20673, + 20664, 0, 16384, 20480, 20608, 20672, 20673, 20664, + 0, 16384, 20480, 20608, 20672, 20673, 20664, 20666, + 0, 16384, 20480, 20608, 20672, 20673, 20664, 0, + 16384, 20480, 20608, 20672, 20673, 20664, 20668, 0, + 16384, 20480, 20608, 20672, 20673, 20675, 20668, 0, + 16384, 20480, 20608, 20672, 20673, 20675, 20668, 20670, + 0, 16384, 20480, 20608, 0, 16384, 20480, 20736, + 20672, 0, 16384, 20480, 20736, 20672, 0, 16384, + 20480, 20736, 20672, 20674, 0, 16384, 20480, 20736, + 20672, 0, 16384, 20480, 20736, 20672, 20676, 0, + 16384, 20480, 20736, 20672, 20676, 0, 16384, 20480, + 20736, 20672, 20680, 20678, 0, 16384, 20480, 20736, + 20672, 0, 16384, 20480, 20736, 20672, 20680, 0, + 16384, 20480, 20736, 20672, 20680, 0, 16384, 20480, + 20736, 20672, 20680, 20682, 0, 16384, 20480, 20736, + 20672, 20680, 0, 16384, 20480, 20736, 20672, 20688, + 20684, 0, 16384, 20480, 20736, 20672, 20688, 20684, + 0, 16384, 20480, 20736, 20672, 20688, 20689, 20686, + 0, 16384, 20480, 20736, 20672, 0, 16384, 20480, + 20736, 20672, 20688, 0, 16384, 20480, 20736, 20672, + 20688, 0, 16384, 20480, 20736, 20672, 20688, 20690, + 0, 16384, 20480, 20736, 20672, 20688, 0, 16384, + 20480, 20736, 20672, 20688, 20692, 0, 16384, 20480, + 20736, 20672, 20688, 20692, 0, 16384, 20480, 20736, + 20672, 20688, 20696, 20694, 0, 16384, 20480, 20736, + 20672, 20688, 0, 16384, 20480, 20736, 20672, 20704, + 20696, 0, 16384, 20480, 20736, 20672, 20704, 20696, + 0, 16384, 20480, 20736, 20672, 20704, 20696, 20698, + 0, 16384, 20480, 20736, 20672, 20704, 20696, 0, + 16384, 20480, 20736, 20672, 20704, 20705, 20700, 0, + 16384, 20480, 20736, 20672, 20704, 20705, 20700, 0, + 16384, 20480, 20736, 20672, 20704, 20705, 20700, 20702, + 0, 16384, 20480, 20736, 20672, 0, 16384, 20480, + 20736, 20737, 20704, 0, 16384, 20480, 20736, 20737, + 20704, 0, 16384, 20480, 20736, 20737, 20704, 20706, + 0, 16384, 20480, 20736, 20737, 20704, 0, 16384, + 20480, 20736, 20737, 20704, 20708, 0, 16384, 20480, + 20736, 20737, 20704, 20708, 0, 16384, 20480, 20736, + 20737, 20704, 20712, 20710, 0, 16384, 20480, 20736, + 20737, 20704, 0, 16384, 20480, 20736, 20737, 20704, + 20712, 0, 16384, 20480, 20736, 20737, 20704, 20712, + 0, 16384, 20480, 20736, 20737, 20704, 20712, 20714, + 0, 16384, 20480, 20736, 20737, 20704, 20712, 0, + 16384, 20480, 20736, 20737, 20704, 20720, 20716, 0, + 16384, 20480, 20736, 20737, 20704, 20720, 20716, 0, + 16384, 20480, 20736, 20737, 20704, 20720, 20721, 20718, + 0, 16384, 20480, 20736, 20737, 20704, 0, 16384, + 20480, 20736, 20737, 20704, 20720, 0, 16384, 20480, + 20736, 20737, 20739, 20720, 0, 16384, 20480, 20736, + 20737, 20739, 20720, 20722, 0, 16384, 20480, 20736, + 20737, 20739, 20720, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20724, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20724, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20728, 20726, 0, 16384, 20480, 20736, + 20737, 20739, 20720, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20728, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20728, 0, 16384, 20480, 20736, 20737, + 20739, 20720, 20728, 20730, 0, 16384, 20480, 20736, + 20737, 20739, 20743, 20728, 0, 16384, 20480, 20736, + 20737, 20739, 20743, 20728, 20732, 0, 16384, 20480, + 20736, 20737, 20739, 20743, 20728, 20732, 0, 16384, + 20480, 20736, 20737, 20739, 20743, 20728, 20732, 20734, + 0, 16384, 20480, 0, 16384, 20480, 20736, 0, + 16384, 20480, 20736, 0, 16384, 20480, 20736, 20738, + 0, 16384, 20480, 20736, 0, 16384, 20480, 20736, + 20740, 0, 16384, 20480, 20736, 20740, 0, 16384, + 20480, 20736, 20744, 20742, 0, 16384, 20480, 20736, + 0, 16384, 20480, 20736, 20744, 0, 16384, 20480, + 20736, 20744, 0, 16384, 20480, 20736, 20744, 20746, + 0, 16384, 20480, 20736, 20744, 0, 16384, 20480, + 20736, 20752, 20748, 0, 16384, 20480, 20736, 20752, + 20748, 0, 16384, 20480, 20736, 20752, 20753, 20750, + 0, 16384, 20480, 20736, 0, 16384, 20480, 20736, + 20752, 0, 16384, 20480, 20736, 20752, 0, 16384, + 20480, 20736, 20752, 20754, 0, 16384, 20480, 20736, + 20752, 0, 16384, 20480, 20736, 20752, 20756, 0, + 16384, 20480, 20736, 20752, 20756, 0, 16384, 20480, + 20736, 20752, 20760, 20758, 0, 16384, 20480, 20736, + 20752, 0, 16384, 20480, 20736, 20768, 20760, 0, + 16384, 20480, 20736, 20768, 20760, 0, 16384, 20480, + 20736, 20768, 20760, 20762, 0, 16384, 20480, 20736, + 20768, 20760, 0, 16384, 20480, 20736, 20768, 20769, + 20764, 0, 16384, 20480, 20736, 20768, 20769, 20764, + 0, 16384, 20480, 20736, 20768, 20769, 20764, 20766, + 0, 16384, 20480, 20736, 0, 16384, 20480, 20736, + 20768, 0, 16384, 20480, 20736, 20768, 0, 16384, + 20480, 20736, 20768, 20770, 0, 16384, 20480, 20736, + 20768, 0, 16384, 20480, 20736, 20768, 20772, 0, + 16384, 20480, 20736, 20768, 20772, 0, 16384, 20480, + 20736, 20768, 20776, 20774, 0, 16384, 20480, 20736, + 20768, 0, 16384, 20480, 20736, 20768, 20776, 0, + 16384, 20480, 20736, 20768, 20776, 0, 16384, 20480, + 20736, 20768, 20776, 20778, 0, 16384, 20480, 20736, + 20768, 20776, 0, 16384, 20480, 20736, 20768, 20784, + 20780, 0, 16384, 20480, 20736, 20768, 20784, 20780, + 0, 16384, 20480, 20736, 20768, 20784, 20785, 20782, + 0, 16384, 20480, 20736, 20768, 0, 16384, 20480, + 20736, 20800, 20784, 0, 16384, 20480, 20736, 20800, + 20784, 0, 16384, 20480, 20736, 20800, 20784, 20786, + 0, 16384, 20480, 20736, 20800, 20784, 0, 16384, + 20480, 20736, 20800, 20784, 20788, 0, 16384, 20480, + 20736, 20800, 20784, 20788, 0, 16384, 20480, 20736, + 20800, 20784, 20792, 20790, 0, 16384, 20480, 20736, + 20800, 20784, 0, 16384, 20480, 20736, 20800, 20801, + 20792, 0, 16384, 20480, 20736, 20800, 20801, 20792, + 0, 16384, 20480, 20736, 20800, 20801, 20792, 20794, + 0, 16384, 20480, 20736, 20800, 20801, 20792, 0, + 16384, 20480, 20736, 20800, 20801, 20792, 20796, 0, + 16384, 20480, 20736, 20800, 20801, 20803, 20796, 0, + 16384, 20480, 20736, 20800, 20801, 20803, 20796, 20798, + 0, 16384, 20480, 20736, 0, 16384, 20480, 20736, + 20800, 0, 16384, 20480, 20736, 20800, 0, 16384, + 20480, 20736, 20800, 20802, 0, 16384, 20480, 20736, + 20800, 0, 16384, 20480, 20736, 20800, 20804, 0, + 16384, 20480, 20736, 20800, 20804, 0, 16384, 20480, + 20736, 20800, 20808, 20806, 0, 16384, 20480, 20736, + 20800, 0, 16384, 20480, 20736, 20800, 20808, 0, + 16384, 20480, 20736, 20800, 20808, 0, 16384, 20480, + 20736, 20800, 20808, 20810, 0, 16384, 20480, 20736, + 20800, 20808, 0, 16384, 20480, 20736, 20800, 20816, + 20812, 0, 16384, 20480, 20736, 20800, 20816, 20812, + 0, 16384, 20480, 20736, 20800, 20816, 20817, 20814, + 0, 16384, 20480, 20736, 20800, 0, 16384, 20480, + 20736, 20800, 20816, 0, 16384, 20480, 20736, 20800, + 20816, 0, 16384, 20480, 20736, 20800, 20816, 20818, + 0, 16384, 20480, 20736, 20800, 20816, 0, 16384, + 20480, 20736, 20800, 20816, 20820, 0, 16384, 20480, + 20736, 20800, 20816, 20820, 0, 16384, 20480, 20736, + 20800, 20816, 20824, 20822, 0, 16384, 20480, 20736, + 20800, 20816, 0, 16384, 20480, 20736, 20800, 20832, + 20824, 0, 16384, 20480, 20736, 20800, 20832, 20824, + 0, 16384, 20480, 20736, 20800, 20832, 20824, 20826, + 0, 16384, 20480, 20736, 20800, 20832, 20824, 0, + 16384, 20480, 20736, 20800, 20832, 20833, 20828, 0, + 16384, 20480, 20736, 20800, 20832, 20833, 20828, 0, + 16384, 20480, 20736, 20800, 20832, 20833, 20828, 20830, + 0, 16384, 20480, 20736, 20800, 0, 16384, 20480, + 20736, 20864, 20832, 0, 16384, 20480, 20736, 20864, + 20832, 0, 16384, 20480, 20736, 20864, 20832, 20834, + 0, 16384, 20480, 20736, 20864, 20832, 0, 16384, + 20480, 20736, 20864, 20832, 20836, 0, 16384, 20480, + 20736, 20864, 20832, 20836, 0, 16384, 20480, 20736, + 20864, 20832, 20840, 20838, 0, 16384, 20480, 20736, + 20864, 20832, 0, 16384, 20480, 20736, 20864, 20832, + 20840, 0, 16384, 20480, 20736, 20864, 20832, 20840, + 0, 16384, 20480, 20736, 20864, 20832, 20840, 20842, + 0, 16384, 20480, 20736, 20864, 20832, 20840, 0, + 16384, 20480, 20736, 20864, 20832, 20848, 20844, 0, + 16384, 20480, 20736, 20864, 20832, 20848, 20844, 0, + 16384, 20480, 20736, 20864, 20832, 20848, 20849, 20846, + 0, 16384, 20480, 20736, 20864, 20832, 0, 16384, + 20480, 20736, 20864, 20865, 20848, 0, 16384, 20480, + 20736, 20864, 20865, 20848, 0, 16384, 20480, 20736, + 20864, 20865, 20848, 20850, 0, 16384, 20480, 20736, + 20864, 20865, 20848, 0, 16384, 20480, 20736, 20864, + 20865, 20848, 20852, 0, 16384, 20480, 20736, 20864, + 20865, 20848, 20852, 0, 16384, 20480, 20736, 20864, + 20865, 20848, 20856, 20854, 0, 16384, 20480, 20736, + 20864, 20865, 20848, 0, 16384, 20480, 20736, 20864, + 20865, 20848, 20856, 0, 16384, 20480, 20736, 20864, + 20865, 20867, 20856, 0, 16384, 20480, 20736, 20864, + 20865, 20867, 20856, 20858, 0, 16384, 20480, 20736, + 20864, 20865, 20867, 20856, 0, 16384, 20480, 20736, + 20864, 20865, 20867, 20856, 20860, 0, 16384, 20480, + 20736, 20864, 20865, 20867, 20856, 20860, 0, 16384, + 20480, 20736, 20864, 20865, 20867, 20856, 20860, 20862, + 0, 16384, 20480, 20736, 0, 16384, 20480, 20992, + 20864, 0, 16384, 20480, 20992, 20864, 0, 16384, + 20480, 20992, 20864, 20866, 0, 16384, 20480, 20992, + 20864, 0, 16384, 20480, 20992, 20864, 20868, 0, + 16384, 20480, 20992, 20864, 20868, 0, 16384, 20480, + 20992, 20864, 20872, 20870, 0, 16384, 20480, 20992, + 20864, 0, 16384, 20480, 20992, 20864, 20872, 0, + 16384, 20480, 20992, 20864, 20872, 0, 16384, 20480, + 20992, 20864, 20872, 20874, 0, 16384, 20480, 20992, + 20864, 20872, 0, 16384, 20480, 20992, 20864, 20880, + 20876, 0, 16384, 20480, 20992, 20864, 20880, 20876, + 0, 16384, 20480, 20992, 20864, 20880, 20881, 20878, + 0, 16384, 20480, 20992, 20864, 0, 16384, 20480, + 20992, 20864, 20880, 0, 16384, 20480, 20992, 20864, + 20880, 0, 16384, 20480, 20992, 20864, 20880, 20882, + 0, 16384, 20480, 20992, 20864, 20880, 0, 16384, + 20480, 20992, 20864, 20880, 20884, 0, 16384, 20480, + 20992, 20864, 20880, 20884, 0, 16384, 20480, 20992, + 20864, 20880, 20888, 20886, 0, 16384, 20480, 20992, + 20864, 20880, 0, 16384, 20480, 20992, 20864, 20896, + 20888, 0, 16384, 20480, 20992, 20864, 20896, 20888, + 0, 16384, 20480, 20992, 20864, 20896, 20888, 20890, + 0, 16384, 20480, 20992, 20864, 20896, 20888, 0, + 16384, 20480, 20992, 20864, 20896, 20897, 20892, 0, + 16384, 20480, 20992, 20864, 20896, 20897, 20892, 0, + 16384, 20480, 20992, 20864, 20896, 20897, 20892, 20894, + 0, 16384, 20480, 20992, 20864, 0, 16384, 20480, + 20992, 20864, 20896, 0, 16384, 20480, 20992, 20864, + 20896, 0, 16384, 20480, 20992, 20864, 20896, 20898, + 0, 16384, 20480, 20992, 20864, 20896, 0, 16384, + 20480, 20992, 20864, 20896, 20900, 0, 16384, 20480, + 20992, 20864, 20896, 20900, 0, 16384, 20480, 20992, + 20864, 20896, 20904, 20902, 0, 16384, 20480, 20992, + 20864, 20896, 0, 16384, 20480, 20992, 20864, 20896, + 20904, 0, 16384, 20480, 20992, 20864, 20896, 20904, + 0, 16384, 20480, 20992, 20864, 20896, 20904, 20906, + 0, 16384, 20480, 20992, 20864, 20896, 20904, 0, + 16384, 20480, 20992, 20864, 20896, 20912, 20908, 0, + 16384, 20480, 20992, 20864, 20896, 20912, 20908, 0, + 16384, 20480, 20992, 20864, 20896, 20912, 20913, 20910, + 0, 16384, 20480, 20992, 20864, 20896, 0, 16384, + 20480, 20992, 20864, 20928, 20912, 0, 16384, 20480, + 20992, 20864, 20928, 20912, 0, 16384, 20480, 20992, + 20864, 20928, 20912, 20914, 0, 16384, 20480, 20992, + 20864, 20928, 20912, 0, 16384, 20480, 20992, 20864, + 20928, 20912, 20916, 0, 16384, 20480, 20992, 20864, + 20928, 20912, 20916, 0, 16384, 20480, 20992, 20864, + 20928, 20912, 20920, 20918, 0, 16384, 20480, 20992, + 20864, 20928, 20912, 0, 16384, 20480, 20992, 20864, + 20928, 20929, 20920, 0, 16384, 20480, 20992, 20864, + 20928, 20929, 20920, 0, 16384, 20480, 20992, 20864, + 20928, 20929, 20920, 20922, 0, 16384, 20480, 20992, + 20864, 20928, 20929, 20920, 0, 16384, 20480, 20992, + 20864, 20928, 20929, 20920, 20924, 0, 16384, 20480, + 20992, 20864, 20928, 20929, 20931, 20924, 0, 16384, + 20480, 20992, 20864, 20928, 20929, 20931, 20924, 20926, + 0, 16384, 20480, 20992, 20864, 0, 16384, 20480, + 20992, 20993, 20928, 0, 16384, 20480, 20992, 20993, + 20928, 0, 16384, 20480, 20992, 20993, 20928, 20930, + 0, 16384, 20480, 20992, 20993, 20928, 0, 16384, + 20480, 20992, 20993, 20928, 20932, 0, 16384, 20480, + 20992, 20993, 20928, 20932, 0, 16384, 20480, 20992, + 20993, 20928, 20936, 20934, 0, 16384, 20480, 20992, + 20993, 20928, 0, 16384, 20480, 20992, 20993, 20928, + 20936, 0, 16384, 20480, 20992, 20993, 20928, 20936, + 0, 16384, 20480, 20992, 20993, 20928, 20936, 20938, + 0, 16384, 20480, 20992, 20993, 20928, 20936, 0, + 16384, 20480, 20992, 20993, 20928, 20944, 20940, 0, + 16384, 20480, 20992, 20993, 20928, 20944, 20940, 0, + 16384, 20480, 20992, 20993, 20928, 20944, 20945, 20942, + 0, 16384, 20480, 20992, 20993, 20928, 0, 16384, + 20480, 20992, 20993, 20928, 20944, 0, 16384, 20480, + 20992, 20993, 20928, 20944, 0, 16384, 20480, 20992, + 20993, 20928, 20944, 20946, 0, 16384, 20480, 20992, + 20993, 20928, 20944, 0, 16384, 20480, 20992, 20993, + 20928, 20944, 20948, 0, 16384, 20480, 20992, 20993, + 20928, 20944, 20948, 0, 16384, 20480, 20992, 20993, + 20928, 20944, 20952, 20950, 0, 16384, 20480, 20992, + 20993, 20928, 20944, 0, 16384, 20480, 20992, 20993, + 20928, 20960, 20952, 0, 16384, 20480, 20992, 20993, + 20928, 20960, 20952, 0, 16384, 20480, 20992, 20993, + 20928, 20960, 20952, 20954, 0, 16384, 20480, 20992, + 20993, 20928, 20960, 20952, 0, 16384, 20480, 20992, + 20993, 20928, 20960, 20961, 20956, 0, 16384, 20480, + 20992, 20993, 20928, 20960, 20961, 20956, 0, 16384, + 20480, 20992, 20993, 20928, 20960, 20961, 20956, 20958, + 0, 16384, 20480, 20992, 20993, 20928, 0, 16384, + 20480, 20992, 20993, 20928, 20960, 0, 16384, 20480, + 20992, 20993, 20995, 20960, 0, 16384, 20480, 20992, + 20993, 20995, 20960, 20962, 0, 16384, 20480, 20992, + 20993, 20995, 20960, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20964, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20964, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20968, 20966, 0, 16384, 20480, 20992, + 20993, 20995, 20960, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20968, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20968, 0, 16384, 20480, 20992, 20993, + 20995, 20960, 20968, 20970, 0, 16384, 20480, 20992, + 20993, 20995, 20960, 20968, 0, 16384, 20480, 20992, + 20993, 20995, 20960, 20976, 20972, 0, 16384, 20480, + 20992, 20993, 20995, 20960, 20976, 20972, 0, 16384, + 20480, 20992, 20993, 20995, 20960, 20976, 20977, 20974, + 0, 16384, 20480, 20992, 20993, 20995, 20960, 0, + 16384, 20480, 20992, 20993, 20995, 20960, 20976, 0, + 16384, 20480, 20992, 20993, 20995, 20960, 20976, 0, + 16384, 20480, 20992, 20993, 20995, 20960, 20976, 20978, + 0, 16384, 20480, 20992, 20993, 20995, 20999, 20976, + 0, 16384, 20480, 20992, 20993, 20995, 20999, 20976, + 20980, 0, 16384, 20480, 20992, 20993, 20995, 20999, + 20976, 20980, 0, 16384, 20480, 20992, 20993, 20995, + 20999, 20976, 20984, 20982, 0, 16384, 20480, 20992, + 20993, 20995, 20999, 20976, 0, 16384, 20480, 20992, + 20993, 20995, 20999, 20976, 20984, 0, 16384, 20480, + 20992, 20993, 20995, 20999, 20976, 20984, 0, 16384, + 20480, 20992, 20993, 20995, 20999, 20976, 20984, 20986, + 0, 16384, 20480, 20992, 20993, 20995, 20999, 20976, + 20984, 0, 16384, 20480, 20992, 20993, 20995, 20999, + 20976, 20984, 20988, 0, 16384, 20480, 20992, 20993, + 20995, 20999, 20976, 20984, 20988, 0, 16384, 20480, + 20992, 20993, 20995, 20999, 20976, 20984, 20988, 20990, + 0, 16384, 20480, 0, 16384, 20480, 20992, 0, + 16384, 20480, 20992, 0, 16384, 20480, 20992, 20994, + 0, 16384, 20480, 20992, 0, 16384, 20480, 20992, + 20996, 0, 16384, 20480, 20992, 20996, 0, 16384, + 20480, 20992, 21000, 20998, 0, 16384, 20480, 20992, + 0, 16384, 20480, 20992, 21000, 0, 16384, 20480, + 20992, 21000, 0, 16384, 20480, 20992, 21000, 21002, + 0, 16384, 20480, 20992, 21000, 0, 16384, 20480, + 20992, 21008, 21004, 0, 16384, 20480, 20992, 21008, + 21004, 0, 16384, 20480, 20992, 21008, 21009, 21006, + 0, 16384, 20480, 20992, 0, 16384, 20480, 20992, + 21008, 0, 16384, 20480, 20992, 21008, 0, 16384, + 20480, 20992, 21008, 21010, 0, 16384, 20480, 20992, + 21008, 0, 16384, 20480, 20992, 21008, 21012, 0, + 16384, 20480, 20992, 21008, 21012, 0, 16384, 20480, + 20992, 21008, 21016, 21014, 0, 16384, 20480, 20992, + 21008, 0, 16384, 20480, 20992, 21024, 21016, 0, + 16384, 20480, 20992, 21024, 21016, 0, 16384, 20480, + 20992, 21024, 21016, 21018, 0, 16384, 20480, 20992, + 21024, 21016, 0, 16384, 20480, 20992, 21024, 21025, + 21020, 0, 16384, 20480, 20992, 21024, 21025, 21020, + 0, 16384, 20480, 20992, 21024, 21025, 21020, 21022, + 0, 16384, 20480, 20992, 0, 16384, 20480, 20992, + 21024, 0, 16384, 20480, 20992, 21024, 0, 16384, + 20480, 20992, 21024, 21026, 0, 16384, 20480, 20992, + 21024, 0, 16384, 20480, 20992, 21024, 21028, 0, + 16384, 20480, 20992, 21024, 21028, 0, 16384, 20480, + 20992, 21024, 21032, 21030, 0, 16384, 20480, 20992, + 21024, 0, 16384, 20480, 20992, 21024, 21032, 0, + 16384, 20480, 20992, 21024, 21032, 0, 16384, 20480, + 20992, 21024, 21032, 21034, 0, 16384, 20480, 20992, + 21024, 21032, 0, 16384, 20480, 20992, 21024, 21040, + 21036, 0, 16384, 20480, 20992, 21024, 21040, 21036, + 0, 16384, 20480, 20992, 21024, 21040, 21041, 21038, + 0, 16384, 20480, 20992, 21024, 0, 16384, 20480, + 20992, 21056, 21040, 0, 16384, 20480, 20992, 21056, + 21040, 0, 16384, 20480, 20992, 21056, 21040, 21042, + 0, 16384, 20480, 20992, 21056, 21040, 0, 16384, + 20480, 20992, 21056, 21040, 21044, 0, 16384, 20480, + 20992, 21056, 21040, 21044, 0, 16384, 20480, 20992, + 21056, 21040, 21048, 21046, 0, 16384, 20480, 20992, + 21056, 21040, 0, 16384, 20480, 20992, 21056, 21057, + 21048, 0, 16384, 20480, 20992, 21056, 21057, 21048, + 0, 16384, 20480, 20992, 21056, 21057, 21048, 21050, + 0, 16384, 20480, 20992, 21056, 21057, 21048, 0, + 16384, 20480, 20992, 21056, 21057, 21048, 21052, 0, + 16384, 20480, 20992, 21056, 21057, 21059, 21052, 0, + 16384, 20480, 20992, 21056, 21057, 21059, 21052, 21054, + 0, 16384, 20480, 20992, 0, 16384, 20480, 20992, + 21056, 0, 16384, 20480, 20992, 21056, 0, 16384, + 20480, 20992, 21056, 21058, 0, 16384, 20480, 20992, + 21056, 0, 16384, 20480, 20992, 21056, 21060, 0, + 16384, 20480, 20992, 21056, 21060, 0, 16384, 20480, + 20992, 21056, 21064, 21062, 0, 16384, 20480, 20992, + 21056, 0, 16384, 20480, 20992, 21056, 21064, 0, + 16384, 20480, 20992, 21056, 21064, 0, 16384, 20480, + 20992, 21056, 21064, 21066, 0, 16384, 20480, 20992, + 21056, 21064, 0, 16384, 20480, 20992, 21056, 21072, + 21068, 0, 16384, 20480, 20992, 21056, 21072, 21068, + 0, 16384, 20480, 20992, 21056, 21072, 21073, 21070, + 0, 16384, 20480, 20992, 21056, 0, 16384, 20480, + 20992, 21056, 21072, 0, 16384, 20480, 20992, 21056, + 21072, 0, 16384, 20480, 20992, 21056, 21072, 21074, + 0, 16384, 20480, 20992, 21056, 21072, 0, 16384, + 20480, 20992, 21056, 21072, 21076, 0, 16384, 20480, + 20992, 21056, 21072, 21076, 0, 16384, 20480, 20992, + 21056, 21072, 21080, 21078, 0, 16384, 20480, 20992, + 21056, 21072, 0, 16384, 20480, 20992, 21056, 21088, + 21080, 0, 16384, 20480, 20992, 21056, 21088, 21080, + 0, 16384, 20480, 20992, 21056, 21088, 21080, 21082, + 0, 16384, 20480, 20992, 21056, 21088, 21080, 0, + 16384, 20480, 20992, 21056, 21088, 21089, 21084, 0, + 16384, 20480, 20992, 21056, 21088, 21089, 21084, 0, + 16384, 20480, 20992, 21056, 21088, 21089, 21084, 21086, + 0, 16384, 20480, 20992, 21056, 0, 16384, 20480, + 20992, 21120, 21088, 0, 16384, 20480, 20992, 21120, + 21088, 0, 16384, 20480, 20992, 21120, 21088, 21090, + 0, 16384, 20480, 20992, 21120, 21088, 0, 16384, + 20480, 20992, 21120, 21088, 21092, 0, 16384, 20480, + 20992, 21120, 21088, 21092, 0, 16384, 20480, 20992, + 21120, 21088, 21096, 21094, 0, 16384, 20480, 20992, + 21120, 21088, 0, 16384, 20480, 20992, 21120, 21088, + 21096, 0, 16384, 20480, 20992, 21120, 21088, 21096, + 0, 16384, 20480, 20992, 21120, 21088, 21096, 21098, + 0, 16384, 20480, 20992, 21120, 21088, 21096, 0, + 16384, 20480, 20992, 21120, 21088, 21104, 21100, 0, + 16384, 20480, 20992, 21120, 21088, 21104, 21100, 0, + 16384, 20480, 20992, 21120, 21088, 21104, 21105, 21102, + 0, 16384, 20480, 20992, 21120, 21088, 0, 16384, + 20480, 20992, 21120, 21121, 21104, 0, 16384, 20480, + 20992, 21120, 21121, 21104, 0, 16384, 20480, 20992, + 21120, 21121, 21104, 21106, 0, 16384, 20480, 20992, + 21120, 21121, 21104, 0, 16384, 20480, 20992, 21120, + 21121, 21104, 21108, 0, 16384, 20480, 20992, 21120, + 21121, 21104, 21108, 0, 16384, 20480, 20992, 21120, + 21121, 21104, 21112, 21110, 0, 16384, 20480, 20992, + 21120, 21121, 21104, 0, 16384, 20480, 20992, 21120, + 21121, 21104, 21112, 0, 16384, 20480, 20992, 21120, + 21121, 21123, 21112, 0, 16384, 20480, 20992, 21120, + 21121, 21123, 21112, 21114, 0, 16384, 20480, 20992, + 21120, 21121, 21123, 21112, 0, 16384, 20480, 20992, + 21120, 21121, 21123, 21112, 21116, 0, 16384, 20480, + 20992, 21120, 21121, 21123, 21112, 21116, 0, 16384, + 20480, 20992, 21120, 21121, 21123, 21112, 21116, 21118, + 0, 16384, 20480, 20992, 0, 16384, 20480, 20992, + 21120, 0, 16384, 20480, 20992, 21120, 0, 16384, + 20480, 20992, 21120, 21122, 0, 16384, 20480, 20992, + 21120, 0, 16384, 20480, 20992, 21120, 21124, 0, + 16384, 20480, 20992, 21120, 21124, 0, 16384, 20480, + 20992, 21120, 21128, 21126, 0, 16384, 20480, 20992, + 21120, 0, 16384, 20480, 20992, 21120, 21128, 0, + 16384, 20480, 20992, 21120, 21128, 0, 16384, 20480, + 20992, 21120, 21128, 21130, 0, 16384, 20480, 20992, + 21120, 21128, 0, 16384, 20480, 20992, 21120, 21136, + 21132, 0, 16384, 20480, 20992, 21120, 21136, 21132, + 0, 16384, 20480, 20992, 21120, 21136, 21137, 21134, + 0, 16384, 20480, 20992, 21120, 0, 16384, 20480, + 20992, 21120, 21136, 0, 16384, 20480, 20992, 21120, + 21136, 0, 16384, 20480, 20992, 21120, 21136, 21138, + 0, 16384, 20480, 20992, 21120, 21136, 0, 16384, + 20480, 20992, 21120, 21136, 21140, 0, 16384, 20480, + 20992, 21120, 21136, 21140, 0, 16384, 20480, 20992, + 21120, 21136, 21144, 21142, 0, 16384, 20480, 20992, + 21120, 21136, 0, 16384, 20480, 20992, 21120, 21152, + 21144, 0, 16384, 20480, 20992, 21120, 21152, 21144, + 0, 16384, 20480, 20992, 21120, 21152, 21144, 21146, + 0, 16384, 20480, 20992, 21120, 21152, 21144, 0, + 16384, 20480, 20992, 21120, 21152, 21153, 21148, 0, + 16384, 20480, 20992, 21120, 21152, 21153, 21148, 0, + 16384, 20480, 20992, 21120, 21152, 21153, 21148, 21150, + 0, 16384, 20480, 20992, 21120, 0, 16384, 20480, + 20992, 21120, 21152, 0, 16384, 20480, 20992, 21120, + 21152, 0, 16384, 20480, 20992, 21120, 21152, 21154, + 0, 16384, 20480, 20992, 21120, 21152, 0, 16384, + 20480, 20992, 21120, 21152, 21156, 0, 16384, 20480, + 20992, 21120, 21152, 21156, 0, 16384, 20480, 20992, + 21120, 21152, 21160, 21158, 0, 16384, 20480, 20992, + 21120, 21152, 0, 16384, 20480, 20992, 21120, 21152, + 21160, 0, 16384, 20480, 20992, 21120, 21152, 21160, + 0, 16384, 20480, 20992, 21120, 21152, 21160, 21162, + 0, 16384, 20480, 20992, 21120, 21152, 21160, 0, + 16384, 20480, 20992, 21120, 21152, 21168, 21164, 0, + 16384, 20480, 20992, 21120, 21152, 21168, 21164, 0, + 16384, 20480, 20992, 21120, 21152, 21168, 21169, 21166, + 0, 16384, 20480, 20992, 21120, 21152, 0, 16384, + 20480, 20992, 21120, 21184, 21168, 0, 16384, 20480, + 20992, 21120, 21184, 21168, 0, 16384, 20480, 20992, + 21120, 21184, 21168, 21170, 0, 16384, 20480, 20992, + 21120, 21184, 21168, 0, 16384, 20480, 20992, 21120, + 21184, 21168, 21172, 0, 16384, 20480, 20992, 21120, + 21184, 21168, 21172, 0, 16384, 20480, 20992, 21120, + 21184, 21168, 21176, 21174, 0, 16384, 20480, 20992, + 21120, 21184, 21168, 0, 16384, 20480, 20992, 21120, + 21184, 21185, 21176, 0, 16384, 20480, 20992, 21120, + 21184, 21185, 21176, 0, 16384, 20480, 20992, 21120, + 21184, 21185, 21176, 21178, 0, 16384, 20480, 20992, + 21120, 21184, 21185, 21176, 0, 16384, 20480, 20992, + 21120, 21184, 21185, 21176, 21180, 0, 16384, 20480, + 20992, 21120, 21184, 21185, 21187, 21180, 0, 16384, + 20480, 20992, 21120, 21184, 21185, 21187, 21180, 21182, + 0, 16384, 20480, 20992, 21120, 0, 16384, 20480, + 20992, 21248, 21184, 0, 16384, 20480, 20992, 21248, + 21184, 0, 16384, 20480, 20992, 21248, 21184, 21186, + 0, 16384, 20480, 20992, 21248, 21184, 0, 16384, + 20480, 20992, 21248, 21184, 21188, 0, 16384, 20480, + 20992, 21248, 21184, 21188, 0, 16384, 20480, 20992, + 21248, 21184, 21192, 21190, 0, 16384, 20480, 20992, + 21248, 21184, 0, 16384, 20480, 20992, 21248, 21184, + 21192, 0, 16384, 20480, 20992, 21248, 21184, 21192, + 0, 16384, 20480, 20992, 21248, 21184, 21192, 21194, + 0, 16384, 20480, 20992, 21248, 21184, 21192, 0, + 16384, 20480, 20992, 21248, 21184, 21200, 21196, 0, + 16384, 20480, 20992, 21248, 21184, 21200, 21196, 0, + 16384, 20480, 20992, 21248, 21184, 21200, 21201, 21198, + 0, 16384, 20480, 20992, 21248, 21184, 0, 16384, + 20480, 20992, 21248, 21184, 21200, 0, 16384, 20480, + 20992, 21248, 21184, 21200, 0, 16384, 20480, 20992, + 21248, 21184, 21200, 21202, 0, 16384, 20480, 20992, + 21248, 21184, 21200, 0, 16384, 20480, 20992, 21248, + 21184, 21200, 21204, 0, 16384, 20480, 20992, 21248, + 21184, 21200, 21204, 0, 16384, 20480, 20992, 21248, + 21184, 21200, 21208, 21206, 0, 16384, 20480, 20992, + 21248, 21184, 21200, 0, 16384, 20480, 20992, 21248, + 21184, 21216, 21208, 0, 16384, 20480, 20992, 21248, + 21184, 21216, 21208, 0, 16384, 20480, 20992, 21248, + 21184, 21216, 21208, 21210, 0, 16384, 20480, 20992, + 21248, 21184, 21216, 21208, 0, 16384, 20480, 20992, + 21248, 21184, 21216, 21217, 21212, 0, 16384, 20480, + 20992, 21248, 21184, 21216, 21217, 21212, 0, 16384, + 20480, 20992, 21248, 21184, 21216, 21217, 21212, 21214, + 0, 16384, 20480, 20992, 21248, 21184, 0, 16384, + 20480, 20992, 21248, 21249, 21216, 0, 16384, 20480, + 20992, 21248, 21249, 21216, 0, 16384, 20480, 20992, + 21248, 21249, 21216, 21218, 0, 16384, 20480, 20992, + 21248, 21249, 21216, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21220, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21220, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21224, 21222, 0, 16384, 20480, 20992, + 21248, 21249, 21216, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21224, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21224, 0, 16384, 20480, 20992, 21248, + 21249, 21216, 21224, 21226, 0, 16384, 20480, 20992, + 21248, 21249, 21216, 21224, 0, 16384, 20480, 20992, + 21248, 21249, 21216, 21232, 21228, 0, 16384, 20480, + 20992, 21248, 21249, 21216, 21232, 21228, 0, 16384, + 20480, 20992, 21248, 21249, 21216, 21232, 21233, 21230, + 0, 16384, 20480, 20992, 21248, 21249, 21216, 0, + 16384, 20480, 20992, 21248, 21249, 21216, 21232, 0, + 16384, 20480, 20992, 21248, 21249, 21251, 21232, 0, + 16384, 20480, 20992, 21248, 21249, 21251, 21232, 21234, + 0, 16384, 20480, 20992, 21248, 21249, 21251, 21232, + 0, 16384, 20480, 20992, 21248, 21249, 21251, 21232, + 21236, 0, 16384, 20480, 20992, 21248, 21249, 21251, + 21232, 21236, 0, 16384, 20480, 20992, 21248, 21249, + 21251, 21232, 21240, 21238, 0, 16384, 20480, 20992, + 21248, 21249, 21251, 21232, 0, 16384, 20480, 20992, + 21248, 21249, 21251, 21232, 21240, 0, 16384, 20480, + 20992, 21248, 21249, 21251, 21232, 21240, 0, 16384, + 20480, 20992, 21248, 21249, 21251, 21232, 21240, 21242, + 0, 16384, 20480, 20992, 21248, 21249, 21251, 21255, + 21240, 0, 16384, 20480, 20992, 21248, 21249, 21251, + 21255, 21240, 21244, 0, 16384, 20480, 20992, 21248, + 21249, 21251, 21255, 21240, 21244, 0, 16384, 20480, + 20992, 21248, 21249, 21251, 21255, 21240, 21244, 21246, + 0, 16384, 20480, 20992, 0, 16384, 20480, 21504, + 21248, 0, 16384, 20480, 21504, 21248, 0, 16384, + 20480, 21504, 21248, 21250, 0, 16384, 20480, 21504, + 21248, 0, 16384, 20480, 21504, 21248, 21252, 0, + 16384, 20480, 21504, 21248, 21252, 0, 16384, 20480, + 21504, 21248, 21256, 21254, 0, 16384, 20480, 21504, + 21248, 0, 16384, 20480, 21504, 21248, 21256, 0, + 16384, 20480, 21504, 21248, 21256, 0, 16384, 20480, + 21504, 21248, 21256, 21258, 0, 16384, 20480, 21504, + 21248, 21256, 0, 16384, 20480, 21504, 21248, 21264, + 21260, 0, 16384, 20480, 21504, 21248, 21264, 21260, + 0, 16384, 20480, 21504, 21248, 21264, 21265, 21262, + 0, 16384, 20480, 21504, 21248, 0, 16384, 20480, + 21504, 21248, 21264, 0, 16384, 20480, 21504, 21248, + 21264, 0, 16384, 20480, 21504, 21248, 21264, 21266, + 0, 16384, 20480, 21504, 21248, 21264, 0, 16384, + 20480, 21504, 21248, 21264, 21268, 0, 16384, 20480, + 21504, 21248, 21264, 21268, 0, 16384, 20480, 21504, + 21248, 21264, 21272, 21270, 0, 16384, 20480, 21504, + 21248, 21264, 0, 16384, 20480, 21504, 21248, 21280, + 21272, 0, 16384, 20480, 21504, 21248, 21280, 21272, + 0, 16384, 20480, 21504, 21248, 21280, 21272, 21274, + 0, 16384, 20480, 21504, 21248, 21280, 21272, 0, + 16384, 20480, 21504, 21248, 21280, 21281, 21276, 0, + 16384, 20480, 21504, 21248, 21280, 21281, 21276, 0, + 16384, 20480, 21504, 21248, 21280, 21281, 21276, 21278, + 0, 16384, 20480, 21504, 21248, 0, 16384, 20480, + 21504, 21248, 21280, 0, 16384, 20480, 21504, 21248, + 21280, 0, 16384, 20480, 21504, 21248, 21280, 21282, + 0, 16384, 20480, 21504, 21248, 21280, 0, 16384, + 20480, 21504, 21248, 21280, 21284, 0, 16384, 20480, + 21504, 21248, 21280, 21284, 0, 16384, 20480, 21504, + 21248, 21280, 21288, 21286, 0, 16384, 20480, 21504, + 21248, 21280, 0, 16384, 20480, 21504, 21248, 21280, + 21288, 0, 16384, 20480, 21504, 21248, 21280, 21288, + 0, 16384, 20480, 21504, 21248, 21280, 21288, 21290, + 0, 16384, 20480, 21504, 21248, 21280, 21288, 0, + 16384, 20480, 21504, 21248, 21280, 21296, 21292, 0, + 16384, 20480, 21504, 21248, 21280, 21296, 21292, 0, + 16384, 20480, 21504, 21248, 21280, 21296, 21297, 21294, + 0, 16384, 20480, 21504, 21248, 21280, 0, 16384, + 20480, 21504, 21248, 21312, 21296, 0, 16384, 20480, + 21504, 21248, 21312, 21296, 0, 16384, 20480, 21504, + 21248, 21312, 21296, 21298, 0, 16384, 20480, 21504, + 21248, 21312, 21296, 0, 16384, 20480, 21504, 21248, + 21312, 21296, 21300, 0, 16384, 20480, 21504, 21248, + 21312, 21296, 21300, 0, 16384, 20480, 21504, 21248, + 21312, 21296, 21304, 21302, 0, 16384, 20480, 21504, + 21248, 21312, 21296, 0, 16384, 20480, 21504, 21248, + 21312, 21313, 21304, 0, 16384, 20480, 21504, 21248, + 21312, 21313, 21304, 0, 16384, 20480, 21504, 21248, + 21312, 21313, 21304, 21306, 0, 16384, 20480, 21504, + 21248, 21312, 21313, 21304, 0, 16384, 20480, 21504, + 21248, 21312, 21313, 21304, 21308, 0, 16384, 20480, + 21504, 21248, 21312, 21313, 21315, 21308, 0, 16384, + 20480, 21504, 21248, 21312, 21313, 21315, 21308, 21310, + 0, 16384, 20480, 21504, 21248, 0, 16384, 20480, + 21504, 21248, 21312, 0, 16384, 20480, 21504, 21248, + 21312, 0, 16384, 20480, 21504, 21248, 21312, 21314, + 0, 16384, 20480, 21504, 21248, 21312, 0, 16384, + 20480, 21504, 21248, 21312, 21316, 0, 16384, 20480, + 21504, 21248, 21312, 21316, 0, 16384, 20480, 21504, + 21248, 21312, 21320, 21318, 0, 16384, 20480, 21504, + 21248, 21312, 0, 16384, 20480, 21504, 21248, 21312, + 21320, 0, 16384, 20480, 21504, 21248, 21312, 21320, + 0, 16384, 20480, 21504, 21248, 21312, 21320, 21322, + 0, 16384, 20480, 21504, 21248, 21312, 21320, 0, + 16384, 20480, 21504, 21248, 21312, 21328, 21324, 0, + 16384, 20480, 21504, 21248, 21312, 21328, 21324, 0, + 16384, 20480, 21504, 21248, 21312, 21328, 21329, 21326, + 0, 16384, 20480, 21504, 21248, 21312, 0, 16384, + 20480, 21504, 21248, 21312, 21328, 0, 16384, 20480, + 21504, 21248, 21312, 21328, 0, 16384, 20480, 21504, + 21248, 21312, 21328, 21330, 0, 16384, 20480, 21504, + 21248, 21312, 21328, 0, 16384, 20480, 21504, 21248, + 21312, 21328, 21332, 0, 16384, 20480, 21504, 21248, + 21312, 21328, 21332, 0, 16384, 20480, 21504, 21248, + 21312, 21328, 21336, 21334, 0, 16384, 20480, 21504, + 21248, 21312, 21328, 0, 16384, 20480, 21504, 21248, + 21312, 21344, 21336, 0, 16384, 20480, 21504, 21248, + 21312, 21344, 21336, 0, 16384, 20480, 21504, 21248, + 21312, 21344, 21336, 21338, 0, 16384, 20480, 21504, + 21248, 21312, 21344, 21336, 0, 16384, 20480, 21504, + 21248, 21312, 21344, 21345, 21340, 0, 16384, 20480, + 21504, 21248, 21312, 21344, 21345, 21340, 0, 16384, + 20480, 21504, 21248, 21312, 21344, 21345, 21340, 21342, + 0, 16384, 20480, 21504, 21248, 21312, 0, 16384, + 20480, 21504, 21248, 21376, 21344, 0, 16384, 20480, + 21504, 21248, 21376, 21344, 0, 16384, 20480, 21504, + 21248, 21376, 21344, 21346, 0, 16384, 20480, 21504, + 21248, 21376, 21344, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21348, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21348, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21352, 21350, 0, 16384, 20480, 21504, + 21248, 21376, 21344, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21352, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21352, 0, 16384, 20480, 21504, 21248, + 21376, 21344, 21352, 21354, 0, 16384, 20480, 21504, + 21248, 21376, 21344, 21352, 0, 16384, 20480, 21504, + 21248, 21376, 21344, 21360, 21356, 0, 16384, 20480, + 21504, 21248, 21376, 21344, 21360, 21356, 0, 16384, + 20480, 21504, 21248, 21376, 21344, 21360, 21361, 21358, + 0, 16384, 20480, 21504, 21248, 21376, 21344, 0, + 16384, 20480, 21504, 21248, 21376, 21377, 21360, 0, + 16384, 20480, 21504, 21248, 21376, 21377, 21360, 0, + 16384, 20480, 21504, 21248, 21376, 21377, 21360, 21362, + 0, 16384, 20480, 21504, 21248, 21376, 21377, 21360, + 0, 16384, 20480, 21504, 21248, 21376, 21377, 21360, + 21364, 0, 16384, 20480, 21504, 21248, 21376, 21377, + 21360, 21364, 0, 16384, 20480, 21504, 21248, 21376, + 21377, 21360, 21368, 21366, 0, 16384, 20480, 21504, + 21248, 21376, 21377, 21360, 0, 16384, 20480, 21504, + 21248, 21376, 21377, 21360, 21368, 0, 16384, 20480, + 21504, 21248, 21376, 21377, 21379, 21368, 0, 16384, + 20480, 21504, 21248, 21376, 21377, 21379, 21368, 21370, + 0, 16384, 20480, 21504, 21248, 21376, 21377, 21379, + 21368, 0, 16384, 20480, 21504, 21248, 21376, 21377, + 21379, 21368, 21372, 0, 16384, 20480, 21504, 21248, + 21376, 21377, 21379, 21368, 21372, 0, 16384, 20480, + 21504, 21248, 21376, 21377, 21379, 21368, 21372, 21374, + 0, 16384, 20480, 21504, 21248, 0, 16384, 20480, + 21504, 21248, 21376, 0, 16384, 20480, 21504, 21505, + 21376, 0, 16384, 20480, 21504, 21505, 21376, 21378, + 0, 16384, 20480, 21504, 21505, 21376, 0, 16384, + 20480, 21504, 21505, 21376, 21380, 0, 16384, 20480, + 21504, 21505, 21376, 21380, 0, 16384, 20480, 21504, + 21505, 21376, 21384, 21382, 0, 16384, 20480, 21504, + 21505, 21376, 0, 16384, 20480, 21504, 21505, 21376, + 21384, 0, 16384, 20480, 21504, 21505, 21376, 21384, + 0, 16384, 20480, 21504, 21505, 21376, 21384, 21386, + 0, 16384, 20480, 21504, 21505, 21376, 21384, 0, + 16384, 20480, 21504, 21505, 21376, 21392, 21388, 0, + 16384, 20480, 21504, 21505, 21376, 21392, 21388, 0, + 16384, 20480, 21504, 21505, 21376, 21392, 21393, 21390, + 0, 16384, 20480, 21504, 21505, 21376, 0, 16384, + 20480, 21504, 21505, 21376, 21392, 0, 16384, 20480, + 21504, 21505, 21376, 21392, 0, 16384, 20480, 21504, + 21505, 21376, 21392, 21394, 0, 16384, 20480, 21504, + 21505, 21376, 21392, 0, 16384, 20480, 21504, 21505, + 21376, 21392, 21396, 0, 16384, 20480, 21504, 21505, + 21376, 21392, 21396, 0, 16384, 20480, 21504, 21505, + 21376, 21392, 21400, 21398, 0, 16384, 20480, 21504, + 21505, 21376, 21392, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21400, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21400, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21400, 21402, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 21400, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 21409, 21404, 0, 16384, 20480, + 21504, 21505, 21376, 21408, 21409, 21404, 0, 16384, + 20480, 21504, 21505, 21376, 21408, 21409, 21404, 21406, + 0, 16384, 20480, 21504, 21505, 21376, 0, 16384, + 20480, 21504, 21505, 21376, 21408, 0, 16384, 20480, + 21504, 21505, 21376, 21408, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 21410, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21412, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21412, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21416, 21414, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21416, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21416, 0, 16384, 20480, 21504, 21505, + 21376, 21408, 21416, 21418, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 21416, 0, 16384, 20480, 21504, + 21505, 21376, 21408, 21424, 21420, 0, 16384, 20480, + 21504, 21505, 21376, 21408, 21424, 21420, 0, 16384, + 20480, 21504, 21505, 21376, 21408, 21424, 21425, 21422, + 0, 16384, 20480, 21504, 21505, 21376, 21408, 0, + 16384, 20480, 21504, 21505, 21376, 21440, 21424, 0, + 16384, 20480, 21504, 21505, 21376, 21440, 21424, 0, + 16384, 20480, 21504, 21505, 21376, 21440, 21424, 21426, + 0, 16384, 20480, 21504, 21505, 21376, 21440, 21424, + 0, 16384, 20480, 21504, 21505, 21376, 21440, 21424, + 21428, 0, 16384, 20480, 21504, 21505, 21376, 21440, + 21424, 21428, 0, 16384, 20480, 21504, 21505, 21376, + 21440, 21424, 21432, 21430, 0, 16384, 20480, 21504, + 21505, 21376, 21440, 21424, 0, 16384, 20480, 21504, + 21505, 21376, 21440, 21441, 21432, 0, 16384, 20480, + 21504, 21505, 21376, 21440, 21441, 21432, 0, 16384, + 20480, 21504, 21505, 21376, 21440, 21441, 21432, 21434, + 0, 16384, 20480, 21504, 21505, 21376, 21440, 21441, + 21432, 0, 16384, 20480, 21504, 21505, 21376, 21440, + 21441, 21432, 21436, 0, 16384, 20480, 21504, 21505, + 21376, 21440, 21441, 21443, 21436, 0, 16384, 20480, + 21504, 21505, 21376, 21440, 21441, 21443, 21436, 21438, + 0, 16384, 20480, 21504, 21505, 21376, 0, 16384, + 20480, 21504, 21505, 21376, 21440, 0, 16384, 20480, + 21504, 21505, 21376, 21440, 0, 16384, 20480, 21504, + 21505, 21376, 21440, 21442, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21444, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21444, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21448, 21446, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21448, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21448, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21448, 21450, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 21448, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 21456, 21452, 0, 16384, 20480, + 21504, 21505, 21507, 21440, 21456, 21452, 0, 16384, + 20480, 21504, 21505, 21507, 21440, 21456, 21457, 21454, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21456, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21456, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21456, 21458, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 21456, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 21456, + 21460, 0, 16384, 20480, 21504, 21505, 21507, 21440, + 21456, 21460, 0, 16384, 20480, 21504, 21505, 21507, + 21440, 21456, 21464, 21462, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 21456, 0, 16384, 20480, 21504, + 21505, 21507, 21440, 21472, 21464, 0, 16384, 20480, + 21504, 21505, 21507, 21440, 21472, 21464, 0, 16384, + 20480, 21504, 21505, 21507, 21440, 21472, 21464, 21466, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 21472, + 21464, 0, 16384, 20480, 21504, 21505, 21507, 21440, + 21472, 21473, 21468, 0, 16384, 20480, 21504, 21505, + 21507, 21440, 21472, 21473, 21468, 0, 16384, 20480, + 21504, 21505, 21507, 21440, 21472, 21473, 21468, 21470, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21472, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21472, 0, + 16384, 20480, 21504, 21505, 21507, 21440, 21472, 21474, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 21472, + 0, 16384, 20480, 21504, 21505, 21507, 21440, 21472, + 21476, 0, 16384, 20480, 21504, 21505, 21507, 21440, + 21472, 21476, 0, 16384, 20480, 21504, 21505, 21507, + 21440, 21472, 21480, 21478, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 21480, 0, 16384, 20480, + 21504, 21505, 21507, 21511, 21472, 21480, 0, 16384, + 20480, 21504, 21505, 21507, 21511, 21472, 21480, 21482, + 0, 16384, 20480, 21504, 21505, 21507, 21511, 21472, + 21480, 0, 16384, 20480, 21504, 21505, 21507, 21511, + 21472, 21488, 21484, 0, 16384, 20480, 21504, 21505, + 21507, 21511, 21472, 21488, 21484, 0, 16384, 20480, + 21504, 21505, 21507, 21511, 21472, 21488, 21489, 21486, + 0, 16384, 20480, 21504, 21505, 21507, 21511, 21472, + 0, 16384, 20480, 21504, 21505, 21507, 21511, 21472, + 21488, 0, 16384, 20480, 21504, 21505, 21507, 21511, + 21472, 21488, 0, 16384, 20480, 21504, 21505, 21507, + 21511, 21472, 21488, 21490, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 21488, 0, 16384, 20480, + 21504, 21505, 21507, 21511, 21472, 21488, 21492, 0, + 16384, 20480, 21504, 21505, 21507, 21511, 21472, 21488, + 21492, 0, 16384, 20480, 21504, 21505, 21507, 21511, + 21472, 21488, 21496, 21494, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 21488, 0, 16384, 20480, + 21504, 21505, 21507, 21511, 21472, 21488, 21496, 0, + 16384, 20480, 21504, 21505, 21507, 21511, 21472, 21488, + 21496, 0, 16384, 20480, 21504, 21505, 21507, 21511, + 21472, 21488, 21496, 21498, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 21488, 21496, 0, 16384, + 20480, 21504, 21505, 21507, 21511, 21472, 21488, 21496, + 21500, 0, 16384, 20480, 21504, 21505, 21507, 21511, + 21472, 21488, 21496, 21500, 0, 16384, 20480, 21504, + 21505, 21507, 21511, 21472, 21488, 21496, 21500, 21502, + 0, 16384, 20480, 0, 16384, 20480, 21504, 0, + 16384, 20480, 21504, 0, 16384, 20480, 21504, 21506, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21508, 0, 16384, 20480, 21504, 21508, 0, 16384, + 20480, 21504, 21512, 21510, 0, 16384, 20480, 21504, + 0, 16384, 20480, 21504, 21512, 0, 16384, 20480, + 21504, 21512, 0, 16384, 20480, 21504, 21512, 21514, + 0, 16384, 20480, 21504, 21512, 0, 16384, 20480, + 21504, 21520, 21516, 0, 16384, 20480, 21504, 21520, + 21516, 0, 16384, 20480, 21504, 21520, 21521, 21518, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21520, 0, 16384, 20480, 21504, 21520, 0, 16384, + 20480, 21504, 21520, 21522, 0, 16384, 20480, 21504, + 21520, 0, 16384, 20480, 21504, 21520, 21524, 0, + 16384, 20480, 21504, 21520, 21524, 0, 16384, 20480, + 21504, 21520, 21528, 21526, 0, 16384, 20480, 21504, + 21520, 0, 16384, 20480, 21504, 21536, 21528, 0, + 16384, 20480, 21504, 21536, 21528, 0, 16384, 20480, + 21504, 21536, 21528, 21530, 0, 16384, 20480, 21504, + 21536, 21528, 0, 16384, 20480, 21504, 21536, 21537, + 21532, 0, 16384, 20480, 21504, 21536, 21537, 21532, + 0, 16384, 20480, 21504, 21536, 21537, 21532, 21534, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21536, 0, 16384, 20480, 21504, 21536, 0, 16384, + 20480, 21504, 21536, 21538, 0, 16384, 20480, 21504, + 21536, 0, 16384, 20480, 21504, 21536, 21540, 0, + 16384, 20480, 21504, 21536, 21540, 0, 16384, 20480, + 21504, 21536, 21544, 21542, 0, 16384, 20480, 21504, + 21536, 0, 16384, 20480, 21504, 21536, 21544, 0, + 16384, 20480, 21504, 21536, 21544, 0, 16384, 20480, + 21504, 21536, 21544, 21546, 0, 16384, 20480, 21504, + 21536, 21544, 0, 16384, 20480, 21504, 21536, 21552, + 21548, 0, 16384, 20480, 21504, 21536, 21552, 21548, + 0, 16384, 20480, 21504, 21536, 21552, 21553, 21550, + 0, 16384, 20480, 21504, 21536, 0, 16384, 20480, + 21504, 21568, 21552, 0, 16384, 20480, 21504, 21568, + 21552, 0, 16384, 20480, 21504, 21568, 21552, 21554, + 0, 16384, 20480, 21504, 21568, 21552, 0, 16384, + 20480, 21504, 21568, 21552, 21556, 0, 16384, 20480, + 21504, 21568, 21552, 21556, 0, 16384, 20480, 21504, + 21568, 21552, 21560, 21558, 0, 16384, 20480, 21504, + 21568, 21552, 0, 16384, 20480, 21504, 21568, 21569, + 21560, 0, 16384, 20480, 21504, 21568, 21569, 21560, + 0, 16384, 20480, 21504, 21568, 21569, 21560, 21562, + 0, 16384, 20480, 21504, 21568, 21569, 21560, 0, + 16384, 20480, 21504, 21568, 21569, 21560, 21564, 0, + 16384, 20480, 21504, 21568, 21569, 21571, 21564, 0, + 16384, 20480, 21504, 21568, 21569, 21571, 21564, 21566, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21568, 0, 16384, 20480, 21504, 21568, 0, 16384, + 20480, 21504, 21568, 21570, 0, 16384, 20480, 21504, + 21568, 0, 16384, 20480, 21504, 21568, 21572, 0, + 16384, 20480, 21504, 21568, 21572, 0, 16384, 20480, + 21504, 21568, 21576, 21574, 0, 16384, 20480, 21504, + 21568, 0, 16384, 20480, 21504, 21568, 21576, 0, + 16384, 20480, 21504, 21568, 21576, 0, 16384, 20480, + 21504, 21568, 21576, 21578, 0, 16384, 20480, 21504, + 21568, 21576, 0, 16384, 20480, 21504, 21568, 21584, + 21580, 0, 16384, 20480, 21504, 21568, 21584, 21580, + 0, 16384, 20480, 21504, 21568, 21584, 21585, 21582, + 0, 16384, 20480, 21504, 21568, 0, 16384, 20480, + 21504, 21568, 21584, 0, 16384, 20480, 21504, 21568, + 21584, 0, 16384, 20480, 21504, 21568, 21584, 21586, + 0, 16384, 20480, 21504, 21568, 21584, 0, 16384, + 20480, 21504, 21568, 21584, 21588, 0, 16384, 20480, + 21504, 21568, 21584, 21588, 0, 16384, 20480, 21504, + 21568, 21584, 21592, 21590, 0, 16384, 20480, 21504, + 21568, 21584, 0, 16384, 20480, 21504, 21568, 21600, + 21592, 0, 16384, 20480, 21504, 21568, 21600, 21592, + 0, 16384, 20480, 21504, 21568, 21600, 21592, 21594, + 0, 16384, 20480, 21504, 21568, 21600, 21592, 0, + 16384, 20480, 21504, 21568, 21600, 21601, 21596, 0, + 16384, 20480, 21504, 21568, 21600, 21601, 21596, 0, + 16384, 20480, 21504, 21568, 21600, 21601, 21596, 21598, + 0, 16384, 20480, 21504, 21568, 0, 16384, 20480, + 21504, 21632, 21600, 0, 16384, 20480, 21504, 21632, + 21600, 0, 16384, 20480, 21504, 21632, 21600, 21602, + 0, 16384, 20480, 21504, 21632, 21600, 0, 16384, + 20480, 21504, 21632, 21600, 21604, 0, 16384, 20480, + 21504, 21632, 21600, 21604, 0, 16384, 20480, 21504, + 21632, 21600, 21608, 21606, 0, 16384, 20480, 21504, + 21632, 21600, 0, 16384, 20480, 21504, 21632, 21600, + 21608, 0, 16384, 20480, 21504, 21632, 21600, 21608, + 0, 16384, 20480, 21504, 21632, 21600, 21608, 21610, + 0, 16384, 20480, 21504, 21632, 21600, 21608, 0, + 16384, 20480, 21504, 21632, 21600, 21616, 21612, 0, + 16384, 20480, 21504, 21632, 21600, 21616, 21612, 0, + 16384, 20480, 21504, 21632, 21600, 21616, 21617, 21614, + 0, 16384, 20480, 21504, 21632, 21600, 0, 16384, + 20480, 21504, 21632, 21633, 21616, 0, 16384, 20480, + 21504, 21632, 21633, 21616, 0, 16384, 20480, 21504, + 21632, 21633, 21616, 21618, 0, 16384, 20480, 21504, + 21632, 21633, 21616, 0, 16384, 20480, 21504, 21632, + 21633, 21616, 21620, 0, 16384, 20480, 21504, 21632, + 21633, 21616, 21620, 0, 16384, 20480, 21504, 21632, + 21633, 21616, 21624, 21622, 0, 16384, 20480, 21504, + 21632, 21633, 21616, 0, 16384, 20480, 21504, 21632, + 21633, 21616, 21624, 0, 16384, 20480, 21504, 21632, + 21633, 21635, 21624, 0, 16384, 20480, 21504, 21632, + 21633, 21635, 21624, 21626, 0, 16384, 20480, 21504, + 21632, 21633, 21635, 21624, 0, 16384, 20480, 21504, + 21632, 21633, 21635, 21624, 21628, 0, 16384, 20480, + 21504, 21632, 21633, 21635, 21624, 21628, 0, 16384, + 20480, 21504, 21632, 21633, 21635, 21624, 21628, 21630, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21632, 0, 16384, 20480, 21504, 21632, 0, 16384, + 20480, 21504, 21632, 21634, 0, 16384, 20480, 21504, + 21632, 0, 16384, 20480, 21504, 21632, 21636, 0, + 16384, 20480, 21504, 21632, 21636, 0, 16384, 20480, + 21504, 21632, 21640, 21638, 0, 16384, 20480, 21504, + 21632, 0, 16384, 20480, 21504, 21632, 21640, 0, + 16384, 20480, 21504, 21632, 21640, 0, 16384, 20480, + 21504, 21632, 21640, 21642, 0, 16384, 20480, 21504, + 21632, 21640, 0, 16384, 20480, 21504, 21632, 21648, + 21644, 0, 16384, 20480, 21504, 21632, 21648, 21644, + 0, 16384, 20480, 21504, 21632, 21648, 21649, 21646, + 0, 16384, 20480, 21504, 21632, 0, 16384, 20480, + 21504, 21632, 21648, 0, 16384, 20480, 21504, 21632, + 21648, 0, 16384, 20480, 21504, 21632, 21648, 21650, + 0, 16384, 20480, 21504, 21632, 21648, 0, 16384, + 20480, 21504, 21632, 21648, 21652, 0, 16384, 20480, + 21504, 21632, 21648, 21652, 0, 16384, 20480, 21504, + 21632, 21648, 21656, 21654, 0, 16384, 20480, 21504, + 21632, 21648, 0, 16384, 20480, 21504, 21632, 21664, + 21656, 0, 16384, 20480, 21504, 21632, 21664, 21656, + 0, 16384, 20480, 21504, 21632, 21664, 21656, 21658, + 0, 16384, 20480, 21504, 21632, 21664, 21656, 0, + 16384, 20480, 21504, 21632, 21664, 21665, 21660, 0, + 16384, 20480, 21504, 21632, 21664, 21665, 21660, 0, + 16384, 20480, 21504, 21632, 21664, 21665, 21660, 21662, + 0, 16384, 20480, 21504, 21632, 0, 16384, 20480, + 21504, 21632, 21664, 0, 16384, 20480, 21504, 21632, + 21664, 0, 16384, 20480, 21504, 21632, 21664, 21666, + 0, 16384, 20480, 21504, 21632, 21664, 0, 16384, + 20480, 21504, 21632, 21664, 21668, 0, 16384, 20480, + 21504, 21632, 21664, 21668, 0, 16384, 20480, 21504, + 21632, 21664, 21672, 21670, 0, 16384, 20480, 21504, + 21632, 21664, 0, 16384, 20480, 21504, 21632, 21664, + 21672, 0, 16384, 20480, 21504, 21632, 21664, 21672, + 0, 16384, 20480, 21504, 21632, 21664, 21672, 21674, + 0, 16384, 20480, 21504, 21632, 21664, 21672, 0, + 16384, 20480, 21504, 21632, 21664, 21680, 21676, 0, + 16384, 20480, 21504, 21632, 21664, 21680, 21676, 0, + 16384, 20480, 21504, 21632, 21664, 21680, 21681, 21678, + 0, 16384, 20480, 21504, 21632, 21664, 0, 16384, + 20480, 21504, 21632, 21696, 21680, 0, 16384, 20480, + 21504, 21632, 21696, 21680, 0, 16384, 20480, 21504, + 21632, 21696, 21680, 21682, 0, 16384, 20480, 21504, + 21632, 21696, 21680, 0, 16384, 20480, 21504, 21632, + 21696, 21680, 21684, 0, 16384, 20480, 21504, 21632, + 21696, 21680, 21684, 0, 16384, 20480, 21504, 21632, + 21696, 21680, 21688, 21686, 0, 16384, 20480, 21504, + 21632, 21696, 21680, 0, 16384, 20480, 21504, 21632, + 21696, 21697, 21688, 0, 16384, 20480, 21504, 21632, + 21696, 21697, 21688, 0, 16384, 20480, 21504, 21632, + 21696, 21697, 21688, 21690, 0, 16384, 20480, 21504, + 21632, 21696, 21697, 21688, 0, 16384, 20480, 21504, + 21632, 21696, 21697, 21688, 21692, 0, 16384, 20480, + 21504, 21632, 21696, 21697, 21699, 21692, 0, 16384, + 20480, 21504, 21632, 21696, 21697, 21699, 21692, 21694, + 0, 16384, 20480, 21504, 21632, 0, 16384, 20480, + 21504, 21760, 21696, 0, 16384, 20480, 21504, 21760, + 21696, 0, 16384, 20480, 21504, 21760, 21696, 21698, + 0, 16384, 20480, 21504, 21760, 21696, 0, 16384, + 20480, 21504, 21760, 21696, 21700, 0, 16384, 20480, + 21504, 21760, 21696, 21700, 0, 16384, 20480, 21504, + 21760, 21696, 21704, 21702, 0, 16384, 20480, 21504, + 21760, 21696, 0, 16384, 20480, 21504, 21760, 21696, + 21704, 0, 16384, 20480, 21504, 21760, 21696, 21704, + 0, 16384, 20480, 21504, 21760, 21696, 21704, 21706, + 0, 16384, 20480, 21504, 21760, 21696, 21704, 0, + 16384, 20480, 21504, 21760, 21696, 21712, 21708, 0, + 16384, 20480, 21504, 21760, 21696, 21712, 21708, 0, + 16384, 20480, 21504, 21760, 21696, 21712, 21713, 21710, + 0, 16384, 20480, 21504, 21760, 21696, 0, 16384, + 20480, 21504, 21760, 21696, 21712, 0, 16384, 20480, + 21504, 21760, 21696, 21712, 0, 16384, 20480, 21504, + 21760, 21696, 21712, 21714, 0, 16384, 20480, 21504, + 21760, 21696, 21712, 0, 16384, 20480, 21504, 21760, + 21696, 21712, 21716, 0, 16384, 20480, 21504, 21760, + 21696, 21712, 21716, 0, 16384, 20480, 21504, 21760, + 21696, 21712, 21720, 21718, 0, 16384, 20480, 21504, + 21760, 21696, 21712, 0, 16384, 20480, 21504, 21760, + 21696, 21728, 21720, 0, 16384, 20480, 21504, 21760, + 21696, 21728, 21720, 0, 16384, 20480, 21504, 21760, + 21696, 21728, 21720, 21722, 0, 16384, 20480, 21504, + 21760, 21696, 21728, 21720, 0, 16384, 20480, 21504, + 21760, 21696, 21728, 21729, 21724, 0, 16384, 20480, + 21504, 21760, 21696, 21728, 21729, 21724, 0, 16384, + 20480, 21504, 21760, 21696, 21728, 21729, 21724, 21726, + 0, 16384, 20480, 21504, 21760, 21696, 0, 16384, + 20480, 21504, 21760, 21761, 21728, 0, 16384, 20480, + 21504, 21760, 21761, 21728, 0, 16384, 20480, 21504, + 21760, 21761, 21728, 21730, 0, 16384, 20480, 21504, + 21760, 21761, 21728, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21732, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21732, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21736, 21734, 0, 16384, 20480, 21504, + 21760, 21761, 21728, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21736, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21736, 0, 16384, 20480, 21504, 21760, + 21761, 21728, 21736, 21738, 0, 16384, 20480, 21504, + 21760, 21761, 21728, 21736, 0, 16384, 20480, 21504, + 21760, 21761, 21728, 21744, 21740, 0, 16384, 20480, + 21504, 21760, 21761, 21728, 21744, 21740, 0, 16384, + 20480, 21504, 21760, 21761, 21728, 21744, 21745, 21742, + 0, 16384, 20480, 21504, 21760, 21761, 21728, 0, + 16384, 20480, 21504, 21760, 21761, 21728, 21744, 0, + 16384, 20480, 21504, 21760, 21761, 21763, 21744, 0, + 16384, 20480, 21504, 21760, 21761, 21763, 21744, 21746, + 0, 16384, 20480, 21504, 21760, 21761, 21763, 21744, + 0, 16384, 20480, 21504, 21760, 21761, 21763, 21744, + 21748, 0, 16384, 20480, 21504, 21760, 21761, 21763, + 21744, 21748, 0, 16384, 20480, 21504, 21760, 21761, + 21763, 21744, 21752, 21750, 0, 16384, 20480, 21504, + 21760, 21761, 21763, 21744, 0, 16384, 20480, 21504, + 21760, 21761, 21763, 21744, 21752, 0, 16384, 20480, + 21504, 21760, 21761, 21763, 21744, 21752, 0, 16384, + 20480, 21504, 21760, 21761, 21763, 21744, 21752, 21754, + 0, 16384, 20480, 21504, 21760, 21761, 21763, 21767, + 21752, 0, 16384, 20480, 21504, 21760, 21761, 21763, + 21767, 21752, 21756, 0, 16384, 20480, 21504, 21760, + 21761, 21763, 21767, 21752, 21756, 0, 16384, 20480, + 21504, 21760, 21761, 21763, 21767, 21752, 21756, 21758, + 0, 16384, 20480, 21504, 0, 16384, 20480, 21504, + 21760, 0, 16384, 20480, 21504, 21760, 0, 16384, + 20480, 21504, 21760, 21762, 0, 16384, 20480, 21504, + 21760, 0, 16384, 20480, 21504, 21760, 21764, 0, + 16384, 20480, 21504, 21760, 21764, 0, 16384, 20480, + 21504, 21760, 21768, 21766, 0, 16384, 20480, 21504, + 21760, 0, 16384, 20480, 21504, 21760, 21768, 0, + 16384, 20480, 21504, 21760, 21768, 0, 16384, 20480, + 21504, 21760, 21768, 21770, 0, 16384, 20480, 21504, + 21760, 21768, 0, 16384, 20480, 21504, 21760, 21776, + 21772, 0, 16384, 20480, 21504, 21760, 21776, 21772, + 0, 16384, 20480, 21504, 21760, 21776, 21777, 21774, + 0, 16384, 20480, 21504, 21760, 0, 16384, 20480, + 21504, 21760, 21776, 0, 16384, 20480, 21504, 21760, + 21776, 0, 16384, 20480, 21504, 21760, 21776, 21778, + 0, 16384, 20480, 21504, 21760, 21776, 0, 16384, + 20480, 21504, 21760, 21776, 21780, 0, 16384, 20480, + 21504, 21760, 21776, 21780, 0, 16384, 20480, 21504, + 21760, 21776, 21784, 21782, 0, 16384, 20480, 21504, + 21760, 21776, 0, 16384, 20480, 21504, 21760, 21792, + 21784, 0, 16384, 20480, 21504, 21760, 21792, 21784, + 0, 16384, 20480, 21504, 21760, 21792, 21784, 21786, + 0, 16384, 20480, 21504, 21760, 21792, 21784, 0, + 16384, 20480, 21504, 21760, 21792, 21793, 21788, 0, + 16384, 20480, 21504, 21760, 21792, 21793, 21788, 0, + 16384, 20480, 21504, 21760, 21792, 21793, 21788, 21790, + 0, 16384, 20480, 21504, 21760, 0, 16384, 20480, + 21504, 21760, 21792, 0, 16384, 20480, 21504, 21760, + 21792, 0, 16384, 20480, 21504, 21760, 21792, 21794, + 0, 16384, 20480, 21504, 21760, 21792, 0, 16384, + 20480, 21504, 21760, 21792, 21796, 0, 16384, 20480, + 21504, 21760, 21792, 21796, 0, 16384, 20480, 21504, + 21760, 21792, 21800, 21798, 0, 16384, 20480, 21504, + 21760, 21792, 0, 16384, 20480, 21504, 21760, 21792, + 21800, 0, 16384, 20480, 21504, 21760, 21792, 21800, + 0, 16384, 20480, 21504, 21760, 21792, 21800, 21802, + 0, 16384, 20480, 21504, 21760, 21792, 21800, 0, + 16384, 20480, 21504, 21760, 21792, 21808, 21804, 0, + 16384, 20480, 21504, 21760, 21792, 21808, 21804, 0, + 16384, 20480, 21504, 21760, 21792, 21808, 21809, 21806, + 0, 16384, 20480, 21504, 21760, 21792, 0, 16384, + 20480, 21504, 21760, 21824, 21808, 0, 16384, 20480, + 21504, 21760, 21824, 21808, 0, 16384, 20480, 21504, + 21760, 21824, 21808, 21810, 0, 16384, 20480, 21504, + 21760, 21824, 21808, 0, 16384, 20480, 21504, 21760, + 21824, 21808, 21812, 0, 16384, 20480, 21504, 21760, + 21824, 21808, 21812, 0, 16384, 20480, 21504, 21760, + 21824, 21808, 21816, 21814, 0, 16384, 20480, 21504, + 21760, 21824, 21808, 0, 16384, 20480, 21504, 21760, + 21824, 21825, 21816, 0, 16384, 20480, 21504, 21760, + 21824, 21825, 21816, 0, 16384, 20480, 21504, 21760, + 21824, 21825, 21816, 21818, 0, 16384, 20480, 21504, + 21760, 21824, 21825, 21816, 0, 16384, 20480, 21504, + 21760, 21824, 21825, 21816, 21820, 0, 16384, 20480, + 21504, 21760, 21824, 21825, 21827, 21820, 0, 16384, + 20480, 21504, 21760, 21824, 21825, 21827, 21820, 21822, + 0, 16384, 20480, 21504, 21760, 0, 16384, 20480, + 21504, 21760, 21824, 0, 16384, 20480, 21504, 21760, + 21824, 0, 16384, 20480, 21504, 21760, 21824, 21826, + 0, 16384, 20480, 21504, 21760, 21824, 0, 16384, + 20480, 21504, 21760, 21824, 21828, 0, 16384, 20480, + 21504, 21760, 21824, 21828, 0, 16384, 20480, 21504, + 21760, 21824, 21832, 21830, 0, 16384, 20480, 21504, + 21760, 21824, 0, 16384, 20480, 21504, 21760, 21824, + 21832, 0, 16384, 20480, 21504, 21760, 21824, 21832, + 0, 16384, 20480, 21504, 21760, 21824, 21832, 21834, + 0, 16384, 20480, 21504, 21760, 21824, 21832, 0, + 16384, 20480, 21504, 21760, 21824, 21840, 21836, 0, + 16384, 20480, 21504, 21760, 21824, 21840, 21836, 0, + 16384, 20480, 21504, 21760, 21824, 21840, 21841, 21838, + 0, 16384, 20480, 21504, 21760, 21824, 0, 16384, + 20480, 21504, 21760, 21824, 21840, 0, 16384, 20480, + 21504, 21760, 21824, 21840, 0, 16384, 20480, 21504, + 21760, 21824, 21840, 21842, 0, 16384, 20480, 21504, + 21760, 21824, 21840, 0, 16384, 20480, 21504, 21760, + 21824, 21840, 21844, 0, 16384, 20480, 21504, 21760, + 21824, 21840, 21844, 0, 16384, 20480, 21504, 21760, + 21824, 21840, 21848, 21846, 0, 16384, 20480, 21504, + 21760, 21824, 21840, 0, 16384, 20480, 21504, 21760, + 21824, 21856, 21848, 0, 16384, 20480, 21504, 21760, + 21824, 21856, 21848, 0, 16384, 20480, 21504, 21760, + 21824, 21856, 21848, 21850, 0, 16384, 20480, 21504, + 21760, 21824, 21856, 21848, 0, 16384, 20480, 21504, + 21760, 21824, 21856, 21857, 21852, 0, 16384, 20480, + 21504, 21760, 21824, 21856, 21857, 21852, 0, 16384, + 20480, 21504, 21760, 21824, 21856, 21857, 21852, 21854, + 0, 16384, 20480, 21504, 21760, 21824, 0, 16384, + 20480, 21504, 21760, 21888, 21856, 0, 16384, 20480, + 21504, 21760, 21888, 21856, 0, 16384, 20480, 21504, + 21760, 21888, 21856, 21858, 0, 16384, 20480, 21504, + 21760, 21888, 21856, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21860, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21860, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21864, 21862, 0, 16384, 20480, 21504, + 21760, 21888, 21856, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21864, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21864, 0, 16384, 20480, 21504, 21760, + 21888, 21856, 21864, 21866, 0, 16384, 20480, 21504, + 21760, 21888, 21856, 21864, 0, 16384, 20480, 21504, + 21760, 21888, 21856, 21872, 21868, 0, 16384, 20480, + 21504, 21760, 21888, 21856, 21872, 21868, 0, 16384, + 20480, 21504, 21760, 21888, 21856, 21872, 21873, 21870, + 0, 16384, 20480, 21504, 21760, 21888, 21856, 0, + 16384, 20480, 21504, 21760, 21888, 21889, 21872, 0, + 16384, 20480, 21504, 21760, 21888, 21889, 21872, 0, + 16384, 20480, 21504, 21760, 21888, 21889, 21872, 21874, + 0, 16384, 20480, 21504, 21760, 21888, 21889, 21872, + 0, 16384, 20480, 21504, 21760, 21888, 21889, 21872, + 21876, 0, 16384, 20480, 21504, 21760, 21888, 21889, + 21872, 21876, 0, 16384, 20480, 21504, 21760, 21888, + 21889, 21872, 21880, 21878, 0, 16384, 20480, 21504, + 21760, 21888, 21889, 21872, 0, 16384, 20480, 21504, + 21760, 21888, 21889, 21872, 21880, 0, 16384, 20480, + 21504, 21760, 21888, 21889, 21891, 21880, 0, 16384, + 20480, 21504, 21760, 21888, 21889, 21891, 21880, 21882, + 0, 16384, 20480, 21504, 21760, 21888, 21889, 21891, + 21880, 0, 16384, 20480, 21504, 21760, 21888, 21889, + 21891, 21880, 21884, 0, 16384, 20480, 21504, 21760, + 21888, 21889, 21891, 21880, 21884, 0, 16384, 20480, + 21504, 21760, 21888, 21889, 21891, 21880, 21884, 21886, + 0, 16384, 20480, 21504, 21760, 0, 16384, 20480, + 21504, 22016, 21888, 0, 16384, 20480, 21504, 22016, + 21888, 0, 16384, 20480, 21504, 22016, 21888, 21890, + 0, 16384, 20480, 21504, 22016, 21888, 0, 16384, + 20480, 21504, 22016, 21888, 21892, 0, 16384, 20480, + 21504, 22016, 21888, 21892, 0, 16384, 20480, 21504, + 22016, 21888, 21896, 21894, 0, 16384, 20480, 21504, + 22016, 21888, 0, 16384, 20480, 21504, 22016, 21888, + 21896, 0, 16384, 20480, 21504, 22016, 21888, 21896, + 0, 16384, 20480, 21504, 22016, 21888, 21896, 21898, + 0, 16384, 20480, 21504, 22016, 21888, 21896, 0, + 16384, 20480, 21504, 22016, 21888, 21904, 21900, 0, + 16384, 20480, 21504, 22016, 21888, 21904, 21900, 0, + 16384, 20480, 21504, 22016, 21888, 21904, 21905, 21902, + 0, 16384, 20480, 21504, 22016, 21888, 0, 16384, + 20480, 21504, 22016, 21888, 21904, 0, 16384, 20480, + 21504, 22016, 21888, 21904, 0, 16384, 20480, 21504, + 22016, 21888, 21904, 21906, 0, 16384, 20480, 21504, + 22016, 21888, 21904, 0, 16384, 20480, 21504, 22016, + 21888, 21904, 21908, 0, 16384, 20480, 21504, 22016, + 21888, 21904, 21908, 0, 16384, 20480, 21504, 22016, + 21888, 21904, 21912, 21910, 0, 16384, 20480, 21504, + 22016, 21888, 21904, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21912, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21912, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21912, 21914, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 21912, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 21921, 21916, 0, 16384, 20480, + 21504, 22016, 21888, 21920, 21921, 21916, 0, 16384, + 20480, 21504, 22016, 21888, 21920, 21921, 21916, 21918, + 0, 16384, 20480, 21504, 22016, 21888, 0, 16384, + 20480, 21504, 22016, 21888, 21920, 0, 16384, 20480, + 21504, 22016, 21888, 21920, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 21922, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21924, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21924, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21928, 21926, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21928, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21928, 0, 16384, 20480, 21504, 22016, + 21888, 21920, 21928, 21930, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 21928, 0, 16384, 20480, 21504, + 22016, 21888, 21920, 21936, 21932, 0, 16384, 20480, + 21504, 22016, 21888, 21920, 21936, 21932, 0, 16384, + 20480, 21504, 22016, 21888, 21920, 21936, 21937, 21934, + 0, 16384, 20480, 21504, 22016, 21888, 21920, 0, + 16384, 20480, 21504, 22016, 21888, 21952, 21936, 0, + 16384, 20480, 21504, 22016, 21888, 21952, 21936, 0, + 16384, 20480, 21504, 22016, 21888, 21952, 21936, 21938, + 0, 16384, 20480, 21504, 22016, 21888, 21952, 21936, + 0, 16384, 20480, 21504, 22016, 21888, 21952, 21936, + 21940, 0, 16384, 20480, 21504, 22016, 21888, 21952, + 21936, 21940, 0, 16384, 20480, 21504, 22016, 21888, + 21952, 21936, 21944, 21942, 0, 16384, 20480, 21504, + 22016, 21888, 21952, 21936, 0, 16384, 20480, 21504, + 22016, 21888, 21952, 21953, 21944, 0, 16384, 20480, + 21504, 22016, 21888, 21952, 21953, 21944, 0, 16384, + 20480, 21504, 22016, 21888, 21952, 21953, 21944, 21946, + 0, 16384, 20480, 21504, 22016, 21888, 21952, 21953, + 21944, 0, 16384, 20480, 21504, 22016, 21888, 21952, + 21953, 21944, 21948, 0, 16384, 20480, 21504, 22016, + 21888, 21952, 21953, 21955, 21948, 0, 16384, 20480, + 21504, 22016, 21888, 21952, 21953, 21955, 21948, 21950, + 0, 16384, 20480, 21504, 22016, 21888, 0, 16384, + 20480, 21504, 22016, 22017, 21952, 0, 16384, 20480, + 21504, 22016, 22017, 21952, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 21954, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21956, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21956, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21960, 21958, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21960, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21960, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21960, 21962, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 21960, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 21968, 21964, 0, 16384, 20480, + 21504, 22016, 22017, 21952, 21968, 21964, 0, 16384, + 20480, 21504, 22016, 22017, 21952, 21968, 21969, 21966, + 0, 16384, 20480, 21504, 22016, 22017, 21952, 0, + 16384, 20480, 21504, 22016, 22017, 21952, 21968, 0, + 16384, 20480, 21504, 22016, 22017, 21952, 21968, 0, + 16384, 20480, 21504, 22016, 22017, 21952, 21968, 21970, + 0, 16384, 20480, 21504, 22016, 22017, 21952, 21968, + 0, 16384, 20480, 21504, 22016, 22017, 21952, 21968, + 21972, 0, 16384, 20480, 21504, 22016, 22017, 21952, + 21968, 21972, 0, 16384, 20480, 21504, 22016, 22017, + 21952, 21968, 21976, 21974, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 21968, 0, 16384, 20480, 21504, + 22016, 22017, 21952, 21984, 21976, 0, 16384, 20480, + 21504, 22016, 22017, 21952, 21984, 21976, 0, 16384, + 20480, 21504, 22016, 22017, 21952, 21984, 21976, 21978, + 0, 16384, 20480, 21504, 22016, 22017, 21952, 21984, + 21976, 0, 16384, 20480, 21504, 22016, 22017, 21952, + 21984, 21985, 21980, 0, 16384, 20480, 21504, 22016, + 22017, 21952, 21984, 21985, 21980, 0, 16384, 20480, + 21504, 22016, 22017, 21952, 21984, 21985, 21980, 21982, + 0, 16384, 20480, 21504, 22016, 22017, 21952, 0, + 16384, 20480, 21504, 22016, 22017, 21952, 21984, 0, + 16384, 20480, 21504, 22016, 22017, 22019, 21984, 0, + 16384, 20480, 21504, 22016, 22017, 22019, 21984, 21986, + 0, 16384, 20480, 21504, 22016, 22017, 22019, 21984, + 0, 16384, 20480, 21504, 22016, 22017, 22019, 21984, + 21988, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 21984, 21988, 0, 16384, 20480, 21504, 22016, 22017, + 22019, 21984, 21992, 21990, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 21984, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 21984, 21992, 0, 16384, 20480, + 21504, 22016, 22017, 22019, 21984, 21992, 0, 16384, + 20480, 21504, 22016, 22017, 22019, 21984, 21992, 21994, + 0, 16384, 20480, 21504, 22016, 22017, 22019, 21984, + 21992, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 21984, 22000, 21996, 0, 16384, 20480, 21504, 22016, + 22017, 22019, 21984, 22000, 21996, 0, 16384, 20480, + 21504, 22016, 22017, 22019, 21984, 22000, 22001, 21998, + 0, 16384, 20480, 21504, 22016, 22017, 22019, 21984, + 0, 16384, 20480, 21504, 22016, 22017, 22019, 21984, + 22000, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 21984, 22000, 0, 16384, 20480, 21504, 22016, 22017, + 22019, 21984, 22000, 22002, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 22023, 22000, 0, 16384, 20480, + 21504, 22016, 22017, 22019, 22023, 22000, 22004, 0, + 16384, 20480, 21504, 22016, 22017, 22019, 22023, 22000, + 22004, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 22023, 22000, 22008, 22006, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 22023, 22000, 0, 16384, 20480, + 21504, 22016, 22017, 22019, 22023, 22000, 22008, 0, + 16384, 20480, 21504, 22016, 22017, 22019, 22023, 22000, + 22008, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 22023, 22000, 22008, 22010, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 22023, 22000, 22008, 0, 16384, + 20480, 21504, 22016, 22017, 22019, 22023, 22000, 22008, + 22012, 0, 16384, 20480, 21504, 22016, 22017, 22019, + 22023, 22000, 22008, 22012, 0, 16384, 20480, 21504, + 22016, 22017, 22019, 22023, 22000, 22008, 22012, 22014, + 0, 16384, 20480, 21504, 0, 16384, 20480, 22528, + 22016, 0, 16384, 20480, 22528, 22016, 0, 16384, + 20480, 22528, 22016, 22018, 0, 16384, 20480, 22528, + 22016, 0, 16384, 20480, 22528, 22016, 22020, 0, + 16384, 20480, 22528, 22016, 22020, 0, 16384, 20480, + 22528, 22016, 22024, 22022, 0, 16384, 20480, 22528, + 22016, 0, 16384, 20480, 22528, 22016, 22024, 0, + 16384, 20480, 22528, 22016, 22024, 0, 16384, 20480, + 22528, 22016, 22024, 22026, 0, 16384, 20480, 22528, + 22016, 22024, 0, 16384, 20480, 22528, 22016, 22032, + 22028, 0, 16384, 20480, 22528, 22016, 22032, 22028, + 0, 16384, 20480, 22528, 22016, 22032, 22033, 22030, + 0, 16384, 20480, 22528, 22016, 0, 16384, 20480, + 22528, 22016, 22032, 0, 16384, 20480, 22528, 22016, + 22032, 0, 16384, 20480, 22528, 22016, 22032, 22034, + 0, 16384, 20480, 22528, 22016, 22032, 0, 16384, + 20480, 22528, 22016, 22032, 22036, 0, 16384, 20480, + 22528, 22016, 22032, 22036, 0, 16384, 20480, 22528, + 22016, 22032, 22040, 22038, 0, 16384, 20480, 22528, + 22016, 22032, 0, 16384, 20480, 22528, 22016, 22048, + 22040, 0, 16384, 20480, 22528, 22016, 22048, 22040, + 0, 16384, 20480, 22528, 22016, 22048, 22040, 22042, + 0, 16384, 20480, 22528, 22016, 22048, 22040, 0, + 16384, 20480, 22528, 22016, 22048, 22049, 22044, 0, + 16384, 20480, 22528, 22016, 22048, 22049, 22044, 0, + 16384, 20480, 22528, 22016, 22048, 22049, 22044, 22046, + 0, 16384, 20480, 22528, 22016, 0, 16384, 20480, + 22528, 22016, 22048, 0, 16384, 20480, 22528, 22016, + 22048, 0, 16384, 20480, 22528, 22016, 22048, 22050, + 0, 16384, 20480, 22528, 22016, 22048, 0, 16384, + 20480, 22528, 22016, 22048, 22052, 0, 16384, 20480, + 22528, 22016, 22048, 22052, 0, 16384, 20480, 22528, + 22016, 22048, 22056, 22054, 0, 16384, 20480, 22528, + 22016, 22048, 0, 16384, 20480, 22528, 22016, 22048, + 22056, 0, 16384, 20480, 22528, 22016, 22048, 22056, + 0, 16384, 20480, 22528, 22016, 22048, 22056, 22058, + 0, 16384, 20480, 22528, 22016, 22048, 22056, 0, + 16384, 20480, 22528, 22016, 22048, 22064, 22060, 0, + 16384, 20480, 22528, 22016, 22048, 22064, 22060, 0, + 16384, 20480, 22528, 22016, 22048, 22064, 22065, 22062, + 0, 16384, 20480, 22528, 22016, 22048, 0, 16384, + 20480, 22528, 22016, 22080, 22064, 0, 16384, 20480, + 22528, 22016, 22080, 22064, 0, 16384, 20480, 22528, + 22016, 22080, 22064, 22066, 0, 16384, 20480, 22528, + 22016, 22080, 22064, 0, 16384, 20480, 22528, 22016, + 22080, 22064, 22068, 0, 16384, 20480, 22528, 22016, + 22080, 22064, 22068, 0, 16384, 20480, 22528, 22016, + 22080, 22064, 22072, 22070, 0, 16384, 20480, 22528, + 22016, 22080, 22064, 0, 16384, 20480, 22528, 22016, + 22080, 22081, 22072, 0, 16384, 20480, 22528, 22016, + 22080, 22081, 22072, 0, 16384, 20480, 22528, 22016, + 22080, 22081, 22072, 22074, 0, 16384, 20480, 22528, + 22016, 22080, 22081, 22072, 0, 16384, 20480, 22528, + 22016, 22080, 22081, 22072, 22076, 0, 16384, 20480, + 22528, 22016, 22080, 22081, 22083, 22076, 0, 16384, + 20480, 22528, 22016, 22080, 22081, 22083, 22076, 22078, + 0, 16384, 20480, 22528, 22016, 0, 16384, 20480, + 22528, 22016, 22080, 0, 16384, 20480, 22528, 22016, + 22080, 0, 16384, 20480, 22528, 22016, 22080, 22082, + 0, 16384, 20480, 22528, 22016, 22080, 0, 16384, + 20480, 22528, 22016, 22080, 22084, 0, 16384, 20480, + 22528, 22016, 22080, 22084, 0, 16384, 20480, 22528, + 22016, 22080, 22088, 22086, 0, 16384, 20480, 22528, + 22016, 22080, 0, 16384, 20480, 22528, 22016, 22080, + 22088, 0, 16384, 20480, 22528, 22016, 22080, 22088, + 0, 16384, 20480, 22528, 22016, 22080, 22088, 22090, + 0, 16384, 20480, 22528, 22016, 22080, 22088, 0, + 16384, 20480, 22528, 22016, 22080, 22096, 22092, 0, + 16384, 20480, 22528, 22016, 22080, 22096, 22092, 0, + 16384, 20480, 22528, 22016, 22080, 22096, 22097, 22094, + 0, 16384, 20480, 22528, 22016, 22080, 0, 16384, + 20480, 22528, 22016, 22080, 22096, 0, 16384, 20480, + 22528, 22016, 22080, 22096, 0, 16384, 20480, 22528, + 22016, 22080, 22096, 22098, 0, 16384, 20480, 22528, + 22016, 22080, 22096, 0, 16384, 20480, 22528, 22016, + 22080, 22096, 22100, 0, 16384, 20480, 22528, 22016, + 22080, 22096, 22100, 0, 16384, 20480, 22528, 22016, + 22080, 22096, 22104, 22102, 0, 16384, 20480, 22528, + 22016, 22080, 22096, 0, 16384, 20480, 22528, 22016, + 22080, 22112, 22104, 0, 16384, 20480, 22528, 22016, + 22080, 22112, 22104, 0, 16384, 20480, 22528, 22016, + 22080, 22112, 22104, 22106, 0, 16384, 20480, 22528, + 22016, 22080, 22112, 22104, 0, 16384, 20480, 22528, + 22016, 22080, 22112, 22113, 22108, 0, 16384, 20480, + 22528, 22016, 22080, 22112, 22113, 22108, 0, 16384, + 20480, 22528, 22016, 22080, 22112, 22113, 22108, 22110, + 0, 16384, 20480, 22528, 22016, 22080, 0, 16384, + 20480, 22528, 22016, 22144, 22112, 0, 16384, 20480, + 22528, 22016, 22144, 22112, 0, 16384, 20480, 22528, + 22016, 22144, 22112, 22114, 0, 16384, 20480, 22528, + 22016, 22144, 22112, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22116, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22116, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22120, 22118, 0, 16384, 20480, 22528, + 22016, 22144, 22112, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22120, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22120, 0, 16384, 20480, 22528, 22016, + 22144, 22112, 22120, 22122, 0, 16384, 20480, 22528, + 22016, 22144, 22112, 22120, 0, 16384, 20480, 22528, + 22016, 22144, 22112, 22128, 22124, 0, 16384, 20480, + 22528, 22016, 22144, 22112, 22128, 22124, 0, 16384, + 20480, 22528, 22016, 22144, 22112, 22128, 22129, 22126, + 0, 16384, 20480, 22528, 22016, 22144, 22112, 0, + 16384, 20480, 22528, 22016, 22144, 22145, 22128, 0, + 16384, 20480, 22528, 22016, 22144, 22145, 22128, 0, + 16384, 20480, 22528, 22016, 22144, 22145, 22128, 22130, + 0, 16384, 20480, 22528, 22016, 22144, 22145, 22128, + 0, 16384, 20480, 22528, 22016, 22144, 22145, 22128, + 22132, 0, 16384, 20480, 22528, 22016, 22144, 22145, + 22128, 22132, 0, 16384, 20480, 22528, 22016, 22144, + 22145, 22128, 22136, 22134, 0, 16384, 20480, 22528, + 22016, 22144, 22145, 22128, 0, 16384, 20480, 22528, + 22016, 22144, 22145, 22128, 22136, 0, 16384, 20480, + 22528, 22016, 22144, 22145, 22147, 22136, 0, 16384, + 20480, 22528, 22016, 22144, 22145, 22147, 22136, 22138, + 0, 16384, 20480, 22528, 22016, 22144, 22145, 22147, + 22136, 0, 16384, 20480, 22528, 22016, 22144, 22145, + 22147, 22136, 22140, 0, 16384, 20480, 22528, 22016, + 22144, 22145, 22147, 22136, 22140, 0, 16384, 20480, + 22528, 22016, 22144, 22145, 22147, 22136, 22140, 22142, + 0, 16384, 20480, 22528, 22016, 0, 16384, 20480, + 22528, 22016, 22144, 0, 16384, 20480, 22528, 22016, + 22144, 0, 16384, 20480, 22528, 22016, 22144, 22146, + 0, 16384, 20480, 22528, 22016, 22144, 0, 16384, + 20480, 22528, 22016, 22144, 22148, 0, 16384, 20480, + 22528, 22016, 22144, 22148, 0, 16384, 20480, 22528, + 22016, 22144, 22152, 22150, 0, 16384, 20480, 22528, + 22016, 22144, 0, 16384, 20480, 22528, 22016, 22144, + 22152, 0, 16384, 20480, 22528, 22016, 22144, 22152, + 0, 16384, 20480, 22528, 22016, 22144, 22152, 22154, + 0, 16384, 20480, 22528, 22016, 22144, 22152, 0, + 16384, 20480, 22528, 22016, 22144, 22160, 22156, 0, + 16384, 20480, 22528, 22016, 22144, 22160, 22156, 0, + 16384, 20480, 22528, 22016, 22144, 22160, 22161, 22158, + 0, 16384, 20480, 22528, 22016, 22144, 0, 16384, + 20480, 22528, 22016, 22144, 22160, 0, 16384, 20480, + 22528, 22016, 22144, 22160, 0, 16384, 20480, 22528, + 22016, 22144, 22160, 22162, 0, 16384, 20480, 22528, + 22016, 22144, 22160, 0, 16384, 20480, 22528, 22016, + 22144, 22160, 22164, 0, 16384, 20480, 22528, 22016, + 22144, 22160, 22164, 0, 16384, 20480, 22528, 22016, + 22144, 22160, 22168, 22166, 0, 16384, 20480, 22528, + 22016, 22144, 22160, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22168, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22168, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22168, 22170, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 22168, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 22177, 22172, 0, 16384, 20480, + 22528, 22016, 22144, 22176, 22177, 22172, 0, 16384, + 20480, 22528, 22016, 22144, 22176, 22177, 22172, 22174, + 0, 16384, 20480, 22528, 22016, 22144, 0, 16384, + 20480, 22528, 22016, 22144, 22176, 0, 16384, 20480, + 22528, 22016, 22144, 22176, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 22178, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22180, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22180, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22184, 22182, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22184, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22184, 0, 16384, 20480, 22528, 22016, + 22144, 22176, 22184, 22186, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 22184, 0, 16384, 20480, 22528, + 22016, 22144, 22176, 22192, 22188, 0, 16384, 20480, + 22528, 22016, 22144, 22176, 22192, 22188, 0, 16384, + 20480, 22528, 22016, 22144, 22176, 22192, 22193, 22190, + 0, 16384, 20480, 22528, 22016, 22144, 22176, 0, + 16384, 20480, 22528, 22016, 22144, 22208, 22192, 0, + 16384, 20480, 22528, 22016, 22144, 22208, 22192, 0, + 16384, 20480, 22528, 22016, 22144, 22208, 22192, 22194, + 0, 16384, 20480, 22528, 22016, 22144, 22208, 22192, + 0, 16384, 20480, 22528, 22016, 22144, 22208, 22192, + 22196, 0, 16384, 20480, 22528, 22016, 22144, 22208, + 22192, 22196, 0, 16384, 20480, 22528, 22016, 22144, + 22208, 22192, 22200, 22198, 0, 16384, 20480, 22528, + 22016, 22144, 22208, 22192, 0, 16384, 20480, 22528, + 22016, 22144, 22208, 22209, 22200, 0, 16384, 20480, + 22528, 22016, 22144, 22208, 22209, 22200, 0, 16384, + 20480, 22528, 22016, 22144, 22208, 22209, 22200, 22202, + 0, 16384, 20480, 22528, 22016, 22144, 22208, 22209, + 22200, 0, 16384, 20480, 22528, 22016, 22144, 22208, + 22209, 22200, 22204, 0, 16384, 20480, 22528, 22016, + 22144, 22208, 22209, 22211, 22204, 0, 16384, 20480, + 22528, 22016, 22144, 22208, 22209, 22211, 22204, 22206, + 0, 16384, 20480, 22528, 22016, 22144, 0, 16384, + 20480, 22528, 22016, 22272, 22208, 0, 16384, 20480, + 22528, 22016, 22272, 22208, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 22210, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22212, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22212, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22216, 22214, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22216, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22216, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22216, 22218, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 22216, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 22224, 22220, 0, 16384, 20480, + 22528, 22016, 22272, 22208, 22224, 22220, 0, 16384, + 20480, 22528, 22016, 22272, 22208, 22224, 22225, 22222, + 0, 16384, 20480, 22528, 22016, 22272, 22208, 0, + 16384, 20480, 22528, 22016, 22272, 22208, 22224, 0, + 16384, 20480, 22528, 22016, 22272, 22208, 22224, 0, + 16384, 20480, 22528, 22016, 22272, 22208, 22224, 22226, + 0, 16384, 20480, 22528, 22016, 22272, 22208, 22224, + 0, 16384, 20480, 22528, 22016, 22272, 22208, 22224, + 22228, 0, 16384, 20480, 22528, 22016, 22272, 22208, + 22224, 22228, 0, 16384, 20480, 22528, 22016, 22272, + 22208, 22224, 22232, 22230, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 22224, 0, 16384, 20480, 22528, + 22016, 22272, 22208, 22240, 22232, 0, 16384, 20480, + 22528, 22016, 22272, 22208, 22240, 22232, 0, 16384, + 20480, 22528, 22016, 22272, 22208, 22240, 22232, 22234, + 0, 16384, 20480, 22528, 22016, 22272, 22208, 22240, + 22232, 0, 16384, 20480, 22528, 22016, 22272, 22208, + 22240, 22241, 22236, 0, 16384, 20480, 22528, 22016, + 22272, 22208, 22240, 22241, 22236, 0, 16384, 20480, + 22528, 22016, 22272, 22208, 22240, 22241, 22236, 22238, + 0, 16384, 20480, 22528, 22016, 22272, 22208, 0, + 16384, 20480, 22528, 22016, 22272, 22273, 22240, 0, + 16384, 20480, 22528, 22016, 22272, 22273, 22240, 0, + 16384, 20480, 22528, 22016, 22272, 22273, 22240, 22242, + 0, 16384, 20480, 22528, 22016, 22272, 22273, 22240, + 0, 16384, 20480, 22528, 22016, 22272, 22273, 22240, + 22244, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22240, 22244, 0, 16384, 20480, 22528, 22016, 22272, + 22273, 22240, 22248, 22246, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22240, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22240, 22248, 0, 16384, 20480, + 22528, 22016, 22272, 22273, 22240, 22248, 0, 16384, + 20480, 22528, 22016, 22272, 22273, 22240, 22248, 22250, + 0, 16384, 20480, 22528, 22016, 22272, 22273, 22240, + 22248, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22240, 22256, 22252, 0, 16384, 20480, 22528, 22016, + 22272, 22273, 22240, 22256, 22252, 0, 16384, 20480, + 22528, 22016, 22272, 22273, 22240, 22256, 22257, 22254, + 0, 16384, 20480, 22528, 22016, 22272, 22273, 22240, + 0, 16384, 20480, 22528, 22016, 22272, 22273, 22240, + 22256, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22275, 22256, 0, 16384, 20480, 22528, 22016, 22272, + 22273, 22275, 22256, 22258, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22275, 22256, 0, 16384, 20480, + 22528, 22016, 22272, 22273, 22275, 22256, 22260, 0, + 16384, 20480, 22528, 22016, 22272, 22273, 22275, 22256, + 22260, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22275, 22256, 22264, 22262, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22275, 22256, 0, 16384, 20480, + 22528, 22016, 22272, 22273, 22275, 22256, 22264, 0, + 16384, 20480, 22528, 22016, 22272, 22273, 22275, 22256, + 22264, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22275, 22256, 22264, 22266, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22275, 22279, 22264, 0, 16384, + 20480, 22528, 22016, 22272, 22273, 22275, 22279, 22264, + 22268, 0, 16384, 20480, 22528, 22016, 22272, 22273, + 22275, 22279, 22264, 22268, 0, 16384, 20480, 22528, + 22016, 22272, 22273, 22275, 22279, 22264, 22268, 22270, + 0, 16384, 20480, 22528, 22016, 0, 16384, 20480, + 22528, 22016, 22272, 0, 16384, 20480, 22528, 22529, + 22272, 0, 16384, 20480, 22528, 22529, 22272, 22274, + 0, 16384, 20480, 22528, 22529, 22272, 0, 16384, + 20480, 22528, 22529, 22272, 22276, 0, 16384, 20480, + 22528, 22529, 22272, 22276, 0, 16384, 20480, 22528, + 22529, 22272, 22280, 22278, 0, 16384, 20480, 22528, + 22529, 22272, 0, 16384, 20480, 22528, 22529, 22272, + 22280, 0, 16384, 20480, 22528, 22529, 22272, 22280, + 0, 16384, 20480, 22528, 22529, 22272, 22280, 22282, + 0, 16384, 20480, 22528, 22529, 22272, 22280, 0, + 16384, 20480, 22528, 22529, 22272, 22288, 22284, 0, + 16384, 20480, 22528, 22529, 22272, 22288, 22284, 0, + 16384, 20480, 22528, 22529, 22272, 22288, 22289, 22286, + 0, 16384, 20480, 22528, 22529, 22272, 0, 16384, + 20480, 22528, 22529, 22272, 22288, 0, 16384, 20480, + 22528, 22529, 22272, 22288, 0, 16384, 20480, 22528, + 22529, 22272, 22288, 22290, 0, 16384, 20480, 22528, + 22529, 22272, 22288, 0, 16384, 20480, 22528, 22529, + 22272, 22288, 22292, 0, 16384, 20480, 22528, 22529, + 22272, 22288, 22292, 0, 16384, 20480, 22528, 22529, + 22272, 22288, 22296, 22294, 0, 16384, 20480, 22528, + 22529, 22272, 22288, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22296, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22296, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22296, 22298, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 22296, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 22305, 22300, 0, 16384, 20480, + 22528, 22529, 22272, 22304, 22305, 22300, 0, 16384, + 20480, 22528, 22529, 22272, 22304, 22305, 22300, 22302, + 0, 16384, 20480, 22528, 22529, 22272, 0, 16384, + 20480, 22528, 22529, 22272, 22304, 0, 16384, 20480, + 22528, 22529, 22272, 22304, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 22306, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22308, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22308, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22312, 22310, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22312, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22312, 0, 16384, 20480, 22528, 22529, + 22272, 22304, 22312, 22314, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 22312, 0, 16384, 20480, 22528, + 22529, 22272, 22304, 22320, 22316, 0, 16384, 20480, + 22528, 22529, 22272, 22304, 22320, 22316, 0, 16384, + 20480, 22528, 22529, 22272, 22304, 22320, 22321, 22318, + 0, 16384, 20480, 22528, 22529, 22272, 22304, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22320, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22320, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22320, 22322, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22320, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22320, + 22324, 0, 16384, 20480, 22528, 22529, 22272, 22336, + 22320, 22324, 0, 16384, 20480, 22528, 22529, 22272, + 22336, 22320, 22328, 22326, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22320, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22337, 22328, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 22337, 22328, 0, 16384, + 20480, 22528, 22529, 22272, 22336, 22337, 22328, 22330, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22337, + 22328, 0, 16384, 20480, 22528, 22529, 22272, 22336, + 22337, 22328, 22332, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22337, 22339, 22332, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 22337, 22339, 22332, 22334, + 0, 16384, 20480, 22528, 22529, 22272, 0, 16384, + 20480, 22528, 22529, 22272, 22336, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22338, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22340, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22340, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22344, 22342, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22344, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22344, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22344, 22346, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22344, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22352, 22348, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 22352, 22348, 0, 16384, + 20480, 22528, 22529, 22272, 22336, 22352, 22353, 22350, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22352, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22352, 0, + 16384, 20480, 22528, 22529, 22272, 22336, 22352, 22354, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22352, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22352, + 22356, 0, 16384, 20480, 22528, 22529, 22272, 22336, + 22352, 22356, 0, 16384, 20480, 22528, 22529, 22272, + 22336, 22352, 22360, 22358, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22352, 0, 16384, 20480, 22528, + 22529, 22272, 22336, 22368, 22360, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 22368, 22360, 0, 16384, + 20480, 22528, 22529, 22272, 22336, 22368, 22360, 22362, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 22368, + 22360, 0, 16384, 20480, 22528, 22529, 22272, 22336, + 22368, 22369, 22364, 0, 16384, 20480, 22528, 22529, + 22272, 22336, 22368, 22369, 22364, 0, 16384, 20480, + 22528, 22529, 22272, 22336, 22368, 22369, 22364, 22366, + 0, 16384, 20480, 22528, 22529, 22272, 22336, 0, + 16384, 20480, 22528, 22529, 22272, 22400, 22368, 0, + 16384, 20480, 22528, 22529, 22272, 22400, 22368, 0, + 16384, 20480, 22528, 22529, 22272, 22400, 22368, 22370, + 0, 16384, 20480, 22528, 22529, 22272, 22400, 22368, + 0, 16384, 20480, 22528, 22529, 22272, 22400, 22368, + 22372, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22368, 22372, 0, 16384, 20480, 22528, 22529, 22272, + 22400, 22368, 22376, 22374, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22368, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22368, 22376, 0, 16384, 20480, + 22528, 22529, 22272, 22400, 22368, 22376, 0, 16384, + 20480, 22528, 22529, 22272, 22400, 22368, 22376, 22378, + 0, 16384, 20480, 22528, 22529, 22272, 22400, 22368, + 22376, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22368, 22384, 22380, 0, 16384, 20480, 22528, 22529, + 22272, 22400, 22368, 22384, 22380, 0, 16384, 20480, + 22528, 22529, 22272, 22400, 22368, 22384, 22385, 22382, + 0, 16384, 20480, 22528, 22529, 22272, 22400, 22368, + 0, 16384, 20480, 22528, 22529, 22272, 22400, 22401, + 22384, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22401, 22384, 0, 16384, 20480, 22528, 22529, 22272, + 22400, 22401, 22384, 22386, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22401, 22384, 0, 16384, 20480, + 22528, 22529, 22272, 22400, 22401, 22384, 22388, 0, + 16384, 20480, 22528, 22529, 22272, 22400, 22401, 22384, + 22388, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22401, 22384, 22392, 22390, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22401, 22384, 0, 16384, 20480, + 22528, 22529, 22272, 22400, 22401, 22384, 22392, 0, + 16384, 20480, 22528, 22529, 22272, 22400, 22401, 22403, + 22392, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22401, 22403, 22392, 22394, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22401, 22403, 22392, 0, 16384, + 20480, 22528, 22529, 22272, 22400, 22401, 22403, 22392, + 22396, 0, 16384, 20480, 22528, 22529, 22272, 22400, + 22401, 22403, 22392, 22396, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22401, 22403, 22392, 22396, 22398, + 0, 16384, 20480, 22528, 22529, 22272, 0, 16384, + 20480, 22528, 22529, 22272, 22400, 0, 16384, 20480, + 22528, 22529, 22272, 22400, 0, 16384, 20480, 22528, + 22529, 22272, 22400, 22402, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22404, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22404, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22408, 22406, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22408, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22408, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22408, 22410, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22408, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22416, 22412, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22416, 22412, 0, 16384, + 20480, 22528, 22529, 22531, 22400, 22416, 22417, 22414, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22416, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22416, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22416, 22418, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22416, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22416, + 22420, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22416, 22420, 0, 16384, 20480, 22528, 22529, 22531, + 22400, 22416, 22424, 22422, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22416, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22432, 22424, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22432, 22424, 0, 16384, + 20480, 22528, 22529, 22531, 22400, 22432, 22424, 22426, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22432, + 22424, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22432, 22433, 22428, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22432, 22433, 22428, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22432, 22433, 22428, 22430, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22432, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22432, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22432, 22434, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22432, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22432, + 22436, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22432, 22436, 0, 16384, 20480, 22528, 22529, 22531, + 22400, 22432, 22440, 22438, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22432, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22432, 22440, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22432, 22440, 0, 16384, + 20480, 22528, 22529, 22531, 22400, 22432, 22440, 22442, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22432, + 22440, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22432, 22448, 22444, 0, 16384, 20480, 22528, 22529, + 22531, 22400, 22432, 22448, 22444, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22432, 22448, 22449, 22446, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22432, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22464, + 22448, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22464, 22448, 0, 16384, 20480, 22528, 22529, 22531, + 22400, 22464, 22448, 22450, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22464, 22448, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22464, 22448, 22452, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22464, 22448, + 22452, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22464, 22448, 22456, 22454, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22464, 22448, 0, 16384, 20480, + 22528, 22529, 22531, 22400, 22464, 22465, 22456, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22464, 22465, + 22456, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22464, 22465, 22456, 22458, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22464, 22465, 22456, 0, 16384, + 20480, 22528, 22529, 22531, 22400, 22464, 22465, 22456, + 22460, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22464, 22465, 22467, 22460, 0, 16384, 20480, 22528, + 22529, 22531, 22400, 22464, 22465, 22467, 22460, 22462, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22464, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22464, 0, + 16384, 20480, 22528, 22529, 22531, 22400, 22464, 22466, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22464, + 0, 16384, 20480, 22528, 22529, 22531, 22400, 22464, + 22468, 0, 16384, 20480, 22528, 22529, 22531, 22400, + 22464, 22468, 0, 16384, 20480, 22528, 22529, 22531, + 22400, 22464, 22472, 22470, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22472, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22472, 0, 16384, + 20480, 22528, 22529, 22531, 22535, 22464, 22472, 22474, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22464, + 22472, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22480, 22476, 0, 16384, 20480, 22528, 22529, + 22531, 22535, 22464, 22480, 22476, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22480, 22481, 22478, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22464, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22464, + 22480, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22480, 0, 16384, 20480, 22528, 22529, 22531, + 22535, 22464, 22480, 22482, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22480, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22480, 22484, 0, + 16384, 20480, 22528, 22529, 22531, 22535, 22464, 22480, + 22484, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22480, 22488, 22486, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22480, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22496, 22488, 0, + 16384, 20480, 22528, 22529, 22531, 22535, 22464, 22496, + 22488, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 22488, 22490, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 22488, 0, 16384, + 20480, 22528, 22529, 22531, 22535, 22464, 22496, 22497, + 22492, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 22497, 22492, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 22497, 22492, 22494, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22464, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22464, + 22496, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 0, 16384, 20480, 22528, 22529, 22531, + 22535, 22464, 22496, 22498, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22496, 22500, 0, + 16384, 20480, 22528, 22529, 22531, 22535, 22464, 22496, + 22500, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 22504, 22502, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22464, 22496, 22504, 0, + 16384, 20480, 22528, 22529, 22531, 22535, 22464, 22496, + 22504, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 22504, 22506, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 22504, 0, 16384, + 20480, 22528, 22529, 22531, 22535, 22464, 22496, 22512, + 22508, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22464, 22496, 22512, 22508, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22464, 22496, 22512, 22513, 22510, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22543, + 22496, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22543, 22496, 22512, 0, 16384, 20480, 22528, 22529, + 22531, 22535, 22543, 22496, 22512, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22543, 22496, 22512, 22514, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22543, + 22496, 22512, 0, 16384, 20480, 22528, 22529, 22531, + 22535, 22543, 22496, 22512, 22516, 0, 16384, 20480, + 22528, 22529, 22531, 22535, 22543, 22496, 22512, 22516, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22543, + 22496, 22512, 22520, 22518, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22543, 22496, 22512, 0, 16384, + 20480, 22528, 22529, 22531, 22535, 22543, 22496, 22512, + 22520, 0, 16384, 20480, 22528, 22529, 22531, 22535, + 22543, 22496, 22512, 22520, 0, 16384, 20480, 22528, + 22529, 22531, 22535, 22543, 22496, 22512, 22520, 22522, + 0, 16384, 20480, 22528, 22529, 22531, 22535, 22543, + 22496, 22512, 22520, 0, 16384, 20480, 22528, 22529, + 22531, 22535, 22543, 22496, 22512, 22520, 22524, 0, + 16384, 20480, 22528, 22529, 22531, 22535, 22543, 22496, + 22512, 22520, 22524, 0, 16384, 20480, 22528, 22529, + 22531, 22535, 22543, 22496, 22512, 22520, 22524, 22526, + 0, 16384, 20480, 0, 16384, 20480, 22528, 0, + 16384, 20480, 22528, 0, 16384, 20480, 22528, 22530, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22532, 0, 16384, 20480, 22528, 22532, 0, 16384, + 20480, 22528, 22536, 22534, 0, 16384, 20480, 22528, + 0, 16384, 20480, 22528, 22536, 0, 16384, 20480, + 22528, 22536, 0, 16384, 20480, 22528, 22536, 22538, + 0, 16384, 20480, 22528, 22536, 0, 16384, 20480, + 22528, 22544, 22540, 0, 16384, 20480, 22528, 22544, + 22540, 0, 16384, 20480, 22528, 22544, 22545, 22542, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22544, 0, 16384, 20480, 22528, 22544, 0, 16384, + 20480, 22528, 22544, 22546, 0, 16384, 20480, 22528, + 22544, 0, 16384, 20480, 22528, 22544, 22548, 0, + 16384, 20480, 22528, 22544, 22548, 0, 16384, 20480, + 22528, 22544, 22552, 22550, 0, 16384, 20480, 22528, + 22544, 0, 16384, 20480, 22528, 22560, 22552, 0, + 16384, 20480, 22528, 22560, 22552, 0, 16384, 20480, + 22528, 22560, 22552, 22554, 0, 16384, 20480, 22528, + 22560, 22552, 0, 16384, 20480, 22528, 22560, 22561, + 22556, 0, 16384, 20480, 22528, 22560, 22561, 22556, + 0, 16384, 20480, 22528, 22560, 22561, 22556, 22558, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22560, 0, 16384, 20480, 22528, 22560, 0, 16384, + 20480, 22528, 22560, 22562, 0, 16384, 20480, 22528, + 22560, 0, 16384, 20480, 22528, 22560, 22564, 0, + 16384, 20480, 22528, 22560, 22564, 0, 16384, 20480, + 22528, 22560, 22568, 22566, 0, 16384, 20480, 22528, + 22560, 0, 16384, 20480, 22528, 22560, 22568, 0, + 16384, 20480, 22528, 22560, 22568, 0, 16384, 20480, + 22528, 22560, 22568, 22570, 0, 16384, 20480, 22528, + 22560, 22568, 0, 16384, 20480, 22528, 22560, 22576, + 22572, 0, 16384, 20480, 22528, 22560, 22576, 22572, + 0, 16384, 20480, 22528, 22560, 22576, 22577, 22574, + 0, 16384, 20480, 22528, 22560, 0, 16384, 20480, + 22528, 22592, 22576, 0, 16384, 20480, 22528, 22592, + 22576, 0, 16384, 20480, 22528, 22592, 22576, 22578, + 0, 16384, 20480, 22528, 22592, 22576, 0, 16384, + 20480, 22528, 22592, 22576, 22580, 0, 16384, 20480, + 22528, 22592, 22576, 22580, 0, 16384, 20480, 22528, + 22592, 22576, 22584, 22582, 0, 16384, 20480, 22528, + 22592, 22576, 0, 16384, 20480, 22528, 22592, 22593, + 22584, 0, 16384, 20480, 22528, 22592, 22593, 22584, + 0, 16384, 20480, 22528, 22592, 22593, 22584, 22586, + 0, 16384, 20480, 22528, 22592, 22593, 22584, 0, + 16384, 20480, 22528, 22592, 22593, 22584, 22588, 0, + 16384, 20480, 22528, 22592, 22593, 22595, 22588, 0, + 16384, 20480, 22528, 22592, 22593, 22595, 22588, 22590, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22592, 0, 16384, 20480, 22528, 22592, 0, 16384, + 20480, 22528, 22592, 22594, 0, 16384, 20480, 22528, + 22592, 0, 16384, 20480, 22528, 22592, 22596, 0, + 16384, 20480, 22528, 22592, 22596, 0, 16384, 20480, + 22528, 22592, 22600, 22598, 0, 16384, 20480, 22528, + 22592, 0, 16384, 20480, 22528, 22592, 22600, 0, + 16384, 20480, 22528, 22592, 22600, 0, 16384, 20480, + 22528, 22592, 22600, 22602, 0, 16384, 20480, 22528, + 22592, 22600, 0, 16384, 20480, 22528, 22592, 22608, + 22604, 0, 16384, 20480, 22528, 22592, 22608, 22604, + 0, 16384, 20480, 22528, 22592, 22608, 22609, 22606, + 0, 16384, 20480, 22528, 22592, 0, 16384, 20480, + 22528, 22592, 22608, 0, 16384, 20480, 22528, 22592, + 22608, 0, 16384, 20480, 22528, 22592, 22608, 22610, + 0, 16384, 20480, 22528, 22592, 22608, 0, 16384, + 20480, 22528, 22592, 22608, 22612, 0, 16384, 20480, + 22528, 22592, 22608, 22612, 0, 16384, 20480, 22528, + 22592, 22608, 22616, 22614, 0, 16384, 20480, 22528, + 22592, 22608, 0, 16384, 20480, 22528, 22592, 22624, + 22616, 0, 16384, 20480, 22528, 22592, 22624, 22616, + 0, 16384, 20480, 22528, 22592, 22624, 22616, 22618, + 0, 16384, 20480, 22528, 22592, 22624, 22616, 0, + 16384, 20480, 22528, 22592, 22624, 22625, 22620, 0, + 16384, 20480, 22528, 22592, 22624, 22625, 22620, 0, + 16384, 20480, 22528, 22592, 22624, 22625, 22620, 22622, + 0, 16384, 20480, 22528, 22592, 0, 16384, 20480, + 22528, 22656, 22624, 0, 16384, 20480, 22528, 22656, + 22624, 0, 16384, 20480, 22528, 22656, 22624, 22626, + 0, 16384, 20480, 22528, 22656, 22624, 0, 16384, + 20480, 22528, 22656, 22624, 22628, 0, 16384, 20480, + 22528, 22656, 22624, 22628, 0, 16384, 20480, 22528, + 22656, 22624, 22632, 22630, 0, 16384, 20480, 22528, + 22656, 22624, 0, 16384, 20480, 22528, 22656, 22624, + 22632, 0, 16384, 20480, 22528, 22656, 22624, 22632, + 0, 16384, 20480, 22528, 22656, 22624, 22632, 22634, + 0, 16384, 20480, 22528, 22656, 22624, 22632, 0, + 16384, 20480, 22528, 22656, 22624, 22640, 22636, 0, + 16384, 20480, 22528, 22656, 22624, 22640, 22636, 0, + 16384, 20480, 22528, 22656, 22624, 22640, 22641, 22638, + 0, 16384, 20480, 22528, 22656, 22624, 0, 16384, + 20480, 22528, 22656, 22657, 22640, 0, 16384, 20480, + 22528, 22656, 22657, 22640, 0, 16384, 20480, 22528, + 22656, 22657, 22640, 22642, 0, 16384, 20480, 22528, + 22656, 22657, 22640, 0, 16384, 20480, 22528, 22656, + 22657, 22640, 22644, 0, 16384, 20480, 22528, 22656, + 22657, 22640, 22644, 0, 16384, 20480, 22528, 22656, + 22657, 22640, 22648, 22646, 0, 16384, 20480, 22528, + 22656, 22657, 22640, 0, 16384, 20480, 22528, 22656, + 22657, 22640, 22648, 0, 16384, 20480, 22528, 22656, + 22657, 22659, 22648, 0, 16384, 20480, 22528, 22656, + 22657, 22659, 22648, 22650, 0, 16384, 20480, 22528, + 22656, 22657, 22659, 22648, 0, 16384, 20480, 22528, + 22656, 22657, 22659, 22648, 22652, 0, 16384, 20480, + 22528, 22656, 22657, 22659, 22648, 22652, 0, 16384, + 20480, 22528, 22656, 22657, 22659, 22648, 22652, 22654, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22656, 0, 16384, 20480, 22528, 22656, 0, 16384, + 20480, 22528, 22656, 22658, 0, 16384, 20480, 22528, + 22656, 0, 16384, 20480, 22528, 22656, 22660, 0, + 16384, 20480, 22528, 22656, 22660, 0, 16384, 20480, + 22528, 22656, 22664, 22662, 0, 16384, 20480, 22528, + 22656, 0, 16384, 20480, 22528, 22656, 22664, 0, + 16384, 20480, 22528, 22656, 22664, 0, 16384, 20480, + 22528, 22656, 22664, 22666, 0, 16384, 20480, 22528, + 22656, 22664, 0, 16384, 20480, 22528, 22656, 22672, + 22668, 0, 16384, 20480, 22528, 22656, 22672, 22668, + 0, 16384, 20480, 22528, 22656, 22672, 22673, 22670, + 0, 16384, 20480, 22528, 22656, 0, 16384, 20480, + 22528, 22656, 22672, 0, 16384, 20480, 22528, 22656, + 22672, 0, 16384, 20480, 22528, 22656, 22672, 22674, + 0, 16384, 20480, 22528, 22656, 22672, 0, 16384, + 20480, 22528, 22656, 22672, 22676, 0, 16384, 20480, + 22528, 22656, 22672, 22676, 0, 16384, 20480, 22528, + 22656, 22672, 22680, 22678, 0, 16384, 20480, 22528, + 22656, 22672, 0, 16384, 20480, 22528, 22656, 22688, + 22680, 0, 16384, 20480, 22528, 22656, 22688, 22680, + 0, 16384, 20480, 22528, 22656, 22688, 22680, 22682, + 0, 16384, 20480, 22528, 22656, 22688, 22680, 0, + 16384, 20480, 22528, 22656, 22688, 22689, 22684, 0, + 16384, 20480, 22528, 22656, 22688, 22689, 22684, 0, + 16384, 20480, 22528, 22656, 22688, 22689, 22684, 22686, + 0, 16384, 20480, 22528, 22656, 0, 16384, 20480, + 22528, 22656, 22688, 0, 16384, 20480, 22528, 22656, + 22688, 0, 16384, 20480, 22528, 22656, 22688, 22690, + 0, 16384, 20480, 22528, 22656, 22688, 0, 16384, + 20480, 22528, 22656, 22688, 22692, 0, 16384, 20480, + 22528, 22656, 22688, 22692, 0, 16384, 20480, 22528, + 22656, 22688, 22696, 22694, 0, 16384, 20480, 22528, + 22656, 22688, 0, 16384, 20480, 22528, 22656, 22688, + 22696, 0, 16384, 20480, 22528, 22656, 22688, 22696, + 0, 16384, 20480, 22528, 22656, 22688, 22696, 22698, + 0, 16384, 20480, 22528, 22656, 22688, 22696, 0, + 16384, 20480, 22528, 22656, 22688, 22704, 22700, 0, + 16384, 20480, 22528, 22656, 22688, 22704, 22700, 0, + 16384, 20480, 22528, 22656, 22688, 22704, 22705, 22702, + 0, 16384, 20480, 22528, 22656, 22688, 0, 16384, + 20480, 22528, 22656, 22720, 22704, 0, 16384, 20480, + 22528, 22656, 22720, 22704, 0, 16384, 20480, 22528, + 22656, 22720, 22704, 22706, 0, 16384, 20480, 22528, + 22656, 22720, 22704, 0, 16384, 20480, 22528, 22656, + 22720, 22704, 22708, 0, 16384, 20480, 22528, 22656, + 22720, 22704, 22708, 0, 16384, 20480, 22528, 22656, + 22720, 22704, 22712, 22710, 0, 16384, 20480, 22528, + 22656, 22720, 22704, 0, 16384, 20480, 22528, 22656, + 22720, 22721, 22712, 0, 16384, 20480, 22528, 22656, + 22720, 22721, 22712, 0, 16384, 20480, 22528, 22656, + 22720, 22721, 22712, 22714, 0, 16384, 20480, 22528, + 22656, 22720, 22721, 22712, 0, 16384, 20480, 22528, + 22656, 22720, 22721, 22712, 22716, 0, 16384, 20480, + 22528, 22656, 22720, 22721, 22723, 22716, 0, 16384, + 20480, 22528, 22656, 22720, 22721, 22723, 22716, 22718, + 0, 16384, 20480, 22528, 22656, 0, 16384, 20480, + 22528, 22784, 22720, 0, 16384, 20480, 22528, 22784, + 22720, 0, 16384, 20480, 22528, 22784, 22720, 22722, + 0, 16384, 20480, 22528, 22784, 22720, 0, 16384, + 20480, 22528, 22784, 22720, 22724, 0, 16384, 20480, + 22528, 22784, 22720, 22724, 0, 16384, 20480, 22528, + 22784, 22720, 22728, 22726, 0, 16384, 20480, 22528, + 22784, 22720, 0, 16384, 20480, 22528, 22784, 22720, + 22728, 0, 16384, 20480, 22528, 22784, 22720, 22728, + 0, 16384, 20480, 22528, 22784, 22720, 22728, 22730, + 0, 16384, 20480, 22528, 22784, 22720, 22728, 0, + 16384, 20480, 22528, 22784, 22720, 22736, 22732, 0, + 16384, 20480, 22528, 22784, 22720, 22736, 22732, 0, + 16384, 20480, 22528, 22784, 22720, 22736, 22737, 22734, + 0, 16384, 20480, 22528, 22784, 22720, 0, 16384, + 20480, 22528, 22784, 22720, 22736, 0, 16384, 20480, + 22528, 22784, 22720, 22736, 0, 16384, 20480, 22528, + 22784, 22720, 22736, 22738, 0, 16384, 20480, 22528, + 22784, 22720, 22736, 0, 16384, 20480, 22528, 22784, + 22720, 22736, 22740, 0, 16384, 20480, 22528, 22784, + 22720, 22736, 22740, 0, 16384, 20480, 22528, 22784, + 22720, 22736, 22744, 22742, 0, 16384, 20480, 22528, + 22784, 22720, 22736, 0, 16384, 20480, 22528, 22784, + 22720, 22752, 22744, 0, 16384, 20480, 22528, 22784, + 22720, 22752, 22744, 0, 16384, 20480, 22528, 22784, + 22720, 22752, 22744, 22746, 0, 16384, 20480, 22528, + 22784, 22720, 22752, 22744, 0, 16384, 20480, 22528, + 22784, 22720, 22752, 22753, 22748, 0, 16384, 20480, + 22528, 22784, 22720, 22752, 22753, 22748, 0, 16384, + 20480, 22528, 22784, 22720, 22752, 22753, 22748, 22750, + 0, 16384, 20480, 22528, 22784, 22720, 0, 16384, + 20480, 22528, 22784, 22785, 22752, 0, 16384, 20480, + 22528, 22784, 22785, 22752, 0, 16384, 20480, 22528, + 22784, 22785, 22752, 22754, 0, 16384, 20480, 22528, + 22784, 22785, 22752, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22756, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22756, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22760, 22758, 0, 16384, 20480, 22528, + 22784, 22785, 22752, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22760, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22760, 0, 16384, 20480, 22528, 22784, + 22785, 22752, 22760, 22762, 0, 16384, 20480, 22528, + 22784, 22785, 22752, 22760, 0, 16384, 20480, 22528, + 22784, 22785, 22752, 22768, 22764, 0, 16384, 20480, + 22528, 22784, 22785, 22752, 22768, 22764, 0, 16384, + 20480, 22528, 22784, 22785, 22752, 22768, 22769, 22766, + 0, 16384, 20480, 22528, 22784, 22785, 22752, 0, + 16384, 20480, 22528, 22784, 22785, 22752, 22768, 0, + 16384, 20480, 22528, 22784, 22785, 22787, 22768, 0, + 16384, 20480, 22528, 22784, 22785, 22787, 22768, 22770, + 0, 16384, 20480, 22528, 22784, 22785, 22787, 22768, + 0, 16384, 20480, 22528, 22784, 22785, 22787, 22768, + 22772, 0, 16384, 20480, 22528, 22784, 22785, 22787, + 22768, 22772, 0, 16384, 20480, 22528, 22784, 22785, + 22787, 22768, 22776, 22774, 0, 16384, 20480, 22528, + 22784, 22785, 22787, 22768, 0, 16384, 20480, 22528, + 22784, 22785, 22787, 22768, 22776, 0, 16384, 20480, + 22528, 22784, 22785, 22787, 22768, 22776, 0, 16384, + 20480, 22528, 22784, 22785, 22787, 22768, 22776, 22778, + 0, 16384, 20480, 22528, 22784, 22785, 22787, 22791, + 22776, 0, 16384, 20480, 22528, 22784, 22785, 22787, + 22791, 22776, 22780, 0, 16384, 20480, 22528, 22784, + 22785, 22787, 22791, 22776, 22780, 0, 16384, 20480, + 22528, 22784, 22785, 22787, 22791, 22776, 22780, 22782, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 22784, 0, 16384, 20480, 22528, 22784, 0, 16384, + 20480, 22528, 22784, 22786, 0, 16384, 20480, 22528, + 22784, 0, 16384, 20480, 22528, 22784, 22788, 0, + 16384, 20480, 22528, 22784, 22788, 0, 16384, 20480, + 22528, 22784, 22792, 22790, 0, 16384, 20480, 22528, + 22784, 0, 16384, 20480, 22528, 22784, 22792, 0, + 16384, 20480, 22528, 22784, 22792, 0, 16384, 20480, + 22528, 22784, 22792, 22794, 0, 16384, 20480, 22528, + 22784, 22792, 0, 16384, 20480, 22528, 22784, 22800, + 22796, 0, 16384, 20480, 22528, 22784, 22800, 22796, + 0, 16384, 20480, 22528, 22784, 22800, 22801, 22798, + 0, 16384, 20480, 22528, 22784, 0, 16384, 20480, + 22528, 22784, 22800, 0, 16384, 20480, 22528, 22784, + 22800, 0, 16384, 20480, 22528, 22784, 22800, 22802, + 0, 16384, 20480, 22528, 22784, 22800, 0, 16384, + 20480, 22528, 22784, 22800, 22804, 0, 16384, 20480, + 22528, 22784, 22800, 22804, 0, 16384, 20480, 22528, + 22784, 22800, 22808, 22806, 0, 16384, 20480, 22528, + 22784, 22800, 0, 16384, 20480, 22528, 22784, 22816, + 22808, 0, 16384, 20480, 22528, 22784, 22816, 22808, + 0, 16384, 20480, 22528, 22784, 22816, 22808, 22810, + 0, 16384, 20480, 22528, 22784, 22816, 22808, 0, + 16384, 20480, 22528, 22784, 22816, 22817, 22812, 0, + 16384, 20480, 22528, 22784, 22816, 22817, 22812, 0, + 16384, 20480, 22528, 22784, 22816, 22817, 22812, 22814, + 0, 16384, 20480, 22528, 22784, 0, 16384, 20480, + 22528, 22784, 22816, 0, 16384, 20480, 22528, 22784, + 22816, 0, 16384, 20480, 22528, 22784, 22816, 22818, + 0, 16384, 20480, 22528, 22784, 22816, 0, 16384, + 20480, 22528, 22784, 22816, 22820, 0, 16384, 20480, + 22528, 22784, 22816, 22820, 0, 16384, 20480, 22528, + 22784, 22816, 22824, 22822, 0, 16384, 20480, 22528, + 22784, 22816, 0, 16384, 20480, 22528, 22784, 22816, + 22824, 0, 16384, 20480, 22528, 22784, 22816, 22824, + 0, 16384, 20480, 22528, 22784, 22816, 22824, 22826, + 0, 16384, 20480, 22528, 22784, 22816, 22824, 0, + 16384, 20480, 22528, 22784, 22816, 22832, 22828, 0, + 16384, 20480, 22528, 22784, 22816, 22832, 22828, 0, + 16384, 20480, 22528, 22784, 22816, 22832, 22833, 22830, + 0, 16384, 20480, 22528, 22784, 22816, 0, 16384, + 20480, 22528, 22784, 22848, 22832, 0, 16384, 20480, + 22528, 22784, 22848, 22832, 0, 16384, 20480, 22528, + 22784, 22848, 22832, 22834, 0, 16384, 20480, 22528, + 22784, 22848, 22832, 0, 16384, 20480, 22528, 22784, + 22848, 22832, 22836, 0, 16384, 20480, 22528, 22784, + 22848, 22832, 22836, 0, 16384, 20480, 22528, 22784, + 22848, 22832, 22840, 22838, 0, 16384, 20480, 22528, + 22784, 22848, 22832, 0, 16384, 20480, 22528, 22784, + 22848, 22849, 22840, 0, 16384, 20480, 22528, 22784, + 22848, 22849, 22840, 0, 16384, 20480, 22528, 22784, + 22848, 22849, 22840, 22842, 0, 16384, 20480, 22528, + 22784, 22848, 22849, 22840, 0, 16384, 20480, 22528, + 22784, 22848, 22849, 22840, 22844, 0, 16384, 20480, + 22528, 22784, 22848, 22849, 22851, 22844, 0, 16384, + 20480, 22528, 22784, 22848, 22849, 22851, 22844, 22846, + 0, 16384, 20480, 22528, 22784, 0, 16384, 20480, + 22528, 22784, 22848, 0, 16384, 20480, 22528, 22784, + 22848, 0, 16384, 20480, 22528, 22784, 22848, 22850, + 0, 16384, 20480, 22528, 22784, 22848, 0, 16384, + 20480, 22528, 22784, 22848, 22852, 0, 16384, 20480, + 22528, 22784, 22848, 22852, 0, 16384, 20480, 22528, + 22784, 22848, 22856, 22854, 0, 16384, 20480, 22528, + 22784, 22848, 0, 16384, 20480, 22528, 22784, 22848, + 22856, 0, 16384, 20480, 22528, 22784, 22848, 22856, + 0, 16384, 20480, 22528, 22784, 22848, 22856, 22858, + 0, 16384, 20480, 22528, 22784, 22848, 22856, 0, + 16384, 20480, 22528, 22784, 22848, 22864, 22860, 0, + 16384, 20480, 22528, 22784, 22848, 22864, 22860, 0, + 16384, 20480, 22528, 22784, 22848, 22864, 22865, 22862, + 0, 16384, 20480, 22528, 22784, 22848, 0, 16384, + 20480, 22528, 22784, 22848, 22864, 0, 16384, 20480, + 22528, 22784, 22848, 22864, 0, 16384, 20480, 22528, + 22784, 22848, 22864, 22866, 0, 16384, 20480, 22528, + 22784, 22848, 22864, 0, 16384, 20480, 22528, 22784, + 22848, 22864, 22868, 0, 16384, 20480, 22528, 22784, + 22848, 22864, 22868, 0, 16384, 20480, 22528, 22784, + 22848, 22864, 22872, 22870, 0, 16384, 20480, 22528, + 22784, 22848, 22864, 0, 16384, 20480, 22528, 22784, + 22848, 22880, 22872, 0, 16384, 20480, 22528, 22784, + 22848, 22880, 22872, 0, 16384, 20480, 22528, 22784, + 22848, 22880, 22872, 22874, 0, 16384, 20480, 22528, + 22784, 22848, 22880, 22872, 0, 16384, 20480, 22528, + 22784, 22848, 22880, 22881, 22876, 0, 16384, 20480, + 22528, 22784, 22848, 22880, 22881, 22876, 0, 16384, + 20480, 22528, 22784, 22848, 22880, 22881, 22876, 22878, + 0, 16384, 20480, 22528, 22784, 22848, 0, 16384, + 20480, 22528, 22784, 22912, 22880, 0, 16384, 20480, + 22528, 22784, 22912, 22880, 0, 16384, 20480, 22528, + 22784, 22912, 22880, 22882, 0, 16384, 20480, 22528, + 22784, 22912, 22880, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22884, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22884, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22888, 22886, 0, 16384, 20480, 22528, + 22784, 22912, 22880, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22888, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22888, 0, 16384, 20480, 22528, 22784, + 22912, 22880, 22888, 22890, 0, 16384, 20480, 22528, + 22784, 22912, 22880, 22888, 0, 16384, 20480, 22528, + 22784, 22912, 22880, 22896, 22892, 0, 16384, 20480, + 22528, 22784, 22912, 22880, 22896, 22892, 0, 16384, + 20480, 22528, 22784, 22912, 22880, 22896, 22897, 22894, + 0, 16384, 20480, 22528, 22784, 22912, 22880, 0, + 16384, 20480, 22528, 22784, 22912, 22913, 22896, 0, + 16384, 20480, 22528, 22784, 22912, 22913, 22896, 0, + 16384, 20480, 22528, 22784, 22912, 22913, 22896, 22898, + 0, 16384, 20480, 22528, 22784, 22912, 22913, 22896, + 0, 16384, 20480, 22528, 22784, 22912, 22913, 22896, + 22900, 0, 16384, 20480, 22528, 22784, 22912, 22913, + 22896, 22900, 0, 16384, 20480, 22528, 22784, 22912, + 22913, 22896, 22904, 22902, 0, 16384, 20480, 22528, + 22784, 22912, 22913, 22896, 0, 16384, 20480, 22528, + 22784, 22912, 22913, 22896, 22904, 0, 16384, 20480, + 22528, 22784, 22912, 22913, 22915, 22904, 0, 16384, + 20480, 22528, 22784, 22912, 22913, 22915, 22904, 22906, + 0, 16384, 20480, 22528, 22784, 22912, 22913, 22915, + 22904, 0, 16384, 20480, 22528, 22784, 22912, 22913, + 22915, 22904, 22908, 0, 16384, 20480, 22528, 22784, + 22912, 22913, 22915, 22904, 22908, 0, 16384, 20480, + 22528, 22784, 22912, 22913, 22915, 22904, 22908, 22910, + 0, 16384, 20480, 22528, 22784, 0, 16384, 20480, + 22528, 23040, 22912, 0, 16384, 20480, 22528, 23040, + 22912, 0, 16384, 20480, 22528, 23040, 22912, 22914, + 0, 16384, 20480, 22528, 23040, 22912, 0, 16384, + 20480, 22528, 23040, 22912, 22916, 0, 16384, 20480, + 22528, 23040, 22912, 22916, 0, 16384, 20480, 22528, + 23040, 22912, 22920, 22918, 0, 16384, 20480, 22528, + 23040, 22912, 0, 16384, 20480, 22528, 23040, 22912, + 22920, 0, 16384, 20480, 22528, 23040, 22912, 22920, + 0, 16384, 20480, 22528, 23040, 22912, 22920, 22922, + 0, 16384, 20480, 22528, 23040, 22912, 22920, 0, + 16384, 20480, 22528, 23040, 22912, 22928, 22924, 0, + 16384, 20480, 22528, 23040, 22912, 22928, 22924, 0, + 16384, 20480, 22528, 23040, 22912, 22928, 22929, 22926, + 0, 16384, 20480, 22528, 23040, 22912, 0, 16384, + 20480, 22528, 23040, 22912, 22928, 0, 16384, 20480, + 22528, 23040, 22912, 22928, 0, 16384, 20480, 22528, + 23040, 22912, 22928, 22930, 0, 16384, 20480, 22528, + 23040, 22912, 22928, 0, 16384, 20480, 22528, 23040, + 22912, 22928, 22932, 0, 16384, 20480, 22528, 23040, + 22912, 22928, 22932, 0, 16384, 20480, 22528, 23040, + 22912, 22928, 22936, 22934, 0, 16384, 20480, 22528, + 23040, 22912, 22928, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22936, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22936, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22936, 22938, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 22936, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 22945, 22940, 0, 16384, 20480, + 22528, 23040, 22912, 22944, 22945, 22940, 0, 16384, + 20480, 22528, 23040, 22912, 22944, 22945, 22940, 22942, + 0, 16384, 20480, 22528, 23040, 22912, 0, 16384, + 20480, 22528, 23040, 22912, 22944, 0, 16384, 20480, + 22528, 23040, 22912, 22944, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 22946, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22948, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22948, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22952, 22950, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22952, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22952, 0, 16384, 20480, 22528, 23040, + 22912, 22944, 22952, 22954, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 22952, 0, 16384, 20480, 22528, + 23040, 22912, 22944, 22960, 22956, 0, 16384, 20480, + 22528, 23040, 22912, 22944, 22960, 22956, 0, 16384, + 20480, 22528, 23040, 22912, 22944, 22960, 22961, 22958, + 0, 16384, 20480, 22528, 23040, 22912, 22944, 0, + 16384, 20480, 22528, 23040, 22912, 22976, 22960, 0, + 16384, 20480, 22528, 23040, 22912, 22976, 22960, 0, + 16384, 20480, 22528, 23040, 22912, 22976, 22960, 22962, + 0, 16384, 20480, 22528, 23040, 22912, 22976, 22960, + 0, 16384, 20480, 22528, 23040, 22912, 22976, 22960, + 22964, 0, 16384, 20480, 22528, 23040, 22912, 22976, + 22960, 22964, 0, 16384, 20480, 22528, 23040, 22912, + 22976, 22960, 22968, 22966, 0, 16384, 20480, 22528, + 23040, 22912, 22976, 22960, 0, 16384, 20480, 22528, + 23040, 22912, 22976, 22977, 22968, 0, 16384, 20480, + 22528, 23040, 22912, 22976, 22977, 22968, 0, 16384, + 20480, 22528, 23040, 22912, 22976, 22977, 22968, 22970, + 0, 16384, 20480, 22528, 23040, 22912, 22976, 22977, + 22968, 0, 16384, 20480, 22528, 23040, 22912, 22976, + 22977, 22968, 22972, 0, 16384, 20480, 22528, 23040, + 22912, 22976, 22977, 22979, 22972, 0, 16384, 20480, + 22528, 23040, 22912, 22976, 22977, 22979, 22972, 22974, + 0, 16384, 20480, 22528, 23040, 22912, 0, 16384, + 20480, 22528, 23040, 23041, 22976, 0, 16384, 20480, + 22528, 23040, 23041, 22976, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 22978, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22980, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22980, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22984, 22982, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22984, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22984, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 22984, 22986, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 22984, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 22992, 22988, 0, 16384, 20480, + 22528, 23040, 23041, 22976, 22992, 22988, 0, 16384, + 20480, 22528, 23040, 23041, 22976, 22992, 22993, 22990, + 0, 16384, 20480, 22528, 23040, 23041, 22976, 0, + 16384, 20480, 22528, 23040, 23041, 22976, 22992, 0, + 16384, 20480, 22528, 23040, 23041, 22976, 22992, 0, + 16384, 20480, 22528, 23040, 23041, 22976, 22992, 22994, + 0, 16384, 20480, 22528, 23040, 23041, 22976, 22992, + 0, 16384, 20480, 22528, 23040, 23041, 22976, 22992, + 22996, 0, 16384, 20480, 22528, 23040, 23041, 22976, + 22992, 22996, 0, 16384, 20480, 22528, 23040, 23041, + 22976, 22992, 23000, 22998, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 22992, 0, 16384, 20480, 22528, + 23040, 23041, 22976, 23008, 23000, 0, 16384, 20480, + 22528, 23040, 23041, 22976, 23008, 23000, 0, 16384, + 20480, 22528, 23040, 23041, 22976, 23008, 23000, 23002, + 0, 16384, 20480, 22528, 23040, 23041, 22976, 23008, + 23000, 0, 16384, 20480, 22528, 23040, 23041, 22976, + 23008, 23009, 23004, 0, 16384, 20480, 22528, 23040, + 23041, 22976, 23008, 23009, 23004, 0, 16384, 20480, + 22528, 23040, 23041, 22976, 23008, 23009, 23004, 23006, + 0, 16384, 20480, 22528, 23040, 23041, 22976, 0, + 16384, 20480, 22528, 23040, 23041, 22976, 23008, 0, + 16384, 20480, 22528, 23040, 23041, 23043, 23008, 0, + 16384, 20480, 22528, 23040, 23041, 23043, 23008, 23010, + 0, 16384, 20480, 22528, 23040, 23041, 23043, 23008, + 0, 16384, 20480, 22528, 23040, 23041, 23043, 23008, + 23012, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23008, 23012, 0, 16384, 20480, 22528, 23040, 23041, + 23043, 23008, 23016, 23014, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23008, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23008, 23016, 0, 16384, 20480, + 22528, 23040, 23041, 23043, 23008, 23016, 0, 16384, + 20480, 22528, 23040, 23041, 23043, 23008, 23016, 23018, + 0, 16384, 20480, 22528, 23040, 23041, 23043, 23008, + 23016, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23008, 23024, 23020, 0, 16384, 20480, 22528, 23040, + 23041, 23043, 23008, 23024, 23020, 0, 16384, 20480, + 22528, 23040, 23041, 23043, 23008, 23024, 23025, 23022, + 0, 16384, 20480, 22528, 23040, 23041, 23043, 23008, + 0, 16384, 20480, 22528, 23040, 23041, 23043, 23008, + 23024, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23008, 23024, 0, 16384, 20480, 22528, 23040, 23041, + 23043, 23008, 23024, 23026, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23047, 23024, 0, 16384, 20480, + 22528, 23040, 23041, 23043, 23047, 23024, 23028, 0, + 16384, 20480, 22528, 23040, 23041, 23043, 23047, 23024, + 23028, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23047, 23024, 23032, 23030, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23047, 23024, 0, 16384, 20480, + 22528, 23040, 23041, 23043, 23047, 23024, 23032, 0, + 16384, 20480, 22528, 23040, 23041, 23043, 23047, 23024, + 23032, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23047, 23024, 23032, 23034, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23047, 23024, 23032, 0, 16384, + 20480, 22528, 23040, 23041, 23043, 23047, 23024, 23032, + 23036, 0, 16384, 20480, 22528, 23040, 23041, 23043, + 23047, 23024, 23032, 23036, 0, 16384, 20480, 22528, + 23040, 23041, 23043, 23047, 23024, 23032, 23036, 23038, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 23040, 0, 16384, 20480, 22528, 23040, 0, 16384, + 20480, 22528, 23040, 23042, 0, 16384, 20480, 22528, + 23040, 0, 16384, 20480, 22528, 23040, 23044, 0, + 16384, 20480, 22528, 23040, 23044, 0, 16384, 20480, + 22528, 23040, 23048, 23046, 0, 16384, 20480, 22528, + 23040, 0, 16384, 20480, 22528, 23040, 23048, 0, + 16384, 20480, 22528, 23040, 23048, 0, 16384, 20480, + 22528, 23040, 23048, 23050, 0, 16384, 20480, 22528, + 23040, 23048, 0, 16384, 20480, 22528, 23040, 23056, + 23052, 0, 16384, 20480, 22528, 23040, 23056, 23052, + 0, 16384, 20480, 22528, 23040, 23056, 23057, 23054, + 0, 16384, 20480, 22528, 23040, 0, 16384, 20480, + 22528, 23040, 23056, 0, 16384, 20480, 22528, 23040, + 23056, 0, 16384, 20480, 22528, 23040, 23056, 23058, + 0, 16384, 20480, 22528, 23040, 23056, 0, 16384, + 20480, 22528, 23040, 23056, 23060, 0, 16384, 20480, + 22528, 23040, 23056, 23060, 0, 16384, 20480, 22528, + 23040, 23056, 23064, 23062, 0, 16384, 20480, 22528, + 23040, 23056, 0, 16384, 20480, 22528, 23040, 23072, + 23064, 0, 16384, 20480, 22528, 23040, 23072, 23064, + 0, 16384, 20480, 22528, 23040, 23072, 23064, 23066, + 0, 16384, 20480, 22528, 23040, 23072, 23064, 0, + 16384, 20480, 22528, 23040, 23072, 23073, 23068, 0, + 16384, 20480, 22528, 23040, 23072, 23073, 23068, 0, + 16384, 20480, 22528, 23040, 23072, 23073, 23068, 23070, + 0, 16384, 20480, 22528, 23040, 0, 16384, 20480, + 22528, 23040, 23072, 0, 16384, 20480, 22528, 23040, + 23072, 0, 16384, 20480, 22528, 23040, 23072, 23074, + 0, 16384, 20480, 22528, 23040, 23072, 0, 16384, + 20480, 22528, 23040, 23072, 23076, 0, 16384, 20480, + 22528, 23040, 23072, 23076, 0, 16384, 20480, 22528, + 23040, 23072, 23080, 23078, 0, 16384, 20480, 22528, + 23040, 23072, 0, 16384, 20480, 22528, 23040, 23072, + 23080, 0, 16384, 20480, 22528, 23040, 23072, 23080, + 0, 16384, 20480, 22528, 23040, 23072, 23080, 23082, + 0, 16384, 20480, 22528, 23040, 23072, 23080, 0, + 16384, 20480, 22528, 23040, 23072, 23088, 23084, 0, + 16384, 20480, 22528, 23040, 23072, 23088, 23084, 0, + 16384, 20480, 22528, 23040, 23072, 23088, 23089, 23086, + 0, 16384, 20480, 22528, 23040, 23072, 0, 16384, + 20480, 22528, 23040, 23104, 23088, 0, 16384, 20480, + 22528, 23040, 23104, 23088, 0, 16384, 20480, 22528, + 23040, 23104, 23088, 23090, 0, 16384, 20480, 22528, + 23040, 23104, 23088, 0, 16384, 20480, 22528, 23040, + 23104, 23088, 23092, 0, 16384, 20480, 22528, 23040, + 23104, 23088, 23092, 0, 16384, 20480, 22528, 23040, + 23104, 23088, 23096, 23094, 0, 16384, 20480, 22528, + 23040, 23104, 23088, 0, 16384, 20480, 22528, 23040, + 23104, 23105, 23096, 0, 16384, 20480, 22528, 23040, + 23104, 23105, 23096, 0, 16384, 20480, 22528, 23040, + 23104, 23105, 23096, 23098, 0, 16384, 20480, 22528, + 23040, 23104, 23105, 23096, 0, 16384, 20480, 22528, + 23040, 23104, 23105, 23096, 23100, 0, 16384, 20480, + 22528, 23040, 23104, 23105, 23107, 23100, 0, 16384, + 20480, 22528, 23040, 23104, 23105, 23107, 23100, 23102, + 0, 16384, 20480, 22528, 23040, 0, 16384, 20480, + 22528, 23040, 23104, 0, 16384, 20480, 22528, 23040, + 23104, 0, 16384, 20480, 22528, 23040, 23104, 23106, + 0, 16384, 20480, 22528, 23040, 23104, 0, 16384, + 20480, 22528, 23040, 23104, 23108, 0, 16384, 20480, + 22528, 23040, 23104, 23108, 0, 16384, 20480, 22528, + 23040, 23104, 23112, 23110, 0, 16384, 20480, 22528, + 23040, 23104, 0, 16384, 20480, 22528, 23040, 23104, + 23112, 0, 16384, 20480, 22528, 23040, 23104, 23112, + 0, 16384, 20480, 22528, 23040, 23104, 23112, 23114, + 0, 16384, 20480, 22528, 23040, 23104, 23112, 0, + 16384, 20480, 22528, 23040, 23104, 23120, 23116, 0, + 16384, 20480, 22528, 23040, 23104, 23120, 23116, 0, + 16384, 20480, 22528, 23040, 23104, 23120, 23121, 23118, + 0, 16384, 20480, 22528, 23040, 23104, 0, 16384, + 20480, 22528, 23040, 23104, 23120, 0, 16384, 20480, + 22528, 23040, 23104, 23120, 0, 16384, 20480, 22528, + 23040, 23104, 23120, 23122, 0, 16384, 20480, 22528, + 23040, 23104, 23120, 0, 16384, 20480, 22528, 23040, + 23104, 23120, 23124, 0, 16384, 20480, 22528, 23040, + 23104, 23120, 23124, 0, 16384, 20480, 22528, 23040, + 23104, 23120, 23128, 23126, 0, 16384, 20480, 22528, + 23040, 23104, 23120, 0, 16384, 20480, 22528, 23040, + 23104, 23136, 23128, 0, 16384, 20480, 22528, 23040, + 23104, 23136, 23128, 0, 16384, 20480, 22528, 23040, + 23104, 23136, 23128, 23130, 0, 16384, 20480, 22528, + 23040, 23104, 23136, 23128, 0, 16384, 20480, 22528, + 23040, 23104, 23136, 23137, 23132, 0, 16384, 20480, + 22528, 23040, 23104, 23136, 23137, 23132, 0, 16384, + 20480, 22528, 23040, 23104, 23136, 23137, 23132, 23134, + 0, 16384, 20480, 22528, 23040, 23104, 0, 16384, + 20480, 22528, 23040, 23168, 23136, 0, 16384, 20480, + 22528, 23040, 23168, 23136, 0, 16384, 20480, 22528, + 23040, 23168, 23136, 23138, 0, 16384, 20480, 22528, + 23040, 23168, 23136, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23140, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23140, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23144, 23142, 0, 16384, 20480, 22528, + 23040, 23168, 23136, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23144, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23144, 0, 16384, 20480, 22528, 23040, + 23168, 23136, 23144, 23146, 0, 16384, 20480, 22528, + 23040, 23168, 23136, 23144, 0, 16384, 20480, 22528, + 23040, 23168, 23136, 23152, 23148, 0, 16384, 20480, + 22528, 23040, 23168, 23136, 23152, 23148, 0, 16384, + 20480, 22528, 23040, 23168, 23136, 23152, 23153, 23150, + 0, 16384, 20480, 22528, 23040, 23168, 23136, 0, + 16384, 20480, 22528, 23040, 23168, 23169, 23152, 0, + 16384, 20480, 22528, 23040, 23168, 23169, 23152, 0, + 16384, 20480, 22528, 23040, 23168, 23169, 23152, 23154, + 0, 16384, 20480, 22528, 23040, 23168, 23169, 23152, + 0, 16384, 20480, 22528, 23040, 23168, 23169, 23152, + 23156, 0, 16384, 20480, 22528, 23040, 23168, 23169, + 23152, 23156, 0, 16384, 20480, 22528, 23040, 23168, + 23169, 23152, 23160, 23158, 0, 16384, 20480, 22528, + 23040, 23168, 23169, 23152, 0, 16384, 20480, 22528, + 23040, 23168, 23169, 23152, 23160, 0, 16384, 20480, + 22528, 23040, 23168, 23169, 23171, 23160, 0, 16384, + 20480, 22528, 23040, 23168, 23169, 23171, 23160, 23162, + 0, 16384, 20480, 22528, 23040, 23168, 23169, 23171, + 23160, 0, 16384, 20480, 22528, 23040, 23168, 23169, + 23171, 23160, 23164, 0, 16384, 20480, 22528, 23040, + 23168, 23169, 23171, 23160, 23164, 0, 16384, 20480, + 22528, 23040, 23168, 23169, 23171, 23160, 23164, 23166, + 0, 16384, 20480, 22528, 23040, 0, 16384, 20480, + 22528, 23040, 23168, 0, 16384, 20480, 22528, 23040, + 23168, 0, 16384, 20480, 22528, 23040, 23168, 23170, + 0, 16384, 20480, 22528, 23040, 23168, 0, 16384, + 20480, 22528, 23040, 23168, 23172, 0, 16384, 20480, + 22528, 23040, 23168, 23172, 0, 16384, 20480, 22528, + 23040, 23168, 23176, 23174, 0, 16384, 20480, 22528, + 23040, 23168, 0, 16384, 20480, 22528, 23040, 23168, + 23176, 0, 16384, 20480, 22528, 23040, 23168, 23176, + 0, 16384, 20480, 22528, 23040, 23168, 23176, 23178, + 0, 16384, 20480, 22528, 23040, 23168, 23176, 0, + 16384, 20480, 22528, 23040, 23168, 23184, 23180, 0, + 16384, 20480, 22528, 23040, 23168, 23184, 23180, 0, + 16384, 20480, 22528, 23040, 23168, 23184, 23185, 23182, + 0, 16384, 20480, 22528, 23040, 23168, 0, 16384, + 20480, 22528, 23040, 23168, 23184, 0, 16384, 20480, + 22528, 23040, 23168, 23184, 0, 16384, 20480, 22528, + 23040, 23168, 23184, 23186, 0, 16384, 20480, 22528, + 23040, 23168, 23184, 0, 16384, 20480, 22528, 23040, + 23168, 23184, 23188, 0, 16384, 20480, 22528, 23040, + 23168, 23184, 23188, 0, 16384, 20480, 22528, 23040, + 23168, 23184, 23192, 23190, 0, 16384, 20480, 22528, + 23040, 23168, 23184, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23192, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23192, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23192, 23194, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 23192, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 23201, 23196, 0, 16384, 20480, + 22528, 23040, 23168, 23200, 23201, 23196, 0, 16384, + 20480, 22528, 23040, 23168, 23200, 23201, 23196, 23198, + 0, 16384, 20480, 22528, 23040, 23168, 0, 16384, + 20480, 22528, 23040, 23168, 23200, 0, 16384, 20480, + 22528, 23040, 23168, 23200, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 23202, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23204, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23204, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23208, 23206, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23208, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23208, 0, 16384, 20480, 22528, 23040, + 23168, 23200, 23208, 23210, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 23208, 0, 16384, 20480, 22528, + 23040, 23168, 23200, 23216, 23212, 0, 16384, 20480, + 22528, 23040, 23168, 23200, 23216, 23212, 0, 16384, + 20480, 22528, 23040, 23168, 23200, 23216, 23217, 23214, + 0, 16384, 20480, 22528, 23040, 23168, 23200, 0, + 16384, 20480, 22528, 23040, 23168, 23232, 23216, 0, + 16384, 20480, 22528, 23040, 23168, 23232, 23216, 0, + 16384, 20480, 22528, 23040, 23168, 23232, 23216, 23218, + 0, 16384, 20480, 22528, 23040, 23168, 23232, 23216, + 0, 16384, 20480, 22528, 23040, 23168, 23232, 23216, + 23220, 0, 16384, 20480, 22528, 23040, 23168, 23232, + 23216, 23220, 0, 16384, 20480, 22528, 23040, 23168, + 23232, 23216, 23224, 23222, 0, 16384, 20480, 22528, + 23040, 23168, 23232, 23216, 0, 16384, 20480, 22528, + 23040, 23168, 23232, 23233, 23224, 0, 16384, 20480, + 22528, 23040, 23168, 23232, 23233, 23224, 0, 16384, + 20480, 22528, 23040, 23168, 23232, 23233, 23224, 23226, + 0, 16384, 20480, 22528, 23040, 23168, 23232, 23233, + 23224, 0, 16384, 20480, 22528, 23040, 23168, 23232, + 23233, 23224, 23228, 0, 16384, 20480, 22528, 23040, + 23168, 23232, 23233, 23235, 23228, 0, 16384, 20480, + 22528, 23040, 23168, 23232, 23233, 23235, 23228, 23230, + 0, 16384, 20480, 22528, 23040, 23168, 0, 16384, + 20480, 22528, 23040, 23296, 23232, 0, 16384, 20480, + 22528, 23040, 23296, 23232, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 23234, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23236, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23236, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23240, 23238, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23240, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23240, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23240, 23242, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 23240, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 23248, 23244, 0, 16384, 20480, + 22528, 23040, 23296, 23232, 23248, 23244, 0, 16384, + 20480, 22528, 23040, 23296, 23232, 23248, 23249, 23246, + 0, 16384, 20480, 22528, 23040, 23296, 23232, 0, + 16384, 20480, 22528, 23040, 23296, 23232, 23248, 0, + 16384, 20480, 22528, 23040, 23296, 23232, 23248, 0, + 16384, 20480, 22528, 23040, 23296, 23232, 23248, 23250, + 0, 16384, 20480, 22528, 23040, 23296, 23232, 23248, + 0, 16384, 20480, 22528, 23040, 23296, 23232, 23248, + 23252, 0, 16384, 20480, 22528, 23040, 23296, 23232, + 23248, 23252, 0, 16384, 20480, 22528, 23040, 23296, + 23232, 23248, 23256, 23254, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 23248, 0, 16384, 20480, 22528, + 23040, 23296, 23232, 23264, 23256, 0, 16384, 20480, + 22528, 23040, 23296, 23232, 23264, 23256, 0, 16384, + 20480, 22528, 23040, 23296, 23232, 23264, 23256, 23258, + 0, 16384, 20480, 22528, 23040, 23296, 23232, 23264, + 23256, 0, 16384, 20480, 22528, 23040, 23296, 23232, + 23264, 23265, 23260, 0, 16384, 20480, 22528, 23040, + 23296, 23232, 23264, 23265, 23260, 0, 16384, 20480, + 22528, 23040, 23296, 23232, 23264, 23265, 23260, 23262, + 0, 16384, 20480, 22528, 23040, 23296, 23232, 0, + 16384, 20480, 22528, 23040, 23296, 23297, 23264, 0, + 16384, 20480, 22528, 23040, 23296, 23297, 23264, 0, + 16384, 20480, 22528, 23040, 23296, 23297, 23264, 23266, + 0, 16384, 20480, 22528, 23040, 23296, 23297, 23264, + 0, 16384, 20480, 22528, 23040, 23296, 23297, 23264, + 23268, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23264, 23268, 0, 16384, 20480, 22528, 23040, 23296, + 23297, 23264, 23272, 23270, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23264, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23264, 23272, 0, 16384, 20480, + 22528, 23040, 23296, 23297, 23264, 23272, 0, 16384, + 20480, 22528, 23040, 23296, 23297, 23264, 23272, 23274, + 0, 16384, 20480, 22528, 23040, 23296, 23297, 23264, + 23272, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23264, 23280, 23276, 0, 16384, 20480, 22528, 23040, + 23296, 23297, 23264, 23280, 23276, 0, 16384, 20480, + 22528, 23040, 23296, 23297, 23264, 23280, 23281, 23278, + 0, 16384, 20480, 22528, 23040, 23296, 23297, 23264, + 0, 16384, 20480, 22528, 23040, 23296, 23297, 23264, + 23280, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23299, 23280, 0, 16384, 20480, 22528, 23040, 23296, + 23297, 23299, 23280, 23282, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23299, 23280, 0, 16384, 20480, + 22528, 23040, 23296, 23297, 23299, 23280, 23284, 0, + 16384, 20480, 22528, 23040, 23296, 23297, 23299, 23280, + 23284, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23299, 23280, 23288, 23286, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23299, 23280, 0, 16384, 20480, + 22528, 23040, 23296, 23297, 23299, 23280, 23288, 0, + 16384, 20480, 22528, 23040, 23296, 23297, 23299, 23280, + 23288, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23299, 23280, 23288, 23290, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23299, 23303, 23288, 0, 16384, + 20480, 22528, 23040, 23296, 23297, 23299, 23303, 23288, + 23292, 0, 16384, 20480, 22528, 23040, 23296, 23297, + 23299, 23303, 23288, 23292, 0, 16384, 20480, 22528, + 23040, 23296, 23297, 23299, 23303, 23288, 23292, 23294, + 0, 16384, 20480, 22528, 23040, 0, 16384, 20480, + 22528, 23552, 23296, 0, 16384, 20480, 22528, 23552, + 23296, 0, 16384, 20480, 22528, 23552, 23296, 23298, + 0, 16384, 20480, 22528, 23552, 23296, 0, 16384, + 20480, 22528, 23552, 23296, 23300, 0, 16384, 20480, + 22528, 23552, 23296, 23300, 0, 16384, 20480, 22528, + 23552, 23296, 23304, 23302, 0, 16384, 20480, 22528, + 23552, 23296, 0, 16384, 20480, 22528, 23552, 23296, + 23304, 0, 16384, 20480, 22528, 23552, 23296, 23304, + 0, 16384, 20480, 22528, 23552, 23296, 23304, 23306, + 0, 16384, 20480, 22528, 23552, 23296, 23304, 0, + 16384, 20480, 22528, 23552, 23296, 23312, 23308, 0, + 16384, 20480, 22528, 23552, 23296, 23312, 23308, 0, + 16384, 20480, 22528, 23552, 23296, 23312, 23313, 23310, + 0, 16384, 20480, 22528, 23552, 23296, 0, 16384, + 20480, 22528, 23552, 23296, 23312, 0, 16384, 20480, + 22528, 23552, 23296, 23312, 0, 16384, 20480, 22528, + 23552, 23296, 23312, 23314, 0, 16384, 20480, 22528, + 23552, 23296, 23312, 0, 16384, 20480, 22528, 23552, + 23296, 23312, 23316, 0, 16384, 20480, 22528, 23552, + 23296, 23312, 23316, 0, 16384, 20480, 22528, 23552, + 23296, 23312, 23320, 23318, 0, 16384, 20480, 22528, + 23552, 23296, 23312, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23320, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23320, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23320, 23322, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 23320, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 23329, 23324, 0, 16384, 20480, + 22528, 23552, 23296, 23328, 23329, 23324, 0, 16384, + 20480, 22528, 23552, 23296, 23328, 23329, 23324, 23326, + 0, 16384, 20480, 22528, 23552, 23296, 0, 16384, + 20480, 22528, 23552, 23296, 23328, 0, 16384, 20480, + 22528, 23552, 23296, 23328, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 23330, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23332, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23332, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23336, 23334, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23336, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23336, 0, 16384, 20480, 22528, 23552, + 23296, 23328, 23336, 23338, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 23336, 0, 16384, 20480, 22528, + 23552, 23296, 23328, 23344, 23340, 0, 16384, 20480, + 22528, 23552, 23296, 23328, 23344, 23340, 0, 16384, + 20480, 22528, 23552, 23296, 23328, 23344, 23345, 23342, + 0, 16384, 20480, 22528, 23552, 23296, 23328, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23344, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23344, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23344, 23346, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23344, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23344, + 23348, 0, 16384, 20480, 22528, 23552, 23296, 23360, + 23344, 23348, 0, 16384, 20480, 22528, 23552, 23296, + 23360, 23344, 23352, 23350, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23344, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23361, 23352, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 23361, 23352, 0, 16384, + 20480, 22528, 23552, 23296, 23360, 23361, 23352, 23354, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23361, + 23352, 0, 16384, 20480, 22528, 23552, 23296, 23360, + 23361, 23352, 23356, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23361, 23363, 23356, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 23361, 23363, 23356, 23358, + 0, 16384, 20480, 22528, 23552, 23296, 0, 16384, + 20480, 22528, 23552, 23296, 23360, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23362, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23364, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23364, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23368, 23366, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23368, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23368, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23368, 23370, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23368, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23376, 23372, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 23376, 23372, 0, 16384, + 20480, 22528, 23552, 23296, 23360, 23376, 23377, 23374, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23376, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23376, 0, + 16384, 20480, 22528, 23552, 23296, 23360, 23376, 23378, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23376, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23376, + 23380, 0, 16384, 20480, 22528, 23552, 23296, 23360, + 23376, 23380, 0, 16384, 20480, 22528, 23552, 23296, + 23360, 23376, 23384, 23382, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23376, 0, 16384, 20480, 22528, + 23552, 23296, 23360, 23392, 23384, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 23392, 23384, 0, 16384, + 20480, 22528, 23552, 23296, 23360, 23392, 23384, 23386, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 23392, + 23384, 0, 16384, 20480, 22528, 23552, 23296, 23360, + 23392, 23393, 23388, 0, 16384, 20480, 22528, 23552, + 23296, 23360, 23392, 23393, 23388, 0, 16384, 20480, + 22528, 23552, 23296, 23360, 23392, 23393, 23388, 23390, + 0, 16384, 20480, 22528, 23552, 23296, 23360, 0, + 16384, 20480, 22528, 23552, 23296, 23424, 23392, 0, + 16384, 20480, 22528, 23552, 23296, 23424, 23392, 0, + 16384, 20480, 22528, 23552, 23296, 23424, 23392, 23394, + 0, 16384, 20480, 22528, 23552, 23296, 23424, 23392, + 0, 16384, 20480, 22528, 23552, 23296, 23424, 23392, + 23396, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23392, 23396, 0, 16384, 20480, 22528, 23552, 23296, + 23424, 23392, 23400, 23398, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23392, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23392, 23400, 0, 16384, 20480, + 22528, 23552, 23296, 23424, 23392, 23400, 0, 16384, + 20480, 22528, 23552, 23296, 23424, 23392, 23400, 23402, + 0, 16384, 20480, 22528, 23552, 23296, 23424, 23392, + 23400, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23392, 23408, 23404, 0, 16384, 20480, 22528, 23552, + 23296, 23424, 23392, 23408, 23404, 0, 16384, 20480, + 22528, 23552, 23296, 23424, 23392, 23408, 23409, 23406, + 0, 16384, 20480, 22528, 23552, 23296, 23424, 23392, + 0, 16384, 20480, 22528, 23552, 23296, 23424, 23425, + 23408, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23425, 23408, 0, 16384, 20480, 22528, 23552, 23296, + 23424, 23425, 23408, 23410, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23425, 23408, 0, 16384, 20480, + 22528, 23552, 23296, 23424, 23425, 23408, 23412, 0, + 16384, 20480, 22528, 23552, 23296, 23424, 23425, 23408, + 23412, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23425, 23408, 23416, 23414, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23425, 23408, 0, 16384, 20480, + 22528, 23552, 23296, 23424, 23425, 23408, 23416, 0, + 16384, 20480, 22528, 23552, 23296, 23424, 23425, 23427, + 23416, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23425, 23427, 23416, 23418, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23425, 23427, 23416, 0, 16384, + 20480, 22528, 23552, 23296, 23424, 23425, 23427, 23416, + 23420, 0, 16384, 20480, 22528, 23552, 23296, 23424, + 23425, 23427, 23416, 23420, 0, 16384, 20480, 22528, + 23552, 23296, 23424, 23425, 23427, 23416, 23420, 23422, + 0, 16384, 20480, 22528, 23552, 23296, 0, 16384, + 20480, 22528, 23552, 23296, 23424, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23426, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23428, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23428, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23432, 23430, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23432, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23432, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23432, 23434, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23432, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23440, 23436, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23440, 23436, 0, 16384, + 20480, 22528, 23552, 23553, 23424, 23440, 23441, 23438, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23440, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23440, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23440, 23442, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23440, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23440, + 23444, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23440, 23444, 0, 16384, 20480, 22528, 23552, 23553, + 23424, 23440, 23448, 23446, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23440, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23456, 23448, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23456, 23448, 0, 16384, + 20480, 22528, 23552, 23553, 23424, 23456, 23448, 23450, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23456, + 23448, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23456, 23457, 23452, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23456, 23457, 23452, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23456, 23457, 23452, 23454, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23456, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23456, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23456, 23458, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23456, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23456, + 23460, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23456, 23460, 0, 16384, 20480, 22528, 23552, 23553, + 23424, 23456, 23464, 23462, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23456, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23456, 23464, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23456, 23464, 0, 16384, + 20480, 22528, 23552, 23553, 23424, 23456, 23464, 23466, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23456, + 23464, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23456, 23472, 23468, 0, 16384, 20480, 22528, 23552, + 23553, 23424, 23456, 23472, 23468, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23456, 23472, 23473, 23470, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23456, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 23488, + 23472, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23488, 23472, 0, 16384, 20480, 22528, 23552, 23553, + 23424, 23488, 23472, 23474, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23488, 23472, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23488, 23472, 23476, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23488, 23472, + 23476, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23488, 23472, 23480, 23478, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23488, 23472, 0, 16384, 20480, + 22528, 23552, 23553, 23424, 23488, 23489, 23480, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23488, 23489, + 23480, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23488, 23489, 23480, 23482, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23488, 23489, 23480, 0, 16384, + 20480, 22528, 23552, 23553, 23424, 23488, 23489, 23480, + 23484, 0, 16384, 20480, 22528, 23552, 23553, 23424, + 23488, 23489, 23491, 23484, 0, 16384, 20480, 22528, + 23552, 23553, 23424, 23488, 23489, 23491, 23484, 23486, + 0, 16384, 20480, 22528, 23552, 23553, 23424, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23488, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23488, 0, + 16384, 20480, 22528, 23552, 23553, 23424, 23488, 23490, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 23492, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23492, 0, 16384, 20480, 22528, 23552, 23553, + 23555, 23488, 23496, 23494, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23496, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23488, 23496, 0, 16384, + 20480, 22528, 23552, 23553, 23555, 23488, 23496, 23498, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 23496, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23504, 23500, 0, 16384, 20480, 22528, 23552, + 23553, 23555, 23488, 23504, 23500, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23488, 23504, 23505, 23502, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 23504, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23504, 0, 16384, 20480, 22528, 23552, 23553, + 23555, 23488, 23504, 23506, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23504, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23488, 23504, 23508, 0, + 16384, 20480, 22528, 23552, 23553, 23555, 23488, 23504, + 23508, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23504, 23512, 23510, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23504, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23488, 23520, 23512, 0, + 16384, 20480, 22528, 23552, 23553, 23555, 23488, 23520, + 23512, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23520, 23512, 23514, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23520, 23512, 0, 16384, + 20480, 22528, 23552, 23553, 23555, 23488, 23520, 23521, + 23516, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23520, 23521, 23516, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23520, 23521, 23516, 23518, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23488, + 23520, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23520, 0, 16384, 20480, 22528, 23552, 23553, + 23555, 23488, 23520, 23522, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23488, 23520, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23488, 23520, 23524, 0, + 16384, 20480, 22528, 23552, 23553, 23555, 23488, 23520, + 23524, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23488, 23520, 23528, 23526, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23559, 23520, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23559, 23520, 23528, 0, + 16384, 20480, 22528, 23552, 23553, 23555, 23559, 23520, + 23528, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23559, 23520, 23528, 23530, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23559, 23520, 23528, 0, 16384, + 20480, 22528, 23552, 23553, 23555, 23559, 23520, 23536, + 23532, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23559, 23520, 23536, 23532, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23559, 23520, 23536, 23537, 23534, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23559, + 23520, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23559, 23520, 23536, 0, 16384, 20480, 22528, 23552, + 23553, 23555, 23559, 23520, 23536, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23559, 23520, 23536, 23538, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23559, + 23520, 23536, 0, 16384, 20480, 22528, 23552, 23553, + 23555, 23559, 23520, 23536, 23540, 0, 16384, 20480, + 22528, 23552, 23553, 23555, 23559, 23520, 23536, 23540, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23559, + 23520, 23536, 23544, 23542, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23559, 23520, 23536, 0, 16384, + 20480, 22528, 23552, 23553, 23555, 23559, 23520, 23536, + 23544, 0, 16384, 20480, 22528, 23552, 23553, 23555, + 23559, 23520, 23536, 23544, 0, 16384, 20480, 22528, + 23552, 23553, 23555, 23559, 23520, 23536, 23544, 23546, + 0, 16384, 20480, 22528, 23552, 23553, 23555, 23559, + 23520, 23536, 23544, 0, 16384, 20480, 22528, 23552, + 23553, 23555, 23559, 23520, 23536, 23544, 23548, 0, + 16384, 20480, 22528, 23552, 23553, 23555, 23559, 23520, + 23536, 23544, 23548, 0, 16384, 20480, 22528, 23552, + 23553, 23555, 23559, 23520, 23536, 23544, 23548, 23550, + 0, 16384, 20480, 22528, 0, 16384, 20480, 22528, + 23552, 0, 16384, 20480, 22528, 23552, 0, 16384, + 20480, 22528, 23552, 23554, 0, 16384, 20480, 22528, + 23552, 0, 16384, 20480, 22528, 23552, 23556, 0, + 16384, 20480, 22528, 23552, 23556, 0, 16384, 20480, + 22528, 23552, 23560, 23558, 0, 16384, 20480, 22528, + 23552, 0, 16384, 20480, 22528, 23552, 23560, 0, + 16384, 20480, 22528, 23552, 23560, 0, 16384, 20480, + 22528, 23552, 23560, 23562, 0, 16384, 20480, 22528, + 23552, 23560, 0, 16384, 20480, 22528, 23552, 23568, + 23564, 0, 16384, 20480, 22528, 23552, 23568, 23564, + 0, 16384, 20480, 22528, 23552, 23568, 23569, 23566, + 0, 16384, 20480, 22528, 23552, 0, 16384, 20480, + 22528, 23552, 23568, 0, 16384, 20480, 22528, 23552, + 23568, 0, 16384, 20480, 22528, 23552, 23568, 23570, + 0, 16384, 20480, 22528, 23552, 23568, 0, 16384, + 20480, 22528, 23552, 23568, 23572, 0, 16384, 20480, + 22528, 23552, 23568, 23572, 0, 16384, 20480, 22528, + 23552, 23568, 23576, 23574, 0, 16384, 20480, 22528, + 23552, 23568, 0, 16384, 20480, 22528, 23552, 23584, + 23576, 0, 16384, 20480, 22528, 23552, 23584, 23576, + 0, 16384, 20480, 22528, 23552, 23584, 23576, 23578, + 0, 16384, 20480, 22528, 23552, 23584, 23576, 0, + 16384, 20480, 22528, 23552, 23584, 23585, 23580, 0, + 16384, 20480, 22528, 23552, 23584, 23585, 23580, 0, + 16384, 20480, 22528, 23552, 23584, 23585, 23580, 23582, + 0, 16384, 20480, 22528, 23552, 0, 16384, 20480, + 22528, 23552, 23584, 0, 16384, 20480, 22528, 23552, + 23584, 0, 16384, 20480, 22528, 23552, 23584, 23586, + 0, 16384, 20480, 22528, 23552, 23584, 0, 16384, + 20480, 22528, 23552, 23584, 23588, 0, 16384, 20480, + 22528, 23552, 23584, 23588, 0, 16384, 20480, 22528, + 23552, 23584, 23592, 23590, 0, 16384, 20480, 22528, + 23552, 23584, 0, 16384, 20480, 22528, 23552, 23584, + 23592, 0, 16384, 20480, 22528, 23552, 23584, 23592, + 0, 16384, 20480, 22528, 23552, 23584, 23592, 23594, + 0, 16384, 20480, 22528, 23552, 23584, 23592, 0, + 16384, 20480, 22528, 23552, 23584, 23600, 23596, 0, + 16384, 20480, 22528, 23552, 23584, 23600, 23596, 0, + 16384, 20480, 22528, 23552, 23584, 23600, 23601, 23598, + 0, 16384, 20480, 22528, 23552, 23584, 0, 16384, + 20480, 22528, 23552, 23616, 23600, 0, 16384, 20480, + 22528, 23552, 23616, 23600, 0, 16384, 20480, 22528, + 23552, 23616, 23600, 23602, 0, 16384, 20480, 22528, + 23552, 23616, 23600, 0, 16384, 20480, 22528, 23552, + 23616, 23600, 23604, 0, 16384, 20480, 22528, 23552, + 23616, 23600, 23604, 0, 16384, 20480, 22528, 23552, + 23616, 23600, 23608, 23606, 0, 16384, 20480, 22528, + 23552, 23616, 23600, 0, 16384, 20480, 22528, 23552, + 23616, 23617, 23608, 0, 16384, 20480, 22528, 23552, + 23616, 23617, 23608, 0, 16384, 20480, 22528, 23552, + 23616, 23617, 23608, 23610, 0, 16384, 20480, 22528, + 23552, 23616, 23617, 23608, 0, 16384, 20480, 22528, + 23552, 23616, 23617, 23608, 23612, 0, 16384, 20480, + 22528, 23552, 23616, 23617, 23619, 23612, 0, 16384, + 20480, 22528, 23552, 23616, 23617, 23619, 23612, 23614, + 0, 16384, 20480, 22528, 23552, 0, 16384, 24576, + 22528, 23552, 23616, 0, 16384, 24576, 22528, 23552, + 23616, 0, 16384, 24576, 22528, 23552, 23616, 23618, + 0, 16384, 24576, 22528, 23552, 23616, 0, 16384, + 24576, 22528, 23552, 23616, 23620, 0, 16384, 24576, + 22528, 23552, 23616, 23620, 0, 16384, 24576, 22528, + 23552, 23616, 23624, 23622, 0, 16384, 24576, 22528, + 23552, 23616, 0, 16384, 24576, 22528, 23552, 23616, + 23624, 0, 16384, 24576, 22528, 23552, 23616, 23624, + 0, 16384, 24576, 22528, 23552, 23616, 23624, 23626, + 0, 16384, 24576, 22528, 23552, 23616, 23624, 0, + 16384, 24576, 22528, 23552, 23616, 23632, 23628, 0, + 16384, 24576, 22528, 23552, 23616, 23632, 23628, 0, + 16384, 24576, 22528, 23552, 23616, 23632, 23633, 23630, + 0, 16384, 24576, 22528, 23552, 23616, 0, 16384, + 24576, 22528, 23552, 23616, 23632, 0, 16384, 24576, + 22528, 23552, 23616, 23632, 0, 16384, 24576, 22528, + 23552, 23616, 23632, 23634, 0, 16384, 24576, 22528, + 23552, 23616, 23632, 0, 16384, 24576, 22528, 23552, + 23616, 23632, 23636, 0, 16384, 24576, 22528, 23552, + 23616, 23632, 23636, 0, 16384, 24576, 22528, 23552, + 23616, 23632, 23640, 23638, 0, 16384, 24576, 22528, + 23552, 23616, 23632, 0, 16384, 24576, 22528, 23552, + 23616, 23648, 23640, 0, 16384, 24576, 22528, 23552, + 23616, 23648, 23640, 0, 16384, 24576, 22528, 23552, + 23616, 23648, 23640, 23642, 0, 16384, 24576, 22528, + 23552, 23616, 23648, 23640, 0, 16384, 24576, 22528, + 23552, 23616, 23648, 23649, 23644, 0, 16384, 24576, + 22528, 23552, 23616, 23648, 23649, 23644, 0, 16384, + 24576, 22528, 23552, 23616, 23648, 23649, 23644, 23646, + 0, 16384, 24576, 22528, 23552, 23616, 0, 16384, + 24576, 22528, 23552, 23680, 23648, 0, 16384, 24576, + 22528, 23552, 23680, 23648, 0, 16384, 24576, 22528, + 23552, 23680, 23648, 23650, 0, 16384, 24576, 22528, + 23552, 23680, 23648, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23652, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23652, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23656, 23654, 0, 16384, 24576, 22528, + 23552, 23680, 23648, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23656, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23656, 0, 16384, 24576, 22528, 23552, + 23680, 23648, 23656, 23658, 0, 16384, 24576, 22528, + 23552, 23680, 23648, 23656, 0, 16384, 24576, 22528, + 23552, 23680, 23648, 23664, 23660, 0, 16384, 24576, + 22528, 23552, 23680, 23648, 23664, 23660, 0, 16384, + 24576, 22528, 23552, 23680, 23648, 23664, 23665, 23662, + 0, 16384, 24576, 22528, 23552, 23680, 23648, 0, + 16384, 24576, 22528, 23552, 23680, 23681, 23664, 0, + 16384, 24576, 22528, 23552, 23680, 23681, 23664, 0, + 16384, 24576, 22528, 23552, 23680, 23681, 23664, 23666, + 0, 16384, 24576, 22528, 23552, 23680, 23681, 23664, + 0, 16384, 24576, 22528, 23552, 23680, 23681, 23664, + 23668, 0, 16384, 24576, 22528, 23552, 23680, 23681, + 23664, 23668, 0, 16384, 24576, 22528, 23552, 23680, + 23681, 23664, 23672, 23670, 0, 16384, 24576, 22528, + 23552, 23680, 23681, 23664, 0, 16384, 24576, 22528, + 23552, 23680, 23681, 23664, 23672, 0, 16384, 24576, + 22528, 23552, 23680, 23681, 23683, 23672, 0, 16384, + 24576, 22528, 23552, 23680, 23681, 23683, 23672, 23674, + 0, 16384, 24576, 22528, 23552, 23680, 23681, 23683, + 23672, 0, 16384, 24576, 22528, 23552, 23680, 23681, + 23683, 23672, 23676, 0, 16384, 24576, 22528, 23552, + 23680, 23681, 23683, 23672, 23676, 0, 16384, 24576, + 22528, 23552, 23680, 23681, 23683, 23672, 23676, 23678, + 0, 16384, 24576, 22528, 23552, 0, 16384, 24576, + 22528, 23552, 23680, 0, 16384, 24576, 22528, 23552, + 23680, 0, 16384, 24576, 22528, 23552, 23680, 23682, + 0, 16384, 24576, 22528, 23552, 23680, 0, 16384, + 24576, 22528, 23552, 23680, 23684, 0, 16384, 24576, + 22528, 23552, 23680, 23684, 0, 16384, 24576, 22528, + 23552, 23680, 23688, 23686, 0, 16384, 24576, 22528, + 23552, 23680, 0, 16384, 24576, 22528, 23552, 23680, + 23688, 0, 16384, 24576, 22528, 23552, 23680, 23688, + 0, 16384, 24576, 22528, 23552, 23680, 23688, 23690, + 0, 16384, 24576, 22528, 23552, 23680, 23688, 0, + 16384, 24576, 22528, 23552, 23680, 23696, 23692, 0, + 16384, 24576, 22528, 23552, 23680, 23696, 23692, 0, + 16384, 24576, 22528, 23552, 23680, 23696, 23697, 23694, + 0, 16384, 24576, 22528, 23552, 23680, 0, 16384, + 24576, 22528, 23552, 23680, 23696, 0, 16384, 24576, + 22528, 23552, 23680, 23696, 0, 16384, 24576, 22528, + 23552, 23680, 23696, 23698, 0, 16384, 24576, 22528, + 23552, 23680, 23696, 0, 16384, 24576, 22528, 23552, + 23680, 23696, 23700, 0, 16384, 24576, 22528, 23552, + 23680, 23696, 23700, 0, 16384, 24576, 22528, 23552, + 23680, 23696, 23704, 23702, 0, 16384, 24576, 22528, + 23552, 23680, 23696, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23704, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23704, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23704, 23706, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 23704, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 23713, 23708, 0, 16384, 24576, + 22528, 23552, 23680, 23712, 23713, 23708, 0, 16384, + 24576, 22528, 23552, 23680, 23712, 23713, 23708, 23710, + 0, 16384, 24576, 22528, 23552, 23680, 0, 16384, + 24576, 22528, 23552, 23680, 23712, 0, 16384, 24576, + 22528, 23552, 23680, 23712, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 23714, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23716, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23716, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23720, 23718, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23720, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23720, 0, 16384, 24576, 22528, 23552, + 23680, 23712, 23720, 23722, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 23720, 0, 16384, 24576, 22528, + 23552, 23680, 23712, 23728, 23724, 0, 16384, 24576, + 22528, 23552, 23680, 23712, 23728, 23724, 0, 16384, + 24576, 22528, 23552, 23680, 23712, 23728, 23729, 23726, + 0, 16384, 24576, 22528, 23552, 23680, 23712, 0, + 16384, 24576, 22528, 23552, 23680, 23744, 23728, 0, + 16384, 24576, 22528, 23552, 23680, 23744, 23728, 0, + 16384, 24576, 22528, 23552, 23680, 23744, 23728, 23730, + 0, 16384, 24576, 22528, 23552, 23680, 23744, 23728, + 0, 16384, 24576, 22528, 23552, 23680, 23744, 23728, + 23732, 0, 16384, 24576, 22528, 23552, 23680, 23744, + 23728, 23732, 0, 16384, 24576, 22528, 23552, 23680, + 23744, 23728, 23736, 23734, 0, 16384, 24576, 22528, + 23552, 23680, 23744, 23728, 0, 16384, 24576, 22528, + 23552, 23680, 23744, 23745, 23736, 0, 16384, 24576, + 22528, 23552, 23680, 23744, 23745, 23736, 0, 16384, + 24576, 22528, 23552, 23680, 23744, 23745, 23736, 23738, + 0, 16384, 24576, 22528, 23552, 23680, 23744, 23745, + 23736, 0, 16384, 24576, 22528, 23552, 23680, 23744, + 23745, 23736, 23740, 0, 16384, 24576, 22528, 23552, + 23680, 23744, 23745, 23747, 23740, 0, 16384, 24576, + 22528, 23552, 23680, 23744, 23745, 23747, 23740, 23742, + 0, 16384, 24576, 22528, 23552, 23680, 0, 16384, + 24576, 22528, 23552, 23808, 23744, 0, 16384, 24576, + 22528, 23552, 23808, 23744, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 23746, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23748, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23748, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23752, 23750, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23752, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23752, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23752, 23754, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 23752, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 23760, 23756, 0, 16384, 24576, + 22528, 23552, 23808, 23744, 23760, 23756, 0, 16384, + 24576, 22528, 23552, 23808, 23744, 23760, 23761, 23758, + 0, 16384, 24576, 22528, 23552, 23808, 23744, 0, + 16384, 24576, 22528, 23552, 23808, 23744, 23760, 0, + 16384, 24576, 22528, 23552, 23808, 23744, 23760, 0, + 16384, 24576, 22528, 23552, 23808, 23744, 23760, 23762, + 0, 16384, 24576, 22528, 23552, 23808, 23744, 23760, + 0, 16384, 24576, 22528, 23552, 23808, 23744, 23760, + 23764, 0, 16384, 24576, 22528, 23552, 23808, 23744, + 23760, 23764, 0, 16384, 24576, 22528, 23552, 23808, + 23744, 23760, 23768, 23766, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 23760, 0, 16384, 24576, 22528, + 23552, 23808, 23744, 23776, 23768, 0, 16384, 24576, + 22528, 23552, 23808, 23744, 23776, 23768, 0, 16384, + 24576, 22528, 23552, 23808, 23744, 23776, 23768, 23770, + 0, 16384, 24576, 22528, 23552, 23808, 23744, 23776, + 23768, 0, 16384, 24576, 22528, 23552, 23808, 23744, + 23776, 23777, 23772, 0, 16384, 24576, 22528, 23552, + 23808, 23744, 23776, 23777, 23772, 0, 16384, 24576, + 22528, 23552, 23808, 23744, 23776, 23777, 23772, 23774, + 0, 16384, 24576, 22528, 23552, 23808, 23744, 0, + 16384, 24576, 22528, 23552, 23808, 23809, 23776, 0, + 16384, 24576, 22528, 23552, 23808, 23809, 23776, 0, + 16384, 24576, 22528, 23552, 23808, 23809, 23776, 23778, + 0, 16384, 24576, 22528, 23552, 23808, 23809, 23776, + 0, 16384, 24576, 22528, 23552, 23808, 23809, 23776, + 23780, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23776, 23780, 0, 16384, 24576, 22528, 23552, 23808, + 23809, 23776, 23784, 23782, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23776, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23776, 23784, 0, 16384, 24576, + 22528, 23552, 23808, 23809, 23776, 23784, 0, 16384, + 24576, 22528, 23552, 23808, 23809, 23776, 23784, 23786, + 0, 16384, 24576, 22528, 23552, 23808, 23809, 23776, + 23784, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23776, 23792, 23788, 0, 16384, 24576, 22528, 23552, + 23808, 23809, 23776, 23792, 23788, 0, 16384, 24576, + 22528, 23552, 23808, 23809, 23776, 23792, 23793, 23790, + 0, 16384, 24576, 22528, 23552, 23808, 23809, 23776, + 0, 16384, 24576, 22528, 23552, 23808, 23809, 23776, + 23792, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23811, 23792, 0, 16384, 24576, 22528, 23552, 23808, + 23809, 23811, 23792, 23794, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23811, 23792, 0, 16384, 24576, + 22528, 23552, 23808, 23809, 23811, 23792, 23796, 0, + 16384, 24576, 22528, 23552, 23808, 23809, 23811, 23792, + 23796, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23811, 23792, 23800, 23798, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23811, 23792, 0, 16384, 24576, + 22528, 23552, 23808, 23809, 23811, 23792, 23800, 0, + 16384, 24576, 22528, 23552, 23808, 23809, 23811, 23792, + 23800, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23811, 23792, 23800, 23802, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23811, 23815, 23800, 0, 16384, + 24576, 22528, 23552, 23808, 23809, 23811, 23815, 23800, + 23804, 0, 16384, 24576, 22528, 23552, 23808, 23809, + 23811, 23815, 23800, 23804, 0, 16384, 24576, 22528, + 23552, 23808, 23809, 23811, 23815, 23800, 23804, 23806, + 0, 16384, 24576, 22528, 23552, 0, 16384, 24576, + 22528, 23552, 23808, 0, 16384, 24576, 24577, 23552, + 23808, 0, 16384, 24576, 24577, 23552, 23808, 23810, + 0, 16384, 24576, 24577, 23552, 23808, 0, 16384, + 24576, 24577, 23552, 23808, 23812, 0, 16384, 24576, + 24577, 23552, 23808, 23812, 0, 16384, 24576, 24577, + 23552, 23808, 23816, 23814, 0, 16384, 24576, 24577, + 23552, 23808, 0, 16384, 24576, 24577, 23552, 23808, + 23816, 0, 16384, 24576, 24577, 23552, 23808, 23816, + 0, 16384, 24576, 24577, 23552, 23808, 23816, 23818, + 0, 16384, 24576, 24577, 23552, 23808, 23816, 0, + 16384, 24576, 24577, 23552, 23808, 23824, 23820, 0, + 16384, 24576, 24577, 23552, 23808, 23824, 23820, 0, + 16384, 24576, 24577, 23552, 23808, 23824, 23825, 23822, + 0, 16384, 24576, 24577, 23552, 23808, 0, 16384, + 24576, 24577, 23552, 23808, 23824, 0, 16384, 24576, + 24577, 23552, 23808, 23824, 0, 16384, 24576, 24577, + 23552, 23808, 23824, 23826, 0, 16384, 24576, 24577, + 23552, 23808, 23824, 0, 16384, 24576, 24577, 23552, + 23808, 23824, 23828, 0, 16384, 24576, 24577, 23552, + 23808, 23824, 23828, 0, 16384, 24576, 24577, 23552, + 23808, 23824, 23832, 23830, 0, 16384, 24576, 24577, + 23552, 23808, 23824, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23832, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23832, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23832, 23834, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 23832, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 23841, 23836, 0, 16384, 24576, + 24577, 23552, 23808, 23840, 23841, 23836, 0, 16384, + 24576, 24577, 23552, 23808, 23840, 23841, 23836, 23838, + 0, 16384, 24576, 24577, 23552, 23808, 0, 16384, + 24576, 24577, 23552, 23808, 23840, 0, 16384, 24576, + 24577, 23552, 23808, 23840, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 23842, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23844, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23844, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23848, 23846, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23848, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23848, 0, 16384, 24576, 24577, 23552, + 23808, 23840, 23848, 23850, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 23848, 0, 16384, 24576, 24577, + 23552, 23808, 23840, 23856, 23852, 0, 16384, 24576, + 24577, 23552, 23808, 23840, 23856, 23852, 0, 16384, + 24576, 24577, 23552, 23808, 23840, 23856, 23857, 23854, + 0, 16384, 24576, 24577, 23552, 23808, 23840, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23856, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23856, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23856, 23858, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23856, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23856, + 23860, 0, 16384, 24576, 24577, 23552, 23808, 23872, + 23856, 23860, 0, 16384, 24576, 24577, 23552, 23808, + 23872, 23856, 23864, 23862, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23856, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23873, 23864, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 23873, 23864, 0, 16384, + 24576, 24577, 23552, 23808, 23872, 23873, 23864, 23866, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23873, + 23864, 0, 16384, 24576, 24577, 23552, 23808, 23872, + 23873, 23864, 23868, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23873, 23875, 23868, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 23873, 23875, 23868, 23870, + 0, 16384, 24576, 24577, 23552, 23808, 0, 16384, + 24576, 24577, 23552, 23808, 23872, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23874, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23876, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23876, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23880, 23878, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23880, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23880, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23880, 23882, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23880, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23888, 23884, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 23888, 23884, 0, 16384, + 24576, 24577, 23552, 23808, 23872, 23888, 23889, 23886, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23888, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23888, 0, + 16384, 24576, 24577, 23552, 23808, 23872, 23888, 23890, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23888, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23888, + 23892, 0, 16384, 24576, 24577, 23552, 23808, 23872, + 23888, 23892, 0, 16384, 24576, 24577, 23552, 23808, + 23872, 23888, 23896, 23894, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23888, 0, 16384, 24576, 24577, + 23552, 23808, 23872, 23904, 23896, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 23904, 23896, 0, 16384, + 24576, 24577, 23552, 23808, 23872, 23904, 23896, 23898, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 23904, + 23896, 0, 16384, 24576, 24577, 23552, 23808, 23872, + 23904, 23905, 23900, 0, 16384, 24576, 24577, 23552, + 23808, 23872, 23904, 23905, 23900, 0, 16384, 24576, + 24577, 23552, 23808, 23872, 23904, 23905, 23900, 23902, + 0, 16384, 24576, 24577, 23552, 23808, 23872, 0, + 16384, 24576, 24577, 23552, 23808, 23936, 23904, 0, + 16384, 24576, 24577, 23552, 23808, 23936, 23904, 0, + 16384, 24576, 24577, 23552, 23808, 23936, 23904, 23906, + 0, 16384, 24576, 24577, 23552, 23808, 23936, 23904, + 0, 16384, 24576, 24577, 23552, 23808, 23936, 23904, + 23908, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23904, 23908, 0, 16384, 24576, 24577, 23552, 23808, + 23936, 23904, 23912, 23910, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23904, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23904, 23912, 0, 16384, 24576, + 24577, 23552, 23808, 23936, 23904, 23912, 0, 16384, + 24576, 24577, 23552, 23808, 23936, 23904, 23912, 23914, + 0, 16384, 24576, 24577, 23552, 23808, 23936, 23904, + 23912, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23904, 23920, 23916, 0, 16384, 24576, 24577, 23552, + 23808, 23936, 23904, 23920, 23916, 0, 16384, 24576, + 24577, 23552, 23808, 23936, 23904, 23920, 23921, 23918, + 0, 16384, 24576, 24577, 23552, 23808, 23936, 23904, + 0, 16384, 24576, 24577, 23552, 23808, 23936, 23937, + 23920, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23937, 23920, 0, 16384, 24576, 24577, 23552, 23808, + 23936, 23937, 23920, 23922, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23937, 23920, 0, 16384, 24576, + 24577, 23552, 23808, 23936, 23937, 23920, 23924, 0, + 16384, 24576, 24577, 23552, 23808, 23936, 23937, 23920, + 23924, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23937, 23920, 23928, 23926, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23937, 23920, 0, 16384, 24576, + 24577, 23552, 23808, 23936, 23937, 23920, 23928, 0, + 16384, 24576, 24577, 23552, 23808, 23936, 23937, 23939, + 23928, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23937, 23939, 23928, 23930, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23937, 23939, 23928, 0, 16384, + 24576, 24577, 23552, 23808, 23936, 23937, 23939, 23928, + 23932, 0, 16384, 24576, 24577, 23552, 23808, 23936, + 23937, 23939, 23928, 23932, 0, 16384, 24576, 24577, + 23552, 23808, 23936, 23937, 23939, 23928, 23932, 23934, + 0, 16384, 24576, 24577, 23552, 23808, 0, 16384, + 24576, 24577, 23552, 24064, 23936, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23938, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23940, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23940, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23944, 23942, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23944, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23944, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23944, 23946, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23944, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23952, 23948, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 23952, 23948, 0, 16384, + 24576, 24577, 23552, 24064, 23936, 23952, 23953, 23950, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23952, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23952, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23952, 23954, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23952, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23952, + 23956, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 23952, 23956, 0, 16384, 24576, 24577, 23552, 24064, + 23936, 23952, 23960, 23958, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23952, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23968, 23960, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 23968, 23960, 0, 16384, + 24576, 24577, 23552, 24064, 23936, 23968, 23960, 23962, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23968, + 23960, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 23968, 23969, 23964, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23968, 23969, 23964, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 23968, 23969, 23964, 23966, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23968, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23968, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 23968, 23970, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23968, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23968, + 23972, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 23968, 23972, 0, 16384, 24576, 24577, 23552, 24064, + 23936, 23968, 23976, 23974, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23968, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 23968, 23976, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 23968, 23976, 0, 16384, + 24576, 24577, 23552, 24064, 23936, 23968, 23976, 23978, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23968, + 23976, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 23968, 23984, 23980, 0, 16384, 24576, 24577, 23552, + 24064, 23936, 23968, 23984, 23980, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 23968, 23984, 23985, 23982, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 23968, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 24000, + 23984, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 24000, 23984, 0, 16384, 24576, 24577, 23552, 24064, + 23936, 24000, 23984, 23986, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 24000, 23984, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 24000, 23984, 23988, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 24000, 23984, + 23988, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 24000, 23984, 23992, 23990, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 24000, 23984, 0, 16384, 24576, + 24577, 23552, 24064, 23936, 24000, 24001, 23992, 0, + 16384, 24576, 24577, 23552, 24064, 23936, 24000, 24001, + 23992, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 24000, 24001, 23992, 23994, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 24000, 24001, 23992, 0, 16384, + 24576, 24577, 23552, 24064, 23936, 24000, 24001, 23992, + 23996, 0, 16384, 24576, 24577, 23552, 24064, 23936, + 24000, 24001, 24003, 23996, 0, 16384, 24576, 24577, + 23552, 24064, 23936, 24000, 24001, 24003, 23996, 23998, + 0, 16384, 24576, 24577, 23552, 24064, 23936, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24000, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24000, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24000, 24002, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 24004, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24004, 0, 16384, 24576, 24577, 23552, 24064, + 24065, 24000, 24008, 24006, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 24008, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24000, 24008, 0, 16384, + 24576, 24577, 23552, 24064, 24065, 24000, 24008, 24010, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 24008, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24016, 24012, 0, 16384, 24576, 24577, 23552, + 24064, 24065, 24000, 24016, 24012, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24000, 24016, 24017, 24014, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 24016, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24016, 0, 16384, 24576, 24577, 23552, 24064, + 24065, 24000, 24016, 24018, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 24016, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24000, 24016, 24020, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24000, 24016, + 24020, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24016, 24024, 24022, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 24016, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24000, 24032, 24024, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24000, 24032, + 24024, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24032, 24024, 24026, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 24032, 24024, 0, 16384, + 24576, 24577, 23552, 24064, 24065, 24000, 24032, 24033, + 24028, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24000, 24032, 24033, 24028, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24000, 24032, 24033, 24028, 24030, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24000, + 24032, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24032, 0, 16384, 24576, 24577, 23552, 24064, + 24065, 24067, 24032, 24034, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24032, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24067, 24032, 24036, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24067, 24032, + 24036, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24032, 24040, 24038, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24032, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24067, 24032, 24040, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24067, 24032, + 24040, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24032, 24040, 24042, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24032, 24040, 0, 16384, + 24576, 24577, 23552, 24064, 24065, 24067, 24032, 24048, + 24044, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24032, 24048, 24044, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24032, 24048, 24049, 24046, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24067, + 24032, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24032, 24048, 0, 16384, 24576, 24577, 23552, + 24064, 24065, 24067, 24032, 24048, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24067, 24032, 24048, 24050, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24067, + 24071, 24048, 0, 16384, 24576, 24577, 23552, 24064, + 24065, 24067, 24071, 24048, 24052, 0, 16384, 24576, + 24577, 23552, 24064, 24065, 24067, 24071, 24048, 24052, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24067, + 24071, 24048, 24056, 24054, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24071, 24048, 0, 16384, + 24576, 24577, 23552, 24064, 24065, 24067, 24071, 24048, + 24056, 0, 16384, 24576, 24577, 23552, 24064, 24065, + 24067, 24071, 24048, 24056, 0, 16384, 24576, 24577, + 23552, 24064, 24065, 24067, 24071, 24048, 24056, 24058, + 0, 16384, 24576, 24577, 23552, 24064, 24065, 24067, + 24071, 24048, 24056, 0, 16384, 24576, 24577, 23552, + 24064, 24065, 24067, 24071, 24048, 24056, 24060, 0, + 16384, 24576, 24577, 23552, 24064, 24065, 24067, 24071, + 24048, 24056, 24060, 0, 16384, 24576, 24577, 23552, + 24064, 24065, 24067, 24071, 24048, 24056, 24060, 24062, + 0, 16384, 24576, 24577, 23552, 0, 16384, 24576, + 24577, 23552, 24064, 0, 16384, 24576, 24577, 23552, + 24064, 0, 16384, 24576, 24577, 23552, 24064, 24066, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24068, 0, 16384, 24576, + 24577, 24579, 24064, 24068, 0, 16384, 24576, 24577, + 24579, 24064, 24072, 24070, 0, 16384, 24576, 24577, + 24579, 24064, 0, 16384, 24576, 24577, 24579, 24064, + 24072, 0, 16384, 24576, 24577, 24579, 24064, 24072, + 0, 16384, 24576, 24577, 24579, 24064, 24072, 24074, + 0, 16384, 24576, 24577, 24579, 24064, 24072, 0, + 16384, 24576, 24577, 24579, 24064, 24080, 24076, 0, + 16384, 24576, 24577, 24579, 24064, 24080, 24076, 0, + 16384, 24576, 24577, 24579, 24064, 24080, 24081, 24078, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24080, 0, 16384, 24576, + 24577, 24579, 24064, 24080, 0, 16384, 24576, 24577, + 24579, 24064, 24080, 24082, 0, 16384, 24576, 24577, + 24579, 24064, 24080, 0, 16384, 24576, 24577, 24579, + 24064, 24080, 24084, 0, 16384, 24576, 24577, 24579, + 24064, 24080, 24084, 0, 16384, 24576, 24577, 24579, + 24064, 24080, 24088, 24086, 0, 16384, 24576, 24577, + 24579, 24064, 24080, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24088, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24088, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24088, 24090, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 24088, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 24097, 24092, 0, 16384, 24576, + 24577, 24579, 24064, 24096, 24097, 24092, 0, 16384, + 24576, 24577, 24579, 24064, 24096, 24097, 24092, 24094, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24096, 0, 16384, 24576, + 24577, 24579, 24064, 24096, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 24098, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24100, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24100, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24104, 24102, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24104, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24104, 0, 16384, 24576, 24577, 24579, + 24064, 24096, 24104, 24106, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 24104, 0, 16384, 24576, 24577, + 24579, 24064, 24096, 24112, 24108, 0, 16384, 24576, + 24577, 24579, 24064, 24096, 24112, 24108, 0, 16384, + 24576, 24577, 24579, 24064, 24096, 24112, 24113, 24110, + 0, 16384, 24576, 24577, 24579, 24064, 24096, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24112, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24112, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24112, 24114, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24112, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24112, + 24116, 0, 16384, 24576, 24577, 24579, 24064, 24128, + 24112, 24116, 0, 16384, 24576, 24577, 24579, 24064, + 24128, 24112, 24120, 24118, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24112, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24129, 24120, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 24129, 24120, 0, 16384, + 24576, 24577, 24579, 24064, 24128, 24129, 24120, 24122, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24129, + 24120, 0, 16384, 24576, 24577, 24579, 24064, 24128, + 24129, 24120, 24124, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24129, 24131, 24124, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 24129, 24131, 24124, 24126, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24128, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24130, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24132, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24132, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24136, 24134, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24136, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24136, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24136, 24138, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24136, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24144, 24140, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 24144, 24140, 0, 16384, + 24576, 24577, 24579, 24064, 24128, 24144, 24145, 24142, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24144, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24144, 0, + 16384, 24576, 24577, 24579, 24064, 24128, 24144, 24146, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24144, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24144, + 24148, 0, 16384, 24576, 24577, 24579, 24064, 24128, + 24144, 24148, 0, 16384, 24576, 24577, 24579, 24064, + 24128, 24144, 24152, 24150, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24144, 0, 16384, 24576, 24577, + 24579, 24064, 24128, 24160, 24152, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 24160, 24152, 0, 16384, + 24576, 24577, 24579, 24064, 24128, 24160, 24152, 24154, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 24160, + 24152, 0, 16384, 24576, 24577, 24579, 24064, 24128, + 24160, 24161, 24156, 0, 16384, 24576, 24577, 24579, + 24064, 24128, 24160, 24161, 24156, 0, 16384, 24576, + 24577, 24579, 24064, 24128, 24160, 24161, 24156, 24158, + 0, 16384, 24576, 24577, 24579, 24064, 24128, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24160, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24160, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24160, 24162, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24160, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24160, + 24164, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24160, 24164, 0, 16384, 24576, 24577, 24579, 24064, + 24192, 24160, 24168, 24166, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24160, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24160, 24168, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24160, 24168, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24160, 24168, 24170, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24160, + 24168, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24160, 24176, 24172, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24160, 24176, 24172, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24160, 24176, 24177, 24174, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24160, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24193, + 24176, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24193, 24176, 0, 16384, 24576, 24577, 24579, 24064, + 24192, 24193, 24176, 24178, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24193, 24176, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24193, 24176, 24180, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24193, 24176, + 24180, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24193, 24176, 24184, 24182, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24193, 24176, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24193, 24176, 24184, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24193, 24195, + 24184, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24193, 24195, 24184, 24186, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24193, 24195, 24184, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24193, 24195, 24184, + 24188, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24193, 24195, 24184, 24188, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24193, 24195, 24184, 24188, 24190, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24194, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24196, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24196, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24200, 24198, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24200, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24200, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24200, 24202, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24200, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24208, 24204, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24208, 24204, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24208, 24209, 24206, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24208, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24208, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24208, 24210, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24208, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24208, + 24212, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24208, 24212, 0, 16384, 24576, 24577, 24579, 24064, + 24192, 24208, 24216, 24214, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24208, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24224, 24216, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24224, 24216, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24224, 24216, 24218, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24224, + 24216, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24224, 24225, 24220, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24224, 24225, 24220, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24224, 24225, 24220, 24222, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24224, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24224, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24224, 24226, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24224, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24224, + 24228, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24224, 24228, 0, 16384, 24576, 24577, 24579, 24064, + 24192, 24224, 24232, 24230, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24224, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24224, 24232, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24224, 24232, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24224, 24232, 24234, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24224, + 24232, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24224, 24240, 24236, 0, 16384, 24576, 24577, 24579, + 24064, 24192, 24224, 24240, 24236, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24224, 24240, 24241, 24238, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24224, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 24256, + 24240, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24256, 24240, 0, 16384, 24576, 24577, 24579, 24064, + 24192, 24256, 24240, 24242, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24256, 24240, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24256, 24240, 24244, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24256, 24240, + 24244, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24256, 24240, 24248, 24246, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24256, 24240, 0, 16384, 24576, + 24577, 24579, 24064, 24192, 24256, 24257, 24248, 0, + 16384, 24576, 24577, 24579, 24064, 24192, 24256, 24257, + 24248, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24256, 24257, 24248, 24250, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24256, 24257, 24248, 0, 16384, + 24576, 24577, 24579, 24064, 24192, 24256, 24257, 24248, + 24252, 0, 16384, 24576, 24577, 24579, 24064, 24192, + 24256, 24257, 24259, 24252, 0, 16384, 24576, 24577, + 24579, 24064, 24192, 24256, 24257, 24259, 24252, 24254, + 0, 16384, 24576, 24577, 24579, 24064, 24192, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24256, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24256, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24256, 24258, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 24260, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24260, 0, 16384, 24576, 24577, 24579, 24064, + 24320, 24256, 24264, 24262, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 24264, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24256, 24264, 0, 16384, + 24576, 24577, 24579, 24064, 24320, 24256, 24264, 24266, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 24264, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24272, 24268, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24256, 24272, 24268, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24256, 24272, 24273, 24270, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 24272, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24272, 0, 16384, 24576, 24577, 24579, 24064, + 24320, 24256, 24272, 24274, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 24272, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24256, 24272, 24276, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24256, 24272, + 24276, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24272, 24280, 24278, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 24272, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24256, 24288, 24280, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24256, 24288, + 24280, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24288, 24280, 24282, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 24288, 24280, 0, 16384, + 24576, 24577, 24579, 24064, 24320, 24256, 24288, 24289, + 24284, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24256, 24288, 24289, 24284, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24256, 24288, 24289, 24284, 24286, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24256, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24321, + 24288, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24288, 0, 16384, 24576, 24577, 24579, 24064, + 24320, 24321, 24288, 24290, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24288, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24321, 24288, 24292, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24321, 24288, + 24292, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24288, 24296, 24294, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24288, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24321, 24288, 24296, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24321, 24288, + 24296, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24288, 24296, 24298, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24288, 24296, 0, 16384, + 24576, 24577, 24579, 24064, 24320, 24321, 24288, 24304, + 24300, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24288, 24304, 24300, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24288, 24304, 24305, 24302, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24321, + 24288, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24288, 24304, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24321, 24323, 24304, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24321, 24323, 24304, 24306, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24321, + 24323, 24304, 0, 16384, 24576, 24577, 24579, 24064, + 24320, 24321, 24323, 24304, 24308, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 24321, 24323, 24304, 24308, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24321, + 24323, 24304, 24312, 24310, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24323, 24304, 0, 16384, + 24576, 24577, 24579, 24064, 24320, 24321, 24323, 24304, + 24312, 0, 16384, 24576, 24577, 24579, 24064, 24320, + 24321, 24323, 24304, 24312, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24321, 24323, 24304, 24312, 24314, + 0, 16384, 24576, 24577, 24579, 24064, 24320, 24321, + 24323, 24327, 24312, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24321, 24323, 24327, 24312, 24316, 0, + 16384, 24576, 24577, 24579, 24064, 24320, 24321, 24323, + 24327, 24312, 24316, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24321, 24323, 24327, 24312, 24316, 24318, + 0, 16384, 24576, 24577, 24579, 24064, 0, 16384, + 24576, 24577, 24579, 24064, 24320, 0, 16384, 24576, + 24577, 24579, 24064, 24320, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 24322, 0, 16384, 24576, 24577, + 24579, 24064, 24320, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24324, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24324, 0, 16384, 24576, 24577, 24579, + 24064, 24320, 24328, 24326, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24328, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24328, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24328, 24330, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24328, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24336, 24332, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24336, 24332, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24336, 24337, 24334, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24336, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24336, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24336, 24338, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24336, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24336, + 24340, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24336, 24340, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24336, 24344, 24342, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24336, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24352, 24344, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24352, 24344, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24352, 24344, 24346, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24352, + 24344, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24352, 24353, 24348, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24352, 24353, 24348, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24352, 24353, 24348, 24350, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24352, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24352, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24352, 24354, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24352, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24352, + 24356, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24352, 24356, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24352, 24360, 24358, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24352, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24352, 24360, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24352, 24360, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24352, 24360, 24362, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24352, + 24360, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24352, 24368, 24364, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24352, 24368, 24364, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24352, 24368, 24369, 24366, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24352, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 24368, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24368, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24384, 24368, 24370, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24368, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24368, 24372, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 24368, + 24372, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24368, 24376, 24374, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24368, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24385, 24376, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 24385, + 24376, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24385, 24376, 24378, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24385, 24376, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24384, 24385, 24376, + 24380, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24385, 24387, 24380, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24385, 24387, 24380, 24382, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 24386, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 24388, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24388, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24384, 24392, 24390, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24392, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24392, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24384, 24392, 24394, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 24392, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24400, 24396, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24384, 24400, 24396, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24400, 24401, 24398, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 24400, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24400, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24384, 24400, 24402, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24400, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24400, 24404, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 24400, + 24404, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24400, 24408, 24406, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24400, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24384, 24416, 24408, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24384, 24416, + 24408, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24416, 24408, 24410, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24416, 24408, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24384, 24416, 24417, + 24412, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24384, 24416, 24417, 24412, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24384, 24416, 24417, 24412, 24414, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24384, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24416, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24416, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24448, 24416, 24418, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24416, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24416, 24420, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 24416, + 24420, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24416, 24424, 24422, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24416, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24416, 24424, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 24416, + 24424, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24416, 24424, 24426, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24416, 24424, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24448, 24416, 24432, + 24428, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24416, 24432, 24428, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24416, 24432, 24433, 24430, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24416, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24449, 24432, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24448, 24449, 24432, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24449, 24432, 24434, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24449, 24432, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24448, 24449, 24432, 24436, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24449, 24432, 24436, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24449, 24432, 24440, 24438, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24449, 24432, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24448, 24449, 24432, + 24440, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24449, 24451, 24440, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24449, 24451, 24440, 24442, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24449, 24451, 24440, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24448, 24449, 24451, 24440, 24444, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 24449, + 24451, 24440, 24444, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24448, 24449, 24451, 24440, 24444, 24446, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 0, + 16384, 24576, 24577, 24579, 24583, 24320, 24448, 24450, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24452, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24452, 0, 16384, 24576, 24577, 24579, 24583, + 24320, 24448, 24456, 24454, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 0, 16384, 24576, 24577, + 24579, 24583, 24320, 24448, 24456, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24456, 0, 16384, + 24576, 24577, 24579, 24583, 24320, 24448, 24456, 24458, + 0, 16384, 24576, 24577, 24579, 24583, 24320, 24448, + 24456, 0, 16384, 24576, 24577, 24579, 24583, 24320, + 24448, 24464, 24460, 0, 16384, 24576, 24577, 24579, + 24583, 24320, 24448, 24464, 24460, 0, 16384, 24576, + 24577, 24579, 24583, 24320, 24448, 24464, 24465, 24462, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24464, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24464, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24448, 24464, 24466, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24464, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24464, 24468, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24464, + 24468, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24464, 24472, 24470, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24464, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24480, 24472, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24480, + 24472, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 24472, 24474, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 24472, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24448, 24480, 24481, + 24476, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 24481, 24476, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 24481, 24476, 24478, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24480, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24448, 24480, 24482, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24480, 24484, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24480, + 24484, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 24488, 24486, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24480, 24488, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24480, + 24488, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 24488, 24490, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 24488, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24448, 24480, 24496, + 24492, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24480, 24496, 24492, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24480, 24496, 24497, 24494, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24480, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24496, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24496, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24496, 24498, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24496, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24448, 24512, 24496, 24500, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24496, 24500, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24496, 24504, 24502, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24496, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24448, 24512, 24513, + 24504, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24513, 24504, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24513, 24504, 24506, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24513, 24504, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24513, 24504, 24508, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24512, + 24513, 24515, 24508, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24513, 24515, 24508, 24510, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24448, 24512, 24514, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24516, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24512, + 24516, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24520, 24518, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24520, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24512, + 24520, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24520, 24522, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24520, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24448, 24512, 24528, + 24524, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24528, 24524, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24528, 24529, 24526, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24528, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24528, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24528, 24530, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24528, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24448, 24512, 24528, 24532, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24448, 24512, 24528, 24532, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24528, 24536, 24534, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24528, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24448, 24512, 24544, + 24536, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24448, 24512, 24544, 24536, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24448, 24512, 24544, 24536, 24538, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24448, + 24512, 24544, 24536, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24544, 24545, 24540, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24448, 24512, + 24544, 24545, 24540, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24448, 24512, 24544, 24545, 24540, 24542, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24607, 24512, 24544, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24607, 24512, 24544, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24607, 24512, 24544, 24546, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24607, 24512, 24544, 24548, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24607, 24512, 24544, 24548, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 24552, 24550, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24607, 24512, 24544, 0, 16384, + 24576, 24577, 24579, 24583, 24591, 24607, 24512, 24544, + 24552, 0, 16384, 24576, 24577, 24579, 24583, 24591, + 24607, 24512, 24544, 24552, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24607, 24512, 24544, 24552, 24554, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 24552, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24607, 24512, 24544, 24560, 24556, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24607, 24512, + 24544, 24560, 24556, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24607, 24512, 24544, 24560, 24561, 24558, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24607, 24512, 24544, 24560, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24607, 24512, 24544, 24560, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 24560, 24562, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24607, 24512, 24544, 24560, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24607, 24512, + 24544, 24560, 24564, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24607, 24512, 24544, 24560, 24564, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24607, 24512, + 24544, 24560, 24568, 24566, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24607, 24512, 24544, 24560, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24607, 24512, + 24544, 24560, 24568, 0, 16384, 24576, 24577, 24579, + 24583, 24591, 24607, 24512, 24544, 24560, 24568, 0, + 16384, 24576, 24577, 24579, 24583, 24591, 24607, 24512, + 24544, 24560, 24568, 24570, 0, 16384, 24576, 24577, + 24579, 24583, 24591, 24607, 24512, 24544, 24560, 24568, + 0, 16384, 24576, 24577, 24579, 24583, 24591, 24607, + 24512, 24544, 24560, 24568, 24572, 0, 16384, 24576, + 24577, 24579, 24583, 24591, 24607, 24512, 24544, 24560, + 24568, 24572, 0, 16384, 24576, 24577, 24579, 24583, + 24591, 24607, 24512, 24544, 24560, 24568, 24572, 24574, + 0, 16384, 0, 16384, 24576, 0, 16384, 24576, + 0, 16384, 24576, 24578, 0, 16384, 24576, 0, + 16384, 24576, 24580, 0, 16384, 24576, 24580, 0, + 16384, 24576, 24584, 24582, 0, 16384, 24576, 0, + 16384, 24576, 24584, 0, 16384, 24576, 24584, 0, + 16384, 24576, 24584, 24586, 0, 16384, 24576, 24584, + 0, 16384, 24576, 24592, 24588, 0, 16384, 24576, + 24592, 24588, 0, 16384, 24576, 24592, 24593, 24590, + 0, 16384, 24576, 0, 16384, 24576, 24592, 0, + 16384, 24576, 24592, 0, 16384, 24576, 24592, 24594, + 0, 16384, 24576, 24592, 0, 16384, 24576, 24592, + 24596, 0, 16384, 24576, 24592, 24596, 0, 16384, + 24576, 24592, 24600, 24598, 0, 16384, 24576, 24592, + 0, 16384, 24576, 24608, 24600, 0, 16384, 24576, + 24608, 24600, 0, 16384, 24576, 24608, 24600, 24602, + 0, 16384, 24576, 24608, 24600, 0, 16384, 24576, + 24608, 24609, 24604, 0, 16384, 24576, 24608, 24609, + 24604, 0, 16384, 24576, 24608, 24609, 24604, 24606, + 0, 16384, 24576, 0, 16384, 24576, 24608, 0, + 16384, 24576, 24608, 0, 16384, 24576, 24608, 24610, + 0, 16384, 24576, 24608, 0, 16384, 24576, 24608, + 24612, 0, 16384, 24576, 24608, 24612, 0, 16384, + 24576, 24608, 24616, 24614, 0, 16384, 24576, 24608, + 0, 16384, 24576, 24608, 24616, 0, 16384, 24576, + 24608, 24616, 0, 16384, 24576, 24608, 24616, 24618, + 0, 16384, 24576, 24608, 24616, 0, 16384, 24576, + 24608, 24624, 24620, 0, 16384, 24576, 24608, 24624, + 24620, 0, 16384, 24576, 24608, 24624, 24625, 24622, + 0, 16384, 24576, 24608, 0, 16384, 24576, 24640, + 24624, 0, 16384, 24576, 24640, 24624, 0, 16384, + 24576, 24640, 24624, 24626, 0, 16384, 24576, 24640, + 24624, 0, 16384, 24576, 24640, 24624, 24628, 0, + 16384, 24576, 24640, 24624, 24628, 0, 16384, 24576, + 24640, 24624, 24632, 24630, 0, 16384, 24576, 24640, + 24624, 0, 16384, 24576, 24640, 24641, 24632, 0, + 16384, 24576, 24640, 24641, 24632, 0, 16384, 24576, + 24640, 24641, 24632, 24634, 0, 16384, 24576, 24640, + 24641, 24632, 0, 16384, 24576, 24640, 24641, 24632, + 24636, 0, 16384, 24576, 24640, 24641, 24643, 24636, + 0, 16384, 24576, 24640, 24641, 24643, 24636, 24638, + 0, 16384, 24576, 0, 16384, 24576, 24640, 0, + 16384, 24576, 24640, 0, 16384, 24576, 24640, 24642, + 0, 16384, 24576, 24640, 0, 16384, 24576, 24640, + 24644, 0, 16384, 24576, 24640, 24644, 0, 16384, + 24576, 24640, 24648, 24646, 0, 16384, 24576, 24640, + 0, 16384, 24576, 24640, 24648, 0, 16384, 24576, + 24640, 24648, 0, 16384, 24576, 24640, 24648, 24650, + 0, 16384, 24576, 24640, 24648, 0, 16384, 24576, + 24640, 24656, 24652, 0, 16384, 24576, 24640, 24656, + 24652, 0, 16384, 24576, 24640, 24656, 24657, 24654, + 0, 16384, 24576, 24640, 0, 16384, 24576, 24640, + 24656, 0, 16384, 24576, 24640, 24656, 0, 16384, + 24576, 24640, 24656, 24658, 0, 16384, 24576, 24640, + 24656, 0, 16384, 24576, 24640, 24656, 24660, 0, + 16384, 24576, 24640, 24656, 24660, 0, 16384, 24576, + 24640, 24656, 24664, 24662, 0, 16384, 24576, 24640, + 24656, 0, 16384, 24576, 24640, 24672, 24664, 0, + 16384, 24576, 24640, 24672, 24664, 0, 16384, 24576, + 24640, 24672, 24664, 24666, 0, 16384, 24576, 24640, + 24672, 24664, 0, 16384, 24576, 24640, 24672, 24673, + 24668, 0, 16384, 24576, 24640, 24672, 24673, 24668, + 0, 16384, 24576, 24640, 24672, 24673, 24668, 24670, + 0, 16384, 24576, 24640, 0, 16384, 24576, 24704, + 24672, 0, 16384, 24576, 24704, 24672, 0, 16384, + 24576, 24704, 24672, 24674, 0, 16384, 24576, 24704, + 24672, 0, 16384, 24576, 24704, 24672, 24676, 0, + 16384, 24576, 24704, 24672, 24676, 0, 16384, 24576, + 24704, 24672, 24680, 24678, 0, 16384, 24576, 24704, + 24672, 0, 16384, 24576, 24704, 24672, 24680, 0, + 16384, 24576, 24704, 24672, 24680, 0, 16384, 24576, + 24704, 24672, 24680, 24682, 0, 16384, 24576, 24704, + 24672, 24680, 0, 16384, 24576, 24704, 24672, 24688, + 24684, 0, 16384, 24576, 24704, 24672, 24688, 24684, + 0, 16384, 24576, 24704, 24672, 24688, 24689, 24686, + 0, 16384, 24576, 24704, 24672, 0, 16384, 24576, + 24704, 24705, 24688, 0, 16384, 24576, 24704, 24705, + 24688, 0, 16384, 24576, 24704, 24705, 24688, 24690, + 0, 16384, 24576, 24704, 24705, 24688, 0, 16384, + 24576, 24704, 24705, 24688, 24692, 0, 16384, 24576, + 24704, 24705, 24688, 24692, 0, 16384, 24576, 24704, + 24705, 24688, 24696, 24694, 0, 16384, 24576, 24704, + 24705, 24688, 0, 16384, 24576, 24704, 24705, 24688, + 24696, 0, 16384, 24576, 24704, 24705, 24707, 24696, + 0, 16384, 24576, 24704, 24705, 24707, 24696, 24698, + 0, 16384, 24576, 24704, 24705, 24707, 24696, 0, + 16384, 24576, 24704, 24705, 24707, 24696, 24700, 0, + 16384, 24576, 24704, 24705, 24707, 24696, 24700, 0, + 16384, 24576, 24704, 24705, 24707, 24696, 24700, 24702, + 0, 16384, 24576, 0, 16384, 24576, 24704, 0, + 16384, 24576, 24704, 0, 16384, 24576, 24704, 24706, + 0, 16384, 24576, 24704, 0, 16384, 24576, 24704, + 24708, 0, 16384, 24576, 24704, 24708, 0, 16384, + 24576, 24704, 24712, 24710, 0, 16384, 24576, 24704, + 0, 16384, 24576, 24704, 24712, 0, 16384, 24576, + 24704, 24712, 0, 16384, 24576, 24704, 24712, 24714, + 0, 16384, 24576, 24704, 24712, 0, 16384, 24576, + 24704, 24720, 24716, 0, 16384, 24576, 24704, 24720, + 24716, 0, 16384, 24576, 24704, 24720, 24721, 24718, + 0, 16384, 24576, 24704, 0, 16384, 24576, 24704, + 24720, 0, 16384, 24576, 24704, 24720, 0, 16384, + 24576, 24704, 24720, 24722, 0, 16384, 24576, 24704, + 24720, 0, 16384, 24576, 24704, 24720, 24724, 0, + 16384, 24576, 24704, 24720, 24724, 0, 16384, 24576, + 24704, 24720, 24728, 24726, 0, 16384, 24576, 24704, + 24720, 0, 16384, 24576, 24704, 24736, 24728, 0, + 16384, 24576, 24704, 24736, 24728, 0, 16384, 24576, + 24704, 24736, 24728, 24730, 0, 16384, 24576, 24704, + 24736, 24728, 0, 16384, 24576, 24704, 24736, 24737, + 24732, 0, 16384, 24576, 24704, 24736, 24737, 24732, + 0, 16384, 24576, 24704, 24736, 24737, 24732, 24734, + 0, 16384, 24576, 24704, 0, 16384, 24576, 24704, + 24736, 0, 16384, 24576, 24704, 24736, 0, 16384, + 24576, 24704, 24736, 24738, 0, 16384, 24576, 24704, + 24736, 0, 16384, 24576, 24704, 24736, 24740, 0, + 16384, 24576, 24704, 24736, 24740, 0, 16384, 24576, + 24704, 24736, 24744, 24742, 0, 16384, 24576, 24704, + 24736, 0, 16384, 24576, 24704, 24736, 24744, 0, + 16384, 24576, 24704, 24736, 24744, 0, 16384, 24576, + 24704, 24736, 24744, 24746, 0, 16384, 24576, 24704, + 24736, 24744, 0, 16384, 24576, 24704, 24736, 24752, + 24748, 0, 16384, 24576, 24704, 24736, 24752, 24748, + 0, 16384, 24576, 24704, 24736, 24752, 24753, 24750, + 0, 16384, 24576, 24704, 24736, 0, 16384, 24576, + 24704, 24768, 24752, 0, 16384, 24576, 24704, 24768, + 24752, 0, 16384, 24576, 24704, 24768, 24752, 24754, + 0, 16384, 24576, 24704, 24768, 24752, 0, 16384, + 24576, 24704, 24768, 24752, 24756, 0, 16384, 24576, + 24704, 24768, 24752, 24756, 0, 16384, 24576, 24704, + 24768, 24752, 24760, 24758, 0, 16384, 24576, 24704, + 24768, 24752, 0, 16384, 24576, 24704, 24768, 24769, + 24760, 0, 16384, 24576, 24704, 24768, 24769, 24760, + 0, 16384, 24576, 24704, 24768, 24769, 24760, 24762, + 0, 16384, 24576, 24704, 24768, 24769, 24760, 0, + 16384, 24576, 24704, 24768, 24769, 24760, 24764, 0, + 16384, 24576, 24704, 24768, 24769, 24771, 24764, 0, + 16384, 24576, 24704, 24768, 24769, 24771, 24764, 24766, + 0, 16384, 24576, 24704, 0, 16384, 24576, 24832, + 24768, 0, 16384, 24576, 24832, 24768, 0, 16384, + 24576, 24832, 24768, 24770, 0, 16384, 24576, 24832, + 24768, 0, 16384, 24576, 24832, 24768, 24772, 0, + 16384, 24576, 24832, 24768, 24772, 0, 16384, 24576, + 24832, 24768, 24776, 24774, 0, 16384, 24576, 24832, + 24768, 0, 16384, 24576, 24832, 24768, 24776, 0, + 16384, 24576, 24832, 24768, 24776, 0, 16384, 24576, + 24832, 24768, 24776, 24778, 0, 16384, 24576, 24832, + 24768, 24776, 0, 16384, 24576, 24832, 24768, 24784, + 24780, 0, 16384, 24576, 24832, 24768, 24784, 24780, + 0, 16384, 24576, 24832, 24768, 24784, 24785, 24782, + 0, 16384, 24576, 24832, 24768, 0, 16384, 24576, + 24832, 24768, 24784, 0, 16384, 24576, 24832, 24768, + 24784, 0, 16384, 24576, 24832, 24768, 24784, 24786, + 0, 16384, 24576, 24832, 24768, 24784, 0, 16384, + 24576, 24832, 24768, 24784, 24788, 0, 16384, 24576, + 24832, 24768, 24784, 24788, 0, 16384, 24576, 24832, + 24768, 24784, 24792, 24790, 0, 16384, 24576, 24832, + 24768, 24784, 0, 16384, 24576, 24832, 24768, 24800, + 24792, 0, 16384, 24576, 24832, 24768, 24800, 24792, + 0, 16384, 24576, 24832, 24768, 24800, 24792, 24794, + 0, 16384, 24576, 24832, 24768, 24800, 24792, 0, + 16384, 24576, 24832, 24768, 24800, 24801, 24796, 0, + 16384, 24576, 24832, 24768, 24800, 24801, 24796, 0, + 16384, 24576, 24832, 24768, 24800, 24801, 24796, 24798, + 0, 16384, 24576, 24832, 24768, 0, 16384, 24576, + 24832, 24833, 24800, 0, 16384, 24576, 24832, 24833, + 24800, 0, 16384, 24576, 24832, 24833, 24800, 24802, + 0, 16384, 24576, 24832, 24833, 24800, 0, 16384, + 24576, 24832, 24833, 24800, 24804, 0, 16384, 24576, + 24832, 24833, 24800, 24804, 0, 16384, 24576, 24832, + 24833, 24800, 24808, 24806, 0, 16384, 24576, 24832, + 24833, 24800, 0, 16384, 24576, 24832, 24833, 24800, + 24808, 0, 16384, 24576, 24832, 24833, 24800, 24808, + 0, 16384, 24576, 24832, 24833, 24800, 24808, 24810, + 0, 16384, 24576, 24832, 24833, 24800, 24808, 0, + 16384, 24576, 24832, 24833, 24800, 24816, 24812, 0, + 16384, 24576, 24832, 24833, 24800, 24816, 24812, 0, + 16384, 24576, 24832, 24833, 24800, 24816, 24817, 24814, + 0, 16384, 24576, 24832, 24833, 24800, 0, 16384, + 24576, 24832, 24833, 24800, 24816, 0, 16384, 24576, + 24832, 24833, 24835, 24816, 0, 16384, 24576, 24832, + 24833, 24835, 24816, 24818, 0, 16384, 24576, 24832, + 24833, 24835, 24816, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24820, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24820, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24824, 24822, 0, 16384, 24576, 24832, + 24833, 24835, 24816, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24824, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24824, 0, 16384, 24576, 24832, 24833, + 24835, 24816, 24824, 24826, 0, 16384, 24576, 24832, + 24833, 24835, 24839, 24824, 0, 16384, 24576, 24832, + 24833, 24835, 24839, 24824, 24828, 0, 16384, 24576, + 24832, 24833, 24835, 24839, 24824, 24828, 0, 16384, + 24576, 24832, 24833, 24835, 24839, 24824, 24828, 24830, + 0, 16384, 24576, 0, 16384, 24576, 24832, 0, + 16384, 24576, 24832, 0, 16384, 24576, 24832, 24834, + 0, 16384, 24576, 24832, 0, 16384, 24576, 24832, + 24836, 0, 16384, 24576, 24832, 24836, 0, 16384, + 24576, 24832, 24840, 24838, 0, 16384, 24576, 24832, + 0, 16384, 24576, 24832, 24840, 0, 16384, 24576, + 24832, 24840, 0, 16384, 24576, 24832, 24840, 24842, + 0, 16384, 24576, 24832, 24840, 0, 16384, 24576, + 24832, 24848, 24844, 0, 16384, 24576, 24832, 24848, + 24844, 0, 16384, 24576, 24832, 24848, 24849, 24846, + 0, 16384, 24576, 24832, 0, 16384, 24576, 24832, + 24848, 0, 16384, 24576, 24832, 24848, 0, 16384, + 24576, 24832, 24848, 24850, 0, 16384, 24576, 24832, + 24848, 0, 16384, 24576, 24832, 24848, 24852, 0, + 16384, 24576, 24832, 24848, 24852, 0, 16384, 24576, + 24832, 24848, 24856, 24854, 0, 16384, 24576, 24832, + 24848, 0, 16384, 24576, 24832, 24864, 24856, 0, + 16384, 24576, 24832, 24864, 24856, 0, 16384, 24576, + 24832, 24864, 24856, 24858, 0, 16384, 24576, 24832, + 24864, 24856, 0, 16384, 24576, 24832, 24864, 24865, + 24860, 0, 16384, 24576, 24832, 24864, 24865, 24860, + 0, 16384, 24576, 24832, 24864, 24865, 24860, 24862, + 0, 16384, 24576, 24832, 0, 16384, 24576, 24832, + 24864, 0, 16384, 24576, 24832, 24864, 0, 16384, + 24576, 24832, 24864, 24866, 0, 16384, 24576, 24832, + 24864, 0, 16384, 24576, 24832, 24864, 24868, 0, + 16384, 24576, 24832, 24864, 24868, 0, 16384, 24576, + 24832, 24864, 24872, 24870, 0, 16384, 24576, 24832, + 24864, 0, 16384, 24576, 24832, 24864, 24872, 0, + 16384, 24576, 24832, 24864, 24872, 0, 16384, 24576, + 24832, 24864, 24872, 24874, 0, 16384, 24576, 24832, + 24864, 24872, 0, 16384, 24576, 24832, 24864, 24880, + 24876, 0, 16384, 24576, 24832, 24864, 24880, 24876, + 0, 16384, 24576, 24832, 24864, 24880, 24881, 24878, + 0, 16384, 24576, 24832, 24864, 0, 16384, 24576, + 24832, 24896, 24880, 0, 16384, 24576, 24832, 24896, + 24880, 0, 16384, 24576, 24832, 24896, 24880, 24882, + 0, 16384, 24576, 24832, 24896, 24880, 0, 16384, + 24576, 24832, 24896, 24880, 24884, 0, 16384, 24576, + 24832, 24896, 24880, 24884, 0, 16384, 24576, 24832, + 24896, 24880, 24888, 24886, 0, 16384, 24576, 24832, + 24896, 24880, 0, 16384, 24576, 24832, 24896, 24897, + 24888, 0, 16384, 24576, 24832, 24896, 24897, 24888, + 0, 16384, 24576, 24832, 24896, 24897, 24888, 24890, + 0, 16384, 24576, 24832, 24896, 24897, 24888, 0, + 16384, 24576, 24832, 24896, 24897, 24888, 24892, 0, + 16384, 24576, 24832, 24896, 24897, 24899, 24892, 0, + 16384, 24576, 24832, 24896, 24897, 24899, 24892, 24894, + 0, 16384, 24576, 24832, 0, 16384, 24576, 24832, + 24896, 0, 16384, 24576, 24832, 24896, 0, 16384, + 24576, 24832, 24896, 24898, 0, 16384, 24576, 24832, + 24896, 0, 16384, 24576, 24832, 24896, 24900, 0, + 16384, 24576, 24832, 24896, 24900, 0, 16384, 24576, + 24832, 24896, 24904, 24902, 0, 16384, 24576, 24832, + 24896, 0, 16384, 24576, 24832, 24896, 24904, 0, + 16384, 24576, 24832, 24896, 24904, 0, 16384, 24576, + 24832, 24896, 24904, 24906, 0, 16384, 24576, 24832, + 24896, 24904, 0, 16384, 24576, 24832, 24896, 24912, + 24908, 0, 16384, 24576, 24832, 24896, 24912, 24908, + 0, 16384, 24576, 24832, 24896, 24912, 24913, 24910, + 0, 16384, 24576, 24832, 24896, 0, 16384, 24576, + 24832, 24896, 24912, 0, 16384, 24576, 24832, 24896, + 24912, 0, 16384, 24576, 24832, 24896, 24912, 24914, + 0, 16384, 24576, 24832, 24896, 24912, 0, 16384, + 24576, 24832, 24896, 24912, 24916, 0, 16384, 24576, + 24832, 24896, 24912, 24916, 0, 16384, 24576, 24832, + 24896, 24912, 24920, 24918, 0, 16384, 24576, 24832, + 24896, 24912, 0, 16384, 24576, 24832, 24896, 24928, + 24920, 0, 16384, 24576, 24832, 24896, 24928, 24920, + 0, 16384, 24576, 24832, 24896, 24928, 24920, 24922, + 0, 16384, 24576, 24832, 24896, 24928, 24920, 0, + 16384, 24576, 24832, 24896, 24928, 24929, 24924, 0, + 16384, 24576, 24832, 24896, 24928, 24929, 24924, 0, + 16384, 24576, 24832, 24896, 24928, 24929, 24924, 24926, + 0, 16384, 24576, 24832, 24896, 0, 16384, 24576, + 24832, 24960, 24928, 0, 16384, 24576, 24832, 24960, + 24928, 0, 16384, 24576, 24832, 24960, 24928, 24930, + 0, 16384, 24576, 24832, 24960, 24928, 0, 16384, + 24576, 24832, 24960, 24928, 24932, 0, 16384, 24576, + 24832, 24960, 24928, 24932, 0, 16384, 24576, 24832, + 24960, 24928, 24936, 24934, 0, 16384, 24576, 24832, + 24960, 24928, 0, 16384, 24576, 24832, 24960, 24928, + 24936, 0, 16384, 24576, 24832, 24960, 24928, 24936, + 0, 16384, 24576, 24832, 24960, 24928, 24936, 24938, + 0, 16384, 24576, 24832, 24960, 24928, 24936, 0, + 16384, 24576, 24832, 24960, 24928, 24944, 24940, 0, + 16384, 24576, 24832, 24960, 24928, 24944, 24940, 0, + 16384, 24576, 24832, 24960, 24928, 24944, 24945, 24942, + 0, 16384, 24576, 24832, 24960, 24928, 0, 16384, + 24576, 24832, 24960, 24961, 24944, 0, 16384, 24576, + 24832, 24960, 24961, 24944, 0, 16384, 24576, 24832, + 24960, 24961, 24944, 24946, 0, 16384, 24576, 24832, + 24960, 24961, 24944, 0, 16384, 24576, 24832, 24960, + 24961, 24944, 24948, 0, 16384, 24576, 24832, 24960, + 24961, 24944, 24948, 0, 16384, 24576, 24832, 24960, + 24961, 24944, 24952, 24950, 0, 16384, 24576, 24832, + 24960, 24961, 24944, 0, 16384, 24576, 24832, 24960, + 24961, 24944, 24952, 0, 16384, 24576, 24832, 24960, + 24961, 24963, 24952, 0, 16384, 24576, 24832, 24960, + 24961, 24963, 24952, 24954, 0, 16384, 24576, 24832, + 24960, 24961, 24963, 24952, 0, 16384, 24576, 24832, + 24960, 24961, 24963, 24952, 24956, 0, 16384, 24576, + 24832, 24960, 24961, 24963, 24952, 24956, 0, 16384, + 24576, 24832, 24960, 24961, 24963, 24952, 24956, 24958, + 0, 16384, 24576, 24832, 0, 16384, 24576, 25088, + 24960, 0, 16384, 24576, 25088, 24960, 0, 16384, + 24576, 25088, 24960, 24962, 0, 16384, 24576, 25088, + 24960, 0, 16384, 24576, 25088, 24960, 24964, 0, + 16384, 24576, 25088, 24960, 24964, 0, 16384, 24576, + 25088, 24960, 24968, 24966, 0, 16384, 24576, 25088, + 24960, 0, 16384, 24576, 25088, 24960, 24968, 0, + 16384, 24576, 25088, 24960, 24968, 0, 16384, 24576, + 25088, 24960, 24968, 24970, 0, 16384, 24576, 25088, + 24960, 24968, 0, 16384, 24576, 25088, 24960, 24976, + 24972, 0, 16384, 24576, 25088, 24960, 24976, 24972, + 0, 16384, 24576, 25088, 24960, 24976, 24977, 24974, + 0, 16384, 24576, 25088, 24960, 0, 16384, 24576, + 25088, 24960, 24976, 0, 16384, 24576, 25088, 24960, + 24976, 0, 16384, 24576, 25088, 24960, 24976, 24978, + 0, 16384, 24576, 25088, 24960, 24976, 0, 16384, + 24576, 25088, 24960, 24976, 24980, 0, 16384, 24576, + 25088, 24960, 24976, 24980, 0, 16384, 24576, 25088, + 24960, 24976, 24984, 24982, 0, 16384, 24576, 25088, + 24960, 24976, 0, 16384, 24576, 25088, 24960, 24992, + 24984, 0, 16384, 24576, 25088, 24960, 24992, 24984, + 0, 16384, 24576, 25088, 24960, 24992, 24984, 24986, + 0, 16384, 24576, 25088, 24960, 24992, 24984, 0, + 16384, 24576, 25088, 24960, 24992, 24993, 24988, 0, + 16384, 24576, 25088, 24960, 24992, 24993, 24988, 0, + 16384, 24576, 25088, 24960, 24992, 24993, 24988, 24990, + 0, 16384, 24576, 25088, 24960, 0, 16384, 24576, + 25088, 24960, 24992, 0, 16384, 24576, 25088, 24960, + 24992, 0, 16384, 24576, 25088, 24960, 24992, 24994, + 0, 16384, 24576, 25088, 24960, 24992, 0, 16384, + 24576, 25088, 24960, 24992, 24996, 0, 16384, 24576, + 25088, 24960, 24992, 24996, 0, 16384, 24576, 25088, + 24960, 24992, 25000, 24998, 0, 16384, 24576, 25088, + 24960, 24992, 0, 16384, 24576, 25088, 24960, 24992, + 25000, 0, 16384, 24576, 25088, 24960, 24992, 25000, + 0, 16384, 24576, 25088, 24960, 24992, 25000, 25002, + 0, 16384, 24576, 25088, 24960, 24992, 25000, 0, + 16384, 24576, 25088, 24960, 24992, 25008, 25004, 0, + 16384, 24576, 25088, 24960, 24992, 25008, 25004, 0, + 16384, 24576, 25088, 24960, 24992, 25008, 25009, 25006, + 0, 16384, 24576, 25088, 24960, 24992, 0, 16384, + 24576, 25088, 24960, 25024, 25008, 0, 16384, 24576, + 25088, 24960, 25024, 25008, 0, 16384, 24576, 25088, + 24960, 25024, 25008, 25010, 0, 16384, 24576, 25088, + 24960, 25024, 25008, 0, 16384, 24576, 25088, 24960, + 25024, 25008, 25012, 0, 16384, 24576, 25088, 24960, + 25024, 25008, 25012, 0, 16384, 24576, 25088, 24960, + 25024, 25008, 25016, 25014, 0, 16384, 24576, 25088, + 24960, 25024, 25008, 0, 16384, 24576, 25088, 24960, + 25024, 25025, 25016, 0, 16384, 24576, 25088, 24960, + 25024, 25025, 25016, 0, 16384, 24576, 25088, 24960, + 25024, 25025, 25016, 25018, 0, 16384, 24576, 25088, + 24960, 25024, 25025, 25016, 0, 16384, 24576, 25088, + 24960, 25024, 25025, 25016, 25020, 0, 16384, 24576, + 25088, 24960, 25024, 25025, 25027, 25020, 0, 16384, + 24576, 25088, 24960, 25024, 25025, 25027, 25020, 25022, + 0, 16384, 24576, 25088, 24960, 0, 16384, 24576, + 25088, 25089, 25024, 0, 16384, 24576, 25088, 25089, + 25024, 0, 16384, 24576, 25088, 25089, 25024, 25026, + 0, 16384, 24576, 25088, 25089, 25024, 0, 16384, + 24576, 25088, 25089, 25024, 25028, 0, 16384, 24576, + 25088, 25089, 25024, 25028, 0, 16384, 24576, 25088, + 25089, 25024, 25032, 25030, 0, 16384, 24576, 25088, + 25089, 25024, 0, 16384, 24576, 25088, 25089, 25024, + 25032, 0, 16384, 24576, 25088, 25089, 25024, 25032, + 0, 16384, 24576, 25088, 25089, 25024, 25032, 25034, + 0, 16384, 24576, 25088, 25089, 25024, 25032, 0, + 16384, 24576, 25088, 25089, 25024, 25040, 25036, 0, + 16384, 24576, 25088, 25089, 25024, 25040, 25036, 0, + 16384, 24576, 25088, 25089, 25024, 25040, 25041, 25038, + 0, 16384, 24576, 25088, 25089, 25024, 0, 16384, + 24576, 25088, 25089, 25024, 25040, 0, 16384, 24576, + 25088, 25089, 25024, 25040, 0, 16384, 24576, 25088, + 25089, 25024, 25040, 25042, 0, 16384, 24576, 25088, + 25089, 25024, 25040, 0, 16384, 24576, 25088, 25089, + 25024, 25040, 25044, 0, 16384, 24576, 25088, 25089, + 25024, 25040, 25044, 0, 16384, 24576, 25088, 25089, + 25024, 25040, 25048, 25046, 0, 16384, 24576, 25088, + 25089, 25024, 25040, 0, 16384, 24576, 25088, 25089, + 25024, 25056, 25048, 0, 16384, 24576, 25088, 25089, + 25024, 25056, 25048, 0, 16384, 24576, 25088, 25089, + 25024, 25056, 25048, 25050, 0, 16384, 24576, 25088, + 25089, 25024, 25056, 25048, 0, 16384, 24576, 25088, + 25089, 25024, 25056, 25057, 25052, 0, 16384, 24576, + 25088, 25089, 25024, 25056, 25057, 25052, 0, 16384, + 24576, 25088, 25089, 25024, 25056, 25057, 25052, 25054, + 0, 16384, 24576, 25088, 25089, 25024, 0, 16384, + 24576, 25088, 25089, 25024, 25056, 0, 16384, 24576, + 25088, 25089, 25091, 25056, 0, 16384, 24576, 25088, + 25089, 25091, 25056, 25058, 0, 16384, 24576, 25088, + 25089, 25091, 25056, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25060, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25060, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25064, 25062, 0, 16384, 24576, 25088, + 25089, 25091, 25056, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25064, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25064, 0, 16384, 24576, 25088, 25089, + 25091, 25056, 25064, 25066, 0, 16384, 24576, 25088, + 25089, 25091, 25056, 25064, 0, 16384, 24576, 25088, + 25089, 25091, 25056, 25072, 25068, 0, 16384, 24576, + 25088, 25089, 25091, 25056, 25072, 25068, 0, 16384, + 24576, 25088, 25089, 25091, 25056, 25072, 25073, 25070, + 0, 16384, 24576, 25088, 25089, 25091, 25056, 0, + 16384, 24576, 25088, 25089, 25091, 25056, 25072, 0, + 16384, 24576, 25088, 25089, 25091, 25056, 25072, 0, + 16384, 24576, 25088, 25089, 25091, 25056, 25072, 25074, + 0, 16384, 24576, 25088, 25089, 25091, 25095, 25072, + 0, 16384, 24576, 25088, 25089, 25091, 25095, 25072, + 25076, 0, 16384, 24576, 25088, 25089, 25091, 25095, + 25072, 25076, 0, 16384, 24576, 25088, 25089, 25091, + 25095, 25072, 25080, 25078, 0, 16384, 24576, 25088, + 25089, 25091, 25095, 25072, 0, 16384, 24576, 25088, + 25089, 25091, 25095, 25072, 25080, 0, 16384, 24576, + 25088, 25089, 25091, 25095, 25072, 25080, 0, 16384, + 24576, 25088, 25089, 25091, 25095, 25072, 25080, 25082, + 0, 16384, 24576, 25088, 25089, 25091, 25095, 25072, + 25080, 0, 16384, 24576, 25088, 25089, 25091, 25095, + 25072, 25080, 25084, 0, 16384, 24576, 25088, 25089, + 25091, 25095, 25072, 25080, 25084, 0, 16384, 24576, + 25088, 25089, 25091, 25095, 25072, 25080, 25084, 25086, + 0, 16384, 24576, 0, 16384, 24576, 25088, 0, + 16384, 24576, 25088, 0, 16384, 24576, 25088, 25090, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25088, + 25092, 0, 16384, 24576, 25088, 25092, 0, 16384, + 24576, 25088, 25096, 25094, 0, 16384, 24576, 25088, + 0, 16384, 24576, 25088, 25096, 0, 16384, 24576, + 25088, 25096, 0, 16384, 24576, 25088, 25096, 25098, + 0, 16384, 24576, 25088, 25096, 0, 16384, 24576, + 25088, 25104, 25100, 0, 16384, 24576, 25088, 25104, + 25100, 0, 16384, 24576, 25088, 25104, 25105, 25102, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25088, + 25104, 0, 16384, 24576, 25088, 25104, 0, 16384, + 24576, 25088, 25104, 25106, 0, 16384, 24576, 25088, + 25104, 0, 16384, 24576, 25088, 25104, 25108, 0, + 16384, 24576, 25088, 25104, 25108, 0, 16384, 24576, + 25088, 25104, 25112, 25110, 0, 16384, 24576, 25088, + 25104, 0, 16384, 24576, 25088, 25120, 25112, 0, + 16384, 24576, 25088, 25120, 25112, 0, 16384, 24576, + 25088, 25120, 25112, 25114, 0, 16384, 24576, 25088, + 25120, 25112, 0, 16384, 24576, 25088, 25120, 25121, + 25116, 0, 16384, 24576, 25088, 25120, 25121, 25116, + 0, 16384, 24576, 25088, 25120, 25121, 25116, 25118, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25088, + 25120, 0, 16384, 24576, 25088, 25120, 0, 16384, + 24576, 25088, 25120, 25122, 0, 16384, 24576, 25088, + 25120, 0, 16384, 24576, 25088, 25120, 25124, 0, + 16384, 24576, 25088, 25120, 25124, 0, 16384, 24576, + 25088, 25120, 25128, 25126, 0, 16384, 24576, 25088, + 25120, 0, 16384, 24576, 25088, 25120, 25128, 0, + 16384, 24576, 25088, 25120, 25128, 0, 16384, 24576, + 25088, 25120, 25128, 25130, 0, 16384, 24576, 25088, + 25120, 25128, 0, 16384, 24576, 25088, 25120, 25136, + 25132, 0, 16384, 24576, 25088, 25120, 25136, 25132, + 0, 16384, 24576, 25088, 25120, 25136, 25137, 25134, + 0, 16384, 24576, 25088, 25120, 0, 16384, 24576, + 25088, 25152, 25136, 0, 16384, 24576, 25088, 25152, + 25136, 0, 16384, 24576, 25088, 25152, 25136, 25138, + 0, 16384, 24576, 25088, 25152, 25136, 0, 16384, + 24576, 25088, 25152, 25136, 25140, 0, 16384, 24576, + 25088, 25152, 25136, 25140, 0, 16384, 24576, 25088, + 25152, 25136, 25144, 25142, 0, 16384, 24576, 25088, + 25152, 25136, 0, 16384, 24576, 25088, 25152, 25153, + 25144, 0, 16384, 24576, 25088, 25152, 25153, 25144, + 0, 16384, 24576, 25088, 25152, 25153, 25144, 25146, + 0, 16384, 24576, 25088, 25152, 25153, 25144, 0, + 16384, 24576, 25088, 25152, 25153, 25144, 25148, 0, + 16384, 24576, 25088, 25152, 25153, 25155, 25148, 0, + 16384, 24576, 25088, 25152, 25153, 25155, 25148, 25150, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25088, + 25152, 0, 16384, 24576, 25088, 25152, 0, 16384, + 24576, 25088, 25152, 25154, 0, 16384, 24576, 25088, + 25152, 0, 16384, 24576, 25088, 25152, 25156, 0, + 16384, 24576, 25088, 25152, 25156, 0, 16384, 24576, + 25088, 25152, 25160, 25158, 0, 16384, 24576, 25088, + 25152, 0, 16384, 24576, 25088, 25152, 25160, 0, + 16384, 24576, 25088, 25152, 25160, 0, 16384, 24576, + 25088, 25152, 25160, 25162, 0, 16384, 24576, 25088, + 25152, 25160, 0, 16384, 24576, 25088, 25152, 25168, + 25164, 0, 16384, 24576, 25088, 25152, 25168, 25164, + 0, 16384, 24576, 25088, 25152, 25168, 25169, 25166, + 0, 16384, 24576, 25088, 25152, 0, 16384, 24576, + 25088, 25152, 25168, 0, 16384, 24576, 25088, 25152, + 25168, 0, 16384, 24576, 25088, 25152, 25168, 25170, + 0, 16384, 24576, 25088, 25152, 25168, 0, 16384, + 24576, 25088, 25152, 25168, 25172, 0, 16384, 24576, + 25088, 25152, 25168, 25172, 0, 16384, 24576, 25088, + 25152, 25168, 25176, 25174, 0, 16384, 24576, 25088, + 25152, 25168, 0, 16384, 24576, 25088, 25152, 25184, + 25176, 0, 16384, 24576, 25088, 25152, 25184, 25176, + 0, 16384, 24576, 25088, 25152, 25184, 25176, 25178, + 0, 16384, 24576, 25088, 25152, 25184, 25176, 0, + 16384, 24576, 25088, 25152, 25184, 25185, 25180, 0, + 16384, 24576, 25088, 25152, 25184, 25185, 25180, 0, + 16384, 24576, 25088, 25152, 25184, 25185, 25180, 25182, + 0, 16384, 24576, 25088, 25152, 0, 16384, 24576, + 25088, 25216, 25184, 0, 16384, 24576, 25088, 25216, + 25184, 0, 16384, 24576, 25088, 25216, 25184, 25186, + 0, 16384, 24576, 25088, 25216, 25184, 0, 16384, + 24576, 25088, 25216, 25184, 25188, 0, 16384, 24576, + 25088, 25216, 25184, 25188, 0, 16384, 24576, 25088, + 25216, 25184, 25192, 25190, 0, 16384, 24576, 25088, + 25216, 25184, 0, 16384, 24576, 25088, 25216, 25184, + 25192, 0, 16384, 24576, 25088, 25216, 25184, 25192, + 0, 16384, 24576, 25088, 25216, 25184, 25192, 25194, + 0, 16384, 24576, 25088, 25216, 25184, 25192, 0, + 16384, 24576, 25088, 25216, 25184, 25200, 25196, 0, + 16384, 24576, 25088, 25216, 25184, 25200, 25196, 0, + 16384, 24576, 25088, 25216, 25184, 25200, 25201, 25198, + 0, 16384, 24576, 25088, 25216, 25184, 0, 16384, + 24576, 25088, 25216, 25217, 25200, 0, 16384, 24576, + 25088, 25216, 25217, 25200, 0, 16384, 24576, 25088, + 25216, 25217, 25200, 25202, 0, 16384, 24576, 25088, + 25216, 25217, 25200, 0, 16384, 24576, 25088, 25216, + 25217, 25200, 25204, 0, 16384, 24576, 25088, 25216, + 25217, 25200, 25204, 0, 16384, 24576, 25088, 25216, + 25217, 25200, 25208, 25206, 0, 16384, 24576, 25088, + 25216, 25217, 25200, 0, 16384, 24576, 25088, 25216, + 25217, 25200, 25208, 0, 16384, 24576, 25088, 25216, + 25217, 25219, 25208, 0, 16384, 24576, 25088, 25216, + 25217, 25219, 25208, 25210, 0, 16384, 24576, 25088, + 25216, 25217, 25219, 25208, 0, 16384, 24576, 25088, + 25216, 25217, 25219, 25208, 25212, 0, 16384, 24576, + 25088, 25216, 25217, 25219, 25208, 25212, 0, 16384, + 24576, 25088, 25216, 25217, 25219, 25208, 25212, 25214, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25088, + 25216, 0, 16384, 24576, 25088, 25216, 0, 16384, + 24576, 25088, 25216, 25218, 0, 16384, 24576, 25088, + 25216, 0, 16384, 24576, 25088, 25216, 25220, 0, + 16384, 24576, 25088, 25216, 25220, 0, 16384, 24576, + 25088, 25216, 25224, 25222, 0, 16384, 24576, 25088, + 25216, 0, 16384, 24576, 25088, 25216, 25224, 0, + 16384, 24576, 25088, 25216, 25224, 0, 16384, 24576, + 25088, 25216, 25224, 25226, 0, 16384, 24576, 25088, + 25216, 25224, 0, 16384, 24576, 25088, 25216, 25232, + 25228, 0, 16384, 24576, 25088, 25216, 25232, 25228, + 0, 16384, 24576, 25088, 25216, 25232, 25233, 25230, + 0, 16384, 24576, 25088, 25216, 0, 16384, 24576, + 25088, 25216, 25232, 0, 16384, 24576, 25088, 25216, + 25232, 0, 16384, 24576, 25088, 25216, 25232, 25234, + 0, 16384, 24576, 25088, 25216, 25232, 0, 16384, + 24576, 25088, 25216, 25232, 25236, 0, 16384, 24576, + 25088, 25216, 25232, 25236, 0, 16384, 24576, 25088, + 25216, 25232, 25240, 25238, 0, 16384, 24576, 25088, + 25216, 25232, 0, 16384, 24576, 25088, 25216, 25248, + 25240, 0, 16384, 24576, 25088, 25216, 25248, 25240, + 0, 16384, 24576, 25088, 25216, 25248, 25240, 25242, + 0, 16384, 24576, 25088, 25216, 25248, 25240, 0, + 16384, 24576, 25088, 25216, 25248, 25249, 25244, 0, + 16384, 24576, 25088, 25216, 25248, 25249, 25244, 0, + 16384, 24576, 25088, 25216, 25248, 25249, 25244, 25246, + 0, 16384, 24576, 25088, 25216, 0, 16384, 24576, + 25088, 25216, 25248, 0, 16384, 24576, 25088, 25216, + 25248, 0, 16384, 24576, 25088, 25216, 25248, 25250, + 0, 16384, 24576, 25088, 25216, 25248, 0, 16384, + 24576, 25088, 25216, 25248, 25252, 0, 16384, 24576, + 25088, 25216, 25248, 25252, 0, 16384, 24576, 25088, + 25216, 25248, 25256, 25254, 0, 16384, 24576, 25088, + 25216, 25248, 0, 16384, 24576, 25088, 25216, 25248, + 25256, 0, 16384, 24576, 25088, 25216, 25248, 25256, + 0, 16384, 24576, 25088, 25216, 25248, 25256, 25258, + 0, 16384, 24576, 25088, 25216, 25248, 25256, 0, + 16384, 24576, 25088, 25216, 25248, 25264, 25260, 0, + 16384, 24576, 25088, 25216, 25248, 25264, 25260, 0, + 16384, 24576, 25088, 25216, 25248, 25264, 25265, 25262, + 0, 16384, 24576, 25088, 25216, 25248, 0, 16384, + 24576, 25088, 25216, 25280, 25264, 0, 16384, 24576, + 25088, 25216, 25280, 25264, 0, 16384, 24576, 25088, + 25216, 25280, 25264, 25266, 0, 16384, 24576, 25088, + 25216, 25280, 25264, 0, 16384, 24576, 25088, 25216, + 25280, 25264, 25268, 0, 16384, 24576, 25088, 25216, + 25280, 25264, 25268, 0, 16384, 24576, 25088, 25216, + 25280, 25264, 25272, 25270, 0, 16384, 24576, 25088, + 25216, 25280, 25264, 0, 16384, 24576, 25088, 25216, + 25280, 25281, 25272, 0, 16384, 24576, 25088, 25216, + 25280, 25281, 25272, 0, 16384, 24576, 25088, 25216, + 25280, 25281, 25272, 25274, 0, 16384, 24576, 25088, + 25216, 25280, 25281, 25272, 0, 16384, 24576, 25088, + 25216, 25280, 25281, 25272, 25276, 0, 16384, 24576, + 25088, 25216, 25280, 25281, 25283, 25276, 0, 16384, + 24576, 25088, 25216, 25280, 25281, 25283, 25276, 25278, + 0, 16384, 24576, 25088, 25216, 0, 16384, 24576, + 25088, 25344, 25280, 0, 16384, 24576, 25088, 25344, + 25280, 0, 16384, 24576, 25088, 25344, 25280, 25282, + 0, 16384, 24576, 25088, 25344, 25280, 0, 16384, + 24576, 25088, 25344, 25280, 25284, 0, 16384, 24576, + 25088, 25344, 25280, 25284, 0, 16384, 24576, 25088, + 25344, 25280, 25288, 25286, 0, 16384, 24576, 25088, + 25344, 25280, 0, 16384, 24576, 25088, 25344, 25280, + 25288, 0, 16384, 24576, 25088, 25344, 25280, 25288, + 0, 16384, 24576, 25088, 25344, 25280, 25288, 25290, + 0, 16384, 24576, 25088, 25344, 25280, 25288, 0, + 16384, 24576, 25088, 25344, 25280, 25296, 25292, 0, + 16384, 24576, 25088, 25344, 25280, 25296, 25292, 0, + 16384, 24576, 25088, 25344, 25280, 25296, 25297, 25294, + 0, 16384, 24576, 25088, 25344, 25280, 0, 16384, + 24576, 25088, 25344, 25280, 25296, 0, 16384, 24576, + 25088, 25344, 25280, 25296, 0, 16384, 24576, 25088, + 25344, 25280, 25296, 25298, 0, 16384, 24576, 25088, + 25344, 25280, 25296, 0, 16384, 24576, 25088, 25344, + 25280, 25296, 25300, 0, 16384, 24576, 25088, 25344, + 25280, 25296, 25300, 0, 16384, 24576, 25088, 25344, + 25280, 25296, 25304, 25302, 0, 16384, 24576, 25088, + 25344, 25280, 25296, 0, 16384, 24576, 25088, 25344, + 25280, 25312, 25304, 0, 16384, 24576, 25088, 25344, + 25280, 25312, 25304, 0, 16384, 24576, 25088, 25344, + 25280, 25312, 25304, 25306, 0, 16384, 24576, 25088, + 25344, 25280, 25312, 25304, 0, 16384, 24576, 25088, + 25344, 25280, 25312, 25313, 25308, 0, 16384, 24576, + 25088, 25344, 25280, 25312, 25313, 25308, 0, 16384, + 24576, 25088, 25344, 25280, 25312, 25313, 25308, 25310, + 0, 16384, 24576, 25088, 25344, 25280, 0, 16384, + 24576, 25088, 25344, 25345, 25312, 0, 16384, 24576, + 25088, 25344, 25345, 25312, 0, 16384, 24576, 25088, + 25344, 25345, 25312, 25314, 0, 16384, 24576, 25088, + 25344, 25345, 25312, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25316, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25316, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25320, 25318, 0, 16384, 24576, 25088, + 25344, 25345, 25312, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25320, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25320, 0, 16384, 24576, 25088, 25344, + 25345, 25312, 25320, 25322, 0, 16384, 24576, 25088, + 25344, 25345, 25312, 25320, 0, 16384, 24576, 25088, + 25344, 25345, 25312, 25328, 25324, 0, 16384, 24576, + 25088, 25344, 25345, 25312, 25328, 25324, 0, 16384, + 24576, 25088, 25344, 25345, 25312, 25328, 25329, 25326, + 0, 16384, 24576, 25088, 25344, 25345, 25312, 0, + 16384, 24576, 25088, 25344, 25345, 25312, 25328, 0, + 16384, 24576, 25088, 25344, 25345, 25347, 25328, 0, + 16384, 24576, 25088, 25344, 25345, 25347, 25328, 25330, + 0, 16384, 24576, 25088, 25344, 25345, 25347, 25328, + 0, 16384, 24576, 25088, 25344, 25345, 25347, 25328, + 25332, 0, 16384, 24576, 25088, 25344, 25345, 25347, + 25328, 25332, 0, 16384, 24576, 25088, 25344, 25345, + 25347, 25328, 25336, 25334, 0, 16384, 24576, 25088, + 25344, 25345, 25347, 25328, 0, 16384, 24576, 25088, + 25344, 25345, 25347, 25328, 25336, 0, 16384, 24576, + 25088, 25344, 25345, 25347, 25328, 25336, 0, 16384, + 24576, 25088, 25344, 25345, 25347, 25328, 25336, 25338, + 0, 16384, 24576, 25088, 25344, 25345, 25347, 25351, + 25336, 0, 16384, 24576, 25088, 25344, 25345, 25347, + 25351, 25336, 25340, 0, 16384, 24576, 25088, 25344, + 25345, 25347, 25351, 25336, 25340, 0, 16384, 24576, + 25088, 25344, 25345, 25347, 25351, 25336, 25340, 25342, + 0, 16384, 24576, 25088, 0, 16384, 24576, 25600, + 25344, 0, 16384, 24576, 25600, 25344, 0, 16384, + 24576, 25600, 25344, 25346, 0, 16384, 24576, 25600, + 25344, 0, 16384, 24576, 25600, 25344, 25348, 0, + 16384, 24576, 25600, 25344, 25348, 0, 16384, 24576, + 25600, 25344, 25352, 25350, 0, 16384, 24576, 25600, + 25344, 0, 16384, 24576, 25600, 25344, 25352, 0, + 16384, 24576, 25600, 25344, 25352, 0, 16384, 24576, + 25600, 25344, 25352, 25354, 0, 16384, 24576, 25600, + 25344, 25352, 0, 16384, 24576, 25600, 25344, 25360, + 25356, 0, 16384, 24576, 25600, 25344, 25360, 25356, + 0, 16384, 24576, 25600, 25344, 25360, 25361, 25358, + 0, 16384, 24576, 25600, 25344, 0, 16384, 24576, + 25600, 25344, 25360, 0, 16384, 24576, 25600, 25344, + 25360, 0, 16384, 24576, 25600, 25344, 25360, 25362, + 0, 16384, 24576, 25600, 25344, 25360, 0, 16384, + 24576, 25600, 25344, 25360, 25364, 0, 16384, 24576, + 25600, 25344, 25360, 25364, 0, 16384, 24576, 25600, + 25344, 25360, 25368, 25366, 0, 16384, 24576, 25600, + 25344, 25360, 0, 16384, 24576, 25600, 25344, 25376, + 25368, 0, 16384, 24576, 25600, 25344, 25376, 25368, + 0, 16384, 24576, 25600, 25344, 25376, 25368, 25370, + 0, 16384, 24576, 25600, 25344, 25376, 25368, 0, + 16384, 24576, 25600, 25344, 25376, 25377, 25372, 0, + 16384, 24576, 25600, 25344, 25376, 25377, 25372, 0, + 16384, 24576, 25600, 25344, 25376, 25377, 25372, 25374, + 0, 16384, 24576, 25600, 25344, 0, 16384, 24576, + 25600, 25344, 25376, 0, 16384, 24576, 25600, 25344, + 25376, 0, 16384, 24576, 25600, 25344, 25376, 25378, + 0, 16384, 24576, 25600, 25344, 25376, 0, 16384, + 24576, 25600, 25344, 25376, 25380, 0, 16384, 24576, + 25600, 25344, 25376, 25380, 0, 16384, 24576, 25600, + 25344, 25376, 25384, 25382, 0, 16384, 24576, 25600, + 25344, 25376, 0, 16384, 24576, 25600, 25344, 25376, + 25384, 0, 16384, 24576, 25600, 25344, 25376, 25384, + 0, 16384, 24576, 25600, 25344, 25376, 25384, 25386, + 0, 16384, 24576, 25600, 25344, 25376, 25384, 0, + 16384, 24576, 25600, 25344, 25376, 25392, 25388, 0, + 16384, 24576, 25600, 25344, 25376, 25392, 25388, 0, + 16384, 24576, 25600, 25344, 25376, 25392, 25393, 25390, + 0, 16384, 24576, 25600, 25344, 25376, 0, 16384, + 24576, 25600, 25344, 25408, 25392, 0, 16384, 24576, + 25600, 25344, 25408, 25392, 0, 16384, 24576, 25600, + 25344, 25408, 25392, 25394, 0, 16384, 24576, 25600, + 25344, 25408, 25392, 0, 16384, 24576, 25600, 25344, + 25408, 25392, 25396, 0, 16384, 24576, 25600, 25344, + 25408, 25392, 25396, 0, 16384, 24576, 25600, 25344, + 25408, 25392, 25400, 25398, 0, 16384, 24576, 25600, + 25344, 25408, 25392, 0, 16384, 24576, 25600, 25344, + 25408, 25409, 25400, 0, 16384, 24576, 25600, 25344, + 25408, 25409, 25400, 0, 16384, 24576, 25600, 25344, + 25408, 25409, 25400, 25402, 0, 16384, 24576, 25600, + 25344, 25408, 25409, 25400, 0, 16384, 24576, 25600, + 25344, 25408, 25409, 25400, 25404, 0, 16384, 24576, + 25600, 25344, 25408, 25409, 25411, 25404, 0, 16384, + 24576, 25600, 25344, 25408, 25409, 25411, 25404, 25406, + 0, 16384, 24576, 25600, 25344, 0, 16384, 24576, + 25600, 25344, 25408, 0, 16384, 24576, 25600, 25344, + 25408, 0, 16384, 24576, 25600, 25344, 25408, 25410, + 0, 16384, 24576, 25600, 25344, 25408, 0, 16384, + 24576, 25600, 25344, 25408, 25412, 0, 16384, 24576, + 25600, 25344, 25408, 25412, 0, 16384, 24576, 25600, + 25344, 25408, 25416, 25414, 0, 16384, 24576, 25600, + 25344, 25408, 0, 16384, 24576, 25600, 25344, 25408, + 25416, 0, 16384, 24576, 25600, 25344, 25408, 25416, + 0, 16384, 24576, 25600, 25344, 25408, 25416, 25418, + 0, 16384, 24576, 25600, 25344, 25408, 25416, 0, + 16384, 24576, 25600, 25344, 25408, 25424, 25420, 0, + 16384, 24576, 25600, 25344, 25408, 25424, 25420, 0, + 16384, 24576, 25600, 25344, 25408, 25424, 25425, 25422, + 0, 16384, 24576, 25600, 25344, 25408, 0, 16384, + 24576, 25600, 25344, 25408, 25424, 0, 16384, 24576, + 25600, 25344, 25408, 25424, 0, 16384, 24576, 25600, + 25344, 25408, 25424, 25426, 0, 16384, 24576, 25600, + 25344, 25408, 25424, 0, 16384, 24576, 25600, 25344, + 25408, 25424, 25428, 0, 16384, 24576, 25600, 25344, + 25408, 25424, 25428, 0, 16384, 24576, 25600, 25344, + 25408, 25424, 25432, 25430, 0, 16384, 24576, 25600, + 25344, 25408, 25424, 0, 16384, 24576, 25600, 25344, + 25408, 25440, 25432, 0, 16384, 24576, 25600, 25344, + 25408, 25440, 25432, 0, 16384, 24576, 25600, 25344, + 25408, 25440, 25432, 25434, 0, 16384, 24576, 25600, + 25344, 25408, 25440, 25432, 0, 16384, 24576, 25600, + 25344, 25408, 25440, 25441, 25436, 0, 16384, 24576, + 25600, 25344, 25408, 25440, 25441, 25436, 0, 16384, + 24576, 25600, 25344, 25408, 25440, 25441, 25436, 25438, + 0, 16384, 24576, 25600, 25344, 25408, 0, 16384, + 24576, 25600, 25344, 25472, 25440, 0, 16384, 24576, + 25600, 25344, 25472, 25440, 0, 16384, 24576, 25600, + 25344, 25472, 25440, 25442, 0, 16384, 24576, 25600, + 25344, 25472, 25440, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25444, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25444, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25448, 25446, 0, 16384, 24576, 25600, + 25344, 25472, 25440, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25448, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25448, 0, 16384, 24576, 25600, 25344, + 25472, 25440, 25448, 25450, 0, 16384, 24576, 25600, + 25344, 25472, 25440, 25448, 0, 16384, 24576, 25600, + 25344, 25472, 25440, 25456, 25452, 0, 16384, 24576, + 25600, 25344, 25472, 25440, 25456, 25452, 0, 16384, + 24576, 25600, 25344, 25472, 25440, 25456, 25457, 25454, + 0, 16384, 24576, 25600, 25344, 25472, 25440, 0, + 16384, 24576, 25600, 25344, 25472, 25473, 25456, 0, + 16384, 24576, 25600, 25344, 25472, 25473, 25456, 0, + 16384, 24576, 25600, 25344, 25472, 25473, 25456, 25458, + 0, 16384, 24576, 25600, 25344, 25472, 25473, 25456, + 0, 16384, 24576, 25600, 25344, 25472, 25473, 25456, + 25460, 0, 16384, 24576, 25600, 25344, 25472, 25473, + 25456, 25460, 0, 16384, 24576, 25600, 25344, 25472, + 25473, 25456, 25464, 25462, 0, 16384, 24576, 25600, + 25344, 25472, 25473, 25456, 0, 16384, 24576, 25600, + 25344, 25472, 25473, 25456, 25464, 0, 16384, 24576, + 25600, 25344, 25472, 25473, 25475, 25464, 0, 16384, + 24576, 25600, 25344, 25472, 25473, 25475, 25464, 25466, + 0, 16384, 24576, 25600, 25344, 25472, 25473, 25475, + 25464, 0, 16384, 24576, 25600, 25344, 25472, 25473, + 25475, 25464, 25468, 0, 16384, 24576, 25600, 25344, + 25472, 25473, 25475, 25464, 25468, 0, 16384, 24576, + 25600, 25344, 25472, 25473, 25475, 25464, 25468, 25470, + 0, 16384, 24576, 25600, 25344, 0, 16384, 24576, + 25600, 25344, 25472, 0, 16384, 24576, 25600, 25601, + 25472, 0, 16384, 24576, 25600, 25601, 25472, 25474, + 0, 16384, 24576, 25600, 25601, 25472, 0, 16384, + 24576, 25600, 25601, 25472, 25476, 0, 16384, 24576, + 25600, 25601, 25472, 25476, 0, 16384, 24576, 25600, + 25601, 25472, 25480, 25478, 0, 16384, 24576, 25600, + 25601, 25472, 0, 16384, 24576, 25600, 25601, 25472, + 25480, 0, 16384, 24576, 25600, 25601, 25472, 25480, + 0, 16384, 24576, 25600, 25601, 25472, 25480, 25482, + 0, 16384, 24576, 25600, 25601, 25472, 25480, 0, + 16384, 24576, 25600, 25601, 25472, 25488, 25484, 0, + 16384, 24576, 25600, 25601, 25472, 25488, 25484, 0, + 16384, 24576, 25600, 25601, 25472, 25488, 25489, 25486, + 0, 16384, 24576, 25600, 25601, 25472, 0, 16384, + 24576, 25600, 25601, 25472, 25488, 0, 16384, 24576, + 25600, 25601, 25472, 25488, 0, 16384, 24576, 25600, + 25601, 25472, 25488, 25490, 0, 16384, 24576, 25600, + 25601, 25472, 25488, 0, 16384, 24576, 25600, 25601, + 25472, 25488, 25492, 0, 16384, 24576, 25600, 25601, + 25472, 25488, 25492, 0, 16384, 24576, 25600, 25601, + 25472, 25488, 25496, 25494, 0, 16384, 24576, 25600, + 25601, 25472, 25488, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25496, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25496, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25496, 25498, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 25496, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 25505, 25500, 0, 16384, 24576, + 25600, 25601, 25472, 25504, 25505, 25500, 0, 16384, + 24576, 25600, 25601, 25472, 25504, 25505, 25500, 25502, + 0, 16384, 24576, 25600, 25601, 25472, 0, 16384, + 24576, 25600, 25601, 25472, 25504, 0, 16384, 24576, + 25600, 25601, 25472, 25504, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 25506, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25508, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25508, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25512, 25510, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25512, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25512, 0, 16384, 24576, 25600, 25601, + 25472, 25504, 25512, 25514, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 25512, 0, 16384, 24576, 25600, + 25601, 25472, 25504, 25520, 25516, 0, 16384, 24576, + 25600, 25601, 25472, 25504, 25520, 25516, 0, 16384, + 24576, 25600, 25601, 25472, 25504, 25520, 25521, 25518, + 0, 16384, 24576, 25600, 25601, 25472, 25504, 0, + 16384, 24576, 25600, 25601, 25472, 25536, 25520, 0, + 16384, 24576, 25600, 25601, 25472, 25536, 25520, 0, + 16384, 24576, 25600, 25601, 25472, 25536, 25520, 25522, + 0, 16384, 24576, 25600, 25601, 25472, 25536, 25520, + 0, 16384, 24576, 25600, 25601, 25472, 25536, 25520, + 25524, 0, 16384, 24576, 25600, 25601, 25472, 25536, + 25520, 25524, 0, 16384, 24576, 25600, 25601, 25472, + 25536, 25520, 25528, 25526, 0, 16384, 24576, 25600, + 25601, 25472, 25536, 25520, 0, 16384, 24576, 25600, + 25601, 25472, 25536, 25537, 25528, 0, 16384, 24576, + 25600, 25601, 25472, 25536, 25537, 25528, 0, 16384, + 24576, 25600, 25601, 25472, 25536, 25537, 25528, 25530, + 0, 16384, 24576, 25600, 25601, 25472, 25536, 25537, + 25528, 0, 16384, 24576, 25600, 25601, 25472, 25536, + 25537, 25528, 25532, 0, 16384, 24576, 25600, 25601, + 25472, 25536, 25537, 25539, 25532, 0, 16384, 24576, + 25600, 25601, 25472, 25536, 25537, 25539, 25532, 25534, + 0, 16384, 24576, 25600, 25601, 25472, 0, 16384, + 24576, 25600, 25601, 25472, 25536, 0, 16384, 24576, + 25600, 25601, 25472, 25536, 0, 16384, 24576, 25600, + 25601, 25472, 25536, 25538, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25540, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25540, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25544, 25542, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25544, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25544, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25544, 25546, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 25544, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 25552, 25548, 0, 16384, 24576, + 25600, 25601, 25603, 25536, 25552, 25548, 0, 16384, + 24576, 25600, 25601, 25603, 25536, 25552, 25553, 25550, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25552, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25552, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25552, 25554, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 25552, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 25552, + 25556, 0, 16384, 24576, 25600, 25601, 25603, 25536, + 25552, 25556, 0, 16384, 24576, 25600, 25601, 25603, + 25536, 25552, 25560, 25558, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 25552, 0, 16384, 24576, 25600, + 25601, 25603, 25536, 25568, 25560, 0, 16384, 24576, + 25600, 25601, 25603, 25536, 25568, 25560, 0, 16384, + 24576, 25600, 25601, 25603, 25536, 25568, 25560, 25562, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 25568, + 25560, 0, 16384, 24576, 25600, 25601, 25603, 25536, + 25568, 25569, 25564, 0, 16384, 24576, 25600, 25601, + 25603, 25536, 25568, 25569, 25564, 0, 16384, 24576, + 25600, 25601, 25603, 25536, 25568, 25569, 25564, 25566, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25568, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25568, 0, + 16384, 24576, 25600, 25601, 25603, 25536, 25568, 25570, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 25568, + 0, 16384, 24576, 25600, 25601, 25603, 25536, 25568, + 25572, 0, 16384, 24576, 25600, 25601, 25603, 25536, + 25568, 25572, 0, 16384, 24576, 25600, 25601, 25603, + 25536, 25568, 25576, 25574, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 25576, 0, 16384, 24576, + 25600, 25601, 25603, 25607, 25568, 25576, 0, 16384, + 24576, 25600, 25601, 25603, 25607, 25568, 25576, 25578, + 0, 16384, 24576, 25600, 25601, 25603, 25607, 25568, + 25576, 0, 16384, 24576, 25600, 25601, 25603, 25607, + 25568, 25584, 25580, 0, 16384, 24576, 25600, 25601, + 25603, 25607, 25568, 25584, 25580, 0, 16384, 24576, + 25600, 25601, 25603, 25607, 25568, 25584, 25585, 25582, + 0, 16384, 24576, 25600, 25601, 25603, 25607, 25568, + 0, 16384, 24576, 25600, 25601, 25603, 25607, 25568, + 25584, 0, 16384, 24576, 25600, 25601, 25603, 25607, + 25568, 25584, 0, 16384, 24576, 25600, 25601, 25603, + 25607, 25568, 25584, 25586, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 25584, 0, 16384, 24576, + 25600, 25601, 25603, 25607, 25568, 25584, 25588, 0, + 16384, 24576, 25600, 25601, 25603, 25607, 25568, 25584, + 25588, 0, 16384, 24576, 25600, 25601, 25603, 25607, + 25568, 25584, 25592, 25590, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 25584, 0, 16384, 24576, + 25600, 25601, 25603, 25607, 25568, 25584, 25592, 0, + 16384, 24576, 25600, 25601, 25603, 25607, 25568, 25584, + 25592, 0, 16384, 24576, 25600, 25601, 25603, 25607, + 25568, 25584, 25592, 25594, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 25584, 25592, 0, 16384, + 24576, 25600, 25601, 25603, 25607, 25568, 25584, 25592, + 25596, 0, 16384, 24576, 25600, 25601, 25603, 25607, + 25568, 25584, 25592, 25596, 0, 16384, 24576, 25600, + 25601, 25603, 25607, 25568, 25584, 25592, 25596, 25598, + 0, 16384, 24576, 0, 16384, 24576, 25600, 0, + 16384, 24576, 25600, 0, 16384, 24576, 25600, 25602, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25604, 0, 16384, 24576, 25600, 25604, 0, 16384, + 24576, 25600, 25608, 25606, 0, 16384, 24576, 25600, + 0, 16384, 24576, 25600, 25608, 0, 16384, 24576, + 25600, 25608, 0, 16384, 24576, 25600, 25608, 25610, + 0, 16384, 24576, 25600, 25608, 0, 16384, 24576, + 25600, 25616, 25612, 0, 16384, 24576, 25600, 25616, + 25612, 0, 16384, 24576, 25600, 25616, 25617, 25614, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25616, 0, 16384, 24576, 25600, 25616, 0, 16384, + 24576, 25600, 25616, 25618, 0, 16384, 24576, 25600, + 25616, 0, 16384, 24576, 25600, 25616, 25620, 0, + 16384, 24576, 25600, 25616, 25620, 0, 16384, 24576, + 25600, 25616, 25624, 25622, 0, 16384, 24576, 25600, + 25616, 0, 16384, 24576, 25600, 25632, 25624, 0, + 16384, 24576, 25600, 25632, 25624, 0, 16384, 24576, + 25600, 25632, 25624, 25626, 0, 16384, 24576, 25600, + 25632, 25624, 0, 16384, 24576, 25600, 25632, 25633, + 25628, 0, 16384, 24576, 25600, 25632, 25633, 25628, + 0, 16384, 24576, 25600, 25632, 25633, 25628, 25630, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25632, 0, 16384, 24576, 25600, 25632, 0, 16384, + 24576, 25600, 25632, 25634, 0, 16384, 24576, 25600, + 25632, 0, 16384, 24576, 25600, 25632, 25636, 0, + 16384, 24576, 25600, 25632, 25636, 0, 16384, 24576, + 25600, 25632, 25640, 25638, 0, 16384, 24576, 25600, + 25632, 0, 16384, 24576, 25600, 25632, 25640, 0, + 16384, 24576, 25600, 25632, 25640, 0, 16384, 24576, + 25600, 25632, 25640, 25642, 0, 16384, 24576, 25600, + 25632, 25640, 0, 16384, 24576, 25600, 25632, 25648, + 25644, 0, 16384, 24576, 25600, 25632, 25648, 25644, + 0, 16384, 24576, 25600, 25632, 25648, 25649, 25646, + 0, 16384, 24576, 25600, 25632, 0, 16384, 24576, + 25600, 25664, 25648, 0, 16384, 24576, 25600, 25664, + 25648, 0, 16384, 24576, 25600, 25664, 25648, 25650, + 0, 16384, 24576, 25600, 25664, 25648, 0, 16384, + 24576, 25600, 25664, 25648, 25652, 0, 16384, 24576, + 25600, 25664, 25648, 25652, 0, 16384, 24576, 25600, + 25664, 25648, 25656, 25654, 0, 16384, 24576, 25600, + 25664, 25648, 0, 16384, 24576, 25600, 25664, 25665, + 25656, 0, 16384, 24576, 25600, 25664, 25665, 25656, + 0, 16384, 24576, 25600, 25664, 25665, 25656, 25658, + 0, 16384, 24576, 25600, 25664, 25665, 25656, 0, + 16384, 24576, 25600, 25664, 25665, 25656, 25660, 0, + 16384, 24576, 25600, 25664, 25665, 25667, 25660, 0, + 16384, 24576, 25600, 25664, 25665, 25667, 25660, 25662, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25664, 0, 16384, 24576, 25600, 25664, 0, 16384, + 24576, 25600, 25664, 25666, 0, 16384, 24576, 25600, + 25664, 0, 16384, 24576, 25600, 25664, 25668, 0, + 16384, 24576, 25600, 25664, 25668, 0, 16384, 24576, + 25600, 25664, 25672, 25670, 0, 16384, 24576, 25600, + 25664, 0, 16384, 24576, 25600, 25664, 25672, 0, + 16384, 24576, 25600, 25664, 25672, 0, 16384, 24576, + 25600, 25664, 25672, 25674, 0, 16384, 24576, 25600, + 25664, 25672, 0, 16384, 24576, 25600, 25664, 25680, + 25676, 0, 16384, 24576, 25600, 25664, 25680, 25676, + 0, 16384, 24576, 25600, 25664, 25680, 25681, 25678, + 0, 16384, 24576, 25600, 25664, 0, 16384, 24576, + 25600, 25664, 25680, 0, 16384, 24576, 25600, 25664, + 25680, 0, 16384, 24576, 25600, 25664, 25680, 25682, + 0, 16384, 24576, 25600, 25664, 25680, 0, 16384, + 24576, 25600, 25664, 25680, 25684, 0, 16384, 24576, + 25600, 25664, 25680, 25684, 0, 16384, 24576, 25600, + 25664, 25680, 25688, 25686, 0, 16384, 24576, 25600, + 25664, 25680, 0, 16384, 24576, 25600, 25664, 25696, + 25688, 0, 16384, 24576, 25600, 25664, 25696, 25688, + 0, 16384, 24576, 25600, 25664, 25696, 25688, 25690, + 0, 16384, 24576, 25600, 25664, 25696, 25688, 0, + 16384, 24576, 25600, 25664, 25696, 25697, 25692, 0, + 16384, 24576, 25600, 25664, 25696, 25697, 25692, 0, + 16384, 24576, 25600, 25664, 25696, 25697, 25692, 25694, + 0, 16384, 24576, 25600, 25664, 0, 16384, 24576, + 25600, 25728, 25696, 0, 16384, 24576, 25600, 25728, + 25696, 0, 16384, 24576, 25600, 25728, 25696, 25698, + 0, 16384, 24576, 25600, 25728, 25696, 0, 16384, + 24576, 25600, 25728, 25696, 25700, 0, 16384, 24576, + 25600, 25728, 25696, 25700, 0, 16384, 24576, 25600, + 25728, 25696, 25704, 25702, 0, 16384, 24576, 25600, + 25728, 25696, 0, 16384, 24576, 25600, 25728, 25696, + 25704, 0, 16384, 24576, 25600, 25728, 25696, 25704, + 0, 16384, 24576, 25600, 25728, 25696, 25704, 25706, + 0, 16384, 24576, 25600, 25728, 25696, 25704, 0, + 16384, 24576, 25600, 25728, 25696, 25712, 25708, 0, + 16384, 24576, 25600, 25728, 25696, 25712, 25708, 0, + 16384, 24576, 25600, 25728, 25696, 25712, 25713, 25710, + 0, 16384, 24576, 25600, 25728, 25696, 0, 16384, + 24576, 25600, 25728, 25729, 25712, 0, 16384, 24576, + 25600, 25728, 25729, 25712, 0, 16384, 24576, 25600, + 25728, 25729, 25712, 25714, 0, 16384, 24576, 25600, + 25728, 25729, 25712, 0, 16384, 24576, 25600, 25728, + 25729, 25712, 25716, 0, 16384, 24576, 25600, 25728, + 25729, 25712, 25716, 0, 16384, 24576, 25600, 25728, + 25729, 25712, 25720, 25718, 0, 16384, 24576, 25600, + 25728, 25729, 25712, 0, 16384, 24576, 25600, 25728, + 25729, 25712, 25720, 0, 16384, 24576, 25600, 25728, + 25729, 25731, 25720, 0, 16384, 24576, 25600, 25728, + 25729, 25731, 25720, 25722, 0, 16384, 24576, 25600, + 25728, 25729, 25731, 25720, 0, 16384, 24576, 25600, + 25728, 25729, 25731, 25720, 25724, 0, 16384, 24576, + 25600, 25728, 25729, 25731, 25720, 25724, 0, 16384, + 24576, 25600, 25728, 25729, 25731, 25720, 25724, 25726, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25728, 0, 16384, 24576, 25600, 25728, 0, 16384, + 24576, 25600, 25728, 25730, 0, 16384, 24576, 25600, + 25728, 0, 16384, 24576, 25600, 25728, 25732, 0, + 16384, 24576, 25600, 25728, 25732, 0, 16384, 24576, + 25600, 25728, 25736, 25734, 0, 16384, 24576, 25600, + 25728, 0, 16384, 24576, 25600, 25728, 25736, 0, + 16384, 24576, 25600, 25728, 25736, 0, 16384, 24576, + 25600, 25728, 25736, 25738, 0, 16384, 24576, 25600, + 25728, 25736, 0, 16384, 24576, 25600, 25728, 25744, + 25740, 0, 16384, 24576, 25600, 25728, 25744, 25740, + 0, 16384, 24576, 25600, 25728, 25744, 25745, 25742, + 0, 16384, 24576, 25600, 25728, 0, 16384, 24576, + 25600, 25728, 25744, 0, 16384, 24576, 25600, 25728, + 25744, 0, 16384, 24576, 25600, 25728, 25744, 25746, + 0, 16384, 24576, 25600, 25728, 25744, 0, 16384, + 24576, 25600, 25728, 25744, 25748, 0, 16384, 24576, + 25600, 25728, 25744, 25748, 0, 16384, 24576, 25600, + 25728, 25744, 25752, 25750, 0, 16384, 24576, 25600, + 25728, 25744, 0, 16384, 24576, 25600, 25728, 25760, + 25752, 0, 16384, 24576, 25600, 25728, 25760, 25752, + 0, 16384, 24576, 25600, 25728, 25760, 25752, 25754, + 0, 16384, 24576, 25600, 25728, 25760, 25752, 0, + 16384, 24576, 25600, 25728, 25760, 25761, 25756, 0, + 16384, 24576, 25600, 25728, 25760, 25761, 25756, 0, + 16384, 24576, 25600, 25728, 25760, 25761, 25756, 25758, + 0, 16384, 24576, 25600, 25728, 0, 16384, 24576, + 25600, 25728, 25760, 0, 16384, 24576, 25600, 25728, + 25760, 0, 16384, 24576, 25600, 25728, 25760, 25762, + 0, 16384, 24576, 25600, 25728, 25760, 0, 16384, + 24576, 25600, 25728, 25760, 25764, 0, 16384, 24576, + 25600, 25728, 25760, 25764, 0, 16384, 24576, 25600, + 25728, 25760, 25768, 25766, 0, 16384, 24576, 25600, + 25728, 25760, 0, 16384, 24576, 25600, 25728, 25760, + 25768, 0, 16384, 24576, 25600, 25728, 25760, 25768, + 0, 16384, 24576, 25600, 25728, 25760, 25768, 25770, + 0, 16384, 24576, 25600, 25728, 25760, 25768, 0, + 16384, 24576, 25600, 25728, 25760, 25776, 25772, 0, + 16384, 24576, 25600, 25728, 25760, 25776, 25772, 0, + 16384, 24576, 25600, 25728, 25760, 25776, 25777, 25774, + 0, 16384, 24576, 25600, 25728, 25760, 0, 16384, + 24576, 25600, 25728, 25792, 25776, 0, 16384, 24576, + 25600, 25728, 25792, 25776, 0, 16384, 24576, 25600, + 25728, 25792, 25776, 25778, 0, 16384, 24576, 25600, + 25728, 25792, 25776, 0, 16384, 24576, 25600, 25728, + 25792, 25776, 25780, 0, 16384, 24576, 25600, 25728, + 25792, 25776, 25780, 0, 16384, 24576, 25600, 25728, + 25792, 25776, 25784, 25782, 0, 16384, 24576, 25600, + 25728, 25792, 25776, 0, 16384, 24576, 25600, 25728, + 25792, 25793, 25784, 0, 16384, 24576, 25600, 25728, + 25792, 25793, 25784, 0, 16384, 24576, 25600, 25728, + 25792, 25793, 25784, 25786, 0, 16384, 24576, 25600, + 25728, 25792, 25793, 25784, 0, 16384, 24576, 25600, + 25728, 25792, 25793, 25784, 25788, 0, 16384, 24576, + 25600, 25728, 25792, 25793, 25795, 25788, 0, 16384, + 24576, 25600, 25728, 25792, 25793, 25795, 25788, 25790, + 0, 16384, 24576, 25600, 25728, 0, 16384, 24576, + 25600, 25856, 25792, 0, 16384, 24576, 25600, 25856, + 25792, 0, 16384, 24576, 25600, 25856, 25792, 25794, + 0, 16384, 24576, 25600, 25856, 25792, 0, 16384, + 24576, 25600, 25856, 25792, 25796, 0, 16384, 24576, + 25600, 25856, 25792, 25796, 0, 16384, 24576, 25600, + 25856, 25792, 25800, 25798, 0, 16384, 24576, 25600, + 25856, 25792, 0, 16384, 24576, 25600, 25856, 25792, + 25800, 0, 16384, 24576, 25600, 25856, 25792, 25800, + 0, 16384, 24576, 25600, 25856, 25792, 25800, 25802, + 0, 16384, 24576, 25600, 25856, 25792, 25800, 0, + 16384, 24576, 25600, 25856, 25792, 25808, 25804, 0, + 16384, 24576, 25600, 25856, 25792, 25808, 25804, 0, + 16384, 24576, 25600, 25856, 25792, 25808, 25809, 25806, + 0, 16384, 24576, 25600, 25856, 25792, 0, 16384, + 24576, 25600, 25856, 25792, 25808, 0, 16384, 24576, + 25600, 25856, 25792, 25808, 0, 16384, 24576, 25600, + 25856, 25792, 25808, 25810, 0, 16384, 24576, 25600, + 25856, 25792, 25808, 0, 16384, 24576, 25600, 25856, + 25792, 25808, 25812, 0, 16384, 24576, 25600, 25856, + 25792, 25808, 25812, 0, 16384, 24576, 25600, 25856, + 25792, 25808, 25816, 25814, 0, 16384, 24576, 25600, + 25856, 25792, 25808, 0, 16384, 24576, 25600, 25856, + 25792, 25824, 25816, 0, 16384, 24576, 25600, 25856, + 25792, 25824, 25816, 0, 16384, 24576, 25600, 25856, + 25792, 25824, 25816, 25818, 0, 16384, 24576, 25600, + 25856, 25792, 25824, 25816, 0, 16384, 24576, 25600, + 25856, 25792, 25824, 25825, 25820, 0, 16384, 24576, + 25600, 25856, 25792, 25824, 25825, 25820, 0, 16384, + 24576, 25600, 25856, 25792, 25824, 25825, 25820, 25822, + 0, 16384, 24576, 25600, 25856, 25792, 0, 16384, + 24576, 25600, 25856, 25857, 25824, 0, 16384, 24576, + 25600, 25856, 25857, 25824, 0, 16384, 24576, 25600, + 25856, 25857, 25824, 25826, 0, 16384, 24576, 25600, + 25856, 25857, 25824, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25828, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25828, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25832, 25830, 0, 16384, 24576, 25600, + 25856, 25857, 25824, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25832, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25832, 0, 16384, 24576, 25600, 25856, + 25857, 25824, 25832, 25834, 0, 16384, 24576, 25600, + 25856, 25857, 25824, 25832, 0, 16384, 24576, 25600, + 25856, 25857, 25824, 25840, 25836, 0, 16384, 24576, + 25600, 25856, 25857, 25824, 25840, 25836, 0, 16384, + 24576, 25600, 25856, 25857, 25824, 25840, 25841, 25838, + 0, 16384, 24576, 25600, 25856, 25857, 25824, 0, + 16384, 24576, 25600, 25856, 25857, 25824, 25840, 0, + 16384, 24576, 25600, 25856, 25857, 25859, 25840, 0, + 16384, 24576, 25600, 25856, 25857, 25859, 25840, 25842, + 0, 16384, 24576, 25600, 25856, 25857, 25859, 25840, + 0, 16384, 24576, 25600, 25856, 25857, 25859, 25840, + 25844, 0, 16384, 24576, 25600, 25856, 25857, 25859, + 25840, 25844, 0, 16384, 24576, 25600, 25856, 25857, + 25859, 25840, 25848, 25846, 0, 16384, 24576, 25600, + 25856, 25857, 25859, 25840, 0, 16384, 24576, 25600, + 25856, 25857, 25859, 25840, 25848, 0, 16384, 24576, + 25600, 25856, 25857, 25859, 25840, 25848, 0, 16384, + 24576, 25600, 25856, 25857, 25859, 25840, 25848, 25850, + 0, 16384, 24576, 25600, 25856, 25857, 25859, 25863, + 25848, 0, 16384, 24576, 25600, 25856, 25857, 25859, + 25863, 25848, 25852, 0, 16384, 24576, 25600, 25856, + 25857, 25859, 25863, 25848, 25852, 0, 16384, 24576, + 25600, 25856, 25857, 25859, 25863, 25848, 25852, 25854, + 0, 16384, 24576, 25600, 0, 16384, 24576, 25600, + 25856, 0, 16384, 24576, 25600, 25856, 0, 16384, + 24576, 25600, 25856, 25858, 0, 16384, 24576, 25600, + 25856, 0, 16384, 24576, 25600, 25856, 25860, 0, + 16384, 24576, 25600, 25856, 25860, 0, 16384, 24576, + 25600, 25856, 25864, 25862, 0, 16384, 24576, 25600, + 25856, 0, 16384, 24576, 25600, 25856, 25864, 0, + 16384, 24576, 25600, 25856, 25864, 0, 16384, 24576, + 25600, 25856, 25864, 25866, 0, 16384, 24576, 25600, + 25856, 25864, 0, 16384, 24576, 25600, 25856, 25872, + 25868, 0, 16384, 24576, 25600, 25856, 25872, 25868, + 0, 16384, 24576, 25600, 25856, 25872, 25873, 25870, + 0, 16384, 24576, 25600, 25856, 0, 16384, 24576, + 25600, 25856, 25872, 0, 16384, 24576, 25600, 25856, + 25872, 0, 16384, 24576, 25600, 25856, 25872, 25874, + 0, 16384, 24576, 25600, 25856, 25872, 0, 16384, + 24576, 25600, 25856, 25872, 25876, 0, 16384, 24576, + 25600, 25856, 25872, 25876, 0, 16384, 24576, 25600, + 25856, 25872, 25880, 25878, 0, 16384, 24576, 25600, + 25856, 25872, 0, 16384, 24576, 25600, 25856, 25888, + 25880, 0, 16384, 24576, 25600, 25856, 25888, 25880, + 0, 16384, 24576, 25600, 25856, 25888, 25880, 25882, + 0, 16384, 24576, 25600, 25856, 25888, 25880, 0, + 16384, 24576, 25600, 25856, 25888, 25889, 25884, 0, + 16384, 24576, 25600, 25856, 25888, 25889, 25884, 0, + 16384, 24576, 25600, 25856, 25888, 25889, 25884, 25886, + 0, 16384, 24576, 25600, 25856, 0, 16384, 24576, + 25600, 25856, 25888, 0, 16384, 24576, 25600, 25856, + 25888, 0, 16384, 24576, 25600, 25856, 25888, 25890, + 0, 16384, 24576, 25600, 25856, 25888, 0, 16384, + 24576, 25600, 25856, 25888, 25892, 0, 16384, 24576, + 25600, 25856, 25888, 25892, 0, 16384, 24576, 25600, + 25856, 25888, 25896, 25894, 0, 16384, 24576, 25600, + 25856, 25888, 0, 16384, 24576, 25600, 25856, 25888, + 25896, 0, 16384, 24576, 25600, 25856, 25888, 25896, + 0, 16384, 24576, 25600, 25856, 25888, 25896, 25898, + 0, 16384, 24576, 25600, 25856, 25888, 25896, 0, + 16384, 24576, 25600, 25856, 25888, 25904, 25900, 0, + 16384, 24576, 25600, 25856, 25888, 25904, 25900, 0, + 16384, 24576, 25600, 25856, 25888, 25904, 25905, 25902, + 0, 16384, 24576, 25600, 25856, 25888, 0, 16384, + 24576, 25600, 25856, 25920, 25904, 0, 16384, 24576, + 25600, 25856, 25920, 25904, 0, 16384, 24576, 25600, + 25856, 25920, 25904, 25906, 0, 16384, 24576, 25600, + 25856, 25920, 25904, 0, 16384, 24576, 25600, 25856, + 25920, 25904, 25908, 0, 16384, 24576, 25600, 25856, + 25920, 25904, 25908, 0, 16384, 24576, 25600, 25856, + 25920, 25904, 25912, 25910, 0, 16384, 24576, 25600, + 25856, 25920, 25904, 0, 16384, 24576, 25600, 25856, + 25920, 25921, 25912, 0, 16384, 24576, 25600, 25856, + 25920, 25921, 25912, 0, 16384, 24576, 25600, 25856, + 25920, 25921, 25912, 25914, 0, 16384, 24576, 25600, + 25856, 25920, 25921, 25912, 0, 16384, 24576, 25600, + 25856, 25920, 25921, 25912, 25916, 0, 16384, 24576, + 25600, 25856, 25920, 25921, 25923, 25916, 0, 16384, + 24576, 25600, 25856, 25920, 25921, 25923, 25916, 25918, + 0, 16384, 24576, 25600, 25856, 0, 16384, 24576, + 25600, 25856, 25920, 0, 16384, 24576, 25600, 25856, + 25920, 0, 16384, 24576, 25600, 25856, 25920, 25922, + 0, 16384, 24576, 25600, 25856, 25920, 0, 16384, + 24576, 25600, 25856, 25920, 25924, 0, 16384, 24576, + 25600, 25856, 25920, 25924, 0, 16384, 24576, 25600, + 25856, 25920, 25928, 25926, 0, 16384, 24576, 25600, + 25856, 25920, 0, 16384, 24576, 25600, 25856, 25920, + 25928, 0, 16384, 24576, 25600, 25856, 25920, 25928, + 0, 16384, 24576, 25600, 25856, 25920, 25928, 25930, + 0, 16384, 24576, 25600, 25856, 25920, 25928, 0, + 16384, 24576, 25600, 25856, 25920, 25936, 25932, 0, + 16384, 24576, 25600, 25856, 25920, 25936, 25932, 0, + 16384, 24576, 25600, 25856, 25920, 25936, 25937, 25934, + 0, 16384, 24576, 25600, 25856, 25920, 0, 16384, + 24576, 25600, 25856, 25920, 25936, 0, 16384, 24576, + 25600, 25856, 25920, 25936, 0, 16384, 24576, 25600, + 25856, 25920, 25936, 25938, 0, 16384, 24576, 25600, + 25856, 25920, 25936, 0, 16384, 24576, 25600, 25856, + 25920, 25936, 25940, 0, 16384, 24576, 25600, 25856, + 25920, 25936, 25940, 0, 16384, 24576, 25600, 25856, + 25920, 25936, 25944, 25942, 0, 16384, 24576, 25600, + 25856, 25920, 25936, 0, 16384, 24576, 25600, 25856, + 25920, 25952, 25944, 0, 16384, 24576, 25600, 25856, + 25920, 25952, 25944, 0, 16384, 24576, 25600, 25856, + 25920, 25952, 25944, 25946, 0, 16384, 24576, 25600, + 25856, 25920, 25952, 25944, 0, 16384, 24576, 25600, + 25856, 25920, 25952, 25953, 25948, 0, 16384, 24576, + 25600, 25856, 25920, 25952, 25953, 25948, 0, 16384, + 24576, 25600, 25856, 25920, 25952, 25953, 25948, 25950, + 0, 16384, 24576, 25600, 25856, 25920, 0, 16384, + 24576, 25600, 25856, 25984, 25952, 0, 16384, 24576, + 25600, 25856, 25984, 25952, 0, 16384, 24576, 25600, + 25856, 25984, 25952, 25954, 0, 16384, 24576, 25600, + 25856, 25984, 25952, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25956, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25956, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25960, 25958, 0, 16384, 24576, 25600, + 25856, 25984, 25952, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25960, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25960, 0, 16384, 24576, 25600, 25856, + 25984, 25952, 25960, 25962, 0, 16384, 24576, 25600, + 25856, 25984, 25952, 25960, 0, 16384, 24576, 25600, + 25856, 25984, 25952, 25968, 25964, 0, 16384, 24576, + 25600, 25856, 25984, 25952, 25968, 25964, 0, 16384, + 24576, 25600, 25856, 25984, 25952, 25968, 25969, 25966, + 0, 16384, 24576, 25600, 25856, 25984, 25952, 0, + 16384, 24576, 25600, 25856, 25984, 25985, 25968, 0, + 16384, 24576, 25600, 25856, 25984, 25985, 25968, 0, + 16384, 24576, 25600, 25856, 25984, 25985, 25968, 25970, + 0, 16384, 24576, 25600, 25856, 25984, 25985, 25968, + 0, 16384, 24576, 25600, 25856, 25984, 25985, 25968, + 25972, 0, 16384, 24576, 25600, 25856, 25984, 25985, + 25968, 25972, 0, 16384, 24576, 25600, 25856, 25984, + 25985, 25968, 25976, 25974, 0, 16384, 24576, 25600, + 25856, 25984, 25985, 25968, 0, 16384, 24576, 25600, + 25856, 25984, 25985, 25968, 25976, 0, 16384, 24576, + 25600, 25856, 25984, 25985, 25987, 25976, 0, 16384, + 24576, 25600, 25856, 25984, 25985, 25987, 25976, 25978, + 0, 16384, 24576, 25600, 25856, 25984, 25985, 25987, + 25976, 0, 16384, 24576, 25600, 25856, 25984, 25985, + 25987, 25976, 25980, 0, 16384, 24576, 25600, 25856, + 25984, 25985, 25987, 25976, 25980, 0, 16384, 24576, + 25600, 25856, 25984, 25985, 25987, 25976, 25980, 25982, + 0, 16384, 24576, 25600, 25856, 0, 16384, 24576, + 25600, 26112, 25984, 0, 16384, 24576, 25600, 26112, + 25984, 0, 16384, 24576, 25600, 26112, 25984, 25986, + 0, 16384, 24576, 25600, 26112, 25984, 0, 16384, + 24576, 25600, 26112, 25984, 25988, 0, 16384, 24576, + 25600, 26112, 25984, 25988, 0, 16384, 24576, 25600, + 26112, 25984, 25992, 25990, 0, 16384, 24576, 25600, + 26112, 25984, 0, 16384, 24576, 25600, 26112, 25984, + 25992, 0, 16384, 24576, 25600, 26112, 25984, 25992, + 0, 16384, 24576, 25600, 26112, 25984, 25992, 25994, + 0, 16384, 24576, 25600, 26112, 25984, 25992, 0, + 16384, 24576, 25600, 26112, 25984, 26000, 25996, 0, + 16384, 24576, 25600, 26112, 25984, 26000, 25996, 0, + 16384, 24576, 25600, 26112, 25984, 26000, 26001, 25998, + 0, 16384, 24576, 25600, 26112, 25984, 0, 16384, + 24576, 25600, 26112, 25984, 26000, 0, 16384, 24576, + 25600, 26112, 25984, 26000, 0, 16384, 24576, 25600, + 26112, 25984, 26000, 26002, 0, 16384, 24576, 25600, + 26112, 25984, 26000, 0, 16384, 24576, 25600, 26112, + 25984, 26000, 26004, 0, 16384, 24576, 25600, 26112, + 25984, 26000, 26004, 0, 16384, 24576, 25600, 26112, + 25984, 26000, 26008, 26006, 0, 16384, 24576, 25600, + 26112, 25984, 26000, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26008, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26008, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26008, 26010, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 26008, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 26017, 26012, 0, 16384, 24576, + 25600, 26112, 25984, 26016, 26017, 26012, 0, 16384, + 24576, 25600, 26112, 25984, 26016, 26017, 26012, 26014, + 0, 16384, 24576, 25600, 26112, 25984, 0, 16384, + 24576, 25600, 26112, 25984, 26016, 0, 16384, 24576, + 25600, 26112, 25984, 26016, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 26018, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26020, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26020, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26024, 26022, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26024, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26024, 0, 16384, 24576, 25600, 26112, + 25984, 26016, 26024, 26026, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 26024, 0, 16384, 24576, 25600, + 26112, 25984, 26016, 26032, 26028, 0, 16384, 24576, + 25600, 26112, 25984, 26016, 26032, 26028, 0, 16384, + 24576, 25600, 26112, 25984, 26016, 26032, 26033, 26030, + 0, 16384, 24576, 25600, 26112, 25984, 26016, 0, + 16384, 24576, 25600, 26112, 25984, 26048, 26032, 0, + 16384, 24576, 25600, 26112, 25984, 26048, 26032, 0, + 16384, 24576, 25600, 26112, 25984, 26048, 26032, 26034, + 0, 16384, 24576, 25600, 26112, 25984, 26048, 26032, + 0, 16384, 24576, 25600, 26112, 25984, 26048, 26032, + 26036, 0, 16384, 24576, 25600, 26112, 25984, 26048, + 26032, 26036, 0, 16384, 24576, 25600, 26112, 25984, + 26048, 26032, 26040, 26038, 0, 16384, 24576, 25600, + 26112, 25984, 26048, 26032, 0, 16384, 24576, 25600, + 26112, 25984, 26048, 26049, 26040, 0, 16384, 24576, + 25600, 26112, 25984, 26048, 26049, 26040, 0, 16384, + 24576, 25600, 26112, 25984, 26048, 26049, 26040, 26042, + 0, 16384, 24576, 25600, 26112, 25984, 26048, 26049, + 26040, 0, 16384, 24576, 25600, 26112, 25984, 26048, + 26049, 26040, 26044, 0, 16384, 24576, 25600, 26112, + 25984, 26048, 26049, 26051, 26044, 0, 16384, 24576, + 25600, 26112, 25984, 26048, 26049, 26051, 26044, 26046, + 0, 16384, 24576, 25600, 26112, 25984, 0, 16384, + 24576, 25600, 26112, 26113, 26048, 0, 16384, 24576, + 25600, 26112, 26113, 26048, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 26050, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26052, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26052, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26056, 26054, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26056, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26056, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26056, 26058, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 26056, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 26064, 26060, 0, 16384, 24576, + 25600, 26112, 26113, 26048, 26064, 26060, 0, 16384, + 24576, 25600, 26112, 26113, 26048, 26064, 26065, 26062, + 0, 16384, 24576, 25600, 26112, 26113, 26048, 0, + 16384, 24576, 25600, 26112, 26113, 26048, 26064, 0, + 16384, 24576, 25600, 26112, 26113, 26048, 26064, 0, + 16384, 24576, 25600, 26112, 26113, 26048, 26064, 26066, + 0, 16384, 24576, 25600, 26112, 26113, 26048, 26064, + 0, 16384, 24576, 25600, 26112, 26113, 26048, 26064, + 26068, 0, 16384, 24576, 25600, 26112, 26113, 26048, + 26064, 26068, 0, 16384, 24576, 25600, 26112, 26113, + 26048, 26064, 26072, 26070, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 26064, 0, 16384, 24576, 25600, + 26112, 26113, 26048, 26080, 26072, 0, 16384, 24576, + 25600, 26112, 26113, 26048, 26080, 26072, 0, 16384, + 24576, 25600, 26112, 26113, 26048, 26080, 26072, 26074, + 0, 16384, 24576, 25600, 26112, 26113, 26048, 26080, + 26072, 0, 16384, 24576, 25600, 26112, 26113, 26048, + 26080, 26081, 26076, 0, 16384, 24576, 25600, 26112, + 26113, 26048, 26080, 26081, 26076, 0, 16384, 24576, + 25600, 26112, 26113, 26048, 26080, 26081, 26076, 26078, + 0, 16384, 24576, 25600, 26112, 26113, 26048, 0, + 16384, 24576, 25600, 26112, 26113, 26048, 26080, 0, + 16384, 24576, 25600, 26112, 26113, 26115, 26080, 0, + 16384, 24576, 25600, 26112, 26113, 26115, 26080, 26082, + 0, 16384, 24576, 25600, 26112, 26113, 26115, 26080, + 0, 16384, 24576, 25600, 26112, 26113, 26115, 26080, + 26084, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26080, 26084, 0, 16384, 24576, 25600, 26112, 26113, + 26115, 26080, 26088, 26086, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26080, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26080, 26088, 0, 16384, 24576, + 25600, 26112, 26113, 26115, 26080, 26088, 0, 16384, + 24576, 25600, 26112, 26113, 26115, 26080, 26088, 26090, + 0, 16384, 24576, 25600, 26112, 26113, 26115, 26080, + 26088, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26080, 26096, 26092, 0, 16384, 24576, 25600, 26112, + 26113, 26115, 26080, 26096, 26092, 0, 16384, 24576, + 25600, 26112, 26113, 26115, 26080, 26096, 26097, 26094, + 0, 16384, 24576, 25600, 26112, 26113, 26115, 26080, + 0, 16384, 24576, 25600, 26112, 26113, 26115, 26080, + 26096, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26080, 26096, 0, 16384, 24576, 25600, 26112, 26113, + 26115, 26080, 26096, 26098, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26119, 26096, 0, 16384, 24576, + 25600, 26112, 26113, 26115, 26119, 26096, 26100, 0, + 16384, 24576, 25600, 26112, 26113, 26115, 26119, 26096, + 26100, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26119, 26096, 26104, 26102, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26119, 26096, 0, 16384, 24576, + 25600, 26112, 26113, 26115, 26119, 26096, 26104, 0, + 16384, 24576, 25600, 26112, 26113, 26115, 26119, 26096, + 26104, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26119, 26096, 26104, 26106, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26119, 26096, 26104, 0, 16384, + 24576, 25600, 26112, 26113, 26115, 26119, 26096, 26104, + 26108, 0, 16384, 24576, 25600, 26112, 26113, 26115, + 26119, 26096, 26104, 26108, 0, 16384, 24576, 25600, + 26112, 26113, 26115, 26119, 26096, 26104, 26108, 26110, + 0, 16384, 24576, 25600, 0, 16384, 24576, 26624, + 26112, 0, 16384, 24576, 26624, 26112, 0, 16384, + 24576, 26624, 26112, 26114, 0, 16384, 24576, 26624, + 26112, 0, 16384, 24576, 26624, 26112, 26116, 0, + 16384, 24576, 26624, 26112, 26116, 0, 16384, 24576, + 26624, 26112, 26120, 26118, 0, 16384, 24576, 26624, + 26112, 0, 16384, 24576, 26624, 26112, 26120, 0, + 16384, 24576, 26624, 26112, 26120, 0, 16384, 24576, + 26624, 26112, 26120, 26122, 0, 16384, 24576, 26624, + 26112, 26120, 0, 16384, 24576, 26624, 26112, 26128, + 26124, 0, 16384, 24576, 26624, 26112, 26128, 26124, + 0, 16384, 24576, 26624, 26112, 26128, 26129, 26126, + 0, 16384, 24576, 26624, 26112, 0, 16384, 24576, + 26624, 26112, 26128, 0, 16384, 24576, 26624, 26112, + 26128, 0, 16384, 24576, 26624, 26112, 26128, 26130, + 0, 16384, 24576, 26624, 26112, 26128, 0, 16384, + 24576, 26624, 26112, 26128, 26132, 0, 16384, 24576, + 26624, 26112, 26128, 26132, 0, 16384, 24576, 26624, + 26112, 26128, 26136, 26134, 0, 16384, 24576, 26624, + 26112, 26128, 0, 16384, 24576, 26624, 26112, 26144, + 26136, 0, 16384, 24576, 26624, 26112, 26144, 26136, + 0, 16384, 24576, 26624, 26112, 26144, 26136, 26138, + 0, 16384, 24576, 26624, 26112, 26144, 26136, 0, + 16384, 24576, 26624, 26112, 26144, 26145, 26140, 0, + 16384, 24576, 26624, 26112, 26144, 26145, 26140, 0, + 16384, 24576, 26624, 26112, 26144, 26145, 26140, 26142, + 0, 16384, 24576, 26624, 26112, 0, 16384, 24576, + 26624, 26112, 26144, 0, 16384, 24576, 26624, 26112, + 26144, 0, 16384, 24576, 26624, 26112, 26144, 26146, + 0, 16384, 24576, 26624, 26112, 26144, 0, 16384, + 24576, 26624, 26112, 26144, 26148, 0, 16384, 24576, + 26624, 26112, 26144, 26148, 0, 16384, 24576, 26624, + 26112, 26144, 26152, 26150, 0, 16384, 24576, 26624, + 26112, 26144, 0, 16384, 24576, 26624, 26112, 26144, + 26152, 0, 16384, 24576, 26624, 26112, 26144, 26152, + 0, 16384, 24576, 26624, 26112, 26144, 26152, 26154, + 0, 16384, 24576, 26624, 26112, 26144, 26152, 0, + 16384, 24576, 26624, 26112, 26144, 26160, 26156, 0, + 16384, 24576, 26624, 26112, 26144, 26160, 26156, 0, + 16384, 24576, 26624, 26112, 26144, 26160, 26161, 26158, + 0, 16384, 24576, 26624, 26112, 26144, 0, 16384, + 24576, 26624, 26112, 26176, 26160, 0, 16384, 24576, + 26624, 26112, 26176, 26160, 0, 16384, 24576, 26624, + 26112, 26176, 26160, 26162, 0, 16384, 24576, 26624, + 26112, 26176, 26160, 0, 16384, 24576, 26624, 26112, + 26176, 26160, 26164, 0, 16384, 24576, 26624, 26112, + 26176, 26160, 26164, 0, 16384, 24576, 26624, 26112, + 26176, 26160, 26168, 26166, 0, 16384, 24576, 26624, + 26112, 26176, 26160, 0, 16384, 24576, 26624, 26112, + 26176, 26177, 26168, 0, 16384, 24576, 26624, 26112, + 26176, 26177, 26168, 0, 16384, 24576, 26624, 26112, + 26176, 26177, 26168, 26170, 0, 16384, 24576, 26624, + 26112, 26176, 26177, 26168, 0, 16384, 24576, 26624, + 26112, 26176, 26177, 26168, 26172, 0, 16384, 24576, + 26624, 26112, 26176, 26177, 26179, 26172, 0, 16384, + 24576, 26624, 26112, 26176, 26177, 26179, 26172, 26174, + 0, 16384, 24576, 26624, 26112, 0, 16384, 24576, + 26624, 26112, 26176, 0, 16384, 24576, 26624, 26112, + 26176, 0, 16384, 24576, 26624, 26112, 26176, 26178, + 0, 16384, 24576, 26624, 26112, 26176, 0, 16384, + 24576, 26624, 26112, 26176, 26180, 0, 16384, 24576, + 26624, 26112, 26176, 26180, 0, 16384, 24576, 26624, + 26112, 26176, 26184, 26182, 0, 16384, 24576, 26624, + 26112, 26176, 0, 16384, 24576, 26624, 26112, 26176, + 26184, 0, 16384, 24576, 26624, 26112, 26176, 26184, + 0, 16384, 24576, 26624, 26112, 26176, 26184, 26186, + 0, 16384, 24576, 26624, 26112, 26176, 26184, 0, + 16384, 24576, 26624, 26112, 26176, 26192, 26188, 0, + 16384, 24576, 26624, 26112, 26176, 26192, 26188, 0, + 16384, 24576, 26624, 26112, 26176, 26192, 26193, 26190, + 0, 16384, 24576, 26624, 26112, 26176, 0, 16384, + 24576, 26624, 26112, 26176, 26192, 0, 16384, 24576, + 26624, 26112, 26176, 26192, 0, 16384, 24576, 26624, + 26112, 26176, 26192, 26194, 0, 16384, 24576, 26624, + 26112, 26176, 26192, 0, 16384, 24576, 26624, 26112, + 26176, 26192, 26196, 0, 16384, 24576, 26624, 26112, + 26176, 26192, 26196, 0, 16384, 24576, 26624, 26112, + 26176, 26192, 26200, 26198, 0, 16384, 24576, 26624, + 26112, 26176, 26192, 0, 16384, 24576, 26624, 26112, + 26176, 26208, 26200, 0, 16384, 24576, 26624, 26112, + 26176, 26208, 26200, 0, 16384, 24576, 26624, 26112, + 26176, 26208, 26200, 26202, 0, 16384, 24576, 26624, + 26112, 26176, 26208, 26200, 0, 16384, 24576, 26624, + 26112, 26176, 26208, 26209, 26204, 0, 16384, 24576, + 26624, 26112, 26176, 26208, 26209, 26204, 0, 16384, + 24576, 26624, 26112, 26176, 26208, 26209, 26204, 26206, + 0, 16384, 24576, 26624, 26112, 26176, 0, 16384, + 24576, 26624, 26112, 26240, 26208, 0, 16384, 24576, + 26624, 26112, 26240, 26208, 0, 16384, 24576, 26624, + 26112, 26240, 26208, 26210, 0, 16384, 24576, 26624, + 26112, 26240, 26208, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26212, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26212, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26216, 26214, 0, 16384, 24576, 26624, + 26112, 26240, 26208, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26216, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26216, 0, 16384, 24576, 26624, 26112, + 26240, 26208, 26216, 26218, 0, 16384, 24576, 26624, + 26112, 26240, 26208, 26216, 0, 16384, 24576, 26624, + 26112, 26240, 26208, 26224, 26220, 0, 16384, 24576, + 26624, 26112, 26240, 26208, 26224, 26220, 0, 16384, + 24576, 26624, 26112, 26240, 26208, 26224, 26225, 26222, + 0, 16384, 24576, 26624, 26112, 26240, 26208, 0, + 16384, 24576, 26624, 26112, 26240, 26241, 26224, 0, + 16384, 24576, 26624, 26112, 26240, 26241, 26224, 0, + 16384, 24576, 26624, 26112, 26240, 26241, 26224, 26226, + 0, 16384, 24576, 26624, 26112, 26240, 26241, 26224, + 0, 16384, 24576, 26624, 26112, 26240, 26241, 26224, + 26228, 0, 16384, 24576, 26624, 26112, 26240, 26241, + 26224, 26228, 0, 16384, 24576, 26624, 26112, 26240, + 26241, 26224, 26232, 26230, 0, 16384, 24576, 26624, + 26112, 26240, 26241, 26224, 0, 16384, 24576, 26624, + 26112, 26240, 26241, 26224, 26232, 0, 16384, 24576, + 26624, 26112, 26240, 26241, 26243, 26232, 0, 16384, + 24576, 26624, 26112, 26240, 26241, 26243, 26232, 26234, + 0, 16384, 24576, 26624, 26112, 26240, 26241, 26243, + 26232, 0, 16384, 24576, 26624, 26112, 26240, 26241, + 26243, 26232, 26236, 0, 16384, 24576, 26624, 26112, + 26240, 26241, 26243, 26232, 26236, 0, 16384, 24576, + 26624, 26112, 26240, 26241, 26243, 26232, 26236, 26238, + 0, 16384, 24576, 26624, 26112, 0, 16384, 24576, + 26624, 26112, 26240, 0, 16384, 24576, 26624, 26112, + 26240, 0, 16384, 24576, 26624, 26112, 26240, 26242, + 0, 16384, 24576, 26624, 26112, 26240, 0, 16384, + 24576, 26624, 26112, 26240, 26244, 0, 16384, 24576, + 26624, 26112, 26240, 26244, 0, 16384, 24576, 26624, + 26112, 26240, 26248, 26246, 0, 16384, 24576, 26624, + 26112, 26240, 0, 16384, 24576, 26624, 26112, 26240, + 26248, 0, 16384, 24576, 26624, 26112, 26240, 26248, + 0, 16384, 24576, 26624, 26112, 26240, 26248, 26250, + 0, 16384, 24576, 26624, 26112, 26240, 26248, 0, + 16384, 24576, 26624, 26112, 26240, 26256, 26252, 0, + 16384, 24576, 26624, 26112, 26240, 26256, 26252, 0, + 16384, 24576, 26624, 26112, 26240, 26256, 26257, 26254, + 0, 16384, 24576, 26624, 26112, 26240, 0, 16384, + 24576, 26624, 26112, 26240, 26256, 0, 16384, 24576, + 26624, 26112, 26240, 26256, 0, 16384, 24576, 26624, + 26112, 26240, 26256, 26258, 0, 16384, 24576, 26624, + 26112, 26240, 26256, 0, 16384, 24576, 26624, 26112, + 26240, 26256, 26260, 0, 16384, 24576, 26624, 26112, + 26240, 26256, 26260, 0, 16384, 24576, 26624, 26112, + 26240, 26256, 26264, 26262, 0, 16384, 24576, 26624, + 26112, 26240, 26256, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26264, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26264, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26264, 26266, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 26264, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 26273, 26268, 0, 16384, 24576, + 26624, 26112, 26240, 26272, 26273, 26268, 0, 16384, + 24576, 26624, 26112, 26240, 26272, 26273, 26268, 26270, + 0, 16384, 24576, 26624, 26112, 26240, 0, 16384, + 24576, 26624, 26112, 26240, 26272, 0, 16384, 24576, + 26624, 26112, 26240, 26272, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 26274, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26276, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26276, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26280, 26278, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26280, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26280, 0, 16384, 24576, 26624, 26112, + 26240, 26272, 26280, 26282, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 26280, 0, 16384, 24576, 26624, + 26112, 26240, 26272, 26288, 26284, 0, 16384, 24576, + 26624, 26112, 26240, 26272, 26288, 26284, 0, 16384, + 24576, 26624, 26112, 26240, 26272, 26288, 26289, 26286, + 0, 16384, 24576, 26624, 26112, 26240, 26272, 0, + 16384, 24576, 26624, 26112, 26240, 26304, 26288, 0, + 16384, 24576, 26624, 26112, 26240, 26304, 26288, 0, + 16384, 24576, 26624, 26112, 26240, 26304, 26288, 26290, + 0, 16384, 24576, 26624, 26112, 26240, 26304, 26288, + 0, 16384, 24576, 26624, 26112, 26240, 26304, 26288, + 26292, 0, 16384, 24576, 26624, 26112, 26240, 26304, + 26288, 26292, 0, 16384, 24576, 26624, 26112, 26240, + 26304, 26288, 26296, 26294, 0, 16384, 24576, 26624, + 26112, 26240, 26304, 26288, 0, 16384, 24576, 26624, + 26112, 26240, 26304, 26305, 26296, 0, 16384, 24576, + 26624, 26112, 26240, 26304, 26305, 26296, 0, 16384, + 24576, 26624, 26112, 26240, 26304, 26305, 26296, 26298, + 0, 16384, 24576, 26624, 26112, 26240, 26304, 26305, + 26296, 0, 16384, 24576, 26624, 26112, 26240, 26304, + 26305, 26296, 26300, 0, 16384, 24576, 26624, 26112, + 26240, 26304, 26305, 26307, 26300, 0, 16384, 24576, + 26624, 26112, 26240, 26304, 26305, 26307, 26300, 26302, + 0, 16384, 24576, 26624, 26112, 26240, 0, 16384, + 24576, 26624, 26112, 26368, 26304, 0, 16384, 24576, + 26624, 26112, 26368, 26304, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 26306, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26308, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26308, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26312, 26310, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26312, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26312, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26312, 26314, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 26312, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 26320, 26316, 0, 16384, 24576, + 26624, 26112, 26368, 26304, 26320, 26316, 0, 16384, + 24576, 26624, 26112, 26368, 26304, 26320, 26321, 26318, + 0, 16384, 24576, 26624, 26112, 26368, 26304, 0, + 16384, 24576, 26624, 26112, 26368, 26304, 26320, 0, + 16384, 24576, 26624, 26112, 26368, 26304, 26320, 0, + 16384, 24576, 26624, 26112, 26368, 26304, 26320, 26322, + 0, 16384, 24576, 26624, 26112, 26368, 26304, 26320, + 0, 16384, 24576, 26624, 26112, 26368, 26304, 26320, + 26324, 0, 16384, 24576, 26624, 26112, 26368, 26304, + 26320, 26324, 0, 16384, 24576, 26624, 26112, 26368, + 26304, 26320, 26328, 26326, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 26320, 0, 16384, 24576, 26624, + 26112, 26368, 26304, 26336, 26328, 0, 16384, 24576, + 26624, 26112, 26368, 26304, 26336, 26328, 0, 16384, + 24576, 26624, 26112, 26368, 26304, 26336, 26328, 26330, + 0, 16384, 24576, 26624, 26112, 26368, 26304, 26336, + 26328, 0, 16384, 24576, 26624, 26112, 26368, 26304, + 26336, 26337, 26332, 0, 16384, 24576, 26624, 26112, + 26368, 26304, 26336, 26337, 26332, 0, 16384, 24576, + 26624, 26112, 26368, 26304, 26336, 26337, 26332, 26334, + 0, 16384, 24576, 26624, 26112, 26368, 26304, 0, + 16384, 24576, 26624, 26112, 26368, 26369, 26336, 0, + 16384, 24576, 26624, 26112, 26368, 26369, 26336, 0, + 16384, 24576, 26624, 26112, 26368, 26369, 26336, 26338, + 0, 16384, 24576, 26624, 26112, 26368, 26369, 26336, + 0, 16384, 24576, 26624, 26112, 26368, 26369, 26336, + 26340, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26336, 26340, 0, 16384, 24576, 26624, 26112, 26368, + 26369, 26336, 26344, 26342, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26336, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26336, 26344, 0, 16384, 24576, + 26624, 26112, 26368, 26369, 26336, 26344, 0, 16384, + 24576, 26624, 26112, 26368, 26369, 26336, 26344, 26346, + 0, 16384, 24576, 26624, 26112, 26368, 26369, 26336, + 26344, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26336, 26352, 26348, 0, 16384, 24576, 26624, 26112, + 26368, 26369, 26336, 26352, 26348, 0, 16384, 24576, + 26624, 26112, 26368, 26369, 26336, 26352, 26353, 26350, + 0, 16384, 24576, 26624, 26112, 26368, 26369, 26336, + 0, 16384, 24576, 26624, 26112, 26368, 26369, 26336, + 26352, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26371, 26352, 0, 16384, 24576, 26624, 26112, 26368, + 26369, 26371, 26352, 26354, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26371, 26352, 0, 16384, 24576, + 26624, 26112, 26368, 26369, 26371, 26352, 26356, 0, + 16384, 24576, 26624, 26112, 26368, 26369, 26371, 26352, + 26356, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26371, 26352, 26360, 26358, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26371, 26352, 0, 16384, 24576, + 26624, 26112, 26368, 26369, 26371, 26352, 26360, 0, + 16384, 24576, 26624, 26112, 26368, 26369, 26371, 26352, + 26360, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26371, 26352, 26360, 26362, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26371, 26375, 26360, 0, 16384, + 24576, 26624, 26112, 26368, 26369, 26371, 26375, 26360, + 26364, 0, 16384, 24576, 26624, 26112, 26368, 26369, + 26371, 26375, 26360, 26364, 0, 16384, 24576, 26624, + 26112, 26368, 26369, 26371, 26375, 26360, 26364, 26366, + 0, 16384, 24576, 26624, 26112, 0, 16384, 24576, + 26624, 26112, 26368, 0, 16384, 24576, 26624, 26625, + 26368, 0, 16384, 24576, 26624, 26625, 26368, 26370, + 0, 16384, 24576, 26624, 26625, 26368, 0, 16384, + 24576, 26624, 26625, 26368, 26372, 0, 16384, 24576, + 26624, 26625, 26368, 26372, 0, 16384, 24576, 26624, + 26625, 26368, 26376, 26374, 0, 16384, 24576, 26624, + 26625, 26368, 0, 16384, 24576, 26624, 26625, 26368, + 26376, 0, 16384, 24576, 26624, 26625, 26368, 26376, + 0, 16384, 24576, 26624, 26625, 26368, 26376, 26378, + 0, 16384, 24576, 26624, 26625, 26368, 26376, 0, + 16384, 24576, 26624, 26625, 26368, 26384, 26380, 0, + 16384, 24576, 26624, 26625, 26368, 26384, 26380, 0, + 16384, 24576, 26624, 26625, 26368, 26384, 26385, 26382, + 0, 16384, 24576, 26624, 26625, 26368, 0, 16384, + 24576, 26624, 26625, 26368, 26384, 0, 16384, 24576, + 26624, 26625, 26368, 26384, 0, 16384, 24576, 26624, + 26625, 26368, 26384, 26386, 0, 16384, 24576, 26624, + 26625, 26368, 26384, 0, 16384, 24576, 26624, 26625, + 26368, 26384, 26388, 0, 16384, 24576, 26624, 26625, + 26368, 26384, 26388, 0, 16384, 24576, 26624, 26625, + 26368, 26384, 26392, 26390, 0, 16384, 24576, 26624, + 26625, 26368, 26384, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26392, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26392, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26392, 26394, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 26392, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 26401, 26396, 0, 16384, 24576, + 26624, 26625, 26368, 26400, 26401, 26396, 0, 16384, + 24576, 26624, 26625, 26368, 26400, 26401, 26396, 26398, + 0, 16384, 24576, 26624, 26625, 26368, 0, 16384, + 24576, 26624, 26625, 26368, 26400, 0, 16384, 24576, + 26624, 26625, 26368, 26400, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 26402, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26404, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26404, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26408, 26406, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26408, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26408, 0, 16384, 24576, 26624, 26625, + 26368, 26400, 26408, 26410, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 26408, 0, 16384, 24576, 26624, + 26625, 26368, 26400, 26416, 26412, 0, 16384, 24576, + 26624, 26625, 26368, 26400, 26416, 26412, 0, 16384, + 24576, 26624, 26625, 26368, 26400, 26416, 26417, 26414, + 0, 16384, 24576, 26624, 26625, 26368, 26400, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26416, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26416, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26416, 26418, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26416, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26416, + 26420, 0, 16384, 24576, 26624, 26625, 26368, 26432, + 26416, 26420, 0, 16384, 24576, 26624, 26625, 26368, + 26432, 26416, 26424, 26422, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26416, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26433, 26424, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 26433, 26424, 0, 16384, + 24576, 26624, 26625, 26368, 26432, 26433, 26424, 26426, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26433, + 26424, 0, 16384, 24576, 26624, 26625, 26368, 26432, + 26433, 26424, 26428, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26433, 26435, 26428, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 26433, 26435, 26428, 26430, + 0, 16384, 24576, 26624, 26625, 26368, 0, 16384, + 24576, 26624, 26625, 26368, 26432, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26434, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26436, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26436, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26440, 26438, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26440, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26440, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26440, 26442, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26440, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26448, 26444, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 26448, 26444, 0, 16384, + 24576, 26624, 26625, 26368, 26432, 26448, 26449, 26446, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26448, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26448, 0, + 16384, 24576, 26624, 26625, 26368, 26432, 26448, 26450, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26448, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26448, + 26452, 0, 16384, 24576, 26624, 26625, 26368, 26432, + 26448, 26452, 0, 16384, 24576, 26624, 26625, 26368, + 26432, 26448, 26456, 26454, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26448, 0, 16384, 24576, 26624, + 26625, 26368, 26432, 26464, 26456, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 26464, 26456, 0, 16384, + 24576, 26624, 26625, 26368, 26432, 26464, 26456, 26458, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 26464, + 26456, 0, 16384, 24576, 26624, 26625, 26368, 26432, + 26464, 26465, 26460, 0, 16384, 24576, 26624, 26625, + 26368, 26432, 26464, 26465, 26460, 0, 16384, 24576, + 26624, 26625, 26368, 26432, 26464, 26465, 26460, 26462, + 0, 16384, 24576, 26624, 26625, 26368, 26432, 0, + 16384, 24576, 26624, 26625, 26368, 26496, 26464, 0, + 16384, 24576, 26624, 26625, 26368, 26496, 26464, 0, + 16384, 24576, 26624, 26625, 26368, 26496, 26464, 26466, + 0, 16384, 24576, 26624, 26625, 26368, 26496, 26464, + 0, 16384, 24576, 26624, 26625, 26368, 26496, 26464, + 26468, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26464, 26468, 0, 16384, 24576, 26624, 26625, 26368, + 26496, 26464, 26472, 26470, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26464, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26464, 26472, 0, 16384, 24576, + 26624, 26625, 26368, 26496, 26464, 26472, 0, 16384, + 24576, 26624, 26625, 26368, 26496, 26464, 26472, 26474, + 0, 16384, 24576, 26624, 26625, 26368, 26496, 26464, + 26472, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26464, 26480, 26476, 0, 16384, 24576, 26624, 26625, + 26368, 26496, 26464, 26480, 26476, 0, 16384, 24576, + 26624, 26625, 26368, 26496, 26464, 26480, 26481, 26478, + 0, 16384, 24576, 26624, 26625, 26368, 26496, 26464, + 0, 16384, 24576, 26624, 26625, 26368, 26496, 26497, + 26480, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26497, 26480, 0, 16384, 24576, 26624, 26625, 26368, + 26496, 26497, 26480, 26482, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26497, 26480, 0, 16384, 24576, + 26624, 26625, 26368, 26496, 26497, 26480, 26484, 0, + 16384, 24576, 26624, 26625, 26368, 26496, 26497, 26480, + 26484, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26497, 26480, 26488, 26486, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26497, 26480, 0, 16384, 24576, + 26624, 26625, 26368, 26496, 26497, 26480, 26488, 0, + 16384, 24576, 26624, 26625, 26368, 26496, 26497, 26499, + 26488, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26497, 26499, 26488, 26490, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26497, 26499, 26488, 0, 16384, + 24576, 26624, 26625, 26368, 26496, 26497, 26499, 26488, + 26492, 0, 16384, 24576, 26624, 26625, 26368, 26496, + 26497, 26499, 26488, 26492, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26497, 26499, 26488, 26492, 26494, + 0, 16384, 24576, 26624, 26625, 26368, 0, 16384, + 24576, 26624, 26625, 26368, 26496, 0, 16384, 24576, + 26624, 26625, 26368, 26496, 0, 16384, 24576, 26624, + 26625, 26368, 26496, 26498, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26500, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26500, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26504, 26502, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26504, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26504, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26504, 26506, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26504, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26512, 26508, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26512, 26508, 0, 16384, + 24576, 26624, 26625, 26627, 26496, 26512, 26513, 26510, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26512, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26512, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26512, 26514, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26512, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26512, + 26516, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26512, 26516, 0, 16384, 24576, 26624, 26625, 26627, + 26496, 26512, 26520, 26518, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26512, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26528, 26520, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26528, 26520, 0, 16384, + 24576, 26624, 26625, 26627, 26496, 26528, 26520, 26522, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26528, + 26520, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26528, 26529, 26524, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26528, 26529, 26524, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26528, 26529, 26524, 26526, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26528, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26528, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26528, 26530, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26528, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26528, + 26532, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26528, 26532, 0, 16384, 24576, 26624, 26625, 26627, + 26496, 26528, 26536, 26534, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26528, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26528, 26536, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26528, 26536, 0, 16384, + 24576, 26624, 26625, 26627, 26496, 26528, 26536, 26538, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26528, + 26536, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26528, 26544, 26540, 0, 16384, 24576, 26624, 26625, + 26627, 26496, 26528, 26544, 26540, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26528, 26544, 26545, 26542, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26528, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26560, + 26544, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26560, 26544, 0, 16384, 24576, 26624, 26625, 26627, + 26496, 26560, 26544, 26546, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26560, 26544, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26560, 26544, 26548, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26560, 26544, + 26548, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26560, 26544, 26552, 26550, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26560, 26544, 0, 16384, 24576, + 26624, 26625, 26627, 26496, 26560, 26561, 26552, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26560, 26561, + 26552, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26560, 26561, 26552, 26554, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26560, 26561, 26552, 0, 16384, + 24576, 26624, 26625, 26627, 26496, 26560, 26561, 26552, + 26556, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26560, 26561, 26563, 26556, 0, 16384, 24576, 26624, + 26625, 26627, 26496, 26560, 26561, 26563, 26556, 26558, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26560, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26560, 0, + 16384, 24576, 26624, 26625, 26627, 26496, 26560, 26562, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26560, + 0, 16384, 24576, 26624, 26625, 26627, 26496, 26560, + 26564, 0, 16384, 24576, 26624, 26625, 26627, 26496, + 26560, 26564, 0, 16384, 24576, 26624, 26625, 26627, + 26496, 26560, 26568, 26566, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26568, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26568, 0, 16384, + 24576, 26624, 26625, 26627, 26631, 26560, 26568, 26570, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26560, + 26568, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26576, 26572, 0, 16384, 24576, 26624, 26625, + 26627, 26631, 26560, 26576, 26572, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26576, 26577, 26574, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26560, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26560, + 26576, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26576, 0, 16384, 24576, 26624, 26625, 26627, + 26631, 26560, 26576, 26578, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26576, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26576, 26580, 0, + 16384, 24576, 26624, 26625, 26627, 26631, 26560, 26576, + 26580, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26576, 26584, 26582, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26576, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26592, 26584, 0, + 16384, 24576, 26624, 26625, 26627, 26631, 26560, 26592, + 26584, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 26584, 26586, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 26584, 0, 16384, + 24576, 26624, 26625, 26627, 26631, 26560, 26592, 26593, + 26588, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 26593, 26588, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 26593, 26588, 26590, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26560, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26560, + 26592, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 0, 16384, 24576, 26624, 26625, 26627, + 26631, 26560, 26592, 26594, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26592, 26596, 0, + 16384, 24576, 26624, 26625, 26627, 26631, 26560, 26592, + 26596, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 26600, 26598, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26560, 26592, 26600, 0, + 16384, 24576, 26624, 26625, 26627, 26631, 26560, 26592, + 26600, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 26600, 26602, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 26600, 0, 16384, + 24576, 26624, 26625, 26627, 26631, 26560, 26592, 26608, + 26604, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26560, 26592, 26608, 26604, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26560, 26592, 26608, 26609, 26606, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26639, + 26592, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26639, 26592, 26608, 0, 16384, 24576, 26624, 26625, + 26627, 26631, 26639, 26592, 26608, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26639, 26592, 26608, 26610, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26639, + 26592, 26608, 0, 16384, 24576, 26624, 26625, 26627, + 26631, 26639, 26592, 26608, 26612, 0, 16384, 24576, + 26624, 26625, 26627, 26631, 26639, 26592, 26608, 26612, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26639, + 26592, 26608, 26616, 26614, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26639, 26592, 26608, 0, 16384, + 24576, 26624, 26625, 26627, 26631, 26639, 26592, 26608, + 26616, 0, 16384, 24576, 26624, 26625, 26627, 26631, + 26639, 26592, 26608, 26616, 0, 16384, 24576, 26624, + 26625, 26627, 26631, 26639, 26592, 26608, 26616, 26618, + 0, 16384, 24576, 26624, 26625, 26627, 26631, 26639, + 26592, 26608, 26616, 0, 16384, 24576, 26624, 26625, + 26627, 26631, 26639, 26592, 26608, 26616, 26620, 0, + 16384, 24576, 26624, 26625, 26627, 26631, 26639, 26592, + 26608, 26616, 26620, 0, 16384, 24576, 26624, 26625, + 26627, 26631, 26639, 26592, 26608, 26616, 26620, 26622, + 0, 16384, 24576, 0, 16384, 24576, 26624, 0, + 16384, 24576, 26624, 0, 16384, 24576, 26624, 26626, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26628, 0, 16384, 24576, 26624, 26628, 0, 16384, + 24576, 26624, 26632, 26630, 0, 16384, 24576, 26624, + 0, 16384, 24576, 26624, 26632, 0, 16384, 24576, + 26624, 26632, 0, 16384, 24576, 26624, 26632, 26634, + 0, 16384, 24576, 26624, 26632, 0, 16384, 24576, + 26624, 26640, 26636, 0, 16384, 24576, 26624, 26640, + 26636, 0, 16384, 24576, 26624, 26640, 26641, 26638, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26640, 0, 16384, 24576, 26624, 26640, 0, 16384, + 24576, 26624, 26640, 26642, 0, 16384, 24576, 26624, + 26640, 0, 16384, 24576, 26624, 26640, 26644, 0, + 16384, 24576, 26624, 26640, 26644, 0, 16384, 24576, + 26624, 26640, 26648, 26646, 0, 16384, 24576, 26624, + 26640, 0, 16384, 24576, 26624, 26656, 26648, 0, + 16384, 24576, 26624, 26656, 26648, 0, 16384, 24576, + 26624, 26656, 26648, 26650, 0, 16384, 24576, 26624, + 26656, 26648, 0, 16384, 24576, 26624, 26656, 26657, + 26652, 0, 16384, 24576, 26624, 26656, 26657, 26652, + 0, 16384, 24576, 26624, 26656, 26657, 26652, 26654, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26656, 0, 16384, 24576, 26624, 26656, 0, 16384, + 24576, 26624, 26656, 26658, 0, 16384, 24576, 26624, + 26656, 0, 16384, 24576, 26624, 26656, 26660, 0, + 16384, 24576, 26624, 26656, 26660, 0, 16384, 24576, + 26624, 26656, 26664, 26662, 0, 16384, 24576, 26624, + 26656, 0, 16384, 24576, 26624, 26656, 26664, 0, + 16384, 24576, 26624, 26656, 26664, 0, 16384, 24576, + 26624, 26656, 26664, 26666, 0, 16384, 24576, 26624, + 26656, 26664, 0, 16384, 24576, 26624, 26656, 26672, + 26668, 0, 16384, 24576, 26624, 26656, 26672, 26668, + 0, 16384, 24576, 26624, 26656, 26672, 26673, 26670, + 0, 16384, 24576, 26624, 26656, 0, 16384, 24576, + 26624, 26688, 26672, 0, 16384, 24576, 26624, 26688, + 26672, 0, 16384, 24576, 26624, 26688, 26672, 26674, + 0, 16384, 24576, 26624, 26688, 26672, 0, 16384, + 24576, 26624, 26688, 26672, 26676, 0, 16384, 24576, + 26624, 26688, 26672, 26676, 0, 16384, 24576, 26624, + 26688, 26672, 26680, 26678, 0, 16384, 24576, 26624, + 26688, 26672, 0, 16384, 24576, 26624, 26688, 26689, + 26680, 0, 16384, 24576, 26624, 26688, 26689, 26680, + 0, 16384, 24576, 26624, 26688, 26689, 26680, 26682, + 0, 16384, 24576, 26624, 26688, 26689, 26680, 0, + 16384, 24576, 26624, 26688, 26689, 26680, 26684, 0, + 16384, 24576, 26624, 26688, 26689, 26691, 26684, 0, + 16384, 24576, 26624, 26688, 26689, 26691, 26684, 26686, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26688, 0, 16384, 24576, 26624, 26688, 0, 16384, + 24576, 26624, 26688, 26690, 0, 16384, 24576, 26624, + 26688, 0, 16384, 24576, 26624, 26688, 26692, 0, + 16384, 24576, 26624, 26688, 26692, 0, 16384, 24576, + 26624, 26688, 26696, 26694, 0, 16384, 24576, 26624, + 26688, 0, 16384, 24576, 26624, 26688, 26696, 0, + 16384, 24576, 26624, 26688, 26696, 0, 16384, 24576, + 26624, 26688, 26696, 26698, 0, 16384, 24576, 26624, + 26688, 26696, 0, 16384, 24576, 26624, 26688, 26704, + 26700, 0, 16384, 24576, 26624, 26688, 26704, 26700, + 0, 16384, 24576, 26624, 26688, 26704, 26705, 26702, + 0, 16384, 24576, 26624, 26688, 0, 16384, 24576, + 26624, 26688, 26704, 0, 16384, 24576, 26624, 26688, + 26704, 0, 16384, 24576, 26624, 26688, 26704, 26706, + 0, 16384, 24576, 26624, 26688, 26704, 0, 16384, + 24576, 26624, 26688, 26704, 26708, 0, 16384, 24576, + 26624, 26688, 26704, 26708, 0, 16384, 24576, 26624, + 26688, 26704, 26712, 26710, 0, 16384, 24576, 26624, + 26688, 26704, 0, 16384, 24576, 26624, 26688, 26720, + 26712, 0, 16384, 24576, 26624, 26688, 26720, 26712, + 0, 16384, 24576, 26624, 26688, 26720, 26712, 26714, + 0, 16384, 24576, 26624, 26688, 26720, 26712, 0, + 16384, 24576, 26624, 26688, 26720, 26721, 26716, 0, + 16384, 24576, 26624, 26688, 26720, 26721, 26716, 0, + 16384, 24576, 26624, 26688, 26720, 26721, 26716, 26718, + 0, 16384, 24576, 26624, 26688, 0, 16384, 24576, + 26624, 26752, 26720, 0, 16384, 24576, 26624, 26752, + 26720, 0, 16384, 24576, 26624, 26752, 26720, 26722, + 0, 16384, 24576, 26624, 26752, 26720, 0, 16384, + 24576, 26624, 26752, 26720, 26724, 0, 16384, 24576, + 26624, 26752, 26720, 26724, 0, 16384, 24576, 26624, + 26752, 26720, 26728, 26726, 0, 16384, 24576, 26624, + 26752, 26720, 0, 16384, 24576, 26624, 26752, 26720, + 26728, 0, 16384, 24576, 26624, 26752, 26720, 26728, + 0, 16384, 24576, 26624, 26752, 26720, 26728, 26730, + 0, 16384, 24576, 26624, 26752, 26720, 26728, 0, + 16384, 24576, 26624, 26752, 26720, 26736, 26732, 0, + 16384, 24576, 26624, 26752, 26720, 26736, 26732, 0, + 16384, 24576, 26624, 26752, 26720, 26736, 26737, 26734, + 0, 16384, 24576, 26624, 26752, 26720, 0, 16384, + 24576, 26624, 26752, 26753, 26736, 0, 16384, 24576, + 26624, 26752, 26753, 26736, 0, 16384, 24576, 26624, + 26752, 26753, 26736, 26738, 0, 16384, 24576, 26624, + 26752, 26753, 26736, 0, 16384, 24576, 26624, 26752, + 26753, 26736, 26740, 0, 16384, 24576, 26624, 26752, + 26753, 26736, 26740, 0, 16384, 24576, 26624, 26752, + 26753, 26736, 26744, 26742, 0, 16384, 24576, 26624, + 26752, 26753, 26736, 0, 16384, 24576, 26624, 26752, + 26753, 26736, 26744, 0, 16384, 24576, 26624, 26752, + 26753, 26755, 26744, 0, 16384, 24576, 26624, 26752, + 26753, 26755, 26744, 26746, 0, 16384, 24576, 26624, + 26752, 26753, 26755, 26744, 0, 16384, 24576, 26624, + 26752, 26753, 26755, 26744, 26748, 0, 16384, 24576, + 26624, 26752, 26753, 26755, 26744, 26748, 0, 16384, + 24576, 26624, 26752, 26753, 26755, 26744, 26748, 26750, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26752, 0, 16384, 24576, 26624, 26752, 0, 16384, + 24576, 26624, 26752, 26754, 0, 16384, 24576, 26624, + 26752, 0, 16384, 24576, 26624, 26752, 26756, 0, + 16384, 24576, 26624, 26752, 26756, 0, 16384, 24576, + 26624, 26752, 26760, 26758, 0, 16384, 24576, 26624, + 26752, 0, 16384, 24576, 26624, 26752, 26760, 0, + 16384, 24576, 26624, 26752, 26760, 0, 16384, 24576, + 26624, 26752, 26760, 26762, 0, 16384, 24576, 26624, + 26752, 26760, 0, 16384, 24576, 26624, 26752, 26768, + 26764, 0, 16384, 24576, 26624, 26752, 26768, 26764, + 0, 16384, 24576, 26624, 26752, 26768, 26769, 26766, + 0, 16384, 24576, 26624, 26752, 0, 16384, 24576, + 26624, 26752, 26768, 0, 16384, 24576, 26624, 26752, + 26768, 0, 16384, 24576, 26624, 26752, 26768, 26770, + 0, 16384, 24576, 26624, 26752, 26768, 0, 16384, + 24576, 26624, 26752, 26768, 26772, 0, 16384, 24576, + 26624, 26752, 26768, 26772, 0, 16384, 24576, 26624, + 26752, 26768, 26776, 26774, 0, 16384, 24576, 26624, + 26752, 26768, 0, 16384, 24576, 26624, 26752, 26784, + 26776, 0, 16384, 24576, 26624, 26752, 26784, 26776, + 0, 16384, 24576, 26624, 26752, 26784, 26776, 26778, + 0, 16384, 24576, 26624, 26752, 26784, 26776, 0, + 16384, 24576, 26624, 26752, 26784, 26785, 26780, 0, + 16384, 24576, 26624, 26752, 26784, 26785, 26780, 0, + 16384, 24576, 26624, 26752, 26784, 26785, 26780, 26782, + 0, 16384, 24576, 26624, 26752, 0, 16384, 24576, + 26624, 26752, 26784, 0, 16384, 24576, 26624, 26752, + 26784, 0, 16384, 24576, 26624, 26752, 26784, 26786, + 0, 16384, 24576, 26624, 26752, 26784, 0, 16384, + 24576, 26624, 26752, 26784, 26788, 0, 16384, 24576, + 26624, 26752, 26784, 26788, 0, 16384, 24576, 26624, + 26752, 26784, 26792, 26790, 0, 16384, 24576, 26624, + 26752, 26784, 0, 16384, 24576, 26624, 26752, 26784, + 26792, 0, 16384, 24576, 26624, 26752, 26784, 26792, + 0, 16384, 24576, 26624, 26752, 26784, 26792, 26794, + 0, 16384, 24576, 26624, 26752, 26784, 26792, 0, + 16384, 24576, 26624, 26752, 26784, 26800, 26796, 0, + 16384, 24576, 26624, 26752, 26784, 26800, 26796, 0, + 16384, 24576, 26624, 26752, 26784, 26800, 26801, 26798, + 0, 16384, 24576, 26624, 26752, 26784, 0, 16384, + 24576, 26624, 26752, 26816, 26800, 0, 16384, 24576, + 26624, 26752, 26816, 26800, 0, 16384, 24576, 26624, + 26752, 26816, 26800, 26802, 0, 16384, 24576, 26624, + 26752, 26816, 26800, 0, 16384, 24576, 26624, 26752, + 26816, 26800, 26804, 0, 16384, 24576, 26624, 26752, + 26816, 26800, 26804, 0, 16384, 24576, 26624, 26752, + 26816, 26800, 26808, 26806, 0, 16384, 24576, 26624, + 26752, 26816, 26800, 0, 16384, 24576, 26624, 26752, + 26816, 26817, 26808, 0, 16384, 24576, 26624, 26752, + 26816, 26817, 26808, 0, 16384, 24576, 26624, 26752, + 26816, 26817, 26808, 26810, 0, 16384, 24576, 26624, + 26752, 26816, 26817, 26808, 0, 16384, 24576, 26624, + 26752, 26816, 26817, 26808, 26812, 0, 16384, 24576, + 26624, 26752, 26816, 26817, 26819, 26812, 0, 16384, + 24576, 26624, 26752, 26816, 26817, 26819, 26812, 26814, + 0, 16384, 24576, 26624, 26752, 0, 16384, 24576, + 26624, 26880, 26816, 0, 16384, 24576, 26624, 26880, + 26816, 0, 16384, 24576, 26624, 26880, 26816, 26818, + 0, 16384, 24576, 26624, 26880, 26816, 0, 16384, + 24576, 26624, 26880, 26816, 26820, 0, 16384, 24576, + 26624, 26880, 26816, 26820, 0, 16384, 24576, 26624, + 26880, 26816, 26824, 26822, 0, 16384, 24576, 26624, + 26880, 26816, 0, 16384, 24576, 26624, 26880, 26816, + 26824, 0, 16384, 24576, 26624, 26880, 26816, 26824, + 0, 16384, 24576, 26624, 26880, 26816, 26824, 26826, + 0, 16384, 24576, 26624, 26880, 26816, 26824, 0, + 16384, 24576, 26624, 26880, 26816, 26832, 26828, 0, + 16384, 24576, 26624, 26880, 26816, 26832, 26828, 0, + 16384, 24576, 26624, 26880, 26816, 26832, 26833, 26830, + 0, 16384, 24576, 26624, 26880, 26816, 0, 16384, + 24576, 26624, 26880, 26816, 26832, 0, 16384, 24576, + 26624, 26880, 26816, 26832, 0, 16384, 24576, 26624, + 26880, 26816, 26832, 26834, 0, 16384, 24576, 26624, + 26880, 26816, 26832, 0, 16384, 24576, 26624, 26880, + 26816, 26832, 26836, 0, 16384, 24576, 26624, 26880, + 26816, 26832, 26836, 0, 16384, 24576, 26624, 26880, + 26816, 26832, 26840, 26838, 0, 16384, 24576, 26624, + 26880, 26816, 26832, 0, 16384, 24576, 26624, 26880, + 26816, 26848, 26840, 0, 16384, 24576, 26624, 26880, + 26816, 26848, 26840, 0, 16384, 24576, 26624, 26880, + 26816, 26848, 26840, 26842, 0, 16384, 24576, 26624, + 26880, 26816, 26848, 26840, 0, 16384, 24576, 26624, + 26880, 26816, 26848, 26849, 26844, 0, 16384, 24576, + 26624, 26880, 26816, 26848, 26849, 26844, 0, 16384, + 24576, 26624, 26880, 26816, 26848, 26849, 26844, 26846, + 0, 16384, 24576, 26624, 26880, 26816, 0, 16384, + 24576, 26624, 26880, 26881, 26848, 0, 16384, 24576, + 26624, 26880, 26881, 26848, 0, 16384, 24576, 26624, + 26880, 26881, 26848, 26850, 0, 16384, 24576, 26624, + 26880, 26881, 26848, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26852, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26852, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26856, 26854, 0, 16384, 24576, 26624, + 26880, 26881, 26848, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26856, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26856, 0, 16384, 24576, 26624, 26880, + 26881, 26848, 26856, 26858, 0, 16384, 24576, 26624, + 26880, 26881, 26848, 26856, 0, 16384, 24576, 26624, + 26880, 26881, 26848, 26864, 26860, 0, 16384, 24576, + 26624, 26880, 26881, 26848, 26864, 26860, 0, 16384, + 24576, 26624, 26880, 26881, 26848, 26864, 26865, 26862, + 0, 16384, 24576, 26624, 26880, 26881, 26848, 0, + 16384, 24576, 26624, 26880, 26881, 26848, 26864, 0, + 16384, 24576, 26624, 26880, 26881, 26883, 26864, 0, + 16384, 24576, 26624, 26880, 26881, 26883, 26864, 26866, + 0, 16384, 24576, 26624, 26880, 26881, 26883, 26864, + 0, 16384, 24576, 26624, 26880, 26881, 26883, 26864, + 26868, 0, 16384, 24576, 26624, 26880, 26881, 26883, + 26864, 26868, 0, 16384, 24576, 26624, 26880, 26881, + 26883, 26864, 26872, 26870, 0, 16384, 24576, 26624, + 26880, 26881, 26883, 26864, 0, 16384, 24576, 26624, + 26880, 26881, 26883, 26864, 26872, 0, 16384, 24576, + 26624, 26880, 26881, 26883, 26864, 26872, 0, 16384, + 24576, 26624, 26880, 26881, 26883, 26864, 26872, 26874, + 0, 16384, 24576, 26624, 26880, 26881, 26883, 26887, + 26872, 0, 16384, 24576, 26624, 26880, 26881, 26883, + 26887, 26872, 26876, 0, 16384, 24576, 26624, 26880, + 26881, 26883, 26887, 26872, 26876, 0, 16384, 24576, + 26624, 26880, 26881, 26883, 26887, 26872, 26876, 26878, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 26880, 0, 16384, 24576, 26624, 26880, 0, 16384, + 24576, 26624, 26880, 26882, 0, 16384, 24576, 26624, + 26880, 0, 16384, 24576, 26624, 26880, 26884, 0, + 16384, 24576, 26624, 26880, 26884, 0, 16384, 24576, + 26624, 26880, 26888, 26886, 0, 16384, 24576, 26624, + 26880, 0, 16384, 24576, 26624, 26880, 26888, 0, + 16384, 24576, 26624, 26880, 26888, 0, 16384, 24576, + 26624, 26880, 26888, 26890, 0, 16384, 24576, 26624, + 26880, 26888, 0, 16384, 24576, 26624, 26880, 26896, + 26892, 0, 16384, 24576, 26624, 26880, 26896, 26892, + 0, 16384, 24576, 26624, 26880, 26896, 26897, 26894, + 0, 16384, 24576, 26624, 26880, 0, 16384, 24576, + 26624, 26880, 26896, 0, 16384, 24576, 26624, 26880, + 26896, 0, 16384, 24576, 26624, 26880, 26896, 26898, + 0, 16384, 24576, 26624, 26880, 26896, 0, 16384, + 24576, 26624, 26880, 26896, 26900, 0, 16384, 24576, + 26624, 26880, 26896, 26900, 0, 16384, 24576, 26624, + 26880, 26896, 26904, 26902, 0, 16384, 24576, 26624, + 26880, 26896, 0, 16384, 24576, 26624, 26880, 26912, + 26904, 0, 16384, 24576, 26624, 26880, 26912, 26904, + 0, 16384, 24576, 26624, 26880, 26912, 26904, 26906, + 0, 16384, 24576, 26624, 26880, 26912, 26904, 0, + 16384, 24576, 26624, 26880, 26912, 26913, 26908, 0, + 16384, 24576, 26624, 26880, 26912, 26913, 26908, 0, + 16384, 24576, 26624, 26880, 26912, 26913, 26908, 26910, + 0, 16384, 24576, 26624, 26880, 0, 16384, 24576, + 26624, 26880, 26912, 0, 16384, 24576, 26624, 26880, + 26912, 0, 16384, 24576, 26624, 26880, 26912, 26914, + 0, 16384, 24576, 26624, 26880, 26912, 0, 16384, + 24576, 26624, 26880, 26912, 26916, 0, 16384, 24576, + 26624, 26880, 26912, 26916, 0, 16384, 24576, 26624, + 26880, 26912, 26920, 26918, 0, 16384, 24576, 26624, + 26880, 26912, 0, 16384, 24576, 26624, 26880, 26912, + 26920, 0, 16384, 24576, 26624, 26880, 26912, 26920, + 0, 16384, 24576, 26624, 26880, 26912, 26920, 26922, + 0, 16384, 24576, 26624, 26880, 26912, 26920, 0, + 16384, 24576, 26624, 26880, 26912, 26928, 26924, 0, + 16384, 24576, 26624, 26880, 26912, 26928, 26924, 0, + 16384, 24576, 26624, 26880, 26912, 26928, 26929, 26926, + 0, 16384, 24576, 26624, 26880, 26912, 0, 16384, + 24576, 26624, 26880, 26944, 26928, 0, 16384, 24576, + 26624, 26880, 26944, 26928, 0, 16384, 24576, 26624, + 26880, 26944, 26928, 26930, 0, 16384, 24576, 26624, + 26880, 26944, 26928, 0, 16384, 24576, 26624, 26880, + 26944, 26928, 26932, 0, 16384, 24576, 26624, 26880, + 26944, 26928, 26932, 0, 16384, 24576, 26624, 26880, + 26944, 26928, 26936, 26934, 0, 16384, 24576, 26624, + 26880, 26944, 26928, 0, 16384, 24576, 26624, 26880, + 26944, 26945, 26936, 0, 16384, 24576, 26624, 26880, + 26944, 26945, 26936, 0, 16384, 24576, 26624, 26880, + 26944, 26945, 26936, 26938, 0, 16384, 24576, 26624, + 26880, 26944, 26945, 26936, 0, 16384, 24576, 26624, + 26880, 26944, 26945, 26936, 26940, 0, 16384, 24576, + 26624, 26880, 26944, 26945, 26947, 26940, 0, 16384, + 24576, 26624, 26880, 26944, 26945, 26947, 26940, 26942, + 0, 16384, 24576, 26624, 26880, 0, 16384, 24576, + 26624, 26880, 26944, 0, 16384, 24576, 26624, 26880, + 26944, 0, 16384, 24576, 26624, 26880, 26944, 26946, + 0, 16384, 24576, 26624, 26880, 26944, 0, 16384, + 24576, 26624, 26880, 26944, 26948, 0, 16384, 24576, + 26624, 26880, 26944, 26948, 0, 16384, 24576, 26624, + 26880, 26944, 26952, 26950, 0, 16384, 24576, 26624, + 26880, 26944, 0, 16384, 24576, 26624, 26880, 26944, + 26952, 0, 16384, 24576, 26624, 26880, 26944, 26952, + 0, 16384, 24576, 26624, 26880, 26944, 26952, 26954, + 0, 16384, 24576, 26624, 26880, 26944, 26952, 0, + 16384, 24576, 26624, 26880, 26944, 26960, 26956, 0, + 16384, 24576, 26624, 26880, 26944, 26960, 26956, 0, + 16384, 24576, 26624, 26880, 26944, 26960, 26961, 26958, + 0, 16384, 24576, 26624, 26880, 26944, 0, 16384, + 24576, 26624, 26880, 26944, 26960, 0, 16384, 24576, + 26624, 26880, 26944, 26960, 0, 16384, 24576, 26624, + 26880, 26944, 26960, 26962, 0, 16384, 24576, 26624, + 26880, 26944, 26960, 0, 16384, 24576, 26624, 26880, + 26944, 26960, 26964, 0, 16384, 24576, 26624, 26880, + 26944, 26960, 26964, 0, 16384, 24576, 26624, 26880, + 26944, 26960, 26968, 26966, 0, 16384, 24576, 26624, + 26880, 26944, 26960, 0, 16384, 24576, 26624, 26880, + 26944, 26976, 26968, 0, 16384, 24576, 26624, 26880, + 26944, 26976, 26968, 0, 16384, 24576, 26624, 26880, + 26944, 26976, 26968, 26970, 0, 16384, 24576, 26624, + 26880, 26944, 26976, 26968, 0, 16384, 24576, 26624, + 26880, 26944, 26976, 26977, 26972, 0, 16384, 24576, + 26624, 26880, 26944, 26976, 26977, 26972, 0, 16384, + 24576, 26624, 26880, 26944, 26976, 26977, 26972, 26974, + 0, 16384, 24576, 26624, 26880, 26944, 0, 16384, + 24576, 26624, 26880, 27008, 26976, 0, 16384, 24576, + 26624, 26880, 27008, 26976, 0, 16384, 24576, 26624, + 26880, 27008, 26976, 26978, 0, 16384, 24576, 26624, + 26880, 27008, 26976, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26980, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26980, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26984, 26982, 0, 16384, 24576, 26624, + 26880, 27008, 26976, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26984, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26984, 0, 16384, 24576, 26624, 26880, + 27008, 26976, 26984, 26986, 0, 16384, 24576, 26624, + 26880, 27008, 26976, 26984, 0, 16384, 24576, 26624, + 26880, 27008, 26976, 26992, 26988, 0, 16384, 24576, + 26624, 26880, 27008, 26976, 26992, 26988, 0, 16384, + 24576, 26624, 26880, 27008, 26976, 26992, 26993, 26990, + 0, 16384, 24576, 26624, 26880, 27008, 26976, 0, + 16384, 24576, 26624, 26880, 27008, 27009, 26992, 0, + 16384, 24576, 26624, 26880, 27008, 27009, 26992, 0, + 16384, 24576, 26624, 26880, 27008, 27009, 26992, 26994, + 0, 16384, 24576, 26624, 26880, 27008, 27009, 26992, + 0, 16384, 24576, 26624, 26880, 27008, 27009, 26992, + 26996, 0, 16384, 24576, 26624, 26880, 27008, 27009, + 26992, 26996, 0, 16384, 24576, 26624, 26880, 27008, + 27009, 26992, 27000, 26998, 0, 16384, 24576, 26624, + 26880, 27008, 27009, 26992, 0, 16384, 24576, 26624, + 26880, 27008, 27009, 26992, 27000, 0, 16384, 24576, + 26624, 26880, 27008, 27009, 27011, 27000, 0, 16384, + 24576, 26624, 26880, 27008, 27009, 27011, 27000, 27002, + 0, 16384, 24576, 26624, 26880, 27008, 27009, 27011, + 27000, 0, 16384, 24576, 26624, 26880, 27008, 27009, + 27011, 27000, 27004, 0, 16384, 24576, 26624, 26880, + 27008, 27009, 27011, 27000, 27004, 0, 16384, 24576, + 26624, 26880, 27008, 27009, 27011, 27000, 27004, 27006, + 0, 16384, 24576, 26624, 26880, 0, 16384, 24576, + 26624, 27136, 27008, 0, 16384, 24576, 26624, 27136, + 27008, 0, 16384, 24576, 26624, 27136, 27008, 27010, + 0, 16384, 24576, 26624, 27136, 27008, 0, 16384, + 24576, 26624, 27136, 27008, 27012, 0, 16384, 24576, + 26624, 27136, 27008, 27012, 0, 16384, 24576, 26624, + 27136, 27008, 27016, 27014, 0, 16384, 24576, 26624, + 27136, 27008, 0, 16384, 24576, 26624, 27136, 27008, + 27016, 0, 16384, 24576, 26624, 27136, 27008, 27016, + 0, 16384, 24576, 26624, 27136, 27008, 27016, 27018, + 0, 16384, 24576, 26624, 27136, 27008, 27016, 0, + 16384, 24576, 26624, 27136, 27008, 27024, 27020, 0, + 16384, 24576, 26624, 27136, 27008, 27024, 27020, 0, + 16384, 24576, 26624, 27136, 27008, 27024, 27025, 27022, + 0, 16384, 24576, 26624, 27136, 27008, 0, 16384, + 24576, 26624, 27136, 27008, 27024, 0, 16384, 24576, + 26624, 27136, 27008, 27024, 0, 16384, 24576, 26624, + 27136, 27008, 27024, 27026, 0, 16384, 24576, 26624, + 27136, 27008, 27024, 0, 16384, 24576, 26624, 27136, + 27008, 27024, 27028, 0, 16384, 24576, 26624, 27136, + 27008, 27024, 27028, 0, 16384, 24576, 26624, 27136, + 27008, 27024, 27032, 27030, 0, 16384, 24576, 26624, + 27136, 27008, 27024, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27032, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27032, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27032, 27034, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 27032, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 27041, 27036, 0, 16384, 24576, + 26624, 27136, 27008, 27040, 27041, 27036, 0, 16384, + 24576, 26624, 27136, 27008, 27040, 27041, 27036, 27038, + 0, 16384, 24576, 26624, 27136, 27008, 0, 16384, + 24576, 26624, 27136, 27008, 27040, 0, 16384, 24576, + 26624, 27136, 27008, 27040, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 27042, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27044, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27044, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27048, 27046, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27048, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27048, 0, 16384, 24576, 26624, 27136, + 27008, 27040, 27048, 27050, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 27048, 0, 16384, 24576, 26624, + 27136, 27008, 27040, 27056, 27052, 0, 16384, 24576, + 26624, 27136, 27008, 27040, 27056, 27052, 0, 16384, + 24576, 26624, 27136, 27008, 27040, 27056, 27057, 27054, + 0, 16384, 24576, 26624, 27136, 27008, 27040, 0, + 16384, 24576, 26624, 27136, 27008, 27072, 27056, 0, + 16384, 24576, 26624, 27136, 27008, 27072, 27056, 0, + 16384, 24576, 26624, 27136, 27008, 27072, 27056, 27058, + 0, 16384, 24576, 26624, 27136, 27008, 27072, 27056, + 0, 16384, 24576, 26624, 27136, 27008, 27072, 27056, + 27060, 0, 16384, 24576, 26624, 27136, 27008, 27072, + 27056, 27060, 0, 16384, 24576, 26624, 27136, 27008, + 27072, 27056, 27064, 27062, 0, 16384, 24576, 26624, + 27136, 27008, 27072, 27056, 0, 16384, 24576, 26624, + 27136, 27008, 27072, 27073, 27064, 0, 16384, 24576, + 26624, 27136, 27008, 27072, 27073, 27064, 0, 16384, + 24576, 26624, 27136, 27008, 27072, 27073, 27064, 27066, + 0, 16384, 24576, 26624, 27136, 27008, 27072, 27073, + 27064, 0, 16384, 24576, 26624, 27136, 27008, 27072, + 27073, 27064, 27068, 0, 16384, 24576, 26624, 27136, + 27008, 27072, 27073, 27075, 27068, 0, 16384, 24576, + 26624, 27136, 27008, 27072, 27073, 27075, 27068, 27070, + 0, 16384, 24576, 26624, 27136, 27008, 0, 16384, + 24576, 26624, 27136, 27137, 27072, 0, 16384, 24576, + 26624, 27136, 27137, 27072, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 27074, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27076, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27076, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27080, 27078, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27080, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27080, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27080, 27082, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 27080, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 27088, 27084, 0, 16384, 24576, + 26624, 27136, 27137, 27072, 27088, 27084, 0, 16384, + 24576, 26624, 27136, 27137, 27072, 27088, 27089, 27086, + 0, 16384, 24576, 26624, 27136, 27137, 27072, 0, + 16384, 24576, 26624, 27136, 27137, 27072, 27088, 0, + 16384, 24576, 26624, 27136, 27137, 27072, 27088, 0, + 16384, 24576, 26624, 27136, 27137, 27072, 27088, 27090, + 0, 16384, 24576, 26624, 27136, 27137, 27072, 27088, + 0, 16384, 24576, 26624, 27136, 27137, 27072, 27088, + 27092, 0, 16384, 24576, 26624, 27136, 27137, 27072, + 27088, 27092, 0, 16384, 24576, 26624, 27136, 27137, + 27072, 27088, 27096, 27094, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 27088, 0, 16384, 24576, 26624, + 27136, 27137, 27072, 27104, 27096, 0, 16384, 24576, + 26624, 27136, 27137, 27072, 27104, 27096, 0, 16384, + 24576, 26624, 27136, 27137, 27072, 27104, 27096, 27098, + 0, 16384, 24576, 26624, 27136, 27137, 27072, 27104, + 27096, 0, 16384, 24576, 26624, 27136, 27137, 27072, + 27104, 27105, 27100, 0, 16384, 24576, 26624, 27136, + 27137, 27072, 27104, 27105, 27100, 0, 16384, 24576, + 26624, 27136, 27137, 27072, 27104, 27105, 27100, 27102, + 0, 16384, 24576, 26624, 27136, 27137, 27072, 0, + 16384, 24576, 26624, 27136, 27137, 27072, 27104, 0, + 16384, 24576, 26624, 27136, 27137, 27139, 27104, 0, + 16384, 24576, 26624, 27136, 27137, 27139, 27104, 27106, + 0, 16384, 24576, 26624, 27136, 27137, 27139, 27104, + 0, 16384, 24576, 26624, 27136, 27137, 27139, 27104, + 27108, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27104, 27108, 0, 16384, 24576, 26624, 27136, 27137, + 27139, 27104, 27112, 27110, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27104, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27104, 27112, 0, 16384, 24576, + 26624, 27136, 27137, 27139, 27104, 27112, 0, 16384, + 24576, 26624, 27136, 27137, 27139, 27104, 27112, 27114, + 0, 16384, 24576, 26624, 27136, 27137, 27139, 27104, + 27112, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27104, 27120, 27116, 0, 16384, 24576, 26624, 27136, + 27137, 27139, 27104, 27120, 27116, 0, 16384, 24576, + 26624, 27136, 27137, 27139, 27104, 27120, 27121, 27118, + 0, 16384, 24576, 26624, 27136, 27137, 27139, 27104, + 0, 16384, 24576, 26624, 27136, 27137, 27139, 27104, + 27120, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27104, 27120, 0, 16384, 24576, 26624, 27136, 27137, + 27139, 27104, 27120, 27122, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27143, 27120, 0, 16384, 24576, + 26624, 27136, 27137, 27139, 27143, 27120, 27124, 0, + 16384, 24576, 26624, 27136, 27137, 27139, 27143, 27120, + 27124, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27143, 27120, 27128, 27126, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27143, 27120, 0, 16384, 24576, + 26624, 27136, 27137, 27139, 27143, 27120, 27128, 0, + 16384, 24576, 26624, 27136, 27137, 27139, 27143, 27120, + 27128, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27143, 27120, 27128, 27130, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27143, 27120, 27128, 0, 16384, + 24576, 26624, 27136, 27137, 27139, 27143, 27120, 27128, + 27132, 0, 16384, 24576, 26624, 27136, 27137, 27139, + 27143, 27120, 27128, 27132, 0, 16384, 24576, 26624, + 27136, 27137, 27139, 27143, 27120, 27128, 27132, 27134, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 27136, 0, 16384, 24576, 26624, 27136, 0, 16384, + 24576, 26624, 27136, 27138, 0, 16384, 24576, 26624, + 27136, 0, 16384, 24576, 26624, 27136, 27140, 0, + 16384, 24576, 26624, 27136, 27140, 0, 16384, 24576, + 26624, 27136, 27144, 27142, 0, 16384, 24576, 26624, + 27136, 0, 16384, 24576, 26624, 27136, 27144, 0, + 16384, 24576, 26624, 27136, 27144, 0, 16384, 24576, + 26624, 27136, 27144, 27146, 0, 16384, 24576, 26624, + 27136, 27144, 0, 16384, 24576, 26624, 27136, 27152, + 27148, 0, 16384, 24576, 26624, 27136, 27152, 27148, + 0, 16384, 24576, 26624, 27136, 27152, 27153, 27150, + 0, 16384, 24576, 26624, 27136, 0, 16384, 24576, + 26624, 27136, 27152, 0, 16384, 24576, 26624, 27136, + 27152, 0, 16384, 24576, 26624, 27136, 27152, 27154, + 0, 16384, 24576, 26624, 27136, 27152, 0, 16384, + 24576, 26624, 27136, 27152, 27156, 0, 16384, 24576, + 26624, 27136, 27152, 27156, 0, 16384, 24576, 26624, + 27136, 27152, 27160, 27158, 0, 16384, 24576, 26624, + 27136, 27152, 0, 16384, 24576, 26624, 27136, 27168, + 27160, 0, 16384, 24576, 26624, 27136, 27168, 27160, + 0, 16384, 24576, 26624, 27136, 27168, 27160, 27162, + 0, 16384, 24576, 26624, 27136, 27168, 27160, 0, + 16384, 24576, 26624, 27136, 27168, 27169, 27164, 0, + 16384, 24576, 26624, 27136, 27168, 27169, 27164, 0, + 16384, 24576, 26624, 27136, 27168, 27169, 27164, 27166, + 0, 16384, 24576, 26624, 27136, 0, 16384, 24576, + 26624, 27136, 27168, 0, 16384, 24576, 26624, 27136, + 27168, 0, 16384, 24576, 26624, 27136, 27168, 27170, + 0, 16384, 24576, 26624, 27136, 27168, 0, 16384, + 24576, 26624, 27136, 27168, 27172, 0, 16384, 24576, + 26624, 27136, 27168, 27172, 0, 16384, 24576, 26624, + 27136, 27168, 27176, 27174, 0, 16384, 24576, 26624, + 27136, 27168, 0, 16384, 24576, 26624, 27136, 27168, + 27176, 0, 16384, 24576, 26624, 27136, 27168, 27176, + 0, 16384, 24576, 26624, 27136, 27168, 27176, 27178, + 0, 16384, 24576, 26624, 27136, 27168, 27176, 0, + 16384, 24576, 26624, 27136, 27168, 27184, 27180, 0, + 16384, 24576, 26624, 27136, 27168, 27184, 27180, 0, + 16384, 24576, 26624, 27136, 27168, 27184, 27185, 27182, + 0, 16384, 24576, 26624, 27136, 27168, 0, 16384, + 24576, 26624, 27136, 27200, 27184, 0, 16384, 24576, + 26624, 27136, 27200, 27184, 0, 16384, 24576, 26624, + 27136, 27200, 27184, 27186, 0, 16384, 24576, 26624, + 27136, 27200, 27184, 0, 16384, 24576, 26624, 27136, + 27200, 27184, 27188, 0, 16384, 24576, 26624, 27136, + 27200, 27184, 27188, 0, 16384, 24576, 26624, 27136, + 27200, 27184, 27192, 27190, 0, 16384, 24576, 26624, + 27136, 27200, 27184, 0, 16384, 24576, 26624, 27136, + 27200, 27201, 27192, 0, 16384, 24576, 26624, 27136, + 27200, 27201, 27192, 0, 16384, 24576, 26624, 27136, + 27200, 27201, 27192, 27194, 0, 16384, 24576, 26624, + 27136, 27200, 27201, 27192, 0, 16384, 24576, 26624, + 27136, 27200, 27201, 27192, 27196, 0, 16384, 24576, + 26624, 27136, 27200, 27201, 27203, 27196, 0, 16384, + 24576, 26624, 27136, 27200, 27201, 27203, 27196, 27198, + 0, 16384, 24576, 26624, 27136, 0, 16384, 24576, + 26624, 27136, 27200, 0, 16384, 24576, 26624, 27136, + 27200, 0, 16384, 24576, 26624, 27136, 27200, 27202, + 0, 16384, 24576, 26624, 27136, 27200, 0, 16384, + 24576, 26624, 27136, 27200, 27204, 0, 16384, 24576, + 26624, 27136, 27200, 27204, 0, 16384, 24576, 26624, + 27136, 27200, 27208, 27206, 0, 16384, 24576, 26624, + 27136, 27200, 0, 16384, 24576, 26624, 27136, 27200, + 27208, 0, 16384, 24576, 26624, 27136, 27200, 27208, + 0, 16384, 24576, 26624, 27136, 27200, 27208, 27210, + 0, 16384, 24576, 26624, 27136, 27200, 27208, 0, + 16384, 24576, 26624, 27136, 27200, 27216, 27212, 0, + 16384, 24576, 26624, 27136, 27200, 27216, 27212, 0, + 16384, 24576, 26624, 27136, 27200, 27216, 27217, 27214, + 0, 16384, 24576, 26624, 27136, 27200, 0, 16384, + 24576, 26624, 27136, 27200, 27216, 0, 16384, 24576, + 26624, 27136, 27200, 27216, 0, 16384, 24576, 26624, + 27136, 27200, 27216, 27218, 0, 16384, 24576, 26624, + 27136, 27200, 27216, 0, 16384, 24576, 26624, 27136, + 27200, 27216, 27220, 0, 16384, 24576, 26624, 27136, + 27200, 27216, 27220, 0, 16384, 24576, 26624, 27136, + 27200, 27216, 27224, 27222, 0, 16384, 24576, 26624, + 27136, 27200, 27216, 0, 16384, 24576, 26624, 27136, + 27200, 27232, 27224, 0, 16384, 24576, 26624, 27136, + 27200, 27232, 27224, 0, 16384, 24576, 26624, 27136, + 27200, 27232, 27224, 27226, 0, 16384, 24576, 26624, + 27136, 27200, 27232, 27224, 0, 16384, 24576, 26624, + 27136, 27200, 27232, 27233, 27228, 0, 16384, 24576, + 26624, 27136, 27200, 27232, 27233, 27228, 0, 16384, + 24576, 26624, 27136, 27200, 27232, 27233, 27228, 27230, + 0, 16384, 24576, 26624, 27136, 27200, 0, 16384, + 24576, 26624, 27136, 27264, 27232, 0, 16384, 24576, + 26624, 27136, 27264, 27232, 0, 16384, 24576, 26624, + 27136, 27264, 27232, 27234, 0, 16384, 24576, 26624, + 27136, 27264, 27232, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27236, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27236, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27240, 27238, 0, 16384, 24576, 26624, + 27136, 27264, 27232, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27240, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27240, 0, 16384, 24576, 26624, 27136, + 27264, 27232, 27240, 27242, 0, 16384, 24576, 26624, + 27136, 27264, 27232, 27240, 0, 16384, 24576, 26624, + 27136, 27264, 27232, 27248, 27244, 0, 16384, 24576, + 26624, 27136, 27264, 27232, 27248, 27244, 0, 16384, + 24576, 26624, 27136, 27264, 27232, 27248, 27249, 27246, + 0, 16384, 24576, 26624, 27136, 27264, 27232, 0, + 16384, 24576, 26624, 27136, 27264, 27265, 27248, 0, + 16384, 24576, 26624, 27136, 27264, 27265, 27248, 0, + 16384, 24576, 26624, 27136, 27264, 27265, 27248, 27250, + 0, 16384, 24576, 26624, 27136, 27264, 27265, 27248, + 0, 16384, 24576, 26624, 27136, 27264, 27265, 27248, + 27252, 0, 16384, 24576, 26624, 27136, 27264, 27265, + 27248, 27252, 0, 16384, 24576, 26624, 27136, 27264, + 27265, 27248, 27256, 27254, 0, 16384, 24576, 26624, + 27136, 27264, 27265, 27248, 0, 16384, 24576, 26624, + 27136, 27264, 27265, 27248, 27256, 0, 16384, 24576, + 26624, 27136, 27264, 27265, 27267, 27256, 0, 16384, + 24576, 26624, 27136, 27264, 27265, 27267, 27256, 27258, + 0, 16384, 24576, 26624, 27136, 27264, 27265, 27267, + 27256, 0, 16384, 24576, 26624, 27136, 27264, 27265, + 27267, 27256, 27260, 0, 16384, 24576, 26624, 27136, + 27264, 27265, 27267, 27256, 27260, 0, 16384, 24576, + 26624, 27136, 27264, 27265, 27267, 27256, 27260, 27262, + 0, 16384, 24576, 26624, 27136, 0, 16384, 24576, + 26624, 27136, 27264, 0, 16384, 24576, 26624, 27136, + 27264, 0, 16384, 24576, 26624, 27136, 27264, 27266, + 0, 16384, 24576, 26624, 27136, 27264, 0, 16384, + 24576, 26624, 27136, 27264, 27268, 0, 16384, 24576, + 26624, 27136, 27264, 27268, 0, 16384, 24576, 26624, + 27136, 27264, 27272, 27270, 0, 16384, 24576, 26624, + 27136, 27264, 0, 16384, 24576, 26624, 27136, 27264, + 27272, 0, 16384, 24576, 26624, 27136, 27264, 27272, + 0, 16384, 24576, 26624, 27136, 27264, 27272, 27274, + 0, 16384, 24576, 26624, 27136, 27264, 27272, 0, + 16384, 24576, 26624, 27136, 27264, 27280, 27276, 0, + 16384, 24576, 26624, 27136, 27264, 27280, 27276, 0, + 16384, 24576, 26624, 27136, 27264, 27280, 27281, 27278, + 0, 16384, 24576, 26624, 27136, 27264, 0, 16384, + 24576, 26624, 27136, 27264, 27280, 0, 16384, 24576, + 26624, 27136, 27264, 27280, 0, 16384, 24576, 26624, + 27136, 27264, 27280, 27282, 0, 16384, 24576, 26624, + 27136, 27264, 27280, 0, 16384, 24576, 26624, 27136, + 27264, 27280, 27284, 0, 16384, 24576, 26624, 27136, + 27264, 27280, 27284, 0, 16384, 24576, 26624, 27136, + 27264, 27280, 27288, 27286, 0, 16384, 24576, 26624, + 27136, 27264, 27280, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27288, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27288, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27288, 27290, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 27288, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 27297, 27292, 0, 16384, 24576, + 26624, 27136, 27264, 27296, 27297, 27292, 0, 16384, + 24576, 26624, 27136, 27264, 27296, 27297, 27292, 27294, + 0, 16384, 24576, 26624, 27136, 27264, 0, 16384, + 24576, 26624, 27136, 27264, 27296, 0, 16384, 24576, + 26624, 27136, 27264, 27296, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 27298, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27300, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27300, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27304, 27302, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27304, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27304, 0, 16384, 24576, 26624, 27136, + 27264, 27296, 27304, 27306, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 27304, 0, 16384, 24576, 26624, + 27136, 27264, 27296, 27312, 27308, 0, 16384, 24576, + 26624, 27136, 27264, 27296, 27312, 27308, 0, 16384, + 24576, 26624, 27136, 27264, 27296, 27312, 27313, 27310, + 0, 16384, 24576, 26624, 27136, 27264, 27296, 0, + 16384, 24576, 26624, 27136, 27264, 27328, 27312, 0, + 16384, 24576, 26624, 27136, 27264, 27328, 27312, 0, + 16384, 24576, 26624, 27136, 27264, 27328, 27312, 27314, + 0, 16384, 24576, 26624, 27136, 27264, 27328, 27312, + 0, 16384, 24576, 26624, 27136, 27264, 27328, 27312, + 27316, 0, 16384, 24576, 26624, 27136, 27264, 27328, + 27312, 27316, 0, 16384, 24576, 26624, 27136, 27264, + 27328, 27312, 27320, 27318, 0, 16384, 24576, 26624, + 27136, 27264, 27328, 27312, 0, 16384, 24576, 26624, + 27136, 27264, 27328, 27329, 27320, 0, 16384, 24576, + 26624, 27136, 27264, 27328, 27329, 27320, 0, 16384, + 24576, 26624, 27136, 27264, 27328, 27329, 27320, 27322, + 0, 16384, 24576, 26624, 27136, 27264, 27328, 27329, + 27320, 0, 16384, 24576, 26624, 27136, 27264, 27328, + 27329, 27320, 27324, 0, 16384, 24576, 26624, 27136, + 27264, 27328, 27329, 27331, 27324, 0, 16384, 24576, + 26624, 27136, 27264, 27328, 27329, 27331, 27324, 27326, + 0, 16384, 24576, 26624, 27136, 27264, 0, 16384, + 24576, 26624, 27136, 27392, 27328, 0, 16384, 24576, + 26624, 27136, 27392, 27328, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 27330, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27332, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27332, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27336, 27334, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27336, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27336, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27336, 27338, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 27336, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 27344, 27340, 0, 16384, 24576, + 26624, 27136, 27392, 27328, 27344, 27340, 0, 16384, + 24576, 26624, 27136, 27392, 27328, 27344, 27345, 27342, + 0, 16384, 24576, 26624, 27136, 27392, 27328, 0, + 16384, 24576, 26624, 27136, 27392, 27328, 27344, 0, + 16384, 24576, 26624, 27136, 27392, 27328, 27344, 0, + 16384, 24576, 26624, 27136, 27392, 27328, 27344, 27346, + 0, 16384, 24576, 26624, 27136, 27392, 27328, 27344, + 0, 16384, 24576, 26624, 27136, 27392, 27328, 27344, + 27348, 0, 16384, 24576, 26624, 27136, 27392, 27328, + 27344, 27348, 0, 16384, 24576, 26624, 27136, 27392, + 27328, 27344, 27352, 27350, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 27344, 0, 16384, 24576, 26624, + 27136, 27392, 27328, 27360, 27352, 0, 16384, 24576, + 26624, 27136, 27392, 27328, 27360, 27352, 0, 16384, + 24576, 26624, 27136, 27392, 27328, 27360, 27352, 27354, + 0, 16384, 24576, 26624, 27136, 27392, 27328, 27360, + 27352, 0, 16384, 24576, 26624, 27136, 27392, 27328, + 27360, 27361, 27356, 0, 16384, 24576, 26624, 27136, + 27392, 27328, 27360, 27361, 27356, 0, 16384, 24576, + 26624, 27136, 27392, 27328, 27360, 27361, 27356, 27358, + 0, 16384, 24576, 26624, 27136, 27392, 27328, 0, + 16384, 24576, 26624, 27136, 27392, 27393, 27360, 0, + 16384, 24576, 26624, 27136, 27392, 27393, 27360, 0, + 16384, 24576, 26624, 27136, 27392, 27393, 27360, 27362, + 0, 16384, 24576, 26624, 27136, 27392, 27393, 27360, + 0, 16384, 24576, 26624, 27136, 27392, 27393, 27360, + 27364, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27360, 27364, 0, 16384, 24576, 26624, 27136, 27392, + 27393, 27360, 27368, 27366, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27360, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27360, 27368, 0, 16384, 24576, + 26624, 27136, 27392, 27393, 27360, 27368, 0, 16384, + 24576, 26624, 27136, 27392, 27393, 27360, 27368, 27370, + 0, 16384, 24576, 26624, 27136, 27392, 27393, 27360, + 27368, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27360, 27376, 27372, 0, 16384, 24576, 26624, 27136, + 27392, 27393, 27360, 27376, 27372, 0, 16384, 24576, + 26624, 27136, 27392, 27393, 27360, 27376, 27377, 27374, + 0, 16384, 24576, 26624, 27136, 27392, 27393, 27360, + 0, 16384, 24576, 26624, 27136, 27392, 27393, 27360, + 27376, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27395, 27376, 0, 16384, 24576, 26624, 27136, 27392, + 27393, 27395, 27376, 27378, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27395, 27376, 0, 16384, 24576, + 26624, 27136, 27392, 27393, 27395, 27376, 27380, 0, + 16384, 24576, 26624, 27136, 27392, 27393, 27395, 27376, + 27380, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27395, 27376, 27384, 27382, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27395, 27376, 0, 16384, 24576, + 26624, 27136, 27392, 27393, 27395, 27376, 27384, 0, + 16384, 24576, 26624, 27136, 27392, 27393, 27395, 27376, + 27384, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27395, 27376, 27384, 27386, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27395, 27399, 27384, 0, 16384, + 24576, 26624, 27136, 27392, 27393, 27395, 27399, 27384, + 27388, 0, 16384, 24576, 26624, 27136, 27392, 27393, + 27395, 27399, 27384, 27388, 0, 16384, 24576, 26624, + 27136, 27392, 27393, 27395, 27399, 27384, 27388, 27390, + 0, 16384, 24576, 26624, 27136, 0, 16384, 24576, + 26624, 27648, 27392, 0, 16384, 24576, 26624, 27648, + 27392, 0, 16384, 24576, 26624, 27648, 27392, 27394, + 0, 16384, 24576, 26624, 27648, 27392, 0, 16384, + 24576, 26624, 27648, 27392, 27396, 0, 16384, 24576, + 26624, 27648, 27392, 27396, 0, 16384, 24576, 26624, + 27648, 27392, 27400, 27398, 0, 16384, 24576, 26624, + 27648, 27392, 0, 16384, 24576, 26624, 27648, 27392, + 27400, 0, 16384, 24576, 26624, 27648, 27392, 27400, + 0, 16384, 24576, 26624, 27648, 27392, 27400, 27402, + 0, 16384, 24576, 26624, 27648, 27392, 27400, 0, + 16384, 24576, 26624, 27648, 27392, 27408, 27404, 0, + 16384, 24576, 26624, 27648, 27392, 27408, 27404, 0, + 16384, 24576, 26624, 27648, 27392, 27408, 27409, 27406, + 0, 16384, 24576, 26624, 27648, 27392, 0, 16384, + 24576, 26624, 27648, 27392, 27408, 0, 16384, 24576, + 26624, 27648, 27392, 27408, 0, 16384, 24576, 26624, + 27648, 27392, 27408, 27410, 0, 16384, 24576, 26624, + 27648, 27392, 27408, 0, 16384, 24576, 26624, 27648, + 27392, 27408, 27412, 0, 16384, 24576, 26624, 27648, + 27392, 27408, 27412, 0, 16384, 24576, 26624, 27648, + 27392, 27408, 27416, 27414, 0, 16384, 24576, 26624, + 27648, 27392, 27408, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27416, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27416, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27416, 27418, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 27416, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 27425, 27420, 0, 16384, 24576, + 26624, 27648, 27392, 27424, 27425, 27420, 0, 16384, + 24576, 26624, 27648, 27392, 27424, 27425, 27420, 27422, + 0, 16384, 24576, 26624, 27648, 27392, 0, 16384, + 24576, 26624, 27648, 27392, 27424, 0, 16384, 24576, + 26624, 27648, 27392, 27424, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 27426, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27428, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27428, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27432, 27430, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27432, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27432, 0, 16384, 24576, 26624, 27648, + 27392, 27424, 27432, 27434, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 27432, 0, 16384, 24576, 26624, + 27648, 27392, 27424, 27440, 27436, 0, 16384, 24576, + 26624, 27648, 27392, 27424, 27440, 27436, 0, 16384, + 24576, 26624, 27648, 27392, 27424, 27440, 27441, 27438, + 0, 16384, 24576, 26624, 27648, 27392, 27424, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27440, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27440, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27440, 27442, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27440, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27440, + 27444, 0, 16384, 24576, 26624, 27648, 27392, 27456, + 27440, 27444, 0, 16384, 24576, 26624, 27648, 27392, + 27456, 27440, 27448, 27446, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27440, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27457, 27448, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 27457, 27448, 0, 16384, + 24576, 26624, 27648, 27392, 27456, 27457, 27448, 27450, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27457, + 27448, 0, 16384, 24576, 26624, 27648, 27392, 27456, + 27457, 27448, 27452, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27457, 27459, 27452, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 27457, 27459, 27452, 27454, + 0, 16384, 24576, 26624, 27648, 27392, 0, 16384, + 24576, 26624, 27648, 27392, 27456, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27458, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27460, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27460, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27464, 27462, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27464, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27464, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27464, 27466, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27464, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27472, 27468, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 27472, 27468, 0, 16384, + 24576, 26624, 27648, 27392, 27456, 27472, 27473, 27470, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27472, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27472, 0, + 16384, 24576, 26624, 27648, 27392, 27456, 27472, 27474, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27472, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27472, + 27476, 0, 16384, 24576, 26624, 27648, 27392, 27456, + 27472, 27476, 0, 16384, 24576, 26624, 27648, 27392, + 27456, 27472, 27480, 27478, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27472, 0, 16384, 24576, 26624, + 27648, 27392, 27456, 27488, 27480, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 27488, 27480, 0, 16384, + 24576, 26624, 27648, 27392, 27456, 27488, 27480, 27482, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 27488, + 27480, 0, 16384, 24576, 26624, 27648, 27392, 27456, + 27488, 27489, 27484, 0, 16384, 24576, 26624, 27648, + 27392, 27456, 27488, 27489, 27484, 0, 16384, 24576, + 26624, 27648, 27392, 27456, 27488, 27489, 27484, 27486, + 0, 16384, 24576, 26624, 27648, 27392, 27456, 0, + 16384, 24576, 26624, 27648, 27392, 27520, 27488, 0, + 16384, 24576, 26624, 27648, 27392, 27520, 27488, 0, + 16384, 24576, 26624, 27648, 27392, 27520, 27488, 27490, + 0, 16384, 24576, 26624, 27648, 27392, 27520, 27488, + 0, 16384, 24576, 26624, 27648, 27392, 27520, 27488, + 27492, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27488, 27492, 0, 16384, 24576, 26624, 27648, 27392, + 27520, 27488, 27496, 27494, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27488, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27488, 27496, 0, 16384, 24576, + 26624, 27648, 27392, 27520, 27488, 27496, 0, 16384, + 24576, 26624, 27648, 27392, 27520, 27488, 27496, 27498, + 0, 16384, 24576, 26624, 27648, 27392, 27520, 27488, + 27496, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27488, 27504, 27500, 0, 16384, 24576, 26624, 27648, + 27392, 27520, 27488, 27504, 27500, 0, 16384, 24576, + 26624, 27648, 27392, 27520, 27488, 27504, 27505, 27502, + 0, 16384, 24576, 26624, 27648, 27392, 27520, 27488, + 0, 16384, 24576, 26624, 27648, 27392, 27520, 27521, + 27504, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27521, 27504, 0, 16384, 24576, 26624, 27648, 27392, + 27520, 27521, 27504, 27506, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27521, 27504, 0, 16384, 24576, + 26624, 27648, 27392, 27520, 27521, 27504, 27508, 0, + 16384, 24576, 26624, 27648, 27392, 27520, 27521, 27504, + 27508, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27521, 27504, 27512, 27510, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27521, 27504, 0, 16384, 24576, + 26624, 27648, 27392, 27520, 27521, 27504, 27512, 0, + 16384, 24576, 26624, 27648, 27392, 27520, 27521, 27523, + 27512, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27521, 27523, 27512, 27514, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27521, 27523, 27512, 0, 16384, + 24576, 26624, 27648, 27392, 27520, 27521, 27523, 27512, + 27516, 0, 16384, 24576, 26624, 27648, 27392, 27520, + 27521, 27523, 27512, 27516, 0, 16384, 24576, 26624, + 27648, 27392, 27520, 27521, 27523, 27512, 27516, 27518, + 0, 16384, 24576, 26624, 27648, 27392, 0, 16384, + 24576, 26624, 27648, 27392, 27520, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27522, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27524, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27524, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27528, 27526, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27528, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27528, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27528, 27530, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27528, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27536, 27532, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27536, 27532, 0, 16384, + 24576, 26624, 27648, 27649, 27520, 27536, 27537, 27534, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27536, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27536, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27536, 27538, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27536, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27536, + 27540, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27536, 27540, 0, 16384, 24576, 26624, 27648, 27649, + 27520, 27536, 27544, 27542, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27536, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27552, 27544, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27552, 27544, 0, 16384, + 24576, 26624, 27648, 27649, 27520, 27552, 27544, 27546, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27552, + 27544, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27552, 27553, 27548, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27552, 27553, 27548, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27552, 27553, 27548, 27550, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27552, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27552, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27552, 27554, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27552, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27552, + 27556, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27552, 27556, 0, 16384, 24576, 26624, 27648, 27649, + 27520, 27552, 27560, 27558, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27552, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27552, 27560, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27552, 27560, 0, 16384, + 24576, 26624, 27648, 27649, 27520, 27552, 27560, 27562, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27552, + 27560, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27552, 27568, 27564, 0, 16384, 24576, 26624, 27648, + 27649, 27520, 27552, 27568, 27564, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27552, 27568, 27569, 27566, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27552, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 27584, + 27568, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27584, 27568, 0, 16384, 24576, 26624, 27648, 27649, + 27520, 27584, 27568, 27570, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27584, 27568, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27584, 27568, 27572, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27584, 27568, + 27572, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27584, 27568, 27576, 27574, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27584, 27568, 0, 16384, 24576, + 26624, 27648, 27649, 27520, 27584, 27585, 27576, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27584, 27585, + 27576, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27584, 27585, 27576, 27578, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27584, 27585, 27576, 0, 16384, + 24576, 26624, 27648, 27649, 27520, 27584, 27585, 27576, + 27580, 0, 16384, 24576, 26624, 27648, 27649, 27520, + 27584, 27585, 27587, 27580, 0, 16384, 24576, 26624, + 27648, 27649, 27520, 27584, 27585, 27587, 27580, 27582, + 0, 16384, 24576, 26624, 27648, 27649, 27520, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27584, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27584, 0, + 16384, 24576, 26624, 27648, 27649, 27520, 27584, 27586, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 27588, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27588, 0, 16384, 24576, 26624, 27648, 27649, + 27651, 27584, 27592, 27590, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27592, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27584, 27592, 0, 16384, + 24576, 26624, 27648, 27649, 27651, 27584, 27592, 27594, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 27592, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27600, 27596, 0, 16384, 24576, 26624, 27648, + 27649, 27651, 27584, 27600, 27596, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27584, 27600, 27601, 27598, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 27600, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27600, 0, 16384, 24576, 26624, 27648, 27649, + 27651, 27584, 27600, 27602, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27600, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27584, 27600, 27604, 0, + 16384, 24576, 26624, 27648, 27649, 27651, 27584, 27600, + 27604, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27600, 27608, 27606, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27600, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27584, 27616, 27608, 0, + 16384, 24576, 26624, 27648, 27649, 27651, 27584, 27616, + 27608, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27616, 27608, 27610, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27616, 27608, 0, 16384, + 24576, 26624, 27648, 27649, 27651, 27584, 27616, 27617, + 27612, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27616, 27617, 27612, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27616, 27617, 27612, 27614, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27584, + 27616, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27616, 0, 16384, 24576, 26624, 27648, 27649, + 27651, 27584, 27616, 27618, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27584, 27616, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27584, 27616, 27620, 0, + 16384, 24576, 26624, 27648, 27649, 27651, 27584, 27616, + 27620, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27584, 27616, 27624, 27622, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27655, 27616, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27655, 27616, 27624, 0, + 16384, 24576, 26624, 27648, 27649, 27651, 27655, 27616, + 27624, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27655, 27616, 27624, 27626, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27655, 27616, 27624, 0, 16384, + 24576, 26624, 27648, 27649, 27651, 27655, 27616, 27632, + 27628, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27655, 27616, 27632, 27628, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27655, 27616, 27632, 27633, 27630, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27655, + 27616, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27655, 27616, 27632, 0, 16384, 24576, 26624, 27648, + 27649, 27651, 27655, 27616, 27632, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27655, 27616, 27632, 27634, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27655, + 27616, 27632, 0, 16384, 24576, 26624, 27648, 27649, + 27651, 27655, 27616, 27632, 27636, 0, 16384, 24576, + 26624, 27648, 27649, 27651, 27655, 27616, 27632, 27636, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27655, + 27616, 27632, 27640, 27638, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27655, 27616, 27632, 0, 16384, + 24576, 26624, 27648, 27649, 27651, 27655, 27616, 27632, + 27640, 0, 16384, 24576, 26624, 27648, 27649, 27651, + 27655, 27616, 27632, 27640, 0, 16384, 24576, 26624, + 27648, 27649, 27651, 27655, 27616, 27632, 27640, 27642, + 0, 16384, 24576, 26624, 27648, 27649, 27651, 27655, + 27616, 27632, 27640, 0, 16384, 24576, 26624, 27648, + 27649, 27651, 27655, 27616, 27632, 27640, 27644, 0, + 16384, 24576, 26624, 27648, 27649, 27651, 27655, 27616, + 27632, 27640, 27644, 0, 16384, 24576, 26624, 27648, + 27649, 27651, 27655, 27616, 27632, 27640, 27644, 27646, + 0, 16384, 24576, 26624, 0, 16384, 24576, 26624, + 27648, 0, 16384, 24576, 26624, 27648, 0, 16384, + 24576, 26624, 27648, 27650, 0, 16384, 24576, 26624, + 27648, 0, 16384, 24576, 26624, 27648, 27652, 0, + 16384, 24576, 26624, 27648, 27652, 0, 16384, 24576, + 26624, 27648, 27656, 27654, 0, 16384, 24576, 26624, + 27648, 0, 16384, 24576, 26624, 27648, 27656, 0, + 16384, 24576, 26624, 27648, 27656, 0, 16384, 24576, + 26624, 27648, 27656, 27658, 0, 16384, 24576, 26624, + 27648, 27656, 0, 16384, 24576, 26624, 27648, 27664, + 27660, 0, 16384, 24576, 26624, 27648, 27664, 27660, + 0, 16384, 24576, 26624, 27648, 27664, 27665, 27662, + 0, 16384, 24576, 26624, 27648, 0, 16384, 24576, + 26624, 27648, 27664, 0, 16384, 24576, 26624, 27648, + 27664, 0, 16384, 24576, 26624, 27648, 27664, 27666, + 0, 16384, 24576, 26624, 27648, 27664, 0, 16384, + 24576, 26624, 27648, 27664, 27668, 0, 16384, 24576, + 26624, 27648, 27664, 27668, 0, 16384, 24576, 26624, + 27648, 27664, 27672, 27670, 0, 16384, 24576, 26624, + 27648, 27664, 0, 16384, 24576, 26624, 27648, 27680, + 27672, 0, 16384, 24576, 26624, 27648, 27680, 27672, + 0, 16384, 24576, 26624, 27648, 27680, 27672, 27674, + 0, 16384, 24576, 26624, 27648, 27680, 27672, 0, + 16384, 24576, 26624, 27648, 27680, 27681, 27676, 0, + 16384, 24576, 26624, 27648, 27680, 27681, 27676, 0, + 16384, 24576, 26624, 27648, 27680, 27681, 27676, 27678, + 0, 16384, 24576, 26624, 27648, 0, 16384, 24576, + 26624, 27648, 27680, 0, 16384, 24576, 26624, 27648, + 27680, 0, 16384, 24576, 26624, 27648, 27680, 27682, + 0, 16384, 24576, 26624, 27648, 27680, 0, 16384, + 24576, 26624, 27648, 27680, 27684, 0, 16384, 24576, + 26624, 27648, 27680, 27684, 0, 16384, 24576, 26624, + 27648, 27680, 27688, 27686, 0, 16384, 24576, 26624, + 27648, 27680, 0, 16384, 24576, 26624, 27648, 27680, + 27688, 0, 16384, 24576, 26624, 27648, 27680, 27688, + 0, 16384, 24576, 26624, 27648, 27680, 27688, 27690, + 0, 16384, 24576, 26624, 27648, 27680, 27688, 0, + 16384, 24576, 26624, 27648, 27680, 27696, 27692, 0, + 16384, 24576, 26624, 27648, 27680, 27696, 27692, 0, + 16384, 24576, 26624, 27648, 27680, 27696, 27697, 27694, + 0, 16384, 24576, 26624, 27648, 27680, 0, 16384, + 24576, 26624, 27648, 27712, 27696, 0, 16384, 24576, + 26624, 27648, 27712, 27696, 0, 16384, 24576, 26624, + 27648, 27712, 27696, 27698, 0, 16384, 24576, 26624, + 27648, 27712, 27696, 0, 16384, 24576, 26624, 27648, + 27712, 27696, 27700, 0, 16384, 24576, 26624, 27648, + 27712, 27696, 27700, 0, 16384, 24576, 26624, 27648, + 27712, 27696, 27704, 27702, 0, 16384, 24576, 26624, + 27648, 27712, 27696, 0, 16384, 24576, 26624, 27648, + 27712, 27713, 27704, 0, 16384, 24576, 26624, 27648, + 27712, 27713, 27704, 0, 16384, 24576, 26624, 27648, + 27712, 27713, 27704, 27706, 0, 16384, 24576, 26624, + 27648, 27712, 27713, 27704, 0, 16384, 24576, 26624, + 27648, 27712, 27713, 27704, 27708, 0, 16384, 24576, + 26624, 27648, 27712, 27713, 27715, 27708, 0, 16384, + 24576, 26624, 27648, 27712, 27713, 27715, 27708, 27710, + 0, 16384, 24576, 26624, 27648, 0, 16384, 24576, + 26624, 27648, 27712, 0, 16384, 24576, 26624, 27648, + 27712, 0, 16384, 24576, 26624, 27648, 27712, 27714, + 0, 16384, 24576, 26624, 27648, 27712, 0, 16384, + 24576, 26624, 27648, 27712, 27716, 0, 16384, 24576, + 26624, 27648, 27712, 27716, 0, 16384, 24576, 26624, + 27648, 27712, 27720, 27718, 0, 16384, 24576, 26624, + 27648, 27712, 0, 16384, 24576, 26624, 27648, 27712, + 27720, 0, 16384, 24576, 26624, 27648, 27712, 27720, + 0, 16384, 24576, 26624, 27648, 27712, 27720, 27722, + 0, 16384, 24576, 26624, 27648, 27712, 27720, 0, + 16384, 24576, 26624, 27648, 27712, 27728, 27724, 0, + 16384, 24576, 26624, 27648, 27712, 27728, 27724, 0, + 16384, 24576, 26624, 27648, 27712, 27728, 27729, 27726, + 0, 16384, 24576, 26624, 27648, 27712, 0, 16384, + 24576, 26624, 27648, 27712, 27728, 0, 16384, 24576, + 26624, 27648, 27712, 27728, 0, 16384, 24576, 26624, + 27648, 27712, 27728, 27730, 0, 16384, 24576, 26624, + 27648, 27712, 27728, 0, 16384, 24576, 26624, 27648, + 27712, 27728, 27732, 0, 16384, 24576, 26624, 27648, + 27712, 27728, 27732, 0, 16384, 24576, 26624, 27648, + 27712, 27728, 27736, 27734, 0, 16384, 24576, 26624, + 27648, 27712, 27728, 0, 16384, 24576, 26624, 27648, + 27712, 27744, 27736, 0, 16384, 24576, 26624, 27648, + 27712, 27744, 27736, 0, 16384, 24576, 26624, 27648, + 27712, 27744, 27736, 27738, 0, 16384, 24576, 26624, + 27648, 27712, 27744, 27736, 0, 16384, 24576, 26624, + 27648, 27712, 27744, 27745, 27740, 0, 16384, 24576, + 26624, 27648, 27712, 27744, 27745, 27740, 0, 16384, + 24576, 26624, 27648, 27712, 27744, 27745, 27740, 27742, + 0, 16384, 24576, 26624, 27648, 27712, 0, 16384, + 24576, 26624, 27648, 27776, 27744, 0, 16384, 24576, + 26624, 27648, 27776, 27744, 0, 16384, 24576, 26624, + 27648, 27776, 27744, 27746, 0, 16384, 24576, 26624, + 27648, 27776, 27744, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27748, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27748, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27752, 27750, 0, 16384, 24576, 26624, + 27648, 27776, 27744, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27752, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27752, 0, 16384, 24576, 26624, 27648, + 27776, 27744, 27752, 27754, 0, 16384, 24576, 26624, + 27648, 27776, 27744, 27752, 0, 16384, 24576, 26624, + 27648, 27776, 27744, 27760, 27756, 0, 16384, 24576, + 26624, 27648, 27776, 27744, 27760, 27756, 0, 16384, + 24576, 26624, 27648, 27776, 27744, 27760, 27761, 27758, + 0, 16384, 24576, 26624, 27648, 27776, 27744, 0, + 16384, 24576, 26624, 27648, 27776, 27777, 27760, 0, + 16384, 24576, 26624, 27648, 27776, 27777, 27760, 0, + 16384, 24576, 26624, 27648, 27776, 27777, 27760, 27762, + 0, 16384, 24576, 26624, 27648, 27776, 27777, 27760, + 0, 16384, 24576, 26624, 27648, 27776, 27777, 27760, + 27764, 0, 16384, 24576, 26624, 27648, 27776, 27777, + 27760, 27764, 0, 16384, 24576, 26624, 27648, 27776, + 27777, 27760, 27768, 27766, 0, 16384, 24576, 26624, + 27648, 27776, 27777, 27760, 0, 16384, 24576, 26624, + 27648, 27776, 27777, 27760, 27768, 0, 16384, 24576, + 26624, 27648, 27776, 27777, 27779, 27768, 0, 16384, + 24576, 26624, 27648, 27776, 27777, 27779, 27768, 27770, + 0, 16384, 24576, 26624, 27648, 27776, 27777, 27779, + 27768, 0, 16384, 24576, 26624, 27648, 27776, 27777, + 27779, 27768, 27772, 0, 16384, 24576, 26624, 27648, + 27776, 27777, 27779, 27768, 27772, 0, 16384, 24576, + 26624, 27648, 27776, 27777, 27779, 27768, 27772, 27774, + 0, 16384, 24576, 26624, 27648, 0, 16384, 24576, + 26624, 27648, 27776, 0, 16384, 24576, 26624, 27648, + 27776, 0, 16384, 24576, 26624, 27648, 27776, 27778, + 0, 16384, 24576, 26624, 27648, 27776, 0, 16384, + 24576, 26624, 27648, 27776, 27780, 0, 16384, 24576, + 26624, 27648, 27776, 27780, 0, 16384, 24576, 26624, + 27648, 27776, 27784, 27782, 0, 16384, 24576, 26624, + 27648, 27776, 0, 16384, 24576, 26624, 27648, 27776, + 27784, 0, 16384, 24576, 26624, 27648, 27776, 27784, + 0, 16384, 24576, 26624, 27648, 27776, 27784, 27786, + 0, 16384, 24576, 26624, 27648, 27776, 27784, 0, + 16384, 24576, 26624, 27648, 27776, 27792, 27788, 0, + 16384, 24576, 26624, 27648, 27776, 27792, 27788, 0, + 16384, 24576, 26624, 27648, 27776, 27792, 27793, 27790, + 0, 16384, 24576, 26624, 27648, 27776, 0, 16384, + 24576, 26624, 27648, 27776, 27792, 0, 16384, 24576, + 26624, 27648, 27776, 27792, 0, 16384, 24576, 26624, + 27648, 27776, 27792, 27794, 0, 16384, 24576, 26624, + 27648, 27776, 27792, 0, 16384, 24576, 26624, 27648, + 27776, 27792, 27796, 0, 16384, 24576, 26624, 27648, + 27776, 27792, 27796, 0, 16384, 24576, 26624, 27648, + 27776, 27792, 27800, 27798, 0, 16384, 24576, 26624, + 27648, 27776, 27792, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27800, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27800, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27800, 27802, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 27800, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 27809, 27804, 0, 16384, 24576, + 26624, 27648, 27776, 27808, 27809, 27804, 0, 16384, + 24576, 26624, 27648, 27776, 27808, 27809, 27804, 27806, + 0, 16384, 24576, 26624, 27648, 27776, 0, 16384, + 24576, 26624, 27648, 27776, 27808, 0, 16384, 24576, + 26624, 27648, 27776, 27808, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 27810, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27812, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27812, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27816, 27814, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27816, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27816, 0, 16384, 24576, 26624, 27648, + 27776, 27808, 27816, 27818, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 27816, 0, 16384, 24576, 26624, + 27648, 27776, 27808, 27824, 27820, 0, 16384, 24576, + 26624, 27648, 27776, 27808, 27824, 27820, 0, 16384, + 24576, 26624, 27648, 27776, 27808, 27824, 27825, 27822, + 0, 16384, 24576, 26624, 27648, 27776, 27808, 0, + 16384, 24576, 26624, 27648, 27776, 27840, 27824, 0, + 16384, 24576, 26624, 27648, 27776, 27840, 27824, 0, + 16384, 24576, 26624, 27648, 27776, 27840, 27824, 27826, + 0, 16384, 24576, 26624, 27648, 27776, 27840, 27824, + 0, 16384, 24576, 26624, 27648, 27776, 27840, 27824, + 27828, 0, 16384, 24576, 26624, 27648, 27776, 27840, + 27824, 27828, 0, 16384, 24576, 26624, 27648, 27776, + 27840, 27824, 27832, 27830, 0, 16384, 24576, 26624, + 27648, 27776, 27840, 27824, 0, 16384, 24576, 26624, + 27648, 27776, 27840, 27841, 27832, 0, 16384, 24576, + 26624, 27648, 27776, 27840, 27841, 27832, 0, 16384, + 24576, 26624, 27648, 27776, 27840, 27841, 27832, 27834, + 0, 16384, 24576, 26624, 27648, 27776, 27840, 27841, + 27832, 0, 16384, 24576, 26624, 27648, 27776, 27840, + 27841, 27832, 27836, 0, 16384, 24576, 26624, 27648, + 27776, 27840, 27841, 27843, 27836, 0, 16384, 24576, + 26624, 27648, 27776, 27840, 27841, 27843, 27836, 27838, + 0, 16384, 24576, 26624, 27648, 27776, 0, 16384, + 24576, 26624, 27648, 27904, 27840, 0, 16384, 24576, + 26624, 27648, 27904, 27840, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 27842, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27844, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27844, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27848, 27846, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27848, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27848, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27848, 27850, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 27848, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 27856, 27852, 0, 16384, 24576, + 26624, 27648, 27904, 27840, 27856, 27852, 0, 16384, + 24576, 26624, 27648, 27904, 27840, 27856, 27857, 27854, + 0, 16384, 24576, 26624, 27648, 27904, 27840, 0, + 16384, 24576, 26624, 27648, 27904, 27840, 27856, 0, + 16384, 24576, 26624, 27648, 27904, 27840, 27856, 0, + 16384, 24576, 26624, 27648, 27904, 27840, 27856, 27858, + 0, 16384, 24576, 26624, 27648, 27904, 27840, 27856, + 0, 16384, 24576, 26624, 27648, 27904, 27840, 27856, + 27860, 0, 16384, 24576, 26624, 27648, 27904, 27840, + 27856, 27860, 0, 16384, 24576, 26624, 27648, 27904, + 27840, 27856, 27864, 27862, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 27856, 0, 16384, 24576, 26624, + 27648, 27904, 27840, 27872, 27864, 0, 16384, 24576, + 26624, 27648, 27904, 27840, 27872, 27864, 0, 16384, + 24576, 26624, 27648, 27904, 27840, 27872, 27864, 27866, + 0, 16384, 24576, 26624, 27648, 27904, 27840, 27872, + 27864, 0, 16384, 24576, 26624, 27648, 27904, 27840, + 27872, 27873, 27868, 0, 16384, 24576, 26624, 27648, + 27904, 27840, 27872, 27873, 27868, 0, 16384, 24576, + 26624, 27648, 27904, 27840, 27872, 27873, 27868, 27870, + 0, 16384, 24576, 26624, 27648, 27904, 27840, 0, + 16384, 24576, 26624, 27648, 27904, 27905, 27872, 0, + 16384, 24576, 26624, 27648, 27904, 27905, 27872, 0, + 16384, 24576, 26624, 27648, 27904, 27905, 27872, 27874, + 0, 16384, 24576, 26624, 27648, 27904, 27905, 27872, + 0, 16384, 24576, 26624, 27648, 27904, 27905, 27872, + 27876, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27872, 27876, 0, 16384, 24576, 26624, 27648, 27904, + 27905, 27872, 27880, 27878, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27872, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27872, 27880, 0, 16384, 24576, + 26624, 27648, 27904, 27905, 27872, 27880, 0, 16384, + 24576, 26624, 27648, 27904, 27905, 27872, 27880, 27882, + 0, 16384, 24576, 26624, 27648, 27904, 27905, 27872, + 27880, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27872, 27888, 27884, 0, 16384, 24576, 26624, 27648, + 27904, 27905, 27872, 27888, 27884, 0, 16384, 24576, + 26624, 27648, 27904, 27905, 27872, 27888, 27889, 27886, + 0, 16384, 24576, 26624, 27648, 27904, 27905, 27872, + 0, 16384, 24576, 26624, 27648, 27904, 27905, 27872, + 27888, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27907, 27888, 0, 16384, 24576, 26624, 27648, 27904, + 27905, 27907, 27888, 27890, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27907, 27888, 0, 16384, 24576, + 26624, 27648, 27904, 27905, 27907, 27888, 27892, 0, + 16384, 24576, 26624, 27648, 27904, 27905, 27907, 27888, + 27892, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27907, 27888, 27896, 27894, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27907, 27888, 0, 16384, 24576, + 26624, 27648, 27904, 27905, 27907, 27888, 27896, 0, + 16384, 24576, 26624, 27648, 27904, 27905, 27907, 27888, + 27896, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27907, 27888, 27896, 27898, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27907, 27911, 27896, 0, 16384, + 24576, 26624, 27648, 27904, 27905, 27907, 27911, 27896, + 27900, 0, 16384, 24576, 26624, 27648, 27904, 27905, + 27907, 27911, 27896, 27900, 0, 16384, 24576, 26624, + 27648, 27904, 27905, 27907, 27911, 27896, 27900, 27902, + 0, 16384, 24576, 26624, 27648, 0, 16384, 24576, + 28672, 27648, 27904, 0, 16384, 24576, 28672, 27648, + 27904, 0, 16384, 24576, 28672, 27648, 27904, 27906, + 0, 16384, 24576, 28672, 27648, 27904, 0, 16384, + 24576, 28672, 27648, 27904, 27908, 0, 16384, 24576, + 28672, 27648, 27904, 27908, 0, 16384, 24576, 28672, + 27648, 27904, 27912, 27910, 0, 16384, 24576, 28672, + 27648, 27904, 0, 16384, 24576, 28672, 27648, 27904, + 27912, 0, 16384, 24576, 28672, 27648, 27904, 27912, + 0, 16384, 24576, 28672, 27648, 27904, 27912, 27914, + 0, 16384, 24576, 28672, 27648, 27904, 27912, 0, + 16384, 24576, 28672, 27648, 27904, 27920, 27916, 0, + 16384, 24576, 28672, 27648, 27904, 27920, 27916, 0, + 16384, 24576, 28672, 27648, 27904, 27920, 27921, 27918, + 0, 16384, 24576, 28672, 27648, 27904, 0, 16384, + 24576, 28672, 27648, 27904, 27920, 0, 16384, 24576, + 28672, 27648, 27904, 27920, 0, 16384, 24576, 28672, + 27648, 27904, 27920, 27922, 0, 16384, 24576, 28672, + 27648, 27904, 27920, 0, 16384, 24576, 28672, 27648, + 27904, 27920, 27924, 0, 16384, 24576, 28672, 27648, + 27904, 27920, 27924, 0, 16384, 24576, 28672, 27648, + 27904, 27920, 27928, 27926, 0, 16384, 24576, 28672, + 27648, 27904, 27920, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27928, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27928, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27928, 27930, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 27928, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 27937, 27932, 0, 16384, 24576, + 28672, 27648, 27904, 27936, 27937, 27932, 0, 16384, + 24576, 28672, 27648, 27904, 27936, 27937, 27932, 27934, + 0, 16384, 24576, 28672, 27648, 27904, 0, 16384, + 24576, 28672, 27648, 27904, 27936, 0, 16384, 24576, + 28672, 27648, 27904, 27936, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 27938, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27940, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27940, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27944, 27942, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27944, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27944, 0, 16384, 24576, 28672, 27648, + 27904, 27936, 27944, 27946, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 27944, 0, 16384, 24576, 28672, + 27648, 27904, 27936, 27952, 27948, 0, 16384, 24576, + 28672, 27648, 27904, 27936, 27952, 27948, 0, 16384, + 24576, 28672, 27648, 27904, 27936, 27952, 27953, 27950, + 0, 16384, 24576, 28672, 27648, 27904, 27936, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27952, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27952, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27952, 27954, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 27952, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 27952, + 27956, 0, 16384, 24576, 28672, 27648, 27904, 27968, + 27952, 27956, 0, 16384, 24576, 28672, 27648, 27904, + 27968, 27952, 27960, 27958, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27952, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27969, 27960, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 27969, 27960, 0, 16384, + 24576, 28672, 27648, 27904, 27968, 27969, 27960, 27962, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 27969, + 27960, 0, 16384, 24576, 28672, 27648, 27904, 27968, + 27969, 27960, 27964, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27969, 27971, 27964, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 27969, 27971, 27964, 27966, + 0, 16384, 24576, 28672, 27648, 27904, 0, 16384, + 24576, 28672, 27648, 27904, 27968, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27970, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27972, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27972, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27976, 27974, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27976, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27976, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 27976, 27978, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27976, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27984, 27980, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 27984, 27980, 0, 16384, + 24576, 28672, 27648, 27904, 27968, 27984, 27985, 27982, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27984, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27984, 0, + 16384, 24576, 28672, 27648, 27904, 27968, 27984, 27986, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 27984, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 27984, + 27988, 0, 16384, 24576, 28672, 27648, 27904, 27968, + 27984, 27988, 0, 16384, 24576, 28672, 27648, 27904, + 27968, 27984, 27992, 27990, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 27984, 0, 16384, 24576, 28672, + 27648, 27904, 27968, 28000, 27992, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 28000, 27992, 0, 16384, + 24576, 28672, 27648, 27904, 27968, 28000, 27992, 27994, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 28000, + 27992, 0, 16384, 24576, 28672, 27648, 27904, 27968, + 28000, 28001, 27996, 0, 16384, 24576, 28672, 27648, + 27904, 27968, 28000, 28001, 27996, 0, 16384, 24576, + 28672, 27648, 27904, 27968, 28000, 28001, 27996, 27998, + 0, 16384, 24576, 28672, 27648, 27904, 27968, 0, + 16384, 24576, 28672, 27648, 27904, 28032, 28000, 0, + 16384, 24576, 28672, 27648, 27904, 28032, 28000, 0, + 16384, 24576, 28672, 27648, 27904, 28032, 28000, 28002, + 0, 16384, 24576, 28672, 27648, 27904, 28032, 28000, + 0, 16384, 24576, 28672, 27648, 27904, 28032, 28000, + 28004, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28000, 28004, 0, 16384, 24576, 28672, 27648, 27904, + 28032, 28000, 28008, 28006, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28000, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28000, 28008, 0, 16384, 24576, + 28672, 27648, 27904, 28032, 28000, 28008, 0, 16384, + 24576, 28672, 27648, 27904, 28032, 28000, 28008, 28010, + 0, 16384, 24576, 28672, 27648, 27904, 28032, 28000, + 28008, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28000, 28016, 28012, 0, 16384, 24576, 28672, 27648, + 27904, 28032, 28000, 28016, 28012, 0, 16384, 24576, + 28672, 27648, 27904, 28032, 28000, 28016, 28017, 28014, + 0, 16384, 24576, 28672, 27648, 27904, 28032, 28000, + 0, 16384, 24576, 28672, 27648, 27904, 28032, 28033, + 28016, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28033, 28016, 0, 16384, 24576, 28672, 27648, 27904, + 28032, 28033, 28016, 28018, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28033, 28016, 0, 16384, 24576, + 28672, 27648, 27904, 28032, 28033, 28016, 28020, 0, + 16384, 24576, 28672, 27648, 27904, 28032, 28033, 28016, + 28020, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28033, 28016, 28024, 28022, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28033, 28016, 0, 16384, 24576, + 28672, 27648, 27904, 28032, 28033, 28016, 28024, 0, + 16384, 24576, 28672, 27648, 27904, 28032, 28033, 28035, + 28024, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28033, 28035, 28024, 28026, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28033, 28035, 28024, 0, 16384, + 24576, 28672, 27648, 27904, 28032, 28033, 28035, 28024, + 28028, 0, 16384, 24576, 28672, 27648, 27904, 28032, + 28033, 28035, 28024, 28028, 0, 16384, 24576, 28672, + 27648, 27904, 28032, 28033, 28035, 28024, 28028, 28030, + 0, 16384, 24576, 28672, 27648, 27904, 0, 16384, + 24576, 28672, 27648, 28160, 28032, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28034, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28036, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28036, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28040, 28038, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28040, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28040, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28040, 28042, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28040, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28048, 28044, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28048, 28044, 0, 16384, + 24576, 28672, 27648, 28160, 28032, 28048, 28049, 28046, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28048, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28048, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28048, 28050, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28048, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28048, + 28052, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28048, 28052, 0, 16384, 24576, 28672, 27648, 28160, + 28032, 28048, 28056, 28054, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28048, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28064, 28056, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28064, 28056, 0, 16384, + 24576, 28672, 27648, 28160, 28032, 28064, 28056, 28058, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28064, + 28056, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28064, 28065, 28060, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28064, 28065, 28060, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28064, 28065, 28060, 28062, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28064, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28064, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28064, 28066, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28064, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28064, + 28068, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28064, 28068, 0, 16384, 24576, 28672, 27648, 28160, + 28032, 28064, 28072, 28070, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28064, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28064, 28072, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28064, 28072, 0, 16384, + 24576, 28672, 27648, 28160, 28032, 28064, 28072, 28074, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28064, + 28072, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28064, 28080, 28076, 0, 16384, 24576, 28672, 27648, + 28160, 28032, 28064, 28080, 28076, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28064, 28080, 28081, 28078, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28064, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 28096, + 28080, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28096, 28080, 0, 16384, 24576, 28672, 27648, 28160, + 28032, 28096, 28080, 28082, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28096, 28080, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28096, 28080, 28084, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28096, 28080, + 28084, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28096, 28080, 28088, 28086, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28096, 28080, 0, 16384, 24576, + 28672, 27648, 28160, 28032, 28096, 28097, 28088, 0, + 16384, 24576, 28672, 27648, 28160, 28032, 28096, 28097, + 28088, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28096, 28097, 28088, 28090, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28096, 28097, 28088, 0, 16384, + 24576, 28672, 27648, 28160, 28032, 28096, 28097, 28088, + 28092, 0, 16384, 24576, 28672, 27648, 28160, 28032, + 28096, 28097, 28099, 28092, 0, 16384, 24576, 28672, + 27648, 28160, 28032, 28096, 28097, 28099, 28092, 28094, + 0, 16384, 24576, 28672, 27648, 28160, 28032, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28096, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28096, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28096, 28098, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 28100, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28100, 0, 16384, 24576, 28672, 27648, 28160, + 28161, 28096, 28104, 28102, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 28104, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28096, 28104, 0, 16384, + 24576, 28672, 27648, 28160, 28161, 28096, 28104, 28106, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 28104, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28112, 28108, 0, 16384, 24576, 28672, 27648, + 28160, 28161, 28096, 28112, 28108, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28096, 28112, 28113, 28110, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 28112, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28112, 0, 16384, 24576, 28672, 27648, 28160, + 28161, 28096, 28112, 28114, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 28112, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28096, 28112, 28116, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28096, 28112, + 28116, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28112, 28120, 28118, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 28112, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28096, 28128, 28120, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28096, 28128, + 28120, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28128, 28120, 28122, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 28128, 28120, 0, 16384, + 24576, 28672, 27648, 28160, 28161, 28096, 28128, 28129, + 28124, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28096, 28128, 28129, 28124, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28096, 28128, 28129, 28124, 28126, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28096, + 28128, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28128, 0, 16384, 24576, 28672, 27648, 28160, + 28161, 28163, 28128, 28130, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28128, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28163, 28128, 28132, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28163, 28128, + 28132, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28128, 28136, 28134, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28128, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28163, 28128, 28136, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28163, 28128, + 28136, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28128, 28136, 28138, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28128, 28136, 0, 16384, + 24576, 28672, 27648, 28160, 28161, 28163, 28128, 28144, + 28140, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28128, 28144, 28140, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28128, 28144, 28145, 28142, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28163, + 28128, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28128, 28144, 0, 16384, 24576, 28672, 27648, + 28160, 28161, 28163, 28128, 28144, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28163, 28128, 28144, 28146, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28163, + 28167, 28144, 0, 16384, 24576, 28672, 27648, 28160, + 28161, 28163, 28167, 28144, 28148, 0, 16384, 24576, + 28672, 27648, 28160, 28161, 28163, 28167, 28144, 28148, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28163, + 28167, 28144, 28152, 28150, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28167, 28144, 0, 16384, + 24576, 28672, 27648, 28160, 28161, 28163, 28167, 28144, + 28152, 0, 16384, 24576, 28672, 27648, 28160, 28161, + 28163, 28167, 28144, 28152, 0, 16384, 24576, 28672, + 27648, 28160, 28161, 28163, 28167, 28144, 28152, 28154, + 0, 16384, 24576, 28672, 27648, 28160, 28161, 28163, + 28167, 28144, 28152, 0, 16384, 24576, 28672, 27648, + 28160, 28161, 28163, 28167, 28144, 28152, 28156, 0, + 16384, 24576, 28672, 27648, 28160, 28161, 28163, 28167, + 28144, 28152, 28156, 0, 16384, 24576, 28672, 27648, + 28160, 28161, 28163, 28167, 28144, 28152, 28156, 28158, + 0, 16384, 24576, 28672, 27648, 0, 16384, 24576, + 28672, 27648, 28160, 0, 16384, 24576, 28672, 28673, + 28160, 0, 16384, 24576, 28672, 28673, 28160, 28162, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28164, 0, 16384, 24576, + 28672, 28673, 28160, 28164, 0, 16384, 24576, 28672, + 28673, 28160, 28168, 28166, 0, 16384, 24576, 28672, + 28673, 28160, 0, 16384, 24576, 28672, 28673, 28160, + 28168, 0, 16384, 24576, 28672, 28673, 28160, 28168, + 0, 16384, 24576, 28672, 28673, 28160, 28168, 28170, + 0, 16384, 24576, 28672, 28673, 28160, 28168, 0, + 16384, 24576, 28672, 28673, 28160, 28176, 28172, 0, + 16384, 24576, 28672, 28673, 28160, 28176, 28172, 0, + 16384, 24576, 28672, 28673, 28160, 28176, 28177, 28174, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28176, 0, 16384, 24576, + 28672, 28673, 28160, 28176, 0, 16384, 24576, 28672, + 28673, 28160, 28176, 28178, 0, 16384, 24576, 28672, + 28673, 28160, 28176, 0, 16384, 24576, 28672, 28673, + 28160, 28176, 28180, 0, 16384, 24576, 28672, 28673, + 28160, 28176, 28180, 0, 16384, 24576, 28672, 28673, + 28160, 28176, 28184, 28182, 0, 16384, 24576, 28672, + 28673, 28160, 28176, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28184, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28184, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28184, 28186, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 28184, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 28193, 28188, 0, 16384, 24576, + 28672, 28673, 28160, 28192, 28193, 28188, 0, 16384, + 24576, 28672, 28673, 28160, 28192, 28193, 28188, 28190, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28192, 0, 16384, 24576, + 28672, 28673, 28160, 28192, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 28194, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28196, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28196, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28200, 28198, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28200, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28200, 0, 16384, 24576, 28672, 28673, + 28160, 28192, 28200, 28202, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 28200, 0, 16384, 24576, 28672, + 28673, 28160, 28192, 28208, 28204, 0, 16384, 24576, + 28672, 28673, 28160, 28192, 28208, 28204, 0, 16384, + 24576, 28672, 28673, 28160, 28192, 28208, 28209, 28206, + 0, 16384, 24576, 28672, 28673, 28160, 28192, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28208, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28208, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28208, 28210, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28208, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28208, + 28212, 0, 16384, 24576, 28672, 28673, 28160, 28224, + 28208, 28212, 0, 16384, 24576, 28672, 28673, 28160, + 28224, 28208, 28216, 28214, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28208, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28225, 28216, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 28225, 28216, 0, 16384, + 24576, 28672, 28673, 28160, 28224, 28225, 28216, 28218, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28225, + 28216, 0, 16384, 24576, 28672, 28673, 28160, 28224, + 28225, 28216, 28220, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28225, 28227, 28220, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 28225, 28227, 28220, 28222, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28224, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28226, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28228, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28228, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28232, 28230, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28232, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28232, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28232, 28234, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28232, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28240, 28236, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 28240, 28236, 0, 16384, + 24576, 28672, 28673, 28160, 28224, 28240, 28241, 28238, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28240, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28240, 0, + 16384, 24576, 28672, 28673, 28160, 28224, 28240, 28242, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28240, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28240, + 28244, 0, 16384, 24576, 28672, 28673, 28160, 28224, + 28240, 28244, 0, 16384, 24576, 28672, 28673, 28160, + 28224, 28240, 28248, 28246, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28240, 0, 16384, 24576, 28672, + 28673, 28160, 28224, 28256, 28248, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 28256, 28248, 0, 16384, + 24576, 28672, 28673, 28160, 28224, 28256, 28248, 28250, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 28256, + 28248, 0, 16384, 24576, 28672, 28673, 28160, 28224, + 28256, 28257, 28252, 0, 16384, 24576, 28672, 28673, + 28160, 28224, 28256, 28257, 28252, 0, 16384, 24576, + 28672, 28673, 28160, 28224, 28256, 28257, 28252, 28254, + 0, 16384, 24576, 28672, 28673, 28160, 28224, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28256, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28256, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28256, 28258, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28256, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28256, + 28260, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28256, 28260, 0, 16384, 24576, 28672, 28673, 28160, + 28288, 28256, 28264, 28262, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28256, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28256, 28264, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28256, 28264, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28256, 28264, 28266, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28256, + 28264, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28256, 28272, 28268, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28256, 28272, 28268, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28256, 28272, 28273, 28270, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28256, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28289, + 28272, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28289, 28272, 0, 16384, 24576, 28672, 28673, 28160, + 28288, 28289, 28272, 28274, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28289, 28272, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28289, 28272, 28276, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28289, 28272, + 28276, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28289, 28272, 28280, 28278, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28289, 28272, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28289, 28272, 28280, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28289, 28291, + 28280, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28289, 28291, 28280, 28282, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28289, 28291, 28280, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28289, 28291, 28280, + 28284, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28289, 28291, 28280, 28284, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28289, 28291, 28280, 28284, 28286, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28290, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28292, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28292, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28296, 28294, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28296, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28296, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28296, 28298, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28296, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28304, 28300, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28304, 28300, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28304, 28305, 28302, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28304, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28304, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28304, 28306, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28304, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28304, + 28308, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28304, 28308, 0, 16384, 24576, 28672, 28673, 28160, + 28288, 28304, 28312, 28310, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28304, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28320, 28312, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28320, 28312, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28320, 28312, 28314, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28320, + 28312, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28320, 28321, 28316, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28320, 28321, 28316, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28320, 28321, 28316, 28318, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28320, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28320, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28320, 28322, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28320, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28320, + 28324, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28320, 28324, 0, 16384, 24576, 28672, 28673, 28160, + 28288, 28320, 28328, 28326, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28320, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28320, 28328, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28320, 28328, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28320, 28328, 28330, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28320, + 28328, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28320, 28336, 28332, 0, 16384, 24576, 28672, 28673, + 28160, 28288, 28320, 28336, 28332, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28320, 28336, 28337, 28334, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28320, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 28352, + 28336, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28352, 28336, 0, 16384, 24576, 28672, 28673, 28160, + 28288, 28352, 28336, 28338, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28352, 28336, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28352, 28336, 28340, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28352, 28336, + 28340, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28352, 28336, 28344, 28342, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28352, 28336, 0, 16384, 24576, + 28672, 28673, 28160, 28288, 28352, 28353, 28344, 0, + 16384, 24576, 28672, 28673, 28160, 28288, 28352, 28353, + 28344, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28352, 28353, 28344, 28346, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28352, 28353, 28344, 0, 16384, + 24576, 28672, 28673, 28160, 28288, 28352, 28353, 28344, + 28348, 0, 16384, 24576, 28672, 28673, 28160, 28288, + 28352, 28353, 28355, 28348, 0, 16384, 24576, 28672, + 28673, 28160, 28288, 28352, 28353, 28355, 28348, 28350, + 0, 16384, 24576, 28672, 28673, 28160, 28288, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28352, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28352, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28352, 28354, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 28356, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28356, 0, 16384, 24576, 28672, 28673, 28160, + 28416, 28352, 28360, 28358, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 28360, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28352, 28360, 0, 16384, + 24576, 28672, 28673, 28160, 28416, 28352, 28360, 28362, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 28360, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28368, 28364, 0, 16384, 24576, 28672, 28673, + 28160, 28416, 28352, 28368, 28364, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28352, 28368, 28369, 28366, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 28368, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28368, 0, 16384, 24576, 28672, 28673, 28160, + 28416, 28352, 28368, 28370, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 28368, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28352, 28368, 28372, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28352, 28368, + 28372, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28368, 28376, 28374, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 28368, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28352, 28384, 28376, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28352, 28384, + 28376, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28384, 28376, 28378, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 28384, 28376, 0, 16384, + 24576, 28672, 28673, 28160, 28416, 28352, 28384, 28385, + 28380, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28352, 28384, 28385, 28380, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28352, 28384, 28385, 28380, 28382, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28352, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28417, + 28384, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28384, 0, 16384, 24576, 28672, 28673, 28160, + 28416, 28417, 28384, 28386, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28384, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28417, 28384, 28388, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28417, 28384, + 28388, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28384, 28392, 28390, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28384, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28417, 28384, 28392, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28417, 28384, + 28392, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28384, 28392, 28394, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28384, 28392, 0, 16384, + 24576, 28672, 28673, 28160, 28416, 28417, 28384, 28400, + 28396, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28384, 28400, 28396, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28384, 28400, 28401, 28398, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28417, + 28384, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28384, 28400, 0, 16384, 24576, 28672, 28673, + 28160, 28416, 28417, 28419, 28400, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28417, 28419, 28400, 28402, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28417, + 28419, 28400, 0, 16384, 24576, 28672, 28673, 28160, + 28416, 28417, 28419, 28400, 28404, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 28417, 28419, 28400, 28404, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28417, + 28419, 28400, 28408, 28406, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28419, 28400, 0, 16384, + 24576, 28672, 28673, 28160, 28416, 28417, 28419, 28400, + 28408, 0, 16384, 24576, 28672, 28673, 28160, 28416, + 28417, 28419, 28400, 28408, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28417, 28419, 28400, 28408, 28410, + 0, 16384, 24576, 28672, 28673, 28160, 28416, 28417, + 28419, 28423, 28408, 0, 16384, 24576, 28672, 28673, + 28160, 28416, 28417, 28419, 28423, 28408, 28412, 0, + 16384, 24576, 28672, 28673, 28160, 28416, 28417, 28419, + 28423, 28408, 28412, 0, 16384, 24576, 28672, 28673, + 28160, 28416, 28417, 28419, 28423, 28408, 28412, 28414, + 0, 16384, 24576, 28672, 28673, 28160, 0, 16384, + 24576, 28672, 28673, 28160, 28416, 0, 16384, 24576, + 28672, 28673, 28160, 28416, 0, 16384, 24576, 28672, + 28673, 28160, 28416, 28418, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28420, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28420, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28424, 28422, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28424, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28424, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28424, 28426, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28424, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28432, 28428, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28432, 28428, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28432, 28433, 28430, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28432, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28432, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28432, 28434, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28432, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28432, + 28436, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28432, 28436, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28432, 28440, 28438, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28432, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28448, 28440, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28448, 28440, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28448, 28440, 28442, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28448, + 28440, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28448, 28449, 28444, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28448, 28449, 28444, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28448, 28449, 28444, 28446, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28448, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28448, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28448, 28450, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28448, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28448, + 28452, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28448, 28452, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28448, 28456, 28454, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28448, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28448, 28456, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28448, 28456, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28448, 28456, 28458, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28448, + 28456, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28448, 28464, 28460, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28448, 28464, 28460, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28448, 28464, 28465, 28462, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28448, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 28464, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28464, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28480, 28464, 28466, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28464, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28464, 28468, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 28464, + 28468, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28464, 28472, 28470, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28464, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28481, 28472, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 28481, + 28472, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28481, 28472, 28474, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28481, 28472, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28480, 28481, 28472, + 28476, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28481, 28483, 28476, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28481, 28483, 28476, 28478, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 28482, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 28484, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28484, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28480, 28488, 28486, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28488, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28488, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28480, 28488, 28490, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 28488, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28496, 28492, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28480, 28496, 28492, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28496, 28497, 28494, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 28496, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28496, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28480, 28496, 28498, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28496, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28496, 28500, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 28496, + 28500, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28496, 28504, 28502, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28496, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28480, 28512, 28504, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28480, 28512, + 28504, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28512, 28504, 28506, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28512, 28504, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28480, 28512, 28513, + 28508, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28480, 28512, 28513, 28508, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28480, 28512, 28513, 28508, 28510, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28480, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28512, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28512, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28544, 28512, 28514, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28512, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28544, 28512, 28516, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 28512, + 28516, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28512, 28520, 28518, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28512, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28544, 28512, 28520, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 28512, + 28520, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28512, 28520, 28522, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28512, 28520, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28544, 28512, 28528, + 28524, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28512, 28528, 28524, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28512, 28528, 28529, 28526, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28512, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28545, 28528, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28544, 28545, 28528, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28544, 28545, 28528, 28530, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28545, 28528, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28544, 28545, 28528, 28532, 0, 16384, 24576, + 28672, 28673, 28675, 28416, 28544, 28545, 28528, 28532, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28545, 28528, 28536, 28534, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28545, 28528, 0, 16384, + 24576, 28672, 28673, 28675, 28416, 28544, 28545, 28528, + 28536, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28545, 28547, 28536, 0, 16384, 24576, 28672, + 28673, 28675, 28416, 28544, 28545, 28547, 28536, 28538, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28545, 28547, 28536, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28544, 28545, 28547, 28536, 28540, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 28545, + 28547, 28536, 28540, 0, 16384, 24576, 28672, 28673, + 28675, 28416, 28544, 28545, 28547, 28536, 28540, 28542, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 0, + 16384, 24576, 28672, 28673, 28675, 28416, 28544, 28546, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 0, 16384, 24576, 28672, 28673, 28675, 28416, 28544, + 28548, 0, 16384, 24576, 28672, 28673, 28675, 28416, + 28544, 28548, 0, 16384, 24576, 28672, 28673, 28675, + 28416, 28544, 28552, 28550, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28552, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28552, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28544, 28552, 28554, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28552, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28560, 28556, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28544, 28560, 28556, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28560, 28561, 28558, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28560, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28560, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28544, 28560, 28562, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28560, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28560, 28564, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28560, + 28564, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28560, 28568, 28566, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28560, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28576, 28568, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28576, + 28568, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 28568, 28570, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 28568, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28544, 28576, 28577, + 28572, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 28577, 28572, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 28577, 28572, 28574, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28576, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28544, 28576, 28578, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28576, 28580, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28576, + 28580, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 28584, 28582, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28576, 28584, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28576, + 28584, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 28584, 28586, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 28584, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28544, 28576, 28592, + 28588, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28576, 28592, 28588, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28576, 28592, 28593, 28590, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28576, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 28592, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28544, 28608, 28592, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28608, 28592, 28594, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28608, 28592, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28544, 28608, 28592, 28596, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28608, 28592, 28596, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28608, 28592, 28600, 28598, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 28592, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28544, 28608, 28609, + 28600, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 28609, 28600, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 28609, 28600, 28602, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28608, 28609, 28600, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28544, 28608, 28609, 28600, 28604, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28608, + 28609, 28611, 28604, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28544, 28608, 28609, 28611, 28604, 28606, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28544, + 28608, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28544, 28608, 28610, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28608, 28612, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28608, + 28612, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 28616, 28614, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28544, 28608, 28616, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28544, 28608, + 28616, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 28616, 28618, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 28616, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28544, 28608, 28624, + 28620, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28544, 28608, 28624, 28620, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28544, 28608, 28624, 28625, 28622, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28687, 28608, 28624, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28624, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28624, 28626, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28624, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28687, 28608, 28624, 28628, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28624, 28628, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28624, 28632, 28630, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28624, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28687, 28608, 28640, + 28632, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28687, 28608, 28640, 28632, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 28632, 28634, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 28632, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28641, 28636, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28641, 28636, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28641, 28636, 28638, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28687, 28608, 28640, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28640, 28642, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28687, 28608, 28640, 28644, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28640, 28644, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 28648, 28646, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 0, 16384, + 24576, 28672, 28673, 28675, 28679, 28687, 28608, 28640, + 28648, 0, 16384, 24576, 28672, 28673, 28675, 28679, + 28687, 28608, 28640, 28648, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 28648, 28650, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 28648, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28656, 28652, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28656, 28652, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28656, 28657, 28654, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28687, 28608, 28640, 28656, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28640, 28656, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 28656, 28658, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 28656, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28656, 28660, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28656, 28660, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28656, 28664, 28662, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 28656, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28656, 28664, 0, 16384, 24576, 28672, 28673, + 28675, 28679, 28687, 28608, 28640, 28656, 28664, 0, + 16384, 24576, 28672, 28673, 28675, 28679, 28687, 28608, + 28640, 28656, 28664, 28666, 0, 16384, 24576, 28672, + 28673, 28675, 28679, 28687, 28608, 28640, 28656, 28664, + 0, 16384, 24576, 28672, 28673, 28675, 28679, 28687, + 28608, 28640, 28656, 28664, 28668, 0, 16384, 24576, + 28672, 28673, 28675, 28679, 28687, 28608, 28640, 28656, + 28664, 28668, 0, 16384, 24576, 28672, 28673, 28675, + 28679, 28687, 28608, 28640, 28656, 28664, 28668, 28670, + 0, 16384, 24576, 0, 16384, 24576, 28672, 0, + 16384, 24576, 28672, 0, 16384, 24576, 28672, 28674, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28676, 0, 16384, 24576, 28672, 28676, 0, 16384, + 24576, 28672, 28680, 28678, 0, 16384, 24576, 28672, + 0, 16384, 24576, 28672, 28680, 0, 16384, 24576, + 28672, 28680, 0, 16384, 24576, 28672, 28680, 28682, + 0, 16384, 24576, 28672, 28680, 0, 16384, 24576, + 28672, 28688, 28684, 0, 16384, 24576, 28672, 28688, + 28684, 0, 16384, 24576, 28672, 28688, 28689, 28686, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28688, 0, 16384, 24576, 28672, 28688, 0, 16384, + 24576, 28672, 28688, 28690, 0, 16384, 24576, 28672, + 28688, 0, 16384, 24576, 28672, 28688, 28692, 0, + 16384, 24576, 28672, 28688, 28692, 0, 16384, 24576, + 28672, 28688, 28696, 28694, 0, 16384, 24576, 28672, + 28688, 0, 16384, 24576, 28672, 28704, 28696, 0, + 16384, 24576, 28672, 28704, 28696, 0, 16384, 24576, + 28672, 28704, 28696, 28698, 0, 16384, 24576, 28672, + 28704, 28696, 0, 16384, 24576, 28672, 28704, 28705, + 28700, 0, 16384, 24576, 28672, 28704, 28705, 28700, + 0, 16384, 24576, 28672, 28704, 28705, 28700, 28702, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28704, 0, 16384, 24576, 28672, 28704, 0, 16384, + 24576, 28672, 28704, 28706, 0, 16384, 24576, 28672, + 28704, 0, 16384, 24576, 28672, 28704, 28708, 0, + 16384, 24576, 28672, 28704, 28708, 0, 16384, 24576, + 28672, 28704, 28712, 28710, 0, 16384, 24576, 28672, + 28704, 0, 16384, 24576, 28672, 28704, 28712, 0, + 16384, 24576, 28672, 28704, 28712, 0, 16384, 24576, + 28672, 28704, 28712, 28714, 0, 16384, 24576, 28672, + 28704, 28712, 0, 16384, 24576, 28672, 28704, 28720, + 28716, 0, 16384, 24576, 28672, 28704, 28720, 28716, + 0, 16384, 24576, 28672, 28704, 28720, 28721, 28718, + 0, 16384, 24576, 28672, 28704, 0, 16384, 24576, + 28672, 28736, 28720, 0, 16384, 24576, 28672, 28736, + 28720, 0, 16384, 24576, 28672, 28736, 28720, 28722, + 0, 16384, 24576, 28672, 28736, 28720, 0, 16384, + 24576, 28672, 28736, 28720, 28724, 0, 16384, 24576, + 28672, 28736, 28720, 28724, 0, 16384, 24576, 28672, + 28736, 28720, 28728, 28726, 0, 16384, 24576, 28672, + 28736, 28720, 0, 16384, 24576, 28672, 28736, 28737, + 28728, 0, 16384, 24576, 28672, 28736, 28737, 28728, + 0, 16384, 24576, 28672, 28736, 28737, 28728, 28730, + 0, 16384, 24576, 28672, 28736, 28737, 28728, 0, + 16384, 24576, 28672, 28736, 28737, 28728, 28732, 0, + 16384, 24576, 28672, 28736, 28737, 28739, 28732, 0, + 16384, 24576, 28672, 28736, 28737, 28739, 28732, 28734, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28736, 0, 16384, 24576, 28672, 28736, 0, 16384, + 24576, 28672, 28736, 28738, 0, 16384, 24576, 28672, + 28736, 0, 16384, 24576, 28672, 28736, 28740, 0, + 16384, 24576, 28672, 28736, 28740, 0, 16384, 24576, + 28672, 28736, 28744, 28742, 0, 16384, 24576, 28672, + 28736, 0, 16384, 24576, 28672, 28736, 28744, 0, + 16384, 24576, 28672, 28736, 28744, 0, 16384, 24576, + 28672, 28736, 28744, 28746, 0, 16384, 24576, 28672, + 28736, 28744, 0, 16384, 24576, 28672, 28736, 28752, + 28748, 0, 16384, 24576, 28672, 28736, 28752, 28748, + 0, 16384, 24576, 28672, 28736, 28752, 28753, 28750, + 0, 16384, 24576, 28672, 28736, 0, 16384, 24576, + 28672, 28736, 28752, 0, 16384, 24576, 28672, 28736, + 28752, 0, 16384, 24576, 28672, 28736, 28752, 28754, + 0, 16384, 24576, 28672, 28736, 28752, 0, 16384, + 24576, 28672, 28736, 28752, 28756, 0, 16384, 24576, + 28672, 28736, 28752, 28756, 0, 16384, 24576, 28672, + 28736, 28752, 28760, 28758, 0, 16384, 24576, 28672, + 28736, 28752, 0, 16384, 24576, 28672, 28736, 28768, + 28760, 0, 16384, 24576, 28672, 28736, 28768, 28760, + 0, 16384, 24576, 28672, 28736, 28768, 28760, 28762, + 0, 16384, 24576, 28672, 28736, 28768, 28760, 0, + 16384, 24576, 28672, 28736, 28768, 28769, 28764, 0, + 16384, 24576, 28672, 28736, 28768, 28769, 28764, 0, + 16384, 24576, 28672, 28736, 28768, 28769, 28764, 28766, + 0, 16384, 24576, 28672, 28736, 0, 16384, 24576, + 28672, 28800, 28768, 0, 16384, 24576, 28672, 28800, + 28768, 0, 16384, 24576, 28672, 28800, 28768, 28770, + 0, 16384, 24576, 28672, 28800, 28768, 0, 16384, + 24576, 28672, 28800, 28768, 28772, 0, 16384, 24576, + 28672, 28800, 28768, 28772, 0, 16384, 24576, 28672, + 28800, 28768, 28776, 28774, 0, 16384, 24576, 28672, + 28800, 28768, 0, 16384, 24576, 28672, 28800, 28768, + 28776, 0, 16384, 24576, 28672, 28800, 28768, 28776, + 0, 16384, 24576, 28672, 28800, 28768, 28776, 28778, + 0, 16384, 24576, 28672, 28800, 28768, 28776, 0, + 16384, 24576, 28672, 28800, 28768, 28784, 28780, 0, + 16384, 24576, 28672, 28800, 28768, 28784, 28780, 0, + 16384, 24576, 28672, 28800, 28768, 28784, 28785, 28782, + 0, 16384, 24576, 28672, 28800, 28768, 0, 16384, + 24576, 28672, 28800, 28801, 28784, 0, 16384, 24576, + 28672, 28800, 28801, 28784, 0, 16384, 24576, 28672, + 28800, 28801, 28784, 28786, 0, 16384, 24576, 28672, + 28800, 28801, 28784, 0, 16384, 24576, 28672, 28800, + 28801, 28784, 28788, 0, 16384, 24576, 28672, 28800, + 28801, 28784, 28788, 0, 16384, 24576, 28672, 28800, + 28801, 28784, 28792, 28790, 0, 16384, 24576, 28672, + 28800, 28801, 28784, 0, 16384, 24576, 28672, 28800, + 28801, 28784, 28792, 0, 16384, 24576, 28672, 28800, + 28801, 28803, 28792, 0, 16384, 24576, 28672, 28800, + 28801, 28803, 28792, 28794, 0, 16384, 24576, 28672, + 28800, 28801, 28803, 28792, 0, 16384, 24576, 28672, + 28800, 28801, 28803, 28792, 28796, 0, 16384, 24576, + 28672, 28800, 28801, 28803, 28792, 28796, 0, 16384, + 24576, 28672, 28800, 28801, 28803, 28792, 28796, 28798, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28800, 0, 16384, 24576, 28672, 28800, 0, 16384, + 24576, 28672, 28800, 28802, 0, 16384, 24576, 28672, + 28800, 0, 16384, 24576, 28672, 28800, 28804, 0, + 16384, 24576, 28672, 28800, 28804, 0, 16384, 24576, + 28672, 28800, 28808, 28806, 0, 16384, 24576, 28672, + 28800, 0, 16384, 24576, 28672, 28800, 28808, 0, + 16384, 24576, 28672, 28800, 28808, 0, 16384, 24576, + 28672, 28800, 28808, 28810, 0, 16384, 24576, 28672, + 28800, 28808, 0, 16384, 24576, 28672, 28800, 28816, + 28812, 0, 16384, 24576, 28672, 28800, 28816, 28812, + 0, 16384, 24576, 28672, 28800, 28816, 28817, 28814, + 0, 16384, 24576, 28672, 28800, 0, 16384, 24576, + 28672, 28800, 28816, 0, 16384, 24576, 28672, 28800, + 28816, 0, 16384, 24576, 28672, 28800, 28816, 28818, + 0, 16384, 24576, 28672, 28800, 28816, 0, 16384, + 24576, 28672, 28800, 28816, 28820, 0, 16384, 24576, + 28672, 28800, 28816, 28820, 0, 16384, 24576, 28672, + 28800, 28816, 28824, 28822, 0, 16384, 24576, 28672, + 28800, 28816, 0, 16384, 24576, 28672, 28800, 28832, + 28824, 0, 16384, 24576, 28672, 28800, 28832, 28824, + 0, 16384, 24576, 28672, 28800, 28832, 28824, 28826, + 0, 16384, 24576, 28672, 28800, 28832, 28824, 0, + 16384, 24576, 28672, 28800, 28832, 28833, 28828, 0, + 16384, 24576, 28672, 28800, 28832, 28833, 28828, 0, + 16384, 24576, 28672, 28800, 28832, 28833, 28828, 28830, + 0, 16384, 24576, 28672, 28800, 0, 16384, 24576, + 28672, 28800, 28832, 0, 16384, 24576, 28672, 28800, + 28832, 0, 16384, 24576, 28672, 28800, 28832, 28834, + 0, 16384, 24576, 28672, 28800, 28832, 0, 16384, + 24576, 28672, 28800, 28832, 28836, 0, 16384, 24576, + 28672, 28800, 28832, 28836, 0, 16384, 24576, 28672, + 28800, 28832, 28840, 28838, 0, 16384, 24576, 28672, + 28800, 28832, 0, 16384, 24576, 28672, 28800, 28832, + 28840, 0, 16384, 24576, 28672, 28800, 28832, 28840, + 0, 16384, 24576, 28672, 28800, 28832, 28840, 28842, + 0, 16384, 24576, 28672, 28800, 28832, 28840, 0, + 16384, 24576, 28672, 28800, 28832, 28848, 28844, 0, + 16384, 24576, 28672, 28800, 28832, 28848, 28844, 0, + 16384, 24576, 28672, 28800, 28832, 28848, 28849, 28846, + 0, 16384, 24576, 28672, 28800, 28832, 0, 16384, + 24576, 28672, 28800, 28864, 28848, 0, 16384, 24576, + 28672, 28800, 28864, 28848, 0, 16384, 24576, 28672, + 28800, 28864, 28848, 28850, 0, 16384, 24576, 28672, + 28800, 28864, 28848, 0, 16384, 24576, 28672, 28800, + 28864, 28848, 28852, 0, 16384, 24576, 28672, 28800, + 28864, 28848, 28852, 0, 16384, 24576, 28672, 28800, + 28864, 28848, 28856, 28854, 0, 16384, 24576, 28672, + 28800, 28864, 28848, 0, 16384, 24576, 28672, 28800, + 28864, 28865, 28856, 0, 16384, 24576, 28672, 28800, + 28864, 28865, 28856, 0, 16384, 24576, 28672, 28800, + 28864, 28865, 28856, 28858, 0, 16384, 24576, 28672, + 28800, 28864, 28865, 28856, 0, 16384, 24576, 28672, + 28800, 28864, 28865, 28856, 28860, 0, 16384, 24576, + 28672, 28800, 28864, 28865, 28867, 28860, 0, 16384, + 24576, 28672, 28800, 28864, 28865, 28867, 28860, 28862, + 0, 16384, 24576, 28672, 28800, 0, 16384, 24576, + 28672, 28928, 28864, 0, 16384, 24576, 28672, 28928, + 28864, 0, 16384, 24576, 28672, 28928, 28864, 28866, + 0, 16384, 24576, 28672, 28928, 28864, 0, 16384, + 24576, 28672, 28928, 28864, 28868, 0, 16384, 24576, + 28672, 28928, 28864, 28868, 0, 16384, 24576, 28672, + 28928, 28864, 28872, 28870, 0, 16384, 24576, 28672, + 28928, 28864, 0, 16384, 24576, 28672, 28928, 28864, + 28872, 0, 16384, 24576, 28672, 28928, 28864, 28872, + 0, 16384, 24576, 28672, 28928, 28864, 28872, 28874, + 0, 16384, 24576, 28672, 28928, 28864, 28872, 0, + 16384, 24576, 28672, 28928, 28864, 28880, 28876, 0, + 16384, 24576, 28672, 28928, 28864, 28880, 28876, 0, + 16384, 24576, 28672, 28928, 28864, 28880, 28881, 28878, + 0, 16384, 24576, 28672, 28928, 28864, 0, 16384, + 24576, 28672, 28928, 28864, 28880, 0, 16384, 24576, + 28672, 28928, 28864, 28880, 0, 16384, 24576, 28672, + 28928, 28864, 28880, 28882, 0, 16384, 24576, 28672, + 28928, 28864, 28880, 0, 16384, 24576, 28672, 28928, + 28864, 28880, 28884, 0, 16384, 24576, 28672, 28928, + 28864, 28880, 28884, 0, 16384, 24576, 28672, 28928, + 28864, 28880, 28888, 28886, 0, 16384, 24576, 28672, + 28928, 28864, 28880, 0, 16384, 24576, 28672, 28928, + 28864, 28896, 28888, 0, 16384, 24576, 28672, 28928, + 28864, 28896, 28888, 0, 16384, 24576, 28672, 28928, + 28864, 28896, 28888, 28890, 0, 16384, 24576, 28672, + 28928, 28864, 28896, 28888, 0, 16384, 24576, 28672, + 28928, 28864, 28896, 28897, 28892, 0, 16384, 24576, + 28672, 28928, 28864, 28896, 28897, 28892, 0, 16384, + 24576, 28672, 28928, 28864, 28896, 28897, 28892, 28894, + 0, 16384, 24576, 28672, 28928, 28864, 0, 16384, + 24576, 28672, 28928, 28929, 28896, 0, 16384, 24576, + 28672, 28928, 28929, 28896, 0, 16384, 24576, 28672, + 28928, 28929, 28896, 28898, 0, 16384, 24576, 28672, + 28928, 28929, 28896, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28900, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28900, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28904, 28902, 0, 16384, 24576, 28672, + 28928, 28929, 28896, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28904, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28904, 0, 16384, 24576, 28672, 28928, + 28929, 28896, 28904, 28906, 0, 16384, 24576, 28672, + 28928, 28929, 28896, 28904, 0, 16384, 24576, 28672, + 28928, 28929, 28896, 28912, 28908, 0, 16384, 24576, + 28672, 28928, 28929, 28896, 28912, 28908, 0, 16384, + 24576, 28672, 28928, 28929, 28896, 28912, 28913, 28910, + 0, 16384, 24576, 28672, 28928, 28929, 28896, 0, + 16384, 24576, 28672, 28928, 28929, 28896, 28912, 0, + 16384, 24576, 28672, 28928, 28929, 28931, 28912, 0, + 16384, 24576, 28672, 28928, 28929, 28931, 28912, 28914, + 0, 16384, 24576, 28672, 28928, 28929, 28931, 28912, + 0, 16384, 24576, 28672, 28928, 28929, 28931, 28912, + 28916, 0, 16384, 24576, 28672, 28928, 28929, 28931, + 28912, 28916, 0, 16384, 24576, 28672, 28928, 28929, + 28931, 28912, 28920, 28918, 0, 16384, 24576, 28672, + 28928, 28929, 28931, 28912, 0, 16384, 24576, 28672, + 28928, 28929, 28931, 28912, 28920, 0, 16384, 24576, + 28672, 28928, 28929, 28931, 28912, 28920, 0, 16384, + 24576, 28672, 28928, 28929, 28931, 28912, 28920, 28922, + 0, 16384, 24576, 28672, 28928, 28929, 28931, 28935, + 28920, 0, 16384, 24576, 28672, 28928, 28929, 28931, + 28935, 28920, 28924, 0, 16384, 24576, 28672, 28928, + 28929, 28931, 28935, 28920, 28924, 0, 16384, 24576, + 28672, 28928, 28929, 28931, 28935, 28920, 28924, 28926, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 28928, 0, 16384, 24576, 28672, 28928, 0, 16384, + 24576, 28672, 28928, 28930, 0, 16384, 24576, 28672, + 28928, 0, 16384, 24576, 28672, 28928, 28932, 0, + 16384, 24576, 28672, 28928, 28932, 0, 16384, 24576, + 28672, 28928, 28936, 28934, 0, 16384, 24576, 28672, + 28928, 0, 16384, 24576, 28672, 28928, 28936, 0, + 16384, 24576, 28672, 28928, 28936, 0, 16384, 24576, + 28672, 28928, 28936, 28938, 0, 16384, 24576, 28672, + 28928, 28936, 0, 16384, 24576, 28672, 28928, 28944, + 28940, 0, 16384, 24576, 28672, 28928, 28944, 28940, + 0, 16384, 24576, 28672, 28928, 28944, 28945, 28942, + 0, 16384, 24576, 28672, 28928, 0, 16384, 24576, + 28672, 28928, 28944, 0, 16384, 24576, 28672, 28928, + 28944, 0, 16384, 24576, 28672, 28928, 28944, 28946, + 0, 16384, 24576, 28672, 28928, 28944, 0, 16384, + 24576, 28672, 28928, 28944, 28948, 0, 16384, 24576, + 28672, 28928, 28944, 28948, 0, 16384, 24576, 28672, + 28928, 28944, 28952, 28950, 0, 16384, 24576, 28672, + 28928, 28944, 0, 16384, 24576, 28672, 28928, 28960, + 28952, 0, 16384, 24576, 28672, 28928, 28960, 28952, + 0, 16384, 24576, 28672, 28928, 28960, 28952, 28954, + 0, 16384, 24576, 28672, 28928, 28960, 28952, 0, + 16384, 24576, 28672, 28928, 28960, 28961, 28956, 0, + 16384, 24576, 28672, 28928, 28960, 28961, 28956, 0, + 16384, 24576, 28672, 28928, 28960, 28961, 28956, 28958, + 0, 16384, 24576, 28672, 28928, 0, 16384, 24576, + 28672, 28928, 28960, 0, 16384, 24576, 28672, 28928, + 28960, 0, 16384, 24576, 28672, 28928, 28960, 28962, + 0, 16384, 24576, 28672, 28928, 28960, 0, 16384, + 24576, 28672, 28928, 28960, 28964, 0, 16384, 24576, + 28672, 28928, 28960, 28964, 0, 16384, 24576, 28672, + 28928, 28960, 28968, 28966, 0, 16384, 24576, 28672, + 28928, 28960, 0, 16384, 24576, 28672, 28928, 28960, + 28968, 0, 16384, 24576, 28672, 28928, 28960, 28968, + 0, 16384, 24576, 28672, 28928, 28960, 28968, 28970, + 0, 16384, 24576, 28672, 28928, 28960, 28968, 0, + 16384, 24576, 28672, 28928, 28960, 28976, 28972, 0, + 16384, 24576, 28672, 28928, 28960, 28976, 28972, 0, + 16384, 24576, 28672, 28928, 28960, 28976, 28977, 28974, + 0, 16384, 24576, 28672, 28928, 28960, 0, 16384, + 24576, 28672, 28928, 28992, 28976, 0, 16384, 24576, + 28672, 28928, 28992, 28976, 0, 16384, 24576, 28672, + 28928, 28992, 28976, 28978, 0, 16384, 24576, 28672, + 28928, 28992, 28976, 0, 16384, 24576, 28672, 28928, + 28992, 28976, 28980, 0, 16384, 24576, 28672, 28928, + 28992, 28976, 28980, 0, 16384, 24576, 28672, 28928, + 28992, 28976, 28984, 28982, 0, 16384, 24576, 28672, + 28928, 28992, 28976, 0, 16384, 24576, 28672, 28928, + 28992, 28993, 28984, 0, 16384, 24576, 28672, 28928, + 28992, 28993, 28984, 0, 16384, 24576, 28672, 28928, + 28992, 28993, 28984, 28986, 0, 16384, 24576, 28672, + 28928, 28992, 28993, 28984, 0, 16384, 24576, 28672, + 28928, 28992, 28993, 28984, 28988, 0, 16384, 24576, + 28672, 28928, 28992, 28993, 28995, 28988, 0, 16384, + 24576, 28672, 28928, 28992, 28993, 28995, 28988, 28990, + 0, 16384, 24576, 28672, 28928, 0, 16384, 24576, + 28672, 28928, 28992, 0, 16384, 24576, 28672, 28928, + 28992, 0, 16384, 24576, 28672, 28928, 28992, 28994, + 0, 16384, 24576, 28672, 28928, 28992, 0, 16384, + 24576, 28672, 28928, 28992, 28996, 0, 16384, 24576, + 28672, 28928, 28992, 28996, 0, 16384, 24576, 28672, + 28928, 28992, 29000, 28998, 0, 16384, 24576, 28672, + 28928, 28992, 0, 16384, 24576, 28672, 28928, 28992, + 29000, 0, 16384, 24576, 28672, 28928, 28992, 29000, + 0, 16384, 24576, 28672, 28928, 28992, 29000, 29002, + 0, 16384, 24576, 28672, 28928, 28992, 29000, 0, + 16384, 24576, 28672, 28928, 28992, 29008, 29004, 0, + 16384, 24576, 28672, 28928, 28992, 29008, 29004, 0, + 16384, 24576, 28672, 28928, 28992, 29008, 29009, 29006, + 0, 16384, 24576, 28672, 28928, 28992, 0, 16384, + 24576, 28672, 28928, 28992, 29008, 0, 16384, 24576, + 28672, 28928, 28992, 29008, 0, 16384, 24576, 28672, + 28928, 28992, 29008, 29010, 0, 16384, 24576, 28672, + 28928, 28992, 29008, 0, 16384, 24576, 28672, 28928, + 28992, 29008, 29012, 0, 16384, 24576, 28672, 28928, + 28992, 29008, 29012, 0, 16384, 24576, 28672, 28928, + 28992, 29008, 29016, 29014, 0, 16384, 24576, 28672, + 28928, 28992, 29008, 0, 16384, 24576, 28672, 28928, + 28992, 29024, 29016, 0, 16384, 24576, 28672, 28928, + 28992, 29024, 29016, 0, 16384, 24576, 28672, 28928, + 28992, 29024, 29016, 29018, 0, 16384, 24576, 28672, + 28928, 28992, 29024, 29016, 0, 16384, 24576, 28672, + 28928, 28992, 29024, 29025, 29020, 0, 16384, 24576, + 28672, 28928, 28992, 29024, 29025, 29020, 0, 16384, + 24576, 28672, 28928, 28992, 29024, 29025, 29020, 29022, + 0, 16384, 24576, 28672, 28928, 28992, 0, 16384, + 24576, 28672, 28928, 29056, 29024, 0, 16384, 24576, + 28672, 28928, 29056, 29024, 0, 16384, 24576, 28672, + 28928, 29056, 29024, 29026, 0, 16384, 24576, 28672, + 28928, 29056, 29024, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29028, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29028, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29032, 29030, 0, 16384, 24576, 28672, + 28928, 29056, 29024, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29032, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29032, 0, 16384, 24576, 28672, 28928, + 29056, 29024, 29032, 29034, 0, 16384, 24576, 28672, + 28928, 29056, 29024, 29032, 0, 16384, 24576, 28672, + 28928, 29056, 29024, 29040, 29036, 0, 16384, 24576, + 28672, 28928, 29056, 29024, 29040, 29036, 0, 16384, + 24576, 28672, 28928, 29056, 29024, 29040, 29041, 29038, + 0, 16384, 24576, 28672, 28928, 29056, 29024, 0, + 16384, 24576, 28672, 28928, 29056, 29057, 29040, 0, + 16384, 24576, 28672, 28928, 29056, 29057, 29040, 0, + 16384, 24576, 28672, 28928, 29056, 29057, 29040, 29042, + 0, 16384, 24576, 28672, 28928, 29056, 29057, 29040, + 0, 16384, 24576, 28672, 28928, 29056, 29057, 29040, + 29044, 0, 16384, 24576, 28672, 28928, 29056, 29057, + 29040, 29044, 0, 16384, 24576, 28672, 28928, 29056, + 29057, 29040, 29048, 29046, 0, 16384, 24576, 28672, + 28928, 29056, 29057, 29040, 0, 16384, 24576, 28672, + 28928, 29056, 29057, 29040, 29048, 0, 16384, 24576, + 28672, 28928, 29056, 29057, 29059, 29048, 0, 16384, + 24576, 28672, 28928, 29056, 29057, 29059, 29048, 29050, + 0, 16384, 24576, 28672, 28928, 29056, 29057, 29059, + 29048, 0, 16384, 24576, 28672, 28928, 29056, 29057, + 29059, 29048, 29052, 0, 16384, 24576, 28672, 28928, + 29056, 29057, 29059, 29048, 29052, 0, 16384, 24576, + 28672, 28928, 29056, 29057, 29059, 29048, 29052, 29054, + 0, 16384, 24576, 28672, 28928, 0, 16384, 24576, + 28672, 29184, 29056, 0, 16384, 24576, 28672, 29184, + 29056, 0, 16384, 24576, 28672, 29184, 29056, 29058, + 0, 16384, 24576, 28672, 29184, 29056, 0, 16384, + 24576, 28672, 29184, 29056, 29060, 0, 16384, 24576, + 28672, 29184, 29056, 29060, 0, 16384, 24576, 28672, + 29184, 29056, 29064, 29062, 0, 16384, 24576, 28672, + 29184, 29056, 0, 16384, 24576, 28672, 29184, 29056, + 29064, 0, 16384, 24576, 28672, 29184, 29056, 29064, + 0, 16384, 24576, 28672, 29184, 29056, 29064, 29066, + 0, 16384, 24576, 28672, 29184, 29056, 29064, 0, + 16384, 24576, 28672, 29184, 29056, 29072, 29068, 0, + 16384, 24576, 28672, 29184, 29056, 29072, 29068, 0, + 16384, 24576, 28672, 29184, 29056, 29072, 29073, 29070, + 0, 16384, 24576, 28672, 29184, 29056, 0, 16384, + 24576, 28672, 29184, 29056, 29072, 0, 16384, 24576, + 28672, 29184, 29056, 29072, 0, 16384, 24576, 28672, + 29184, 29056, 29072, 29074, 0, 16384, 24576, 28672, + 29184, 29056, 29072, 0, 16384, 24576, 28672, 29184, + 29056, 29072, 29076, 0, 16384, 24576, 28672, 29184, + 29056, 29072, 29076, 0, 16384, 24576, 28672, 29184, + 29056, 29072, 29080, 29078, 0, 16384, 24576, 28672, + 29184, 29056, 29072, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29080, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29080, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29080, 29082, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 29080, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 29089, 29084, 0, 16384, 24576, + 28672, 29184, 29056, 29088, 29089, 29084, 0, 16384, + 24576, 28672, 29184, 29056, 29088, 29089, 29084, 29086, + 0, 16384, 24576, 28672, 29184, 29056, 0, 16384, + 24576, 28672, 29184, 29056, 29088, 0, 16384, 24576, + 28672, 29184, 29056, 29088, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 29090, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29092, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29092, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29096, 29094, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29096, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29096, 0, 16384, 24576, 28672, 29184, + 29056, 29088, 29096, 29098, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 29096, 0, 16384, 24576, 28672, + 29184, 29056, 29088, 29104, 29100, 0, 16384, 24576, + 28672, 29184, 29056, 29088, 29104, 29100, 0, 16384, + 24576, 28672, 29184, 29056, 29088, 29104, 29105, 29102, + 0, 16384, 24576, 28672, 29184, 29056, 29088, 0, + 16384, 24576, 28672, 29184, 29056, 29120, 29104, 0, + 16384, 24576, 28672, 29184, 29056, 29120, 29104, 0, + 16384, 24576, 28672, 29184, 29056, 29120, 29104, 29106, + 0, 16384, 24576, 28672, 29184, 29056, 29120, 29104, + 0, 16384, 24576, 28672, 29184, 29056, 29120, 29104, + 29108, 0, 16384, 24576, 28672, 29184, 29056, 29120, + 29104, 29108, 0, 16384, 24576, 28672, 29184, 29056, + 29120, 29104, 29112, 29110, 0, 16384, 24576, 28672, + 29184, 29056, 29120, 29104, 0, 16384, 24576, 28672, + 29184, 29056, 29120, 29121, 29112, 0, 16384, 24576, + 28672, 29184, 29056, 29120, 29121, 29112, 0, 16384, + 24576, 28672, 29184, 29056, 29120, 29121, 29112, 29114, + 0, 16384, 24576, 28672, 29184, 29056, 29120, 29121, + 29112, 0, 16384, 24576, 28672, 29184, 29056, 29120, + 29121, 29112, 29116, 0, 16384, 24576, 28672, 29184, + 29056, 29120, 29121, 29123, 29116, 0, 16384, 24576, + 28672, 29184, 29056, 29120, 29121, 29123, 29116, 29118, + 0, 16384, 24576, 28672, 29184, 29056, 0, 16384, + 24576, 28672, 29184, 29185, 29120, 0, 16384, 24576, + 28672, 29184, 29185, 29120, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 29122, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29124, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29124, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29128, 29126, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29128, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29128, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29128, 29130, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 29128, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 29136, 29132, 0, 16384, 24576, + 28672, 29184, 29185, 29120, 29136, 29132, 0, 16384, + 24576, 28672, 29184, 29185, 29120, 29136, 29137, 29134, + 0, 16384, 24576, 28672, 29184, 29185, 29120, 0, + 16384, 24576, 28672, 29184, 29185, 29120, 29136, 0, + 16384, 24576, 28672, 29184, 29185, 29120, 29136, 0, + 16384, 24576, 28672, 29184, 29185, 29120, 29136, 29138, + 0, 16384, 24576, 28672, 29184, 29185, 29120, 29136, + 0, 16384, 24576, 28672, 29184, 29185, 29120, 29136, + 29140, 0, 16384, 24576, 28672, 29184, 29185, 29120, + 29136, 29140, 0, 16384, 24576, 28672, 29184, 29185, + 29120, 29136, 29144, 29142, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 29136, 0, 16384, 24576, 28672, + 29184, 29185, 29120, 29152, 29144, 0, 16384, 24576, + 28672, 29184, 29185, 29120, 29152, 29144, 0, 16384, + 24576, 28672, 29184, 29185, 29120, 29152, 29144, 29146, + 0, 16384, 24576, 28672, 29184, 29185, 29120, 29152, + 29144, 0, 16384, 24576, 28672, 29184, 29185, 29120, + 29152, 29153, 29148, 0, 16384, 24576, 28672, 29184, + 29185, 29120, 29152, 29153, 29148, 0, 16384, 24576, + 28672, 29184, 29185, 29120, 29152, 29153, 29148, 29150, + 0, 16384, 24576, 28672, 29184, 29185, 29120, 0, + 16384, 24576, 28672, 29184, 29185, 29120, 29152, 0, + 16384, 24576, 28672, 29184, 29185, 29187, 29152, 0, + 16384, 24576, 28672, 29184, 29185, 29187, 29152, 29154, + 0, 16384, 24576, 28672, 29184, 29185, 29187, 29152, + 0, 16384, 24576, 28672, 29184, 29185, 29187, 29152, + 29156, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29152, 29156, 0, 16384, 24576, 28672, 29184, 29185, + 29187, 29152, 29160, 29158, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29152, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29152, 29160, 0, 16384, 24576, + 28672, 29184, 29185, 29187, 29152, 29160, 0, 16384, + 24576, 28672, 29184, 29185, 29187, 29152, 29160, 29162, + 0, 16384, 24576, 28672, 29184, 29185, 29187, 29152, + 29160, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29152, 29168, 29164, 0, 16384, 24576, 28672, 29184, + 29185, 29187, 29152, 29168, 29164, 0, 16384, 24576, + 28672, 29184, 29185, 29187, 29152, 29168, 29169, 29166, + 0, 16384, 24576, 28672, 29184, 29185, 29187, 29152, + 0, 16384, 24576, 28672, 29184, 29185, 29187, 29152, + 29168, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29152, 29168, 0, 16384, 24576, 28672, 29184, 29185, + 29187, 29152, 29168, 29170, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29191, 29168, 0, 16384, 24576, + 28672, 29184, 29185, 29187, 29191, 29168, 29172, 0, + 16384, 24576, 28672, 29184, 29185, 29187, 29191, 29168, + 29172, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29191, 29168, 29176, 29174, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29191, 29168, 0, 16384, 24576, + 28672, 29184, 29185, 29187, 29191, 29168, 29176, 0, + 16384, 24576, 28672, 29184, 29185, 29187, 29191, 29168, + 29176, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29191, 29168, 29176, 29178, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29191, 29168, 29176, 0, 16384, + 24576, 28672, 29184, 29185, 29187, 29191, 29168, 29176, + 29180, 0, 16384, 24576, 28672, 29184, 29185, 29187, + 29191, 29168, 29176, 29180, 0, 16384, 24576, 28672, + 29184, 29185, 29187, 29191, 29168, 29176, 29180, 29182, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 29184, 0, 16384, 24576, 28672, 29184, 0, 16384, + 24576, 28672, 29184, 29186, 0, 16384, 24576, 28672, + 29184, 0, 16384, 24576, 28672, 29184, 29188, 0, + 16384, 24576, 28672, 29184, 29188, 0, 16384, 24576, + 28672, 29184, 29192, 29190, 0, 16384, 24576, 28672, + 29184, 0, 16384, 24576, 28672, 29184, 29192, 0, + 16384, 24576, 28672, 29184, 29192, 0, 16384, 24576, + 28672, 29184, 29192, 29194, 0, 16384, 24576, 28672, + 29184, 29192, 0, 16384, 24576, 28672, 29184, 29200, + 29196, 0, 16384, 24576, 28672, 29184, 29200, 29196, + 0, 16384, 24576, 28672, 29184, 29200, 29201, 29198, + 0, 16384, 24576, 28672, 29184, 0, 16384, 24576, + 28672, 29184, 29200, 0, 16384, 24576, 28672, 29184, + 29200, 0, 16384, 24576, 28672, 29184, 29200, 29202, + 0, 16384, 24576, 28672, 29184, 29200, 0, 16384, + 24576, 28672, 29184, 29200, 29204, 0, 16384, 24576, + 28672, 29184, 29200, 29204, 0, 16384, 24576, 28672, + 29184, 29200, 29208, 29206, 0, 16384, 24576, 28672, + 29184, 29200, 0, 16384, 24576, 28672, 29184, 29216, + 29208, 0, 16384, 24576, 28672, 29184, 29216, 29208, + 0, 16384, 24576, 28672, 29184, 29216, 29208, 29210, + 0, 16384, 24576, 28672, 29184, 29216, 29208, 0, + 16384, 24576, 28672, 29184, 29216, 29217, 29212, 0, + 16384, 24576, 28672, 29184, 29216, 29217, 29212, 0, + 16384, 24576, 28672, 29184, 29216, 29217, 29212, 29214, + 0, 16384, 24576, 28672, 29184, 0, 16384, 24576, + 28672, 29184, 29216, 0, 16384, 24576, 28672, 29184, + 29216, 0, 16384, 24576, 28672, 29184, 29216, 29218, + 0, 16384, 24576, 28672, 29184, 29216, 0, 16384, + 24576, 28672, 29184, 29216, 29220, 0, 16384, 24576, + 28672, 29184, 29216, 29220, 0, 16384, 24576, 28672, + 29184, 29216, 29224, 29222, 0, 16384, 24576, 28672, + 29184, 29216, 0, 16384, 24576, 28672, 29184, 29216, + 29224, 0, 16384, 24576, 28672, 29184, 29216, 29224, + 0, 16384, 24576, 28672, 29184, 29216, 29224, 29226, + 0, 16384, 24576, 28672, 29184, 29216, 29224, 0, + 16384, 24576, 28672, 29184, 29216, 29232, 29228, 0, + 16384, 24576, 28672, 29184, 29216, 29232, 29228, 0, + 16384, 24576, 28672, 29184, 29216, 29232, 29233, 29230, + 0, 16384, 24576, 28672, 29184, 29216, 0, 16384, + 24576, 28672, 29184, 29248, 29232, 0, 16384, 24576, + 28672, 29184, 29248, 29232, 0, 16384, 24576, 28672, + 29184, 29248, 29232, 29234, 0, 16384, 24576, 28672, + 29184, 29248, 29232, 0, 16384, 24576, 28672, 29184, + 29248, 29232, 29236, 0, 16384, 24576, 28672, 29184, + 29248, 29232, 29236, 0, 16384, 24576, 28672, 29184, + 29248, 29232, 29240, 29238, 0, 16384, 24576, 28672, + 29184, 29248, 29232, 0, 16384, 24576, 28672, 29184, + 29248, 29249, 29240, 0, 16384, 24576, 28672, 29184, + 29248, 29249, 29240, 0, 16384, 24576, 28672, 29184, + 29248, 29249, 29240, 29242, 0, 16384, 24576, 28672, + 29184, 29248, 29249, 29240, 0, 16384, 24576, 28672, + 29184, 29248, 29249, 29240, 29244, 0, 16384, 24576, + 28672, 29184, 29248, 29249, 29251, 29244, 0, 16384, + 24576, 28672, 29184, 29248, 29249, 29251, 29244, 29246, + 0, 16384, 24576, 28672, 29184, 0, 16384, 24576, + 28672, 29184, 29248, 0, 16384, 24576, 28672, 29184, + 29248, 0, 16384, 24576, 28672, 29184, 29248, 29250, + 0, 16384, 24576, 28672, 29184, 29248, 0, 16384, + 24576, 28672, 29184, 29248, 29252, 0, 16384, 24576, + 28672, 29184, 29248, 29252, 0, 16384, 24576, 28672, + 29184, 29248, 29256, 29254, 0, 16384, 24576, 28672, + 29184, 29248, 0, 16384, 24576, 28672, 29184, 29248, + 29256, 0, 16384, 24576, 28672, 29184, 29248, 29256, + 0, 16384, 24576, 28672, 29184, 29248, 29256, 29258, + 0, 16384, 24576, 28672, 29184, 29248, 29256, 0, + 16384, 24576, 28672, 29184, 29248, 29264, 29260, 0, + 16384, 24576, 28672, 29184, 29248, 29264, 29260, 0, + 16384, 24576, 28672, 29184, 29248, 29264, 29265, 29262, + 0, 16384, 24576, 28672, 29184, 29248, 0, 16384, + 24576, 28672, 29184, 29248, 29264, 0, 16384, 24576, + 28672, 29184, 29248, 29264, 0, 16384, 24576, 28672, + 29184, 29248, 29264, 29266, 0, 16384, 24576, 28672, + 29184, 29248, 29264, 0, 16384, 24576, 28672, 29184, + 29248, 29264, 29268, 0, 16384, 24576, 28672, 29184, + 29248, 29264, 29268, 0, 16384, 24576, 28672, 29184, + 29248, 29264, 29272, 29270, 0, 16384, 24576, 28672, + 29184, 29248, 29264, 0, 16384, 24576, 28672, 29184, + 29248, 29280, 29272, 0, 16384, 24576, 28672, 29184, + 29248, 29280, 29272, 0, 16384, 24576, 28672, 29184, + 29248, 29280, 29272, 29274, 0, 16384, 24576, 28672, + 29184, 29248, 29280, 29272, 0, 16384, 24576, 28672, + 29184, 29248, 29280, 29281, 29276, 0, 16384, 24576, + 28672, 29184, 29248, 29280, 29281, 29276, 0, 16384, + 24576, 28672, 29184, 29248, 29280, 29281, 29276, 29278, + 0, 16384, 24576, 28672, 29184, 29248, 0, 16384, + 24576, 28672, 29184, 29312, 29280, 0, 16384, 24576, + 28672, 29184, 29312, 29280, 0, 16384, 24576, 28672, + 29184, 29312, 29280, 29282, 0, 16384, 24576, 28672, + 29184, 29312, 29280, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29284, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29284, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29288, 29286, 0, 16384, 24576, 28672, + 29184, 29312, 29280, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29288, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29288, 0, 16384, 24576, 28672, 29184, + 29312, 29280, 29288, 29290, 0, 16384, 24576, 28672, + 29184, 29312, 29280, 29288, 0, 16384, 24576, 28672, + 29184, 29312, 29280, 29296, 29292, 0, 16384, 24576, + 28672, 29184, 29312, 29280, 29296, 29292, 0, 16384, + 24576, 28672, 29184, 29312, 29280, 29296, 29297, 29294, + 0, 16384, 24576, 28672, 29184, 29312, 29280, 0, + 16384, 24576, 28672, 29184, 29312, 29313, 29296, 0, + 16384, 24576, 28672, 29184, 29312, 29313, 29296, 0, + 16384, 24576, 28672, 29184, 29312, 29313, 29296, 29298, + 0, 16384, 24576, 28672, 29184, 29312, 29313, 29296, + 0, 16384, 24576, 28672, 29184, 29312, 29313, 29296, + 29300, 0, 16384, 24576, 28672, 29184, 29312, 29313, + 29296, 29300, 0, 16384, 24576, 28672, 29184, 29312, + 29313, 29296, 29304, 29302, 0, 16384, 24576, 28672, + 29184, 29312, 29313, 29296, 0, 16384, 24576, 28672, + 29184, 29312, 29313, 29296, 29304, 0, 16384, 24576, + 28672, 29184, 29312, 29313, 29315, 29304, 0, 16384, + 24576, 28672, 29184, 29312, 29313, 29315, 29304, 29306, + 0, 16384, 24576, 28672, 29184, 29312, 29313, 29315, + 29304, 0, 16384, 24576, 28672, 29184, 29312, 29313, + 29315, 29304, 29308, 0, 16384, 24576, 28672, 29184, + 29312, 29313, 29315, 29304, 29308, 0, 16384, 24576, + 28672, 29184, 29312, 29313, 29315, 29304, 29308, 29310, + 0, 16384, 24576, 28672, 29184, 0, 16384, 24576, + 28672, 29184, 29312, 0, 16384, 24576, 28672, 29184, + 29312, 0, 16384, 24576, 28672, 29184, 29312, 29314, + 0, 16384, 24576, 28672, 29184, 29312, 0, 16384, + 24576, 28672, 29184, 29312, 29316, 0, 16384, 24576, + 28672, 29184, 29312, 29316, 0, 16384, 24576, 28672, + 29184, 29312, 29320, 29318, 0, 16384, 24576, 28672, + 29184, 29312, 0, 16384, 24576, 28672, 29184, 29312, + 29320, 0, 16384, 24576, 28672, 29184, 29312, 29320, + 0, 16384, 24576, 28672, 29184, 29312, 29320, 29322, + 0, 16384, 24576, 28672, 29184, 29312, 29320, 0, + 16384, 24576, 28672, 29184, 29312, 29328, 29324, 0, + 16384, 24576, 28672, 29184, 29312, 29328, 29324, 0, + 16384, 24576, 28672, 29184, 29312, 29328, 29329, 29326, + 0, 16384, 24576, 28672, 29184, 29312, 0, 16384, + 24576, 28672, 29184, 29312, 29328, 0, 16384, 24576, + 28672, 29184, 29312, 29328, 0, 16384, 24576, 28672, + 29184, 29312, 29328, 29330, 0, 16384, 24576, 28672, + 29184, 29312, 29328, 0, 16384, 24576, 28672, 29184, + 29312, 29328, 29332, 0, 16384, 24576, 28672, 29184, + 29312, 29328, 29332, 0, 16384, 24576, 28672, 29184, + 29312, 29328, 29336, 29334, 0, 16384, 24576, 28672, + 29184, 29312, 29328, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29336, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29336, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29336, 29338, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 29336, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 29345, 29340, 0, 16384, 24576, + 28672, 29184, 29312, 29344, 29345, 29340, 0, 16384, + 24576, 28672, 29184, 29312, 29344, 29345, 29340, 29342, + 0, 16384, 24576, 28672, 29184, 29312, 0, 16384, + 24576, 28672, 29184, 29312, 29344, 0, 16384, 24576, + 28672, 29184, 29312, 29344, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 29346, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29348, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29348, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29352, 29350, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29352, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29352, 0, 16384, 24576, 28672, 29184, + 29312, 29344, 29352, 29354, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 29352, 0, 16384, 24576, 28672, + 29184, 29312, 29344, 29360, 29356, 0, 16384, 24576, + 28672, 29184, 29312, 29344, 29360, 29356, 0, 16384, + 24576, 28672, 29184, 29312, 29344, 29360, 29361, 29358, + 0, 16384, 24576, 28672, 29184, 29312, 29344, 0, + 16384, 24576, 28672, 29184, 29312, 29376, 29360, 0, + 16384, 24576, 28672, 29184, 29312, 29376, 29360, 0, + 16384, 24576, 28672, 29184, 29312, 29376, 29360, 29362, + 0, 16384, 24576, 28672, 29184, 29312, 29376, 29360, + 0, 16384, 24576, 28672, 29184, 29312, 29376, 29360, + 29364, 0, 16384, 24576, 28672, 29184, 29312, 29376, + 29360, 29364, 0, 16384, 24576, 28672, 29184, 29312, + 29376, 29360, 29368, 29366, 0, 16384, 24576, 28672, + 29184, 29312, 29376, 29360, 0, 16384, 24576, 28672, + 29184, 29312, 29376, 29377, 29368, 0, 16384, 24576, + 28672, 29184, 29312, 29376, 29377, 29368, 0, 16384, + 24576, 28672, 29184, 29312, 29376, 29377, 29368, 29370, + 0, 16384, 24576, 28672, 29184, 29312, 29376, 29377, + 29368, 0, 16384, 24576, 28672, 29184, 29312, 29376, + 29377, 29368, 29372, 0, 16384, 24576, 28672, 29184, + 29312, 29376, 29377, 29379, 29372, 0, 16384, 24576, + 28672, 29184, 29312, 29376, 29377, 29379, 29372, 29374, + 0, 16384, 24576, 28672, 29184, 29312, 0, 16384, + 24576, 28672, 29184, 29440, 29376, 0, 16384, 24576, + 28672, 29184, 29440, 29376, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 29378, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29380, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29380, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29384, 29382, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29384, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29384, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29384, 29386, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 29384, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 29392, 29388, 0, 16384, 24576, + 28672, 29184, 29440, 29376, 29392, 29388, 0, 16384, + 24576, 28672, 29184, 29440, 29376, 29392, 29393, 29390, + 0, 16384, 24576, 28672, 29184, 29440, 29376, 0, + 16384, 24576, 28672, 29184, 29440, 29376, 29392, 0, + 16384, 24576, 28672, 29184, 29440, 29376, 29392, 0, + 16384, 24576, 28672, 29184, 29440, 29376, 29392, 29394, + 0, 16384, 24576, 28672, 29184, 29440, 29376, 29392, + 0, 16384, 24576, 28672, 29184, 29440, 29376, 29392, + 29396, 0, 16384, 24576, 28672, 29184, 29440, 29376, + 29392, 29396, 0, 16384, 24576, 28672, 29184, 29440, + 29376, 29392, 29400, 29398, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 29392, 0, 16384, 24576, 28672, + 29184, 29440, 29376, 29408, 29400, 0, 16384, 24576, + 28672, 29184, 29440, 29376, 29408, 29400, 0, 16384, + 24576, 28672, 29184, 29440, 29376, 29408, 29400, 29402, + 0, 16384, 24576, 28672, 29184, 29440, 29376, 29408, + 29400, 0, 16384, 24576, 28672, 29184, 29440, 29376, + 29408, 29409, 29404, 0, 16384, 24576, 28672, 29184, + 29440, 29376, 29408, 29409, 29404, 0, 16384, 24576, + 28672, 29184, 29440, 29376, 29408, 29409, 29404, 29406, + 0, 16384, 24576, 28672, 29184, 29440, 29376, 0, + 16384, 24576, 28672, 29184, 29440, 29441, 29408, 0, + 16384, 24576, 28672, 29184, 29440, 29441, 29408, 0, + 16384, 24576, 28672, 29184, 29440, 29441, 29408, 29410, + 0, 16384, 24576, 28672, 29184, 29440, 29441, 29408, + 0, 16384, 24576, 28672, 29184, 29440, 29441, 29408, + 29412, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29408, 29412, 0, 16384, 24576, 28672, 29184, 29440, + 29441, 29408, 29416, 29414, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29408, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29408, 29416, 0, 16384, 24576, + 28672, 29184, 29440, 29441, 29408, 29416, 0, 16384, + 24576, 28672, 29184, 29440, 29441, 29408, 29416, 29418, + 0, 16384, 24576, 28672, 29184, 29440, 29441, 29408, + 29416, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29408, 29424, 29420, 0, 16384, 24576, 28672, 29184, + 29440, 29441, 29408, 29424, 29420, 0, 16384, 24576, + 28672, 29184, 29440, 29441, 29408, 29424, 29425, 29422, + 0, 16384, 24576, 28672, 29184, 29440, 29441, 29408, + 0, 16384, 24576, 28672, 29184, 29440, 29441, 29408, + 29424, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29443, 29424, 0, 16384, 24576, 28672, 29184, 29440, + 29441, 29443, 29424, 29426, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29443, 29424, 0, 16384, 24576, + 28672, 29184, 29440, 29441, 29443, 29424, 29428, 0, + 16384, 24576, 28672, 29184, 29440, 29441, 29443, 29424, + 29428, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29443, 29424, 29432, 29430, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29443, 29424, 0, 16384, 24576, + 28672, 29184, 29440, 29441, 29443, 29424, 29432, 0, + 16384, 24576, 28672, 29184, 29440, 29441, 29443, 29424, + 29432, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29443, 29424, 29432, 29434, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29443, 29447, 29432, 0, 16384, + 24576, 28672, 29184, 29440, 29441, 29443, 29447, 29432, + 29436, 0, 16384, 24576, 28672, 29184, 29440, 29441, + 29443, 29447, 29432, 29436, 0, 16384, 24576, 28672, + 29184, 29440, 29441, 29443, 29447, 29432, 29436, 29438, + 0, 16384, 24576, 28672, 29184, 0, 16384, 24576, + 28672, 29696, 29440, 0, 16384, 24576, 28672, 29696, + 29440, 0, 16384, 24576, 28672, 29696, 29440, 29442, + 0, 16384, 24576, 28672, 29696, 29440, 0, 16384, + 24576, 28672, 29696, 29440, 29444, 0, 16384, 24576, + 28672, 29696, 29440, 29444, 0, 16384, 24576, 28672, + 29696, 29440, 29448, 29446, 0, 16384, 24576, 28672, + 29696, 29440, 0, 16384, 24576, 28672, 29696, 29440, + 29448, 0, 16384, 24576, 28672, 29696, 29440, 29448, + 0, 16384, 24576, 28672, 29696, 29440, 29448, 29450, + 0, 16384, 24576, 28672, 29696, 29440, 29448, 0, + 16384, 24576, 28672, 29696, 29440, 29456, 29452, 0, + 16384, 24576, 28672, 29696, 29440, 29456, 29452, 0, + 16384, 24576, 28672, 29696, 29440, 29456, 29457, 29454, + 0, 16384, 24576, 28672, 29696, 29440, 0, 16384, + 24576, 28672, 29696, 29440, 29456, 0, 16384, 24576, + 28672, 29696, 29440, 29456, 0, 16384, 24576, 28672, + 29696, 29440, 29456, 29458, 0, 16384, 24576, 28672, + 29696, 29440, 29456, 0, 16384, 24576, 28672, 29696, + 29440, 29456, 29460, 0, 16384, 24576, 28672, 29696, + 29440, 29456, 29460, 0, 16384, 24576, 28672, 29696, + 29440, 29456, 29464, 29462, 0, 16384, 24576, 28672, + 29696, 29440, 29456, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29464, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29464, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29464, 29466, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 29464, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 29473, 29468, 0, 16384, 24576, + 28672, 29696, 29440, 29472, 29473, 29468, 0, 16384, + 24576, 28672, 29696, 29440, 29472, 29473, 29468, 29470, + 0, 16384, 24576, 28672, 29696, 29440, 0, 16384, + 24576, 28672, 29696, 29440, 29472, 0, 16384, 24576, + 28672, 29696, 29440, 29472, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 29474, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29476, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29476, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29480, 29478, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29480, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29480, 0, 16384, 24576, 28672, 29696, + 29440, 29472, 29480, 29482, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 29480, 0, 16384, 24576, 28672, + 29696, 29440, 29472, 29488, 29484, 0, 16384, 24576, + 28672, 29696, 29440, 29472, 29488, 29484, 0, 16384, + 24576, 28672, 29696, 29440, 29472, 29488, 29489, 29486, + 0, 16384, 24576, 28672, 29696, 29440, 29472, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29488, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29488, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29488, 29490, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29488, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29488, + 29492, 0, 16384, 24576, 28672, 29696, 29440, 29504, + 29488, 29492, 0, 16384, 24576, 28672, 29696, 29440, + 29504, 29488, 29496, 29494, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29488, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29505, 29496, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 29505, 29496, 0, 16384, + 24576, 28672, 29696, 29440, 29504, 29505, 29496, 29498, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29505, + 29496, 0, 16384, 24576, 28672, 29696, 29440, 29504, + 29505, 29496, 29500, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29505, 29507, 29500, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 29505, 29507, 29500, 29502, + 0, 16384, 24576, 28672, 29696, 29440, 0, 16384, + 24576, 28672, 29696, 29440, 29504, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29506, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29508, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29508, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29512, 29510, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29512, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29512, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29512, 29514, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29512, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29520, 29516, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 29520, 29516, 0, 16384, + 24576, 28672, 29696, 29440, 29504, 29520, 29521, 29518, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29520, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29520, 0, + 16384, 24576, 28672, 29696, 29440, 29504, 29520, 29522, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29520, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29520, + 29524, 0, 16384, 24576, 28672, 29696, 29440, 29504, + 29520, 29524, 0, 16384, 24576, 28672, 29696, 29440, + 29504, 29520, 29528, 29526, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29520, 0, 16384, 24576, 28672, + 29696, 29440, 29504, 29536, 29528, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 29536, 29528, 0, 16384, + 24576, 28672, 29696, 29440, 29504, 29536, 29528, 29530, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 29536, + 29528, 0, 16384, 24576, 28672, 29696, 29440, 29504, + 29536, 29537, 29532, 0, 16384, 24576, 28672, 29696, + 29440, 29504, 29536, 29537, 29532, 0, 16384, 24576, + 28672, 29696, 29440, 29504, 29536, 29537, 29532, 29534, + 0, 16384, 24576, 28672, 29696, 29440, 29504, 0, + 16384, 24576, 28672, 29696, 29440, 29568, 29536, 0, + 16384, 24576, 28672, 29696, 29440, 29568, 29536, 0, + 16384, 24576, 28672, 29696, 29440, 29568, 29536, 29538, + 0, 16384, 24576, 28672, 29696, 29440, 29568, 29536, + 0, 16384, 24576, 28672, 29696, 29440, 29568, 29536, + 29540, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29536, 29540, 0, 16384, 24576, 28672, 29696, 29440, + 29568, 29536, 29544, 29542, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29536, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29536, 29544, 0, 16384, 24576, + 28672, 29696, 29440, 29568, 29536, 29544, 0, 16384, + 24576, 28672, 29696, 29440, 29568, 29536, 29544, 29546, + 0, 16384, 24576, 28672, 29696, 29440, 29568, 29536, + 29544, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29536, 29552, 29548, 0, 16384, 24576, 28672, 29696, + 29440, 29568, 29536, 29552, 29548, 0, 16384, 24576, + 28672, 29696, 29440, 29568, 29536, 29552, 29553, 29550, + 0, 16384, 24576, 28672, 29696, 29440, 29568, 29536, + 0, 16384, 24576, 28672, 29696, 29440, 29568, 29569, + 29552, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29569, 29552, 0, 16384, 24576, 28672, 29696, 29440, + 29568, 29569, 29552, 29554, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29569, 29552, 0, 16384, 24576, + 28672, 29696, 29440, 29568, 29569, 29552, 29556, 0, + 16384, 24576, 28672, 29696, 29440, 29568, 29569, 29552, + 29556, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29569, 29552, 29560, 29558, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29569, 29552, 0, 16384, 24576, + 28672, 29696, 29440, 29568, 29569, 29552, 29560, 0, + 16384, 24576, 28672, 29696, 29440, 29568, 29569, 29571, + 29560, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29569, 29571, 29560, 29562, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29569, 29571, 29560, 0, 16384, + 24576, 28672, 29696, 29440, 29568, 29569, 29571, 29560, + 29564, 0, 16384, 24576, 28672, 29696, 29440, 29568, + 29569, 29571, 29560, 29564, 0, 16384, 24576, 28672, + 29696, 29440, 29568, 29569, 29571, 29560, 29564, 29566, + 0, 16384, 24576, 28672, 29696, 29440, 0, 16384, + 24576, 28672, 29696, 29440, 29568, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29570, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29572, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29572, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29576, 29574, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29576, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29576, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29576, 29578, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29576, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29584, 29580, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29584, 29580, 0, 16384, + 24576, 28672, 29696, 29697, 29568, 29584, 29585, 29582, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29584, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29584, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29584, 29586, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29584, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29584, + 29588, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29584, 29588, 0, 16384, 24576, 28672, 29696, 29697, + 29568, 29584, 29592, 29590, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29584, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29600, 29592, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29600, 29592, 0, 16384, + 24576, 28672, 29696, 29697, 29568, 29600, 29592, 29594, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29600, + 29592, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29600, 29601, 29596, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29600, 29601, 29596, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29600, 29601, 29596, 29598, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29600, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29600, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29600, 29602, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29600, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29600, + 29604, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29600, 29604, 0, 16384, 24576, 28672, 29696, 29697, + 29568, 29600, 29608, 29606, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29600, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29600, 29608, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29600, 29608, 0, 16384, + 24576, 28672, 29696, 29697, 29568, 29600, 29608, 29610, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29600, + 29608, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29600, 29616, 29612, 0, 16384, 24576, 28672, 29696, + 29697, 29568, 29600, 29616, 29612, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29600, 29616, 29617, 29614, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29600, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 29632, + 29616, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29632, 29616, 0, 16384, 24576, 28672, 29696, 29697, + 29568, 29632, 29616, 29618, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29632, 29616, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29632, 29616, 29620, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29632, 29616, + 29620, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29632, 29616, 29624, 29622, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29632, 29616, 0, 16384, 24576, + 28672, 29696, 29697, 29568, 29632, 29633, 29624, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29632, 29633, + 29624, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29632, 29633, 29624, 29626, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29632, 29633, 29624, 0, 16384, + 24576, 28672, 29696, 29697, 29568, 29632, 29633, 29624, + 29628, 0, 16384, 24576, 28672, 29696, 29697, 29568, + 29632, 29633, 29635, 29628, 0, 16384, 24576, 28672, + 29696, 29697, 29568, 29632, 29633, 29635, 29628, 29630, + 0, 16384, 24576, 28672, 29696, 29697, 29568, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29632, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29632, 0, + 16384, 24576, 28672, 29696, 29697, 29568, 29632, 29634, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 29636, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29636, 0, 16384, 24576, 28672, 29696, 29697, + 29699, 29632, 29640, 29638, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29640, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29632, 29640, 0, 16384, + 24576, 28672, 29696, 29697, 29699, 29632, 29640, 29642, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 29640, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29648, 29644, 0, 16384, 24576, 28672, 29696, + 29697, 29699, 29632, 29648, 29644, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29632, 29648, 29649, 29646, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 29648, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29648, 0, 16384, 24576, 28672, 29696, 29697, + 29699, 29632, 29648, 29650, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29648, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29632, 29648, 29652, 0, + 16384, 24576, 28672, 29696, 29697, 29699, 29632, 29648, + 29652, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29648, 29656, 29654, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29648, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29632, 29664, 29656, 0, + 16384, 24576, 28672, 29696, 29697, 29699, 29632, 29664, + 29656, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29664, 29656, 29658, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29664, 29656, 0, 16384, + 24576, 28672, 29696, 29697, 29699, 29632, 29664, 29665, + 29660, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29664, 29665, 29660, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29664, 29665, 29660, 29662, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29632, + 29664, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29664, 0, 16384, 24576, 28672, 29696, 29697, + 29699, 29632, 29664, 29666, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29632, 29664, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29632, 29664, 29668, 0, + 16384, 24576, 28672, 29696, 29697, 29699, 29632, 29664, + 29668, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29632, 29664, 29672, 29670, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29703, 29664, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29703, 29664, 29672, 0, + 16384, 24576, 28672, 29696, 29697, 29699, 29703, 29664, + 29672, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29703, 29664, 29672, 29674, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29703, 29664, 29672, 0, 16384, + 24576, 28672, 29696, 29697, 29699, 29703, 29664, 29680, + 29676, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29703, 29664, 29680, 29676, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29703, 29664, 29680, 29681, 29678, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29703, + 29664, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29703, 29664, 29680, 0, 16384, 24576, 28672, 29696, + 29697, 29699, 29703, 29664, 29680, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29703, 29664, 29680, 29682, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29703, + 29664, 29680, 0, 16384, 24576, 28672, 29696, 29697, + 29699, 29703, 29664, 29680, 29684, 0, 16384, 24576, + 28672, 29696, 29697, 29699, 29703, 29664, 29680, 29684, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29703, + 29664, 29680, 29688, 29686, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29703, 29664, 29680, 0, 16384, + 24576, 28672, 29696, 29697, 29699, 29703, 29664, 29680, + 29688, 0, 16384, 24576, 28672, 29696, 29697, 29699, + 29703, 29664, 29680, 29688, 0, 16384, 24576, 28672, + 29696, 29697, 29699, 29703, 29664, 29680, 29688, 29690, + 0, 16384, 24576, 28672, 29696, 29697, 29699, 29703, + 29664, 29680, 29688, 0, 16384, 24576, 28672, 29696, + 29697, 29699, 29703, 29664, 29680, 29688, 29692, 0, + 16384, 24576, 28672, 29696, 29697, 29699, 29703, 29664, + 29680, 29688, 29692, 0, 16384, 24576, 28672, 29696, + 29697, 29699, 29703, 29664, 29680, 29688, 29692, 29694, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 29696, 0, 16384, 24576, 28672, 29696, 0, 16384, + 24576, 28672, 29696, 29698, 0, 16384, 24576, 28672, + 29696, 0, 16384, 24576, 28672, 29696, 29700, 0, + 16384, 24576, 28672, 29696, 29700, 0, 16384, 24576, + 28672, 29696, 29704, 29702, 0, 16384, 24576, 28672, + 29696, 0, 16384, 24576, 28672, 29696, 29704, 0, + 16384, 24576, 28672, 29696, 29704, 0, 16384, 24576, + 28672, 29696, 29704, 29706, 0, 16384, 24576, 28672, + 29696, 29704, 0, 16384, 24576, 28672, 29696, 29712, + 29708, 0, 16384, 24576, 28672, 29696, 29712, 29708, + 0, 16384, 24576, 28672, 29696, 29712, 29713, 29710, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 29696, 29712, 0, 16384, 24576, 28672, 29696, + 29712, 0, 16384, 24576, 28672, 29696, 29712, 29714, + 0, 16384, 24576, 28672, 29696, 29712, 0, 16384, + 24576, 28672, 29696, 29712, 29716, 0, 16384, 24576, + 28672, 29696, 29712, 29716, 0, 16384, 24576, 28672, + 29696, 29712, 29720, 29718, 0, 16384, 24576, 28672, + 29696, 29712, 0, 16384, 24576, 28672, 29696, 29728, + 29720, 0, 16384, 24576, 28672, 29696, 29728, 29720, + 0, 16384, 24576, 28672, 29696, 29728, 29720, 29722, + 0, 16384, 24576, 28672, 29696, 29728, 29720, 0, + 16384, 24576, 28672, 29696, 29728, 29729, 29724, 0, + 16384, 24576, 28672, 29696, 29728, 29729, 29724, 0, + 16384, 24576, 28672, 29696, 29728, 29729, 29724, 29726, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 29696, 29728, 0, 16384, 24576, 28672, 29696, + 29728, 0, 16384, 24576, 28672, 29696, 29728, 29730, + 0, 16384, 24576, 28672, 29696, 29728, 0, 16384, + 24576, 28672, 29696, 29728, 29732, 0, 16384, 24576, + 28672, 29696, 29728, 29732, 0, 16384, 24576, 28672, + 29696, 29728, 29736, 29734, 0, 16384, 24576, 28672, + 29696, 29728, 0, 16384, 24576, 28672, 29696, 29728, + 29736, 0, 16384, 24576, 28672, 29696, 29728, 29736, + 0, 16384, 24576, 28672, 29696, 29728, 29736, 29738, + 0, 16384, 24576, 28672, 29696, 29728, 29736, 0, + 16384, 24576, 28672, 29696, 29728, 29744, 29740, 0, + 16384, 24576, 28672, 29696, 29728, 29744, 29740, 0, + 16384, 24576, 28672, 29696, 29728, 29744, 29745, 29742, + 0, 16384, 24576, 28672, 29696, 29728, 0, 16384, + 24576, 28672, 29696, 29760, 29744, 0, 16384, 24576, + 28672, 29696, 29760, 29744, 0, 16384, 24576, 28672, + 29696, 29760, 29744, 29746, 0, 16384, 24576, 28672, + 29696, 29760, 29744, 0, 16384, 24576, 28672, 29696, + 29760, 29744, 29748, 0, 16384, 24576, 28672, 29696, + 29760, 29744, 29748, 0, 16384, 24576, 28672, 29696, + 29760, 29744, 29752, 29750, 0, 16384, 24576, 28672, + 29696, 29760, 29744, 0, 16384, 24576, 28672, 29696, + 29760, 29761, 29752, 0, 16384, 24576, 28672, 29696, + 29760, 29761, 29752, 0, 16384, 24576, 28672, 29696, + 29760, 29761, 29752, 29754, 0, 16384, 24576, 28672, + 29696, 29760, 29761, 29752, 0, 16384, 24576, 28672, + 29696, 29760, 29761, 29752, 29756, 0, 16384, 24576, + 28672, 29696, 29760, 29761, 29763, 29756, 0, 16384, + 24576, 28672, 29696, 29760, 29761, 29763, 29756, 29758, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 29696, 29760, 0, 16384, 24576, 28672, 29696, + 29760, 0, 16384, 24576, 28672, 29696, 29760, 29762, + 0, 16384, 24576, 28672, 29696, 29760, 0, 16384, + 24576, 28672, 29696, 29760, 29764, 0, 16384, 24576, + 28672, 29696, 29760, 29764, 0, 16384, 24576, 28672, + 29696, 29760, 29768, 29766, 0, 16384, 24576, 28672, + 29696, 29760, 0, 16384, 24576, 28672, 29696, 29760, + 29768, 0, 16384, 24576, 28672, 29696, 29760, 29768, + 0, 16384, 24576, 28672, 29696, 29760, 29768, 29770, + 0, 16384, 24576, 28672, 29696, 29760, 29768, 0, + 16384, 24576, 28672, 29696, 29760, 29776, 29772, 0, + 16384, 24576, 28672, 29696, 29760, 29776, 29772, 0, + 16384, 24576, 28672, 29696, 29760, 29776, 29777, 29774, + 0, 16384, 24576, 28672, 29696, 29760, 0, 16384, + 24576, 28672, 29696, 29760, 29776, 0, 16384, 24576, + 28672, 29696, 29760, 29776, 0, 16384, 24576, 28672, + 29696, 29760, 29776, 29778, 0, 16384, 24576, 28672, + 29696, 29760, 29776, 0, 16384, 24576, 28672, 29696, + 29760, 29776, 29780, 0, 16384, 24576, 28672, 29696, + 29760, 29776, 29780, 0, 16384, 24576, 28672, 29696, + 29760, 29776, 29784, 29782, 0, 16384, 24576, 28672, + 29696, 29760, 29776, 0, 16384, 24576, 28672, 29696, + 29760, 29792, 29784, 0, 16384, 24576, 28672, 29696, + 29760, 29792, 29784, 0, 16384, 24576, 28672, 29696, + 29760, 29792, 29784, 29786, 0, 16384, 24576, 28672, + 29696, 29760, 29792, 29784, 0, 16384, 24576, 28672, + 29696, 29760, 29792, 29793, 29788, 0, 16384, 24576, + 28672, 29696, 29760, 29792, 29793, 29788, 0, 16384, + 24576, 28672, 29696, 29760, 29792, 29793, 29788, 29790, + 0, 16384, 24576, 28672, 29696, 29760, 0, 16384, + 24576, 28672, 29696, 29824, 29792, 0, 16384, 24576, + 28672, 29696, 29824, 29792, 0, 16384, 24576, 28672, + 29696, 29824, 29792, 29794, 0, 16384, 24576, 28672, + 29696, 29824, 29792, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29796, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29796, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29800, 29798, 0, 16384, 24576, 28672, + 29696, 29824, 29792, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29800, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29800, 0, 16384, 24576, 28672, 29696, + 29824, 29792, 29800, 29802, 0, 16384, 24576, 28672, + 29696, 29824, 29792, 29800, 0, 16384, 24576, 28672, + 29696, 29824, 29792, 29808, 29804, 0, 16384, 24576, + 28672, 29696, 29824, 29792, 29808, 29804, 0, 16384, + 24576, 28672, 29696, 29824, 29792, 29808, 29809, 29806, + 0, 16384, 24576, 28672, 29696, 29824, 29792, 0, + 16384, 24576, 28672, 29696, 29824, 29825, 29808, 0, + 16384, 24576, 28672, 29696, 29824, 29825, 29808, 0, + 16384, 24576, 28672, 29696, 29824, 29825, 29808, 29810, + 0, 16384, 24576, 28672, 29696, 29824, 29825, 29808, + 0, 16384, 24576, 28672, 29696, 29824, 29825, 29808, + 29812, 0, 16384, 24576, 28672, 29696, 29824, 29825, + 29808, 29812, 0, 16384, 24576, 28672, 29696, 29824, + 29825, 29808, 29816, 29814, 0, 16384, 24576, 28672, + 29696, 29824, 29825, 29808, 0, 16384, 24576, 28672, + 29696, 29824, 29825, 29808, 29816, 0, 16384, 24576, + 28672, 29696, 29824, 29825, 29827, 29816, 0, 16384, + 24576, 28672, 29696, 29824, 29825, 29827, 29816, 29818, + 0, 16384, 24576, 28672, 29696, 29824, 29825, 29827, + 29816, 0, 16384, 24576, 28672, 29696, 29824, 29825, + 29827, 29816, 29820, 0, 16384, 24576, 28672, 29696, + 29824, 29825, 29827, 29816, 29820, 0, 16384, 24576, + 28672, 29696, 29824, 29825, 29827, 29816, 29820, 29822, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 29696, 29824, 0, 16384, 24576, 28672, 29696, + 29824, 0, 16384, 24576, 28672, 29696, 29824, 29826, + 0, 16384, 24576, 28672, 29696, 29824, 0, 16384, + 24576, 28672, 29696, 29824, 29828, 0, 16384, 24576, + 28672, 29696, 29824, 29828, 0, 16384, 24576, 28672, + 29696, 29824, 29832, 29830, 0, 16384, 24576, 28672, + 29696, 29824, 0, 16384, 24576, 28672, 29696, 29824, + 29832, 0, 16384, 24576, 28672, 29696, 29824, 29832, + 0, 16384, 24576, 28672, 29696, 29824, 29832, 29834, + 0, 16384, 24576, 28672, 29696, 29824, 29832, 0, + 16384, 24576, 28672, 29696, 29824, 29840, 29836, 0, + 16384, 24576, 28672, 29696, 29824, 29840, 29836, 0, + 16384, 24576, 28672, 29696, 29824, 29840, 29841, 29838, + 0, 16384, 24576, 28672, 29696, 29824, 0, 16384, + 24576, 28672, 29696, 29824, 29840, 0, 16384, 24576, + 28672, 29696, 29824, 29840, 0, 16384, 24576, 28672, + 29696, 29824, 29840, 29842, 0, 16384, 24576, 28672, + 29696, 29824, 29840, 0, 16384, 24576, 28672, 29696, + 29824, 29840, 29844, 0, 16384, 24576, 28672, 29696, + 29824, 29840, 29844, 0, 16384, 24576, 28672, 29696, + 29824, 29840, 29848, 29846, 0, 16384, 24576, 28672, + 29696, 29824, 29840, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29848, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29848, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29848, 29850, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 29848, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 29857, 29852, 0, 16384, 24576, + 28672, 29696, 29824, 29856, 29857, 29852, 0, 16384, + 24576, 28672, 29696, 29824, 29856, 29857, 29852, 29854, + 0, 16384, 24576, 28672, 29696, 29824, 0, 16384, + 24576, 28672, 29696, 29824, 29856, 0, 16384, 24576, + 28672, 29696, 29824, 29856, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 29858, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29860, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29860, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29864, 29862, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29864, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29864, 0, 16384, 24576, 28672, 29696, + 29824, 29856, 29864, 29866, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 29864, 0, 16384, 24576, 28672, + 29696, 29824, 29856, 29872, 29868, 0, 16384, 24576, + 28672, 29696, 29824, 29856, 29872, 29868, 0, 16384, + 24576, 28672, 29696, 29824, 29856, 29872, 29873, 29870, + 0, 16384, 24576, 28672, 29696, 29824, 29856, 0, + 16384, 24576, 28672, 29696, 29824, 29888, 29872, 0, + 16384, 24576, 28672, 29696, 29824, 29888, 29872, 0, + 16384, 24576, 28672, 29696, 29824, 29888, 29872, 29874, + 0, 16384, 24576, 28672, 29696, 29824, 29888, 29872, + 0, 16384, 24576, 28672, 29696, 29824, 29888, 29872, + 29876, 0, 16384, 24576, 28672, 29696, 29824, 29888, + 29872, 29876, 0, 16384, 24576, 28672, 29696, 29824, + 29888, 29872, 29880, 29878, 0, 16384, 24576, 28672, + 29696, 29824, 29888, 29872, 0, 16384, 24576, 28672, + 29696, 29824, 29888, 29889, 29880, 0, 16384, 24576, + 28672, 29696, 29824, 29888, 29889, 29880, 0, 16384, + 24576, 28672, 29696, 29824, 29888, 29889, 29880, 29882, + 0, 16384, 24576, 28672, 29696, 29824, 29888, 29889, + 29880, 0, 16384, 24576, 28672, 29696, 29824, 29888, + 29889, 29880, 29884, 0, 16384, 24576, 28672, 29696, + 29824, 29888, 29889, 29891, 29884, 0, 16384, 24576, + 28672, 29696, 29824, 29888, 29889, 29891, 29884, 29886, + 0, 16384, 24576, 28672, 29696, 29824, 0, 16384, + 24576, 28672, 29696, 29952, 29888, 0, 16384, 24576, + 28672, 29696, 29952, 29888, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 29890, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29892, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29892, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29896, 29894, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29896, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29896, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29896, 29898, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 29896, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 29904, 29900, 0, 16384, 24576, + 28672, 29696, 29952, 29888, 29904, 29900, 0, 16384, + 24576, 28672, 29696, 29952, 29888, 29904, 29905, 29902, + 0, 16384, 24576, 28672, 29696, 29952, 29888, 0, + 16384, 24576, 28672, 29696, 29952, 29888, 29904, 0, + 16384, 24576, 28672, 29696, 29952, 29888, 29904, 0, + 16384, 24576, 28672, 29696, 29952, 29888, 29904, 29906, + 0, 16384, 24576, 28672, 29696, 29952, 29888, 29904, + 0, 16384, 24576, 28672, 29696, 29952, 29888, 29904, + 29908, 0, 16384, 24576, 28672, 29696, 29952, 29888, + 29904, 29908, 0, 16384, 24576, 28672, 29696, 29952, + 29888, 29904, 29912, 29910, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 29904, 0, 16384, 24576, 28672, + 29696, 29952, 29888, 29920, 29912, 0, 16384, 24576, + 28672, 29696, 29952, 29888, 29920, 29912, 0, 16384, + 24576, 28672, 29696, 29952, 29888, 29920, 29912, 29914, + 0, 16384, 24576, 28672, 29696, 29952, 29888, 29920, + 29912, 0, 16384, 24576, 28672, 29696, 29952, 29888, + 29920, 29921, 29916, 0, 16384, 24576, 28672, 29696, + 29952, 29888, 29920, 29921, 29916, 0, 16384, 24576, + 28672, 29696, 29952, 29888, 29920, 29921, 29916, 29918, + 0, 16384, 24576, 28672, 29696, 29952, 29888, 0, + 16384, 24576, 28672, 29696, 29952, 29953, 29920, 0, + 16384, 24576, 28672, 29696, 29952, 29953, 29920, 0, + 16384, 24576, 28672, 29696, 29952, 29953, 29920, 29922, + 0, 16384, 24576, 28672, 29696, 29952, 29953, 29920, + 0, 16384, 24576, 28672, 29696, 29952, 29953, 29920, + 29924, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29920, 29924, 0, 16384, 24576, 28672, 29696, 29952, + 29953, 29920, 29928, 29926, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29920, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29920, 29928, 0, 16384, 24576, + 28672, 29696, 29952, 29953, 29920, 29928, 0, 16384, + 24576, 28672, 29696, 29952, 29953, 29920, 29928, 29930, + 0, 16384, 24576, 28672, 29696, 29952, 29953, 29920, + 29928, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29920, 29936, 29932, 0, 16384, 24576, 28672, 29696, + 29952, 29953, 29920, 29936, 29932, 0, 16384, 24576, + 28672, 29696, 29952, 29953, 29920, 29936, 29937, 29934, + 0, 16384, 24576, 28672, 29696, 29952, 29953, 29920, + 0, 16384, 24576, 28672, 29696, 29952, 29953, 29920, + 29936, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29955, 29936, 0, 16384, 24576, 28672, 29696, 29952, + 29953, 29955, 29936, 29938, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29955, 29936, 0, 16384, 24576, + 28672, 29696, 29952, 29953, 29955, 29936, 29940, 0, + 16384, 24576, 28672, 29696, 29952, 29953, 29955, 29936, + 29940, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29955, 29936, 29944, 29942, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29955, 29936, 0, 16384, 24576, + 28672, 29696, 29952, 29953, 29955, 29936, 29944, 0, + 16384, 24576, 28672, 29696, 29952, 29953, 29955, 29936, + 29944, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29955, 29936, 29944, 29946, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29955, 29959, 29944, 0, 16384, + 24576, 28672, 29696, 29952, 29953, 29955, 29959, 29944, + 29948, 0, 16384, 24576, 28672, 29696, 29952, 29953, + 29955, 29959, 29944, 29948, 0, 16384, 24576, 28672, + 29696, 29952, 29953, 29955, 29959, 29944, 29948, 29950, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 29696, 29952, 0, 16384, 24576, 28672, 29696, + 29952, 0, 16384, 24576, 28672, 29696, 29952, 29954, + 0, 16384, 24576, 28672, 29696, 29952, 0, 16384, + 24576, 28672, 29696, 29952, 29956, 0, 16384, 24576, + 28672, 29696, 29952, 29956, 0, 16384, 24576, 28672, + 29696, 29952, 29960, 29958, 0, 16384, 24576, 28672, + 29696, 29952, 0, 16384, 24576, 28672, 29696, 29952, + 29960, 0, 16384, 24576, 28672, 29696, 29952, 29960, + 0, 16384, 24576, 28672, 29696, 29952, 29960, 29962, + 0, 16384, 24576, 28672, 29696, 29952, 29960, 0, + 16384, 24576, 28672, 29696, 29952, 29968, 29964, 0, + 16384, 24576, 28672, 29696, 29952, 29968, 29964, 0, + 16384, 24576, 28672, 29696, 29952, 29968, 29969, 29966, + 0, 16384, 24576, 28672, 29696, 29952, 0, 16384, + 24576, 28672, 29696, 29952, 29968, 0, 16384, 24576, + 28672, 29696, 29952, 29968, 0, 16384, 24576, 28672, + 29696, 29952, 29968, 29970, 0, 16384, 24576, 28672, + 29696, 29952, 29968, 0, 16384, 24576, 28672, 29696, + 29952, 29968, 29972, 0, 16384, 24576, 28672, 29696, + 29952, 29968, 29972, 0, 16384, 24576, 28672, 29696, + 29952, 29968, 29976, 29974, 0, 16384, 24576, 28672, + 29696, 29952, 29968, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29976, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29976, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29976, 29978, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 29976, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 29985, 29980, 0, 16384, 24576, + 28672, 29696, 29952, 29984, 29985, 29980, 0, 16384, + 24576, 28672, 29696, 29952, 29984, 29985, 29980, 29982, + 0, 16384, 24576, 28672, 29696, 29952, 0, 16384, + 24576, 28672, 29696, 29952, 29984, 0, 16384, 24576, + 28672, 29696, 29952, 29984, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 29986, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29988, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29988, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29992, 29990, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29992, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29992, 0, 16384, 24576, 28672, 29696, + 29952, 29984, 29992, 29994, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 29992, 0, 16384, 24576, 28672, + 29696, 29952, 29984, 30000, 29996, 0, 16384, 24576, + 28672, 29696, 29952, 29984, 30000, 29996, 0, 16384, + 24576, 28672, 29696, 29952, 29984, 30000, 30001, 29998, + 0, 16384, 24576, 28672, 29696, 29952, 29984, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30000, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30000, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30000, 30002, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30000, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30000, + 30004, 0, 16384, 24576, 28672, 29696, 29952, 30016, + 30000, 30004, 0, 16384, 24576, 28672, 29696, 29952, + 30016, 30000, 30008, 30006, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30000, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30017, 30008, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 30017, 30008, 0, 16384, + 24576, 28672, 29696, 29952, 30016, 30017, 30008, 30010, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30017, + 30008, 0, 16384, 24576, 28672, 29696, 29952, 30016, + 30017, 30008, 30012, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30017, 30019, 30012, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 30017, 30019, 30012, 30014, + 0, 16384, 24576, 28672, 29696, 29952, 0, 16384, + 24576, 28672, 29696, 29952, 30016, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30018, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30020, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30020, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30024, 30022, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30024, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30024, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30024, 30026, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30024, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30032, 30028, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 30032, 30028, 0, 16384, + 24576, 28672, 29696, 29952, 30016, 30032, 30033, 30030, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30032, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30032, 0, + 16384, 24576, 28672, 29696, 29952, 30016, 30032, 30034, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30032, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30032, + 30036, 0, 16384, 24576, 28672, 29696, 29952, 30016, + 30032, 30036, 0, 16384, 24576, 28672, 29696, 29952, + 30016, 30032, 30040, 30038, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30032, 0, 16384, 24576, 28672, + 29696, 29952, 30016, 30048, 30040, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 30048, 30040, 0, 16384, + 24576, 28672, 29696, 29952, 30016, 30048, 30040, 30042, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 30048, + 30040, 0, 16384, 24576, 28672, 29696, 29952, 30016, + 30048, 30049, 30044, 0, 16384, 24576, 28672, 29696, + 29952, 30016, 30048, 30049, 30044, 0, 16384, 24576, + 28672, 29696, 29952, 30016, 30048, 30049, 30044, 30046, + 0, 16384, 24576, 28672, 29696, 29952, 30016, 0, + 16384, 24576, 28672, 29696, 29952, 30080, 30048, 0, + 16384, 24576, 28672, 29696, 29952, 30080, 30048, 0, + 16384, 24576, 28672, 29696, 29952, 30080, 30048, 30050, + 0, 16384, 24576, 28672, 29696, 29952, 30080, 30048, + 0, 16384, 24576, 28672, 29696, 29952, 30080, 30048, + 30052, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30048, 30052, 0, 16384, 24576, 28672, 29696, 29952, + 30080, 30048, 30056, 30054, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30048, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30048, 30056, 0, 16384, 24576, + 28672, 29696, 29952, 30080, 30048, 30056, 0, 16384, + 24576, 28672, 29696, 29952, 30080, 30048, 30056, 30058, + 0, 16384, 24576, 28672, 29696, 29952, 30080, 30048, + 30056, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30048, 30064, 30060, 0, 16384, 24576, 28672, 29696, + 29952, 30080, 30048, 30064, 30060, 0, 16384, 24576, + 28672, 29696, 29952, 30080, 30048, 30064, 30065, 30062, + 0, 16384, 24576, 28672, 29696, 29952, 30080, 30048, + 0, 16384, 24576, 28672, 29696, 29952, 30080, 30081, + 30064, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30081, 30064, 0, 16384, 24576, 28672, 29696, 29952, + 30080, 30081, 30064, 30066, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30081, 30064, 0, 16384, 24576, + 28672, 29696, 29952, 30080, 30081, 30064, 30068, 0, + 16384, 24576, 28672, 29696, 29952, 30080, 30081, 30064, + 30068, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30081, 30064, 30072, 30070, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30081, 30064, 0, 16384, 24576, + 28672, 29696, 29952, 30080, 30081, 30064, 30072, 0, + 16384, 24576, 28672, 29696, 29952, 30080, 30081, 30083, + 30072, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30081, 30083, 30072, 30074, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30081, 30083, 30072, 0, 16384, + 24576, 28672, 29696, 29952, 30080, 30081, 30083, 30072, + 30076, 0, 16384, 24576, 28672, 29696, 29952, 30080, + 30081, 30083, 30072, 30076, 0, 16384, 24576, 28672, + 29696, 29952, 30080, 30081, 30083, 30072, 30076, 30078, + 0, 16384, 24576, 28672, 29696, 29952, 0, 16384, + 24576, 28672, 29696, 30208, 30080, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30082, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30084, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30084, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30088, 30086, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30088, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30088, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30088, 30090, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30088, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30096, 30092, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30096, 30092, 0, 16384, + 24576, 28672, 29696, 30208, 30080, 30096, 30097, 30094, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30096, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30096, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30096, 30098, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30096, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30096, + 30100, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30096, 30100, 0, 16384, 24576, 28672, 29696, 30208, + 30080, 30096, 30104, 30102, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30096, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30112, 30104, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30112, 30104, 0, 16384, + 24576, 28672, 29696, 30208, 30080, 30112, 30104, 30106, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30112, + 30104, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30112, 30113, 30108, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30112, 30113, 30108, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30112, 30113, 30108, 30110, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30112, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30112, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30112, 30114, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30112, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30112, + 30116, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30112, 30116, 0, 16384, 24576, 28672, 29696, 30208, + 30080, 30112, 30120, 30118, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30112, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30112, 30120, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30112, 30120, 0, 16384, + 24576, 28672, 29696, 30208, 30080, 30112, 30120, 30122, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30112, + 30120, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30112, 30128, 30124, 0, 16384, 24576, 28672, 29696, + 30208, 30080, 30112, 30128, 30124, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30112, 30128, 30129, 30126, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30112, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 30144, + 30128, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30144, 30128, 0, 16384, 24576, 28672, 29696, 30208, + 30080, 30144, 30128, 30130, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30144, 30128, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30144, 30128, 30132, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30144, 30128, + 30132, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30144, 30128, 30136, 30134, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30144, 30128, 0, 16384, 24576, + 28672, 29696, 30208, 30080, 30144, 30145, 30136, 0, + 16384, 24576, 28672, 29696, 30208, 30080, 30144, 30145, + 30136, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30144, 30145, 30136, 30138, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30144, 30145, 30136, 0, 16384, + 24576, 28672, 29696, 30208, 30080, 30144, 30145, 30136, + 30140, 0, 16384, 24576, 28672, 29696, 30208, 30080, + 30144, 30145, 30147, 30140, 0, 16384, 24576, 28672, + 29696, 30208, 30080, 30144, 30145, 30147, 30140, 30142, + 0, 16384, 24576, 28672, 29696, 30208, 30080, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30144, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30144, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30144, 30146, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 30148, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30148, 0, 16384, 24576, 28672, 29696, 30208, + 30209, 30144, 30152, 30150, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 30152, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30144, 30152, 0, 16384, + 24576, 28672, 29696, 30208, 30209, 30144, 30152, 30154, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 30152, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30160, 30156, 0, 16384, 24576, 28672, 29696, + 30208, 30209, 30144, 30160, 30156, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30144, 30160, 30161, 30158, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 30160, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30160, 0, 16384, 24576, 28672, 29696, 30208, + 30209, 30144, 30160, 30162, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 30160, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30144, 30160, 30164, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30144, 30160, + 30164, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30160, 30168, 30166, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 30160, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30144, 30176, 30168, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30144, 30176, + 30168, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30176, 30168, 30170, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 30176, 30168, 0, 16384, + 24576, 28672, 29696, 30208, 30209, 30144, 30176, 30177, + 30172, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30144, 30176, 30177, 30172, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30144, 30176, 30177, 30172, 30174, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30144, + 30176, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30176, 0, 16384, 24576, 28672, 29696, 30208, + 30209, 30211, 30176, 30178, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30176, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30211, 30176, 30180, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30211, 30176, + 30180, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30176, 30184, 30182, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30176, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30211, 30176, 30184, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30211, 30176, + 30184, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30176, 30184, 30186, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30176, 30184, 0, 16384, + 24576, 28672, 29696, 30208, 30209, 30211, 30176, 30192, + 30188, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30176, 30192, 30188, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30176, 30192, 30193, 30190, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30211, + 30176, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30176, 30192, 0, 16384, 24576, 28672, 29696, + 30208, 30209, 30211, 30176, 30192, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30211, 30176, 30192, 30194, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30211, + 30215, 30192, 0, 16384, 24576, 28672, 29696, 30208, + 30209, 30211, 30215, 30192, 30196, 0, 16384, 24576, + 28672, 29696, 30208, 30209, 30211, 30215, 30192, 30196, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30211, + 30215, 30192, 30200, 30198, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30215, 30192, 0, 16384, + 24576, 28672, 29696, 30208, 30209, 30211, 30215, 30192, + 30200, 0, 16384, 24576, 28672, 29696, 30208, 30209, + 30211, 30215, 30192, 30200, 0, 16384, 24576, 28672, + 29696, 30208, 30209, 30211, 30215, 30192, 30200, 30202, + 0, 16384, 24576, 28672, 29696, 30208, 30209, 30211, + 30215, 30192, 30200, 0, 16384, 24576, 28672, 29696, + 30208, 30209, 30211, 30215, 30192, 30200, 30204, 0, + 16384, 24576, 28672, 29696, 30208, 30209, 30211, 30215, + 30192, 30200, 30204, 0, 16384, 24576, 28672, 29696, + 30208, 30209, 30211, 30215, 30192, 30200, 30204, 30206, + 0, 16384, 24576, 28672, 29696, 0, 16384, 24576, + 28672, 30720, 30208, 0, 16384, 24576, 28672, 30720, + 30208, 0, 16384, 24576, 28672, 30720, 30208, 30210, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30212, 0, 16384, 24576, + 28672, 30720, 30208, 30212, 0, 16384, 24576, 28672, + 30720, 30208, 30216, 30214, 0, 16384, 24576, 28672, + 30720, 30208, 0, 16384, 24576, 28672, 30720, 30208, + 30216, 0, 16384, 24576, 28672, 30720, 30208, 30216, + 0, 16384, 24576, 28672, 30720, 30208, 30216, 30218, + 0, 16384, 24576, 28672, 30720, 30208, 30216, 0, + 16384, 24576, 28672, 30720, 30208, 30224, 30220, 0, + 16384, 24576, 28672, 30720, 30208, 30224, 30220, 0, + 16384, 24576, 28672, 30720, 30208, 30224, 30225, 30222, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30224, 0, 16384, 24576, + 28672, 30720, 30208, 30224, 0, 16384, 24576, 28672, + 30720, 30208, 30224, 30226, 0, 16384, 24576, 28672, + 30720, 30208, 30224, 0, 16384, 24576, 28672, 30720, + 30208, 30224, 30228, 0, 16384, 24576, 28672, 30720, + 30208, 30224, 30228, 0, 16384, 24576, 28672, 30720, + 30208, 30224, 30232, 30230, 0, 16384, 24576, 28672, + 30720, 30208, 30224, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30232, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30232, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30232, 30234, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 30232, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 30241, 30236, 0, 16384, 24576, + 28672, 30720, 30208, 30240, 30241, 30236, 0, 16384, + 24576, 28672, 30720, 30208, 30240, 30241, 30236, 30238, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30240, 0, 16384, 24576, + 28672, 30720, 30208, 30240, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 30242, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30244, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30244, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30248, 30246, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30248, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30248, 0, 16384, 24576, 28672, 30720, + 30208, 30240, 30248, 30250, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 30248, 0, 16384, 24576, 28672, + 30720, 30208, 30240, 30256, 30252, 0, 16384, 24576, + 28672, 30720, 30208, 30240, 30256, 30252, 0, 16384, + 24576, 28672, 30720, 30208, 30240, 30256, 30257, 30254, + 0, 16384, 24576, 28672, 30720, 30208, 30240, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30256, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30256, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30256, 30258, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30256, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30256, + 30260, 0, 16384, 24576, 28672, 30720, 30208, 30272, + 30256, 30260, 0, 16384, 24576, 28672, 30720, 30208, + 30272, 30256, 30264, 30262, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30256, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30273, 30264, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 30273, 30264, 0, 16384, + 24576, 28672, 30720, 30208, 30272, 30273, 30264, 30266, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30273, + 30264, 0, 16384, 24576, 28672, 30720, 30208, 30272, + 30273, 30264, 30268, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30273, 30275, 30268, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 30273, 30275, 30268, 30270, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30272, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30274, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30276, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30276, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30280, 30278, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30280, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30280, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30280, 30282, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30280, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30288, 30284, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 30288, 30284, 0, 16384, + 24576, 28672, 30720, 30208, 30272, 30288, 30289, 30286, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30288, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30288, 0, + 16384, 24576, 28672, 30720, 30208, 30272, 30288, 30290, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30288, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30288, + 30292, 0, 16384, 24576, 28672, 30720, 30208, 30272, + 30288, 30292, 0, 16384, 24576, 28672, 30720, 30208, + 30272, 30288, 30296, 30294, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30288, 0, 16384, 24576, 28672, + 30720, 30208, 30272, 30304, 30296, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 30304, 30296, 0, 16384, + 24576, 28672, 30720, 30208, 30272, 30304, 30296, 30298, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 30304, + 30296, 0, 16384, 24576, 28672, 30720, 30208, 30272, + 30304, 30305, 30300, 0, 16384, 24576, 28672, 30720, + 30208, 30272, 30304, 30305, 30300, 0, 16384, 24576, + 28672, 30720, 30208, 30272, 30304, 30305, 30300, 30302, + 0, 16384, 24576, 28672, 30720, 30208, 30272, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30304, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30304, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30304, 30306, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30304, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30304, + 30308, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30304, 30308, 0, 16384, 24576, 28672, 30720, 30208, + 30336, 30304, 30312, 30310, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30304, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30304, 30312, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30304, 30312, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30304, 30312, 30314, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30304, + 30312, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30304, 30320, 30316, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30304, 30320, 30316, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30304, 30320, 30321, 30318, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30304, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30337, + 30320, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30337, 30320, 0, 16384, 24576, 28672, 30720, 30208, + 30336, 30337, 30320, 30322, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30337, 30320, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30337, 30320, 30324, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30337, 30320, + 30324, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30337, 30320, 30328, 30326, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30337, 30320, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30337, 30320, 30328, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30337, 30339, + 30328, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30337, 30339, 30328, 30330, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30337, 30339, 30328, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30337, 30339, 30328, + 30332, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30337, 30339, 30328, 30332, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30337, 30339, 30328, 30332, 30334, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30338, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30340, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30340, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30344, 30342, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30344, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30344, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30344, 30346, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30344, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30352, 30348, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30352, 30348, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30352, 30353, 30350, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30352, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30352, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30352, 30354, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30352, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30352, + 30356, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30352, 30356, 0, 16384, 24576, 28672, 30720, 30208, + 30336, 30352, 30360, 30358, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30352, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30368, 30360, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30368, 30360, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30368, 30360, 30362, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30368, + 30360, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30368, 30369, 30364, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30368, 30369, 30364, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30368, 30369, 30364, 30366, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30368, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30368, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30368, 30370, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30368, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30368, + 30372, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30368, 30372, 0, 16384, 24576, 28672, 30720, 30208, + 30336, 30368, 30376, 30374, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30368, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30368, 30376, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30368, 30376, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30368, 30376, 30378, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30368, + 30376, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30368, 30384, 30380, 0, 16384, 24576, 28672, 30720, + 30208, 30336, 30368, 30384, 30380, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30368, 30384, 30385, 30382, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30368, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 30400, + 30384, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30400, 30384, 0, 16384, 24576, 28672, 30720, 30208, + 30336, 30400, 30384, 30386, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30400, 30384, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30400, 30384, 30388, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30400, 30384, + 30388, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30400, 30384, 30392, 30390, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30400, 30384, 0, 16384, 24576, + 28672, 30720, 30208, 30336, 30400, 30401, 30392, 0, + 16384, 24576, 28672, 30720, 30208, 30336, 30400, 30401, + 30392, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30400, 30401, 30392, 30394, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30400, 30401, 30392, 0, 16384, + 24576, 28672, 30720, 30208, 30336, 30400, 30401, 30392, + 30396, 0, 16384, 24576, 28672, 30720, 30208, 30336, + 30400, 30401, 30403, 30396, 0, 16384, 24576, 28672, + 30720, 30208, 30336, 30400, 30401, 30403, 30396, 30398, + 0, 16384, 24576, 28672, 30720, 30208, 30336, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30400, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30400, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30400, 30402, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 30404, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30404, 0, 16384, 24576, 28672, 30720, 30208, + 30464, 30400, 30408, 30406, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 30408, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30400, 30408, 0, 16384, + 24576, 28672, 30720, 30208, 30464, 30400, 30408, 30410, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 30408, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30416, 30412, 0, 16384, 24576, 28672, 30720, + 30208, 30464, 30400, 30416, 30412, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30400, 30416, 30417, 30414, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 30416, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30416, 0, 16384, 24576, 28672, 30720, 30208, + 30464, 30400, 30416, 30418, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 30416, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30400, 30416, 30420, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30400, 30416, + 30420, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30416, 30424, 30422, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 30416, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30400, 30432, 30424, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30400, 30432, + 30424, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30432, 30424, 30426, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 30432, 30424, 0, 16384, + 24576, 28672, 30720, 30208, 30464, 30400, 30432, 30433, + 30428, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30400, 30432, 30433, 30428, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30400, 30432, 30433, 30428, 30430, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30400, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30465, + 30432, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30432, 0, 16384, 24576, 28672, 30720, 30208, + 30464, 30465, 30432, 30434, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30432, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30465, 30432, 30436, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30465, 30432, + 30436, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30432, 30440, 30438, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30432, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30465, 30432, 30440, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30465, 30432, + 30440, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30432, 30440, 30442, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30432, 30440, 0, 16384, + 24576, 28672, 30720, 30208, 30464, 30465, 30432, 30448, + 30444, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30432, 30448, 30444, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30432, 30448, 30449, 30446, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30465, + 30432, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30432, 30448, 0, 16384, 24576, 28672, 30720, + 30208, 30464, 30465, 30467, 30448, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30465, 30467, 30448, 30450, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30465, + 30467, 30448, 0, 16384, 24576, 28672, 30720, 30208, + 30464, 30465, 30467, 30448, 30452, 0, 16384, 24576, + 28672, 30720, 30208, 30464, 30465, 30467, 30448, 30452, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30465, + 30467, 30448, 30456, 30454, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30467, 30448, 0, 16384, + 24576, 28672, 30720, 30208, 30464, 30465, 30467, 30448, + 30456, 0, 16384, 24576, 28672, 30720, 30208, 30464, + 30465, 30467, 30448, 30456, 0, 16384, 24576, 28672, + 30720, 30208, 30464, 30465, 30467, 30448, 30456, 30458, + 0, 16384, 24576, 28672, 30720, 30208, 30464, 30465, + 30467, 30471, 30456, 0, 16384, 24576, 28672, 30720, + 30208, 30464, 30465, 30467, 30471, 30456, 30460, 0, + 16384, 24576, 28672, 30720, 30208, 30464, 30465, 30467, + 30471, 30456, 30460, 0, 16384, 24576, 28672, 30720, + 30208, 30464, 30465, 30467, 30471, 30456, 30460, 30462, + 0, 16384, 24576, 28672, 30720, 30208, 0, 16384, + 24576, 28672, 30720, 30208, 30464, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30466, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30468, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30468, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30472, 30470, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30472, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30472, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30472, 30474, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30472, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30480, 30476, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30480, 30476, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30480, 30481, 30478, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30480, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30480, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30480, 30482, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30480, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30480, + 30484, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30480, 30484, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30480, 30488, 30486, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30480, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30496, 30488, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30496, 30488, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30496, 30488, 30490, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30496, + 30488, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30496, 30497, 30492, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30496, 30497, 30492, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30496, 30497, 30492, 30494, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30496, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30496, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30496, 30498, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30496, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30496, + 30500, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30496, 30500, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30496, 30504, 30502, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30496, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30496, 30504, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30496, 30504, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30496, 30504, 30506, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30496, + 30504, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30496, 30512, 30508, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30496, 30512, 30508, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30496, 30512, 30513, 30510, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30496, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 30512, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30512, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30528, 30512, 30514, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30512, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30512, 30516, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 30512, + 30516, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30512, 30520, 30518, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30512, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30529, 30520, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 30529, + 30520, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30529, 30520, 30522, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30529, 30520, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30528, 30529, 30520, + 30524, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30529, 30531, 30524, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30529, 30531, 30524, 30526, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 30530, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 30532, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30532, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30528, 30536, 30534, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30536, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30536, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30528, 30536, 30538, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 30536, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30544, 30540, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30528, 30544, 30540, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30544, 30545, 30542, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 30544, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30544, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30528, 30544, 30546, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30544, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30544, 30548, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 30544, + 30548, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30544, 30552, 30550, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30544, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30528, 30560, 30552, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30528, 30560, + 30552, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30560, 30552, 30554, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30560, 30552, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30528, 30560, 30561, + 30556, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30528, 30560, 30561, 30556, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30528, 30560, 30561, 30556, 30558, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30528, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30592, + 30560, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30560, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30592, 30560, 30562, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30560, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30592, 30560, 30564, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 30560, + 30564, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30560, 30568, 30566, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30560, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30592, 30560, 30568, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 30560, + 30568, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30560, 30568, 30570, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30560, 30568, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30592, 30560, 30576, + 30572, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30560, 30576, 30572, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30560, 30576, 30577, 30574, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30592, + 30560, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30593, 30576, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30592, 30593, 30576, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30592, 30593, 30576, 30578, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30592, + 30593, 30576, 0, 16384, 24576, 28672, 30720, 30721, + 30464, 30592, 30593, 30576, 30580, 0, 16384, 24576, + 28672, 30720, 30721, 30464, 30592, 30593, 30576, 30580, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30592, + 30593, 30576, 30584, 30582, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30593, 30576, 0, 16384, + 24576, 28672, 30720, 30721, 30464, 30592, 30593, 30576, + 30584, 0, 16384, 24576, 28672, 30720, 30721, 30464, + 30592, 30593, 30595, 30584, 0, 16384, 24576, 28672, + 30720, 30721, 30464, 30592, 30593, 30595, 30584, 30586, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 30592, + 30593, 30595, 30584, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30592, 30593, 30595, 30584, 30588, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 30593, + 30595, 30584, 30588, 0, 16384, 24576, 28672, 30720, + 30721, 30464, 30592, 30593, 30595, 30584, 30588, 30590, + 0, 16384, 24576, 28672, 30720, 30721, 30464, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 0, + 16384, 24576, 28672, 30720, 30721, 30464, 30592, 30594, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30596, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30596, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30592, 30600, 30598, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30600, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30600, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30592, 30600, 30602, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30600, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30608, 30604, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30592, 30608, 30604, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30608, 30609, 30606, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30608, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30608, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30592, 30608, 30610, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30608, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30608, 30612, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30608, + 30612, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30608, 30616, 30614, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30608, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30624, 30616, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30624, + 30616, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 30616, 30618, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 30616, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30592, 30624, 30625, + 30620, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 30625, 30620, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 30625, 30620, 30622, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30624, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30592, 30624, 30626, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30624, 30628, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30624, + 30628, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 30632, 30630, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30624, 30632, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30624, + 30632, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 30632, 30634, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 30632, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30592, 30624, 30640, + 30636, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30624, 30640, 30636, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30624, 30640, 30641, 30638, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30624, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30656, 30640, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30592, 30656, 30640, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30656, 30640, 30642, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30656, 30640, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30592, 30656, 30640, 30644, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30656, 30640, 30644, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30656, 30640, 30648, 30646, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30656, 30640, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30592, 30656, 30657, + 30648, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30656, 30657, 30648, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30656, 30657, 30648, 30650, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30656, 30657, 30648, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30592, 30656, 30657, 30648, 30652, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30656, + 30657, 30659, 30652, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30592, 30656, 30657, 30659, 30652, 30654, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30592, + 30656, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30656, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30592, 30656, 30658, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30592, 30656, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30592, 30656, 30660, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30592, 30656, + 30660, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30592, 30656, 30664, 30662, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30656, 30664, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30656, + 30664, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30664, 30666, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30664, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30727, 30656, 30672, + 30668, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30672, 30668, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30672, 30673, 30670, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30672, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30672, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30656, 30672, 30674, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30672, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30727, 30656, 30672, 30676, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30656, 30672, 30676, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30672, 30680, 30678, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30672, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30727, 30656, 30688, + 30680, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30688, 30680, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30688, 30680, 30682, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30688, 30680, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30688, 30689, 30684, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30656, + 30688, 30689, 30684, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30688, 30689, 30684, 30686, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30688, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30688, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30656, 30688, 30690, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30688, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30727, 30656, 30688, 30692, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30656, 30688, 30692, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30688, 30696, 30694, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30688, 0, 16384, + 24576, 28672, 30720, 30721, 30723, 30727, 30656, 30688, + 30696, 0, 16384, 24576, 28672, 30720, 30721, 30723, + 30727, 30656, 30688, 30696, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30656, 30688, 30696, 30698, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30656, 30688, 30696, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30688, 30704, 30700, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30656, + 30688, 30704, 30700, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30656, 30688, 30704, 30705, 30702, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30735, 30688, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30727, 30735, 30688, 30704, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30735, 30688, 30704, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30735, 30688, 30704, 30706, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30735, 30688, 30704, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30735, + 30688, 30704, 30708, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30735, 30688, 30704, 30708, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30735, + 30688, 30704, 30712, 30710, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30735, 30688, 30704, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30735, + 30688, 30704, 30712, 0, 16384, 24576, 28672, 30720, + 30721, 30723, 30727, 30735, 30688, 30704, 30712, 0, + 16384, 24576, 28672, 30720, 30721, 30723, 30727, 30735, + 30688, 30704, 30712, 30714, 0, 16384, 24576, 28672, + 30720, 30721, 30723, 30727, 30735, 30688, 30704, 30712, + 0, 16384, 24576, 28672, 30720, 30721, 30723, 30727, + 30735, 30688, 30704, 30712, 30716, 0, 16384, 24576, + 28672, 30720, 30721, 30723, 30727, 30735, 30688, 30704, + 30712, 30716, 0, 16384, 24576, 28672, 30720, 30721, + 30723, 30727, 30735, 30688, 30704, 30712, 30716, 30718, + 0, 16384, 24576, 28672, 0, 16384, 24576, 28672, + 30720, 0, 16384, 24576, 28672, 30720, 0, 16384, + 24576, 28672, 30720, 30722, 0, 16384, 24576, 28672, + 30720, 0, 16384, 24576, 28672, 30720, 30724, 0, + 16384, 24576, 28672, 30720, 30724, 0, 16384, 24576, + 28672, 30720, 30728, 30726, 0, 16384, 24576, 28672, + 30720, 0, 16384, 24576, 28672, 30720, 30728, 0, + 16384, 24576, 28672, 30720, 30728, 0, 16384, 24576, + 28672, 30720, 30728, 30730, 0, 16384, 24576, 28672, + 30720, 30728, 0, 16384, 24576, 28672, 30720, 30736, + 30732, 0, 16384, 24576, 28672, 30720, 30736, 30732, + 0, 16384, 24576, 28672, 30720, 30736, 30737, 30734, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 30736, 0, 16384, 24576, 28672, 30720, + 30736, 0, 16384, 24576, 28672, 30720, 30736, 30738, + 0, 16384, 24576, 28672, 30720, 30736, 0, 16384, + 24576, 28672, 30720, 30736, 30740, 0, 16384, 24576, + 28672, 30720, 30736, 30740, 0, 16384, 24576, 28672, + 30720, 30736, 30744, 30742, 0, 16384, 24576, 28672, + 30720, 30736, 0, 16384, 24576, 28672, 30720, 30752, + 30744, 0, 16384, 24576, 28672, 30720, 30752, 30744, + 0, 16384, 24576, 28672, 30720, 30752, 30744, 30746, + 0, 16384, 24576, 28672, 30720, 30752, 30744, 0, + 16384, 24576, 28672, 30720, 30752, 30753, 30748, 0, + 16384, 24576, 28672, 30720, 30752, 30753, 30748, 0, + 16384, 24576, 28672, 30720, 30752, 30753, 30748, 30750, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 30752, 0, 16384, 24576, 28672, 30720, + 30752, 0, 16384, 24576, 28672, 30720, 30752, 30754, + 0, 16384, 24576, 28672, 30720, 30752, 0, 16384, + 24576, 28672, 30720, 30752, 30756, 0, 16384, 24576, + 28672, 30720, 30752, 30756, 0, 16384, 24576, 28672, + 30720, 30752, 30760, 30758, 0, 16384, 24576, 28672, + 30720, 30752, 0, 16384, 24576, 28672, 30720, 30752, + 30760, 0, 16384, 24576, 28672, 30720, 30752, 30760, + 0, 16384, 24576, 28672, 30720, 30752, 30760, 30762, + 0, 16384, 24576, 28672, 30720, 30752, 30760, 0, + 16384, 24576, 28672, 30720, 30752, 30768, 30764, 0, + 16384, 24576, 28672, 30720, 30752, 30768, 30764, 0, + 16384, 24576, 28672, 30720, 30752, 30768, 30769, 30766, + 0, 16384, 24576, 28672, 30720, 30752, 0, 16384, + 24576, 28672, 30720, 30784, 30768, 0, 16384, 24576, + 28672, 30720, 30784, 30768, 0, 16384, 24576, 28672, + 30720, 30784, 30768, 30770, 0, 16384, 24576, 28672, + 30720, 30784, 30768, 0, 16384, 24576, 28672, 30720, + 30784, 30768, 30772, 0, 16384, 24576, 28672, 30720, + 30784, 30768, 30772, 0, 16384, 24576, 28672, 30720, + 30784, 30768, 30776, 30774, 0, 16384, 24576, 28672, + 30720, 30784, 30768, 0, 16384, 24576, 28672, 30720, + 30784, 30785, 30776, 0, 16384, 24576, 28672, 30720, + 30784, 30785, 30776, 0, 16384, 24576, 28672, 30720, + 30784, 30785, 30776, 30778, 0, 16384, 24576, 28672, + 30720, 30784, 30785, 30776, 0, 16384, 24576, 28672, + 30720, 30784, 30785, 30776, 30780, 0, 16384, 24576, + 28672, 30720, 30784, 30785, 30787, 30780, 0, 16384, + 24576, 28672, 30720, 30784, 30785, 30787, 30780, 30782, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 30784, 0, 16384, 24576, 28672, 30720, + 30784, 0, 16384, 24576, 28672, 30720, 30784, 30786, + 0, 16384, 24576, 28672, 30720, 30784, 0, 16384, + 24576, 28672, 30720, 30784, 30788, 0, 16384, 24576, + 28672, 30720, 30784, 30788, 0, 16384, 24576, 28672, + 30720, 30784, 30792, 30790, 0, 16384, 24576, 28672, + 30720, 30784, 0, 16384, 24576, 28672, 30720, 30784, + 30792, 0, 16384, 24576, 28672, 30720, 30784, 30792, + 0, 16384, 24576, 28672, 30720, 30784, 30792, 30794, + 0, 16384, 24576, 28672, 30720, 30784, 30792, 0, + 16384, 24576, 28672, 30720, 30784, 30800, 30796, 0, + 16384, 24576, 28672, 30720, 30784, 30800, 30796, 0, + 16384, 24576, 28672, 30720, 30784, 30800, 30801, 30798, + 0, 16384, 24576, 28672, 30720, 30784, 0, 16384, + 24576, 28672, 30720, 30784, 30800, 0, 16384, 24576, + 28672, 30720, 30784, 30800, 0, 16384, 24576, 28672, + 30720, 30784, 30800, 30802, 0, 16384, 24576, 28672, + 30720, 30784, 30800, 0, 16384, 24576, 28672, 30720, + 30784, 30800, 30804, 0, 16384, 24576, 28672, 30720, + 30784, 30800, 30804, 0, 16384, 24576, 28672, 30720, + 30784, 30800, 30808, 30806, 0, 16384, 24576, 28672, + 30720, 30784, 30800, 0, 16384, 24576, 28672, 30720, + 30784, 30816, 30808, 0, 16384, 24576, 28672, 30720, + 30784, 30816, 30808, 0, 16384, 24576, 28672, 30720, + 30784, 30816, 30808, 30810, 0, 16384, 24576, 28672, + 30720, 30784, 30816, 30808, 0, 16384, 24576, 28672, + 30720, 30784, 30816, 30817, 30812, 0, 16384, 24576, + 28672, 30720, 30784, 30816, 30817, 30812, 0, 16384, + 24576, 28672, 30720, 30784, 30816, 30817, 30812, 30814, + 0, 16384, 24576, 28672, 30720, 30784, 0, 16384, + 24576, 28672, 30720, 30848, 30816, 0, 16384, 24576, + 28672, 30720, 30848, 30816, 0, 16384, 24576, 28672, + 30720, 30848, 30816, 30818, 0, 16384, 24576, 28672, + 30720, 30848, 30816, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30820, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30820, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30824, 30822, 0, 16384, 24576, 28672, + 30720, 30848, 30816, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30824, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30824, 0, 16384, 24576, 28672, 30720, + 30848, 30816, 30824, 30826, 0, 16384, 24576, 28672, + 30720, 30848, 30816, 30824, 0, 16384, 24576, 28672, + 30720, 30848, 30816, 30832, 30828, 0, 16384, 24576, + 28672, 30720, 30848, 30816, 30832, 30828, 0, 16384, + 24576, 28672, 30720, 30848, 30816, 30832, 30833, 30830, + 0, 16384, 24576, 28672, 30720, 30848, 30816, 0, + 16384, 24576, 28672, 30720, 30848, 30849, 30832, 0, + 16384, 24576, 28672, 30720, 30848, 30849, 30832, 0, + 16384, 24576, 28672, 30720, 30848, 30849, 30832, 30834, + 0, 16384, 24576, 28672, 30720, 30848, 30849, 30832, + 0, 16384, 24576, 28672, 30720, 30848, 30849, 30832, + 30836, 0, 16384, 24576, 28672, 30720, 30848, 30849, + 30832, 30836, 0, 16384, 24576, 28672, 30720, 30848, + 30849, 30832, 30840, 30838, 0, 16384, 24576, 28672, + 30720, 30848, 30849, 30832, 0, 16384, 24576, 28672, + 30720, 30848, 30849, 30832, 30840, 0, 16384, 24576, + 28672, 30720, 30848, 30849, 30851, 30840, 0, 16384, + 24576, 28672, 30720, 30848, 30849, 30851, 30840, 30842, + 0, 16384, 24576, 28672, 30720, 30848, 30849, 30851, + 30840, 0, 16384, 24576, 28672, 30720, 30848, 30849, + 30851, 30840, 30844, 0, 16384, 24576, 28672, 30720, + 30848, 30849, 30851, 30840, 30844, 0, 16384, 24576, + 28672, 30720, 30848, 30849, 30851, 30840, 30844, 30846, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 30848, 0, 16384, 24576, 28672, 30720, + 30848, 0, 16384, 24576, 28672, 30720, 30848, 30850, + 0, 16384, 24576, 28672, 30720, 30848, 0, 16384, + 24576, 28672, 30720, 30848, 30852, 0, 16384, 24576, + 28672, 30720, 30848, 30852, 0, 16384, 24576, 28672, + 30720, 30848, 30856, 30854, 0, 16384, 24576, 28672, + 30720, 30848, 0, 16384, 24576, 28672, 30720, 30848, + 30856, 0, 16384, 24576, 28672, 30720, 30848, 30856, + 0, 16384, 24576, 28672, 30720, 30848, 30856, 30858, + 0, 16384, 24576, 28672, 30720, 30848, 30856, 0, + 16384, 24576, 28672, 30720, 30848, 30864, 30860, 0, + 16384, 24576, 28672, 30720, 30848, 30864, 30860, 0, + 16384, 24576, 28672, 30720, 30848, 30864, 30865, 30862, + 0, 16384, 24576, 28672, 30720, 30848, 0, 16384, + 24576, 28672, 30720, 30848, 30864, 0, 16384, 24576, + 28672, 30720, 30848, 30864, 0, 16384, 24576, 28672, + 30720, 30848, 30864, 30866, 0, 16384, 24576, 28672, + 30720, 30848, 30864, 0, 16384, 24576, 28672, 30720, + 30848, 30864, 30868, 0, 16384, 24576, 28672, 30720, + 30848, 30864, 30868, 0, 16384, 24576, 28672, 30720, + 30848, 30864, 30872, 30870, 0, 16384, 24576, 28672, + 30720, 30848, 30864, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30872, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30872, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30872, 30874, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 30872, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 30881, 30876, 0, 16384, 24576, + 28672, 30720, 30848, 30880, 30881, 30876, 0, 16384, + 24576, 28672, 30720, 30848, 30880, 30881, 30876, 30878, + 0, 16384, 24576, 28672, 30720, 30848, 0, 16384, + 24576, 28672, 30720, 30848, 30880, 0, 16384, 24576, + 28672, 30720, 30848, 30880, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 30882, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30884, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30884, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30888, 30886, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30888, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30888, 0, 16384, 24576, 28672, 30720, + 30848, 30880, 30888, 30890, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 30888, 0, 16384, 24576, 28672, + 30720, 30848, 30880, 30896, 30892, 0, 16384, 24576, + 28672, 30720, 30848, 30880, 30896, 30892, 0, 16384, + 24576, 28672, 30720, 30848, 30880, 30896, 30897, 30894, + 0, 16384, 24576, 28672, 30720, 30848, 30880, 0, + 16384, 24576, 28672, 30720, 30848, 30912, 30896, 0, + 16384, 24576, 28672, 30720, 30848, 30912, 30896, 0, + 16384, 24576, 28672, 30720, 30848, 30912, 30896, 30898, + 0, 16384, 24576, 28672, 30720, 30848, 30912, 30896, + 0, 16384, 24576, 28672, 30720, 30848, 30912, 30896, + 30900, 0, 16384, 24576, 28672, 30720, 30848, 30912, + 30896, 30900, 0, 16384, 24576, 28672, 30720, 30848, + 30912, 30896, 30904, 30902, 0, 16384, 24576, 28672, + 30720, 30848, 30912, 30896, 0, 16384, 24576, 28672, + 30720, 30848, 30912, 30913, 30904, 0, 16384, 24576, + 28672, 30720, 30848, 30912, 30913, 30904, 0, 16384, + 24576, 28672, 30720, 30848, 30912, 30913, 30904, 30906, + 0, 16384, 24576, 28672, 30720, 30848, 30912, 30913, + 30904, 0, 16384, 24576, 28672, 30720, 30848, 30912, + 30913, 30904, 30908, 0, 16384, 24576, 28672, 30720, + 30848, 30912, 30913, 30915, 30908, 0, 16384, 24576, + 28672, 30720, 30848, 30912, 30913, 30915, 30908, 30910, + 0, 16384, 24576, 28672, 30720, 30848, 0, 16384, + 24576, 28672, 30720, 30976, 30912, 0, 16384, 24576, + 28672, 30720, 30976, 30912, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 30914, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30916, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30916, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30920, 30918, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30920, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30920, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30920, 30922, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 30920, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 30928, 30924, 0, 16384, 24576, + 28672, 30720, 30976, 30912, 30928, 30924, 0, 16384, + 24576, 28672, 30720, 30976, 30912, 30928, 30929, 30926, + 0, 16384, 24576, 28672, 30720, 30976, 30912, 0, + 16384, 24576, 28672, 30720, 30976, 30912, 30928, 0, + 16384, 24576, 28672, 30720, 30976, 30912, 30928, 0, + 16384, 24576, 28672, 30720, 30976, 30912, 30928, 30930, + 0, 16384, 24576, 28672, 30720, 30976, 30912, 30928, + 0, 16384, 24576, 28672, 30720, 30976, 30912, 30928, + 30932, 0, 16384, 24576, 28672, 30720, 30976, 30912, + 30928, 30932, 0, 16384, 24576, 28672, 30720, 30976, + 30912, 30928, 30936, 30934, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 30928, 0, 16384, 24576, 28672, + 30720, 30976, 30912, 30944, 30936, 0, 16384, 24576, + 28672, 30720, 30976, 30912, 30944, 30936, 0, 16384, + 24576, 28672, 30720, 30976, 30912, 30944, 30936, 30938, + 0, 16384, 24576, 28672, 30720, 30976, 30912, 30944, + 30936, 0, 16384, 24576, 28672, 30720, 30976, 30912, + 30944, 30945, 30940, 0, 16384, 24576, 28672, 30720, + 30976, 30912, 30944, 30945, 30940, 0, 16384, 24576, + 28672, 30720, 30976, 30912, 30944, 30945, 30940, 30942, + 0, 16384, 24576, 28672, 30720, 30976, 30912, 0, + 16384, 24576, 28672, 30720, 30976, 30977, 30944, 0, + 16384, 24576, 28672, 30720, 30976, 30977, 30944, 0, + 16384, 24576, 28672, 30720, 30976, 30977, 30944, 30946, + 0, 16384, 24576, 28672, 30720, 30976, 30977, 30944, + 0, 16384, 24576, 28672, 30720, 30976, 30977, 30944, + 30948, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30944, 30948, 0, 16384, 24576, 28672, 30720, 30976, + 30977, 30944, 30952, 30950, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30944, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30944, 30952, 0, 16384, 24576, + 28672, 30720, 30976, 30977, 30944, 30952, 0, 16384, + 24576, 28672, 30720, 30976, 30977, 30944, 30952, 30954, + 0, 16384, 24576, 28672, 30720, 30976, 30977, 30944, + 30952, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30944, 30960, 30956, 0, 16384, 24576, 28672, 30720, + 30976, 30977, 30944, 30960, 30956, 0, 16384, 24576, + 28672, 30720, 30976, 30977, 30944, 30960, 30961, 30958, + 0, 16384, 24576, 28672, 30720, 30976, 30977, 30944, + 0, 16384, 24576, 28672, 30720, 30976, 30977, 30944, + 30960, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30979, 30960, 0, 16384, 24576, 28672, 30720, 30976, + 30977, 30979, 30960, 30962, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30979, 30960, 0, 16384, 24576, + 28672, 30720, 30976, 30977, 30979, 30960, 30964, 0, + 16384, 24576, 28672, 30720, 30976, 30977, 30979, 30960, + 30964, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30979, 30960, 30968, 30966, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30979, 30960, 0, 16384, 24576, + 28672, 30720, 30976, 30977, 30979, 30960, 30968, 0, + 16384, 24576, 28672, 30720, 30976, 30977, 30979, 30960, + 30968, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30979, 30960, 30968, 30970, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30979, 30983, 30968, 0, 16384, + 24576, 28672, 30720, 30976, 30977, 30979, 30983, 30968, + 30972, 0, 16384, 24576, 28672, 30720, 30976, 30977, + 30979, 30983, 30968, 30972, 0, 16384, 24576, 28672, + 30720, 30976, 30977, 30979, 30983, 30968, 30972, 30974, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 30976, 0, 16384, 24576, 28672, 30720, + 30976, 0, 16384, 24576, 28672, 30720, 30976, 30978, + 0, 16384, 24576, 28672, 30720, 30976, 0, 16384, + 24576, 28672, 30720, 30976, 30980, 0, 16384, 24576, + 28672, 30720, 30976, 30980, 0, 16384, 24576, 28672, + 30720, 30976, 30984, 30982, 0, 16384, 24576, 28672, + 30720, 30976, 0, 16384, 24576, 28672, 30720, 30976, + 30984, 0, 16384, 24576, 28672, 30720, 30976, 30984, + 0, 16384, 24576, 28672, 30720, 30976, 30984, 30986, + 0, 16384, 24576, 28672, 30720, 30976, 30984, 0, + 16384, 24576, 28672, 30720, 30976, 30992, 30988, 0, + 16384, 24576, 28672, 30720, 30976, 30992, 30988, 0, + 16384, 24576, 28672, 30720, 30976, 30992, 30993, 30990, + 0, 16384, 24576, 28672, 30720, 30976, 0, 16384, + 24576, 28672, 30720, 30976, 30992, 0, 16384, 24576, + 28672, 30720, 30976, 30992, 0, 16384, 24576, 28672, + 30720, 30976, 30992, 30994, 0, 16384, 24576, 28672, + 30720, 30976, 30992, 0, 16384, 24576, 28672, 30720, + 30976, 30992, 30996, 0, 16384, 24576, 28672, 30720, + 30976, 30992, 30996, 0, 16384, 24576, 28672, 30720, + 30976, 30992, 31000, 30998, 0, 16384, 24576, 28672, + 30720, 30976, 30992, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31000, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31000, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31000, 31002, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 31000, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 31009, 31004, 0, 16384, 24576, + 28672, 30720, 30976, 31008, 31009, 31004, 0, 16384, + 24576, 28672, 30720, 30976, 31008, 31009, 31004, 31006, + 0, 16384, 24576, 28672, 30720, 30976, 0, 16384, + 24576, 28672, 30720, 30976, 31008, 0, 16384, 24576, + 28672, 30720, 30976, 31008, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 31010, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31012, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31012, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31016, 31014, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31016, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31016, 0, 16384, 24576, 28672, 30720, + 30976, 31008, 31016, 31018, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 31016, 0, 16384, 24576, 28672, + 30720, 30976, 31008, 31024, 31020, 0, 16384, 24576, + 28672, 30720, 30976, 31008, 31024, 31020, 0, 16384, + 24576, 28672, 30720, 30976, 31008, 31024, 31025, 31022, + 0, 16384, 24576, 28672, 30720, 30976, 31008, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31024, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31024, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31024, 31026, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31024, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31024, + 31028, 0, 16384, 24576, 28672, 30720, 30976, 31040, + 31024, 31028, 0, 16384, 24576, 28672, 30720, 30976, + 31040, 31024, 31032, 31030, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31024, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31041, 31032, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 31041, 31032, 0, 16384, + 24576, 28672, 30720, 30976, 31040, 31041, 31032, 31034, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31041, + 31032, 0, 16384, 24576, 28672, 30720, 30976, 31040, + 31041, 31032, 31036, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31041, 31043, 31036, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 31041, 31043, 31036, 31038, + 0, 16384, 24576, 28672, 30720, 30976, 0, 16384, + 24576, 28672, 30720, 30976, 31040, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31042, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31044, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31044, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31048, 31046, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31048, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31048, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31048, 31050, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31048, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31056, 31052, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 31056, 31052, 0, 16384, + 24576, 28672, 30720, 30976, 31040, 31056, 31057, 31054, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31056, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31056, 0, + 16384, 24576, 28672, 30720, 30976, 31040, 31056, 31058, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31056, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31056, + 31060, 0, 16384, 24576, 28672, 30720, 30976, 31040, + 31056, 31060, 0, 16384, 24576, 28672, 30720, 30976, + 31040, 31056, 31064, 31062, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31056, 0, 16384, 24576, 28672, + 30720, 30976, 31040, 31072, 31064, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 31072, 31064, 0, 16384, + 24576, 28672, 30720, 30976, 31040, 31072, 31064, 31066, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 31072, + 31064, 0, 16384, 24576, 28672, 30720, 30976, 31040, + 31072, 31073, 31068, 0, 16384, 24576, 28672, 30720, + 30976, 31040, 31072, 31073, 31068, 0, 16384, 24576, + 28672, 30720, 30976, 31040, 31072, 31073, 31068, 31070, + 0, 16384, 24576, 28672, 30720, 30976, 31040, 0, + 16384, 24576, 28672, 30720, 30976, 31104, 31072, 0, + 16384, 24576, 28672, 30720, 30976, 31104, 31072, 0, + 16384, 24576, 28672, 30720, 30976, 31104, 31072, 31074, + 0, 16384, 24576, 28672, 30720, 30976, 31104, 31072, + 0, 16384, 24576, 28672, 30720, 30976, 31104, 31072, + 31076, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31072, 31076, 0, 16384, 24576, 28672, 30720, 30976, + 31104, 31072, 31080, 31078, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31072, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31072, 31080, 0, 16384, 24576, + 28672, 30720, 30976, 31104, 31072, 31080, 0, 16384, + 24576, 28672, 30720, 30976, 31104, 31072, 31080, 31082, + 0, 16384, 24576, 28672, 30720, 30976, 31104, 31072, + 31080, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31072, 31088, 31084, 0, 16384, 24576, 28672, 30720, + 30976, 31104, 31072, 31088, 31084, 0, 16384, 24576, + 28672, 30720, 30976, 31104, 31072, 31088, 31089, 31086, + 0, 16384, 24576, 28672, 30720, 30976, 31104, 31072, + 0, 16384, 24576, 28672, 30720, 30976, 31104, 31105, + 31088, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31105, 31088, 0, 16384, 24576, 28672, 30720, 30976, + 31104, 31105, 31088, 31090, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31105, 31088, 0, 16384, 24576, + 28672, 30720, 30976, 31104, 31105, 31088, 31092, 0, + 16384, 24576, 28672, 30720, 30976, 31104, 31105, 31088, + 31092, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31105, 31088, 31096, 31094, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31105, 31088, 0, 16384, 24576, + 28672, 30720, 30976, 31104, 31105, 31088, 31096, 0, + 16384, 24576, 28672, 30720, 30976, 31104, 31105, 31107, + 31096, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31105, 31107, 31096, 31098, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31105, 31107, 31096, 0, 16384, + 24576, 28672, 30720, 30976, 31104, 31105, 31107, 31096, + 31100, 0, 16384, 24576, 28672, 30720, 30976, 31104, + 31105, 31107, 31096, 31100, 0, 16384, 24576, 28672, + 30720, 30976, 31104, 31105, 31107, 31096, 31100, 31102, + 0, 16384, 24576, 28672, 30720, 30976, 0, 16384, + 24576, 28672, 30720, 31232, 31104, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31106, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31108, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31108, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31112, 31110, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31112, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31112, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31112, 31114, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31112, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31120, 31116, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31120, 31116, 0, 16384, + 24576, 28672, 30720, 31232, 31104, 31120, 31121, 31118, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31120, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31120, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31120, 31122, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31120, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31120, + 31124, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31120, 31124, 0, 16384, 24576, 28672, 30720, 31232, + 31104, 31120, 31128, 31126, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31120, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31136, 31128, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31136, 31128, 0, 16384, + 24576, 28672, 30720, 31232, 31104, 31136, 31128, 31130, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31136, + 31128, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31136, 31137, 31132, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31136, 31137, 31132, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31136, 31137, 31132, 31134, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31136, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31136, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31136, 31138, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31136, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31136, + 31140, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31136, 31140, 0, 16384, 24576, 28672, 30720, 31232, + 31104, 31136, 31144, 31142, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31136, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31136, 31144, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31136, 31144, 0, 16384, + 24576, 28672, 30720, 31232, 31104, 31136, 31144, 31146, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31136, + 31144, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31136, 31152, 31148, 0, 16384, 24576, 28672, 30720, + 31232, 31104, 31136, 31152, 31148, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31136, 31152, 31153, 31150, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31136, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 31168, + 31152, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31168, 31152, 0, 16384, 24576, 28672, 30720, 31232, + 31104, 31168, 31152, 31154, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31168, 31152, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31168, 31152, 31156, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31168, 31152, + 31156, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31168, 31152, 31160, 31158, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31168, 31152, 0, 16384, 24576, + 28672, 30720, 31232, 31104, 31168, 31169, 31160, 0, + 16384, 24576, 28672, 30720, 31232, 31104, 31168, 31169, + 31160, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31168, 31169, 31160, 31162, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31168, 31169, 31160, 0, 16384, + 24576, 28672, 30720, 31232, 31104, 31168, 31169, 31160, + 31164, 0, 16384, 24576, 28672, 30720, 31232, 31104, + 31168, 31169, 31171, 31164, 0, 16384, 24576, 28672, + 30720, 31232, 31104, 31168, 31169, 31171, 31164, 31166, + 0, 16384, 24576, 28672, 30720, 31232, 31104, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31168, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31168, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31168, 31170, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 31172, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31172, 0, 16384, 24576, 28672, 30720, 31232, + 31233, 31168, 31176, 31174, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 31176, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31168, 31176, 0, 16384, + 24576, 28672, 30720, 31232, 31233, 31168, 31176, 31178, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 31176, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31184, 31180, 0, 16384, 24576, 28672, 30720, + 31232, 31233, 31168, 31184, 31180, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31168, 31184, 31185, 31182, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 31184, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31184, 0, 16384, 24576, 28672, 30720, 31232, + 31233, 31168, 31184, 31186, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 31184, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31168, 31184, 31188, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31168, 31184, + 31188, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31184, 31192, 31190, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 31184, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31168, 31200, 31192, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31168, 31200, + 31192, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31200, 31192, 31194, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 31200, 31192, 0, 16384, + 24576, 28672, 30720, 31232, 31233, 31168, 31200, 31201, + 31196, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31168, 31200, 31201, 31196, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31168, 31200, 31201, 31196, 31198, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31168, + 31200, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31200, 0, 16384, 24576, 28672, 30720, 31232, + 31233, 31235, 31200, 31202, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31200, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31235, 31200, 31204, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31235, 31200, + 31204, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31200, 31208, 31206, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31200, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31235, 31200, 31208, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31235, 31200, + 31208, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31200, 31208, 31210, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31200, 31208, 0, 16384, + 24576, 28672, 30720, 31232, 31233, 31235, 31200, 31216, + 31212, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31200, 31216, 31212, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31200, 31216, 31217, 31214, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31235, + 31200, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31200, 31216, 0, 16384, 24576, 28672, 30720, + 31232, 31233, 31235, 31200, 31216, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31235, 31200, 31216, 31218, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31235, + 31239, 31216, 0, 16384, 24576, 28672, 30720, 31232, + 31233, 31235, 31239, 31216, 31220, 0, 16384, 24576, + 28672, 30720, 31232, 31233, 31235, 31239, 31216, 31220, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31235, + 31239, 31216, 31224, 31222, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31239, 31216, 0, 16384, + 24576, 28672, 30720, 31232, 31233, 31235, 31239, 31216, + 31224, 0, 16384, 24576, 28672, 30720, 31232, 31233, + 31235, 31239, 31216, 31224, 0, 16384, 24576, 28672, + 30720, 31232, 31233, 31235, 31239, 31216, 31224, 31226, + 0, 16384, 24576, 28672, 30720, 31232, 31233, 31235, + 31239, 31216, 31224, 0, 16384, 24576, 28672, 30720, + 31232, 31233, 31235, 31239, 31216, 31224, 31228, 0, + 16384, 24576, 28672, 30720, 31232, 31233, 31235, 31239, + 31216, 31224, 31228, 0, 16384, 24576, 28672, 30720, + 31232, 31233, 31235, 31239, 31216, 31224, 31228, 31230, + 0, 16384, 24576, 28672, 30720, 0, 16384, 24576, + 28672, 30720, 31232, 0, 16384, 24576, 28672, 30720, + 31232, 0, 16384, 24576, 28672, 30720, 31232, 31234, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31236, 0, 16384, 24576, + 28672, 30720, 31232, 31236, 0, 16384, 24576, 28672, + 30720, 31232, 31240, 31238, 0, 16384, 24576, 28672, + 30720, 31232, 0, 16384, 24576, 28672, 30720, 31232, + 31240, 0, 16384, 24576, 28672, 30720, 31232, 31240, + 0, 16384, 24576, 28672, 30720, 31232, 31240, 31242, + 0, 16384, 24576, 28672, 30720, 31232, 31240, 0, + 16384, 24576, 28672, 30720, 31232, 31248, 31244, 0, + 16384, 24576, 28672, 30720, 31232, 31248, 31244, 0, + 16384, 24576, 28672, 30720, 31232, 31248, 31249, 31246, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31248, 0, 16384, 24576, + 28672, 30720, 31232, 31248, 0, 16384, 24576, 28672, + 30720, 31232, 31248, 31250, 0, 16384, 24576, 28672, + 30720, 31232, 31248, 0, 16384, 24576, 28672, 30720, + 31232, 31248, 31252, 0, 16384, 24576, 28672, 30720, + 31232, 31248, 31252, 0, 16384, 24576, 28672, 30720, + 31232, 31248, 31256, 31254, 0, 16384, 24576, 28672, + 30720, 31232, 31248, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31256, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31256, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31256, 31258, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 31256, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 31265, 31260, 0, 16384, 24576, + 28672, 30720, 31232, 31264, 31265, 31260, 0, 16384, + 24576, 28672, 30720, 31232, 31264, 31265, 31260, 31262, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31264, 0, 16384, 24576, + 28672, 30720, 31232, 31264, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 31266, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31268, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31268, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31272, 31270, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31272, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31272, 0, 16384, 24576, 28672, 30720, + 31232, 31264, 31272, 31274, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 31272, 0, 16384, 24576, 28672, + 30720, 31232, 31264, 31280, 31276, 0, 16384, 24576, + 28672, 30720, 31232, 31264, 31280, 31276, 0, 16384, + 24576, 28672, 30720, 31232, 31264, 31280, 31281, 31278, + 0, 16384, 24576, 28672, 30720, 31232, 31264, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31280, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31280, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31280, 31282, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31280, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31280, + 31284, 0, 16384, 24576, 28672, 30720, 31232, 31296, + 31280, 31284, 0, 16384, 24576, 28672, 30720, 31232, + 31296, 31280, 31288, 31286, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31280, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31297, 31288, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 31297, 31288, 0, 16384, + 24576, 28672, 30720, 31232, 31296, 31297, 31288, 31290, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31297, + 31288, 0, 16384, 24576, 28672, 30720, 31232, 31296, + 31297, 31288, 31292, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31297, 31299, 31292, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 31297, 31299, 31292, 31294, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31296, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31298, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31300, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31300, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31304, 31302, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31304, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31304, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31304, 31306, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31304, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31312, 31308, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 31312, 31308, 0, 16384, + 24576, 28672, 30720, 31232, 31296, 31312, 31313, 31310, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31312, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31312, 0, + 16384, 24576, 28672, 30720, 31232, 31296, 31312, 31314, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31312, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31312, + 31316, 0, 16384, 24576, 28672, 30720, 31232, 31296, + 31312, 31316, 0, 16384, 24576, 28672, 30720, 31232, + 31296, 31312, 31320, 31318, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31312, 0, 16384, 24576, 28672, + 30720, 31232, 31296, 31328, 31320, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 31328, 31320, 0, 16384, + 24576, 28672, 30720, 31232, 31296, 31328, 31320, 31322, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 31328, + 31320, 0, 16384, 24576, 28672, 30720, 31232, 31296, + 31328, 31329, 31324, 0, 16384, 24576, 28672, 30720, + 31232, 31296, 31328, 31329, 31324, 0, 16384, 24576, + 28672, 30720, 31232, 31296, 31328, 31329, 31324, 31326, + 0, 16384, 24576, 28672, 30720, 31232, 31296, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31328, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31328, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31328, 31330, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31328, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31328, + 31332, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31328, 31332, 0, 16384, 24576, 28672, 30720, 31232, + 31360, 31328, 31336, 31334, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31328, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31328, 31336, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31328, 31336, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31328, 31336, 31338, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31328, + 31336, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31328, 31344, 31340, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31328, 31344, 31340, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31328, 31344, 31345, 31342, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31328, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31361, + 31344, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31361, 31344, 0, 16384, 24576, 28672, 30720, 31232, + 31360, 31361, 31344, 31346, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31361, 31344, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31361, 31344, 31348, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31361, 31344, + 31348, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31361, 31344, 31352, 31350, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31361, 31344, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31361, 31344, 31352, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31361, 31363, + 31352, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31361, 31363, 31352, 31354, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31361, 31363, 31352, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31361, 31363, 31352, + 31356, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31361, 31363, 31352, 31356, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31361, 31363, 31352, 31356, 31358, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31362, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31364, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31364, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31368, 31366, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31368, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31368, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31368, 31370, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31368, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31376, 31372, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31376, 31372, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31376, 31377, 31374, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31376, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31376, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31376, 31378, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31376, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31376, + 31380, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31376, 31380, 0, 16384, 24576, 28672, 30720, 31232, + 31360, 31376, 31384, 31382, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31376, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31392, 31384, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31392, 31384, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31392, 31384, 31386, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31392, + 31384, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31392, 31393, 31388, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31392, 31393, 31388, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31392, 31393, 31388, 31390, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31392, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31392, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31392, 31394, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31392, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31392, + 31396, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31392, 31396, 0, 16384, 24576, 28672, 30720, 31232, + 31360, 31392, 31400, 31398, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31392, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31392, 31400, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31392, 31400, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31392, 31400, 31402, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31392, + 31400, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31392, 31408, 31404, 0, 16384, 24576, 28672, 30720, + 31232, 31360, 31392, 31408, 31404, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31392, 31408, 31409, 31406, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31392, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 31424, + 31408, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31424, 31408, 0, 16384, 24576, 28672, 30720, 31232, + 31360, 31424, 31408, 31410, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31424, 31408, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31424, 31408, 31412, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31424, 31408, + 31412, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31424, 31408, 31416, 31414, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31424, 31408, 0, 16384, 24576, + 28672, 30720, 31232, 31360, 31424, 31425, 31416, 0, + 16384, 24576, 28672, 30720, 31232, 31360, 31424, 31425, + 31416, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31424, 31425, 31416, 31418, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31424, 31425, 31416, 0, 16384, + 24576, 28672, 30720, 31232, 31360, 31424, 31425, 31416, + 31420, 0, 16384, 24576, 28672, 30720, 31232, 31360, + 31424, 31425, 31427, 31420, 0, 16384, 24576, 28672, + 30720, 31232, 31360, 31424, 31425, 31427, 31420, 31422, + 0, 16384, 24576, 28672, 30720, 31232, 31360, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31424, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31424, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31424, 31426, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 31428, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31428, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31424, 31432, 31430, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 31432, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31424, 31432, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31424, 31432, 31434, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 31432, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31440, 31436, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31424, 31440, 31436, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31424, 31440, 31441, 31438, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 31440, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31440, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31424, 31440, 31442, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 31440, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31424, 31440, 31444, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31424, 31440, + 31444, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31440, 31448, 31446, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 31440, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31424, 31456, 31448, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31424, 31456, + 31448, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31456, 31448, 31450, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 31456, 31448, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31424, 31456, 31457, + 31452, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31424, 31456, 31457, 31452, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31424, 31456, 31457, 31452, 31454, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31424, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31489, + 31456, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31456, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31489, 31456, 31458, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31456, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31489, 31456, 31460, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31489, 31456, + 31460, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31456, 31464, 31462, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31456, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31489, 31456, 31464, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31489, 31456, + 31464, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31456, 31464, 31466, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31456, 31464, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31489, 31456, 31472, + 31468, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31456, 31472, 31468, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31456, 31472, 31473, 31470, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31489, + 31456, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31456, 31472, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31489, 31491, 31472, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31489, 31491, 31472, 31474, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31489, + 31491, 31472, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31489, 31491, 31472, 31476, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31489, 31491, 31472, 31476, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31489, + 31491, 31472, 31480, 31478, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31491, 31472, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31489, 31491, 31472, + 31480, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31489, 31491, 31472, 31480, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31489, 31491, 31472, 31480, 31482, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31489, + 31491, 31495, 31480, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31489, 31491, 31495, 31480, 31484, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31489, 31491, + 31495, 31480, 31484, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31489, 31491, 31495, 31480, 31484, 31486, + 0, 16384, 24576, 28672, 30720, 31232, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31490, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31492, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31492, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31496, 31494, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31496, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31496, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31496, 31498, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31496, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31504, 31500, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31504, 31500, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31504, 31505, 31502, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31504, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31504, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31504, 31506, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31504, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31504, + 31508, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31504, 31508, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31504, 31512, 31510, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31504, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31520, 31512, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31520, 31512, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31520, 31512, 31514, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31520, + 31512, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31520, 31521, 31516, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31520, 31521, 31516, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31520, 31521, 31516, 31518, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31520, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31520, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31520, 31522, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31520, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31520, + 31524, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31520, 31524, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31520, 31528, 31526, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31520, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31520, 31528, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31520, 31528, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31520, 31528, 31530, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31520, + 31528, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31520, 31536, 31532, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31520, 31536, 31532, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31520, 31536, 31537, 31534, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31520, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 31536, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31536, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31552, 31536, 31538, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31536, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31536, 31540, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 31536, + 31540, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31536, 31544, 31542, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31536, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31553, 31544, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 31553, + 31544, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31553, 31544, 31546, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31553, 31544, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31552, 31553, 31544, + 31548, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31553, 31555, 31548, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31553, 31555, 31548, 31550, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 31554, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 31556, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31556, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31552, 31560, 31558, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31560, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31560, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31552, 31560, 31562, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 31560, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31568, 31564, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31552, 31568, 31564, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31568, 31569, 31566, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 31568, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31568, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31552, 31568, 31570, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31568, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31568, 31572, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 31568, + 31572, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31568, 31576, 31574, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31568, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31552, 31584, 31576, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31552, 31584, + 31576, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31584, 31576, 31578, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31584, 31576, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31552, 31584, 31585, + 31580, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31552, 31584, 31585, 31580, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31552, 31584, 31585, 31580, 31582, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31552, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31584, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31584, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31584, 31586, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31584, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31584, 31588, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31584, + 31588, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31584, 31592, 31590, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31584, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31584, 31592, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31584, + 31592, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31584, 31592, 31594, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31584, 31592, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31584, 31600, + 31596, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31584, 31600, 31596, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31584, 31600, 31601, 31598, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31584, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31617, 31600, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31617, 31600, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31617, 31600, 31602, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31617, 31600, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31617, 31600, 31604, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31617, 31600, 31604, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31617, 31600, 31608, 31606, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31617, 31600, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31617, 31600, + 31608, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31617, 31619, 31608, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31617, 31619, 31608, 31610, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31617, 31619, 31608, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31617, 31619, 31608, 31612, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31617, + 31619, 31608, 31612, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31617, 31619, 31608, 31612, 31614, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31618, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31620, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31620, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31624, 31622, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31624, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31624, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31624, 31626, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31624, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31632, 31628, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31632, 31628, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31632, 31633, 31630, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31632, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31632, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31632, 31634, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31632, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31632, 31636, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31632, + 31636, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31632, 31640, 31638, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31632, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31648, 31640, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31648, + 31640, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 31640, 31642, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 31640, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31648, 31649, + 31644, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 31649, 31644, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 31649, 31644, 31646, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31648, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31648, 31650, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31648, 31652, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31648, + 31652, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 31656, 31654, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31648, 31656, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31648, + 31656, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 31656, 31658, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 31656, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31648, 31664, + 31660, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31648, 31664, 31660, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31648, 31664, 31665, 31662, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31648, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31664, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31664, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31664, 31666, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31664, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31664, 31668, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31664, 31668, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31664, 31672, 31670, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31664, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31680, 31681, + 31672, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31681, 31672, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31681, 31672, 31674, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31681, 31672, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31681, 31672, 31676, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31681, 31683, 31676, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31681, 31683, 31676, 31678, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31682, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31684, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31684, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31688, 31686, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31688, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31688, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31688, 31690, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31688, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31680, 31696, + 31692, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31696, 31692, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31696, 31697, 31694, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31696, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31696, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31696, 31698, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31696, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31696, 31700, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31696, 31700, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31696, 31704, 31702, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31696, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31680, 31712, + 31704, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31712, 31704, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 31704, 31706, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 31704, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31713, 31708, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31713, 31708, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31713, 31708, 31710, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31712, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31712, 31714, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31712, 31716, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31712, 31716, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 31720, 31718, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 0, 16384, + 24576, 28672, 30720, 31232, 31488, 31616, 31680, 31712, + 31720, 0, 16384, 24576, 28672, 30720, 31232, 31488, + 31616, 31680, 31712, 31720, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 31720, 31722, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 31720, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31728, 31724, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31728, 31724, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31728, 31729, 31726, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31712, 31728, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31712, 31728, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 31728, 31730, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 31728, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31728, 31732, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31728, 31732, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31728, 31736, 31734, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 31728, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31728, 31736, 0, 16384, 24576, 28672, 30720, + 31232, 31488, 31616, 31680, 31712, 31728, 31736, 0, + 16384, 24576, 28672, 30720, 31232, 31488, 31616, 31680, + 31712, 31728, 31736, 31738, 0, 16384, 24576, 28672, + 30720, 31232, 31488, 31616, 31680, 31712, 31728, 31736, + 0, 16384, 24576, 28672, 30720, 31232, 31488, 31616, + 31680, 31712, 31728, 31736, 31740, 0, 16384, 24576, + 28672, 30720, 31232, 31488, 31616, 31680, 31712, 31728, + 31736, 31740, 0, 16384, 24576, 28672, 30720, 31232, + 31488, 31616, 31680, 31712, 31728, 31736, 31740, 31742, + 0, 1, 3, 7, 15, 0, 1, 3, + 7, 15, 31, 0, 1, 3, 7, 15, + 31, 0, 1, 3, 7, 15, 31, 63, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 0, 1, 3, 7, 15, 31, + 63, 0, 1, 3, 7, 15, 31, 63, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 0, 32768, 0, 32768, 0, 32768, 32770, + 0, 32768, 0, 32768, 32772, 0, 32768, 32772, + 0, 32768, 32776, 32774, 0, 32768, 0, 32768, + 32776, 0, 32768, 32776, 0, 32768, 32776, 32778, + 0, 32768, 32776, 0, 32768, 32784, 32780, 0, + 32768, 32784, 32780, 0, 32768, 32784, 32785, 32782, + 0, 32768, 0, 32768, 32784, 0, 32768, 32784, + 0, 32768, 32784, 32786, 0, 32768, 32784, 0, + 32768, 32784, 32788, 0, 32768, 32784, 32788, 0, + 32768, 32784, 32792, 32790, 0, 32768, 32784, 0, + 32768, 32800, 32792, 0, 32768, 32800, 32792, 0, + 32768, 32800, 32792, 32794, 0, 32768, 32800, 32792, + 0, 32768, 32800, 32801, 32796, 0, 32768, 32800, + 32801, 32796, 0, 32768, 32800, 32801, 32796, 32798, + 0, 32768, 0, 32768, 32800, 0, 32768, 32800, + 0, 32768, 32800, 32802, 0, 32768, 32800, 0, + 32768, 32800, 32804, 0, 32768, 32800, 32804, 0, + 32768, 32800, 32808, 32806, 0, 32768, 32800, 0, + 32768, 32800, 32808, 0, 32768, 32800, 32808, 0, + 32768, 32800, 32808, 32810, 0, 32768, 32800, 32808, + 0, 32768, 32800, 32816, 32812, 0, 32768, 32800, + 32816, 32812, 0, 32768, 32800, 32816, 32817, 32814, + 0, 32768, 32800, 0, 32768, 32832, 32816, 0, + 32768, 32832, 32816, 0, 32768, 32832, 32816, 32818, + 0, 32768, 32832, 32816, 0, 32768, 32832, 32816, + 32820, 0, 32768, 32832, 32816, 32820, 0, 32768, + 32832, 32816, 32824, 32822, 0, 32768, 32832, 32816, + 0, 32768, 32832, 32833, 32824, 0, 32768, 32832, + 32833, 32824, 0, 32768, 32832, 32833, 32824, 32826, + 0, 32768, 32832, 32833, 32824, 0, 32768, 32832, + 32833, 32824, 32828, 0, 32768, 32832, 32833, 32835, + 32828, 0, 32768, 32832, 32833, 32835, 32828, 32830, + 0, 32768, 0, 32768, 32832, 0, 32768, 32832, + 0, 32768, 32832, 32834, 0, 32768, 32832, 0, + 32768, 32832, 32836, 0, 32768, 32832, 32836, 0, + 32768, 32832, 32840, 32838, 0, 32768, 32832, 0, + 32768, 32832, 32840, 0, 32768, 32832, 32840, 0, + 32768, 32832, 32840, 32842, 0, 32768, 32832, 32840, + 0, 32768, 32832, 32848, 32844, 0, 32768, 32832, + 32848, 32844, 0, 32768, 32832, 32848, 32849, 32846, + 0, 32768, 32832, 0, 32768, 32832, 32848, 0, + 32768, 32832, 32848, 0, 32768, 32832, 32848, 32850, + 0, 32768, 32832, 32848, 0, 32768, 32832, 32848, + 32852, 0, 32768, 32832, 32848, 32852, 0, 32768, + 32832, 32848, 32856, 32854, 0, 32768, 32832, 32848, + 0, 32768, 32832, 32864, 32856, 0, 32768, 32832, + 32864, 32856, 0, 32768, 32832, 32864, 32856, 32858, + 0, 32768, 32832, 32864, 32856, 0, 32768, 32832, + 32864, 32865, 32860, 0, 32768, 32832, 32864, 32865, + 32860, 0, 32768, 32832, 32864, 32865, 32860, 32862, + 0, 32768, 32832, 0, 32768, 32896, 32864, 0, + 32768, 32896, 32864, 0, 32768, 32896, 32864, 32866, + 0, 32768, 32896, 32864, 0, 32768, 32896, 32864, + 32868, 0, 32768, 32896, 32864, 32868, 0, 32768, + 32896, 32864, 32872, 32870, 0, 32768, 32896, 32864, + 0, 32768, 32896, 32864, 32872, 0, 32768, 32896, + 32864, 32872, 0, 32768, 32896, 32864, 32872, 32874, + 0, 32768, 32896, 32864, 32872, 0, 32768, 32896, + 32864, 32880, 32876, 0, 32768, 32896, 32864, 32880, + 32876, 0, 32768, 32896, 32864, 32880, 32881, 32878, + 0, 32768, 32896, 32864, 0, 32768, 32896, 32897, + 32880, 0, 32768, 32896, 32897, 32880, 0, 32768, + 32896, 32897, 32880, 32882, 0, 32768, 32896, 32897, + 32880, 0, 32768, 32896, 32897, 32880, 32884, 0, + 32768, 32896, 32897, 32880, 32884, 0, 32768, 32896, + 32897, 32880, 32888, 32886, 0, 32768, 32896, 32897, + 32880, 0, 32768, 32896, 32897, 32880, 32888, 0, + 32768, 32896, 32897, 32899, 32888, 0, 32768, 32896, + 32897, 32899, 32888, 32890, 0, 32768, 32896, 32897, + 32899, 32888, 0, 32768, 32896, 32897, 32899, 32888, + 32892, 0, 32768, 32896, 32897, 32899, 32888, 32892, + 0, 32768, 32896, 32897, 32899, 32888, 32892, 32894, + 0, 32768, 0, 32768, 32896, 0, 32768, 32896, + 0, 32768, 32896, 32898, 0, 32768, 32896, 0, + 32768, 32896, 32900, 0, 32768, 32896, 32900, 0, + 32768, 32896, 32904, 32902, 0, 32768, 32896, 0, + 32768, 32896, 32904, 0, 32768, 32896, 32904, 0, + 32768, 32896, 32904, 32906, 0, 32768, 32896, 32904, + 0, 32768, 32896, 32912, 32908, 0, 32768, 32896, + 32912, 32908, 0, 32768, 32896, 32912, 32913, 32910, + 0, 32768, 32896, 0, 32768, 32896, 32912, 0, + 32768, 32896, 32912, 0, 32768, 32896, 32912, 32914, + 0, 32768, 32896, 32912, 0, 32768, 32896, 32912, + 32916, 0, 32768, 32896, 32912, 32916, 0, 32768, + 32896, 32912, 32920, 32918, 0, 32768, 32896, 32912, + 0, 32768, 32896, 32928, 32920, 0, 32768, 32896, + 32928, 32920, 0, 32768, 32896, 32928, 32920, 32922, + 0, 32768, 32896, 32928, 32920, 0, 32768, 32896, + 32928, 32929, 32924, 0, 32768, 32896, 32928, 32929, + 32924, 0, 32768, 32896, 32928, 32929, 32924, 32926, + 0, 32768, 32896, 0, 32768, 32896, 32928, 0, + 32768, 32896, 32928, 0, 32768, 32896, 32928, 32930, + 0, 32768, 32896, 32928, 0, 32768, 32896, 32928, + 32932, 0, 32768, 32896, 32928, 32932, 0, 32768, + 32896, 32928, 32936, 32934, 0, 32768, 32896, 32928, + 0, 32768, 32896, 32928, 32936, 0, 32768, 32896, + 32928, 32936, 0, 32768, 32896, 32928, 32936, 32938, + 0, 32768, 32896, 32928, 32936, 0, 32768, 32896, + 32928, 32944, 32940, 0, 32768, 32896, 32928, 32944, + 32940, 0, 32768, 32896, 32928, 32944, 32945, 32942, + 0, 32768, 32896, 32928, 0, 32768, 32896, 32960, + 32944, 0, 32768, 32896, 32960, 32944, 0, 32768, + 32896, 32960, 32944, 32946, 0, 32768, 32896, 32960, + 32944, 0, 32768, 32896, 32960, 32944, 32948, 0, + 32768, 32896, 32960, 32944, 32948, 0, 32768, 32896, + 32960, 32944, 32952, 32950, 0, 32768, 32896, 32960, + 32944, 0, 32768, 32896, 32960, 32961, 32952, 0, + 32768, 32896, 32960, 32961, 32952, 0, 32768, 32896, + 32960, 32961, 32952, 32954, 0, 32768, 32896, 32960, + 32961, 32952, 0, 32768, 32896, 32960, 32961, 32952, + 32956, 0, 32768, 32896, 32960, 32961, 32963, 32956, + 0, 32768, 32896, 32960, 32961, 32963, 32956, 32958, + 0, 32768, 32896, 0, 32768, 33024, 32960, 0, + 32768, 33024, 32960, 0, 32768, 33024, 32960, 32962, + 0, 32768, 33024, 32960, 0, 32768, 33024, 32960, + 32964, 0, 32768, 33024, 32960, 32964, 0, 32768, + 33024, 32960, 32968, 32966, 0, 32768, 33024, 32960, + 0, 32768, 33024, 32960, 32968, 0, 32768, 33024, + 32960, 32968, 0, 32768, 33024, 32960, 32968, 32970, + 0, 32768, 33024, 32960, 32968, 0, 32768, 33024, + 32960, 32976, 32972, 0, 32768, 33024, 32960, 32976, + 32972, 0, 32768, 33024, 32960, 32976, 32977, 32974, + 0, 32768, 33024, 32960, 0, 32768, 33024, 32960, + 32976, 0, 32768, 33024, 32960, 32976, 0, 32768, + 33024, 32960, 32976, 32978, 0, 32768, 33024, 32960, + 32976, 0, 32768, 33024, 32960, 32976, 32980, 0, + 32768, 33024, 32960, 32976, 32980, 0, 32768, 33024, + 32960, 32976, 32984, 32982, 0, 32768, 33024, 32960, + 32976, 0, 32768, 33024, 32960, 32992, 32984, 0, + 32768, 33024, 32960, 32992, 32984, 0, 32768, 33024, + 32960, 32992, 32984, 32986, 0, 32768, 33024, 32960, + 32992, 32984, 0, 32768, 33024, 32960, 32992, 32993, + 32988, 0, 32768, 33024, 32960, 32992, 32993, 32988, + 0, 32768, 33024, 32960, 32992, 32993, 32988, 32990, + 0, 32768, 33024, 32960, 0, 32768, 33024, 33025, + 32992, 0, 32768, 33024, 33025, 32992, 0, 32768, + 33024, 33025, 32992, 32994, 0, 32768, 33024, 33025, + 32992, 0, 32768, 33024, 33025, 32992, 32996, 0, + 32768, 33024, 33025, 32992, 32996, 0, 32768, 33024, + 33025, 32992, 33000, 32998, 0, 32768, 33024, 33025, + 32992, 0, 32768, 33024, 33025, 32992, 33000, 0, + 32768, 33024, 33025, 32992, 33000, 0, 32768, 33024, + 33025, 32992, 33000, 33002, 0, 32768, 33024, 33025, + 32992, 33000, 0, 32768, 33024, 33025, 32992, 33008, + 33004, 0, 32768, 33024, 33025, 32992, 33008, 33004, + 0, 32768, 33024, 33025, 32992, 33008, 33009, 33006, + 0, 32768, 33024, 33025, 32992, 0, 32768, 33024, + 33025, 32992, 33008, 0, 32768, 33024, 33025, 33027, + 33008, 0, 32768, 33024, 33025, 33027, 33008, 33010, + 0, 32768, 33024, 33025, 33027, 33008, 0, 32768, + 33024, 33025, 33027, 33008, 33012, 0, 32768, 33024, + 33025, 33027, 33008, 33012, 0, 32768, 33024, 33025, + 33027, 33008, 33016, 33014, 0, 32768, 33024, 33025, + 33027, 33008, 0, 32768, 33024, 33025, 33027, 33008, + 33016, 0, 32768, 33024, 33025, 33027, 33008, 33016, + 0, 32768, 33024, 33025, 33027, 33008, 33016, 33018, + 0, 32768, 33024, 33025, 33027, 33031, 33016, 0, + 32768, 33024, 33025, 33027, 33031, 33016, 33020, 0, + 32768, 33024, 33025, 33027, 33031, 33016, 33020, 0, + 32768, 33024, 33025, 33027, 33031, 33016, 33020, 33022, + 0, 32768, 0, 32768, 33024, 0, 32768, 33024, + 0, 32768, 33024, 33026, 0, 32768, 33024, 0, + 32768, 33024, 33028, 0, 32768, 33024, 33028, 0, + 32768, 33024, 33032, 33030, 0, 32768, 33024, 0, + 32768, 33024, 33032, 0, 32768, 33024, 33032, 0, + 32768, 33024, 33032, 33034, 0, 32768, 33024, 33032, + 0, 32768, 33024, 33040, 33036, 0, 32768, 33024, + 33040, 33036, 0, 32768, 33024, 33040, 33041, 33038, + 0, 32768, 33024, 0, 32768, 33024, 33040, 0, + 32768, 33024, 33040, 0, 32768, 33024, 33040, 33042, + 0, 32768, 33024, 33040, 0, 32768, 33024, 33040, + 33044, 0, 32768, 33024, 33040, 33044, 0, 32768, + 33024, 33040, 33048, 33046, 0, 32768, 33024, 33040, + 0, 32768, 33024, 33056, 33048, 0, 32768, 33024, + 33056, 33048, 0, 32768, 33024, 33056, 33048, 33050, + 0, 32768, 33024, 33056, 33048, 0, 32768, 33024, + 33056, 33057, 33052, 0, 32768, 33024, 33056, 33057, + 33052, 0, 32768, 33024, 33056, 33057, 33052, 33054, + 0, 32768, 33024, 0, 32768, 33024, 33056, 0, + 32768, 33024, 33056, 0, 32768, 33024, 33056, 33058, + 0, 32768, 33024, 33056, 0, 32768, 33024, 33056, + 33060, 0, 32768, 33024, 33056, 33060, 0, 32768, + 33024, 33056, 33064, 33062, 0, 32768, 33024, 33056, + 0, 32768, 33024, 33056, 33064, 0, 32768, 33024, + 33056, 33064, 0, 32768, 33024, 33056, 33064, 33066, + 0, 32768, 33024, 33056, 33064, 0, 32768, 33024, + 33056, 33072, 33068, 0, 32768, 33024, 33056, 33072, + 33068, 0, 32768, 33024, 33056, 33072, 33073, 33070, + 0, 32768, 33024, 33056, 0, 32768, 33024, 33088, + 33072, 0, 32768, 33024, 33088, 33072, 0, 32768, + 33024, 33088, 33072, 33074, 0, 32768, 33024, 33088, + 33072, 0, 32768, 33024, 33088, 33072, 33076, 0, + 32768, 33024, 33088, 33072, 33076, 0, 32768, 33024, + 33088, 33072, 33080, 33078, 0, 32768, 33024, 33088, + 33072, 0, 32768, 33024, 33088, 33089, 33080, 0, + 32768, 33024, 33088, 33089, 33080, 0, 32768, 33024, + 33088, 33089, 33080, 33082, 0, 32768, 33024, 33088, + 33089, 33080, 0, 32768, 33024, 33088, 33089, 33080, + 33084, 0, 32768, 33024, 33088, 33089, 33091, 33084, + 0, 32768, 33024, 33088, 33089, 33091, 33084, 33086, + 0, 32768, 33024, 0, 32768, 33024, 33088, 0, + 32768, 33024, 33088, 0, 32768, 33024, 33088, 33090, + 0, 32768, 33024, 33088, 0, 32768, 33024, 33088, + 33092, 0, 32768, 33024, 33088, 33092, 0, 32768, + 33024, 33088, 33096, 33094, 0, 32768, 33024, 33088, + 0, 32768, 33024, 33088, 33096, 0, 32768, 33024, + 33088, 33096, 0, 32768, 33024, 33088, 33096, 33098, + 0, 32768, 33024, 33088, 33096, 0, 32768, 33024, + 33088, 33104, 33100, 0, 32768, 33024, 33088, 33104, + 33100, 0, 32768, 33024, 33088, 33104, 33105, 33102, + 0, 32768, 33024, 33088, 0, 32768, 33024, 33088, + 33104, 0, 32768, 33024, 33088, 33104, 0, 32768, + 33024, 33088, 33104, 33106, 0, 32768, 33024, 33088, + 33104, 0, 32768, 33024, 33088, 33104, 33108, 0, + 32768, 33024, 33088, 33104, 33108, 0, 32768, 33024, + 33088, 33104, 33112, 33110, 0, 32768, 33024, 33088, + 33104, 0, 32768, 33024, 33088, 33120, 33112, 0, + 32768, 33024, 33088, 33120, 33112, 0, 32768, 33024, + 33088, 33120, 33112, 33114, 0, 32768, 33024, 33088, + 33120, 33112, 0, 32768, 33024, 33088, 33120, 33121, + 33116, 0, 32768, 33024, 33088, 33120, 33121, 33116, + 0, 32768, 33024, 33088, 33120, 33121, 33116, 33118, + 0, 32768, 33024, 33088, 0, 32768, 33024, 33152, + 33120, 0, 32768, 33024, 33152, 33120, 0, 32768, + 33024, 33152, 33120, 33122, 0, 32768, 33024, 33152, + 33120, 0, 32768, 33024, 33152, 33120, 33124, 0, + 32768, 33024, 33152, 33120, 33124, 0, 32768, 33024, + 33152, 33120, 33128, 33126, 0, 32768, 33024, 33152, + 33120, 0, 32768, 33024, 33152, 33120, 33128, 0, + 32768, 33024, 33152, 33120, 33128, 0, 32768, 33024, + 33152, 33120, 33128, 33130, 0, 32768, 33024, 33152, + 33120, 33128, 0, 32768, 33024, 33152, 33120, 33136, + 33132, 0, 32768, 33024, 33152, 33120, 33136, 33132, + 0, 32768, 33024, 33152, 33120, 33136, 33137, 33134, + 0, 32768, 33024, 33152, 33120, 0, 32768, 33024, + 33152, 33153, 33136, 0, 32768, 33024, 33152, 33153, + 33136, 0, 32768, 33024, 33152, 33153, 33136, 33138, + 0, 32768, 33024, 33152, 33153, 33136, 0, 32768, + 33024, 33152, 33153, 33136, 33140, 0, 32768, 33024, + 33152, 33153, 33136, 33140, 0, 32768, 33024, 33152, + 33153, 33136, 33144, 33142, 0, 32768, 33024, 33152, + 33153, 33136, 0, 32768, 33024, 33152, 33153, 33136, + 33144, 0, 32768, 33024, 33152, 33153, 33155, 33144, + 0, 32768, 33024, 33152, 33153, 33155, 33144, 33146, + 0, 32768, 33024, 33152, 33153, 33155, 33144, 0, + 32768, 33024, 33152, 33153, 33155, 33144, 33148, 0, + 32768, 33024, 33152, 33153, 33155, 33144, 33148, 0, + 32768, 33024, 33152, 33153, 33155, 33144, 33148, 33150, + 0, 32768, 33024, 0, 32768, 33280, 33152, 0, + 32768, 33280, 33152, 0, 32768, 33280, 33152, 33154, + 0, 32768, 33280, 33152, 0, 32768, 33280, 33152, + 33156, 0, 32768, 33280, 33152, 33156, 0, 32768, + 33280, 33152, 33160, 33158, 0, 32768, 33280, 33152, + 0, 32768, 33280, 33152, 33160, 0, 32768, 33280, + 33152, 33160, 0, 32768, 33280, 33152, 33160, 33162, + 0, 32768, 33280, 33152, 33160, 0, 32768, 33280, + 33152, 33168, 33164, 0, 32768, 33280, 33152, 33168, + 33164, 0, 32768, 33280, 33152, 33168, 33169, 33166, + 0, 32768, 33280, 33152, 0, 32768, 33280, 33152, + 33168, 0, 32768, 33280, 33152, 33168, 0, 32768, + 33280, 33152, 33168, 33170, 0, 32768, 33280, 33152, + 33168, 0, 32768, 33280, 33152, 33168, 33172, 0, + 32768, 33280, 33152, 33168, 33172, 0, 32768, 33280, + 33152, 33168, 33176, 33174, 0, 32768, 33280, 33152, + 33168, 0, 32768, 33280, 33152, 33184, 33176, 0, + 32768, 33280, 33152, 33184, 33176, 0, 32768, 33280, + 33152, 33184, 33176, 33178, 0, 32768, 33280, 33152, + 33184, 33176, 0, 32768, 33280, 33152, 33184, 33185, + 33180, 0, 32768, 33280, 33152, 33184, 33185, 33180, + 0, 32768, 33280, 33152, 33184, 33185, 33180, 33182, + 0, 32768, 33280, 33152, 0, 32768, 33280, 33152, + 33184, 0, 32768, 33280, 33152, 33184, 0, 32768, + 33280, 33152, 33184, 33186, 0, 32768, 33280, 33152, + 33184, 0, 32768, 33280, 33152, 33184, 33188, 0, + 32768, 33280, 33152, 33184, 33188, 0, 32768, 33280, + 33152, 33184, 33192, 33190, 0, 32768, 33280, 33152, + 33184, 0, 32768, 33280, 33152, 33184, 33192, 0, + 32768, 33280, 33152, 33184, 33192, 0, 32768, 33280, + 33152, 33184, 33192, 33194, 0, 32768, 33280, 33152, + 33184, 33192, 0, 32768, 33280, 33152, 33184, 33200, + 33196, 0, 32768, 33280, 33152, 33184, 33200, 33196, + 0, 32768, 33280, 33152, 33184, 33200, 33201, 33198, + 0, 32768, 33280, 33152, 33184, 0, 32768, 33280, + 33152, 33216, 33200, 0, 32768, 33280, 33152, 33216, + 33200, 0, 32768, 33280, 33152, 33216, 33200, 33202, + 0, 32768, 33280, 33152, 33216, 33200, 0, 32768, + 33280, 33152, 33216, 33200, 33204, 0, 32768, 33280, + 33152, 33216, 33200, 33204, 0, 32768, 33280, 33152, + 33216, 33200, 33208, 33206, 0, 32768, 33280, 33152, + 33216, 33200, 0, 32768, 33280, 33152, 33216, 33217, + 33208, 0, 32768, 33280, 33152, 33216, 33217, 33208, + 0, 32768, 33280, 33152, 33216, 33217, 33208, 33210, + 0, 32768, 33280, 33152, 33216, 33217, 33208, 0, + 32768, 33280, 33152, 33216, 33217, 33208, 33212, 0, + 32768, 33280, 33152, 33216, 33217, 33219, 33212, 0, + 32768, 33280, 33152, 33216, 33217, 33219, 33212, 33214, + 0, 32768, 33280, 33152, 0, 32768, 33280, 33281, + 33216, 0, 32768, 33280, 33281, 33216, 0, 32768, + 33280, 33281, 33216, 33218, 0, 32768, 33280, 33281, + 33216, 0, 32768, 33280, 33281, 33216, 33220, 0, + 32768, 33280, 33281, 33216, 33220, 0, 32768, 33280, + 33281, 33216, 33224, 33222, 0, 32768, 33280, 33281, + 33216, 0, 32768, 33280, 33281, 33216, 33224, 0, + 32768, 33280, 33281, 33216, 33224, 0, 32768, 33280, + 33281, 33216, 33224, 33226, 0, 32768, 33280, 33281, + 33216, 33224, 0, 32768, 33280, 33281, 33216, 33232, + 33228, 0, 32768, 33280, 33281, 33216, 33232, 33228, + 0, 32768, 33280, 33281, 33216, 33232, 33233, 33230, + 0, 32768, 33280, 33281, 33216, 0, 32768, 33280, + 33281, 33216, 33232, 0, 32768, 33280, 33281, 33216, + 33232, 0, 32768, 33280, 33281, 33216, 33232, 33234, + 0, 32768, 33280, 33281, 33216, 33232, 0, 32768, + 33280, 33281, 33216, 33232, 33236, 0, 32768, 33280, + 33281, 33216, 33232, 33236, 0, 32768, 33280, 33281, + 33216, 33232, 33240, 33238, 0, 32768, 33280, 33281, + 33216, 33232, 0, 32768, 33280, 33281, 33216, 33248, + 33240, 0, 32768, 33280, 33281, 33216, 33248, 33240, + 0, 32768, 33280, 33281, 33216, 33248, 33240, 33242, + 0, 32768, 33280, 33281, 33216, 33248, 33240, 0, + 32768, 33280, 33281, 33216, 33248, 33249, 33244, 0, + 32768, 33280, 33281, 33216, 33248, 33249, 33244, 0, + 32768, 33280, 33281, 33216, 33248, 33249, 33244, 33246, + 0, 32768, 33280, 33281, 33216, 0, 32768, 33280, + 33281, 33216, 33248, 0, 32768, 33280, 33281, 33283, + 33248, 0, 32768, 33280, 33281, 33283, 33248, 33250, + 0, 32768, 33280, 33281, 33283, 33248, 0, 32768, + 33280, 33281, 33283, 33248, 33252, 0, 32768, 33280, + 33281, 33283, 33248, 33252, 0, 32768, 33280, 33281, + 33283, 33248, 33256, 33254, 0, 32768, 33280, 33281, + 33283, 33248, 0, 32768, 33280, 33281, 33283, 33248, + 33256, 0, 32768, 33280, 33281, 33283, 33248, 33256, + 0, 32768, 33280, 33281, 33283, 33248, 33256, 33258, + 0, 32768, 33280, 33281, 33283, 33248, 33256, 0, + 32768, 33280, 33281, 33283, 33248, 33264, 33260, 0, + 32768, 33280, 33281, 33283, 33248, 33264, 33260, 0, + 32768, 33280, 33281, 33283, 33248, 33264, 33265, 33262, + 0, 32768, 33280, 33281, 33283, 33248, 0, 32768, + 33280, 33281, 33283, 33248, 33264, 0, 32768, 33280, + 33281, 33283, 33248, 33264, 0, 32768, 33280, 33281, + 33283, 33248, 33264, 33266, 0, 32768, 33280, 33281, + 33283, 33287, 33264, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33268, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33268, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33272, 33270, 0, 32768, 33280, 33281, + 33283, 33287, 33264, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33272, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33272, 0, 32768, 33280, 33281, 33283, + 33287, 33264, 33272, 33274, 0, 32768, 33280, 33281, + 33283, 33287, 33264, 33272, 0, 32768, 33280, 33281, + 33283, 33287, 33264, 33272, 33276, 0, 32768, 33280, + 33281, 33283, 33287, 33264, 33272, 33276, 0, 32768, + 33280, 33281, 33283, 33287, 33264, 33272, 33276, 33278, + 0, 32768, 0, 32768, 33280, 0, 32768, 33280, + 0, 32768, 33280, 33282, 0, 32768, 33280, 0, + 32768, 33280, 33284, 0, 32768, 33280, 33284, 0, + 32768, 33280, 33288, 33286, 0, 32768, 33280, 0, + 32768, 33280, 33288, 0, 32768, 33280, 33288, 0, + 32768, 33280, 33288, 33290, 0, 32768, 33280, 33288, + 0, 32768, 33280, 33296, 33292, 0, 32768, 33280, + 33296, 33292, 0, 32768, 33280, 33296, 33297, 33294, + 0, 32768, 33280, 0, 32768, 33280, 33296, 0, + 32768, 33280, 33296, 0, 32768, 33280, 33296, 33298, + 0, 32768, 33280, 33296, 0, 32768, 33280, 33296, + 33300, 0, 32768, 33280, 33296, 33300, 0, 32768, + 33280, 33296, 33304, 33302, 0, 32768, 33280, 33296, + 0, 32768, 33280, 33312, 33304, 0, 32768, 33280, + 33312, 33304, 0, 32768, 33280, 33312, 33304, 33306, + 0, 32768, 33280, 33312, 33304, 0, 32768, 33280, + 33312, 33313, 33308, 0, 32768, 33280, 33312, 33313, + 33308, 0, 32768, 33280, 33312, 33313, 33308, 33310, + 0, 32768, 33280, 0, 32768, 33280, 33312, 0, + 32768, 33280, 33312, 0, 32768, 33280, 33312, 33314, + 0, 32768, 33280, 33312, 0, 32768, 33280, 33312, + 33316, 0, 32768, 33280, 33312, 33316, 0, 32768, + 33280, 33312, 33320, 33318, 0, 32768, 33280, 33312, + 0, 32768, 33280, 33312, 33320, 0, 32768, 33280, + 33312, 33320, 0, 32768, 33280, 33312, 33320, 33322, + 0, 32768, 33280, 33312, 33320, 0, 32768, 33280, + 33312, 33328, 33324, 0, 32768, 33280, 33312, 33328, + 33324, 0, 32768, 33280, 33312, 33328, 33329, 33326, + 0, 32768, 33280, 33312, 0, 32768, 33280, 33344, + 33328, 0, 32768, 33280, 33344, 33328, 0, 32768, + 33280, 33344, 33328, 33330, 0, 32768, 33280, 33344, + 33328, 0, 32768, 33280, 33344, 33328, 33332, 0, + 32768, 33280, 33344, 33328, 33332, 0, 32768, 33280, + 33344, 33328, 33336, 33334, 0, 32768, 33280, 33344, + 33328, 0, 32768, 33280, 33344, 33345, 33336, 0, + 32768, 33280, 33344, 33345, 33336, 0, 32768, 33280, + 33344, 33345, 33336, 33338, 0, 32768, 33280, 33344, + 33345, 33336, 0, 32768, 33280, 33344, 33345, 33336, + 33340, 0, 32768, 33280, 33344, 33345, 33347, 33340, + 0, 32768, 33280, 33344, 33345, 33347, 33340, 33342, + 0, 32768, 33280, 0, 32768, 33280, 33344, 0, + 32768, 33280, 33344, 0, 32768, 33280, 33344, 33346, + 0, 32768, 33280, 33344, 0, 32768, 33280, 33344, + 33348, 0, 32768, 33280, 33344, 33348, 0, 32768, + 33280, 33344, 33352, 33350, 0, 32768, 33280, 33344, + 0, 32768, 33280, 33344, 33352, 0, 32768, 33280, + 33344, 33352, 0, 32768, 33280, 33344, 33352, 33354, + 0, 32768, 33280, 33344, 33352, 0, 32768, 33280, + 33344, 33360, 33356, 0, 32768, 33280, 33344, 33360, + 33356, 0, 32768, 33280, 33344, 33360, 33361, 33358, + 0, 32768, 33280, 33344, 0, 32768, 33280, 33344, + 33360, 0, 32768, 33280, 33344, 33360, 0, 32768, + 33280, 33344, 33360, 33362, 0, 32768, 33280, 33344, + 33360, 0, 32768, 33280, 33344, 33360, 33364, 0, + 32768, 33280, 33344, 33360, 33364, 0, 32768, 33280, + 33344, 33360, 33368, 33366, 0, 32768, 33280, 33344, + 33360, 0, 32768, 33280, 33344, 33376, 33368, 0, + 32768, 33280, 33344, 33376, 33368, 0, 32768, 33280, + 33344, 33376, 33368, 33370, 0, 32768, 33280, 33344, + 33376, 33368, 0, 32768, 33280, 33344, 33376, 33377, + 33372, 0, 32768, 33280, 33344, 33376, 33377, 33372, + 0, 32768, 33280, 33344, 33376, 33377, 33372, 33374, + 0, 32768, 33280, 33344, 0, 32768, 33280, 33408, + 33376, 0, 32768, 33280, 33408, 33376, 0, 32768, + 33280, 33408, 33376, 33378, 0, 32768, 33280, 33408, + 33376, 0, 32768, 33280, 33408, 33376, 33380, 0, + 32768, 33280, 33408, 33376, 33380, 0, 32768, 33280, + 33408, 33376, 33384, 33382, 0, 32768, 33280, 33408, + 33376, 0, 32768, 33280, 33408, 33376, 33384, 0, + 32768, 33280, 33408, 33376, 33384, 0, 32768, 33280, + 33408, 33376, 33384, 33386, 0, 32768, 33280, 33408, + 33376, 33384, 0, 32768, 33280, 33408, 33376, 33392, + 33388, 0, 32768, 33280, 33408, 33376, 33392, 33388, + 0, 32768, 33280, 33408, 33376, 33392, 33393, 33390, + 0, 32768, 33280, 33408, 33376, 0, 32768, 33280, + 33408, 33409, 33392, 0, 32768, 33280, 33408, 33409, + 33392, 0, 32768, 33280, 33408, 33409, 33392, 33394, + 0, 32768, 33280, 33408, 33409, 33392, 0, 32768, + 33280, 33408, 33409, 33392, 33396, 0, 32768, 33280, + 33408, 33409, 33392, 33396, 0, 32768, 33280, 33408, + 33409, 33392, 33400, 33398, 0, 32768, 33280, 33408, + 33409, 33392, 0, 32768, 33280, 33408, 33409, 33392, + 33400, 0, 32768, 33280, 33408, 33409, 33411, 33400, + 0, 32768, 33280, 33408, 33409, 33411, 33400, 33402, + 0, 32768, 33280, 33408, 33409, 33411, 33400, 0, + 32768, 33280, 33408, 33409, 33411, 33400, 33404, 0, + 32768, 33280, 33408, 33409, 33411, 33400, 33404, 0, + 32768, 33280, 33408, 33409, 33411, 33400, 33404, 33406, + 0, 32768, 33280, 0, 32768, 33280, 33408, 0, + 32768, 33280, 33408, 0, 32768, 33280, 33408, 33410, + 0, 32768, 33280, 33408, 0, 32768, 33280, 33408, + 33412, 0, 32768, 33280, 33408, 33412, 0, 32768, + 33280, 33408, 33416, 33414, 0, 32768, 33280, 33408, + 0, 32768, 33280, 33408, 33416, 0, 32768, 33280, + 33408, 33416, 0, 32768, 33280, 33408, 33416, 33418, + 0, 32768, 33280, 33408, 33416, 0, 32768, 33280, + 33408, 33424, 33420, 0, 32768, 33280, 33408, 33424, + 33420, 0, 32768, 33280, 33408, 33424, 33425, 33422, + 0, 32768, 33280, 33408, 0, 32768, 33280, 33408, + 33424, 0, 32768, 33280, 33408, 33424, 0, 32768, + 33280, 33408, 33424, 33426, 0, 32768, 33280, 33408, + 33424, 0, 32768, 33280, 33408, 33424, 33428, 0, + 32768, 33280, 33408, 33424, 33428, 0, 32768, 33280, + 33408, 33424, 33432, 33430, 0, 32768, 33280, 33408, + 33424, 0, 32768, 33280, 33408, 33440, 33432, 0, + 32768, 33280, 33408, 33440, 33432, 0, 32768, 33280, + 33408, 33440, 33432, 33434, 0, 32768, 33280, 33408, + 33440, 33432, 0, 32768, 33280, 33408, 33440, 33441, + 33436, 0, 32768, 33280, 33408, 33440, 33441, 33436, + 0, 32768, 33280, 33408, 33440, 33441, 33436, 33438, + 0, 32768, 33280, 33408, 0, 32768, 33280, 33408, + 33440, 0, 32768, 33280, 33408, 33440, 0, 32768, + 33280, 33408, 33440, 33442, 0, 32768, 33280, 33408, + 33440, 0, 32768, 33280, 33408, 33440, 33444, 0, + 32768, 33280, 33408, 33440, 33444, 0, 32768, 33280, + 33408, 33440, 33448, 33446, 0, 32768, 33280, 33408, + 33440, 0, 32768, 33280, 33408, 33440, 33448, 0, + 32768, 33280, 33408, 33440, 33448, 0, 32768, 33280, + 33408, 33440, 33448, 33450, 0, 32768, 33280, 33408, + 33440, 33448, 0, 32768, 33280, 33408, 33440, 33456, + 33452, 0, 32768, 33280, 33408, 33440, 33456, 33452, + 0, 32768, 33280, 33408, 33440, 33456, 33457, 33454, + 0, 32768, 33280, 33408, 33440, 0, 32768, 33280, + 33408, 33472, 33456, 0, 32768, 33280, 33408, 33472, + 33456, 0, 32768, 33280, 33408, 33472, 33456, 33458, + 0, 32768, 33280, 33408, 33472, 33456, 0, 32768, + 33280, 33408, 33472, 33456, 33460, 0, 32768, 33280, + 33408, 33472, 33456, 33460, 0, 32768, 33280, 33408, + 33472, 33456, 33464, 33462, 0, 32768, 33280, 33408, + 33472, 33456, 0, 32768, 33280, 33408, 33472, 33473, + 33464, 0, 32768, 33280, 33408, 33472, 33473, 33464, + 0, 32768, 33280, 33408, 33472, 33473, 33464, 33466, + 0, 32768, 33280, 33408, 33472, 33473, 33464, 0, + 32768, 33280, 33408, 33472, 33473, 33464, 33468, 0, + 32768, 33280, 33408, 33472, 33473, 33475, 33468, 0, + 32768, 33280, 33408, 33472, 33473, 33475, 33468, 33470, + 0, 32768, 33280, 33408, 0, 32768, 33280, 33536, + 33472, 0, 32768, 33280, 33536, 33472, 0, 32768, + 33280, 33536, 33472, 33474, 0, 32768, 33280, 33536, + 33472, 0, 32768, 33280, 33536, 33472, 33476, 0, + 32768, 33280, 33536, 33472, 33476, 0, 32768, 33280, + 33536, 33472, 33480, 33478, 0, 32768, 33280, 33536, + 33472, 0, 32768, 33280, 33536, 33472, 33480, 0, + 32768, 33280, 33536, 33472, 33480, 0, 32768, 33280, + 33536, 33472, 33480, 33482, 0, 32768, 33280, 33536, + 33472, 33480, 0, 32768, 33280, 33536, 33472, 33488, + 33484, 0, 32768, 33280, 33536, 33472, 33488, 33484, + 0, 32768, 33280, 33536, 33472, 33488, 33489, 33486, + 0, 32768, 33280, 33536, 33472, 0, 32768, 33280, + 33536, 33472, 33488, 0, 32768, 33280, 33536, 33472, + 33488, 0, 32768, 33280, 33536, 33472, 33488, 33490, + 0, 32768, 33280, 33536, 33472, 33488, 0, 32768, + 33280, 33536, 33472, 33488, 33492, 0, 32768, 33280, + 33536, 33472, 33488, 33492, 0, 32768, 33280, 33536, + 33472, 33488, 33496, 33494, 0, 32768, 33280, 33536, + 33472, 33488, 0, 32768, 33280, 33536, 33472, 33504, + 33496, 0, 32768, 33280, 33536, 33472, 33504, 33496, + 0, 32768, 33280, 33536, 33472, 33504, 33496, 33498, + 0, 32768, 33280, 33536, 33472, 33504, 33496, 0, + 32768, 33280, 33536, 33472, 33504, 33505, 33500, 0, + 32768, 33280, 33536, 33472, 33504, 33505, 33500, 0, + 32768, 33280, 33536, 33472, 33504, 33505, 33500, 33502, + 0, 32768, 33280, 33536, 33472, 0, 32768, 33280, + 33536, 33537, 33504, 0, 32768, 33280, 33536, 33537, + 33504, 0, 32768, 33280, 33536, 33537, 33504, 33506, + 0, 32768, 33280, 33536, 33537, 33504, 0, 32768, + 33280, 33536, 33537, 33504, 33508, 0, 32768, 33280, + 33536, 33537, 33504, 33508, 0, 32768, 33280, 33536, + 33537, 33504, 33512, 33510, 0, 32768, 33280, 33536, + 33537, 33504, 0, 32768, 33280, 33536, 33537, 33504, + 33512, 0, 32768, 33280, 33536, 33537, 33504, 33512, + 0, 32768, 33280, 33536, 33537, 33504, 33512, 33514, + 0, 32768, 33280, 33536, 33537, 33504, 33512, 0, + 32768, 33280, 33536, 33537, 33504, 33520, 33516, 0, + 32768, 33280, 33536, 33537, 33504, 33520, 33516, 0, + 32768, 33280, 33536, 33537, 33504, 33520, 33521, 33518, + 0, 32768, 33280, 33536, 33537, 33504, 0, 32768, + 33280, 33536, 33537, 33504, 33520, 0, 32768, 33280, + 33536, 33537, 33539, 33520, 0, 32768, 33280, 33536, + 33537, 33539, 33520, 33522, 0, 32768, 33280, 33536, + 33537, 33539, 33520, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33524, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33524, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33528, 33526, 0, 32768, 33280, 33536, + 33537, 33539, 33520, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33528, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33528, 0, 32768, 33280, 33536, 33537, + 33539, 33520, 33528, 33530, 0, 32768, 33280, 33536, + 33537, 33539, 33543, 33528, 0, 32768, 33280, 33536, + 33537, 33539, 33543, 33528, 33532, 0, 32768, 33280, + 33536, 33537, 33539, 33543, 33528, 33532, 0, 32768, + 33280, 33536, 33537, 33539, 33543, 33528, 33532, 33534, + 0, 32768, 33280, 0, 32768, 33792, 33536, 0, + 32768, 33792, 33536, 0, 32768, 33792, 33536, 33538, + 0, 32768, 33792, 33536, 0, 32768, 33792, 33536, + 33540, 0, 32768, 33792, 33536, 33540, 0, 32768, + 33792, 33536, 33544, 33542, 0, 32768, 33792, 33536, + 0, 32768, 33792, 33536, 33544, 0, 32768, 33792, + 33536, 33544, 0, 32768, 33792, 33536, 33544, 33546, + 0, 32768, 33792, 33536, 33544, 0, 32768, 33792, + 33536, 33552, 33548, 0, 32768, 33792, 33536, 33552, + 33548, 0, 32768, 33792, 33536, 33552, 33553, 33550, + 0, 32768, 33792, 33536, 0, 32768, 33792, 33536, + 33552, 0, 32768, 33792, 33536, 33552, 0, 32768, + 33792, 33536, 33552, 33554, 0, 32768, 33792, 33536, + 33552, 0, 32768, 33792, 33536, 33552, 33556, 0, + 32768, 33792, 33536, 33552, 33556, 0, 32768, 33792, + 33536, 33552, 33560, 33558, 0, 32768, 33792, 33536, + 33552, 0, 32768, 33792, 33536, 33568, 33560, 0, + 32768, 33792, 33536, 33568, 33560, 0, 32768, 33792, + 33536, 33568, 33560, 33562, 0, 32768, 33792, 33536, + 33568, 33560, 0, 32768, 33792, 33536, 33568, 33569, + 33564, 0, 32768, 33792, 33536, 33568, 33569, 33564, + 0, 32768, 33792, 33536, 33568, 33569, 33564, 33566, + 0, 32768, 33792, 33536, 0, 32768, 33792, 33536, + 33568, 0, 32768, 33792, 33536, 33568, 0, 32768, + 33792, 33536, 33568, 33570, 0, 32768, 33792, 33536, + 33568, 0, 32768, 33792, 33536, 33568, 33572, 0, + 32768, 33792, 33536, 33568, 33572, 0, 32768, 33792, + 33536, 33568, 33576, 33574, 0, 32768, 33792, 33536, + 33568, 0, 32768, 33792, 33536, 33568, 33576, 0, + 32768, 33792, 33536, 33568, 33576, 0, 32768, 33792, + 33536, 33568, 33576, 33578, 0, 32768, 33792, 33536, + 33568, 33576, 0, 32768, 33792, 33536, 33568, 33584, + 33580, 0, 32768, 33792, 33536, 33568, 33584, 33580, + 0, 32768, 33792, 33536, 33568, 33584, 33585, 33582, + 0, 32768, 33792, 33536, 33568, 0, 32768, 33792, + 33536, 33600, 33584, 0, 32768, 33792, 33536, 33600, + 33584, 0, 32768, 33792, 33536, 33600, 33584, 33586, + 0, 32768, 33792, 33536, 33600, 33584, 0, 32768, + 33792, 33536, 33600, 33584, 33588, 0, 32768, 33792, + 33536, 33600, 33584, 33588, 0, 32768, 33792, 33536, + 33600, 33584, 33592, 33590, 0, 32768, 33792, 33536, + 33600, 33584, 0, 32768, 33792, 33536, 33600, 33601, + 33592, 0, 32768, 33792, 33536, 33600, 33601, 33592, + 0, 32768, 33792, 33536, 33600, 33601, 33592, 33594, + 0, 32768, 33792, 33536, 33600, 33601, 33592, 0, + 32768, 33792, 33536, 33600, 33601, 33592, 33596, 0, + 32768, 33792, 33536, 33600, 33601, 33603, 33596, 0, + 32768, 33792, 33536, 33600, 33601, 33603, 33596, 33598, + 0, 32768, 33792, 33536, 0, 32768, 33792, 33536, + 33600, 0, 32768, 33792, 33536, 33600, 0, 32768, + 33792, 33536, 33600, 33602, 0, 32768, 33792, 33536, + 33600, 0, 32768, 33792, 33536, 33600, 33604, 0, + 32768, 33792, 33536, 33600, 33604, 0, 32768, 33792, + 33536, 33600, 33608, 33606, 0, 32768, 33792, 33536, + 33600, 0, 32768, 33792, 33536, 33600, 33608, 0, + 32768, 33792, 33536, 33600, 33608, 0, 32768, 33792, + 33536, 33600, 33608, 33610, 0, 32768, 33792, 33536, + 33600, 33608, 0, 32768, 33792, 33536, 33600, 33616, + 33612, 0, 32768, 33792, 33536, 33600, 33616, 33612, + 0, 32768, 33792, 33536, 33600, 33616, 33617, 33614, + 0, 32768, 33792, 33536, 33600, 0, 32768, 33792, + 33536, 33600, 33616, 0, 32768, 33792, 33536, 33600, + 33616, 0, 32768, 33792, 33536, 33600, 33616, 33618, + 0, 32768, 33792, 33536, 33600, 33616, 0, 32768, + 33792, 33536, 33600, 33616, 33620, 0, 32768, 33792, + 33536, 33600, 33616, 33620, 0, 32768, 33792, 33536, + 33600, 33616, 33624, 33622, 0, 32768, 33792, 33536, + 33600, 33616, 0, 32768, 33792, 33536, 33600, 33632, + 33624, 0, 32768, 33792, 33536, 33600, 33632, 33624, + 0, 32768, 33792, 33536, 33600, 33632, 33624, 33626, + 0, 32768, 33792, 33536, 33600, 33632, 33624, 0, + 32768, 33792, 33536, 33600, 33632, 33633, 33628, 0, + 32768, 33792, 33536, 33600, 33632, 33633, 33628, 0, + 32768, 33792, 33536, 33600, 33632, 33633, 33628, 33630, + 0, 32768, 33792, 33536, 33600, 0, 32768, 33792, + 33536, 33664, 33632, 0, 32768, 33792, 33536, 33664, + 33632, 0, 32768, 33792, 33536, 33664, 33632, 33634, + 0, 32768, 33792, 33536, 33664, 33632, 0, 32768, + 33792, 33536, 33664, 33632, 33636, 0, 32768, 33792, + 33536, 33664, 33632, 33636, 0, 32768, 33792, 33536, + 33664, 33632, 33640, 33638, 0, 32768, 33792, 33536, + 33664, 33632, 0, 32768, 33792, 33536, 33664, 33632, + 33640, 0, 32768, 33792, 33536, 33664, 33632, 33640, + 0, 32768, 33792, 33536, 33664, 33632, 33640, 33642, + 0, 32768, 33792, 33536, 33664, 33632, 33640, 0, + 32768, 33792, 33536, 33664, 33632, 33648, 33644, 0, + 32768, 33792, 33536, 33664, 33632, 33648, 33644, 0, + 32768, 33792, 33536, 33664, 33632, 33648, 33649, 33646, + 0, 32768, 33792, 33536, 33664, 33632, 0, 32768, + 33792, 33536, 33664, 33665, 33648, 0, 32768, 33792, + 33536, 33664, 33665, 33648, 0, 32768, 33792, 33536, + 33664, 33665, 33648, 33650, 0, 32768, 33792, 33536, + 33664, 33665, 33648, 0, 32768, 33792, 33536, 33664, + 33665, 33648, 33652, 0, 32768, 33792, 33536, 33664, + 33665, 33648, 33652, 0, 32768, 33792, 33536, 33664, + 33665, 33648, 33656, 33654, 0, 32768, 33792, 33536, + 33664, 33665, 33648, 0, 32768, 33792, 33536, 33664, + 33665, 33648, 33656, 0, 32768, 33792, 33536, 33664, + 33665, 33667, 33656, 0, 32768, 33792, 33536, 33664, + 33665, 33667, 33656, 33658, 0, 32768, 33792, 33536, + 33664, 33665, 33667, 33656, 0, 32768, 33792, 33536, + 33664, 33665, 33667, 33656, 33660, 0, 32768, 33792, + 33536, 33664, 33665, 33667, 33656, 33660, 0, 32768, + 33792, 33536, 33664, 33665, 33667, 33656, 33660, 33662, + 0, 32768, 33792, 33536, 0, 32768, 33792, 33793, + 33664, 0, 32768, 33792, 33793, 33664, 0, 32768, + 33792, 33793, 33664, 33666, 0, 32768, 33792, 33793, + 33664, 0, 32768, 33792, 33793, 33664, 33668, 0, + 32768, 33792, 33793, 33664, 33668, 0, 32768, 33792, + 33793, 33664, 33672, 33670, 0, 32768, 33792, 33793, + 33664, 0, 32768, 33792, 33793, 33664, 33672, 0, + 32768, 33792, 33793, 33664, 33672, 0, 32768, 33792, + 33793, 33664, 33672, 33674, 0, 32768, 33792, 33793, + 33664, 33672, 0, 32768, 33792, 33793, 33664, 33680, + 33676, 0, 32768, 33792, 33793, 33664, 33680, 33676, + 0, 32768, 33792, 33793, 33664, 33680, 33681, 33678, + 0, 32768, 33792, 33793, 33664, 0, 32768, 33792, + 33793, 33664, 33680, 0, 32768, 33792, 33793, 33664, + 33680, 0, 32768, 33792, 33793, 33664, 33680, 33682, + 0, 32768, 33792, 33793, 33664, 33680, 0, 32768, + 33792, 33793, 33664, 33680, 33684, 0, 32768, 33792, + 33793, 33664, 33680, 33684, 0, 32768, 33792, 33793, + 33664, 33680, 33688, 33686, 0, 32768, 33792, 33793, + 33664, 33680, 0, 32768, 33792, 33793, 33664, 33696, + 33688, 0, 32768, 33792, 33793, 33664, 33696, 33688, + 0, 32768, 33792, 33793, 33664, 33696, 33688, 33690, + 0, 32768, 33792, 33793, 33664, 33696, 33688, 0, + 32768, 33792, 33793, 33664, 33696, 33697, 33692, 0, + 32768, 33792, 33793, 33664, 33696, 33697, 33692, 0, + 32768, 33792, 33793, 33664, 33696, 33697, 33692, 33694, + 0, 32768, 33792, 33793, 33664, 0, 32768, 33792, + 33793, 33664, 33696, 0, 32768, 33792, 33793, 33664, + 33696, 0, 32768, 33792, 33793, 33664, 33696, 33698, + 0, 32768, 33792, 33793, 33664, 33696, 0, 32768, + 33792, 33793, 33664, 33696, 33700, 0, 32768, 33792, + 33793, 33664, 33696, 33700, 0, 32768, 33792, 33793, + 33664, 33696, 33704, 33702, 0, 32768, 33792, 33793, + 33664, 33696, 0, 32768, 33792, 33793, 33664, 33696, + 33704, 0, 32768, 33792, 33793, 33664, 33696, 33704, + 0, 32768, 33792, 33793, 33664, 33696, 33704, 33706, + 0, 32768, 33792, 33793, 33664, 33696, 33704, 0, + 32768, 33792, 33793, 33664, 33696, 33712, 33708, 0, + 32768, 33792, 33793, 33664, 33696, 33712, 33708, 0, + 32768, 33792, 33793, 33664, 33696, 33712, 33713, 33710, + 0, 32768, 33792, 33793, 33664, 33696, 0, 32768, + 33792, 33793, 33664, 33728, 33712, 0, 32768, 33792, + 33793, 33664, 33728, 33712, 0, 32768, 33792, 33793, + 33664, 33728, 33712, 33714, 0, 32768, 33792, 33793, + 33664, 33728, 33712, 0, 32768, 33792, 33793, 33664, + 33728, 33712, 33716, 0, 32768, 33792, 33793, 33664, + 33728, 33712, 33716, 0, 32768, 33792, 33793, 33664, + 33728, 33712, 33720, 33718, 0, 32768, 33792, 33793, + 33664, 33728, 33712, 0, 32768, 33792, 33793, 33664, + 33728, 33729, 33720, 0, 32768, 33792, 33793, 33664, + 33728, 33729, 33720, 0, 32768, 33792, 33793, 33664, + 33728, 33729, 33720, 33722, 0, 32768, 33792, 33793, + 33664, 33728, 33729, 33720, 0, 32768, 33792, 33793, + 33664, 33728, 33729, 33720, 33724, 0, 32768, 33792, + 33793, 33664, 33728, 33729, 33731, 33724, 0, 32768, + 33792, 33793, 33664, 33728, 33729, 33731, 33724, 33726, + 0, 32768, 33792, 33793, 33664, 0, 32768, 33792, + 33793, 33664, 33728, 0, 32768, 33792, 33793, 33795, + 33728, 0, 32768, 33792, 33793, 33795, 33728, 33730, + 0, 32768, 33792, 33793, 33795, 33728, 0, 32768, + 33792, 33793, 33795, 33728, 33732, 0, 32768, 33792, + 33793, 33795, 33728, 33732, 0, 32768, 33792, 33793, + 33795, 33728, 33736, 33734, 0, 32768, 33792, 33793, + 33795, 33728, 0, 32768, 33792, 33793, 33795, 33728, + 33736, 0, 32768, 33792, 33793, 33795, 33728, 33736, + 0, 32768, 33792, 33793, 33795, 33728, 33736, 33738, + 0, 32768, 33792, 33793, 33795, 33728, 33736, 0, + 32768, 33792, 33793, 33795, 33728, 33744, 33740, 0, + 32768, 33792, 33793, 33795, 33728, 33744, 33740, 0, + 32768, 33792, 33793, 33795, 33728, 33744, 33745, 33742, + 0, 32768, 33792, 33793, 33795, 33728, 0, 32768, + 33792, 33793, 33795, 33728, 33744, 0, 32768, 33792, + 33793, 33795, 33728, 33744, 0, 32768, 33792, 33793, + 33795, 33728, 33744, 33746, 0, 32768, 33792, 33793, + 33795, 33728, 33744, 0, 32768, 33792, 33793, 33795, + 33728, 33744, 33748, 0, 32768, 33792, 33793, 33795, + 33728, 33744, 33748, 0, 32768, 33792, 33793, 33795, + 33728, 33744, 33752, 33750, 0, 32768, 33792, 33793, + 33795, 33728, 33744, 0, 32768, 33792, 33793, 33795, + 33728, 33760, 33752, 0, 32768, 33792, 33793, 33795, + 33728, 33760, 33752, 0, 32768, 33792, 33793, 33795, + 33728, 33760, 33752, 33754, 0, 32768, 33792, 33793, + 33795, 33728, 33760, 33752, 0, 32768, 33792, 33793, + 33795, 33728, 33760, 33761, 33756, 0, 32768, 33792, + 33793, 33795, 33728, 33760, 33761, 33756, 0, 32768, + 33792, 33793, 33795, 33728, 33760, 33761, 33756, 33758, + 0, 32768, 33792, 33793, 33795, 33728, 0, 32768, + 33792, 33793, 33795, 33728, 33760, 0, 32768, 33792, + 33793, 33795, 33728, 33760, 0, 32768, 33792, 33793, + 33795, 33728, 33760, 33762, 0, 32768, 33792, 33793, + 33795, 33799, 33760, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33764, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33764, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33768, 33766, 0, 32768, 33792, 33793, + 33795, 33799, 33760, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33768, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33768, 0, 32768, 33792, 33793, 33795, + 33799, 33760, 33768, 33770, 0, 32768, 33792, 33793, + 33795, 33799, 33760, 33768, 0, 32768, 33792, 33793, + 33795, 33799, 33760, 33776, 33772, 0, 32768, 33792, + 33793, 33795, 33799, 33760, 33776, 33772, 0, 32768, + 33792, 33793, 33795, 33799, 33760, 33776, 33777, 33774, + 0, 32768, 33792, 33793, 33795, 33799, 33760, 0, + 32768, 33792, 33793, 33795, 33799, 33760, 33776, 0, + 32768, 33792, 33793, 33795, 33799, 33760, 33776, 0, + 32768, 33792, 33793, 33795, 33799, 33760, 33776, 33778, + 0, 32768, 33792, 33793, 33795, 33799, 33760, 33776, + 0, 32768, 33792, 33793, 33795, 33799, 33760, 33776, + 33780, 0, 32768, 33792, 33793, 33795, 33799, 33760, + 33776, 33780, 0, 32768, 33792, 33793, 33795, 33799, + 33760, 33776, 33784, 33782, 0, 32768, 33792, 33793, + 33795, 33799, 33807, 33776, 0, 32768, 33792, 33793, + 33795, 33799, 33807, 33776, 33784, 0, 32768, 33792, + 33793, 33795, 33799, 33807, 33776, 33784, 0, 32768, + 33792, 33793, 33795, 33799, 33807, 33776, 33784, 33786, + 0, 32768, 33792, 33793, 33795, 33799, 33807, 33776, + 33784, 0, 32768, 33792, 33793, 33795, 33799, 33807, + 33776, 33784, 33788, 0, 32768, 33792, 33793, 33795, + 33799, 33807, 33776, 33784, 33788, 0, 32768, 33792, + 33793, 33795, 33799, 33807, 33776, 33784, 33788, 33790, + 0, 32768, 0, 32768, 33792, 0, 32768, 33792, + 0, 32768, 33792, 33794, 0, 32768, 33792, 0, + 32768, 33792, 33796, 0, 32768, 33792, 33796, 0, + 32768, 33792, 33800, 33798, 0, 32768, 33792, 0, + 32768, 33792, 33800, 0, 32768, 33792, 33800, 0, + 32768, 33792, 33800, 33802, 0, 32768, 33792, 33800, + 0, 32768, 33792, 33808, 33804, 0, 32768, 33792, + 33808, 33804, 0, 32768, 33792, 33808, 33809, 33806, + 0, 32768, 33792, 0, 32768, 33792, 33808, 0, + 32768, 33792, 33808, 0, 32768, 33792, 33808, 33810, + 0, 32768, 33792, 33808, 0, 32768, 33792, 33808, + 33812, 0, 32768, 33792, 33808, 33812, 0, 32768, + 33792, 33808, 33816, 33814, 0, 32768, 33792, 33808, + 0, 32768, 33792, 33824, 33816, 0, 32768, 33792, + 33824, 33816, 0, 32768, 33792, 33824, 33816, 33818, + 0, 32768, 33792, 33824, 33816, 0, 32768, 33792, + 33824, 33825, 33820, 0, 32768, 33792, 33824, 33825, + 33820, 0, 32768, 33792, 33824, 33825, 33820, 33822, + 0, 32768, 33792, 0, 32768, 33792, 33824, 0, + 32768, 33792, 33824, 0, 32768, 33792, 33824, 33826, + 0, 32768, 33792, 33824, 0, 32768, 33792, 33824, + 33828, 0, 32768, 33792, 33824, 33828, 0, 32768, + 33792, 33824, 33832, 33830, 0, 32768, 33792, 33824, + 0, 32768, 33792, 33824, 33832, 0, 32768, 33792, + 33824, 33832, 0, 32768, 33792, 33824, 33832, 33834, + 0, 32768, 33792, 33824, 33832, 0, 32768, 33792, + 33824, 33840, 33836, 0, 32768, 33792, 33824, 33840, + 33836, 0, 32768, 33792, 33824, 33840, 33841, 33838, + 0, 32768, 33792, 33824, 0, 32768, 33792, 33856, + 33840, 0, 32768, 33792, 33856, 33840, 0, 32768, + 33792, 33856, 33840, 33842, 0, 32768, 33792, 33856, + 33840, 0, 32768, 33792, 33856, 33840, 33844, 0, + 32768, 33792, 33856, 33840, 33844, 0, 32768, 33792, + 33856, 33840, 33848, 33846, 0, 32768, 33792, 33856, + 33840, 0, 32768, 33792, 33856, 33857, 33848, 0, + 32768, 33792, 33856, 33857, 33848, 0, 32768, 33792, + 33856, 33857, 33848, 33850, 0, 32768, 33792, 33856, + 33857, 33848, 0, 32768, 33792, 33856, 33857, 33848, + 33852, 0, 32768, 33792, 33856, 33857, 33859, 33852, + 0, 32768, 33792, 33856, 33857, 33859, 33852, 33854, + 0, 32768, 33792, 0, 32768, 33792, 33856, 0, + 32768, 33792, 33856, 0, 32768, 33792, 33856, 33858, + 0, 32768, 33792, 33856, 0, 32768, 33792, 33856, + 33860, 0, 32768, 33792, 33856, 33860, 0, 32768, + 33792, 33856, 33864, 33862, 0, 32768, 33792, 33856, + 0, 32768, 33792, 33856, 33864, 0, 32768, 33792, + 33856, 33864, 0, 32768, 33792, 33856, 33864, 33866, + 0, 32768, 33792, 33856, 33864, 0, 32768, 33792, + 33856, 33872, 33868, 0, 32768, 33792, 33856, 33872, + 33868, 0, 32768, 33792, 33856, 33872, 33873, 33870, + 0, 32768, 33792, 33856, 0, 32768, 33792, 33856, + 33872, 0, 32768, 33792, 33856, 33872, 0, 32768, + 33792, 33856, 33872, 33874, 0, 32768, 33792, 33856, + 33872, 0, 32768, 33792, 33856, 33872, 33876, 0, + 32768, 33792, 33856, 33872, 33876, 0, 32768, 33792, + 33856, 33872, 33880, 33878, 0, 32768, 33792, 33856, + 33872, 0, 32768, 33792, 33856, 33888, 33880, 0, + 32768, 33792, 33856, 33888, 33880, 0, 32768, 33792, + 33856, 33888, 33880, 33882, 0, 32768, 33792, 33856, + 33888, 33880, 0, 32768, 33792, 33856, 33888, 33889, + 33884, 0, 32768, 33792, 33856, 33888, 33889, 33884, + 0, 32768, 33792, 33856, 33888, 33889, 33884, 33886, + 0, 32768, 33792, 33856, 0, 32768, 33792, 33920, + 33888, 0, 32768, 33792, 33920, 33888, 0, 32768, + 33792, 33920, 33888, 33890, 0, 32768, 33792, 33920, + 33888, 0, 32768, 33792, 33920, 33888, 33892, 0, + 32768, 33792, 33920, 33888, 33892, 0, 32768, 33792, + 33920, 33888, 33896, 33894, 0, 32768, 33792, 33920, + 33888, 0, 32768, 33792, 33920, 33888, 33896, 0, + 32768, 33792, 33920, 33888, 33896, 0, 32768, 33792, + 33920, 33888, 33896, 33898, 0, 32768, 33792, 33920, + 33888, 33896, 0, 32768, 33792, 33920, 33888, 33904, + 33900, 0, 32768, 33792, 33920, 33888, 33904, 33900, + 0, 32768, 33792, 33920, 33888, 33904, 33905, 33902, + 0, 32768, 33792, 33920, 33888, 0, 32768, 33792, + 33920, 33921, 33904, 0, 32768, 33792, 33920, 33921, + 33904, 0, 32768, 33792, 33920, 33921, 33904, 33906, + 0, 32768, 33792, 33920, 33921, 33904, 0, 32768, + 33792, 33920, 33921, 33904, 33908, 0, 32768, 33792, + 33920, 33921, 33904, 33908, 0, 32768, 33792, 33920, + 33921, 33904, 33912, 33910, 0, 32768, 33792, 33920, + 33921, 33904, 0, 32768, 33792, 33920, 33921, 33904, + 33912, 0, 32768, 33792, 33920, 33921, 33923, 33912, + 0, 32768, 33792, 33920, 33921, 33923, 33912, 33914, + 0, 32768, 33792, 33920, 33921, 33923, 33912, 0, + 32768, 33792, 33920, 33921, 33923, 33912, 33916, 0, + 32768, 33792, 33920, 33921, 33923, 33912, 33916, 0, + 32768, 33792, 33920, 33921, 33923, 33912, 33916, 33918, + 0, 32768, 33792, 0, 32768, 33792, 33920, 0, + 32768, 33792, 33920, 0, 32768, 33792, 33920, 33922, + 0, 32768, 33792, 33920, 0, 32768, 33792, 33920, + 33924, 0, 32768, 33792, 33920, 33924, 0, 32768, + 33792, 33920, 33928, 33926, 0, 32768, 33792, 33920, + 0, 32768, 33792, 33920, 33928, 0, 32768, 33792, + 33920, 33928, 0, 32768, 33792, 33920, 33928, 33930, + 0, 32768, 33792, 33920, 33928, 0, 32768, 33792, + 33920, 33936, 33932, 0, 32768, 33792, 33920, 33936, + 33932, 0, 32768, 33792, 33920, 33936, 33937, 33934, + 0, 32768, 33792, 33920, 0, 32768, 33792, 33920, + 33936, 0, 32768, 33792, 33920, 33936, 0, 32768, + 33792, 33920, 33936, 33938, 0, 32768, 33792, 33920, + 33936, 0, 32768, 33792, 33920, 33936, 33940, 0, + 32768, 33792, 33920, 33936, 33940, 0, 32768, 33792, + 33920, 33936, 33944, 33942, 0, 32768, 33792, 33920, + 33936, 0, 32768, 33792, 33920, 33952, 33944, 0, + 32768, 33792, 33920, 33952, 33944, 0, 32768, 33792, + 33920, 33952, 33944, 33946, 0, 32768, 33792, 33920, + 33952, 33944, 0, 32768, 33792, 33920, 33952, 33953, + 33948, 0, 32768, 33792, 33920, 33952, 33953, 33948, + 0, 32768, 33792, 33920, 33952, 33953, 33948, 33950, + 0, 32768, 33792, 33920, 0, 32768, 33792, 33920, + 33952, 0, 32768, 33792, 33920, 33952, 0, 32768, + 33792, 33920, 33952, 33954, 0, 32768, 33792, 33920, + 33952, 0, 32768, 33792, 33920, 33952, 33956, 0, + 32768, 33792, 33920, 33952, 33956, 0, 32768, 33792, + 33920, 33952, 33960, 33958, 0, 32768, 33792, 33920, + 33952, 0, 32768, 33792, 33920, 33952, 33960, 0, + 32768, 33792, 33920, 33952, 33960, 0, 32768, 33792, + 33920, 33952, 33960, 33962, 0, 32768, 33792, 33920, + 33952, 33960, 0, 32768, 33792, 33920, 33952, 33968, + 33964, 0, 32768, 33792, 33920, 33952, 33968, 33964, + 0, 32768, 33792, 33920, 33952, 33968, 33969, 33966, + 0, 32768, 33792, 33920, 33952, 0, 32768, 33792, + 33920, 33984, 33968, 0, 32768, 33792, 33920, 33984, + 33968, 0, 32768, 33792, 33920, 33984, 33968, 33970, + 0, 32768, 33792, 33920, 33984, 33968, 0, 32768, + 33792, 33920, 33984, 33968, 33972, 0, 32768, 33792, + 33920, 33984, 33968, 33972, 0, 32768, 33792, 33920, + 33984, 33968, 33976, 33974, 0, 32768, 33792, 33920, + 33984, 33968, 0, 32768, 33792, 33920, 33984, 33985, + 33976, 0, 32768, 33792, 33920, 33984, 33985, 33976, + 0, 32768, 33792, 33920, 33984, 33985, 33976, 33978, + 0, 32768, 33792, 33920, 33984, 33985, 33976, 0, + 32768, 33792, 33920, 33984, 33985, 33976, 33980, 0, + 32768, 33792, 33920, 33984, 33985, 33987, 33980, 0, + 32768, 33792, 33920, 33984, 33985, 33987, 33980, 33982, + 0, 32768, 33792, 33920, 0, 32768, 33792, 34048, + 33984, 0, 32768, 33792, 34048, 33984, 0, 32768, + 33792, 34048, 33984, 33986, 0, 32768, 33792, 34048, + 33984, 0, 32768, 33792, 34048, 33984, 33988, 0, + 32768, 33792, 34048, 33984, 33988, 0, 32768, 33792, + 34048, 33984, 33992, 33990, 0, 32768, 33792, 34048, + 33984, 0, 32768, 33792, 34048, 33984, 33992, 0, + 32768, 33792, 34048, 33984, 33992, 0, 32768, 33792, + 34048, 33984, 33992, 33994, 0, 32768, 33792, 34048, + 33984, 33992, 0, 32768, 33792, 34048, 33984, 34000, + 33996, 0, 32768, 33792, 34048, 33984, 34000, 33996, + 0, 32768, 33792, 34048, 33984, 34000, 34001, 33998, + 0, 32768, 33792, 34048, 33984, 0, 32768, 33792, + 34048, 33984, 34000, 0, 32768, 33792, 34048, 33984, + 34000, 0, 32768, 33792, 34048, 33984, 34000, 34002, + 0, 32768, 33792, 34048, 33984, 34000, 0, 32768, + 33792, 34048, 33984, 34000, 34004, 0, 32768, 33792, + 34048, 33984, 34000, 34004, 0, 32768, 33792, 34048, + 33984, 34000, 34008, 34006, 0, 32768, 33792, 34048, + 33984, 34000, 0, 32768, 33792, 34048, 33984, 34016, + 34008, 0, 32768, 33792, 34048, 33984, 34016, 34008, + 0, 32768, 33792, 34048, 33984, 34016, 34008, 34010, + 0, 32768, 33792, 34048, 33984, 34016, 34008, 0, + 32768, 33792, 34048, 33984, 34016, 34017, 34012, 0, + 32768, 33792, 34048, 33984, 34016, 34017, 34012, 0, + 32768, 33792, 34048, 33984, 34016, 34017, 34012, 34014, + 0, 32768, 33792, 34048, 33984, 0, 32768, 33792, + 34048, 34049, 34016, 0, 32768, 33792, 34048, 34049, + 34016, 0, 32768, 33792, 34048, 34049, 34016, 34018, + 0, 32768, 33792, 34048, 34049, 34016, 0, 32768, + 33792, 34048, 34049, 34016, 34020, 0, 32768, 33792, + 34048, 34049, 34016, 34020, 0, 32768, 33792, 34048, + 34049, 34016, 34024, 34022, 0, 32768, 33792, 34048, + 34049, 34016, 0, 32768, 33792, 34048, 34049, 34016, + 34024, 0, 32768, 33792, 34048, 34049, 34016, 34024, + 0, 32768, 33792, 34048, 34049, 34016, 34024, 34026, + 0, 32768, 33792, 34048, 34049, 34016, 34024, 0, + 32768, 33792, 34048, 34049, 34016, 34032, 34028, 0, + 32768, 33792, 34048, 34049, 34016, 34032, 34028, 0, + 32768, 33792, 34048, 34049, 34016, 34032, 34033, 34030, + 0, 32768, 33792, 34048, 34049, 34016, 0, 32768, + 33792, 34048, 34049, 34016, 34032, 0, 32768, 33792, + 34048, 34049, 34051, 34032, 0, 32768, 33792, 34048, + 34049, 34051, 34032, 34034, 0, 32768, 33792, 34048, + 34049, 34051, 34032, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34036, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34036, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34040, 34038, 0, 32768, 33792, 34048, + 34049, 34051, 34032, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34040, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34040, 0, 32768, 33792, 34048, 34049, + 34051, 34032, 34040, 34042, 0, 32768, 33792, 34048, + 34049, 34051, 34055, 34040, 0, 32768, 33792, 34048, + 34049, 34051, 34055, 34040, 34044, 0, 32768, 33792, + 34048, 34049, 34051, 34055, 34040, 34044, 0, 32768, + 33792, 34048, 34049, 34051, 34055, 34040, 34044, 34046, + 0, 32768, 33792, 0, 32768, 33792, 34048, 0, + 32768, 33792, 34048, 0, 32768, 33792, 34048, 34050, + 0, 32768, 33792, 34048, 0, 32768, 33792, 34048, + 34052, 0, 32768, 33792, 34048, 34052, 0, 32768, + 33792, 34048, 34056, 34054, 0, 32768, 33792, 34048, + 0, 32768, 33792, 34048, 34056, 0, 32768, 33792, + 34048, 34056, 0, 32768, 33792, 34048, 34056, 34058, + 0, 32768, 33792, 34048, 34056, 0, 32768, 33792, + 34048, 34064, 34060, 0, 32768, 33792, 34048, 34064, + 34060, 0, 32768, 33792, 34048, 34064, 34065, 34062, + 0, 32768, 33792, 34048, 0, 32768, 33792, 34048, + 34064, 0, 32768, 33792, 34048, 34064, 0, 32768, + 33792, 34048, 34064, 34066, 0, 32768, 33792, 34048, + 34064, 0, 32768, 33792, 34048, 34064, 34068, 0, + 32768, 33792, 34048, 34064, 34068, 0, 32768, 33792, + 34048, 34064, 34072, 34070, 0, 32768, 33792, 34048, + 34064, 0, 32768, 33792, 34048, 34080, 34072, 0, + 32768, 33792, 34048, 34080, 34072, 0, 32768, 33792, + 34048, 34080, 34072, 34074, 0, 32768, 33792, 34048, + 34080, 34072, 0, 32768, 33792, 34048, 34080, 34081, + 34076, 0, 32768, 33792, 34048, 34080, 34081, 34076, + 0, 32768, 33792, 34048, 34080, 34081, 34076, 34078, + 0, 32768, 33792, 34048, 0, 32768, 33792, 34048, + 34080, 0, 32768, 33792, 34048, 34080, 0, 32768, + 33792, 34048, 34080, 34082, 0, 32768, 33792, 34048, + 34080, 0, 32768, 33792, 34048, 34080, 34084, 0, + 32768, 33792, 34048, 34080, 34084, 0, 32768, 33792, + 34048, 34080, 34088, 34086, 0, 32768, 33792, 34048, + 34080, 0, 32768, 33792, 34048, 34080, 34088, 0, + 32768, 33792, 34048, 34080, 34088, 0, 32768, 33792, + 34048, 34080, 34088, 34090, 0, 32768, 33792, 34048, + 34080, 34088, 0, 32768, 33792, 34048, 34080, 34096, + 34092, 0, 32768, 33792, 34048, 34080, 34096, 34092, + 0, 32768, 33792, 34048, 34080, 34096, 34097, 34094, + 0, 32768, 33792, 34048, 34080, 0, 32768, 33792, + 34048, 34112, 34096, 0, 32768, 33792, 34048, 34112, + 34096, 0, 32768, 33792, 34048, 34112, 34096, 34098, + 0, 32768, 33792, 34048, 34112, 34096, 0, 32768, + 33792, 34048, 34112, 34096, 34100, 0, 32768, 33792, + 34048, 34112, 34096, 34100, 0, 32768, 33792, 34048, + 34112, 34096, 34104, 34102, 0, 32768, 33792, 34048, + 34112, 34096, 0, 32768, 33792, 34048, 34112, 34113, + 34104, 0, 32768, 33792, 34048, 34112, 34113, 34104, + 0, 32768, 33792, 34048, 34112, 34113, 34104, 34106, + 0, 32768, 33792, 34048, 34112, 34113, 34104, 0, + 32768, 33792, 34048, 34112, 34113, 34104, 34108, 0, + 32768, 33792, 34048, 34112, 34113, 34115, 34108, 0, + 32768, 33792, 34048, 34112, 34113, 34115, 34108, 34110, + 0, 32768, 33792, 34048, 0, 32768, 33792, 34048, + 34112, 0, 32768, 33792, 34048, 34112, 0, 32768, + 33792, 34048, 34112, 34114, 0, 32768, 33792, 34048, + 34112, 0, 32768, 33792, 34048, 34112, 34116, 0, + 32768, 33792, 34048, 34112, 34116, 0, 32768, 33792, + 34048, 34112, 34120, 34118, 0, 32768, 33792, 34048, + 34112, 0, 32768, 33792, 34048, 34112, 34120, 0, + 32768, 33792, 34048, 34112, 34120, 0, 32768, 33792, + 34048, 34112, 34120, 34122, 0, 32768, 33792, 34048, + 34112, 34120, 0, 32768, 33792, 34048, 34112, 34128, + 34124, 0, 32768, 33792, 34048, 34112, 34128, 34124, + 0, 32768, 33792, 34048, 34112, 34128, 34129, 34126, + 0, 32768, 33792, 34048, 34112, 0, 32768, 33792, + 34048, 34112, 34128, 0, 32768, 33792, 34048, 34112, + 34128, 0, 32768, 33792, 34048, 34112, 34128, 34130, + 0, 32768, 33792, 34048, 34112, 34128, 0, 32768, + 33792, 34048, 34112, 34128, 34132, 0, 32768, 33792, + 34048, 34112, 34128, 34132, 0, 32768, 33792, 34048, + 34112, 34128, 34136, 34134, 0, 32768, 33792, 34048, + 34112, 34128, 0, 32768, 33792, 34048, 34112, 34144, + 34136, 0, 32768, 33792, 34048, 34112, 34144, 34136, + 0, 32768, 33792, 34048, 34112, 34144, 34136, 34138, + 0, 32768, 33792, 34048, 34112, 34144, 34136, 0, + 32768, 33792, 34048, 34112, 34144, 34145, 34140, 0, + 32768, 33792, 34048, 34112, 34144, 34145, 34140, 0, + 32768, 33792, 34048, 34112, 34144, 34145, 34140, 34142, + 0, 32768, 33792, 34048, 34112, 0, 32768, 33792, + 34048, 34176, 34144, 0, 32768, 33792, 34048, 34176, + 34144, 0, 32768, 33792, 34048, 34176, 34144, 34146, + 0, 32768, 33792, 34048, 34176, 34144, 0, 32768, + 33792, 34048, 34176, 34144, 34148, 0, 32768, 33792, + 34048, 34176, 34144, 34148, 0, 32768, 33792, 34048, + 34176, 34144, 34152, 34150, 0, 32768, 33792, 34048, + 34176, 34144, 0, 32768, 33792, 34048, 34176, 34144, + 34152, 0, 32768, 33792, 34048, 34176, 34144, 34152, + 0, 32768, 33792, 34048, 34176, 34144, 34152, 34154, + 0, 32768, 33792, 34048, 34176, 34144, 34152, 0, + 32768, 33792, 34048, 34176, 34144, 34160, 34156, 0, + 32768, 33792, 34048, 34176, 34144, 34160, 34156, 0, + 32768, 33792, 34048, 34176, 34144, 34160, 34161, 34158, + 0, 32768, 33792, 34048, 34176, 34144, 0, 32768, + 33792, 34048, 34176, 34177, 34160, 0, 32768, 33792, + 34048, 34176, 34177, 34160, 0, 32768, 33792, 34048, + 34176, 34177, 34160, 34162, 0, 32768, 33792, 34048, + 34176, 34177, 34160, 0, 32768, 33792, 34048, 34176, + 34177, 34160, 34164, 0, 32768, 33792, 34048, 34176, + 34177, 34160, 34164, 0, 32768, 33792, 34048, 34176, + 34177, 34160, 34168, 34166, 0, 32768, 33792, 34048, + 34176, 34177, 34160, 0, 32768, 33792, 34048, 34176, + 34177, 34160, 34168, 0, 32768, 33792, 34048, 34176, + 34177, 34179, 34168, 0, 32768, 33792, 34048, 34176, + 34177, 34179, 34168, 34170, 0, 32768, 33792, 34048, + 34176, 34177, 34179, 34168, 0, 32768, 33792, 34048, + 34176, 34177, 34179, 34168, 34172, 0, 32768, 33792, + 34048, 34176, 34177, 34179, 34168, 34172, 0, 32768, + 33792, 34048, 34176, 34177, 34179, 34168, 34172, 34174, + 0, 32768, 33792, 34048, 0, 32768, 33792, 34304, + 34176, 0, 32768, 33792, 34304, 34176, 0, 32768, + 33792, 34304, 34176, 34178, 0, 32768, 33792, 34304, + 34176, 0, 32768, 33792, 34304, 34176, 34180, 0, + 32768, 33792, 34304, 34176, 34180, 0, 32768, 33792, + 34304, 34176, 34184, 34182, 0, 32768, 33792, 34304, + 34176, 0, 32768, 33792, 34304, 34176, 34184, 0, + 32768, 33792, 34304, 34176, 34184, 0, 32768, 33792, + 34304, 34176, 34184, 34186, 0, 32768, 33792, 34304, + 34176, 34184, 0, 32768, 33792, 34304, 34176, 34192, + 34188, 0, 32768, 33792, 34304, 34176, 34192, 34188, + 0, 32768, 33792, 34304, 34176, 34192, 34193, 34190, + 0, 32768, 33792, 34304, 34176, 0, 32768, 33792, + 34304, 34176, 34192, 0, 32768, 33792, 34304, 34176, + 34192, 0, 32768, 33792, 34304, 34176, 34192, 34194, + 0, 32768, 33792, 34304, 34176, 34192, 0, 32768, + 33792, 34304, 34176, 34192, 34196, 0, 32768, 33792, + 34304, 34176, 34192, 34196, 0, 32768, 33792, 34304, + 34176, 34192, 34200, 34198, 0, 32768, 33792, 34304, + 34176, 34192, 0, 32768, 33792, 34304, 34176, 34208, + 34200, 0, 32768, 33792, 34304, 34176, 34208, 34200, + 0, 32768, 33792, 34304, 34176, 34208, 34200, 34202, + 0, 32768, 33792, 34304, 34176, 34208, 34200, 0, + 32768, 33792, 34304, 34176, 34208, 34209, 34204, 0, + 32768, 33792, 34304, 34176, 34208, 34209, 34204, 0, + 32768, 33792, 34304, 34176, 34208, 34209, 34204, 34206, + 0, 32768, 33792, 34304, 34176, 0, 32768, 33792, + 34304, 34176, 34208, 0, 32768, 33792, 34304, 34176, + 34208, 0, 32768, 33792, 34304, 34176, 34208, 34210, + 0, 32768, 33792, 34304, 34176, 34208, 0, 32768, + 33792, 34304, 34176, 34208, 34212, 0, 32768, 33792, + 34304, 34176, 34208, 34212, 0, 32768, 33792, 34304, + 34176, 34208, 34216, 34214, 0, 32768, 33792, 34304, + 34176, 34208, 0, 32768, 33792, 34304, 34176, 34208, + 34216, 0, 32768, 33792, 34304, 34176, 34208, 34216, + 0, 32768, 33792, 34304, 34176, 34208, 34216, 34218, + 0, 32768, 33792, 34304, 34176, 34208, 34216, 0, + 32768, 33792, 34304, 34176, 34208, 34224, 34220, 0, + 32768, 33792, 34304, 34176, 34208, 34224, 34220, 0, + 32768, 33792, 34304, 34176, 34208, 34224, 34225, 34222, + 0, 32768, 33792, 34304, 34176, 34208, 0, 32768, + 33792, 34304, 34176, 34240, 34224, 0, 32768, 33792, + 34304, 34176, 34240, 34224, 0, 32768, 33792, 34304, + 34176, 34240, 34224, 34226, 0, 32768, 33792, 34304, + 34176, 34240, 34224, 0, 32768, 33792, 34304, 34176, + 34240, 34224, 34228, 0, 32768, 33792, 34304, 34176, + 34240, 34224, 34228, 0, 32768, 33792, 34304, 34176, + 34240, 34224, 34232, 34230, 0, 32768, 33792, 34304, + 34176, 34240, 34224, 0, 32768, 33792, 34304, 34176, + 34240, 34241, 34232, 0, 32768, 33792, 34304, 34176, + 34240, 34241, 34232, 0, 32768, 33792, 34304, 34176, + 34240, 34241, 34232, 34234, 0, 32768, 33792, 34304, + 34176, 34240, 34241, 34232, 0, 32768, 33792, 34304, + 34176, 34240, 34241, 34232, 34236, 0, 32768, 33792, + 34304, 34176, 34240, 34241, 34243, 34236, 0, 32768, + 33792, 34304, 34176, 34240, 34241, 34243, 34236, 34238, + 0, 32768, 33792, 34304, 34176, 0, 32768, 33792, + 34304, 34305, 34240, 0, 32768, 33792, 34304, 34305, + 34240, 0, 32768, 33792, 34304, 34305, 34240, 34242, + 0, 32768, 33792, 34304, 34305, 34240, 0, 32768, + 33792, 34304, 34305, 34240, 34244, 0, 32768, 33792, + 34304, 34305, 34240, 34244, 0, 32768, 33792, 34304, + 34305, 34240, 34248, 34246, 0, 32768, 33792, 34304, + 34305, 34240, 0, 32768, 33792, 34304, 34305, 34240, + 34248, 0, 32768, 33792, 34304, 34305, 34240, 34248, + 0, 32768, 33792, 34304, 34305, 34240, 34248, 34250, + 0, 32768, 33792, 34304, 34305, 34240, 34248, 0, + 32768, 33792, 34304, 34305, 34240, 34256, 34252, 0, + 32768, 33792, 34304, 34305, 34240, 34256, 34252, 0, + 32768, 33792, 34304, 34305, 34240, 34256, 34257, 34254, + 0, 32768, 33792, 34304, 34305, 34240, 0, 32768, + 33792, 34304, 34305, 34240, 34256, 0, 32768, 33792, + 34304, 34305, 34240, 34256, 0, 32768, 33792, 34304, + 34305, 34240, 34256, 34258, 0, 32768, 33792, 34304, + 34305, 34240, 34256, 0, 32768, 33792, 34304, 34305, + 34240, 34256, 34260, 0, 32768, 33792, 34304, 34305, + 34240, 34256, 34260, 0, 32768, 33792, 34304, 34305, + 34240, 34256, 34264, 34262, 0, 32768, 33792, 34304, + 34305, 34240, 34256, 0, 32768, 33792, 34304, 34305, + 34240, 34272, 34264, 0, 32768, 33792, 34304, 34305, + 34240, 34272, 34264, 0, 32768, 33792, 34304, 34305, + 34240, 34272, 34264, 34266, 0, 32768, 33792, 34304, + 34305, 34240, 34272, 34264, 0, 32768, 33792, 34304, + 34305, 34240, 34272, 34273, 34268, 0, 32768, 33792, + 34304, 34305, 34240, 34272, 34273, 34268, 0, 32768, + 33792, 34304, 34305, 34240, 34272, 34273, 34268, 34270, + 0, 32768, 33792, 34304, 34305, 34240, 0, 32768, + 33792, 34304, 34305, 34240, 34272, 0, 32768, 33792, + 34304, 34305, 34307, 34272, 0, 32768, 33792, 34304, + 34305, 34307, 34272, 34274, 0, 32768, 33792, 34304, + 34305, 34307, 34272, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34276, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34276, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34280, 34278, 0, 32768, 33792, 34304, + 34305, 34307, 34272, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34280, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34280, 0, 32768, 33792, 34304, 34305, + 34307, 34272, 34280, 34282, 0, 32768, 33792, 34304, + 34305, 34307, 34272, 34280, 0, 32768, 33792, 34304, + 34305, 34307, 34272, 34288, 34284, 0, 32768, 33792, + 34304, 34305, 34307, 34272, 34288, 34284, 0, 32768, + 33792, 34304, 34305, 34307, 34272, 34288, 34289, 34286, + 0, 32768, 33792, 34304, 34305, 34307, 34272, 0, + 32768, 33792, 34304, 34305, 34307, 34272, 34288, 0, + 32768, 33792, 34304, 34305, 34307, 34272, 34288, 0, + 32768, 33792, 34304, 34305, 34307, 34272, 34288, 34290, + 0, 32768, 33792, 34304, 34305, 34307, 34311, 34288, + 0, 32768, 33792, 34304, 34305, 34307, 34311, 34288, + 34292, 0, 32768, 33792, 34304, 34305, 34307, 34311, + 34288, 34292, 0, 32768, 33792, 34304, 34305, 34307, + 34311, 34288, 34296, 34294, 0, 32768, 33792, 34304, + 34305, 34307, 34311, 34288, 0, 32768, 33792, 34304, + 34305, 34307, 34311, 34288, 34296, 0, 32768, 33792, + 34304, 34305, 34307, 34311, 34288, 34296, 0, 32768, + 33792, 34304, 34305, 34307, 34311, 34288, 34296, 34298, + 0, 32768, 33792, 34304, 34305, 34307, 34311, 34288, + 34296, 0, 32768, 33792, 34304, 34305, 34307, 34311, + 34288, 34296, 34300, 0, 32768, 33792, 34304, 34305, + 34307, 34311, 34288, 34296, 34300, 0, 32768, 33792, + 34304, 34305, 34307, 34311, 34288, 34296, 34300, 34302, + 0, 32768, 33792, 0, 32768, 34816, 34304, 0, + 32768, 34816, 34304, 0, 32768, 34816, 34304, 34306, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34308, 0, 32768, 34816, 34304, 34308, 0, 32768, + 34816, 34304, 34312, 34310, 0, 32768, 34816, 34304, + 0, 32768, 34816, 34304, 34312, 0, 32768, 34816, + 34304, 34312, 0, 32768, 34816, 34304, 34312, 34314, + 0, 32768, 34816, 34304, 34312, 0, 32768, 34816, + 34304, 34320, 34316, 0, 32768, 34816, 34304, 34320, + 34316, 0, 32768, 34816, 34304, 34320, 34321, 34318, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34320, 0, 32768, 34816, 34304, 34320, 0, 32768, + 34816, 34304, 34320, 34322, 0, 32768, 34816, 34304, + 34320, 0, 32768, 34816, 34304, 34320, 34324, 0, + 32768, 34816, 34304, 34320, 34324, 0, 32768, 34816, + 34304, 34320, 34328, 34326, 0, 32768, 34816, 34304, + 34320, 0, 32768, 34816, 34304, 34336, 34328, 0, + 32768, 34816, 34304, 34336, 34328, 0, 32768, 34816, + 34304, 34336, 34328, 34330, 0, 32768, 34816, 34304, + 34336, 34328, 0, 32768, 34816, 34304, 34336, 34337, + 34332, 0, 32768, 34816, 34304, 34336, 34337, 34332, + 0, 32768, 34816, 34304, 34336, 34337, 34332, 34334, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34336, 0, 32768, 34816, 34304, 34336, 0, 32768, + 34816, 34304, 34336, 34338, 0, 32768, 34816, 34304, + 34336, 0, 32768, 34816, 34304, 34336, 34340, 0, + 32768, 34816, 34304, 34336, 34340, 0, 32768, 34816, + 34304, 34336, 34344, 34342, 0, 32768, 34816, 34304, + 34336, 0, 32768, 34816, 34304, 34336, 34344, 0, + 32768, 34816, 34304, 34336, 34344, 0, 32768, 34816, + 34304, 34336, 34344, 34346, 0, 32768, 34816, 34304, + 34336, 34344, 0, 32768, 34816, 34304, 34336, 34352, + 34348, 0, 32768, 34816, 34304, 34336, 34352, 34348, + 0, 32768, 34816, 34304, 34336, 34352, 34353, 34350, + 0, 32768, 34816, 34304, 34336, 0, 32768, 34816, + 34304, 34368, 34352, 0, 32768, 34816, 34304, 34368, + 34352, 0, 32768, 34816, 34304, 34368, 34352, 34354, + 0, 32768, 34816, 34304, 34368, 34352, 0, 32768, + 34816, 34304, 34368, 34352, 34356, 0, 32768, 34816, + 34304, 34368, 34352, 34356, 0, 32768, 34816, 34304, + 34368, 34352, 34360, 34358, 0, 32768, 34816, 34304, + 34368, 34352, 0, 32768, 34816, 34304, 34368, 34369, + 34360, 0, 32768, 34816, 34304, 34368, 34369, 34360, + 0, 32768, 34816, 34304, 34368, 34369, 34360, 34362, + 0, 32768, 34816, 34304, 34368, 34369, 34360, 0, + 32768, 34816, 34304, 34368, 34369, 34360, 34364, 0, + 32768, 34816, 34304, 34368, 34369, 34371, 34364, 0, + 32768, 34816, 34304, 34368, 34369, 34371, 34364, 34366, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34368, 0, 32768, 34816, 34304, 34368, 0, 32768, + 34816, 34304, 34368, 34370, 0, 32768, 34816, 34304, + 34368, 0, 32768, 34816, 34304, 34368, 34372, 0, + 32768, 34816, 34304, 34368, 34372, 0, 32768, 34816, + 34304, 34368, 34376, 34374, 0, 32768, 34816, 34304, + 34368, 0, 32768, 34816, 34304, 34368, 34376, 0, + 32768, 34816, 34304, 34368, 34376, 0, 32768, 34816, + 34304, 34368, 34376, 34378, 0, 32768, 34816, 34304, + 34368, 34376, 0, 32768, 34816, 34304, 34368, 34384, + 34380, 0, 32768, 34816, 34304, 34368, 34384, 34380, + 0, 32768, 34816, 34304, 34368, 34384, 34385, 34382, + 0, 32768, 34816, 34304, 34368, 0, 32768, 34816, + 34304, 34368, 34384, 0, 32768, 34816, 34304, 34368, + 34384, 0, 32768, 34816, 34304, 34368, 34384, 34386, + 0, 32768, 34816, 34304, 34368, 34384, 0, 32768, + 34816, 34304, 34368, 34384, 34388, 0, 32768, 34816, + 34304, 34368, 34384, 34388, 0, 32768, 34816, 34304, + 34368, 34384, 34392, 34390, 0, 32768, 34816, 34304, + 34368, 34384, 0, 32768, 34816, 34304, 34368, 34400, + 34392, 0, 32768, 34816, 34304, 34368, 34400, 34392, + 0, 32768, 34816, 34304, 34368, 34400, 34392, 34394, + 0, 32768, 34816, 34304, 34368, 34400, 34392, 0, + 32768, 34816, 34304, 34368, 34400, 34401, 34396, 0, + 32768, 34816, 34304, 34368, 34400, 34401, 34396, 0, + 32768, 34816, 34304, 34368, 34400, 34401, 34396, 34398, + 0, 32768, 34816, 34304, 34368, 0, 32768, 34816, + 34304, 34432, 34400, 0, 32768, 34816, 34304, 34432, + 34400, 0, 32768, 34816, 34304, 34432, 34400, 34402, + 0, 32768, 34816, 34304, 34432, 34400, 0, 32768, + 34816, 34304, 34432, 34400, 34404, 0, 32768, 34816, + 34304, 34432, 34400, 34404, 0, 32768, 34816, 34304, + 34432, 34400, 34408, 34406, 0, 32768, 34816, 34304, + 34432, 34400, 0, 32768, 34816, 34304, 34432, 34400, + 34408, 0, 32768, 34816, 34304, 34432, 34400, 34408, + 0, 32768, 34816, 34304, 34432, 34400, 34408, 34410, + 0, 32768, 34816, 34304, 34432, 34400, 34408, 0, + 32768, 34816, 34304, 34432, 34400, 34416, 34412, 0, + 32768, 34816, 34304, 34432, 34400, 34416, 34412, 0, + 32768, 34816, 34304, 34432, 34400, 34416, 34417, 34414, + 0, 32768, 34816, 34304, 34432, 34400, 0, 32768, + 34816, 34304, 34432, 34433, 34416, 0, 32768, 34816, + 34304, 34432, 34433, 34416, 0, 32768, 34816, 34304, + 34432, 34433, 34416, 34418, 0, 32768, 34816, 34304, + 34432, 34433, 34416, 0, 32768, 34816, 34304, 34432, + 34433, 34416, 34420, 0, 32768, 34816, 34304, 34432, + 34433, 34416, 34420, 0, 32768, 34816, 34304, 34432, + 34433, 34416, 34424, 34422, 0, 32768, 34816, 34304, + 34432, 34433, 34416, 0, 32768, 34816, 34304, 34432, + 34433, 34416, 34424, 0, 32768, 34816, 34304, 34432, + 34433, 34435, 34424, 0, 32768, 34816, 34304, 34432, + 34433, 34435, 34424, 34426, 0, 32768, 34816, 34304, + 34432, 34433, 34435, 34424, 0, 32768, 34816, 34304, + 34432, 34433, 34435, 34424, 34428, 0, 32768, 34816, + 34304, 34432, 34433, 34435, 34424, 34428, 0, 32768, + 34816, 34304, 34432, 34433, 34435, 34424, 34428, 34430, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34432, 0, 32768, 34816, 34304, 34432, 0, 32768, + 34816, 34304, 34432, 34434, 0, 32768, 34816, 34304, + 34432, 0, 32768, 34816, 34304, 34432, 34436, 0, + 32768, 34816, 34304, 34432, 34436, 0, 32768, 34816, + 34304, 34432, 34440, 34438, 0, 32768, 34816, 34304, + 34432, 0, 32768, 34816, 34304, 34432, 34440, 0, + 32768, 34816, 34304, 34432, 34440, 0, 32768, 34816, + 34304, 34432, 34440, 34442, 0, 32768, 34816, 34304, + 34432, 34440, 0, 32768, 34816, 34304, 34432, 34448, + 34444, 0, 32768, 34816, 34304, 34432, 34448, 34444, + 0, 32768, 34816, 34304, 34432, 34448, 34449, 34446, + 0, 32768, 34816, 34304, 34432, 0, 32768, 34816, + 34304, 34432, 34448, 0, 32768, 34816, 34304, 34432, + 34448, 0, 32768, 34816, 34304, 34432, 34448, 34450, + 0, 32768, 34816, 34304, 34432, 34448, 0, 32768, + 34816, 34304, 34432, 34448, 34452, 0, 32768, 34816, + 34304, 34432, 34448, 34452, 0, 32768, 34816, 34304, + 34432, 34448, 34456, 34454, 0, 32768, 34816, 34304, + 34432, 34448, 0, 32768, 34816, 34304, 34432, 34464, + 34456, 0, 32768, 34816, 34304, 34432, 34464, 34456, + 0, 32768, 34816, 34304, 34432, 34464, 34456, 34458, + 0, 32768, 34816, 34304, 34432, 34464, 34456, 0, + 32768, 34816, 34304, 34432, 34464, 34465, 34460, 0, + 32768, 34816, 34304, 34432, 34464, 34465, 34460, 0, + 32768, 34816, 34304, 34432, 34464, 34465, 34460, 34462, + 0, 32768, 34816, 34304, 34432, 0, 32768, 34816, + 34304, 34432, 34464, 0, 32768, 34816, 34304, 34432, + 34464, 0, 32768, 34816, 34304, 34432, 34464, 34466, + 0, 32768, 34816, 34304, 34432, 34464, 0, 32768, + 34816, 34304, 34432, 34464, 34468, 0, 32768, 34816, + 34304, 34432, 34464, 34468, 0, 32768, 34816, 34304, + 34432, 34464, 34472, 34470, 0, 32768, 34816, 34304, + 34432, 34464, 0, 32768, 34816, 34304, 34432, 34464, + 34472, 0, 32768, 34816, 34304, 34432, 34464, 34472, + 0, 32768, 34816, 34304, 34432, 34464, 34472, 34474, + 0, 32768, 34816, 34304, 34432, 34464, 34472, 0, + 32768, 34816, 34304, 34432, 34464, 34480, 34476, 0, + 32768, 34816, 34304, 34432, 34464, 34480, 34476, 0, + 32768, 34816, 34304, 34432, 34464, 34480, 34481, 34478, + 0, 32768, 34816, 34304, 34432, 34464, 0, 32768, + 34816, 34304, 34432, 34496, 34480, 0, 32768, 34816, + 34304, 34432, 34496, 34480, 0, 32768, 34816, 34304, + 34432, 34496, 34480, 34482, 0, 32768, 34816, 34304, + 34432, 34496, 34480, 0, 32768, 34816, 34304, 34432, + 34496, 34480, 34484, 0, 32768, 34816, 34304, 34432, + 34496, 34480, 34484, 0, 32768, 34816, 34304, 34432, + 34496, 34480, 34488, 34486, 0, 32768, 34816, 34304, + 34432, 34496, 34480, 0, 32768, 34816, 34304, 34432, + 34496, 34497, 34488, 0, 32768, 34816, 34304, 34432, + 34496, 34497, 34488, 0, 32768, 34816, 34304, 34432, + 34496, 34497, 34488, 34490, 0, 32768, 34816, 34304, + 34432, 34496, 34497, 34488, 0, 32768, 34816, 34304, + 34432, 34496, 34497, 34488, 34492, 0, 32768, 34816, + 34304, 34432, 34496, 34497, 34499, 34492, 0, 32768, + 34816, 34304, 34432, 34496, 34497, 34499, 34492, 34494, + 0, 32768, 34816, 34304, 34432, 0, 32768, 34816, + 34304, 34560, 34496, 0, 32768, 34816, 34304, 34560, + 34496, 0, 32768, 34816, 34304, 34560, 34496, 34498, + 0, 32768, 34816, 34304, 34560, 34496, 0, 32768, + 34816, 34304, 34560, 34496, 34500, 0, 32768, 34816, + 34304, 34560, 34496, 34500, 0, 32768, 34816, 34304, + 34560, 34496, 34504, 34502, 0, 32768, 34816, 34304, + 34560, 34496, 0, 32768, 34816, 34304, 34560, 34496, + 34504, 0, 32768, 34816, 34304, 34560, 34496, 34504, + 0, 32768, 34816, 34304, 34560, 34496, 34504, 34506, + 0, 32768, 34816, 34304, 34560, 34496, 34504, 0, + 32768, 34816, 34304, 34560, 34496, 34512, 34508, 0, + 32768, 34816, 34304, 34560, 34496, 34512, 34508, 0, + 32768, 34816, 34304, 34560, 34496, 34512, 34513, 34510, + 0, 32768, 34816, 34304, 34560, 34496, 0, 32768, + 34816, 34304, 34560, 34496, 34512, 0, 32768, 34816, + 34304, 34560, 34496, 34512, 0, 32768, 34816, 34304, + 34560, 34496, 34512, 34514, 0, 32768, 34816, 34304, + 34560, 34496, 34512, 0, 32768, 34816, 34304, 34560, + 34496, 34512, 34516, 0, 32768, 34816, 34304, 34560, + 34496, 34512, 34516, 0, 32768, 34816, 34304, 34560, + 34496, 34512, 34520, 34518, 0, 32768, 34816, 34304, + 34560, 34496, 34512, 0, 32768, 34816, 34304, 34560, + 34496, 34528, 34520, 0, 32768, 34816, 34304, 34560, + 34496, 34528, 34520, 0, 32768, 34816, 34304, 34560, + 34496, 34528, 34520, 34522, 0, 32768, 34816, 34304, + 34560, 34496, 34528, 34520, 0, 32768, 34816, 34304, + 34560, 34496, 34528, 34529, 34524, 0, 32768, 34816, + 34304, 34560, 34496, 34528, 34529, 34524, 0, 32768, + 34816, 34304, 34560, 34496, 34528, 34529, 34524, 34526, + 0, 32768, 34816, 34304, 34560, 34496, 0, 32768, + 34816, 34304, 34560, 34561, 34528, 0, 32768, 34816, + 34304, 34560, 34561, 34528, 0, 32768, 34816, 34304, + 34560, 34561, 34528, 34530, 0, 32768, 34816, 34304, + 34560, 34561, 34528, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34532, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34532, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34536, 34534, 0, 32768, 34816, 34304, + 34560, 34561, 34528, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34536, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34536, 0, 32768, 34816, 34304, 34560, + 34561, 34528, 34536, 34538, 0, 32768, 34816, 34304, + 34560, 34561, 34528, 34536, 0, 32768, 34816, 34304, + 34560, 34561, 34528, 34544, 34540, 0, 32768, 34816, + 34304, 34560, 34561, 34528, 34544, 34540, 0, 32768, + 34816, 34304, 34560, 34561, 34528, 34544, 34545, 34542, + 0, 32768, 34816, 34304, 34560, 34561, 34528, 0, + 32768, 34816, 34304, 34560, 34561, 34528, 34544, 0, + 32768, 34816, 34304, 34560, 34561, 34563, 34544, 0, + 32768, 34816, 34304, 34560, 34561, 34563, 34544, 34546, + 0, 32768, 34816, 34304, 34560, 34561, 34563, 34544, + 0, 32768, 34816, 34304, 34560, 34561, 34563, 34544, + 34548, 0, 32768, 34816, 34304, 34560, 34561, 34563, + 34544, 34548, 0, 32768, 34816, 34304, 34560, 34561, + 34563, 34544, 34552, 34550, 0, 32768, 34816, 34304, + 34560, 34561, 34563, 34544, 0, 32768, 34816, 34304, + 34560, 34561, 34563, 34544, 34552, 0, 32768, 34816, + 34304, 34560, 34561, 34563, 34544, 34552, 0, 32768, + 34816, 34304, 34560, 34561, 34563, 34544, 34552, 34554, + 0, 32768, 34816, 34304, 34560, 34561, 34563, 34567, + 34552, 0, 32768, 34816, 34304, 34560, 34561, 34563, + 34567, 34552, 34556, 0, 32768, 34816, 34304, 34560, + 34561, 34563, 34567, 34552, 34556, 0, 32768, 34816, + 34304, 34560, 34561, 34563, 34567, 34552, 34556, 34558, + 0, 32768, 34816, 34304, 0, 32768, 34816, 34304, + 34560, 0, 32768, 34816, 34817, 34560, 0, 32768, + 34816, 34817, 34560, 34562, 0, 32768, 34816, 34817, + 34560, 0, 32768, 34816, 34817, 34560, 34564, 0, + 32768, 34816, 34817, 34560, 34564, 0, 32768, 34816, + 34817, 34560, 34568, 34566, 0, 32768, 34816, 34817, + 34560, 0, 32768, 34816, 34817, 34560, 34568, 0, + 32768, 34816, 34817, 34560, 34568, 0, 32768, 34816, + 34817, 34560, 34568, 34570, 0, 32768, 34816, 34817, + 34560, 34568, 0, 32768, 34816, 34817, 34560, 34576, + 34572, 0, 32768, 34816, 34817, 34560, 34576, 34572, + 0, 32768, 34816, 34817, 34560, 34576, 34577, 34574, + 0, 32768, 34816, 34817, 34560, 0, 32768, 34816, + 34817, 34560, 34576, 0, 32768, 34816, 34817, 34560, + 34576, 0, 32768, 34816, 34817, 34560, 34576, 34578, + 0, 32768, 34816, 34817, 34560, 34576, 0, 32768, + 34816, 34817, 34560, 34576, 34580, 0, 32768, 34816, + 34817, 34560, 34576, 34580, 0, 32768, 34816, 34817, + 34560, 34576, 34584, 34582, 0, 32768, 34816, 34817, + 34560, 34576, 0, 32768, 34816, 34817, 34560, 34592, + 34584, 0, 32768, 34816, 34817, 34560, 34592, 34584, + 0, 32768, 34816, 34817, 34560, 34592, 34584, 34586, + 0, 32768, 34816, 34817, 34560, 34592, 34584, 0, + 32768, 34816, 34817, 34560, 34592, 34593, 34588, 0, + 32768, 34816, 34817, 34560, 34592, 34593, 34588, 0, + 32768, 34816, 34817, 34560, 34592, 34593, 34588, 34590, + 0, 32768, 34816, 34817, 34560, 0, 32768, 34816, + 34817, 34560, 34592, 0, 32768, 34816, 34817, 34560, + 34592, 0, 32768, 34816, 34817, 34560, 34592, 34594, + 0, 32768, 34816, 34817, 34560, 34592, 0, 32768, + 34816, 34817, 34560, 34592, 34596, 0, 32768, 34816, + 34817, 34560, 34592, 34596, 0, 32768, 34816, 34817, + 34560, 34592, 34600, 34598, 0, 32768, 34816, 34817, + 34560, 34592, 0, 32768, 34816, 34817, 34560, 34592, + 34600, 0, 32768, 34816, 34817, 34560, 34592, 34600, + 0, 32768, 34816, 34817, 34560, 34592, 34600, 34602, + 0, 32768, 34816, 34817, 34560, 34592, 34600, 0, + 32768, 34816, 34817, 34560, 34592, 34608, 34604, 0, + 32768, 34816, 34817, 34560, 34592, 34608, 34604, 0, + 32768, 34816, 34817, 34560, 34592, 34608, 34609, 34606, + 0, 32768, 34816, 34817, 34560, 34592, 0, 32768, + 34816, 34817, 34560, 34624, 34608, 0, 32768, 34816, + 34817, 34560, 34624, 34608, 0, 32768, 34816, 34817, + 34560, 34624, 34608, 34610, 0, 32768, 34816, 34817, + 34560, 34624, 34608, 0, 32768, 34816, 34817, 34560, + 34624, 34608, 34612, 0, 32768, 34816, 34817, 34560, + 34624, 34608, 34612, 0, 32768, 34816, 34817, 34560, + 34624, 34608, 34616, 34614, 0, 32768, 34816, 34817, + 34560, 34624, 34608, 0, 32768, 34816, 34817, 34560, + 34624, 34625, 34616, 0, 32768, 34816, 34817, 34560, + 34624, 34625, 34616, 0, 32768, 34816, 34817, 34560, + 34624, 34625, 34616, 34618, 0, 32768, 34816, 34817, + 34560, 34624, 34625, 34616, 0, 32768, 34816, 34817, + 34560, 34624, 34625, 34616, 34620, 0, 32768, 34816, + 34817, 34560, 34624, 34625, 34627, 34620, 0, 32768, + 34816, 34817, 34560, 34624, 34625, 34627, 34620, 34622, + 0, 32768, 34816, 34817, 34560, 0, 32768, 34816, + 34817, 34560, 34624, 0, 32768, 34816, 34817, 34560, + 34624, 0, 32768, 34816, 34817, 34560, 34624, 34626, + 0, 32768, 34816, 34817, 34560, 34624, 0, 32768, + 34816, 34817, 34560, 34624, 34628, 0, 32768, 34816, + 34817, 34560, 34624, 34628, 0, 32768, 34816, 34817, + 34560, 34624, 34632, 34630, 0, 32768, 34816, 34817, + 34560, 34624, 0, 32768, 34816, 34817, 34560, 34624, + 34632, 0, 32768, 34816, 34817, 34560, 34624, 34632, + 0, 32768, 34816, 34817, 34560, 34624, 34632, 34634, + 0, 32768, 34816, 34817, 34560, 34624, 34632, 0, + 32768, 34816, 34817, 34560, 34624, 34640, 34636, 0, + 32768, 34816, 34817, 34560, 34624, 34640, 34636, 0, + 32768, 34816, 34817, 34560, 34624, 34640, 34641, 34638, + 0, 32768, 34816, 34817, 34560, 34624, 0, 32768, + 34816, 34817, 34560, 34624, 34640, 0, 32768, 34816, + 34817, 34560, 34624, 34640, 0, 32768, 34816, 34817, + 34560, 34624, 34640, 34642, 0, 32768, 34816, 34817, + 34560, 34624, 34640, 0, 32768, 34816, 34817, 34560, + 34624, 34640, 34644, 0, 32768, 34816, 34817, 34560, + 34624, 34640, 34644, 0, 32768, 34816, 34817, 34560, + 34624, 34640, 34648, 34646, 0, 32768, 34816, 34817, + 34560, 34624, 34640, 0, 32768, 34816, 34817, 34560, + 34624, 34656, 34648, 0, 32768, 34816, 34817, 34560, + 34624, 34656, 34648, 0, 32768, 34816, 34817, 34560, + 34624, 34656, 34648, 34650, 0, 32768, 34816, 34817, + 34560, 34624, 34656, 34648, 0, 32768, 34816, 34817, + 34560, 34624, 34656, 34657, 34652, 0, 32768, 34816, + 34817, 34560, 34624, 34656, 34657, 34652, 0, 32768, + 34816, 34817, 34560, 34624, 34656, 34657, 34652, 34654, + 0, 32768, 34816, 34817, 34560, 34624, 0, 32768, + 34816, 34817, 34560, 34688, 34656, 0, 32768, 34816, + 34817, 34560, 34688, 34656, 0, 32768, 34816, 34817, + 34560, 34688, 34656, 34658, 0, 32768, 34816, 34817, + 34560, 34688, 34656, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34660, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34660, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34664, 34662, 0, 32768, 34816, 34817, + 34560, 34688, 34656, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34664, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34664, 0, 32768, 34816, 34817, 34560, + 34688, 34656, 34664, 34666, 0, 32768, 34816, 34817, + 34560, 34688, 34656, 34664, 0, 32768, 34816, 34817, + 34560, 34688, 34656, 34672, 34668, 0, 32768, 34816, + 34817, 34560, 34688, 34656, 34672, 34668, 0, 32768, + 34816, 34817, 34560, 34688, 34656, 34672, 34673, 34670, + 0, 32768, 34816, 34817, 34560, 34688, 34656, 0, + 32768, 34816, 34817, 34560, 34688, 34689, 34672, 0, + 32768, 34816, 34817, 34560, 34688, 34689, 34672, 0, + 32768, 34816, 34817, 34560, 34688, 34689, 34672, 34674, + 0, 32768, 34816, 34817, 34560, 34688, 34689, 34672, + 0, 32768, 34816, 34817, 34560, 34688, 34689, 34672, + 34676, 0, 32768, 34816, 34817, 34560, 34688, 34689, + 34672, 34676, 0, 32768, 34816, 34817, 34560, 34688, + 34689, 34672, 34680, 34678, 0, 32768, 34816, 34817, + 34560, 34688, 34689, 34672, 0, 32768, 34816, 34817, + 34560, 34688, 34689, 34672, 34680, 0, 32768, 34816, + 34817, 34560, 34688, 34689, 34691, 34680, 0, 32768, + 34816, 34817, 34560, 34688, 34689, 34691, 34680, 34682, + 0, 32768, 34816, 34817, 34560, 34688, 34689, 34691, + 34680, 0, 32768, 34816, 34817, 34560, 34688, 34689, + 34691, 34680, 34684, 0, 32768, 34816, 34817, 34560, + 34688, 34689, 34691, 34680, 34684, 0, 32768, 34816, + 34817, 34560, 34688, 34689, 34691, 34680, 34684, 34686, + 0, 32768, 34816, 34817, 34560, 0, 32768, 34816, + 34817, 34560, 34688, 0, 32768, 34816, 34817, 34560, + 34688, 0, 32768, 34816, 34817, 34560, 34688, 34690, + 0, 32768, 34816, 34817, 34819, 34688, 0, 32768, + 34816, 34817, 34819, 34688, 34692, 0, 32768, 34816, + 34817, 34819, 34688, 34692, 0, 32768, 34816, 34817, + 34819, 34688, 34696, 34694, 0, 32768, 34816, 34817, + 34819, 34688, 0, 32768, 34816, 34817, 34819, 34688, + 34696, 0, 32768, 34816, 34817, 34819, 34688, 34696, + 0, 32768, 34816, 34817, 34819, 34688, 34696, 34698, + 0, 32768, 34816, 34817, 34819, 34688, 34696, 0, + 32768, 34816, 34817, 34819, 34688, 34704, 34700, 0, + 32768, 34816, 34817, 34819, 34688, 34704, 34700, 0, + 32768, 34816, 34817, 34819, 34688, 34704, 34705, 34702, + 0, 32768, 34816, 34817, 34819, 34688, 0, 32768, + 34816, 34817, 34819, 34688, 34704, 0, 32768, 34816, + 34817, 34819, 34688, 34704, 0, 32768, 34816, 34817, + 34819, 34688, 34704, 34706, 0, 32768, 34816, 34817, + 34819, 34688, 34704, 0, 32768, 34816, 34817, 34819, + 34688, 34704, 34708, 0, 32768, 34816, 34817, 34819, + 34688, 34704, 34708, 0, 32768, 34816, 34817, 34819, + 34688, 34704, 34712, 34710, 0, 32768, 34816, 34817, + 34819, 34688, 34704, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34712, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34712, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34712, 34714, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 34712, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 34721, 34716, 0, 32768, 34816, + 34817, 34819, 34688, 34720, 34721, 34716, 0, 32768, + 34816, 34817, 34819, 34688, 34720, 34721, 34716, 34718, + 0, 32768, 34816, 34817, 34819, 34688, 0, 32768, + 34816, 34817, 34819, 34688, 34720, 0, 32768, 34816, + 34817, 34819, 34688, 34720, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 34722, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34724, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34724, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34728, 34726, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34728, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34728, 0, 32768, 34816, 34817, 34819, + 34688, 34720, 34728, 34730, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 34728, 0, 32768, 34816, 34817, + 34819, 34688, 34720, 34736, 34732, 0, 32768, 34816, + 34817, 34819, 34688, 34720, 34736, 34732, 0, 32768, + 34816, 34817, 34819, 34688, 34720, 34736, 34737, 34734, + 0, 32768, 34816, 34817, 34819, 34688, 34720, 0, + 32768, 34816, 34817, 34819, 34688, 34752, 34736, 0, + 32768, 34816, 34817, 34819, 34688, 34752, 34736, 0, + 32768, 34816, 34817, 34819, 34688, 34752, 34736, 34738, + 0, 32768, 34816, 34817, 34819, 34688, 34752, 34736, + 0, 32768, 34816, 34817, 34819, 34688, 34752, 34736, + 34740, 0, 32768, 34816, 34817, 34819, 34688, 34752, + 34736, 34740, 0, 32768, 34816, 34817, 34819, 34688, + 34752, 34736, 34744, 34742, 0, 32768, 34816, 34817, + 34819, 34688, 34752, 34736, 0, 32768, 34816, 34817, + 34819, 34688, 34752, 34753, 34744, 0, 32768, 34816, + 34817, 34819, 34688, 34752, 34753, 34744, 0, 32768, + 34816, 34817, 34819, 34688, 34752, 34753, 34744, 34746, + 0, 32768, 34816, 34817, 34819, 34688, 34752, 34753, + 34744, 0, 32768, 34816, 34817, 34819, 34688, 34752, + 34753, 34744, 34748, 0, 32768, 34816, 34817, 34819, + 34688, 34752, 34753, 34755, 34748, 0, 32768, 34816, + 34817, 34819, 34688, 34752, 34753, 34755, 34748, 34750, + 0, 32768, 34816, 34817, 34819, 34688, 0, 32768, + 34816, 34817, 34819, 34688, 34752, 0, 32768, 34816, + 34817, 34819, 34688, 34752, 0, 32768, 34816, 34817, + 34819, 34688, 34752, 34754, 0, 32768, 34816, 34817, + 34819, 34688, 34752, 0, 32768, 34816, 34817, 34819, + 34688, 34752, 34756, 0, 32768, 34816, 34817, 34819, + 34688, 34752, 34756, 0, 32768, 34816, 34817, 34819, + 34688, 34752, 34760, 34758, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 0, 32768, 34816, 34817, 34819, + 34823, 34752, 34760, 0, 32768, 34816, 34817, 34819, + 34823, 34752, 34760, 0, 32768, 34816, 34817, 34819, + 34823, 34752, 34760, 34762, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34760, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34768, 34764, 0, 32768, 34816, + 34817, 34819, 34823, 34752, 34768, 34764, 0, 32768, + 34816, 34817, 34819, 34823, 34752, 34768, 34769, 34766, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34768, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34768, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34768, 34770, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34768, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34768, + 34772, 0, 32768, 34816, 34817, 34819, 34823, 34752, + 34768, 34772, 0, 32768, 34816, 34817, 34819, 34823, + 34752, 34768, 34776, 34774, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34768, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34784, 34776, 0, 32768, 34816, + 34817, 34819, 34823, 34752, 34784, 34776, 0, 32768, + 34816, 34817, 34819, 34823, 34752, 34784, 34776, 34778, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34784, + 34776, 0, 32768, 34816, 34817, 34819, 34823, 34752, + 34784, 34785, 34780, 0, 32768, 34816, 34817, 34819, + 34823, 34752, 34784, 34785, 34780, 0, 32768, 34816, + 34817, 34819, 34823, 34752, 34784, 34785, 34780, 34782, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34784, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34784, 0, + 32768, 34816, 34817, 34819, 34823, 34752, 34784, 34786, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34784, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34784, + 34788, 0, 32768, 34816, 34817, 34819, 34823, 34752, + 34784, 34788, 0, 32768, 34816, 34817, 34819, 34823, + 34752, 34784, 34792, 34790, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34784, 0, 32768, 34816, 34817, + 34819, 34823, 34752, 34784, 34792, 0, 32768, 34816, + 34817, 34819, 34823, 34752, 34784, 34792, 0, 32768, + 34816, 34817, 34819, 34823, 34752, 34784, 34792, 34794, + 0, 32768, 34816, 34817, 34819, 34823, 34752, 34784, + 34792, 0, 32768, 34816, 34817, 34819, 34823, 34752, + 34784, 34800, 34796, 0, 32768, 34816, 34817, 34819, + 34823, 34752, 34784, 34800, 34796, 0, 32768, 34816, + 34817, 34819, 34823, 34752, 34784, 34800, 34801, 34798, + 0, 32768, 34816, 34817, 34819, 34823, 34831, 34784, + 0, 32768, 34816, 34817, 34819, 34823, 34831, 34784, + 34800, 0, 32768, 34816, 34817, 34819, 34823, 34831, + 34784, 34800, 0, 32768, 34816, 34817, 34819, 34823, + 34831, 34784, 34800, 34802, 0, 32768, 34816, 34817, + 34819, 34823, 34831, 34784, 34800, 0, 32768, 34816, + 34817, 34819, 34823, 34831, 34784, 34800, 34804, 0, + 32768, 34816, 34817, 34819, 34823, 34831, 34784, 34800, + 34804, 0, 32768, 34816, 34817, 34819, 34823, 34831, + 34784, 34800, 34808, 34806, 0, 32768, 34816, 34817, + 34819, 34823, 34831, 34784, 34800, 0, 32768, 34816, + 34817, 34819, 34823, 34831, 34784, 34800, 34808, 0, + 32768, 34816, 34817, 34819, 34823, 34831, 34784, 34800, + 34808, 0, 32768, 34816, 34817, 34819, 34823, 34831, + 34784, 34800, 34808, 34810, 0, 32768, 34816, 34817, + 34819, 34823, 34831, 34784, 34800, 34808, 0, 32768, + 34816, 34817, 34819, 34823, 34831, 34784, 34800, 34808, + 34812, 0, 32768, 34816, 34817, 34819, 34823, 34831, + 34784, 34800, 34808, 34812, 0, 32768, 34816, 34817, + 34819, 34823, 34831, 34784, 34800, 34808, 34812, 34814, + 0, 32768, 0, 32768, 34816, 0, 32768, 34816, + 0, 32768, 34816, 34818, 0, 32768, 34816, 0, + 32768, 34816, 34820, 0, 32768, 34816, 34820, 0, + 32768, 34816, 34824, 34822, 0, 32768, 34816, 0, + 32768, 34816, 34824, 0, 32768, 34816, 34824, 0, + 32768, 34816, 34824, 34826, 0, 32768, 34816, 34824, + 0, 32768, 34816, 34832, 34828, 0, 32768, 34816, + 34832, 34828, 0, 32768, 34816, 34832, 34833, 34830, + 0, 32768, 34816, 0, 32768, 34816, 34832, 0, + 32768, 34816, 34832, 0, 32768, 34816, 34832, 34834, + 0, 32768, 34816, 34832, 0, 32768, 34816, 34832, + 34836, 0, 32768, 34816, 34832, 34836, 0, 32768, + 34816, 34832, 34840, 34838, 0, 32768, 34816, 34832, + 0, 32768, 34816, 34848, 34840, 0, 32768, 34816, + 34848, 34840, 0, 32768, 34816, 34848, 34840, 34842, + 0, 32768, 34816, 34848, 34840, 0, 32768, 34816, + 34848, 34849, 34844, 0, 32768, 34816, 34848, 34849, + 34844, 0, 32768, 34816, 34848, 34849, 34844, 34846, + 0, 32768, 34816, 0, 32768, 34816, 34848, 0, + 32768, 34816, 34848, 0, 32768, 34816, 34848, 34850, + 0, 32768, 34816, 34848, 0, 32768, 34816, 34848, + 34852, 0, 32768, 34816, 34848, 34852, 0, 32768, + 34816, 34848, 34856, 34854, 0, 32768, 34816, 34848, + 0, 32768, 34816, 34848, 34856, 0, 32768, 34816, + 34848, 34856, 0, 32768, 34816, 34848, 34856, 34858, + 0, 32768, 34816, 34848, 34856, 0, 32768, 34816, + 34848, 34864, 34860, 0, 32768, 34816, 34848, 34864, + 34860, 0, 32768, 34816, 34848, 34864, 34865, 34862, + 0, 32768, 34816, 34848, 0, 32768, 34816, 34880, + 34864, 0, 32768, 34816, 34880, 34864, 0, 32768, + 34816, 34880, 34864, 34866, 0, 32768, 34816, 34880, + 34864, 0, 32768, 34816, 34880, 34864, 34868, 0, + 32768, 34816, 34880, 34864, 34868, 0, 32768, 34816, + 34880, 34864, 34872, 34870, 0, 32768, 34816, 34880, + 34864, 0, 32768, 34816, 34880, 34881, 34872, 0, + 32768, 34816, 34880, 34881, 34872, 0, 32768, 34816, + 34880, 34881, 34872, 34874, 0, 32768, 34816, 34880, + 34881, 34872, 0, 32768, 34816, 34880, 34881, 34872, + 34876, 0, 32768, 34816, 34880, 34881, 34883, 34876, + 0, 32768, 34816, 34880, 34881, 34883, 34876, 34878, + 0, 32768, 34816, 0, 32768, 34816, 34880, 0, + 32768, 34816, 34880, 0, 32768, 34816, 34880, 34882, + 0, 32768, 34816, 34880, 0, 32768, 34816, 34880, + 34884, 0, 32768, 34816, 34880, 34884, 0, 32768, + 34816, 34880, 34888, 34886, 0, 32768, 34816, 34880, + 0, 32768, 34816, 34880, 34888, 0, 32768, 34816, + 34880, 34888, 0, 32768, 34816, 34880, 34888, 34890, + 0, 32768, 34816, 34880, 34888, 0, 32768, 34816, + 34880, 34896, 34892, 0, 32768, 34816, 34880, 34896, + 34892, 0, 32768, 34816, 34880, 34896, 34897, 34894, + 0, 32768, 34816, 34880, 0, 32768, 34816, 34880, + 34896, 0, 32768, 34816, 34880, 34896, 0, 32768, + 34816, 34880, 34896, 34898, 0, 32768, 34816, 34880, + 34896, 0, 32768, 34816, 34880, 34896, 34900, 0, + 32768, 34816, 34880, 34896, 34900, 0, 32768, 34816, + 34880, 34896, 34904, 34902, 0, 32768, 34816, 34880, + 34896, 0, 32768, 34816, 34880, 34912, 34904, 0, + 32768, 34816, 34880, 34912, 34904, 0, 32768, 34816, + 34880, 34912, 34904, 34906, 0, 32768, 34816, 34880, + 34912, 34904, 0, 32768, 34816, 34880, 34912, 34913, + 34908, 0, 32768, 34816, 34880, 34912, 34913, 34908, + 0, 32768, 34816, 34880, 34912, 34913, 34908, 34910, + 0, 32768, 34816, 34880, 0, 32768, 34816, 34944, + 34912, 0, 32768, 34816, 34944, 34912, 0, 32768, + 34816, 34944, 34912, 34914, 0, 32768, 34816, 34944, + 34912, 0, 32768, 34816, 34944, 34912, 34916, 0, + 32768, 34816, 34944, 34912, 34916, 0, 32768, 34816, + 34944, 34912, 34920, 34918, 0, 32768, 34816, 34944, + 34912, 0, 32768, 34816, 34944, 34912, 34920, 0, + 32768, 34816, 34944, 34912, 34920, 0, 32768, 34816, + 34944, 34912, 34920, 34922, 0, 32768, 34816, 34944, + 34912, 34920, 0, 32768, 34816, 34944, 34912, 34928, + 34924, 0, 32768, 34816, 34944, 34912, 34928, 34924, + 0, 32768, 34816, 34944, 34912, 34928, 34929, 34926, + 0, 32768, 34816, 34944, 34912, 0, 32768, 34816, + 34944, 34945, 34928, 0, 32768, 34816, 34944, 34945, + 34928, 0, 32768, 34816, 34944, 34945, 34928, 34930, + 0, 32768, 34816, 34944, 34945, 34928, 0, 32768, + 34816, 34944, 34945, 34928, 34932, 0, 32768, 34816, + 34944, 34945, 34928, 34932, 0, 32768, 34816, 34944, + 34945, 34928, 34936, 34934, 0, 32768, 34816, 34944, + 34945, 34928, 0, 32768, 34816, 34944, 34945, 34928, + 34936, 0, 32768, 34816, 34944, 34945, 34947, 34936, + 0, 32768, 34816, 34944, 34945, 34947, 34936, 34938, + 0, 32768, 34816, 34944, 34945, 34947, 34936, 0, + 32768, 34816, 34944, 34945, 34947, 34936, 34940, 0, + 32768, 34816, 34944, 34945, 34947, 34936, 34940, 0, + 32768, 34816, 34944, 34945, 34947, 34936, 34940, 34942, + 0, 32768, 34816, 0, 32768, 34816, 34944, 0, + 32768, 34816, 34944, 0, 32768, 34816, 34944, 34946, + 0, 32768, 34816, 34944, 0, 32768, 34816, 34944, + 34948, 0, 32768, 34816, 34944, 34948, 0, 32768, + 34816, 34944, 34952, 34950, 0, 32768, 34816, 34944, + 0, 32768, 34816, 34944, 34952, 0, 32768, 34816, + 34944, 34952, 0, 32768, 34816, 34944, 34952, 34954, + 0, 32768, 34816, 34944, 34952, 0, 32768, 34816, + 34944, 34960, 34956, 0, 32768, 34816, 34944, 34960, + 34956, 0, 32768, 34816, 34944, 34960, 34961, 34958, + 0, 32768, 34816, 34944, 0, 32768, 34816, 34944, + 34960, 0, 32768, 34816, 34944, 34960, 0, 32768, + 34816, 34944, 34960, 34962, 0, 32768, 34816, 34944, + 34960, 0, 32768, 34816, 34944, 34960, 34964, 0, + 32768, 34816, 34944, 34960, 34964, 0, 32768, 34816, + 34944, 34960, 34968, 34966, 0, 32768, 34816, 34944, + 34960, 0, 32768, 34816, 34944, 34976, 34968, 0, + 32768, 34816, 34944, 34976, 34968, 0, 32768, 34816, + 34944, 34976, 34968, 34970, 0, 32768, 34816, 34944, + 34976, 34968, 0, 32768, 34816, 34944, 34976, 34977, + 34972, 0, 32768, 34816, 34944, 34976, 34977, 34972, + 0, 32768, 34816, 34944, 34976, 34977, 34972, 34974, + 0, 32768, 34816, 34944, 0, 32768, 34816, 34944, + 34976, 0, 32768, 34816, 34944, 34976, 0, 32768, + 34816, 34944, 34976, 34978, 0, 32768, 34816, 34944, + 34976, 0, 32768, 34816, 34944, 34976, 34980, 0, + 32768, 34816, 34944, 34976, 34980, 0, 32768, 34816, + 34944, 34976, 34984, 34982, 0, 32768, 34816, 34944, + 34976, 0, 32768, 34816, 34944, 34976, 34984, 0, + 32768, 34816, 34944, 34976, 34984, 0, 32768, 34816, + 34944, 34976, 34984, 34986, 0, 32768, 34816, 34944, + 34976, 34984, 0, 32768, 34816, 34944, 34976, 34992, + 34988, 0, 32768, 34816, 34944, 34976, 34992, 34988, + 0, 32768, 34816, 34944, 34976, 34992, 34993, 34990, + 0, 32768, 34816, 34944, 34976, 0, 32768, 34816, + 34944, 35008, 34992, 0, 32768, 34816, 34944, 35008, + 34992, 0, 32768, 34816, 34944, 35008, 34992, 34994, + 0, 32768, 34816, 34944, 35008, 34992, 0, 32768, + 34816, 34944, 35008, 34992, 34996, 0, 32768, 34816, + 34944, 35008, 34992, 34996, 0, 32768, 34816, 34944, + 35008, 34992, 35000, 34998, 0, 32768, 34816, 34944, + 35008, 34992, 0, 32768, 34816, 34944, 35008, 35009, + 35000, 0, 32768, 34816, 34944, 35008, 35009, 35000, + 0, 32768, 34816, 34944, 35008, 35009, 35000, 35002, + 0, 32768, 34816, 34944, 35008, 35009, 35000, 0, + 32768, 34816, 34944, 35008, 35009, 35000, 35004, 0, + 32768, 34816, 34944, 35008, 35009, 35011, 35004, 0, + 32768, 34816, 34944, 35008, 35009, 35011, 35004, 35006, + 0, 32768, 34816, 34944, 0, 32768, 34816, 35072, + 35008, 0, 32768, 34816, 35072, 35008, 0, 32768, + 34816, 35072, 35008, 35010, 0, 32768, 34816, 35072, + 35008, 0, 32768, 34816, 35072, 35008, 35012, 0, + 32768, 34816, 35072, 35008, 35012, 0, 32768, 34816, + 35072, 35008, 35016, 35014, 0, 32768, 34816, 35072, + 35008, 0, 32768, 34816, 35072, 35008, 35016, 0, + 32768, 34816, 35072, 35008, 35016, 0, 32768, 34816, + 35072, 35008, 35016, 35018, 0, 32768, 34816, 35072, + 35008, 35016, 0, 32768, 34816, 35072, 35008, 35024, + 35020, 0, 32768, 34816, 35072, 35008, 35024, 35020, + 0, 32768, 34816, 35072, 35008, 35024, 35025, 35022, + 0, 32768, 34816, 35072, 35008, 0, 32768, 34816, + 35072, 35008, 35024, 0, 32768, 34816, 35072, 35008, + 35024, 0, 32768, 34816, 35072, 35008, 35024, 35026, + 0, 32768, 34816, 35072, 35008, 35024, 0, 32768, + 34816, 35072, 35008, 35024, 35028, 0, 32768, 34816, + 35072, 35008, 35024, 35028, 0, 32768, 34816, 35072, + 35008, 35024, 35032, 35030, 0, 32768, 34816, 35072, + 35008, 35024, 0, 32768, 34816, 35072, 35008, 35040, + 35032, 0, 32768, 34816, 35072, 35008, 35040, 35032, + 0, 32768, 34816, 35072, 35008, 35040, 35032, 35034, + 0, 32768, 34816, 35072, 35008, 35040, 35032, 0, + 32768, 34816, 35072, 35008, 35040, 35041, 35036, 0, + 32768, 34816, 35072, 35008, 35040, 35041, 35036, 0, + 32768, 34816, 35072, 35008, 35040, 35041, 35036, 35038, + 0, 32768, 34816, 35072, 35008, 0, 32768, 34816, + 35072, 35073, 35040, 0, 32768, 34816, 35072, 35073, + 35040, 0, 32768, 34816, 35072, 35073, 35040, 35042, + 0, 32768, 34816, 35072, 35073, 35040, 0, 32768, + 34816, 35072, 35073, 35040, 35044, 0, 32768, 34816, + 35072, 35073, 35040, 35044, 0, 32768, 34816, 35072, + 35073, 35040, 35048, 35046, 0, 32768, 34816, 35072, + 35073, 35040, 0, 32768, 34816, 35072, 35073, 35040, + 35048, 0, 32768, 34816, 35072, 35073, 35040, 35048, + 0, 32768, 34816, 35072, 35073, 35040, 35048, 35050, + 0, 32768, 34816, 35072, 35073, 35040, 35048, 0, + 32768, 34816, 35072, 35073, 35040, 35056, 35052, 0, + 32768, 34816, 35072, 35073, 35040, 35056, 35052, 0, + 32768, 34816, 35072, 35073, 35040, 35056, 35057, 35054, + 0, 32768, 34816, 35072, 35073, 35040, 0, 32768, + 34816, 35072, 35073, 35040, 35056, 0, 32768, 34816, + 35072, 35073, 35075, 35056, 0, 32768, 34816, 35072, + 35073, 35075, 35056, 35058, 0, 32768, 34816, 35072, + 35073, 35075, 35056, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35060, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35060, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35064, 35062, 0, 32768, 34816, 35072, + 35073, 35075, 35056, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35064, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35064, 0, 32768, 34816, 35072, 35073, + 35075, 35056, 35064, 35066, 0, 32768, 34816, 35072, + 35073, 35075, 35079, 35064, 0, 32768, 34816, 35072, + 35073, 35075, 35079, 35064, 35068, 0, 32768, 34816, + 35072, 35073, 35075, 35079, 35064, 35068, 0, 32768, + 34816, 35072, 35073, 35075, 35079, 35064, 35068, 35070, + 0, 32768, 34816, 0, 32768, 34816, 35072, 0, + 32768, 34816, 35072, 0, 32768, 34816, 35072, 35074, + 0, 32768, 34816, 35072, 0, 32768, 34816, 35072, + 35076, 0, 32768, 34816, 35072, 35076, 0, 32768, + 34816, 35072, 35080, 35078, 0, 32768, 34816, 35072, + 0, 32768, 34816, 35072, 35080, 0, 32768, 34816, + 35072, 35080, 0, 32768, 34816, 35072, 35080, 35082, + 0, 32768, 34816, 35072, 35080, 0, 32768, 34816, + 35072, 35088, 35084, 0, 32768, 34816, 35072, 35088, + 35084, 0, 32768, 34816, 35072, 35088, 35089, 35086, + 0, 32768, 34816, 35072, 0, 32768, 34816, 35072, + 35088, 0, 32768, 34816, 35072, 35088, 0, 32768, + 34816, 35072, 35088, 35090, 0, 32768, 34816, 35072, + 35088, 0, 32768, 34816, 35072, 35088, 35092, 0, + 32768, 34816, 35072, 35088, 35092, 0, 32768, 34816, + 35072, 35088, 35096, 35094, 0, 32768, 34816, 35072, + 35088, 0, 32768, 34816, 35072, 35104, 35096, 0, + 32768, 34816, 35072, 35104, 35096, 0, 32768, 34816, + 35072, 35104, 35096, 35098, 0, 32768, 34816, 35072, + 35104, 35096, 0, 32768, 34816, 35072, 35104, 35105, + 35100, 0, 32768, 34816, 35072, 35104, 35105, 35100, + 0, 32768, 34816, 35072, 35104, 35105, 35100, 35102, + 0, 32768, 34816, 35072, 0, 32768, 34816, 35072, + 35104, 0, 32768, 34816, 35072, 35104, 0, 32768, + 34816, 35072, 35104, 35106, 0, 32768, 34816, 35072, + 35104, 0, 32768, 34816, 35072, 35104, 35108, 0, + 32768, 34816, 35072, 35104, 35108, 0, 32768, 34816, + 35072, 35104, 35112, 35110, 0, 32768, 34816, 35072, + 35104, 0, 32768, 34816, 35072, 35104, 35112, 0, + 32768, 34816, 35072, 35104, 35112, 0, 32768, 34816, + 35072, 35104, 35112, 35114, 0, 32768, 34816, 35072, + 35104, 35112, 0, 32768, 34816, 35072, 35104, 35120, + 35116, 0, 32768, 34816, 35072, 35104, 35120, 35116, + 0, 32768, 34816, 35072, 35104, 35120, 35121, 35118, + 0, 32768, 34816, 35072, 35104, 0, 32768, 34816, + 35072, 35136, 35120, 0, 32768, 34816, 35072, 35136, + 35120, 0, 32768, 34816, 35072, 35136, 35120, 35122, + 0, 32768, 34816, 35072, 35136, 35120, 0, 32768, + 34816, 35072, 35136, 35120, 35124, 0, 32768, 34816, + 35072, 35136, 35120, 35124, 0, 32768, 34816, 35072, + 35136, 35120, 35128, 35126, 0, 32768, 34816, 35072, + 35136, 35120, 0, 32768, 34816, 35072, 35136, 35137, + 35128, 0, 32768, 34816, 35072, 35136, 35137, 35128, + 0, 32768, 34816, 35072, 35136, 35137, 35128, 35130, + 0, 32768, 34816, 35072, 35136, 35137, 35128, 0, + 32768, 34816, 35072, 35136, 35137, 35128, 35132, 0, + 32768, 34816, 35072, 35136, 35137, 35139, 35132, 0, + 32768, 34816, 35072, 35136, 35137, 35139, 35132, 35134, + 0, 32768, 34816, 35072, 0, 32768, 34816, 35072, + 35136, 0, 32768, 34816, 35072, 35136, 0, 32768, + 34816, 35072, 35136, 35138, 0, 32768, 34816, 35072, + 35136, 0, 32768, 34816, 35072, 35136, 35140, 0, + 32768, 34816, 35072, 35136, 35140, 0, 32768, 34816, + 35072, 35136, 35144, 35142, 0, 32768, 34816, 35072, + 35136, 0, 32768, 34816, 35072, 35136, 35144, 0, + 32768, 34816, 35072, 35136, 35144, 0, 32768, 34816, + 35072, 35136, 35144, 35146, 0, 32768, 34816, 35072, + 35136, 35144, 0, 32768, 34816, 35072, 35136, 35152, + 35148, 0, 32768, 34816, 35072, 35136, 35152, 35148, + 0, 32768, 34816, 35072, 35136, 35152, 35153, 35150, + 0, 32768, 34816, 35072, 35136, 0, 32768, 34816, + 35072, 35136, 35152, 0, 32768, 34816, 35072, 35136, + 35152, 0, 32768, 34816, 35072, 35136, 35152, 35154, + 0, 32768, 34816, 35072, 35136, 35152, 0, 32768, + 34816, 35072, 35136, 35152, 35156, 0, 32768, 34816, + 35072, 35136, 35152, 35156, 0, 32768, 34816, 35072, + 35136, 35152, 35160, 35158, 0, 32768, 34816, 35072, + 35136, 35152, 0, 32768, 34816, 35072, 35136, 35168, + 35160, 0, 32768, 34816, 35072, 35136, 35168, 35160, + 0, 32768, 34816, 35072, 35136, 35168, 35160, 35162, + 0, 32768, 34816, 35072, 35136, 35168, 35160, 0, + 32768, 34816, 35072, 35136, 35168, 35169, 35164, 0, + 32768, 34816, 35072, 35136, 35168, 35169, 35164, 0, + 32768, 34816, 35072, 35136, 35168, 35169, 35164, 35166, + 0, 32768, 34816, 35072, 35136, 0, 32768, 34816, + 35072, 35200, 35168, 0, 32768, 34816, 35072, 35200, + 35168, 0, 32768, 34816, 35072, 35200, 35168, 35170, + 0, 32768, 34816, 35072, 35200, 35168, 0, 32768, + 34816, 35072, 35200, 35168, 35172, 0, 32768, 34816, + 35072, 35200, 35168, 35172, 0, 32768, 34816, 35072, + 35200, 35168, 35176, 35174, 0, 32768, 34816, 35072, + 35200, 35168, 0, 32768, 34816, 35072, 35200, 35168, + 35176, 0, 32768, 34816, 35072, 35200, 35168, 35176, + 0, 32768, 34816, 35072, 35200, 35168, 35176, 35178, + 0, 32768, 34816, 35072, 35200, 35168, 35176, 0, + 32768, 34816, 35072, 35200, 35168, 35184, 35180, 0, + 32768, 34816, 35072, 35200, 35168, 35184, 35180, 0, + 32768, 34816, 35072, 35200, 35168, 35184, 35185, 35182, + 0, 32768, 34816, 35072, 35200, 35168, 0, 32768, + 34816, 35072, 35200, 35201, 35184, 0, 32768, 34816, + 35072, 35200, 35201, 35184, 0, 32768, 34816, 35072, + 35200, 35201, 35184, 35186, 0, 32768, 34816, 35072, + 35200, 35201, 35184, 0, 32768, 34816, 35072, 35200, + 35201, 35184, 35188, 0, 32768, 34816, 35072, 35200, + 35201, 35184, 35188, 0, 32768, 34816, 35072, 35200, + 35201, 35184, 35192, 35190, 0, 32768, 34816, 35072, + 35200, 35201, 35184, 0, 32768, 34816, 35072, 35200, + 35201, 35184, 35192, 0, 32768, 34816, 35072, 35200, + 35201, 35203, 35192, 0, 32768, 34816, 35072, 35200, + 35201, 35203, 35192, 35194, 0, 32768, 34816, 35072, + 35200, 35201, 35203, 35192, 0, 32768, 34816, 35072, + 35200, 35201, 35203, 35192, 35196, 0, 32768, 34816, + 35072, 35200, 35201, 35203, 35192, 35196, 0, 32768, + 34816, 35072, 35200, 35201, 35203, 35192, 35196, 35198, + 0, 32768, 34816, 35072, 0, 32768, 34816, 35328, + 35200, 0, 32768, 34816, 35328, 35200, 0, 32768, + 34816, 35328, 35200, 35202, 0, 32768, 34816, 35328, + 35200, 0, 32768, 34816, 35328, 35200, 35204, 0, + 32768, 34816, 35328, 35200, 35204, 0, 32768, 34816, + 35328, 35200, 35208, 35206, 0, 32768, 34816, 35328, + 35200, 0, 32768, 34816, 35328, 35200, 35208, 0, + 32768, 34816, 35328, 35200, 35208, 0, 32768, 34816, + 35328, 35200, 35208, 35210, 0, 32768, 34816, 35328, + 35200, 35208, 0, 32768, 34816, 35328, 35200, 35216, + 35212, 0, 32768, 34816, 35328, 35200, 35216, 35212, + 0, 32768, 34816, 35328, 35200, 35216, 35217, 35214, + 0, 32768, 34816, 35328, 35200, 0, 32768, 34816, + 35328, 35200, 35216, 0, 32768, 34816, 35328, 35200, + 35216, 0, 32768, 34816, 35328, 35200, 35216, 35218, + 0, 32768, 34816, 35328, 35200, 35216, 0, 32768, + 34816, 35328, 35200, 35216, 35220, 0, 32768, 34816, + 35328, 35200, 35216, 35220, 0, 32768, 34816, 35328, + 35200, 35216, 35224, 35222, 0, 32768, 34816, 35328, + 35200, 35216, 0, 32768, 34816, 35328, 35200, 35232, + 35224, 0, 32768, 34816, 35328, 35200, 35232, 35224, + 0, 32768, 34816, 35328, 35200, 35232, 35224, 35226, + 0, 32768, 34816, 35328, 35200, 35232, 35224, 0, + 32768, 34816, 35328, 35200, 35232, 35233, 35228, 0, + 32768, 34816, 35328, 35200, 35232, 35233, 35228, 0, + 32768, 34816, 35328, 35200, 35232, 35233, 35228, 35230, + 0, 32768, 34816, 35328, 35200, 0, 32768, 34816, + 35328, 35200, 35232, 0, 32768, 34816, 35328, 35200, + 35232, 0, 32768, 34816, 35328, 35200, 35232, 35234, + 0, 32768, 34816, 35328, 35200, 35232, 0, 32768, + 34816, 35328, 35200, 35232, 35236, 0, 32768, 34816, + 35328, 35200, 35232, 35236, 0, 32768, 34816, 35328, + 35200, 35232, 35240, 35238, 0, 32768, 34816, 35328, + 35200, 35232, 0, 32768, 34816, 35328, 35200, 35232, + 35240, 0, 32768, 34816, 35328, 35200, 35232, 35240, + 0, 32768, 34816, 35328, 35200, 35232, 35240, 35242, + 0, 32768, 34816, 35328, 35200, 35232, 35240, 0, + 32768, 34816, 35328, 35200, 35232, 35248, 35244, 0, + 32768, 34816, 35328, 35200, 35232, 35248, 35244, 0, + 32768, 34816, 35328, 35200, 35232, 35248, 35249, 35246, + 0, 32768, 34816, 35328, 35200, 35232, 0, 32768, + 34816, 35328, 35200, 35264, 35248, 0, 32768, 34816, + 35328, 35200, 35264, 35248, 0, 32768, 34816, 35328, + 35200, 35264, 35248, 35250, 0, 32768, 34816, 35328, + 35200, 35264, 35248, 0, 32768, 34816, 35328, 35200, + 35264, 35248, 35252, 0, 32768, 34816, 35328, 35200, + 35264, 35248, 35252, 0, 32768, 34816, 35328, 35200, + 35264, 35248, 35256, 35254, 0, 32768, 34816, 35328, + 35200, 35264, 35248, 0, 32768, 34816, 35328, 35200, + 35264, 35265, 35256, 0, 32768, 34816, 35328, 35200, + 35264, 35265, 35256, 0, 32768, 34816, 35328, 35200, + 35264, 35265, 35256, 35258, 0, 32768, 34816, 35328, + 35200, 35264, 35265, 35256, 0, 32768, 34816, 35328, + 35200, 35264, 35265, 35256, 35260, 0, 32768, 34816, + 35328, 35200, 35264, 35265, 35267, 35260, 0, 32768, + 34816, 35328, 35200, 35264, 35265, 35267, 35260, 35262, + 0, 32768, 34816, 35328, 35200, 0, 32768, 34816, + 35328, 35329, 35264, 0, 32768, 34816, 35328, 35329, + 35264, 0, 32768, 34816, 35328, 35329, 35264, 35266, + 0, 32768, 34816, 35328, 35329, 35264, 0, 32768, + 34816, 35328, 35329, 35264, 35268, 0, 32768, 34816, + 35328, 35329, 35264, 35268, 0, 32768, 34816, 35328, + 35329, 35264, 35272, 35270, 0, 32768, 34816, 35328, + 35329, 35264, 0, 32768, 34816, 35328, 35329, 35264, + 35272, 0, 32768, 34816, 35328, 35329, 35264, 35272, + 0, 32768, 34816, 35328, 35329, 35264, 35272, 35274, + 0, 32768, 34816, 35328, 35329, 35264, 35272, 0, + 32768, 34816, 35328, 35329, 35264, 35280, 35276, 0, + 32768, 34816, 35328, 35329, 35264, 35280, 35276, 0, + 32768, 34816, 35328, 35329, 35264, 35280, 35281, 35278, + 0, 32768, 34816, 35328, 35329, 35264, 0, 32768, + 34816, 35328, 35329, 35264, 35280, 0, 32768, 34816, + 35328, 35329, 35264, 35280, 0, 32768, 34816, 35328, + 35329, 35264, 35280, 35282, 0, 32768, 34816, 35328, + 35329, 35264, 35280, 0, 32768, 34816, 35328, 35329, + 35264, 35280, 35284, 0, 32768, 34816, 35328, 35329, + 35264, 35280, 35284, 0, 32768, 34816, 35328, 35329, + 35264, 35280, 35288, 35286, 0, 32768, 34816, 35328, + 35329, 35264, 35280, 0, 32768, 34816, 35328, 35329, + 35264, 35296, 35288, 0, 32768, 34816, 35328, 35329, + 35264, 35296, 35288, 0, 32768, 34816, 35328, 35329, + 35264, 35296, 35288, 35290, 0, 32768, 34816, 35328, + 35329, 35264, 35296, 35288, 0, 32768, 34816, 35328, + 35329, 35264, 35296, 35297, 35292, 0, 32768, 34816, + 35328, 35329, 35264, 35296, 35297, 35292, 0, 32768, + 34816, 35328, 35329, 35264, 35296, 35297, 35292, 35294, + 0, 32768, 34816, 35328, 35329, 35264, 0, 32768, + 34816, 35328, 35329, 35264, 35296, 0, 32768, 34816, + 35328, 35329, 35331, 35296, 0, 32768, 34816, 35328, + 35329, 35331, 35296, 35298, 0, 32768, 34816, 35328, + 35329, 35331, 35296, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35300, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35300, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35304, 35302, 0, 32768, 34816, 35328, + 35329, 35331, 35296, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35304, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35304, 0, 32768, 34816, 35328, 35329, + 35331, 35296, 35304, 35306, 0, 32768, 34816, 35328, + 35329, 35331, 35296, 35304, 0, 32768, 34816, 35328, + 35329, 35331, 35296, 35312, 35308, 0, 32768, 34816, + 35328, 35329, 35331, 35296, 35312, 35308, 0, 32768, + 34816, 35328, 35329, 35331, 35296, 35312, 35313, 35310, + 0, 32768, 34816, 35328, 35329, 35331, 35296, 0, + 32768, 34816, 35328, 35329, 35331, 35296, 35312, 0, + 32768, 34816, 35328, 35329, 35331, 35296, 35312, 0, + 32768, 34816, 35328, 35329, 35331, 35296, 35312, 35314, + 0, 32768, 34816, 35328, 35329, 35331, 35335, 35312, + 0, 32768, 34816, 35328, 35329, 35331, 35335, 35312, + 35316, 0, 32768, 34816, 35328, 35329, 35331, 35335, + 35312, 35316, 0, 32768, 34816, 35328, 35329, 35331, + 35335, 35312, 35320, 35318, 0, 32768, 34816, 35328, + 35329, 35331, 35335, 35312, 0, 32768, 34816, 35328, + 35329, 35331, 35335, 35312, 35320, 0, 32768, 34816, + 35328, 35329, 35331, 35335, 35312, 35320, 0, 32768, + 34816, 35328, 35329, 35331, 35335, 35312, 35320, 35322, + 0, 32768, 34816, 35328, 35329, 35331, 35335, 35312, + 35320, 0, 32768, 34816, 35328, 35329, 35331, 35335, + 35312, 35320, 35324, 0, 32768, 34816, 35328, 35329, + 35331, 35335, 35312, 35320, 35324, 0, 32768, 34816, + 35328, 35329, 35331, 35335, 35312, 35320, 35324, 35326, + 0, 32768, 34816, 0, 32768, 34816, 35328, 0, + 32768, 34816, 35328, 0, 32768, 34816, 35328, 35330, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35328, + 35332, 0, 32768, 34816, 35328, 35332, 0, 32768, + 34816, 35328, 35336, 35334, 0, 32768, 34816, 35328, + 0, 32768, 34816, 35328, 35336, 0, 32768, 34816, + 35328, 35336, 0, 32768, 34816, 35328, 35336, 35338, + 0, 32768, 34816, 35328, 35336, 0, 32768, 34816, + 35328, 35344, 35340, 0, 32768, 34816, 35328, 35344, + 35340, 0, 32768, 34816, 35328, 35344, 35345, 35342, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35328, + 35344, 0, 32768, 34816, 35328, 35344, 0, 32768, + 34816, 35328, 35344, 35346, 0, 32768, 34816, 35328, + 35344, 0, 32768, 34816, 35328, 35344, 35348, 0, + 32768, 34816, 35328, 35344, 35348, 0, 32768, 34816, + 35328, 35344, 35352, 35350, 0, 32768, 34816, 35328, + 35344, 0, 32768, 34816, 35328, 35360, 35352, 0, + 32768, 34816, 35328, 35360, 35352, 0, 32768, 34816, + 35328, 35360, 35352, 35354, 0, 32768, 34816, 35328, + 35360, 35352, 0, 32768, 34816, 35328, 35360, 35361, + 35356, 0, 32768, 34816, 35328, 35360, 35361, 35356, + 0, 32768, 34816, 35328, 35360, 35361, 35356, 35358, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35328, + 35360, 0, 32768, 34816, 35328, 35360, 0, 32768, + 34816, 35328, 35360, 35362, 0, 32768, 34816, 35328, + 35360, 0, 32768, 34816, 35328, 35360, 35364, 0, + 32768, 34816, 35328, 35360, 35364, 0, 32768, 34816, + 35328, 35360, 35368, 35366, 0, 32768, 34816, 35328, + 35360, 0, 32768, 34816, 35328, 35360, 35368, 0, + 32768, 34816, 35328, 35360, 35368, 0, 32768, 34816, + 35328, 35360, 35368, 35370, 0, 32768, 34816, 35328, + 35360, 35368, 0, 32768, 34816, 35328, 35360, 35376, + 35372, 0, 32768, 34816, 35328, 35360, 35376, 35372, + 0, 32768, 34816, 35328, 35360, 35376, 35377, 35374, + 0, 32768, 34816, 35328, 35360, 0, 32768, 34816, + 35328, 35392, 35376, 0, 32768, 34816, 35328, 35392, + 35376, 0, 32768, 34816, 35328, 35392, 35376, 35378, + 0, 32768, 34816, 35328, 35392, 35376, 0, 32768, + 34816, 35328, 35392, 35376, 35380, 0, 32768, 34816, + 35328, 35392, 35376, 35380, 0, 32768, 34816, 35328, + 35392, 35376, 35384, 35382, 0, 32768, 34816, 35328, + 35392, 35376, 0, 32768, 34816, 35328, 35392, 35393, + 35384, 0, 32768, 34816, 35328, 35392, 35393, 35384, + 0, 32768, 34816, 35328, 35392, 35393, 35384, 35386, + 0, 32768, 34816, 35328, 35392, 35393, 35384, 0, + 32768, 34816, 35328, 35392, 35393, 35384, 35388, 0, + 32768, 34816, 35328, 35392, 35393, 35395, 35388, 0, + 32768, 34816, 35328, 35392, 35393, 35395, 35388, 35390, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35328, + 35392, 0, 32768, 34816, 35328, 35392, 0, 32768, + 34816, 35328, 35392, 35394, 0, 32768, 34816, 35328, + 35392, 0, 32768, 34816, 35328, 35392, 35396, 0, + 32768, 34816, 35328, 35392, 35396, 0, 32768, 34816, + 35328, 35392, 35400, 35398, 0, 32768, 34816, 35328, + 35392, 0, 32768, 34816, 35328, 35392, 35400, 0, + 32768, 34816, 35328, 35392, 35400, 0, 32768, 34816, + 35328, 35392, 35400, 35402, 0, 32768, 34816, 35328, + 35392, 35400, 0, 32768, 34816, 35328, 35392, 35408, + 35404, 0, 32768, 34816, 35328, 35392, 35408, 35404, + 0, 32768, 34816, 35328, 35392, 35408, 35409, 35406, + 0, 32768, 34816, 35328, 35392, 0, 32768, 34816, + 35328, 35392, 35408, 0, 32768, 34816, 35328, 35392, + 35408, 0, 32768, 34816, 35328, 35392, 35408, 35410, + 0, 32768, 34816, 35328, 35392, 35408, 0, 32768, + 34816, 35328, 35392, 35408, 35412, 0, 32768, 34816, + 35328, 35392, 35408, 35412, 0, 32768, 34816, 35328, + 35392, 35408, 35416, 35414, 0, 32768, 34816, 35328, + 35392, 35408, 0, 32768, 34816, 35328, 35392, 35424, + 35416, 0, 32768, 34816, 35328, 35392, 35424, 35416, + 0, 32768, 34816, 35328, 35392, 35424, 35416, 35418, + 0, 32768, 34816, 35328, 35392, 35424, 35416, 0, + 32768, 34816, 35328, 35392, 35424, 35425, 35420, 0, + 32768, 34816, 35328, 35392, 35424, 35425, 35420, 0, + 32768, 34816, 35328, 35392, 35424, 35425, 35420, 35422, + 0, 32768, 34816, 35328, 35392, 0, 32768, 34816, + 35328, 35456, 35424, 0, 32768, 34816, 35328, 35456, + 35424, 0, 32768, 34816, 35328, 35456, 35424, 35426, + 0, 32768, 34816, 35328, 35456, 35424, 0, 32768, + 34816, 35328, 35456, 35424, 35428, 0, 32768, 34816, + 35328, 35456, 35424, 35428, 0, 32768, 34816, 35328, + 35456, 35424, 35432, 35430, 0, 32768, 34816, 35328, + 35456, 35424, 0, 32768, 34816, 35328, 35456, 35424, + 35432, 0, 32768, 34816, 35328, 35456, 35424, 35432, + 0, 32768, 34816, 35328, 35456, 35424, 35432, 35434, + 0, 32768, 34816, 35328, 35456, 35424, 35432, 0, + 32768, 34816, 35328, 35456, 35424, 35440, 35436, 0, + 32768, 34816, 35328, 35456, 35424, 35440, 35436, 0, + 32768, 34816, 35328, 35456, 35424, 35440, 35441, 35438, + 0, 32768, 34816, 35328, 35456, 35424, 0, 32768, + 34816, 35328, 35456, 35457, 35440, 0, 32768, 34816, + 35328, 35456, 35457, 35440, 0, 32768, 34816, 35328, + 35456, 35457, 35440, 35442, 0, 32768, 34816, 35328, + 35456, 35457, 35440, 0, 32768, 34816, 35328, 35456, + 35457, 35440, 35444, 0, 32768, 34816, 35328, 35456, + 35457, 35440, 35444, 0, 32768, 34816, 35328, 35456, + 35457, 35440, 35448, 35446, 0, 32768, 34816, 35328, + 35456, 35457, 35440, 0, 32768, 34816, 35328, 35456, + 35457, 35440, 35448, 0, 32768, 34816, 35328, 35456, + 35457, 35459, 35448, 0, 32768, 34816, 35328, 35456, + 35457, 35459, 35448, 35450, 0, 32768, 34816, 35328, + 35456, 35457, 35459, 35448, 0, 32768, 34816, 35328, + 35456, 35457, 35459, 35448, 35452, 0, 32768, 34816, + 35328, 35456, 35457, 35459, 35448, 35452, 0, 32768, + 34816, 35328, 35456, 35457, 35459, 35448, 35452, 35454, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35328, + 35456, 0, 32768, 34816, 35328, 35456, 0, 32768, + 34816, 35328, 35456, 35458, 0, 32768, 34816, 35328, + 35456, 0, 32768, 34816, 35328, 35456, 35460, 0, + 32768, 34816, 35328, 35456, 35460, 0, 32768, 34816, + 35328, 35456, 35464, 35462, 0, 32768, 34816, 35328, + 35456, 0, 32768, 34816, 35328, 35456, 35464, 0, + 32768, 34816, 35328, 35456, 35464, 0, 32768, 34816, + 35328, 35456, 35464, 35466, 0, 32768, 34816, 35328, + 35456, 35464, 0, 32768, 34816, 35328, 35456, 35472, + 35468, 0, 32768, 34816, 35328, 35456, 35472, 35468, + 0, 32768, 34816, 35328, 35456, 35472, 35473, 35470, + 0, 32768, 34816, 35328, 35456, 0, 32768, 34816, + 35328, 35456, 35472, 0, 32768, 34816, 35328, 35456, + 35472, 0, 32768, 34816, 35328, 35456, 35472, 35474, + 0, 32768, 34816, 35328, 35456, 35472, 0, 32768, + 34816, 35328, 35456, 35472, 35476, 0, 32768, 34816, + 35328, 35456, 35472, 35476, 0, 32768, 34816, 35328, + 35456, 35472, 35480, 35478, 0, 32768, 34816, 35328, + 35456, 35472, 0, 32768, 34816, 35328, 35456, 35488, + 35480, 0, 32768, 34816, 35328, 35456, 35488, 35480, + 0, 32768, 34816, 35328, 35456, 35488, 35480, 35482, + 0, 32768, 34816, 35328, 35456, 35488, 35480, 0, + 32768, 34816, 35328, 35456, 35488, 35489, 35484, 0, + 32768, 34816, 35328, 35456, 35488, 35489, 35484, 0, + 32768, 34816, 35328, 35456, 35488, 35489, 35484, 35486, + 0, 32768, 34816, 35328, 35456, 0, 32768, 34816, + 35328, 35456, 35488, 0, 32768, 34816, 35328, 35456, + 35488, 0, 32768, 34816, 35328, 35456, 35488, 35490, + 0, 32768, 34816, 35328, 35456, 35488, 0, 32768, + 34816, 35328, 35456, 35488, 35492, 0, 32768, 34816, + 35328, 35456, 35488, 35492, 0, 32768, 34816, 35328, + 35456, 35488, 35496, 35494, 0, 32768, 34816, 35328, + 35456, 35488, 0, 32768, 34816, 35328, 35456, 35488, + 35496, 0, 32768, 34816, 35328, 35456, 35488, 35496, + 0, 32768, 34816, 35328, 35456, 35488, 35496, 35498, + 0, 32768, 34816, 35328, 35456, 35488, 35496, 0, + 32768, 34816, 35328, 35456, 35488, 35504, 35500, 0, + 32768, 34816, 35328, 35456, 35488, 35504, 35500, 0, + 32768, 34816, 35328, 35456, 35488, 35504, 35505, 35502, + 0, 32768, 34816, 35328, 35456, 35488, 0, 32768, + 34816, 35328, 35456, 35520, 35504, 0, 32768, 34816, + 35328, 35456, 35520, 35504, 0, 32768, 34816, 35328, + 35456, 35520, 35504, 35506, 0, 32768, 34816, 35328, + 35456, 35520, 35504, 0, 32768, 34816, 35328, 35456, + 35520, 35504, 35508, 0, 32768, 34816, 35328, 35456, + 35520, 35504, 35508, 0, 32768, 34816, 35328, 35456, + 35520, 35504, 35512, 35510, 0, 32768, 34816, 35328, + 35456, 35520, 35504, 0, 32768, 34816, 35328, 35456, + 35520, 35521, 35512, 0, 32768, 34816, 35328, 35456, + 35520, 35521, 35512, 0, 32768, 34816, 35328, 35456, + 35520, 35521, 35512, 35514, 0, 32768, 34816, 35328, + 35456, 35520, 35521, 35512, 0, 32768, 34816, 35328, + 35456, 35520, 35521, 35512, 35516, 0, 32768, 34816, + 35328, 35456, 35520, 35521, 35523, 35516, 0, 32768, + 34816, 35328, 35456, 35520, 35521, 35523, 35516, 35518, + 0, 32768, 34816, 35328, 35456, 0, 32768, 34816, + 35328, 35584, 35520, 0, 32768, 34816, 35328, 35584, + 35520, 0, 32768, 34816, 35328, 35584, 35520, 35522, + 0, 32768, 34816, 35328, 35584, 35520, 0, 32768, + 34816, 35328, 35584, 35520, 35524, 0, 32768, 34816, + 35328, 35584, 35520, 35524, 0, 32768, 34816, 35328, + 35584, 35520, 35528, 35526, 0, 32768, 34816, 35328, + 35584, 35520, 0, 32768, 34816, 35328, 35584, 35520, + 35528, 0, 32768, 34816, 35328, 35584, 35520, 35528, + 0, 32768, 34816, 35328, 35584, 35520, 35528, 35530, + 0, 32768, 34816, 35328, 35584, 35520, 35528, 0, + 32768, 34816, 35328, 35584, 35520, 35536, 35532, 0, + 32768, 34816, 35328, 35584, 35520, 35536, 35532, 0, + 32768, 34816, 35328, 35584, 35520, 35536, 35537, 35534, + 0, 32768, 34816, 35328, 35584, 35520, 0, 32768, + 34816, 35328, 35584, 35520, 35536, 0, 32768, 34816, + 35328, 35584, 35520, 35536, 0, 32768, 34816, 35328, + 35584, 35520, 35536, 35538, 0, 32768, 34816, 35328, + 35584, 35520, 35536, 0, 32768, 34816, 35328, 35584, + 35520, 35536, 35540, 0, 32768, 34816, 35328, 35584, + 35520, 35536, 35540, 0, 32768, 34816, 35328, 35584, + 35520, 35536, 35544, 35542, 0, 32768, 34816, 35328, + 35584, 35520, 35536, 0, 32768, 34816, 35328, 35584, + 35520, 35552, 35544, 0, 32768, 34816, 35328, 35584, + 35520, 35552, 35544, 0, 32768, 34816, 35328, 35584, + 35520, 35552, 35544, 35546, 0, 32768, 34816, 35328, + 35584, 35520, 35552, 35544, 0, 32768, 34816, 35328, + 35584, 35520, 35552, 35553, 35548, 0, 32768, 34816, + 35328, 35584, 35520, 35552, 35553, 35548, 0, 32768, + 34816, 35328, 35584, 35520, 35552, 35553, 35548, 35550, + 0, 32768, 34816, 35328, 35584, 35520, 0, 32768, + 34816, 35328, 35584, 35585, 35552, 0, 32768, 34816, + 35328, 35584, 35585, 35552, 0, 32768, 34816, 35328, + 35584, 35585, 35552, 35554, 0, 32768, 34816, 35328, + 35584, 35585, 35552, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35556, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35556, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35560, 35558, 0, 32768, 34816, 35328, + 35584, 35585, 35552, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35560, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35560, 0, 32768, 34816, 35328, 35584, + 35585, 35552, 35560, 35562, 0, 32768, 34816, 35328, + 35584, 35585, 35552, 35560, 0, 32768, 34816, 35328, + 35584, 35585, 35552, 35568, 35564, 0, 32768, 34816, + 35328, 35584, 35585, 35552, 35568, 35564, 0, 32768, + 34816, 35328, 35584, 35585, 35552, 35568, 35569, 35566, + 0, 32768, 34816, 35328, 35584, 35585, 35552, 0, + 32768, 34816, 35328, 35584, 35585, 35552, 35568, 0, + 32768, 34816, 35328, 35584, 35585, 35587, 35568, 0, + 32768, 34816, 35328, 35584, 35585, 35587, 35568, 35570, + 0, 32768, 34816, 35328, 35584, 35585, 35587, 35568, + 0, 32768, 34816, 35328, 35584, 35585, 35587, 35568, + 35572, 0, 32768, 34816, 35328, 35584, 35585, 35587, + 35568, 35572, 0, 32768, 34816, 35328, 35584, 35585, + 35587, 35568, 35576, 35574, 0, 32768, 34816, 35328, + 35584, 35585, 35587, 35568, 0, 32768, 34816, 35328, + 35584, 35585, 35587, 35568, 35576, 0, 32768, 34816, + 35328, 35584, 35585, 35587, 35568, 35576, 0, 32768, + 34816, 35328, 35584, 35585, 35587, 35568, 35576, 35578, + 0, 32768, 34816, 35328, 35584, 35585, 35587, 35591, + 35576, 0, 32768, 34816, 35328, 35584, 35585, 35587, + 35591, 35576, 35580, 0, 32768, 34816, 35328, 35584, + 35585, 35587, 35591, 35576, 35580, 0, 32768, 34816, + 35328, 35584, 35585, 35587, 35591, 35576, 35580, 35582, + 0, 32768, 34816, 35328, 0, 32768, 34816, 35840, + 35584, 0, 32768, 34816, 35840, 35584, 0, 32768, + 34816, 35840, 35584, 35586, 0, 32768, 34816, 35840, + 35584, 0, 32768, 34816, 35840, 35584, 35588, 0, + 32768, 34816, 35840, 35584, 35588, 0, 32768, 34816, + 35840, 35584, 35592, 35590, 0, 32768, 34816, 35840, + 35584, 0, 32768, 34816, 35840, 35584, 35592, 0, + 32768, 34816, 35840, 35584, 35592, 0, 32768, 34816, + 35840, 35584, 35592, 35594, 0, 32768, 34816, 35840, + 35584, 35592, 0, 32768, 34816, 35840, 35584, 35600, + 35596, 0, 32768, 34816, 35840, 35584, 35600, 35596, + 0, 32768, 34816, 35840, 35584, 35600, 35601, 35598, + 0, 32768, 34816, 35840, 35584, 0, 32768, 34816, + 35840, 35584, 35600, 0, 32768, 34816, 35840, 35584, + 35600, 0, 32768, 34816, 35840, 35584, 35600, 35602, + 0, 32768, 34816, 35840, 35584, 35600, 0, 32768, + 34816, 35840, 35584, 35600, 35604, 0, 32768, 34816, + 35840, 35584, 35600, 35604, 0, 32768, 34816, 35840, + 35584, 35600, 35608, 35606, 0, 32768, 34816, 35840, + 35584, 35600, 0, 32768, 34816, 35840, 35584, 35616, + 35608, 0, 32768, 34816, 35840, 35584, 35616, 35608, + 0, 32768, 34816, 35840, 35584, 35616, 35608, 35610, + 0, 32768, 34816, 35840, 35584, 35616, 35608, 0, + 32768, 34816, 35840, 35584, 35616, 35617, 35612, 0, + 32768, 34816, 35840, 35584, 35616, 35617, 35612, 0, + 32768, 34816, 35840, 35584, 35616, 35617, 35612, 35614, + 0, 32768, 34816, 35840, 35584, 0, 32768, 34816, + 35840, 35584, 35616, 0, 32768, 34816, 35840, 35584, + 35616, 0, 32768, 34816, 35840, 35584, 35616, 35618, + 0, 32768, 34816, 35840, 35584, 35616, 0, 32768, + 34816, 35840, 35584, 35616, 35620, 0, 32768, 34816, + 35840, 35584, 35616, 35620, 0, 32768, 34816, 35840, + 35584, 35616, 35624, 35622, 0, 32768, 34816, 35840, + 35584, 35616, 0, 32768, 34816, 35840, 35584, 35616, + 35624, 0, 32768, 34816, 35840, 35584, 35616, 35624, + 0, 32768, 34816, 35840, 35584, 35616, 35624, 35626, + 0, 32768, 34816, 35840, 35584, 35616, 35624, 0, + 32768, 34816, 35840, 35584, 35616, 35632, 35628, 0, + 32768, 34816, 35840, 35584, 35616, 35632, 35628, 0, + 32768, 34816, 35840, 35584, 35616, 35632, 35633, 35630, + 0, 32768, 34816, 35840, 35584, 35616, 0, 32768, + 34816, 35840, 35584, 35648, 35632, 0, 32768, 34816, + 35840, 35584, 35648, 35632, 0, 32768, 34816, 35840, + 35584, 35648, 35632, 35634, 0, 32768, 34816, 35840, + 35584, 35648, 35632, 0, 32768, 34816, 35840, 35584, + 35648, 35632, 35636, 0, 32768, 34816, 35840, 35584, + 35648, 35632, 35636, 0, 32768, 34816, 35840, 35584, + 35648, 35632, 35640, 35638, 0, 32768, 34816, 35840, + 35584, 35648, 35632, 0, 32768, 34816, 35840, 35584, + 35648, 35649, 35640, 0, 32768, 34816, 35840, 35584, + 35648, 35649, 35640, 0, 32768, 34816, 35840, 35584, + 35648, 35649, 35640, 35642, 0, 32768, 34816, 35840, + 35584, 35648, 35649, 35640, 0, 32768, 34816, 35840, + 35584, 35648, 35649, 35640, 35644, 0, 32768, 34816, + 35840, 35584, 35648, 35649, 35651, 35644, 0, 32768, + 34816, 35840, 35584, 35648, 35649, 35651, 35644, 35646, + 0, 32768, 34816, 35840, 35584, 0, 32768, 34816, + 35840, 35584, 35648, 0, 32768, 34816, 35840, 35584, + 35648, 0, 32768, 34816, 35840, 35584, 35648, 35650, + 0, 32768, 34816, 35840, 35584, 35648, 0, 32768, + 34816, 35840, 35584, 35648, 35652, 0, 32768, 34816, + 35840, 35584, 35648, 35652, 0, 32768, 34816, 35840, + 35584, 35648, 35656, 35654, 0, 32768, 34816, 35840, + 35584, 35648, 0, 32768, 34816, 35840, 35584, 35648, + 35656, 0, 32768, 34816, 35840, 35584, 35648, 35656, + 0, 32768, 34816, 35840, 35584, 35648, 35656, 35658, + 0, 32768, 34816, 35840, 35584, 35648, 35656, 0, + 32768, 34816, 35840, 35584, 35648, 35664, 35660, 0, + 32768, 34816, 35840, 35584, 35648, 35664, 35660, 0, + 32768, 34816, 35840, 35584, 35648, 35664, 35665, 35662, + 0, 32768, 34816, 35840, 35584, 35648, 0, 32768, + 34816, 35840, 35584, 35648, 35664, 0, 32768, 34816, + 35840, 35584, 35648, 35664, 0, 32768, 34816, 35840, + 35584, 35648, 35664, 35666, 0, 32768, 34816, 35840, + 35584, 35648, 35664, 0, 32768, 34816, 35840, 35584, + 35648, 35664, 35668, 0, 32768, 34816, 35840, 35584, + 35648, 35664, 35668, 0, 32768, 34816, 35840, 35584, + 35648, 35664, 35672, 35670, 0, 32768, 34816, 35840, + 35584, 35648, 35664, 0, 32768, 34816, 35840, 35584, + 35648, 35680, 35672, 0, 32768, 34816, 35840, 35584, + 35648, 35680, 35672, 0, 32768, 34816, 35840, 35584, + 35648, 35680, 35672, 35674, 0, 32768, 34816, 35840, + 35584, 35648, 35680, 35672, 0, 32768, 34816, 35840, + 35584, 35648, 35680, 35681, 35676, 0, 32768, 34816, + 35840, 35584, 35648, 35680, 35681, 35676, 0, 32768, + 34816, 35840, 35584, 35648, 35680, 35681, 35676, 35678, + 0, 32768, 34816, 35840, 35584, 35648, 0, 32768, + 34816, 35840, 35584, 35712, 35680, 0, 32768, 34816, + 35840, 35584, 35712, 35680, 0, 32768, 34816, 35840, + 35584, 35712, 35680, 35682, 0, 32768, 34816, 35840, + 35584, 35712, 35680, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35684, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35684, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35688, 35686, 0, 32768, 34816, 35840, + 35584, 35712, 35680, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35688, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35688, 0, 32768, 34816, 35840, 35584, + 35712, 35680, 35688, 35690, 0, 32768, 34816, 35840, + 35584, 35712, 35680, 35688, 0, 32768, 34816, 35840, + 35584, 35712, 35680, 35696, 35692, 0, 32768, 34816, + 35840, 35584, 35712, 35680, 35696, 35692, 0, 32768, + 34816, 35840, 35584, 35712, 35680, 35696, 35697, 35694, + 0, 32768, 34816, 35840, 35584, 35712, 35680, 0, + 32768, 34816, 35840, 35584, 35712, 35713, 35696, 0, + 32768, 34816, 35840, 35584, 35712, 35713, 35696, 0, + 32768, 34816, 35840, 35584, 35712, 35713, 35696, 35698, + 0, 32768, 34816, 35840, 35584, 35712, 35713, 35696, + 0, 32768, 34816, 35840, 35584, 35712, 35713, 35696, + 35700, 0, 32768, 34816, 35840, 35584, 35712, 35713, + 35696, 35700, 0, 32768, 34816, 35840, 35584, 35712, + 35713, 35696, 35704, 35702, 0, 32768, 34816, 35840, + 35584, 35712, 35713, 35696, 0, 32768, 34816, 35840, + 35584, 35712, 35713, 35696, 35704, 0, 32768, 34816, + 35840, 35584, 35712, 35713, 35715, 35704, 0, 32768, + 34816, 35840, 35584, 35712, 35713, 35715, 35704, 35706, + 0, 32768, 34816, 35840, 35584, 35712, 35713, 35715, + 35704, 0, 32768, 34816, 35840, 35584, 35712, 35713, + 35715, 35704, 35708, 0, 32768, 34816, 35840, 35584, + 35712, 35713, 35715, 35704, 35708, 0, 32768, 34816, + 35840, 35584, 35712, 35713, 35715, 35704, 35708, 35710, + 0, 32768, 34816, 35840, 35584, 0, 32768, 34816, + 35840, 35584, 35712, 0, 32768, 34816, 35840, 35841, + 35712, 0, 32768, 34816, 35840, 35841, 35712, 35714, + 0, 32768, 34816, 35840, 35841, 35712, 0, 32768, + 34816, 35840, 35841, 35712, 35716, 0, 32768, 34816, + 35840, 35841, 35712, 35716, 0, 32768, 34816, 35840, + 35841, 35712, 35720, 35718, 0, 32768, 34816, 35840, + 35841, 35712, 0, 32768, 34816, 35840, 35841, 35712, + 35720, 0, 32768, 34816, 35840, 35841, 35712, 35720, + 0, 32768, 34816, 35840, 35841, 35712, 35720, 35722, + 0, 32768, 34816, 35840, 35841, 35712, 35720, 0, + 32768, 34816, 35840, 35841, 35712, 35728, 35724, 0, + 32768, 34816, 35840, 35841, 35712, 35728, 35724, 0, + 32768, 34816, 35840, 35841, 35712, 35728, 35729, 35726, + 0, 32768, 34816, 35840, 35841, 35712, 0, 32768, + 34816, 35840, 35841, 35712, 35728, 0, 32768, 34816, + 35840, 35841, 35712, 35728, 0, 32768, 34816, 35840, + 35841, 35712, 35728, 35730, 0, 32768, 34816, 35840, + 35841, 35712, 35728, 0, 32768, 34816, 35840, 35841, + 35712, 35728, 35732, 0, 32768, 34816, 35840, 35841, + 35712, 35728, 35732, 0, 32768, 34816, 35840, 35841, + 35712, 35728, 35736, 35734, 0, 32768, 34816, 35840, + 35841, 35712, 35728, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35736, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35736, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35736, 35738, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 35736, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 35745, 35740, 0, 32768, 34816, + 35840, 35841, 35712, 35744, 35745, 35740, 0, 32768, + 34816, 35840, 35841, 35712, 35744, 35745, 35740, 35742, + 0, 32768, 34816, 35840, 35841, 35712, 0, 32768, + 34816, 35840, 35841, 35712, 35744, 0, 32768, 34816, + 35840, 35841, 35712, 35744, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 35746, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35748, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35748, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35752, 35750, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35752, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35752, 0, 32768, 34816, 35840, 35841, + 35712, 35744, 35752, 35754, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 35752, 0, 32768, 34816, 35840, + 35841, 35712, 35744, 35760, 35756, 0, 32768, 34816, + 35840, 35841, 35712, 35744, 35760, 35756, 0, 32768, + 34816, 35840, 35841, 35712, 35744, 35760, 35761, 35758, + 0, 32768, 34816, 35840, 35841, 35712, 35744, 0, + 32768, 34816, 35840, 35841, 35712, 35776, 35760, 0, + 32768, 34816, 35840, 35841, 35712, 35776, 35760, 0, + 32768, 34816, 35840, 35841, 35712, 35776, 35760, 35762, + 0, 32768, 34816, 35840, 35841, 35712, 35776, 35760, + 0, 32768, 34816, 35840, 35841, 35712, 35776, 35760, + 35764, 0, 32768, 34816, 35840, 35841, 35712, 35776, + 35760, 35764, 0, 32768, 34816, 35840, 35841, 35712, + 35776, 35760, 35768, 35766, 0, 32768, 34816, 35840, + 35841, 35712, 35776, 35760, 0, 32768, 34816, 35840, + 35841, 35712, 35776, 35777, 35768, 0, 32768, 34816, + 35840, 35841, 35712, 35776, 35777, 35768, 0, 32768, + 34816, 35840, 35841, 35712, 35776, 35777, 35768, 35770, + 0, 32768, 34816, 35840, 35841, 35712, 35776, 35777, + 35768, 0, 32768, 34816, 35840, 35841, 35712, 35776, + 35777, 35768, 35772, 0, 32768, 34816, 35840, 35841, + 35712, 35776, 35777, 35779, 35772, 0, 32768, 34816, + 35840, 35841, 35712, 35776, 35777, 35779, 35772, 35774, + 0, 32768, 34816, 35840, 35841, 35712, 0, 32768, + 34816, 35840, 35841, 35712, 35776, 0, 32768, 34816, + 35840, 35841, 35712, 35776, 0, 32768, 34816, 35840, + 35841, 35712, 35776, 35778, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35780, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35780, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35784, 35782, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35784, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35784, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35784, 35786, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 35784, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 35792, 35788, 0, 32768, 34816, + 35840, 35841, 35843, 35776, 35792, 35788, 0, 32768, + 34816, 35840, 35841, 35843, 35776, 35792, 35793, 35790, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35792, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35792, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35792, 35794, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 35792, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 35792, + 35796, 0, 32768, 34816, 35840, 35841, 35843, 35776, + 35792, 35796, 0, 32768, 34816, 35840, 35841, 35843, + 35776, 35792, 35800, 35798, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 35792, 0, 32768, 34816, 35840, + 35841, 35843, 35776, 35808, 35800, 0, 32768, 34816, + 35840, 35841, 35843, 35776, 35808, 35800, 0, 32768, + 34816, 35840, 35841, 35843, 35776, 35808, 35800, 35802, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 35808, + 35800, 0, 32768, 34816, 35840, 35841, 35843, 35776, + 35808, 35809, 35804, 0, 32768, 34816, 35840, 35841, + 35843, 35776, 35808, 35809, 35804, 0, 32768, 34816, + 35840, 35841, 35843, 35776, 35808, 35809, 35804, 35806, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35808, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35808, 0, + 32768, 34816, 35840, 35841, 35843, 35776, 35808, 35810, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 35808, + 0, 32768, 34816, 35840, 35841, 35843, 35776, 35808, + 35812, 0, 32768, 34816, 35840, 35841, 35843, 35776, + 35808, 35812, 0, 32768, 34816, 35840, 35841, 35843, + 35776, 35808, 35816, 35814, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 35816, 0, 32768, 34816, + 35840, 35841, 35843, 35847, 35808, 35816, 0, 32768, + 34816, 35840, 35841, 35843, 35847, 35808, 35816, 35818, + 0, 32768, 34816, 35840, 35841, 35843, 35847, 35808, + 35816, 0, 32768, 34816, 35840, 35841, 35843, 35847, + 35808, 35824, 35820, 0, 32768, 34816, 35840, 35841, + 35843, 35847, 35808, 35824, 35820, 0, 32768, 34816, + 35840, 35841, 35843, 35847, 35808, 35824, 35825, 35822, + 0, 32768, 34816, 35840, 35841, 35843, 35847, 35808, + 0, 32768, 34816, 35840, 35841, 35843, 35847, 35808, + 35824, 0, 32768, 34816, 35840, 35841, 35843, 35847, + 35808, 35824, 0, 32768, 34816, 35840, 35841, 35843, + 35847, 35808, 35824, 35826, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 35824, 0, 32768, 34816, + 35840, 35841, 35843, 35847, 35808, 35824, 35828, 0, + 32768, 34816, 35840, 35841, 35843, 35847, 35808, 35824, + 35828, 0, 32768, 34816, 35840, 35841, 35843, 35847, + 35808, 35824, 35832, 35830, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 35824, 0, 32768, 34816, + 35840, 35841, 35843, 35847, 35808, 35824, 35832, 0, + 32768, 34816, 35840, 35841, 35843, 35847, 35808, 35824, + 35832, 0, 32768, 34816, 35840, 35841, 35843, 35847, + 35808, 35824, 35832, 35834, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 35824, 35832, 0, 32768, + 34816, 35840, 35841, 35843, 35847, 35808, 35824, 35832, + 35836, 0, 32768, 34816, 35840, 35841, 35843, 35847, + 35808, 35824, 35832, 35836, 0, 32768, 34816, 35840, + 35841, 35843, 35847, 35808, 35824, 35832, 35836, 35838, + 0, 32768, 34816, 0, 32768, 34816, 35840, 0, + 32768, 34816, 35840, 0, 32768, 34816, 35840, 35842, + 0, 32768, 34816, 35840, 0, 32768, 34816, 35840, + 35844, 0, 32768, 34816, 35840, 35844, 0, 32768, + 34816, 35840, 35848, 35846, 0, 32768, 34816, 35840, + 0, 32768, 34816, 35840, 35848, 0, 32768, 34816, + 35840, 35848, 0, 32768, 34816, 35840, 35848, 35850, + 0, 32768, 34816, 35840, 35848, 0, 32768, 34816, + 35840, 35856, 35852, 0, 32768, 34816, 35840, 35856, + 35852, 0, 32768, 34816, 35840, 35856, 35857, 35854, + 0, 32768, 34816, 35840, 0, 32768, 34816, 35840, + 35856, 0, 32768, 34816, 35840, 35856, 0, 32768, + 34816, 35840, 35856, 35858, 0, 32768, 34816, 35840, + 35856, 0, 32768, 34816, 35840, 35856, 35860, 0, + 32768, 34816, 35840, 35856, 35860, 0, 32768, 34816, + 35840, 35856, 35864, 35862, 0, 32768, 34816, 35840, + 35856, 0, 32768, 34816, 35840, 35872, 35864, 0, + 32768, 34816, 35840, 35872, 35864, 0, 32768, 34816, + 35840, 35872, 35864, 35866, 0, 32768, 34816, 35840, + 35872, 35864, 0, 32768, 34816, 35840, 35872, 35873, + 35868, 0, 32768, 34816, 35840, 35872, 35873, 35868, + 0, 32768, 34816, 35840, 35872, 35873, 35868, 35870, + 0, 32768, 34816, 35840, 0, 32768, 34816, 35840, + 35872, 0, 32768, 34816, 35840, 35872, 0, 32768, + 34816, 35840, 35872, 35874, 0, 32768, 34816, 35840, + 35872, 0, 32768, 34816, 35840, 35872, 35876, 0, + 32768, 34816, 35840, 35872, 35876, 0, 32768, 34816, + 35840, 35872, 35880, 35878, 0, 32768, 34816, 35840, + 35872, 0, 32768, 34816, 35840, 35872, 35880, 0, + 32768, 34816, 35840, 35872, 35880, 0, 32768, 34816, + 35840, 35872, 35880, 35882, 0, 32768, 34816, 35840, + 35872, 35880, 0, 32768, 34816, 35840, 35872, 35888, + 35884, 0, 32768, 34816, 35840, 35872, 35888, 35884, + 0, 32768, 34816, 35840, 35872, 35888, 35889, 35886, + 0, 32768, 34816, 35840, 35872, 0, 32768, 34816, + 35840, 35904, 35888, 0, 32768, 34816, 35840, 35904, + 35888, 0, 32768, 34816, 35840, 35904, 35888, 35890, + 0, 32768, 34816, 35840, 35904, 35888, 0, 32768, + 34816, 35840, 35904, 35888, 35892, 0, 32768, 34816, + 35840, 35904, 35888, 35892, 0, 32768, 34816, 35840, + 35904, 35888, 35896, 35894, 0, 32768, 34816, 35840, + 35904, 35888, 0, 32768, 34816, 35840, 35904, 35905, + 35896, 0, 32768, 34816, 35840, 35904, 35905, 35896, + 0, 32768, 34816, 35840, 35904, 35905, 35896, 35898, + 0, 32768, 34816, 35840, 35904, 35905, 35896, 0, + 32768, 34816, 35840, 35904, 35905, 35896, 35900, 0, + 32768, 34816, 35840, 35904, 35905, 35907, 35900, 0, + 32768, 34816, 35840, 35904, 35905, 35907, 35900, 35902, + 0, 32768, 34816, 35840, 0, 32768, 34816, 35840, + 35904, 0, 32768, 34816, 35840, 35904, 0, 32768, + 34816, 35840, 35904, 35906, 0, 32768, 34816, 35840, + 35904, 0, 32768, 34816, 35840, 35904, 35908, 0, + 32768, 34816, 35840, 35904, 35908, 0, 32768, 34816, + 35840, 35904, 35912, 35910, 0, 32768, 34816, 35840, + 35904, 0, 32768, 34816, 35840, 35904, 35912, 0, + 32768, 34816, 35840, 35904, 35912, 0, 32768, 34816, + 35840, 35904, 35912, 35914, 0, 32768, 34816, 35840, + 35904, 35912, 0, 32768, 34816, 35840, 35904, 35920, + 35916, 0, 32768, 34816, 35840, 35904, 35920, 35916, + 0, 32768, 34816, 35840, 35904, 35920, 35921, 35918, + 0, 32768, 34816, 35840, 35904, 0, 32768, 34816, + 35840, 35904, 35920, 0, 32768, 34816, 35840, 35904, + 35920, 0, 32768, 34816, 35840, 35904, 35920, 35922, + 0, 32768, 34816, 35840, 35904, 35920, 0, 32768, + 34816, 35840, 35904, 35920, 35924, 0, 32768, 34816, + 35840, 35904, 35920, 35924, 0, 32768, 34816, 35840, + 35904, 35920, 35928, 35926, 0, 32768, 34816, 35840, + 35904, 35920, 0, 32768, 34816, 35840, 35904, 35936, + 35928, 0, 32768, 34816, 35840, 35904, 35936, 35928, + 0, 32768, 34816, 35840, 35904, 35936, 35928, 35930, + 0, 32768, 34816, 35840, 35904, 35936, 35928, 0, + 32768, 34816, 35840, 35904, 35936, 35937, 35932, 0, + 32768, 34816, 35840, 35904, 35936, 35937, 35932, 0, + 32768, 34816, 35840, 35904, 35936, 35937, 35932, 35934, + 0, 32768, 34816, 35840, 35904, 0, 32768, 34816, + 35840, 35968, 35936, 0, 32768, 34816, 35840, 35968, + 35936, 0, 32768, 34816, 35840, 35968, 35936, 35938, + 0, 32768, 34816, 35840, 35968, 35936, 0, 32768, + 34816, 35840, 35968, 35936, 35940, 0, 32768, 34816, + 35840, 35968, 35936, 35940, 0, 32768, 34816, 35840, + 35968, 35936, 35944, 35942, 0, 32768, 34816, 35840, + 35968, 35936, 0, 32768, 34816, 35840, 35968, 35936, + 35944, 0, 32768, 34816, 35840, 35968, 35936, 35944, + 0, 32768, 34816, 35840, 35968, 35936, 35944, 35946, + 0, 32768, 34816, 35840, 35968, 35936, 35944, 0, + 32768, 34816, 35840, 35968, 35936, 35952, 35948, 0, + 32768, 34816, 35840, 35968, 35936, 35952, 35948, 0, + 32768, 34816, 35840, 35968, 35936, 35952, 35953, 35950, + 0, 32768, 34816, 35840, 35968, 35936, 0, 32768, + 34816, 35840, 35968, 35969, 35952, 0, 32768, 34816, + 35840, 35968, 35969, 35952, 0, 32768, 34816, 35840, + 35968, 35969, 35952, 35954, 0, 32768, 34816, 35840, + 35968, 35969, 35952, 0, 32768, 34816, 35840, 35968, + 35969, 35952, 35956, 0, 32768, 34816, 35840, 35968, + 35969, 35952, 35956, 0, 32768, 34816, 35840, 35968, + 35969, 35952, 35960, 35958, 0, 32768, 34816, 35840, + 35968, 35969, 35952, 0, 32768, 34816, 35840, 35968, + 35969, 35952, 35960, 0, 32768, 34816, 35840, 35968, + 35969, 35971, 35960, 0, 32768, 34816, 35840, 35968, + 35969, 35971, 35960, 35962, 0, 32768, 34816, 35840, + 35968, 35969, 35971, 35960, 0, 32768, 34816, 35840, + 35968, 35969, 35971, 35960, 35964, 0, 32768, 34816, + 35840, 35968, 35969, 35971, 35960, 35964, 0, 32768, + 34816, 35840, 35968, 35969, 35971, 35960, 35964, 35966, + 0, 32768, 34816, 35840, 0, 32768, 34816, 35840, + 35968, 0, 32768, 34816, 35840, 35968, 0, 32768, + 34816, 35840, 35968, 35970, 0, 32768, 34816, 35840, + 35968, 0, 32768, 34816, 35840, 35968, 35972, 0, + 32768, 34816, 35840, 35968, 35972, 0, 32768, 34816, + 35840, 35968, 35976, 35974, 0, 32768, 34816, 35840, + 35968, 0, 32768, 34816, 35840, 35968, 35976, 0, + 32768, 34816, 35840, 35968, 35976, 0, 32768, 34816, + 35840, 35968, 35976, 35978, 0, 32768, 34816, 35840, + 35968, 35976, 0, 32768, 34816, 35840, 35968, 35984, + 35980, 0, 32768, 34816, 35840, 35968, 35984, 35980, + 0, 32768, 34816, 35840, 35968, 35984, 35985, 35982, + 0, 32768, 34816, 35840, 35968, 0, 32768, 34816, + 35840, 35968, 35984, 0, 32768, 34816, 35840, 35968, + 35984, 0, 32768, 34816, 35840, 35968, 35984, 35986, + 0, 32768, 34816, 35840, 35968, 35984, 0, 32768, + 34816, 35840, 35968, 35984, 35988, 0, 32768, 34816, + 35840, 35968, 35984, 35988, 0, 32768, 34816, 35840, + 35968, 35984, 35992, 35990, 0, 32768, 34816, 35840, + 35968, 35984, 0, 32768, 34816, 35840, 35968, 36000, + 35992, 0, 32768, 34816, 35840, 35968, 36000, 35992, + 0, 32768, 34816, 35840, 35968, 36000, 35992, 35994, + 0, 32768, 34816, 35840, 35968, 36000, 35992, 0, + 32768, 34816, 35840, 35968, 36000, 36001, 35996, 0, + 32768, 34816, 35840, 35968, 36000, 36001, 35996, 0, + 32768, 34816, 35840, 35968, 36000, 36001, 35996, 35998, + 0, 32768, 34816, 35840, 35968, 0, 32768, 34816, + 35840, 35968, 36000, 0, 32768, 34816, 35840, 35968, + 36000, 0, 32768, 34816, 35840, 35968, 36000, 36002, + 0, 32768, 34816, 35840, 35968, 36000, 0, 32768, + 34816, 35840, 35968, 36000, 36004, 0, 32768, 34816, + 35840, 35968, 36000, 36004, 0, 32768, 34816, 35840, + 35968, 36000, 36008, 36006, 0, 32768, 34816, 35840, + 35968, 36000, 0, 32768, 34816, 35840, 35968, 36000, + 36008, 0, 32768, 34816, 35840, 35968, 36000, 36008, + 0, 32768, 34816, 35840, 35968, 36000, 36008, 36010, + 0, 32768, 34816, 35840, 35968, 36000, 36008, 0, + 32768, 34816, 35840, 35968, 36000, 36016, 36012, 0, + 32768, 34816, 35840, 35968, 36000, 36016, 36012, 0, + 32768, 34816, 35840, 35968, 36000, 36016, 36017, 36014, + 0, 32768, 34816, 35840, 35968, 36000, 0, 32768, + 34816, 35840, 35968, 36032, 36016, 0, 32768, 34816, + 35840, 35968, 36032, 36016, 0, 32768, 34816, 35840, + 35968, 36032, 36016, 36018, 0, 32768, 34816, 35840, + 35968, 36032, 36016, 0, 32768, 34816, 35840, 35968, + 36032, 36016, 36020, 0, 32768, 34816, 35840, 35968, + 36032, 36016, 36020, 0, 32768, 34816, 35840, 35968, + 36032, 36016, 36024, 36022, 0, 32768, 34816, 35840, + 35968, 36032, 36016, 0, 32768, 34816, 35840, 35968, + 36032, 36033, 36024, 0, 32768, 34816, 35840, 35968, + 36032, 36033, 36024, 0, 32768, 34816, 35840, 35968, + 36032, 36033, 36024, 36026, 0, 32768, 34816, 35840, + 35968, 36032, 36033, 36024, 0, 32768, 34816, 35840, + 35968, 36032, 36033, 36024, 36028, 0, 32768, 34816, + 35840, 35968, 36032, 36033, 36035, 36028, 0, 32768, + 34816, 35840, 35968, 36032, 36033, 36035, 36028, 36030, + 0, 32768, 34816, 35840, 35968, 0, 32768, 34816, + 35840, 36096, 36032, 0, 32768, 34816, 35840, 36096, + 36032, 0, 32768, 34816, 35840, 36096, 36032, 36034, + 0, 32768, 34816, 35840, 36096, 36032, 0, 32768, + 34816, 35840, 36096, 36032, 36036, 0, 32768, 34816, + 35840, 36096, 36032, 36036, 0, 32768, 34816, 35840, + 36096, 36032, 36040, 36038, 0, 32768, 34816, 35840, + 36096, 36032, 0, 32768, 34816, 35840, 36096, 36032, + 36040, 0, 32768, 34816, 35840, 36096, 36032, 36040, + 0, 32768, 34816, 35840, 36096, 36032, 36040, 36042, + 0, 32768, 34816, 35840, 36096, 36032, 36040, 0, + 32768, 34816, 35840, 36096, 36032, 36048, 36044, 0, + 32768, 34816, 35840, 36096, 36032, 36048, 36044, 0, + 32768, 34816, 35840, 36096, 36032, 36048, 36049, 36046, + 0, 32768, 34816, 35840, 36096, 36032, 0, 32768, + 34816, 35840, 36096, 36032, 36048, 0, 32768, 34816, + 35840, 36096, 36032, 36048, 0, 32768, 34816, 35840, + 36096, 36032, 36048, 36050, 0, 32768, 34816, 35840, + 36096, 36032, 36048, 0, 32768, 34816, 35840, 36096, + 36032, 36048, 36052, 0, 32768, 34816, 35840, 36096, + 36032, 36048, 36052, 0, 32768, 34816, 35840, 36096, + 36032, 36048, 36056, 36054, 0, 32768, 34816, 35840, + 36096, 36032, 36048, 0, 32768, 34816, 35840, 36096, + 36032, 36064, 36056, 0, 32768, 34816, 35840, 36096, + 36032, 36064, 36056, 0, 32768, 34816, 35840, 36096, + 36032, 36064, 36056, 36058, 0, 32768, 34816, 35840, + 36096, 36032, 36064, 36056, 0, 32768, 34816, 35840, + 36096, 36032, 36064, 36065, 36060, 0, 32768, 34816, + 35840, 36096, 36032, 36064, 36065, 36060, 0, 32768, + 34816, 35840, 36096, 36032, 36064, 36065, 36060, 36062, + 0, 32768, 34816, 35840, 36096, 36032, 0, 32768, + 34816, 35840, 36096, 36097, 36064, 0, 32768, 34816, + 35840, 36096, 36097, 36064, 0, 32768, 34816, 35840, + 36096, 36097, 36064, 36066, 0, 32768, 34816, 35840, + 36096, 36097, 36064, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36068, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36068, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36072, 36070, 0, 32768, 34816, 35840, + 36096, 36097, 36064, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36072, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36072, 0, 32768, 34816, 35840, 36096, + 36097, 36064, 36072, 36074, 0, 32768, 34816, 35840, + 36096, 36097, 36064, 36072, 0, 32768, 34816, 35840, + 36096, 36097, 36064, 36080, 36076, 0, 32768, 34816, + 35840, 36096, 36097, 36064, 36080, 36076, 0, 32768, + 34816, 35840, 36096, 36097, 36064, 36080, 36081, 36078, + 0, 32768, 34816, 35840, 36096, 36097, 36064, 0, + 32768, 34816, 35840, 36096, 36097, 36064, 36080, 0, + 32768, 34816, 35840, 36096, 36097, 36099, 36080, 0, + 32768, 34816, 35840, 36096, 36097, 36099, 36080, 36082, + 0, 32768, 34816, 35840, 36096, 36097, 36099, 36080, + 0, 32768, 34816, 35840, 36096, 36097, 36099, 36080, + 36084, 0, 32768, 34816, 35840, 36096, 36097, 36099, + 36080, 36084, 0, 32768, 34816, 35840, 36096, 36097, + 36099, 36080, 36088, 36086, 0, 32768, 34816, 35840, + 36096, 36097, 36099, 36080, 0, 32768, 34816, 35840, + 36096, 36097, 36099, 36080, 36088, 0, 32768, 34816, + 35840, 36096, 36097, 36099, 36080, 36088, 0, 32768, + 34816, 35840, 36096, 36097, 36099, 36080, 36088, 36090, + 0, 32768, 34816, 35840, 36096, 36097, 36099, 36103, + 36088, 0, 32768, 34816, 35840, 36096, 36097, 36099, + 36103, 36088, 36092, 0, 32768, 34816, 35840, 36096, + 36097, 36099, 36103, 36088, 36092, 0, 32768, 34816, + 35840, 36096, 36097, 36099, 36103, 36088, 36092, 36094, + 0, 32768, 34816, 35840, 0, 32768, 36864, 35840, + 36096, 0, 32768, 36864, 35840, 36096, 0, 32768, + 36864, 35840, 36096, 36098, 0, 32768, 36864, 35840, + 36096, 0, 32768, 36864, 35840, 36096, 36100, 0, + 32768, 36864, 35840, 36096, 36100, 0, 32768, 36864, + 35840, 36096, 36104, 36102, 0, 32768, 36864, 35840, + 36096, 0, 32768, 36864, 35840, 36096, 36104, 0, + 32768, 36864, 35840, 36096, 36104, 0, 32768, 36864, + 35840, 36096, 36104, 36106, 0, 32768, 36864, 35840, + 36096, 36104, 0, 32768, 36864, 35840, 36096, 36112, + 36108, 0, 32768, 36864, 35840, 36096, 36112, 36108, + 0, 32768, 36864, 35840, 36096, 36112, 36113, 36110, + 0, 32768, 36864, 35840, 36096, 0, 32768, 36864, + 35840, 36096, 36112, 0, 32768, 36864, 35840, 36096, + 36112, 0, 32768, 36864, 35840, 36096, 36112, 36114, + 0, 32768, 36864, 35840, 36096, 36112, 0, 32768, + 36864, 35840, 36096, 36112, 36116, 0, 32768, 36864, + 35840, 36096, 36112, 36116, 0, 32768, 36864, 35840, + 36096, 36112, 36120, 36118, 0, 32768, 36864, 35840, + 36096, 36112, 0, 32768, 36864, 35840, 36096, 36128, + 36120, 0, 32768, 36864, 35840, 36096, 36128, 36120, + 0, 32768, 36864, 35840, 36096, 36128, 36120, 36122, + 0, 32768, 36864, 35840, 36096, 36128, 36120, 0, + 32768, 36864, 35840, 36096, 36128, 36129, 36124, 0, + 32768, 36864, 35840, 36096, 36128, 36129, 36124, 0, + 32768, 36864, 35840, 36096, 36128, 36129, 36124, 36126, + 0, 32768, 36864, 35840, 36096, 0, 32768, 36864, + 35840, 36096, 36128, 0, 32768, 36864, 35840, 36096, + 36128, 0, 32768, 36864, 35840, 36096, 36128, 36130, + 0, 32768, 36864, 35840, 36096, 36128, 0, 32768, + 36864, 35840, 36096, 36128, 36132, 0, 32768, 36864, + 35840, 36096, 36128, 36132, 0, 32768, 36864, 35840, + 36096, 36128, 36136, 36134, 0, 32768, 36864, 35840, + 36096, 36128, 0, 32768, 36864, 35840, 36096, 36128, + 36136, 0, 32768, 36864, 35840, 36096, 36128, 36136, + 0, 32768, 36864, 35840, 36096, 36128, 36136, 36138, + 0, 32768, 36864, 35840, 36096, 36128, 36136, 0, + 32768, 36864, 35840, 36096, 36128, 36144, 36140, 0, + 32768, 36864, 35840, 36096, 36128, 36144, 36140, 0, + 32768, 36864, 35840, 36096, 36128, 36144, 36145, 36142, + 0, 32768, 36864, 35840, 36096, 36128, 0, 32768, + 36864, 35840, 36096, 36160, 36144, 0, 32768, 36864, + 35840, 36096, 36160, 36144, 0, 32768, 36864, 35840, + 36096, 36160, 36144, 36146, 0, 32768, 36864, 35840, + 36096, 36160, 36144, 0, 32768, 36864, 35840, 36096, + 36160, 36144, 36148, 0, 32768, 36864, 35840, 36096, + 36160, 36144, 36148, 0, 32768, 36864, 35840, 36096, + 36160, 36144, 36152, 36150, 0, 32768, 36864, 35840, + 36096, 36160, 36144, 0, 32768, 36864, 35840, 36096, + 36160, 36161, 36152, 0, 32768, 36864, 35840, 36096, + 36160, 36161, 36152, 0, 32768, 36864, 35840, 36096, + 36160, 36161, 36152, 36154, 0, 32768, 36864, 35840, + 36096, 36160, 36161, 36152, 0, 32768, 36864, 35840, + 36096, 36160, 36161, 36152, 36156, 0, 32768, 36864, + 35840, 36096, 36160, 36161, 36163, 36156, 0, 32768, + 36864, 35840, 36096, 36160, 36161, 36163, 36156, 36158, + 0, 32768, 36864, 35840, 36096, 0, 32768, 36864, + 35840, 36096, 36160, 0, 32768, 36864, 35840, 36096, + 36160, 0, 32768, 36864, 35840, 36096, 36160, 36162, + 0, 32768, 36864, 35840, 36096, 36160, 0, 32768, + 36864, 35840, 36096, 36160, 36164, 0, 32768, 36864, + 35840, 36096, 36160, 36164, 0, 32768, 36864, 35840, + 36096, 36160, 36168, 36166, 0, 32768, 36864, 35840, + 36096, 36160, 0, 32768, 36864, 35840, 36096, 36160, + 36168, 0, 32768, 36864, 35840, 36096, 36160, 36168, + 0, 32768, 36864, 35840, 36096, 36160, 36168, 36170, + 0, 32768, 36864, 35840, 36096, 36160, 36168, 0, + 32768, 36864, 35840, 36096, 36160, 36176, 36172, 0, + 32768, 36864, 35840, 36096, 36160, 36176, 36172, 0, + 32768, 36864, 35840, 36096, 36160, 36176, 36177, 36174, + 0, 32768, 36864, 35840, 36096, 36160, 0, 32768, + 36864, 35840, 36096, 36160, 36176, 0, 32768, 36864, + 35840, 36096, 36160, 36176, 0, 32768, 36864, 35840, + 36096, 36160, 36176, 36178, 0, 32768, 36864, 35840, + 36096, 36160, 36176, 0, 32768, 36864, 35840, 36096, + 36160, 36176, 36180, 0, 32768, 36864, 35840, 36096, + 36160, 36176, 36180, 0, 32768, 36864, 35840, 36096, + 36160, 36176, 36184, 36182, 0, 32768, 36864, 35840, + 36096, 36160, 36176, 0, 32768, 36864, 35840, 36096, + 36160, 36192, 36184, 0, 32768, 36864, 35840, 36096, + 36160, 36192, 36184, 0, 32768, 36864, 35840, 36096, + 36160, 36192, 36184, 36186, 0, 32768, 36864, 35840, + 36096, 36160, 36192, 36184, 0, 32768, 36864, 35840, + 36096, 36160, 36192, 36193, 36188, 0, 32768, 36864, + 35840, 36096, 36160, 36192, 36193, 36188, 0, 32768, + 36864, 35840, 36096, 36160, 36192, 36193, 36188, 36190, + 0, 32768, 36864, 35840, 36096, 36160, 0, 32768, + 36864, 35840, 36096, 36224, 36192, 0, 32768, 36864, + 35840, 36096, 36224, 36192, 0, 32768, 36864, 35840, + 36096, 36224, 36192, 36194, 0, 32768, 36864, 35840, + 36096, 36224, 36192, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36196, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36196, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36200, 36198, 0, 32768, 36864, 35840, + 36096, 36224, 36192, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36200, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36200, 0, 32768, 36864, 35840, 36096, + 36224, 36192, 36200, 36202, 0, 32768, 36864, 35840, + 36096, 36224, 36192, 36200, 0, 32768, 36864, 35840, + 36096, 36224, 36192, 36208, 36204, 0, 32768, 36864, + 35840, 36096, 36224, 36192, 36208, 36204, 0, 32768, + 36864, 35840, 36096, 36224, 36192, 36208, 36209, 36206, + 0, 32768, 36864, 35840, 36096, 36224, 36192, 0, + 32768, 36864, 35840, 36096, 36224, 36225, 36208, 0, + 32768, 36864, 35840, 36096, 36224, 36225, 36208, 0, + 32768, 36864, 35840, 36096, 36224, 36225, 36208, 36210, + 0, 32768, 36864, 35840, 36096, 36224, 36225, 36208, + 0, 32768, 36864, 35840, 36096, 36224, 36225, 36208, + 36212, 0, 32768, 36864, 35840, 36096, 36224, 36225, + 36208, 36212, 0, 32768, 36864, 35840, 36096, 36224, + 36225, 36208, 36216, 36214, 0, 32768, 36864, 35840, + 36096, 36224, 36225, 36208, 0, 32768, 36864, 35840, + 36096, 36224, 36225, 36208, 36216, 0, 32768, 36864, + 35840, 36096, 36224, 36225, 36227, 36216, 0, 32768, + 36864, 35840, 36096, 36224, 36225, 36227, 36216, 36218, + 0, 32768, 36864, 35840, 36096, 36224, 36225, 36227, + 36216, 0, 32768, 36864, 35840, 36096, 36224, 36225, + 36227, 36216, 36220, 0, 32768, 36864, 35840, 36096, + 36224, 36225, 36227, 36216, 36220, 0, 32768, 36864, + 35840, 36096, 36224, 36225, 36227, 36216, 36220, 36222, + 0, 32768, 36864, 35840, 36096, 0, 32768, 36864, + 35840, 36352, 36224, 0, 32768, 36864, 35840, 36352, + 36224, 0, 32768, 36864, 35840, 36352, 36224, 36226, + 0, 32768, 36864, 35840, 36352, 36224, 0, 32768, + 36864, 35840, 36352, 36224, 36228, 0, 32768, 36864, + 35840, 36352, 36224, 36228, 0, 32768, 36864, 35840, + 36352, 36224, 36232, 36230, 0, 32768, 36864, 35840, + 36352, 36224, 0, 32768, 36864, 35840, 36352, 36224, + 36232, 0, 32768, 36864, 35840, 36352, 36224, 36232, + 0, 32768, 36864, 35840, 36352, 36224, 36232, 36234, + 0, 32768, 36864, 35840, 36352, 36224, 36232, 0, + 32768, 36864, 35840, 36352, 36224, 36240, 36236, 0, + 32768, 36864, 35840, 36352, 36224, 36240, 36236, 0, + 32768, 36864, 35840, 36352, 36224, 36240, 36241, 36238, + 0, 32768, 36864, 35840, 36352, 36224, 0, 32768, + 36864, 35840, 36352, 36224, 36240, 0, 32768, 36864, + 35840, 36352, 36224, 36240, 0, 32768, 36864, 35840, + 36352, 36224, 36240, 36242, 0, 32768, 36864, 35840, + 36352, 36224, 36240, 0, 32768, 36864, 35840, 36352, + 36224, 36240, 36244, 0, 32768, 36864, 35840, 36352, + 36224, 36240, 36244, 0, 32768, 36864, 35840, 36352, + 36224, 36240, 36248, 36246, 0, 32768, 36864, 35840, + 36352, 36224, 36240, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36248, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36248, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36248, 36250, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 36248, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 36257, 36252, 0, 32768, 36864, + 35840, 36352, 36224, 36256, 36257, 36252, 0, 32768, + 36864, 35840, 36352, 36224, 36256, 36257, 36252, 36254, + 0, 32768, 36864, 35840, 36352, 36224, 0, 32768, + 36864, 35840, 36352, 36224, 36256, 0, 32768, 36864, + 35840, 36352, 36224, 36256, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 36258, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36260, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36260, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36264, 36262, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36264, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36264, 0, 32768, 36864, 35840, 36352, + 36224, 36256, 36264, 36266, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 36264, 0, 32768, 36864, 35840, + 36352, 36224, 36256, 36272, 36268, 0, 32768, 36864, + 35840, 36352, 36224, 36256, 36272, 36268, 0, 32768, + 36864, 35840, 36352, 36224, 36256, 36272, 36273, 36270, + 0, 32768, 36864, 35840, 36352, 36224, 36256, 0, + 32768, 36864, 35840, 36352, 36224, 36288, 36272, 0, + 32768, 36864, 35840, 36352, 36224, 36288, 36272, 0, + 32768, 36864, 35840, 36352, 36224, 36288, 36272, 36274, + 0, 32768, 36864, 35840, 36352, 36224, 36288, 36272, + 0, 32768, 36864, 35840, 36352, 36224, 36288, 36272, + 36276, 0, 32768, 36864, 35840, 36352, 36224, 36288, + 36272, 36276, 0, 32768, 36864, 35840, 36352, 36224, + 36288, 36272, 36280, 36278, 0, 32768, 36864, 35840, + 36352, 36224, 36288, 36272, 0, 32768, 36864, 35840, + 36352, 36224, 36288, 36289, 36280, 0, 32768, 36864, + 35840, 36352, 36224, 36288, 36289, 36280, 0, 32768, + 36864, 35840, 36352, 36224, 36288, 36289, 36280, 36282, + 0, 32768, 36864, 35840, 36352, 36224, 36288, 36289, + 36280, 0, 32768, 36864, 35840, 36352, 36224, 36288, + 36289, 36280, 36284, 0, 32768, 36864, 35840, 36352, + 36224, 36288, 36289, 36291, 36284, 0, 32768, 36864, + 35840, 36352, 36224, 36288, 36289, 36291, 36284, 36286, + 0, 32768, 36864, 35840, 36352, 36224, 0, 32768, + 36864, 35840, 36352, 36353, 36288, 0, 32768, 36864, + 35840, 36352, 36353, 36288, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 36290, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36292, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36292, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36296, 36294, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36296, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36296, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36296, 36298, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 36296, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 36304, 36300, 0, 32768, 36864, + 35840, 36352, 36353, 36288, 36304, 36300, 0, 32768, + 36864, 35840, 36352, 36353, 36288, 36304, 36305, 36302, + 0, 32768, 36864, 35840, 36352, 36353, 36288, 0, + 32768, 36864, 35840, 36352, 36353, 36288, 36304, 0, + 32768, 36864, 35840, 36352, 36353, 36288, 36304, 0, + 32768, 36864, 35840, 36352, 36353, 36288, 36304, 36306, + 0, 32768, 36864, 35840, 36352, 36353, 36288, 36304, + 0, 32768, 36864, 35840, 36352, 36353, 36288, 36304, + 36308, 0, 32768, 36864, 35840, 36352, 36353, 36288, + 36304, 36308, 0, 32768, 36864, 35840, 36352, 36353, + 36288, 36304, 36312, 36310, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 36304, 0, 32768, 36864, 35840, + 36352, 36353, 36288, 36320, 36312, 0, 32768, 36864, + 35840, 36352, 36353, 36288, 36320, 36312, 0, 32768, + 36864, 35840, 36352, 36353, 36288, 36320, 36312, 36314, + 0, 32768, 36864, 35840, 36352, 36353, 36288, 36320, + 36312, 0, 32768, 36864, 35840, 36352, 36353, 36288, + 36320, 36321, 36316, 0, 32768, 36864, 35840, 36352, + 36353, 36288, 36320, 36321, 36316, 0, 32768, 36864, + 35840, 36352, 36353, 36288, 36320, 36321, 36316, 36318, + 0, 32768, 36864, 35840, 36352, 36353, 36288, 0, + 32768, 36864, 35840, 36352, 36353, 36288, 36320, 0, + 32768, 36864, 35840, 36352, 36353, 36355, 36320, 0, + 32768, 36864, 35840, 36352, 36353, 36355, 36320, 36322, + 0, 32768, 36864, 35840, 36352, 36353, 36355, 36320, + 0, 32768, 36864, 35840, 36352, 36353, 36355, 36320, + 36324, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36320, 36324, 0, 32768, 36864, 35840, 36352, 36353, + 36355, 36320, 36328, 36326, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36320, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36320, 36328, 0, 32768, 36864, + 35840, 36352, 36353, 36355, 36320, 36328, 0, 32768, + 36864, 35840, 36352, 36353, 36355, 36320, 36328, 36330, + 0, 32768, 36864, 35840, 36352, 36353, 36355, 36320, + 36328, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36320, 36336, 36332, 0, 32768, 36864, 35840, 36352, + 36353, 36355, 36320, 36336, 36332, 0, 32768, 36864, + 35840, 36352, 36353, 36355, 36320, 36336, 36337, 36334, + 0, 32768, 36864, 35840, 36352, 36353, 36355, 36320, + 0, 32768, 36864, 35840, 36352, 36353, 36355, 36320, + 36336, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36320, 36336, 0, 32768, 36864, 35840, 36352, 36353, + 36355, 36320, 36336, 36338, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36359, 36336, 0, 32768, 36864, + 35840, 36352, 36353, 36355, 36359, 36336, 36340, 0, + 32768, 36864, 35840, 36352, 36353, 36355, 36359, 36336, + 36340, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36359, 36336, 36344, 36342, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36359, 36336, 0, 32768, 36864, + 35840, 36352, 36353, 36355, 36359, 36336, 36344, 0, + 32768, 36864, 35840, 36352, 36353, 36355, 36359, 36336, + 36344, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36359, 36336, 36344, 36346, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36359, 36336, 36344, 0, 32768, + 36864, 35840, 36352, 36353, 36355, 36359, 36336, 36344, + 36348, 0, 32768, 36864, 35840, 36352, 36353, 36355, + 36359, 36336, 36344, 36348, 0, 32768, 36864, 35840, + 36352, 36353, 36355, 36359, 36336, 36344, 36348, 36350, + 0, 32768, 36864, 35840, 0, 32768, 36864, 35840, + 36352, 0, 32768, 36864, 36865, 36352, 0, 32768, + 36864, 36865, 36352, 36354, 0, 32768, 36864, 36865, + 36352, 0, 32768, 36864, 36865, 36352, 36356, 0, + 32768, 36864, 36865, 36352, 36356, 0, 32768, 36864, + 36865, 36352, 36360, 36358, 0, 32768, 36864, 36865, + 36352, 0, 32768, 36864, 36865, 36352, 36360, 0, + 32768, 36864, 36865, 36352, 36360, 0, 32768, 36864, + 36865, 36352, 36360, 36362, 0, 32768, 36864, 36865, + 36352, 36360, 0, 32768, 36864, 36865, 36352, 36368, + 36364, 0, 32768, 36864, 36865, 36352, 36368, 36364, + 0, 32768, 36864, 36865, 36352, 36368, 36369, 36366, + 0, 32768, 36864, 36865, 36352, 0, 32768, 36864, + 36865, 36352, 36368, 0, 32768, 36864, 36865, 36352, + 36368, 0, 32768, 36864, 36865, 36352, 36368, 36370, + 0, 32768, 36864, 36865, 36352, 36368, 0, 32768, + 36864, 36865, 36352, 36368, 36372, 0, 32768, 36864, + 36865, 36352, 36368, 36372, 0, 32768, 36864, 36865, + 36352, 36368, 36376, 36374, 0, 32768, 36864, 36865, + 36352, 36368, 0, 32768, 36864, 36865, 36352, 36384, + 36376, 0, 32768, 36864, 36865, 36352, 36384, 36376, + 0, 32768, 36864, 36865, 36352, 36384, 36376, 36378, + 0, 32768, 36864, 36865, 36352, 36384, 36376, 0, + 32768, 36864, 36865, 36352, 36384, 36385, 36380, 0, + 32768, 36864, 36865, 36352, 36384, 36385, 36380, 0, + 32768, 36864, 36865, 36352, 36384, 36385, 36380, 36382, + 0, 32768, 36864, 36865, 36352, 0, 32768, 36864, + 36865, 36352, 36384, 0, 32768, 36864, 36865, 36352, + 36384, 0, 32768, 36864, 36865, 36352, 36384, 36386, + 0, 32768, 36864, 36865, 36352, 36384, 0, 32768, + 36864, 36865, 36352, 36384, 36388, 0, 32768, 36864, + 36865, 36352, 36384, 36388, 0, 32768, 36864, 36865, + 36352, 36384, 36392, 36390, 0, 32768, 36864, 36865, + 36352, 36384, 0, 32768, 36864, 36865, 36352, 36384, + 36392, 0, 32768, 36864, 36865, 36352, 36384, 36392, + 0, 32768, 36864, 36865, 36352, 36384, 36392, 36394, + 0, 32768, 36864, 36865, 36352, 36384, 36392, 0, + 32768, 36864, 36865, 36352, 36384, 36400, 36396, 0, + 32768, 36864, 36865, 36352, 36384, 36400, 36396, 0, + 32768, 36864, 36865, 36352, 36384, 36400, 36401, 36398, + 0, 32768, 36864, 36865, 36352, 36384, 0, 32768, + 36864, 36865, 36352, 36416, 36400, 0, 32768, 36864, + 36865, 36352, 36416, 36400, 0, 32768, 36864, 36865, + 36352, 36416, 36400, 36402, 0, 32768, 36864, 36865, + 36352, 36416, 36400, 0, 32768, 36864, 36865, 36352, + 36416, 36400, 36404, 0, 32768, 36864, 36865, 36352, + 36416, 36400, 36404, 0, 32768, 36864, 36865, 36352, + 36416, 36400, 36408, 36406, 0, 32768, 36864, 36865, + 36352, 36416, 36400, 0, 32768, 36864, 36865, 36352, + 36416, 36417, 36408, 0, 32768, 36864, 36865, 36352, + 36416, 36417, 36408, 0, 32768, 36864, 36865, 36352, + 36416, 36417, 36408, 36410, 0, 32768, 36864, 36865, + 36352, 36416, 36417, 36408, 0, 32768, 36864, 36865, + 36352, 36416, 36417, 36408, 36412, 0, 32768, 36864, + 36865, 36352, 36416, 36417, 36419, 36412, 0, 32768, + 36864, 36865, 36352, 36416, 36417, 36419, 36412, 36414, + 0, 32768, 36864, 36865, 36352, 0, 32768, 36864, + 36865, 36352, 36416, 0, 32768, 36864, 36865, 36352, + 36416, 0, 32768, 36864, 36865, 36352, 36416, 36418, + 0, 32768, 36864, 36865, 36352, 36416, 0, 32768, + 36864, 36865, 36352, 36416, 36420, 0, 32768, 36864, + 36865, 36352, 36416, 36420, 0, 32768, 36864, 36865, + 36352, 36416, 36424, 36422, 0, 32768, 36864, 36865, + 36352, 36416, 0, 32768, 36864, 36865, 36352, 36416, + 36424, 0, 32768, 36864, 36865, 36352, 36416, 36424, + 0, 32768, 36864, 36865, 36352, 36416, 36424, 36426, + 0, 32768, 36864, 36865, 36352, 36416, 36424, 0, + 32768, 36864, 36865, 36352, 36416, 36432, 36428, 0, + 32768, 36864, 36865, 36352, 36416, 36432, 36428, 0, + 32768, 36864, 36865, 36352, 36416, 36432, 36433, 36430, + 0, 32768, 36864, 36865, 36352, 36416, 0, 32768, + 36864, 36865, 36352, 36416, 36432, 0, 32768, 36864, + 36865, 36352, 36416, 36432, 0, 32768, 36864, 36865, + 36352, 36416, 36432, 36434, 0, 32768, 36864, 36865, + 36352, 36416, 36432, 0, 32768, 36864, 36865, 36352, + 36416, 36432, 36436, 0, 32768, 36864, 36865, 36352, + 36416, 36432, 36436, 0, 32768, 36864, 36865, 36352, + 36416, 36432, 36440, 36438, 0, 32768, 36864, 36865, + 36352, 36416, 36432, 0, 32768, 36864, 36865, 36352, + 36416, 36448, 36440, 0, 32768, 36864, 36865, 36352, + 36416, 36448, 36440, 0, 32768, 36864, 36865, 36352, + 36416, 36448, 36440, 36442, 0, 32768, 36864, 36865, + 36352, 36416, 36448, 36440, 0, 32768, 36864, 36865, + 36352, 36416, 36448, 36449, 36444, 0, 32768, 36864, + 36865, 36352, 36416, 36448, 36449, 36444, 0, 32768, + 36864, 36865, 36352, 36416, 36448, 36449, 36444, 36446, + 0, 32768, 36864, 36865, 36352, 36416, 0, 32768, + 36864, 36865, 36352, 36480, 36448, 0, 32768, 36864, + 36865, 36352, 36480, 36448, 0, 32768, 36864, 36865, + 36352, 36480, 36448, 36450, 0, 32768, 36864, 36865, + 36352, 36480, 36448, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36452, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36452, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36456, 36454, 0, 32768, 36864, 36865, + 36352, 36480, 36448, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36456, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36456, 0, 32768, 36864, 36865, 36352, + 36480, 36448, 36456, 36458, 0, 32768, 36864, 36865, + 36352, 36480, 36448, 36456, 0, 32768, 36864, 36865, + 36352, 36480, 36448, 36464, 36460, 0, 32768, 36864, + 36865, 36352, 36480, 36448, 36464, 36460, 0, 32768, + 36864, 36865, 36352, 36480, 36448, 36464, 36465, 36462, + 0, 32768, 36864, 36865, 36352, 36480, 36448, 0, + 32768, 36864, 36865, 36352, 36480, 36481, 36464, 0, + 32768, 36864, 36865, 36352, 36480, 36481, 36464, 0, + 32768, 36864, 36865, 36352, 36480, 36481, 36464, 36466, + 0, 32768, 36864, 36865, 36352, 36480, 36481, 36464, + 0, 32768, 36864, 36865, 36352, 36480, 36481, 36464, + 36468, 0, 32768, 36864, 36865, 36352, 36480, 36481, + 36464, 36468, 0, 32768, 36864, 36865, 36352, 36480, + 36481, 36464, 36472, 36470, 0, 32768, 36864, 36865, + 36352, 36480, 36481, 36464, 0, 32768, 36864, 36865, + 36352, 36480, 36481, 36464, 36472, 0, 32768, 36864, + 36865, 36352, 36480, 36481, 36483, 36472, 0, 32768, + 36864, 36865, 36352, 36480, 36481, 36483, 36472, 36474, + 0, 32768, 36864, 36865, 36352, 36480, 36481, 36483, + 36472, 0, 32768, 36864, 36865, 36352, 36480, 36481, + 36483, 36472, 36476, 0, 32768, 36864, 36865, 36352, + 36480, 36481, 36483, 36472, 36476, 0, 32768, 36864, + 36865, 36352, 36480, 36481, 36483, 36472, 36476, 36478, + 0, 32768, 36864, 36865, 36352, 0, 32768, 36864, + 36865, 36352, 36480, 0, 32768, 36864, 36865, 36352, + 36480, 0, 32768, 36864, 36865, 36352, 36480, 36482, + 0, 32768, 36864, 36865, 36352, 36480, 0, 32768, + 36864, 36865, 36352, 36480, 36484, 0, 32768, 36864, + 36865, 36352, 36480, 36484, 0, 32768, 36864, 36865, + 36352, 36480, 36488, 36486, 0, 32768, 36864, 36865, + 36352, 36480, 0, 32768, 36864, 36865, 36352, 36480, + 36488, 0, 32768, 36864, 36865, 36352, 36480, 36488, + 0, 32768, 36864, 36865, 36352, 36480, 36488, 36490, + 0, 32768, 36864, 36865, 36352, 36480, 36488, 0, + 32768, 36864, 36865, 36352, 36480, 36496, 36492, 0, + 32768, 36864, 36865, 36352, 36480, 36496, 36492, 0, + 32768, 36864, 36865, 36352, 36480, 36496, 36497, 36494, + 0, 32768, 36864, 36865, 36352, 36480, 0, 32768, + 36864, 36865, 36352, 36480, 36496, 0, 32768, 36864, + 36865, 36352, 36480, 36496, 0, 32768, 36864, 36865, + 36352, 36480, 36496, 36498, 0, 32768, 36864, 36865, + 36352, 36480, 36496, 0, 32768, 36864, 36865, 36352, + 36480, 36496, 36500, 0, 32768, 36864, 36865, 36352, + 36480, 36496, 36500, 0, 32768, 36864, 36865, 36352, + 36480, 36496, 36504, 36502, 0, 32768, 36864, 36865, + 36352, 36480, 36496, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36504, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36504, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36504, 36506, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 36504, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 36513, 36508, 0, 32768, 36864, + 36865, 36352, 36480, 36512, 36513, 36508, 0, 32768, + 36864, 36865, 36352, 36480, 36512, 36513, 36508, 36510, + 0, 32768, 36864, 36865, 36352, 36480, 0, 32768, + 36864, 36865, 36352, 36480, 36512, 0, 32768, 36864, + 36865, 36352, 36480, 36512, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 36514, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36516, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36516, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36520, 36518, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36520, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36520, 0, 32768, 36864, 36865, 36352, + 36480, 36512, 36520, 36522, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 36520, 0, 32768, 36864, 36865, + 36352, 36480, 36512, 36528, 36524, 0, 32768, 36864, + 36865, 36352, 36480, 36512, 36528, 36524, 0, 32768, + 36864, 36865, 36352, 36480, 36512, 36528, 36529, 36526, + 0, 32768, 36864, 36865, 36352, 36480, 36512, 0, + 32768, 36864, 36865, 36352, 36480, 36544, 36528, 0, + 32768, 36864, 36865, 36352, 36480, 36544, 36528, 0, + 32768, 36864, 36865, 36352, 36480, 36544, 36528, 36530, + 0, 32768, 36864, 36865, 36352, 36480, 36544, 36528, + 0, 32768, 36864, 36865, 36352, 36480, 36544, 36528, + 36532, 0, 32768, 36864, 36865, 36352, 36480, 36544, + 36528, 36532, 0, 32768, 36864, 36865, 36352, 36480, + 36544, 36528, 36536, 36534, 0, 32768, 36864, 36865, + 36352, 36480, 36544, 36528, 0, 32768, 36864, 36865, + 36352, 36480, 36544, 36545, 36536, 0, 32768, 36864, + 36865, 36352, 36480, 36544, 36545, 36536, 0, 32768, + 36864, 36865, 36352, 36480, 36544, 36545, 36536, 36538, + 0, 32768, 36864, 36865, 36352, 36480, 36544, 36545, + 36536, 0, 32768, 36864, 36865, 36352, 36480, 36544, + 36545, 36536, 36540, 0, 32768, 36864, 36865, 36352, + 36480, 36544, 36545, 36547, 36540, 0, 32768, 36864, + 36865, 36352, 36480, 36544, 36545, 36547, 36540, 36542, + 0, 32768, 36864, 36865, 36352, 36480, 0, 32768, + 36864, 36865, 36352, 36608, 36544, 0, 32768, 36864, + 36865, 36352, 36608, 36544, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 36546, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36548, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36548, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36552, 36550, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36552, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36552, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36552, 36554, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 36552, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 36560, 36556, 0, 32768, 36864, + 36865, 36352, 36608, 36544, 36560, 36556, 0, 32768, + 36864, 36865, 36352, 36608, 36544, 36560, 36561, 36558, + 0, 32768, 36864, 36865, 36352, 36608, 36544, 0, + 32768, 36864, 36865, 36352, 36608, 36544, 36560, 0, + 32768, 36864, 36865, 36352, 36608, 36544, 36560, 0, + 32768, 36864, 36865, 36352, 36608, 36544, 36560, 36562, + 0, 32768, 36864, 36865, 36352, 36608, 36544, 36560, + 0, 32768, 36864, 36865, 36352, 36608, 36544, 36560, + 36564, 0, 32768, 36864, 36865, 36352, 36608, 36544, + 36560, 36564, 0, 32768, 36864, 36865, 36352, 36608, + 36544, 36560, 36568, 36566, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 36560, 0, 32768, 36864, 36865, + 36352, 36608, 36544, 36576, 36568, 0, 32768, 36864, + 36865, 36352, 36608, 36544, 36576, 36568, 0, 32768, + 36864, 36865, 36352, 36608, 36544, 36576, 36568, 36570, + 0, 32768, 36864, 36865, 36352, 36608, 36544, 36576, + 36568, 0, 32768, 36864, 36865, 36352, 36608, 36544, + 36576, 36577, 36572, 0, 32768, 36864, 36865, 36352, + 36608, 36544, 36576, 36577, 36572, 0, 32768, 36864, + 36865, 36352, 36608, 36544, 36576, 36577, 36572, 36574, + 0, 32768, 36864, 36865, 36352, 36608, 36544, 0, + 32768, 36864, 36865, 36352, 36608, 36609, 36576, 0, + 32768, 36864, 36865, 36352, 36608, 36609, 36576, 0, + 32768, 36864, 36865, 36352, 36608, 36609, 36576, 36578, + 0, 32768, 36864, 36865, 36352, 36608, 36609, 36576, + 0, 32768, 36864, 36865, 36352, 36608, 36609, 36576, + 36580, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36576, 36580, 0, 32768, 36864, 36865, 36352, 36608, + 36609, 36576, 36584, 36582, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36576, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36576, 36584, 0, 32768, 36864, + 36865, 36352, 36608, 36609, 36576, 36584, 0, 32768, + 36864, 36865, 36352, 36608, 36609, 36576, 36584, 36586, + 0, 32768, 36864, 36865, 36352, 36608, 36609, 36576, + 36584, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36576, 36592, 36588, 0, 32768, 36864, 36865, 36352, + 36608, 36609, 36576, 36592, 36588, 0, 32768, 36864, + 36865, 36352, 36608, 36609, 36576, 36592, 36593, 36590, + 0, 32768, 36864, 36865, 36352, 36608, 36609, 36576, + 0, 32768, 36864, 36865, 36352, 36608, 36609, 36576, + 36592, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36611, 36592, 0, 32768, 36864, 36865, 36352, 36608, + 36609, 36611, 36592, 36594, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36611, 36592, 0, 32768, 36864, + 36865, 36352, 36608, 36609, 36611, 36592, 36596, 0, + 32768, 36864, 36865, 36352, 36608, 36609, 36611, 36592, + 36596, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36611, 36592, 36600, 36598, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36611, 36592, 0, 32768, 36864, + 36865, 36352, 36608, 36609, 36611, 36592, 36600, 0, + 32768, 36864, 36865, 36352, 36608, 36609, 36611, 36592, + 36600, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36611, 36592, 36600, 36602, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36611, 36615, 36600, 0, 32768, + 36864, 36865, 36352, 36608, 36609, 36611, 36615, 36600, + 36604, 0, 32768, 36864, 36865, 36352, 36608, 36609, + 36611, 36615, 36600, 36604, 0, 32768, 36864, 36865, + 36352, 36608, 36609, 36611, 36615, 36600, 36604, 36606, + 0, 32768, 36864, 36865, 36352, 0, 32768, 36864, + 36865, 36352, 36608, 0, 32768, 36864, 36865, 36352, + 36608, 0, 32768, 36864, 36865, 36352, 36608, 36610, + 0, 32768, 36864, 36865, 36867, 36608, 0, 32768, + 36864, 36865, 36867, 36608, 36612, 0, 32768, 36864, + 36865, 36867, 36608, 36612, 0, 32768, 36864, 36865, + 36867, 36608, 36616, 36614, 0, 32768, 36864, 36865, + 36867, 36608, 0, 32768, 36864, 36865, 36867, 36608, + 36616, 0, 32768, 36864, 36865, 36867, 36608, 36616, + 0, 32768, 36864, 36865, 36867, 36608, 36616, 36618, + 0, 32768, 36864, 36865, 36867, 36608, 36616, 0, + 32768, 36864, 36865, 36867, 36608, 36624, 36620, 0, + 32768, 36864, 36865, 36867, 36608, 36624, 36620, 0, + 32768, 36864, 36865, 36867, 36608, 36624, 36625, 36622, + 0, 32768, 36864, 36865, 36867, 36608, 0, 32768, + 36864, 36865, 36867, 36608, 36624, 0, 32768, 36864, + 36865, 36867, 36608, 36624, 0, 32768, 36864, 36865, + 36867, 36608, 36624, 36626, 0, 32768, 36864, 36865, + 36867, 36608, 36624, 0, 32768, 36864, 36865, 36867, + 36608, 36624, 36628, 0, 32768, 36864, 36865, 36867, + 36608, 36624, 36628, 0, 32768, 36864, 36865, 36867, + 36608, 36624, 36632, 36630, 0, 32768, 36864, 36865, + 36867, 36608, 36624, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36632, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36632, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36632, 36634, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 36632, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 36641, 36636, 0, 32768, 36864, + 36865, 36867, 36608, 36640, 36641, 36636, 0, 32768, + 36864, 36865, 36867, 36608, 36640, 36641, 36636, 36638, + 0, 32768, 36864, 36865, 36867, 36608, 0, 32768, + 36864, 36865, 36867, 36608, 36640, 0, 32768, 36864, + 36865, 36867, 36608, 36640, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 36642, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36644, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36644, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36648, 36646, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36648, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36648, 0, 32768, 36864, 36865, 36867, + 36608, 36640, 36648, 36650, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 36648, 0, 32768, 36864, 36865, + 36867, 36608, 36640, 36656, 36652, 0, 32768, 36864, + 36865, 36867, 36608, 36640, 36656, 36652, 0, 32768, + 36864, 36865, 36867, 36608, 36640, 36656, 36657, 36654, + 0, 32768, 36864, 36865, 36867, 36608, 36640, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36656, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36656, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36656, 36658, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36656, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36656, + 36660, 0, 32768, 36864, 36865, 36867, 36608, 36672, + 36656, 36660, 0, 32768, 36864, 36865, 36867, 36608, + 36672, 36656, 36664, 36662, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36656, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36673, 36664, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 36673, 36664, 0, 32768, + 36864, 36865, 36867, 36608, 36672, 36673, 36664, 36666, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36673, + 36664, 0, 32768, 36864, 36865, 36867, 36608, 36672, + 36673, 36664, 36668, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36673, 36675, 36668, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 36673, 36675, 36668, 36670, + 0, 32768, 36864, 36865, 36867, 36608, 0, 32768, + 36864, 36865, 36867, 36608, 36672, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36674, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36676, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36676, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36680, 36678, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36680, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36680, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36680, 36682, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36680, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36688, 36684, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 36688, 36684, 0, 32768, + 36864, 36865, 36867, 36608, 36672, 36688, 36689, 36686, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36688, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36688, 0, + 32768, 36864, 36865, 36867, 36608, 36672, 36688, 36690, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36688, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36688, + 36692, 0, 32768, 36864, 36865, 36867, 36608, 36672, + 36688, 36692, 0, 32768, 36864, 36865, 36867, 36608, + 36672, 36688, 36696, 36694, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36688, 0, 32768, 36864, 36865, + 36867, 36608, 36672, 36704, 36696, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 36704, 36696, 0, 32768, + 36864, 36865, 36867, 36608, 36672, 36704, 36696, 36698, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 36704, + 36696, 0, 32768, 36864, 36865, 36867, 36608, 36672, + 36704, 36705, 36700, 0, 32768, 36864, 36865, 36867, + 36608, 36672, 36704, 36705, 36700, 0, 32768, 36864, + 36865, 36867, 36608, 36672, 36704, 36705, 36700, 36702, + 0, 32768, 36864, 36865, 36867, 36608, 36672, 0, + 32768, 36864, 36865, 36867, 36608, 36736, 36704, 0, + 32768, 36864, 36865, 36867, 36608, 36736, 36704, 0, + 32768, 36864, 36865, 36867, 36608, 36736, 36704, 36706, + 0, 32768, 36864, 36865, 36867, 36608, 36736, 36704, + 0, 32768, 36864, 36865, 36867, 36608, 36736, 36704, + 36708, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36704, 36708, 0, 32768, 36864, 36865, 36867, 36608, + 36736, 36704, 36712, 36710, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36704, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36704, 36712, 0, 32768, 36864, + 36865, 36867, 36608, 36736, 36704, 36712, 0, 32768, + 36864, 36865, 36867, 36608, 36736, 36704, 36712, 36714, + 0, 32768, 36864, 36865, 36867, 36608, 36736, 36704, + 36712, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36704, 36720, 36716, 0, 32768, 36864, 36865, 36867, + 36608, 36736, 36704, 36720, 36716, 0, 32768, 36864, + 36865, 36867, 36608, 36736, 36704, 36720, 36721, 36718, + 0, 32768, 36864, 36865, 36867, 36608, 36736, 36704, + 0, 32768, 36864, 36865, 36867, 36608, 36736, 36737, + 36720, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36737, 36720, 0, 32768, 36864, 36865, 36867, 36608, + 36736, 36737, 36720, 36722, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36737, 36720, 0, 32768, 36864, + 36865, 36867, 36608, 36736, 36737, 36720, 36724, 0, + 32768, 36864, 36865, 36867, 36608, 36736, 36737, 36720, + 36724, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36737, 36720, 36728, 36726, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36737, 36720, 0, 32768, 36864, + 36865, 36867, 36608, 36736, 36737, 36720, 36728, 0, + 32768, 36864, 36865, 36867, 36608, 36736, 36737, 36739, + 36728, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36737, 36739, 36728, 36730, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36737, 36739, 36728, 0, 32768, + 36864, 36865, 36867, 36608, 36736, 36737, 36739, 36728, + 36732, 0, 32768, 36864, 36865, 36867, 36608, 36736, + 36737, 36739, 36728, 36732, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36737, 36739, 36728, 36732, 36734, + 0, 32768, 36864, 36865, 36867, 36608, 0, 32768, + 36864, 36865, 36867, 36608, 36736, 0, 32768, 36864, + 36865, 36867, 36608, 36736, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 36738, 0, 32768, 36864, 36865, + 36867, 36608, 36736, 0, 32768, 36864, 36865, 36867, + 36608, 36736, 36740, 0, 32768, 36864, 36865, 36867, + 36608, 36736, 36740, 0, 32768, 36864, 36865, 36867, + 36608, 36736, 36744, 36742, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36744, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36744, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36744, 36746, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36744, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36752, 36748, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36752, 36748, 0, 32768, + 36864, 36865, 36867, 36871, 36736, 36752, 36753, 36750, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36752, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36752, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36752, 36754, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36752, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36752, + 36756, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36752, 36756, 0, 32768, 36864, 36865, 36867, 36871, + 36736, 36752, 36760, 36758, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36752, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36768, 36760, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36768, 36760, 0, 32768, + 36864, 36865, 36867, 36871, 36736, 36768, 36760, 36762, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36768, + 36760, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36768, 36769, 36764, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36768, 36769, 36764, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36768, 36769, 36764, 36766, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36768, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36768, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36768, 36770, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36768, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36768, + 36772, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36768, 36772, 0, 32768, 36864, 36865, 36867, 36871, + 36736, 36768, 36776, 36774, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36768, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36768, 36776, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36768, 36776, 0, 32768, + 36864, 36865, 36867, 36871, 36736, 36768, 36776, 36778, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36768, + 36776, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36768, 36784, 36780, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36768, 36784, 36780, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36768, 36784, 36785, 36782, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36768, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36800, + 36784, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36784, 0, 32768, 36864, 36865, 36867, 36871, + 36736, 36800, 36784, 36786, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 36784, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36800, 36784, 36788, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36800, 36784, + 36788, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36784, 36792, 36790, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 36784, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36800, 36801, 36792, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36800, 36801, + 36792, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36801, 36792, 36794, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 36801, 36792, 0, 32768, + 36864, 36865, 36867, 36871, 36736, 36800, 36801, 36792, + 36796, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36801, 36803, 36796, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 36801, 36803, 36796, 36798, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36800, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36800, 0, + 32768, 36864, 36865, 36867, 36871, 36736, 36800, 36802, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36800, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36800, + 36804, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36804, 0, 32768, 36864, 36865, 36867, 36871, + 36736, 36800, 36808, 36806, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 0, 32768, 36864, 36865, + 36867, 36871, 36736, 36800, 36808, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36800, 36808, 0, 32768, + 36864, 36865, 36867, 36871, 36736, 36800, 36808, 36810, + 0, 32768, 36864, 36865, 36867, 36871, 36736, 36800, + 36808, 0, 32768, 36864, 36865, 36867, 36871, 36736, + 36800, 36816, 36812, 0, 32768, 36864, 36865, 36867, + 36871, 36736, 36800, 36816, 36812, 0, 32768, 36864, + 36865, 36867, 36871, 36736, 36800, 36816, 36817, 36814, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36816, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36816, 0, 32768, 36864, 36865, 36867, 36871, + 36879, 36800, 36816, 36818, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36816, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36816, 36820, 0, + 32768, 36864, 36865, 36867, 36871, 36879, 36800, 36816, + 36820, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36816, 36824, 36822, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36816, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36832, 36824, 0, + 32768, 36864, 36865, 36867, 36871, 36879, 36800, 36832, + 36824, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36824, 36826, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36824, 0, 32768, + 36864, 36865, 36867, 36871, 36879, 36800, 36832, 36833, + 36828, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36833, 36828, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36833, 36828, 36830, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36832, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 0, 32768, 36864, 36865, 36867, 36871, + 36879, 36800, 36832, 36834, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36832, 36836, 0, + 32768, 36864, 36865, 36867, 36871, 36879, 36800, 36832, + 36836, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36840, 36838, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36832, 36840, 0, + 32768, 36864, 36865, 36867, 36871, 36879, 36800, 36832, + 36840, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36840, 36842, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36840, 0, 32768, + 36864, 36865, 36867, 36871, 36879, 36800, 36832, 36848, + 36844, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36848, 36844, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36848, 36849, 36846, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36832, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36848, 0, 32768, 36864, 36865, 36867, + 36871, 36879, 36800, 36832, 36848, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36832, 36848, 36850, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36832, 36848, 0, 32768, 36864, 36865, 36867, 36871, + 36879, 36800, 36832, 36848, 36852, 0, 32768, 36864, + 36865, 36867, 36871, 36879, 36800, 36832, 36848, 36852, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36832, 36848, 36856, 36854, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36848, 0, 32768, + 36864, 36865, 36867, 36871, 36879, 36800, 36832, 36848, + 36856, 0, 32768, 36864, 36865, 36867, 36871, 36879, + 36800, 36832, 36848, 36856, 0, 32768, 36864, 36865, + 36867, 36871, 36879, 36800, 36832, 36848, 36856, 36858, + 0, 32768, 36864, 36865, 36867, 36871, 36879, 36800, + 36832, 36848, 36856, 0, 32768, 36864, 36865, 36867, + 36871, 36879, 36800, 36832, 36848, 36856, 36860, 0, + 32768, 36864, 36865, 36867, 36871, 36879, 36800, 36832, + 36848, 36856, 36860, 0, 32768, 36864, 36865, 36867, + 36871, 36879, 36800, 36832, 36848, 36856, 36860, 36862, + 0, 32768, 0, 32768, 36864, 0, 32768, 36864, + 0, 32768, 36864, 36866, 0, 32768, 36864, 0, + 32768, 36864, 36868, 0, 32768, 36864, 36868, 0, + 32768, 36864, 36872, 36870, 0, 32768, 36864, 0, + 32768, 36864, 36872, 0, 32768, 36864, 36872, 0, + 32768, 36864, 36872, 36874, 0, 32768, 36864, 36872, + 0, 32768, 36864, 36880, 36876, 0, 32768, 36864, + 36880, 36876, 0, 32768, 36864, 36880, 36881, 36878, + 0, 32768, 36864, 0, 32768, 36864, 36880, 0, + 32768, 36864, 36880, 0, 32768, 36864, 36880, 36882, + 0, 32768, 36864, 36880, 0, 32768, 36864, 36880, + 36884, 0, 32768, 36864, 36880, 36884, 0, 32768, + 36864, 36880, 36888, 36886, 0, 32768, 36864, 36880, + 0, 32768, 36864, 36896, 36888, 0, 32768, 36864, + 36896, 36888, 0, 32768, 36864, 36896, 36888, 36890, + 0, 32768, 36864, 36896, 36888, 0, 32768, 36864, + 36896, 36897, 36892, 0, 32768, 36864, 36896, 36897, + 36892, 0, 32768, 36864, 36896, 36897, 36892, 36894, + 0, 32768, 36864, 0, 32768, 36864, 36896, 0, + 32768, 36864, 36896, 0, 32768, 36864, 36896, 36898, + 0, 32768, 36864, 36896, 0, 32768, 36864, 36896, + 36900, 0, 32768, 36864, 36896, 36900, 0, 32768, + 36864, 36896, 36904, 36902, 0, 32768, 36864, 36896, + 0, 32768, 36864, 36896, 36904, 0, 32768, 36864, + 36896, 36904, 0, 32768, 36864, 36896, 36904, 36906, + 0, 32768, 36864, 36896, 36904, 0, 32768, 36864, + 36896, 36912, 36908, 0, 32768, 36864, 36896, 36912, + 36908, 0, 32768, 36864, 36896, 36912, 36913, 36910, + 0, 32768, 36864, 36896, 0, 32768, 36864, 36928, + 36912, 0, 32768, 36864, 36928, 36912, 0, 32768, + 36864, 36928, 36912, 36914, 0, 32768, 36864, 36928, + 36912, 0, 32768, 36864, 36928, 36912, 36916, 0, + 32768, 36864, 36928, 36912, 36916, 0, 32768, 36864, + 36928, 36912, 36920, 36918, 0, 32768, 36864, 36928, + 36912, 0, 32768, 36864, 36928, 36929, 36920, 0, + 32768, 36864, 36928, 36929, 36920, 0, 32768, 36864, + 36928, 36929, 36920, 36922, 0, 32768, 36864, 36928, + 36929, 36920, 0, 32768, 36864, 36928, 36929, 36920, + 36924, 0, 32768, 36864, 36928, 36929, 36931, 36924, + 0, 32768, 36864, 36928, 36929, 36931, 36924, 36926, + 0, 32768, 36864, 0, 32768, 36864, 36928, 0, + 32768, 36864, 36928, 0, 32768, 36864, 36928, 36930, + 0, 32768, 36864, 36928, 0, 32768, 36864, 36928, + 36932, 0, 32768, 36864, 36928, 36932, 0, 32768, + 36864, 36928, 36936, 36934, 0, 32768, 36864, 36928, + 0, 32768, 36864, 36928, 36936, 0, 32768, 36864, + 36928, 36936, 0, 32768, 36864, 36928, 36936, 36938, + 0, 32768, 36864, 36928, 36936, 0, 32768, 36864, + 36928, 36944, 36940, 0, 32768, 36864, 36928, 36944, + 36940, 0, 32768, 36864, 36928, 36944, 36945, 36942, + 0, 32768, 36864, 36928, 0, 32768, 36864, 36928, + 36944, 0, 32768, 36864, 36928, 36944, 0, 32768, + 36864, 36928, 36944, 36946, 0, 32768, 36864, 36928, + 36944, 0, 32768, 36864, 36928, 36944, 36948, 0, + 32768, 36864, 36928, 36944, 36948, 0, 32768, 36864, + 36928, 36944, 36952, 36950, 0, 32768, 36864, 36928, + 36944, 0, 32768, 36864, 36928, 36960, 36952, 0, + 32768, 36864, 36928, 36960, 36952, 0, 32768, 36864, + 36928, 36960, 36952, 36954, 0, 32768, 36864, 36928, + 36960, 36952, 0, 32768, 36864, 36928, 36960, 36961, + 36956, 0, 32768, 36864, 36928, 36960, 36961, 36956, + 0, 32768, 36864, 36928, 36960, 36961, 36956, 36958, + 0, 32768, 36864, 36928, 0, 32768, 36864, 36992, + 36960, 0, 32768, 36864, 36992, 36960, 0, 32768, + 36864, 36992, 36960, 36962, 0, 32768, 36864, 36992, + 36960, 0, 32768, 36864, 36992, 36960, 36964, 0, + 32768, 36864, 36992, 36960, 36964, 0, 32768, 36864, + 36992, 36960, 36968, 36966, 0, 32768, 36864, 36992, + 36960, 0, 32768, 36864, 36992, 36960, 36968, 0, + 32768, 36864, 36992, 36960, 36968, 0, 32768, 36864, + 36992, 36960, 36968, 36970, 0, 32768, 36864, 36992, + 36960, 36968, 0, 32768, 36864, 36992, 36960, 36976, + 36972, 0, 32768, 36864, 36992, 36960, 36976, 36972, + 0, 32768, 36864, 36992, 36960, 36976, 36977, 36974, + 0, 32768, 36864, 36992, 36960, 0, 32768, 36864, + 36992, 36993, 36976, 0, 32768, 36864, 36992, 36993, + 36976, 0, 32768, 36864, 36992, 36993, 36976, 36978, + 0, 32768, 36864, 36992, 36993, 36976, 0, 32768, + 36864, 36992, 36993, 36976, 36980, 0, 32768, 36864, + 36992, 36993, 36976, 36980, 0, 32768, 36864, 36992, + 36993, 36976, 36984, 36982, 0, 32768, 36864, 36992, + 36993, 36976, 0, 32768, 36864, 36992, 36993, 36976, + 36984, 0, 32768, 36864, 36992, 36993, 36995, 36984, + 0, 32768, 36864, 36992, 36993, 36995, 36984, 36986, + 0, 32768, 36864, 36992, 36993, 36995, 36984, 0, + 32768, 36864, 36992, 36993, 36995, 36984, 36988, 0, + 32768, 36864, 36992, 36993, 36995, 36984, 36988, 0, + 32768, 36864, 36992, 36993, 36995, 36984, 36988, 36990, + 0, 32768, 36864, 0, 32768, 36864, 36992, 0, + 32768, 36864, 36992, 0, 32768, 36864, 36992, 36994, + 0, 32768, 36864, 36992, 0, 32768, 36864, 36992, + 36996, 0, 32768, 36864, 36992, 36996, 0, 32768, + 36864, 36992, 37000, 36998, 0, 32768, 36864, 36992, + 0, 32768, 36864, 36992, 37000, 0, 32768, 36864, + 36992, 37000, 0, 32768, 36864, 36992, 37000, 37002, + 0, 32768, 36864, 36992, 37000, 0, 32768, 36864, + 36992, 37008, 37004, 0, 32768, 36864, 36992, 37008, + 37004, 0, 32768, 36864, 36992, 37008, 37009, 37006, + 0, 32768, 36864, 36992, 0, 32768, 36864, 36992, + 37008, 0, 32768, 36864, 36992, 37008, 0, 32768, + 36864, 36992, 37008, 37010, 0, 32768, 36864, 36992, + 37008, 0, 32768, 36864, 36992, 37008, 37012, 0, + 32768, 36864, 36992, 37008, 37012, 0, 32768, 36864, + 36992, 37008, 37016, 37014, 0, 32768, 36864, 36992, + 37008, 0, 32768, 36864, 36992, 37024, 37016, 0, + 32768, 36864, 36992, 37024, 37016, 0, 32768, 36864, + 36992, 37024, 37016, 37018, 0, 32768, 36864, 36992, + 37024, 37016, 0, 32768, 36864, 36992, 37024, 37025, + 37020, 0, 32768, 36864, 36992, 37024, 37025, 37020, + 0, 32768, 36864, 36992, 37024, 37025, 37020, 37022, + 0, 32768, 36864, 36992, 0, 32768, 36864, 36992, + 37024, 0, 32768, 36864, 36992, 37024, 0, 32768, + 36864, 36992, 37024, 37026, 0, 32768, 36864, 36992, + 37024, 0, 32768, 36864, 36992, 37024, 37028, 0, + 32768, 36864, 36992, 37024, 37028, 0, 32768, 36864, + 36992, 37024, 37032, 37030, 0, 32768, 36864, 36992, + 37024, 0, 32768, 36864, 36992, 37024, 37032, 0, + 32768, 36864, 36992, 37024, 37032, 0, 32768, 36864, + 36992, 37024, 37032, 37034, 0, 32768, 36864, 36992, + 37024, 37032, 0, 32768, 36864, 36992, 37024, 37040, + 37036, 0, 32768, 36864, 36992, 37024, 37040, 37036, + 0, 32768, 36864, 36992, 37024, 37040, 37041, 37038, + 0, 32768, 36864, 36992, 37024, 0, 32768, 36864, + 36992, 37056, 37040, 0, 32768, 36864, 36992, 37056, + 37040, 0, 32768, 36864, 36992, 37056, 37040, 37042, + 0, 32768, 36864, 36992, 37056, 37040, 0, 32768, + 36864, 36992, 37056, 37040, 37044, 0, 32768, 36864, + 36992, 37056, 37040, 37044, 0, 32768, 36864, 36992, + 37056, 37040, 37048, 37046, 0, 32768, 36864, 36992, + 37056, 37040, 0, 32768, 36864, 36992, 37056, 37057, + 37048, 0, 32768, 36864, 36992, 37056, 37057, 37048, + 0, 32768, 36864, 36992, 37056, 37057, 37048, 37050, + 0, 32768, 36864, 36992, 37056, 37057, 37048, 0, + 32768, 36864, 36992, 37056, 37057, 37048, 37052, 0, + 32768, 36864, 36992, 37056, 37057, 37059, 37052, 0, + 32768, 36864, 36992, 37056, 37057, 37059, 37052, 37054, + 0, 32768, 36864, 36992, 0, 32768, 36864, 37120, + 37056, 0, 32768, 36864, 37120, 37056, 0, 32768, + 36864, 37120, 37056, 37058, 0, 32768, 36864, 37120, + 37056, 0, 32768, 36864, 37120, 37056, 37060, 0, + 32768, 36864, 37120, 37056, 37060, 0, 32768, 36864, + 37120, 37056, 37064, 37062, 0, 32768, 36864, 37120, + 37056, 0, 32768, 36864, 37120, 37056, 37064, 0, + 32768, 36864, 37120, 37056, 37064, 0, 32768, 36864, + 37120, 37056, 37064, 37066, 0, 32768, 36864, 37120, + 37056, 37064, 0, 32768, 36864, 37120, 37056, 37072, + 37068, 0, 32768, 36864, 37120, 37056, 37072, 37068, + 0, 32768, 36864, 37120, 37056, 37072, 37073, 37070, + 0, 32768, 36864, 37120, 37056, 0, 32768, 36864, + 37120, 37056, 37072, 0, 32768, 36864, 37120, 37056, + 37072, 0, 32768, 36864, 37120, 37056, 37072, 37074, + 0, 32768, 36864, 37120, 37056, 37072, 0, 32768, + 36864, 37120, 37056, 37072, 37076, 0, 32768, 36864, + 37120, 37056, 37072, 37076, 0, 32768, 36864, 37120, + 37056, 37072, 37080, 37078, 0, 32768, 36864, 37120, + 37056, 37072, 0, 32768, 36864, 37120, 37056, 37088, + 37080, 0, 32768, 36864, 37120, 37056, 37088, 37080, + 0, 32768, 36864, 37120, 37056, 37088, 37080, 37082, + 0, 32768, 36864, 37120, 37056, 37088, 37080, 0, + 32768, 36864, 37120, 37056, 37088, 37089, 37084, 0, + 32768, 36864, 37120, 37056, 37088, 37089, 37084, 0, + 32768, 36864, 37120, 37056, 37088, 37089, 37084, 37086, + 0, 32768, 36864, 37120, 37056, 0, 32768, 36864, + 37120, 37121, 37088, 0, 32768, 36864, 37120, 37121, + 37088, 0, 32768, 36864, 37120, 37121, 37088, 37090, + 0, 32768, 36864, 37120, 37121, 37088, 0, 32768, + 36864, 37120, 37121, 37088, 37092, 0, 32768, 36864, + 37120, 37121, 37088, 37092, 0, 32768, 36864, 37120, + 37121, 37088, 37096, 37094, 0, 32768, 36864, 37120, + 37121, 37088, 0, 32768, 36864, 37120, 37121, 37088, + 37096, 0, 32768, 36864, 37120, 37121, 37088, 37096, + 0, 32768, 36864, 37120, 37121, 37088, 37096, 37098, + 0, 32768, 36864, 37120, 37121, 37088, 37096, 0, + 32768, 36864, 37120, 37121, 37088, 37104, 37100, 0, + 32768, 36864, 37120, 37121, 37088, 37104, 37100, 0, + 32768, 36864, 37120, 37121, 37088, 37104, 37105, 37102, + 0, 32768, 36864, 37120, 37121, 37088, 0, 32768, + 36864, 37120, 37121, 37088, 37104, 0, 32768, 36864, + 37120, 37121, 37123, 37104, 0, 32768, 36864, 37120, + 37121, 37123, 37104, 37106, 0, 32768, 36864, 37120, + 37121, 37123, 37104, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37108, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37108, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37112, 37110, 0, 32768, 36864, 37120, + 37121, 37123, 37104, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37112, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37112, 0, 32768, 36864, 37120, 37121, + 37123, 37104, 37112, 37114, 0, 32768, 36864, 37120, + 37121, 37123, 37127, 37112, 0, 32768, 36864, 37120, + 37121, 37123, 37127, 37112, 37116, 0, 32768, 36864, + 37120, 37121, 37123, 37127, 37112, 37116, 0, 32768, + 36864, 37120, 37121, 37123, 37127, 37112, 37116, 37118, + 0, 32768, 36864, 0, 32768, 36864, 37120, 0, + 32768, 36864, 37120, 0, 32768, 36864, 37120, 37122, + 0, 32768, 36864, 37120, 0, 32768, 36864, 37120, + 37124, 0, 32768, 36864, 37120, 37124, 0, 32768, + 36864, 37120, 37128, 37126, 0, 32768, 36864, 37120, + 0, 32768, 36864, 37120, 37128, 0, 32768, 36864, + 37120, 37128, 0, 32768, 36864, 37120, 37128, 37130, + 0, 32768, 36864, 37120, 37128, 0, 32768, 36864, + 37120, 37136, 37132, 0, 32768, 36864, 37120, 37136, + 37132, 0, 32768, 36864, 37120, 37136, 37137, 37134, + 0, 32768, 36864, 37120, 0, 32768, 36864, 37120, + 37136, 0, 32768, 36864, 37120, 37136, 0, 32768, + 36864, 37120, 37136, 37138, 0, 32768, 36864, 37120, + 37136, 0, 32768, 36864, 37120, 37136, 37140, 0, + 32768, 36864, 37120, 37136, 37140, 0, 32768, 36864, + 37120, 37136, 37144, 37142, 0, 32768, 36864, 37120, + 37136, 0, 32768, 36864, 37120, 37152, 37144, 0, + 32768, 36864, 37120, 37152, 37144, 0, 32768, 36864, + 37120, 37152, 37144, 37146, 0, 32768, 36864, 37120, + 37152, 37144, 0, 32768, 36864, 37120, 37152, 37153, + 37148, 0, 32768, 36864, 37120, 37152, 37153, 37148, + 0, 32768, 36864, 37120, 37152, 37153, 37148, 37150, + 0, 32768, 36864, 37120, 0, 32768, 36864, 37120, + 37152, 0, 32768, 36864, 37120, 37152, 0, 32768, + 36864, 37120, 37152, 37154, 0, 32768, 36864, 37120, + 37152, 0, 32768, 36864, 37120, 37152, 37156, 0, + 32768, 36864, 37120, 37152, 37156, 0, 32768, 36864, + 37120, 37152, 37160, 37158, 0, 32768, 36864, 37120, + 37152, 0, 32768, 36864, 37120, 37152, 37160, 0, + 32768, 36864, 37120, 37152, 37160, 0, 32768, 36864, + 37120, 37152, 37160, 37162, 0, 32768, 36864, 37120, + 37152, 37160, 0, 32768, 36864, 37120, 37152, 37168, + 37164, 0, 32768, 36864, 37120, 37152, 37168, 37164, + 0, 32768, 36864, 37120, 37152, 37168, 37169, 37166, + 0, 32768, 36864, 37120, 37152, 0, 32768, 36864, + 37120, 37184, 37168, 0, 32768, 36864, 37120, 37184, + 37168, 0, 32768, 36864, 37120, 37184, 37168, 37170, + 0, 32768, 36864, 37120, 37184, 37168, 0, 32768, + 36864, 37120, 37184, 37168, 37172, 0, 32768, 36864, + 37120, 37184, 37168, 37172, 0, 32768, 36864, 37120, + 37184, 37168, 37176, 37174, 0, 32768, 36864, 37120, + 37184, 37168, 0, 32768, 36864, 37120, 37184, 37185, + 37176, 0, 32768, 36864, 37120, 37184, 37185, 37176, + 0, 32768, 36864, 37120, 37184, 37185, 37176, 37178, + 0, 32768, 36864, 37120, 37184, 37185, 37176, 0, + 32768, 36864, 37120, 37184, 37185, 37176, 37180, 0, + 32768, 36864, 37120, 37184, 37185, 37187, 37180, 0, + 32768, 36864, 37120, 37184, 37185, 37187, 37180, 37182, + 0, 32768, 36864, 37120, 0, 32768, 36864, 37120, + 37184, 0, 32768, 36864, 37120, 37184, 0, 32768, + 36864, 37120, 37184, 37186, 0, 32768, 36864, 37120, + 37184, 0, 32768, 36864, 37120, 37184, 37188, 0, + 32768, 36864, 37120, 37184, 37188, 0, 32768, 36864, + 37120, 37184, 37192, 37190, 0, 32768, 36864, 37120, + 37184, 0, 32768, 36864, 37120, 37184, 37192, 0, + 32768, 36864, 37120, 37184, 37192, 0, 32768, 36864, + 37120, 37184, 37192, 37194, 0, 32768, 36864, 37120, + 37184, 37192, 0, 32768, 36864, 37120, 37184, 37200, + 37196, 0, 32768, 36864, 37120, 37184, 37200, 37196, + 0, 32768, 36864, 37120, 37184, 37200, 37201, 37198, + 0, 32768, 36864, 37120, 37184, 0, 32768, 36864, + 37120, 37184, 37200, 0, 32768, 36864, 37120, 37184, + 37200, 0, 32768, 36864, 37120, 37184, 37200, 37202, + 0, 32768, 36864, 37120, 37184, 37200, 0, 32768, + 36864, 37120, 37184, 37200, 37204, 0, 32768, 36864, + 37120, 37184, 37200, 37204, 0, 32768, 36864, 37120, + 37184, 37200, 37208, 37206, 0, 32768, 36864, 37120, + 37184, 37200, 0, 32768, 36864, 37120, 37184, 37216, + 37208, 0, 32768, 36864, 37120, 37184, 37216, 37208, + 0, 32768, 36864, 37120, 37184, 37216, 37208, 37210, + 0, 32768, 36864, 37120, 37184, 37216, 37208, 0, + 32768, 36864, 37120, 37184, 37216, 37217, 37212, 0, + 32768, 36864, 37120, 37184, 37216, 37217, 37212, 0, + 32768, 36864, 37120, 37184, 37216, 37217, 37212, 37214, + 0, 32768, 36864, 37120, 37184, 0, 32768, 36864, + 37120, 37248, 37216, 0, 32768, 36864, 37120, 37248, + 37216, 0, 32768, 36864, 37120, 37248, 37216, 37218, + 0, 32768, 36864, 37120, 37248, 37216, 0, 32768, + 36864, 37120, 37248, 37216, 37220, 0, 32768, 36864, + 37120, 37248, 37216, 37220, 0, 32768, 36864, 37120, + 37248, 37216, 37224, 37222, 0, 32768, 36864, 37120, + 37248, 37216, 0, 32768, 36864, 37120, 37248, 37216, + 37224, 0, 32768, 36864, 37120, 37248, 37216, 37224, + 0, 32768, 36864, 37120, 37248, 37216, 37224, 37226, + 0, 32768, 36864, 37120, 37248, 37216, 37224, 0, + 32768, 36864, 37120, 37248, 37216, 37232, 37228, 0, + 32768, 36864, 37120, 37248, 37216, 37232, 37228, 0, + 32768, 36864, 37120, 37248, 37216, 37232, 37233, 37230, + 0, 32768, 36864, 37120, 37248, 37216, 0, 32768, + 36864, 37120, 37248, 37249, 37232, 0, 32768, 36864, + 37120, 37248, 37249, 37232, 0, 32768, 36864, 37120, + 37248, 37249, 37232, 37234, 0, 32768, 36864, 37120, + 37248, 37249, 37232, 0, 32768, 36864, 37120, 37248, + 37249, 37232, 37236, 0, 32768, 36864, 37120, 37248, + 37249, 37232, 37236, 0, 32768, 36864, 37120, 37248, + 37249, 37232, 37240, 37238, 0, 32768, 36864, 37120, + 37248, 37249, 37232, 0, 32768, 36864, 37120, 37248, + 37249, 37232, 37240, 0, 32768, 36864, 37120, 37248, + 37249, 37251, 37240, 0, 32768, 36864, 37120, 37248, + 37249, 37251, 37240, 37242, 0, 32768, 36864, 37120, + 37248, 37249, 37251, 37240, 0, 32768, 36864, 37120, + 37248, 37249, 37251, 37240, 37244, 0, 32768, 36864, + 37120, 37248, 37249, 37251, 37240, 37244, 0, 32768, + 36864, 37120, 37248, 37249, 37251, 37240, 37244, 37246, + 0, 32768, 36864, 37120, 0, 32768, 36864, 37376, + 37248, 0, 32768, 36864, 37376, 37248, 0, 32768, + 36864, 37376, 37248, 37250, 0, 32768, 36864, 37376, + 37248, 0, 32768, 36864, 37376, 37248, 37252, 0, + 32768, 36864, 37376, 37248, 37252, 0, 32768, 36864, + 37376, 37248, 37256, 37254, 0, 32768, 36864, 37376, + 37248, 0, 32768, 36864, 37376, 37248, 37256, 0, + 32768, 36864, 37376, 37248, 37256, 0, 32768, 36864, + 37376, 37248, 37256, 37258, 0, 32768, 36864, 37376, + 37248, 37256, 0, 32768, 36864, 37376, 37248, 37264, + 37260, 0, 32768, 36864, 37376, 37248, 37264, 37260, + 0, 32768, 36864, 37376, 37248, 37264, 37265, 37262, + 0, 32768, 36864, 37376, 37248, 0, 32768, 36864, + 37376, 37248, 37264, 0, 32768, 36864, 37376, 37248, + 37264, 0, 32768, 36864, 37376, 37248, 37264, 37266, + 0, 32768, 36864, 37376, 37248, 37264, 0, 32768, + 36864, 37376, 37248, 37264, 37268, 0, 32768, 36864, + 37376, 37248, 37264, 37268, 0, 32768, 36864, 37376, + 37248, 37264, 37272, 37270, 0, 32768, 36864, 37376, + 37248, 37264, 0, 32768, 36864, 37376, 37248, 37280, + 37272, 0, 32768, 36864, 37376, 37248, 37280, 37272, + 0, 32768, 36864, 37376, 37248, 37280, 37272, 37274, + 0, 32768, 36864, 37376, 37248, 37280, 37272, 0, + 32768, 36864, 37376, 37248, 37280, 37281, 37276, 0, + 32768, 36864, 37376, 37248, 37280, 37281, 37276, 0, + 32768, 36864, 37376, 37248, 37280, 37281, 37276, 37278, + 0, 32768, 36864, 37376, 37248, 0, 32768, 36864, + 37376, 37248, 37280, 0, 32768, 36864, 37376, 37248, + 37280, 0, 32768, 36864, 37376, 37248, 37280, 37282, + 0, 32768, 36864, 37376, 37248, 37280, 0, 32768, + 36864, 37376, 37248, 37280, 37284, 0, 32768, 36864, + 37376, 37248, 37280, 37284, 0, 32768, 36864, 37376, + 37248, 37280, 37288, 37286, 0, 32768, 36864, 37376, + 37248, 37280, 0, 32768, 36864, 37376, 37248, 37280, + 37288, 0, 32768, 36864, 37376, 37248, 37280, 37288, + 0, 32768, 36864, 37376, 37248, 37280, 37288, 37290, + 0, 32768, 36864, 37376, 37248, 37280, 37288, 0, + 32768, 36864, 37376, 37248, 37280, 37296, 37292, 0, + 32768, 36864, 37376, 37248, 37280, 37296, 37292, 0, + 32768, 36864, 37376, 37248, 37280, 37296, 37297, 37294, + 0, 32768, 36864, 37376, 37248, 37280, 0, 32768, + 36864, 37376, 37248, 37312, 37296, 0, 32768, 36864, + 37376, 37248, 37312, 37296, 0, 32768, 36864, 37376, + 37248, 37312, 37296, 37298, 0, 32768, 36864, 37376, + 37248, 37312, 37296, 0, 32768, 36864, 37376, 37248, + 37312, 37296, 37300, 0, 32768, 36864, 37376, 37248, + 37312, 37296, 37300, 0, 32768, 36864, 37376, 37248, + 37312, 37296, 37304, 37302, 0, 32768, 36864, 37376, + 37248, 37312, 37296, 0, 32768, 36864, 37376, 37248, + 37312, 37313, 37304, 0, 32768, 36864, 37376, 37248, + 37312, 37313, 37304, 0, 32768, 36864, 37376, 37248, + 37312, 37313, 37304, 37306, 0, 32768, 36864, 37376, + 37248, 37312, 37313, 37304, 0, 32768, 36864, 37376, + 37248, 37312, 37313, 37304, 37308, 0, 32768, 36864, + 37376, 37248, 37312, 37313, 37315, 37308, 0, 32768, + 36864, 37376, 37248, 37312, 37313, 37315, 37308, 37310, + 0, 32768, 36864, 37376, 37248, 0, 32768, 36864, + 37376, 37377, 37312, 0, 32768, 36864, 37376, 37377, + 37312, 0, 32768, 36864, 37376, 37377, 37312, 37314, + 0, 32768, 36864, 37376, 37377, 37312, 0, 32768, + 36864, 37376, 37377, 37312, 37316, 0, 32768, 36864, + 37376, 37377, 37312, 37316, 0, 32768, 36864, 37376, + 37377, 37312, 37320, 37318, 0, 32768, 36864, 37376, + 37377, 37312, 0, 32768, 36864, 37376, 37377, 37312, + 37320, 0, 32768, 36864, 37376, 37377, 37312, 37320, + 0, 32768, 36864, 37376, 37377, 37312, 37320, 37322, + 0, 32768, 36864, 37376, 37377, 37312, 37320, 0, + 32768, 36864, 37376, 37377, 37312, 37328, 37324, 0, + 32768, 36864, 37376, 37377, 37312, 37328, 37324, 0, + 32768, 36864, 37376, 37377, 37312, 37328, 37329, 37326, + 0, 32768, 36864, 37376, 37377, 37312, 0, 32768, + 36864, 37376, 37377, 37312, 37328, 0, 32768, 36864, + 37376, 37377, 37312, 37328, 0, 32768, 36864, 37376, + 37377, 37312, 37328, 37330, 0, 32768, 36864, 37376, + 37377, 37312, 37328, 0, 32768, 36864, 37376, 37377, + 37312, 37328, 37332, 0, 32768, 36864, 37376, 37377, + 37312, 37328, 37332, 0, 32768, 36864, 37376, 37377, + 37312, 37328, 37336, 37334, 0, 32768, 36864, 37376, + 37377, 37312, 37328, 0, 32768, 36864, 37376, 37377, + 37312, 37344, 37336, 0, 32768, 36864, 37376, 37377, + 37312, 37344, 37336, 0, 32768, 36864, 37376, 37377, + 37312, 37344, 37336, 37338, 0, 32768, 36864, 37376, + 37377, 37312, 37344, 37336, 0, 32768, 36864, 37376, + 37377, 37312, 37344, 37345, 37340, 0, 32768, 36864, + 37376, 37377, 37312, 37344, 37345, 37340, 0, 32768, + 36864, 37376, 37377, 37312, 37344, 37345, 37340, 37342, + 0, 32768, 36864, 37376, 37377, 37312, 0, 32768, + 36864, 37376, 37377, 37312, 37344, 0, 32768, 36864, + 37376, 37377, 37379, 37344, 0, 32768, 36864, 37376, + 37377, 37379, 37344, 37346, 0, 32768, 36864, 37376, + 37377, 37379, 37344, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37348, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37348, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37352, 37350, 0, 32768, 36864, 37376, + 37377, 37379, 37344, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37352, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37352, 0, 32768, 36864, 37376, 37377, + 37379, 37344, 37352, 37354, 0, 32768, 36864, 37376, + 37377, 37379, 37344, 37352, 0, 32768, 36864, 37376, + 37377, 37379, 37344, 37360, 37356, 0, 32768, 36864, + 37376, 37377, 37379, 37344, 37360, 37356, 0, 32768, + 36864, 37376, 37377, 37379, 37344, 37360, 37361, 37358, + 0, 32768, 36864, 37376, 37377, 37379, 37344, 0, + 32768, 36864, 37376, 37377, 37379, 37344, 37360, 0, + 32768, 36864, 37376, 37377, 37379, 37344, 37360, 0, + 32768, 36864, 37376, 37377, 37379, 37344, 37360, 37362, + 0, 32768, 36864, 37376, 37377, 37379, 37383, 37360, + 0, 32768, 36864, 37376, 37377, 37379, 37383, 37360, + 37364, 0, 32768, 36864, 37376, 37377, 37379, 37383, + 37360, 37364, 0, 32768, 36864, 37376, 37377, 37379, + 37383, 37360, 37368, 37366, 0, 32768, 36864, 37376, + 37377, 37379, 37383, 37360, 0, 32768, 36864, 37376, + 37377, 37379, 37383, 37360, 37368, 0, 32768, 36864, + 37376, 37377, 37379, 37383, 37360, 37368, 0, 32768, + 36864, 37376, 37377, 37379, 37383, 37360, 37368, 37370, + 0, 32768, 36864, 37376, 37377, 37379, 37383, 37360, + 37368, 0, 32768, 36864, 37376, 37377, 37379, 37383, + 37360, 37368, 37372, 0, 32768, 36864, 37376, 37377, + 37379, 37383, 37360, 37368, 37372, 0, 32768, 36864, + 37376, 37377, 37379, 37383, 37360, 37368, 37372, 37374, + 0, 32768, 36864, 0, 32768, 36864, 37376, 0, + 32768, 36864, 37376, 0, 32768, 36864, 37376, 37378, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37376, + 37380, 0, 32768, 36864, 37376, 37380, 0, 32768, + 36864, 37376, 37384, 37382, 0, 32768, 36864, 37376, + 0, 32768, 36864, 37376, 37384, 0, 32768, 36864, + 37376, 37384, 0, 32768, 36864, 37376, 37384, 37386, + 0, 32768, 36864, 37376, 37384, 0, 32768, 36864, + 37376, 37392, 37388, 0, 32768, 36864, 37376, 37392, + 37388, 0, 32768, 36864, 37376, 37392, 37393, 37390, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37376, + 37392, 0, 32768, 36864, 37376, 37392, 0, 32768, + 36864, 37376, 37392, 37394, 0, 32768, 36864, 37376, + 37392, 0, 32768, 36864, 37376, 37392, 37396, 0, + 32768, 36864, 37376, 37392, 37396, 0, 32768, 36864, + 37376, 37392, 37400, 37398, 0, 32768, 36864, 37376, + 37392, 0, 32768, 36864, 37376, 37408, 37400, 0, + 32768, 36864, 37376, 37408, 37400, 0, 32768, 36864, + 37376, 37408, 37400, 37402, 0, 32768, 36864, 37376, + 37408, 37400, 0, 32768, 36864, 37376, 37408, 37409, + 37404, 0, 32768, 36864, 37376, 37408, 37409, 37404, + 0, 32768, 36864, 37376, 37408, 37409, 37404, 37406, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37376, + 37408, 0, 32768, 36864, 37376, 37408, 0, 32768, + 36864, 37376, 37408, 37410, 0, 32768, 36864, 37376, + 37408, 0, 32768, 36864, 37376, 37408, 37412, 0, + 32768, 36864, 37376, 37408, 37412, 0, 32768, 36864, + 37376, 37408, 37416, 37414, 0, 32768, 36864, 37376, + 37408, 0, 32768, 36864, 37376, 37408, 37416, 0, + 32768, 36864, 37376, 37408, 37416, 0, 32768, 36864, + 37376, 37408, 37416, 37418, 0, 32768, 36864, 37376, + 37408, 37416, 0, 32768, 36864, 37376, 37408, 37424, + 37420, 0, 32768, 36864, 37376, 37408, 37424, 37420, + 0, 32768, 36864, 37376, 37408, 37424, 37425, 37422, + 0, 32768, 36864, 37376, 37408, 0, 32768, 36864, + 37376, 37440, 37424, 0, 32768, 36864, 37376, 37440, + 37424, 0, 32768, 36864, 37376, 37440, 37424, 37426, + 0, 32768, 36864, 37376, 37440, 37424, 0, 32768, + 36864, 37376, 37440, 37424, 37428, 0, 32768, 36864, + 37376, 37440, 37424, 37428, 0, 32768, 36864, 37376, + 37440, 37424, 37432, 37430, 0, 32768, 36864, 37376, + 37440, 37424, 0, 32768, 36864, 37376, 37440, 37441, + 37432, 0, 32768, 36864, 37376, 37440, 37441, 37432, + 0, 32768, 36864, 37376, 37440, 37441, 37432, 37434, + 0, 32768, 36864, 37376, 37440, 37441, 37432, 0, + 32768, 36864, 37376, 37440, 37441, 37432, 37436, 0, + 32768, 36864, 37376, 37440, 37441, 37443, 37436, 0, + 32768, 36864, 37376, 37440, 37441, 37443, 37436, 37438, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37376, + 37440, 0, 32768, 36864, 37376, 37440, 0, 32768, + 36864, 37376, 37440, 37442, 0, 32768, 36864, 37376, + 37440, 0, 32768, 36864, 37376, 37440, 37444, 0, + 32768, 36864, 37376, 37440, 37444, 0, 32768, 36864, + 37376, 37440, 37448, 37446, 0, 32768, 36864, 37376, + 37440, 0, 32768, 36864, 37376, 37440, 37448, 0, + 32768, 36864, 37376, 37440, 37448, 0, 32768, 36864, + 37376, 37440, 37448, 37450, 0, 32768, 36864, 37376, + 37440, 37448, 0, 32768, 36864, 37376, 37440, 37456, + 37452, 0, 32768, 36864, 37376, 37440, 37456, 37452, + 0, 32768, 36864, 37376, 37440, 37456, 37457, 37454, + 0, 32768, 36864, 37376, 37440, 0, 32768, 36864, + 37376, 37440, 37456, 0, 32768, 36864, 37376, 37440, + 37456, 0, 32768, 36864, 37376, 37440, 37456, 37458, + 0, 32768, 36864, 37376, 37440, 37456, 0, 32768, + 36864, 37376, 37440, 37456, 37460, 0, 32768, 36864, + 37376, 37440, 37456, 37460, 0, 32768, 36864, 37376, + 37440, 37456, 37464, 37462, 0, 32768, 36864, 37376, + 37440, 37456, 0, 32768, 36864, 37376, 37440, 37472, + 37464, 0, 32768, 36864, 37376, 37440, 37472, 37464, + 0, 32768, 36864, 37376, 37440, 37472, 37464, 37466, + 0, 32768, 36864, 37376, 37440, 37472, 37464, 0, + 32768, 36864, 37376, 37440, 37472, 37473, 37468, 0, + 32768, 36864, 37376, 37440, 37472, 37473, 37468, 0, + 32768, 36864, 37376, 37440, 37472, 37473, 37468, 37470, + 0, 32768, 36864, 37376, 37440, 0, 32768, 36864, + 37376, 37504, 37472, 0, 32768, 36864, 37376, 37504, + 37472, 0, 32768, 36864, 37376, 37504, 37472, 37474, + 0, 32768, 36864, 37376, 37504, 37472, 0, 32768, + 36864, 37376, 37504, 37472, 37476, 0, 32768, 36864, + 37376, 37504, 37472, 37476, 0, 32768, 36864, 37376, + 37504, 37472, 37480, 37478, 0, 32768, 36864, 37376, + 37504, 37472, 0, 32768, 36864, 37376, 37504, 37472, + 37480, 0, 32768, 36864, 37376, 37504, 37472, 37480, + 0, 32768, 36864, 37376, 37504, 37472, 37480, 37482, + 0, 32768, 36864, 37376, 37504, 37472, 37480, 0, + 32768, 36864, 37376, 37504, 37472, 37488, 37484, 0, + 32768, 36864, 37376, 37504, 37472, 37488, 37484, 0, + 32768, 36864, 37376, 37504, 37472, 37488, 37489, 37486, + 0, 32768, 36864, 37376, 37504, 37472, 0, 32768, + 36864, 37376, 37504, 37505, 37488, 0, 32768, 36864, + 37376, 37504, 37505, 37488, 0, 32768, 36864, 37376, + 37504, 37505, 37488, 37490, 0, 32768, 36864, 37376, + 37504, 37505, 37488, 0, 32768, 36864, 37376, 37504, + 37505, 37488, 37492, 0, 32768, 36864, 37376, 37504, + 37505, 37488, 37492, 0, 32768, 36864, 37376, 37504, + 37505, 37488, 37496, 37494, 0, 32768, 36864, 37376, + 37504, 37505, 37488, 0, 32768, 36864, 37376, 37504, + 37505, 37488, 37496, 0, 32768, 36864, 37376, 37504, + 37505, 37507, 37496, 0, 32768, 36864, 37376, 37504, + 37505, 37507, 37496, 37498, 0, 32768, 36864, 37376, + 37504, 37505, 37507, 37496, 0, 32768, 36864, 37376, + 37504, 37505, 37507, 37496, 37500, 0, 32768, 36864, + 37376, 37504, 37505, 37507, 37496, 37500, 0, 32768, + 36864, 37376, 37504, 37505, 37507, 37496, 37500, 37502, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37376, + 37504, 0, 32768, 36864, 37376, 37504, 0, 32768, + 36864, 37376, 37504, 37506, 0, 32768, 36864, 37376, + 37504, 0, 32768, 36864, 37376, 37504, 37508, 0, + 32768, 36864, 37376, 37504, 37508, 0, 32768, 36864, + 37376, 37504, 37512, 37510, 0, 32768, 36864, 37376, + 37504, 0, 32768, 36864, 37376, 37504, 37512, 0, + 32768, 36864, 37376, 37504, 37512, 0, 32768, 36864, + 37376, 37504, 37512, 37514, 0, 32768, 36864, 37376, + 37504, 37512, 0, 32768, 36864, 37376, 37504, 37520, + 37516, 0, 32768, 36864, 37376, 37504, 37520, 37516, + 0, 32768, 36864, 37376, 37504, 37520, 37521, 37518, + 0, 32768, 36864, 37376, 37504, 0, 32768, 36864, + 37376, 37504, 37520, 0, 32768, 36864, 37376, 37504, + 37520, 0, 32768, 36864, 37376, 37504, 37520, 37522, + 0, 32768, 36864, 37376, 37504, 37520, 0, 32768, + 36864, 37376, 37504, 37520, 37524, 0, 32768, 36864, + 37376, 37504, 37520, 37524, 0, 32768, 36864, 37376, + 37504, 37520, 37528, 37526, 0, 32768, 36864, 37376, + 37504, 37520, 0, 32768, 36864, 37376, 37504, 37536, + 37528, 0, 32768, 36864, 37376, 37504, 37536, 37528, + 0, 32768, 36864, 37376, 37504, 37536, 37528, 37530, + 0, 32768, 36864, 37376, 37504, 37536, 37528, 0, + 32768, 36864, 37376, 37504, 37536, 37537, 37532, 0, + 32768, 36864, 37376, 37504, 37536, 37537, 37532, 0, + 32768, 36864, 37376, 37504, 37536, 37537, 37532, 37534, + 0, 32768, 36864, 37376, 37504, 0, 32768, 36864, + 37376, 37504, 37536, 0, 32768, 36864, 37376, 37504, + 37536, 0, 32768, 36864, 37376, 37504, 37536, 37538, + 0, 32768, 36864, 37376, 37504, 37536, 0, 32768, + 36864, 37376, 37504, 37536, 37540, 0, 32768, 36864, + 37376, 37504, 37536, 37540, 0, 32768, 36864, 37376, + 37504, 37536, 37544, 37542, 0, 32768, 36864, 37376, + 37504, 37536, 0, 32768, 36864, 37376, 37504, 37536, + 37544, 0, 32768, 36864, 37376, 37504, 37536, 37544, + 0, 32768, 36864, 37376, 37504, 37536, 37544, 37546, + 0, 32768, 36864, 37376, 37504, 37536, 37544, 0, + 32768, 36864, 37376, 37504, 37536, 37552, 37548, 0, + 32768, 36864, 37376, 37504, 37536, 37552, 37548, 0, + 32768, 36864, 37376, 37504, 37536, 37552, 37553, 37550, + 0, 32768, 36864, 37376, 37504, 37536, 0, 32768, + 36864, 37376, 37504, 37568, 37552, 0, 32768, 36864, + 37376, 37504, 37568, 37552, 0, 32768, 36864, 37376, + 37504, 37568, 37552, 37554, 0, 32768, 36864, 37376, + 37504, 37568, 37552, 0, 32768, 36864, 37376, 37504, + 37568, 37552, 37556, 0, 32768, 36864, 37376, 37504, + 37568, 37552, 37556, 0, 32768, 36864, 37376, 37504, + 37568, 37552, 37560, 37558, 0, 32768, 36864, 37376, + 37504, 37568, 37552, 0, 32768, 36864, 37376, 37504, + 37568, 37569, 37560, 0, 32768, 36864, 37376, 37504, + 37568, 37569, 37560, 0, 32768, 36864, 37376, 37504, + 37568, 37569, 37560, 37562, 0, 32768, 36864, 37376, + 37504, 37568, 37569, 37560, 0, 32768, 36864, 37376, + 37504, 37568, 37569, 37560, 37564, 0, 32768, 36864, + 37376, 37504, 37568, 37569, 37571, 37564, 0, 32768, + 36864, 37376, 37504, 37568, 37569, 37571, 37564, 37566, + 0, 32768, 36864, 37376, 37504, 0, 32768, 36864, + 37376, 37632, 37568, 0, 32768, 36864, 37376, 37632, + 37568, 0, 32768, 36864, 37376, 37632, 37568, 37570, + 0, 32768, 36864, 37376, 37632, 37568, 0, 32768, + 36864, 37376, 37632, 37568, 37572, 0, 32768, 36864, + 37376, 37632, 37568, 37572, 0, 32768, 36864, 37376, + 37632, 37568, 37576, 37574, 0, 32768, 36864, 37376, + 37632, 37568, 0, 32768, 36864, 37376, 37632, 37568, + 37576, 0, 32768, 36864, 37376, 37632, 37568, 37576, + 0, 32768, 36864, 37376, 37632, 37568, 37576, 37578, + 0, 32768, 36864, 37376, 37632, 37568, 37576, 0, + 32768, 36864, 37376, 37632, 37568, 37584, 37580, 0, + 32768, 36864, 37376, 37632, 37568, 37584, 37580, 0, + 32768, 36864, 37376, 37632, 37568, 37584, 37585, 37582, + 0, 32768, 36864, 37376, 37632, 37568, 0, 32768, + 36864, 37376, 37632, 37568, 37584, 0, 32768, 36864, + 37376, 37632, 37568, 37584, 0, 32768, 36864, 37376, + 37632, 37568, 37584, 37586, 0, 32768, 36864, 37376, + 37632, 37568, 37584, 0, 32768, 36864, 37376, 37632, + 37568, 37584, 37588, 0, 32768, 36864, 37376, 37632, + 37568, 37584, 37588, 0, 32768, 36864, 37376, 37632, + 37568, 37584, 37592, 37590, 0, 32768, 36864, 37376, + 37632, 37568, 37584, 0, 32768, 36864, 37376, 37632, + 37568, 37600, 37592, 0, 32768, 36864, 37376, 37632, + 37568, 37600, 37592, 0, 32768, 36864, 37376, 37632, + 37568, 37600, 37592, 37594, 0, 32768, 36864, 37376, + 37632, 37568, 37600, 37592, 0, 32768, 36864, 37376, + 37632, 37568, 37600, 37601, 37596, 0, 32768, 36864, + 37376, 37632, 37568, 37600, 37601, 37596, 0, 32768, + 36864, 37376, 37632, 37568, 37600, 37601, 37596, 37598, + 0, 32768, 36864, 37376, 37632, 37568, 0, 32768, + 36864, 37376, 37632, 37633, 37600, 0, 32768, 36864, + 37376, 37632, 37633, 37600, 0, 32768, 36864, 37376, + 37632, 37633, 37600, 37602, 0, 32768, 36864, 37376, + 37632, 37633, 37600, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37604, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37604, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37608, 37606, 0, 32768, 36864, 37376, + 37632, 37633, 37600, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37608, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37608, 0, 32768, 36864, 37376, 37632, + 37633, 37600, 37608, 37610, 0, 32768, 36864, 37376, + 37632, 37633, 37600, 37608, 0, 32768, 36864, 37376, + 37632, 37633, 37600, 37616, 37612, 0, 32768, 36864, + 37376, 37632, 37633, 37600, 37616, 37612, 0, 32768, + 36864, 37376, 37632, 37633, 37600, 37616, 37617, 37614, + 0, 32768, 36864, 37376, 37632, 37633, 37600, 0, + 32768, 36864, 37376, 37632, 37633, 37600, 37616, 0, + 32768, 36864, 37376, 37632, 37633, 37635, 37616, 0, + 32768, 36864, 37376, 37632, 37633, 37635, 37616, 37618, + 0, 32768, 36864, 37376, 37632, 37633, 37635, 37616, + 0, 32768, 36864, 37376, 37632, 37633, 37635, 37616, + 37620, 0, 32768, 36864, 37376, 37632, 37633, 37635, + 37616, 37620, 0, 32768, 36864, 37376, 37632, 37633, + 37635, 37616, 37624, 37622, 0, 32768, 36864, 37376, + 37632, 37633, 37635, 37616, 0, 32768, 36864, 37376, + 37632, 37633, 37635, 37616, 37624, 0, 32768, 36864, + 37376, 37632, 37633, 37635, 37616, 37624, 0, 32768, + 36864, 37376, 37632, 37633, 37635, 37616, 37624, 37626, + 0, 32768, 36864, 37376, 37632, 37633, 37635, 37639, + 37624, 0, 32768, 36864, 37376, 37632, 37633, 37635, + 37639, 37624, 37628, 0, 32768, 36864, 37376, 37632, + 37633, 37635, 37639, 37624, 37628, 0, 32768, 36864, + 37376, 37632, 37633, 37635, 37639, 37624, 37628, 37630, + 0, 32768, 36864, 37376, 0, 32768, 36864, 37888, + 37632, 0, 32768, 36864, 37888, 37632, 0, 32768, + 36864, 37888, 37632, 37634, 0, 32768, 36864, 37888, + 37632, 0, 32768, 36864, 37888, 37632, 37636, 0, + 32768, 36864, 37888, 37632, 37636, 0, 32768, 36864, + 37888, 37632, 37640, 37638, 0, 32768, 36864, 37888, + 37632, 0, 32768, 36864, 37888, 37632, 37640, 0, + 32768, 36864, 37888, 37632, 37640, 0, 32768, 36864, + 37888, 37632, 37640, 37642, 0, 32768, 36864, 37888, + 37632, 37640, 0, 32768, 36864, 37888, 37632, 37648, + 37644, 0, 32768, 36864, 37888, 37632, 37648, 37644, + 0, 32768, 36864, 37888, 37632, 37648, 37649, 37646, + 0, 32768, 36864, 37888, 37632, 0, 32768, 36864, + 37888, 37632, 37648, 0, 32768, 36864, 37888, 37632, + 37648, 0, 32768, 36864, 37888, 37632, 37648, 37650, + 0, 32768, 36864, 37888, 37632, 37648, 0, 32768, + 36864, 37888, 37632, 37648, 37652, 0, 32768, 36864, + 37888, 37632, 37648, 37652, 0, 32768, 36864, 37888, + 37632, 37648, 37656, 37654, 0, 32768, 36864, 37888, + 37632, 37648, 0, 32768, 36864, 37888, 37632, 37664, + 37656, 0, 32768, 36864, 37888, 37632, 37664, 37656, + 0, 32768, 36864, 37888, 37632, 37664, 37656, 37658, + 0, 32768, 36864, 37888, 37632, 37664, 37656, 0, + 32768, 36864, 37888, 37632, 37664, 37665, 37660, 0, + 32768, 36864, 37888, 37632, 37664, 37665, 37660, 0, + 32768, 36864, 37888, 37632, 37664, 37665, 37660, 37662, + 0, 32768, 36864, 37888, 37632, 0, 32768, 36864, + 37888, 37632, 37664, 0, 32768, 36864, 37888, 37632, + 37664, 0, 32768, 36864, 37888, 37632, 37664, 37666, + 0, 32768, 36864, 37888, 37632, 37664, 0, 32768, + 36864, 37888, 37632, 37664, 37668, 0, 32768, 36864, + 37888, 37632, 37664, 37668, 0, 32768, 36864, 37888, + 37632, 37664, 37672, 37670, 0, 32768, 36864, 37888, + 37632, 37664, 0, 32768, 36864, 37888, 37632, 37664, + 37672, 0, 32768, 36864, 37888, 37632, 37664, 37672, + 0, 32768, 36864, 37888, 37632, 37664, 37672, 37674, + 0, 32768, 36864, 37888, 37632, 37664, 37672, 0, + 32768, 36864, 37888, 37632, 37664, 37680, 37676, 0, + 32768, 36864, 37888, 37632, 37664, 37680, 37676, 0, + 32768, 36864, 37888, 37632, 37664, 37680, 37681, 37678, + 0, 32768, 36864, 37888, 37632, 37664, 0, 32768, + 36864, 37888, 37632, 37696, 37680, 0, 32768, 36864, + 37888, 37632, 37696, 37680, 0, 32768, 36864, 37888, + 37632, 37696, 37680, 37682, 0, 32768, 36864, 37888, + 37632, 37696, 37680, 0, 32768, 36864, 37888, 37632, + 37696, 37680, 37684, 0, 32768, 36864, 37888, 37632, + 37696, 37680, 37684, 0, 32768, 36864, 37888, 37632, + 37696, 37680, 37688, 37686, 0, 32768, 36864, 37888, + 37632, 37696, 37680, 0, 32768, 36864, 37888, 37632, + 37696, 37697, 37688, 0, 32768, 36864, 37888, 37632, + 37696, 37697, 37688, 0, 32768, 36864, 37888, 37632, + 37696, 37697, 37688, 37690, 0, 32768, 36864, 37888, + 37632, 37696, 37697, 37688, 0, 32768, 36864, 37888, + 37632, 37696, 37697, 37688, 37692, 0, 32768, 36864, + 37888, 37632, 37696, 37697, 37699, 37692, 0, 32768, + 36864, 37888, 37632, 37696, 37697, 37699, 37692, 37694, + 0, 32768, 36864, 37888, 37632, 0, 32768, 36864, + 37888, 37632, 37696, 0, 32768, 36864, 37888, 37632, + 37696, 0, 32768, 36864, 37888, 37632, 37696, 37698, + 0, 32768, 36864, 37888, 37632, 37696, 0, 32768, + 36864, 37888, 37632, 37696, 37700, 0, 32768, 36864, + 37888, 37632, 37696, 37700, 0, 32768, 36864, 37888, + 37632, 37696, 37704, 37702, 0, 32768, 36864, 37888, + 37632, 37696, 0, 32768, 36864, 37888, 37632, 37696, + 37704, 0, 32768, 36864, 37888, 37632, 37696, 37704, + 0, 32768, 36864, 37888, 37632, 37696, 37704, 37706, + 0, 32768, 36864, 37888, 37632, 37696, 37704, 0, + 32768, 36864, 37888, 37632, 37696, 37712, 37708, 0, + 32768, 36864, 37888, 37632, 37696, 37712, 37708, 0, + 32768, 36864, 37888, 37632, 37696, 37712, 37713, 37710, + 0, 32768, 36864, 37888, 37632, 37696, 0, 32768, + 36864, 37888, 37632, 37696, 37712, 0, 32768, 36864, + 37888, 37632, 37696, 37712, 0, 32768, 36864, 37888, + 37632, 37696, 37712, 37714, 0, 32768, 36864, 37888, + 37632, 37696, 37712, 0, 32768, 36864, 37888, 37632, + 37696, 37712, 37716, 0, 32768, 36864, 37888, 37632, + 37696, 37712, 37716, 0, 32768, 36864, 37888, 37632, + 37696, 37712, 37720, 37718, 0, 32768, 36864, 37888, + 37632, 37696, 37712, 0, 32768, 36864, 37888, 37632, + 37696, 37728, 37720, 0, 32768, 36864, 37888, 37632, + 37696, 37728, 37720, 0, 32768, 36864, 37888, 37632, + 37696, 37728, 37720, 37722, 0, 32768, 36864, 37888, + 37632, 37696, 37728, 37720, 0, 32768, 36864, 37888, + 37632, 37696, 37728, 37729, 37724, 0, 32768, 36864, + 37888, 37632, 37696, 37728, 37729, 37724, 0, 32768, + 36864, 37888, 37632, 37696, 37728, 37729, 37724, 37726, + 0, 32768, 36864, 37888, 37632, 37696, 0, 32768, + 36864, 37888, 37632, 37760, 37728, 0, 32768, 36864, + 37888, 37632, 37760, 37728, 0, 32768, 36864, 37888, + 37632, 37760, 37728, 37730, 0, 32768, 36864, 37888, + 37632, 37760, 37728, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37732, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37732, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37736, 37734, 0, 32768, 36864, 37888, + 37632, 37760, 37728, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37736, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37736, 0, 32768, 36864, 37888, 37632, + 37760, 37728, 37736, 37738, 0, 32768, 36864, 37888, + 37632, 37760, 37728, 37736, 0, 32768, 36864, 37888, + 37632, 37760, 37728, 37744, 37740, 0, 32768, 36864, + 37888, 37632, 37760, 37728, 37744, 37740, 0, 32768, + 36864, 37888, 37632, 37760, 37728, 37744, 37745, 37742, + 0, 32768, 36864, 37888, 37632, 37760, 37728, 0, + 32768, 36864, 37888, 37632, 37760, 37761, 37744, 0, + 32768, 36864, 37888, 37632, 37760, 37761, 37744, 0, + 32768, 36864, 37888, 37632, 37760, 37761, 37744, 37746, + 0, 32768, 36864, 37888, 37632, 37760, 37761, 37744, + 0, 32768, 36864, 37888, 37632, 37760, 37761, 37744, + 37748, 0, 32768, 36864, 37888, 37632, 37760, 37761, + 37744, 37748, 0, 32768, 36864, 37888, 37632, 37760, + 37761, 37744, 37752, 37750, 0, 32768, 36864, 37888, + 37632, 37760, 37761, 37744, 0, 32768, 36864, 37888, + 37632, 37760, 37761, 37744, 37752, 0, 32768, 36864, + 37888, 37632, 37760, 37761, 37763, 37752, 0, 32768, + 36864, 37888, 37632, 37760, 37761, 37763, 37752, 37754, + 0, 32768, 36864, 37888, 37632, 37760, 37761, 37763, + 37752, 0, 32768, 36864, 37888, 37632, 37760, 37761, + 37763, 37752, 37756, 0, 32768, 36864, 37888, 37632, + 37760, 37761, 37763, 37752, 37756, 0, 32768, 36864, + 37888, 37632, 37760, 37761, 37763, 37752, 37756, 37758, + 0, 32768, 36864, 37888, 37632, 0, 32768, 36864, + 37888, 37632, 37760, 0, 32768, 36864, 37888, 37889, + 37760, 0, 32768, 36864, 37888, 37889, 37760, 37762, + 0, 32768, 36864, 37888, 37889, 37760, 0, 32768, + 36864, 37888, 37889, 37760, 37764, 0, 32768, 36864, + 37888, 37889, 37760, 37764, 0, 32768, 36864, 37888, + 37889, 37760, 37768, 37766, 0, 32768, 36864, 37888, + 37889, 37760, 0, 32768, 36864, 37888, 37889, 37760, + 37768, 0, 32768, 36864, 37888, 37889, 37760, 37768, + 0, 32768, 36864, 37888, 37889, 37760, 37768, 37770, + 0, 32768, 36864, 37888, 37889, 37760, 37768, 0, + 32768, 36864, 37888, 37889, 37760, 37776, 37772, 0, + 32768, 36864, 37888, 37889, 37760, 37776, 37772, 0, + 32768, 36864, 37888, 37889, 37760, 37776, 37777, 37774, + 0, 32768, 36864, 37888, 37889, 37760, 0, 32768, + 36864, 37888, 37889, 37760, 37776, 0, 32768, 36864, + 37888, 37889, 37760, 37776, 0, 32768, 36864, 37888, + 37889, 37760, 37776, 37778, 0, 32768, 36864, 37888, + 37889, 37760, 37776, 0, 32768, 36864, 37888, 37889, + 37760, 37776, 37780, 0, 32768, 36864, 37888, 37889, + 37760, 37776, 37780, 0, 32768, 36864, 37888, 37889, + 37760, 37776, 37784, 37782, 0, 32768, 36864, 37888, + 37889, 37760, 37776, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37784, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37784, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37784, 37786, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 37784, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 37793, 37788, 0, 32768, 36864, + 37888, 37889, 37760, 37792, 37793, 37788, 0, 32768, + 36864, 37888, 37889, 37760, 37792, 37793, 37788, 37790, + 0, 32768, 36864, 37888, 37889, 37760, 0, 32768, + 36864, 37888, 37889, 37760, 37792, 0, 32768, 36864, + 37888, 37889, 37760, 37792, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 37794, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37796, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37796, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37800, 37798, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37800, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37800, 0, 32768, 36864, 37888, 37889, + 37760, 37792, 37800, 37802, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 37800, 0, 32768, 36864, 37888, + 37889, 37760, 37792, 37808, 37804, 0, 32768, 36864, + 37888, 37889, 37760, 37792, 37808, 37804, 0, 32768, + 36864, 37888, 37889, 37760, 37792, 37808, 37809, 37806, + 0, 32768, 36864, 37888, 37889, 37760, 37792, 0, + 32768, 36864, 37888, 37889, 37760, 37824, 37808, 0, + 32768, 36864, 37888, 37889, 37760, 37824, 37808, 0, + 32768, 36864, 37888, 37889, 37760, 37824, 37808, 37810, + 0, 32768, 36864, 37888, 37889, 37760, 37824, 37808, + 0, 32768, 36864, 37888, 37889, 37760, 37824, 37808, + 37812, 0, 32768, 36864, 37888, 37889, 37760, 37824, + 37808, 37812, 0, 32768, 36864, 37888, 37889, 37760, + 37824, 37808, 37816, 37814, 0, 32768, 36864, 37888, + 37889, 37760, 37824, 37808, 0, 32768, 36864, 37888, + 37889, 37760, 37824, 37825, 37816, 0, 32768, 36864, + 37888, 37889, 37760, 37824, 37825, 37816, 0, 32768, + 36864, 37888, 37889, 37760, 37824, 37825, 37816, 37818, + 0, 32768, 36864, 37888, 37889, 37760, 37824, 37825, + 37816, 0, 32768, 36864, 37888, 37889, 37760, 37824, + 37825, 37816, 37820, 0, 32768, 36864, 37888, 37889, + 37760, 37824, 37825, 37827, 37820, 0, 32768, 36864, + 37888, 37889, 37760, 37824, 37825, 37827, 37820, 37822, + 0, 32768, 36864, 37888, 37889, 37760, 0, 32768, + 36864, 37888, 37889, 37760, 37824, 0, 32768, 36864, + 37888, 37889, 37760, 37824, 0, 32768, 36864, 37888, + 37889, 37760, 37824, 37826, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37828, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37828, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37832, 37830, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37832, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37832, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37832, 37834, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 37832, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 37840, 37836, 0, 32768, 36864, + 37888, 37889, 37891, 37824, 37840, 37836, 0, 32768, + 36864, 37888, 37889, 37891, 37824, 37840, 37841, 37838, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37840, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37840, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37840, 37842, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 37840, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 37840, + 37844, 0, 32768, 36864, 37888, 37889, 37891, 37824, + 37840, 37844, 0, 32768, 36864, 37888, 37889, 37891, + 37824, 37840, 37848, 37846, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 37840, 0, 32768, 36864, 37888, + 37889, 37891, 37824, 37856, 37848, 0, 32768, 36864, + 37888, 37889, 37891, 37824, 37856, 37848, 0, 32768, + 36864, 37888, 37889, 37891, 37824, 37856, 37848, 37850, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 37856, + 37848, 0, 32768, 36864, 37888, 37889, 37891, 37824, + 37856, 37857, 37852, 0, 32768, 36864, 37888, 37889, + 37891, 37824, 37856, 37857, 37852, 0, 32768, 36864, + 37888, 37889, 37891, 37824, 37856, 37857, 37852, 37854, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37856, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37856, 0, + 32768, 36864, 37888, 37889, 37891, 37824, 37856, 37858, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 37856, + 0, 32768, 36864, 37888, 37889, 37891, 37824, 37856, + 37860, 0, 32768, 36864, 37888, 37889, 37891, 37824, + 37856, 37860, 0, 32768, 36864, 37888, 37889, 37891, + 37824, 37856, 37864, 37862, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 37864, 0, 32768, 36864, + 37888, 37889, 37891, 37895, 37856, 37864, 0, 32768, + 36864, 37888, 37889, 37891, 37895, 37856, 37864, 37866, + 0, 32768, 36864, 37888, 37889, 37891, 37895, 37856, + 37864, 0, 32768, 36864, 37888, 37889, 37891, 37895, + 37856, 37872, 37868, 0, 32768, 36864, 37888, 37889, + 37891, 37895, 37856, 37872, 37868, 0, 32768, 36864, + 37888, 37889, 37891, 37895, 37856, 37872, 37873, 37870, + 0, 32768, 36864, 37888, 37889, 37891, 37895, 37856, + 0, 32768, 36864, 37888, 37889, 37891, 37895, 37856, + 37872, 0, 32768, 36864, 37888, 37889, 37891, 37895, + 37856, 37872, 0, 32768, 36864, 37888, 37889, 37891, + 37895, 37856, 37872, 37874, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 37872, 0, 32768, 36864, + 37888, 37889, 37891, 37895, 37856, 37872, 37876, 0, + 32768, 36864, 37888, 37889, 37891, 37895, 37856, 37872, + 37876, 0, 32768, 36864, 37888, 37889, 37891, 37895, + 37856, 37872, 37880, 37878, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 37872, 0, 32768, 36864, + 37888, 37889, 37891, 37895, 37856, 37872, 37880, 0, + 32768, 36864, 37888, 37889, 37891, 37895, 37856, 37872, + 37880, 0, 32768, 36864, 37888, 37889, 37891, 37895, + 37856, 37872, 37880, 37882, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 37872, 37880, 0, 32768, + 36864, 37888, 37889, 37891, 37895, 37856, 37872, 37880, + 37884, 0, 32768, 36864, 37888, 37889, 37891, 37895, + 37856, 37872, 37880, 37884, 0, 32768, 36864, 37888, + 37889, 37891, 37895, 37856, 37872, 37880, 37884, 37886, + 0, 32768, 36864, 0, 32768, 36864, 37888, 0, + 32768, 36864, 37888, 0, 32768, 36864, 37888, 37890, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 37892, 0, 32768, 36864, 37888, 37892, 0, 32768, + 36864, 37888, 37896, 37894, 0, 32768, 36864, 37888, + 0, 32768, 36864, 37888, 37896, 0, 32768, 36864, + 37888, 37896, 0, 32768, 36864, 37888, 37896, 37898, + 0, 32768, 36864, 37888, 37896, 0, 32768, 36864, + 37888, 37904, 37900, 0, 32768, 36864, 37888, 37904, + 37900, 0, 32768, 36864, 37888, 37904, 37905, 37902, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 37904, 0, 32768, 36864, 37888, 37904, 0, 32768, + 36864, 37888, 37904, 37906, 0, 32768, 36864, 37888, + 37904, 0, 32768, 36864, 37888, 37904, 37908, 0, + 32768, 36864, 37888, 37904, 37908, 0, 32768, 36864, + 37888, 37904, 37912, 37910, 0, 32768, 36864, 37888, + 37904, 0, 32768, 36864, 37888, 37920, 37912, 0, + 32768, 36864, 37888, 37920, 37912, 0, 32768, 36864, + 37888, 37920, 37912, 37914, 0, 32768, 36864, 37888, + 37920, 37912, 0, 32768, 36864, 37888, 37920, 37921, + 37916, 0, 32768, 36864, 37888, 37920, 37921, 37916, + 0, 32768, 36864, 37888, 37920, 37921, 37916, 37918, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 37920, 0, 32768, 36864, 37888, 37920, 0, 32768, + 36864, 37888, 37920, 37922, 0, 32768, 36864, 37888, + 37920, 0, 32768, 36864, 37888, 37920, 37924, 0, + 32768, 36864, 37888, 37920, 37924, 0, 32768, 36864, + 37888, 37920, 37928, 37926, 0, 32768, 36864, 37888, + 37920, 0, 32768, 36864, 37888, 37920, 37928, 0, + 32768, 36864, 37888, 37920, 37928, 0, 32768, 36864, + 37888, 37920, 37928, 37930, 0, 32768, 36864, 37888, + 37920, 37928, 0, 32768, 36864, 37888, 37920, 37936, + 37932, 0, 32768, 36864, 37888, 37920, 37936, 37932, + 0, 32768, 36864, 37888, 37920, 37936, 37937, 37934, + 0, 32768, 36864, 37888, 37920, 0, 32768, 36864, + 37888, 37952, 37936, 0, 32768, 36864, 37888, 37952, + 37936, 0, 32768, 36864, 37888, 37952, 37936, 37938, + 0, 32768, 36864, 37888, 37952, 37936, 0, 32768, + 36864, 37888, 37952, 37936, 37940, 0, 32768, 36864, + 37888, 37952, 37936, 37940, 0, 32768, 36864, 37888, + 37952, 37936, 37944, 37942, 0, 32768, 36864, 37888, + 37952, 37936, 0, 32768, 36864, 37888, 37952, 37953, + 37944, 0, 32768, 36864, 37888, 37952, 37953, 37944, + 0, 32768, 36864, 37888, 37952, 37953, 37944, 37946, + 0, 32768, 36864, 37888, 37952, 37953, 37944, 0, + 32768, 36864, 37888, 37952, 37953, 37944, 37948, 0, + 32768, 36864, 37888, 37952, 37953, 37955, 37948, 0, + 32768, 36864, 37888, 37952, 37953, 37955, 37948, 37950, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 37952, 0, 32768, 36864, 37888, 37952, 0, 32768, + 36864, 37888, 37952, 37954, 0, 32768, 36864, 37888, + 37952, 0, 32768, 36864, 37888, 37952, 37956, 0, + 32768, 36864, 37888, 37952, 37956, 0, 32768, 36864, + 37888, 37952, 37960, 37958, 0, 32768, 36864, 37888, + 37952, 0, 32768, 36864, 37888, 37952, 37960, 0, + 32768, 36864, 37888, 37952, 37960, 0, 32768, 36864, + 37888, 37952, 37960, 37962, 0, 32768, 36864, 37888, + 37952, 37960, 0, 32768, 36864, 37888, 37952, 37968, + 37964, 0, 32768, 36864, 37888, 37952, 37968, 37964, + 0, 32768, 36864, 37888, 37952, 37968, 37969, 37966, + 0, 32768, 36864, 37888, 37952, 0, 32768, 36864, + 37888, 37952, 37968, 0, 32768, 36864, 37888, 37952, + 37968, 0, 32768, 36864, 37888, 37952, 37968, 37970, + 0, 32768, 36864, 37888, 37952, 37968, 0, 32768, + 36864, 37888, 37952, 37968, 37972, 0, 32768, 36864, + 37888, 37952, 37968, 37972, 0, 32768, 36864, 37888, + 37952, 37968, 37976, 37974, 0, 32768, 36864, 37888, + 37952, 37968, 0, 32768, 36864, 37888, 37952, 37984, + 37976, 0, 32768, 36864, 37888, 37952, 37984, 37976, + 0, 32768, 36864, 37888, 37952, 37984, 37976, 37978, + 0, 32768, 36864, 37888, 37952, 37984, 37976, 0, + 32768, 36864, 37888, 37952, 37984, 37985, 37980, 0, + 32768, 36864, 37888, 37952, 37984, 37985, 37980, 0, + 32768, 36864, 37888, 37952, 37984, 37985, 37980, 37982, + 0, 32768, 36864, 37888, 37952, 0, 32768, 36864, + 37888, 38016, 37984, 0, 32768, 36864, 37888, 38016, + 37984, 0, 32768, 36864, 37888, 38016, 37984, 37986, + 0, 32768, 36864, 37888, 38016, 37984, 0, 32768, + 36864, 37888, 38016, 37984, 37988, 0, 32768, 36864, + 37888, 38016, 37984, 37988, 0, 32768, 36864, 37888, + 38016, 37984, 37992, 37990, 0, 32768, 36864, 37888, + 38016, 37984, 0, 32768, 36864, 37888, 38016, 37984, + 37992, 0, 32768, 36864, 37888, 38016, 37984, 37992, + 0, 32768, 36864, 37888, 38016, 37984, 37992, 37994, + 0, 32768, 36864, 37888, 38016, 37984, 37992, 0, + 32768, 36864, 37888, 38016, 37984, 38000, 37996, 0, + 32768, 36864, 37888, 38016, 37984, 38000, 37996, 0, + 32768, 36864, 37888, 38016, 37984, 38000, 38001, 37998, + 0, 32768, 36864, 37888, 38016, 37984, 0, 32768, + 36864, 37888, 38016, 38017, 38000, 0, 32768, 36864, + 37888, 38016, 38017, 38000, 0, 32768, 36864, 37888, + 38016, 38017, 38000, 38002, 0, 32768, 36864, 37888, + 38016, 38017, 38000, 0, 32768, 36864, 37888, 38016, + 38017, 38000, 38004, 0, 32768, 36864, 37888, 38016, + 38017, 38000, 38004, 0, 32768, 36864, 37888, 38016, + 38017, 38000, 38008, 38006, 0, 32768, 36864, 37888, + 38016, 38017, 38000, 0, 32768, 36864, 37888, 38016, + 38017, 38000, 38008, 0, 32768, 36864, 37888, 38016, + 38017, 38019, 38008, 0, 32768, 36864, 37888, 38016, + 38017, 38019, 38008, 38010, 0, 32768, 36864, 37888, + 38016, 38017, 38019, 38008, 0, 32768, 36864, 37888, + 38016, 38017, 38019, 38008, 38012, 0, 32768, 36864, + 37888, 38016, 38017, 38019, 38008, 38012, 0, 32768, + 36864, 37888, 38016, 38017, 38019, 38008, 38012, 38014, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 38016, 0, 32768, 36864, 37888, 38016, 0, 32768, + 36864, 37888, 38016, 38018, 0, 32768, 36864, 37888, + 38016, 0, 32768, 36864, 37888, 38016, 38020, 0, + 32768, 36864, 37888, 38016, 38020, 0, 32768, 36864, + 37888, 38016, 38024, 38022, 0, 32768, 36864, 37888, + 38016, 0, 32768, 36864, 37888, 38016, 38024, 0, + 32768, 36864, 37888, 38016, 38024, 0, 32768, 36864, + 37888, 38016, 38024, 38026, 0, 32768, 36864, 37888, + 38016, 38024, 0, 32768, 36864, 37888, 38016, 38032, + 38028, 0, 32768, 36864, 37888, 38016, 38032, 38028, + 0, 32768, 36864, 37888, 38016, 38032, 38033, 38030, + 0, 32768, 36864, 37888, 38016, 0, 32768, 36864, + 37888, 38016, 38032, 0, 32768, 36864, 37888, 38016, + 38032, 0, 32768, 36864, 37888, 38016, 38032, 38034, + 0, 32768, 36864, 37888, 38016, 38032, 0, 32768, + 36864, 37888, 38016, 38032, 38036, 0, 32768, 36864, + 37888, 38016, 38032, 38036, 0, 32768, 36864, 37888, + 38016, 38032, 38040, 38038, 0, 32768, 36864, 37888, + 38016, 38032, 0, 32768, 36864, 37888, 38016, 38048, + 38040, 0, 32768, 36864, 37888, 38016, 38048, 38040, + 0, 32768, 36864, 37888, 38016, 38048, 38040, 38042, + 0, 32768, 36864, 37888, 38016, 38048, 38040, 0, + 32768, 36864, 37888, 38016, 38048, 38049, 38044, 0, + 32768, 36864, 37888, 38016, 38048, 38049, 38044, 0, + 32768, 36864, 37888, 38016, 38048, 38049, 38044, 38046, + 0, 32768, 36864, 37888, 38016, 0, 32768, 36864, + 37888, 38016, 38048, 0, 32768, 36864, 37888, 38016, + 38048, 0, 32768, 36864, 37888, 38016, 38048, 38050, + 0, 32768, 36864, 37888, 38016, 38048, 0, 32768, + 36864, 37888, 38016, 38048, 38052, 0, 32768, 36864, + 37888, 38016, 38048, 38052, 0, 32768, 36864, 37888, + 38016, 38048, 38056, 38054, 0, 32768, 36864, 37888, + 38016, 38048, 0, 32768, 36864, 37888, 38016, 38048, + 38056, 0, 32768, 36864, 37888, 38016, 38048, 38056, + 0, 32768, 36864, 37888, 38016, 38048, 38056, 38058, + 0, 32768, 36864, 37888, 38016, 38048, 38056, 0, + 32768, 36864, 37888, 38016, 38048, 38064, 38060, 0, + 32768, 36864, 37888, 38016, 38048, 38064, 38060, 0, + 32768, 36864, 37888, 38016, 38048, 38064, 38065, 38062, + 0, 32768, 36864, 37888, 38016, 38048, 0, 32768, + 36864, 37888, 38016, 38080, 38064, 0, 32768, 36864, + 37888, 38016, 38080, 38064, 0, 32768, 36864, 37888, + 38016, 38080, 38064, 38066, 0, 32768, 36864, 37888, + 38016, 38080, 38064, 0, 32768, 36864, 37888, 38016, + 38080, 38064, 38068, 0, 32768, 36864, 37888, 38016, + 38080, 38064, 38068, 0, 32768, 36864, 37888, 38016, + 38080, 38064, 38072, 38070, 0, 32768, 36864, 37888, + 38016, 38080, 38064, 0, 32768, 36864, 37888, 38016, + 38080, 38081, 38072, 0, 32768, 36864, 37888, 38016, + 38080, 38081, 38072, 0, 32768, 36864, 37888, 38016, + 38080, 38081, 38072, 38074, 0, 32768, 36864, 37888, + 38016, 38080, 38081, 38072, 0, 32768, 36864, 37888, + 38016, 38080, 38081, 38072, 38076, 0, 32768, 36864, + 37888, 38016, 38080, 38081, 38083, 38076, 0, 32768, + 36864, 37888, 38016, 38080, 38081, 38083, 38076, 38078, + 0, 32768, 36864, 37888, 38016, 0, 32768, 36864, + 37888, 38144, 38080, 0, 32768, 36864, 37888, 38144, + 38080, 0, 32768, 36864, 37888, 38144, 38080, 38082, + 0, 32768, 36864, 37888, 38144, 38080, 0, 32768, + 36864, 37888, 38144, 38080, 38084, 0, 32768, 36864, + 37888, 38144, 38080, 38084, 0, 32768, 36864, 37888, + 38144, 38080, 38088, 38086, 0, 32768, 36864, 37888, + 38144, 38080, 0, 32768, 36864, 37888, 38144, 38080, + 38088, 0, 32768, 36864, 37888, 38144, 38080, 38088, + 0, 32768, 36864, 37888, 38144, 38080, 38088, 38090, + 0, 32768, 36864, 37888, 38144, 38080, 38088, 0, + 32768, 36864, 37888, 38144, 38080, 38096, 38092, 0, + 32768, 36864, 37888, 38144, 38080, 38096, 38092, 0, + 32768, 36864, 37888, 38144, 38080, 38096, 38097, 38094, + 0, 32768, 36864, 37888, 38144, 38080, 0, 32768, + 36864, 37888, 38144, 38080, 38096, 0, 32768, 36864, + 37888, 38144, 38080, 38096, 0, 32768, 36864, 37888, + 38144, 38080, 38096, 38098, 0, 32768, 36864, 37888, + 38144, 38080, 38096, 0, 32768, 36864, 37888, 38144, + 38080, 38096, 38100, 0, 32768, 36864, 37888, 38144, + 38080, 38096, 38100, 0, 32768, 36864, 37888, 38144, + 38080, 38096, 38104, 38102, 0, 32768, 36864, 37888, + 38144, 38080, 38096, 0, 32768, 36864, 37888, 38144, + 38080, 38112, 38104, 0, 32768, 36864, 37888, 38144, + 38080, 38112, 38104, 0, 32768, 36864, 37888, 38144, + 38080, 38112, 38104, 38106, 0, 32768, 36864, 37888, + 38144, 38080, 38112, 38104, 0, 32768, 36864, 37888, + 38144, 38080, 38112, 38113, 38108, 0, 32768, 36864, + 37888, 38144, 38080, 38112, 38113, 38108, 0, 32768, + 36864, 37888, 38144, 38080, 38112, 38113, 38108, 38110, + 0, 32768, 36864, 37888, 38144, 38080, 0, 32768, + 36864, 37888, 38144, 38145, 38112, 0, 32768, 36864, + 37888, 38144, 38145, 38112, 0, 32768, 36864, 37888, + 38144, 38145, 38112, 38114, 0, 32768, 36864, 37888, + 38144, 38145, 38112, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38116, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38116, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38120, 38118, 0, 32768, 36864, 37888, + 38144, 38145, 38112, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38120, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38120, 0, 32768, 36864, 37888, 38144, + 38145, 38112, 38120, 38122, 0, 32768, 36864, 37888, + 38144, 38145, 38112, 38120, 0, 32768, 36864, 37888, + 38144, 38145, 38112, 38128, 38124, 0, 32768, 36864, + 37888, 38144, 38145, 38112, 38128, 38124, 0, 32768, + 36864, 37888, 38144, 38145, 38112, 38128, 38129, 38126, + 0, 32768, 36864, 37888, 38144, 38145, 38112, 0, + 32768, 36864, 37888, 38144, 38145, 38112, 38128, 0, + 32768, 36864, 37888, 38144, 38145, 38147, 38128, 0, + 32768, 36864, 37888, 38144, 38145, 38147, 38128, 38130, + 0, 32768, 36864, 37888, 38144, 38145, 38147, 38128, + 0, 32768, 36864, 37888, 38144, 38145, 38147, 38128, + 38132, 0, 32768, 36864, 37888, 38144, 38145, 38147, + 38128, 38132, 0, 32768, 36864, 37888, 38144, 38145, + 38147, 38128, 38136, 38134, 0, 32768, 36864, 37888, + 38144, 38145, 38147, 38128, 0, 32768, 36864, 37888, + 38144, 38145, 38147, 38128, 38136, 0, 32768, 36864, + 37888, 38144, 38145, 38147, 38128, 38136, 0, 32768, + 36864, 37888, 38144, 38145, 38147, 38128, 38136, 38138, + 0, 32768, 36864, 37888, 38144, 38145, 38147, 38151, + 38136, 0, 32768, 36864, 37888, 38144, 38145, 38147, + 38151, 38136, 38140, 0, 32768, 36864, 37888, 38144, + 38145, 38147, 38151, 38136, 38140, 0, 32768, 36864, + 37888, 38144, 38145, 38147, 38151, 38136, 38140, 38142, + 0, 32768, 36864, 37888, 0, 32768, 36864, 37888, + 38144, 0, 32768, 36864, 37888, 38144, 0, 32768, + 36864, 37888, 38144, 38146, 0, 32768, 36864, 37888, + 38144, 0, 32768, 36864, 37888, 38144, 38148, 0, + 32768, 36864, 37888, 38144, 38148, 0, 32768, 36864, + 37888, 38144, 38152, 38150, 0, 32768, 36864, 37888, + 38144, 0, 32768, 36864, 37888, 38144, 38152, 0, + 32768, 36864, 37888, 38144, 38152, 0, 32768, 36864, + 37888, 38144, 38152, 38154, 0, 32768, 36864, 37888, + 38144, 38152, 0, 32768, 36864, 37888, 38144, 38160, + 38156, 0, 32768, 36864, 37888, 38144, 38160, 38156, + 0, 32768, 36864, 37888, 38144, 38160, 38161, 38158, + 0, 32768, 36864, 37888, 38144, 0, 32768, 36864, + 37888, 38144, 38160, 0, 32768, 36864, 37888, 38144, + 38160, 0, 32768, 36864, 37888, 38144, 38160, 38162, + 0, 32768, 36864, 37888, 38144, 38160, 0, 32768, + 36864, 37888, 38144, 38160, 38164, 0, 32768, 36864, + 37888, 38144, 38160, 38164, 0, 32768, 36864, 37888, + 38144, 38160, 38168, 38166, 0, 32768, 36864, 37888, + 38144, 38160, 0, 32768, 36864, 37888, 38144, 38176, + 38168, 0, 32768, 36864, 37888, 38144, 38176, 38168, + 0, 32768, 36864, 37888, 38144, 38176, 38168, 38170, + 0, 32768, 36864, 37888, 38144, 38176, 38168, 0, + 32768, 36864, 37888, 38144, 38176, 38177, 38172, 0, + 32768, 36864, 37888, 38144, 38176, 38177, 38172, 0, + 32768, 36864, 37888, 38144, 38176, 38177, 38172, 38174, + 0, 32768, 36864, 37888, 38144, 0, 32768, 36864, + 37888, 38144, 38176, 0, 32768, 36864, 37888, 38144, + 38176, 0, 32768, 36864, 37888, 38144, 38176, 38178, + 0, 32768, 36864, 37888, 38144, 38176, 0, 32768, + 36864, 37888, 38144, 38176, 38180, 0, 32768, 36864, + 37888, 38144, 38176, 38180, 0, 32768, 36864, 37888, + 38144, 38176, 38184, 38182, 0, 32768, 36864, 37888, + 38144, 38176, 0, 32768, 36864, 37888, 38144, 38176, + 38184, 0, 32768, 36864, 37888, 38144, 38176, 38184, + 0, 32768, 36864, 37888, 38144, 38176, 38184, 38186, + 0, 32768, 36864, 37888, 38144, 38176, 38184, 0, + 32768, 36864, 37888, 38144, 38176, 38192, 38188, 0, + 32768, 36864, 37888, 38144, 38176, 38192, 38188, 0, + 32768, 36864, 37888, 38144, 38176, 38192, 38193, 38190, + 0, 32768, 36864, 37888, 38144, 38176, 0, 32768, + 36864, 37888, 38144, 38208, 38192, 0, 32768, 36864, + 37888, 38144, 38208, 38192, 0, 32768, 36864, 37888, + 38144, 38208, 38192, 38194, 0, 32768, 36864, 37888, + 38144, 38208, 38192, 0, 32768, 36864, 37888, 38144, + 38208, 38192, 38196, 0, 32768, 36864, 37888, 38144, + 38208, 38192, 38196, 0, 32768, 36864, 37888, 38144, + 38208, 38192, 38200, 38198, 0, 32768, 36864, 37888, + 38144, 38208, 38192, 0, 32768, 36864, 37888, 38144, + 38208, 38209, 38200, 0, 32768, 36864, 37888, 38144, + 38208, 38209, 38200, 0, 32768, 36864, 37888, 38144, + 38208, 38209, 38200, 38202, 0, 32768, 36864, 37888, + 38144, 38208, 38209, 38200, 0, 32768, 36864, 37888, + 38144, 38208, 38209, 38200, 38204, 0, 32768, 36864, + 37888, 38144, 38208, 38209, 38211, 38204, 0, 32768, + 36864, 37888, 38144, 38208, 38209, 38211, 38204, 38206, + 0, 32768, 36864, 37888, 38144, 0, 32768, 36864, + 37888, 38144, 38208, 0, 32768, 36864, 37888, 38144, + 38208, 0, 32768, 36864, 37888, 38144, 38208, 38210, + 0, 32768, 36864, 37888, 38144, 38208, 0, 32768, + 36864, 37888, 38144, 38208, 38212, 0, 32768, 36864, + 37888, 38144, 38208, 38212, 0, 32768, 36864, 37888, + 38144, 38208, 38216, 38214, 0, 32768, 36864, 37888, + 38144, 38208, 0, 32768, 36864, 37888, 38144, 38208, + 38216, 0, 32768, 36864, 37888, 38144, 38208, 38216, + 0, 32768, 36864, 37888, 38144, 38208, 38216, 38218, + 0, 32768, 36864, 37888, 38144, 38208, 38216, 0, + 32768, 36864, 37888, 38144, 38208, 38224, 38220, 0, + 32768, 36864, 37888, 38144, 38208, 38224, 38220, 0, + 32768, 36864, 37888, 38144, 38208, 38224, 38225, 38222, + 0, 32768, 36864, 37888, 38144, 38208, 0, 32768, + 36864, 37888, 38144, 38208, 38224, 0, 32768, 36864, + 37888, 38144, 38208, 38224, 0, 32768, 36864, 37888, + 38144, 38208, 38224, 38226, 0, 32768, 36864, 37888, + 38144, 38208, 38224, 0, 32768, 36864, 37888, 38144, + 38208, 38224, 38228, 0, 32768, 36864, 37888, 38144, + 38208, 38224, 38228, 0, 32768, 36864, 37888, 38144, + 38208, 38224, 38232, 38230, 0, 32768, 36864, 37888, + 38144, 38208, 38224, 0, 32768, 36864, 37888, 38144, + 38208, 38240, 38232, 0, 32768, 36864, 37888, 38144, + 38208, 38240, 38232, 0, 32768, 36864, 37888, 38144, + 38208, 38240, 38232, 38234, 0, 32768, 36864, 37888, + 38144, 38208, 38240, 38232, 0, 32768, 36864, 37888, + 38144, 38208, 38240, 38241, 38236, 0, 32768, 36864, + 37888, 38144, 38208, 38240, 38241, 38236, 0, 32768, + 36864, 37888, 38144, 38208, 38240, 38241, 38236, 38238, + 0, 32768, 36864, 37888, 38144, 38208, 0, 32768, + 36864, 37888, 38144, 38272, 38240, 0, 32768, 36864, + 37888, 38144, 38272, 38240, 0, 32768, 36864, 37888, + 38144, 38272, 38240, 38242, 0, 32768, 36864, 37888, + 38144, 38272, 38240, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38244, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38244, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38248, 38246, 0, 32768, 36864, 37888, + 38144, 38272, 38240, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38248, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38248, 0, 32768, 36864, 37888, 38144, + 38272, 38240, 38248, 38250, 0, 32768, 36864, 37888, + 38144, 38272, 38240, 38248, 0, 32768, 36864, 37888, + 38144, 38272, 38240, 38256, 38252, 0, 32768, 36864, + 37888, 38144, 38272, 38240, 38256, 38252, 0, 32768, + 36864, 37888, 38144, 38272, 38240, 38256, 38257, 38254, + 0, 32768, 36864, 37888, 38144, 38272, 38240, 0, + 32768, 36864, 37888, 38144, 38272, 38273, 38256, 0, + 32768, 36864, 37888, 38144, 38272, 38273, 38256, 0, + 32768, 36864, 37888, 38144, 38272, 38273, 38256, 38258, + 0, 32768, 36864, 37888, 38144, 38272, 38273, 38256, + 0, 32768, 36864, 37888, 38144, 38272, 38273, 38256, + 38260, 0, 32768, 36864, 37888, 38144, 38272, 38273, + 38256, 38260, 0, 32768, 36864, 37888, 38144, 38272, + 38273, 38256, 38264, 38262, 0, 32768, 36864, 37888, + 38144, 38272, 38273, 38256, 0, 32768, 36864, 37888, + 38144, 38272, 38273, 38256, 38264, 0, 32768, 36864, + 37888, 38144, 38272, 38273, 38275, 38264, 0, 32768, + 36864, 37888, 38144, 38272, 38273, 38275, 38264, 38266, + 0, 32768, 36864, 37888, 38144, 38272, 38273, 38275, + 38264, 0, 32768, 36864, 37888, 38144, 38272, 38273, + 38275, 38264, 38268, 0, 32768, 36864, 37888, 38144, + 38272, 38273, 38275, 38264, 38268, 0, 32768, 36864, + 37888, 38144, 38272, 38273, 38275, 38264, 38268, 38270, + 0, 32768, 36864, 37888, 38144, 0, 32768, 36864, + 37888, 38400, 38272, 0, 32768, 36864, 37888, 38400, + 38272, 0, 32768, 36864, 37888, 38400, 38272, 38274, + 0, 32768, 36864, 37888, 38400, 38272, 0, 32768, + 36864, 37888, 38400, 38272, 38276, 0, 32768, 36864, + 37888, 38400, 38272, 38276, 0, 32768, 36864, 37888, + 38400, 38272, 38280, 38278, 0, 32768, 36864, 37888, + 38400, 38272, 0, 32768, 36864, 37888, 38400, 38272, + 38280, 0, 32768, 36864, 37888, 38400, 38272, 38280, + 0, 32768, 36864, 37888, 38400, 38272, 38280, 38282, + 0, 32768, 36864, 37888, 38400, 38272, 38280, 0, + 32768, 36864, 37888, 38400, 38272, 38288, 38284, 0, + 32768, 36864, 37888, 38400, 38272, 38288, 38284, 0, + 32768, 36864, 37888, 38400, 38272, 38288, 38289, 38286, + 0, 32768, 36864, 37888, 38400, 38272, 0, 32768, + 36864, 37888, 38400, 38272, 38288, 0, 32768, 36864, + 37888, 38400, 38272, 38288, 0, 32768, 36864, 37888, + 38400, 38272, 38288, 38290, 0, 32768, 36864, 37888, + 38400, 38272, 38288, 0, 32768, 36864, 37888, 38400, + 38272, 38288, 38292, 0, 32768, 36864, 37888, 38400, + 38272, 38288, 38292, 0, 32768, 36864, 37888, 38400, + 38272, 38288, 38296, 38294, 0, 32768, 36864, 37888, + 38400, 38272, 38288, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38296, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38296, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38296, 38298, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 38296, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 38305, 38300, 0, 32768, 36864, + 37888, 38400, 38272, 38304, 38305, 38300, 0, 32768, + 36864, 37888, 38400, 38272, 38304, 38305, 38300, 38302, + 0, 32768, 36864, 37888, 38400, 38272, 0, 32768, + 36864, 37888, 38400, 38272, 38304, 0, 32768, 36864, + 37888, 38400, 38272, 38304, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 38306, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38308, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38308, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38312, 38310, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38312, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38312, 0, 32768, 36864, 37888, 38400, + 38272, 38304, 38312, 38314, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 38312, 0, 32768, 36864, 37888, + 38400, 38272, 38304, 38320, 38316, 0, 32768, 36864, + 37888, 38400, 38272, 38304, 38320, 38316, 0, 32768, + 36864, 37888, 38400, 38272, 38304, 38320, 38321, 38318, + 0, 32768, 36864, 37888, 38400, 38272, 38304, 0, + 32768, 36864, 37888, 38400, 38272, 38336, 38320, 0, + 32768, 36864, 37888, 38400, 38272, 38336, 38320, 0, + 32768, 36864, 37888, 38400, 38272, 38336, 38320, 38322, + 0, 32768, 36864, 37888, 38400, 38272, 38336, 38320, + 0, 32768, 36864, 37888, 38400, 38272, 38336, 38320, + 38324, 0, 32768, 36864, 37888, 38400, 38272, 38336, + 38320, 38324, 0, 32768, 36864, 37888, 38400, 38272, + 38336, 38320, 38328, 38326, 0, 32768, 36864, 37888, + 38400, 38272, 38336, 38320, 0, 32768, 36864, 37888, + 38400, 38272, 38336, 38337, 38328, 0, 32768, 36864, + 37888, 38400, 38272, 38336, 38337, 38328, 0, 32768, + 36864, 37888, 38400, 38272, 38336, 38337, 38328, 38330, + 0, 32768, 36864, 37888, 38400, 38272, 38336, 38337, + 38328, 0, 32768, 36864, 37888, 38400, 38272, 38336, + 38337, 38328, 38332, 0, 32768, 36864, 37888, 38400, + 38272, 38336, 38337, 38339, 38332, 0, 32768, 36864, + 37888, 38400, 38272, 38336, 38337, 38339, 38332, 38334, + 0, 32768, 36864, 37888, 38400, 38272, 0, 32768, + 36864, 37888, 38400, 38401, 38336, 0, 32768, 36864, + 37888, 38400, 38401, 38336, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 38338, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38340, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38340, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38344, 38342, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38344, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38344, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38344, 38346, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 38344, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 38352, 38348, 0, 32768, 36864, + 37888, 38400, 38401, 38336, 38352, 38348, 0, 32768, + 36864, 37888, 38400, 38401, 38336, 38352, 38353, 38350, + 0, 32768, 36864, 37888, 38400, 38401, 38336, 0, + 32768, 36864, 37888, 38400, 38401, 38336, 38352, 0, + 32768, 36864, 37888, 38400, 38401, 38336, 38352, 0, + 32768, 36864, 37888, 38400, 38401, 38336, 38352, 38354, + 0, 32768, 36864, 37888, 38400, 38401, 38336, 38352, + 0, 32768, 36864, 37888, 38400, 38401, 38336, 38352, + 38356, 0, 32768, 36864, 37888, 38400, 38401, 38336, + 38352, 38356, 0, 32768, 36864, 37888, 38400, 38401, + 38336, 38352, 38360, 38358, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 38352, 0, 32768, 36864, 37888, + 38400, 38401, 38336, 38368, 38360, 0, 32768, 36864, + 37888, 38400, 38401, 38336, 38368, 38360, 0, 32768, + 36864, 37888, 38400, 38401, 38336, 38368, 38360, 38362, + 0, 32768, 36864, 37888, 38400, 38401, 38336, 38368, + 38360, 0, 32768, 36864, 37888, 38400, 38401, 38336, + 38368, 38369, 38364, 0, 32768, 36864, 37888, 38400, + 38401, 38336, 38368, 38369, 38364, 0, 32768, 36864, + 37888, 38400, 38401, 38336, 38368, 38369, 38364, 38366, + 0, 32768, 36864, 37888, 38400, 38401, 38336, 0, + 32768, 36864, 37888, 38400, 38401, 38336, 38368, 0, + 32768, 36864, 37888, 38400, 38401, 38403, 38368, 0, + 32768, 36864, 37888, 38400, 38401, 38403, 38368, 38370, + 0, 32768, 36864, 37888, 38400, 38401, 38403, 38368, + 0, 32768, 36864, 37888, 38400, 38401, 38403, 38368, + 38372, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38368, 38372, 0, 32768, 36864, 37888, 38400, 38401, + 38403, 38368, 38376, 38374, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38368, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38368, 38376, 0, 32768, 36864, + 37888, 38400, 38401, 38403, 38368, 38376, 0, 32768, + 36864, 37888, 38400, 38401, 38403, 38368, 38376, 38378, + 0, 32768, 36864, 37888, 38400, 38401, 38403, 38368, + 38376, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38368, 38384, 38380, 0, 32768, 36864, 37888, 38400, + 38401, 38403, 38368, 38384, 38380, 0, 32768, 36864, + 37888, 38400, 38401, 38403, 38368, 38384, 38385, 38382, + 0, 32768, 36864, 37888, 38400, 38401, 38403, 38368, + 0, 32768, 36864, 37888, 38400, 38401, 38403, 38368, + 38384, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38368, 38384, 0, 32768, 36864, 37888, 38400, 38401, + 38403, 38368, 38384, 38386, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38407, 38384, 0, 32768, 36864, + 37888, 38400, 38401, 38403, 38407, 38384, 38388, 0, + 32768, 36864, 37888, 38400, 38401, 38403, 38407, 38384, + 38388, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38407, 38384, 38392, 38390, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38407, 38384, 0, 32768, 36864, + 37888, 38400, 38401, 38403, 38407, 38384, 38392, 0, + 32768, 36864, 37888, 38400, 38401, 38403, 38407, 38384, + 38392, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38407, 38384, 38392, 38394, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38407, 38384, 38392, 0, 32768, + 36864, 37888, 38400, 38401, 38403, 38407, 38384, 38392, + 38396, 0, 32768, 36864, 37888, 38400, 38401, 38403, + 38407, 38384, 38392, 38396, 0, 32768, 36864, 37888, + 38400, 38401, 38403, 38407, 38384, 38392, 38396, 38398, + 0, 32768, 36864, 37888, 0, 32768, 36864, 38912, + 38400, 0, 32768, 36864, 38912, 38400, 0, 32768, + 36864, 38912, 38400, 38402, 0, 32768, 36864, 38912, + 38400, 0, 32768, 36864, 38912, 38400, 38404, 0, + 32768, 36864, 38912, 38400, 38404, 0, 32768, 36864, + 38912, 38400, 38408, 38406, 0, 32768, 36864, 38912, + 38400, 0, 32768, 36864, 38912, 38400, 38408, 0, + 32768, 36864, 38912, 38400, 38408, 0, 32768, 36864, + 38912, 38400, 38408, 38410, 0, 32768, 36864, 38912, + 38400, 38408, 0, 32768, 36864, 38912, 38400, 38416, + 38412, 0, 32768, 36864, 38912, 38400, 38416, 38412, + 0, 32768, 36864, 38912, 38400, 38416, 38417, 38414, + 0, 32768, 36864, 38912, 38400, 0, 32768, 36864, + 38912, 38400, 38416, 0, 32768, 36864, 38912, 38400, + 38416, 0, 32768, 36864, 38912, 38400, 38416, 38418, + 0, 32768, 36864, 38912, 38400, 38416, 0, 32768, + 36864, 38912, 38400, 38416, 38420, 0, 32768, 36864, + 38912, 38400, 38416, 38420, 0, 32768, 36864, 38912, + 38400, 38416, 38424, 38422, 0, 32768, 36864, 38912, + 38400, 38416, 0, 32768, 36864, 38912, 38400, 38432, + 38424, 0, 32768, 36864, 38912, 38400, 38432, 38424, + 0, 32768, 36864, 38912, 38400, 38432, 38424, 38426, + 0, 32768, 36864, 38912, 38400, 38432, 38424, 0, + 32768, 36864, 38912, 38400, 38432, 38433, 38428, 0, + 32768, 36864, 38912, 38400, 38432, 38433, 38428, 0, + 32768, 36864, 38912, 38400, 38432, 38433, 38428, 38430, + 0, 32768, 36864, 38912, 38400, 0, 32768, 36864, + 38912, 38400, 38432, 0, 32768, 36864, 38912, 38400, + 38432, 0, 32768, 36864, 38912, 38400, 38432, 38434, + 0, 32768, 36864, 38912, 38400, 38432, 0, 32768, + 36864, 38912, 38400, 38432, 38436, 0, 32768, 36864, + 38912, 38400, 38432, 38436, 0, 32768, 36864, 38912, + 38400, 38432, 38440, 38438, 0, 32768, 36864, 38912, + 38400, 38432, 0, 32768, 36864, 38912, 38400, 38432, + 38440, 0, 32768, 36864, 38912, 38400, 38432, 38440, + 0, 32768, 36864, 38912, 38400, 38432, 38440, 38442, + 0, 32768, 36864, 38912, 38400, 38432, 38440, 0, + 32768, 36864, 38912, 38400, 38432, 38448, 38444, 0, + 32768, 36864, 38912, 38400, 38432, 38448, 38444, 0, + 32768, 36864, 38912, 38400, 38432, 38448, 38449, 38446, + 0, 32768, 36864, 38912, 38400, 38432, 0, 32768, + 36864, 38912, 38400, 38464, 38448, 0, 32768, 36864, + 38912, 38400, 38464, 38448, 0, 32768, 36864, 38912, + 38400, 38464, 38448, 38450, 0, 32768, 36864, 38912, + 38400, 38464, 38448, 0, 32768, 36864, 38912, 38400, + 38464, 38448, 38452, 0, 32768, 36864, 38912, 38400, + 38464, 38448, 38452, 0, 32768, 36864, 38912, 38400, + 38464, 38448, 38456, 38454, 0, 32768, 36864, 38912, + 38400, 38464, 38448, 0, 32768, 36864, 38912, 38400, + 38464, 38465, 38456, 0, 32768, 36864, 38912, 38400, + 38464, 38465, 38456, 0, 32768, 36864, 38912, 38400, + 38464, 38465, 38456, 38458, 0, 32768, 36864, 38912, + 38400, 38464, 38465, 38456, 0, 32768, 36864, 38912, + 38400, 38464, 38465, 38456, 38460, 0, 32768, 36864, + 38912, 38400, 38464, 38465, 38467, 38460, 0, 32768, + 36864, 38912, 38400, 38464, 38465, 38467, 38460, 38462, + 0, 32768, 36864, 38912, 38400, 0, 32768, 36864, + 38912, 38400, 38464, 0, 32768, 36864, 38912, 38400, + 38464, 0, 32768, 36864, 38912, 38400, 38464, 38466, + 0, 32768, 36864, 38912, 38400, 38464, 0, 32768, + 36864, 38912, 38400, 38464, 38468, 0, 32768, 36864, + 38912, 38400, 38464, 38468, 0, 32768, 36864, 38912, + 38400, 38464, 38472, 38470, 0, 32768, 36864, 38912, + 38400, 38464, 0, 32768, 36864, 38912, 38400, 38464, + 38472, 0, 32768, 36864, 38912, 38400, 38464, 38472, + 0, 32768, 36864, 38912, 38400, 38464, 38472, 38474, + 0, 32768, 36864, 38912, 38400, 38464, 38472, 0, + 32768, 36864, 38912, 38400, 38464, 38480, 38476, 0, + 32768, 36864, 38912, 38400, 38464, 38480, 38476, 0, + 32768, 36864, 38912, 38400, 38464, 38480, 38481, 38478, + 0, 32768, 36864, 38912, 38400, 38464, 0, 32768, + 36864, 38912, 38400, 38464, 38480, 0, 32768, 36864, + 38912, 38400, 38464, 38480, 0, 32768, 36864, 38912, + 38400, 38464, 38480, 38482, 0, 32768, 36864, 38912, + 38400, 38464, 38480, 0, 32768, 36864, 38912, 38400, + 38464, 38480, 38484, 0, 32768, 36864, 38912, 38400, + 38464, 38480, 38484, 0, 32768, 36864, 38912, 38400, + 38464, 38480, 38488, 38486, 0, 32768, 36864, 38912, + 38400, 38464, 38480, 0, 32768, 36864, 38912, 38400, + 38464, 38496, 38488, 0, 32768, 36864, 38912, 38400, + 38464, 38496, 38488, 0, 32768, 36864, 38912, 38400, + 38464, 38496, 38488, 38490, 0, 32768, 36864, 38912, + 38400, 38464, 38496, 38488, 0, 32768, 36864, 38912, + 38400, 38464, 38496, 38497, 38492, 0, 32768, 36864, + 38912, 38400, 38464, 38496, 38497, 38492, 0, 32768, + 36864, 38912, 38400, 38464, 38496, 38497, 38492, 38494, + 0, 32768, 36864, 38912, 38400, 38464, 0, 32768, + 36864, 38912, 38400, 38528, 38496, 0, 32768, 36864, + 38912, 38400, 38528, 38496, 0, 32768, 36864, 38912, + 38400, 38528, 38496, 38498, 0, 32768, 36864, 38912, + 38400, 38528, 38496, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38500, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38500, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38504, 38502, 0, 32768, 36864, 38912, + 38400, 38528, 38496, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38504, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38504, 0, 32768, 36864, 38912, 38400, + 38528, 38496, 38504, 38506, 0, 32768, 36864, 38912, + 38400, 38528, 38496, 38504, 0, 32768, 36864, 38912, + 38400, 38528, 38496, 38512, 38508, 0, 32768, 36864, + 38912, 38400, 38528, 38496, 38512, 38508, 0, 32768, + 36864, 38912, 38400, 38528, 38496, 38512, 38513, 38510, + 0, 32768, 36864, 38912, 38400, 38528, 38496, 0, + 32768, 36864, 38912, 38400, 38528, 38529, 38512, 0, + 32768, 36864, 38912, 38400, 38528, 38529, 38512, 0, + 32768, 36864, 38912, 38400, 38528, 38529, 38512, 38514, + 0, 32768, 36864, 38912, 38400, 38528, 38529, 38512, + 0, 32768, 36864, 38912, 38400, 38528, 38529, 38512, + 38516, 0, 32768, 36864, 38912, 38400, 38528, 38529, + 38512, 38516, 0, 32768, 36864, 38912, 38400, 38528, + 38529, 38512, 38520, 38518, 0, 32768, 36864, 38912, + 38400, 38528, 38529, 38512, 0, 32768, 36864, 38912, + 38400, 38528, 38529, 38512, 38520, 0, 32768, 36864, + 38912, 38400, 38528, 38529, 38531, 38520, 0, 32768, + 36864, 38912, 38400, 38528, 38529, 38531, 38520, 38522, + 0, 32768, 36864, 38912, 38400, 38528, 38529, 38531, + 38520, 0, 32768, 36864, 38912, 38400, 38528, 38529, + 38531, 38520, 38524, 0, 32768, 36864, 38912, 38400, + 38528, 38529, 38531, 38520, 38524, 0, 32768, 36864, + 38912, 38400, 38528, 38529, 38531, 38520, 38524, 38526, + 0, 32768, 36864, 38912, 38400, 0, 32768, 36864, + 38912, 38400, 38528, 0, 32768, 36864, 38912, 38400, + 38528, 0, 32768, 36864, 38912, 38400, 38528, 38530, + 0, 32768, 36864, 38912, 38400, 38528, 0, 32768, + 36864, 38912, 38400, 38528, 38532, 0, 32768, 36864, + 38912, 38400, 38528, 38532, 0, 32768, 36864, 38912, + 38400, 38528, 38536, 38534, 0, 32768, 36864, 38912, + 38400, 38528, 0, 32768, 36864, 38912, 38400, 38528, + 38536, 0, 32768, 36864, 38912, 38400, 38528, 38536, + 0, 32768, 36864, 38912, 38400, 38528, 38536, 38538, + 0, 32768, 36864, 38912, 38400, 38528, 38536, 0, + 32768, 36864, 38912, 38400, 38528, 38544, 38540, 0, + 32768, 36864, 38912, 38400, 38528, 38544, 38540, 0, + 32768, 36864, 38912, 38400, 38528, 38544, 38545, 38542, + 0, 32768, 36864, 38912, 38400, 38528, 0, 32768, + 36864, 38912, 38400, 38528, 38544, 0, 32768, 36864, + 38912, 38400, 38528, 38544, 0, 32768, 36864, 38912, + 38400, 38528, 38544, 38546, 0, 32768, 36864, 38912, + 38400, 38528, 38544, 0, 32768, 36864, 38912, 38400, + 38528, 38544, 38548, 0, 32768, 36864, 38912, 38400, + 38528, 38544, 38548, 0, 32768, 36864, 38912, 38400, + 38528, 38544, 38552, 38550, 0, 32768, 36864, 38912, + 38400, 38528, 38544, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38552, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38552, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38552, 38554, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 38552, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 38561, 38556, 0, 32768, 36864, + 38912, 38400, 38528, 38560, 38561, 38556, 0, 32768, + 36864, 38912, 38400, 38528, 38560, 38561, 38556, 38558, + 0, 32768, 36864, 38912, 38400, 38528, 0, 32768, + 36864, 38912, 38400, 38528, 38560, 0, 32768, 36864, + 38912, 38400, 38528, 38560, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 38562, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38564, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38564, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38568, 38566, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38568, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38568, 0, 32768, 36864, 38912, 38400, + 38528, 38560, 38568, 38570, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 38568, 0, 32768, 36864, 38912, + 38400, 38528, 38560, 38576, 38572, 0, 32768, 36864, + 38912, 38400, 38528, 38560, 38576, 38572, 0, 32768, + 36864, 38912, 38400, 38528, 38560, 38576, 38577, 38574, + 0, 32768, 36864, 38912, 38400, 38528, 38560, 0, + 32768, 36864, 38912, 38400, 38528, 38592, 38576, 0, + 32768, 36864, 38912, 38400, 38528, 38592, 38576, 0, + 32768, 36864, 38912, 38400, 38528, 38592, 38576, 38578, + 0, 32768, 36864, 38912, 38400, 38528, 38592, 38576, + 0, 32768, 36864, 38912, 38400, 38528, 38592, 38576, + 38580, 0, 32768, 36864, 38912, 38400, 38528, 38592, + 38576, 38580, 0, 32768, 36864, 38912, 38400, 38528, + 38592, 38576, 38584, 38582, 0, 32768, 36864, 38912, + 38400, 38528, 38592, 38576, 0, 32768, 36864, 38912, + 38400, 38528, 38592, 38593, 38584, 0, 32768, 36864, + 38912, 38400, 38528, 38592, 38593, 38584, 0, 32768, + 36864, 38912, 38400, 38528, 38592, 38593, 38584, 38586, + 0, 32768, 36864, 38912, 38400, 38528, 38592, 38593, + 38584, 0, 32768, 36864, 38912, 38400, 38528, 38592, + 38593, 38584, 38588, 0, 32768, 36864, 38912, 38400, + 38528, 38592, 38593, 38595, 38588, 0, 32768, 36864, + 38912, 38400, 38528, 38592, 38593, 38595, 38588, 38590, + 0, 32768, 36864, 38912, 38400, 38528, 0, 32768, + 36864, 38912, 38400, 38656, 38592, 0, 32768, 36864, + 38912, 38400, 38656, 38592, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 38594, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38596, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38596, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38600, 38598, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38600, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38600, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38600, 38602, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 38600, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 38608, 38604, 0, 32768, 36864, + 38912, 38400, 38656, 38592, 38608, 38604, 0, 32768, + 36864, 38912, 38400, 38656, 38592, 38608, 38609, 38606, + 0, 32768, 36864, 38912, 38400, 38656, 38592, 0, + 32768, 36864, 38912, 38400, 38656, 38592, 38608, 0, + 32768, 36864, 38912, 38400, 38656, 38592, 38608, 0, + 32768, 36864, 38912, 38400, 38656, 38592, 38608, 38610, + 0, 32768, 36864, 38912, 38400, 38656, 38592, 38608, + 0, 32768, 36864, 38912, 38400, 38656, 38592, 38608, + 38612, 0, 32768, 36864, 38912, 38400, 38656, 38592, + 38608, 38612, 0, 32768, 36864, 38912, 38400, 38656, + 38592, 38608, 38616, 38614, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 38608, 0, 32768, 36864, 38912, + 38400, 38656, 38592, 38624, 38616, 0, 32768, 36864, + 38912, 38400, 38656, 38592, 38624, 38616, 0, 32768, + 36864, 38912, 38400, 38656, 38592, 38624, 38616, 38618, + 0, 32768, 36864, 38912, 38400, 38656, 38592, 38624, + 38616, 0, 32768, 36864, 38912, 38400, 38656, 38592, + 38624, 38625, 38620, 0, 32768, 36864, 38912, 38400, + 38656, 38592, 38624, 38625, 38620, 0, 32768, 36864, + 38912, 38400, 38656, 38592, 38624, 38625, 38620, 38622, + 0, 32768, 36864, 38912, 38400, 38656, 38592, 0, + 32768, 36864, 38912, 38400, 38656, 38657, 38624, 0, + 32768, 36864, 38912, 38400, 38656, 38657, 38624, 0, + 32768, 36864, 38912, 38400, 38656, 38657, 38624, 38626, + 0, 32768, 36864, 38912, 38400, 38656, 38657, 38624, + 0, 32768, 36864, 38912, 38400, 38656, 38657, 38624, + 38628, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38624, 38628, 0, 32768, 36864, 38912, 38400, 38656, + 38657, 38624, 38632, 38630, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38624, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38624, 38632, 0, 32768, 36864, + 38912, 38400, 38656, 38657, 38624, 38632, 0, 32768, + 36864, 38912, 38400, 38656, 38657, 38624, 38632, 38634, + 0, 32768, 36864, 38912, 38400, 38656, 38657, 38624, + 38632, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38624, 38640, 38636, 0, 32768, 36864, 38912, 38400, + 38656, 38657, 38624, 38640, 38636, 0, 32768, 36864, + 38912, 38400, 38656, 38657, 38624, 38640, 38641, 38638, + 0, 32768, 36864, 38912, 38400, 38656, 38657, 38624, + 0, 32768, 36864, 38912, 38400, 38656, 38657, 38624, + 38640, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38659, 38640, 0, 32768, 36864, 38912, 38400, 38656, + 38657, 38659, 38640, 38642, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38659, 38640, 0, 32768, 36864, + 38912, 38400, 38656, 38657, 38659, 38640, 38644, 0, + 32768, 36864, 38912, 38400, 38656, 38657, 38659, 38640, + 38644, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38659, 38640, 38648, 38646, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38659, 38640, 0, 32768, 36864, + 38912, 38400, 38656, 38657, 38659, 38640, 38648, 0, + 32768, 36864, 38912, 38400, 38656, 38657, 38659, 38640, + 38648, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38659, 38640, 38648, 38650, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38659, 38663, 38648, 0, 32768, + 36864, 38912, 38400, 38656, 38657, 38659, 38663, 38648, + 38652, 0, 32768, 36864, 38912, 38400, 38656, 38657, + 38659, 38663, 38648, 38652, 0, 32768, 36864, 38912, + 38400, 38656, 38657, 38659, 38663, 38648, 38652, 38654, + 0, 32768, 36864, 38912, 38400, 0, 32768, 36864, + 38912, 38400, 38656, 0, 32768, 36864, 38912, 38913, + 38656, 0, 32768, 36864, 38912, 38913, 38656, 38658, + 0, 32768, 36864, 38912, 38913, 38656, 0, 32768, + 36864, 38912, 38913, 38656, 38660, 0, 32768, 36864, + 38912, 38913, 38656, 38660, 0, 32768, 36864, 38912, + 38913, 38656, 38664, 38662, 0, 32768, 36864, 38912, + 38913, 38656, 0, 32768, 36864, 38912, 38913, 38656, + 38664, 0, 32768, 36864, 38912, 38913, 38656, 38664, + 0, 32768, 36864, 38912, 38913, 38656, 38664, 38666, + 0, 32768, 36864, 38912, 38913, 38656, 38664, 0, + 32768, 36864, 38912, 38913, 38656, 38672, 38668, 0, + 32768, 36864, 38912, 38913, 38656, 38672, 38668, 0, + 32768, 36864, 38912, 38913, 38656, 38672, 38673, 38670, + 0, 32768, 36864, 38912, 38913, 38656, 0, 32768, + 36864, 38912, 38913, 38656, 38672, 0, 32768, 36864, + 38912, 38913, 38656, 38672, 0, 32768, 36864, 38912, + 38913, 38656, 38672, 38674, 0, 32768, 36864, 38912, + 38913, 38656, 38672, 0, 32768, 36864, 38912, 38913, + 38656, 38672, 38676, 0, 32768, 36864, 38912, 38913, + 38656, 38672, 38676, 0, 32768, 36864, 38912, 38913, + 38656, 38672, 38680, 38678, 0, 32768, 36864, 38912, + 38913, 38656, 38672, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38680, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38680, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38680, 38682, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 38680, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 38689, 38684, 0, 32768, 36864, + 38912, 38913, 38656, 38688, 38689, 38684, 0, 32768, + 36864, 38912, 38913, 38656, 38688, 38689, 38684, 38686, + 0, 32768, 36864, 38912, 38913, 38656, 0, 32768, + 36864, 38912, 38913, 38656, 38688, 0, 32768, 36864, + 38912, 38913, 38656, 38688, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 38690, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38692, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38692, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38696, 38694, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38696, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38696, 0, 32768, 36864, 38912, 38913, + 38656, 38688, 38696, 38698, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 38696, 0, 32768, 36864, 38912, + 38913, 38656, 38688, 38704, 38700, 0, 32768, 36864, + 38912, 38913, 38656, 38688, 38704, 38700, 0, 32768, + 36864, 38912, 38913, 38656, 38688, 38704, 38705, 38702, + 0, 32768, 36864, 38912, 38913, 38656, 38688, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38704, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38704, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38704, 38706, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38704, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38704, + 38708, 0, 32768, 36864, 38912, 38913, 38656, 38720, + 38704, 38708, 0, 32768, 36864, 38912, 38913, 38656, + 38720, 38704, 38712, 38710, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38704, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38721, 38712, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 38721, 38712, 0, 32768, + 36864, 38912, 38913, 38656, 38720, 38721, 38712, 38714, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38721, + 38712, 0, 32768, 36864, 38912, 38913, 38656, 38720, + 38721, 38712, 38716, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38721, 38723, 38716, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 38721, 38723, 38716, 38718, + 0, 32768, 36864, 38912, 38913, 38656, 0, 32768, + 36864, 38912, 38913, 38656, 38720, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38722, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38724, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38724, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38728, 38726, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38728, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38728, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38728, 38730, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38728, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38736, 38732, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 38736, 38732, 0, 32768, + 36864, 38912, 38913, 38656, 38720, 38736, 38737, 38734, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38736, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38736, 0, + 32768, 36864, 38912, 38913, 38656, 38720, 38736, 38738, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38736, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38736, + 38740, 0, 32768, 36864, 38912, 38913, 38656, 38720, + 38736, 38740, 0, 32768, 36864, 38912, 38913, 38656, + 38720, 38736, 38744, 38742, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38736, 0, 32768, 36864, 38912, + 38913, 38656, 38720, 38752, 38744, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 38752, 38744, 0, 32768, + 36864, 38912, 38913, 38656, 38720, 38752, 38744, 38746, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 38752, + 38744, 0, 32768, 36864, 38912, 38913, 38656, 38720, + 38752, 38753, 38748, 0, 32768, 36864, 38912, 38913, + 38656, 38720, 38752, 38753, 38748, 0, 32768, 36864, + 38912, 38913, 38656, 38720, 38752, 38753, 38748, 38750, + 0, 32768, 36864, 38912, 38913, 38656, 38720, 0, + 32768, 36864, 38912, 38913, 38656, 38784, 38752, 0, + 32768, 36864, 38912, 38913, 38656, 38784, 38752, 0, + 32768, 36864, 38912, 38913, 38656, 38784, 38752, 38754, + 0, 32768, 36864, 38912, 38913, 38656, 38784, 38752, + 0, 32768, 36864, 38912, 38913, 38656, 38784, 38752, + 38756, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38752, 38756, 0, 32768, 36864, 38912, 38913, 38656, + 38784, 38752, 38760, 38758, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38752, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38752, 38760, 0, 32768, 36864, + 38912, 38913, 38656, 38784, 38752, 38760, 0, 32768, + 36864, 38912, 38913, 38656, 38784, 38752, 38760, 38762, + 0, 32768, 36864, 38912, 38913, 38656, 38784, 38752, + 38760, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38752, 38768, 38764, 0, 32768, 36864, 38912, 38913, + 38656, 38784, 38752, 38768, 38764, 0, 32768, 36864, + 38912, 38913, 38656, 38784, 38752, 38768, 38769, 38766, + 0, 32768, 36864, 38912, 38913, 38656, 38784, 38752, + 0, 32768, 36864, 38912, 38913, 38656, 38784, 38785, + 38768, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38785, 38768, 0, 32768, 36864, 38912, 38913, 38656, + 38784, 38785, 38768, 38770, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38785, 38768, 0, 32768, 36864, + 38912, 38913, 38656, 38784, 38785, 38768, 38772, 0, + 32768, 36864, 38912, 38913, 38656, 38784, 38785, 38768, + 38772, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38785, 38768, 38776, 38774, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38785, 38768, 0, 32768, 36864, + 38912, 38913, 38656, 38784, 38785, 38768, 38776, 0, + 32768, 36864, 38912, 38913, 38656, 38784, 38785, 38787, + 38776, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38785, 38787, 38776, 38778, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38785, 38787, 38776, 0, 32768, + 36864, 38912, 38913, 38656, 38784, 38785, 38787, 38776, + 38780, 0, 32768, 36864, 38912, 38913, 38656, 38784, + 38785, 38787, 38776, 38780, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38785, 38787, 38776, 38780, 38782, + 0, 32768, 36864, 38912, 38913, 38656, 0, 32768, + 36864, 38912, 38913, 38656, 38784, 0, 32768, 36864, + 38912, 38913, 38656, 38784, 0, 32768, 36864, 38912, + 38913, 38656, 38784, 38786, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38788, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38788, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38792, 38790, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38792, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38792, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38792, 38794, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38792, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38800, 38796, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38800, 38796, 0, 32768, + 36864, 38912, 38913, 38915, 38784, 38800, 38801, 38798, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38800, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38800, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38800, 38802, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38800, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38800, + 38804, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38800, 38804, 0, 32768, 36864, 38912, 38913, 38915, + 38784, 38800, 38808, 38806, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38800, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38816, 38808, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38816, 38808, 0, 32768, + 36864, 38912, 38913, 38915, 38784, 38816, 38808, 38810, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38816, + 38808, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38816, 38817, 38812, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38816, 38817, 38812, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38816, 38817, 38812, 38814, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38816, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38816, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38816, 38818, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38816, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38816, + 38820, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38816, 38820, 0, 32768, 36864, 38912, 38913, 38915, + 38784, 38816, 38824, 38822, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38816, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38816, 38824, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38816, 38824, 0, 32768, + 36864, 38912, 38913, 38915, 38784, 38816, 38824, 38826, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38816, + 38824, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38816, 38832, 38828, 0, 32768, 36864, 38912, 38913, + 38915, 38784, 38816, 38832, 38828, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38816, 38832, 38833, 38830, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38816, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38848, + 38832, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38848, 38832, 0, 32768, 36864, 38912, 38913, 38915, + 38784, 38848, 38832, 38834, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38848, 38832, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38848, 38832, 38836, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38848, 38832, + 38836, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38848, 38832, 38840, 38838, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38848, 38832, 0, 32768, 36864, + 38912, 38913, 38915, 38784, 38848, 38849, 38840, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38848, 38849, + 38840, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38848, 38849, 38840, 38842, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38848, 38849, 38840, 0, 32768, + 36864, 38912, 38913, 38915, 38784, 38848, 38849, 38840, + 38844, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38848, 38849, 38851, 38844, 0, 32768, 36864, 38912, + 38913, 38915, 38784, 38848, 38849, 38851, 38844, 38846, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38848, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38848, 0, + 32768, 36864, 38912, 38913, 38915, 38784, 38848, 38850, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38848, + 0, 32768, 36864, 38912, 38913, 38915, 38784, 38848, + 38852, 0, 32768, 36864, 38912, 38913, 38915, 38784, + 38848, 38852, 0, 32768, 36864, 38912, 38913, 38915, + 38784, 38848, 38856, 38854, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38856, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38856, 0, 32768, + 36864, 38912, 38913, 38915, 38919, 38848, 38856, 38858, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38848, + 38856, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38864, 38860, 0, 32768, 36864, 38912, 38913, + 38915, 38919, 38848, 38864, 38860, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38864, 38865, 38862, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38848, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38848, + 38864, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38864, 0, 32768, 36864, 38912, 38913, 38915, + 38919, 38848, 38864, 38866, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38864, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38864, 38868, 0, + 32768, 36864, 38912, 38913, 38915, 38919, 38848, 38864, + 38868, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38864, 38872, 38870, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38864, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38880, 38872, 0, + 32768, 36864, 38912, 38913, 38915, 38919, 38848, 38880, + 38872, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 38872, 38874, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 38872, 0, 32768, + 36864, 38912, 38913, 38915, 38919, 38848, 38880, 38881, + 38876, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 38881, 38876, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 38881, 38876, 38878, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38848, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38848, + 38880, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 0, 32768, 36864, 38912, 38913, 38915, + 38919, 38848, 38880, 38882, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38880, 38884, 0, + 32768, 36864, 38912, 38913, 38915, 38919, 38848, 38880, + 38884, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 38888, 38886, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38848, 38880, 38888, 0, + 32768, 36864, 38912, 38913, 38915, 38919, 38848, 38880, + 38888, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 38888, 38890, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 38888, 0, 32768, + 36864, 38912, 38913, 38915, 38919, 38848, 38880, 38896, + 38892, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38848, 38880, 38896, 38892, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38848, 38880, 38896, 38897, 38894, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38927, + 38880, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38927, 38880, 38896, 0, 32768, 36864, 38912, 38913, + 38915, 38919, 38927, 38880, 38896, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38927, 38880, 38896, 38898, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38927, + 38880, 38896, 0, 32768, 36864, 38912, 38913, 38915, + 38919, 38927, 38880, 38896, 38900, 0, 32768, 36864, + 38912, 38913, 38915, 38919, 38927, 38880, 38896, 38900, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38927, + 38880, 38896, 38904, 38902, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38927, 38880, 38896, 0, 32768, + 36864, 38912, 38913, 38915, 38919, 38927, 38880, 38896, + 38904, 0, 32768, 36864, 38912, 38913, 38915, 38919, + 38927, 38880, 38896, 38904, 0, 32768, 36864, 38912, + 38913, 38915, 38919, 38927, 38880, 38896, 38904, 38906, + 0, 32768, 36864, 38912, 38913, 38915, 38919, 38927, + 38880, 38896, 38904, 0, 32768, 36864, 38912, 38913, + 38915, 38919, 38927, 38880, 38896, 38904, 38908, 0, + 32768, 36864, 38912, 38913, 38915, 38919, 38927, 38880, + 38896, 38904, 38908, 0, 32768, 36864, 38912, 38913, + 38915, 38919, 38927, 38880, 38896, 38904, 38908, 38910, + 0, 32768, 36864, 0, 32768, 36864, 38912, 0, + 32768, 36864, 38912, 0, 32768, 36864, 38912, 38914, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 38916, 0, 32768, 36864, 38912, 38916, 0, 32768, + 36864, 38912, 38920, 38918, 0, 32768, 36864, 38912, + 0, 32768, 36864, 38912, 38920, 0, 32768, 36864, + 38912, 38920, 0, 32768, 36864, 38912, 38920, 38922, + 0, 32768, 36864, 38912, 38920, 0, 32768, 36864, + 38912, 38928, 38924, 0, 32768, 36864, 38912, 38928, + 38924, 0, 32768, 36864, 38912, 38928, 38929, 38926, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 38928, 0, 32768, 36864, 38912, 38928, 0, 32768, + 36864, 38912, 38928, 38930, 0, 32768, 36864, 38912, + 38928, 0, 32768, 36864, 38912, 38928, 38932, 0, + 32768, 36864, 38912, 38928, 38932, 0, 32768, 36864, + 38912, 38928, 38936, 38934, 0, 32768, 36864, 38912, + 38928, 0, 32768, 36864, 38912, 38944, 38936, 0, + 32768, 36864, 38912, 38944, 38936, 0, 32768, 36864, + 38912, 38944, 38936, 38938, 0, 32768, 36864, 38912, + 38944, 38936, 0, 32768, 36864, 38912, 38944, 38945, + 38940, 0, 32768, 36864, 38912, 38944, 38945, 38940, + 0, 32768, 36864, 38912, 38944, 38945, 38940, 38942, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 38944, 0, 32768, 36864, 38912, 38944, 0, 32768, + 36864, 38912, 38944, 38946, 0, 32768, 36864, 38912, + 38944, 0, 32768, 36864, 38912, 38944, 38948, 0, + 32768, 36864, 38912, 38944, 38948, 0, 32768, 36864, + 38912, 38944, 38952, 38950, 0, 32768, 36864, 38912, + 38944, 0, 32768, 36864, 38912, 38944, 38952, 0, + 32768, 36864, 38912, 38944, 38952, 0, 32768, 36864, + 38912, 38944, 38952, 38954, 0, 32768, 36864, 38912, + 38944, 38952, 0, 32768, 36864, 38912, 38944, 38960, + 38956, 0, 32768, 36864, 38912, 38944, 38960, 38956, + 0, 32768, 36864, 38912, 38944, 38960, 38961, 38958, + 0, 32768, 36864, 38912, 38944, 0, 32768, 36864, + 38912, 38976, 38960, 0, 32768, 36864, 38912, 38976, + 38960, 0, 32768, 36864, 38912, 38976, 38960, 38962, + 0, 32768, 36864, 38912, 38976, 38960, 0, 32768, + 36864, 38912, 38976, 38960, 38964, 0, 32768, 36864, + 38912, 38976, 38960, 38964, 0, 32768, 36864, 38912, + 38976, 38960, 38968, 38966, 0, 32768, 36864, 38912, + 38976, 38960, 0, 32768, 36864, 38912, 38976, 38977, + 38968, 0, 32768, 36864, 38912, 38976, 38977, 38968, + 0, 32768, 36864, 38912, 38976, 38977, 38968, 38970, + 0, 32768, 36864, 38912, 38976, 38977, 38968, 0, + 32768, 36864, 38912, 38976, 38977, 38968, 38972, 0, + 32768, 36864, 38912, 38976, 38977, 38979, 38972, 0, + 32768, 36864, 38912, 38976, 38977, 38979, 38972, 38974, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 38976, 0, 32768, 36864, 38912, 38976, 0, 32768, + 36864, 38912, 38976, 38978, 0, 32768, 36864, 38912, + 38976, 0, 32768, 36864, 38912, 38976, 38980, 0, + 32768, 36864, 38912, 38976, 38980, 0, 32768, 36864, + 38912, 38976, 38984, 38982, 0, 32768, 36864, 38912, + 38976, 0, 32768, 36864, 38912, 38976, 38984, 0, + 32768, 36864, 38912, 38976, 38984, 0, 32768, 36864, + 38912, 38976, 38984, 38986, 0, 32768, 36864, 38912, + 38976, 38984, 0, 32768, 36864, 38912, 38976, 38992, + 38988, 0, 32768, 36864, 38912, 38976, 38992, 38988, + 0, 32768, 36864, 38912, 38976, 38992, 38993, 38990, + 0, 32768, 36864, 38912, 38976, 0, 32768, 36864, + 38912, 38976, 38992, 0, 32768, 36864, 38912, 38976, + 38992, 0, 32768, 36864, 38912, 38976, 38992, 38994, + 0, 32768, 36864, 38912, 38976, 38992, 0, 32768, + 36864, 38912, 38976, 38992, 38996, 0, 32768, 36864, + 38912, 38976, 38992, 38996, 0, 32768, 36864, 38912, + 38976, 38992, 39000, 38998, 0, 32768, 36864, 38912, + 38976, 38992, 0, 32768, 36864, 38912, 38976, 39008, + 39000, 0, 32768, 36864, 38912, 38976, 39008, 39000, + 0, 32768, 36864, 38912, 38976, 39008, 39000, 39002, + 0, 32768, 36864, 38912, 38976, 39008, 39000, 0, + 32768, 36864, 38912, 38976, 39008, 39009, 39004, 0, + 32768, 36864, 38912, 38976, 39008, 39009, 39004, 0, + 32768, 36864, 38912, 38976, 39008, 39009, 39004, 39006, + 0, 32768, 36864, 38912, 38976, 0, 32768, 36864, + 38912, 39040, 39008, 0, 32768, 36864, 38912, 39040, + 39008, 0, 32768, 36864, 38912, 39040, 39008, 39010, + 0, 32768, 36864, 38912, 39040, 39008, 0, 32768, + 36864, 38912, 39040, 39008, 39012, 0, 32768, 36864, + 38912, 39040, 39008, 39012, 0, 32768, 36864, 38912, + 39040, 39008, 39016, 39014, 0, 32768, 36864, 38912, + 39040, 39008, 0, 32768, 36864, 38912, 39040, 39008, + 39016, 0, 32768, 36864, 38912, 39040, 39008, 39016, + 0, 32768, 36864, 38912, 39040, 39008, 39016, 39018, + 0, 32768, 36864, 38912, 39040, 39008, 39016, 0, + 32768, 36864, 38912, 39040, 39008, 39024, 39020, 0, + 32768, 36864, 38912, 39040, 39008, 39024, 39020, 0, + 32768, 36864, 38912, 39040, 39008, 39024, 39025, 39022, + 0, 32768, 36864, 38912, 39040, 39008, 0, 32768, + 36864, 38912, 39040, 39041, 39024, 0, 32768, 36864, + 38912, 39040, 39041, 39024, 0, 32768, 36864, 38912, + 39040, 39041, 39024, 39026, 0, 32768, 36864, 38912, + 39040, 39041, 39024, 0, 32768, 36864, 38912, 39040, + 39041, 39024, 39028, 0, 32768, 36864, 38912, 39040, + 39041, 39024, 39028, 0, 32768, 36864, 38912, 39040, + 39041, 39024, 39032, 39030, 0, 32768, 36864, 38912, + 39040, 39041, 39024, 0, 32768, 36864, 38912, 39040, + 39041, 39024, 39032, 0, 32768, 36864, 38912, 39040, + 39041, 39043, 39032, 0, 32768, 36864, 38912, 39040, + 39041, 39043, 39032, 39034, 0, 32768, 36864, 38912, + 39040, 39041, 39043, 39032, 0, 32768, 36864, 38912, + 39040, 39041, 39043, 39032, 39036, 0, 32768, 36864, + 38912, 39040, 39041, 39043, 39032, 39036, 0, 32768, + 36864, 38912, 39040, 39041, 39043, 39032, 39036, 39038, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 39040, 0, 32768, 36864, 38912, 39040, 0, 32768, + 36864, 38912, 39040, 39042, 0, 32768, 36864, 38912, + 39040, 0, 32768, 36864, 38912, 39040, 39044, 0, + 32768, 36864, 38912, 39040, 39044, 0, 32768, 36864, + 38912, 39040, 39048, 39046, 0, 32768, 36864, 38912, + 39040, 0, 32768, 36864, 38912, 39040, 39048, 0, + 32768, 36864, 38912, 39040, 39048, 0, 32768, 36864, + 38912, 39040, 39048, 39050, 0, 32768, 36864, 38912, + 39040, 39048, 0, 32768, 36864, 38912, 39040, 39056, + 39052, 0, 32768, 36864, 38912, 39040, 39056, 39052, + 0, 32768, 36864, 38912, 39040, 39056, 39057, 39054, + 0, 32768, 36864, 38912, 39040, 0, 32768, 36864, + 38912, 39040, 39056, 0, 32768, 36864, 38912, 39040, + 39056, 0, 32768, 36864, 38912, 39040, 39056, 39058, + 0, 32768, 36864, 38912, 39040, 39056, 0, 32768, + 36864, 38912, 39040, 39056, 39060, 0, 32768, 36864, + 38912, 39040, 39056, 39060, 0, 32768, 36864, 38912, + 39040, 39056, 39064, 39062, 0, 32768, 36864, 38912, + 39040, 39056, 0, 32768, 36864, 38912, 39040, 39072, + 39064, 0, 32768, 36864, 38912, 39040, 39072, 39064, + 0, 32768, 36864, 38912, 39040, 39072, 39064, 39066, + 0, 32768, 36864, 38912, 39040, 39072, 39064, 0, + 32768, 36864, 38912, 39040, 39072, 39073, 39068, 0, + 32768, 36864, 38912, 39040, 39072, 39073, 39068, 0, + 32768, 36864, 38912, 39040, 39072, 39073, 39068, 39070, + 0, 32768, 36864, 38912, 39040, 0, 32768, 36864, + 38912, 39040, 39072, 0, 32768, 36864, 38912, 39040, + 39072, 0, 32768, 36864, 38912, 39040, 39072, 39074, + 0, 32768, 36864, 38912, 39040, 39072, 0, 32768, + 36864, 38912, 39040, 39072, 39076, 0, 32768, 36864, + 38912, 39040, 39072, 39076, 0, 32768, 36864, 38912, + 39040, 39072, 39080, 39078, 0, 32768, 36864, 38912, + 39040, 39072, 0, 32768, 36864, 38912, 39040, 39072, + 39080, 0, 32768, 36864, 38912, 39040, 39072, 39080, + 0, 32768, 36864, 38912, 39040, 39072, 39080, 39082, + 0, 32768, 36864, 38912, 39040, 39072, 39080, 0, + 32768, 36864, 38912, 39040, 39072, 39088, 39084, 0, + 32768, 36864, 38912, 39040, 39072, 39088, 39084, 0, + 32768, 36864, 38912, 39040, 39072, 39088, 39089, 39086, + 0, 32768, 36864, 38912, 39040, 39072, 0, 32768, + 36864, 38912, 39040, 39104, 39088, 0, 32768, 36864, + 38912, 39040, 39104, 39088, 0, 32768, 36864, 38912, + 39040, 39104, 39088, 39090, 0, 32768, 36864, 38912, + 39040, 39104, 39088, 0, 32768, 36864, 38912, 39040, + 39104, 39088, 39092, 0, 32768, 36864, 38912, 39040, + 39104, 39088, 39092, 0, 32768, 36864, 38912, 39040, + 39104, 39088, 39096, 39094, 0, 32768, 36864, 38912, + 39040, 39104, 39088, 0, 32768, 36864, 38912, 39040, + 39104, 39105, 39096, 0, 32768, 36864, 38912, 39040, + 39104, 39105, 39096, 0, 32768, 36864, 38912, 39040, + 39104, 39105, 39096, 39098, 0, 32768, 36864, 38912, + 39040, 39104, 39105, 39096, 0, 32768, 36864, 38912, + 39040, 39104, 39105, 39096, 39100, 0, 32768, 36864, + 38912, 39040, 39104, 39105, 39107, 39100, 0, 32768, + 36864, 38912, 39040, 39104, 39105, 39107, 39100, 39102, + 0, 32768, 36864, 38912, 39040, 0, 32768, 36864, + 38912, 39168, 39104, 0, 32768, 36864, 38912, 39168, + 39104, 0, 32768, 36864, 38912, 39168, 39104, 39106, + 0, 32768, 36864, 38912, 39168, 39104, 0, 32768, + 36864, 38912, 39168, 39104, 39108, 0, 32768, 36864, + 38912, 39168, 39104, 39108, 0, 32768, 36864, 38912, + 39168, 39104, 39112, 39110, 0, 32768, 36864, 38912, + 39168, 39104, 0, 32768, 36864, 38912, 39168, 39104, + 39112, 0, 32768, 36864, 38912, 39168, 39104, 39112, + 0, 32768, 36864, 38912, 39168, 39104, 39112, 39114, + 0, 32768, 36864, 38912, 39168, 39104, 39112, 0, + 32768, 36864, 38912, 39168, 39104, 39120, 39116, 0, + 32768, 36864, 38912, 39168, 39104, 39120, 39116, 0, + 32768, 36864, 38912, 39168, 39104, 39120, 39121, 39118, + 0, 32768, 36864, 38912, 39168, 39104, 0, 32768, + 36864, 38912, 39168, 39104, 39120, 0, 32768, 36864, + 38912, 39168, 39104, 39120, 0, 32768, 36864, 38912, + 39168, 39104, 39120, 39122, 0, 32768, 36864, 38912, + 39168, 39104, 39120, 0, 32768, 36864, 38912, 39168, + 39104, 39120, 39124, 0, 32768, 36864, 38912, 39168, + 39104, 39120, 39124, 0, 32768, 36864, 38912, 39168, + 39104, 39120, 39128, 39126, 0, 32768, 36864, 38912, + 39168, 39104, 39120, 0, 32768, 36864, 38912, 39168, + 39104, 39136, 39128, 0, 32768, 36864, 38912, 39168, + 39104, 39136, 39128, 0, 32768, 36864, 38912, 39168, + 39104, 39136, 39128, 39130, 0, 32768, 36864, 38912, + 39168, 39104, 39136, 39128, 0, 32768, 36864, 38912, + 39168, 39104, 39136, 39137, 39132, 0, 32768, 36864, + 38912, 39168, 39104, 39136, 39137, 39132, 0, 32768, + 36864, 38912, 39168, 39104, 39136, 39137, 39132, 39134, + 0, 32768, 36864, 38912, 39168, 39104, 0, 32768, + 36864, 38912, 39168, 39169, 39136, 0, 32768, 36864, + 38912, 39168, 39169, 39136, 0, 32768, 36864, 38912, + 39168, 39169, 39136, 39138, 0, 32768, 36864, 38912, + 39168, 39169, 39136, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39140, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39140, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39144, 39142, 0, 32768, 36864, 38912, + 39168, 39169, 39136, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39144, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39144, 0, 32768, 36864, 38912, 39168, + 39169, 39136, 39144, 39146, 0, 32768, 36864, 38912, + 39168, 39169, 39136, 39144, 0, 32768, 36864, 38912, + 39168, 39169, 39136, 39152, 39148, 0, 32768, 36864, + 38912, 39168, 39169, 39136, 39152, 39148, 0, 32768, + 36864, 38912, 39168, 39169, 39136, 39152, 39153, 39150, + 0, 32768, 36864, 38912, 39168, 39169, 39136, 0, + 32768, 36864, 38912, 39168, 39169, 39136, 39152, 0, + 32768, 36864, 38912, 39168, 39169, 39171, 39152, 0, + 32768, 36864, 38912, 39168, 39169, 39171, 39152, 39154, + 0, 32768, 36864, 38912, 39168, 39169, 39171, 39152, + 0, 32768, 36864, 38912, 39168, 39169, 39171, 39152, + 39156, 0, 32768, 36864, 38912, 39168, 39169, 39171, + 39152, 39156, 0, 32768, 36864, 38912, 39168, 39169, + 39171, 39152, 39160, 39158, 0, 32768, 36864, 38912, + 39168, 39169, 39171, 39152, 0, 32768, 36864, 38912, + 39168, 39169, 39171, 39152, 39160, 0, 32768, 36864, + 38912, 39168, 39169, 39171, 39152, 39160, 0, 32768, + 36864, 38912, 39168, 39169, 39171, 39152, 39160, 39162, + 0, 32768, 36864, 38912, 39168, 39169, 39171, 39175, + 39160, 0, 32768, 36864, 38912, 39168, 39169, 39171, + 39175, 39160, 39164, 0, 32768, 36864, 38912, 39168, + 39169, 39171, 39175, 39160, 39164, 0, 32768, 36864, + 38912, 39168, 39169, 39171, 39175, 39160, 39164, 39166, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 39168, 0, 32768, 36864, 38912, 39168, 0, 32768, + 36864, 38912, 39168, 39170, 0, 32768, 36864, 38912, + 39168, 0, 32768, 36864, 38912, 39168, 39172, 0, + 32768, 36864, 38912, 39168, 39172, 0, 32768, 36864, + 38912, 39168, 39176, 39174, 0, 32768, 36864, 38912, + 39168, 0, 32768, 36864, 38912, 39168, 39176, 0, + 32768, 36864, 38912, 39168, 39176, 0, 32768, 36864, + 38912, 39168, 39176, 39178, 0, 32768, 36864, 38912, + 39168, 39176, 0, 32768, 36864, 38912, 39168, 39184, + 39180, 0, 32768, 36864, 38912, 39168, 39184, 39180, + 0, 32768, 36864, 38912, 39168, 39184, 39185, 39182, + 0, 32768, 36864, 38912, 39168, 0, 32768, 36864, + 38912, 39168, 39184, 0, 32768, 36864, 38912, 39168, + 39184, 0, 32768, 36864, 38912, 39168, 39184, 39186, + 0, 32768, 36864, 38912, 39168, 39184, 0, 32768, + 36864, 38912, 39168, 39184, 39188, 0, 32768, 36864, + 38912, 39168, 39184, 39188, 0, 32768, 36864, 38912, + 39168, 39184, 39192, 39190, 0, 32768, 36864, 38912, + 39168, 39184, 0, 32768, 36864, 38912, 39168, 39200, + 39192, 0, 32768, 36864, 38912, 39168, 39200, 39192, + 0, 32768, 36864, 38912, 39168, 39200, 39192, 39194, + 0, 32768, 36864, 38912, 39168, 39200, 39192, 0, + 32768, 36864, 38912, 39168, 39200, 39201, 39196, 0, + 32768, 36864, 38912, 39168, 39200, 39201, 39196, 0, + 32768, 36864, 38912, 39168, 39200, 39201, 39196, 39198, + 0, 32768, 36864, 38912, 39168, 0, 32768, 36864, + 38912, 39168, 39200, 0, 32768, 36864, 38912, 39168, + 39200, 0, 32768, 36864, 38912, 39168, 39200, 39202, + 0, 32768, 36864, 38912, 39168, 39200, 0, 32768, + 36864, 38912, 39168, 39200, 39204, 0, 32768, 36864, + 38912, 39168, 39200, 39204, 0, 32768, 36864, 38912, + 39168, 39200, 39208, 39206, 0, 32768, 36864, 38912, + 39168, 39200, 0, 32768, 36864, 38912, 39168, 39200, + 39208, 0, 32768, 36864, 38912, 39168, 39200, 39208, + 0, 32768, 36864, 38912, 39168, 39200, 39208, 39210, + 0, 32768, 36864, 38912, 39168, 39200, 39208, 0, + 32768, 36864, 38912, 39168, 39200, 39216, 39212, 0, + 32768, 36864, 38912, 39168, 39200, 39216, 39212, 0, + 32768, 36864, 38912, 39168, 39200, 39216, 39217, 39214, + 0, 32768, 36864, 38912, 39168, 39200, 0, 32768, + 36864, 38912, 39168, 39232, 39216, 0, 32768, 36864, + 38912, 39168, 39232, 39216, 0, 32768, 36864, 38912, + 39168, 39232, 39216, 39218, 0, 32768, 36864, 38912, + 39168, 39232, 39216, 0, 32768, 36864, 38912, 39168, + 39232, 39216, 39220, 0, 32768, 36864, 38912, 39168, + 39232, 39216, 39220, 0, 32768, 36864, 38912, 39168, + 39232, 39216, 39224, 39222, 0, 32768, 36864, 38912, + 39168, 39232, 39216, 0, 32768, 36864, 38912, 39168, + 39232, 39233, 39224, 0, 32768, 36864, 38912, 39168, + 39232, 39233, 39224, 0, 32768, 36864, 38912, 39168, + 39232, 39233, 39224, 39226, 0, 32768, 36864, 38912, + 39168, 39232, 39233, 39224, 0, 32768, 36864, 38912, + 39168, 39232, 39233, 39224, 39228, 0, 32768, 36864, + 38912, 39168, 39232, 39233, 39235, 39228, 0, 32768, + 36864, 38912, 39168, 39232, 39233, 39235, 39228, 39230, + 0, 32768, 36864, 38912, 39168, 0, 32768, 36864, + 38912, 39168, 39232, 0, 32768, 36864, 38912, 39168, + 39232, 0, 32768, 36864, 38912, 39168, 39232, 39234, + 0, 32768, 36864, 38912, 39168, 39232, 0, 32768, + 36864, 38912, 39168, 39232, 39236, 0, 32768, 36864, + 38912, 39168, 39232, 39236, 0, 32768, 36864, 38912, + 39168, 39232, 39240, 39238, 0, 32768, 36864, 38912, + 39168, 39232, 0, 32768, 36864, 38912, 39168, 39232, + 39240, 0, 32768, 36864, 38912, 39168, 39232, 39240, + 0, 32768, 36864, 38912, 39168, 39232, 39240, 39242, + 0, 32768, 36864, 38912, 39168, 39232, 39240, 0, + 32768, 36864, 38912, 39168, 39232, 39248, 39244, 0, + 32768, 36864, 38912, 39168, 39232, 39248, 39244, 0, + 32768, 36864, 38912, 39168, 39232, 39248, 39249, 39246, + 0, 32768, 36864, 38912, 39168, 39232, 0, 32768, + 36864, 38912, 39168, 39232, 39248, 0, 32768, 36864, + 38912, 39168, 39232, 39248, 0, 32768, 36864, 38912, + 39168, 39232, 39248, 39250, 0, 32768, 36864, 38912, + 39168, 39232, 39248, 0, 32768, 36864, 38912, 39168, + 39232, 39248, 39252, 0, 32768, 36864, 38912, 39168, + 39232, 39248, 39252, 0, 32768, 36864, 38912, 39168, + 39232, 39248, 39256, 39254, 0, 32768, 36864, 38912, + 39168, 39232, 39248, 0, 32768, 36864, 38912, 39168, + 39232, 39264, 39256, 0, 32768, 36864, 38912, 39168, + 39232, 39264, 39256, 0, 32768, 36864, 38912, 39168, + 39232, 39264, 39256, 39258, 0, 32768, 36864, 38912, + 39168, 39232, 39264, 39256, 0, 32768, 36864, 38912, + 39168, 39232, 39264, 39265, 39260, 0, 32768, 36864, + 38912, 39168, 39232, 39264, 39265, 39260, 0, 32768, + 36864, 38912, 39168, 39232, 39264, 39265, 39260, 39262, + 0, 32768, 36864, 38912, 39168, 39232, 0, 32768, + 36864, 38912, 39168, 39296, 39264, 0, 32768, 36864, + 38912, 39168, 39296, 39264, 0, 32768, 36864, 38912, + 39168, 39296, 39264, 39266, 0, 32768, 36864, 38912, + 39168, 39296, 39264, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39268, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39268, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39272, 39270, 0, 32768, 36864, 38912, + 39168, 39296, 39264, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39272, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39272, 0, 32768, 36864, 38912, 39168, + 39296, 39264, 39272, 39274, 0, 32768, 36864, 38912, + 39168, 39296, 39264, 39272, 0, 32768, 36864, 38912, + 39168, 39296, 39264, 39280, 39276, 0, 32768, 36864, + 38912, 39168, 39296, 39264, 39280, 39276, 0, 32768, + 36864, 38912, 39168, 39296, 39264, 39280, 39281, 39278, + 0, 32768, 36864, 38912, 39168, 39296, 39264, 0, + 32768, 36864, 38912, 39168, 39296, 39297, 39280, 0, + 32768, 36864, 38912, 39168, 39296, 39297, 39280, 0, + 32768, 36864, 38912, 39168, 39296, 39297, 39280, 39282, + 0, 32768, 36864, 38912, 39168, 39296, 39297, 39280, + 0, 32768, 36864, 38912, 39168, 39296, 39297, 39280, + 39284, 0, 32768, 36864, 38912, 39168, 39296, 39297, + 39280, 39284, 0, 32768, 36864, 38912, 39168, 39296, + 39297, 39280, 39288, 39286, 0, 32768, 36864, 38912, + 39168, 39296, 39297, 39280, 0, 32768, 36864, 38912, + 39168, 39296, 39297, 39280, 39288, 0, 32768, 36864, + 38912, 39168, 39296, 39297, 39299, 39288, 0, 32768, + 36864, 38912, 39168, 39296, 39297, 39299, 39288, 39290, + 0, 32768, 36864, 38912, 39168, 39296, 39297, 39299, + 39288, 0, 32768, 36864, 38912, 39168, 39296, 39297, + 39299, 39288, 39292, 0, 32768, 36864, 38912, 39168, + 39296, 39297, 39299, 39288, 39292, 0, 32768, 36864, + 38912, 39168, 39296, 39297, 39299, 39288, 39292, 39294, + 0, 32768, 36864, 38912, 39168, 0, 32768, 36864, + 38912, 39424, 39296, 0, 32768, 36864, 38912, 39424, + 39296, 0, 32768, 36864, 38912, 39424, 39296, 39298, + 0, 32768, 36864, 38912, 39424, 39296, 0, 32768, + 36864, 38912, 39424, 39296, 39300, 0, 32768, 36864, + 38912, 39424, 39296, 39300, 0, 32768, 36864, 38912, + 39424, 39296, 39304, 39302, 0, 32768, 36864, 38912, + 39424, 39296, 0, 32768, 36864, 38912, 39424, 39296, + 39304, 0, 32768, 36864, 38912, 39424, 39296, 39304, + 0, 32768, 36864, 38912, 39424, 39296, 39304, 39306, + 0, 32768, 36864, 38912, 39424, 39296, 39304, 0, + 32768, 36864, 38912, 39424, 39296, 39312, 39308, 0, + 32768, 36864, 38912, 39424, 39296, 39312, 39308, 0, + 32768, 36864, 38912, 39424, 39296, 39312, 39313, 39310, + 0, 32768, 36864, 38912, 39424, 39296, 0, 32768, + 36864, 38912, 39424, 39296, 39312, 0, 32768, 36864, + 38912, 39424, 39296, 39312, 0, 32768, 36864, 38912, + 39424, 39296, 39312, 39314, 0, 32768, 36864, 38912, + 39424, 39296, 39312, 0, 32768, 36864, 38912, 39424, + 39296, 39312, 39316, 0, 32768, 36864, 38912, 39424, + 39296, 39312, 39316, 0, 32768, 36864, 38912, 39424, + 39296, 39312, 39320, 39318, 0, 32768, 36864, 38912, + 39424, 39296, 39312, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39320, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39320, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39320, 39322, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 39320, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 39329, 39324, 0, 32768, 36864, + 38912, 39424, 39296, 39328, 39329, 39324, 0, 32768, + 36864, 38912, 39424, 39296, 39328, 39329, 39324, 39326, + 0, 32768, 36864, 38912, 39424, 39296, 0, 32768, + 36864, 38912, 39424, 39296, 39328, 0, 32768, 36864, + 38912, 39424, 39296, 39328, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 39330, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39332, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39332, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39336, 39334, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39336, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39336, 0, 32768, 36864, 38912, 39424, + 39296, 39328, 39336, 39338, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 39336, 0, 32768, 36864, 38912, + 39424, 39296, 39328, 39344, 39340, 0, 32768, 36864, + 38912, 39424, 39296, 39328, 39344, 39340, 0, 32768, + 36864, 38912, 39424, 39296, 39328, 39344, 39345, 39342, + 0, 32768, 36864, 38912, 39424, 39296, 39328, 0, + 32768, 36864, 38912, 39424, 39296, 39360, 39344, 0, + 32768, 36864, 38912, 39424, 39296, 39360, 39344, 0, + 32768, 36864, 38912, 39424, 39296, 39360, 39344, 39346, + 0, 32768, 36864, 38912, 39424, 39296, 39360, 39344, + 0, 32768, 36864, 38912, 39424, 39296, 39360, 39344, + 39348, 0, 32768, 36864, 38912, 39424, 39296, 39360, + 39344, 39348, 0, 32768, 36864, 38912, 39424, 39296, + 39360, 39344, 39352, 39350, 0, 32768, 36864, 38912, + 39424, 39296, 39360, 39344, 0, 32768, 36864, 38912, + 39424, 39296, 39360, 39361, 39352, 0, 32768, 36864, + 38912, 39424, 39296, 39360, 39361, 39352, 0, 32768, + 36864, 38912, 39424, 39296, 39360, 39361, 39352, 39354, + 0, 32768, 36864, 38912, 39424, 39296, 39360, 39361, + 39352, 0, 32768, 36864, 38912, 39424, 39296, 39360, + 39361, 39352, 39356, 0, 32768, 36864, 38912, 39424, + 39296, 39360, 39361, 39363, 39356, 0, 32768, 36864, + 38912, 39424, 39296, 39360, 39361, 39363, 39356, 39358, + 0, 32768, 36864, 38912, 39424, 39296, 0, 32768, + 36864, 38912, 39424, 39425, 39360, 0, 32768, 36864, + 38912, 39424, 39425, 39360, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 39362, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39364, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39364, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39368, 39366, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39368, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39368, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39368, 39370, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 39368, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 39376, 39372, 0, 32768, 36864, + 38912, 39424, 39425, 39360, 39376, 39372, 0, 32768, + 36864, 38912, 39424, 39425, 39360, 39376, 39377, 39374, + 0, 32768, 36864, 38912, 39424, 39425, 39360, 0, + 32768, 36864, 38912, 39424, 39425, 39360, 39376, 0, + 32768, 36864, 38912, 39424, 39425, 39360, 39376, 0, + 32768, 36864, 38912, 39424, 39425, 39360, 39376, 39378, + 0, 32768, 36864, 38912, 39424, 39425, 39360, 39376, + 0, 32768, 36864, 38912, 39424, 39425, 39360, 39376, + 39380, 0, 32768, 36864, 38912, 39424, 39425, 39360, + 39376, 39380, 0, 32768, 36864, 38912, 39424, 39425, + 39360, 39376, 39384, 39382, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 39376, 0, 32768, 36864, 38912, + 39424, 39425, 39360, 39392, 39384, 0, 32768, 36864, + 38912, 39424, 39425, 39360, 39392, 39384, 0, 32768, + 36864, 38912, 39424, 39425, 39360, 39392, 39384, 39386, + 0, 32768, 36864, 38912, 39424, 39425, 39360, 39392, + 39384, 0, 32768, 36864, 38912, 39424, 39425, 39360, + 39392, 39393, 39388, 0, 32768, 36864, 38912, 39424, + 39425, 39360, 39392, 39393, 39388, 0, 32768, 36864, + 38912, 39424, 39425, 39360, 39392, 39393, 39388, 39390, + 0, 32768, 36864, 38912, 39424, 39425, 39360, 0, + 32768, 36864, 38912, 39424, 39425, 39360, 39392, 0, + 32768, 36864, 38912, 39424, 39425, 39427, 39392, 0, + 32768, 36864, 38912, 39424, 39425, 39427, 39392, 39394, + 0, 32768, 36864, 38912, 39424, 39425, 39427, 39392, + 0, 32768, 36864, 38912, 39424, 39425, 39427, 39392, + 39396, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39392, 39396, 0, 32768, 36864, 38912, 39424, 39425, + 39427, 39392, 39400, 39398, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39392, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39392, 39400, 0, 32768, 36864, + 38912, 39424, 39425, 39427, 39392, 39400, 0, 32768, + 36864, 38912, 39424, 39425, 39427, 39392, 39400, 39402, + 0, 32768, 36864, 38912, 39424, 39425, 39427, 39392, + 39400, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39392, 39408, 39404, 0, 32768, 36864, 38912, 39424, + 39425, 39427, 39392, 39408, 39404, 0, 32768, 36864, + 38912, 39424, 39425, 39427, 39392, 39408, 39409, 39406, + 0, 32768, 36864, 38912, 39424, 39425, 39427, 39392, + 0, 32768, 36864, 38912, 39424, 39425, 39427, 39392, + 39408, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39392, 39408, 0, 32768, 36864, 38912, 39424, 39425, + 39427, 39392, 39408, 39410, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39431, 39408, 0, 32768, 36864, + 38912, 39424, 39425, 39427, 39431, 39408, 39412, 0, + 32768, 36864, 38912, 39424, 39425, 39427, 39431, 39408, + 39412, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39431, 39408, 39416, 39414, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39431, 39408, 0, 32768, 36864, + 38912, 39424, 39425, 39427, 39431, 39408, 39416, 0, + 32768, 36864, 38912, 39424, 39425, 39427, 39431, 39408, + 39416, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39431, 39408, 39416, 39418, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39431, 39408, 39416, 0, 32768, + 36864, 38912, 39424, 39425, 39427, 39431, 39408, 39416, + 39420, 0, 32768, 36864, 38912, 39424, 39425, 39427, + 39431, 39408, 39416, 39420, 0, 32768, 36864, 38912, + 39424, 39425, 39427, 39431, 39408, 39416, 39420, 39422, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 39424, 0, 32768, 36864, 38912, 39424, 0, 32768, + 36864, 38912, 39424, 39426, 0, 32768, 36864, 38912, + 39424, 0, 32768, 36864, 38912, 39424, 39428, 0, + 32768, 36864, 38912, 39424, 39428, 0, 32768, 36864, + 38912, 39424, 39432, 39430, 0, 32768, 36864, 38912, + 39424, 0, 32768, 36864, 38912, 39424, 39432, 0, + 32768, 36864, 38912, 39424, 39432, 0, 32768, 36864, + 38912, 39424, 39432, 39434, 0, 32768, 36864, 38912, + 39424, 39432, 0, 32768, 36864, 38912, 39424, 39440, + 39436, 0, 32768, 36864, 38912, 39424, 39440, 39436, + 0, 32768, 36864, 38912, 39424, 39440, 39441, 39438, + 0, 32768, 36864, 38912, 39424, 0, 32768, 36864, + 38912, 39424, 39440, 0, 32768, 36864, 38912, 39424, + 39440, 0, 32768, 36864, 38912, 39424, 39440, 39442, + 0, 32768, 36864, 38912, 39424, 39440, 0, 32768, + 36864, 38912, 39424, 39440, 39444, 0, 32768, 36864, + 38912, 39424, 39440, 39444, 0, 32768, 36864, 38912, + 39424, 39440, 39448, 39446, 0, 32768, 36864, 38912, + 39424, 39440, 0, 32768, 36864, 38912, 39424, 39456, + 39448, 0, 32768, 36864, 38912, 39424, 39456, 39448, + 0, 32768, 36864, 38912, 39424, 39456, 39448, 39450, + 0, 32768, 36864, 38912, 39424, 39456, 39448, 0, + 32768, 36864, 38912, 39424, 39456, 39457, 39452, 0, + 32768, 36864, 38912, 39424, 39456, 39457, 39452, 0, + 32768, 36864, 38912, 39424, 39456, 39457, 39452, 39454, + 0, 32768, 36864, 38912, 39424, 0, 32768, 36864, + 38912, 39424, 39456, 0, 32768, 36864, 38912, 39424, + 39456, 0, 32768, 36864, 38912, 39424, 39456, 39458, + 0, 32768, 36864, 38912, 39424, 39456, 0, 32768, + 36864, 38912, 39424, 39456, 39460, 0, 32768, 36864, + 38912, 39424, 39456, 39460, 0, 32768, 36864, 38912, + 39424, 39456, 39464, 39462, 0, 32768, 36864, 38912, + 39424, 39456, 0, 32768, 36864, 38912, 39424, 39456, + 39464, 0, 32768, 36864, 38912, 39424, 39456, 39464, + 0, 32768, 36864, 38912, 39424, 39456, 39464, 39466, + 0, 32768, 36864, 38912, 39424, 39456, 39464, 0, + 32768, 36864, 38912, 39424, 39456, 39472, 39468, 0, + 32768, 36864, 38912, 39424, 39456, 39472, 39468, 0, + 32768, 36864, 38912, 39424, 39456, 39472, 39473, 39470, + 0, 32768, 36864, 38912, 39424, 39456, 0, 32768, + 36864, 38912, 39424, 39488, 39472, 0, 32768, 36864, + 38912, 39424, 39488, 39472, 0, 32768, 36864, 38912, + 39424, 39488, 39472, 39474, 0, 32768, 36864, 38912, + 39424, 39488, 39472, 0, 32768, 36864, 38912, 39424, + 39488, 39472, 39476, 0, 32768, 36864, 38912, 39424, + 39488, 39472, 39476, 0, 32768, 36864, 38912, 39424, + 39488, 39472, 39480, 39478, 0, 32768, 36864, 38912, + 39424, 39488, 39472, 0, 32768, 36864, 38912, 39424, + 39488, 39489, 39480, 0, 32768, 36864, 38912, 39424, + 39488, 39489, 39480, 0, 32768, 36864, 38912, 39424, + 39488, 39489, 39480, 39482, 0, 32768, 36864, 38912, + 39424, 39488, 39489, 39480, 0, 32768, 36864, 38912, + 39424, 39488, 39489, 39480, 39484, 0, 32768, 36864, + 38912, 39424, 39488, 39489, 39491, 39484, 0, 32768, + 36864, 38912, 39424, 39488, 39489, 39491, 39484, 39486, + 0, 32768, 36864, 38912, 39424, 0, 32768, 36864, + 38912, 39424, 39488, 0, 32768, 36864, 38912, 39424, + 39488, 0, 32768, 36864, 38912, 39424, 39488, 39490, + 0, 32768, 36864, 38912, 39424, 39488, 0, 32768, + 36864, 38912, 39424, 39488, 39492, 0, 32768, 36864, + 38912, 39424, 39488, 39492, 0, 32768, 36864, 38912, + 39424, 39488, 39496, 39494, 0, 32768, 36864, 38912, + 39424, 39488, 0, 32768, 36864, 38912, 39424, 39488, + 39496, 0, 32768, 36864, 38912, 39424, 39488, 39496, + 0, 32768, 36864, 38912, 39424, 39488, 39496, 39498, + 0, 32768, 36864, 38912, 39424, 39488, 39496, 0, + 32768, 36864, 38912, 39424, 39488, 39504, 39500, 0, + 32768, 36864, 38912, 39424, 39488, 39504, 39500, 0, + 32768, 36864, 38912, 39424, 39488, 39504, 39505, 39502, + 0, 32768, 36864, 38912, 39424, 39488, 0, 32768, + 36864, 38912, 39424, 39488, 39504, 0, 32768, 36864, + 38912, 39424, 39488, 39504, 0, 32768, 36864, 38912, + 39424, 39488, 39504, 39506, 0, 32768, 36864, 38912, + 39424, 39488, 39504, 0, 32768, 36864, 38912, 39424, + 39488, 39504, 39508, 0, 32768, 36864, 38912, 39424, + 39488, 39504, 39508, 0, 32768, 36864, 38912, 39424, + 39488, 39504, 39512, 39510, 0, 32768, 36864, 38912, + 39424, 39488, 39504, 0, 32768, 36864, 38912, 39424, + 39488, 39520, 39512, 0, 32768, 36864, 38912, 39424, + 39488, 39520, 39512, 0, 32768, 36864, 38912, 39424, + 39488, 39520, 39512, 39514, 0, 32768, 36864, 38912, + 39424, 39488, 39520, 39512, 0, 32768, 36864, 38912, + 39424, 39488, 39520, 39521, 39516, 0, 32768, 36864, + 38912, 39424, 39488, 39520, 39521, 39516, 0, 32768, + 36864, 38912, 39424, 39488, 39520, 39521, 39516, 39518, + 0, 32768, 36864, 38912, 39424, 39488, 0, 32768, + 36864, 38912, 39424, 39552, 39520, 0, 32768, 36864, + 38912, 39424, 39552, 39520, 0, 32768, 36864, 38912, + 39424, 39552, 39520, 39522, 0, 32768, 36864, 38912, + 39424, 39552, 39520, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39524, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39524, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39528, 39526, 0, 32768, 36864, 38912, + 39424, 39552, 39520, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39528, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39528, 0, 32768, 36864, 38912, 39424, + 39552, 39520, 39528, 39530, 0, 32768, 36864, 38912, + 39424, 39552, 39520, 39528, 0, 32768, 36864, 38912, + 39424, 39552, 39520, 39536, 39532, 0, 32768, 36864, + 38912, 39424, 39552, 39520, 39536, 39532, 0, 32768, + 36864, 38912, 39424, 39552, 39520, 39536, 39537, 39534, + 0, 32768, 36864, 38912, 39424, 39552, 39520, 0, + 32768, 36864, 38912, 39424, 39552, 39553, 39536, 0, + 32768, 36864, 38912, 39424, 39552, 39553, 39536, 0, + 32768, 36864, 38912, 39424, 39552, 39553, 39536, 39538, + 0, 32768, 36864, 38912, 39424, 39552, 39553, 39536, + 0, 32768, 36864, 38912, 39424, 39552, 39553, 39536, + 39540, 0, 32768, 36864, 38912, 39424, 39552, 39553, + 39536, 39540, 0, 32768, 36864, 38912, 39424, 39552, + 39553, 39536, 39544, 39542, 0, 32768, 36864, 38912, + 39424, 39552, 39553, 39536, 0, 32768, 36864, 38912, + 39424, 39552, 39553, 39536, 39544, 0, 32768, 36864, + 38912, 39424, 39552, 39553, 39555, 39544, 0, 32768, + 36864, 38912, 39424, 39552, 39553, 39555, 39544, 39546, + 0, 32768, 36864, 38912, 39424, 39552, 39553, 39555, + 39544, 0, 32768, 36864, 38912, 39424, 39552, 39553, + 39555, 39544, 39548, 0, 32768, 36864, 38912, 39424, + 39552, 39553, 39555, 39544, 39548, 0, 32768, 36864, + 38912, 39424, 39552, 39553, 39555, 39544, 39548, 39550, + 0, 32768, 36864, 38912, 39424, 0, 32768, 36864, + 38912, 39424, 39552, 0, 32768, 36864, 38912, 39424, + 39552, 0, 32768, 36864, 38912, 39424, 39552, 39554, + 0, 32768, 36864, 38912, 39424, 39552, 0, 32768, + 36864, 38912, 39424, 39552, 39556, 0, 32768, 36864, + 38912, 39424, 39552, 39556, 0, 32768, 36864, 38912, + 39424, 39552, 39560, 39558, 0, 32768, 36864, 38912, + 39424, 39552, 0, 32768, 36864, 38912, 39424, 39552, + 39560, 0, 32768, 36864, 38912, 39424, 39552, 39560, + 0, 32768, 36864, 38912, 39424, 39552, 39560, 39562, + 0, 32768, 36864, 38912, 39424, 39552, 39560, 0, + 32768, 36864, 38912, 39424, 39552, 39568, 39564, 0, + 32768, 36864, 38912, 39424, 39552, 39568, 39564, 0, + 32768, 36864, 38912, 39424, 39552, 39568, 39569, 39566, + 0, 32768, 36864, 38912, 39424, 39552, 0, 32768, + 36864, 38912, 39424, 39552, 39568, 0, 32768, 36864, + 38912, 39424, 39552, 39568, 0, 32768, 36864, 38912, + 39424, 39552, 39568, 39570, 0, 32768, 36864, 38912, + 39424, 39552, 39568, 0, 32768, 36864, 38912, 39424, + 39552, 39568, 39572, 0, 32768, 36864, 38912, 39424, + 39552, 39568, 39572, 0, 32768, 36864, 38912, 39424, + 39552, 39568, 39576, 39574, 0, 32768, 36864, 38912, + 39424, 39552, 39568, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39576, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39576, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39576, 39578, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 39576, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 39585, 39580, 0, 32768, 36864, + 38912, 39424, 39552, 39584, 39585, 39580, 0, 32768, + 36864, 38912, 39424, 39552, 39584, 39585, 39580, 39582, + 0, 32768, 36864, 38912, 39424, 39552, 0, 32768, + 36864, 38912, 39424, 39552, 39584, 0, 32768, 36864, + 38912, 39424, 39552, 39584, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 39586, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39588, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39588, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39592, 39590, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39592, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39592, 0, 32768, 36864, 38912, 39424, + 39552, 39584, 39592, 39594, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 39592, 0, 32768, 36864, 38912, + 39424, 39552, 39584, 39600, 39596, 0, 32768, 36864, + 38912, 39424, 39552, 39584, 39600, 39596, 0, 32768, + 36864, 38912, 39424, 39552, 39584, 39600, 39601, 39598, + 0, 32768, 36864, 38912, 39424, 39552, 39584, 0, + 32768, 36864, 38912, 39424, 39552, 39616, 39600, 0, + 32768, 36864, 38912, 39424, 39552, 39616, 39600, 0, + 32768, 36864, 38912, 39424, 39552, 39616, 39600, 39602, + 0, 32768, 36864, 38912, 39424, 39552, 39616, 39600, + 0, 32768, 36864, 38912, 39424, 39552, 39616, 39600, + 39604, 0, 32768, 36864, 38912, 39424, 39552, 39616, + 39600, 39604, 0, 32768, 36864, 38912, 39424, 39552, + 39616, 39600, 39608, 39606, 0, 32768, 36864, 38912, + 39424, 39552, 39616, 39600, 0, 32768, 36864, 38912, + 39424, 39552, 39616, 39617, 39608, 0, 32768, 36864, + 38912, 39424, 39552, 39616, 39617, 39608, 0, 32768, + 36864, 38912, 39424, 39552, 39616, 39617, 39608, 39610, + 0, 32768, 36864, 38912, 39424, 39552, 39616, 39617, + 39608, 0, 32768, 36864, 38912, 39424, 39552, 39616, + 39617, 39608, 39612, 0, 32768, 36864, 38912, 39424, + 39552, 39616, 39617, 39619, 39612, 0, 32768, 36864, + 38912, 39424, 39552, 39616, 39617, 39619, 39612, 39614, + 0, 32768, 36864, 38912, 39424, 39552, 0, 32768, + 36864, 38912, 39424, 39680, 39616, 0, 32768, 36864, + 38912, 39424, 39680, 39616, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 39618, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39620, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39620, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39624, 39622, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39624, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39624, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39624, 39626, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 39624, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 39632, 39628, 0, 32768, 36864, + 38912, 39424, 39680, 39616, 39632, 39628, 0, 32768, + 36864, 38912, 39424, 39680, 39616, 39632, 39633, 39630, + 0, 32768, 36864, 38912, 39424, 39680, 39616, 0, + 32768, 36864, 38912, 39424, 39680, 39616, 39632, 0, + 32768, 36864, 38912, 39424, 39680, 39616, 39632, 0, + 32768, 36864, 38912, 39424, 39680, 39616, 39632, 39634, + 0, 32768, 36864, 38912, 39424, 39680, 39616, 39632, + 0, 32768, 36864, 38912, 39424, 39680, 39616, 39632, + 39636, 0, 32768, 36864, 38912, 39424, 39680, 39616, + 39632, 39636, 0, 32768, 36864, 38912, 39424, 39680, + 39616, 39632, 39640, 39638, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 39632, 0, 32768, 36864, 38912, + 39424, 39680, 39616, 39648, 39640, 0, 32768, 36864, + 38912, 39424, 39680, 39616, 39648, 39640, 0, 32768, + 36864, 38912, 39424, 39680, 39616, 39648, 39640, 39642, + 0, 32768, 36864, 38912, 39424, 39680, 39616, 39648, + 39640, 0, 32768, 36864, 38912, 39424, 39680, 39616, + 39648, 39649, 39644, 0, 32768, 36864, 38912, 39424, + 39680, 39616, 39648, 39649, 39644, 0, 32768, 36864, + 38912, 39424, 39680, 39616, 39648, 39649, 39644, 39646, + 0, 32768, 36864, 38912, 39424, 39680, 39616, 0, + 32768, 36864, 38912, 39424, 39680, 39681, 39648, 0, + 32768, 36864, 38912, 39424, 39680, 39681, 39648, 0, + 32768, 36864, 38912, 39424, 39680, 39681, 39648, 39650, + 0, 32768, 36864, 38912, 39424, 39680, 39681, 39648, + 0, 32768, 36864, 38912, 39424, 39680, 39681, 39648, + 39652, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39648, 39652, 0, 32768, 36864, 38912, 39424, 39680, + 39681, 39648, 39656, 39654, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39648, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39648, 39656, 0, 32768, 36864, + 38912, 39424, 39680, 39681, 39648, 39656, 0, 32768, + 36864, 38912, 39424, 39680, 39681, 39648, 39656, 39658, + 0, 32768, 36864, 38912, 39424, 39680, 39681, 39648, + 39656, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39648, 39664, 39660, 0, 32768, 36864, 38912, 39424, + 39680, 39681, 39648, 39664, 39660, 0, 32768, 36864, + 38912, 39424, 39680, 39681, 39648, 39664, 39665, 39662, + 0, 32768, 36864, 38912, 39424, 39680, 39681, 39648, + 0, 32768, 36864, 38912, 39424, 39680, 39681, 39648, + 39664, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39683, 39664, 0, 32768, 36864, 38912, 39424, 39680, + 39681, 39683, 39664, 39666, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39683, 39664, 0, 32768, 36864, + 38912, 39424, 39680, 39681, 39683, 39664, 39668, 0, + 32768, 36864, 38912, 39424, 39680, 39681, 39683, 39664, + 39668, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39683, 39664, 39672, 39670, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39683, 39664, 0, 32768, 36864, + 38912, 39424, 39680, 39681, 39683, 39664, 39672, 0, + 32768, 36864, 38912, 39424, 39680, 39681, 39683, 39664, + 39672, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39683, 39664, 39672, 39674, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39683, 39687, 39672, 0, 32768, + 36864, 38912, 39424, 39680, 39681, 39683, 39687, 39672, + 39676, 0, 32768, 36864, 38912, 39424, 39680, 39681, + 39683, 39687, 39672, 39676, 0, 32768, 36864, 38912, + 39424, 39680, 39681, 39683, 39687, 39672, 39676, 39678, + 0, 32768, 36864, 38912, 39424, 0, 32768, 36864, + 38912, 39936, 39680, 0, 32768, 36864, 38912, 39936, + 39680, 0, 32768, 36864, 38912, 39936, 39680, 39682, + 0, 32768, 36864, 38912, 39936, 39680, 0, 32768, + 36864, 38912, 39936, 39680, 39684, 0, 32768, 36864, + 38912, 39936, 39680, 39684, 0, 32768, 36864, 38912, + 39936, 39680, 39688, 39686, 0, 32768, 36864, 38912, + 39936, 39680, 0, 32768, 36864, 38912, 39936, 39680, + 39688, 0, 32768, 36864, 38912, 39936, 39680, 39688, + 0, 32768, 36864, 38912, 39936, 39680, 39688, 39690, + 0, 32768, 36864, 38912, 39936, 39680, 39688, 0, + 32768, 36864, 38912, 39936, 39680, 39696, 39692, 0, + 32768, 36864, 38912, 39936, 39680, 39696, 39692, 0, + 32768, 36864, 38912, 39936, 39680, 39696, 39697, 39694, + 0, 32768, 36864, 38912, 39936, 39680, 0, 32768, + 36864, 38912, 39936, 39680, 39696, 0, 32768, 36864, + 38912, 39936, 39680, 39696, 0, 32768, 36864, 38912, + 39936, 39680, 39696, 39698, 0, 32768, 36864, 38912, + 39936, 39680, 39696, 0, 32768, 36864, 38912, 39936, + 39680, 39696, 39700, 0, 32768, 36864, 38912, 39936, + 39680, 39696, 39700, 0, 32768, 36864, 38912, 39936, + 39680, 39696, 39704, 39702, 0, 32768, 36864, 38912, + 39936, 39680, 39696, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39704, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39704, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39704, 39706, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 39704, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 39713, 39708, 0, 32768, 36864, + 38912, 39936, 39680, 39712, 39713, 39708, 0, 32768, + 36864, 38912, 39936, 39680, 39712, 39713, 39708, 39710, + 0, 32768, 36864, 38912, 39936, 39680, 0, 32768, + 36864, 38912, 39936, 39680, 39712, 0, 32768, 36864, + 38912, 39936, 39680, 39712, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 39714, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39716, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39716, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39720, 39718, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39720, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39720, 0, 32768, 36864, 38912, 39936, + 39680, 39712, 39720, 39722, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 39720, 0, 32768, 36864, 38912, + 39936, 39680, 39712, 39728, 39724, 0, 32768, 36864, + 38912, 39936, 39680, 39712, 39728, 39724, 0, 32768, + 36864, 38912, 39936, 39680, 39712, 39728, 39729, 39726, + 0, 32768, 36864, 38912, 39936, 39680, 39712, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39728, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39728, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39728, 39730, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39728, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39728, + 39732, 0, 32768, 36864, 38912, 39936, 39680, 39744, + 39728, 39732, 0, 32768, 36864, 38912, 39936, 39680, + 39744, 39728, 39736, 39734, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39728, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39745, 39736, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 39745, 39736, 0, 32768, + 36864, 38912, 39936, 39680, 39744, 39745, 39736, 39738, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39745, + 39736, 0, 32768, 36864, 38912, 39936, 39680, 39744, + 39745, 39736, 39740, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39745, 39747, 39740, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 39745, 39747, 39740, 39742, + 0, 32768, 36864, 38912, 39936, 39680, 0, 32768, + 36864, 38912, 39936, 39680, 39744, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39746, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39748, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39748, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39752, 39750, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39752, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39752, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39752, 39754, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39752, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39760, 39756, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 39760, 39756, 0, 32768, + 36864, 38912, 39936, 39680, 39744, 39760, 39761, 39758, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39760, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39760, 0, + 32768, 36864, 38912, 39936, 39680, 39744, 39760, 39762, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39760, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39760, + 39764, 0, 32768, 36864, 38912, 39936, 39680, 39744, + 39760, 39764, 0, 32768, 36864, 38912, 39936, 39680, + 39744, 39760, 39768, 39766, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39760, 0, 32768, 36864, 38912, + 39936, 39680, 39744, 39776, 39768, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 39776, 39768, 0, 32768, + 36864, 38912, 39936, 39680, 39744, 39776, 39768, 39770, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 39776, + 39768, 0, 32768, 36864, 38912, 39936, 39680, 39744, + 39776, 39777, 39772, 0, 32768, 36864, 38912, 39936, + 39680, 39744, 39776, 39777, 39772, 0, 32768, 36864, + 38912, 39936, 39680, 39744, 39776, 39777, 39772, 39774, + 0, 32768, 36864, 38912, 39936, 39680, 39744, 0, + 32768, 36864, 38912, 39936, 39680, 39808, 39776, 0, + 32768, 36864, 38912, 39936, 39680, 39808, 39776, 0, + 32768, 36864, 38912, 39936, 39680, 39808, 39776, 39778, + 0, 32768, 36864, 38912, 39936, 39680, 39808, 39776, + 0, 32768, 36864, 38912, 39936, 39680, 39808, 39776, + 39780, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39776, 39780, 0, 32768, 36864, 38912, 39936, 39680, + 39808, 39776, 39784, 39782, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39776, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39776, 39784, 0, 32768, 36864, + 38912, 39936, 39680, 39808, 39776, 39784, 0, 32768, + 36864, 38912, 39936, 39680, 39808, 39776, 39784, 39786, + 0, 32768, 36864, 38912, 39936, 39680, 39808, 39776, + 39784, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39776, 39792, 39788, 0, 32768, 36864, 38912, 39936, + 39680, 39808, 39776, 39792, 39788, 0, 32768, 36864, + 38912, 39936, 39680, 39808, 39776, 39792, 39793, 39790, + 0, 32768, 36864, 38912, 39936, 39680, 39808, 39776, + 0, 32768, 36864, 38912, 39936, 39680, 39808, 39809, + 39792, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39809, 39792, 0, 32768, 36864, 38912, 39936, 39680, + 39808, 39809, 39792, 39794, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39809, 39792, 0, 32768, 36864, + 38912, 39936, 39680, 39808, 39809, 39792, 39796, 0, + 32768, 36864, 38912, 39936, 39680, 39808, 39809, 39792, + 39796, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39809, 39792, 39800, 39798, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39809, 39792, 0, 32768, 36864, + 38912, 39936, 39680, 39808, 39809, 39792, 39800, 0, + 32768, 36864, 38912, 39936, 39680, 39808, 39809, 39811, + 39800, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39809, 39811, 39800, 39802, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39809, 39811, 39800, 0, 32768, + 36864, 38912, 39936, 39680, 39808, 39809, 39811, 39800, + 39804, 0, 32768, 36864, 38912, 39936, 39680, 39808, + 39809, 39811, 39800, 39804, 0, 32768, 36864, 38912, + 39936, 39680, 39808, 39809, 39811, 39800, 39804, 39806, + 0, 32768, 36864, 38912, 39936, 39680, 0, 32768, + 36864, 38912, 39936, 39680, 39808, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39810, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39812, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39812, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39816, 39814, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39816, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39816, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39816, 39818, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39816, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39824, 39820, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39824, 39820, 0, 32768, + 36864, 38912, 39936, 39937, 39808, 39824, 39825, 39822, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39824, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39824, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39824, 39826, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39824, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39824, + 39828, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39824, 39828, 0, 32768, 36864, 38912, 39936, 39937, + 39808, 39824, 39832, 39830, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39824, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39840, 39832, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39840, 39832, 0, 32768, + 36864, 38912, 39936, 39937, 39808, 39840, 39832, 39834, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39840, + 39832, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39840, 39841, 39836, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39840, 39841, 39836, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39840, 39841, 39836, 39838, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39840, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39840, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39840, 39842, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39840, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39840, + 39844, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39840, 39844, 0, 32768, 36864, 38912, 39936, 39937, + 39808, 39840, 39848, 39846, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39840, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39840, 39848, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39840, 39848, 0, 32768, + 36864, 38912, 39936, 39937, 39808, 39840, 39848, 39850, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39840, + 39848, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39840, 39856, 39852, 0, 32768, 36864, 38912, 39936, + 39937, 39808, 39840, 39856, 39852, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39840, 39856, 39857, 39854, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39840, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 39872, + 39856, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39872, 39856, 0, 32768, 36864, 38912, 39936, 39937, + 39808, 39872, 39856, 39858, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39872, 39856, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39872, 39856, 39860, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39872, 39856, + 39860, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39872, 39856, 39864, 39862, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39872, 39856, 0, 32768, 36864, + 38912, 39936, 39937, 39808, 39872, 39873, 39864, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39872, 39873, + 39864, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39872, 39873, 39864, 39866, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39872, 39873, 39864, 0, 32768, + 36864, 38912, 39936, 39937, 39808, 39872, 39873, 39864, + 39868, 0, 32768, 36864, 38912, 39936, 39937, 39808, + 39872, 39873, 39875, 39868, 0, 32768, 36864, 38912, + 39936, 39937, 39808, 39872, 39873, 39875, 39868, 39870, + 0, 32768, 36864, 38912, 39936, 39937, 39808, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39872, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39872, 0, + 32768, 36864, 38912, 39936, 39937, 39808, 39872, 39874, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 39876, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39876, 0, 32768, 36864, 38912, 39936, 39937, + 39939, 39872, 39880, 39878, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39880, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39872, 39880, 0, 32768, + 36864, 38912, 39936, 39937, 39939, 39872, 39880, 39882, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 39880, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39888, 39884, 0, 32768, 36864, 38912, 39936, + 39937, 39939, 39872, 39888, 39884, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39872, 39888, 39889, 39886, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 39888, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39888, 0, 32768, 36864, 38912, 39936, 39937, + 39939, 39872, 39888, 39890, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39888, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39872, 39888, 39892, 0, + 32768, 36864, 38912, 39936, 39937, 39939, 39872, 39888, + 39892, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39888, 39896, 39894, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39888, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39872, 39904, 39896, 0, + 32768, 36864, 38912, 39936, 39937, 39939, 39872, 39904, + 39896, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39904, 39896, 39898, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39904, 39896, 0, 32768, + 36864, 38912, 39936, 39937, 39939, 39872, 39904, 39905, + 39900, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39904, 39905, 39900, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39904, 39905, 39900, 39902, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39872, + 39904, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39904, 0, 32768, 36864, 38912, 39936, 39937, + 39939, 39872, 39904, 39906, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39872, 39904, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39872, 39904, 39908, 0, + 32768, 36864, 38912, 39936, 39937, 39939, 39872, 39904, + 39908, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39872, 39904, 39912, 39910, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39943, 39904, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39943, 39904, 39912, 0, + 32768, 36864, 38912, 39936, 39937, 39939, 39943, 39904, + 39912, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39943, 39904, 39912, 39914, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39943, 39904, 39912, 0, 32768, + 36864, 38912, 39936, 39937, 39939, 39943, 39904, 39920, + 39916, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39943, 39904, 39920, 39916, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39943, 39904, 39920, 39921, 39918, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39943, + 39904, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39943, 39904, 39920, 0, 32768, 36864, 38912, 39936, + 39937, 39939, 39943, 39904, 39920, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39943, 39904, 39920, 39922, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39943, + 39904, 39920, 0, 32768, 36864, 38912, 39936, 39937, + 39939, 39943, 39904, 39920, 39924, 0, 32768, 36864, + 38912, 39936, 39937, 39939, 39943, 39904, 39920, 39924, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39943, + 39904, 39920, 39928, 39926, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39943, 39904, 39920, 0, 32768, + 36864, 38912, 39936, 39937, 39939, 39943, 39904, 39920, + 39928, 0, 32768, 36864, 38912, 39936, 39937, 39939, + 39943, 39904, 39920, 39928, 0, 32768, 36864, 38912, + 39936, 39937, 39939, 39943, 39904, 39920, 39928, 39930, + 0, 32768, 36864, 38912, 39936, 39937, 39939, 39943, + 39904, 39920, 39928, 0, 32768, 36864, 38912, 39936, + 39937, 39939, 39943, 39904, 39920, 39928, 39932, 0, + 32768, 36864, 38912, 39936, 39937, 39939, 39943, 39904, + 39920, 39928, 39932, 0, 32768, 36864, 38912, 39936, + 39937, 39939, 39943, 39904, 39920, 39928, 39932, 39934, + 0, 32768, 36864, 38912, 0, 32768, 36864, 38912, + 39936, 0, 32768, 36864, 38912, 39936, 0, 32768, + 36864, 38912, 39936, 39938, 0, 32768, 36864, 38912, + 39936, 0, 32768, 36864, 38912, 39936, 39940, 0, + 32768, 36864, 38912, 39936, 39940, 0, 32768, 36864, + 38912, 39936, 39944, 39942, 0, 32768, 36864, 38912, + 39936, 0, 32768, 36864, 38912, 39936, 39944, 0, + 32768, 36864, 38912, 39936, 39944, 0, 32768, 36864, + 38912, 39936, 39944, 39946, 0, 32768, 36864, 38912, + 39936, 39944, 0, 32768, 36864, 38912, 39936, 39952, + 39948, 0, 32768, 36864, 38912, 39936, 39952, 39948, + 0, 32768, 36864, 38912, 39936, 39952, 39953, 39950, + 0, 32768, 36864, 38912, 39936, 0, 32768, 36864, + 38912, 39936, 39952, 0, 32768, 36864, 38912, 39936, + 39952, 0, 32768, 36864, 38912, 39936, 39952, 39954, + 0, 32768, 36864, 38912, 39936, 39952, 0, 32768, + 36864, 38912, 39936, 39952, 39956, 0, 32768, 36864, + 38912, 39936, 39952, 39956, 0, 32768, 36864, 38912, + 39936, 39952, 39960, 39958, 0, 32768, 36864, 38912, + 39936, 39952, 0, 32768, 36864, 38912, 39936, 39968, + 39960, 0, 32768, 36864, 38912, 39936, 39968, 39960, + 0, 32768, 36864, 38912, 39936, 39968, 39960, 39962, + 0, 32768, 36864, 38912, 39936, 39968, 39960, 0, + 32768, 36864, 38912, 39936, 39968, 39969, 39964, 0, + 32768, 36864, 38912, 39936, 39968, 39969, 39964, 0, + 32768, 36864, 38912, 39936, 39968, 39969, 39964, 39966, + 0, 32768, 36864, 38912, 39936, 0, 32768, 36864, + 38912, 39936, 39968, 0, 32768, 36864, 38912, 39936, + 39968, 0, 32768, 36864, 38912, 39936, 39968, 39970, + 0, 32768, 36864, 38912, 39936, 39968, 0, 32768, + 36864, 38912, 39936, 39968, 39972, 0, 32768, 36864, + 38912, 39936, 39968, 39972, 0, 32768, 36864, 38912, + 39936, 39968, 39976, 39974, 0, 32768, 36864, 38912, + 39936, 39968, 0, 32768, 36864, 38912, 39936, 39968, + 39976, 0, 32768, 36864, 38912, 39936, 39968, 39976, + 0, 32768, 36864, 38912, 39936, 39968, 39976, 39978, + 0, 32768, 36864, 38912, 39936, 39968, 39976, 0, + 32768, 36864, 38912, 39936, 39968, 39984, 39980, 0, + 32768, 36864, 38912, 39936, 39968, 39984, 39980, 0, + 32768, 36864, 38912, 39936, 39968, 39984, 39985, 39982, + 0, 32768, 36864, 38912, 39936, 39968, 0, 32768, + 36864, 38912, 39936, 40000, 39984, 0, 32768, 36864, + 38912, 39936, 40000, 39984, 0, 32768, 36864, 38912, + 39936, 40000, 39984, 39986, 0, 32768, 36864, 38912, + 39936, 40000, 39984, 0, 32768, 36864, 38912, 39936, + 40000, 39984, 39988, 0, 32768, 36864, 38912, 39936, + 40000, 39984, 39988, 0, 32768, 36864, 38912, 39936, + 40000, 39984, 39992, 39990, 0, 32768, 36864, 38912, + 39936, 40000, 39984, 0, 32768, 36864, 38912, 39936, + 40000, 40001, 39992, 0, 32768, 36864, 38912, 39936, + 40000, 40001, 39992, 0, 32768, 36864, 38912, 39936, + 40000, 40001, 39992, 39994, 0, 32768, 36864, 38912, + 39936, 40000, 40001, 39992, 0, 32768, 36864, 38912, + 39936, 40000, 40001, 39992, 39996, 0, 32768, 36864, + 38912, 39936, 40000, 40001, 40003, 39996, 0, 32768, + 36864, 38912, 39936, 40000, 40001, 40003, 39996, 39998, + 0, 32768, 36864, 38912, 39936, 0, 32768, 40960, + 38912, 39936, 40000, 0, 32768, 40960, 38912, 39936, + 40000, 0, 32768, 40960, 38912, 39936, 40000, 40002, + 0, 32768, 40960, 38912, 39936, 40000, 0, 32768, + 40960, 38912, 39936, 40000, 40004, 0, 32768, 40960, + 38912, 39936, 40000, 40004, 0, 32768, 40960, 38912, + 39936, 40000, 40008, 40006, 0, 32768, 40960, 38912, + 39936, 40000, 0, 32768, 40960, 38912, 39936, 40000, + 40008, 0, 32768, 40960, 38912, 39936, 40000, 40008, + 0, 32768, 40960, 38912, 39936, 40000, 40008, 40010, + 0, 32768, 40960, 38912, 39936, 40000, 40008, 0, + 32768, 40960, 38912, 39936, 40000, 40016, 40012, 0, + 32768, 40960, 38912, 39936, 40000, 40016, 40012, 0, + 32768, 40960, 38912, 39936, 40000, 40016, 40017, 40014, + 0, 32768, 40960, 38912, 39936, 40000, 0, 32768, + 40960, 38912, 39936, 40000, 40016, 0, 32768, 40960, + 38912, 39936, 40000, 40016, 0, 32768, 40960, 38912, + 39936, 40000, 40016, 40018, 0, 32768, 40960, 38912, + 39936, 40000, 40016, 0, 32768, 40960, 38912, 39936, + 40000, 40016, 40020, 0, 32768, 40960, 38912, 39936, + 40000, 40016, 40020, 0, 32768, 40960, 38912, 39936, + 40000, 40016, 40024, 40022, 0, 32768, 40960, 38912, + 39936, 40000, 40016, 0, 32768, 40960, 38912, 39936, + 40000, 40032, 40024, 0, 32768, 40960, 38912, 39936, + 40000, 40032, 40024, 0, 32768, 40960, 38912, 39936, + 40000, 40032, 40024, 40026, 0, 32768, 40960, 38912, + 39936, 40000, 40032, 40024, 0, 32768, 40960, 38912, + 39936, 40000, 40032, 40033, 40028, 0, 32768, 40960, + 38912, 39936, 40000, 40032, 40033, 40028, 0, 32768, + 40960, 38912, 39936, 40000, 40032, 40033, 40028, 40030, + 0, 32768, 40960, 38912, 39936, 40000, 0, 32768, + 40960, 38912, 39936, 40064, 40032, 0, 32768, 40960, + 38912, 39936, 40064, 40032, 0, 32768, 40960, 38912, + 39936, 40064, 40032, 40034, 0, 32768, 40960, 38912, + 39936, 40064, 40032, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40036, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40036, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40040, 40038, 0, 32768, 40960, 38912, + 39936, 40064, 40032, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40040, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40040, 0, 32768, 40960, 38912, 39936, + 40064, 40032, 40040, 40042, 0, 32768, 40960, 38912, + 39936, 40064, 40032, 40040, 0, 32768, 40960, 38912, + 39936, 40064, 40032, 40048, 40044, 0, 32768, 40960, + 38912, 39936, 40064, 40032, 40048, 40044, 0, 32768, + 40960, 38912, 39936, 40064, 40032, 40048, 40049, 40046, + 0, 32768, 40960, 38912, 39936, 40064, 40032, 0, + 32768, 40960, 38912, 39936, 40064, 40065, 40048, 0, + 32768, 40960, 38912, 39936, 40064, 40065, 40048, 0, + 32768, 40960, 38912, 39936, 40064, 40065, 40048, 40050, + 0, 32768, 40960, 38912, 39936, 40064, 40065, 40048, + 0, 32768, 40960, 38912, 39936, 40064, 40065, 40048, + 40052, 0, 32768, 40960, 38912, 39936, 40064, 40065, + 40048, 40052, 0, 32768, 40960, 38912, 39936, 40064, + 40065, 40048, 40056, 40054, 0, 32768, 40960, 38912, + 39936, 40064, 40065, 40048, 0, 32768, 40960, 38912, + 39936, 40064, 40065, 40048, 40056, 0, 32768, 40960, + 38912, 39936, 40064, 40065, 40067, 40056, 0, 32768, + 40960, 38912, 39936, 40064, 40065, 40067, 40056, 40058, + 0, 32768, 40960, 38912, 39936, 40064, 40065, 40067, + 40056, 0, 32768, 40960, 38912, 39936, 40064, 40065, + 40067, 40056, 40060, 0, 32768, 40960, 38912, 39936, + 40064, 40065, 40067, 40056, 40060, 0, 32768, 40960, + 38912, 39936, 40064, 40065, 40067, 40056, 40060, 40062, + 0, 32768, 40960, 38912, 39936, 0, 32768, 40960, + 38912, 39936, 40064, 0, 32768, 40960, 38912, 39936, + 40064, 0, 32768, 40960, 38912, 39936, 40064, 40066, + 0, 32768, 40960, 38912, 39936, 40064, 0, 32768, + 40960, 38912, 39936, 40064, 40068, 0, 32768, 40960, + 38912, 39936, 40064, 40068, 0, 32768, 40960, 38912, + 39936, 40064, 40072, 40070, 0, 32768, 40960, 38912, + 39936, 40064, 0, 32768, 40960, 38912, 39936, 40064, + 40072, 0, 32768, 40960, 38912, 39936, 40064, 40072, + 0, 32768, 40960, 38912, 39936, 40064, 40072, 40074, + 0, 32768, 40960, 38912, 39936, 40064, 40072, 0, + 32768, 40960, 38912, 39936, 40064, 40080, 40076, 0, + 32768, 40960, 38912, 39936, 40064, 40080, 40076, 0, + 32768, 40960, 38912, 39936, 40064, 40080, 40081, 40078, + 0, 32768, 40960, 38912, 39936, 40064, 0, 32768, + 40960, 38912, 39936, 40064, 40080, 0, 32768, 40960, + 38912, 39936, 40064, 40080, 0, 32768, 40960, 38912, + 39936, 40064, 40080, 40082, 0, 32768, 40960, 38912, + 39936, 40064, 40080, 0, 32768, 40960, 38912, 39936, + 40064, 40080, 40084, 0, 32768, 40960, 38912, 39936, + 40064, 40080, 40084, 0, 32768, 40960, 38912, 39936, + 40064, 40080, 40088, 40086, 0, 32768, 40960, 38912, + 39936, 40064, 40080, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40088, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40088, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40088, 40090, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 40088, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 40097, 40092, 0, 32768, 40960, + 38912, 39936, 40064, 40096, 40097, 40092, 0, 32768, + 40960, 38912, 39936, 40064, 40096, 40097, 40092, 40094, + 0, 32768, 40960, 38912, 39936, 40064, 0, 32768, + 40960, 38912, 39936, 40064, 40096, 0, 32768, 40960, + 38912, 39936, 40064, 40096, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 40098, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40100, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40100, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40104, 40102, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40104, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40104, 0, 32768, 40960, 38912, 39936, + 40064, 40096, 40104, 40106, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 40104, 0, 32768, 40960, 38912, + 39936, 40064, 40096, 40112, 40108, 0, 32768, 40960, + 38912, 39936, 40064, 40096, 40112, 40108, 0, 32768, + 40960, 38912, 39936, 40064, 40096, 40112, 40113, 40110, + 0, 32768, 40960, 38912, 39936, 40064, 40096, 0, + 32768, 40960, 38912, 39936, 40064, 40128, 40112, 0, + 32768, 40960, 38912, 39936, 40064, 40128, 40112, 0, + 32768, 40960, 38912, 39936, 40064, 40128, 40112, 40114, + 0, 32768, 40960, 38912, 39936, 40064, 40128, 40112, + 0, 32768, 40960, 38912, 39936, 40064, 40128, 40112, + 40116, 0, 32768, 40960, 38912, 39936, 40064, 40128, + 40112, 40116, 0, 32768, 40960, 38912, 39936, 40064, + 40128, 40112, 40120, 40118, 0, 32768, 40960, 38912, + 39936, 40064, 40128, 40112, 0, 32768, 40960, 38912, + 39936, 40064, 40128, 40129, 40120, 0, 32768, 40960, + 38912, 39936, 40064, 40128, 40129, 40120, 0, 32768, + 40960, 38912, 39936, 40064, 40128, 40129, 40120, 40122, + 0, 32768, 40960, 38912, 39936, 40064, 40128, 40129, + 40120, 0, 32768, 40960, 38912, 39936, 40064, 40128, + 40129, 40120, 40124, 0, 32768, 40960, 38912, 39936, + 40064, 40128, 40129, 40131, 40124, 0, 32768, 40960, + 38912, 39936, 40064, 40128, 40129, 40131, 40124, 40126, + 0, 32768, 40960, 38912, 39936, 40064, 0, 32768, + 40960, 38912, 39936, 40192, 40128, 0, 32768, 40960, + 38912, 39936, 40192, 40128, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 40130, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40132, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40132, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40136, 40134, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40136, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40136, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40136, 40138, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 40136, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 40144, 40140, 0, 32768, 40960, + 38912, 39936, 40192, 40128, 40144, 40140, 0, 32768, + 40960, 38912, 39936, 40192, 40128, 40144, 40145, 40142, + 0, 32768, 40960, 38912, 39936, 40192, 40128, 0, + 32768, 40960, 38912, 39936, 40192, 40128, 40144, 0, + 32768, 40960, 38912, 39936, 40192, 40128, 40144, 0, + 32768, 40960, 38912, 39936, 40192, 40128, 40144, 40146, + 0, 32768, 40960, 38912, 39936, 40192, 40128, 40144, + 0, 32768, 40960, 38912, 39936, 40192, 40128, 40144, + 40148, 0, 32768, 40960, 38912, 39936, 40192, 40128, + 40144, 40148, 0, 32768, 40960, 38912, 39936, 40192, + 40128, 40144, 40152, 40150, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 40144, 0, 32768, 40960, 38912, + 39936, 40192, 40128, 40160, 40152, 0, 32768, 40960, + 38912, 39936, 40192, 40128, 40160, 40152, 0, 32768, + 40960, 38912, 39936, 40192, 40128, 40160, 40152, 40154, + 0, 32768, 40960, 38912, 39936, 40192, 40128, 40160, + 40152, 0, 32768, 40960, 38912, 39936, 40192, 40128, + 40160, 40161, 40156, 0, 32768, 40960, 38912, 39936, + 40192, 40128, 40160, 40161, 40156, 0, 32768, 40960, + 38912, 39936, 40192, 40128, 40160, 40161, 40156, 40158, + 0, 32768, 40960, 38912, 39936, 40192, 40128, 0, + 32768, 40960, 38912, 39936, 40192, 40193, 40160, 0, + 32768, 40960, 38912, 39936, 40192, 40193, 40160, 0, + 32768, 40960, 38912, 39936, 40192, 40193, 40160, 40162, + 0, 32768, 40960, 38912, 39936, 40192, 40193, 40160, + 0, 32768, 40960, 38912, 39936, 40192, 40193, 40160, + 40164, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40160, 40164, 0, 32768, 40960, 38912, 39936, 40192, + 40193, 40160, 40168, 40166, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40160, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40160, 40168, 0, 32768, 40960, + 38912, 39936, 40192, 40193, 40160, 40168, 0, 32768, + 40960, 38912, 39936, 40192, 40193, 40160, 40168, 40170, + 0, 32768, 40960, 38912, 39936, 40192, 40193, 40160, + 40168, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40160, 40176, 40172, 0, 32768, 40960, 38912, 39936, + 40192, 40193, 40160, 40176, 40172, 0, 32768, 40960, + 38912, 39936, 40192, 40193, 40160, 40176, 40177, 40174, + 0, 32768, 40960, 38912, 39936, 40192, 40193, 40160, + 0, 32768, 40960, 38912, 39936, 40192, 40193, 40160, + 40176, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40195, 40176, 0, 32768, 40960, 38912, 39936, 40192, + 40193, 40195, 40176, 40178, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40195, 40176, 0, 32768, 40960, + 38912, 39936, 40192, 40193, 40195, 40176, 40180, 0, + 32768, 40960, 38912, 39936, 40192, 40193, 40195, 40176, + 40180, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40195, 40176, 40184, 40182, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40195, 40176, 0, 32768, 40960, + 38912, 39936, 40192, 40193, 40195, 40176, 40184, 0, + 32768, 40960, 38912, 39936, 40192, 40193, 40195, 40176, + 40184, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40195, 40176, 40184, 40186, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40195, 40199, 40184, 0, 32768, + 40960, 38912, 39936, 40192, 40193, 40195, 40199, 40184, + 40188, 0, 32768, 40960, 38912, 39936, 40192, 40193, + 40195, 40199, 40184, 40188, 0, 32768, 40960, 38912, + 39936, 40192, 40193, 40195, 40199, 40184, 40188, 40190, + 0, 32768, 40960, 38912, 39936, 0, 32768, 40960, + 38912, 39936, 40192, 0, 32768, 40960, 40961, 39936, + 40192, 0, 32768, 40960, 40961, 39936, 40192, 40194, + 0, 32768, 40960, 40961, 39936, 40192, 0, 32768, + 40960, 40961, 39936, 40192, 40196, 0, 32768, 40960, + 40961, 39936, 40192, 40196, 0, 32768, 40960, 40961, + 39936, 40192, 40200, 40198, 0, 32768, 40960, 40961, + 39936, 40192, 0, 32768, 40960, 40961, 39936, 40192, + 40200, 0, 32768, 40960, 40961, 39936, 40192, 40200, + 0, 32768, 40960, 40961, 39936, 40192, 40200, 40202, + 0, 32768, 40960, 40961, 39936, 40192, 40200, 0, + 32768, 40960, 40961, 39936, 40192, 40208, 40204, 0, + 32768, 40960, 40961, 39936, 40192, 40208, 40204, 0, + 32768, 40960, 40961, 39936, 40192, 40208, 40209, 40206, + 0, 32768, 40960, 40961, 39936, 40192, 0, 32768, + 40960, 40961, 39936, 40192, 40208, 0, 32768, 40960, + 40961, 39936, 40192, 40208, 0, 32768, 40960, 40961, + 39936, 40192, 40208, 40210, 0, 32768, 40960, 40961, + 39936, 40192, 40208, 0, 32768, 40960, 40961, 39936, + 40192, 40208, 40212, 0, 32768, 40960, 40961, 39936, + 40192, 40208, 40212, 0, 32768, 40960, 40961, 39936, + 40192, 40208, 40216, 40214, 0, 32768, 40960, 40961, + 39936, 40192, 40208, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40216, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40216, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40216, 40218, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 40216, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 40225, 40220, 0, 32768, 40960, + 40961, 39936, 40192, 40224, 40225, 40220, 0, 32768, + 40960, 40961, 39936, 40192, 40224, 40225, 40220, 40222, + 0, 32768, 40960, 40961, 39936, 40192, 0, 32768, + 40960, 40961, 39936, 40192, 40224, 0, 32768, 40960, + 40961, 39936, 40192, 40224, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 40226, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40228, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40228, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40232, 40230, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40232, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40232, 0, 32768, 40960, 40961, 39936, + 40192, 40224, 40232, 40234, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 40232, 0, 32768, 40960, 40961, + 39936, 40192, 40224, 40240, 40236, 0, 32768, 40960, + 40961, 39936, 40192, 40224, 40240, 40236, 0, 32768, + 40960, 40961, 39936, 40192, 40224, 40240, 40241, 40238, + 0, 32768, 40960, 40961, 39936, 40192, 40224, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40240, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40240, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40240, 40242, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40240, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40240, + 40244, 0, 32768, 40960, 40961, 39936, 40192, 40256, + 40240, 40244, 0, 32768, 40960, 40961, 39936, 40192, + 40256, 40240, 40248, 40246, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40240, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40257, 40248, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 40257, 40248, 0, 32768, + 40960, 40961, 39936, 40192, 40256, 40257, 40248, 40250, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40257, + 40248, 0, 32768, 40960, 40961, 39936, 40192, 40256, + 40257, 40248, 40252, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40257, 40259, 40252, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 40257, 40259, 40252, 40254, + 0, 32768, 40960, 40961, 39936, 40192, 0, 32768, + 40960, 40961, 39936, 40192, 40256, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40258, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40260, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40260, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40264, 40262, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40264, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40264, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40264, 40266, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40264, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40272, 40268, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 40272, 40268, 0, 32768, + 40960, 40961, 39936, 40192, 40256, 40272, 40273, 40270, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40272, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40272, 0, + 32768, 40960, 40961, 39936, 40192, 40256, 40272, 40274, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40272, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40272, + 40276, 0, 32768, 40960, 40961, 39936, 40192, 40256, + 40272, 40276, 0, 32768, 40960, 40961, 39936, 40192, + 40256, 40272, 40280, 40278, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40272, 0, 32768, 40960, 40961, + 39936, 40192, 40256, 40288, 40280, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 40288, 40280, 0, 32768, + 40960, 40961, 39936, 40192, 40256, 40288, 40280, 40282, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 40288, + 40280, 0, 32768, 40960, 40961, 39936, 40192, 40256, + 40288, 40289, 40284, 0, 32768, 40960, 40961, 39936, + 40192, 40256, 40288, 40289, 40284, 0, 32768, 40960, + 40961, 39936, 40192, 40256, 40288, 40289, 40284, 40286, + 0, 32768, 40960, 40961, 39936, 40192, 40256, 0, + 32768, 40960, 40961, 39936, 40192, 40320, 40288, 0, + 32768, 40960, 40961, 39936, 40192, 40320, 40288, 0, + 32768, 40960, 40961, 39936, 40192, 40320, 40288, 40290, + 0, 32768, 40960, 40961, 39936, 40192, 40320, 40288, + 0, 32768, 40960, 40961, 39936, 40192, 40320, 40288, + 40292, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40288, 40292, 0, 32768, 40960, 40961, 39936, 40192, + 40320, 40288, 40296, 40294, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40288, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40288, 40296, 0, 32768, 40960, + 40961, 39936, 40192, 40320, 40288, 40296, 0, 32768, + 40960, 40961, 39936, 40192, 40320, 40288, 40296, 40298, + 0, 32768, 40960, 40961, 39936, 40192, 40320, 40288, + 40296, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40288, 40304, 40300, 0, 32768, 40960, 40961, 39936, + 40192, 40320, 40288, 40304, 40300, 0, 32768, 40960, + 40961, 39936, 40192, 40320, 40288, 40304, 40305, 40302, + 0, 32768, 40960, 40961, 39936, 40192, 40320, 40288, + 0, 32768, 40960, 40961, 39936, 40192, 40320, 40321, + 40304, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40321, 40304, 0, 32768, 40960, 40961, 39936, 40192, + 40320, 40321, 40304, 40306, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40321, 40304, 0, 32768, 40960, + 40961, 39936, 40192, 40320, 40321, 40304, 40308, 0, + 32768, 40960, 40961, 39936, 40192, 40320, 40321, 40304, + 40308, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40321, 40304, 40312, 40310, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40321, 40304, 0, 32768, 40960, + 40961, 39936, 40192, 40320, 40321, 40304, 40312, 0, + 32768, 40960, 40961, 39936, 40192, 40320, 40321, 40323, + 40312, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40321, 40323, 40312, 40314, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40321, 40323, 40312, 0, 32768, + 40960, 40961, 39936, 40192, 40320, 40321, 40323, 40312, + 40316, 0, 32768, 40960, 40961, 39936, 40192, 40320, + 40321, 40323, 40312, 40316, 0, 32768, 40960, 40961, + 39936, 40192, 40320, 40321, 40323, 40312, 40316, 40318, + 0, 32768, 40960, 40961, 39936, 40192, 0, 32768, + 40960, 40961, 39936, 40448, 40320, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40322, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40324, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40324, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40328, 40326, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40328, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40328, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40328, 40330, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40328, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40336, 40332, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40336, 40332, 0, 32768, + 40960, 40961, 39936, 40448, 40320, 40336, 40337, 40334, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40336, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40336, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40336, 40338, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40336, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40336, + 40340, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40336, 40340, 0, 32768, 40960, 40961, 39936, 40448, + 40320, 40336, 40344, 40342, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40336, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40352, 40344, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40352, 40344, 0, 32768, + 40960, 40961, 39936, 40448, 40320, 40352, 40344, 40346, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40352, + 40344, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40352, 40353, 40348, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40352, 40353, 40348, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40352, 40353, 40348, 40350, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40352, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40352, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40352, 40354, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40352, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40352, + 40356, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40352, 40356, 0, 32768, 40960, 40961, 39936, 40448, + 40320, 40352, 40360, 40358, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40352, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40352, 40360, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40352, 40360, 0, 32768, + 40960, 40961, 39936, 40448, 40320, 40352, 40360, 40362, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40352, + 40360, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40352, 40368, 40364, 0, 32768, 40960, 40961, 39936, + 40448, 40320, 40352, 40368, 40364, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40352, 40368, 40369, 40366, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40352, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 40384, + 40368, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40384, 40368, 0, 32768, 40960, 40961, 39936, 40448, + 40320, 40384, 40368, 40370, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40384, 40368, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40384, 40368, 40372, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40384, 40368, + 40372, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40384, 40368, 40376, 40374, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40384, 40368, 0, 32768, 40960, + 40961, 39936, 40448, 40320, 40384, 40385, 40376, 0, + 32768, 40960, 40961, 39936, 40448, 40320, 40384, 40385, + 40376, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40384, 40385, 40376, 40378, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40384, 40385, 40376, 0, 32768, + 40960, 40961, 39936, 40448, 40320, 40384, 40385, 40376, + 40380, 0, 32768, 40960, 40961, 39936, 40448, 40320, + 40384, 40385, 40387, 40380, 0, 32768, 40960, 40961, + 39936, 40448, 40320, 40384, 40385, 40387, 40380, 40382, + 0, 32768, 40960, 40961, 39936, 40448, 40320, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40384, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40384, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40384, 40386, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 40388, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40388, 0, 32768, 40960, 40961, 39936, 40448, + 40449, 40384, 40392, 40390, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 40392, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40384, 40392, 0, 32768, + 40960, 40961, 39936, 40448, 40449, 40384, 40392, 40394, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 40392, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40400, 40396, 0, 32768, 40960, 40961, 39936, + 40448, 40449, 40384, 40400, 40396, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40384, 40400, 40401, 40398, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 40400, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40400, 0, 32768, 40960, 40961, 39936, 40448, + 40449, 40384, 40400, 40402, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 40400, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40384, 40400, 40404, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40384, 40400, + 40404, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40400, 40408, 40406, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 40400, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40384, 40416, 40408, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40384, 40416, + 40408, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40416, 40408, 40410, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 40416, 40408, 0, 32768, + 40960, 40961, 39936, 40448, 40449, 40384, 40416, 40417, + 40412, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40384, 40416, 40417, 40412, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40384, 40416, 40417, 40412, 40414, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40384, + 40416, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40416, 0, 32768, 40960, 40961, 39936, 40448, + 40449, 40451, 40416, 40418, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40416, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40451, 40416, 40420, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40451, 40416, + 40420, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40416, 40424, 40422, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40416, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40451, 40416, 40424, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40451, 40416, + 40424, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40416, 40424, 40426, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40416, 40424, 0, 32768, + 40960, 40961, 39936, 40448, 40449, 40451, 40416, 40432, + 40428, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40416, 40432, 40428, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40416, 40432, 40433, 40430, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40451, + 40416, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40416, 40432, 0, 32768, 40960, 40961, 39936, + 40448, 40449, 40451, 40416, 40432, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40451, 40416, 40432, 40434, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40451, + 40455, 40432, 0, 32768, 40960, 40961, 39936, 40448, + 40449, 40451, 40455, 40432, 40436, 0, 32768, 40960, + 40961, 39936, 40448, 40449, 40451, 40455, 40432, 40436, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40451, + 40455, 40432, 40440, 40438, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40455, 40432, 0, 32768, + 40960, 40961, 39936, 40448, 40449, 40451, 40455, 40432, + 40440, 0, 32768, 40960, 40961, 39936, 40448, 40449, + 40451, 40455, 40432, 40440, 0, 32768, 40960, 40961, + 39936, 40448, 40449, 40451, 40455, 40432, 40440, 40442, + 0, 32768, 40960, 40961, 39936, 40448, 40449, 40451, + 40455, 40432, 40440, 0, 32768, 40960, 40961, 39936, + 40448, 40449, 40451, 40455, 40432, 40440, 40444, 0, + 32768, 40960, 40961, 39936, 40448, 40449, 40451, 40455, + 40432, 40440, 40444, 0, 32768, 40960, 40961, 39936, + 40448, 40449, 40451, 40455, 40432, 40440, 40444, 40446, + 0, 32768, 40960, 40961, 39936, 0, 32768, 40960, + 40961, 39936, 40448, 0, 32768, 40960, 40961, 39936, + 40448, 0, 32768, 40960, 40961, 39936, 40448, 40450, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40452, 0, 32768, 40960, + 40961, 40963, 40448, 40452, 0, 32768, 40960, 40961, + 40963, 40448, 40456, 40454, 0, 32768, 40960, 40961, + 40963, 40448, 0, 32768, 40960, 40961, 40963, 40448, + 40456, 0, 32768, 40960, 40961, 40963, 40448, 40456, + 0, 32768, 40960, 40961, 40963, 40448, 40456, 40458, + 0, 32768, 40960, 40961, 40963, 40448, 40456, 0, + 32768, 40960, 40961, 40963, 40448, 40464, 40460, 0, + 32768, 40960, 40961, 40963, 40448, 40464, 40460, 0, + 32768, 40960, 40961, 40963, 40448, 40464, 40465, 40462, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40464, 0, 32768, 40960, + 40961, 40963, 40448, 40464, 0, 32768, 40960, 40961, + 40963, 40448, 40464, 40466, 0, 32768, 40960, 40961, + 40963, 40448, 40464, 0, 32768, 40960, 40961, 40963, + 40448, 40464, 40468, 0, 32768, 40960, 40961, 40963, + 40448, 40464, 40468, 0, 32768, 40960, 40961, 40963, + 40448, 40464, 40472, 40470, 0, 32768, 40960, 40961, + 40963, 40448, 40464, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40472, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40472, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40472, 40474, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 40472, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 40481, 40476, 0, 32768, 40960, + 40961, 40963, 40448, 40480, 40481, 40476, 0, 32768, + 40960, 40961, 40963, 40448, 40480, 40481, 40476, 40478, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40480, 0, 32768, 40960, + 40961, 40963, 40448, 40480, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 40482, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40484, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40484, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40488, 40486, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40488, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40488, 0, 32768, 40960, 40961, 40963, + 40448, 40480, 40488, 40490, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 40488, 0, 32768, 40960, 40961, + 40963, 40448, 40480, 40496, 40492, 0, 32768, 40960, + 40961, 40963, 40448, 40480, 40496, 40492, 0, 32768, + 40960, 40961, 40963, 40448, 40480, 40496, 40497, 40494, + 0, 32768, 40960, 40961, 40963, 40448, 40480, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40496, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40496, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40496, 40498, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40496, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40496, + 40500, 0, 32768, 40960, 40961, 40963, 40448, 40512, + 40496, 40500, 0, 32768, 40960, 40961, 40963, 40448, + 40512, 40496, 40504, 40502, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40496, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40513, 40504, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 40513, 40504, 0, 32768, + 40960, 40961, 40963, 40448, 40512, 40513, 40504, 40506, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40513, + 40504, 0, 32768, 40960, 40961, 40963, 40448, 40512, + 40513, 40504, 40508, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40513, 40515, 40508, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 40513, 40515, 40508, 40510, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40512, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40514, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40516, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40516, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40520, 40518, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40520, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40520, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40520, 40522, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40520, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40528, 40524, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 40528, 40524, 0, 32768, + 40960, 40961, 40963, 40448, 40512, 40528, 40529, 40526, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40528, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40528, 0, + 32768, 40960, 40961, 40963, 40448, 40512, 40528, 40530, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40528, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40528, + 40532, 0, 32768, 40960, 40961, 40963, 40448, 40512, + 40528, 40532, 0, 32768, 40960, 40961, 40963, 40448, + 40512, 40528, 40536, 40534, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40528, 0, 32768, 40960, 40961, + 40963, 40448, 40512, 40544, 40536, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 40544, 40536, 0, 32768, + 40960, 40961, 40963, 40448, 40512, 40544, 40536, 40538, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 40544, + 40536, 0, 32768, 40960, 40961, 40963, 40448, 40512, + 40544, 40545, 40540, 0, 32768, 40960, 40961, 40963, + 40448, 40512, 40544, 40545, 40540, 0, 32768, 40960, + 40961, 40963, 40448, 40512, 40544, 40545, 40540, 40542, + 0, 32768, 40960, 40961, 40963, 40448, 40512, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40544, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40544, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40544, 40546, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40544, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40544, + 40548, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40544, 40548, 0, 32768, 40960, 40961, 40963, 40448, + 40576, 40544, 40552, 40550, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40544, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40544, 40552, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40544, 40552, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40544, 40552, 40554, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40544, + 40552, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40544, 40560, 40556, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40544, 40560, 40556, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40544, 40560, 40561, 40558, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40544, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40577, + 40560, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40577, 40560, 0, 32768, 40960, 40961, 40963, 40448, + 40576, 40577, 40560, 40562, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40577, 40560, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40577, 40560, 40564, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40577, 40560, + 40564, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40577, 40560, 40568, 40566, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40577, 40560, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40577, 40560, 40568, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40577, 40579, + 40568, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40577, 40579, 40568, 40570, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40577, 40579, 40568, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40577, 40579, 40568, + 40572, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40577, 40579, 40568, 40572, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40577, 40579, 40568, 40572, 40574, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40578, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40580, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40580, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40584, 40582, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40584, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40584, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40584, 40586, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40584, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40592, 40588, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40592, 40588, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40592, 40593, 40590, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40592, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40592, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40592, 40594, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40592, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40592, + 40596, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40592, 40596, 0, 32768, 40960, 40961, 40963, 40448, + 40576, 40592, 40600, 40598, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40592, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40608, 40600, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40608, 40600, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40608, 40600, 40602, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40608, + 40600, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40608, 40609, 40604, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40608, 40609, 40604, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40608, 40609, 40604, 40606, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40608, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40608, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40608, 40610, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40608, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40608, + 40612, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40608, 40612, 0, 32768, 40960, 40961, 40963, 40448, + 40576, 40608, 40616, 40614, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40608, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40608, 40616, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40608, 40616, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40608, 40616, 40618, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40608, + 40616, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40608, 40624, 40620, 0, 32768, 40960, 40961, 40963, + 40448, 40576, 40608, 40624, 40620, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40608, 40624, 40625, 40622, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40608, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 40640, + 40624, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40640, 40624, 0, 32768, 40960, 40961, 40963, 40448, + 40576, 40640, 40624, 40626, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40640, 40624, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40640, 40624, 40628, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40640, 40624, + 40628, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40640, 40624, 40632, 40630, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40640, 40624, 0, 32768, 40960, + 40961, 40963, 40448, 40576, 40640, 40641, 40632, 0, + 32768, 40960, 40961, 40963, 40448, 40576, 40640, 40641, + 40632, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40640, 40641, 40632, 40634, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40640, 40641, 40632, 0, 32768, + 40960, 40961, 40963, 40448, 40576, 40640, 40641, 40632, + 40636, 0, 32768, 40960, 40961, 40963, 40448, 40576, + 40640, 40641, 40643, 40636, 0, 32768, 40960, 40961, + 40963, 40448, 40576, 40640, 40641, 40643, 40636, 40638, + 0, 32768, 40960, 40961, 40963, 40448, 40576, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40640, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40640, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40640, 40642, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 40644, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40644, 0, 32768, 40960, 40961, 40963, 40448, + 40704, 40640, 40648, 40646, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 40648, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40640, 40648, 0, 32768, + 40960, 40961, 40963, 40448, 40704, 40640, 40648, 40650, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 40648, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40656, 40652, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40640, 40656, 40652, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40640, 40656, 40657, 40654, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 40656, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40656, 0, 32768, 40960, 40961, 40963, 40448, + 40704, 40640, 40656, 40658, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 40656, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40640, 40656, 40660, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40640, 40656, + 40660, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40656, 40664, 40662, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 40656, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40640, 40672, 40664, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40640, 40672, + 40664, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40672, 40664, 40666, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 40672, 40664, 0, 32768, + 40960, 40961, 40963, 40448, 40704, 40640, 40672, 40673, + 40668, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40640, 40672, 40673, 40668, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40640, 40672, 40673, 40668, 40670, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40640, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40705, + 40672, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40672, 0, 32768, 40960, 40961, 40963, 40448, + 40704, 40705, 40672, 40674, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40672, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40705, 40672, 40676, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40705, 40672, + 40676, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40672, 40680, 40678, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40672, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40705, 40672, 40680, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40705, 40672, + 40680, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40672, 40680, 40682, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40672, 40680, 0, 32768, + 40960, 40961, 40963, 40448, 40704, 40705, 40672, 40688, + 40684, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40672, 40688, 40684, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40672, 40688, 40689, 40686, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40705, + 40672, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40672, 40688, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40705, 40707, 40688, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40705, 40707, 40688, 40690, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40705, + 40707, 40688, 0, 32768, 40960, 40961, 40963, 40448, + 40704, 40705, 40707, 40688, 40692, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 40705, 40707, 40688, 40692, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40705, + 40707, 40688, 40696, 40694, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40707, 40688, 0, 32768, + 40960, 40961, 40963, 40448, 40704, 40705, 40707, 40688, + 40696, 0, 32768, 40960, 40961, 40963, 40448, 40704, + 40705, 40707, 40688, 40696, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40705, 40707, 40688, 40696, 40698, + 0, 32768, 40960, 40961, 40963, 40448, 40704, 40705, + 40707, 40711, 40696, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40705, 40707, 40711, 40696, 40700, 0, + 32768, 40960, 40961, 40963, 40448, 40704, 40705, 40707, + 40711, 40696, 40700, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40705, 40707, 40711, 40696, 40700, 40702, + 0, 32768, 40960, 40961, 40963, 40448, 0, 32768, + 40960, 40961, 40963, 40448, 40704, 0, 32768, 40960, + 40961, 40963, 40448, 40704, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 40706, 0, 32768, 40960, 40961, + 40963, 40448, 40704, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40708, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40708, 0, 32768, 40960, 40961, 40963, + 40448, 40704, 40712, 40710, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40712, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40712, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40712, 40714, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40712, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40720, 40716, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40720, 40716, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40720, 40721, 40718, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40720, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40720, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40720, 40722, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40720, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40720, + 40724, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40720, 40724, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40720, 40728, 40726, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40720, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40736, 40728, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40736, 40728, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40736, 40728, 40730, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40736, + 40728, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40736, 40737, 40732, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40736, 40737, 40732, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40736, 40737, 40732, 40734, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40736, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40736, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40736, 40738, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40736, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40736, + 40740, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40736, 40740, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40736, 40744, 40742, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40736, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40736, 40744, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40736, 40744, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40736, 40744, 40746, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40736, + 40744, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40736, 40752, 40748, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40736, 40752, 40748, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40736, 40752, 40753, 40750, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40736, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 40752, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40752, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40768, 40752, 40754, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40752, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40752, 40756, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 40752, + 40756, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40752, 40760, 40758, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40752, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40769, 40760, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 40769, + 40760, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40769, 40760, 40762, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40769, 40760, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40768, 40769, 40760, + 40764, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40769, 40771, 40764, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40769, 40771, 40764, 40766, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 40770, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 40772, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40772, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40768, 40776, 40774, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40776, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40776, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40768, 40776, 40778, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 40776, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40784, 40780, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40768, 40784, 40780, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40784, 40785, 40782, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 40784, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40784, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40768, 40784, 40786, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40784, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40784, 40788, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 40784, + 40788, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40784, 40792, 40790, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40784, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40768, 40800, 40792, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40768, 40800, + 40792, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40800, 40792, 40794, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40800, 40792, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40768, 40800, 40801, + 40796, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40768, 40800, 40801, 40796, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40768, 40800, 40801, 40796, 40798, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40768, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40800, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40800, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40832, 40800, 40802, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40800, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40800, 40804, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 40800, + 40804, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40800, 40808, 40806, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40800, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40800, 40808, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 40800, + 40808, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40800, 40808, 40810, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40800, 40808, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40832, 40800, 40816, + 40812, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40800, 40816, 40812, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40800, 40816, 40817, 40814, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40800, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40833, 40816, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40832, 40833, 40816, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40833, 40816, 40818, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40833, 40816, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40832, 40833, 40816, 40820, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40833, 40816, 40820, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40833, 40816, 40824, 40822, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40833, 40816, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40832, 40833, 40816, + 40824, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40833, 40835, 40824, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40833, 40835, 40824, 40826, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40833, 40835, 40824, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40832, 40833, 40835, 40824, 40828, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 40833, + 40835, 40824, 40828, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40832, 40833, 40835, 40824, 40828, 40830, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 0, + 32768, 40960, 40961, 40963, 40967, 40704, 40832, 40834, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40836, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40836, 0, 32768, 40960, 40961, 40963, 40967, + 40704, 40832, 40840, 40838, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 0, 32768, 40960, 40961, + 40963, 40967, 40704, 40832, 40840, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40840, 0, 32768, + 40960, 40961, 40963, 40967, 40704, 40832, 40840, 40842, + 0, 32768, 40960, 40961, 40963, 40967, 40704, 40832, + 40840, 0, 32768, 40960, 40961, 40963, 40967, 40704, + 40832, 40848, 40844, 0, 32768, 40960, 40961, 40963, + 40967, 40704, 40832, 40848, 40844, 0, 32768, 40960, + 40961, 40963, 40967, 40704, 40832, 40848, 40849, 40846, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40848, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40848, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40832, 40848, 40850, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40848, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40848, 40852, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40848, + 40852, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40848, 40856, 40854, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40848, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40864, 40856, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40864, + 40856, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 40856, 40858, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 40856, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40832, 40864, 40865, + 40860, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 40865, 40860, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 40865, 40860, 40862, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40864, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40832, 40864, 40866, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40864, 40868, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40864, + 40868, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 40872, 40870, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40864, 40872, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40864, + 40872, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 40872, 40874, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 40872, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40832, 40864, 40880, + 40876, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40864, 40880, 40876, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40864, 40880, 40881, 40878, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40864, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40880, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40880, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40880, 40882, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40880, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40832, 40896, 40880, 40884, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40880, 40884, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40880, 40888, 40886, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40880, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40832, 40896, 40897, + 40888, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40897, 40888, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40897, 40888, 40890, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40897, 40888, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40897, 40888, 40892, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40896, + 40897, 40899, 40892, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40897, 40899, 40892, 40894, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40832, 40896, 40898, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40900, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40896, + 40900, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40904, 40902, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40904, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40896, + 40904, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40904, 40906, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40904, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40832, 40896, 40912, + 40908, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40912, 40908, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40912, 40913, 40910, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40912, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40912, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40912, 40914, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40912, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40832, 40896, 40912, 40916, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40832, 40896, 40912, 40916, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40912, 40920, 40918, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40912, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40832, 40896, 40928, + 40920, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40832, 40896, 40928, 40920, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40832, 40896, 40928, 40920, 40922, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40832, + 40896, 40928, 40920, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40928, 40929, 40924, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40832, 40896, + 40928, 40929, 40924, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40832, 40896, 40928, 40929, 40924, 40926, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40991, 40896, 40928, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40991, 40896, 40928, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40991, 40896, 40928, 40930, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40991, 40896, 40928, 40932, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40991, 40896, 40928, 40932, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 40936, 40934, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40991, 40896, 40928, 0, 32768, + 40960, 40961, 40963, 40967, 40975, 40991, 40896, 40928, + 40936, 0, 32768, 40960, 40961, 40963, 40967, 40975, + 40991, 40896, 40928, 40936, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40991, 40896, 40928, 40936, 40938, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 40936, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40991, 40896, 40928, 40944, 40940, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40991, 40896, + 40928, 40944, 40940, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40991, 40896, 40928, 40944, 40945, 40942, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40991, 40896, 40928, 40944, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40991, 40896, 40928, 40944, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 40944, 40946, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40991, 40896, 40928, 40944, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40991, 40896, + 40928, 40944, 40948, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40991, 40896, 40928, 40944, 40948, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40991, 40896, + 40928, 40944, 40952, 40950, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40991, 40896, 40928, 40944, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40991, 40896, + 40928, 40944, 40952, 0, 32768, 40960, 40961, 40963, + 40967, 40975, 40991, 40896, 40928, 40944, 40952, 0, + 32768, 40960, 40961, 40963, 40967, 40975, 40991, 40896, + 40928, 40944, 40952, 40954, 0, 32768, 40960, 40961, + 40963, 40967, 40975, 40991, 40896, 40928, 40944, 40952, + 0, 32768, 40960, 40961, 40963, 40967, 40975, 40991, + 40896, 40928, 40944, 40952, 40956, 0, 32768, 40960, + 40961, 40963, 40967, 40975, 40991, 40896, 40928, 40944, + 40952, 40956, 0, 32768, 40960, 40961, 40963, 40967, + 40975, 40991, 40896, 40928, 40944, 40952, 40956, 40958, + 0, 32768, 0, 32768, 40960, 0, 32768, 40960, + 0, 32768, 40960, 40962, 0, 32768, 40960, 0, + 32768, 40960, 40964, 0, 32768, 40960, 40964, 0, + 32768, 40960, 40968, 40966, 0, 32768, 40960, 0, + 32768, 40960, 40968, 0, 32768, 40960, 40968, 0, + 32768, 40960, 40968, 40970, 0, 32768, 40960, 40968, + 0, 32768, 40960, 40976, 40972, 0, 32768, 40960, + 40976, 40972, 0, 32768, 40960, 40976, 40977, 40974, + 0, 32768, 40960, 0, 32768, 40960, 40976, 0, + 32768, 40960, 40976, 0, 32768, 40960, 40976, 40978, + 0, 32768, 40960, 40976, 0, 32768, 40960, 40976, + 40980, 0, 32768, 40960, 40976, 40980, 0, 32768, + 40960, 40976, 40984, 40982, 0, 32768, 40960, 40976, + 0, 32768, 40960, 40992, 40984, 0, 32768, 40960, + 40992, 40984, 0, 32768, 40960, 40992, 40984, 40986, + 0, 32768, 40960, 40992, 40984, 0, 32768, 40960, + 40992, 40993, 40988, 0, 32768, 40960, 40992, 40993, + 40988, 0, 32768, 40960, 40992, 40993, 40988, 40990, + 0, 32768, 40960, 0, 32768, 40960, 40992, 0, + 32768, 40960, 40992, 0, 32768, 40960, 40992, 40994, + 0, 32768, 40960, 40992, 0, 32768, 40960, 40992, + 40996, 0, 32768, 40960, 40992, 40996, 0, 32768, + 40960, 40992, 41000, 40998, 0, 32768, 40960, 40992, + 0, 32768, 40960, 40992, 41000, 0, 32768, 40960, + 40992, 41000, 0, 32768, 40960, 40992, 41000, 41002, + 0, 32768, 40960, 40992, 41000, 0, 32768, 40960, + 40992, 41008, 41004, 0, 32768, 40960, 40992, 41008, + 41004, 0, 32768, 40960, 40992, 41008, 41009, 41006, + 0, 32768, 40960, 40992, 0, 32768, 40960, 41024, + 41008, 0, 32768, 40960, 41024, 41008, 0, 32768, + 40960, 41024, 41008, 41010, 0, 32768, 40960, 41024, + 41008, 0, 32768, 40960, 41024, 41008, 41012, 0, + 32768, 40960, 41024, 41008, 41012, 0, 32768, 40960, + 41024, 41008, 41016, 41014, 0, 32768, 40960, 41024, + 41008, 0, 32768, 40960, 41024, 41025, 41016, 0, + 32768, 40960, 41024, 41025, 41016, 0, 32768, 40960, + 41024, 41025, 41016, 41018, 0, 32768, 40960, 41024, + 41025, 41016, 0, 32768, 40960, 41024, 41025, 41016, + 41020, 0, 32768, 40960, 41024, 41025, 41027, 41020, + 0, 32768, 40960, 41024, 41025, 41027, 41020, 41022, + 0, 32768, 40960, 0, 32768, 40960, 41024, 0, + 32768, 40960, 41024, 0, 32768, 40960, 41024, 41026, + 0, 32768, 40960, 41024, 0, 32768, 40960, 41024, + 41028, 0, 32768, 40960, 41024, 41028, 0, 32768, + 40960, 41024, 41032, 41030, 0, 32768, 40960, 41024, + 0, 32768, 40960, 41024, 41032, 0, 32768, 40960, + 41024, 41032, 0, 32768, 40960, 41024, 41032, 41034, + 0, 32768, 40960, 41024, 41032, 0, 32768, 40960, + 41024, 41040, 41036, 0, 32768, 40960, 41024, 41040, + 41036, 0, 32768, 40960, 41024, 41040, 41041, 41038, + 0, 32768, 40960, 41024, 0, 32768, 40960, 41024, + 41040, 0, 32768, 40960, 41024, 41040, 0, 32768, + 40960, 41024, 41040, 41042, 0, 32768, 40960, 41024, + 41040, 0, 32768, 40960, 41024, 41040, 41044, 0, + 32768, 40960, 41024, 41040, 41044, 0, 32768, 40960, + 41024, 41040, 41048, 41046, 0, 32768, 40960, 41024, + 41040, 0, 32768, 40960, 41024, 41056, 41048, 0, + 32768, 40960, 41024, 41056, 41048, 0, 32768, 40960, + 41024, 41056, 41048, 41050, 0, 32768, 40960, 41024, + 41056, 41048, 0, 32768, 40960, 41024, 41056, 41057, + 41052, 0, 32768, 40960, 41024, 41056, 41057, 41052, + 0, 32768, 40960, 41024, 41056, 41057, 41052, 41054, + 0, 32768, 40960, 41024, 0, 32768, 40960, 41088, + 41056, 0, 32768, 40960, 41088, 41056, 0, 32768, + 40960, 41088, 41056, 41058, 0, 32768, 40960, 41088, + 41056, 0, 32768, 40960, 41088, 41056, 41060, 0, + 32768, 40960, 41088, 41056, 41060, 0, 32768, 40960, + 41088, 41056, 41064, 41062, 0, 32768, 40960, 41088, + 41056, 0, 32768, 40960, 41088, 41056, 41064, 0, + 32768, 40960, 41088, 41056, 41064, 0, 32768, 40960, + 41088, 41056, 41064, 41066, 0, 32768, 40960, 41088, + 41056, 41064, 0, 32768, 40960, 41088, 41056, 41072, + 41068, 0, 32768, 40960, 41088, 41056, 41072, 41068, + 0, 32768, 40960, 41088, 41056, 41072, 41073, 41070, + 0, 32768, 40960, 41088, 41056, 0, 32768, 40960, + 41088, 41089, 41072, 0, 32768, 40960, 41088, 41089, + 41072, 0, 32768, 40960, 41088, 41089, 41072, 41074, + 0, 32768, 40960, 41088, 41089, 41072, 0, 32768, + 40960, 41088, 41089, 41072, 41076, 0, 32768, 40960, + 41088, 41089, 41072, 41076, 0, 32768, 40960, 41088, + 41089, 41072, 41080, 41078, 0, 32768, 40960, 41088, + 41089, 41072, 0, 32768, 40960, 41088, 41089, 41072, + 41080, 0, 32768, 40960, 41088, 41089, 41091, 41080, + 0, 32768, 40960, 41088, 41089, 41091, 41080, 41082, + 0, 32768, 40960, 41088, 41089, 41091, 41080, 0, + 32768, 40960, 41088, 41089, 41091, 41080, 41084, 0, + 32768, 40960, 41088, 41089, 41091, 41080, 41084, 0, + 32768, 40960, 41088, 41089, 41091, 41080, 41084, 41086, + 0, 32768, 40960, 0, 32768, 40960, 41088, 0, + 32768, 40960, 41088, 0, 32768, 40960, 41088, 41090, + 0, 32768, 40960, 41088, 0, 32768, 40960, 41088, + 41092, 0, 32768, 40960, 41088, 41092, 0, 32768, + 40960, 41088, 41096, 41094, 0, 32768, 40960, 41088, + 0, 32768, 40960, 41088, 41096, 0, 32768, 40960, + 41088, 41096, 0, 32768, 40960, 41088, 41096, 41098, + 0, 32768, 40960, 41088, 41096, 0, 32768, 40960, + 41088, 41104, 41100, 0, 32768, 40960, 41088, 41104, + 41100, 0, 32768, 40960, 41088, 41104, 41105, 41102, + 0, 32768, 40960, 41088, 0, 32768, 40960, 41088, + 41104, 0, 32768, 40960, 41088, 41104, 0, 32768, + 40960, 41088, 41104, 41106, 0, 32768, 40960, 41088, + 41104, 0, 32768, 40960, 41088, 41104, 41108, 0, + 32768, 40960, 41088, 41104, 41108, 0, 32768, 40960, + 41088, 41104, 41112, 41110, 0, 32768, 40960, 41088, + 41104, 0, 32768, 40960, 41088, 41120, 41112, 0, + 32768, 40960, 41088, 41120, 41112, 0, 32768, 40960, + 41088, 41120, 41112, 41114, 0, 32768, 40960, 41088, + 41120, 41112, 0, 32768, 40960, 41088, 41120, 41121, + 41116, 0, 32768, 40960, 41088, 41120, 41121, 41116, + 0, 32768, 40960, 41088, 41120, 41121, 41116, 41118, + 0, 32768, 40960, 41088, 0, 32768, 40960, 41088, + 41120, 0, 32768, 40960, 41088, 41120, 0, 32768, + 40960, 41088, 41120, 41122, 0, 32768, 40960, 41088, + 41120, 0, 32768, 40960, 41088, 41120, 41124, 0, + 32768, 40960, 41088, 41120, 41124, 0, 32768, 40960, + 41088, 41120, 41128, 41126, 0, 32768, 40960, 41088, + 41120, 0, 32768, 40960, 41088, 41120, 41128, 0, + 32768, 40960, 41088, 41120, 41128, 0, 32768, 40960, + 41088, 41120, 41128, 41130, 0, 32768, 40960, 41088, + 41120, 41128, 0, 32768, 40960, 41088, 41120, 41136, + 41132, 0, 32768, 40960, 41088, 41120, 41136, 41132, + 0, 32768, 40960, 41088, 41120, 41136, 41137, 41134, + 0, 32768, 40960, 41088, 41120, 0, 32768, 40960, + 41088, 41152, 41136, 0, 32768, 40960, 41088, 41152, + 41136, 0, 32768, 40960, 41088, 41152, 41136, 41138, + 0, 32768, 40960, 41088, 41152, 41136, 0, 32768, + 40960, 41088, 41152, 41136, 41140, 0, 32768, 40960, + 41088, 41152, 41136, 41140, 0, 32768, 40960, 41088, + 41152, 41136, 41144, 41142, 0, 32768, 40960, 41088, + 41152, 41136, 0, 32768, 40960, 41088, 41152, 41153, + 41144, 0, 32768, 40960, 41088, 41152, 41153, 41144, + 0, 32768, 40960, 41088, 41152, 41153, 41144, 41146, + 0, 32768, 40960, 41088, 41152, 41153, 41144, 0, + 32768, 40960, 41088, 41152, 41153, 41144, 41148, 0, + 32768, 40960, 41088, 41152, 41153, 41155, 41148, 0, + 32768, 40960, 41088, 41152, 41153, 41155, 41148, 41150, + 0, 32768, 40960, 41088, 0, 32768, 40960, 41216, + 41152, 0, 32768, 40960, 41216, 41152, 0, 32768, + 40960, 41216, 41152, 41154, 0, 32768, 40960, 41216, + 41152, 0, 32768, 40960, 41216, 41152, 41156, 0, + 32768, 40960, 41216, 41152, 41156, 0, 32768, 40960, + 41216, 41152, 41160, 41158, 0, 32768, 40960, 41216, + 41152, 0, 32768, 40960, 41216, 41152, 41160, 0, + 32768, 40960, 41216, 41152, 41160, 0, 32768, 40960, + 41216, 41152, 41160, 41162, 0, 32768, 40960, 41216, + 41152, 41160, 0, 32768, 40960, 41216, 41152, 41168, + 41164, 0, 32768, 40960, 41216, 41152, 41168, 41164, + 0, 32768, 40960, 41216, 41152, 41168, 41169, 41166, + 0, 32768, 40960, 41216, 41152, 0, 32768, 40960, + 41216, 41152, 41168, 0, 32768, 40960, 41216, 41152, + 41168, 0, 32768, 40960, 41216, 41152, 41168, 41170, + 0, 32768, 40960, 41216, 41152, 41168, 0, 32768, + 40960, 41216, 41152, 41168, 41172, 0, 32768, 40960, + 41216, 41152, 41168, 41172, 0, 32768, 40960, 41216, + 41152, 41168, 41176, 41174, 0, 32768, 40960, 41216, + 41152, 41168, 0, 32768, 40960, 41216, 41152, 41184, + 41176, 0, 32768, 40960, 41216, 41152, 41184, 41176, + 0, 32768, 40960, 41216, 41152, 41184, 41176, 41178, + 0, 32768, 40960, 41216, 41152, 41184, 41176, 0, + 32768, 40960, 41216, 41152, 41184, 41185, 41180, 0, + 32768, 40960, 41216, 41152, 41184, 41185, 41180, 0, + 32768, 40960, 41216, 41152, 41184, 41185, 41180, 41182, + 0, 32768, 40960, 41216, 41152, 0, 32768, 40960, + 41216, 41217, 41184, 0, 32768, 40960, 41216, 41217, + 41184, 0, 32768, 40960, 41216, 41217, 41184, 41186, + 0, 32768, 40960, 41216, 41217, 41184, 0, 32768, + 40960, 41216, 41217, 41184, 41188, 0, 32768, 40960, + 41216, 41217, 41184, 41188, 0, 32768, 40960, 41216, + 41217, 41184, 41192, 41190, 0, 32768, 40960, 41216, + 41217, 41184, 0, 32768, 40960, 41216, 41217, 41184, + 41192, 0, 32768, 40960, 41216, 41217, 41184, 41192, + 0, 32768, 40960, 41216, 41217, 41184, 41192, 41194, + 0, 32768, 40960, 41216, 41217, 41184, 41192, 0, + 32768, 40960, 41216, 41217, 41184, 41200, 41196, 0, + 32768, 40960, 41216, 41217, 41184, 41200, 41196, 0, + 32768, 40960, 41216, 41217, 41184, 41200, 41201, 41198, + 0, 32768, 40960, 41216, 41217, 41184, 0, 32768, + 40960, 41216, 41217, 41184, 41200, 0, 32768, 40960, + 41216, 41217, 41219, 41200, 0, 32768, 40960, 41216, + 41217, 41219, 41200, 41202, 0, 32768, 40960, 41216, + 41217, 41219, 41200, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41204, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41204, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41208, 41206, 0, 32768, 40960, 41216, + 41217, 41219, 41200, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41208, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41208, 0, 32768, 40960, 41216, 41217, + 41219, 41200, 41208, 41210, 0, 32768, 40960, 41216, + 41217, 41219, 41223, 41208, 0, 32768, 40960, 41216, + 41217, 41219, 41223, 41208, 41212, 0, 32768, 40960, + 41216, 41217, 41219, 41223, 41208, 41212, 0, 32768, + 40960, 41216, 41217, 41219, 41223, 41208, 41212, 41214, + 0, 32768, 40960, 0, 32768, 40960, 41216, 0, + 32768, 40960, 41216, 0, 32768, 40960, 41216, 41218, + 0, 32768, 40960, 41216, 0, 32768, 40960, 41216, + 41220, 0, 32768, 40960, 41216, 41220, 0, 32768, + 40960, 41216, 41224, 41222, 0, 32768, 40960, 41216, + 0, 32768, 40960, 41216, 41224, 0, 32768, 40960, + 41216, 41224, 0, 32768, 40960, 41216, 41224, 41226, + 0, 32768, 40960, 41216, 41224, 0, 32768, 40960, + 41216, 41232, 41228, 0, 32768, 40960, 41216, 41232, + 41228, 0, 32768, 40960, 41216, 41232, 41233, 41230, + 0, 32768, 40960, 41216, 0, 32768, 40960, 41216, + 41232, 0, 32768, 40960, 41216, 41232, 0, 32768, + 40960, 41216, 41232, 41234, 0, 32768, 40960, 41216, + 41232, 0, 32768, 40960, 41216, 41232, 41236, 0, + 32768, 40960, 41216, 41232, 41236, 0, 32768, 40960, + 41216, 41232, 41240, 41238, 0, 32768, 40960, 41216, + 41232, 0, 32768, 40960, 41216, 41248, 41240, 0, + 32768, 40960, 41216, 41248, 41240, 0, 32768, 40960, + 41216, 41248, 41240, 41242, 0, 32768, 40960, 41216, + 41248, 41240, 0, 32768, 40960, 41216, 41248, 41249, + 41244, 0, 32768, 40960, 41216, 41248, 41249, 41244, + 0, 32768, 40960, 41216, 41248, 41249, 41244, 41246, + 0, 32768, 40960, 41216, 0, 32768, 40960, 41216, + 41248, 0, 32768, 40960, 41216, 41248, 0, 32768, + 40960, 41216, 41248, 41250, 0, 32768, 40960, 41216, + 41248, 0, 32768, 40960, 41216, 41248, 41252, 0, + 32768, 40960, 41216, 41248, 41252, 0, 32768, 40960, + 41216, 41248, 41256, 41254, 0, 32768, 40960, 41216, + 41248, 0, 32768, 40960, 41216, 41248, 41256, 0, + 32768, 40960, 41216, 41248, 41256, 0, 32768, 40960, + 41216, 41248, 41256, 41258, 0, 32768, 40960, 41216, + 41248, 41256, 0, 32768, 40960, 41216, 41248, 41264, + 41260, 0, 32768, 40960, 41216, 41248, 41264, 41260, + 0, 32768, 40960, 41216, 41248, 41264, 41265, 41262, + 0, 32768, 40960, 41216, 41248, 0, 32768, 40960, + 41216, 41280, 41264, 0, 32768, 40960, 41216, 41280, + 41264, 0, 32768, 40960, 41216, 41280, 41264, 41266, + 0, 32768, 40960, 41216, 41280, 41264, 0, 32768, + 40960, 41216, 41280, 41264, 41268, 0, 32768, 40960, + 41216, 41280, 41264, 41268, 0, 32768, 40960, 41216, + 41280, 41264, 41272, 41270, 0, 32768, 40960, 41216, + 41280, 41264, 0, 32768, 40960, 41216, 41280, 41281, + 41272, 0, 32768, 40960, 41216, 41280, 41281, 41272, + 0, 32768, 40960, 41216, 41280, 41281, 41272, 41274, + 0, 32768, 40960, 41216, 41280, 41281, 41272, 0, + 32768, 40960, 41216, 41280, 41281, 41272, 41276, 0, + 32768, 40960, 41216, 41280, 41281, 41283, 41276, 0, + 32768, 40960, 41216, 41280, 41281, 41283, 41276, 41278, + 0, 32768, 40960, 41216, 0, 32768, 40960, 41216, + 41280, 0, 32768, 40960, 41216, 41280, 0, 32768, + 40960, 41216, 41280, 41282, 0, 32768, 40960, 41216, + 41280, 0, 32768, 40960, 41216, 41280, 41284, 0, + 32768, 40960, 41216, 41280, 41284, 0, 32768, 40960, + 41216, 41280, 41288, 41286, 0, 32768, 40960, 41216, + 41280, 0, 32768, 40960, 41216, 41280, 41288, 0, + 32768, 40960, 41216, 41280, 41288, 0, 32768, 40960, + 41216, 41280, 41288, 41290, 0, 32768, 40960, 41216, + 41280, 41288, 0, 32768, 40960, 41216, 41280, 41296, + 41292, 0, 32768, 40960, 41216, 41280, 41296, 41292, + 0, 32768, 40960, 41216, 41280, 41296, 41297, 41294, + 0, 32768, 40960, 41216, 41280, 0, 32768, 40960, + 41216, 41280, 41296, 0, 32768, 40960, 41216, 41280, + 41296, 0, 32768, 40960, 41216, 41280, 41296, 41298, + 0, 32768, 40960, 41216, 41280, 41296, 0, 32768, + 40960, 41216, 41280, 41296, 41300, 0, 32768, 40960, + 41216, 41280, 41296, 41300, 0, 32768, 40960, 41216, + 41280, 41296, 41304, 41302, 0, 32768, 40960, 41216, + 41280, 41296, 0, 32768, 40960, 41216, 41280, 41312, + 41304, 0, 32768, 40960, 41216, 41280, 41312, 41304, + 0, 32768, 40960, 41216, 41280, 41312, 41304, 41306, + 0, 32768, 40960, 41216, 41280, 41312, 41304, 0, + 32768, 40960, 41216, 41280, 41312, 41313, 41308, 0, + 32768, 40960, 41216, 41280, 41312, 41313, 41308, 0, + 32768, 40960, 41216, 41280, 41312, 41313, 41308, 41310, + 0, 32768, 40960, 41216, 41280, 0, 32768, 40960, + 41216, 41344, 41312, 0, 32768, 40960, 41216, 41344, + 41312, 0, 32768, 40960, 41216, 41344, 41312, 41314, + 0, 32768, 40960, 41216, 41344, 41312, 0, 32768, + 40960, 41216, 41344, 41312, 41316, 0, 32768, 40960, + 41216, 41344, 41312, 41316, 0, 32768, 40960, 41216, + 41344, 41312, 41320, 41318, 0, 32768, 40960, 41216, + 41344, 41312, 0, 32768, 40960, 41216, 41344, 41312, + 41320, 0, 32768, 40960, 41216, 41344, 41312, 41320, + 0, 32768, 40960, 41216, 41344, 41312, 41320, 41322, + 0, 32768, 40960, 41216, 41344, 41312, 41320, 0, + 32768, 40960, 41216, 41344, 41312, 41328, 41324, 0, + 32768, 40960, 41216, 41344, 41312, 41328, 41324, 0, + 32768, 40960, 41216, 41344, 41312, 41328, 41329, 41326, + 0, 32768, 40960, 41216, 41344, 41312, 0, 32768, + 40960, 41216, 41344, 41345, 41328, 0, 32768, 40960, + 41216, 41344, 41345, 41328, 0, 32768, 40960, 41216, + 41344, 41345, 41328, 41330, 0, 32768, 40960, 41216, + 41344, 41345, 41328, 0, 32768, 40960, 41216, 41344, + 41345, 41328, 41332, 0, 32768, 40960, 41216, 41344, + 41345, 41328, 41332, 0, 32768, 40960, 41216, 41344, + 41345, 41328, 41336, 41334, 0, 32768, 40960, 41216, + 41344, 41345, 41328, 0, 32768, 40960, 41216, 41344, + 41345, 41328, 41336, 0, 32768, 40960, 41216, 41344, + 41345, 41347, 41336, 0, 32768, 40960, 41216, 41344, + 41345, 41347, 41336, 41338, 0, 32768, 40960, 41216, + 41344, 41345, 41347, 41336, 0, 32768, 40960, 41216, + 41344, 41345, 41347, 41336, 41340, 0, 32768, 40960, + 41216, 41344, 41345, 41347, 41336, 41340, 0, 32768, + 40960, 41216, 41344, 41345, 41347, 41336, 41340, 41342, + 0, 32768, 40960, 41216, 0, 32768, 40960, 41472, + 41344, 0, 32768, 40960, 41472, 41344, 0, 32768, + 40960, 41472, 41344, 41346, 0, 32768, 40960, 41472, + 41344, 0, 32768, 40960, 41472, 41344, 41348, 0, + 32768, 40960, 41472, 41344, 41348, 0, 32768, 40960, + 41472, 41344, 41352, 41350, 0, 32768, 40960, 41472, + 41344, 0, 32768, 40960, 41472, 41344, 41352, 0, + 32768, 40960, 41472, 41344, 41352, 0, 32768, 40960, + 41472, 41344, 41352, 41354, 0, 32768, 40960, 41472, + 41344, 41352, 0, 32768, 40960, 41472, 41344, 41360, + 41356, 0, 32768, 40960, 41472, 41344, 41360, 41356, + 0, 32768, 40960, 41472, 41344, 41360, 41361, 41358, + 0, 32768, 40960, 41472, 41344, 0, 32768, 40960, + 41472, 41344, 41360, 0, 32768, 40960, 41472, 41344, + 41360, 0, 32768, 40960, 41472, 41344, 41360, 41362, + 0, 32768, 40960, 41472, 41344, 41360, 0, 32768, + 40960, 41472, 41344, 41360, 41364, 0, 32768, 40960, + 41472, 41344, 41360, 41364, 0, 32768, 40960, 41472, + 41344, 41360, 41368, 41366, 0, 32768, 40960, 41472, + 41344, 41360, 0, 32768, 40960, 41472, 41344, 41376, + 41368, 0, 32768, 40960, 41472, 41344, 41376, 41368, + 0, 32768, 40960, 41472, 41344, 41376, 41368, 41370, + 0, 32768, 40960, 41472, 41344, 41376, 41368, 0, + 32768, 40960, 41472, 41344, 41376, 41377, 41372, 0, + 32768, 40960, 41472, 41344, 41376, 41377, 41372, 0, + 32768, 40960, 41472, 41344, 41376, 41377, 41372, 41374, + 0, 32768, 40960, 41472, 41344, 0, 32768, 40960, + 41472, 41344, 41376, 0, 32768, 40960, 41472, 41344, + 41376, 0, 32768, 40960, 41472, 41344, 41376, 41378, + 0, 32768, 40960, 41472, 41344, 41376, 0, 32768, + 40960, 41472, 41344, 41376, 41380, 0, 32768, 40960, + 41472, 41344, 41376, 41380, 0, 32768, 40960, 41472, + 41344, 41376, 41384, 41382, 0, 32768, 40960, 41472, + 41344, 41376, 0, 32768, 40960, 41472, 41344, 41376, + 41384, 0, 32768, 40960, 41472, 41344, 41376, 41384, + 0, 32768, 40960, 41472, 41344, 41376, 41384, 41386, + 0, 32768, 40960, 41472, 41344, 41376, 41384, 0, + 32768, 40960, 41472, 41344, 41376, 41392, 41388, 0, + 32768, 40960, 41472, 41344, 41376, 41392, 41388, 0, + 32768, 40960, 41472, 41344, 41376, 41392, 41393, 41390, + 0, 32768, 40960, 41472, 41344, 41376, 0, 32768, + 40960, 41472, 41344, 41408, 41392, 0, 32768, 40960, + 41472, 41344, 41408, 41392, 0, 32768, 40960, 41472, + 41344, 41408, 41392, 41394, 0, 32768, 40960, 41472, + 41344, 41408, 41392, 0, 32768, 40960, 41472, 41344, + 41408, 41392, 41396, 0, 32768, 40960, 41472, 41344, + 41408, 41392, 41396, 0, 32768, 40960, 41472, 41344, + 41408, 41392, 41400, 41398, 0, 32768, 40960, 41472, + 41344, 41408, 41392, 0, 32768, 40960, 41472, 41344, + 41408, 41409, 41400, 0, 32768, 40960, 41472, 41344, + 41408, 41409, 41400, 0, 32768, 40960, 41472, 41344, + 41408, 41409, 41400, 41402, 0, 32768, 40960, 41472, + 41344, 41408, 41409, 41400, 0, 32768, 40960, 41472, + 41344, 41408, 41409, 41400, 41404, 0, 32768, 40960, + 41472, 41344, 41408, 41409, 41411, 41404, 0, 32768, + 40960, 41472, 41344, 41408, 41409, 41411, 41404, 41406, + 0, 32768, 40960, 41472, 41344, 0, 32768, 40960, + 41472, 41473, 41408, 0, 32768, 40960, 41472, 41473, + 41408, 0, 32768, 40960, 41472, 41473, 41408, 41410, + 0, 32768, 40960, 41472, 41473, 41408, 0, 32768, + 40960, 41472, 41473, 41408, 41412, 0, 32768, 40960, + 41472, 41473, 41408, 41412, 0, 32768, 40960, 41472, + 41473, 41408, 41416, 41414, 0, 32768, 40960, 41472, + 41473, 41408, 0, 32768, 40960, 41472, 41473, 41408, + 41416, 0, 32768, 40960, 41472, 41473, 41408, 41416, + 0, 32768, 40960, 41472, 41473, 41408, 41416, 41418, + 0, 32768, 40960, 41472, 41473, 41408, 41416, 0, + 32768, 40960, 41472, 41473, 41408, 41424, 41420, 0, + 32768, 40960, 41472, 41473, 41408, 41424, 41420, 0, + 32768, 40960, 41472, 41473, 41408, 41424, 41425, 41422, + 0, 32768, 40960, 41472, 41473, 41408, 0, 32768, + 40960, 41472, 41473, 41408, 41424, 0, 32768, 40960, + 41472, 41473, 41408, 41424, 0, 32768, 40960, 41472, + 41473, 41408, 41424, 41426, 0, 32768, 40960, 41472, + 41473, 41408, 41424, 0, 32768, 40960, 41472, 41473, + 41408, 41424, 41428, 0, 32768, 40960, 41472, 41473, + 41408, 41424, 41428, 0, 32768, 40960, 41472, 41473, + 41408, 41424, 41432, 41430, 0, 32768, 40960, 41472, + 41473, 41408, 41424, 0, 32768, 40960, 41472, 41473, + 41408, 41440, 41432, 0, 32768, 40960, 41472, 41473, + 41408, 41440, 41432, 0, 32768, 40960, 41472, 41473, + 41408, 41440, 41432, 41434, 0, 32768, 40960, 41472, + 41473, 41408, 41440, 41432, 0, 32768, 40960, 41472, + 41473, 41408, 41440, 41441, 41436, 0, 32768, 40960, + 41472, 41473, 41408, 41440, 41441, 41436, 0, 32768, + 40960, 41472, 41473, 41408, 41440, 41441, 41436, 41438, + 0, 32768, 40960, 41472, 41473, 41408, 0, 32768, + 40960, 41472, 41473, 41408, 41440, 0, 32768, 40960, + 41472, 41473, 41475, 41440, 0, 32768, 40960, 41472, + 41473, 41475, 41440, 41442, 0, 32768, 40960, 41472, + 41473, 41475, 41440, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41444, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41444, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41448, 41446, 0, 32768, 40960, 41472, + 41473, 41475, 41440, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41448, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41448, 0, 32768, 40960, 41472, 41473, + 41475, 41440, 41448, 41450, 0, 32768, 40960, 41472, + 41473, 41475, 41440, 41448, 0, 32768, 40960, 41472, + 41473, 41475, 41440, 41456, 41452, 0, 32768, 40960, + 41472, 41473, 41475, 41440, 41456, 41452, 0, 32768, + 40960, 41472, 41473, 41475, 41440, 41456, 41457, 41454, + 0, 32768, 40960, 41472, 41473, 41475, 41440, 0, + 32768, 40960, 41472, 41473, 41475, 41440, 41456, 0, + 32768, 40960, 41472, 41473, 41475, 41440, 41456, 0, + 32768, 40960, 41472, 41473, 41475, 41440, 41456, 41458, + 0, 32768, 40960, 41472, 41473, 41475, 41479, 41456, + 0, 32768, 40960, 41472, 41473, 41475, 41479, 41456, + 41460, 0, 32768, 40960, 41472, 41473, 41475, 41479, + 41456, 41460, 0, 32768, 40960, 41472, 41473, 41475, + 41479, 41456, 41464, 41462, 0, 32768, 40960, 41472, + 41473, 41475, 41479, 41456, 0, 32768, 40960, 41472, + 41473, 41475, 41479, 41456, 41464, 0, 32768, 40960, + 41472, 41473, 41475, 41479, 41456, 41464, 0, 32768, + 40960, 41472, 41473, 41475, 41479, 41456, 41464, 41466, + 0, 32768, 40960, 41472, 41473, 41475, 41479, 41456, + 41464, 0, 32768, 40960, 41472, 41473, 41475, 41479, + 41456, 41464, 41468, 0, 32768, 40960, 41472, 41473, + 41475, 41479, 41456, 41464, 41468, 0, 32768, 40960, + 41472, 41473, 41475, 41479, 41456, 41464, 41468, 41470, + 0, 32768, 40960, 0, 32768, 40960, 41472, 0, + 32768, 40960, 41472, 0, 32768, 40960, 41472, 41474, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41472, + 41476, 0, 32768, 40960, 41472, 41476, 0, 32768, + 40960, 41472, 41480, 41478, 0, 32768, 40960, 41472, + 0, 32768, 40960, 41472, 41480, 0, 32768, 40960, + 41472, 41480, 0, 32768, 40960, 41472, 41480, 41482, + 0, 32768, 40960, 41472, 41480, 0, 32768, 40960, + 41472, 41488, 41484, 0, 32768, 40960, 41472, 41488, + 41484, 0, 32768, 40960, 41472, 41488, 41489, 41486, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41472, + 41488, 0, 32768, 40960, 41472, 41488, 0, 32768, + 40960, 41472, 41488, 41490, 0, 32768, 40960, 41472, + 41488, 0, 32768, 40960, 41472, 41488, 41492, 0, + 32768, 40960, 41472, 41488, 41492, 0, 32768, 40960, + 41472, 41488, 41496, 41494, 0, 32768, 40960, 41472, + 41488, 0, 32768, 40960, 41472, 41504, 41496, 0, + 32768, 40960, 41472, 41504, 41496, 0, 32768, 40960, + 41472, 41504, 41496, 41498, 0, 32768, 40960, 41472, + 41504, 41496, 0, 32768, 40960, 41472, 41504, 41505, + 41500, 0, 32768, 40960, 41472, 41504, 41505, 41500, + 0, 32768, 40960, 41472, 41504, 41505, 41500, 41502, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41472, + 41504, 0, 32768, 40960, 41472, 41504, 0, 32768, + 40960, 41472, 41504, 41506, 0, 32768, 40960, 41472, + 41504, 0, 32768, 40960, 41472, 41504, 41508, 0, + 32768, 40960, 41472, 41504, 41508, 0, 32768, 40960, + 41472, 41504, 41512, 41510, 0, 32768, 40960, 41472, + 41504, 0, 32768, 40960, 41472, 41504, 41512, 0, + 32768, 40960, 41472, 41504, 41512, 0, 32768, 40960, + 41472, 41504, 41512, 41514, 0, 32768, 40960, 41472, + 41504, 41512, 0, 32768, 40960, 41472, 41504, 41520, + 41516, 0, 32768, 40960, 41472, 41504, 41520, 41516, + 0, 32768, 40960, 41472, 41504, 41520, 41521, 41518, + 0, 32768, 40960, 41472, 41504, 0, 32768, 40960, + 41472, 41536, 41520, 0, 32768, 40960, 41472, 41536, + 41520, 0, 32768, 40960, 41472, 41536, 41520, 41522, + 0, 32768, 40960, 41472, 41536, 41520, 0, 32768, + 40960, 41472, 41536, 41520, 41524, 0, 32768, 40960, + 41472, 41536, 41520, 41524, 0, 32768, 40960, 41472, + 41536, 41520, 41528, 41526, 0, 32768, 40960, 41472, + 41536, 41520, 0, 32768, 40960, 41472, 41536, 41537, + 41528, 0, 32768, 40960, 41472, 41536, 41537, 41528, + 0, 32768, 40960, 41472, 41536, 41537, 41528, 41530, + 0, 32768, 40960, 41472, 41536, 41537, 41528, 0, + 32768, 40960, 41472, 41536, 41537, 41528, 41532, 0, + 32768, 40960, 41472, 41536, 41537, 41539, 41532, 0, + 32768, 40960, 41472, 41536, 41537, 41539, 41532, 41534, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41472, + 41536, 0, 32768, 40960, 41472, 41536, 0, 32768, + 40960, 41472, 41536, 41538, 0, 32768, 40960, 41472, + 41536, 0, 32768, 40960, 41472, 41536, 41540, 0, + 32768, 40960, 41472, 41536, 41540, 0, 32768, 40960, + 41472, 41536, 41544, 41542, 0, 32768, 40960, 41472, + 41536, 0, 32768, 40960, 41472, 41536, 41544, 0, + 32768, 40960, 41472, 41536, 41544, 0, 32768, 40960, + 41472, 41536, 41544, 41546, 0, 32768, 40960, 41472, + 41536, 41544, 0, 32768, 40960, 41472, 41536, 41552, + 41548, 0, 32768, 40960, 41472, 41536, 41552, 41548, + 0, 32768, 40960, 41472, 41536, 41552, 41553, 41550, + 0, 32768, 40960, 41472, 41536, 0, 32768, 40960, + 41472, 41536, 41552, 0, 32768, 40960, 41472, 41536, + 41552, 0, 32768, 40960, 41472, 41536, 41552, 41554, + 0, 32768, 40960, 41472, 41536, 41552, 0, 32768, + 40960, 41472, 41536, 41552, 41556, 0, 32768, 40960, + 41472, 41536, 41552, 41556, 0, 32768, 40960, 41472, + 41536, 41552, 41560, 41558, 0, 32768, 40960, 41472, + 41536, 41552, 0, 32768, 40960, 41472, 41536, 41568, + 41560, 0, 32768, 40960, 41472, 41536, 41568, 41560, + 0, 32768, 40960, 41472, 41536, 41568, 41560, 41562, + 0, 32768, 40960, 41472, 41536, 41568, 41560, 0, + 32768, 40960, 41472, 41536, 41568, 41569, 41564, 0, + 32768, 40960, 41472, 41536, 41568, 41569, 41564, 0, + 32768, 40960, 41472, 41536, 41568, 41569, 41564, 41566, + 0, 32768, 40960, 41472, 41536, 0, 32768, 40960, + 41472, 41600, 41568, 0, 32768, 40960, 41472, 41600, + 41568, 0, 32768, 40960, 41472, 41600, 41568, 41570, + 0, 32768, 40960, 41472, 41600, 41568, 0, 32768, + 40960, 41472, 41600, 41568, 41572, 0, 32768, 40960, + 41472, 41600, 41568, 41572, 0, 32768, 40960, 41472, + 41600, 41568, 41576, 41574, 0, 32768, 40960, 41472, + 41600, 41568, 0, 32768, 40960, 41472, 41600, 41568, + 41576, 0, 32768, 40960, 41472, 41600, 41568, 41576, + 0, 32768, 40960, 41472, 41600, 41568, 41576, 41578, + 0, 32768, 40960, 41472, 41600, 41568, 41576, 0, + 32768, 40960, 41472, 41600, 41568, 41584, 41580, 0, + 32768, 40960, 41472, 41600, 41568, 41584, 41580, 0, + 32768, 40960, 41472, 41600, 41568, 41584, 41585, 41582, + 0, 32768, 40960, 41472, 41600, 41568, 0, 32768, + 40960, 41472, 41600, 41601, 41584, 0, 32768, 40960, + 41472, 41600, 41601, 41584, 0, 32768, 40960, 41472, + 41600, 41601, 41584, 41586, 0, 32768, 40960, 41472, + 41600, 41601, 41584, 0, 32768, 40960, 41472, 41600, + 41601, 41584, 41588, 0, 32768, 40960, 41472, 41600, + 41601, 41584, 41588, 0, 32768, 40960, 41472, 41600, + 41601, 41584, 41592, 41590, 0, 32768, 40960, 41472, + 41600, 41601, 41584, 0, 32768, 40960, 41472, 41600, + 41601, 41584, 41592, 0, 32768, 40960, 41472, 41600, + 41601, 41603, 41592, 0, 32768, 40960, 41472, 41600, + 41601, 41603, 41592, 41594, 0, 32768, 40960, 41472, + 41600, 41601, 41603, 41592, 0, 32768, 40960, 41472, + 41600, 41601, 41603, 41592, 41596, 0, 32768, 40960, + 41472, 41600, 41601, 41603, 41592, 41596, 0, 32768, + 40960, 41472, 41600, 41601, 41603, 41592, 41596, 41598, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41472, + 41600, 0, 32768, 40960, 41472, 41600, 0, 32768, + 40960, 41472, 41600, 41602, 0, 32768, 40960, 41472, + 41600, 0, 32768, 40960, 41472, 41600, 41604, 0, + 32768, 40960, 41472, 41600, 41604, 0, 32768, 40960, + 41472, 41600, 41608, 41606, 0, 32768, 40960, 41472, + 41600, 0, 32768, 40960, 41472, 41600, 41608, 0, + 32768, 40960, 41472, 41600, 41608, 0, 32768, 40960, + 41472, 41600, 41608, 41610, 0, 32768, 40960, 41472, + 41600, 41608, 0, 32768, 40960, 41472, 41600, 41616, + 41612, 0, 32768, 40960, 41472, 41600, 41616, 41612, + 0, 32768, 40960, 41472, 41600, 41616, 41617, 41614, + 0, 32768, 40960, 41472, 41600, 0, 32768, 40960, + 41472, 41600, 41616, 0, 32768, 40960, 41472, 41600, + 41616, 0, 32768, 40960, 41472, 41600, 41616, 41618, + 0, 32768, 40960, 41472, 41600, 41616, 0, 32768, + 40960, 41472, 41600, 41616, 41620, 0, 32768, 40960, + 41472, 41600, 41616, 41620, 0, 32768, 40960, 41472, + 41600, 41616, 41624, 41622, 0, 32768, 40960, 41472, + 41600, 41616, 0, 32768, 40960, 41472, 41600, 41632, + 41624, 0, 32768, 40960, 41472, 41600, 41632, 41624, + 0, 32768, 40960, 41472, 41600, 41632, 41624, 41626, + 0, 32768, 40960, 41472, 41600, 41632, 41624, 0, + 32768, 40960, 41472, 41600, 41632, 41633, 41628, 0, + 32768, 40960, 41472, 41600, 41632, 41633, 41628, 0, + 32768, 40960, 41472, 41600, 41632, 41633, 41628, 41630, + 0, 32768, 40960, 41472, 41600, 0, 32768, 40960, + 41472, 41600, 41632, 0, 32768, 40960, 41472, 41600, + 41632, 0, 32768, 40960, 41472, 41600, 41632, 41634, + 0, 32768, 40960, 41472, 41600, 41632, 0, 32768, + 40960, 41472, 41600, 41632, 41636, 0, 32768, 40960, + 41472, 41600, 41632, 41636, 0, 32768, 40960, 41472, + 41600, 41632, 41640, 41638, 0, 32768, 40960, 41472, + 41600, 41632, 0, 32768, 40960, 41472, 41600, 41632, + 41640, 0, 32768, 40960, 41472, 41600, 41632, 41640, + 0, 32768, 40960, 41472, 41600, 41632, 41640, 41642, + 0, 32768, 40960, 41472, 41600, 41632, 41640, 0, + 32768, 40960, 41472, 41600, 41632, 41648, 41644, 0, + 32768, 40960, 41472, 41600, 41632, 41648, 41644, 0, + 32768, 40960, 41472, 41600, 41632, 41648, 41649, 41646, + 0, 32768, 40960, 41472, 41600, 41632, 0, 32768, + 40960, 41472, 41600, 41664, 41648, 0, 32768, 40960, + 41472, 41600, 41664, 41648, 0, 32768, 40960, 41472, + 41600, 41664, 41648, 41650, 0, 32768, 40960, 41472, + 41600, 41664, 41648, 0, 32768, 40960, 41472, 41600, + 41664, 41648, 41652, 0, 32768, 40960, 41472, 41600, + 41664, 41648, 41652, 0, 32768, 40960, 41472, 41600, + 41664, 41648, 41656, 41654, 0, 32768, 40960, 41472, + 41600, 41664, 41648, 0, 32768, 40960, 41472, 41600, + 41664, 41665, 41656, 0, 32768, 40960, 41472, 41600, + 41664, 41665, 41656, 0, 32768, 40960, 41472, 41600, + 41664, 41665, 41656, 41658, 0, 32768, 40960, 41472, + 41600, 41664, 41665, 41656, 0, 32768, 40960, 41472, + 41600, 41664, 41665, 41656, 41660, 0, 32768, 40960, + 41472, 41600, 41664, 41665, 41667, 41660, 0, 32768, + 40960, 41472, 41600, 41664, 41665, 41667, 41660, 41662, + 0, 32768, 40960, 41472, 41600, 0, 32768, 40960, + 41472, 41728, 41664, 0, 32768, 40960, 41472, 41728, + 41664, 0, 32768, 40960, 41472, 41728, 41664, 41666, + 0, 32768, 40960, 41472, 41728, 41664, 0, 32768, + 40960, 41472, 41728, 41664, 41668, 0, 32768, 40960, + 41472, 41728, 41664, 41668, 0, 32768, 40960, 41472, + 41728, 41664, 41672, 41670, 0, 32768, 40960, 41472, + 41728, 41664, 0, 32768, 40960, 41472, 41728, 41664, + 41672, 0, 32768, 40960, 41472, 41728, 41664, 41672, + 0, 32768, 40960, 41472, 41728, 41664, 41672, 41674, + 0, 32768, 40960, 41472, 41728, 41664, 41672, 0, + 32768, 40960, 41472, 41728, 41664, 41680, 41676, 0, + 32768, 40960, 41472, 41728, 41664, 41680, 41676, 0, + 32768, 40960, 41472, 41728, 41664, 41680, 41681, 41678, + 0, 32768, 40960, 41472, 41728, 41664, 0, 32768, + 40960, 41472, 41728, 41664, 41680, 0, 32768, 40960, + 41472, 41728, 41664, 41680, 0, 32768, 40960, 41472, + 41728, 41664, 41680, 41682, 0, 32768, 40960, 41472, + 41728, 41664, 41680, 0, 32768, 40960, 41472, 41728, + 41664, 41680, 41684, 0, 32768, 40960, 41472, 41728, + 41664, 41680, 41684, 0, 32768, 40960, 41472, 41728, + 41664, 41680, 41688, 41686, 0, 32768, 40960, 41472, + 41728, 41664, 41680, 0, 32768, 40960, 41472, 41728, + 41664, 41696, 41688, 0, 32768, 40960, 41472, 41728, + 41664, 41696, 41688, 0, 32768, 40960, 41472, 41728, + 41664, 41696, 41688, 41690, 0, 32768, 40960, 41472, + 41728, 41664, 41696, 41688, 0, 32768, 40960, 41472, + 41728, 41664, 41696, 41697, 41692, 0, 32768, 40960, + 41472, 41728, 41664, 41696, 41697, 41692, 0, 32768, + 40960, 41472, 41728, 41664, 41696, 41697, 41692, 41694, + 0, 32768, 40960, 41472, 41728, 41664, 0, 32768, + 40960, 41472, 41728, 41729, 41696, 0, 32768, 40960, + 41472, 41728, 41729, 41696, 0, 32768, 40960, 41472, + 41728, 41729, 41696, 41698, 0, 32768, 40960, 41472, + 41728, 41729, 41696, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41700, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41700, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41704, 41702, 0, 32768, 40960, 41472, + 41728, 41729, 41696, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41704, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41704, 0, 32768, 40960, 41472, 41728, + 41729, 41696, 41704, 41706, 0, 32768, 40960, 41472, + 41728, 41729, 41696, 41704, 0, 32768, 40960, 41472, + 41728, 41729, 41696, 41712, 41708, 0, 32768, 40960, + 41472, 41728, 41729, 41696, 41712, 41708, 0, 32768, + 40960, 41472, 41728, 41729, 41696, 41712, 41713, 41710, + 0, 32768, 40960, 41472, 41728, 41729, 41696, 0, + 32768, 40960, 41472, 41728, 41729, 41696, 41712, 0, + 32768, 40960, 41472, 41728, 41729, 41731, 41712, 0, + 32768, 40960, 41472, 41728, 41729, 41731, 41712, 41714, + 0, 32768, 40960, 41472, 41728, 41729, 41731, 41712, + 0, 32768, 40960, 41472, 41728, 41729, 41731, 41712, + 41716, 0, 32768, 40960, 41472, 41728, 41729, 41731, + 41712, 41716, 0, 32768, 40960, 41472, 41728, 41729, + 41731, 41712, 41720, 41718, 0, 32768, 40960, 41472, + 41728, 41729, 41731, 41712, 0, 32768, 40960, 41472, + 41728, 41729, 41731, 41712, 41720, 0, 32768, 40960, + 41472, 41728, 41729, 41731, 41712, 41720, 0, 32768, + 40960, 41472, 41728, 41729, 41731, 41712, 41720, 41722, + 0, 32768, 40960, 41472, 41728, 41729, 41731, 41735, + 41720, 0, 32768, 40960, 41472, 41728, 41729, 41731, + 41735, 41720, 41724, 0, 32768, 40960, 41472, 41728, + 41729, 41731, 41735, 41720, 41724, 0, 32768, 40960, + 41472, 41728, 41729, 41731, 41735, 41720, 41724, 41726, + 0, 32768, 40960, 41472, 0, 32768, 40960, 41984, + 41728, 0, 32768, 40960, 41984, 41728, 0, 32768, + 40960, 41984, 41728, 41730, 0, 32768, 40960, 41984, + 41728, 0, 32768, 40960, 41984, 41728, 41732, 0, + 32768, 40960, 41984, 41728, 41732, 0, 32768, 40960, + 41984, 41728, 41736, 41734, 0, 32768, 40960, 41984, + 41728, 0, 32768, 40960, 41984, 41728, 41736, 0, + 32768, 40960, 41984, 41728, 41736, 0, 32768, 40960, + 41984, 41728, 41736, 41738, 0, 32768, 40960, 41984, + 41728, 41736, 0, 32768, 40960, 41984, 41728, 41744, + 41740, 0, 32768, 40960, 41984, 41728, 41744, 41740, + 0, 32768, 40960, 41984, 41728, 41744, 41745, 41742, + 0, 32768, 40960, 41984, 41728, 0, 32768, 40960, + 41984, 41728, 41744, 0, 32768, 40960, 41984, 41728, + 41744, 0, 32768, 40960, 41984, 41728, 41744, 41746, + 0, 32768, 40960, 41984, 41728, 41744, 0, 32768, + 40960, 41984, 41728, 41744, 41748, 0, 32768, 40960, + 41984, 41728, 41744, 41748, 0, 32768, 40960, 41984, + 41728, 41744, 41752, 41750, 0, 32768, 40960, 41984, + 41728, 41744, 0, 32768, 40960, 41984, 41728, 41760, + 41752, 0, 32768, 40960, 41984, 41728, 41760, 41752, + 0, 32768, 40960, 41984, 41728, 41760, 41752, 41754, + 0, 32768, 40960, 41984, 41728, 41760, 41752, 0, + 32768, 40960, 41984, 41728, 41760, 41761, 41756, 0, + 32768, 40960, 41984, 41728, 41760, 41761, 41756, 0, + 32768, 40960, 41984, 41728, 41760, 41761, 41756, 41758, + 0, 32768, 40960, 41984, 41728, 0, 32768, 40960, + 41984, 41728, 41760, 0, 32768, 40960, 41984, 41728, + 41760, 0, 32768, 40960, 41984, 41728, 41760, 41762, + 0, 32768, 40960, 41984, 41728, 41760, 0, 32768, + 40960, 41984, 41728, 41760, 41764, 0, 32768, 40960, + 41984, 41728, 41760, 41764, 0, 32768, 40960, 41984, + 41728, 41760, 41768, 41766, 0, 32768, 40960, 41984, + 41728, 41760, 0, 32768, 40960, 41984, 41728, 41760, + 41768, 0, 32768, 40960, 41984, 41728, 41760, 41768, + 0, 32768, 40960, 41984, 41728, 41760, 41768, 41770, + 0, 32768, 40960, 41984, 41728, 41760, 41768, 0, + 32768, 40960, 41984, 41728, 41760, 41776, 41772, 0, + 32768, 40960, 41984, 41728, 41760, 41776, 41772, 0, + 32768, 40960, 41984, 41728, 41760, 41776, 41777, 41774, + 0, 32768, 40960, 41984, 41728, 41760, 0, 32768, + 40960, 41984, 41728, 41792, 41776, 0, 32768, 40960, + 41984, 41728, 41792, 41776, 0, 32768, 40960, 41984, + 41728, 41792, 41776, 41778, 0, 32768, 40960, 41984, + 41728, 41792, 41776, 0, 32768, 40960, 41984, 41728, + 41792, 41776, 41780, 0, 32768, 40960, 41984, 41728, + 41792, 41776, 41780, 0, 32768, 40960, 41984, 41728, + 41792, 41776, 41784, 41782, 0, 32768, 40960, 41984, + 41728, 41792, 41776, 0, 32768, 40960, 41984, 41728, + 41792, 41793, 41784, 0, 32768, 40960, 41984, 41728, + 41792, 41793, 41784, 0, 32768, 40960, 41984, 41728, + 41792, 41793, 41784, 41786, 0, 32768, 40960, 41984, + 41728, 41792, 41793, 41784, 0, 32768, 40960, 41984, + 41728, 41792, 41793, 41784, 41788, 0, 32768, 40960, + 41984, 41728, 41792, 41793, 41795, 41788, 0, 32768, + 40960, 41984, 41728, 41792, 41793, 41795, 41788, 41790, + 0, 32768, 40960, 41984, 41728, 0, 32768, 40960, + 41984, 41728, 41792, 0, 32768, 40960, 41984, 41728, + 41792, 0, 32768, 40960, 41984, 41728, 41792, 41794, + 0, 32768, 40960, 41984, 41728, 41792, 0, 32768, + 40960, 41984, 41728, 41792, 41796, 0, 32768, 40960, + 41984, 41728, 41792, 41796, 0, 32768, 40960, 41984, + 41728, 41792, 41800, 41798, 0, 32768, 40960, 41984, + 41728, 41792, 0, 32768, 40960, 41984, 41728, 41792, + 41800, 0, 32768, 40960, 41984, 41728, 41792, 41800, + 0, 32768, 40960, 41984, 41728, 41792, 41800, 41802, + 0, 32768, 40960, 41984, 41728, 41792, 41800, 0, + 32768, 40960, 41984, 41728, 41792, 41808, 41804, 0, + 32768, 40960, 41984, 41728, 41792, 41808, 41804, 0, + 32768, 40960, 41984, 41728, 41792, 41808, 41809, 41806, + 0, 32768, 40960, 41984, 41728, 41792, 0, 32768, + 40960, 41984, 41728, 41792, 41808, 0, 32768, 40960, + 41984, 41728, 41792, 41808, 0, 32768, 40960, 41984, + 41728, 41792, 41808, 41810, 0, 32768, 40960, 41984, + 41728, 41792, 41808, 0, 32768, 40960, 41984, 41728, + 41792, 41808, 41812, 0, 32768, 40960, 41984, 41728, + 41792, 41808, 41812, 0, 32768, 40960, 41984, 41728, + 41792, 41808, 41816, 41814, 0, 32768, 40960, 41984, + 41728, 41792, 41808, 0, 32768, 40960, 41984, 41728, + 41792, 41824, 41816, 0, 32768, 40960, 41984, 41728, + 41792, 41824, 41816, 0, 32768, 40960, 41984, 41728, + 41792, 41824, 41816, 41818, 0, 32768, 40960, 41984, + 41728, 41792, 41824, 41816, 0, 32768, 40960, 41984, + 41728, 41792, 41824, 41825, 41820, 0, 32768, 40960, + 41984, 41728, 41792, 41824, 41825, 41820, 0, 32768, + 40960, 41984, 41728, 41792, 41824, 41825, 41820, 41822, + 0, 32768, 40960, 41984, 41728, 41792, 0, 32768, + 40960, 41984, 41728, 41856, 41824, 0, 32768, 40960, + 41984, 41728, 41856, 41824, 0, 32768, 40960, 41984, + 41728, 41856, 41824, 41826, 0, 32768, 40960, 41984, + 41728, 41856, 41824, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41828, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41828, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41832, 41830, 0, 32768, 40960, 41984, + 41728, 41856, 41824, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41832, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41832, 0, 32768, 40960, 41984, 41728, + 41856, 41824, 41832, 41834, 0, 32768, 40960, 41984, + 41728, 41856, 41824, 41832, 0, 32768, 40960, 41984, + 41728, 41856, 41824, 41840, 41836, 0, 32768, 40960, + 41984, 41728, 41856, 41824, 41840, 41836, 0, 32768, + 40960, 41984, 41728, 41856, 41824, 41840, 41841, 41838, + 0, 32768, 40960, 41984, 41728, 41856, 41824, 0, + 32768, 40960, 41984, 41728, 41856, 41857, 41840, 0, + 32768, 40960, 41984, 41728, 41856, 41857, 41840, 0, + 32768, 40960, 41984, 41728, 41856, 41857, 41840, 41842, + 0, 32768, 40960, 41984, 41728, 41856, 41857, 41840, + 0, 32768, 40960, 41984, 41728, 41856, 41857, 41840, + 41844, 0, 32768, 40960, 41984, 41728, 41856, 41857, + 41840, 41844, 0, 32768, 40960, 41984, 41728, 41856, + 41857, 41840, 41848, 41846, 0, 32768, 40960, 41984, + 41728, 41856, 41857, 41840, 0, 32768, 40960, 41984, + 41728, 41856, 41857, 41840, 41848, 0, 32768, 40960, + 41984, 41728, 41856, 41857, 41859, 41848, 0, 32768, + 40960, 41984, 41728, 41856, 41857, 41859, 41848, 41850, + 0, 32768, 40960, 41984, 41728, 41856, 41857, 41859, + 41848, 0, 32768, 40960, 41984, 41728, 41856, 41857, + 41859, 41848, 41852, 0, 32768, 40960, 41984, 41728, + 41856, 41857, 41859, 41848, 41852, 0, 32768, 40960, + 41984, 41728, 41856, 41857, 41859, 41848, 41852, 41854, + 0, 32768, 40960, 41984, 41728, 0, 32768, 40960, + 41984, 41728, 41856, 0, 32768, 40960, 41984, 41985, + 41856, 0, 32768, 40960, 41984, 41985, 41856, 41858, + 0, 32768, 40960, 41984, 41985, 41856, 0, 32768, + 40960, 41984, 41985, 41856, 41860, 0, 32768, 40960, + 41984, 41985, 41856, 41860, 0, 32768, 40960, 41984, + 41985, 41856, 41864, 41862, 0, 32768, 40960, 41984, + 41985, 41856, 0, 32768, 40960, 41984, 41985, 41856, + 41864, 0, 32768, 40960, 41984, 41985, 41856, 41864, + 0, 32768, 40960, 41984, 41985, 41856, 41864, 41866, + 0, 32768, 40960, 41984, 41985, 41856, 41864, 0, + 32768, 40960, 41984, 41985, 41856, 41872, 41868, 0, + 32768, 40960, 41984, 41985, 41856, 41872, 41868, 0, + 32768, 40960, 41984, 41985, 41856, 41872, 41873, 41870, + 0, 32768, 40960, 41984, 41985, 41856, 0, 32768, + 40960, 41984, 41985, 41856, 41872, 0, 32768, 40960, + 41984, 41985, 41856, 41872, 0, 32768, 40960, 41984, + 41985, 41856, 41872, 41874, 0, 32768, 40960, 41984, + 41985, 41856, 41872, 0, 32768, 40960, 41984, 41985, + 41856, 41872, 41876, 0, 32768, 40960, 41984, 41985, + 41856, 41872, 41876, 0, 32768, 40960, 41984, 41985, + 41856, 41872, 41880, 41878, 0, 32768, 40960, 41984, + 41985, 41856, 41872, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41880, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41880, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41880, 41882, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 41880, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 41889, 41884, 0, 32768, 40960, + 41984, 41985, 41856, 41888, 41889, 41884, 0, 32768, + 40960, 41984, 41985, 41856, 41888, 41889, 41884, 41886, + 0, 32768, 40960, 41984, 41985, 41856, 0, 32768, + 40960, 41984, 41985, 41856, 41888, 0, 32768, 40960, + 41984, 41985, 41856, 41888, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 41890, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41892, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41892, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41896, 41894, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41896, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41896, 0, 32768, 40960, 41984, 41985, + 41856, 41888, 41896, 41898, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 41896, 0, 32768, 40960, 41984, + 41985, 41856, 41888, 41904, 41900, 0, 32768, 40960, + 41984, 41985, 41856, 41888, 41904, 41900, 0, 32768, + 40960, 41984, 41985, 41856, 41888, 41904, 41905, 41902, + 0, 32768, 40960, 41984, 41985, 41856, 41888, 0, + 32768, 40960, 41984, 41985, 41856, 41920, 41904, 0, + 32768, 40960, 41984, 41985, 41856, 41920, 41904, 0, + 32768, 40960, 41984, 41985, 41856, 41920, 41904, 41906, + 0, 32768, 40960, 41984, 41985, 41856, 41920, 41904, + 0, 32768, 40960, 41984, 41985, 41856, 41920, 41904, + 41908, 0, 32768, 40960, 41984, 41985, 41856, 41920, + 41904, 41908, 0, 32768, 40960, 41984, 41985, 41856, + 41920, 41904, 41912, 41910, 0, 32768, 40960, 41984, + 41985, 41856, 41920, 41904, 0, 32768, 40960, 41984, + 41985, 41856, 41920, 41921, 41912, 0, 32768, 40960, + 41984, 41985, 41856, 41920, 41921, 41912, 0, 32768, + 40960, 41984, 41985, 41856, 41920, 41921, 41912, 41914, + 0, 32768, 40960, 41984, 41985, 41856, 41920, 41921, + 41912, 0, 32768, 40960, 41984, 41985, 41856, 41920, + 41921, 41912, 41916, 0, 32768, 40960, 41984, 41985, + 41856, 41920, 41921, 41923, 41916, 0, 32768, 40960, + 41984, 41985, 41856, 41920, 41921, 41923, 41916, 41918, + 0, 32768, 40960, 41984, 41985, 41856, 0, 32768, + 40960, 41984, 41985, 41856, 41920, 0, 32768, 40960, + 41984, 41985, 41856, 41920, 0, 32768, 40960, 41984, + 41985, 41856, 41920, 41922, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41924, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41924, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41928, 41926, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41928, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41928, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41928, 41930, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 41928, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 41936, 41932, 0, 32768, 40960, + 41984, 41985, 41987, 41920, 41936, 41932, 0, 32768, + 40960, 41984, 41985, 41987, 41920, 41936, 41937, 41934, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41936, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41936, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41936, 41938, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 41936, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 41936, + 41940, 0, 32768, 40960, 41984, 41985, 41987, 41920, + 41936, 41940, 0, 32768, 40960, 41984, 41985, 41987, + 41920, 41936, 41944, 41942, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 41936, 0, 32768, 40960, 41984, + 41985, 41987, 41920, 41952, 41944, 0, 32768, 40960, + 41984, 41985, 41987, 41920, 41952, 41944, 0, 32768, + 40960, 41984, 41985, 41987, 41920, 41952, 41944, 41946, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 41952, + 41944, 0, 32768, 40960, 41984, 41985, 41987, 41920, + 41952, 41953, 41948, 0, 32768, 40960, 41984, 41985, + 41987, 41920, 41952, 41953, 41948, 0, 32768, 40960, + 41984, 41985, 41987, 41920, 41952, 41953, 41948, 41950, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41952, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41952, 0, + 32768, 40960, 41984, 41985, 41987, 41920, 41952, 41954, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 41952, + 0, 32768, 40960, 41984, 41985, 41987, 41920, 41952, + 41956, 0, 32768, 40960, 41984, 41985, 41987, 41920, + 41952, 41956, 0, 32768, 40960, 41984, 41985, 41987, + 41920, 41952, 41960, 41958, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 41960, 0, 32768, 40960, + 41984, 41985, 41987, 41991, 41952, 41960, 0, 32768, + 40960, 41984, 41985, 41987, 41991, 41952, 41960, 41962, + 0, 32768, 40960, 41984, 41985, 41987, 41991, 41952, + 41960, 0, 32768, 40960, 41984, 41985, 41987, 41991, + 41952, 41968, 41964, 0, 32768, 40960, 41984, 41985, + 41987, 41991, 41952, 41968, 41964, 0, 32768, 40960, + 41984, 41985, 41987, 41991, 41952, 41968, 41969, 41966, + 0, 32768, 40960, 41984, 41985, 41987, 41991, 41952, + 0, 32768, 40960, 41984, 41985, 41987, 41991, 41952, + 41968, 0, 32768, 40960, 41984, 41985, 41987, 41991, + 41952, 41968, 0, 32768, 40960, 41984, 41985, 41987, + 41991, 41952, 41968, 41970, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 41968, 0, 32768, 40960, + 41984, 41985, 41987, 41991, 41952, 41968, 41972, 0, + 32768, 40960, 41984, 41985, 41987, 41991, 41952, 41968, + 41972, 0, 32768, 40960, 41984, 41985, 41987, 41991, + 41952, 41968, 41976, 41974, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 41968, 0, 32768, 40960, + 41984, 41985, 41987, 41991, 41952, 41968, 41976, 0, + 32768, 40960, 41984, 41985, 41987, 41991, 41952, 41968, + 41976, 0, 32768, 40960, 41984, 41985, 41987, 41991, + 41952, 41968, 41976, 41978, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 41968, 41976, 0, 32768, + 40960, 41984, 41985, 41987, 41991, 41952, 41968, 41976, + 41980, 0, 32768, 40960, 41984, 41985, 41987, 41991, + 41952, 41968, 41976, 41980, 0, 32768, 40960, 41984, + 41985, 41987, 41991, 41952, 41968, 41976, 41980, 41982, + 0, 32768, 40960, 0, 32768, 40960, 41984, 0, + 32768, 40960, 41984, 0, 32768, 40960, 41984, 41986, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 41988, 0, 32768, 40960, 41984, 41988, 0, 32768, + 40960, 41984, 41992, 41990, 0, 32768, 40960, 41984, + 0, 32768, 40960, 41984, 41992, 0, 32768, 40960, + 41984, 41992, 0, 32768, 40960, 41984, 41992, 41994, + 0, 32768, 40960, 41984, 41992, 0, 32768, 40960, + 41984, 42000, 41996, 0, 32768, 40960, 41984, 42000, + 41996, 0, 32768, 40960, 41984, 42000, 42001, 41998, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 42000, 0, 32768, 40960, 41984, 42000, 0, 32768, + 40960, 41984, 42000, 42002, 0, 32768, 40960, 41984, + 42000, 0, 32768, 40960, 41984, 42000, 42004, 0, + 32768, 40960, 41984, 42000, 42004, 0, 32768, 40960, + 41984, 42000, 42008, 42006, 0, 32768, 40960, 41984, + 42000, 0, 32768, 40960, 41984, 42016, 42008, 0, + 32768, 40960, 41984, 42016, 42008, 0, 32768, 40960, + 41984, 42016, 42008, 42010, 0, 32768, 40960, 41984, + 42016, 42008, 0, 32768, 40960, 41984, 42016, 42017, + 42012, 0, 32768, 40960, 41984, 42016, 42017, 42012, + 0, 32768, 40960, 41984, 42016, 42017, 42012, 42014, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 42016, 0, 32768, 40960, 41984, 42016, 0, 32768, + 40960, 41984, 42016, 42018, 0, 32768, 40960, 41984, + 42016, 0, 32768, 40960, 41984, 42016, 42020, 0, + 32768, 40960, 41984, 42016, 42020, 0, 32768, 40960, + 41984, 42016, 42024, 42022, 0, 32768, 40960, 41984, + 42016, 0, 32768, 40960, 41984, 42016, 42024, 0, + 32768, 40960, 41984, 42016, 42024, 0, 32768, 40960, + 41984, 42016, 42024, 42026, 0, 32768, 40960, 41984, + 42016, 42024, 0, 32768, 40960, 41984, 42016, 42032, + 42028, 0, 32768, 40960, 41984, 42016, 42032, 42028, + 0, 32768, 40960, 41984, 42016, 42032, 42033, 42030, + 0, 32768, 40960, 41984, 42016, 0, 32768, 40960, + 41984, 42048, 42032, 0, 32768, 40960, 41984, 42048, + 42032, 0, 32768, 40960, 41984, 42048, 42032, 42034, + 0, 32768, 40960, 41984, 42048, 42032, 0, 32768, + 40960, 41984, 42048, 42032, 42036, 0, 32768, 40960, + 41984, 42048, 42032, 42036, 0, 32768, 40960, 41984, + 42048, 42032, 42040, 42038, 0, 32768, 40960, 41984, + 42048, 42032, 0, 32768, 40960, 41984, 42048, 42049, + 42040, 0, 32768, 40960, 41984, 42048, 42049, 42040, + 0, 32768, 40960, 41984, 42048, 42049, 42040, 42042, + 0, 32768, 40960, 41984, 42048, 42049, 42040, 0, + 32768, 40960, 41984, 42048, 42049, 42040, 42044, 0, + 32768, 40960, 41984, 42048, 42049, 42051, 42044, 0, + 32768, 40960, 41984, 42048, 42049, 42051, 42044, 42046, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 42048, 0, 32768, 40960, 41984, 42048, 0, 32768, + 40960, 41984, 42048, 42050, 0, 32768, 40960, 41984, + 42048, 0, 32768, 40960, 41984, 42048, 42052, 0, + 32768, 40960, 41984, 42048, 42052, 0, 32768, 40960, + 41984, 42048, 42056, 42054, 0, 32768, 40960, 41984, + 42048, 0, 32768, 40960, 41984, 42048, 42056, 0, + 32768, 40960, 41984, 42048, 42056, 0, 32768, 40960, + 41984, 42048, 42056, 42058, 0, 32768, 40960, 41984, + 42048, 42056, 0, 32768, 40960, 41984, 42048, 42064, + 42060, 0, 32768, 40960, 41984, 42048, 42064, 42060, + 0, 32768, 40960, 41984, 42048, 42064, 42065, 42062, + 0, 32768, 40960, 41984, 42048, 0, 32768, 40960, + 41984, 42048, 42064, 0, 32768, 40960, 41984, 42048, + 42064, 0, 32768, 40960, 41984, 42048, 42064, 42066, + 0, 32768, 40960, 41984, 42048, 42064, 0, 32768, + 40960, 41984, 42048, 42064, 42068, 0, 32768, 40960, + 41984, 42048, 42064, 42068, 0, 32768, 40960, 41984, + 42048, 42064, 42072, 42070, 0, 32768, 40960, 41984, + 42048, 42064, 0, 32768, 40960, 41984, 42048, 42080, + 42072, 0, 32768, 40960, 41984, 42048, 42080, 42072, + 0, 32768, 40960, 41984, 42048, 42080, 42072, 42074, + 0, 32768, 40960, 41984, 42048, 42080, 42072, 0, + 32768, 40960, 41984, 42048, 42080, 42081, 42076, 0, + 32768, 40960, 41984, 42048, 42080, 42081, 42076, 0, + 32768, 40960, 41984, 42048, 42080, 42081, 42076, 42078, + 0, 32768, 40960, 41984, 42048, 0, 32768, 40960, + 41984, 42112, 42080, 0, 32768, 40960, 41984, 42112, + 42080, 0, 32768, 40960, 41984, 42112, 42080, 42082, + 0, 32768, 40960, 41984, 42112, 42080, 0, 32768, + 40960, 41984, 42112, 42080, 42084, 0, 32768, 40960, + 41984, 42112, 42080, 42084, 0, 32768, 40960, 41984, + 42112, 42080, 42088, 42086, 0, 32768, 40960, 41984, + 42112, 42080, 0, 32768, 40960, 41984, 42112, 42080, + 42088, 0, 32768, 40960, 41984, 42112, 42080, 42088, + 0, 32768, 40960, 41984, 42112, 42080, 42088, 42090, + 0, 32768, 40960, 41984, 42112, 42080, 42088, 0, + 32768, 40960, 41984, 42112, 42080, 42096, 42092, 0, + 32768, 40960, 41984, 42112, 42080, 42096, 42092, 0, + 32768, 40960, 41984, 42112, 42080, 42096, 42097, 42094, + 0, 32768, 40960, 41984, 42112, 42080, 0, 32768, + 40960, 41984, 42112, 42113, 42096, 0, 32768, 40960, + 41984, 42112, 42113, 42096, 0, 32768, 40960, 41984, + 42112, 42113, 42096, 42098, 0, 32768, 40960, 41984, + 42112, 42113, 42096, 0, 32768, 40960, 41984, 42112, + 42113, 42096, 42100, 0, 32768, 40960, 41984, 42112, + 42113, 42096, 42100, 0, 32768, 40960, 41984, 42112, + 42113, 42096, 42104, 42102, 0, 32768, 40960, 41984, + 42112, 42113, 42096, 0, 32768, 40960, 41984, 42112, + 42113, 42096, 42104, 0, 32768, 40960, 41984, 42112, + 42113, 42115, 42104, 0, 32768, 40960, 41984, 42112, + 42113, 42115, 42104, 42106, 0, 32768, 40960, 41984, + 42112, 42113, 42115, 42104, 0, 32768, 40960, 41984, + 42112, 42113, 42115, 42104, 42108, 0, 32768, 40960, + 41984, 42112, 42113, 42115, 42104, 42108, 0, 32768, + 40960, 41984, 42112, 42113, 42115, 42104, 42108, 42110, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 42112, 0, 32768, 40960, 41984, 42112, 0, 32768, + 40960, 41984, 42112, 42114, 0, 32768, 40960, 41984, + 42112, 0, 32768, 40960, 41984, 42112, 42116, 0, + 32768, 40960, 41984, 42112, 42116, 0, 32768, 40960, + 41984, 42112, 42120, 42118, 0, 32768, 40960, 41984, + 42112, 0, 32768, 40960, 41984, 42112, 42120, 0, + 32768, 40960, 41984, 42112, 42120, 0, 32768, 40960, + 41984, 42112, 42120, 42122, 0, 32768, 40960, 41984, + 42112, 42120, 0, 32768, 40960, 41984, 42112, 42128, + 42124, 0, 32768, 40960, 41984, 42112, 42128, 42124, + 0, 32768, 40960, 41984, 42112, 42128, 42129, 42126, + 0, 32768, 40960, 41984, 42112, 0, 32768, 40960, + 41984, 42112, 42128, 0, 32768, 40960, 41984, 42112, + 42128, 0, 32768, 40960, 41984, 42112, 42128, 42130, + 0, 32768, 40960, 41984, 42112, 42128, 0, 32768, + 40960, 41984, 42112, 42128, 42132, 0, 32768, 40960, + 41984, 42112, 42128, 42132, 0, 32768, 40960, 41984, + 42112, 42128, 42136, 42134, 0, 32768, 40960, 41984, + 42112, 42128, 0, 32768, 40960, 41984, 42112, 42144, + 42136, 0, 32768, 40960, 41984, 42112, 42144, 42136, + 0, 32768, 40960, 41984, 42112, 42144, 42136, 42138, + 0, 32768, 40960, 41984, 42112, 42144, 42136, 0, + 32768, 40960, 41984, 42112, 42144, 42145, 42140, 0, + 32768, 40960, 41984, 42112, 42144, 42145, 42140, 0, + 32768, 40960, 41984, 42112, 42144, 42145, 42140, 42142, + 0, 32768, 40960, 41984, 42112, 0, 32768, 40960, + 41984, 42112, 42144, 0, 32768, 40960, 41984, 42112, + 42144, 0, 32768, 40960, 41984, 42112, 42144, 42146, + 0, 32768, 40960, 41984, 42112, 42144, 0, 32768, + 40960, 41984, 42112, 42144, 42148, 0, 32768, 40960, + 41984, 42112, 42144, 42148, 0, 32768, 40960, 41984, + 42112, 42144, 42152, 42150, 0, 32768, 40960, 41984, + 42112, 42144, 0, 32768, 40960, 41984, 42112, 42144, + 42152, 0, 32768, 40960, 41984, 42112, 42144, 42152, + 0, 32768, 40960, 41984, 42112, 42144, 42152, 42154, + 0, 32768, 40960, 41984, 42112, 42144, 42152, 0, + 32768, 40960, 41984, 42112, 42144, 42160, 42156, 0, + 32768, 40960, 41984, 42112, 42144, 42160, 42156, 0, + 32768, 40960, 41984, 42112, 42144, 42160, 42161, 42158, + 0, 32768, 40960, 41984, 42112, 42144, 0, 32768, + 40960, 41984, 42112, 42176, 42160, 0, 32768, 40960, + 41984, 42112, 42176, 42160, 0, 32768, 40960, 41984, + 42112, 42176, 42160, 42162, 0, 32768, 40960, 41984, + 42112, 42176, 42160, 0, 32768, 40960, 41984, 42112, + 42176, 42160, 42164, 0, 32768, 40960, 41984, 42112, + 42176, 42160, 42164, 0, 32768, 40960, 41984, 42112, + 42176, 42160, 42168, 42166, 0, 32768, 40960, 41984, + 42112, 42176, 42160, 0, 32768, 40960, 41984, 42112, + 42176, 42177, 42168, 0, 32768, 40960, 41984, 42112, + 42176, 42177, 42168, 0, 32768, 40960, 41984, 42112, + 42176, 42177, 42168, 42170, 0, 32768, 40960, 41984, + 42112, 42176, 42177, 42168, 0, 32768, 40960, 41984, + 42112, 42176, 42177, 42168, 42172, 0, 32768, 40960, + 41984, 42112, 42176, 42177, 42179, 42172, 0, 32768, + 40960, 41984, 42112, 42176, 42177, 42179, 42172, 42174, + 0, 32768, 40960, 41984, 42112, 0, 32768, 40960, + 41984, 42240, 42176, 0, 32768, 40960, 41984, 42240, + 42176, 0, 32768, 40960, 41984, 42240, 42176, 42178, + 0, 32768, 40960, 41984, 42240, 42176, 0, 32768, + 40960, 41984, 42240, 42176, 42180, 0, 32768, 40960, + 41984, 42240, 42176, 42180, 0, 32768, 40960, 41984, + 42240, 42176, 42184, 42182, 0, 32768, 40960, 41984, + 42240, 42176, 0, 32768, 40960, 41984, 42240, 42176, + 42184, 0, 32768, 40960, 41984, 42240, 42176, 42184, + 0, 32768, 40960, 41984, 42240, 42176, 42184, 42186, + 0, 32768, 40960, 41984, 42240, 42176, 42184, 0, + 32768, 40960, 41984, 42240, 42176, 42192, 42188, 0, + 32768, 40960, 41984, 42240, 42176, 42192, 42188, 0, + 32768, 40960, 41984, 42240, 42176, 42192, 42193, 42190, + 0, 32768, 40960, 41984, 42240, 42176, 0, 32768, + 40960, 41984, 42240, 42176, 42192, 0, 32768, 40960, + 41984, 42240, 42176, 42192, 0, 32768, 40960, 41984, + 42240, 42176, 42192, 42194, 0, 32768, 40960, 41984, + 42240, 42176, 42192, 0, 32768, 40960, 41984, 42240, + 42176, 42192, 42196, 0, 32768, 40960, 41984, 42240, + 42176, 42192, 42196, 0, 32768, 40960, 41984, 42240, + 42176, 42192, 42200, 42198, 0, 32768, 40960, 41984, + 42240, 42176, 42192, 0, 32768, 40960, 41984, 42240, + 42176, 42208, 42200, 0, 32768, 40960, 41984, 42240, + 42176, 42208, 42200, 0, 32768, 40960, 41984, 42240, + 42176, 42208, 42200, 42202, 0, 32768, 40960, 41984, + 42240, 42176, 42208, 42200, 0, 32768, 40960, 41984, + 42240, 42176, 42208, 42209, 42204, 0, 32768, 40960, + 41984, 42240, 42176, 42208, 42209, 42204, 0, 32768, + 40960, 41984, 42240, 42176, 42208, 42209, 42204, 42206, + 0, 32768, 40960, 41984, 42240, 42176, 0, 32768, + 40960, 41984, 42240, 42241, 42208, 0, 32768, 40960, + 41984, 42240, 42241, 42208, 0, 32768, 40960, 41984, + 42240, 42241, 42208, 42210, 0, 32768, 40960, 41984, + 42240, 42241, 42208, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42212, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42212, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42216, 42214, 0, 32768, 40960, 41984, + 42240, 42241, 42208, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42216, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42216, 0, 32768, 40960, 41984, 42240, + 42241, 42208, 42216, 42218, 0, 32768, 40960, 41984, + 42240, 42241, 42208, 42216, 0, 32768, 40960, 41984, + 42240, 42241, 42208, 42224, 42220, 0, 32768, 40960, + 41984, 42240, 42241, 42208, 42224, 42220, 0, 32768, + 40960, 41984, 42240, 42241, 42208, 42224, 42225, 42222, + 0, 32768, 40960, 41984, 42240, 42241, 42208, 0, + 32768, 40960, 41984, 42240, 42241, 42208, 42224, 0, + 32768, 40960, 41984, 42240, 42241, 42243, 42224, 0, + 32768, 40960, 41984, 42240, 42241, 42243, 42224, 42226, + 0, 32768, 40960, 41984, 42240, 42241, 42243, 42224, + 0, 32768, 40960, 41984, 42240, 42241, 42243, 42224, + 42228, 0, 32768, 40960, 41984, 42240, 42241, 42243, + 42224, 42228, 0, 32768, 40960, 41984, 42240, 42241, + 42243, 42224, 42232, 42230, 0, 32768, 40960, 41984, + 42240, 42241, 42243, 42224, 0, 32768, 40960, 41984, + 42240, 42241, 42243, 42224, 42232, 0, 32768, 40960, + 41984, 42240, 42241, 42243, 42224, 42232, 0, 32768, + 40960, 41984, 42240, 42241, 42243, 42224, 42232, 42234, + 0, 32768, 40960, 41984, 42240, 42241, 42243, 42247, + 42232, 0, 32768, 40960, 41984, 42240, 42241, 42243, + 42247, 42232, 42236, 0, 32768, 40960, 41984, 42240, + 42241, 42243, 42247, 42232, 42236, 0, 32768, 40960, + 41984, 42240, 42241, 42243, 42247, 42232, 42236, 42238, + 0, 32768, 40960, 41984, 0, 32768, 40960, 41984, + 42240, 0, 32768, 40960, 41984, 42240, 0, 32768, + 40960, 41984, 42240, 42242, 0, 32768, 40960, 41984, + 42240, 0, 32768, 40960, 41984, 42240, 42244, 0, + 32768, 40960, 41984, 42240, 42244, 0, 32768, 40960, + 41984, 42240, 42248, 42246, 0, 32768, 40960, 41984, + 42240, 0, 32768, 40960, 41984, 42240, 42248, 0, + 32768, 40960, 41984, 42240, 42248, 0, 32768, 40960, + 41984, 42240, 42248, 42250, 0, 32768, 40960, 41984, + 42240, 42248, 0, 32768, 40960, 41984, 42240, 42256, + 42252, 0, 32768, 40960, 41984, 42240, 42256, 42252, + 0, 32768, 40960, 41984, 42240, 42256, 42257, 42254, + 0, 32768, 40960, 41984, 42240, 0, 32768, 40960, + 41984, 42240, 42256, 0, 32768, 40960, 41984, 42240, + 42256, 0, 32768, 40960, 41984, 42240, 42256, 42258, + 0, 32768, 40960, 41984, 42240, 42256, 0, 32768, + 40960, 41984, 42240, 42256, 42260, 0, 32768, 40960, + 41984, 42240, 42256, 42260, 0, 32768, 40960, 41984, + 42240, 42256, 42264, 42262, 0, 32768, 40960, 41984, + 42240, 42256, 0, 32768, 40960, 41984, 42240, 42272, + 42264, 0, 32768, 40960, 41984, 42240, 42272, 42264, + 0, 32768, 40960, 41984, 42240, 42272, 42264, 42266, + 0, 32768, 40960, 41984, 42240, 42272, 42264, 0, + 32768, 40960, 41984, 42240, 42272, 42273, 42268, 0, + 32768, 40960, 41984, 42240, 42272, 42273, 42268, 0, + 32768, 40960, 41984, 42240, 42272, 42273, 42268, 42270, + 0, 32768, 40960, 41984, 42240, 0, 32768, 40960, + 41984, 42240, 42272, 0, 32768, 40960, 41984, 42240, + 42272, 0, 32768, 40960, 41984, 42240, 42272, 42274, + 0, 32768, 40960, 41984, 42240, 42272, 0, 32768, + 40960, 41984, 42240, 42272, 42276, 0, 32768, 40960, + 41984, 42240, 42272, 42276, 0, 32768, 40960, 41984, + 42240, 42272, 42280, 42278, 0, 32768, 40960, 41984, + 42240, 42272, 0, 32768, 40960, 41984, 42240, 42272, + 42280, 0, 32768, 40960, 41984, 42240, 42272, 42280, + 0, 32768, 40960, 41984, 42240, 42272, 42280, 42282, + 0, 32768, 40960, 41984, 42240, 42272, 42280, 0, + 32768, 40960, 41984, 42240, 42272, 42288, 42284, 0, + 32768, 40960, 41984, 42240, 42272, 42288, 42284, 0, + 32768, 40960, 41984, 42240, 42272, 42288, 42289, 42286, + 0, 32768, 40960, 41984, 42240, 42272, 0, 32768, + 40960, 41984, 42240, 42304, 42288, 0, 32768, 40960, + 41984, 42240, 42304, 42288, 0, 32768, 40960, 41984, + 42240, 42304, 42288, 42290, 0, 32768, 40960, 41984, + 42240, 42304, 42288, 0, 32768, 40960, 41984, 42240, + 42304, 42288, 42292, 0, 32768, 40960, 41984, 42240, + 42304, 42288, 42292, 0, 32768, 40960, 41984, 42240, + 42304, 42288, 42296, 42294, 0, 32768, 40960, 41984, + 42240, 42304, 42288, 0, 32768, 40960, 41984, 42240, + 42304, 42305, 42296, 0, 32768, 40960, 41984, 42240, + 42304, 42305, 42296, 0, 32768, 40960, 41984, 42240, + 42304, 42305, 42296, 42298, 0, 32768, 40960, 41984, + 42240, 42304, 42305, 42296, 0, 32768, 40960, 41984, + 42240, 42304, 42305, 42296, 42300, 0, 32768, 40960, + 41984, 42240, 42304, 42305, 42307, 42300, 0, 32768, + 40960, 41984, 42240, 42304, 42305, 42307, 42300, 42302, + 0, 32768, 40960, 41984, 42240, 0, 32768, 40960, + 41984, 42240, 42304, 0, 32768, 40960, 41984, 42240, + 42304, 0, 32768, 40960, 41984, 42240, 42304, 42306, + 0, 32768, 40960, 41984, 42240, 42304, 0, 32768, + 40960, 41984, 42240, 42304, 42308, 0, 32768, 40960, + 41984, 42240, 42304, 42308, 0, 32768, 40960, 41984, + 42240, 42304, 42312, 42310, 0, 32768, 40960, 41984, + 42240, 42304, 0, 32768, 40960, 41984, 42240, 42304, + 42312, 0, 32768, 40960, 41984, 42240, 42304, 42312, + 0, 32768, 40960, 41984, 42240, 42304, 42312, 42314, + 0, 32768, 40960, 41984, 42240, 42304, 42312, 0, + 32768, 40960, 41984, 42240, 42304, 42320, 42316, 0, + 32768, 40960, 41984, 42240, 42304, 42320, 42316, 0, + 32768, 40960, 41984, 42240, 42304, 42320, 42321, 42318, + 0, 32768, 40960, 41984, 42240, 42304, 0, 32768, + 40960, 41984, 42240, 42304, 42320, 0, 32768, 40960, + 41984, 42240, 42304, 42320, 0, 32768, 40960, 41984, + 42240, 42304, 42320, 42322, 0, 32768, 40960, 41984, + 42240, 42304, 42320, 0, 32768, 40960, 41984, 42240, + 42304, 42320, 42324, 0, 32768, 40960, 41984, 42240, + 42304, 42320, 42324, 0, 32768, 40960, 41984, 42240, + 42304, 42320, 42328, 42326, 0, 32768, 40960, 41984, + 42240, 42304, 42320, 0, 32768, 40960, 41984, 42240, + 42304, 42336, 42328, 0, 32768, 40960, 41984, 42240, + 42304, 42336, 42328, 0, 32768, 40960, 41984, 42240, + 42304, 42336, 42328, 42330, 0, 32768, 40960, 41984, + 42240, 42304, 42336, 42328, 0, 32768, 40960, 41984, + 42240, 42304, 42336, 42337, 42332, 0, 32768, 40960, + 41984, 42240, 42304, 42336, 42337, 42332, 0, 32768, + 40960, 41984, 42240, 42304, 42336, 42337, 42332, 42334, + 0, 32768, 40960, 41984, 42240, 42304, 0, 32768, + 40960, 41984, 42240, 42368, 42336, 0, 32768, 40960, + 41984, 42240, 42368, 42336, 0, 32768, 40960, 41984, + 42240, 42368, 42336, 42338, 0, 32768, 40960, 41984, + 42240, 42368, 42336, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42340, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42340, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42344, 42342, 0, 32768, 40960, 41984, + 42240, 42368, 42336, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42344, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42344, 0, 32768, 40960, 41984, 42240, + 42368, 42336, 42344, 42346, 0, 32768, 40960, 41984, + 42240, 42368, 42336, 42344, 0, 32768, 40960, 41984, + 42240, 42368, 42336, 42352, 42348, 0, 32768, 40960, + 41984, 42240, 42368, 42336, 42352, 42348, 0, 32768, + 40960, 41984, 42240, 42368, 42336, 42352, 42353, 42350, + 0, 32768, 40960, 41984, 42240, 42368, 42336, 0, + 32768, 40960, 41984, 42240, 42368, 42369, 42352, 0, + 32768, 40960, 41984, 42240, 42368, 42369, 42352, 0, + 32768, 40960, 41984, 42240, 42368, 42369, 42352, 42354, + 0, 32768, 40960, 41984, 42240, 42368, 42369, 42352, + 0, 32768, 40960, 41984, 42240, 42368, 42369, 42352, + 42356, 0, 32768, 40960, 41984, 42240, 42368, 42369, + 42352, 42356, 0, 32768, 40960, 41984, 42240, 42368, + 42369, 42352, 42360, 42358, 0, 32768, 40960, 41984, + 42240, 42368, 42369, 42352, 0, 32768, 40960, 41984, + 42240, 42368, 42369, 42352, 42360, 0, 32768, 40960, + 41984, 42240, 42368, 42369, 42371, 42360, 0, 32768, + 40960, 41984, 42240, 42368, 42369, 42371, 42360, 42362, + 0, 32768, 40960, 41984, 42240, 42368, 42369, 42371, + 42360, 0, 32768, 40960, 41984, 42240, 42368, 42369, + 42371, 42360, 42364, 0, 32768, 40960, 41984, 42240, + 42368, 42369, 42371, 42360, 42364, 0, 32768, 40960, + 41984, 42240, 42368, 42369, 42371, 42360, 42364, 42366, + 0, 32768, 40960, 41984, 42240, 0, 32768, 40960, + 41984, 42496, 42368, 0, 32768, 40960, 41984, 42496, + 42368, 0, 32768, 40960, 41984, 42496, 42368, 42370, + 0, 32768, 40960, 41984, 42496, 42368, 0, 32768, + 40960, 41984, 42496, 42368, 42372, 0, 32768, 40960, + 41984, 42496, 42368, 42372, 0, 32768, 40960, 41984, + 42496, 42368, 42376, 42374, 0, 32768, 40960, 41984, + 42496, 42368, 0, 32768, 40960, 41984, 42496, 42368, + 42376, 0, 32768, 40960, 41984, 42496, 42368, 42376, + 0, 32768, 40960, 41984, 42496, 42368, 42376, 42378, + 0, 32768, 40960, 41984, 42496, 42368, 42376, 0, + 32768, 40960, 41984, 42496, 42368, 42384, 42380, 0, + 32768, 40960, 41984, 42496, 42368, 42384, 42380, 0, + 32768, 40960, 41984, 42496, 42368, 42384, 42385, 42382, + 0, 32768, 40960, 41984, 42496, 42368, 0, 32768, + 40960, 41984, 42496, 42368, 42384, 0, 32768, 40960, + 41984, 42496, 42368, 42384, 0, 32768, 40960, 41984, + 42496, 42368, 42384, 42386, 0, 32768, 40960, 41984, + 42496, 42368, 42384, 0, 32768, 40960, 41984, 42496, + 42368, 42384, 42388, 0, 32768, 40960, 41984, 42496, + 42368, 42384, 42388, 0, 32768, 40960, 41984, 42496, + 42368, 42384, 42392, 42390, 0, 32768, 40960, 41984, + 42496, 42368, 42384, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42392, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42392, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42392, 42394, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 42392, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 42401, 42396, 0, 32768, 40960, + 41984, 42496, 42368, 42400, 42401, 42396, 0, 32768, + 40960, 41984, 42496, 42368, 42400, 42401, 42396, 42398, + 0, 32768, 40960, 41984, 42496, 42368, 0, 32768, + 40960, 41984, 42496, 42368, 42400, 0, 32768, 40960, + 41984, 42496, 42368, 42400, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 42402, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42404, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42404, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42408, 42406, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42408, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42408, 0, 32768, 40960, 41984, 42496, + 42368, 42400, 42408, 42410, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 42408, 0, 32768, 40960, 41984, + 42496, 42368, 42400, 42416, 42412, 0, 32768, 40960, + 41984, 42496, 42368, 42400, 42416, 42412, 0, 32768, + 40960, 41984, 42496, 42368, 42400, 42416, 42417, 42414, + 0, 32768, 40960, 41984, 42496, 42368, 42400, 0, + 32768, 40960, 41984, 42496, 42368, 42432, 42416, 0, + 32768, 40960, 41984, 42496, 42368, 42432, 42416, 0, + 32768, 40960, 41984, 42496, 42368, 42432, 42416, 42418, + 0, 32768, 40960, 41984, 42496, 42368, 42432, 42416, + 0, 32768, 40960, 41984, 42496, 42368, 42432, 42416, + 42420, 0, 32768, 40960, 41984, 42496, 42368, 42432, + 42416, 42420, 0, 32768, 40960, 41984, 42496, 42368, + 42432, 42416, 42424, 42422, 0, 32768, 40960, 41984, + 42496, 42368, 42432, 42416, 0, 32768, 40960, 41984, + 42496, 42368, 42432, 42433, 42424, 0, 32768, 40960, + 41984, 42496, 42368, 42432, 42433, 42424, 0, 32768, + 40960, 41984, 42496, 42368, 42432, 42433, 42424, 42426, + 0, 32768, 40960, 41984, 42496, 42368, 42432, 42433, + 42424, 0, 32768, 40960, 41984, 42496, 42368, 42432, + 42433, 42424, 42428, 0, 32768, 40960, 41984, 42496, + 42368, 42432, 42433, 42435, 42428, 0, 32768, 40960, + 41984, 42496, 42368, 42432, 42433, 42435, 42428, 42430, + 0, 32768, 40960, 41984, 42496, 42368, 0, 32768, + 40960, 41984, 42496, 42497, 42432, 0, 32768, 40960, + 41984, 42496, 42497, 42432, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 42434, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42436, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42436, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42440, 42438, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42440, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42440, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42440, 42442, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 42440, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 42448, 42444, 0, 32768, 40960, + 41984, 42496, 42497, 42432, 42448, 42444, 0, 32768, + 40960, 41984, 42496, 42497, 42432, 42448, 42449, 42446, + 0, 32768, 40960, 41984, 42496, 42497, 42432, 0, + 32768, 40960, 41984, 42496, 42497, 42432, 42448, 0, + 32768, 40960, 41984, 42496, 42497, 42432, 42448, 0, + 32768, 40960, 41984, 42496, 42497, 42432, 42448, 42450, + 0, 32768, 40960, 41984, 42496, 42497, 42432, 42448, + 0, 32768, 40960, 41984, 42496, 42497, 42432, 42448, + 42452, 0, 32768, 40960, 41984, 42496, 42497, 42432, + 42448, 42452, 0, 32768, 40960, 41984, 42496, 42497, + 42432, 42448, 42456, 42454, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 42448, 0, 32768, 40960, 41984, + 42496, 42497, 42432, 42464, 42456, 0, 32768, 40960, + 41984, 42496, 42497, 42432, 42464, 42456, 0, 32768, + 40960, 41984, 42496, 42497, 42432, 42464, 42456, 42458, + 0, 32768, 40960, 41984, 42496, 42497, 42432, 42464, + 42456, 0, 32768, 40960, 41984, 42496, 42497, 42432, + 42464, 42465, 42460, 0, 32768, 40960, 41984, 42496, + 42497, 42432, 42464, 42465, 42460, 0, 32768, 40960, + 41984, 42496, 42497, 42432, 42464, 42465, 42460, 42462, + 0, 32768, 40960, 41984, 42496, 42497, 42432, 0, + 32768, 40960, 41984, 42496, 42497, 42432, 42464, 0, + 32768, 40960, 41984, 42496, 42497, 42499, 42464, 0, + 32768, 40960, 41984, 42496, 42497, 42499, 42464, 42466, + 0, 32768, 40960, 41984, 42496, 42497, 42499, 42464, + 0, 32768, 40960, 41984, 42496, 42497, 42499, 42464, + 42468, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42464, 42468, 0, 32768, 40960, 41984, 42496, 42497, + 42499, 42464, 42472, 42470, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42464, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42464, 42472, 0, 32768, 40960, + 41984, 42496, 42497, 42499, 42464, 42472, 0, 32768, + 40960, 41984, 42496, 42497, 42499, 42464, 42472, 42474, + 0, 32768, 40960, 41984, 42496, 42497, 42499, 42464, + 42472, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42464, 42480, 42476, 0, 32768, 40960, 41984, 42496, + 42497, 42499, 42464, 42480, 42476, 0, 32768, 40960, + 41984, 42496, 42497, 42499, 42464, 42480, 42481, 42478, + 0, 32768, 40960, 41984, 42496, 42497, 42499, 42464, + 0, 32768, 40960, 41984, 42496, 42497, 42499, 42464, + 42480, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42464, 42480, 0, 32768, 40960, 41984, 42496, 42497, + 42499, 42464, 42480, 42482, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42503, 42480, 0, 32768, 40960, + 41984, 42496, 42497, 42499, 42503, 42480, 42484, 0, + 32768, 40960, 41984, 42496, 42497, 42499, 42503, 42480, + 42484, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42503, 42480, 42488, 42486, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42503, 42480, 0, 32768, 40960, + 41984, 42496, 42497, 42499, 42503, 42480, 42488, 0, + 32768, 40960, 41984, 42496, 42497, 42499, 42503, 42480, + 42488, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42503, 42480, 42488, 42490, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42503, 42480, 42488, 0, 32768, + 40960, 41984, 42496, 42497, 42499, 42503, 42480, 42488, + 42492, 0, 32768, 40960, 41984, 42496, 42497, 42499, + 42503, 42480, 42488, 42492, 0, 32768, 40960, 41984, + 42496, 42497, 42499, 42503, 42480, 42488, 42492, 42494, + 0, 32768, 40960, 41984, 0, 32768, 40960, 43008, + 42496, 0, 32768, 40960, 43008, 42496, 0, 32768, + 40960, 43008, 42496, 42498, 0, 32768, 40960, 43008, + 42496, 0, 32768, 40960, 43008, 42496, 42500, 0, + 32768, 40960, 43008, 42496, 42500, 0, 32768, 40960, + 43008, 42496, 42504, 42502, 0, 32768, 40960, 43008, + 42496, 0, 32768, 40960, 43008, 42496, 42504, 0, + 32768, 40960, 43008, 42496, 42504, 0, 32768, 40960, + 43008, 42496, 42504, 42506, 0, 32768, 40960, 43008, + 42496, 42504, 0, 32768, 40960, 43008, 42496, 42512, + 42508, 0, 32768, 40960, 43008, 42496, 42512, 42508, + 0, 32768, 40960, 43008, 42496, 42512, 42513, 42510, + 0, 32768, 40960, 43008, 42496, 0, 32768, 40960, + 43008, 42496, 42512, 0, 32768, 40960, 43008, 42496, + 42512, 0, 32768, 40960, 43008, 42496, 42512, 42514, + 0, 32768, 40960, 43008, 42496, 42512, 0, 32768, + 40960, 43008, 42496, 42512, 42516, 0, 32768, 40960, + 43008, 42496, 42512, 42516, 0, 32768, 40960, 43008, + 42496, 42512, 42520, 42518, 0, 32768, 40960, 43008, + 42496, 42512, 0, 32768, 40960, 43008, 42496, 42528, + 42520, 0, 32768, 40960, 43008, 42496, 42528, 42520, + 0, 32768, 40960, 43008, 42496, 42528, 42520, 42522, + 0, 32768, 40960, 43008, 42496, 42528, 42520, 0, + 32768, 40960, 43008, 42496, 42528, 42529, 42524, 0, + 32768, 40960, 43008, 42496, 42528, 42529, 42524, 0, + 32768, 40960, 43008, 42496, 42528, 42529, 42524, 42526, + 0, 32768, 40960, 43008, 42496, 0, 32768, 40960, + 43008, 42496, 42528, 0, 32768, 40960, 43008, 42496, + 42528, 0, 32768, 40960, 43008, 42496, 42528, 42530, + 0, 32768, 40960, 43008, 42496, 42528, 0, 32768, + 40960, 43008, 42496, 42528, 42532, 0, 32768, 40960, + 43008, 42496, 42528, 42532, 0, 32768, 40960, 43008, + 42496, 42528, 42536, 42534, 0, 32768, 40960, 43008, + 42496, 42528, 0, 32768, 40960, 43008, 42496, 42528, + 42536, 0, 32768, 40960, 43008, 42496, 42528, 42536, + 0, 32768, 40960, 43008, 42496, 42528, 42536, 42538, + 0, 32768, 40960, 43008, 42496, 42528, 42536, 0, + 32768, 40960, 43008, 42496, 42528, 42544, 42540, 0, + 32768, 40960, 43008, 42496, 42528, 42544, 42540, 0, + 32768, 40960, 43008, 42496, 42528, 42544, 42545, 42542, + 0, 32768, 40960, 43008, 42496, 42528, 0, 32768, + 40960, 43008, 42496, 42560, 42544, 0, 32768, 40960, + 43008, 42496, 42560, 42544, 0, 32768, 40960, 43008, + 42496, 42560, 42544, 42546, 0, 32768, 40960, 43008, + 42496, 42560, 42544, 0, 32768, 40960, 43008, 42496, + 42560, 42544, 42548, 0, 32768, 40960, 43008, 42496, + 42560, 42544, 42548, 0, 32768, 40960, 43008, 42496, + 42560, 42544, 42552, 42550, 0, 32768, 40960, 43008, + 42496, 42560, 42544, 0, 32768, 40960, 43008, 42496, + 42560, 42561, 42552, 0, 32768, 40960, 43008, 42496, + 42560, 42561, 42552, 0, 32768, 40960, 43008, 42496, + 42560, 42561, 42552, 42554, 0, 32768, 40960, 43008, + 42496, 42560, 42561, 42552, 0, 32768, 40960, 43008, + 42496, 42560, 42561, 42552, 42556, 0, 32768, 40960, + 43008, 42496, 42560, 42561, 42563, 42556, 0, 32768, + 40960, 43008, 42496, 42560, 42561, 42563, 42556, 42558, + 0, 32768, 40960, 43008, 42496, 0, 32768, 40960, + 43008, 42496, 42560, 0, 32768, 40960, 43008, 42496, + 42560, 0, 32768, 40960, 43008, 42496, 42560, 42562, + 0, 32768, 40960, 43008, 42496, 42560, 0, 32768, + 40960, 43008, 42496, 42560, 42564, 0, 32768, 40960, + 43008, 42496, 42560, 42564, 0, 32768, 40960, 43008, + 42496, 42560, 42568, 42566, 0, 32768, 40960, 43008, + 42496, 42560, 0, 32768, 40960, 43008, 42496, 42560, + 42568, 0, 32768, 40960, 43008, 42496, 42560, 42568, + 0, 32768, 40960, 43008, 42496, 42560, 42568, 42570, + 0, 32768, 40960, 43008, 42496, 42560, 42568, 0, + 32768, 40960, 43008, 42496, 42560, 42576, 42572, 0, + 32768, 40960, 43008, 42496, 42560, 42576, 42572, 0, + 32768, 40960, 43008, 42496, 42560, 42576, 42577, 42574, + 0, 32768, 40960, 43008, 42496, 42560, 0, 32768, + 40960, 43008, 42496, 42560, 42576, 0, 32768, 40960, + 43008, 42496, 42560, 42576, 0, 32768, 40960, 43008, + 42496, 42560, 42576, 42578, 0, 32768, 40960, 43008, + 42496, 42560, 42576, 0, 32768, 40960, 43008, 42496, + 42560, 42576, 42580, 0, 32768, 40960, 43008, 42496, + 42560, 42576, 42580, 0, 32768, 40960, 43008, 42496, + 42560, 42576, 42584, 42582, 0, 32768, 40960, 43008, + 42496, 42560, 42576, 0, 32768, 40960, 43008, 42496, + 42560, 42592, 42584, 0, 32768, 40960, 43008, 42496, + 42560, 42592, 42584, 0, 32768, 40960, 43008, 42496, + 42560, 42592, 42584, 42586, 0, 32768, 40960, 43008, + 42496, 42560, 42592, 42584, 0, 32768, 40960, 43008, + 42496, 42560, 42592, 42593, 42588, 0, 32768, 40960, + 43008, 42496, 42560, 42592, 42593, 42588, 0, 32768, + 40960, 43008, 42496, 42560, 42592, 42593, 42588, 42590, + 0, 32768, 40960, 43008, 42496, 42560, 0, 32768, + 40960, 43008, 42496, 42624, 42592, 0, 32768, 40960, + 43008, 42496, 42624, 42592, 0, 32768, 40960, 43008, + 42496, 42624, 42592, 42594, 0, 32768, 40960, 43008, + 42496, 42624, 42592, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42596, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42596, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42600, 42598, 0, 32768, 40960, 43008, + 42496, 42624, 42592, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42600, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42600, 0, 32768, 40960, 43008, 42496, + 42624, 42592, 42600, 42602, 0, 32768, 40960, 43008, + 42496, 42624, 42592, 42600, 0, 32768, 40960, 43008, + 42496, 42624, 42592, 42608, 42604, 0, 32768, 40960, + 43008, 42496, 42624, 42592, 42608, 42604, 0, 32768, + 40960, 43008, 42496, 42624, 42592, 42608, 42609, 42606, + 0, 32768, 40960, 43008, 42496, 42624, 42592, 0, + 32768, 40960, 43008, 42496, 42624, 42625, 42608, 0, + 32768, 40960, 43008, 42496, 42624, 42625, 42608, 0, + 32768, 40960, 43008, 42496, 42624, 42625, 42608, 42610, + 0, 32768, 40960, 43008, 42496, 42624, 42625, 42608, + 0, 32768, 40960, 43008, 42496, 42624, 42625, 42608, + 42612, 0, 32768, 40960, 43008, 42496, 42624, 42625, + 42608, 42612, 0, 32768, 40960, 43008, 42496, 42624, + 42625, 42608, 42616, 42614, 0, 32768, 40960, 43008, + 42496, 42624, 42625, 42608, 0, 32768, 40960, 43008, + 42496, 42624, 42625, 42608, 42616, 0, 32768, 40960, + 43008, 42496, 42624, 42625, 42627, 42616, 0, 32768, + 40960, 43008, 42496, 42624, 42625, 42627, 42616, 42618, + 0, 32768, 40960, 43008, 42496, 42624, 42625, 42627, + 42616, 0, 32768, 40960, 43008, 42496, 42624, 42625, + 42627, 42616, 42620, 0, 32768, 40960, 43008, 42496, + 42624, 42625, 42627, 42616, 42620, 0, 32768, 40960, + 43008, 42496, 42624, 42625, 42627, 42616, 42620, 42622, + 0, 32768, 40960, 43008, 42496, 0, 32768, 40960, + 43008, 42496, 42624, 0, 32768, 40960, 43008, 42496, + 42624, 0, 32768, 40960, 43008, 42496, 42624, 42626, + 0, 32768, 40960, 43008, 42496, 42624, 0, 32768, + 40960, 43008, 42496, 42624, 42628, 0, 32768, 40960, + 43008, 42496, 42624, 42628, 0, 32768, 40960, 43008, + 42496, 42624, 42632, 42630, 0, 32768, 40960, 43008, + 42496, 42624, 0, 32768, 40960, 43008, 42496, 42624, + 42632, 0, 32768, 40960, 43008, 42496, 42624, 42632, + 0, 32768, 40960, 43008, 42496, 42624, 42632, 42634, + 0, 32768, 40960, 43008, 42496, 42624, 42632, 0, + 32768, 40960, 43008, 42496, 42624, 42640, 42636, 0, + 32768, 40960, 43008, 42496, 42624, 42640, 42636, 0, + 32768, 40960, 43008, 42496, 42624, 42640, 42641, 42638, + 0, 32768, 40960, 43008, 42496, 42624, 0, 32768, + 40960, 43008, 42496, 42624, 42640, 0, 32768, 40960, + 43008, 42496, 42624, 42640, 0, 32768, 40960, 43008, + 42496, 42624, 42640, 42642, 0, 32768, 40960, 43008, + 42496, 42624, 42640, 0, 32768, 40960, 43008, 42496, + 42624, 42640, 42644, 0, 32768, 40960, 43008, 42496, + 42624, 42640, 42644, 0, 32768, 40960, 43008, 42496, + 42624, 42640, 42648, 42646, 0, 32768, 40960, 43008, + 42496, 42624, 42640, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42648, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42648, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42648, 42650, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 42648, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 42657, 42652, 0, 32768, 40960, + 43008, 42496, 42624, 42656, 42657, 42652, 0, 32768, + 40960, 43008, 42496, 42624, 42656, 42657, 42652, 42654, + 0, 32768, 40960, 43008, 42496, 42624, 0, 32768, + 40960, 43008, 42496, 42624, 42656, 0, 32768, 40960, + 43008, 42496, 42624, 42656, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 42658, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42660, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42660, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42664, 42662, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42664, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42664, 0, 32768, 40960, 43008, 42496, + 42624, 42656, 42664, 42666, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 42664, 0, 32768, 40960, 43008, + 42496, 42624, 42656, 42672, 42668, 0, 32768, 40960, + 43008, 42496, 42624, 42656, 42672, 42668, 0, 32768, + 40960, 43008, 42496, 42624, 42656, 42672, 42673, 42670, + 0, 32768, 40960, 43008, 42496, 42624, 42656, 0, + 32768, 40960, 43008, 42496, 42624, 42688, 42672, 0, + 32768, 40960, 43008, 42496, 42624, 42688, 42672, 0, + 32768, 40960, 43008, 42496, 42624, 42688, 42672, 42674, + 0, 32768, 40960, 43008, 42496, 42624, 42688, 42672, + 0, 32768, 40960, 43008, 42496, 42624, 42688, 42672, + 42676, 0, 32768, 40960, 43008, 42496, 42624, 42688, + 42672, 42676, 0, 32768, 40960, 43008, 42496, 42624, + 42688, 42672, 42680, 42678, 0, 32768, 40960, 43008, + 42496, 42624, 42688, 42672, 0, 32768, 40960, 43008, + 42496, 42624, 42688, 42689, 42680, 0, 32768, 40960, + 43008, 42496, 42624, 42688, 42689, 42680, 0, 32768, + 40960, 43008, 42496, 42624, 42688, 42689, 42680, 42682, + 0, 32768, 40960, 43008, 42496, 42624, 42688, 42689, + 42680, 0, 32768, 40960, 43008, 42496, 42624, 42688, + 42689, 42680, 42684, 0, 32768, 40960, 43008, 42496, + 42624, 42688, 42689, 42691, 42684, 0, 32768, 40960, + 43008, 42496, 42624, 42688, 42689, 42691, 42684, 42686, + 0, 32768, 40960, 43008, 42496, 42624, 0, 32768, + 40960, 43008, 42496, 42752, 42688, 0, 32768, 40960, + 43008, 42496, 42752, 42688, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 42690, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42692, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42692, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42696, 42694, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42696, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42696, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42696, 42698, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 42696, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 42704, 42700, 0, 32768, 40960, + 43008, 42496, 42752, 42688, 42704, 42700, 0, 32768, + 40960, 43008, 42496, 42752, 42688, 42704, 42705, 42702, + 0, 32768, 40960, 43008, 42496, 42752, 42688, 0, + 32768, 40960, 43008, 42496, 42752, 42688, 42704, 0, + 32768, 40960, 43008, 42496, 42752, 42688, 42704, 0, + 32768, 40960, 43008, 42496, 42752, 42688, 42704, 42706, + 0, 32768, 40960, 43008, 42496, 42752, 42688, 42704, + 0, 32768, 40960, 43008, 42496, 42752, 42688, 42704, + 42708, 0, 32768, 40960, 43008, 42496, 42752, 42688, + 42704, 42708, 0, 32768, 40960, 43008, 42496, 42752, + 42688, 42704, 42712, 42710, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 42704, 0, 32768, 40960, 43008, + 42496, 42752, 42688, 42720, 42712, 0, 32768, 40960, + 43008, 42496, 42752, 42688, 42720, 42712, 0, 32768, + 40960, 43008, 42496, 42752, 42688, 42720, 42712, 42714, + 0, 32768, 40960, 43008, 42496, 42752, 42688, 42720, + 42712, 0, 32768, 40960, 43008, 42496, 42752, 42688, + 42720, 42721, 42716, 0, 32768, 40960, 43008, 42496, + 42752, 42688, 42720, 42721, 42716, 0, 32768, 40960, + 43008, 42496, 42752, 42688, 42720, 42721, 42716, 42718, + 0, 32768, 40960, 43008, 42496, 42752, 42688, 0, + 32768, 40960, 43008, 42496, 42752, 42753, 42720, 0, + 32768, 40960, 43008, 42496, 42752, 42753, 42720, 0, + 32768, 40960, 43008, 42496, 42752, 42753, 42720, 42722, + 0, 32768, 40960, 43008, 42496, 42752, 42753, 42720, + 0, 32768, 40960, 43008, 42496, 42752, 42753, 42720, + 42724, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42720, 42724, 0, 32768, 40960, 43008, 42496, 42752, + 42753, 42720, 42728, 42726, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42720, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42720, 42728, 0, 32768, 40960, + 43008, 42496, 42752, 42753, 42720, 42728, 0, 32768, + 40960, 43008, 42496, 42752, 42753, 42720, 42728, 42730, + 0, 32768, 40960, 43008, 42496, 42752, 42753, 42720, + 42728, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42720, 42736, 42732, 0, 32768, 40960, 43008, 42496, + 42752, 42753, 42720, 42736, 42732, 0, 32768, 40960, + 43008, 42496, 42752, 42753, 42720, 42736, 42737, 42734, + 0, 32768, 40960, 43008, 42496, 42752, 42753, 42720, + 0, 32768, 40960, 43008, 42496, 42752, 42753, 42720, + 42736, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42755, 42736, 0, 32768, 40960, 43008, 42496, 42752, + 42753, 42755, 42736, 42738, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42755, 42736, 0, 32768, 40960, + 43008, 42496, 42752, 42753, 42755, 42736, 42740, 0, + 32768, 40960, 43008, 42496, 42752, 42753, 42755, 42736, + 42740, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42755, 42736, 42744, 42742, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42755, 42736, 0, 32768, 40960, + 43008, 42496, 42752, 42753, 42755, 42736, 42744, 0, + 32768, 40960, 43008, 42496, 42752, 42753, 42755, 42736, + 42744, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42755, 42736, 42744, 42746, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42755, 42759, 42744, 0, 32768, + 40960, 43008, 42496, 42752, 42753, 42755, 42759, 42744, + 42748, 0, 32768, 40960, 43008, 42496, 42752, 42753, + 42755, 42759, 42744, 42748, 0, 32768, 40960, 43008, + 42496, 42752, 42753, 42755, 42759, 42744, 42748, 42750, + 0, 32768, 40960, 43008, 42496, 0, 32768, 40960, + 43008, 42496, 42752, 0, 32768, 40960, 43008, 43009, + 42752, 0, 32768, 40960, 43008, 43009, 42752, 42754, + 0, 32768, 40960, 43008, 43009, 42752, 0, 32768, + 40960, 43008, 43009, 42752, 42756, 0, 32768, 40960, + 43008, 43009, 42752, 42756, 0, 32768, 40960, 43008, + 43009, 42752, 42760, 42758, 0, 32768, 40960, 43008, + 43009, 42752, 0, 32768, 40960, 43008, 43009, 42752, + 42760, 0, 32768, 40960, 43008, 43009, 42752, 42760, + 0, 32768, 40960, 43008, 43009, 42752, 42760, 42762, + 0, 32768, 40960, 43008, 43009, 42752, 42760, 0, + 32768, 40960, 43008, 43009, 42752, 42768, 42764, 0, + 32768, 40960, 43008, 43009, 42752, 42768, 42764, 0, + 32768, 40960, 43008, 43009, 42752, 42768, 42769, 42766, + 0, 32768, 40960, 43008, 43009, 42752, 0, 32768, + 40960, 43008, 43009, 42752, 42768, 0, 32768, 40960, + 43008, 43009, 42752, 42768, 0, 32768, 40960, 43008, + 43009, 42752, 42768, 42770, 0, 32768, 40960, 43008, + 43009, 42752, 42768, 0, 32768, 40960, 43008, 43009, + 42752, 42768, 42772, 0, 32768, 40960, 43008, 43009, + 42752, 42768, 42772, 0, 32768, 40960, 43008, 43009, + 42752, 42768, 42776, 42774, 0, 32768, 40960, 43008, + 43009, 42752, 42768, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42776, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42776, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42776, 42778, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 42776, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 42785, 42780, 0, 32768, 40960, + 43008, 43009, 42752, 42784, 42785, 42780, 0, 32768, + 40960, 43008, 43009, 42752, 42784, 42785, 42780, 42782, + 0, 32768, 40960, 43008, 43009, 42752, 0, 32768, + 40960, 43008, 43009, 42752, 42784, 0, 32768, 40960, + 43008, 43009, 42752, 42784, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 42786, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42788, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42788, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42792, 42790, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42792, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42792, 0, 32768, 40960, 43008, 43009, + 42752, 42784, 42792, 42794, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 42792, 0, 32768, 40960, 43008, + 43009, 42752, 42784, 42800, 42796, 0, 32768, 40960, + 43008, 43009, 42752, 42784, 42800, 42796, 0, 32768, + 40960, 43008, 43009, 42752, 42784, 42800, 42801, 42798, + 0, 32768, 40960, 43008, 43009, 42752, 42784, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42800, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42800, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42800, 42802, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42800, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42800, + 42804, 0, 32768, 40960, 43008, 43009, 42752, 42816, + 42800, 42804, 0, 32768, 40960, 43008, 43009, 42752, + 42816, 42800, 42808, 42806, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42800, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42817, 42808, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 42817, 42808, 0, 32768, + 40960, 43008, 43009, 42752, 42816, 42817, 42808, 42810, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42817, + 42808, 0, 32768, 40960, 43008, 43009, 42752, 42816, + 42817, 42808, 42812, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42817, 42819, 42812, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 42817, 42819, 42812, 42814, + 0, 32768, 40960, 43008, 43009, 42752, 0, 32768, + 40960, 43008, 43009, 42752, 42816, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42818, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42820, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42820, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42824, 42822, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42824, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42824, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42824, 42826, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42824, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42832, 42828, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 42832, 42828, 0, 32768, + 40960, 43008, 43009, 42752, 42816, 42832, 42833, 42830, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42832, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42832, 0, + 32768, 40960, 43008, 43009, 42752, 42816, 42832, 42834, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42832, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42832, + 42836, 0, 32768, 40960, 43008, 43009, 42752, 42816, + 42832, 42836, 0, 32768, 40960, 43008, 43009, 42752, + 42816, 42832, 42840, 42838, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42832, 0, 32768, 40960, 43008, + 43009, 42752, 42816, 42848, 42840, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 42848, 42840, 0, 32768, + 40960, 43008, 43009, 42752, 42816, 42848, 42840, 42842, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 42848, + 42840, 0, 32768, 40960, 43008, 43009, 42752, 42816, + 42848, 42849, 42844, 0, 32768, 40960, 43008, 43009, + 42752, 42816, 42848, 42849, 42844, 0, 32768, 40960, + 43008, 43009, 42752, 42816, 42848, 42849, 42844, 42846, + 0, 32768, 40960, 43008, 43009, 42752, 42816, 0, + 32768, 40960, 43008, 43009, 42752, 42880, 42848, 0, + 32768, 40960, 43008, 43009, 42752, 42880, 42848, 0, + 32768, 40960, 43008, 43009, 42752, 42880, 42848, 42850, + 0, 32768, 40960, 43008, 43009, 42752, 42880, 42848, + 0, 32768, 40960, 43008, 43009, 42752, 42880, 42848, + 42852, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42848, 42852, 0, 32768, 40960, 43008, 43009, 42752, + 42880, 42848, 42856, 42854, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42848, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42848, 42856, 0, 32768, 40960, + 43008, 43009, 42752, 42880, 42848, 42856, 0, 32768, + 40960, 43008, 43009, 42752, 42880, 42848, 42856, 42858, + 0, 32768, 40960, 43008, 43009, 42752, 42880, 42848, + 42856, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42848, 42864, 42860, 0, 32768, 40960, 43008, 43009, + 42752, 42880, 42848, 42864, 42860, 0, 32768, 40960, + 43008, 43009, 42752, 42880, 42848, 42864, 42865, 42862, + 0, 32768, 40960, 43008, 43009, 42752, 42880, 42848, + 0, 32768, 40960, 43008, 43009, 42752, 42880, 42881, + 42864, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42881, 42864, 0, 32768, 40960, 43008, 43009, 42752, + 42880, 42881, 42864, 42866, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42881, 42864, 0, 32768, 40960, + 43008, 43009, 42752, 42880, 42881, 42864, 42868, 0, + 32768, 40960, 43008, 43009, 42752, 42880, 42881, 42864, + 42868, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42881, 42864, 42872, 42870, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42881, 42864, 0, 32768, 40960, + 43008, 43009, 42752, 42880, 42881, 42864, 42872, 0, + 32768, 40960, 43008, 43009, 42752, 42880, 42881, 42883, + 42872, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42881, 42883, 42872, 42874, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42881, 42883, 42872, 0, 32768, + 40960, 43008, 43009, 42752, 42880, 42881, 42883, 42872, + 42876, 0, 32768, 40960, 43008, 43009, 42752, 42880, + 42881, 42883, 42872, 42876, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42881, 42883, 42872, 42876, 42878, + 0, 32768, 40960, 43008, 43009, 42752, 0, 32768, + 40960, 43008, 43009, 42752, 42880, 0, 32768, 40960, + 43008, 43009, 42752, 42880, 0, 32768, 40960, 43008, + 43009, 42752, 42880, 42882, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42884, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42884, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42888, 42886, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42888, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42888, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42888, 42890, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42888, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42896, 42892, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42896, 42892, 0, 32768, + 40960, 43008, 43009, 43011, 42880, 42896, 42897, 42894, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42896, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42896, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42896, 42898, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42896, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42896, + 42900, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42896, 42900, 0, 32768, 40960, 43008, 43009, 43011, + 42880, 42896, 42904, 42902, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42896, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42912, 42904, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42912, 42904, 0, 32768, + 40960, 43008, 43009, 43011, 42880, 42912, 42904, 42906, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42912, + 42904, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42912, 42913, 42908, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42912, 42913, 42908, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42912, 42913, 42908, 42910, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42912, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42912, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42912, 42914, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42912, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42912, + 42916, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42912, 42916, 0, 32768, 40960, 43008, 43009, 43011, + 42880, 42912, 42920, 42918, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42912, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42912, 42920, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42912, 42920, 0, 32768, + 40960, 43008, 43009, 43011, 42880, 42912, 42920, 42922, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42912, + 42920, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42912, 42928, 42924, 0, 32768, 40960, 43008, 43009, + 43011, 42880, 42912, 42928, 42924, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42912, 42928, 42929, 42926, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42912, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42944, + 42928, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42944, 42928, 0, 32768, 40960, 43008, 43009, 43011, + 42880, 42944, 42928, 42930, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42944, 42928, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42944, 42928, 42932, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42944, 42928, + 42932, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42944, 42928, 42936, 42934, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42944, 42928, 0, 32768, 40960, + 43008, 43009, 43011, 42880, 42944, 42945, 42936, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42944, 42945, + 42936, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42944, 42945, 42936, 42938, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42944, 42945, 42936, 0, 32768, + 40960, 43008, 43009, 43011, 42880, 42944, 42945, 42936, + 42940, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42944, 42945, 42947, 42940, 0, 32768, 40960, 43008, + 43009, 43011, 42880, 42944, 42945, 42947, 42940, 42942, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42944, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42944, 0, + 32768, 40960, 43008, 43009, 43011, 42880, 42944, 42946, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42944, + 0, 32768, 40960, 43008, 43009, 43011, 42880, 42944, + 42948, 0, 32768, 40960, 43008, 43009, 43011, 42880, + 42944, 42948, 0, 32768, 40960, 43008, 43009, 43011, + 42880, 42944, 42952, 42950, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42952, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42952, 0, 32768, + 40960, 43008, 43009, 43011, 43015, 42944, 42952, 42954, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 42944, + 42952, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42960, 42956, 0, 32768, 40960, 43008, 43009, + 43011, 43015, 42944, 42960, 42956, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42960, 42961, 42958, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 42944, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 42944, + 42960, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42960, 0, 32768, 40960, 43008, 43009, 43011, + 43015, 42944, 42960, 42962, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42960, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42960, 42964, 0, + 32768, 40960, 43008, 43009, 43011, 43015, 42944, 42960, + 42964, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42960, 42968, 42966, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42960, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42976, 42968, 0, + 32768, 40960, 43008, 43009, 43011, 43015, 42944, 42976, + 42968, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 42968, 42970, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 42968, 0, 32768, + 40960, 43008, 43009, 43011, 43015, 42944, 42976, 42977, + 42972, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 42977, 42972, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 42977, 42972, 42974, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 42944, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 42944, + 42976, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 0, 32768, 40960, 43008, 43009, 43011, + 43015, 42944, 42976, 42978, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42976, 42980, 0, + 32768, 40960, 43008, 43009, 43011, 43015, 42944, 42976, + 42980, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 42984, 42982, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 42944, 42976, 42984, 0, + 32768, 40960, 43008, 43009, 43011, 43015, 42944, 42976, + 42984, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 42984, 42986, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 42984, 0, 32768, + 40960, 43008, 43009, 43011, 43015, 42944, 42976, 42992, + 42988, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 42944, 42976, 42992, 42988, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 42944, 42976, 42992, 42993, 42990, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 43023, + 42976, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 43023, 42976, 42992, 0, 32768, 40960, 43008, 43009, + 43011, 43015, 43023, 42976, 42992, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 43023, 42976, 42992, 42994, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 43023, + 42976, 42992, 0, 32768, 40960, 43008, 43009, 43011, + 43015, 43023, 42976, 42992, 42996, 0, 32768, 40960, + 43008, 43009, 43011, 43015, 43023, 42976, 42992, 42996, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 43023, + 42976, 42992, 43000, 42998, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 43023, 42976, 42992, 0, 32768, + 40960, 43008, 43009, 43011, 43015, 43023, 42976, 42992, + 43000, 0, 32768, 40960, 43008, 43009, 43011, 43015, + 43023, 42976, 42992, 43000, 0, 32768, 40960, 43008, + 43009, 43011, 43015, 43023, 42976, 42992, 43000, 43002, + 0, 32768, 40960, 43008, 43009, 43011, 43015, 43023, + 42976, 42992, 43000, 0, 32768, 40960, 43008, 43009, + 43011, 43015, 43023, 42976, 42992, 43000, 43004, 0, + 32768, 40960, 43008, 43009, 43011, 43015, 43023, 42976, + 42992, 43000, 43004, 0, 32768, 40960, 43008, 43009, + 43011, 43015, 43023, 42976, 42992, 43000, 43004, 43006, + 0, 32768, 40960, 0, 32768, 40960, 43008, 0, + 32768, 40960, 43008, 0, 32768, 40960, 43008, 43010, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43012, 0, 32768, 40960, 43008, 43012, 0, 32768, + 40960, 43008, 43016, 43014, 0, 32768, 40960, 43008, + 0, 32768, 40960, 43008, 43016, 0, 32768, 40960, + 43008, 43016, 0, 32768, 40960, 43008, 43016, 43018, + 0, 32768, 40960, 43008, 43016, 0, 32768, 40960, + 43008, 43024, 43020, 0, 32768, 40960, 43008, 43024, + 43020, 0, 32768, 40960, 43008, 43024, 43025, 43022, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43024, 0, 32768, 40960, 43008, 43024, 0, 32768, + 40960, 43008, 43024, 43026, 0, 32768, 40960, 43008, + 43024, 0, 32768, 40960, 43008, 43024, 43028, 0, + 32768, 40960, 43008, 43024, 43028, 0, 32768, 40960, + 43008, 43024, 43032, 43030, 0, 32768, 40960, 43008, + 43024, 0, 32768, 40960, 43008, 43040, 43032, 0, + 32768, 40960, 43008, 43040, 43032, 0, 32768, 40960, + 43008, 43040, 43032, 43034, 0, 32768, 40960, 43008, + 43040, 43032, 0, 32768, 40960, 43008, 43040, 43041, + 43036, 0, 32768, 40960, 43008, 43040, 43041, 43036, + 0, 32768, 40960, 43008, 43040, 43041, 43036, 43038, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43040, 0, 32768, 40960, 43008, 43040, 0, 32768, + 40960, 43008, 43040, 43042, 0, 32768, 40960, 43008, + 43040, 0, 32768, 40960, 43008, 43040, 43044, 0, + 32768, 40960, 43008, 43040, 43044, 0, 32768, 40960, + 43008, 43040, 43048, 43046, 0, 32768, 40960, 43008, + 43040, 0, 32768, 40960, 43008, 43040, 43048, 0, + 32768, 40960, 43008, 43040, 43048, 0, 32768, 40960, + 43008, 43040, 43048, 43050, 0, 32768, 40960, 43008, + 43040, 43048, 0, 32768, 40960, 43008, 43040, 43056, + 43052, 0, 32768, 40960, 43008, 43040, 43056, 43052, + 0, 32768, 40960, 43008, 43040, 43056, 43057, 43054, + 0, 32768, 40960, 43008, 43040, 0, 32768, 40960, + 43008, 43072, 43056, 0, 32768, 40960, 43008, 43072, + 43056, 0, 32768, 40960, 43008, 43072, 43056, 43058, + 0, 32768, 40960, 43008, 43072, 43056, 0, 32768, + 40960, 43008, 43072, 43056, 43060, 0, 32768, 40960, + 43008, 43072, 43056, 43060, 0, 32768, 40960, 43008, + 43072, 43056, 43064, 43062, 0, 32768, 40960, 43008, + 43072, 43056, 0, 32768, 40960, 43008, 43072, 43073, + 43064, 0, 32768, 40960, 43008, 43072, 43073, 43064, + 0, 32768, 40960, 43008, 43072, 43073, 43064, 43066, + 0, 32768, 40960, 43008, 43072, 43073, 43064, 0, + 32768, 40960, 43008, 43072, 43073, 43064, 43068, 0, + 32768, 40960, 43008, 43072, 43073, 43075, 43068, 0, + 32768, 40960, 43008, 43072, 43073, 43075, 43068, 43070, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43072, 0, 32768, 40960, 43008, 43072, 0, 32768, + 40960, 43008, 43072, 43074, 0, 32768, 40960, 43008, + 43072, 0, 32768, 40960, 43008, 43072, 43076, 0, + 32768, 40960, 43008, 43072, 43076, 0, 32768, 40960, + 43008, 43072, 43080, 43078, 0, 32768, 40960, 43008, + 43072, 0, 32768, 40960, 43008, 43072, 43080, 0, + 32768, 40960, 43008, 43072, 43080, 0, 32768, 40960, + 43008, 43072, 43080, 43082, 0, 32768, 40960, 43008, + 43072, 43080, 0, 32768, 40960, 43008, 43072, 43088, + 43084, 0, 32768, 40960, 43008, 43072, 43088, 43084, + 0, 32768, 40960, 43008, 43072, 43088, 43089, 43086, + 0, 32768, 40960, 43008, 43072, 0, 32768, 40960, + 43008, 43072, 43088, 0, 32768, 40960, 43008, 43072, + 43088, 0, 32768, 40960, 43008, 43072, 43088, 43090, + 0, 32768, 40960, 43008, 43072, 43088, 0, 32768, + 40960, 43008, 43072, 43088, 43092, 0, 32768, 40960, + 43008, 43072, 43088, 43092, 0, 32768, 40960, 43008, + 43072, 43088, 43096, 43094, 0, 32768, 40960, 43008, + 43072, 43088, 0, 32768, 40960, 43008, 43072, 43104, + 43096, 0, 32768, 40960, 43008, 43072, 43104, 43096, + 0, 32768, 40960, 43008, 43072, 43104, 43096, 43098, + 0, 32768, 40960, 43008, 43072, 43104, 43096, 0, + 32768, 40960, 43008, 43072, 43104, 43105, 43100, 0, + 32768, 40960, 43008, 43072, 43104, 43105, 43100, 0, + 32768, 40960, 43008, 43072, 43104, 43105, 43100, 43102, + 0, 32768, 40960, 43008, 43072, 0, 32768, 40960, + 43008, 43136, 43104, 0, 32768, 40960, 43008, 43136, + 43104, 0, 32768, 40960, 43008, 43136, 43104, 43106, + 0, 32768, 40960, 43008, 43136, 43104, 0, 32768, + 40960, 43008, 43136, 43104, 43108, 0, 32768, 40960, + 43008, 43136, 43104, 43108, 0, 32768, 40960, 43008, + 43136, 43104, 43112, 43110, 0, 32768, 40960, 43008, + 43136, 43104, 0, 32768, 40960, 43008, 43136, 43104, + 43112, 0, 32768, 40960, 43008, 43136, 43104, 43112, + 0, 32768, 40960, 43008, 43136, 43104, 43112, 43114, + 0, 32768, 40960, 43008, 43136, 43104, 43112, 0, + 32768, 40960, 43008, 43136, 43104, 43120, 43116, 0, + 32768, 40960, 43008, 43136, 43104, 43120, 43116, 0, + 32768, 40960, 43008, 43136, 43104, 43120, 43121, 43118, + 0, 32768, 40960, 43008, 43136, 43104, 0, 32768, + 40960, 43008, 43136, 43137, 43120, 0, 32768, 40960, + 43008, 43136, 43137, 43120, 0, 32768, 40960, 43008, + 43136, 43137, 43120, 43122, 0, 32768, 40960, 43008, + 43136, 43137, 43120, 0, 32768, 40960, 43008, 43136, + 43137, 43120, 43124, 0, 32768, 40960, 43008, 43136, + 43137, 43120, 43124, 0, 32768, 40960, 43008, 43136, + 43137, 43120, 43128, 43126, 0, 32768, 40960, 43008, + 43136, 43137, 43120, 0, 32768, 40960, 43008, 43136, + 43137, 43120, 43128, 0, 32768, 40960, 43008, 43136, + 43137, 43139, 43128, 0, 32768, 40960, 43008, 43136, + 43137, 43139, 43128, 43130, 0, 32768, 40960, 43008, + 43136, 43137, 43139, 43128, 0, 32768, 40960, 43008, + 43136, 43137, 43139, 43128, 43132, 0, 32768, 40960, + 43008, 43136, 43137, 43139, 43128, 43132, 0, 32768, + 40960, 43008, 43136, 43137, 43139, 43128, 43132, 43134, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43136, 0, 32768, 40960, 43008, 43136, 0, 32768, + 40960, 43008, 43136, 43138, 0, 32768, 40960, 43008, + 43136, 0, 32768, 40960, 43008, 43136, 43140, 0, + 32768, 40960, 43008, 43136, 43140, 0, 32768, 40960, + 43008, 43136, 43144, 43142, 0, 32768, 40960, 43008, + 43136, 0, 32768, 40960, 43008, 43136, 43144, 0, + 32768, 40960, 43008, 43136, 43144, 0, 32768, 40960, + 43008, 43136, 43144, 43146, 0, 32768, 40960, 43008, + 43136, 43144, 0, 32768, 40960, 43008, 43136, 43152, + 43148, 0, 32768, 40960, 43008, 43136, 43152, 43148, + 0, 32768, 40960, 43008, 43136, 43152, 43153, 43150, + 0, 32768, 40960, 43008, 43136, 0, 32768, 40960, + 43008, 43136, 43152, 0, 32768, 40960, 43008, 43136, + 43152, 0, 32768, 40960, 43008, 43136, 43152, 43154, + 0, 32768, 40960, 43008, 43136, 43152, 0, 32768, + 40960, 43008, 43136, 43152, 43156, 0, 32768, 40960, + 43008, 43136, 43152, 43156, 0, 32768, 40960, 43008, + 43136, 43152, 43160, 43158, 0, 32768, 40960, 43008, + 43136, 43152, 0, 32768, 40960, 43008, 43136, 43168, + 43160, 0, 32768, 40960, 43008, 43136, 43168, 43160, + 0, 32768, 40960, 43008, 43136, 43168, 43160, 43162, + 0, 32768, 40960, 43008, 43136, 43168, 43160, 0, + 32768, 40960, 43008, 43136, 43168, 43169, 43164, 0, + 32768, 40960, 43008, 43136, 43168, 43169, 43164, 0, + 32768, 40960, 43008, 43136, 43168, 43169, 43164, 43166, + 0, 32768, 40960, 43008, 43136, 0, 32768, 40960, + 43008, 43136, 43168, 0, 32768, 40960, 43008, 43136, + 43168, 0, 32768, 40960, 43008, 43136, 43168, 43170, + 0, 32768, 40960, 43008, 43136, 43168, 0, 32768, + 40960, 43008, 43136, 43168, 43172, 0, 32768, 40960, + 43008, 43136, 43168, 43172, 0, 32768, 40960, 43008, + 43136, 43168, 43176, 43174, 0, 32768, 40960, 43008, + 43136, 43168, 0, 32768, 40960, 43008, 43136, 43168, + 43176, 0, 32768, 40960, 43008, 43136, 43168, 43176, + 0, 32768, 40960, 43008, 43136, 43168, 43176, 43178, + 0, 32768, 40960, 43008, 43136, 43168, 43176, 0, + 32768, 40960, 43008, 43136, 43168, 43184, 43180, 0, + 32768, 40960, 43008, 43136, 43168, 43184, 43180, 0, + 32768, 40960, 43008, 43136, 43168, 43184, 43185, 43182, + 0, 32768, 40960, 43008, 43136, 43168, 0, 32768, + 40960, 43008, 43136, 43200, 43184, 0, 32768, 40960, + 43008, 43136, 43200, 43184, 0, 32768, 40960, 43008, + 43136, 43200, 43184, 43186, 0, 32768, 40960, 43008, + 43136, 43200, 43184, 0, 32768, 40960, 43008, 43136, + 43200, 43184, 43188, 0, 32768, 40960, 43008, 43136, + 43200, 43184, 43188, 0, 32768, 40960, 43008, 43136, + 43200, 43184, 43192, 43190, 0, 32768, 40960, 43008, + 43136, 43200, 43184, 0, 32768, 40960, 43008, 43136, + 43200, 43201, 43192, 0, 32768, 40960, 43008, 43136, + 43200, 43201, 43192, 0, 32768, 40960, 43008, 43136, + 43200, 43201, 43192, 43194, 0, 32768, 40960, 43008, + 43136, 43200, 43201, 43192, 0, 32768, 40960, 43008, + 43136, 43200, 43201, 43192, 43196, 0, 32768, 40960, + 43008, 43136, 43200, 43201, 43203, 43196, 0, 32768, + 40960, 43008, 43136, 43200, 43201, 43203, 43196, 43198, + 0, 32768, 40960, 43008, 43136, 0, 32768, 40960, + 43008, 43264, 43200, 0, 32768, 40960, 43008, 43264, + 43200, 0, 32768, 40960, 43008, 43264, 43200, 43202, + 0, 32768, 40960, 43008, 43264, 43200, 0, 32768, + 40960, 43008, 43264, 43200, 43204, 0, 32768, 40960, + 43008, 43264, 43200, 43204, 0, 32768, 40960, 43008, + 43264, 43200, 43208, 43206, 0, 32768, 40960, 43008, + 43264, 43200, 0, 32768, 40960, 43008, 43264, 43200, + 43208, 0, 32768, 40960, 43008, 43264, 43200, 43208, + 0, 32768, 40960, 43008, 43264, 43200, 43208, 43210, + 0, 32768, 40960, 43008, 43264, 43200, 43208, 0, + 32768, 40960, 43008, 43264, 43200, 43216, 43212, 0, + 32768, 40960, 43008, 43264, 43200, 43216, 43212, 0, + 32768, 40960, 43008, 43264, 43200, 43216, 43217, 43214, + 0, 32768, 40960, 43008, 43264, 43200, 0, 32768, + 40960, 43008, 43264, 43200, 43216, 0, 32768, 40960, + 43008, 43264, 43200, 43216, 0, 32768, 40960, 43008, + 43264, 43200, 43216, 43218, 0, 32768, 40960, 43008, + 43264, 43200, 43216, 0, 32768, 40960, 43008, 43264, + 43200, 43216, 43220, 0, 32768, 40960, 43008, 43264, + 43200, 43216, 43220, 0, 32768, 40960, 43008, 43264, + 43200, 43216, 43224, 43222, 0, 32768, 40960, 43008, + 43264, 43200, 43216, 0, 32768, 40960, 43008, 43264, + 43200, 43232, 43224, 0, 32768, 40960, 43008, 43264, + 43200, 43232, 43224, 0, 32768, 40960, 43008, 43264, + 43200, 43232, 43224, 43226, 0, 32768, 40960, 43008, + 43264, 43200, 43232, 43224, 0, 32768, 40960, 43008, + 43264, 43200, 43232, 43233, 43228, 0, 32768, 40960, + 43008, 43264, 43200, 43232, 43233, 43228, 0, 32768, + 40960, 43008, 43264, 43200, 43232, 43233, 43228, 43230, + 0, 32768, 40960, 43008, 43264, 43200, 0, 32768, + 40960, 43008, 43264, 43265, 43232, 0, 32768, 40960, + 43008, 43264, 43265, 43232, 0, 32768, 40960, 43008, + 43264, 43265, 43232, 43234, 0, 32768, 40960, 43008, + 43264, 43265, 43232, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43236, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43236, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43240, 43238, 0, 32768, 40960, 43008, + 43264, 43265, 43232, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43240, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43240, 0, 32768, 40960, 43008, 43264, + 43265, 43232, 43240, 43242, 0, 32768, 40960, 43008, + 43264, 43265, 43232, 43240, 0, 32768, 40960, 43008, + 43264, 43265, 43232, 43248, 43244, 0, 32768, 40960, + 43008, 43264, 43265, 43232, 43248, 43244, 0, 32768, + 40960, 43008, 43264, 43265, 43232, 43248, 43249, 43246, + 0, 32768, 40960, 43008, 43264, 43265, 43232, 0, + 32768, 40960, 43008, 43264, 43265, 43232, 43248, 0, + 32768, 40960, 43008, 43264, 43265, 43267, 43248, 0, + 32768, 40960, 43008, 43264, 43265, 43267, 43248, 43250, + 0, 32768, 40960, 43008, 43264, 43265, 43267, 43248, + 0, 32768, 40960, 43008, 43264, 43265, 43267, 43248, + 43252, 0, 32768, 40960, 43008, 43264, 43265, 43267, + 43248, 43252, 0, 32768, 40960, 43008, 43264, 43265, + 43267, 43248, 43256, 43254, 0, 32768, 40960, 43008, + 43264, 43265, 43267, 43248, 0, 32768, 40960, 43008, + 43264, 43265, 43267, 43248, 43256, 0, 32768, 40960, + 43008, 43264, 43265, 43267, 43248, 43256, 0, 32768, + 40960, 43008, 43264, 43265, 43267, 43248, 43256, 43258, + 0, 32768, 40960, 43008, 43264, 43265, 43267, 43271, + 43256, 0, 32768, 40960, 43008, 43264, 43265, 43267, + 43271, 43256, 43260, 0, 32768, 40960, 43008, 43264, + 43265, 43267, 43271, 43256, 43260, 0, 32768, 40960, + 43008, 43264, 43265, 43267, 43271, 43256, 43260, 43262, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43264, 0, 32768, 40960, 43008, 43264, 0, 32768, + 40960, 43008, 43264, 43266, 0, 32768, 40960, 43008, + 43264, 0, 32768, 40960, 43008, 43264, 43268, 0, + 32768, 40960, 43008, 43264, 43268, 0, 32768, 40960, + 43008, 43264, 43272, 43270, 0, 32768, 40960, 43008, + 43264, 0, 32768, 40960, 43008, 43264, 43272, 0, + 32768, 40960, 43008, 43264, 43272, 0, 32768, 40960, + 43008, 43264, 43272, 43274, 0, 32768, 40960, 43008, + 43264, 43272, 0, 32768, 40960, 43008, 43264, 43280, + 43276, 0, 32768, 40960, 43008, 43264, 43280, 43276, + 0, 32768, 40960, 43008, 43264, 43280, 43281, 43278, + 0, 32768, 40960, 43008, 43264, 0, 32768, 40960, + 43008, 43264, 43280, 0, 32768, 40960, 43008, 43264, + 43280, 0, 32768, 40960, 43008, 43264, 43280, 43282, + 0, 32768, 40960, 43008, 43264, 43280, 0, 32768, + 40960, 43008, 43264, 43280, 43284, 0, 32768, 40960, + 43008, 43264, 43280, 43284, 0, 32768, 40960, 43008, + 43264, 43280, 43288, 43286, 0, 32768, 40960, 43008, + 43264, 43280, 0, 32768, 40960, 43008, 43264, 43296, + 43288, 0, 32768, 40960, 43008, 43264, 43296, 43288, + 0, 32768, 40960, 43008, 43264, 43296, 43288, 43290, + 0, 32768, 40960, 43008, 43264, 43296, 43288, 0, + 32768, 40960, 43008, 43264, 43296, 43297, 43292, 0, + 32768, 40960, 43008, 43264, 43296, 43297, 43292, 0, + 32768, 40960, 43008, 43264, 43296, 43297, 43292, 43294, + 0, 32768, 40960, 43008, 43264, 0, 32768, 40960, + 43008, 43264, 43296, 0, 32768, 40960, 43008, 43264, + 43296, 0, 32768, 40960, 43008, 43264, 43296, 43298, + 0, 32768, 40960, 43008, 43264, 43296, 0, 32768, + 40960, 43008, 43264, 43296, 43300, 0, 32768, 40960, + 43008, 43264, 43296, 43300, 0, 32768, 40960, 43008, + 43264, 43296, 43304, 43302, 0, 32768, 40960, 43008, + 43264, 43296, 0, 32768, 40960, 43008, 43264, 43296, + 43304, 0, 32768, 40960, 43008, 43264, 43296, 43304, + 0, 32768, 40960, 43008, 43264, 43296, 43304, 43306, + 0, 32768, 40960, 43008, 43264, 43296, 43304, 0, + 32768, 40960, 43008, 43264, 43296, 43312, 43308, 0, + 32768, 40960, 43008, 43264, 43296, 43312, 43308, 0, + 32768, 40960, 43008, 43264, 43296, 43312, 43313, 43310, + 0, 32768, 40960, 43008, 43264, 43296, 0, 32768, + 40960, 43008, 43264, 43328, 43312, 0, 32768, 40960, + 43008, 43264, 43328, 43312, 0, 32768, 40960, 43008, + 43264, 43328, 43312, 43314, 0, 32768, 40960, 43008, + 43264, 43328, 43312, 0, 32768, 40960, 43008, 43264, + 43328, 43312, 43316, 0, 32768, 40960, 43008, 43264, + 43328, 43312, 43316, 0, 32768, 40960, 43008, 43264, + 43328, 43312, 43320, 43318, 0, 32768, 40960, 43008, + 43264, 43328, 43312, 0, 32768, 40960, 43008, 43264, + 43328, 43329, 43320, 0, 32768, 40960, 43008, 43264, + 43328, 43329, 43320, 0, 32768, 40960, 43008, 43264, + 43328, 43329, 43320, 43322, 0, 32768, 40960, 43008, + 43264, 43328, 43329, 43320, 0, 32768, 40960, 43008, + 43264, 43328, 43329, 43320, 43324, 0, 32768, 40960, + 43008, 43264, 43328, 43329, 43331, 43324, 0, 32768, + 40960, 43008, 43264, 43328, 43329, 43331, 43324, 43326, + 0, 32768, 40960, 43008, 43264, 0, 32768, 40960, + 43008, 43264, 43328, 0, 32768, 40960, 43008, 43264, + 43328, 0, 32768, 40960, 43008, 43264, 43328, 43330, + 0, 32768, 40960, 43008, 43264, 43328, 0, 32768, + 40960, 43008, 43264, 43328, 43332, 0, 32768, 40960, + 43008, 43264, 43328, 43332, 0, 32768, 40960, 43008, + 43264, 43328, 43336, 43334, 0, 32768, 40960, 43008, + 43264, 43328, 0, 32768, 40960, 43008, 43264, 43328, + 43336, 0, 32768, 40960, 43008, 43264, 43328, 43336, + 0, 32768, 40960, 43008, 43264, 43328, 43336, 43338, + 0, 32768, 40960, 43008, 43264, 43328, 43336, 0, + 32768, 40960, 43008, 43264, 43328, 43344, 43340, 0, + 32768, 40960, 43008, 43264, 43328, 43344, 43340, 0, + 32768, 40960, 43008, 43264, 43328, 43344, 43345, 43342, + 0, 32768, 40960, 43008, 43264, 43328, 0, 32768, + 40960, 43008, 43264, 43328, 43344, 0, 32768, 40960, + 43008, 43264, 43328, 43344, 0, 32768, 40960, 43008, + 43264, 43328, 43344, 43346, 0, 32768, 40960, 43008, + 43264, 43328, 43344, 0, 32768, 40960, 43008, 43264, + 43328, 43344, 43348, 0, 32768, 40960, 43008, 43264, + 43328, 43344, 43348, 0, 32768, 40960, 43008, 43264, + 43328, 43344, 43352, 43350, 0, 32768, 40960, 43008, + 43264, 43328, 43344, 0, 32768, 40960, 43008, 43264, + 43328, 43360, 43352, 0, 32768, 40960, 43008, 43264, + 43328, 43360, 43352, 0, 32768, 40960, 43008, 43264, + 43328, 43360, 43352, 43354, 0, 32768, 40960, 43008, + 43264, 43328, 43360, 43352, 0, 32768, 40960, 43008, + 43264, 43328, 43360, 43361, 43356, 0, 32768, 40960, + 43008, 43264, 43328, 43360, 43361, 43356, 0, 32768, + 40960, 43008, 43264, 43328, 43360, 43361, 43356, 43358, + 0, 32768, 40960, 43008, 43264, 43328, 0, 32768, + 40960, 43008, 43264, 43392, 43360, 0, 32768, 40960, + 43008, 43264, 43392, 43360, 0, 32768, 40960, 43008, + 43264, 43392, 43360, 43362, 0, 32768, 40960, 43008, + 43264, 43392, 43360, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43364, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43364, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43368, 43366, 0, 32768, 40960, 43008, + 43264, 43392, 43360, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43368, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43368, 0, 32768, 40960, 43008, 43264, + 43392, 43360, 43368, 43370, 0, 32768, 40960, 43008, + 43264, 43392, 43360, 43368, 0, 32768, 40960, 43008, + 43264, 43392, 43360, 43376, 43372, 0, 32768, 40960, + 43008, 43264, 43392, 43360, 43376, 43372, 0, 32768, + 40960, 43008, 43264, 43392, 43360, 43376, 43377, 43374, + 0, 32768, 40960, 43008, 43264, 43392, 43360, 0, + 32768, 40960, 43008, 43264, 43392, 43393, 43376, 0, + 32768, 40960, 43008, 43264, 43392, 43393, 43376, 0, + 32768, 40960, 43008, 43264, 43392, 43393, 43376, 43378, + 0, 32768, 40960, 43008, 43264, 43392, 43393, 43376, + 0, 32768, 40960, 43008, 43264, 43392, 43393, 43376, + 43380, 0, 32768, 40960, 43008, 43264, 43392, 43393, + 43376, 43380, 0, 32768, 40960, 43008, 43264, 43392, + 43393, 43376, 43384, 43382, 0, 32768, 40960, 43008, + 43264, 43392, 43393, 43376, 0, 32768, 40960, 43008, + 43264, 43392, 43393, 43376, 43384, 0, 32768, 40960, + 43008, 43264, 43392, 43393, 43395, 43384, 0, 32768, + 40960, 43008, 43264, 43392, 43393, 43395, 43384, 43386, + 0, 32768, 40960, 43008, 43264, 43392, 43393, 43395, + 43384, 0, 32768, 40960, 43008, 43264, 43392, 43393, + 43395, 43384, 43388, 0, 32768, 40960, 43008, 43264, + 43392, 43393, 43395, 43384, 43388, 0, 32768, 40960, + 43008, 43264, 43392, 43393, 43395, 43384, 43388, 43390, + 0, 32768, 40960, 43008, 43264, 0, 32768, 40960, + 43008, 43520, 43392, 0, 32768, 40960, 43008, 43520, + 43392, 0, 32768, 40960, 43008, 43520, 43392, 43394, + 0, 32768, 40960, 43008, 43520, 43392, 0, 32768, + 40960, 43008, 43520, 43392, 43396, 0, 32768, 40960, + 43008, 43520, 43392, 43396, 0, 32768, 40960, 43008, + 43520, 43392, 43400, 43398, 0, 32768, 40960, 43008, + 43520, 43392, 0, 32768, 40960, 43008, 43520, 43392, + 43400, 0, 32768, 40960, 43008, 43520, 43392, 43400, + 0, 32768, 40960, 43008, 43520, 43392, 43400, 43402, + 0, 32768, 40960, 43008, 43520, 43392, 43400, 0, + 32768, 40960, 43008, 43520, 43392, 43408, 43404, 0, + 32768, 40960, 43008, 43520, 43392, 43408, 43404, 0, + 32768, 40960, 43008, 43520, 43392, 43408, 43409, 43406, + 0, 32768, 40960, 43008, 43520, 43392, 0, 32768, + 40960, 43008, 43520, 43392, 43408, 0, 32768, 40960, + 43008, 43520, 43392, 43408, 0, 32768, 40960, 43008, + 43520, 43392, 43408, 43410, 0, 32768, 40960, 43008, + 43520, 43392, 43408, 0, 32768, 40960, 43008, 43520, + 43392, 43408, 43412, 0, 32768, 40960, 43008, 43520, + 43392, 43408, 43412, 0, 32768, 40960, 43008, 43520, + 43392, 43408, 43416, 43414, 0, 32768, 40960, 43008, + 43520, 43392, 43408, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43416, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43416, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43416, 43418, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 43416, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 43425, 43420, 0, 32768, 40960, + 43008, 43520, 43392, 43424, 43425, 43420, 0, 32768, + 40960, 43008, 43520, 43392, 43424, 43425, 43420, 43422, + 0, 32768, 40960, 43008, 43520, 43392, 0, 32768, + 40960, 43008, 43520, 43392, 43424, 0, 32768, 40960, + 43008, 43520, 43392, 43424, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 43426, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43428, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43428, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43432, 43430, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43432, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43432, 0, 32768, 40960, 43008, 43520, + 43392, 43424, 43432, 43434, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 43432, 0, 32768, 40960, 43008, + 43520, 43392, 43424, 43440, 43436, 0, 32768, 40960, + 43008, 43520, 43392, 43424, 43440, 43436, 0, 32768, + 40960, 43008, 43520, 43392, 43424, 43440, 43441, 43438, + 0, 32768, 40960, 43008, 43520, 43392, 43424, 0, + 32768, 40960, 43008, 43520, 43392, 43456, 43440, 0, + 32768, 40960, 43008, 43520, 43392, 43456, 43440, 0, + 32768, 40960, 43008, 43520, 43392, 43456, 43440, 43442, + 0, 32768, 40960, 43008, 43520, 43392, 43456, 43440, + 0, 32768, 40960, 43008, 43520, 43392, 43456, 43440, + 43444, 0, 32768, 40960, 43008, 43520, 43392, 43456, + 43440, 43444, 0, 32768, 40960, 43008, 43520, 43392, + 43456, 43440, 43448, 43446, 0, 32768, 40960, 43008, + 43520, 43392, 43456, 43440, 0, 32768, 40960, 43008, + 43520, 43392, 43456, 43457, 43448, 0, 32768, 40960, + 43008, 43520, 43392, 43456, 43457, 43448, 0, 32768, + 40960, 43008, 43520, 43392, 43456, 43457, 43448, 43450, + 0, 32768, 40960, 43008, 43520, 43392, 43456, 43457, + 43448, 0, 32768, 40960, 43008, 43520, 43392, 43456, + 43457, 43448, 43452, 0, 32768, 40960, 43008, 43520, + 43392, 43456, 43457, 43459, 43452, 0, 32768, 40960, + 43008, 43520, 43392, 43456, 43457, 43459, 43452, 43454, + 0, 32768, 40960, 43008, 43520, 43392, 0, 32768, + 40960, 43008, 43520, 43521, 43456, 0, 32768, 40960, + 43008, 43520, 43521, 43456, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 43458, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43460, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43460, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43464, 43462, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43464, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43464, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43464, 43466, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 43464, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 43472, 43468, 0, 32768, 40960, + 43008, 43520, 43521, 43456, 43472, 43468, 0, 32768, + 40960, 43008, 43520, 43521, 43456, 43472, 43473, 43470, + 0, 32768, 40960, 43008, 43520, 43521, 43456, 0, + 32768, 40960, 43008, 43520, 43521, 43456, 43472, 0, + 32768, 40960, 43008, 43520, 43521, 43456, 43472, 0, + 32768, 40960, 43008, 43520, 43521, 43456, 43472, 43474, + 0, 32768, 40960, 43008, 43520, 43521, 43456, 43472, + 0, 32768, 40960, 43008, 43520, 43521, 43456, 43472, + 43476, 0, 32768, 40960, 43008, 43520, 43521, 43456, + 43472, 43476, 0, 32768, 40960, 43008, 43520, 43521, + 43456, 43472, 43480, 43478, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 43472, 0, 32768, 40960, 43008, + 43520, 43521, 43456, 43488, 43480, 0, 32768, 40960, + 43008, 43520, 43521, 43456, 43488, 43480, 0, 32768, + 40960, 43008, 43520, 43521, 43456, 43488, 43480, 43482, + 0, 32768, 40960, 43008, 43520, 43521, 43456, 43488, + 43480, 0, 32768, 40960, 43008, 43520, 43521, 43456, + 43488, 43489, 43484, 0, 32768, 40960, 43008, 43520, + 43521, 43456, 43488, 43489, 43484, 0, 32768, 40960, + 43008, 43520, 43521, 43456, 43488, 43489, 43484, 43486, + 0, 32768, 40960, 43008, 43520, 43521, 43456, 0, + 32768, 40960, 43008, 43520, 43521, 43456, 43488, 0, + 32768, 40960, 43008, 43520, 43521, 43523, 43488, 0, + 32768, 40960, 43008, 43520, 43521, 43523, 43488, 43490, + 0, 32768, 40960, 43008, 43520, 43521, 43523, 43488, + 0, 32768, 40960, 43008, 43520, 43521, 43523, 43488, + 43492, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43488, 43492, 0, 32768, 40960, 43008, 43520, 43521, + 43523, 43488, 43496, 43494, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43488, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43488, 43496, 0, 32768, 40960, + 43008, 43520, 43521, 43523, 43488, 43496, 0, 32768, + 40960, 43008, 43520, 43521, 43523, 43488, 43496, 43498, + 0, 32768, 40960, 43008, 43520, 43521, 43523, 43488, + 43496, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43488, 43504, 43500, 0, 32768, 40960, 43008, 43520, + 43521, 43523, 43488, 43504, 43500, 0, 32768, 40960, + 43008, 43520, 43521, 43523, 43488, 43504, 43505, 43502, + 0, 32768, 40960, 43008, 43520, 43521, 43523, 43488, + 0, 32768, 40960, 43008, 43520, 43521, 43523, 43488, + 43504, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43488, 43504, 0, 32768, 40960, 43008, 43520, 43521, + 43523, 43488, 43504, 43506, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43527, 43504, 0, 32768, 40960, + 43008, 43520, 43521, 43523, 43527, 43504, 43508, 0, + 32768, 40960, 43008, 43520, 43521, 43523, 43527, 43504, + 43508, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43527, 43504, 43512, 43510, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43527, 43504, 0, 32768, 40960, + 43008, 43520, 43521, 43523, 43527, 43504, 43512, 0, + 32768, 40960, 43008, 43520, 43521, 43523, 43527, 43504, + 43512, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43527, 43504, 43512, 43514, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43527, 43504, 43512, 0, 32768, + 40960, 43008, 43520, 43521, 43523, 43527, 43504, 43512, + 43516, 0, 32768, 40960, 43008, 43520, 43521, 43523, + 43527, 43504, 43512, 43516, 0, 32768, 40960, 43008, + 43520, 43521, 43523, 43527, 43504, 43512, 43516, 43518, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 43520, 0, 32768, 40960, 43008, 43520, 0, 32768, + 40960, 43008, 43520, 43522, 0, 32768, 40960, 43008, + 43520, 0, 32768, 40960, 43008, 43520, 43524, 0, + 32768, 40960, 43008, 43520, 43524, 0, 32768, 40960, + 43008, 43520, 43528, 43526, 0, 32768, 40960, 43008, + 43520, 0, 32768, 40960, 43008, 43520, 43528, 0, + 32768, 40960, 43008, 43520, 43528, 0, 32768, 40960, + 43008, 43520, 43528, 43530, 0, 32768, 40960, 43008, + 43520, 43528, 0, 32768, 40960, 43008, 43520, 43536, + 43532, 0, 32768, 40960, 43008, 43520, 43536, 43532, + 0, 32768, 40960, 43008, 43520, 43536, 43537, 43534, + 0, 32768, 40960, 43008, 43520, 0, 32768, 40960, + 43008, 43520, 43536, 0, 32768, 40960, 43008, 43520, + 43536, 0, 32768, 40960, 43008, 43520, 43536, 43538, + 0, 32768, 40960, 43008, 43520, 43536, 0, 32768, + 40960, 43008, 43520, 43536, 43540, 0, 32768, 40960, + 43008, 43520, 43536, 43540, 0, 32768, 40960, 43008, + 43520, 43536, 43544, 43542, 0, 32768, 40960, 43008, + 43520, 43536, 0, 32768, 40960, 43008, 43520, 43552, + 43544, 0, 32768, 40960, 43008, 43520, 43552, 43544, + 0, 32768, 40960, 43008, 43520, 43552, 43544, 43546, + 0, 32768, 40960, 43008, 43520, 43552, 43544, 0, + 32768, 40960, 43008, 43520, 43552, 43553, 43548, 0, + 32768, 40960, 43008, 43520, 43552, 43553, 43548, 0, + 32768, 40960, 43008, 43520, 43552, 43553, 43548, 43550, + 0, 32768, 40960, 43008, 43520, 0, 32768, 40960, + 43008, 43520, 43552, 0, 32768, 40960, 43008, 43520, + 43552, 0, 32768, 40960, 43008, 43520, 43552, 43554, + 0, 32768, 40960, 43008, 43520, 43552, 0, 32768, + 40960, 43008, 43520, 43552, 43556, 0, 32768, 40960, + 43008, 43520, 43552, 43556, 0, 32768, 40960, 43008, + 43520, 43552, 43560, 43558, 0, 32768, 40960, 43008, + 43520, 43552, 0, 32768, 40960, 43008, 43520, 43552, + 43560, 0, 32768, 40960, 43008, 43520, 43552, 43560, + 0, 32768, 40960, 43008, 43520, 43552, 43560, 43562, + 0, 32768, 40960, 43008, 43520, 43552, 43560, 0, + 32768, 40960, 43008, 43520, 43552, 43568, 43564, 0, + 32768, 40960, 43008, 43520, 43552, 43568, 43564, 0, + 32768, 40960, 43008, 43520, 43552, 43568, 43569, 43566, + 0, 32768, 40960, 43008, 43520, 43552, 0, 32768, + 40960, 43008, 43520, 43584, 43568, 0, 32768, 40960, + 43008, 43520, 43584, 43568, 0, 32768, 40960, 43008, + 43520, 43584, 43568, 43570, 0, 32768, 40960, 43008, + 43520, 43584, 43568, 0, 32768, 40960, 43008, 43520, + 43584, 43568, 43572, 0, 32768, 40960, 43008, 43520, + 43584, 43568, 43572, 0, 32768, 40960, 43008, 43520, + 43584, 43568, 43576, 43574, 0, 32768, 40960, 43008, + 43520, 43584, 43568, 0, 32768, 40960, 43008, 43520, + 43584, 43585, 43576, 0, 32768, 40960, 43008, 43520, + 43584, 43585, 43576, 0, 32768, 40960, 43008, 43520, + 43584, 43585, 43576, 43578, 0, 32768, 40960, 43008, + 43520, 43584, 43585, 43576, 0, 32768, 40960, 43008, + 43520, 43584, 43585, 43576, 43580, 0, 32768, 40960, + 43008, 43520, 43584, 43585, 43587, 43580, 0, 32768, + 40960, 43008, 43520, 43584, 43585, 43587, 43580, 43582, + 0, 32768, 40960, 43008, 43520, 0, 32768, 40960, + 43008, 43520, 43584, 0, 32768, 40960, 43008, 43520, + 43584, 0, 32768, 40960, 43008, 43520, 43584, 43586, + 0, 32768, 40960, 43008, 43520, 43584, 0, 32768, + 40960, 43008, 43520, 43584, 43588, 0, 32768, 40960, + 43008, 43520, 43584, 43588, 0, 32768, 40960, 43008, + 43520, 43584, 43592, 43590, 0, 32768, 40960, 43008, + 43520, 43584, 0, 32768, 40960, 43008, 43520, 43584, + 43592, 0, 32768, 40960, 43008, 43520, 43584, 43592, + 0, 32768, 40960, 43008, 43520, 43584, 43592, 43594, + 0, 32768, 40960, 43008, 43520, 43584, 43592, 0, + 32768, 40960, 43008, 43520, 43584, 43600, 43596, 0, + 32768, 40960, 43008, 43520, 43584, 43600, 43596, 0, + 32768, 40960, 43008, 43520, 43584, 43600, 43601, 43598, + 0, 32768, 40960, 43008, 43520, 43584, 0, 32768, + 40960, 43008, 43520, 43584, 43600, 0, 32768, 40960, + 43008, 43520, 43584, 43600, 0, 32768, 40960, 43008, + 43520, 43584, 43600, 43602, 0, 32768, 40960, 43008, + 43520, 43584, 43600, 0, 32768, 40960, 43008, 43520, + 43584, 43600, 43604, 0, 32768, 40960, 43008, 43520, + 43584, 43600, 43604, 0, 32768, 40960, 43008, 43520, + 43584, 43600, 43608, 43606, 0, 32768, 40960, 43008, + 43520, 43584, 43600, 0, 32768, 40960, 43008, 43520, + 43584, 43616, 43608, 0, 32768, 40960, 43008, 43520, + 43584, 43616, 43608, 0, 32768, 40960, 43008, 43520, + 43584, 43616, 43608, 43610, 0, 32768, 40960, 43008, + 43520, 43584, 43616, 43608, 0, 32768, 40960, 43008, + 43520, 43584, 43616, 43617, 43612, 0, 32768, 40960, + 43008, 43520, 43584, 43616, 43617, 43612, 0, 32768, + 40960, 43008, 43520, 43584, 43616, 43617, 43612, 43614, + 0, 32768, 40960, 43008, 43520, 43584, 0, 32768, + 40960, 43008, 43520, 43648, 43616, 0, 32768, 40960, + 43008, 43520, 43648, 43616, 0, 32768, 40960, 43008, + 43520, 43648, 43616, 43618, 0, 32768, 40960, 43008, + 43520, 43648, 43616, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43620, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43620, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43624, 43622, 0, 32768, 40960, 43008, + 43520, 43648, 43616, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43624, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43624, 0, 32768, 40960, 43008, 43520, + 43648, 43616, 43624, 43626, 0, 32768, 40960, 43008, + 43520, 43648, 43616, 43624, 0, 32768, 40960, 43008, + 43520, 43648, 43616, 43632, 43628, 0, 32768, 40960, + 43008, 43520, 43648, 43616, 43632, 43628, 0, 32768, + 40960, 43008, 43520, 43648, 43616, 43632, 43633, 43630, + 0, 32768, 40960, 43008, 43520, 43648, 43616, 0, + 32768, 40960, 43008, 43520, 43648, 43649, 43632, 0, + 32768, 40960, 43008, 43520, 43648, 43649, 43632, 0, + 32768, 40960, 43008, 43520, 43648, 43649, 43632, 43634, + 0, 32768, 40960, 43008, 43520, 43648, 43649, 43632, + 0, 32768, 40960, 43008, 43520, 43648, 43649, 43632, + 43636, 0, 32768, 40960, 43008, 43520, 43648, 43649, + 43632, 43636, 0, 32768, 40960, 43008, 43520, 43648, + 43649, 43632, 43640, 43638, 0, 32768, 40960, 43008, + 43520, 43648, 43649, 43632, 0, 32768, 40960, 43008, + 43520, 43648, 43649, 43632, 43640, 0, 32768, 40960, + 43008, 43520, 43648, 43649, 43651, 43640, 0, 32768, + 40960, 43008, 43520, 43648, 43649, 43651, 43640, 43642, + 0, 32768, 40960, 43008, 43520, 43648, 43649, 43651, + 43640, 0, 32768, 40960, 43008, 43520, 43648, 43649, + 43651, 43640, 43644, 0, 32768, 40960, 43008, 43520, + 43648, 43649, 43651, 43640, 43644, 0, 32768, 40960, + 43008, 43520, 43648, 43649, 43651, 43640, 43644, 43646, + 0, 32768, 40960, 43008, 43520, 0, 32768, 40960, + 43008, 43520, 43648, 0, 32768, 40960, 43008, 43520, + 43648, 0, 32768, 40960, 43008, 43520, 43648, 43650, + 0, 32768, 40960, 43008, 43520, 43648, 0, 32768, + 40960, 43008, 43520, 43648, 43652, 0, 32768, 40960, + 43008, 43520, 43648, 43652, 0, 32768, 40960, 43008, + 43520, 43648, 43656, 43654, 0, 32768, 40960, 43008, + 43520, 43648, 0, 32768, 40960, 43008, 43520, 43648, + 43656, 0, 32768, 40960, 43008, 43520, 43648, 43656, + 0, 32768, 40960, 43008, 43520, 43648, 43656, 43658, + 0, 32768, 40960, 43008, 43520, 43648, 43656, 0, + 32768, 40960, 43008, 43520, 43648, 43664, 43660, 0, + 32768, 40960, 43008, 43520, 43648, 43664, 43660, 0, + 32768, 40960, 43008, 43520, 43648, 43664, 43665, 43662, + 0, 32768, 40960, 43008, 43520, 43648, 0, 32768, + 40960, 43008, 43520, 43648, 43664, 0, 32768, 40960, + 43008, 43520, 43648, 43664, 0, 32768, 40960, 43008, + 43520, 43648, 43664, 43666, 0, 32768, 40960, 43008, + 43520, 43648, 43664, 0, 32768, 40960, 43008, 43520, + 43648, 43664, 43668, 0, 32768, 40960, 43008, 43520, + 43648, 43664, 43668, 0, 32768, 40960, 43008, 43520, + 43648, 43664, 43672, 43670, 0, 32768, 40960, 43008, + 43520, 43648, 43664, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43672, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43672, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43672, 43674, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 43672, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 43681, 43676, 0, 32768, 40960, + 43008, 43520, 43648, 43680, 43681, 43676, 0, 32768, + 40960, 43008, 43520, 43648, 43680, 43681, 43676, 43678, + 0, 32768, 40960, 43008, 43520, 43648, 0, 32768, + 40960, 43008, 43520, 43648, 43680, 0, 32768, 40960, + 43008, 43520, 43648, 43680, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 43682, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43684, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43684, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43688, 43686, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43688, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43688, 0, 32768, 40960, 43008, 43520, + 43648, 43680, 43688, 43690, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 43688, 0, 32768, 40960, 43008, + 43520, 43648, 43680, 43696, 43692, 0, 32768, 40960, + 43008, 43520, 43648, 43680, 43696, 43692, 0, 32768, + 40960, 43008, 43520, 43648, 43680, 43696, 43697, 43694, + 0, 32768, 40960, 43008, 43520, 43648, 43680, 0, + 32768, 40960, 43008, 43520, 43648, 43712, 43696, 0, + 32768, 40960, 43008, 43520, 43648, 43712, 43696, 0, + 32768, 40960, 43008, 43520, 43648, 43712, 43696, 43698, + 0, 32768, 40960, 43008, 43520, 43648, 43712, 43696, + 0, 32768, 40960, 43008, 43520, 43648, 43712, 43696, + 43700, 0, 32768, 40960, 43008, 43520, 43648, 43712, + 43696, 43700, 0, 32768, 40960, 43008, 43520, 43648, + 43712, 43696, 43704, 43702, 0, 32768, 40960, 43008, + 43520, 43648, 43712, 43696, 0, 32768, 40960, 43008, + 43520, 43648, 43712, 43713, 43704, 0, 32768, 40960, + 43008, 43520, 43648, 43712, 43713, 43704, 0, 32768, + 40960, 43008, 43520, 43648, 43712, 43713, 43704, 43706, + 0, 32768, 40960, 43008, 43520, 43648, 43712, 43713, + 43704, 0, 32768, 40960, 43008, 43520, 43648, 43712, + 43713, 43704, 43708, 0, 32768, 40960, 43008, 43520, + 43648, 43712, 43713, 43715, 43708, 0, 32768, 40960, + 43008, 43520, 43648, 43712, 43713, 43715, 43708, 43710, + 0, 32768, 40960, 43008, 43520, 43648, 0, 32768, + 40960, 43008, 43520, 43776, 43712, 0, 32768, 40960, + 43008, 43520, 43776, 43712, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 43714, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43716, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43716, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43720, 43718, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43720, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43720, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43720, 43722, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 43720, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 43728, 43724, 0, 32768, 40960, + 43008, 43520, 43776, 43712, 43728, 43724, 0, 32768, + 40960, 43008, 43520, 43776, 43712, 43728, 43729, 43726, + 0, 32768, 40960, 43008, 43520, 43776, 43712, 0, + 32768, 40960, 43008, 43520, 43776, 43712, 43728, 0, + 32768, 40960, 43008, 43520, 43776, 43712, 43728, 0, + 32768, 40960, 43008, 43520, 43776, 43712, 43728, 43730, + 0, 32768, 40960, 43008, 43520, 43776, 43712, 43728, + 0, 32768, 40960, 43008, 43520, 43776, 43712, 43728, + 43732, 0, 32768, 40960, 43008, 43520, 43776, 43712, + 43728, 43732, 0, 32768, 40960, 43008, 43520, 43776, + 43712, 43728, 43736, 43734, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 43728, 0, 32768, 40960, 43008, + 43520, 43776, 43712, 43744, 43736, 0, 32768, 40960, + 43008, 43520, 43776, 43712, 43744, 43736, 0, 32768, + 40960, 43008, 43520, 43776, 43712, 43744, 43736, 43738, + 0, 32768, 40960, 43008, 43520, 43776, 43712, 43744, + 43736, 0, 32768, 40960, 43008, 43520, 43776, 43712, + 43744, 43745, 43740, 0, 32768, 40960, 43008, 43520, + 43776, 43712, 43744, 43745, 43740, 0, 32768, 40960, + 43008, 43520, 43776, 43712, 43744, 43745, 43740, 43742, + 0, 32768, 40960, 43008, 43520, 43776, 43712, 0, + 32768, 40960, 43008, 43520, 43776, 43777, 43744, 0, + 32768, 40960, 43008, 43520, 43776, 43777, 43744, 0, + 32768, 40960, 43008, 43520, 43776, 43777, 43744, 43746, + 0, 32768, 40960, 43008, 43520, 43776, 43777, 43744, + 0, 32768, 40960, 43008, 43520, 43776, 43777, 43744, + 43748, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43744, 43748, 0, 32768, 40960, 43008, 43520, 43776, + 43777, 43744, 43752, 43750, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43744, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43744, 43752, 0, 32768, 40960, + 43008, 43520, 43776, 43777, 43744, 43752, 0, 32768, + 40960, 43008, 43520, 43776, 43777, 43744, 43752, 43754, + 0, 32768, 40960, 43008, 43520, 43776, 43777, 43744, + 43752, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43744, 43760, 43756, 0, 32768, 40960, 43008, 43520, + 43776, 43777, 43744, 43760, 43756, 0, 32768, 40960, + 43008, 43520, 43776, 43777, 43744, 43760, 43761, 43758, + 0, 32768, 40960, 43008, 43520, 43776, 43777, 43744, + 0, 32768, 40960, 43008, 43520, 43776, 43777, 43744, + 43760, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43779, 43760, 0, 32768, 40960, 43008, 43520, 43776, + 43777, 43779, 43760, 43762, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43779, 43760, 0, 32768, 40960, + 43008, 43520, 43776, 43777, 43779, 43760, 43764, 0, + 32768, 40960, 43008, 43520, 43776, 43777, 43779, 43760, + 43764, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43779, 43760, 43768, 43766, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43779, 43760, 0, 32768, 40960, + 43008, 43520, 43776, 43777, 43779, 43760, 43768, 0, + 32768, 40960, 43008, 43520, 43776, 43777, 43779, 43760, + 43768, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43779, 43760, 43768, 43770, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43779, 43783, 43768, 0, 32768, + 40960, 43008, 43520, 43776, 43777, 43779, 43783, 43768, + 43772, 0, 32768, 40960, 43008, 43520, 43776, 43777, + 43779, 43783, 43768, 43772, 0, 32768, 40960, 43008, + 43520, 43776, 43777, 43779, 43783, 43768, 43772, 43774, + 0, 32768, 40960, 43008, 43520, 0, 32768, 40960, + 43008, 44032, 43776, 0, 32768, 40960, 43008, 44032, + 43776, 0, 32768, 40960, 43008, 44032, 43776, 43778, + 0, 32768, 40960, 43008, 44032, 43776, 0, 32768, + 40960, 43008, 44032, 43776, 43780, 0, 32768, 40960, + 43008, 44032, 43776, 43780, 0, 32768, 40960, 43008, + 44032, 43776, 43784, 43782, 0, 32768, 40960, 43008, + 44032, 43776, 0, 32768, 40960, 43008, 44032, 43776, + 43784, 0, 32768, 40960, 43008, 44032, 43776, 43784, + 0, 32768, 40960, 43008, 44032, 43776, 43784, 43786, + 0, 32768, 40960, 43008, 44032, 43776, 43784, 0, + 32768, 40960, 43008, 44032, 43776, 43792, 43788, 0, + 32768, 40960, 43008, 44032, 43776, 43792, 43788, 0, + 32768, 40960, 43008, 44032, 43776, 43792, 43793, 43790, + 0, 32768, 40960, 43008, 44032, 43776, 0, 32768, + 40960, 43008, 44032, 43776, 43792, 0, 32768, 40960, + 43008, 44032, 43776, 43792, 0, 32768, 40960, 43008, + 44032, 43776, 43792, 43794, 0, 32768, 40960, 43008, + 44032, 43776, 43792, 0, 32768, 40960, 43008, 44032, + 43776, 43792, 43796, 0, 32768, 40960, 43008, 44032, + 43776, 43792, 43796, 0, 32768, 40960, 43008, 44032, + 43776, 43792, 43800, 43798, 0, 32768, 40960, 43008, + 44032, 43776, 43792, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43800, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43800, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43800, 43802, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 43800, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 43809, 43804, 0, 32768, 40960, + 43008, 44032, 43776, 43808, 43809, 43804, 0, 32768, + 40960, 43008, 44032, 43776, 43808, 43809, 43804, 43806, + 0, 32768, 40960, 43008, 44032, 43776, 0, 32768, + 40960, 43008, 44032, 43776, 43808, 0, 32768, 40960, + 43008, 44032, 43776, 43808, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 43810, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43812, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43812, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43816, 43814, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43816, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43816, 0, 32768, 40960, 43008, 44032, + 43776, 43808, 43816, 43818, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 43816, 0, 32768, 40960, 43008, + 44032, 43776, 43808, 43824, 43820, 0, 32768, 40960, + 43008, 44032, 43776, 43808, 43824, 43820, 0, 32768, + 40960, 43008, 44032, 43776, 43808, 43824, 43825, 43822, + 0, 32768, 40960, 43008, 44032, 43776, 43808, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43824, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43824, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43824, 43826, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43824, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43824, + 43828, 0, 32768, 40960, 43008, 44032, 43776, 43840, + 43824, 43828, 0, 32768, 40960, 43008, 44032, 43776, + 43840, 43824, 43832, 43830, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43824, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43841, 43832, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 43841, 43832, 0, 32768, + 40960, 43008, 44032, 43776, 43840, 43841, 43832, 43834, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43841, + 43832, 0, 32768, 40960, 43008, 44032, 43776, 43840, + 43841, 43832, 43836, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43841, 43843, 43836, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 43841, 43843, 43836, 43838, + 0, 32768, 40960, 43008, 44032, 43776, 0, 32768, + 40960, 43008, 44032, 43776, 43840, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43842, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43844, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43844, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43848, 43846, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43848, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43848, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43848, 43850, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43848, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43856, 43852, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 43856, 43852, 0, 32768, + 40960, 43008, 44032, 43776, 43840, 43856, 43857, 43854, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43856, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43856, 0, + 32768, 40960, 43008, 44032, 43776, 43840, 43856, 43858, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43856, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43856, + 43860, 0, 32768, 40960, 43008, 44032, 43776, 43840, + 43856, 43860, 0, 32768, 40960, 43008, 44032, 43776, + 43840, 43856, 43864, 43862, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43856, 0, 32768, 40960, 43008, + 44032, 43776, 43840, 43872, 43864, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 43872, 43864, 0, 32768, + 40960, 43008, 44032, 43776, 43840, 43872, 43864, 43866, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 43872, + 43864, 0, 32768, 40960, 43008, 44032, 43776, 43840, + 43872, 43873, 43868, 0, 32768, 40960, 43008, 44032, + 43776, 43840, 43872, 43873, 43868, 0, 32768, 40960, + 43008, 44032, 43776, 43840, 43872, 43873, 43868, 43870, + 0, 32768, 40960, 43008, 44032, 43776, 43840, 0, + 32768, 40960, 43008, 44032, 43776, 43904, 43872, 0, + 32768, 40960, 43008, 44032, 43776, 43904, 43872, 0, + 32768, 40960, 43008, 44032, 43776, 43904, 43872, 43874, + 0, 32768, 40960, 43008, 44032, 43776, 43904, 43872, + 0, 32768, 40960, 43008, 44032, 43776, 43904, 43872, + 43876, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43872, 43876, 0, 32768, 40960, 43008, 44032, 43776, + 43904, 43872, 43880, 43878, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43872, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43872, 43880, 0, 32768, 40960, + 43008, 44032, 43776, 43904, 43872, 43880, 0, 32768, + 40960, 43008, 44032, 43776, 43904, 43872, 43880, 43882, + 0, 32768, 40960, 43008, 44032, 43776, 43904, 43872, + 43880, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43872, 43888, 43884, 0, 32768, 40960, 43008, 44032, + 43776, 43904, 43872, 43888, 43884, 0, 32768, 40960, + 43008, 44032, 43776, 43904, 43872, 43888, 43889, 43886, + 0, 32768, 40960, 43008, 44032, 43776, 43904, 43872, + 0, 32768, 40960, 43008, 44032, 43776, 43904, 43905, + 43888, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43905, 43888, 0, 32768, 40960, 43008, 44032, 43776, + 43904, 43905, 43888, 43890, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43905, 43888, 0, 32768, 40960, + 43008, 44032, 43776, 43904, 43905, 43888, 43892, 0, + 32768, 40960, 43008, 44032, 43776, 43904, 43905, 43888, + 43892, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43905, 43888, 43896, 43894, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43905, 43888, 0, 32768, 40960, + 43008, 44032, 43776, 43904, 43905, 43888, 43896, 0, + 32768, 40960, 43008, 44032, 43776, 43904, 43905, 43907, + 43896, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43905, 43907, 43896, 43898, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43905, 43907, 43896, 0, 32768, + 40960, 43008, 44032, 43776, 43904, 43905, 43907, 43896, + 43900, 0, 32768, 40960, 43008, 44032, 43776, 43904, + 43905, 43907, 43896, 43900, 0, 32768, 40960, 43008, + 44032, 43776, 43904, 43905, 43907, 43896, 43900, 43902, + 0, 32768, 40960, 43008, 44032, 43776, 0, 32768, + 40960, 43008, 44032, 43776, 43904, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43906, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43908, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43908, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43912, 43910, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43912, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43912, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43912, 43914, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43912, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43920, 43916, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43920, 43916, 0, 32768, + 40960, 43008, 44032, 44033, 43904, 43920, 43921, 43918, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43920, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43920, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43920, 43922, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43920, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43920, + 43924, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43920, 43924, 0, 32768, 40960, 43008, 44032, 44033, + 43904, 43920, 43928, 43926, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43920, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43936, 43928, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43936, 43928, 0, 32768, + 40960, 43008, 44032, 44033, 43904, 43936, 43928, 43930, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43936, + 43928, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43936, 43937, 43932, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43936, 43937, 43932, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43936, 43937, 43932, 43934, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43936, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43936, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43936, 43938, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43936, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43936, + 43940, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43936, 43940, 0, 32768, 40960, 43008, 44032, 44033, + 43904, 43936, 43944, 43942, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43936, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43936, 43944, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43936, 43944, 0, 32768, + 40960, 43008, 44032, 44033, 43904, 43936, 43944, 43946, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43936, + 43944, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43936, 43952, 43948, 0, 32768, 40960, 43008, 44032, + 44033, 43904, 43936, 43952, 43948, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43936, 43952, 43953, 43950, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43936, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 43968, + 43952, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43968, 43952, 0, 32768, 40960, 43008, 44032, 44033, + 43904, 43968, 43952, 43954, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43968, 43952, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43968, 43952, 43956, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43968, 43952, + 43956, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43968, 43952, 43960, 43958, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43968, 43952, 0, 32768, 40960, + 43008, 44032, 44033, 43904, 43968, 43969, 43960, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43968, 43969, + 43960, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43968, 43969, 43960, 43962, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43968, 43969, 43960, 0, 32768, + 40960, 43008, 44032, 44033, 43904, 43968, 43969, 43960, + 43964, 0, 32768, 40960, 43008, 44032, 44033, 43904, + 43968, 43969, 43971, 43964, 0, 32768, 40960, 43008, + 44032, 44033, 43904, 43968, 43969, 43971, 43964, 43966, + 0, 32768, 40960, 43008, 44032, 44033, 43904, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43968, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43968, 0, + 32768, 40960, 43008, 44032, 44033, 43904, 43968, 43970, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 43972, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 43972, 0, 32768, 40960, 43008, 44032, 44033, + 44035, 43968, 43976, 43974, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 43976, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 43968, 43976, 0, 32768, + 40960, 43008, 44032, 44033, 44035, 43968, 43976, 43978, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 43976, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 43984, 43980, 0, 32768, 40960, 43008, 44032, + 44033, 44035, 43968, 43984, 43980, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 43968, 43984, 43985, 43982, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 43984, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 43984, 0, 32768, 40960, 43008, 44032, 44033, + 44035, 43968, 43984, 43986, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 43984, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 43968, 43984, 43988, 0, + 32768, 40960, 43008, 44032, 44033, 44035, 43968, 43984, + 43988, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 43984, 43992, 43990, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 43984, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 43968, 44000, 43992, 0, + 32768, 40960, 43008, 44032, 44033, 44035, 43968, 44000, + 43992, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 44000, 43992, 43994, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 44000, 43992, 0, 32768, + 40960, 43008, 44032, 44033, 44035, 43968, 44000, 44001, + 43996, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 44000, 44001, 43996, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 44000, 44001, 43996, 43998, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 43968, + 44000, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 44000, 0, 32768, 40960, 43008, 44032, 44033, + 44035, 43968, 44000, 44002, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 43968, 44000, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 43968, 44000, 44004, 0, + 32768, 40960, 43008, 44032, 44033, 44035, 43968, 44000, + 44004, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 43968, 44000, 44008, 44006, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 44039, 44000, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 44039, 44000, 44008, 0, + 32768, 40960, 43008, 44032, 44033, 44035, 44039, 44000, + 44008, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 44039, 44000, 44008, 44010, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 44039, 44000, 44008, 0, 32768, + 40960, 43008, 44032, 44033, 44035, 44039, 44000, 44016, + 44012, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 44039, 44000, 44016, 44012, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 44039, 44000, 44016, 44017, 44014, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 44039, + 44000, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 44039, 44000, 44016, 0, 32768, 40960, 43008, 44032, + 44033, 44035, 44039, 44000, 44016, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 44039, 44000, 44016, 44018, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 44039, + 44000, 44016, 0, 32768, 40960, 43008, 44032, 44033, + 44035, 44039, 44000, 44016, 44020, 0, 32768, 40960, + 43008, 44032, 44033, 44035, 44039, 44000, 44016, 44020, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 44039, + 44000, 44016, 44024, 44022, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 44039, 44000, 44016, 0, 32768, + 40960, 43008, 44032, 44033, 44035, 44039, 44000, 44016, + 44024, 0, 32768, 40960, 43008, 44032, 44033, 44035, + 44039, 44000, 44016, 44024, 0, 32768, 40960, 43008, + 44032, 44033, 44035, 44039, 44000, 44016, 44024, 44026, + 0, 32768, 40960, 43008, 44032, 44033, 44035, 44039, + 44000, 44016, 44024, 0, 32768, 40960, 43008, 44032, + 44033, 44035, 44039, 44000, 44016, 44024, 44028, 0, + 32768, 40960, 43008, 44032, 44033, 44035, 44039, 44000, + 44016, 44024, 44028, 0, 32768, 40960, 43008, 44032, + 44033, 44035, 44039, 44000, 44016, 44024, 44028, 44030, + 0, 32768, 40960, 43008, 0, 32768, 40960, 43008, + 44032, 0, 32768, 40960, 43008, 44032, 0, 32768, + 40960, 43008, 44032, 44034, 0, 32768, 40960, 43008, + 44032, 0, 32768, 40960, 43008, 44032, 44036, 0, + 32768, 40960, 43008, 44032, 44036, 0, 32768, 40960, + 43008, 44032, 44040, 44038, 0, 32768, 40960, 43008, + 44032, 0, 32768, 40960, 43008, 44032, 44040, 0, + 32768, 40960, 43008, 44032, 44040, 0, 32768, 40960, + 43008, 44032, 44040, 44042, 0, 32768, 40960, 43008, + 44032, 44040, 0, 32768, 40960, 43008, 44032, 44048, + 44044, 0, 32768, 40960, 43008, 44032, 44048, 44044, + 0, 32768, 40960, 43008, 44032, 44048, 44049, 44046, + 0, 32768, 40960, 43008, 44032, 0, 32768, 40960, + 43008, 44032, 44048, 0, 32768, 40960, 43008, 44032, + 44048, 0, 32768, 40960, 43008, 44032, 44048, 44050, + 0, 32768, 40960, 43008, 44032, 44048, 0, 32768, + 40960, 43008, 44032, 44048, 44052, 0, 32768, 40960, + 43008, 44032, 44048, 44052, 0, 32768, 40960, 43008, + 44032, 44048, 44056, 44054, 0, 32768, 40960, 43008, + 44032, 44048, 0, 32768, 40960, 43008, 44032, 44064, + 44056, 0, 32768, 40960, 43008, 44032, 44064, 44056, + 0, 32768, 40960, 43008, 44032, 44064, 44056, 44058, + 0, 32768, 40960, 43008, 44032, 44064, 44056, 0, + 32768, 40960, 43008, 44032, 44064, 44065, 44060, 0, + 32768, 40960, 43008, 44032, 44064, 44065, 44060, 0, + 32768, 40960, 43008, 44032, 44064, 44065, 44060, 44062, + 0, 32768, 40960, 43008, 44032, 0, 32768, 40960, + 43008, 44032, 44064, 0, 32768, 40960, 43008, 44032, + 44064, 0, 32768, 40960, 43008, 44032, 44064, 44066, + 0, 32768, 40960, 43008, 44032, 44064, 0, 32768, + 40960, 43008, 44032, 44064, 44068, 0, 32768, 40960, + 43008, 44032, 44064, 44068, 0, 32768, 40960, 43008, + 44032, 44064, 44072, 44070, 0, 32768, 40960, 43008, + 44032, 44064, 0, 32768, 40960, 43008, 44032, 44064, + 44072, 0, 32768, 40960, 43008, 44032, 44064, 44072, + 0, 32768, 40960, 43008, 44032, 44064, 44072, 44074, + 0, 32768, 40960, 43008, 44032, 44064, 44072, 0, + 32768, 40960, 43008, 44032, 44064, 44080, 44076, 0, + 32768, 40960, 43008, 44032, 44064, 44080, 44076, 0, + 32768, 40960, 43008, 44032, 44064, 44080, 44081, 44078, + 0, 32768, 40960, 43008, 44032, 44064, 0, 32768, + 40960, 43008, 44032, 44096, 44080, 0, 32768, 40960, + 43008, 44032, 44096, 44080, 0, 32768, 40960, 43008, + 44032, 44096, 44080, 44082, 0, 32768, 40960, 43008, + 44032, 44096, 44080, 0, 32768, 40960, 43008, 44032, + 44096, 44080, 44084, 0, 32768, 40960, 43008, 44032, + 44096, 44080, 44084, 0, 32768, 40960, 43008, 44032, + 44096, 44080, 44088, 44086, 0, 32768, 40960, 43008, + 44032, 44096, 44080, 0, 32768, 40960, 43008, 44032, + 44096, 44097, 44088, 0, 32768, 40960, 43008, 44032, + 44096, 44097, 44088, 0, 32768, 40960, 43008, 44032, + 44096, 44097, 44088, 44090, 0, 32768, 40960, 43008, + 44032, 44096, 44097, 44088, 0, 32768, 40960, 43008, + 44032, 44096, 44097, 44088, 44092, 0, 32768, 40960, + 43008, 44032, 44096, 44097, 44099, 44092, 0, 32768, + 40960, 43008, 44032, 44096, 44097, 44099, 44092, 44094, + 0, 32768, 40960, 43008, 44032, 0, 32768, 40960, + 43008, 44032, 44096, 0, 32768, 40960, 43008, 44032, + 44096, 0, 32768, 40960, 43008, 44032, 44096, 44098, + 0, 32768, 40960, 43008, 44032, 44096, 0, 32768, + 40960, 43008, 44032, 44096, 44100, 0, 32768, 40960, + 43008, 44032, 44096, 44100, 0, 32768, 40960, 43008, + 44032, 44096, 44104, 44102, 0, 32768, 40960, 43008, + 44032, 44096, 0, 32768, 40960, 43008, 44032, 44096, + 44104, 0, 32768, 40960, 43008, 44032, 44096, 44104, + 0, 32768, 40960, 43008, 44032, 44096, 44104, 44106, + 0, 32768, 40960, 43008, 44032, 44096, 44104, 0, + 32768, 40960, 43008, 44032, 44096, 44112, 44108, 0, + 32768, 40960, 43008, 44032, 44096, 44112, 44108, 0, + 32768, 40960, 43008, 44032, 44096, 44112, 44113, 44110, + 0, 32768, 40960, 43008, 44032, 44096, 0, 32768, + 40960, 43008, 44032, 44096, 44112, 0, 32768, 40960, + 43008, 44032, 44096, 44112, 0, 32768, 40960, 43008, + 44032, 44096, 44112, 44114, 0, 32768, 40960, 43008, + 44032, 44096, 44112, 0, 32768, 40960, 43008, 44032, + 44096, 44112, 44116, 0, 32768, 40960, 43008, 44032, + 44096, 44112, 44116, 0, 32768, 40960, 43008, 44032, + 44096, 44112, 44120, 44118, 0, 32768, 40960, 43008, + 44032, 44096, 44112, 0, 32768, 40960, 43008, 44032, + 44096, 44128, 44120, 0, 32768, 40960, 43008, 44032, + 44096, 44128, 44120, 0, 32768, 40960, 43008, 44032, + 44096, 44128, 44120, 44122, 0, 32768, 40960, 43008, + 44032, 44096, 44128, 44120, 0, 32768, 40960, 43008, + 44032, 44096, 44128, 44129, 44124, 0, 32768, 40960, + 43008, 44032, 44096, 44128, 44129, 44124, 0, 32768, + 40960, 43008, 44032, 44096, 44128, 44129, 44124, 44126, + 0, 32768, 40960, 43008, 44032, 44096, 0, 32768, + 40960, 43008, 44032, 44160, 44128, 0, 32768, 40960, + 43008, 44032, 44160, 44128, 0, 32768, 40960, 43008, + 44032, 44160, 44128, 44130, 0, 32768, 40960, 43008, + 44032, 44160, 44128, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44132, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44132, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44136, 44134, 0, 32768, 40960, 43008, + 44032, 44160, 44128, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44136, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44136, 0, 32768, 40960, 43008, 44032, + 44160, 44128, 44136, 44138, 0, 32768, 40960, 43008, + 44032, 44160, 44128, 44136, 0, 32768, 40960, 43008, + 44032, 44160, 44128, 44144, 44140, 0, 32768, 40960, + 43008, 44032, 44160, 44128, 44144, 44140, 0, 32768, + 40960, 43008, 44032, 44160, 44128, 44144, 44145, 44142, + 0, 32768, 40960, 43008, 44032, 44160, 44128, 0, + 32768, 40960, 43008, 44032, 44160, 44161, 44144, 0, + 32768, 40960, 43008, 44032, 44160, 44161, 44144, 0, + 32768, 40960, 43008, 44032, 44160, 44161, 44144, 44146, + 0, 32768, 40960, 43008, 44032, 44160, 44161, 44144, + 0, 32768, 40960, 43008, 44032, 44160, 44161, 44144, + 44148, 0, 32768, 40960, 43008, 44032, 44160, 44161, + 44144, 44148, 0, 32768, 40960, 43008, 44032, 44160, + 44161, 44144, 44152, 44150, 0, 32768, 40960, 43008, + 44032, 44160, 44161, 44144, 0, 32768, 40960, 43008, + 44032, 44160, 44161, 44144, 44152, 0, 32768, 40960, + 43008, 44032, 44160, 44161, 44163, 44152, 0, 32768, + 40960, 43008, 44032, 44160, 44161, 44163, 44152, 44154, + 0, 32768, 40960, 43008, 44032, 44160, 44161, 44163, + 44152, 0, 32768, 40960, 43008, 44032, 44160, 44161, + 44163, 44152, 44156, 0, 32768, 40960, 43008, 44032, + 44160, 44161, 44163, 44152, 44156, 0, 32768, 40960, + 43008, 44032, 44160, 44161, 44163, 44152, 44156, 44158, + 0, 32768, 40960, 43008, 44032, 0, 32768, 40960, + 43008, 44032, 44160, 0, 32768, 40960, 43008, 44032, + 44160, 0, 32768, 40960, 43008, 44032, 44160, 44162, + 0, 32768, 40960, 43008, 44032, 44160, 0, 32768, + 40960, 43008, 44032, 44160, 44164, 0, 32768, 40960, + 43008, 44032, 44160, 44164, 0, 32768, 40960, 43008, + 44032, 44160, 44168, 44166, 0, 32768, 40960, 43008, + 44032, 44160, 0, 32768, 40960, 43008, 44032, 44160, + 44168, 0, 32768, 40960, 43008, 44032, 44160, 44168, + 0, 32768, 40960, 43008, 44032, 44160, 44168, 44170, + 0, 32768, 40960, 43008, 44032, 44160, 44168, 0, + 32768, 40960, 43008, 44032, 44160, 44176, 44172, 0, + 32768, 40960, 43008, 44032, 44160, 44176, 44172, 0, + 32768, 40960, 43008, 44032, 44160, 44176, 44177, 44174, + 0, 32768, 40960, 43008, 44032, 44160, 0, 32768, + 40960, 43008, 44032, 44160, 44176, 0, 32768, 40960, + 43008, 44032, 44160, 44176, 0, 32768, 40960, 43008, + 44032, 44160, 44176, 44178, 0, 32768, 40960, 43008, + 44032, 44160, 44176, 0, 32768, 40960, 43008, 44032, + 44160, 44176, 44180, 0, 32768, 40960, 43008, 44032, + 44160, 44176, 44180, 0, 32768, 40960, 43008, 44032, + 44160, 44176, 44184, 44182, 0, 32768, 40960, 43008, + 44032, 44160, 44176, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44184, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44184, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44184, 44186, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 44184, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 44193, 44188, 0, 32768, 40960, + 43008, 44032, 44160, 44192, 44193, 44188, 0, 32768, + 40960, 43008, 44032, 44160, 44192, 44193, 44188, 44190, + 0, 32768, 40960, 43008, 44032, 44160, 0, 32768, + 40960, 43008, 44032, 44160, 44192, 0, 32768, 40960, + 43008, 44032, 44160, 44192, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 44194, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44196, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44196, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44200, 44198, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44200, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44200, 0, 32768, 40960, 43008, 44032, + 44160, 44192, 44200, 44202, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 44200, 0, 32768, 40960, 43008, + 44032, 44160, 44192, 44208, 44204, 0, 32768, 40960, + 43008, 44032, 44160, 44192, 44208, 44204, 0, 32768, + 40960, 43008, 44032, 44160, 44192, 44208, 44209, 44206, + 0, 32768, 40960, 43008, 44032, 44160, 44192, 0, + 32768, 40960, 43008, 44032, 44160, 44224, 44208, 0, + 32768, 40960, 43008, 44032, 44160, 44224, 44208, 0, + 32768, 40960, 43008, 44032, 44160, 44224, 44208, 44210, + 0, 32768, 40960, 43008, 44032, 44160, 44224, 44208, + 0, 32768, 40960, 43008, 44032, 44160, 44224, 44208, + 44212, 0, 32768, 40960, 43008, 44032, 44160, 44224, + 44208, 44212, 0, 32768, 40960, 43008, 44032, 44160, + 44224, 44208, 44216, 44214, 0, 32768, 40960, 43008, + 44032, 44160, 44224, 44208, 0, 32768, 40960, 43008, + 44032, 44160, 44224, 44225, 44216, 0, 32768, 40960, + 43008, 44032, 44160, 44224, 44225, 44216, 0, 32768, + 40960, 43008, 44032, 44160, 44224, 44225, 44216, 44218, + 0, 32768, 40960, 43008, 44032, 44160, 44224, 44225, + 44216, 0, 32768, 40960, 43008, 44032, 44160, 44224, + 44225, 44216, 44220, 0, 32768, 40960, 43008, 44032, + 44160, 44224, 44225, 44227, 44220, 0, 32768, 40960, + 43008, 44032, 44160, 44224, 44225, 44227, 44220, 44222, + 0, 32768, 40960, 43008, 44032, 44160, 0, 32768, + 40960, 43008, 44032, 44288, 44224, 0, 32768, 40960, + 43008, 44032, 44288, 44224, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 44226, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44228, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44228, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44232, 44230, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44232, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44232, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44232, 44234, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 44232, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 44240, 44236, 0, 32768, 40960, + 43008, 44032, 44288, 44224, 44240, 44236, 0, 32768, + 40960, 43008, 44032, 44288, 44224, 44240, 44241, 44238, + 0, 32768, 40960, 43008, 44032, 44288, 44224, 0, + 32768, 40960, 43008, 44032, 44288, 44224, 44240, 0, + 32768, 40960, 43008, 44032, 44288, 44224, 44240, 0, + 32768, 40960, 43008, 44032, 44288, 44224, 44240, 44242, + 0, 32768, 40960, 43008, 44032, 44288, 44224, 44240, + 0, 32768, 40960, 43008, 44032, 44288, 44224, 44240, + 44244, 0, 32768, 40960, 43008, 44032, 44288, 44224, + 44240, 44244, 0, 32768, 40960, 43008, 44032, 44288, + 44224, 44240, 44248, 44246, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 44240, 0, 32768, 40960, 43008, + 44032, 44288, 44224, 44256, 44248, 0, 32768, 40960, + 43008, 44032, 44288, 44224, 44256, 44248, 0, 32768, + 40960, 43008, 44032, 44288, 44224, 44256, 44248, 44250, + 0, 32768, 40960, 43008, 44032, 44288, 44224, 44256, + 44248, 0, 32768, 40960, 43008, 44032, 44288, 44224, + 44256, 44257, 44252, 0, 32768, 40960, 43008, 44032, + 44288, 44224, 44256, 44257, 44252, 0, 32768, 40960, + 43008, 44032, 44288, 44224, 44256, 44257, 44252, 44254, + 0, 32768, 40960, 43008, 44032, 44288, 44224, 0, + 32768, 40960, 43008, 44032, 44288, 44289, 44256, 0, + 32768, 40960, 43008, 44032, 44288, 44289, 44256, 0, + 32768, 40960, 43008, 44032, 44288, 44289, 44256, 44258, + 0, 32768, 40960, 43008, 44032, 44288, 44289, 44256, + 0, 32768, 40960, 43008, 44032, 44288, 44289, 44256, + 44260, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44256, 44260, 0, 32768, 40960, 43008, 44032, 44288, + 44289, 44256, 44264, 44262, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44256, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44256, 44264, 0, 32768, 40960, + 43008, 44032, 44288, 44289, 44256, 44264, 0, 32768, + 40960, 43008, 44032, 44288, 44289, 44256, 44264, 44266, + 0, 32768, 40960, 43008, 44032, 44288, 44289, 44256, + 44264, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44256, 44272, 44268, 0, 32768, 40960, 43008, 44032, + 44288, 44289, 44256, 44272, 44268, 0, 32768, 40960, + 43008, 44032, 44288, 44289, 44256, 44272, 44273, 44270, + 0, 32768, 40960, 43008, 44032, 44288, 44289, 44256, + 0, 32768, 40960, 43008, 44032, 44288, 44289, 44256, + 44272, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44291, 44272, 0, 32768, 40960, 43008, 44032, 44288, + 44289, 44291, 44272, 44274, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44291, 44272, 0, 32768, 40960, + 43008, 44032, 44288, 44289, 44291, 44272, 44276, 0, + 32768, 40960, 43008, 44032, 44288, 44289, 44291, 44272, + 44276, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44291, 44272, 44280, 44278, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44291, 44272, 0, 32768, 40960, + 43008, 44032, 44288, 44289, 44291, 44272, 44280, 0, + 32768, 40960, 43008, 44032, 44288, 44289, 44291, 44272, + 44280, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44291, 44272, 44280, 44282, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44291, 44295, 44280, 0, 32768, + 40960, 43008, 44032, 44288, 44289, 44291, 44295, 44280, + 44284, 0, 32768, 40960, 43008, 44032, 44288, 44289, + 44291, 44295, 44280, 44284, 0, 32768, 40960, 43008, + 44032, 44288, 44289, 44291, 44295, 44280, 44284, 44286, + 0, 32768, 40960, 43008, 44032, 0, 32768, 40960, + 45056, 44032, 44288, 0, 32768, 40960, 45056, 44032, + 44288, 0, 32768, 40960, 45056, 44032, 44288, 44290, + 0, 32768, 40960, 45056, 44032, 44288, 0, 32768, + 40960, 45056, 44032, 44288, 44292, 0, 32768, 40960, + 45056, 44032, 44288, 44292, 0, 32768, 40960, 45056, + 44032, 44288, 44296, 44294, 0, 32768, 40960, 45056, + 44032, 44288, 0, 32768, 40960, 45056, 44032, 44288, + 44296, 0, 32768, 40960, 45056, 44032, 44288, 44296, + 0, 32768, 40960, 45056, 44032, 44288, 44296, 44298, + 0, 32768, 40960, 45056, 44032, 44288, 44296, 0, + 32768, 40960, 45056, 44032, 44288, 44304, 44300, 0, + 32768, 40960, 45056, 44032, 44288, 44304, 44300, 0, + 32768, 40960, 45056, 44032, 44288, 44304, 44305, 44302, + 0, 32768, 40960, 45056, 44032, 44288, 0, 32768, + 40960, 45056, 44032, 44288, 44304, 0, 32768, 40960, + 45056, 44032, 44288, 44304, 0, 32768, 40960, 45056, + 44032, 44288, 44304, 44306, 0, 32768, 40960, 45056, + 44032, 44288, 44304, 0, 32768, 40960, 45056, 44032, + 44288, 44304, 44308, 0, 32768, 40960, 45056, 44032, + 44288, 44304, 44308, 0, 32768, 40960, 45056, 44032, + 44288, 44304, 44312, 44310, 0, 32768, 40960, 45056, + 44032, 44288, 44304, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44312, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44312, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44312, 44314, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 44312, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 44321, 44316, 0, 32768, 40960, + 45056, 44032, 44288, 44320, 44321, 44316, 0, 32768, + 40960, 45056, 44032, 44288, 44320, 44321, 44316, 44318, + 0, 32768, 40960, 45056, 44032, 44288, 0, 32768, + 40960, 45056, 44032, 44288, 44320, 0, 32768, 40960, + 45056, 44032, 44288, 44320, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 44322, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44324, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44324, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44328, 44326, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44328, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44328, 0, 32768, 40960, 45056, 44032, + 44288, 44320, 44328, 44330, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 44328, 0, 32768, 40960, 45056, + 44032, 44288, 44320, 44336, 44332, 0, 32768, 40960, + 45056, 44032, 44288, 44320, 44336, 44332, 0, 32768, + 40960, 45056, 44032, 44288, 44320, 44336, 44337, 44334, + 0, 32768, 40960, 45056, 44032, 44288, 44320, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44336, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44336, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44336, 44338, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44336, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44336, + 44340, 0, 32768, 40960, 45056, 44032, 44288, 44352, + 44336, 44340, 0, 32768, 40960, 45056, 44032, 44288, + 44352, 44336, 44344, 44342, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44336, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44353, 44344, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 44353, 44344, 0, 32768, + 40960, 45056, 44032, 44288, 44352, 44353, 44344, 44346, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44353, + 44344, 0, 32768, 40960, 45056, 44032, 44288, 44352, + 44353, 44344, 44348, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44353, 44355, 44348, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 44353, 44355, 44348, 44350, + 0, 32768, 40960, 45056, 44032, 44288, 0, 32768, + 40960, 45056, 44032, 44288, 44352, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44354, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44356, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44356, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44360, 44358, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44360, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44360, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44360, 44362, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44360, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44368, 44364, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 44368, 44364, 0, 32768, + 40960, 45056, 44032, 44288, 44352, 44368, 44369, 44366, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44368, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44368, 0, + 32768, 40960, 45056, 44032, 44288, 44352, 44368, 44370, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44368, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44368, + 44372, 0, 32768, 40960, 45056, 44032, 44288, 44352, + 44368, 44372, 0, 32768, 40960, 45056, 44032, 44288, + 44352, 44368, 44376, 44374, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44368, 0, 32768, 40960, 45056, + 44032, 44288, 44352, 44384, 44376, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 44384, 44376, 0, 32768, + 40960, 45056, 44032, 44288, 44352, 44384, 44376, 44378, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 44384, + 44376, 0, 32768, 40960, 45056, 44032, 44288, 44352, + 44384, 44385, 44380, 0, 32768, 40960, 45056, 44032, + 44288, 44352, 44384, 44385, 44380, 0, 32768, 40960, + 45056, 44032, 44288, 44352, 44384, 44385, 44380, 44382, + 0, 32768, 40960, 45056, 44032, 44288, 44352, 0, + 32768, 40960, 45056, 44032, 44288, 44416, 44384, 0, + 32768, 40960, 45056, 44032, 44288, 44416, 44384, 0, + 32768, 40960, 45056, 44032, 44288, 44416, 44384, 44386, + 0, 32768, 40960, 45056, 44032, 44288, 44416, 44384, + 0, 32768, 40960, 45056, 44032, 44288, 44416, 44384, + 44388, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44384, 44388, 0, 32768, 40960, 45056, 44032, 44288, + 44416, 44384, 44392, 44390, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44384, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44384, 44392, 0, 32768, 40960, + 45056, 44032, 44288, 44416, 44384, 44392, 0, 32768, + 40960, 45056, 44032, 44288, 44416, 44384, 44392, 44394, + 0, 32768, 40960, 45056, 44032, 44288, 44416, 44384, + 44392, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44384, 44400, 44396, 0, 32768, 40960, 45056, 44032, + 44288, 44416, 44384, 44400, 44396, 0, 32768, 40960, + 45056, 44032, 44288, 44416, 44384, 44400, 44401, 44398, + 0, 32768, 40960, 45056, 44032, 44288, 44416, 44384, + 0, 32768, 40960, 45056, 44032, 44288, 44416, 44417, + 44400, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44417, 44400, 0, 32768, 40960, 45056, 44032, 44288, + 44416, 44417, 44400, 44402, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44417, 44400, 0, 32768, 40960, + 45056, 44032, 44288, 44416, 44417, 44400, 44404, 0, + 32768, 40960, 45056, 44032, 44288, 44416, 44417, 44400, + 44404, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44417, 44400, 44408, 44406, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44417, 44400, 0, 32768, 40960, + 45056, 44032, 44288, 44416, 44417, 44400, 44408, 0, + 32768, 40960, 45056, 44032, 44288, 44416, 44417, 44419, + 44408, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44417, 44419, 44408, 44410, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44417, 44419, 44408, 0, 32768, + 40960, 45056, 44032, 44288, 44416, 44417, 44419, 44408, + 44412, 0, 32768, 40960, 45056, 44032, 44288, 44416, + 44417, 44419, 44408, 44412, 0, 32768, 40960, 45056, + 44032, 44288, 44416, 44417, 44419, 44408, 44412, 44414, + 0, 32768, 40960, 45056, 44032, 44288, 0, 32768, + 40960, 45056, 44032, 44544, 44416, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44418, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44420, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44420, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44424, 44422, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44424, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44424, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44424, 44426, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44424, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44432, 44428, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44432, 44428, 0, 32768, + 40960, 45056, 44032, 44544, 44416, 44432, 44433, 44430, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44432, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44432, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44432, 44434, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44432, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44432, + 44436, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44432, 44436, 0, 32768, 40960, 45056, 44032, 44544, + 44416, 44432, 44440, 44438, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44432, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44448, 44440, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44448, 44440, 0, 32768, + 40960, 45056, 44032, 44544, 44416, 44448, 44440, 44442, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44448, + 44440, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44448, 44449, 44444, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44448, 44449, 44444, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44448, 44449, 44444, 44446, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44448, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44448, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44448, 44450, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44448, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44448, + 44452, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44448, 44452, 0, 32768, 40960, 45056, 44032, 44544, + 44416, 44448, 44456, 44454, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44448, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44448, 44456, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44448, 44456, 0, 32768, + 40960, 45056, 44032, 44544, 44416, 44448, 44456, 44458, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44448, + 44456, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44448, 44464, 44460, 0, 32768, 40960, 45056, 44032, + 44544, 44416, 44448, 44464, 44460, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44448, 44464, 44465, 44462, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44448, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 44480, + 44464, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44480, 44464, 0, 32768, 40960, 45056, 44032, 44544, + 44416, 44480, 44464, 44466, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44480, 44464, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44480, 44464, 44468, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44480, 44464, + 44468, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44480, 44464, 44472, 44470, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44480, 44464, 0, 32768, 40960, + 45056, 44032, 44544, 44416, 44480, 44481, 44472, 0, + 32768, 40960, 45056, 44032, 44544, 44416, 44480, 44481, + 44472, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44480, 44481, 44472, 44474, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44480, 44481, 44472, 0, 32768, + 40960, 45056, 44032, 44544, 44416, 44480, 44481, 44472, + 44476, 0, 32768, 40960, 45056, 44032, 44544, 44416, + 44480, 44481, 44483, 44476, 0, 32768, 40960, 45056, + 44032, 44544, 44416, 44480, 44481, 44483, 44476, 44478, + 0, 32768, 40960, 45056, 44032, 44544, 44416, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44480, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44480, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44480, 44482, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 44484, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44484, 0, 32768, 40960, 45056, 44032, 44544, + 44545, 44480, 44488, 44486, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 44488, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44480, 44488, 0, 32768, + 40960, 45056, 44032, 44544, 44545, 44480, 44488, 44490, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 44488, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44496, 44492, 0, 32768, 40960, 45056, 44032, + 44544, 44545, 44480, 44496, 44492, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44480, 44496, 44497, 44494, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 44496, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44496, 0, 32768, 40960, 45056, 44032, 44544, + 44545, 44480, 44496, 44498, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 44496, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44480, 44496, 44500, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44480, 44496, + 44500, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44496, 44504, 44502, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 44496, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44480, 44512, 44504, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44480, 44512, + 44504, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44512, 44504, 44506, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 44512, 44504, 0, 32768, + 40960, 45056, 44032, 44544, 44545, 44480, 44512, 44513, + 44508, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44480, 44512, 44513, 44508, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44480, 44512, 44513, 44508, 44510, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44480, + 44512, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44512, 0, 32768, 40960, 45056, 44032, 44544, + 44545, 44547, 44512, 44514, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44512, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44547, 44512, 44516, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44547, 44512, + 44516, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44512, 44520, 44518, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44512, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44547, 44512, 44520, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44547, 44512, + 44520, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44512, 44520, 44522, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44512, 44520, 0, 32768, + 40960, 45056, 44032, 44544, 44545, 44547, 44512, 44528, + 44524, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44512, 44528, 44524, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44512, 44528, 44529, 44526, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44547, + 44512, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44512, 44528, 0, 32768, 40960, 45056, 44032, + 44544, 44545, 44547, 44512, 44528, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44547, 44512, 44528, 44530, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44547, + 44551, 44528, 0, 32768, 40960, 45056, 44032, 44544, + 44545, 44547, 44551, 44528, 44532, 0, 32768, 40960, + 45056, 44032, 44544, 44545, 44547, 44551, 44528, 44532, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44547, + 44551, 44528, 44536, 44534, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44551, 44528, 0, 32768, + 40960, 45056, 44032, 44544, 44545, 44547, 44551, 44528, + 44536, 0, 32768, 40960, 45056, 44032, 44544, 44545, + 44547, 44551, 44528, 44536, 0, 32768, 40960, 45056, + 44032, 44544, 44545, 44547, 44551, 44528, 44536, 44538, + 0, 32768, 40960, 45056, 44032, 44544, 44545, 44547, + 44551, 44528, 44536, 0, 32768, 40960, 45056, 44032, + 44544, 44545, 44547, 44551, 44528, 44536, 44540, 0, + 32768, 40960, 45056, 44032, 44544, 44545, 44547, 44551, + 44528, 44536, 44540, 0, 32768, 40960, 45056, 44032, + 44544, 44545, 44547, 44551, 44528, 44536, 44540, 44542, + 0, 32768, 40960, 45056, 44032, 0, 32768, 40960, + 45056, 44032, 44544, 0, 32768, 40960, 45056, 45057, + 44544, 0, 32768, 40960, 45056, 45057, 44544, 44546, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44548, 0, 32768, 40960, + 45056, 45057, 44544, 44548, 0, 32768, 40960, 45056, + 45057, 44544, 44552, 44550, 0, 32768, 40960, 45056, + 45057, 44544, 0, 32768, 40960, 45056, 45057, 44544, + 44552, 0, 32768, 40960, 45056, 45057, 44544, 44552, + 0, 32768, 40960, 45056, 45057, 44544, 44552, 44554, + 0, 32768, 40960, 45056, 45057, 44544, 44552, 0, + 32768, 40960, 45056, 45057, 44544, 44560, 44556, 0, + 32768, 40960, 45056, 45057, 44544, 44560, 44556, 0, + 32768, 40960, 45056, 45057, 44544, 44560, 44561, 44558, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44560, 0, 32768, 40960, + 45056, 45057, 44544, 44560, 0, 32768, 40960, 45056, + 45057, 44544, 44560, 44562, 0, 32768, 40960, 45056, + 45057, 44544, 44560, 0, 32768, 40960, 45056, 45057, + 44544, 44560, 44564, 0, 32768, 40960, 45056, 45057, + 44544, 44560, 44564, 0, 32768, 40960, 45056, 45057, + 44544, 44560, 44568, 44566, 0, 32768, 40960, 45056, + 45057, 44544, 44560, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44568, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44568, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44568, 44570, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 44568, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 44577, 44572, 0, 32768, 40960, + 45056, 45057, 44544, 44576, 44577, 44572, 0, 32768, + 40960, 45056, 45057, 44544, 44576, 44577, 44572, 44574, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44576, 0, 32768, 40960, + 45056, 45057, 44544, 44576, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 44578, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44580, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44580, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44584, 44582, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44584, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44584, 0, 32768, 40960, 45056, 45057, + 44544, 44576, 44584, 44586, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 44584, 0, 32768, 40960, 45056, + 45057, 44544, 44576, 44592, 44588, 0, 32768, 40960, + 45056, 45057, 44544, 44576, 44592, 44588, 0, 32768, + 40960, 45056, 45057, 44544, 44576, 44592, 44593, 44590, + 0, 32768, 40960, 45056, 45057, 44544, 44576, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44592, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44592, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44592, 44594, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44592, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44592, + 44596, 0, 32768, 40960, 45056, 45057, 44544, 44608, + 44592, 44596, 0, 32768, 40960, 45056, 45057, 44544, + 44608, 44592, 44600, 44598, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44592, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44609, 44600, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 44609, 44600, 0, 32768, + 40960, 45056, 45057, 44544, 44608, 44609, 44600, 44602, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44609, + 44600, 0, 32768, 40960, 45056, 45057, 44544, 44608, + 44609, 44600, 44604, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44609, 44611, 44604, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 44609, 44611, 44604, 44606, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44608, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44610, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44612, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44612, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44616, 44614, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44616, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44616, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44616, 44618, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44616, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44624, 44620, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 44624, 44620, 0, 32768, + 40960, 45056, 45057, 44544, 44608, 44624, 44625, 44622, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44624, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44624, 0, + 32768, 40960, 45056, 45057, 44544, 44608, 44624, 44626, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44624, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44624, + 44628, 0, 32768, 40960, 45056, 45057, 44544, 44608, + 44624, 44628, 0, 32768, 40960, 45056, 45057, 44544, + 44608, 44624, 44632, 44630, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44624, 0, 32768, 40960, 45056, + 45057, 44544, 44608, 44640, 44632, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 44640, 44632, 0, 32768, + 40960, 45056, 45057, 44544, 44608, 44640, 44632, 44634, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 44640, + 44632, 0, 32768, 40960, 45056, 45057, 44544, 44608, + 44640, 44641, 44636, 0, 32768, 40960, 45056, 45057, + 44544, 44608, 44640, 44641, 44636, 0, 32768, 40960, + 45056, 45057, 44544, 44608, 44640, 44641, 44636, 44638, + 0, 32768, 40960, 45056, 45057, 44544, 44608, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44640, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44640, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44640, 44642, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44640, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44640, + 44644, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44640, 44644, 0, 32768, 40960, 45056, 45057, 44544, + 44672, 44640, 44648, 44646, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44640, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44640, 44648, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44640, 44648, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44640, 44648, 44650, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44640, + 44648, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44640, 44656, 44652, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44640, 44656, 44652, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44640, 44656, 44657, 44654, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44640, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44673, + 44656, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44673, 44656, 0, 32768, 40960, 45056, 45057, 44544, + 44672, 44673, 44656, 44658, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44673, 44656, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44673, 44656, 44660, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44673, 44656, + 44660, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44673, 44656, 44664, 44662, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44673, 44656, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44673, 44656, 44664, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44673, 44675, + 44664, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44673, 44675, 44664, 44666, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44673, 44675, 44664, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44673, 44675, 44664, + 44668, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44673, 44675, 44664, 44668, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44673, 44675, 44664, 44668, 44670, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44674, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44676, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44676, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44680, 44678, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44680, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44680, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44680, 44682, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44680, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44688, 44684, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44688, 44684, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44688, 44689, 44686, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44688, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44688, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44688, 44690, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44688, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44688, + 44692, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44688, 44692, 0, 32768, 40960, 45056, 45057, 44544, + 44672, 44688, 44696, 44694, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44688, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44704, 44696, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44704, 44696, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44704, 44696, 44698, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44704, + 44696, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44704, 44705, 44700, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44704, 44705, 44700, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44704, 44705, 44700, 44702, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44704, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44704, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44704, 44706, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44704, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44704, + 44708, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44704, 44708, 0, 32768, 40960, 45056, 45057, 44544, + 44672, 44704, 44712, 44710, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44704, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44704, 44712, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44704, 44712, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44704, 44712, 44714, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44704, + 44712, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44704, 44720, 44716, 0, 32768, 40960, 45056, 45057, + 44544, 44672, 44704, 44720, 44716, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44704, 44720, 44721, 44718, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44704, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 44736, + 44720, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44736, 44720, 0, 32768, 40960, 45056, 45057, 44544, + 44672, 44736, 44720, 44722, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44736, 44720, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44736, 44720, 44724, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44736, 44720, + 44724, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44736, 44720, 44728, 44726, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44736, 44720, 0, 32768, 40960, + 45056, 45057, 44544, 44672, 44736, 44737, 44728, 0, + 32768, 40960, 45056, 45057, 44544, 44672, 44736, 44737, + 44728, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44736, 44737, 44728, 44730, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44736, 44737, 44728, 0, 32768, + 40960, 45056, 45057, 44544, 44672, 44736, 44737, 44728, + 44732, 0, 32768, 40960, 45056, 45057, 44544, 44672, + 44736, 44737, 44739, 44732, 0, 32768, 40960, 45056, + 45057, 44544, 44672, 44736, 44737, 44739, 44732, 44734, + 0, 32768, 40960, 45056, 45057, 44544, 44672, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44736, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44736, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44736, 44738, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 44740, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44740, 0, 32768, 40960, 45056, 45057, 44544, + 44800, 44736, 44744, 44742, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 44744, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44736, 44744, 0, 32768, + 40960, 45056, 45057, 44544, 44800, 44736, 44744, 44746, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 44744, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44752, 44748, 0, 32768, 40960, 45056, 45057, + 44544, 44800, 44736, 44752, 44748, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44736, 44752, 44753, 44750, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 44752, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44752, 0, 32768, 40960, 45056, 45057, 44544, + 44800, 44736, 44752, 44754, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 44752, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44736, 44752, 44756, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44736, 44752, + 44756, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44752, 44760, 44758, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 44752, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44736, 44768, 44760, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44736, 44768, + 44760, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44768, 44760, 44762, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 44768, 44760, 0, 32768, + 40960, 45056, 45057, 44544, 44800, 44736, 44768, 44769, + 44764, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44736, 44768, 44769, 44764, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44736, 44768, 44769, 44764, 44766, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44736, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44801, + 44768, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44768, 0, 32768, 40960, 45056, 45057, 44544, + 44800, 44801, 44768, 44770, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44768, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44801, 44768, 44772, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44801, 44768, + 44772, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44768, 44776, 44774, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44768, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44801, 44768, 44776, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44801, 44768, + 44776, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44768, 44776, 44778, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44768, 44776, 0, 32768, + 40960, 45056, 45057, 44544, 44800, 44801, 44768, 44784, + 44780, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44768, 44784, 44780, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44768, 44784, 44785, 44782, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44801, + 44768, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44768, 44784, 0, 32768, 40960, 45056, 45057, + 44544, 44800, 44801, 44803, 44784, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44801, 44803, 44784, 44786, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44801, + 44803, 44784, 0, 32768, 40960, 45056, 45057, 44544, + 44800, 44801, 44803, 44784, 44788, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 44801, 44803, 44784, 44788, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44801, + 44803, 44784, 44792, 44790, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44803, 44784, 0, 32768, + 40960, 45056, 45057, 44544, 44800, 44801, 44803, 44784, + 44792, 0, 32768, 40960, 45056, 45057, 44544, 44800, + 44801, 44803, 44784, 44792, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44801, 44803, 44784, 44792, 44794, + 0, 32768, 40960, 45056, 45057, 44544, 44800, 44801, + 44803, 44807, 44792, 0, 32768, 40960, 45056, 45057, + 44544, 44800, 44801, 44803, 44807, 44792, 44796, 0, + 32768, 40960, 45056, 45057, 44544, 44800, 44801, 44803, + 44807, 44792, 44796, 0, 32768, 40960, 45056, 45057, + 44544, 44800, 44801, 44803, 44807, 44792, 44796, 44798, + 0, 32768, 40960, 45056, 45057, 44544, 0, 32768, + 40960, 45056, 45057, 44544, 44800, 0, 32768, 40960, + 45056, 45057, 44544, 44800, 0, 32768, 40960, 45056, + 45057, 44544, 44800, 44802, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44804, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44804, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44808, 44806, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44808, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44808, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44808, 44810, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44808, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44816, 44812, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44816, 44812, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44816, 44817, 44814, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44816, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44816, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44816, 44818, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44816, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44816, + 44820, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44816, 44820, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44816, 44824, 44822, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44816, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44832, 44824, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44832, 44824, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44832, 44824, 44826, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44832, + 44824, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44832, 44833, 44828, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44832, 44833, 44828, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44832, 44833, 44828, 44830, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44832, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44832, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44832, 44834, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44832, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44832, + 44836, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44832, 44836, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44832, 44840, 44838, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44832, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44832, 44840, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44832, 44840, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44832, 44840, 44842, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44832, + 44840, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44832, 44848, 44844, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44832, 44848, 44844, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44832, 44848, 44849, 44846, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44832, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 44848, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44848, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44864, 44848, 44850, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44848, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44848, 44852, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 44848, + 44852, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44848, 44856, 44854, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44848, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44865, 44856, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 44865, + 44856, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44865, 44856, 44858, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44865, 44856, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44864, 44865, 44856, + 44860, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44865, 44867, 44860, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44865, 44867, 44860, 44862, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 44866, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 44868, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44868, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44864, 44872, 44870, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44872, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44872, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44864, 44872, 44874, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 44872, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44880, 44876, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44864, 44880, 44876, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44880, 44881, 44878, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 44880, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44880, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44864, 44880, 44882, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44880, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44880, 44884, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 44880, + 44884, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44880, 44888, 44886, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44880, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44864, 44896, 44888, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44864, 44896, + 44888, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44896, 44888, 44890, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44896, 44888, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44864, 44896, 44897, + 44892, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44864, 44896, 44897, 44892, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44864, 44896, 44897, 44892, 44894, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44864, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44896, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44896, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44928, 44896, 44898, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44896, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44928, 44896, 44900, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 44896, + 44900, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44896, 44904, 44902, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44896, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44928, 44896, 44904, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 44896, + 44904, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44896, 44904, 44906, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44896, 44904, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44928, 44896, 44912, + 44908, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44896, 44912, 44908, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44896, 44912, 44913, 44910, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44896, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44929, 44912, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44928, 44929, 44912, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44928, 44929, 44912, 44914, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44929, 44912, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44928, 44929, 44912, 44916, 0, 32768, 40960, + 45056, 45057, 45059, 44800, 44928, 44929, 44912, 44916, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44929, 44912, 44920, 44918, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44929, 44912, 0, 32768, + 40960, 45056, 45057, 45059, 44800, 44928, 44929, 44912, + 44920, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44929, 44931, 44920, 0, 32768, 40960, 45056, + 45057, 45059, 44800, 44928, 44929, 44931, 44920, 44922, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44929, 44931, 44920, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44928, 44929, 44931, 44920, 44924, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 44929, + 44931, 44920, 44924, 0, 32768, 40960, 45056, 45057, + 45059, 44800, 44928, 44929, 44931, 44920, 44924, 44926, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 0, + 32768, 40960, 45056, 45057, 45059, 44800, 44928, 44930, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 0, 32768, 40960, 45056, 45057, 45059, 44800, 44928, + 44932, 0, 32768, 40960, 45056, 45057, 45059, 44800, + 44928, 44932, 0, 32768, 40960, 45056, 45057, 45059, + 44800, 44928, 44936, 44934, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44936, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44936, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 44928, 44936, 44938, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44936, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44944, 44940, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 44928, 44944, 44940, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44944, 44945, 44942, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44944, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44944, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 44928, 44944, 44946, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44944, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44944, 44948, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44944, + 44948, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44944, 44952, 44950, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44944, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44960, 44952, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44960, + 44952, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 44952, 44954, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 44952, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 44928, 44960, 44961, + 44956, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 44961, 44956, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 44961, 44956, 44958, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44960, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 44928, 44960, 44962, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44960, 44964, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44960, + 44964, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 44968, 44966, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44960, 44968, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44960, + 44968, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 44968, 44970, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 44968, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 44928, 44960, 44976, + 44972, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44960, 44976, 44972, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44960, 44976, 44977, 44974, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44960, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 44976, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 44928, 44992, 44976, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44992, 44976, 44978, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44992, 44976, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 44928, 44992, 44976, 44980, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44992, 44976, 44980, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44992, 44976, 44984, 44982, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 44976, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 44928, 44992, 44993, + 44984, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 44993, 44984, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 44993, 44984, 44986, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44992, 44993, 44984, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 44928, 44992, 44993, 44984, 44988, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44992, + 44993, 44995, 44988, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 44928, 44992, 44993, 44995, 44988, 44990, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 44928, + 44992, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 44928, 44992, 44994, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44992, 44996, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44992, + 44996, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 45000, 44998, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 44928, 44992, 45000, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 44928, 44992, + 45000, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 45000, 45002, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 45000, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 44928, 44992, 45008, + 45004, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 44928, 44992, 45008, 45004, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 44928, 44992, 45008, 45009, 45006, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 45071, 44992, 45008, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45008, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45008, 45010, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45008, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 45071, 44992, 45008, 45012, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45008, 45012, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45008, 45016, 45014, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45008, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 45071, 44992, 45024, + 45016, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 45071, 44992, 45024, 45016, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 45016, 45018, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 45016, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45025, 45020, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45025, 45020, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45025, 45020, 45022, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 45071, 44992, 45024, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45024, 45026, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 45071, 44992, 45024, 45028, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45024, 45028, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 45032, 45030, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 0, 32768, + 40960, 45056, 45057, 45059, 45063, 45071, 44992, 45024, + 45032, 0, 32768, 40960, 45056, 45057, 45059, 45063, + 45071, 44992, 45024, 45032, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 45032, 45034, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 45032, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45040, 45036, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45040, 45036, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45040, 45041, 45038, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 45071, 44992, 45024, 45040, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45024, 45040, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 45040, 45042, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 45040, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45040, 45044, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45040, 45044, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45040, 45048, 45046, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 45040, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45040, 45048, 0, 32768, 40960, 45056, 45057, + 45059, 45063, 45071, 44992, 45024, 45040, 45048, 0, + 32768, 40960, 45056, 45057, 45059, 45063, 45071, 44992, + 45024, 45040, 45048, 45050, 0, 32768, 40960, 45056, + 45057, 45059, 45063, 45071, 44992, 45024, 45040, 45048, + 0, 32768, 40960, 45056, 45057, 45059, 45063, 45071, + 44992, 45024, 45040, 45048, 45052, 0, 32768, 40960, + 45056, 45057, 45059, 45063, 45071, 44992, 45024, 45040, + 45048, 45052, 0, 32768, 40960, 45056, 45057, 45059, + 45063, 45071, 44992, 45024, 45040, 45048, 45052, 45054, + 0, 32768, 40960, 0, 32768, 40960, 45056, 0, + 32768, 40960, 45056, 0, 32768, 40960, 45056, 45058, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45060, 0, 32768, 40960, 45056, 45060, 0, 32768, + 40960, 45056, 45064, 45062, 0, 32768, 40960, 45056, + 0, 32768, 40960, 45056, 45064, 0, 32768, 40960, + 45056, 45064, 0, 32768, 40960, 45056, 45064, 45066, + 0, 32768, 40960, 45056, 45064, 0, 32768, 40960, + 45056, 45072, 45068, 0, 32768, 40960, 45056, 45072, + 45068, 0, 32768, 40960, 45056, 45072, 45073, 45070, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45072, 0, 32768, 40960, 45056, 45072, 0, 32768, + 40960, 45056, 45072, 45074, 0, 32768, 40960, 45056, + 45072, 0, 32768, 40960, 45056, 45072, 45076, 0, + 32768, 40960, 45056, 45072, 45076, 0, 32768, 40960, + 45056, 45072, 45080, 45078, 0, 32768, 40960, 45056, + 45072, 0, 32768, 40960, 45056, 45088, 45080, 0, + 32768, 40960, 45056, 45088, 45080, 0, 32768, 40960, + 45056, 45088, 45080, 45082, 0, 32768, 40960, 45056, + 45088, 45080, 0, 32768, 40960, 45056, 45088, 45089, + 45084, 0, 32768, 40960, 45056, 45088, 45089, 45084, + 0, 32768, 40960, 45056, 45088, 45089, 45084, 45086, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45088, 0, 32768, 40960, 45056, 45088, 0, 32768, + 40960, 45056, 45088, 45090, 0, 32768, 40960, 45056, + 45088, 0, 32768, 40960, 45056, 45088, 45092, 0, + 32768, 40960, 45056, 45088, 45092, 0, 32768, 40960, + 45056, 45088, 45096, 45094, 0, 32768, 40960, 45056, + 45088, 0, 32768, 40960, 45056, 45088, 45096, 0, + 32768, 40960, 45056, 45088, 45096, 0, 32768, 40960, + 45056, 45088, 45096, 45098, 0, 32768, 40960, 45056, + 45088, 45096, 0, 32768, 40960, 45056, 45088, 45104, + 45100, 0, 32768, 40960, 45056, 45088, 45104, 45100, + 0, 32768, 40960, 45056, 45088, 45104, 45105, 45102, + 0, 32768, 40960, 45056, 45088, 0, 32768, 40960, + 45056, 45120, 45104, 0, 32768, 40960, 45056, 45120, + 45104, 0, 32768, 40960, 45056, 45120, 45104, 45106, + 0, 32768, 40960, 45056, 45120, 45104, 0, 32768, + 40960, 45056, 45120, 45104, 45108, 0, 32768, 40960, + 45056, 45120, 45104, 45108, 0, 32768, 40960, 45056, + 45120, 45104, 45112, 45110, 0, 32768, 40960, 45056, + 45120, 45104, 0, 32768, 40960, 45056, 45120, 45121, + 45112, 0, 32768, 40960, 45056, 45120, 45121, 45112, + 0, 32768, 40960, 45056, 45120, 45121, 45112, 45114, + 0, 32768, 40960, 45056, 45120, 45121, 45112, 0, + 32768, 40960, 45056, 45120, 45121, 45112, 45116, 0, + 32768, 40960, 45056, 45120, 45121, 45123, 45116, 0, + 32768, 40960, 45056, 45120, 45121, 45123, 45116, 45118, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45120, 0, 32768, 40960, 45056, 45120, 0, 32768, + 40960, 45056, 45120, 45122, 0, 32768, 40960, 45056, + 45120, 0, 32768, 40960, 45056, 45120, 45124, 0, + 32768, 40960, 45056, 45120, 45124, 0, 32768, 40960, + 45056, 45120, 45128, 45126, 0, 32768, 40960, 45056, + 45120, 0, 32768, 40960, 45056, 45120, 45128, 0, + 32768, 40960, 45056, 45120, 45128, 0, 32768, 40960, + 45056, 45120, 45128, 45130, 0, 32768, 40960, 45056, + 45120, 45128, 0, 32768, 40960, 45056, 45120, 45136, + 45132, 0, 32768, 40960, 45056, 45120, 45136, 45132, + 0, 32768, 40960, 45056, 45120, 45136, 45137, 45134, + 0, 32768, 40960, 45056, 45120, 0, 32768, 40960, + 45056, 45120, 45136, 0, 32768, 40960, 45056, 45120, + 45136, 0, 32768, 40960, 45056, 45120, 45136, 45138, + 0, 32768, 40960, 45056, 45120, 45136, 0, 32768, + 40960, 45056, 45120, 45136, 45140, 0, 32768, 40960, + 45056, 45120, 45136, 45140, 0, 32768, 40960, 45056, + 45120, 45136, 45144, 45142, 0, 32768, 40960, 45056, + 45120, 45136, 0, 32768, 40960, 45056, 45120, 45152, + 45144, 0, 32768, 40960, 45056, 45120, 45152, 45144, + 0, 32768, 40960, 45056, 45120, 45152, 45144, 45146, + 0, 32768, 40960, 45056, 45120, 45152, 45144, 0, + 32768, 40960, 45056, 45120, 45152, 45153, 45148, 0, + 32768, 40960, 45056, 45120, 45152, 45153, 45148, 0, + 32768, 40960, 45056, 45120, 45152, 45153, 45148, 45150, + 0, 32768, 40960, 45056, 45120, 0, 32768, 40960, + 45056, 45184, 45152, 0, 32768, 40960, 45056, 45184, + 45152, 0, 32768, 40960, 45056, 45184, 45152, 45154, + 0, 32768, 40960, 45056, 45184, 45152, 0, 32768, + 40960, 45056, 45184, 45152, 45156, 0, 32768, 40960, + 45056, 45184, 45152, 45156, 0, 32768, 40960, 45056, + 45184, 45152, 45160, 45158, 0, 32768, 40960, 45056, + 45184, 45152, 0, 32768, 40960, 45056, 45184, 45152, + 45160, 0, 32768, 40960, 45056, 45184, 45152, 45160, + 0, 32768, 40960, 45056, 45184, 45152, 45160, 45162, + 0, 32768, 40960, 45056, 45184, 45152, 45160, 0, + 32768, 40960, 45056, 45184, 45152, 45168, 45164, 0, + 32768, 40960, 45056, 45184, 45152, 45168, 45164, 0, + 32768, 40960, 45056, 45184, 45152, 45168, 45169, 45166, + 0, 32768, 40960, 45056, 45184, 45152, 0, 32768, + 40960, 45056, 45184, 45185, 45168, 0, 32768, 40960, + 45056, 45184, 45185, 45168, 0, 32768, 40960, 45056, + 45184, 45185, 45168, 45170, 0, 32768, 40960, 45056, + 45184, 45185, 45168, 0, 32768, 40960, 45056, 45184, + 45185, 45168, 45172, 0, 32768, 40960, 45056, 45184, + 45185, 45168, 45172, 0, 32768, 40960, 45056, 45184, + 45185, 45168, 45176, 45174, 0, 32768, 40960, 45056, + 45184, 45185, 45168, 0, 32768, 40960, 45056, 45184, + 45185, 45168, 45176, 0, 32768, 40960, 45056, 45184, + 45185, 45187, 45176, 0, 32768, 40960, 45056, 45184, + 45185, 45187, 45176, 45178, 0, 32768, 40960, 45056, + 45184, 45185, 45187, 45176, 0, 32768, 40960, 45056, + 45184, 45185, 45187, 45176, 45180, 0, 32768, 40960, + 45056, 45184, 45185, 45187, 45176, 45180, 0, 32768, + 40960, 45056, 45184, 45185, 45187, 45176, 45180, 45182, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45184, 0, 32768, 40960, 45056, 45184, 0, 32768, + 40960, 45056, 45184, 45186, 0, 32768, 40960, 45056, + 45184, 0, 32768, 40960, 45056, 45184, 45188, 0, + 32768, 40960, 45056, 45184, 45188, 0, 32768, 40960, + 45056, 45184, 45192, 45190, 0, 32768, 40960, 45056, + 45184, 0, 32768, 40960, 45056, 45184, 45192, 0, + 32768, 40960, 45056, 45184, 45192, 0, 32768, 40960, + 45056, 45184, 45192, 45194, 0, 32768, 40960, 45056, + 45184, 45192, 0, 32768, 40960, 45056, 45184, 45200, + 45196, 0, 32768, 40960, 45056, 45184, 45200, 45196, + 0, 32768, 40960, 45056, 45184, 45200, 45201, 45198, + 0, 32768, 40960, 45056, 45184, 0, 32768, 40960, + 45056, 45184, 45200, 0, 32768, 40960, 45056, 45184, + 45200, 0, 32768, 40960, 45056, 45184, 45200, 45202, + 0, 32768, 40960, 45056, 45184, 45200, 0, 32768, + 40960, 45056, 45184, 45200, 45204, 0, 32768, 40960, + 45056, 45184, 45200, 45204, 0, 32768, 40960, 45056, + 45184, 45200, 45208, 45206, 0, 32768, 40960, 45056, + 45184, 45200, 0, 32768, 40960, 45056, 45184, 45216, + 45208, 0, 32768, 40960, 45056, 45184, 45216, 45208, + 0, 32768, 40960, 45056, 45184, 45216, 45208, 45210, + 0, 32768, 40960, 45056, 45184, 45216, 45208, 0, + 32768, 40960, 45056, 45184, 45216, 45217, 45212, 0, + 32768, 40960, 45056, 45184, 45216, 45217, 45212, 0, + 32768, 40960, 45056, 45184, 45216, 45217, 45212, 45214, + 0, 32768, 40960, 45056, 45184, 0, 32768, 40960, + 45056, 45184, 45216, 0, 32768, 40960, 45056, 45184, + 45216, 0, 32768, 40960, 45056, 45184, 45216, 45218, + 0, 32768, 40960, 45056, 45184, 45216, 0, 32768, + 40960, 45056, 45184, 45216, 45220, 0, 32768, 40960, + 45056, 45184, 45216, 45220, 0, 32768, 40960, 45056, + 45184, 45216, 45224, 45222, 0, 32768, 40960, 45056, + 45184, 45216, 0, 32768, 40960, 45056, 45184, 45216, + 45224, 0, 32768, 40960, 45056, 45184, 45216, 45224, + 0, 32768, 40960, 45056, 45184, 45216, 45224, 45226, + 0, 32768, 40960, 45056, 45184, 45216, 45224, 0, + 32768, 40960, 45056, 45184, 45216, 45232, 45228, 0, + 32768, 40960, 45056, 45184, 45216, 45232, 45228, 0, + 32768, 40960, 45056, 45184, 45216, 45232, 45233, 45230, + 0, 32768, 40960, 45056, 45184, 45216, 0, 32768, + 40960, 45056, 45184, 45248, 45232, 0, 32768, 40960, + 45056, 45184, 45248, 45232, 0, 32768, 40960, 45056, + 45184, 45248, 45232, 45234, 0, 32768, 40960, 45056, + 45184, 45248, 45232, 0, 32768, 40960, 45056, 45184, + 45248, 45232, 45236, 0, 32768, 40960, 45056, 45184, + 45248, 45232, 45236, 0, 32768, 40960, 45056, 45184, + 45248, 45232, 45240, 45238, 0, 32768, 40960, 45056, + 45184, 45248, 45232, 0, 32768, 40960, 45056, 45184, + 45248, 45249, 45240, 0, 32768, 40960, 45056, 45184, + 45248, 45249, 45240, 0, 32768, 40960, 45056, 45184, + 45248, 45249, 45240, 45242, 0, 32768, 40960, 45056, + 45184, 45248, 45249, 45240, 0, 32768, 40960, 45056, + 45184, 45248, 45249, 45240, 45244, 0, 32768, 40960, + 45056, 45184, 45248, 45249, 45251, 45244, 0, 32768, + 40960, 45056, 45184, 45248, 45249, 45251, 45244, 45246, + 0, 32768, 40960, 45056, 45184, 0, 32768, 40960, + 45056, 45312, 45248, 0, 32768, 40960, 45056, 45312, + 45248, 0, 32768, 40960, 45056, 45312, 45248, 45250, + 0, 32768, 40960, 45056, 45312, 45248, 0, 32768, + 40960, 45056, 45312, 45248, 45252, 0, 32768, 40960, + 45056, 45312, 45248, 45252, 0, 32768, 40960, 45056, + 45312, 45248, 45256, 45254, 0, 32768, 40960, 45056, + 45312, 45248, 0, 32768, 40960, 45056, 45312, 45248, + 45256, 0, 32768, 40960, 45056, 45312, 45248, 45256, + 0, 32768, 40960, 45056, 45312, 45248, 45256, 45258, + 0, 32768, 40960, 45056, 45312, 45248, 45256, 0, + 32768, 40960, 45056, 45312, 45248, 45264, 45260, 0, + 32768, 40960, 45056, 45312, 45248, 45264, 45260, 0, + 32768, 40960, 45056, 45312, 45248, 45264, 45265, 45262, + 0, 32768, 40960, 45056, 45312, 45248, 0, 32768, + 40960, 45056, 45312, 45248, 45264, 0, 32768, 40960, + 45056, 45312, 45248, 45264, 0, 32768, 40960, 45056, + 45312, 45248, 45264, 45266, 0, 32768, 40960, 45056, + 45312, 45248, 45264, 0, 32768, 40960, 45056, 45312, + 45248, 45264, 45268, 0, 32768, 40960, 45056, 45312, + 45248, 45264, 45268, 0, 32768, 40960, 45056, 45312, + 45248, 45264, 45272, 45270, 0, 32768, 40960, 45056, + 45312, 45248, 45264, 0, 32768, 40960, 45056, 45312, + 45248, 45280, 45272, 0, 32768, 40960, 45056, 45312, + 45248, 45280, 45272, 0, 32768, 40960, 45056, 45312, + 45248, 45280, 45272, 45274, 0, 32768, 40960, 45056, + 45312, 45248, 45280, 45272, 0, 32768, 40960, 45056, + 45312, 45248, 45280, 45281, 45276, 0, 32768, 40960, + 45056, 45312, 45248, 45280, 45281, 45276, 0, 32768, + 40960, 45056, 45312, 45248, 45280, 45281, 45276, 45278, + 0, 32768, 40960, 45056, 45312, 45248, 0, 32768, + 40960, 45056, 45312, 45313, 45280, 0, 32768, 40960, + 45056, 45312, 45313, 45280, 0, 32768, 40960, 45056, + 45312, 45313, 45280, 45282, 0, 32768, 40960, 45056, + 45312, 45313, 45280, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45284, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45284, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45288, 45286, 0, 32768, 40960, 45056, + 45312, 45313, 45280, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45288, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45288, 0, 32768, 40960, 45056, 45312, + 45313, 45280, 45288, 45290, 0, 32768, 40960, 45056, + 45312, 45313, 45280, 45288, 0, 32768, 40960, 45056, + 45312, 45313, 45280, 45296, 45292, 0, 32768, 40960, + 45056, 45312, 45313, 45280, 45296, 45292, 0, 32768, + 40960, 45056, 45312, 45313, 45280, 45296, 45297, 45294, + 0, 32768, 40960, 45056, 45312, 45313, 45280, 0, + 32768, 40960, 45056, 45312, 45313, 45280, 45296, 0, + 32768, 40960, 45056, 45312, 45313, 45315, 45296, 0, + 32768, 40960, 45056, 45312, 45313, 45315, 45296, 45298, + 0, 32768, 40960, 45056, 45312, 45313, 45315, 45296, + 0, 32768, 40960, 45056, 45312, 45313, 45315, 45296, + 45300, 0, 32768, 40960, 45056, 45312, 45313, 45315, + 45296, 45300, 0, 32768, 40960, 45056, 45312, 45313, + 45315, 45296, 45304, 45302, 0, 32768, 40960, 45056, + 45312, 45313, 45315, 45296, 0, 32768, 40960, 45056, + 45312, 45313, 45315, 45296, 45304, 0, 32768, 40960, + 45056, 45312, 45313, 45315, 45296, 45304, 0, 32768, + 40960, 45056, 45312, 45313, 45315, 45296, 45304, 45306, + 0, 32768, 40960, 45056, 45312, 45313, 45315, 45319, + 45304, 0, 32768, 40960, 45056, 45312, 45313, 45315, + 45319, 45304, 45308, 0, 32768, 40960, 45056, 45312, + 45313, 45315, 45319, 45304, 45308, 0, 32768, 40960, + 45056, 45312, 45313, 45315, 45319, 45304, 45308, 45310, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45312, 0, 32768, 40960, 45056, 45312, 0, 32768, + 40960, 45056, 45312, 45314, 0, 32768, 40960, 45056, + 45312, 0, 32768, 40960, 45056, 45312, 45316, 0, + 32768, 40960, 45056, 45312, 45316, 0, 32768, 40960, + 45056, 45312, 45320, 45318, 0, 32768, 40960, 45056, + 45312, 0, 32768, 40960, 45056, 45312, 45320, 0, + 32768, 40960, 45056, 45312, 45320, 0, 32768, 40960, + 45056, 45312, 45320, 45322, 0, 32768, 40960, 45056, + 45312, 45320, 0, 32768, 40960, 45056, 45312, 45328, + 45324, 0, 32768, 40960, 45056, 45312, 45328, 45324, + 0, 32768, 40960, 45056, 45312, 45328, 45329, 45326, + 0, 32768, 40960, 45056, 45312, 0, 32768, 40960, + 45056, 45312, 45328, 0, 32768, 40960, 45056, 45312, + 45328, 0, 32768, 40960, 45056, 45312, 45328, 45330, + 0, 32768, 40960, 45056, 45312, 45328, 0, 32768, + 40960, 45056, 45312, 45328, 45332, 0, 32768, 40960, + 45056, 45312, 45328, 45332, 0, 32768, 40960, 45056, + 45312, 45328, 45336, 45334, 0, 32768, 40960, 45056, + 45312, 45328, 0, 32768, 40960, 45056, 45312, 45344, + 45336, 0, 32768, 40960, 45056, 45312, 45344, 45336, + 0, 32768, 40960, 45056, 45312, 45344, 45336, 45338, + 0, 32768, 40960, 45056, 45312, 45344, 45336, 0, + 32768, 40960, 45056, 45312, 45344, 45345, 45340, 0, + 32768, 40960, 45056, 45312, 45344, 45345, 45340, 0, + 32768, 40960, 45056, 45312, 45344, 45345, 45340, 45342, + 0, 32768, 40960, 45056, 45312, 0, 32768, 40960, + 45056, 45312, 45344, 0, 32768, 40960, 45056, 45312, + 45344, 0, 32768, 40960, 45056, 45312, 45344, 45346, + 0, 32768, 40960, 45056, 45312, 45344, 0, 32768, + 40960, 45056, 45312, 45344, 45348, 0, 32768, 40960, + 45056, 45312, 45344, 45348, 0, 32768, 40960, 45056, + 45312, 45344, 45352, 45350, 0, 32768, 40960, 45056, + 45312, 45344, 0, 32768, 40960, 45056, 45312, 45344, + 45352, 0, 32768, 40960, 45056, 45312, 45344, 45352, + 0, 32768, 40960, 45056, 45312, 45344, 45352, 45354, + 0, 32768, 40960, 45056, 45312, 45344, 45352, 0, + 32768, 40960, 45056, 45312, 45344, 45360, 45356, 0, + 32768, 40960, 45056, 45312, 45344, 45360, 45356, 0, + 32768, 40960, 45056, 45312, 45344, 45360, 45361, 45358, + 0, 32768, 40960, 45056, 45312, 45344, 0, 32768, + 40960, 45056, 45312, 45376, 45360, 0, 32768, 40960, + 45056, 45312, 45376, 45360, 0, 32768, 40960, 45056, + 45312, 45376, 45360, 45362, 0, 32768, 40960, 45056, + 45312, 45376, 45360, 0, 32768, 40960, 45056, 45312, + 45376, 45360, 45364, 0, 32768, 40960, 45056, 45312, + 45376, 45360, 45364, 0, 32768, 40960, 45056, 45312, + 45376, 45360, 45368, 45366, 0, 32768, 40960, 45056, + 45312, 45376, 45360, 0, 32768, 40960, 45056, 45312, + 45376, 45377, 45368, 0, 32768, 40960, 45056, 45312, + 45376, 45377, 45368, 0, 32768, 40960, 45056, 45312, + 45376, 45377, 45368, 45370, 0, 32768, 40960, 45056, + 45312, 45376, 45377, 45368, 0, 32768, 40960, 45056, + 45312, 45376, 45377, 45368, 45372, 0, 32768, 40960, + 45056, 45312, 45376, 45377, 45379, 45372, 0, 32768, + 40960, 45056, 45312, 45376, 45377, 45379, 45372, 45374, + 0, 32768, 40960, 45056, 45312, 0, 32768, 40960, + 45056, 45312, 45376, 0, 32768, 40960, 45056, 45312, + 45376, 0, 32768, 40960, 45056, 45312, 45376, 45378, + 0, 32768, 40960, 45056, 45312, 45376, 0, 32768, + 40960, 45056, 45312, 45376, 45380, 0, 32768, 40960, + 45056, 45312, 45376, 45380, 0, 32768, 40960, 45056, + 45312, 45376, 45384, 45382, 0, 32768, 40960, 45056, + 45312, 45376, 0, 32768, 40960, 45056, 45312, 45376, + 45384, 0, 32768, 40960, 45056, 45312, 45376, 45384, + 0, 32768, 40960, 45056, 45312, 45376, 45384, 45386, + 0, 32768, 40960, 45056, 45312, 45376, 45384, 0, + 32768, 40960, 45056, 45312, 45376, 45392, 45388, 0, + 32768, 40960, 45056, 45312, 45376, 45392, 45388, 0, + 32768, 40960, 45056, 45312, 45376, 45392, 45393, 45390, + 0, 32768, 40960, 45056, 45312, 45376, 0, 32768, + 40960, 45056, 45312, 45376, 45392, 0, 32768, 40960, + 45056, 45312, 45376, 45392, 0, 32768, 40960, 45056, + 45312, 45376, 45392, 45394, 0, 32768, 40960, 45056, + 45312, 45376, 45392, 0, 32768, 40960, 45056, 45312, + 45376, 45392, 45396, 0, 32768, 40960, 45056, 45312, + 45376, 45392, 45396, 0, 32768, 40960, 45056, 45312, + 45376, 45392, 45400, 45398, 0, 32768, 40960, 45056, + 45312, 45376, 45392, 0, 32768, 40960, 45056, 45312, + 45376, 45408, 45400, 0, 32768, 40960, 45056, 45312, + 45376, 45408, 45400, 0, 32768, 40960, 45056, 45312, + 45376, 45408, 45400, 45402, 0, 32768, 40960, 45056, + 45312, 45376, 45408, 45400, 0, 32768, 40960, 45056, + 45312, 45376, 45408, 45409, 45404, 0, 32768, 40960, + 45056, 45312, 45376, 45408, 45409, 45404, 0, 32768, + 40960, 45056, 45312, 45376, 45408, 45409, 45404, 45406, + 0, 32768, 40960, 45056, 45312, 45376, 0, 32768, + 40960, 45056, 45312, 45440, 45408, 0, 32768, 40960, + 45056, 45312, 45440, 45408, 0, 32768, 40960, 45056, + 45312, 45440, 45408, 45410, 0, 32768, 40960, 45056, + 45312, 45440, 45408, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45412, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45412, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45416, 45414, 0, 32768, 40960, 45056, + 45312, 45440, 45408, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45416, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45416, 0, 32768, 40960, 45056, 45312, + 45440, 45408, 45416, 45418, 0, 32768, 40960, 45056, + 45312, 45440, 45408, 45416, 0, 32768, 40960, 45056, + 45312, 45440, 45408, 45424, 45420, 0, 32768, 40960, + 45056, 45312, 45440, 45408, 45424, 45420, 0, 32768, + 40960, 45056, 45312, 45440, 45408, 45424, 45425, 45422, + 0, 32768, 40960, 45056, 45312, 45440, 45408, 0, + 32768, 40960, 45056, 45312, 45440, 45441, 45424, 0, + 32768, 40960, 45056, 45312, 45440, 45441, 45424, 0, + 32768, 40960, 45056, 45312, 45440, 45441, 45424, 45426, + 0, 32768, 40960, 45056, 45312, 45440, 45441, 45424, + 0, 32768, 40960, 45056, 45312, 45440, 45441, 45424, + 45428, 0, 32768, 40960, 45056, 45312, 45440, 45441, + 45424, 45428, 0, 32768, 40960, 45056, 45312, 45440, + 45441, 45424, 45432, 45430, 0, 32768, 40960, 45056, + 45312, 45440, 45441, 45424, 0, 32768, 40960, 45056, + 45312, 45440, 45441, 45424, 45432, 0, 32768, 40960, + 45056, 45312, 45440, 45441, 45443, 45432, 0, 32768, + 40960, 45056, 45312, 45440, 45441, 45443, 45432, 45434, + 0, 32768, 40960, 45056, 45312, 45440, 45441, 45443, + 45432, 0, 32768, 40960, 45056, 45312, 45440, 45441, + 45443, 45432, 45436, 0, 32768, 40960, 45056, 45312, + 45440, 45441, 45443, 45432, 45436, 0, 32768, 40960, + 45056, 45312, 45440, 45441, 45443, 45432, 45436, 45438, + 0, 32768, 40960, 45056, 45312, 0, 32768, 40960, + 45056, 45568, 45440, 0, 32768, 40960, 45056, 45568, + 45440, 0, 32768, 40960, 45056, 45568, 45440, 45442, + 0, 32768, 40960, 45056, 45568, 45440, 0, 32768, + 40960, 45056, 45568, 45440, 45444, 0, 32768, 40960, + 45056, 45568, 45440, 45444, 0, 32768, 40960, 45056, + 45568, 45440, 45448, 45446, 0, 32768, 40960, 45056, + 45568, 45440, 0, 32768, 40960, 45056, 45568, 45440, + 45448, 0, 32768, 40960, 45056, 45568, 45440, 45448, + 0, 32768, 40960, 45056, 45568, 45440, 45448, 45450, + 0, 32768, 40960, 45056, 45568, 45440, 45448, 0, + 32768, 40960, 45056, 45568, 45440, 45456, 45452, 0, + 32768, 40960, 45056, 45568, 45440, 45456, 45452, 0, + 32768, 40960, 45056, 45568, 45440, 45456, 45457, 45454, + 0, 32768, 40960, 45056, 45568, 45440, 0, 32768, + 40960, 45056, 45568, 45440, 45456, 0, 32768, 40960, + 45056, 45568, 45440, 45456, 0, 32768, 40960, 45056, + 45568, 45440, 45456, 45458, 0, 32768, 40960, 45056, + 45568, 45440, 45456, 0, 32768, 40960, 45056, 45568, + 45440, 45456, 45460, 0, 32768, 40960, 45056, 45568, + 45440, 45456, 45460, 0, 32768, 40960, 45056, 45568, + 45440, 45456, 45464, 45462, 0, 32768, 40960, 45056, + 45568, 45440, 45456, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45464, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45464, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45464, 45466, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 45464, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 45473, 45468, 0, 32768, 40960, + 45056, 45568, 45440, 45472, 45473, 45468, 0, 32768, + 40960, 45056, 45568, 45440, 45472, 45473, 45468, 45470, + 0, 32768, 40960, 45056, 45568, 45440, 0, 32768, + 40960, 45056, 45568, 45440, 45472, 0, 32768, 40960, + 45056, 45568, 45440, 45472, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 45474, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45476, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45476, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45480, 45478, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45480, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45480, 0, 32768, 40960, 45056, 45568, + 45440, 45472, 45480, 45482, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 45480, 0, 32768, 40960, 45056, + 45568, 45440, 45472, 45488, 45484, 0, 32768, 40960, + 45056, 45568, 45440, 45472, 45488, 45484, 0, 32768, + 40960, 45056, 45568, 45440, 45472, 45488, 45489, 45486, + 0, 32768, 40960, 45056, 45568, 45440, 45472, 0, + 32768, 40960, 45056, 45568, 45440, 45504, 45488, 0, + 32768, 40960, 45056, 45568, 45440, 45504, 45488, 0, + 32768, 40960, 45056, 45568, 45440, 45504, 45488, 45490, + 0, 32768, 40960, 45056, 45568, 45440, 45504, 45488, + 0, 32768, 40960, 45056, 45568, 45440, 45504, 45488, + 45492, 0, 32768, 40960, 45056, 45568, 45440, 45504, + 45488, 45492, 0, 32768, 40960, 45056, 45568, 45440, + 45504, 45488, 45496, 45494, 0, 32768, 40960, 45056, + 45568, 45440, 45504, 45488, 0, 32768, 40960, 45056, + 45568, 45440, 45504, 45505, 45496, 0, 32768, 40960, + 45056, 45568, 45440, 45504, 45505, 45496, 0, 32768, + 40960, 45056, 45568, 45440, 45504, 45505, 45496, 45498, + 0, 32768, 40960, 45056, 45568, 45440, 45504, 45505, + 45496, 0, 32768, 40960, 45056, 45568, 45440, 45504, + 45505, 45496, 45500, 0, 32768, 40960, 45056, 45568, + 45440, 45504, 45505, 45507, 45500, 0, 32768, 40960, + 45056, 45568, 45440, 45504, 45505, 45507, 45500, 45502, + 0, 32768, 40960, 45056, 45568, 45440, 0, 32768, + 40960, 45056, 45568, 45569, 45504, 0, 32768, 40960, + 45056, 45568, 45569, 45504, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 45506, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45508, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45508, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45512, 45510, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45512, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45512, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45512, 45514, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 45512, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 45520, 45516, 0, 32768, 40960, + 45056, 45568, 45569, 45504, 45520, 45516, 0, 32768, + 40960, 45056, 45568, 45569, 45504, 45520, 45521, 45518, + 0, 32768, 40960, 45056, 45568, 45569, 45504, 0, + 32768, 40960, 45056, 45568, 45569, 45504, 45520, 0, + 32768, 40960, 45056, 45568, 45569, 45504, 45520, 0, + 32768, 40960, 45056, 45568, 45569, 45504, 45520, 45522, + 0, 32768, 40960, 45056, 45568, 45569, 45504, 45520, + 0, 32768, 40960, 45056, 45568, 45569, 45504, 45520, + 45524, 0, 32768, 40960, 45056, 45568, 45569, 45504, + 45520, 45524, 0, 32768, 40960, 45056, 45568, 45569, + 45504, 45520, 45528, 45526, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 45520, 0, 32768, 40960, 45056, + 45568, 45569, 45504, 45536, 45528, 0, 32768, 40960, + 45056, 45568, 45569, 45504, 45536, 45528, 0, 32768, + 40960, 45056, 45568, 45569, 45504, 45536, 45528, 45530, + 0, 32768, 40960, 45056, 45568, 45569, 45504, 45536, + 45528, 0, 32768, 40960, 45056, 45568, 45569, 45504, + 45536, 45537, 45532, 0, 32768, 40960, 45056, 45568, + 45569, 45504, 45536, 45537, 45532, 0, 32768, 40960, + 45056, 45568, 45569, 45504, 45536, 45537, 45532, 45534, + 0, 32768, 40960, 45056, 45568, 45569, 45504, 0, + 32768, 40960, 45056, 45568, 45569, 45504, 45536, 0, + 32768, 40960, 45056, 45568, 45569, 45571, 45536, 0, + 32768, 40960, 45056, 45568, 45569, 45571, 45536, 45538, + 0, 32768, 40960, 45056, 45568, 45569, 45571, 45536, + 0, 32768, 40960, 45056, 45568, 45569, 45571, 45536, + 45540, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45536, 45540, 0, 32768, 40960, 45056, 45568, 45569, + 45571, 45536, 45544, 45542, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45536, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45536, 45544, 0, 32768, 40960, + 45056, 45568, 45569, 45571, 45536, 45544, 0, 32768, + 40960, 45056, 45568, 45569, 45571, 45536, 45544, 45546, + 0, 32768, 40960, 45056, 45568, 45569, 45571, 45536, + 45544, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45536, 45552, 45548, 0, 32768, 40960, 45056, 45568, + 45569, 45571, 45536, 45552, 45548, 0, 32768, 40960, + 45056, 45568, 45569, 45571, 45536, 45552, 45553, 45550, + 0, 32768, 40960, 45056, 45568, 45569, 45571, 45536, + 0, 32768, 40960, 45056, 45568, 45569, 45571, 45536, + 45552, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45536, 45552, 0, 32768, 40960, 45056, 45568, 45569, + 45571, 45536, 45552, 45554, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45575, 45552, 0, 32768, 40960, + 45056, 45568, 45569, 45571, 45575, 45552, 45556, 0, + 32768, 40960, 45056, 45568, 45569, 45571, 45575, 45552, + 45556, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45575, 45552, 45560, 45558, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45575, 45552, 0, 32768, 40960, + 45056, 45568, 45569, 45571, 45575, 45552, 45560, 0, + 32768, 40960, 45056, 45568, 45569, 45571, 45575, 45552, + 45560, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45575, 45552, 45560, 45562, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45575, 45552, 45560, 0, 32768, + 40960, 45056, 45568, 45569, 45571, 45575, 45552, 45560, + 45564, 0, 32768, 40960, 45056, 45568, 45569, 45571, + 45575, 45552, 45560, 45564, 0, 32768, 40960, 45056, + 45568, 45569, 45571, 45575, 45552, 45560, 45564, 45566, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 45568, 0, 32768, 40960, 45056, 45568, 0, 32768, + 40960, 45056, 45568, 45570, 0, 32768, 40960, 45056, + 45568, 0, 32768, 40960, 45056, 45568, 45572, 0, + 32768, 40960, 45056, 45568, 45572, 0, 32768, 40960, + 45056, 45568, 45576, 45574, 0, 32768, 40960, 45056, + 45568, 0, 32768, 40960, 45056, 45568, 45576, 0, + 32768, 40960, 45056, 45568, 45576, 0, 32768, 40960, + 45056, 45568, 45576, 45578, 0, 32768, 40960, 45056, + 45568, 45576, 0, 32768, 40960, 45056, 45568, 45584, + 45580, 0, 32768, 40960, 45056, 45568, 45584, 45580, + 0, 32768, 40960, 45056, 45568, 45584, 45585, 45582, + 0, 32768, 40960, 45056, 45568, 0, 32768, 40960, + 45056, 45568, 45584, 0, 32768, 40960, 45056, 45568, + 45584, 0, 32768, 40960, 45056, 45568, 45584, 45586, + 0, 32768, 40960, 45056, 45568, 45584, 0, 32768, + 40960, 45056, 45568, 45584, 45588, 0, 32768, 40960, + 45056, 45568, 45584, 45588, 0, 32768, 40960, 45056, + 45568, 45584, 45592, 45590, 0, 32768, 40960, 45056, + 45568, 45584, 0, 32768, 40960, 45056, 45568, 45600, + 45592, 0, 32768, 40960, 45056, 45568, 45600, 45592, + 0, 32768, 40960, 45056, 45568, 45600, 45592, 45594, + 0, 32768, 40960, 45056, 45568, 45600, 45592, 0, + 32768, 40960, 45056, 45568, 45600, 45601, 45596, 0, + 32768, 40960, 45056, 45568, 45600, 45601, 45596, 0, + 32768, 40960, 45056, 45568, 45600, 45601, 45596, 45598, + 0, 32768, 40960, 45056, 45568, 0, 32768, 40960, + 45056, 45568, 45600, 0, 32768, 40960, 45056, 45568, + 45600, 0, 32768, 40960, 45056, 45568, 45600, 45602, + 0, 32768, 40960, 45056, 45568, 45600, 0, 32768, + 40960, 45056, 45568, 45600, 45604, 0, 32768, 40960, + 45056, 45568, 45600, 45604, 0, 32768, 40960, 45056, + 45568, 45600, 45608, 45606, 0, 32768, 40960, 45056, + 45568, 45600, 0, 32768, 40960, 45056, 45568, 45600, + 45608, 0, 32768, 40960, 45056, 45568, 45600, 45608, + 0, 32768, 40960, 45056, 45568, 45600, 45608, 45610, + 0, 32768, 40960, 45056, 45568, 45600, 45608, 0, + 32768, 40960, 45056, 45568, 45600, 45616, 45612, 0, + 32768, 40960, 45056, 45568, 45600, 45616, 45612, 0, + 32768, 40960, 45056, 45568, 45600, 45616, 45617, 45614, + 0, 32768, 40960, 45056, 45568, 45600, 0, 32768, + 40960, 45056, 45568, 45632, 45616, 0, 32768, 40960, + 45056, 45568, 45632, 45616, 0, 32768, 40960, 45056, + 45568, 45632, 45616, 45618, 0, 32768, 40960, 45056, + 45568, 45632, 45616, 0, 32768, 40960, 45056, 45568, + 45632, 45616, 45620, 0, 32768, 40960, 45056, 45568, + 45632, 45616, 45620, 0, 32768, 40960, 45056, 45568, + 45632, 45616, 45624, 45622, 0, 32768, 40960, 45056, + 45568, 45632, 45616, 0, 32768, 40960, 45056, 45568, + 45632, 45633, 45624, 0, 32768, 40960, 45056, 45568, + 45632, 45633, 45624, 0, 32768, 40960, 45056, 45568, + 45632, 45633, 45624, 45626, 0, 32768, 40960, 45056, + 45568, 45632, 45633, 45624, 0, 32768, 40960, 45056, + 45568, 45632, 45633, 45624, 45628, 0, 32768, 40960, + 45056, 45568, 45632, 45633, 45635, 45628, 0, 32768, + 40960, 45056, 45568, 45632, 45633, 45635, 45628, 45630, + 0, 32768, 40960, 45056, 45568, 0, 32768, 40960, + 45056, 45568, 45632, 0, 32768, 40960, 45056, 45568, + 45632, 0, 32768, 40960, 45056, 45568, 45632, 45634, + 0, 32768, 40960, 45056, 45568, 45632, 0, 32768, + 40960, 45056, 45568, 45632, 45636, 0, 32768, 40960, + 45056, 45568, 45632, 45636, 0, 32768, 40960, 45056, + 45568, 45632, 45640, 45638, 0, 32768, 40960, 45056, + 45568, 45632, 0, 32768, 40960, 45056, 45568, 45632, + 45640, 0, 32768, 40960, 45056, 45568, 45632, 45640, + 0, 32768, 40960, 45056, 45568, 45632, 45640, 45642, + 0, 32768, 40960, 45056, 45568, 45632, 45640, 0, + 32768, 40960, 45056, 45568, 45632, 45648, 45644, 0, + 32768, 40960, 45056, 45568, 45632, 45648, 45644, 0, + 32768, 40960, 45056, 45568, 45632, 45648, 45649, 45646, + 0, 32768, 40960, 45056, 45568, 45632, 0, 32768, + 40960, 45056, 45568, 45632, 45648, 0, 32768, 40960, + 45056, 45568, 45632, 45648, 0, 32768, 40960, 45056, + 45568, 45632, 45648, 45650, 0, 32768, 40960, 45056, + 45568, 45632, 45648, 0, 32768, 40960, 45056, 45568, + 45632, 45648, 45652, 0, 32768, 40960, 45056, 45568, + 45632, 45648, 45652, 0, 32768, 40960, 45056, 45568, + 45632, 45648, 45656, 45654, 0, 32768, 40960, 45056, + 45568, 45632, 45648, 0, 32768, 40960, 45056, 45568, + 45632, 45664, 45656, 0, 32768, 40960, 45056, 45568, + 45632, 45664, 45656, 0, 32768, 40960, 45056, 45568, + 45632, 45664, 45656, 45658, 0, 32768, 40960, 45056, + 45568, 45632, 45664, 45656, 0, 32768, 40960, 45056, + 45568, 45632, 45664, 45665, 45660, 0, 32768, 40960, + 45056, 45568, 45632, 45664, 45665, 45660, 0, 32768, + 40960, 45056, 45568, 45632, 45664, 45665, 45660, 45662, + 0, 32768, 40960, 45056, 45568, 45632, 0, 32768, + 40960, 45056, 45568, 45696, 45664, 0, 32768, 40960, + 45056, 45568, 45696, 45664, 0, 32768, 40960, 45056, + 45568, 45696, 45664, 45666, 0, 32768, 40960, 45056, + 45568, 45696, 45664, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45668, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45668, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45672, 45670, 0, 32768, 40960, 45056, + 45568, 45696, 45664, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45672, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45672, 0, 32768, 40960, 45056, 45568, + 45696, 45664, 45672, 45674, 0, 32768, 40960, 45056, + 45568, 45696, 45664, 45672, 0, 32768, 40960, 45056, + 45568, 45696, 45664, 45680, 45676, 0, 32768, 40960, + 45056, 45568, 45696, 45664, 45680, 45676, 0, 32768, + 40960, 45056, 45568, 45696, 45664, 45680, 45681, 45678, + 0, 32768, 40960, 45056, 45568, 45696, 45664, 0, + 32768, 40960, 45056, 45568, 45696, 45697, 45680, 0, + 32768, 40960, 45056, 45568, 45696, 45697, 45680, 0, + 32768, 40960, 45056, 45568, 45696, 45697, 45680, 45682, + 0, 32768, 40960, 45056, 45568, 45696, 45697, 45680, + 0, 32768, 40960, 45056, 45568, 45696, 45697, 45680, + 45684, 0, 32768, 40960, 45056, 45568, 45696, 45697, + 45680, 45684, 0, 32768, 40960, 45056, 45568, 45696, + 45697, 45680, 45688, 45686, 0, 32768, 40960, 45056, + 45568, 45696, 45697, 45680, 0, 32768, 40960, 45056, + 45568, 45696, 45697, 45680, 45688, 0, 32768, 40960, + 45056, 45568, 45696, 45697, 45699, 45688, 0, 32768, + 40960, 45056, 45568, 45696, 45697, 45699, 45688, 45690, + 0, 32768, 40960, 45056, 45568, 45696, 45697, 45699, + 45688, 0, 32768, 40960, 45056, 45568, 45696, 45697, + 45699, 45688, 45692, 0, 32768, 40960, 45056, 45568, + 45696, 45697, 45699, 45688, 45692, 0, 32768, 40960, + 45056, 45568, 45696, 45697, 45699, 45688, 45692, 45694, + 0, 32768, 40960, 45056, 45568, 0, 32768, 40960, + 45056, 45568, 45696, 0, 32768, 40960, 45056, 45568, + 45696, 0, 32768, 40960, 45056, 45568, 45696, 45698, + 0, 32768, 40960, 45056, 45568, 45696, 0, 32768, + 40960, 45056, 45568, 45696, 45700, 0, 32768, 40960, + 45056, 45568, 45696, 45700, 0, 32768, 40960, 45056, + 45568, 45696, 45704, 45702, 0, 32768, 40960, 45056, + 45568, 45696, 0, 32768, 40960, 45056, 45568, 45696, + 45704, 0, 32768, 40960, 45056, 45568, 45696, 45704, + 0, 32768, 40960, 45056, 45568, 45696, 45704, 45706, + 0, 32768, 40960, 45056, 45568, 45696, 45704, 0, + 32768, 40960, 45056, 45568, 45696, 45712, 45708, 0, + 32768, 40960, 45056, 45568, 45696, 45712, 45708, 0, + 32768, 40960, 45056, 45568, 45696, 45712, 45713, 45710, + 0, 32768, 40960, 45056, 45568, 45696, 0, 32768, + 40960, 45056, 45568, 45696, 45712, 0, 32768, 40960, + 45056, 45568, 45696, 45712, 0, 32768, 40960, 45056, + 45568, 45696, 45712, 45714, 0, 32768, 40960, 45056, + 45568, 45696, 45712, 0, 32768, 40960, 45056, 45568, + 45696, 45712, 45716, 0, 32768, 40960, 45056, 45568, + 45696, 45712, 45716, 0, 32768, 40960, 45056, 45568, + 45696, 45712, 45720, 45718, 0, 32768, 40960, 45056, + 45568, 45696, 45712, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45720, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45720, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45720, 45722, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 45720, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 45729, 45724, 0, 32768, 40960, + 45056, 45568, 45696, 45728, 45729, 45724, 0, 32768, + 40960, 45056, 45568, 45696, 45728, 45729, 45724, 45726, + 0, 32768, 40960, 45056, 45568, 45696, 0, 32768, + 40960, 45056, 45568, 45696, 45728, 0, 32768, 40960, + 45056, 45568, 45696, 45728, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 45730, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45732, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45732, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45736, 45734, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45736, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45736, 0, 32768, 40960, 45056, 45568, + 45696, 45728, 45736, 45738, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 45736, 0, 32768, 40960, 45056, + 45568, 45696, 45728, 45744, 45740, 0, 32768, 40960, + 45056, 45568, 45696, 45728, 45744, 45740, 0, 32768, + 40960, 45056, 45568, 45696, 45728, 45744, 45745, 45742, + 0, 32768, 40960, 45056, 45568, 45696, 45728, 0, + 32768, 40960, 45056, 45568, 45696, 45760, 45744, 0, + 32768, 40960, 45056, 45568, 45696, 45760, 45744, 0, + 32768, 40960, 45056, 45568, 45696, 45760, 45744, 45746, + 0, 32768, 40960, 45056, 45568, 45696, 45760, 45744, + 0, 32768, 40960, 45056, 45568, 45696, 45760, 45744, + 45748, 0, 32768, 40960, 45056, 45568, 45696, 45760, + 45744, 45748, 0, 32768, 40960, 45056, 45568, 45696, + 45760, 45744, 45752, 45750, 0, 32768, 40960, 45056, + 45568, 45696, 45760, 45744, 0, 32768, 40960, 45056, + 45568, 45696, 45760, 45761, 45752, 0, 32768, 40960, + 45056, 45568, 45696, 45760, 45761, 45752, 0, 32768, + 40960, 45056, 45568, 45696, 45760, 45761, 45752, 45754, + 0, 32768, 40960, 45056, 45568, 45696, 45760, 45761, + 45752, 0, 32768, 40960, 45056, 45568, 45696, 45760, + 45761, 45752, 45756, 0, 32768, 40960, 45056, 45568, + 45696, 45760, 45761, 45763, 45756, 0, 32768, 40960, + 45056, 45568, 45696, 45760, 45761, 45763, 45756, 45758, + 0, 32768, 40960, 45056, 45568, 45696, 0, 32768, + 40960, 45056, 45568, 45824, 45760, 0, 32768, 40960, + 45056, 45568, 45824, 45760, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 45762, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45764, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45764, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45768, 45766, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45768, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45768, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45768, 45770, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 45768, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 45776, 45772, 0, 32768, 40960, + 45056, 45568, 45824, 45760, 45776, 45772, 0, 32768, + 40960, 45056, 45568, 45824, 45760, 45776, 45777, 45774, + 0, 32768, 40960, 45056, 45568, 45824, 45760, 0, + 32768, 40960, 45056, 45568, 45824, 45760, 45776, 0, + 32768, 40960, 45056, 45568, 45824, 45760, 45776, 0, + 32768, 40960, 45056, 45568, 45824, 45760, 45776, 45778, + 0, 32768, 40960, 45056, 45568, 45824, 45760, 45776, + 0, 32768, 40960, 45056, 45568, 45824, 45760, 45776, + 45780, 0, 32768, 40960, 45056, 45568, 45824, 45760, + 45776, 45780, 0, 32768, 40960, 45056, 45568, 45824, + 45760, 45776, 45784, 45782, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 45776, 0, 32768, 40960, 45056, + 45568, 45824, 45760, 45792, 45784, 0, 32768, 40960, + 45056, 45568, 45824, 45760, 45792, 45784, 0, 32768, + 40960, 45056, 45568, 45824, 45760, 45792, 45784, 45786, + 0, 32768, 40960, 45056, 45568, 45824, 45760, 45792, + 45784, 0, 32768, 40960, 45056, 45568, 45824, 45760, + 45792, 45793, 45788, 0, 32768, 40960, 45056, 45568, + 45824, 45760, 45792, 45793, 45788, 0, 32768, 40960, + 45056, 45568, 45824, 45760, 45792, 45793, 45788, 45790, + 0, 32768, 40960, 45056, 45568, 45824, 45760, 0, + 32768, 40960, 45056, 45568, 45824, 45825, 45792, 0, + 32768, 40960, 45056, 45568, 45824, 45825, 45792, 0, + 32768, 40960, 45056, 45568, 45824, 45825, 45792, 45794, + 0, 32768, 40960, 45056, 45568, 45824, 45825, 45792, + 0, 32768, 40960, 45056, 45568, 45824, 45825, 45792, + 45796, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45792, 45796, 0, 32768, 40960, 45056, 45568, 45824, + 45825, 45792, 45800, 45798, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45792, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45792, 45800, 0, 32768, 40960, + 45056, 45568, 45824, 45825, 45792, 45800, 0, 32768, + 40960, 45056, 45568, 45824, 45825, 45792, 45800, 45802, + 0, 32768, 40960, 45056, 45568, 45824, 45825, 45792, + 45800, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45792, 45808, 45804, 0, 32768, 40960, 45056, 45568, + 45824, 45825, 45792, 45808, 45804, 0, 32768, 40960, + 45056, 45568, 45824, 45825, 45792, 45808, 45809, 45806, + 0, 32768, 40960, 45056, 45568, 45824, 45825, 45792, + 0, 32768, 40960, 45056, 45568, 45824, 45825, 45792, + 45808, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45827, 45808, 0, 32768, 40960, 45056, 45568, 45824, + 45825, 45827, 45808, 45810, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45827, 45808, 0, 32768, 40960, + 45056, 45568, 45824, 45825, 45827, 45808, 45812, 0, + 32768, 40960, 45056, 45568, 45824, 45825, 45827, 45808, + 45812, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45827, 45808, 45816, 45814, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45827, 45808, 0, 32768, 40960, + 45056, 45568, 45824, 45825, 45827, 45808, 45816, 0, + 32768, 40960, 45056, 45568, 45824, 45825, 45827, 45808, + 45816, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45827, 45808, 45816, 45818, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45827, 45831, 45816, 0, 32768, + 40960, 45056, 45568, 45824, 45825, 45827, 45831, 45816, + 45820, 0, 32768, 40960, 45056, 45568, 45824, 45825, + 45827, 45831, 45816, 45820, 0, 32768, 40960, 45056, + 45568, 45824, 45825, 45827, 45831, 45816, 45820, 45822, + 0, 32768, 40960, 45056, 45568, 0, 32768, 40960, + 45056, 46080, 45824, 0, 32768, 40960, 45056, 46080, + 45824, 0, 32768, 40960, 45056, 46080, 45824, 45826, + 0, 32768, 40960, 45056, 46080, 45824, 0, 32768, + 40960, 45056, 46080, 45824, 45828, 0, 32768, 40960, + 45056, 46080, 45824, 45828, 0, 32768, 40960, 45056, + 46080, 45824, 45832, 45830, 0, 32768, 40960, 45056, + 46080, 45824, 0, 32768, 40960, 45056, 46080, 45824, + 45832, 0, 32768, 40960, 45056, 46080, 45824, 45832, + 0, 32768, 40960, 45056, 46080, 45824, 45832, 45834, + 0, 32768, 40960, 45056, 46080, 45824, 45832, 0, + 32768, 40960, 45056, 46080, 45824, 45840, 45836, 0, + 32768, 40960, 45056, 46080, 45824, 45840, 45836, 0, + 32768, 40960, 45056, 46080, 45824, 45840, 45841, 45838, + 0, 32768, 40960, 45056, 46080, 45824, 0, 32768, + 40960, 45056, 46080, 45824, 45840, 0, 32768, 40960, + 45056, 46080, 45824, 45840, 0, 32768, 40960, 45056, + 46080, 45824, 45840, 45842, 0, 32768, 40960, 45056, + 46080, 45824, 45840, 0, 32768, 40960, 45056, 46080, + 45824, 45840, 45844, 0, 32768, 40960, 45056, 46080, + 45824, 45840, 45844, 0, 32768, 40960, 45056, 46080, + 45824, 45840, 45848, 45846, 0, 32768, 40960, 45056, + 46080, 45824, 45840, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45848, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45848, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45848, 45850, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 45848, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 45857, 45852, 0, 32768, 40960, + 45056, 46080, 45824, 45856, 45857, 45852, 0, 32768, + 40960, 45056, 46080, 45824, 45856, 45857, 45852, 45854, + 0, 32768, 40960, 45056, 46080, 45824, 0, 32768, + 40960, 45056, 46080, 45824, 45856, 0, 32768, 40960, + 45056, 46080, 45824, 45856, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 45858, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45860, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45860, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45864, 45862, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45864, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45864, 0, 32768, 40960, 45056, 46080, + 45824, 45856, 45864, 45866, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 45864, 0, 32768, 40960, 45056, + 46080, 45824, 45856, 45872, 45868, 0, 32768, 40960, + 45056, 46080, 45824, 45856, 45872, 45868, 0, 32768, + 40960, 45056, 46080, 45824, 45856, 45872, 45873, 45870, + 0, 32768, 40960, 45056, 46080, 45824, 45856, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45872, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45872, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45872, 45874, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45872, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45872, + 45876, 0, 32768, 40960, 45056, 46080, 45824, 45888, + 45872, 45876, 0, 32768, 40960, 45056, 46080, 45824, + 45888, 45872, 45880, 45878, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45872, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45889, 45880, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 45889, 45880, 0, 32768, + 40960, 45056, 46080, 45824, 45888, 45889, 45880, 45882, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45889, + 45880, 0, 32768, 40960, 45056, 46080, 45824, 45888, + 45889, 45880, 45884, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45889, 45891, 45884, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 45889, 45891, 45884, 45886, + 0, 32768, 40960, 45056, 46080, 45824, 0, 32768, + 40960, 45056, 46080, 45824, 45888, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45890, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45892, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45892, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45896, 45894, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45896, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45896, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45896, 45898, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45896, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45904, 45900, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 45904, 45900, 0, 32768, + 40960, 45056, 46080, 45824, 45888, 45904, 45905, 45902, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45904, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45904, 0, + 32768, 40960, 45056, 46080, 45824, 45888, 45904, 45906, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45904, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45904, + 45908, 0, 32768, 40960, 45056, 46080, 45824, 45888, + 45904, 45908, 0, 32768, 40960, 45056, 46080, 45824, + 45888, 45904, 45912, 45910, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45904, 0, 32768, 40960, 45056, + 46080, 45824, 45888, 45920, 45912, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 45920, 45912, 0, 32768, + 40960, 45056, 46080, 45824, 45888, 45920, 45912, 45914, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 45920, + 45912, 0, 32768, 40960, 45056, 46080, 45824, 45888, + 45920, 45921, 45916, 0, 32768, 40960, 45056, 46080, + 45824, 45888, 45920, 45921, 45916, 0, 32768, 40960, + 45056, 46080, 45824, 45888, 45920, 45921, 45916, 45918, + 0, 32768, 40960, 45056, 46080, 45824, 45888, 0, + 32768, 40960, 45056, 46080, 45824, 45952, 45920, 0, + 32768, 40960, 45056, 46080, 45824, 45952, 45920, 0, + 32768, 40960, 45056, 46080, 45824, 45952, 45920, 45922, + 0, 32768, 40960, 45056, 46080, 45824, 45952, 45920, + 0, 32768, 40960, 45056, 46080, 45824, 45952, 45920, + 45924, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45920, 45924, 0, 32768, 40960, 45056, 46080, 45824, + 45952, 45920, 45928, 45926, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45920, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45920, 45928, 0, 32768, 40960, + 45056, 46080, 45824, 45952, 45920, 45928, 0, 32768, + 40960, 45056, 46080, 45824, 45952, 45920, 45928, 45930, + 0, 32768, 40960, 45056, 46080, 45824, 45952, 45920, + 45928, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45920, 45936, 45932, 0, 32768, 40960, 45056, 46080, + 45824, 45952, 45920, 45936, 45932, 0, 32768, 40960, + 45056, 46080, 45824, 45952, 45920, 45936, 45937, 45934, + 0, 32768, 40960, 45056, 46080, 45824, 45952, 45920, + 0, 32768, 40960, 45056, 46080, 45824, 45952, 45953, + 45936, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45953, 45936, 0, 32768, 40960, 45056, 46080, 45824, + 45952, 45953, 45936, 45938, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45953, 45936, 0, 32768, 40960, + 45056, 46080, 45824, 45952, 45953, 45936, 45940, 0, + 32768, 40960, 45056, 46080, 45824, 45952, 45953, 45936, + 45940, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45953, 45936, 45944, 45942, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45953, 45936, 0, 32768, 40960, + 45056, 46080, 45824, 45952, 45953, 45936, 45944, 0, + 32768, 40960, 45056, 46080, 45824, 45952, 45953, 45955, + 45944, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45953, 45955, 45944, 45946, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45953, 45955, 45944, 0, 32768, + 40960, 45056, 46080, 45824, 45952, 45953, 45955, 45944, + 45948, 0, 32768, 40960, 45056, 46080, 45824, 45952, + 45953, 45955, 45944, 45948, 0, 32768, 40960, 45056, + 46080, 45824, 45952, 45953, 45955, 45944, 45948, 45950, + 0, 32768, 40960, 45056, 46080, 45824, 0, 32768, + 40960, 45056, 46080, 45824, 45952, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45954, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45956, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45956, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45960, 45958, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45960, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45960, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45960, 45962, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45960, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45968, 45964, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 45968, 45964, 0, 32768, + 40960, 45056, 46080, 46081, 45952, 45968, 45969, 45966, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45968, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45968, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45968, 45970, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45968, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45968, + 45972, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 45968, 45972, 0, 32768, 40960, 45056, 46080, 46081, + 45952, 45968, 45976, 45974, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45968, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45984, 45976, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 45984, 45976, 0, 32768, + 40960, 45056, 46080, 46081, 45952, 45984, 45976, 45978, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45984, + 45976, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 45984, 45985, 45980, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45984, 45985, 45980, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 45984, 45985, 45980, 45982, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45984, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45984, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 45984, 45986, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45984, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45984, + 45988, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 45984, 45988, 0, 32768, 40960, 45056, 46080, 46081, + 45952, 45984, 45992, 45990, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45984, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 45984, 45992, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 45984, 45992, 0, 32768, + 40960, 45056, 46080, 46081, 45952, 45984, 45992, 45994, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45984, + 45992, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 45984, 46000, 45996, 0, 32768, 40960, 45056, 46080, + 46081, 45952, 45984, 46000, 45996, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 45984, 46000, 46001, 45998, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 45984, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 46016, + 46000, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 46016, 46000, 0, 32768, 40960, 45056, 46080, 46081, + 45952, 46016, 46000, 46002, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 46016, 46000, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 46016, 46000, 46004, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 46016, 46000, + 46004, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 46016, 46000, 46008, 46006, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 46016, 46000, 0, 32768, 40960, + 45056, 46080, 46081, 45952, 46016, 46017, 46008, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 46016, 46017, + 46008, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 46016, 46017, 46008, 46010, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 46016, 46017, 46008, 0, 32768, + 40960, 45056, 46080, 46081, 45952, 46016, 46017, 46008, + 46012, 0, 32768, 40960, 45056, 46080, 46081, 45952, + 46016, 46017, 46019, 46012, 0, 32768, 40960, 45056, + 46080, 46081, 45952, 46016, 46017, 46019, 46012, 46014, + 0, 32768, 40960, 45056, 46080, 46081, 45952, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 46016, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 46016, 0, + 32768, 40960, 45056, 46080, 46081, 45952, 46016, 46018, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 46020, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46020, 0, 32768, 40960, 45056, 46080, 46081, + 46083, 46016, 46024, 46022, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46024, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46016, 46024, 0, 32768, + 40960, 45056, 46080, 46081, 46083, 46016, 46024, 46026, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 46024, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46032, 46028, 0, 32768, 40960, 45056, 46080, + 46081, 46083, 46016, 46032, 46028, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46016, 46032, 46033, 46030, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 46032, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46032, 0, 32768, 40960, 45056, 46080, 46081, + 46083, 46016, 46032, 46034, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46032, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46016, 46032, 46036, 0, + 32768, 40960, 45056, 46080, 46081, 46083, 46016, 46032, + 46036, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46032, 46040, 46038, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46032, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46016, 46048, 46040, 0, + 32768, 40960, 45056, 46080, 46081, 46083, 46016, 46048, + 46040, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46048, 46040, 46042, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46048, 46040, 0, 32768, + 40960, 45056, 46080, 46081, 46083, 46016, 46048, 46049, + 46044, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46048, 46049, 46044, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46048, 46049, 46044, 46046, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46016, + 46048, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46048, 0, 32768, 40960, 45056, 46080, 46081, + 46083, 46016, 46048, 46050, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46016, 46048, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46016, 46048, 46052, 0, + 32768, 40960, 45056, 46080, 46081, 46083, 46016, 46048, + 46052, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46016, 46048, 46056, 46054, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46087, 46048, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46087, 46048, 46056, 0, + 32768, 40960, 45056, 46080, 46081, 46083, 46087, 46048, + 46056, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46087, 46048, 46056, 46058, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46087, 46048, 46056, 0, 32768, + 40960, 45056, 46080, 46081, 46083, 46087, 46048, 46064, + 46060, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46087, 46048, 46064, 46060, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46087, 46048, 46064, 46065, 46062, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46087, + 46048, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46087, 46048, 46064, 0, 32768, 40960, 45056, 46080, + 46081, 46083, 46087, 46048, 46064, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46087, 46048, 46064, 46066, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46087, + 46048, 46064, 0, 32768, 40960, 45056, 46080, 46081, + 46083, 46087, 46048, 46064, 46068, 0, 32768, 40960, + 45056, 46080, 46081, 46083, 46087, 46048, 46064, 46068, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46087, + 46048, 46064, 46072, 46070, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46087, 46048, 46064, 0, 32768, + 40960, 45056, 46080, 46081, 46083, 46087, 46048, 46064, + 46072, 0, 32768, 40960, 45056, 46080, 46081, 46083, + 46087, 46048, 46064, 46072, 0, 32768, 40960, 45056, + 46080, 46081, 46083, 46087, 46048, 46064, 46072, 46074, + 0, 32768, 40960, 45056, 46080, 46081, 46083, 46087, + 46048, 46064, 46072, 0, 32768, 40960, 45056, 46080, + 46081, 46083, 46087, 46048, 46064, 46072, 46076, 0, + 32768, 40960, 45056, 46080, 46081, 46083, 46087, 46048, + 46064, 46072, 46076, 0, 32768, 40960, 45056, 46080, + 46081, 46083, 46087, 46048, 46064, 46072, 46076, 46078, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 46080, 0, 32768, 40960, 45056, 46080, 0, 32768, + 40960, 45056, 46080, 46082, 0, 32768, 40960, 45056, + 46080, 0, 32768, 40960, 45056, 46080, 46084, 0, + 32768, 40960, 45056, 46080, 46084, 0, 32768, 40960, + 45056, 46080, 46088, 46086, 0, 32768, 40960, 45056, + 46080, 0, 32768, 40960, 45056, 46080, 46088, 0, + 32768, 40960, 45056, 46080, 46088, 0, 32768, 40960, + 45056, 46080, 46088, 46090, 0, 32768, 40960, 45056, + 46080, 46088, 0, 32768, 40960, 45056, 46080, 46096, + 46092, 0, 32768, 40960, 45056, 46080, 46096, 46092, + 0, 32768, 40960, 45056, 46080, 46096, 46097, 46094, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 46080, 46096, 0, 32768, 40960, 45056, 46080, + 46096, 0, 32768, 40960, 45056, 46080, 46096, 46098, + 0, 32768, 40960, 45056, 46080, 46096, 0, 32768, + 40960, 45056, 46080, 46096, 46100, 0, 32768, 40960, + 45056, 46080, 46096, 46100, 0, 32768, 40960, 45056, + 46080, 46096, 46104, 46102, 0, 32768, 40960, 45056, + 46080, 46096, 0, 32768, 40960, 45056, 46080, 46112, + 46104, 0, 32768, 40960, 45056, 46080, 46112, 46104, + 0, 32768, 40960, 45056, 46080, 46112, 46104, 46106, + 0, 32768, 40960, 45056, 46080, 46112, 46104, 0, + 32768, 40960, 45056, 46080, 46112, 46113, 46108, 0, + 32768, 40960, 45056, 46080, 46112, 46113, 46108, 0, + 32768, 40960, 45056, 46080, 46112, 46113, 46108, 46110, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 46080, 46112, 0, 32768, 40960, 45056, 46080, + 46112, 0, 32768, 40960, 45056, 46080, 46112, 46114, + 0, 32768, 40960, 45056, 46080, 46112, 0, 32768, + 40960, 45056, 46080, 46112, 46116, 0, 32768, 40960, + 45056, 46080, 46112, 46116, 0, 32768, 40960, 45056, + 46080, 46112, 46120, 46118, 0, 32768, 40960, 45056, + 46080, 46112, 0, 32768, 40960, 45056, 46080, 46112, + 46120, 0, 32768, 40960, 45056, 46080, 46112, 46120, + 0, 32768, 40960, 45056, 46080, 46112, 46120, 46122, + 0, 32768, 40960, 45056, 46080, 46112, 46120, 0, + 32768, 40960, 45056, 46080, 46112, 46128, 46124, 0, + 32768, 40960, 45056, 46080, 46112, 46128, 46124, 0, + 32768, 40960, 45056, 46080, 46112, 46128, 46129, 46126, + 0, 32768, 40960, 45056, 46080, 46112, 0, 32768, + 40960, 45056, 46080, 46144, 46128, 0, 32768, 40960, + 45056, 46080, 46144, 46128, 0, 32768, 40960, 45056, + 46080, 46144, 46128, 46130, 0, 32768, 40960, 45056, + 46080, 46144, 46128, 0, 32768, 40960, 45056, 46080, + 46144, 46128, 46132, 0, 32768, 40960, 45056, 46080, + 46144, 46128, 46132, 0, 32768, 40960, 45056, 46080, + 46144, 46128, 46136, 46134, 0, 32768, 40960, 45056, + 46080, 46144, 46128, 0, 32768, 40960, 45056, 46080, + 46144, 46145, 46136, 0, 32768, 40960, 45056, 46080, + 46144, 46145, 46136, 0, 32768, 40960, 45056, 46080, + 46144, 46145, 46136, 46138, 0, 32768, 40960, 45056, + 46080, 46144, 46145, 46136, 0, 32768, 40960, 45056, + 46080, 46144, 46145, 46136, 46140, 0, 32768, 40960, + 45056, 46080, 46144, 46145, 46147, 46140, 0, 32768, + 40960, 45056, 46080, 46144, 46145, 46147, 46140, 46142, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 46080, 46144, 0, 32768, 40960, 45056, 46080, + 46144, 0, 32768, 40960, 45056, 46080, 46144, 46146, + 0, 32768, 40960, 45056, 46080, 46144, 0, 32768, + 40960, 45056, 46080, 46144, 46148, 0, 32768, 40960, + 45056, 46080, 46144, 46148, 0, 32768, 40960, 45056, + 46080, 46144, 46152, 46150, 0, 32768, 40960, 45056, + 46080, 46144, 0, 32768, 40960, 45056, 46080, 46144, + 46152, 0, 32768, 40960, 45056, 46080, 46144, 46152, + 0, 32768, 40960, 45056, 46080, 46144, 46152, 46154, + 0, 32768, 40960, 45056, 46080, 46144, 46152, 0, + 32768, 40960, 45056, 46080, 46144, 46160, 46156, 0, + 32768, 40960, 45056, 46080, 46144, 46160, 46156, 0, + 32768, 40960, 45056, 46080, 46144, 46160, 46161, 46158, + 0, 32768, 40960, 45056, 46080, 46144, 0, 32768, + 40960, 45056, 46080, 46144, 46160, 0, 32768, 40960, + 45056, 46080, 46144, 46160, 0, 32768, 40960, 45056, + 46080, 46144, 46160, 46162, 0, 32768, 40960, 45056, + 46080, 46144, 46160, 0, 32768, 40960, 45056, 46080, + 46144, 46160, 46164, 0, 32768, 40960, 45056, 46080, + 46144, 46160, 46164, 0, 32768, 40960, 45056, 46080, + 46144, 46160, 46168, 46166, 0, 32768, 40960, 45056, + 46080, 46144, 46160, 0, 32768, 40960, 45056, 46080, + 46144, 46176, 46168, 0, 32768, 40960, 45056, 46080, + 46144, 46176, 46168, 0, 32768, 40960, 45056, 46080, + 46144, 46176, 46168, 46170, 0, 32768, 40960, 45056, + 46080, 46144, 46176, 46168, 0, 32768, 40960, 45056, + 46080, 46144, 46176, 46177, 46172, 0, 32768, 40960, + 45056, 46080, 46144, 46176, 46177, 46172, 0, 32768, + 40960, 45056, 46080, 46144, 46176, 46177, 46172, 46174, + 0, 32768, 40960, 45056, 46080, 46144, 0, 32768, + 40960, 45056, 46080, 46208, 46176, 0, 32768, 40960, + 45056, 46080, 46208, 46176, 0, 32768, 40960, 45056, + 46080, 46208, 46176, 46178, 0, 32768, 40960, 45056, + 46080, 46208, 46176, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46180, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46180, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46184, 46182, 0, 32768, 40960, 45056, + 46080, 46208, 46176, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46184, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46184, 0, 32768, 40960, 45056, 46080, + 46208, 46176, 46184, 46186, 0, 32768, 40960, 45056, + 46080, 46208, 46176, 46184, 0, 32768, 40960, 45056, + 46080, 46208, 46176, 46192, 46188, 0, 32768, 40960, + 45056, 46080, 46208, 46176, 46192, 46188, 0, 32768, + 40960, 45056, 46080, 46208, 46176, 46192, 46193, 46190, + 0, 32768, 40960, 45056, 46080, 46208, 46176, 0, + 32768, 40960, 45056, 46080, 46208, 46209, 46192, 0, + 32768, 40960, 45056, 46080, 46208, 46209, 46192, 0, + 32768, 40960, 45056, 46080, 46208, 46209, 46192, 46194, + 0, 32768, 40960, 45056, 46080, 46208, 46209, 46192, + 0, 32768, 40960, 45056, 46080, 46208, 46209, 46192, + 46196, 0, 32768, 40960, 45056, 46080, 46208, 46209, + 46192, 46196, 0, 32768, 40960, 45056, 46080, 46208, + 46209, 46192, 46200, 46198, 0, 32768, 40960, 45056, + 46080, 46208, 46209, 46192, 0, 32768, 40960, 45056, + 46080, 46208, 46209, 46192, 46200, 0, 32768, 40960, + 45056, 46080, 46208, 46209, 46211, 46200, 0, 32768, + 40960, 45056, 46080, 46208, 46209, 46211, 46200, 46202, + 0, 32768, 40960, 45056, 46080, 46208, 46209, 46211, + 46200, 0, 32768, 40960, 45056, 46080, 46208, 46209, + 46211, 46200, 46204, 0, 32768, 40960, 45056, 46080, + 46208, 46209, 46211, 46200, 46204, 0, 32768, 40960, + 45056, 46080, 46208, 46209, 46211, 46200, 46204, 46206, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 46080, 46208, 0, 32768, 40960, 45056, 46080, + 46208, 0, 32768, 40960, 45056, 46080, 46208, 46210, + 0, 32768, 40960, 45056, 46080, 46208, 0, 32768, + 40960, 45056, 46080, 46208, 46212, 0, 32768, 40960, + 45056, 46080, 46208, 46212, 0, 32768, 40960, 45056, + 46080, 46208, 46216, 46214, 0, 32768, 40960, 45056, + 46080, 46208, 0, 32768, 40960, 45056, 46080, 46208, + 46216, 0, 32768, 40960, 45056, 46080, 46208, 46216, + 0, 32768, 40960, 45056, 46080, 46208, 46216, 46218, + 0, 32768, 40960, 45056, 46080, 46208, 46216, 0, + 32768, 40960, 45056, 46080, 46208, 46224, 46220, 0, + 32768, 40960, 45056, 46080, 46208, 46224, 46220, 0, + 32768, 40960, 45056, 46080, 46208, 46224, 46225, 46222, + 0, 32768, 40960, 45056, 46080, 46208, 0, 32768, + 40960, 45056, 46080, 46208, 46224, 0, 32768, 40960, + 45056, 46080, 46208, 46224, 0, 32768, 40960, 45056, + 46080, 46208, 46224, 46226, 0, 32768, 40960, 45056, + 46080, 46208, 46224, 0, 32768, 40960, 45056, 46080, + 46208, 46224, 46228, 0, 32768, 40960, 45056, 46080, + 46208, 46224, 46228, 0, 32768, 40960, 45056, 46080, + 46208, 46224, 46232, 46230, 0, 32768, 40960, 45056, + 46080, 46208, 46224, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46232, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46232, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46232, 46234, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 46232, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 46241, 46236, 0, 32768, 40960, + 45056, 46080, 46208, 46240, 46241, 46236, 0, 32768, + 40960, 45056, 46080, 46208, 46240, 46241, 46236, 46238, + 0, 32768, 40960, 45056, 46080, 46208, 0, 32768, + 40960, 45056, 46080, 46208, 46240, 0, 32768, 40960, + 45056, 46080, 46208, 46240, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 46242, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46244, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46244, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46248, 46246, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46248, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46248, 0, 32768, 40960, 45056, 46080, + 46208, 46240, 46248, 46250, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 46248, 0, 32768, 40960, 45056, + 46080, 46208, 46240, 46256, 46252, 0, 32768, 40960, + 45056, 46080, 46208, 46240, 46256, 46252, 0, 32768, + 40960, 45056, 46080, 46208, 46240, 46256, 46257, 46254, + 0, 32768, 40960, 45056, 46080, 46208, 46240, 0, + 32768, 40960, 45056, 46080, 46208, 46272, 46256, 0, + 32768, 40960, 45056, 46080, 46208, 46272, 46256, 0, + 32768, 40960, 45056, 46080, 46208, 46272, 46256, 46258, + 0, 32768, 40960, 45056, 46080, 46208, 46272, 46256, + 0, 32768, 40960, 45056, 46080, 46208, 46272, 46256, + 46260, 0, 32768, 40960, 45056, 46080, 46208, 46272, + 46256, 46260, 0, 32768, 40960, 45056, 46080, 46208, + 46272, 46256, 46264, 46262, 0, 32768, 40960, 45056, + 46080, 46208, 46272, 46256, 0, 32768, 40960, 45056, + 46080, 46208, 46272, 46273, 46264, 0, 32768, 40960, + 45056, 46080, 46208, 46272, 46273, 46264, 0, 32768, + 40960, 45056, 46080, 46208, 46272, 46273, 46264, 46266, + 0, 32768, 40960, 45056, 46080, 46208, 46272, 46273, + 46264, 0, 32768, 40960, 45056, 46080, 46208, 46272, + 46273, 46264, 46268, 0, 32768, 40960, 45056, 46080, + 46208, 46272, 46273, 46275, 46268, 0, 32768, 40960, + 45056, 46080, 46208, 46272, 46273, 46275, 46268, 46270, + 0, 32768, 40960, 45056, 46080, 46208, 0, 32768, + 40960, 45056, 46080, 46336, 46272, 0, 32768, 40960, + 45056, 46080, 46336, 46272, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 46274, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46276, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46276, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46280, 46278, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46280, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46280, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46280, 46282, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 46280, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 46288, 46284, 0, 32768, 40960, + 45056, 46080, 46336, 46272, 46288, 46284, 0, 32768, + 40960, 45056, 46080, 46336, 46272, 46288, 46289, 46286, + 0, 32768, 40960, 45056, 46080, 46336, 46272, 0, + 32768, 40960, 45056, 46080, 46336, 46272, 46288, 0, + 32768, 40960, 45056, 46080, 46336, 46272, 46288, 0, + 32768, 40960, 45056, 46080, 46336, 46272, 46288, 46290, + 0, 32768, 40960, 45056, 46080, 46336, 46272, 46288, + 0, 32768, 40960, 45056, 46080, 46336, 46272, 46288, + 46292, 0, 32768, 40960, 45056, 46080, 46336, 46272, + 46288, 46292, 0, 32768, 40960, 45056, 46080, 46336, + 46272, 46288, 46296, 46294, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 46288, 0, 32768, 40960, 45056, + 46080, 46336, 46272, 46304, 46296, 0, 32768, 40960, + 45056, 46080, 46336, 46272, 46304, 46296, 0, 32768, + 40960, 45056, 46080, 46336, 46272, 46304, 46296, 46298, + 0, 32768, 40960, 45056, 46080, 46336, 46272, 46304, + 46296, 0, 32768, 40960, 45056, 46080, 46336, 46272, + 46304, 46305, 46300, 0, 32768, 40960, 45056, 46080, + 46336, 46272, 46304, 46305, 46300, 0, 32768, 40960, + 45056, 46080, 46336, 46272, 46304, 46305, 46300, 46302, + 0, 32768, 40960, 45056, 46080, 46336, 46272, 0, + 32768, 40960, 45056, 46080, 46336, 46337, 46304, 0, + 32768, 40960, 45056, 46080, 46336, 46337, 46304, 0, + 32768, 40960, 45056, 46080, 46336, 46337, 46304, 46306, + 0, 32768, 40960, 45056, 46080, 46336, 46337, 46304, + 0, 32768, 40960, 45056, 46080, 46336, 46337, 46304, + 46308, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46304, 46308, 0, 32768, 40960, 45056, 46080, 46336, + 46337, 46304, 46312, 46310, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46304, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46304, 46312, 0, 32768, 40960, + 45056, 46080, 46336, 46337, 46304, 46312, 0, 32768, + 40960, 45056, 46080, 46336, 46337, 46304, 46312, 46314, + 0, 32768, 40960, 45056, 46080, 46336, 46337, 46304, + 46312, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46304, 46320, 46316, 0, 32768, 40960, 45056, 46080, + 46336, 46337, 46304, 46320, 46316, 0, 32768, 40960, + 45056, 46080, 46336, 46337, 46304, 46320, 46321, 46318, + 0, 32768, 40960, 45056, 46080, 46336, 46337, 46304, + 0, 32768, 40960, 45056, 46080, 46336, 46337, 46304, + 46320, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46339, 46320, 0, 32768, 40960, 45056, 46080, 46336, + 46337, 46339, 46320, 46322, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46339, 46320, 0, 32768, 40960, + 45056, 46080, 46336, 46337, 46339, 46320, 46324, 0, + 32768, 40960, 45056, 46080, 46336, 46337, 46339, 46320, + 46324, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46339, 46320, 46328, 46326, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46339, 46320, 0, 32768, 40960, + 45056, 46080, 46336, 46337, 46339, 46320, 46328, 0, + 32768, 40960, 45056, 46080, 46336, 46337, 46339, 46320, + 46328, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46339, 46320, 46328, 46330, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46339, 46343, 46328, 0, 32768, + 40960, 45056, 46080, 46336, 46337, 46339, 46343, 46328, + 46332, 0, 32768, 40960, 45056, 46080, 46336, 46337, + 46339, 46343, 46328, 46332, 0, 32768, 40960, 45056, + 46080, 46336, 46337, 46339, 46343, 46328, 46332, 46334, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 46080, 46336, 0, 32768, 40960, 45056, 46080, + 46336, 0, 32768, 40960, 45056, 46080, 46336, 46338, + 0, 32768, 40960, 45056, 46080, 46336, 0, 32768, + 40960, 45056, 46080, 46336, 46340, 0, 32768, 40960, + 45056, 46080, 46336, 46340, 0, 32768, 40960, 45056, + 46080, 46336, 46344, 46342, 0, 32768, 40960, 45056, + 46080, 46336, 0, 32768, 40960, 45056, 46080, 46336, + 46344, 0, 32768, 40960, 45056, 46080, 46336, 46344, + 0, 32768, 40960, 45056, 46080, 46336, 46344, 46346, + 0, 32768, 40960, 45056, 46080, 46336, 46344, 0, + 32768, 40960, 45056, 46080, 46336, 46352, 46348, 0, + 32768, 40960, 45056, 46080, 46336, 46352, 46348, 0, + 32768, 40960, 45056, 46080, 46336, 46352, 46353, 46350, + 0, 32768, 40960, 45056, 46080, 46336, 0, 32768, + 40960, 45056, 46080, 46336, 46352, 0, 32768, 40960, + 45056, 46080, 46336, 46352, 0, 32768, 40960, 45056, + 46080, 46336, 46352, 46354, 0, 32768, 40960, 45056, + 46080, 46336, 46352, 0, 32768, 40960, 45056, 46080, + 46336, 46352, 46356, 0, 32768, 40960, 45056, 46080, + 46336, 46352, 46356, 0, 32768, 40960, 45056, 46080, + 46336, 46352, 46360, 46358, 0, 32768, 40960, 45056, + 46080, 46336, 46352, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46360, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46360, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46360, 46362, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 46360, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 46369, 46364, 0, 32768, 40960, + 45056, 46080, 46336, 46368, 46369, 46364, 0, 32768, + 40960, 45056, 46080, 46336, 46368, 46369, 46364, 46366, + 0, 32768, 40960, 45056, 46080, 46336, 0, 32768, + 40960, 45056, 46080, 46336, 46368, 0, 32768, 40960, + 45056, 46080, 46336, 46368, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 46370, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46372, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46372, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46376, 46374, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46376, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46376, 0, 32768, 40960, 45056, 46080, + 46336, 46368, 46376, 46378, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 46376, 0, 32768, 40960, 45056, + 46080, 46336, 46368, 46384, 46380, 0, 32768, 40960, + 45056, 46080, 46336, 46368, 46384, 46380, 0, 32768, + 40960, 45056, 46080, 46336, 46368, 46384, 46385, 46382, + 0, 32768, 40960, 45056, 46080, 46336, 46368, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46384, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46384, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46384, 46386, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46384, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46384, + 46388, 0, 32768, 40960, 45056, 46080, 46336, 46400, + 46384, 46388, 0, 32768, 40960, 45056, 46080, 46336, + 46400, 46384, 46392, 46390, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46384, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46401, 46392, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 46401, 46392, 0, 32768, + 40960, 45056, 46080, 46336, 46400, 46401, 46392, 46394, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46401, + 46392, 0, 32768, 40960, 45056, 46080, 46336, 46400, + 46401, 46392, 46396, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46401, 46403, 46396, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 46401, 46403, 46396, 46398, + 0, 32768, 40960, 45056, 46080, 46336, 0, 32768, + 40960, 45056, 46080, 46336, 46400, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46402, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46404, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46404, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46408, 46406, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46408, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46408, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46408, 46410, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46408, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46416, 46412, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 46416, 46412, 0, 32768, + 40960, 45056, 46080, 46336, 46400, 46416, 46417, 46414, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46416, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46416, 0, + 32768, 40960, 45056, 46080, 46336, 46400, 46416, 46418, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46416, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46416, + 46420, 0, 32768, 40960, 45056, 46080, 46336, 46400, + 46416, 46420, 0, 32768, 40960, 45056, 46080, 46336, + 46400, 46416, 46424, 46422, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46416, 0, 32768, 40960, 45056, + 46080, 46336, 46400, 46432, 46424, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 46432, 46424, 0, 32768, + 40960, 45056, 46080, 46336, 46400, 46432, 46424, 46426, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 46432, + 46424, 0, 32768, 40960, 45056, 46080, 46336, 46400, + 46432, 46433, 46428, 0, 32768, 40960, 45056, 46080, + 46336, 46400, 46432, 46433, 46428, 0, 32768, 40960, + 45056, 46080, 46336, 46400, 46432, 46433, 46428, 46430, + 0, 32768, 40960, 45056, 46080, 46336, 46400, 0, + 32768, 40960, 45056, 46080, 46336, 46464, 46432, 0, + 32768, 40960, 45056, 46080, 46336, 46464, 46432, 0, + 32768, 40960, 45056, 46080, 46336, 46464, 46432, 46434, + 0, 32768, 40960, 45056, 46080, 46336, 46464, 46432, + 0, 32768, 40960, 45056, 46080, 46336, 46464, 46432, + 46436, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46432, 46436, 0, 32768, 40960, 45056, 46080, 46336, + 46464, 46432, 46440, 46438, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46432, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46432, 46440, 0, 32768, 40960, + 45056, 46080, 46336, 46464, 46432, 46440, 0, 32768, + 40960, 45056, 46080, 46336, 46464, 46432, 46440, 46442, + 0, 32768, 40960, 45056, 46080, 46336, 46464, 46432, + 46440, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46432, 46448, 46444, 0, 32768, 40960, 45056, 46080, + 46336, 46464, 46432, 46448, 46444, 0, 32768, 40960, + 45056, 46080, 46336, 46464, 46432, 46448, 46449, 46446, + 0, 32768, 40960, 45056, 46080, 46336, 46464, 46432, + 0, 32768, 40960, 45056, 46080, 46336, 46464, 46465, + 46448, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46465, 46448, 0, 32768, 40960, 45056, 46080, 46336, + 46464, 46465, 46448, 46450, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46465, 46448, 0, 32768, 40960, + 45056, 46080, 46336, 46464, 46465, 46448, 46452, 0, + 32768, 40960, 45056, 46080, 46336, 46464, 46465, 46448, + 46452, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46465, 46448, 46456, 46454, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46465, 46448, 0, 32768, 40960, + 45056, 46080, 46336, 46464, 46465, 46448, 46456, 0, + 32768, 40960, 45056, 46080, 46336, 46464, 46465, 46467, + 46456, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46465, 46467, 46456, 46458, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46465, 46467, 46456, 0, 32768, + 40960, 45056, 46080, 46336, 46464, 46465, 46467, 46456, + 46460, 0, 32768, 40960, 45056, 46080, 46336, 46464, + 46465, 46467, 46456, 46460, 0, 32768, 40960, 45056, + 46080, 46336, 46464, 46465, 46467, 46456, 46460, 46462, + 0, 32768, 40960, 45056, 46080, 46336, 0, 32768, + 40960, 45056, 46080, 46592, 46464, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46466, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46468, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46468, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46472, 46470, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46472, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46472, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46472, 46474, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46472, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46480, 46476, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46480, 46476, 0, 32768, + 40960, 45056, 46080, 46592, 46464, 46480, 46481, 46478, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46480, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46480, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46480, 46482, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46480, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46480, + 46484, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46480, 46484, 0, 32768, 40960, 45056, 46080, 46592, + 46464, 46480, 46488, 46486, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46480, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46496, 46488, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46496, 46488, 0, 32768, + 40960, 45056, 46080, 46592, 46464, 46496, 46488, 46490, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46496, + 46488, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46496, 46497, 46492, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46496, 46497, 46492, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46496, 46497, 46492, 46494, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46496, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46496, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46496, 46498, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46496, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46496, + 46500, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46496, 46500, 0, 32768, 40960, 45056, 46080, 46592, + 46464, 46496, 46504, 46502, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46496, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46496, 46504, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46496, 46504, 0, 32768, + 40960, 45056, 46080, 46592, 46464, 46496, 46504, 46506, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46496, + 46504, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46496, 46512, 46508, 0, 32768, 40960, 45056, 46080, + 46592, 46464, 46496, 46512, 46508, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46496, 46512, 46513, 46510, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46496, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 46528, + 46512, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46528, 46512, 0, 32768, 40960, 45056, 46080, 46592, + 46464, 46528, 46512, 46514, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46528, 46512, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46528, 46512, 46516, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46528, 46512, + 46516, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46528, 46512, 46520, 46518, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46528, 46512, 0, 32768, 40960, + 45056, 46080, 46592, 46464, 46528, 46529, 46520, 0, + 32768, 40960, 45056, 46080, 46592, 46464, 46528, 46529, + 46520, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46528, 46529, 46520, 46522, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46528, 46529, 46520, 0, 32768, + 40960, 45056, 46080, 46592, 46464, 46528, 46529, 46520, + 46524, 0, 32768, 40960, 45056, 46080, 46592, 46464, + 46528, 46529, 46531, 46524, 0, 32768, 40960, 45056, + 46080, 46592, 46464, 46528, 46529, 46531, 46524, 46526, + 0, 32768, 40960, 45056, 46080, 46592, 46464, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46528, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46528, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46528, 46530, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 46532, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46532, 0, 32768, 40960, 45056, 46080, 46592, + 46593, 46528, 46536, 46534, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 46536, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46528, 46536, 0, 32768, + 40960, 45056, 46080, 46592, 46593, 46528, 46536, 46538, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 46536, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46544, 46540, 0, 32768, 40960, 45056, 46080, + 46592, 46593, 46528, 46544, 46540, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46528, 46544, 46545, 46542, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 46544, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46544, 0, 32768, 40960, 45056, 46080, 46592, + 46593, 46528, 46544, 46546, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 46544, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46528, 46544, 46548, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46528, 46544, + 46548, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46544, 46552, 46550, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 46544, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46528, 46560, 46552, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46528, 46560, + 46552, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46560, 46552, 46554, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 46560, 46552, 0, 32768, + 40960, 45056, 46080, 46592, 46593, 46528, 46560, 46561, + 46556, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46528, 46560, 46561, 46556, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46528, 46560, 46561, 46556, 46558, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46528, + 46560, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46560, 0, 32768, 40960, 45056, 46080, 46592, + 46593, 46595, 46560, 46562, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46560, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46595, 46560, 46564, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46595, 46560, + 46564, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46560, 46568, 46566, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46560, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46595, 46560, 46568, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46595, 46560, + 46568, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46560, 46568, 46570, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46560, 46568, 0, 32768, + 40960, 45056, 46080, 46592, 46593, 46595, 46560, 46576, + 46572, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46560, 46576, 46572, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46560, 46576, 46577, 46574, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46595, + 46560, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46560, 46576, 0, 32768, 40960, 45056, 46080, + 46592, 46593, 46595, 46560, 46576, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46595, 46560, 46576, 46578, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46595, + 46599, 46576, 0, 32768, 40960, 45056, 46080, 46592, + 46593, 46595, 46599, 46576, 46580, 0, 32768, 40960, + 45056, 46080, 46592, 46593, 46595, 46599, 46576, 46580, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46595, + 46599, 46576, 46584, 46582, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46599, 46576, 0, 32768, + 40960, 45056, 46080, 46592, 46593, 46595, 46599, 46576, + 46584, 0, 32768, 40960, 45056, 46080, 46592, 46593, + 46595, 46599, 46576, 46584, 0, 32768, 40960, 45056, + 46080, 46592, 46593, 46595, 46599, 46576, 46584, 46586, + 0, 32768, 40960, 45056, 46080, 46592, 46593, 46595, + 46599, 46576, 46584, 0, 32768, 40960, 45056, 46080, + 46592, 46593, 46595, 46599, 46576, 46584, 46588, 0, + 32768, 40960, 45056, 46080, 46592, 46593, 46595, 46599, + 46576, 46584, 46588, 0, 32768, 40960, 45056, 46080, + 46592, 46593, 46595, 46599, 46576, 46584, 46588, 46590, + 0, 32768, 40960, 45056, 46080, 0, 32768, 40960, + 45056, 47104, 46592, 0, 32768, 40960, 45056, 47104, + 46592, 0, 32768, 40960, 45056, 47104, 46592, 46594, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46596, 0, 32768, 40960, + 45056, 47104, 46592, 46596, 0, 32768, 40960, 45056, + 47104, 46592, 46600, 46598, 0, 32768, 40960, 45056, + 47104, 46592, 0, 32768, 40960, 45056, 47104, 46592, + 46600, 0, 32768, 40960, 45056, 47104, 46592, 46600, + 0, 32768, 40960, 45056, 47104, 46592, 46600, 46602, + 0, 32768, 40960, 45056, 47104, 46592, 46600, 0, + 32768, 40960, 45056, 47104, 46592, 46608, 46604, 0, + 32768, 40960, 45056, 47104, 46592, 46608, 46604, 0, + 32768, 40960, 45056, 47104, 46592, 46608, 46609, 46606, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46608, 0, 32768, 40960, + 45056, 47104, 46592, 46608, 0, 32768, 40960, 45056, + 47104, 46592, 46608, 46610, 0, 32768, 40960, 45056, + 47104, 46592, 46608, 0, 32768, 40960, 45056, 47104, + 46592, 46608, 46612, 0, 32768, 40960, 45056, 47104, + 46592, 46608, 46612, 0, 32768, 40960, 45056, 47104, + 46592, 46608, 46616, 46614, 0, 32768, 40960, 45056, + 47104, 46592, 46608, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46616, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46616, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46616, 46618, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 46616, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 46625, 46620, 0, 32768, 40960, + 45056, 47104, 46592, 46624, 46625, 46620, 0, 32768, + 40960, 45056, 47104, 46592, 46624, 46625, 46620, 46622, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46624, 0, 32768, 40960, + 45056, 47104, 46592, 46624, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 46626, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46628, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46628, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46632, 46630, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46632, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46632, 0, 32768, 40960, 45056, 47104, + 46592, 46624, 46632, 46634, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 46632, 0, 32768, 40960, 45056, + 47104, 46592, 46624, 46640, 46636, 0, 32768, 40960, + 45056, 47104, 46592, 46624, 46640, 46636, 0, 32768, + 40960, 45056, 47104, 46592, 46624, 46640, 46641, 46638, + 0, 32768, 40960, 45056, 47104, 46592, 46624, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46640, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46640, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46640, 46642, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46640, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46640, + 46644, 0, 32768, 40960, 45056, 47104, 46592, 46656, + 46640, 46644, 0, 32768, 40960, 45056, 47104, 46592, + 46656, 46640, 46648, 46646, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46640, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46657, 46648, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 46657, 46648, 0, 32768, + 40960, 45056, 47104, 46592, 46656, 46657, 46648, 46650, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46657, + 46648, 0, 32768, 40960, 45056, 47104, 46592, 46656, + 46657, 46648, 46652, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46657, 46659, 46652, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 46657, 46659, 46652, 46654, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46656, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46658, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46660, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46660, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46664, 46662, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46664, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46664, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46664, 46666, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46664, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46672, 46668, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 46672, 46668, 0, 32768, + 40960, 45056, 47104, 46592, 46656, 46672, 46673, 46670, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46672, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46672, 0, + 32768, 40960, 45056, 47104, 46592, 46656, 46672, 46674, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46672, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46672, + 46676, 0, 32768, 40960, 45056, 47104, 46592, 46656, + 46672, 46676, 0, 32768, 40960, 45056, 47104, 46592, + 46656, 46672, 46680, 46678, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46672, 0, 32768, 40960, 45056, + 47104, 46592, 46656, 46688, 46680, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 46688, 46680, 0, 32768, + 40960, 45056, 47104, 46592, 46656, 46688, 46680, 46682, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 46688, + 46680, 0, 32768, 40960, 45056, 47104, 46592, 46656, + 46688, 46689, 46684, 0, 32768, 40960, 45056, 47104, + 46592, 46656, 46688, 46689, 46684, 0, 32768, 40960, + 45056, 47104, 46592, 46656, 46688, 46689, 46684, 46686, + 0, 32768, 40960, 45056, 47104, 46592, 46656, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46688, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46688, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46688, 46690, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46688, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46688, + 46692, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46688, 46692, 0, 32768, 40960, 45056, 47104, 46592, + 46720, 46688, 46696, 46694, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46688, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46688, 46696, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46688, 46696, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46688, 46696, 46698, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46688, + 46696, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46688, 46704, 46700, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46688, 46704, 46700, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46688, 46704, 46705, 46702, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46688, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46721, + 46704, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46721, 46704, 0, 32768, 40960, 45056, 47104, 46592, + 46720, 46721, 46704, 46706, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46721, 46704, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46721, 46704, 46708, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46721, 46704, + 46708, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46721, 46704, 46712, 46710, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46721, 46704, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46721, 46704, 46712, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46721, 46723, + 46712, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46721, 46723, 46712, 46714, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46721, 46723, 46712, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46721, 46723, 46712, + 46716, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46721, 46723, 46712, 46716, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46721, 46723, 46712, 46716, 46718, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46722, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46724, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46724, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46728, 46726, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46728, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46728, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46728, 46730, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46728, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46736, 46732, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46736, 46732, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46736, 46737, 46734, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46736, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46736, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46736, 46738, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46736, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46736, + 46740, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46736, 46740, 0, 32768, 40960, 45056, 47104, 46592, + 46720, 46736, 46744, 46742, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46736, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46752, 46744, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46752, 46744, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46752, 46744, 46746, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46752, + 46744, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46752, 46753, 46748, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46752, 46753, 46748, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46752, 46753, 46748, 46750, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46752, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46752, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46752, 46754, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46752, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46752, + 46756, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46752, 46756, 0, 32768, 40960, 45056, 47104, 46592, + 46720, 46752, 46760, 46758, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46752, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46752, 46760, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46752, 46760, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46752, 46760, 46762, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46752, + 46760, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46752, 46768, 46764, 0, 32768, 40960, 45056, 47104, + 46592, 46720, 46752, 46768, 46764, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46752, 46768, 46769, 46766, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46752, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 46784, + 46768, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46784, 46768, 0, 32768, 40960, 45056, 47104, 46592, + 46720, 46784, 46768, 46770, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46784, 46768, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46784, 46768, 46772, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46784, 46768, + 46772, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46784, 46768, 46776, 46774, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46784, 46768, 0, 32768, 40960, + 45056, 47104, 46592, 46720, 46784, 46785, 46776, 0, + 32768, 40960, 45056, 47104, 46592, 46720, 46784, 46785, + 46776, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46784, 46785, 46776, 46778, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46784, 46785, 46776, 0, 32768, + 40960, 45056, 47104, 46592, 46720, 46784, 46785, 46776, + 46780, 0, 32768, 40960, 45056, 47104, 46592, 46720, + 46784, 46785, 46787, 46780, 0, 32768, 40960, 45056, + 47104, 46592, 46720, 46784, 46785, 46787, 46780, 46782, + 0, 32768, 40960, 45056, 47104, 46592, 46720, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46784, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46784, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46784, 46786, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 46788, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46788, 0, 32768, 40960, 45056, 47104, 46592, + 46848, 46784, 46792, 46790, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 46792, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46784, 46792, 0, 32768, + 40960, 45056, 47104, 46592, 46848, 46784, 46792, 46794, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 46792, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46800, 46796, 0, 32768, 40960, 45056, 47104, + 46592, 46848, 46784, 46800, 46796, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46784, 46800, 46801, 46798, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 46800, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46800, 0, 32768, 40960, 45056, 47104, 46592, + 46848, 46784, 46800, 46802, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 46800, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46784, 46800, 46804, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46784, 46800, + 46804, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46800, 46808, 46806, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 46800, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46784, 46816, 46808, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46784, 46816, + 46808, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46816, 46808, 46810, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 46816, 46808, 0, 32768, + 40960, 45056, 47104, 46592, 46848, 46784, 46816, 46817, + 46812, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46784, 46816, 46817, 46812, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46784, 46816, 46817, 46812, 46814, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46784, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46849, + 46816, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46816, 0, 32768, 40960, 45056, 47104, 46592, + 46848, 46849, 46816, 46818, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46816, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46849, 46816, 46820, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46849, 46816, + 46820, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46816, 46824, 46822, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46816, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46849, 46816, 46824, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46849, 46816, + 46824, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46816, 46824, 46826, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46816, 46824, 0, 32768, + 40960, 45056, 47104, 46592, 46848, 46849, 46816, 46832, + 46828, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46816, 46832, 46828, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46816, 46832, 46833, 46830, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46849, + 46816, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46816, 46832, 0, 32768, 40960, 45056, 47104, + 46592, 46848, 46849, 46851, 46832, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46849, 46851, 46832, 46834, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46849, + 46851, 46832, 0, 32768, 40960, 45056, 47104, 46592, + 46848, 46849, 46851, 46832, 46836, 0, 32768, 40960, + 45056, 47104, 46592, 46848, 46849, 46851, 46832, 46836, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46849, + 46851, 46832, 46840, 46838, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46851, 46832, 0, 32768, + 40960, 45056, 47104, 46592, 46848, 46849, 46851, 46832, + 46840, 0, 32768, 40960, 45056, 47104, 46592, 46848, + 46849, 46851, 46832, 46840, 0, 32768, 40960, 45056, + 47104, 46592, 46848, 46849, 46851, 46832, 46840, 46842, + 0, 32768, 40960, 45056, 47104, 46592, 46848, 46849, + 46851, 46855, 46840, 0, 32768, 40960, 45056, 47104, + 46592, 46848, 46849, 46851, 46855, 46840, 46844, 0, + 32768, 40960, 45056, 47104, 46592, 46848, 46849, 46851, + 46855, 46840, 46844, 0, 32768, 40960, 45056, 47104, + 46592, 46848, 46849, 46851, 46855, 46840, 46844, 46846, + 0, 32768, 40960, 45056, 47104, 46592, 0, 32768, + 40960, 45056, 47104, 46592, 46848, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46850, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46852, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46852, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46856, 46854, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46856, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46856, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46856, 46858, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46856, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46864, 46860, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46864, 46860, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46864, 46865, 46862, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46864, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46864, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46864, 46866, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46864, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46864, + 46868, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46864, 46868, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46864, 46872, 46870, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46864, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46880, 46872, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46880, 46872, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46880, 46872, 46874, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46880, + 46872, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46880, 46881, 46876, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46880, 46881, 46876, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46880, 46881, 46876, 46878, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46880, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46880, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46880, 46882, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46880, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46880, + 46884, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46880, 46884, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46880, 46888, 46886, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46880, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46880, 46888, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46880, 46888, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46880, 46888, 46890, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46880, + 46888, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46880, 46896, 46892, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46880, 46896, 46892, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46880, 46896, 46897, 46894, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46880, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 46896, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46896, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46912, 46896, 46898, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46896, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46896, 46900, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 46896, + 46900, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46896, 46904, 46902, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46896, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46913, 46904, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 46913, + 46904, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46913, 46904, 46906, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46913, 46904, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46912, 46913, 46904, + 46908, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46913, 46915, 46908, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46913, 46915, 46908, 46910, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 46914, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 46916, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46916, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46912, 46920, 46918, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46920, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46920, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46912, 46920, 46922, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 46920, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46928, 46924, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46912, 46928, 46924, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46928, 46929, 46926, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 46928, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46928, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46912, 46928, 46930, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46928, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46928, 46932, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 46928, + 46932, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46928, 46936, 46934, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46928, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46912, 46944, 46936, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46912, 46944, + 46936, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46944, 46936, 46938, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46944, 46936, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46912, 46944, 46945, + 46940, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46912, 46944, 46945, 46940, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46912, 46944, 46945, 46940, 46942, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46912, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46976, + 46944, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46944, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46976, 46944, 46946, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46944, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46976, 46944, 46948, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 46944, + 46948, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46944, 46952, 46950, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46944, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46976, 46944, 46952, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 46944, + 46952, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46944, 46952, 46954, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46944, 46952, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46976, 46944, 46960, + 46956, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46944, 46960, 46956, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46944, 46960, 46961, 46958, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46976, + 46944, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46977, 46960, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46976, 46977, 46960, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46976, 46977, 46960, 46962, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46976, + 46977, 46960, 0, 32768, 40960, 45056, 47104, 47105, + 46848, 46976, 46977, 46960, 46964, 0, 32768, 40960, + 45056, 47104, 47105, 46848, 46976, 46977, 46960, 46964, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46976, + 46977, 46960, 46968, 46966, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46977, 46960, 0, 32768, + 40960, 45056, 47104, 47105, 46848, 46976, 46977, 46960, + 46968, 0, 32768, 40960, 45056, 47104, 47105, 46848, + 46976, 46977, 46979, 46968, 0, 32768, 40960, 45056, + 47104, 47105, 46848, 46976, 46977, 46979, 46968, 46970, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 46976, + 46977, 46979, 46968, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46976, 46977, 46979, 46968, 46972, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 46977, + 46979, 46968, 46972, 0, 32768, 40960, 45056, 47104, + 47105, 46848, 46976, 46977, 46979, 46968, 46972, 46974, + 0, 32768, 40960, 45056, 47104, 47105, 46848, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 0, + 32768, 40960, 45056, 47104, 47105, 46848, 46976, 46978, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 46980, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 46980, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 46976, 46984, 46982, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 46984, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 46984, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 46976, 46984, 46986, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 46984, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 46992, 46988, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 46976, 46992, 46988, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 46992, 46993, 46990, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 46992, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 46992, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 46976, 46992, 46994, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 46992, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 46992, 46996, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 46992, + 46996, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 46992, 47000, 46998, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 46992, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47008, 47000, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 47008, + 47000, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 47000, 47002, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 47000, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 46976, 47008, 47009, + 47004, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 47009, 47004, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 47009, 47004, 47006, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47008, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 46976, 47008, 47010, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47008, 47012, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 47008, + 47012, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 47016, 47014, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47008, 47016, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 47008, + 47016, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 47016, 47018, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 47016, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 46976, 47008, 47024, + 47020, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47008, 47024, 47020, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47008, 47024, 47025, 47022, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47008, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47040, 47024, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 46976, 47040, 47024, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47040, 47024, 47026, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47040, 47024, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 46976, 47040, 47024, 47028, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47040, 47024, 47028, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47040, 47024, 47032, 47030, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47040, 47024, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 46976, 47040, 47041, + 47032, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47040, 47041, 47032, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47040, 47041, 47032, 47034, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47040, 47041, 47032, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 46976, 47040, 47041, 47032, 47036, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 47040, + 47041, 47043, 47036, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 46976, 47040, 47041, 47043, 47036, 47038, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 46976, + 47040, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47040, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 46976, 47040, 47042, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 46976, 47040, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 46976, 47040, 47044, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 46976, 47040, + 47044, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 46976, 47040, 47048, 47046, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47040, 47048, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47040, + 47048, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47048, 47050, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47048, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 47111, 47040, 47056, + 47052, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47056, 47052, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47056, 47057, 47054, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47056, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47056, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47040, 47056, 47058, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47056, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 47111, 47040, 47056, 47060, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47040, 47056, 47060, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47056, 47064, 47062, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47056, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 47111, 47040, 47072, + 47064, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47072, 47064, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47072, 47064, 47066, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47072, 47064, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47072, 47073, 47068, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47040, + 47072, 47073, 47068, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47072, 47073, 47068, 47070, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47072, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47072, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47040, 47072, 47074, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47072, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 47111, 47040, 47072, 47076, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47040, 47072, 47076, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47072, 47080, 47078, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47072, 0, 32768, + 40960, 45056, 47104, 47105, 47107, 47111, 47040, 47072, + 47080, 0, 32768, 40960, 45056, 47104, 47105, 47107, + 47111, 47040, 47072, 47080, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47040, 47072, 47080, 47082, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47040, 47072, 47080, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47072, 47088, 47084, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47040, + 47072, 47088, 47084, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47040, 47072, 47088, 47089, 47086, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47119, 47072, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 47111, 47119, 47072, 47088, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47119, 47072, 47088, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47119, 47072, 47088, 47090, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47119, 47072, 47088, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47119, + 47072, 47088, 47092, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47119, 47072, 47088, 47092, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47119, + 47072, 47088, 47096, 47094, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47119, 47072, 47088, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47119, + 47072, 47088, 47096, 0, 32768, 40960, 45056, 47104, + 47105, 47107, 47111, 47119, 47072, 47088, 47096, 0, + 32768, 40960, 45056, 47104, 47105, 47107, 47111, 47119, + 47072, 47088, 47096, 47098, 0, 32768, 40960, 45056, + 47104, 47105, 47107, 47111, 47119, 47072, 47088, 47096, + 0, 32768, 40960, 45056, 47104, 47105, 47107, 47111, + 47119, 47072, 47088, 47096, 47100, 0, 32768, 40960, + 45056, 47104, 47105, 47107, 47111, 47119, 47072, 47088, + 47096, 47100, 0, 32768, 40960, 45056, 47104, 47105, + 47107, 47111, 47119, 47072, 47088, 47096, 47100, 47102, + 0, 32768, 40960, 45056, 0, 32768, 40960, 45056, + 47104, 0, 32768, 40960, 45056, 47104, 0, 32768, + 40960, 45056, 47104, 47106, 0, 32768, 40960, 45056, + 47104, 0, 32768, 40960, 45056, 47104, 47108, 0, + 32768, 40960, 45056, 47104, 47108, 0, 32768, 40960, + 45056, 47104, 47112, 47110, 0, 32768, 40960, 45056, + 47104, 0, 32768, 40960, 45056, 47104, 47112, 0, + 32768, 40960, 45056, 47104, 47112, 0, 32768, 40960, + 45056, 47104, 47112, 47114, 0, 32768, 40960, 45056, + 47104, 47112, 0, 32768, 40960, 45056, 47104, 47120, + 47116, 0, 32768, 40960, 45056, 47104, 47120, 47116, + 0, 32768, 40960, 45056, 47104, 47120, 47121, 47118, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47120, 0, 32768, 40960, 45056, 47104, + 47120, 0, 32768, 40960, 45056, 47104, 47120, 47122, + 0, 32768, 40960, 45056, 47104, 47120, 0, 32768, + 40960, 45056, 47104, 47120, 47124, 0, 32768, 40960, + 45056, 47104, 47120, 47124, 0, 32768, 40960, 45056, + 47104, 47120, 47128, 47126, 0, 32768, 40960, 45056, + 47104, 47120, 0, 32768, 40960, 45056, 47104, 47136, + 47128, 0, 32768, 40960, 45056, 47104, 47136, 47128, + 0, 32768, 40960, 45056, 47104, 47136, 47128, 47130, + 0, 32768, 40960, 45056, 47104, 47136, 47128, 0, + 32768, 40960, 45056, 47104, 47136, 47137, 47132, 0, + 32768, 40960, 45056, 47104, 47136, 47137, 47132, 0, + 32768, 40960, 45056, 47104, 47136, 47137, 47132, 47134, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47136, 0, 32768, 40960, 45056, 47104, + 47136, 0, 32768, 40960, 45056, 47104, 47136, 47138, + 0, 32768, 40960, 45056, 47104, 47136, 0, 32768, + 40960, 45056, 47104, 47136, 47140, 0, 32768, 40960, + 45056, 47104, 47136, 47140, 0, 32768, 40960, 45056, + 47104, 47136, 47144, 47142, 0, 32768, 40960, 45056, + 47104, 47136, 0, 32768, 40960, 45056, 47104, 47136, + 47144, 0, 32768, 40960, 45056, 47104, 47136, 47144, + 0, 32768, 40960, 45056, 47104, 47136, 47144, 47146, + 0, 32768, 40960, 45056, 47104, 47136, 47144, 0, + 32768, 40960, 45056, 47104, 47136, 47152, 47148, 0, + 32768, 40960, 45056, 47104, 47136, 47152, 47148, 0, + 32768, 40960, 45056, 47104, 47136, 47152, 47153, 47150, + 0, 32768, 40960, 45056, 47104, 47136, 0, 32768, + 40960, 45056, 47104, 47168, 47152, 0, 32768, 40960, + 45056, 47104, 47168, 47152, 0, 32768, 40960, 45056, + 47104, 47168, 47152, 47154, 0, 32768, 40960, 45056, + 47104, 47168, 47152, 0, 32768, 40960, 45056, 47104, + 47168, 47152, 47156, 0, 32768, 40960, 45056, 47104, + 47168, 47152, 47156, 0, 32768, 40960, 45056, 47104, + 47168, 47152, 47160, 47158, 0, 32768, 40960, 45056, + 47104, 47168, 47152, 0, 32768, 40960, 45056, 47104, + 47168, 47169, 47160, 0, 32768, 40960, 45056, 47104, + 47168, 47169, 47160, 0, 32768, 40960, 45056, 47104, + 47168, 47169, 47160, 47162, 0, 32768, 40960, 45056, + 47104, 47168, 47169, 47160, 0, 32768, 40960, 45056, + 47104, 47168, 47169, 47160, 47164, 0, 32768, 40960, + 45056, 47104, 47168, 47169, 47171, 47164, 0, 32768, + 40960, 45056, 47104, 47168, 47169, 47171, 47164, 47166, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47168, 0, 32768, 40960, 45056, 47104, + 47168, 0, 32768, 40960, 45056, 47104, 47168, 47170, + 0, 32768, 40960, 45056, 47104, 47168, 0, 32768, + 40960, 45056, 47104, 47168, 47172, 0, 32768, 40960, + 45056, 47104, 47168, 47172, 0, 32768, 40960, 45056, + 47104, 47168, 47176, 47174, 0, 32768, 40960, 45056, + 47104, 47168, 0, 32768, 40960, 45056, 47104, 47168, + 47176, 0, 32768, 40960, 45056, 47104, 47168, 47176, + 0, 32768, 40960, 45056, 47104, 47168, 47176, 47178, + 0, 32768, 40960, 45056, 47104, 47168, 47176, 0, + 32768, 40960, 45056, 47104, 47168, 47184, 47180, 0, + 32768, 40960, 45056, 47104, 47168, 47184, 47180, 0, + 32768, 40960, 45056, 47104, 47168, 47184, 47185, 47182, + 0, 32768, 40960, 45056, 47104, 47168, 0, 32768, + 40960, 45056, 47104, 47168, 47184, 0, 32768, 40960, + 45056, 47104, 47168, 47184, 0, 32768, 40960, 45056, + 47104, 47168, 47184, 47186, 0, 32768, 40960, 45056, + 47104, 47168, 47184, 0, 32768, 40960, 45056, 47104, + 47168, 47184, 47188, 0, 32768, 40960, 45056, 47104, + 47168, 47184, 47188, 0, 32768, 40960, 45056, 47104, + 47168, 47184, 47192, 47190, 0, 32768, 40960, 45056, + 47104, 47168, 47184, 0, 32768, 40960, 45056, 47104, + 47168, 47200, 47192, 0, 32768, 40960, 45056, 47104, + 47168, 47200, 47192, 0, 32768, 40960, 45056, 47104, + 47168, 47200, 47192, 47194, 0, 32768, 40960, 45056, + 47104, 47168, 47200, 47192, 0, 32768, 40960, 45056, + 47104, 47168, 47200, 47201, 47196, 0, 32768, 40960, + 45056, 47104, 47168, 47200, 47201, 47196, 0, 32768, + 40960, 45056, 47104, 47168, 47200, 47201, 47196, 47198, + 0, 32768, 40960, 45056, 47104, 47168, 0, 32768, + 40960, 45056, 47104, 47232, 47200, 0, 32768, 40960, + 45056, 47104, 47232, 47200, 0, 32768, 40960, 45056, + 47104, 47232, 47200, 47202, 0, 32768, 40960, 45056, + 47104, 47232, 47200, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47204, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47204, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47208, 47206, 0, 32768, 40960, 45056, + 47104, 47232, 47200, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47208, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47208, 0, 32768, 40960, 45056, 47104, + 47232, 47200, 47208, 47210, 0, 32768, 40960, 45056, + 47104, 47232, 47200, 47208, 0, 32768, 40960, 45056, + 47104, 47232, 47200, 47216, 47212, 0, 32768, 40960, + 45056, 47104, 47232, 47200, 47216, 47212, 0, 32768, + 40960, 45056, 47104, 47232, 47200, 47216, 47217, 47214, + 0, 32768, 40960, 45056, 47104, 47232, 47200, 0, + 32768, 40960, 45056, 47104, 47232, 47233, 47216, 0, + 32768, 40960, 45056, 47104, 47232, 47233, 47216, 0, + 32768, 40960, 45056, 47104, 47232, 47233, 47216, 47218, + 0, 32768, 40960, 45056, 47104, 47232, 47233, 47216, + 0, 32768, 40960, 45056, 47104, 47232, 47233, 47216, + 47220, 0, 32768, 40960, 45056, 47104, 47232, 47233, + 47216, 47220, 0, 32768, 40960, 45056, 47104, 47232, + 47233, 47216, 47224, 47222, 0, 32768, 40960, 45056, + 47104, 47232, 47233, 47216, 0, 32768, 40960, 45056, + 47104, 47232, 47233, 47216, 47224, 0, 32768, 40960, + 45056, 47104, 47232, 47233, 47235, 47224, 0, 32768, + 40960, 45056, 47104, 47232, 47233, 47235, 47224, 47226, + 0, 32768, 40960, 45056, 47104, 47232, 47233, 47235, + 47224, 0, 32768, 40960, 45056, 47104, 47232, 47233, + 47235, 47224, 47228, 0, 32768, 40960, 45056, 47104, + 47232, 47233, 47235, 47224, 47228, 0, 32768, 40960, + 45056, 47104, 47232, 47233, 47235, 47224, 47228, 47230, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47232, 0, 32768, 40960, 45056, 47104, + 47232, 0, 32768, 40960, 45056, 47104, 47232, 47234, + 0, 32768, 40960, 45056, 47104, 47232, 0, 32768, + 40960, 45056, 47104, 47232, 47236, 0, 32768, 40960, + 45056, 47104, 47232, 47236, 0, 32768, 40960, 45056, + 47104, 47232, 47240, 47238, 0, 32768, 40960, 45056, + 47104, 47232, 0, 32768, 40960, 45056, 47104, 47232, + 47240, 0, 32768, 40960, 45056, 47104, 47232, 47240, + 0, 32768, 40960, 45056, 47104, 47232, 47240, 47242, + 0, 32768, 40960, 45056, 47104, 47232, 47240, 0, + 32768, 40960, 45056, 47104, 47232, 47248, 47244, 0, + 32768, 40960, 45056, 47104, 47232, 47248, 47244, 0, + 32768, 40960, 45056, 47104, 47232, 47248, 47249, 47246, + 0, 32768, 40960, 45056, 47104, 47232, 0, 32768, + 40960, 45056, 47104, 47232, 47248, 0, 32768, 40960, + 45056, 47104, 47232, 47248, 0, 32768, 40960, 45056, + 47104, 47232, 47248, 47250, 0, 32768, 40960, 45056, + 47104, 47232, 47248, 0, 32768, 40960, 45056, 47104, + 47232, 47248, 47252, 0, 32768, 40960, 45056, 47104, + 47232, 47248, 47252, 0, 32768, 40960, 45056, 47104, + 47232, 47248, 47256, 47254, 0, 32768, 40960, 45056, + 47104, 47232, 47248, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47256, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47256, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47256, 47258, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 47256, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 47265, 47260, 0, 32768, 40960, + 45056, 47104, 47232, 47264, 47265, 47260, 0, 32768, + 40960, 45056, 47104, 47232, 47264, 47265, 47260, 47262, + 0, 32768, 40960, 45056, 47104, 47232, 0, 32768, + 40960, 45056, 47104, 47232, 47264, 0, 32768, 40960, + 45056, 47104, 47232, 47264, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 47266, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47268, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47268, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47272, 47270, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47272, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47272, 0, 32768, 40960, 45056, 47104, + 47232, 47264, 47272, 47274, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 47272, 0, 32768, 40960, 45056, + 47104, 47232, 47264, 47280, 47276, 0, 32768, 40960, + 45056, 47104, 47232, 47264, 47280, 47276, 0, 32768, + 40960, 45056, 47104, 47232, 47264, 47280, 47281, 47278, + 0, 32768, 40960, 45056, 47104, 47232, 47264, 0, + 32768, 40960, 45056, 47104, 47232, 47296, 47280, 0, + 32768, 40960, 45056, 47104, 47232, 47296, 47280, 0, + 32768, 40960, 45056, 47104, 47232, 47296, 47280, 47282, + 0, 32768, 40960, 45056, 47104, 47232, 47296, 47280, + 0, 32768, 40960, 45056, 47104, 47232, 47296, 47280, + 47284, 0, 32768, 40960, 45056, 47104, 47232, 47296, + 47280, 47284, 0, 32768, 40960, 45056, 47104, 47232, + 47296, 47280, 47288, 47286, 0, 32768, 40960, 45056, + 47104, 47232, 47296, 47280, 0, 32768, 40960, 45056, + 47104, 47232, 47296, 47297, 47288, 0, 32768, 40960, + 45056, 47104, 47232, 47296, 47297, 47288, 0, 32768, + 40960, 45056, 47104, 47232, 47296, 47297, 47288, 47290, + 0, 32768, 40960, 45056, 47104, 47232, 47296, 47297, + 47288, 0, 32768, 40960, 45056, 47104, 47232, 47296, + 47297, 47288, 47292, 0, 32768, 40960, 45056, 47104, + 47232, 47296, 47297, 47299, 47292, 0, 32768, 40960, + 45056, 47104, 47232, 47296, 47297, 47299, 47292, 47294, + 0, 32768, 40960, 45056, 47104, 47232, 0, 32768, + 40960, 45056, 47104, 47360, 47296, 0, 32768, 40960, + 45056, 47104, 47360, 47296, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 47298, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47300, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47300, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47304, 47302, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47304, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47304, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47304, 47306, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 47304, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 47312, 47308, 0, 32768, 40960, + 45056, 47104, 47360, 47296, 47312, 47308, 0, 32768, + 40960, 45056, 47104, 47360, 47296, 47312, 47313, 47310, + 0, 32768, 40960, 45056, 47104, 47360, 47296, 0, + 32768, 40960, 45056, 47104, 47360, 47296, 47312, 0, + 32768, 40960, 45056, 47104, 47360, 47296, 47312, 0, + 32768, 40960, 45056, 47104, 47360, 47296, 47312, 47314, + 0, 32768, 40960, 45056, 47104, 47360, 47296, 47312, + 0, 32768, 40960, 45056, 47104, 47360, 47296, 47312, + 47316, 0, 32768, 40960, 45056, 47104, 47360, 47296, + 47312, 47316, 0, 32768, 40960, 45056, 47104, 47360, + 47296, 47312, 47320, 47318, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 47312, 0, 32768, 40960, 45056, + 47104, 47360, 47296, 47328, 47320, 0, 32768, 40960, + 45056, 47104, 47360, 47296, 47328, 47320, 0, 32768, + 40960, 45056, 47104, 47360, 47296, 47328, 47320, 47322, + 0, 32768, 40960, 45056, 47104, 47360, 47296, 47328, + 47320, 0, 32768, 40960, 45056, 47104, 47360, 47296, + 47328, 47329, 47324, 0, 32768, 40960, 45056, 47104, + 47360, 47296, 47328, 47329, 47324, 0, 32768, 40960, + 45056, 47104, 47360, 47296, 47328, 47329, 47324, 47326, + 0, 32768, 40960, 45056, 47104, 47360, 47296, 0, + 32768, 40960, 45056, 47104, 47360, 47361, 47328, 0, + 32768, 40960, 45056, 47104, 47360, 47361, 47328, 0, + 32768, 40960, 45056, 47104, 47360, 47361, 47328, 47330, + 0, 32768, 40960, 45056, 47104, 47360, 47361, 47328, + 0, 32768, 40960, 45056, 47104, 47360, 47361, 47328, + 47332, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47328, 47332, 0, 32768, 40960, 45056, 47104, 47360, + 47361, 47328, 47336, 47334, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47328, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47328, 47336, 0, 32768, 40960, + 45056, 47104, 47360, 47361, 47328, 47336, 0, 32768, + 40960, 45056, 47104, 47360, 47361, 47328, 47336, 47338, + 0, 32768, 40960, 45056, 47104, 47360, 47361, 47328, + 47336, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47328, 47344, 47340, 0, 32768, 40960, 45056, 47104, + 47360, 47361, 47328, 47344, 47340, 0, 32768, 40960, + 45056, 47104, 47360, 47361, 47328, 47344, 47345, 47342, + 0, 32768, 40960, 45056, 47104, 47360, 47361, 47328, + 0, 32768, 40960, 45056, 47104, 47360, 47361, 47328, + 47344, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47363, 47344, 0, 32768, 40960, 45056, 47104, 47360, + 47361, 47363, 47344, 47346, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47363, 47344, 0, 32768, 40960, + 45056, 47104, 47360, 47361, 47363, 47344, 47348, 0, + 32768, 40960, 45056, 47104, 47360, 47361, 47363, 47344, + 47348, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47363, 47344, 47352, 47350, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47363, 47344, 0, 32768, 40960, + 45056, 47104, 47360, 47361, 47363, 47344, 47352, 0, + 32768, 40960, 45056, 47104, 47360, 47361, 47363, 47344, + 47352, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47363, 47344, 47352, 47354, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47363, 47367, 47352, 0, 32768, + 40960, 45056, 47104, 47360, 47361, 47363, 47367, 47352, + 47356, 0, 32768, 40960, 45056, 47104, 47360, 47361, + 47363, 47367, 47352, 47356, 0, 32768, 40960, 45056, + 47104, 47360, 47361, 47363, 47367, 47352, 47356, 47358, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47360, 0, 32768, 40960, 45056, 47104, + 47360, 0, 32768, 40960, 45056, 47104, 47360, 47362, + 0, 32768, 40960, 45056, 47104, 47360, 0, 32768, + 40960, 45056, 47104, 47360, 47364, 0, 32768, 40960, + 45056, 47104, 47360, 47364, 0, 32768, 40960, 45056, + 47104, 47360, 47368, 47366, 0, 32768, 40960, 45056, + 47104, 47360, 0, 32768, 40960, 45056, 47104, 47360, + 47368, 0, 32768, 40960, 45056, 47104, 47360, 47368, + 0, 32768, 40960, 45056, 47104, 47360, 47368, 47370, + 0, 32768, 40960, 45056, 47104, 47360, 47368, 0, + 32768, 40960, 45056, 47104, 47360, 47376, 47372, 0, + 32768, 40960, 45056, 47104, 47360, 47376, 47372, 0, + 32768, 40960, 45056, 47104, 47360, 47376, 47377, 47374, + 0, 32768, 40960, 45056, 47104, 47360, 0, 32768, + 40960, 45056, 47104, 47360, 47376, 0, 32768, 40960, + 45056, 47104, 47360, 47376, 0, 32768, 40960, 45056, + 47104, 47360, 47376, 47378, 0, 32768, 40960, 45056, + 47104, 47360, 47376, 0, 32768, 40960, 45056, 47104, + 47360, 47376, 47380, 0, 32768, 40960, 45056, 47104, + 47360, 47376, 47380, 0, 32768, 40960, 45056, 47104, + 47360, 47376, 47384, 47382, 0, 32768, 40960, 45056, + 47104, 47360, 47376, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47384, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47384, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47384, 47386, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 47384, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 47393, 47388, 0, 32768, 40960, + 45056, 47104, 47360, 47392, 47393, 47388, 0, 32768, + 40960, 45056, 47104, 47360, 47392, 47393, 47388, 47390, + 0, 32768, 40960, 45056, 47104, 47360, 0, 32768, + 40960, 45056, 47104, 47360, 47392, 0, 32768, 40960, + 45056, 47104, 47360, 47392, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 47394, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47396, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47396, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47400, 47398, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47400, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47400, 0, 32768, 40960, 45056, 47104, + 47360, 47392, 47400, 47402, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 47400, 0, 32768, 40960, 45056, + 47104, 47360, 47392, 47408, 47404, 0, 32768, 40960, + 45056, 47104, 47360, 47392, 47408, 47404, 0, 32768, + 40960, 45056, 47104, 47360, 47392, 47408, 47409, 47406, + 0, 32768, 40960, 45056, 47104, 47360, 47392, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47408, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47408, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47408, 47410, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47408, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47408, + 47412, 0, 32768, 40960, 45056, 47104, 47360, 47424, + 47408, 47412, 0, 32768, 40960, 45056, 47104, 47360, + 47424, 47408, 47416, 47414, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47408, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47425, 47416, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 47425, 47416, 0, 32768, + 40960, 45056, 47104, 47360, 47424, 47425, 47416, 47418, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47425, + 47416, 0, 32768, 40960, 45056, 47104, 47360, 47424, + 47425, 47416, 47420, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47425, 47427, 47420, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 47425, 47427, 47420, 47422, + 0, 32768, 40960, 45056, 47104, 47360, 0, 32768, + 40960, 45056, 47104, 47360, 47424, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47426, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47428, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47428, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47432, 47430, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47432, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47432, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47432, 47434, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47432, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47440, 47436, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 47440, 47436, 0, 32768, + 40960, 45056, 47104, 47360, 47424, 47440, 47441, 47438, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47440, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47440, 0, + 32768, 40960, 45056, 47104, 47360, 47424, 47440, 47442, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47440, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47440, + 47444, 0, 32768, 40960, 45056, 47104, 47360, 47424, + 47440, 47444, 0, 32768, 40960, 45056, 47104, 47360, + 47424, 47440, 47448, 47446, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47440, 0, 32768, 40960, 45056, + 47104, 47360, 47424, 47456, 47448, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 47456, 47448, 0, 32768, + 40960, 45056, 47104, 47360, 47424, 47456, 47448, 47450, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 47456, + 47448, 0, 32768, 40960, 45056, 47104, 47360, 47424, + 47456, 47457, 47452, 0, 32768, 40960, 45056, 47104, + 47360, 47424, 47456, 47457, 47452, 0, 32768, 40960, + 45056, 47104, 47360, 47424, 47456, 47457, 47452, 47454, + 0, 32768, 40960, 45056, 47104, 47360, 47424, 0, + 32768, 40960, 45056, 47104, 47360, 47488, 47456, 0, + 32768, 40960, 45056, 47104, 47360, 47488, 47456, 0, + 32768, 40960, 45056, 47104, 47360, 47488, 47456, 47458, + 0, 32768, 40960, 45056, 47104, 47360, 47488, 47456, + 0, 32768, 40960, 45056, 47104, 47360, 47488, 47456, + 47460, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47456, 47460, 0, 32768, 40960, 45056, 47104, 47360, + 47488, 47456, 47464, 47462, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47456, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47456, 47464, 0, 32768, 40960, + 45056, 47104, 47360, 47488, 47456, 47464, 0, 32768, + 40960, 45056, 47104, 47360, 47488, 47456, 47464, 47466, + 0, 32768, 40960, 45056, 47104, 47360, 47488, 47456, + 47464, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47456, 47472, 47468, 0, 32768, 40960, 45056, 47104, + 47360, 47488, 47456, 47472, 47468, 0, 32768, 40960, + 45056, 47104, 47360, 47488, 47456, 47472, 47473, 47470, + 0, 32768, 40960, 45056, 47104, 47360, 47488, 47456, + 0, 32768, 40960, 45056, 47104, 47360, 47488, 47489, + 47472, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47489, 47472, 0, 32768, 40960, 45056, 47104, 47360, + 47488, 47489, 47472, 47474, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47489, 47472, 0, 32768, 40960, + 45056, 47104, 47360, 47488, 47489, 47472, 47476, 0, + 32768, 40960, 45056, 47104, 47360, 47488, 47489, 47472, + 47476, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47489, 47472, 47480, 47478, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47489, 47472, 0, 32768, 40960, + 45056, 47104, 47360, 47488, 47489, 47472, 47480, 0, + 32768, 40960, 45056, 47104, 47360, 47488, 47489, 47491, + 47480, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47489, 47491, 47480, 47482, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47489, 47491, 47480, 0, 32768, + 40960, 45056, 47104, 47360, 47488, 47489, 47491, 47480, + 47484, 0, 32768, 40960, 45056, 47104, 47360, 47488, + 47489, 47491, 47480, 47484, 0, 32768, 40960, 45056, + 47104, 47360, 47488, 47489, 47491, 47480, 47484, 47486, + 0, 32768, 40960, 45056, 47104, 47360, 0, 32768, + 40960, 45056, 47104, 47616, 47488, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47490, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47492, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47492, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47496, 47494, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47496, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47496, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47496, 47498, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47496, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47504, 47500, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47504, 47500, 0, 32768, + 40960, 45056, 47104, 47616, 47488, 47504, 47505, 47502, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47504, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47504, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47504, 47506, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47504, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47504, + 47508, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47504, 47508, 0, 32768, 40960, 45056, 47104, 47616, + 47488, 47504, 47512, 47510, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47504, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47520, 47512, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47520, 47512, 0, 32768, + 40960, 45056, 47104, 47616, 47488, 47520, 47512, 47514, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47520, + 47512, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47520, 47521, 47516, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47520, 47521, 47516, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47520, 47521, 47516, 47518, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47520, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47520, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47520, 47522, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47520, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47520, + 47524, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47520, 47524, 0, 32768, 40960, 45056, 47104, 47616, + 47488, 47520, 47528, 47526, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47520, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47520, 47528, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47520, 47528, 0, 32768, + 40960, 45056, 47104, 47616, 47488, 47520, 47528, 47530, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47520, + 47528, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47520, 47536, 47532, 0, 32768, 40960, 45056, 47104, + 47616, 47488, 47520, 47536, 47532, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47520, 47536, 47537, 47534, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47520, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 47552, + 47536, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47552, 47536, 0, 32768, 40960, 45056, 47104, 47616, + 47488, 47552, 47536, 47538, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47552, 47536, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47552, 47536, 47540, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47552, 47536, + 47540, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47552, 47536, 47544, 47542, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47552, 47536, 0, 32768, 40960, + 45056, 47104, 47616, 47488, 47552, 47553, 47544, 0, + 32768, 40960, 45056, 47104, 47616, 47488, 47552, 47553, + 47544, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47552, 47553, 47544, 47546, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47552, 47553, 47544, 0, 32768, + 40960, 45056, 47104, 47616, 47488, 47552, 47553, 47544, + 47548, 0, 32768, 40960, 45056, 47104, 47616, 47488, + 47552, 47553, 47555, 47548, 0, 32768, 40960, 45056, + 47104, 47616, 47488, 47552, 47553, 47555, 47548, 47550, + 0, 32768, 40960, 45056, 47104, 47616, 47488, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47552, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47552, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47552, 47554, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 47556, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47556, 0, 32768, 40960, 45056, 47104, 47616, + 47617, 47552, 47560, 47558, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 47560, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47552, 47560, 0, 32768, + 40960, 45056, 47104, 47616, 47617, 47552, 47560, 47562, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 47560, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47568, 47564, 0, 32768, 40960, 45056, 47104, + 47616, 47617, 47552, 47568, 47564, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47552, 47568, 47569, 47566, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 47568, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47568, 0, 32768, 40960, 45056, 47104, 47616, + 47617, 47552, 47568, 47570, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 47568, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47552, 47568, 47572, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47552, 47568, + 47572, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47568, 47576, 47574, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 47568, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47552, 47584, 47576, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47552, 47584, + 47576, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47584, 47576, 47578, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 47584, 47576, 0, 32768, + 40960, 45056, 47104, 47616, 47617, 47552, 47584, 47585, + 47580, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47552, 47584, 47585, 47580, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47552, 47584, 47585, 47580, 47582, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47552, + 47584, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47584, 0, 32768, 40960, 45056, 47104, 47616, + 47617, 47619, 47584, 47586, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47584, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47619, 47584, 47588, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47619, 47584, + 47588, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47584, 47592, 47590, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47584, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47619, 47584, 47592, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47619, 47584, + 47592, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47584, 47592, 47594, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47584, 47592, 0, 32768, + 40960, 45056, 47104, 47616, 47617, 47619, 47584, 47600, + 47596, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47584, 47600, 47596, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47584, 47600, 47601, 47598, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47619, + 47584, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47584, 47600, 0, 32768, 40960, 45056, 47104, + 47616, 47617, 47619, 47584, 47600, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47619, 47584, 47600, 47602, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47619, + 47623, 47600, 0, 32768, 40960, 45056, 47104, 47616, + 47617, 47619, 47623, 47600, 47604, 0, 32768, 40960, + 45056, 47104, 47616, 47617, 47619, 47623, 47600, 47604, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47619, + 47623, 47600, 47608, 47606, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47623, 47600, 0, 32768, + 40960, 45056, 47104, 47616, 47617, 47619, 47623, 47600, + 47608, 0, 32768, 40960, 45056, 47104, 47616, 47617, + 47619, 47623, 47600, 47608, 0, 32768, 40960, 45056, + 47104, 47616, 47617, 47619, 47623, 47600, 47608, 47610, + 0, 32768, 40960, 45056, 47104, 47616, 47617, 47619, + 47623, 47600, 47608, 0, 32768, 40960, 45056, 47104, + 47616, 47617, 47619, 47623, 47600, 47608, 47612, 0, + 32768, 40960, 45056, 47104, 47616, 47617, 47619, 47623, + 47600, 47608, 47612, 0, 32768, 40960, 45056, 47104, + 47616, 47617, 47619, 47623, 47600, 47608, 47612, 47614, + 0, 32768, 40960, 45056, 47104, 0, 32768, 40960, + 45056, 47104, 47616, 0, 32768, 40960, 45056, 47104, + 47616, 0, 32768, 40960, 45056, 47104, 47616, 47618, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 47616, 47620, 0, 32768, 40960, + 45056, 47104, 47616, 47620, 0, 32768, 40960, 45056, + 47104, 47616, 47624, 47622, 0, 32768, 40960, 45056, + 47104, 47616, 0, 32768, 40960, 45056, 47104, 47616, + 47624, 0, 32768, 40960, 45056, 47104, 47616, 47624, + 0, 32768, 40960, 45056, 47104, 47616, 47624, 47626, + 0, 32768, 40960, 45056, 47104, 47616, 47624, 0, + 32768, 40960, 45056, 47104, 47616, 47632, 47628, 0, + 32768, 40960, 45056, 47104, 47616, 47632, 47628, 0, + 32768, 40960, 45056, 47104, 47616, 47632, 47633, 47630, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 47616, 47632, 0, 32768, 40960, + 45056, 47104, 47616, 47632, 0, 32768, 40960, 45056, + 47104, 47616, 47632, 47634, 0, 32768, 40960, 45056, + 47104, 47616, 47632, 0, 32768, 40960, 45056, 47104, + 47616, 47632, 47636, 0, 32768, 40960, 45056, 47104, + 47616, 47632, 47636, 0, 32768, 40960, 45056, 47104, + 47616, 47632, 47640, 47638, 0, 32768, 40960, 45056, + 47104, 47616, 47632, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47640, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47640, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47640, 47642, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 47640, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 47649, 47644, 0, 32768, 40960, + 45056, 47104, 47616, 47648, 47649, 47644, 0, 32768, + 40960, 45056, 47104, 47616, 47648, 47649, 47644, 47646, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 47616, 47648, 0, 32768, 40960, + 45056, 47104, 47616, 47648, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 47650, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47652, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47652, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47656, 47654, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47656, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47656, 0, 32768, 40960, 45056, 47104, + 47616, 47648, 47656, 47658, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 47656, 0, 32768, 40960, 45056, + 47104, 47616, 47648, 47664, 47660, 0, 32768, 40960, + 45056, 47104, 47616, 47648, 47664, 47660, 0, 32768, + 40960, 45056, 47104, 47616, 47648, 47664, 47665, 47662, + 0, 32768, 40960, 45056, 47104, 47616, 47648, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47664, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47664, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47664, 47666, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47664, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47664, + 47668, 0, 32768, 40960, 45056, 47104, 47616, 47680, + 47664, 47668, 0, 32768, 40960, 45056, 47104, 47616, + 47680, 47664, 47672, 47670, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47664, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47681, 47672, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 47681, 47672, 0, 32768, + 40960, 45056, 47104, 47616, 47680, 47681, 47672, 47674, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47681, + 47672, 0, 32768, 40960, 45056, 47104, 47616, 47680, + 47681, 47672, 47676, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47681, 47683, 47676, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 47681, 47683, 47676, 47678, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 47616, 47680, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47682, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47684, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47684, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47688, 47686, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47688, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47688, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47688, 47690, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47688, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47696, 47692, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 47696, 47692, 0, 32768, + 40960, 45056, 47104, 47616, 47680, 47696, 47697, 47694, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47696, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47696, 0, + 32768, 40960, 45056, 47104, 47616, 47680, 47696, 47698, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47696, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47696, + 47700, 0, 32768, 40960, 45056, 47104, 47616, 47680, + 47696, 47700, 0, 32768, 40960, 45056, 47104, 47616, + 47680, 47696, 47704, 47702, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47696, 0, 32768, 40960, 45056, + 47104, 47616, 47680, 47712, 47704, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 47712, 47704, 0, 32768, + 40960, 45056, 47104, 47616, 47680, 47712, 47704, 47706, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 47712, + 47704, 0, 32768, 40960, 45056, 47104, 47616, 47680, + 47712, 47713, 47708, 0, 32768, 40960, 45056, 47104, + 47616, 47680, 47712, 47713, 47708, 0, 32768, 40960, + 45056, 47104, 47616, 47680, 47712, 47713, 47708, 47710, + 0, 32768, 40960, 45056, 47104, 47616, 47680, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47712, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47712, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47712, 47714, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47712, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47712, + 47716, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47712, 47716, 0, 32768, 40960, 45056, 47104, 47616, + 47744, 47712, 47720, 47718, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47712, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47712, 47720, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47712, 47720, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47712, 47720, 47722, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47712, + 47720, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47712, 47728, 47724, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47712, 47728, 47724, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47712, 47728, 47729, 47726, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47712, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47745, + 47728, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47745, 47728, 0, 32768, 40960, 45056, 47104, 47616, + 47744, 47745, 47728, 47730, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47745, 47728, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47745, 47728, 47732, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47745, 47728, + 47732, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47745, 47728, 47736, 47734, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47745, 47728, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47745, 47728, 47736, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47745, 47747, + 47736, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47745, 47747, 47736, 47738, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47745, 47747, 47736, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47745, 47747, 47736, + 47740, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47745, 47747, 47736, 47740, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47745, 47747, 47736, 47740, 47742, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47746, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47748, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47748, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47752, 47750, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47752, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47752, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47752, 47754, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47752, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47760, 47756, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47760, 47756, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47760, 47761, 47758, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47760, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47760, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47760, 47762, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47760, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47760, + 47764, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47760, 47764, 0, 32768, 40960, 45056, 47104, 47616, + 47744, 47760, 47768, 47766, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47760, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47776, 47768, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47776, 47768, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47776, 47768, 47770, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47776, + 47768, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47776, 47777, 47772, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47776, 47777, 47772, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47776, 47777, 47772, 47774, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47776, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47776, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47776, 47778, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47776, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47776, + 47780, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47776, 47780, 0, 32768, 40960, 45056, 47104, 47616, + 47744, 47776, 47784, 47782, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47776, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47776, 47784, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47776, 47784, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47776, 47784, 47786, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47776, + 47784, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47776, 47792, 47788, 0, 32768, 40960, 45056, 47104, + 47616, 47744, 47776, 47792, 47788, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47776, 47792, 47793, 47790, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47776, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 47808, + 47792, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47808, 47792, 0, 32768, 40960, 45056, 47104, 47616, + 47744, 47808, 47792, 47794, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47808, 47792, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47808, 47792, 47796, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47808, 47792, + 47796, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47808, 47792, 47800, 47798, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47808, 47792, 0, 32768, 40960, + 45056, 47104, 47616, 47744, 47808, 47809, 47800, 0, + 32768, 40960, 45056, 47104, 47616, 47744, 47808, 47809, + 47800, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47808, 47809, 47800, 47802, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47808, 47809, 47800, 0, 32768, + 40960, 45056, 47104, 47616, 47744, 47808, 47809, 47800, + 47804, 0, 32768, 40960, 45056, 47104, 47616, 47744, + 47808, 47809, 47811, 47804, 0, 32768, 40960, 45056, + 47104, 47616, 47744, 47808, 47809, 47811, 47804, 47806, + 0, 32768, 40960, 45056, 47104, 47616, 47744, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47808, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47808, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47808, 47810, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 47812, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47812, 0, 32768, 40960, 45056, 47104, 47616, + 47872, 47808, 47816, 47814, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 47816, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47808, 47816, 0, 32768, + 40960, 45056, 47104, 47616, 47872, 47808, 47816, 47818, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 47816, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47824, 47820, 0, 32768, 40960, 45056, 47104, + 47616, 47872, 47808, 47824, 47820, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47808, 47824, 47825, 47822, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 47824, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47824, 0, 32768, 40960, 45056, 47104, 47616, + 47872, 47808, 47824, 47826, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 47824, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47808, 47824, 47828, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47808, 47824, + 47828, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47824, 47832, 47830, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 47824, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47808, 47840, 47832, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47808, 47840, + 47832, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47840, 47832, 47834, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 47840, 47832, 0, 32768, + 40960, 45056, 47104, 47616, 47872, 47808, 47840, 47841, + 47836, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47808, 47840, 47841, 47836, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47808, 47840, 47841, 47836, 47838, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47808, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47873, + 47840, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47840, 0, 32768, 40960, 45056, 47104, 47616, + 47872, 47873, 47840, 47842, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47840, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47873, 47840, 47844, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47873, 47840, + 47844, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47840, 47848, 47846, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47840, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47873, 47840, 47848, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47873, 47840, + 47848, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47840, 47848, 47850, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47840, 47848, 0, 32768, + 40960, 45056, 47104, 47616, 47872, 47873, 47840, 47856, + 47852, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47840, 47856, 47852, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47840, 47856, 47857, 47854, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47873, + 47840, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47840, 47856, 0, 32768, 40960, 45056, 47104, + 47616, 47872, 47873, 47875, 47856, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47873, 47875, 47856, 47858, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47873, + 47875, 47856, 0, 32768, 40960, 45056, 47104, 47616, + 47872, 47873, 47875, 47856, 47860, 0, 32768, 40960, + 45056, 47104, 47616, 47872, 47873, 47875, 47856, 47860, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47873, + 47875, 47856, 47864, 47862, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47875, 47856, 0, 32768, + 40960, 45056, 47104, 47616, 47872, 47873, 47875, 47856, + 47864, 0, 32768, 40960, 45056, 47104, 47616, 47872, + 47873, 47875, 47856, 47864, 0, 32768, 40960, 45056, + 47104, 47616, 47872, 47873, 47875, 47856, 47864, 47866, + 0, 32768, 40960, 45056, 47104, 47616, 47872, 47873, + 47875, 47879, 47864, 0, 32768, 40960, 45056, 47104, + 47616, 47872, 47873, 47875, 47879, 47864, 47868, 0, + 32768, 40960, 45056, 47104, 47616, 47872, 47873, 47875, + 47879, 47864, 47868, 0, 32768, 40960, 45056, 47104, + 47616, 47872, 47873, 47875, 47879, 47864, 47868, 47870, + 0, 32768, 40960, 45056, 47104, 47616, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47874, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47876, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47876, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47880, 47878, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47880, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47880, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47880, 47882, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47880, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47888, 47884, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47888, 47884, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47888, 47889, 47886, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47888, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47888, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47888, 47890, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47888, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47888, + 47892, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47888, 47892, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 47888, 47896, 47894, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47888, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47904, 47896, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47904, 47896, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47904, 47896, 47898, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47904, + 47896, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47904, 47905, 47900, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47904, 47905, 47900, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47904, 47905, 47900, 47902, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47904, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47904, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47904, 47906, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47904, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47904, + 47908, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47904, 47908, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 47904, 47912, 47910, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47904, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47904, 47912, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47904, 47912, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47904, 47912, 47914, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47904, + 47912, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47904, 47920, 47916, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47904, 47920, 47916, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47904, 47920, 47921, 47918, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47904, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 47920, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47920, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 47936, 47920, 47922, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47920, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47920, 47924, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 47920, + 47924, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47920, 47928, 47926, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47920, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47937, 47928, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 47937, + 47928, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47937, 47928, 47930, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47937, 47928, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47936, 47937, 47928, + 47932, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47937, 47939, 47932, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47937, 47939, 47932, 47934, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 47938, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 47940, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47940, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 47936, 47944, 47942, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47944, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47944, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47936, 47944, 47946, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 47944, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47952, 47948, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 47936, 47952, 47948, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47952, 47953, 47950, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 47952, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47952, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 47936, 47952, 47954, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47952, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47952, 47956, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 47952, + 47956, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47952, 47960, 47958, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47952, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 47936, 47968, 47960, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 47936, 47968, + 47960, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47968, 47960, 47962, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47968, 47960, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 47936, 47968, 47969, + 47964, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 47936, 47968, 47969, 47964, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 47936, 47968, 47969, 47964, 47966, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 47936, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 48000, + 47968, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 47968, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 48000, 47968, 47970, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 47968, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 48000, 47968, 47972, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 48000, 47968, + 47972, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 47968, 47976, 47974, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 47968, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 48000, 47968, 47976, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 48000, 47968, + 47976, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 47968, 47976, 47978, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 47968, 47976, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 48000, 47968, 47984, + 47980, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 47968, 47984, 47980, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 47968, 47984, 47985, 47982, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 48000, + 47968, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 48001, 47984, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 48000, 48001, 47984, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 48000, 48001, 47984, 47986, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 48000, + 48001, 47984, 0, 32768, 40960, 45056, 47104, 48128, + 47872, 48000, 48001, 47984, 47988, 0, 32768, 40960, + 45056, 47104, 48128, 47872, 48000, 48001, 47984, 47988, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 48000, + 48001, 47984, 47992, 47990, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 48001, 47984, 0, 32768, + 40960, 45056, 47104, 48128, 47872, 48000, 48001, 47984, + 47992, 0, 32768, 40960, 45056, 47104, 48128, 47872, + 48000, 48001, 48003, 47992, 0, 32768, 40960, 45056, + 47104, 48128, 47872, 48000, 48001, 48003, 47992, 47994, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 48000, + 48001, 48003, 47992, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 48000, 48001, 48003, 47992, 47996, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 48000, 48001, + 48003, 47992, 47996, 0, 32768, 40960, 45056, 47104, + 48128, 47872, 48000, 48001, 48003, 47992, 47996, 47998, + 0, 32768, 40960, 45056, 47104, 48128, 47872, 0, + 32768, 40960, 45056, 47104, 48128, 47872, 48000, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48002, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48004, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48004, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48000, 48008, 48006, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48008, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48008, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48000, 48008, 48010, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48008, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48016, 48012, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48000, 48016, 48012, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48016, 48017, 48014, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48016, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48016, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48000, 48016, 48018, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48016, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48016, 48020, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48016, + 48020, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48016, 48024, 48022, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48016, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48032, 48024, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48032, + 48024, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 48024, 48026, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 48024, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48000, 48032, 48033, + 48028, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 48033, 48028, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 48033, 48028, 48030, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48032, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48000, 48032, 48034, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48032, 48036, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48032, + 48036, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 48040, 48038, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48032, 48040, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48032, + 48040, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 48040, 48042, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 48040, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48000, 48032, 48048, + 48044, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48032, 48048, 48044, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48032, 48048, 48049, 48046, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48032, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48064, 48048, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48000, 48064, 48048, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48064, 48048, 48050, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48064, 48048, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48000, 48064, 48048, 48052, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48000, 48064, 48048, 48052, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48064, 48048, 48056, 48054, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48064, 48048, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48000, 48064, 48065, + 48056, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48064, 48065, 48056, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48000, 48064, 48065, 48056, 48058, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48064, 48065, 48056, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48000, 48064, 48065, 48056, 48060, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48000, 48064, + 48065, 48067, 48060, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48000, 48064, 48065, 48067, 48060, 48062, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48000, + 48064, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48000, 48064, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48000, 48064, 48066, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48068, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48064, + 48068, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48072, 48070, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48072, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48064, + 48072, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48072, 48074, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 48072, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48131, 48064, 48080, + 48076, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48080, 48076, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 48080, 48081, 48078, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48080, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48064, 48080, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48080, 48082, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 48080, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48131, 48064, 48080, 48084, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48080, 48084, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 48080, 48088, 48086, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 48080, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48131, 48064, 48096, + 48088, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48096, 48088, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48064, 48096, 48088, 48090, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 48096, 48088, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48064, 48096, 48097, 48092, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48064, + 48096, 48097, 48092, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48064, 48096, 48097, 48092, 48094, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48064, 48096, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48064, 48096, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48096, 48098, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 48096, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48131, 48064, 48096, 48100, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48064, 48096, 48100, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48064, 48096, 48104, 48102, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48135, 48096, 0, 32768, + 40960, 45056, 47104, 48128, 48129, 48131, 48135, 48096, + 48104, 0, 32768, 40960, 45056, 47104, 48128, 48129, + 48131, 48135, 48096, 48104, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48135, 48096, 48104, 48106, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48135, 48096, 48104, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48135, 48096, 48112, 48108, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48135, + 48096, 48112, 48108, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48135, 48096, 48112, 48113, 48110, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48135, 48096, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48131, 48135, 48096, 48112, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48135, 48096, 48112, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48135, 48096, 48112, 48114, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48135, 48096, 48112, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48135, + 48096, 48112, 48116, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48135, 48096, 48112, 48116, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48135, + 48096, 48112, 48120, 48118, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48135, 48096, 48112, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48135, + 48096, 48112, 48120, 0, 32768, 40960, 45056, 47104, + 48128, 48129, 48131, 48135, 48096, 48112, 48120, 0, + 32768, 40960, 45056, 47104, 48128, 48129, 48131, 48135, + 48096, 48112, 48120, 48122, 0, 32768, 40960, 45056, + 47104, 48128, 48129, 48131, 48135, 48096, 48112, 48120, + 0, 32768, 40960, 45056, 47104, 48128, 48129, 48131, + 48135, 48096, 48112, 48120, 48124, 0, 32768, 40960, + 45056, 47104, 48128, 48129, 48131, 48135, 48096, 48112, + 48120, 48124, 0, 32768, 40960, 45056, 47104, 48128, + 48129, 48131, 48135, 48096, 48112, 48120, 48124, 48126, + 0, 1, 40960, 45056, 47104, 0, 1, 40960, + 45056, 47104, 48128, 0, 1, 40960, 45056, 47104, + 48128, 0, 1, 40960, 45056, 47104, 48128, 48130, + 0, 1, 40960, 45056, 47104, 48128, 0, 1, + 49152, 45056, 47104, 48128, 48132, 0, 1, 49152, + 45056, 47104, 48128, 48132, 0, 1, 49152, 45056, + 47104, 48128, 48136, 48134, 0, 1, 49152, 45056, + 47104, 48128, 0, 1, 49152, 45056, 47104, 48128, + 48136, 0, 1, 49152, 45056, 47104, 48128, 48136, + 0, 1, 49152, 45056, 47104, 48128, 48136, 48138, + 0, 1, 49152, 45056, 47104, 48128, 48136, 0, + 1, 49152, 45056, 47104, 48128, 48144, 48140, 0, + 1, 49152, 45056, 47104, 48128, 48144, 48140, 0, + 1, 49152, 45056, 47104, 48128, 48144, 48145, 48142, + 0, 1, 49152, 45056, 47104, 48128, 0, 1, + 49152, 45056, 47104, 48128, 48144, 0, 1, 49152, + 45056, 47104, 48128, 48144, 0, 1, 49152, 45056, + 47104, 48128, 48144, 48146, 0, 1, 49152, 45056, + 47104, 48128, 48144, 0, 1, 49152, 45056, 47104, + 48128, 48144, 48148, 0, 1, 49152, 45056, 47104, + 48128, 48144, 48148, 0, 1, 49152, 45056, 47104, + 48128, 48144, 48152, 48150, 0, 1, 49152, 45056, + 47104, 48128, 48144, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48152, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48152, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48152, 48154, 0, 1, 49152, 45056, + 47104, 48128, 48160, 48152, 0, 1, 49152, 45056, + 47104, 48128, 48160, 48161, 48156, 0, 1, 49152, + 45056, 47104, 48128, 48160, 48161, 48156, 0, 1, + 49152, 45056, 47104, 48128, 48160, 48161, 48156, 48158, + 0, 1, 49152, 45056, 47104, 48128, 0, 1, + 49152, 45056, 47104, 48128, 48160, 0, 1, 49152, + 45056, 47104, 48128, 48160, 0, 1, 49152, 45056, + 47104, 48128, 48160, 48162, 0, 1, 49152, 45056, + 47104, 48128, 48160, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48164, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48164, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48168, 48166, 0, 1, 49152, 45056, + 47104, 48128, 48160, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48168, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48168, 0, 1, 49152, 45056, 47104, + 48128, 48160, 48168, 48170, 0, 1, 49152, 45056, + 47104, 48128, 48160, 48168, 0, 1, 49152, 45056, + 47104, 48128, 48160, 48176, 48172, 0, 1, 49152, + 45056, 47104, 48128, 48160, 48176, 48172, 0, 1, + 49152, 45056, 47104, 48128, 48160, 48176, 48177, 48174, + 0, 1, 49152, 45056, 47104, 48128, 48160, 0, + 1, 49152, 45056, 47104, 48128, 48192, 48176, 0, + 1, 49152, 45056, 47104, 48128, 48192, 48176, 0, + 1, 49152, 45056, 47104, 48128, 48192, 48176, 48178, + 0, 1, 49152, 45056, 47104, 48128, 48192, 48176, + 0, 1, 49152, 45056, 47104, 48128, 48192, 48176, + 48180, 0, 1, 49152, 45056, 47104, 48128, 48192, + 48176, 48180, 0, 1, 49152, 45056, 47104, 48128, + 48192, 48176, 48184, 48182, 0, 1, 49152, 45056, + 47104, 48128, 48192, 48176, 0, 1, 49152, 45056, + 47104, 48128, 48192, 48193, 48184, 0, 1, 49152, + 45056, 47104, 48128, 48192, 48193, 48184, 0, 1, + 49152, 45056, 47104, 48128, 48192, 48193, 48184, 48186, + 0, 1, 49152, 45056, 47104, 48128, 48192, 48193, + 48184, 0, 1, 49152, 45056, 47104, 48128, 48192, + 48193, 48184, 48188, 0, 1, 49152, 45056, 47104, + 48128, 48192, 48193, 48195, 48188, 0, 1, 49152, + 45056, 47104, 48128, 48192, 48193, 48195, 48188, 48190, + 0, 1, 49152, 45056, 47104, 48128, 0, 1, + 49152, 45056, 47104, 48128, 48192, 0, 1, 49152, + 49153, 47104, 48128, 48192, 0, 1, 49152, 49153, + 47104, 48128, 48192, 48194, 0, 1, 49152, 49153, + 47104, 48128, 48192, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48196, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48196, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48200, 48198, 0, 1, 49152, 49153, + 47104, 48128, 48192, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48200, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48200, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48200, 48202, 0, 1, 49152, 49153, + 47104, 48128, 48192, 48200, 0, 1, 49152, 49153, + 47104, 48128, 48192, 48208, 48204, 0, 1, 49152, + 49153, 47104, 48128, 48192, 48208, 48204, 0, 1, + 49152, 49153, 47104, 48128, 48192, 48208, 48209, 48206, + 0, 1, 49152, 49153, 47104, 48128, 48192, 0, + 1, 49152, 49153, 47104, 48128, 48192, 48208, 0, + 1, 49152, 49153, 47104, 48128, 48192, 48208, 0, + 1, 49152, 49153, 47104, 48128, 48192, 48208, 48210, + 0, 1, 49152, 49153, 47104, 48128, 48192, 48208, + 0, 1, 49152, 49153, 47104, 48128, 48192, 48208, + 48212, 0, 1, 49152, 49153, 47104, 48128, 48192, + 48208, 48212, 0, 1, 49152, 49153, 47104, 48128, + 48192, 48208, 48216, 48214, 0, 1, 49152, 49153, + 47104, 48128, 48192, 48208, 0, 1, 49152, 49153, + 47104, 48128, 48192, 48224, 48216, 0, 1, 49152, + 49153, 47104, 48128, 48192, 48224, 48216, 0, 1, + 49152, 49153, 47104, 48128, 48192, 48224, 48216, 48218, + 0, 1, 49152, 49153, 47104, 48128, 48192, 48224, + 48216, 0, 1, 49152, 49153, 47104, 48128, 48192, + 48224, 48225, 48220, 0, 1, 49152, 49153, 47104, + 48128, 48192, 48224, 48225, 48220, 0, 1, 49152, + 49153, 47104, 48128, 48192, 48224, 48225, 48220, 48222, + 0, 1, 49152, 49153, 47104, 48128, 48192, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48224, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48224, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48224, 48226, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48224, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48224, + 48228, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48224, 48228, 0, 1, 49152, 49153, 47104, 48128, + 48256, 48224, 48232, 48230, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48224, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48224, 48232, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48224, 48232, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48224, 48232, 48234, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48224, + 48232, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48224, 48240, 48236, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48224, 48240, 48236, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48224, 48240, 48241, 48238, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48224, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48257, + 48240, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48257, 48240, 0, 1, 49152, 49153, 47104, 48128, + 48256, 48257, 48240, 48242, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48257, 48240, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48257, 48240, 48244, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48257, 48240, + 48244, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48257, 48240, 48248, 48246, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48257, 48240, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48257, 48240, 48248, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48257, 48259, + 48248, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48257, 48259, 48248, 48250, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48257, 48259, 48248, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48257, 48259, 48248, + 48252, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48257, 48259, 48248, 48252, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48257, 48259, 48248, 48252, 48254, + 0, 1, 49152, 49153, 47104, 48128, 0, 1, + 49152, 49153, 47104, 48128, 48256, 0, 1, 49152, + 49153, 47104, 48128, 48256, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48258, 0, 1, 49152, 49153, + 47104, 48128, 48256, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48260, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48260, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48264, 48262, 0, 1, 49152, 49153, + 47104, 48128, 48256, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48264, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48264, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48264, 48266, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48264, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48272, 48268, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48272, 48268, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48272, 48273, 48270, + 0, 1, 49152, 49153, 47104, 48128, 48256, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48272, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48272, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48272, 48274, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48272, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48272, + 48276, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48272, 48276, 0, 1, 49152, 49153, 47104, 48128, + 48256, 48272, 48280, 48278, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48272, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48288, 48280, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48288, 48280, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48288, 48280, 48282, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48288, + 48280, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48288, 48289, 48284, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48288, 48289, 48284, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48288, 48289, 48284, 48286, + 0, 1, 49152, 49153, 47104, 48128, 48256, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48288, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48288, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48288, 48290, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48288, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48288, + 48292, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48288, 48292, 0, 1, 49152, 49153, 47104, 48128, + 48256, 48288, 48296, 48294, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48288, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48288, 48296, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48288, 48296, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48288, 48296, 48298, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48288, + 48296, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48288, 48304, 48300, 0, 1, 49152, 49153, 47104, + 48128, 48256, 48288, 48304, 48300, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48288, 48304, 48305, 48302, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48288, + 0, 1, 49152, 49153, 47104, 48128, 48256, 48320, + 48304, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48320, 48304, 0, 1, 49152, 49153, 47104, 48128, + 48256, 48320, 48304, 48306, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48320, 48304, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48320, 48304, 48308, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48320, 48304, + 48308, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48320, 48304, 48312, 48310, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48320, 48304, 0, 1, 49152, + 49153, 47104, 48128, 48256, 48320, 48321, 48312, 0, + 1, 49152, 49153, 47104, 48128, 48256, 48320, 48321, + 48312, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48320, 48321, 48312, 48314, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48320, 48321, 48312, 0, 1, + 49152, 49153, 47104, 48128, 48256, 48320, 48321, 48312, + 48316, 0, 1, 49152, 49153, 47104, 48128, 48256, + 48320, 48321, 48323, 48316, 0, 1, 49152, 49153, + 47104, 48128, 48256, 48320, 48321, 48323, 48316, 48318, + 0, 1, 49152, 49153, 47104, 48128, 48256, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48320, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48320, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48320, 48322, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 48324, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48324, 0, 1, 49152, 49153, 47104, 48128, + 48384, 48320, 48328, 48326, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 48328, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48320, 48328, 0, 1, + 49152, 49153, 47104, 48128, 48384, 48320, 48328, 48330, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 48328, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48336, 48332, 0, 1, 49152, 49153, 47104, + 48128, 48384, 48320, 48336, 48332, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48320, 48336, 48337, 48334, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 48336, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48336, 0, 1, 49152, 49153, 47104, 48128, + 48384, 48320, 48336, 48338, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 48336, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48320, 48336, 48340, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48320, 48336, + 48340, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48336, 48344, 48342, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 48336, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48320, 48352, 48344, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48320, 48352, + 48344, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48352, 48344, 48346, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 48352, 48344, 0, 1, + 49152, 49153, 47104, 48128, 48384, 48320, 48352, 48353, + 48348, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48320, 48352, 48353, 48348, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48320, 48352, 48353, 48348, 48350, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48320, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48385, + 48352, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48352, 0, 1, 49152, 49153, 47104, 48128, + 48384, 48385, 48352, 48354, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48352, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48385, 48352, 48356, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48385, 48352, + 48356, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48352, 48360, 48358, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48352, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48385, 48352, 48360, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48385, 48352, + 48360, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48352, 48360, 48362, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48352, 48360, 0, 1, + 49152, 49153, 47104, 48128, 48384, 48385, 48352, 48368, + 48364, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48352, 48368, 48364, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48352, 48368, 48369, 48366, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48385, + 48352, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48352, 48368, 0, 1, 49152, 49153, 47104, + 48128, 48384, 48385, 48387, 48368, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48385, 48387, 48368, 48370, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48385, + 48387, 48368, 0, 1, 49152, 49153, 47104, 48128, + 48384, 48385, 48387, 48368, 48372, 0, 1, 49152, + 49153, 47104, 48128, 48384, 48385, 48387, 48368, 48372, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48385, + 48387, 48368, 48376, 48374, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48387, 48368, 0, 1, + 49152, 49153, 47104, 48128, 48384, 48385, 48387, 48368, + 48376, 0, 1, 49152, 49153, 47104, 48128, 48384, + 48385, 48387, 48368, 48376, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48385, 48387, 48368, 48376, 48378, + 0, 1, 49152, 49153, 47104, 48128, 48384, 48385, + 48387, 48391, 48376, 0, 1, 49152, 49153, 47104, + 48128, 48384, 48385, 48387, 48391, 48376, 48380, 0, + 1, 49152, 49153, 47104, 48128, 48384, 48385, 48387, + 48391, 48376, 48380, 0, 1, 49152, 49153, 47104, + 48128, 48384, 48385, 48387, 48391, 48376, 48380, 48382, + 0, 1, 49152, 49153, 47104, 48128, 0, 1, + 49152, 49153, 47104, 48128, 48384, 0, 1, 49152, + 49153, 47104, 48128, 48384, 0, 1, 49152, 49153, + 47104, 48128, 48384, 48386, 0, 1, 49152, 49153, + 49155, 48128, 48384, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48388, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48388, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48392, 48390, 0, 1, 49152, 49153, + 49155, 48128, 48384, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48392, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48392, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48392, 48394, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48392, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48400, 48396, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48400, 48396, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48400, 48401, 48398, + 0, 1, 49152, 49153, 49155, 48128, 48384, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48400, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48400, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48400, 48402, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48400, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48400, + 48404, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48400, 48404, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48400, 48408, 48406, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48400, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48416, 48408, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48416, 48408, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48416, 48408, 48410, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48416, + 48408, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48416, 48417, 48412, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48416, 48417, 48412, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48416, 48417, 48412, 48414, + 0, 1, 49152, 49153, 49155, 48128, 48384, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48416, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48416, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48416, 48418, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48416, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48416, + 48420, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48416, 48420, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48416, 48424, 48422, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48416, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48416, 48424, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48416, 48424, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48416, 48424, 48426, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48416, + 48424, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48416, 48432, 48428, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48416, 48432, 48428, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48416, 48432, 48433, 48430, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48416, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 48432, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48432, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48448, 48432, 48434, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48432, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48432, 48436, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 48432, + 48436, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48432, 48440, 48438, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48432, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48449, 48440, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 48449, + 48440, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48449, 48440, 48442, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48449, 48440, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48448, 48449, 48440, + 48444, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48449, 48451, 48444, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48449, 48451, 48444, 48446, + 0, 1, 49152, 49153, 49155, 48128, 48384, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 48450, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 48452, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48452, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48448, 48456, 48454, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48456, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48456, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48448, 48456, 48458, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 48456, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48464, 48460, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48448, 48464, 48460, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48464, 48465, 48462, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 48464, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48464, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48448, 48464, 48466, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48464, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48464, 48468, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 48464, + 48468, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48464, 48472, 48470, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48464, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48448, 48480, 48472, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48448, 48480, + 48472, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48480, 48472, 48474, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48480, 48472, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48448, 48480, 48481, + 48476, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48448, 48480, 48481, 48476, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48448, 48480, 48481, 48476, 48478, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48448, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48512, + 48480, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48480, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48512, 48480, 48482, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48480, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48512, 48480, 48484, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48512, 48480, + 48484, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48480, 48488, 48486, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48480, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48512, 48480, 48488, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48512, 48480, + 48488, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48480, 48488, 48490, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48480, 48488, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48512, 48480, 48496, + 48492, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48480, 48496, 48492, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48480, 48496, 48497, 48494, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48512, + 48480, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48513, 48496, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48512, 48513, 48496, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48512, 48513, 48496, 48498, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48512, + 48513, 48496, 0, 1, 49152, 49153, 49155, 48128, + 48384, 48512, 48513, 48496, 48500, 0, 1, 49152, + 49153, 49155, 48128, 48384, 48512, 48513, 48496, 48500, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48512, + 48513, 48496, 48504, 48502, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48513, 48496, 0, 1, + 49152, 49153, 49155, 48128, 48384, 48512, 48513, 48496, + 48504, 0, 1, 49152, 49153, 49155, 48128, 48384, + 48512, 48513, 48515, 48504, 0, 1, 49152, 49153, + 49155, 48128, 48384, 48512, 48513, 48515, 48504, 48506, + 0, 1, 49152, 49153, 49155, 48128, 48384, 48512, + 48513, 48515, 48504, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48512, 48513, 48515, 48504, 48508, 0, + 1, 49152, 49153, 49155, 48128, 48384, 48512, 48513, + 48515, 48504, 48508, 0, 1, 49152, 49153, 49155, + 48128, 48384, 48512, 48513, 48515, 48504, 48508, 48510, + 0, 1, 49152, 49153, 49155, 48128, 48384, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48514, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48516, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48516, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48512, 48520, 48518, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48520, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48520, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48512, 48520, 48522, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48520, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48528, 48524, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48512, 48528, 48524, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48528, 48529, 48526, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48528, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48528, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48512, 48528, 48530, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48528, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48528, 48532, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48528, + 48532, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48528, 48536, 48534, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48528, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48544, 48536, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48544, + 48536, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 48536, 48538, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 48536, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48512, 48544, 48545, + 48540, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 48545, 48540, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 48545, 48540, 48542, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48544, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48512, 48544, 48546, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48544, 48548, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48544, + 48548, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 48552, 48550, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48544, 48552, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48544, + 48552, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 48552, 48554, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 48552, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48512, 48544, 48560, + 48556, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48544, 48560, 48556, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48544, 48560, 48561, 48558, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48544, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48576, 48560, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48512, 48576, 48560, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48576, 48560, 48562, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48576, 48560, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48512, 48576, 48560, 48564, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48512, 48576, 48560, 48564, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48576, 48560, 48568, 48566, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48576, 48560, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48512, 48576, 48577, + 48568, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48512, 48576, 48577, 48568, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48512, 48576, 48577, 48568, 48570, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 48576, 48577, 48568, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48512, 48576, 48577, 48568, 48572, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48512, 48576, + 48577, 48579, 48572, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48512, 48576, 48577, 48579, 48572, 48574, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48512, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48641, 48576, 48578, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48576, 48580, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48576, + 48580, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48584, 48582, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48576, 48584, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48576, + 48584, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48584, 48586, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 48584, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48641, 48576, 48592, + 48588, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48592, 48588, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 48592, 48593, 48590, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48592, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48576, 48592, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48576, 48592, 48594, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 48592, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48641, 48576, 48592, 48596, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48576, 48592, 48596, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 48592, 48600, 48598, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 48592, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48641, 48576, 48608, + 48600, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48608, 48600, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48576, 48608, 48600, 48602, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 48608, 48600, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48576, 48608, 48609, 48604, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48576, + 48608, 48609, 48604, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48576, 48608, 48609, 48604, 48606, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48576, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48576, 48608, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48643, 48608, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48643, 48608, 48610, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48608, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48641, 48643, 48608, 48612, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48643, 48608, 48612, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48608, 48616, 48614, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48643, 48608, 0, 1, + 49152, 49153, 49155, 48128, 48640, 48641, 48643, 48608, + 48616, 0, 1, 49152, 49153, 49155, 48128, 48640, + 48641, 48643, 48608, 48616, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48643, 48608, 48616, 48618, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48608, 48616, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48643, 48608, 48624, 48620, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48643, + 48608, 48624, 48620, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48643, 48608, 48624, 48625, 48622, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48608, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48641, 48643, 48608, 48624, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48643, 48608, 48624, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48608, 48624, 48626, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48643, 48647, 48624, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48643, + 48647, 48624, 48628, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48643, 48647, 48624, 48628, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48643, + 48647, 48624, 48632, 48630, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48643, 48647, 48624, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48643, + 48647, 48624, 48632, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48641, 48643, 48647, 48624, 48632, 0, + 1, 49152, 49153, 49155, 48128, 48640, 48641, 48643, + 48647, 48624, 48632, 48634, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48641, 48643, 48647, 48624, 48632, + 0, 1, 49152, 49153, 49155, 48128, 48640, 48641, + 48643, 48647, 48624, 48632, 48636, 0, 1, 49152, + 49153, 49155, 48128, 48640, 48641, 48643, 48647, 48624, + 48632, 48636, 0, 1, 49152, 49153, 49155, 48128, + 48640, 48641, 48643, 48647, 48624, 48632, 48636, 48638, + 0, 1, 49152, 49153, 49155, 48128, 0, 1, + 49152, 49153, 49155, 48128, 48640, 0, 1, 49152, + 49153, 49155, 48128, 48640, 0, 1, 49152, 49153, + 49155, 48128, 48640, 48642, 0, 1, 49152, 49153, + 49155, 48128, 48640, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48644, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48644, 0, 1, 49152, 49153, 49155, + 48128, 48640, 48648, 48646, 0, 1, 49152, 49153, + 49155, 49159, 48640, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48648, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48648, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48648, 48650, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48648, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48656, 48652, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48656, 48652, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48656, 48657, 48654, + 0, 1, 49152, 49153, 49155, 49159, 48640, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48656, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48656, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48656, 48658, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48656, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48656, + 48660, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48656, 48660, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48656, 48664, 48662, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48656, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48672, 48664, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48672, 48664, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48672, 48664, 48666, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48672, + 48664, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48672, 48673, 48668, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48672, 48673, 48668, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48672, 48673, 48668, 48670, + 0, 1, 49152, 49153, 49155, 49159, 48640, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48672, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48672, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48672, 48674, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48672, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48672, + 48676, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48672, 48676, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48672, 48680, 48678, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48672, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48672, 48680, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48672, 48680, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48672, 48680, 48682, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48672, + 48680, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48672, 48688, 48684, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48672, 48688, 48684, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48672, 48688, 48689, 48686, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48672, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 48688, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48688, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48704, 48688, 48690, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48688, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48688, 48692, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 48688, + 48692, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48688, 48696, 48694, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48688, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48705, 48696, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 48705, + 48696, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48705, 48696, 48698, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48705, 48696, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48704, 48705, 48696, + 48700, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48705, 48707, 48700, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48705, 48707, 48700, 48702, + 0, 1, 49152, 49153, 49155, 49159, 48640, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 48706, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 48708, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48708, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48704, 48712, 48710, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48712, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48712, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48704, 48712, 48714, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 48712, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48720, 48716, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48704, 48720, 48716, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48720, 48721, 48718, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 48720, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48720, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48704, 48720, 48722, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48720, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48720, 48724, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 48720, + 48724, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48720, 48728, 48726, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48720, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48704, 48736, 48728, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48704, 48736, + 48728, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48736, 48728, 48730, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48736, 48728, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48704, 48736, 48737, + 48732, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48704, 48736, 48737, 48732, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48704, 48736, 48737, 48732, 48734, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48704, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48736, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48736, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48736, 48738, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48736, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48736, 48740, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48736, + 48740, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48736, 48744, 48742, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48736, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48736, 48744, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48736, + 48744, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48736, 48744, 48746, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48736, 48744, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48736, 48752, + 48748, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48736, 48752, 48748, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48736, 48752, 48753, 48750, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48736, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48769, 48752, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48769, 48752, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48769, 48752, 48754, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48769, 48752, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48769, 48752, 48756, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48769, 48752, 48756, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48769, 48752, 48760, 48758, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48769, 48752, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48769, 48752, + 48760, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48769, 48771, 48760, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48769, 48771, 48760, 48762, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48769, 48771, 48760, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48769, 48771, 48760, 48764, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48769, + 48771, 48760, 48764, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48769, 48771, 48760, 48764, 48766, + 0, 1, 49152, 49153, 49155, 49159, 48640, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48770, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48772, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48772, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48776, 48774, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48776, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48776, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48776, 48778, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48776, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48784, 48780, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48784, 48780, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48784, 48785, 48782, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48784, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48784, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48784, 48786, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48784, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48784, 48788, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48784, + 48788, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48784, 48792, 48790, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48784, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48800, 48792, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48800, + 48792, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 48792, 48794, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 48792, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48800, 48801, + 48796, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 48801, 48796, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 48801, 48796, 48798, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48800, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48800, 48802, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48800, 48804, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48800, + 48804, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 48808, 48806, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48800, 48808, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48800, + 48808, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 48808, 48810, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 48808, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48800, 48816, + 48812, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48800, 48816, 48812, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48800, 48816, 48817, 48814, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48800, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48832, 48816, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48832, 48816, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48832, 48816, 48818, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48832, 48816, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48768, 48832, 48816, 48820, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48768, 48832, 48816, 48820, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48832, 48816, 48824, 48822, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48832, 48816, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48768, 48832, 48833, + 48824, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48768, 48832, 48833, 48824, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48768, 48832, 48833, 48824, 48826, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 48832, 48833, 48824, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48832, 48833, 48824, 48828, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48768, 48832, + 48833, 48835, 48828, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48768, 48832, 48833, 48835, 48828, 48830, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48768, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48832, 48834, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48832, 48836, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48832, + 48836, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 48840, 48838, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48832, 48840, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48832, + 48840, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 48840, 48842, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 48840, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48896, 48832, 48848, + 48844, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 48848, 48844, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 48848, 48849, 48846, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 48848, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48832, 48848, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48832, 48848, 48850, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 48848, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48832, 48848, 48852, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48832, 48848, 48852, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 48848, 48856, 48854, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 48848, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48896, 48832, 48864, + 48856, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48832, 48864, 48856, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48832, 48864, 48856, 48858, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 48864, 48856, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48832, 48864, 48865, 48860, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48832, + 48864, 48865, 48860, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48832, 48864, 48865, 48860, 48862, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48832, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48897, 48864, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48897, 48864, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48897, 48864, 48866, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48864, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48897, 48864, 48868, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48897, 48864, 48868, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48864, 48872, 48870, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48897, 48864, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48896, 48897, 48864, + 48872, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48897, 48864, 48872, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48897, 48864, 48872, 48874, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48864, 48872, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48897, 48864, 48880, 48876, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48897, + 48864, 48880, 48876, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48897, 48864, 48880, 48881, 48878, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48864, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48897, 48864, 48880, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48897, 48899, 48880, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48899, 48880, 48882, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48897, 48899, 48880, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48897, + 48899, 48880, 48884, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48897, 48899, 48880, 48884, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48897, + 48899, 48880, 48888, 48886, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48897, 48899, 48880, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48897, + 48899, 48880, 48888, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48897, 48899, 48880, 48888, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48897, + 48899, 48880, 48888, 48890, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48897, 48899, 48903, 48888, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48897, 48899, 48903, 48888, 48892, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48897, 48899, 48903, + 48888, 48892, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48897, 48899, 48903, 48888, 48892, 48894, + 0, 1, 49152, 49153, 49155, 49159, 48640, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 0, + 1, 49152, 49153, 49155, 49159, 48640, 48896, 48898, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48900, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48900, 0, 1, 49152, 49153, 49155, 49159, + 48640, 48896, 48904, 48902, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 0, 1, 49152, 49153, + 49155, 49159, 48640, 48896, 48904, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48904, 0, 1, + 49152, 49153, 49155, 49159, 48640, 48896, 48904, 48906, + 0, 1, 49152, 49153, 49155, 49159, 48640, 48896, + 48904, 0, 1, 49152, 49153, 49155, 49159, 48640, + 48896, 48912, 48908, 0, 1, 49152, 49153, 49155, + 49159, 48640, 48896, 48912, 48908, 0, 1, 49152, + 49153, 49155, 49159, 48640, 48896, 48912, 48913, 48910, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48912, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48912, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 48912, 48914, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48912, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48912, 48916, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48912, + 48916, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48912, 48920, 48918, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48912, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48928, 48920, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48928, + 48920, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 48920, 48922, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 48920, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 48928, 48929, + 48924, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 48929, 48924, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 48929, 48924, 48926, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48928, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 48928, 48930, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48928, 48932, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48928, + 48932, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 48936, 48934, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48928, 48936, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48928, + 48936, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 48936, 48938, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 48936, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 48928, 48944, + 48940, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48928, 48944, 48940, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48928, 48944, 48945, 48942, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48928, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48944, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48944, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48944, 48946, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48944, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 48960, 48944, 48948, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48944, 48948, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48944, 48952, 48950, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48944, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 48960, 48961, + 48952, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48961, 48952, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48961, 48952, 48954, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48961, 48952, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48961, 48952, 48956, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48960, + 48961, 48963, 48956, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48961, 48963, 48956, 48958, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 48960, 48962, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48964, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48960, + 48964, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48968, 48966, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48968, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48960, + 48968, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48968, 48970, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48968, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 48960, 48976, + 48972, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48976, 48972, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48976, 48977, 48974, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48976, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48976, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48976, 48978, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48976, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 48960, 48976, 48980, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 48960, 48976, 48980, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48976, 48984, 48982, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48976, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 48960, 48992, + 48984, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 48960, 48992, 48984, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 48960, 48992, 48984, 48986, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 48992, 48984, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48992, 48993, 48988, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 48960, + 48992, 48993, 48988, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 48960, 48992, 48993, 48988, 48990, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 48960, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 48992, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 48992, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 48992, 48994, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 48992, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 49024, 48992, 48996, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 48992, 48996, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 48992, 49000, 48998, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 48992, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 49024, 48992, + 49000, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 48992, 49000, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 48992, 49000, 49002, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 48992, 49000, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 48992, 49008, 49004, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 48992, 49008, 49004, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 48992, 49008, 49009, 49006, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 48992, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 49024, 49025, 49008, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49025, 49008, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 49025, 49008, 49010, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49025, 49008, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49025, 49008, 49012, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 49025, 49008, 49012, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49025, 49008, 49016, 49014, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49025, 49008, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49025, 49008, 49016, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 49025, 49027, 49016, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49025, 49027, 49016, 49018, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49025, 49027, 49016, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 49025, 49027, 49016, 49020, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49025, 49027, + 49016, 49020, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 49024, 49025, 49027, 49016, 49020, 49022, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 49024, 49026, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49028, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49028, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 49032, 49030, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49032, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49032, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 49032, 49034, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49032, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 49024, 49040, + 49036, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 49040, 49036, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49040, 49041, 49038, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 49040, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 49040, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49040, 49042, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 49040, 0, 1, 49152, 49153, 49155, 49159, + 49167, 48896, 49024, 49040, 49044, 0, 1, 49152, + 49153, 49155, 49159, 49167, 48896, 49024, 49040, 49044, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 49040, 49048, 49046, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49040, 0, 1, + 49152, 49153, 49155, 49159, 49167, 48896, 49024, 49056, + 49048, 0, 1, 49152, 49153, 49155, 49159, 49167, + 48896, 49024, 49056, 49048, 0, 1, 49152, 49153, + 49155, 49159, 49167, 48896, 49024, 49056, 49048, 49050, + 0, 1, 49152, 49153, 49155, 49159, 49167, 48896, + 49024, 49056, 49048, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 49056, 49057, 49052, 0, + 1, 49152, 49153, 49155, 49159, 49167, 48896, 49024, + 49056, 49057, 49052, 0, 1, 49152, 49153, 49155, + 49159, 49167, 48896, 49024, 49056, 49057, 49052, 49054, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49056, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49056, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49056, 49058, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49056, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49056, 49060, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49056, 49060, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49056, 49064, 49062, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49056, 0, 1, + 49152, 49153, 49155, 49159, 49167, 49183, 49024, 49056, + 49064, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49056, 49064, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49056, 49064, 49066, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49056, 49064, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49056, 49072, 49068, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49056, 49072, 49068, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49056, 49072, 49073, 49070, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49056, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49072, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49072, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49072, 49074, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49072, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49072, 49076, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49072, 49076, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49072, 49080, 49078, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49072, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49089, 49080, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49089, 49080, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49089, 49080, 49082, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49089, 49080, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49089, 49080, 49084, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49089, + 49091, 49084, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49089, 49091, 49084, 49086, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49088, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49090, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49092, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49092, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49096, 49094, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 0, 1, + 49152, 49153, 49155, 49159, 49167, 49183, 49024, 49088, + 49096, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49088, 49096, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49096, 49098, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49096, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49104, 49100, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49104, 49100, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49104, 49105, 49102, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49104, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49104, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49104, 49106, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49104, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49104, 49108, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49104, 49108, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49104, 49112, 49110, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49104, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49112, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49112, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49112, 49114, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 49112, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49121, 49116, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49120, + 49121, 49116, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49120, 49121, 49116, 49118, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49120, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49120, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49122, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49124, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49124, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49128, 49126, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49128, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49128, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49128, 49130, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 49128, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49136, 49132, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49120, + 49136, 49132, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49120, 49136, 49137, 49134, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49136, 0, + 1, 49152, 49153, 49155, 49159, 49167, 49183, 49024, + 49088, 49120, 49136, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49136, 49138, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49136, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 49136, + 49140, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49088, 49120, 49136, 49140, 0, 1, + 49152, 49153, 49155, 49159, 49167, 49183, 49024, 49088, + 49120, 49136, 49144, 49142, 0, 1, 49152, 49153, + 49155, 49159, 49167, 49183, 49024, 49088, 49120, 49136, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49136, 49144, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49120, + 49136, 49144, 0, 1, 49152, 49153, 49155, 49159, + 49167, 49183, 49024, 49088, 49120, 49136, 49144, 49146, + 0, 1, 49152, 49153, 49155, 49159, 49167, 49183, + 49024, 49088, 49120, 49136, 49144, 0, 1, 49152, + 49153, 49155, 49159, 49167, 49183, 49024, 49088, 49120, + 49136, 49144, 49148, 0, 1, 49152, 49153, 49155, + 49159, 49167, 49183, 49024, 49088, 49120, 49136, 49144, + 49148, 0, 1, 49152, 49153, 49155, 49159, 49167, + 49183, 49024, 49088, 49120, 49136, 49144, 49148, 49150, + 0, 1, 0, 1, 49152, 0, 1, 49152, + 0, 1, 49152, 49154, 0, 1, 49152, 0, + 1, 49152, 49156, 0, 1, 49152, 49156, 0, + 1, 49152, 49160, 49158, 0, 1, 49152, 0, + 1, 49152, 49160, 0, 1, 49152, 49160, 0, + 1, 49152, 49160, 49162, 0, 1, 49152, 49160, + 0, 1, 49152, 49168, 49164, 0, 1, 49152, + 49168, 49164, 0, 1, 49152, 49168, 49169, 49166, + 0, 1, 49152, 0, 1, 49152, 49168, 0, + 1, 49152, 49168, 0, 1, 49152, 49168, 49170, + 0, 1, 49152, 49168, 0, 1, 49152, 49168, + 49172, 0, 1, 49152, 49168, 49172, 0, 1, + 49152, 49168, 49176, 49174, 0, 1, 49152, 49168, + 0, 1, 49152, 49184, 49176, 0, 1, 49152, + 49184, 49176, 0, 1, 49152, 49184, 49176, 49178, + 0, 1, 49152, 49184, 49176, 0, 1, 49152, + 49184, 49185, 49180, 0, 1, 49152, 49184, 49185, + 49180, 0, 1, 49152, 49184, 49185, 49180, 49182, + 0, 1, 49152, 0, 1, 49152, 49184, 0, + 1, 49152, 49184, 0, 1, 49152, 49184, 49186, + 0, 1, 49152, 49184, 0, 1, 49152, 49184, + 49188, 0, 1, 49152, 49184, 49188, 0, 1, + 49152, 49184, 49192, 49190, 0, 1, 49152, 49184, + 0, 1, 49152, 49184, 49192, 0, 1, 49152, + 49184, 49192, 0, 1, 49152, 49184, 49192, 49194, + 0, 1, 49152, 49184, 49192, 0, 1, 49152, + 49184, 49200, 49196, 0, 1, 49152, 49184, 49200, + 49196, 0, 1, 49152, 49184, 49200, 49201, 49198, + 0, 1, 49152, 49184, 0, 1, 49152, 49216, + 49200, 0, 1, 49152, 49216, 49200, 0, 1, + 49152, 49216, 49200, 49202, 0, 1, 49152, 49216, + 49200, 0, 1, 49152, 49216, 49200, 49204, 0, + 1, 49152, 49216, 49200, 49204, 0, 1, 49152, + 49216, 49200, 49208, 49206, 0, 1, 49152, 49216, + 49200, 0, 1, 49152, 49216, 49217, 49208, 0, + 1, 49152, 49216, 49217, 49208, 0, 1, 49152, + 49216, 49217, 49208, 49210, 0, 1, 49152, 49216, + 49217, 49208, 0, 1, 49152, 49216, 49217, 49208, + 49212, 0, 1, 49152, 49216, 49217, 49219, 49212, + 0, 1, 49152, 49216, 49217, 49219, 49212, 49214, + 0, 1, 49152, 0, 1, 49152, 49216, 0, + 1, 49152, 49216, 0, 1, 49152, 49216, 49218, + 0, 1, 49152, 49216, 0, 1, 49152, 49216, + 49220, 0, 1, 49152, 49216, 49220, 0, 1, + 49152, 49216, 49224, 49222, 0, 1, 49152, 49216, + 0, 1, 49152, 49216, 49224, 0, 1, 49152, + 49216, 49224, 0, 1, 49152, 49216, 49224, 49226, + 0, 1, 49152, 49216, 49224, 0, 1, 49152, + 49216, 49232, 49228, 0, 1, 49152, 49216, 49232, + 49228, 0, 1, 49152, 49216, 49232, 49233, 49230, + 0, 1, 49152, 49216, 0, 1, 49152, 49216, + 49232, 0, 1, 49152, 49216, 49232, 0, 1, + 49152, 49216, 49232, 49234, 0, 1, 49152, 49216, + 49232, 0, 1, 49152, 49216, 49232, 49236, 0, + 1, 49152, 49216, 49232, 49236, 0, 1, 49152, + 49216, 49232, 49240, 49238, 0, 1, 49152, 49216, + 49232, 0, 1, 49152, 49216, 49248, 49240, 0, + 1, 49152, 49216, 49248, 49240, 0, 1, 49152, + 49216, 49248, 49240, 49242, 0, 1, 49152, 49216, + 49248, 49240, 0, 1, 49152, 49216, 49248, 49249, + 49244, 0, 1, 49152, 49216, 49248, 49249, 49244, + 0, 1, 49152, 49216, 49248, 49249, 49244, 49246, + 0, 1, 49152, 49216, 0, 1, 49152, 49280, + 49248, 0, 1, 49152, 49280, 49248, 0, 1, + 49152, 49280, 49248, 49250, 0, 1, 49152, 49280, + 49248, 0, 1, 49152, 49280, 49248, 49252, 0, + 1, 49152, 49280, 49248, 49252, 0, 1, 49152, + 49280, 49248, 49256, 49254, 0, 1, 49152, 49280, + 49248, 0, 1, 49152, 49280, 49248, 49256, 0, + 1, 49152, 49280, 49248, 49256, 0, 1, 49152, + 49280, 49248, 49256, 49258, 0, 1, 49152, 49280, + 49248, 49256, 0, 1, 49152, 49280, 49248, 49264, + 49260, 0, 1, 49152, 49280, 49248, 49264, 49260, + 0, 1, 49152, 49280, 49248, 49264, 49265, 49262, + 0, 1, 49152, 49280, 49248, 0, 1, 49152, + 49280, 49281, 49264, 0, 1, 49152, 49280, 49281, + 49264, 0, 1, 49152, 49280, 49281, 49264, 49266, + 0, 1, 49152, 49280, 49281, 49264, 0, 1, + 49152, 49280, 49281, 49264, 49268, 0, 1, 49152, + 49280, 49281, 49264, 49268, 0, 1, 49152, 49280, + 49281, 49264, 49272, 49270, 0, 1, 49152, 49280, + 49281, 49264, 0, 1, 49152, 49280, 49281, 49264, + 49272, 0, 1, 49152, 49280, 49281, 49283, 49272, + 0, 1, 49152, 49280, 49281, 49283, 49272, 49274, + 0, 1, 49152, 49280, 49281, 49283, 49272, 0, + 1, 49152, 49280, 49281, 49283, 49272, 49276, 0, + 1, 49152, 49280, 49281, 49283, 49272, 49276, 0, + 1, 49152, 49280, 49281, 49283, 49272, 49276, 49278, + 0, 1, 49152, 0, 1, 49152, 49280, 0, + 1, 49152, 49280, 0, 1, 49152, 49280, 49282, + 0, 1, 49152, 49280, 0, 1, 49152, 49280, + 49284, 0, 1, 49152, 49280, 49284, 0, 1, + 49152, 49280, 49288, 49286, 0, 1, 49152, 49280, + 0, 1, 49152, 49280, 49288, 0, 1, 49152, + 49280, 49288, 0, 1, 49152, 49280, 49288, 49290, + 0, 1, 49152, 49280, 49288, 0, 1, 49152, + 49280, 49296, 49292, 0, 1, 49152, 49280, 49296, + 49292, 0, 1, 49152, 49280, 49296, 49297, 49294, + 0, 1, 49152, 49280, 0, 1, 49152, 49280, + 49296, 0, 1, 49152, 49280, 49296, 0, 1, + 49152, 49280, 49296, 49298, 0, 1, 49152, 49280, + 49296, 0, 1, 49152, 49280, 49296, 49300, 0, + 1, 49152, 49280, 49296, 49300, 0, 1, 49152, + 49280, 49296, 49304, 49302, 0, 1, 49152, 49280, + 49296, 0, 1, 49152, 49280, 49312, 49304, 0, + 1, 49152, 49280, 49312, 49304, 0, 1, 49152, + 49280, 49312, 49304, 49306, 0, 1, 49152, 49280, + 49312, 49304, 0, 1, 49152, 49280, 49312, 49313, + 49308, 0, 1, 49152, 49280, 49312, 49313, 49308, + 0, 1, 49152, 49280, 49312, 49313, 49308, 49310, + 0, 1, 49152, 49280, 0, 1, 49152, 49280, + 49312, 0, 1, 49152, 49280, 49312, 0, 1, + 49152, 49280, 49312, 49314, 0, 1, 49152, 49280, + 49312, 0, 1, 49152, 49280, 49312, 49316, 0, + 1, 49152, 49280, 49312, 49316, 0, 1, 49152, + 49280, 49312, 49320, 49318, 0, 1, 49152, 49280, + 49312, 0, 1, 49152, 49280, 49312, 49320, 0, + 1, 49152, 49280, 49312, 49320, 0, 1, 49152, + 49280, 49312, 49320, 49322, 0, 1, 49152, 49280, + 49312, 49320, 0, 1, 49152, 49280, 49312, 49328, + 49324, 0, 1, 49152, 49280, 49312, 49328, 49324, + 0, 1, 49152, 49280, 49312, 49328, 49329, 49326, + 0, 1, 49152, 49280, 49312, 0, 1, 49152, + 49280, 49344, 49328, 0, 1, 49152, 49280, 49344, + 49328, 0, 1, 49152, 49280, 49344, 49328, 49330, + 0, 1, 49152, 49280, 49344, 49328, 0, 1, + 49152, 49280, 49344, 49328, 49332, 0, 1, 49152, + 49280, 49344, 49328, 49332, 0, 1, 49152, 49280, + 49344, 49328, 49336, 49334, 0, 1, 49152, 49280, + 49344, 49328, 0, 1, 49152, 49280, 49344, 49345, + 49336, 0, 1, 49152, 49280, 49344, 49345, 49336, + 0, 1, 49152, 49280, 49344, 49345, 49336, 49338, + 0, 1, 49152, 49280, 49344, 49345, 49336, 0, + 1, 49152, 49280, 49344, 49345, 49336, 49340, 0, + 1, 49152, 49280, 49344, 49345, 49347, 49340, 0, + 1, 49152, 49280, 49344, 49345, 49347, 49340, 49342, + 0, 1, 49152, 49280, 0, 1, 49152, 49408, + 49344, 0, 1, 49152, 49408, 49344, 0, 1, + 49152, 49408, 49344, 49346, 0, 1, 49152, 49408, + 49344, 0, 1, 49152, 49408, 49344, 49348, 0, + 1, 49152, 49408, 49344, 49348, 0, 1, 49152, + 49408, 49344, 49352, 49350, 0, 1, 49152, 49408, + 49344, 0, 1, 49152, 49408, 49344, 49352, 0, + 1, 49152, 49408, 49344, 49352, 0, 1, 49152, + 49408, 49344, 49352, 49354, 0, 1, 49152, 49408, + 49344, 49352, 0, 1, 49152, 49408, 49344, 49360, + 49356, 0, 1, 49152, 49408, 49344, 49360, 49356, + 0, 1, 49152, 49408, 49344, 49360, 49361, 49358, + 0, 1, 49152, 49408, 49344, 0, 1, 49152, + 49408, 49344, 49360, 0, 1, 49152, 49408, 49344, + 49360, 0, 1, 49152, 49408, 49344, 49360, 49362, + 0, 1, 49152, 49408, 49344, 49360, 0, 1, + 49152, 49408, 49344, 49360, 49364, 0, 1, 49152, + 49408, 49344, 49360, 49364, 0, 1, 49152, 49408, + 49344, 49360, 49368, 49366, 0, 1, 49152, 49408, + 49344, 49360, 0, 1, 49152, 49408, 49344, 49376, + 49368, 0, 1, 49152, 49408, 49344, 49376, 49368, + 0, 1, 49152, 49408, 49344, 49376, 49368, 49370, + 0, 1, 49152, 49408, 49344, 49376, 49368, 0, + 1, 49152, 49408, 49344, 49376, 49377, 49372, 0, + 1, 49152, 49408, 49344, 49376, 49377, 49372, 0, + 1, 49152, 49408, 49344, 49376, 49377, 49372, 49374, + 0, 1, 49152, 49408, 49344, 0, 1, 49152, + 49408, 49409, 49376, 0, 1, 49152, 49408, 49409, + 49376, 0, 1, 49152, 49408, 49409, 49376, 49378, + 0, 1, 49152, 49408, 49409, 49376, 0, 1, + 49152, 49408, 49409, 49376, 49380, 0, 1, 49152, + 49408, 49409, 49376, 49380, 0, 1, 49152, 49408, + 49409, 49376, 49384, 49382, 0, 1, 49152, 49408, + 49409, 49376, 0, 1, 49152, 49408, 49409, 49376, + 49384, 0, 1, 49152, 49408, 49409, 49376, 49384, + 0, 1, 49152, 49408, 49409, 49376, 49384, 49386, + 0, 1, 49152, 49408, 49409, 49376, 49384, 0, + 1, 49152, 49408, 49409, 49376, 49392, 49388, 0, + 1, 49152, 49408, 49409, 49376, 49392, 49388, 0, + 1, 49152, 49408, 49409, 49376, 49392, 49393, 49390, + 0, 1, 49152, 49408, 49409, 49376, 0, 1, + 49152, 49408, 49409, 49376, 49392, 0, 1, 49152, + 49408, 49409, 49411, 49392, 0, 1, 49152, 49408, + 49409, 49411, 49392, 49394, 0, 1, 49152, 49408, + 49409, 49411, 49392, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49396, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49396, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49400, 49398, 0, 1, 49152, 49408, + 49409, 49411, 49392, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49400, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49400, 0, 1, 49152, 49408, 49409, + 49411, 49392, 49400, 49402, 0, 1, 49152, 49408, + 49409, 49411, 49415, 49400, 0, 1, 49152, 49408, + 49409, 49411, 49415, 49400, 49404, 0, 1, 49152, + 49408, 49409, 49411, 49415, 49400, 49404, 0, 1, + 49152, 49408, 49409, 49411, 49415, 49400, 49404, 49406, + 0, 1, 49152, 0, 1, 49152, 49408, 0, + 1, 49152, 49408, 0, 1, 49152, 49408, 49410, + 0, 1, 49152, 49408, 0, 1, 49152, 49408, + 49412, 0, 1, 49152, 49408, 49412, 0, 1, + 49152, 49408, 49416, 49414, 0, 1, 49152, 49408, + 0, 1, 49152, 49408, 49416, 0, 1, 49152, + 49408, 49416, 0, 1, 49152, 49408, 49416, 49418, + 0, 1, 49152, 49408, 49416, 0, 1, 49152, + 49408, 49424, 49420, 0, 1, 49152, 49408, 49424, + 49420, 0, 1, 49152, 49408, 49424, 49425, 49422, + 0, 1, 49152, 49408, 0, 1, 49152, 49408, + 49424, 0, 1, 49152, 49408, 49424, 0, 1, + 49152, 49408, 49424, 49426, 0, 1, 49152, 49408, + 49424, 0, 1, 49152, 49408, 49424, 49428, 0, + 1, 49152, 49408, 49424, 49428, 0, 1, 49152, + 49408, 49424, 49432, 49430, 0, 1, 49152, 49408, + 49424, 0, 1, 49152, 49408, 49440, 49432, 0, + 1, 49152, 49408, 49440, 49432, 0, 1, 49152, + 49408, 49440, 49432, 49434, 0, 1, 49152, 49408, + 49440, 49432, 0, 1, 49152, 49408, 49440, 49441, + 49436, 0, 1, 49152, 49408, 49440, 49441, 49436, + 0, 1, 49152, 49408, 49440, 49441, 49436, 49438, + 0, 1, 49152, 49408, 0, 1, 49152, 49408, + 49440, 0, 1, 49152, 49408, 49440, 0, 1, + 49152, 49408, 49440, 49442, 0, 1, 49152, 49408, + 49440, 0, 1, 49152, 49408, 49440, 49444, 0, + 1, 49152, 49408, 49440, 49444, 0, 1, 49152, + 49408, 49440, 49448, 49446, 0, 1, 49152, 49408, + 49440, 0, 1, 49152, 49408, 49440, 49448, 0, + 1, 49152, 49408, 49440, 49448, 0, 1, 49152, + 49408, 49440, 49448, 49450, 0, 1, 49152, 49408, + 49440, 49448, 0, 1, 49152, 49408, 49440, 49456, + 49452, 0, 1, 49152, 49408, 49440, 49456, 49452, + 0, 1, 49152, 49408, 49440, 49456, 49457, 49454, + 0, 1, 49152, 49408, 49440, 0, 1, 49152, + 49408, 49472, 49456, 0, 1, 49152, 49408, 49472, + 49456, 0, 1, 49152, 49408, 49472, 49456, 49458, + 0, 1, 49152, 49408, 49472, 49456, 0, 1, + 49152, 49408, 49472, 49456, 49460, 0, 1, 49152, + 49408, 49472, 49456, 49460, 0, 1, 49152, 49408, + 49472, 49456, 49464, 49462, 0, 1, 49152, 49408, + 49472, 49456, 0, 1, 49152, 49408, 49472, 49473, + 49464, 0, 1, 49152, 49408, 49472, 49473, 49464, + 0, 1, 49152, 49408, 49472, 49473, 49464, 49466, + 0, 1, 49152, 49408, 49472, 49473, 49464, 0, + 1, 49152, 49408, 49472, 49473, 49464, 49468, 0, + 1, 49152, 49408, 49472, 49473, 49475, 49468, 0, + 1, 49152, 49408, 49472, 49473, 49475, 49468, 49470, + 0, 1, 49152, 49408, 0, 1, 49152, 49408, + 49472, 0, 1, 49152, 49408, 49472, 0, 1, + 49152, 49408, 49472, 49474, 0, 1, 49152, 49408, + 49472, 0, 1, 49152, 49408, 49472, 49476, 0, + 1, 49152, 49408, 49472, 49476, 0, 1, 49152, + 49408, 49472, 49480, 49478, 0, 1, 49152, 49408, + 49472, 0, 1, 49152, 49408, 49472, 49480, 0, + 1, 49152, 49408, 49472, 49480, 0, 1, 49152, + 49408, 49472, 49480, 49482, 0, 1, 49152, 49408, + 49472, 49480, 0, 1, 49152, 49408, 49472, 49488, + 49484, 0, 1, 49152, 49408, 49472, 49488, 49484, + 0, 1, 49152, 49408, 49472, 49488, 49489, 49486, + 0, 1, 49152, 49408, 49472, 0, 1, 49152, + 49408, 49472, 49488, 0, 1, 49152, 49408, 49472, + 49488, 0, 1, 49152, 49408, 49472, 49488, 49490, + 0, 1, 49152, 49408, 49472, 49488, 0, 1, + 49152, 49408, 49472, 49488, 49492, 0, 1, 49152, + 49408, 49472, 49488, 49492, 0, 1, 49152, 49408, + 49472, 49488, 49496, 49494, 0, 1, 49152, 49408, + 49472, 49488, 0, 1, 49152, 49408, 49472, 49504, + 49496, 0, 1, 49152, 49408, 49472, 49504, 49496, + 0, 1, 49152, 49408, 49472, 49504, 49496, 49498, + 0, 1, 49152, 49408, 49472, 49504, 49496, 0, + 1, 49152, 49408, 49472, 49504, 49505, 49500, 0, + 1, 49152, 49408, 49472, 49504, 49505, 49500, 0, + 1, 49152, 49408, 49472, 49504, 49505, 49500, 49502, + 0, 1, 49152, 49408, 49472, 0, 1, 49152, + 49408, 49536, 49504, 0, 1, 49152, 49408, 49536, + 49504, 0, 1, 49152, 49408, 49536, 49504, 49506, + 0, 1, 49152, 49408, 49536, 49504, 0, 1, + 49152, 49408, 49536, 49504, 49508, 0, 1, 49152, + 49408, 49536, 49504, 49508, 0, 1, 49152, 49408, + 49536, 49504, 49512, 49510, 0, 1, 49152, 49408, + 49536, 49504, 0, 1, 49152, 49408, 49536, 49504, + 49512, 0, 1, 49152, 49408, 49536, 49504, 49512, + 0, 1, 49152, 49408, 49536, 49504, 49512, 49514, + 0, 1, 49152, 49408, 49536, 49504, 49512, 0, + 1, 49152, 49408, 49536, 49504, 49520, 49516, 0, + 1, 49152, 49408, 49536, 49504, 49520, 49516, 0, + 1, 49152, 49408, 49536, 49504, 49520, 49521, 49518, + 0, 1, 49152, 49408, 49536, 49504, 0, 1, + 49152, 49408, 49536, 49537, 49520, 0, 1, 49152, + 49408, 49536, 49537, 49520, 0, 1, 49152, 49408, + 49536, 49537, 49520, 49522, 0, 1, 49152, 49408, + 49536, 49537, 49520, 0, 1, 49152, 49408, 49536, + 49537, 49520, 49524, 0, 1, 49152, 49408, 49536, + 49537, 49520, 49524, 0, 1, 49152, 49408, 49536, + 49537, 49520, 49528, 49526, 0, 1, 49152, 49408, + 49536, 49537, 49520, 0, 1, 49152, 49408, 49536, + 49537, 49520, 49528, 0, 1, 49152, 49408, 49536, + 49537, 49539, 49528, 0, 1, 49152, 49408, 49536, + 49537, 49539, 49528, 49530, 0, 1, 49152, 49408, + 49536, 49537, 49539, 49528, 0, 1, 49152, 49408, + 49536, 49537, 49539, 49528, 49532, 0, 1, 49152, + 49408, 49536, 49537, 49539, 49528, 49532, 0, 1, + 49152, 49408, 49536, 49537, 49539, 49528, 49532, 49534, + 0, 1, 49152, 49408, 0, 1, 49152, 49664, + 49536, 0, 1, 49152, 49664, 49536, 0, 1, + 49152, 49664, 49536, 49538, 0, 1, 49152, 49664, + 49536, 0, 1, 49152, 49664, 49536, 49540, 0, + 1, 49152, 49664, 49536, 49540, 0, 1, 49152, + 49664, 49536, 49544, 49542, 0, 1, 49152, 49664, + 49536, 0, 1, 49152, 49664, 49536, 49544, 0, + 1, 49152, 49664, 49536, 49544, 0, 1, 49152, + 49664, 49536, 49544, 49546, 0, 1, 49152, 49664, + 49536, 49544, 0, 1, 49152, 49664, 49536, 49552, + 49548, 0, 1, 49152, 49664, 49536, 49552, 49548, + 0, 1, 49152, 49664, 49536, 49552, 49553, 49550, + 0, 1, 49152, 49664, 49536, 0, 1, 49152, + 49664, 49536, 49552, 0, 1, 49152, 49664, 49536, + 49552, 0, 1, 49152, 49664, 49536, 49552, 49554, + 0, 1, 49152, 49664, 49536, 49552, 0, 1, + 49152, 49664, 49536, 49552, 49556, 0, 1, 49152, + 49664, 49536, 49552, 49556, 0, 1, 49152, 49664, + 49536, 49552, 49560, 49558, 0, 1, 49152, 49664, + 49536, 49552, 0, 1, 49152, 49664, 49536, 49568, + 49560, 0, 1, 49152, 49664, 49536, 49568, 49560, + 0, 1, 49152, 49664, 49536, 49568, 49560, 49562, + 0, 1, 49152, 49664, 49536, 49568, 49560, 0, + 1, 49152, 49664, 49536, 49568, 49569, 49564, 0, + 1, 49152, 49664, 49536, 49568, 49569, 49564, 0, + 1, 49152, 49664, 49536, 49568, 49569, 49564, 49566, + 0, 1, 49152, 49664, 49536, 0, 1, 49152, + 49664, 49536, 49568, 0, 1, 49152, 49664, 49536, + 49568, 0, 1, 49152, 49664, 49536, 49568, 49570, + 0, 1, 49152, 49664, 49536, 49568, 0, 1, + 49152, 49664, 49536, 49568, 49572, 0, 1, 49152, + 49664, 49536, 49568, 49572, 0, 1, 49152, 49664, + 49536, 49568, 49576, 49574, 0, 1, 49152, 49664, + 49536, 49568, 0, 1, 49152, 49664, 49536, 49568, + 49576, 0, 1, 49152, 49664, 49536, 49568, 49576, + 0, 1, 49152, 49664, 49536, 49568, 49576, 49578, + 0, 1, 49152, 49664, 49536, 49568, 49576, 0, + 1, 49152, 49664, 49536, 49568, 49584, 49580, 0, + 1, 49152, 49664, 49536, 49568, 49584, 49580, 0, + 1, 49152, 49664, 49536, 49568, 49584, 49585, 49582, + 0, 1, 49152, 49664, 49536, 49568, 0, 1, + 49152, 49664, 49536, 49600, 49584, 0, 1, 49152, + 49664, 49536, 49600, 49584, 0, 1, 49152, 49664, + 49536, 49600, 49584, 49586, 0, 1, 49152, 49664, + 49536, 49600, 49584, 0, 1, 49152, 49664, 49536, + 49600, 49584, 49588, 0, 1, 49152, 49664, 49536, + 49600, 49584, 49588, 0, 1, 49152, 49664, 49536, + 49600, 49584, 49592, 49590, 0, 1, 49152, 49664, + 49536, 49600, 49584, 0, 1, 49152, 49664, 49536, + 49600, 49601, 49592, 0, 1, 49152, 49664, 49536, + 49600, 49601, 49592, 0, 1, 49152, 49664, 49536, + 49600, 49601, 49592, 49594, 0, 1, 49152, 49664, + 49536, 49600, 49601, 49592, 0, 1, 49152, 49664, + 49536, 49600, 49601, 49592, 49596, 0, 1, 49152, + 49664, 49536, 49600, 49601, 49603, 49596, 0, 1, + 49152, 49664, 49536, 49600, 49601, 49603, 49596, 49598, + 0, 1, 49152, 49664, 49536, 0, 1, 49152, + 49664, 49665, 49600, 0, 1, 49152, 49664, 49665, + 49600, 0, 1, 49152, 49664, 49665, 49600, 49602, + 0, 1, 49152, 49664, 49665, 49600, 0, 1, + 49152, 49664, 49665, 49600, 49604, 0, 1, 49152, + 49664, 49665, 49600, 49604, 0, 1, 49152, 49664, + 49665, 49600, 49608, 49606, 0, 1, 49152, 49664, + 49665, 49600, 0, 1, 49152, 49664, 49665, 49600, + 49608, 0, 1, 49152, 49664, 49665, 49600, 49608, + 0, 1, 49152, 49664, 49665, 49600, 49608, 49610, + 0, 1, 49152, 49664, 49665, 49600, 49608, 0, + 1, 49152, 49664, 49665, 49600, 49616, 49612, 0, + 1, 49152, 49664, 49665, 49600, 49616, 49612, 0, + 1, 49152, 49664, 49665, 49600, 49616, 49617, 49614, + 0, 1, 49152, 49664, 49665, 49600, 0, 1, + 49152, 49664, 49665, 49600, 49616, 0, 1, 49152, + 49664, 49665, 49600, 49616, 0, 1, 49152, 49664, + 49665, 49600, 49616, 49618, 0, 1, 49152, 49664, + 49665, 49600, 49616, 0, 1, 49152, 49664, 49665, + 49600, 49616, 49620, 0, 1, 49152, 49664, 49665, + 49600, 49616, 49620, 0, 1, 49152, 49664, 49665, + 49600, 49616, 49624, 49622, 0, 1, 49152, 49664, + 49665, 49600, 49616, 0, 1, 49152, 49664, 49665, + 49600, 49632, 49624, 0, 1, 49152, 49664, 49665, + 49600, 49632, 49624, 0, 1, 49152, 49664, 49665, + 49600, 49632, 49624, 49626, 0, 1, 49152, 49664, + 49665, 49600, 49632, 49624, 0, 1, 49152, 49664, + 49665, 49600, 49632, 49633, 49628, 0, 1, 49152, + 49664, 49665, 49600, 49632, 49633, 49628, 0, 1, + 49152, 49664, 49665, 49600, 49632, 49633, 49628, 49630, + 0, 1, 49152, 49664, 49665, 49600, 0, 1, + 49152, 49664, 49665, 49600, 49632, 0, 1, 49152, + 49664, 49665, 49667, 49632, 0, 1, 49152, 49664, + 49665, 49667, 49632, 49634, 0, 1, 49152, 49664, + 49665, 49667, 49632, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49636, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49636, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49640, 49638, 0, 1, 49152, 49664, + 49665, 49667, 49632, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49640, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49640, 0, 1, 49152, 49664, 49665, + 49667, 49632, 49640, 49642, 0, 1, 49152, 49664, + 49665, 49667, 49632, 49640, 0, 1, 49152, 49664, + 49665, 49667, 49632, 49648, 49644, 0, 1, 49152, + 49664, 49665, 49667, 49632, 49648, 49644, 0, 1, + 49152, 49664, 49665, 49667, 49632, 49648, 49649, 49646, + 0, 1, 49152, 49664, 49665, 49667, 49632, 0, + 1, 49152, 49664, 49665, 49667, 49632, 49648, 0, + 1, 49152, 49664, 49665, 49667, 49632, 49648, 0, + 1, 49152, 49664, 49665, 49667, 49632, 49648, 49650, + 0, 1, 49152, 49664, 49665, 49667, 49671, 49648, + 0, 1, 49152, 49664, 49665, 49667, 49671, 49648, + 49652, 0, 1, 49152, 49664, 49665, 49667, 49671, + 49648, 49652, 0, 1, 49152, 49664, 49665, 49667, + 49671, 49648, 49656, 49654, 0, 1, 49152, 49664, + 49665, 49667, 49671, 49648, 0, 1, 49152, 49664, + 49665, 49667, 49671, 49648, 49656, 0, 1, 49152, + 49664, 49665, 49667, 49671, 49648, 49656, 0, 1, + 49152, 49664, 49665, 49667, 49671, 49648, 49656, 49658, + 0, 1, 49152, 49664, 49665, 49667, 49671, 49648, + 49656, 0, 1, 49152, 49664, 49665, 49667, 49671, + 49648, 49656, 49660, 0, 1, 49152, 49664, 49665, + 49667, 49671, 49648, 49656, 49660, 0, 1, 49152, + 49664, 49665, 49667, 49671, 49648, 49656, 49660, 49662, + 0, 1, 49152, 0, 1, 49152, 49664, 0, + 1, 49152, 49664, 0, 1, 49152, 49664, 49666, + 0, 1, 49152, 49664, 0, 1, 49152, 49664, + 49668, 0, 1, 49152, 49664, 49668, 0, 1, + 49152, 49664, 49672, 49670, 0, 1, 49152, 49664, + 0, 1, 49152, 49664, 49672, 0, 1, 49152, + 49664, 49672, 0, 1, 49152, 49664, 49672, 49674, + 0, 1, 49152, 49664, 49672, 0, 1, 49152, + 49664, 49680, 49676, 0, 1, 49152, 49664, 49680, + 49676, 0, 1, 49152, 49664, 49680, 49681, 49678, + 0, 1, 49152, 49664, 0, 1, 49152, 49664, + 49680, 0, 1, 49152, 49664, 49680, 0, 1, + 49152, 49664, 49680, 49682, 0, 1, 49152, 49664, + 49680, 0, 1, 49152, 49664, 49680, 49684, 0, + 1, 49152, 49664, 49680, 49684, 0, 1, 49152, + 49664, 49680, 49688, 49686, 0, 1, 49152, 49664, + 49680, 0, 1, 49152, 49664, 49696, 49688, 0, + 1, 49152, 49664, 49696, 49688, 0, 1, 49152, + 49664, 49696, 49688, 49690, 0, 1, 49152, 49664, + 49696, 49688, 0, 1, 49152, 49664, 49696, 49697, + 49692, 0, 1, 49152, 49664, 49696, 49697, 49692, + 0, 1, 49152, 49664, 49696, 49697, 49692, 49694, + 0, 1, 49152, 49664, 0, 1, 49152, 49664, + 49696, 0, 1, 49152, 49664, 49696, 0, 1, + 49152, 49664, 49696, 49698, 0, 1, 49152, 49664, + 49696, 0, 1, 49152, 49664, 49696, 49700, 0, + 1, 49152, 49664, 49696, 49700, 0, 1, 49152, + 49664, 49696, 49704, 49702, 0, 1, 49152, 49664, + 49696, 0, 1, 49152, 49664, 49696, 49704, 0, + 1, 49152, 49664, 49696, 49704, 0, 1, 49152, + 49664, 49696, 49704, 49706, 0, 1, 49152, 49664, + 49696, 49704, 0, 1, 49152, 49664, 49696, 49712, + 49708, 0, 1, 49152, 49664, 49696, 49712, 49708, + 0, 1, 49152, 49664, 49696, 49712, 49713, 49710, + 0, 1, 49152, 49664, 49696, 0, 1, 49152, + 49664, 49728, 49712, 0, 1, 49152, 49664, 49728, + 49712, 0, 1, 49152, 49664, 49728, 49712, 49714, + 0, 1, 49152, 49664, 49728, 49712, 0, 1, + 49152, 49664, 49728, 49712, 49716, 0, 1, 49152, + 49664, 49728, 49712, 49716, 0, 1, 49152, 49664, + 49728, 49712, 49720, 49718, 0, 1, 49152, 49664, + 49728, 49712, 0, 1, 49152, 49664, 49728, 49729, + 49720, 0, 1, 49152, 49664, 49728, 49729, 49720, + 0, 1, 49152, 49664, 49728, 49729, 49720, 49722, + 0, 1, 49152, 49664, 49728, 49729, 49720, 0, + 1, 49152, 49664, 49728, 49729, 49720, 49724, 0, + 1, 49152, 49664, 49728, 49729, 49731, 49724, 0, + 1, 49152, 49664, 49728, 49729, 49731, 49724, 49726, + 0, 1, 49152, 49664, 0, 1, 49152, 49664, + 49728, 0, 1, 49152, 49664, 49728, 0, 1, + 49152, 49664, 49728, 49730, 0, 1, 49152, 49664, + 49728, 0, 1, 49152, 49664, 49728, 49732, 0, + 1, 49152, 49664, 49728, 49732, 0, 1, 49152, + 49664, 49728, 49736, 49734, 0, 1, 49152, 49664, + 49728, 0, 1, 49152, 49664, 49728, 49736, 0, + 1, 49152, 49664, 49728, 49736, 0, 1, 49152, + 49664, 49728, 49736, 49738, 0, 1, 49152, 49664, + 49728, 49736, 0, 1, 49152, 49664, 49728, 49744, + 49740, 0, 1, 49152, 49664, 49728, 49744, 49740, + 0, 1, 49152, 49664, 49728, 49744, 49745, 49742, + 0, 1, 49152, 49664, 49728, 0, 1, 49152, + 49664, 49728, 49744, 0, 1, 49152, 49664, 49728, + 49744, 0, 1, 49152, 49664, 49728, 49744, 49746, + 0, 1, 49152, 49664, 49728, 49744, 0, 1, + 49152, 49664, 49728, 49744, 49748, 0, 1, 49152, + 49664, 49728, 49744, 49748, 0, 1, 49152, 49664, + 49728, 49744, 49752, 49750, 0, 1, 49152, 49664, + 49728, 49744, 0, 1, 49152, 49664, 49728, 49760, + 49752, 0, 1, 49152, 49664, 49728, 49760, 49752, + 0, 1, 49152, 49664, 49728, 49760, 49752, 49754, + 0, 1, 49152, 49664, 49728, 49760, 49752, 0, + 1, 49152, 49664, 49728, 49760, 49761, 49756, 0, + 1, 49152, 49664, 49728, 49760, 49761, 49756, 0, + 1, 49152, 49664, 49728, 49760, 49761, 49756, 49758, + 0, 1, 49152, 49664, 49728, 0, 1, 49152, + 49664, 49792, 49760, 0, 1, 49152, 49664, 49792, + 49760, 0, 1, 49152, 49664, 49792, 49760, 49762, + 0, 1, 49152, 49664, 49792, 49760, 0, 1, + 49152, 49664, 49792, 49760, 49764, 0, 1, 49152, + 49664, 49792, 49760, 49764, 0, 1, 49152, 49664, + 49792, 49760, 49768, 49766, 0, 1, 49152, 49664, + 49792, 49760, 0, 1, 49152, 49664, 49792, 49760, + 49768, 0, 1, 49152, 49664, 49792, 49760, 49768, + 0, 1, 49152, 49664, 49792, 49760, 49768, 49770, + 0, 1, 49152, 49664, 49792, 49760, 49768, 0, + 1, 49152, 49664, 49792, 49760, 49776, 49772, 0, + 1, 49152, 49664, 49792, 49760, 49776, 49772, 0, + 1, 49152, 49664, 49792, 49760, 49776, 49777, 49774, + 0, 1, 49152, 49664, 49792, 49760, 0, 1, + 49152, 49664, 49792, 49793, 49776, 0, 1, 49152, + 49664, 49792, 49793, 49776, 0, 1, 49152, 49664, + 49792, 49793, 49776, 49778, 0, 1, 49152, 49664, + 49792, 49793, 49776, 0, 1, 49152, 49664, 49792, + 49793, 49776, 49780, 0, 1, 49152, 49664, 49792, + 49793, 49776, 49780, 0, 1, 49152, 49664, 49792, + 49793, 49776, 49784, 49782, 0, 1, 49152, 49664, + 49792, 49793, 49776, 0, 1, 49152, 49664, 49792, + 49793, 49776, 49784, 0, 1, 49152, 49664, 49792, + 49793, 49795, 49784, 0, 1, 49152, 49664, 49792, + 49793, 49795, 49784, 49786, 0, 1, 49152, 49664, + 49792, 49793, 49795, 49784, 0, 1, 49152, 49664, + 49792, 49793, 49795, 49784, 49788, 0, 1, 49152, + 49664, 49792, 49793, 49795, 49784, 49788, 0, 1, + 49152, 49664, 49792, 49793, 49795, 49784, 49788, 49790, + 0, 1, 49152, 49664, 0, 1, 49152, 49664, + 49792, 0, 1, 49152, 49664, 49792, 0, 1, + 49152, 49664, 49792, 49794, 0, 1, 49152, 49664, + 49792, 0, 1, 49152, 49664, 49792, 49796, 0, + 1, 49152, 49664, 49792, 49796, 0, 1, 49152, + 49664, 49792, 49800, 49798, 0, 1, 49152, 49664, + 49792, 0, 1, 49152, 49664, 49792, 49800, 0, + 1, 49152, 49664, 49792, 49800, 0, 1, 49152, + 49664, 49792, 49800, 49802, 0, 1, 49152, 49664, + 49792, 49800, 0, 1, 49152, 49664, 49792, 49808, + 49804, 0, 1, 49152, 49664, 49792, 49808, 49804, + 0, 1, 49152, 49664, 49792, 49808, 49809, 49806, + 0, 1, 49152, 49664, 49792, 0, 1, 49152, + 49664, 49792, 49808, 0, 1, 49152, 49664, 49792, + 49808, 0, 1, 49152, 49664, 49792, 49808, 49810, + 0, 1, 49152, 49664, 49792, 49808, 0, 1, + 49152, 49664, 49792, 49808, 49812, 0, 1, 49152, + 49664, 49792, 49808, 49812, 0, 1, 49152, 49664, + 49792, 49808, 49816, 49814, 0, 1, 49152, 49664, + 49792, 49808, 0, 1, 49152, 49664, 49792, 49824, + 49816, 0, 1, 49152, 49664, 49792, 49824, 49816, + 0, 1, 49152, 49664, 49792, 49824, 49816, 49818, + 0, 1, 49152, 49664, 49792, 49824, 49816, 0, + 1, 49152, 49664, 49792, 49824, 49825, 49820, 0, + 1, 49152, 49664, 49792, 49824, 49825, 49820, 0, + 1, 49152, 49664, 49792, 49824, 49825, 49820, 49822, + 0, 1, 49152, 49664, 49792, 0, 1, 49152, + 49664, 49792, 49824, 0, 1, 49152, 49664, 49792, + 49824, 0, 1, 49152, 49664, 49792, 49824, 49826, + 0, 1, 49152, 49664, 49792, 49824, 0, 1, + 49152, 49664, 49792, 49824, 49828, 0, 1, 49152, + 49664, 49792, 49824, 49828, 0, 1, 49152, 49664, + 49792, 49824, 49832, 49830, 0, 1, 49152, 49664, + 49792, 49824, 0, 1, 49152, 49664, 49792, 49824, + 49832, 0, 1, 49152, 49664, 49792, 49824, 49832, + 0, 1, 49152, 49664, 49792, 49824, 49832, 49834, + 0, 1, 49152, 49664, 49792, 49824, 49832, 0, + 1, 49152, 49664, 49792, 49824, 49840, 49836, 0, + 1, 49152, 49664, 49792, 49824, 49840, 49836, 0, + 1, 49152, 49664, 49792, 49824, 49840, 49841, 49838, + 0, 1, 49152, 49664, 49792, 49824, 0, 1, + 49152, 49664, 49792, 49856, 49840, 0, 1, 49152, + 49664, 49792, 49856, 49840, 0, 1, 49152, 49664, + 49792, 49856, 49840, 49842, 0, 1, 49152, 49664, + 49792, 49856, 49840, 0, 1, 49152, 49664, 49792, + 49856, 49840, 49844, 0, 1, 49152, 49664, 49792, + 49856, 49840, 49844, 0, 1, 49152, 49664, 49792, + 49856, 49840, 49848, 49846, 0, 1, 49152, 49664, + 49792, 49856, 49840, 0, 1, 49152, 49664, 49792, + 49856, 49857, 49848, 0, 1, 49152, 49664, 49792, + 49856, 49857, 49848, 0, 1, 49152, 49664, 49792, + 49856, 49857, 49848, 49850, 0, 1, 49152, 49664, + 49792, 49856, 49857, 49848, 0, 1, 49152, 49664, + 49792, 49856, 49857, 49848, 49852, 0, 1, 49152, + 49664, 49792, 49856, 49857, 49859, 49852, 0, 1, + 49152, 49664, 49792, 49856, 49857, 49859, 49852, 49854, + 0, 1, 49152, 49664, 49792, 0, 1, 49152, + 49664, 49920, 49856, 0, 1, 49152, 49664, 49920, + 49856, 0, 1, 49152, 49664, 49920, 49856, 49858, + 0, 1, 49152, 49664, 49920, 49856, 0, 1, + 49152, 49664, 49920, 49856, 49860, 0, 1, 49152, + 49664, 49920, 49856, 49860, 0, 1, 49152, 49664, + 49920, 49856, 49864, 49862, 0, 1, 49152, 49664, + 49920, 49856, 0, 1, 49152, 49664, 49920, 49856, + 49864, 0, 1, 49152, 49664, 49920, 49856, 49864, + 0, 1, 49152, 49664, 49920, 49856, 49864, 49866, + 0, 1, 49152, 49664, 49920, 49856, 49864, 0, + 1, 49152, 49664, 49920, 49856, 49872, 49868, 0, + 1, 49152, 49664, 49920, 49856, 49872, 49868, 0, + 1, 49152, 49664, 49920, 49856, 49872, 49873, 49870, + 0, 1, 49152, 49664, 49920, 49856, 0, 1, + 49152, 49664, 49920, 49856, 49872, 0, 1, 49152, + 49664, 49920, 49856, 49872, 0, 1, 49152, 49664, + 49920, 49856, 49872, 49874, 0, 1, 49152, 49664, + 49920, 49856, 49872, 0, 1, 49152, 49664, 49920, + 49856, 49872, 49876, 0, 1, 49152, 49664, 49920, + 49856, 49872, 49876, 0, 1, 49152, 49664, 49920, + 49856, 49872, 49880, 49878, 0, 1, 49152, 49664, + 49920, 49856, 49872, 0, 1, 49152, 49664, 49920, + 49856, 49888, 49880, 0, 1, 49152, 49664, 49920, + 49856, 49888, 49880, 0, 1, 49152, 49664, 49920, + 49856, 49888, 49880, 49882, 0, 1, 49152, 49664, + 49920, 49856, 49888, 49880, 0, 1, 49152, 49664, + 49920, 49856, 49888, 49889, 49884, 0, 1, 49152, + 49664, 49920, 49856, 49888, 49889, 49884, 0, 1, + 49152, 49664, 49920, 49856, 49888, 49889, 49884, 49886, + 0, 1, 49152, 49664, 49920, 49856, 0, 1, + 49152, 49664, 49920, 49921, 49888, 0, 1, 49152, + 49664, 49920, 49921, 49888, 0, 1, 49152, 49664, + 49920, 49921, 49888, 49890, 0, 1, 49152, 49664, + 49920, 49921, 49888, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49892, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49892, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49896, 49894, 0, 1, 49152, 49664, + 49920, 49921, 49888, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49896, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49896, 0, 1, 49152, 49664, 49920, + 49921, 49888, 49896, 49898, 0, 1, 49152, 49664, + 49920, 49921, 49888, 49896, 0, 1, 49152, 49664, + 49920, 49921, 49888, 49904, 49900, 0, 1, 49152, + 49664, 49920, 49921, 49888, 49904, 49900, 0, 1, + 49152, 49664, 49920, 49921, 49888, 49904, 49905, 49902, + 0, 1, 49152, 49664, 49920, 49921, 49888, 0, + 1, 49152, 49664, 49920, 49921, 49888, 49904, 0, + 1, 49152, 49664, 49920, 49921, 49923, 49904, 0, + 1, 49152, 49664, 49920, 49921, 49923, 49904, 49906, + 0, 1, 49152, 49664, 49920, 49921, 49923, 49904, + 0, 1, 49152, 49664, 49920, 49921, 49923, 49904, + 49908, 0, 1, 49152, 49664, 49920, 49921, 49923, + 49904, 49908, 0, 1, 49152, 49664, 49920, 49921, + 49923, 49904, 49912, 49910, 0, 1, 49152, 49664, + 49920, 49921, 49923, 49904, 0, 1, 49152, 49664, + 49920, 49921, 49923, 49904, 49912, 0, 1, 49152, + 49664, 49920, 49921, 49923, 49904, 49912, 0, 1, + 49152, 49664, 49920, 49921, 49923, 49904, 49912, 49914, + 0, 1, 49152, 49664, 49920, 49921, 49923, 49927, + 49912, 0, 1, 49152, 49664, 49920, 49921, 49923, + 49927, 49912, 49916, 0, 1, 49152, 49664, 49920, + 49921, 49923, 49927, 49912, 49916, 0, 1, 49152, + 49664, 49920, 49921, 49923, 49927, 49912, 49916, 49918, + 0, 1, 49152, 49664, 0, 1, 49152, 50176, + 49920, 0, 1, 49152, 50176, 49920, 0, 1, + 49152, 50176, 49920, 49922, 0, 1, 49152, 50176, + 49920, 0, 1, 49152, 50176, 49920, 49924, 0, + 1, 49152, 50176, 49920, 49924, 0, 1, 49152, + 50176, 49920, 49928, 49926, 0, 1, 49152, 50176, + 49920, 0, 1, 49152, 50176, 49920, 49928, 0, + 1, 49152, 50176, 49920, 49928, 0, 1, 49152, + 50176, 49920, 49928, 49930, 0, 1, 49152, 50176, + 49920, 49928, 0, 1, 49152, 50176, 49920, 49936, + 49932, 0, 1, 49152, 50176, 49920, 49936, 49932, + 0, 1, 49152, 50176, 49920, 49936, 49937, 49934, + 0, 1, 49152, 50176, 49920, 0, 1, 49152, + 50176, 49920, 49936, 0, 1, 49152, 50176, 49920, + 49936, 0, 1, 49152, 50176, 49920, 49936, 49938, + 0, 1, 49152, 50176, 49920, 49936, 0, 1, + 49152, 50176, 49920, 49936, 49940, 0, 1, 49152, + 50176, 49920, 49936, 49940, 0, 1, 49152, 50176, + 49920, 49936, 49944, 49942, 0, 1, 49152, 50176, + 49920, 49936, 0, 1, 49152, 50176, 49920, 49952, + 49944, 0, 1, 49152, 50176, 49920, 49952, 49944, + 0, 1, 49152, 50176, 49920, 49952, 49944, 49946, + 0, 1, 49152, 50176, 49920, 49952, 49944, 0, + 1, 49152, 50176, 49920, 49952, 49953, 49948, 0, + 1, 49152, 50176, 49920, 49952, 49953, 49948, 0, + 1, 49152, 50176, 49920, 49952, 49953, 49948, 49950, + 0, 1, 49152, 50176, 49920, 0, 1, 49152, + 50176, 49920, 49952, 0, 1, 49152, 50176, 49920, + 49952, 0, 1, 49152, 50176, 49920, 49952, 49954, + 0, 1, 49152, 50176, 49920, 49952, 0, 1, + 49152, 50176, 49920, 49952, 49956, 0, 1, 49152, + 50176, 49920, 49952, 49956, 0, 1, 49152, 50176, + 49920, 49952, 49960, 49958, 0, 1, 49152, 50176, + 49920, 49952, 0, 1, 49152, 50176, 49920, 49952, + 49960, 0, 1, 49152, 50176, 49920, 49952, 49960, + 0, 1, 49152, 50176, 49920, 49952, 49960, 49962, + 0, 1, 49152, 50176, 49920, 49952, 49960, 0, + 1, 49152, 50176, 49920, 49952, 49968, 49964, 0, + 1, 49152, 50176, 49920, 49952, 49968, 49964, 0, + 1, 49152, 50176, 49920, 49952, 49968, 49969, 49966, + 0, 1, 49152, 50176, 49920, 49952, 0, 1, + 49152, 50176, 49920, 49984, 49968, 0, 1, 49152, + 50176, 49920, 49984, 49968, 0, 1, 49152, 50176, + 49920, 49984, 49968, 49970, 0, 1, 49152, 50176, + 49920, 49984, 49968, 0, 1, 49152, 50176, 49920, + 49984, 49968, 49972, 0, 1, 49152, 50176, 49920, + 49984, 49968, 49972, 0, 1, 49152, 50176, 49920, + 49984, 49968, 49976, 49974, 0, 1, 49152, 50176, + 49920, 49984, 49968, 0, 1, 49152, 50176, 49920, + 49984, 49985, 49976, 0, 1, 49152, 50176, 49920, + 49984, 49985, 49976, 0, 1, 49152, 50176, 49920, + 49984, 49985, 49976, 49978, 0, 1, 49152, 50176, + 49920, 49984, 49985, 49976, 0, 1, 49152, 50176, + 49920, 49984, 49985, 49976, 49980, 0, 1, 49152, + 50176, 49920, 49984, 49985, 49987, 49980, 0, 1, + 49152, 50176, 49920, 49984, 49985, 49987, 49980, 49982, + 0, 1, 49152, 50176, 49920, 0, 1, 49152, + 50176, 49920, 49984, 0, 1, 49152, 50176, 49920, + 49984, 0, 1, 49152, 50176, 49920, 49984, 49986, + 0, 1, 49152, 50176, 49920, 49984, 0, 1, + 49152, 50176, 49920, 49984, 49988, 0, 1, 49152, + 50176, 49920, 49984, 49988, 0, 1, 49152, 50176, + 49920, 49984, 49992, 49990, 0, 1, 49152, 50176, + 49920, 49984, 0, 1, 49152, 50176, 49920, 49984, + 49992, 0, 1, 49152, 50176, 49920, 49984, 49992, + 0, 1, 49152, 50176, 49920, 49984, 49992, 49994, + 0, 1, 49152, 50176, 49920, 49984, 49992, 0, + 1, 49152, 50176, 49920, 49984, 50000, 49996, 0, + 1, 49152, 50176, 49920, 49984, 50000, 49996, 0, + 1, 49152, 50176, 49920, 49984, 50000, 50001, 49998, + 0, 1, 49152, 50176, 49920, 49984, 0, 1, + 49152, 50176, 49920, 49984, 50000, 0, 1, 49152, + 50176, 49920, 49984, 50000, 0, 1, 49152, 50176, + 49920, 49984, 50000, 50002, 0, 1, 49152, 50176, + 49920, 49984, 50000, 0, 1, 49152, 50176, 49920, + 49984, 50000, 50004, 0, 1, 49152, 50176, 49920, + 49984, 50000, 50004, 0, 1, 49152, 50176, 49920, + 49984, 50000, 50008, 50006, 0, 1, 49152, 50176, + 49920, 49984, 50000, 0, 1, 49152, 50176, 49920, + 49984, 50016, 50008, 0, 1, 49152, 50176, 49920, + 49984, 50016, 50008, 0, 1, 49152, 50176, 49920, + 49984, 50016, 50008, 50010, 0, 1, 49152, 50176, + 49920, 49984, 50016, 50008, 0, 1, 49152, 50176, + 49920, 49984, 50016, 50017, 50012, 0, 1, 49152, + 50176, 49920, 49984, 50016, 50017, 50012, 0, 1, + 49152, 50176, 49920, 49984, 50016, 50017, 50012, 50014, + 0, 1, 49152, 50176, 49920, 49984, 0, 1, + 49152, 50176, 49920, 50048, 50016, 0, 1, 49152, + 50176, 49920, 50048, 50016, 0, 1, 49152, 50176, + 49920, 50048, 50016, 50018, 0, 1, 49152, 50176, + 49920, 50048, 50016, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50020, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50020, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50024, 50022, 0, 1, 49152, 50176, + 49920, 50048, 50016, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50024, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50024, 0, 1, 49152, 50176, 49920, + 50048, 50016, 50024, 50026, 0, 1, 49152, 50176, + 49920, 50048, 50016, 50024, 0, 1, 49152, 50176, + 49920, 50048, 50016, 50032, 50028, 0, 1, 49152, + 50176, 49920, 50048, 50016, 50032, 50028, 0, 1, + 49152, 50176, 49920, 50048, 50016, 50032, 50033, 50030, + 0, 1, 49152, 50176, 49920, 50048, 50016, 0, + 1, 49152, 50176, 49920, 50048, 50049, 50032, 0, + 1, 49152, 50176, 49920, 50048, 50049, 50032, 0, + 1, 49152, 50176, 49920, 50048, 50049, 50032, 50034, + 0, 1, 49152, 50176, 49920, 50048, 50049, 50032, + 0, 1, 49152, 50176, 49920, 50048, 50049, 50032, + 50036, 0, 1, 49152, 50176, 49920, 50048, 50049, + 50032, 50036, 0, 1, 49152, 50176, 49920, 50048, + 50049, 50032, 50040, 50038, 0, 1, 49152, 50176, + 49920, 50048, 50049, 50032, 0, 1, 49152, 50176, + 49920, 50048, 50049, 50032, 50040, 0, 1, 49152, + 50176, 49920, 50048, 50049, 50051, 50040, 0, 1, + 49152, 50176, 49920, 50048, 50049, 50051, 50040, 50042, + 0, 1, 49152, 50176, 49920, 50048, 50049, 50051, + 50040, 0, 1, 49152, 50176, 49920, 50048, 50049, + 50051, 50040, 50044, 0, 1, 49152, 50176, 49920, + 50048, 50049, 50051, 50040, 50044, 0, 1, 49152, + 50176, 49920, 50048, 50049, 50051, 50040, 50044, 50046, + 0, 1, 49152, 50176, 49920, 0, 1, 49152, + 50176, 49920, 50048, 0, 1, 49152, 50176, 50177, + 50048, 0, 1, 49152, 50176, 50177, 50048, 50050, + 0, 1, 49152, 50176, 50177, 50048, 0, 1, + 49152, 50176, 50177, 50048, 50052, 0, 1, 49152, + 50176, 50177, 50048, 50052, 0, 1, 49152, 50176, + 50177, 50048, 50056, 50054, 0, 1, 49152, 50176, + 50177, 50048, 0, 1, 49152, 50176, 50177, 50048, + 50056, 0, 1, 49152, 50176, 50177, 50048, 50056, + 0, 1, 49152, 50176, 50177, 50048, 50056, 50058, + 0, 1, 49152, 50176, 50177, 50048, 50056, 0, + 1, 49152, 50176, 50177, 50048, 50064, 50060, 0, + 1, 49152, 50176, 50177, 50048, 50064, 50060, 0, + 1, 49152, 50176, 50177, 50048, 50064, 50065, 50062, + 0, 1, 49152, 50176, 50177, 50048, 0, 1, + 49152, 50176, 50177, 50048, 50064, 0, 1, 49152, + 50176, 50177, 50048, 50064, 0, 1, 49152, 50176, + 50177, 50048, 50064, 50066, 0, 1, 49152, 50176, + 50177, 50048, 50064, 0, 1, 49152, 50176, 50177, + 50048, 50064, 50068, 0, 1, 49152, 50176, 50177, + 50048, 50064, 50068, 0, 1, 49152, 50176, 50177, + 50048, 50064, 50072, 50070, 0, 1, 49152, 50176, + 50177, 50048, 50064, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50072, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50072, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50072, 50074, 0, 1, 49152, 50176, + 50177, 50048, 50080, 50072, 0, 1, 49152, 50176, + 50177, 50048, 50080, 50081, 50076, 0, 1, 49152, + 50176, 50177, 50048, 50080, 50081, 50076, 0, 1, + 49152, 50176, 50177, 50048, 50080, 50081, 50076, 50078, + 0, 1, 49152, 50176, 50177, 50048, 0, 1, + 49152, 50176, 50177, 50048, 50080, 0, 1, 49152, + 50176, 50177, 50048, 50080, 0, 1, 49152, 50176, + 50177, 50048, 50080, 50082, 0, 1, 49152, 50176, + 50177, 50048, 50080, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50084, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50084, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50088, 50086, 0, 1, 49152, 50176, + 50177, 50048, 50080, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50088, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50088, 0, 1, 49152, 50176, 50177, + 50048, 50080, 50088, 50090, 0, 1, 49152, 50176, + 50177, 50048, 50080, 50088, 0, 1, 49152, 50176, + 50177, 50048, 50080, 50096, 50092, 0, 1, 49152, + 50176, 50177, 50048, 50080, 50096, 50092, 0, 1, + 49152, 50176, 50177, 50048, 50080, 50096, 50097, 50094, + 0, 1, 49152, 50176, 50177, 50048, 50080, 0, + 1, 49152, 50176, 50177, 50048, 50112, 50096, 0, + 1, 49152, 50176, 50177, 50048, 50112, 50096, 0, + 1, 49152, 50176, 50177, 50048, 50112, 50096, 50098, + 0, 1, 49152, 50176, 50177, 50048, 50112, 50096, + 0, 1, 49152, 50176, 50177, 50048, 50112, 50096, + 50100, 0, 1, 49152, 50176, 50177, 50048, 50112, + 50096, 50100, 0, 1, 49152, 50176, 50177, 50048, + 50112, 50096, 50104, 50102, 0, 1, 49152, 50176, + 50177, 50048, 50112, 50096, 0, 1, 49152, 50176, + 50177, 50048, 50112, 50113, 50104, 0, 1, 49152, + 50176, 50177, 50048, 50112, 50113, 50104, 0, 1, + 49152, 50176, 50177, 50048, 50112, 50113, 50104, 50106, + 0, 1, 49152, 50176, 50177, 50048, 50112, 50113, + 50104, 0, 1, 49152, 50176, 50177, 50048, 50112, + 50113, 50104, 50108, 0, 1, 49152, 50176, 50177, + 50048, 50112, 50113, 50115, 50108, 0, 1, 49152, + 50176, 50177, 50048, 50112, 50113, 50115, 50108, 50110, + 0, 1, 49152, 50176, 50177, 50048, 0, 1, + 49152, 50176, 50177, 50048, 50112, 0, 1, 49152, + 50176, 50177, 50048, 50112, 0, 1, 49152, 50176, + 50177, 50048, 50112, 50114, 0, 1, 49152, 50176, + 50177, 50179, 50112, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50116, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50116, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50120, 50118, 0, 1, 49152, 50176, + 50177, 50179, 50112, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50120, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50120, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50120, 50122, 0, 1, 49152, 50176, + 50177, 50179, 50112, 50120, 0, 1, 49152, 50176, + 50177, 50179, 50112, 50128, 50124, 0, 1, 49152, + 50176, 50177, 50179, 50112, 50128, 50124, 0, 1, + 49152, 50176, 50177, 50179, 50112, 50128, 50129, 50126, + 0, 1, 49152, 50176, 50177, 50179, 50112, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50128, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50128, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50128, 50130, + 0, 1, 49152, 50176, 50177, 50179, 50112, 50128, + 0, 1, 49152, 50176, 50177, 50179, 50112, 50128, + 50132, 0, 1, 49152, 50176, 50177, 50179, 50112, + 50128, 50132, 0, 1, 49152, 50176, 50177, 50179, + 50112, 50128, 50136, 50134, 0, 1, 49152, 50176, + 50177, 50179, 50112, 50128, 0, 1, 49152, 50176, + 50177, 50179, 50112, 50144, 50136, 0, 1, 49152, + 50176, 50177, 50179, 50112, 50144, 50136, 0, 1, + 49152, 50176, 50177, 50179, 50112, 50144, 50136, 50138, + 0, 1, 49152, 50176, 50177, 50179, 50112, 50144, + 50136, 0, 1, 49152, 50176, 50177, 50179, 50112, + 50144, 50145, 50140, 0, 1, 49152, 50176, 50177, + 50179, 50112, 50144, 50145, 50140, 0, 1, 49152, + 50176, 50177, 50179, 50112, 50144, 50145, 50140, 50142, + 0, 1, 49152, 50176, 50177, 50179, 50112, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50144, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50144, 0, + 1, 49152, 50176, 50177, 50179, 50112, 50144, 50146, + 0, 1, 49152, 50176, 50177, 50179, 50112, 50144, + 0, 1, 49152, 50176, 50177, 50179, 50112, 50144, + 50148, 0, 1, 49152, 50176, 50177, 50179, 50112, + 50144, 50148, 0, 1, 49152, 50176, 50177, 50179, + 50112, 50144, 50152, 50150, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 50152, 0, 1, 49152, + 50176, 50177, 50179, 50183, 50144, 50152, 0, 1, + 49152, 50176, 50177, 50179, 50183, 50144, 50152, 50154, + 0, 1, 49152, 50176, 50177, 50179, 50183, 50144, + 50152, 0, 1, 49152, 50176, 50177, 50179, 50183, + 50144, 50160, 50156, 0, 1, 49152, 50176, 50177, + 50179, 50183, 50144, 50160, 50156, 0, 1, 49152, + 50176, 50177, 50179, 50183, 50144, 50160, 50161, 50158, + 0, 1, 49152, 50176, 50177, 50179, 50183, 50144, + 0, 1, 49152, 50176, 50177, 50179, 50183, 50144, + 50160, 0, 1, 49152, 50176, 50177, 50179, 50183, + 50144, 50160, 0, 1, 49152, 50176, 50177, 50179, + 50183, 50144, 50160, 50162, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 50160, 0, 1, 49152, + 50176, 50177, 50179, 50183, 50144, 50160, 50164, 0, + 1, 49152, 50176, 50177, 50179, 50183, 50144, 50160, + 50164, 0, 1, 49152, 50176, 50177, 50179, 50183, + 50144, 50160, 50168, 50166, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 50160, 0, 1, 49152, + 50176, 50177, 50179, 50183, 50144, 50160, 50168, 0, + 1, 49152, 50176, 50177, 50179, 50183, 50144, 50160, + 50168, 0, 1, 49152, 50176, 50177, 50179, 50183, + 50144, 50160, 50168, 50170, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 50160, 50168, 0, 1, + 49152, 50176, 50177, 50179, 50183, 50144, 50160, 50168, + 50172, 0, 1, 49152, 50176, 50177, 50179, 50183, + 50144, 50160, 50168, 50172, 0, 1, 49152, 50176, + 50177, 50179, 50183, 50144, 50160, 50168, 50172, 50174, + 0, 1, 49152, 0, 1, 49152, 50176, 0, + 1, 49152, 50176, 0, 1, 49152, 50176, 50178, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50180, 0, 1, 49152, 50176, 50180, 0, 1, + 49152, 50176, 50184, 50182, 0, 1, 49152, 50176, + 0, 1, 49152, 50176, 50184, 0, 1, 49152, + 50176, 50184, 0, 1, 49152, 50176, 50184, 50186, + 0, 1, 49152, 50176, 50184, 0, 1, 49152, + 50176, 50192, 50188, 0, 1, 49152, 50176, 50192, + 50188, 0, 1, 49152, 50176, 50192, 50193, 50190, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50192, 0, 1, 49152, 50176, 50192, 0, 1, + 49152, 50176, 50192, 50194, 0, 1, 49152, 50176, + 50192, 0, 1, 49152, 50176, 50192, 50196, 0, + 1, 49152, 50176, 50192, 50196, 0, 1, 49152, + 50176, 50192, 50200, 50198, 0, 1, 49152, 50176, + 50192, 0, 1, 49152, 50176, 50208, 50200, 0, + 1, 49152, 50176, 50208, 50200, 0, 1, 49152, + 50176, 50208, 50200, 50202, 0, 1, 49152, 50176, + 50208, 50200, 0, 1, 49152, 50176, 50208, 50209, + 50204, 0, 1, 49152, 50176, 50208, 50209, 50204, + 0, 1, 49152, 50176, 50208, 50209, 50204, 50206, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50208, 0, 1, 49152, 50176, 50208, 0, 1, + 49152, 50176, 50208, 50210, 0, 1, 49152, 50176, + 50208, 0, 1, 49152, 50176, 50208, 50212, 0, + 1, 49152, 50176, 50208, 50212, 0, 1, 49152, + 50176, 50208, 50216, 50214, 0, 1, 49152, 50176, + 50208, 0, 1, 49152, 50176, 50208, 50216, 0, + 1, 49152, 50176, 50208, 50216, 0, 1, 49152, + 50176, 50208, 50216, 50218, 0, 1, 49152, 50176, + 50208, 50216, 0, 1, 49152, 50176, 50208, 50224, + 50220, 0, 1, 49152, 50176, 50208, 50224, 50220, + 0, 1, 49152, 50176, 50208, 50224, 50225, 50222, + 0, 1, 49152, 50176, 50208, 0, 1, 49152, + 50176, 50240, 50224, 0, 1, 49152, 50176, 50240, + 50224, 0, 1, 49152, 50176, 50240, 50224, 50226, + 0, 1, 49152, 50176, 50240, 50224, 0, 1, + 49152, 50176, 50240, 50224, 50228, 0, 1, 49152, + 50176, 50240, 50224, 50228, 0, 1, 49152, 50176, + 50240, 50224, 50232, 50230, 0, 1, 49152, 50176, + 50240, 50224, 0, 1, 49152, 50176, 50240, 50241, + 50232, 0, 1, 49152, 50176, 50240, 50241, 50232, + 0, 1, 49152, 50176, 50240, 50241, 50232, 50234, + 0, 1, 49152, 50176, 50240, 50241, 50232, 0, + 1, 49152, 50176, 50240, 50241, 50232, 50236, 0, + 1, 49152, 50176, 50240, 50241, 50243, 50236, 0, + 1, 49152, 50176, 50240, 50241, 50243, 50236, 50238, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50240, 0, 1, 49152, 50176, 50240, 0, 1, + 49152, 50176, 50240, 50242, 0, 1, 49152, 50176, + 50240, 0, 1, 49152, 50176, 50240, 50244, 0, + 1, 49152, 50176, 50240, 50244, 0, 1, 49152, + 50176, 50240, 50248, 50246, 0, 1, 49152, 50176, + 50240, 0, 1, 49152, 50176, 50240, 50248, 0, + 1, 49152, 50176, 50240, 50248, 0, 1, 49152, + 50176, 50240, 50248, 50250, 0, 1, 49152, 50176, + 50240, 50248, 0, 1, 49152, 50176, 50240, 50256, + 50252, 0, 1, 49152, 50176, 50240, 50256, 50252, + 0, 1, 49152, 50176, 50240, 50256, 50257, 50254, + 0, 1, 49152, 50176, 50240, 0, 1, 49152, + 50176, 50240, 50256, 0, 1, 49152, 50176, 50240, + 50256, 0, 1, 49152, 50176, 50240, 50256, 50258, + 0, 1, 49152, 50176, 50240, 50256, 0, 1, + 49152, 50176, 50240, 50256, 50260, 0, 1, 49152, + 50176, 50240, 50256, 50260, 0, 1, 49152, 50176, + 50240, 50256, 50264, 50262, 0, 1, 49152, 50176, + 50240, 50256, 0, 1, 49152, 50176, 50240, 50272, + 50264, 0, 1, 49152, 50176, 50240, 50272, 50264, + 0, 1, 49152, 50176, 50240, 50272, 50264, 50266, + 0, 1, 49152, 50176, 50240, 50272, 50264, 0, + 1, 49152, 50176, 50240, 50272, 50273, 50268, 0, + 1, 49152, 50176, 50240, 50272, 50273, 50268, 0, + 1, 49152, 50176, 50240, 50272, 50273, 50268, 50270, + 0, 1, 49152, 50176, 50240, 0, 1, 49152, + 50176, 50304, 50272, 0, 1, 49152, 50176, 50304, + 50272, 0, 1, 49152, 50176, 50304, 50272, 50274, + 0, 1, 49152, 50176, 50304, 50272, 0, 1, + 49152, 50176, 50304, 50272, 50276, 0, 1, 49152, + 50176, 50304, 50272, 50276, 0, 1, 49152, 50176, + 50304, 50272, 50280, 50278, 0, 1, 49152, 50176, + 50304, 50272, 0, 1, 49152, 50176, 50304, 50272, + 50280, 0, 1, 49152, 50176, 50304, 50272, 50280, + 0, 1, 49152, 50176, 50304, 50272, 50280, 50282, + 0, 1, 49152, 50176, 50304, 50272, 50280, 0, + 1, 49152, 50176, 50304, 50272, 50288, 50284, 0, + 1, 49152, 50176, 50304, 50272, 50288, 50284, 0, + 1, 49152, 50176, 50304, 50272, 50288, 50289, 50286, + 0, 1, 49152, 50176, 50304, 50272, 0, 1, + 49152, 50176, 50304, 50305, 50288, 0, 1, 49152, + 50176, 50304, 50305, 50288, 0, 1, 49152, 50176, + 50304, 50305, 50288, 50290, 0, 1, 49152, 50176, + 50304, 50305, 50288, 0, 1, 49152, 50176, 50304, + 50305, 50288, 50292, 0, 1, 49152, 50176, 50304, + 50305, 50288, 50292, 0, 1, 49152, 50176, 50304, + 50305, 50288, 50296, 50294, 0, 1, 49152, 50176, + 50304, 50305, 50288, 0, 1, 49152, 50176, 50304, + 50305, 50288, 50296, 0, 1, 49152, 50176, 50304, + 50305, 50307, 50296, 0, 1, 49152, 50176, 50304, + 50305, 50307, 50296, 50298, 0, 1, 49152, 50176, + 50304, 50305, 50307, 50296, 0, 1, 49152, 50176, + 50304, 50305, 50307, 50296, 50300, 0, 1, 49152, + 50176, 50304, 50305, 50307, 50296, 50300, 0, 1, + 49152, 50176, 50304, 50305, 50307, 50296, 50300, 50302, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50304, 0, 1, 49152, 50176, 50304, 0, 1, + 49152, 50176, 50304, 50306, 0, 1, 49152, 50176, + 50304, 0, 1, 49152, 50176, 50304, 50308, 0, + 1, 49152, 50176, 50304, 50308, 0, 1, 49152, + 50176, 50304, 50312, 50310, 0, 1, 49152, 50176, + 50304, 0, 1, 49152, 50176, 50304, 50312, 0, + 1, 49152, 50176, 50304, 50312, 0, 1, 49152, + 50176, 50304, 50312, 50314, 0, 1, 49152, 50176, + 50304, 50312, 0, 1, 49152, 50176, 50304, 50320, + 50316, 0, 1, 49152, 50176, 50304, 50320, 50316, + 0, 1, 49152, 50176, 50304, 50320, 50321, 50318, + 0, 1, 49152, 50176, 50304, 0, 1, 49152, + 50176, 50304, 50320, 0, 1, 49152, 50176, 50304, + 50320, 0, 1, 49152, 50176, 50304, 50320, 50322, + 0, 1, 49152, 50176, 50304, 50320, 0, 1, + 49152, 50176, 50304, 50320, 50324, 0, 1, 49152, + 50176, 50304, 50320, 50324, 0, 1, 49152, 50176, + 50304, 50320, 50328, 50326, 0, 1, 49152, 50176, + 50304, 50320, 0, 1, 49152, 50176, 50304, 50336, + 50328, 0, 1, 49152, 50176, 50304, 50336, 50328, + 0, 1, 49152, 50176, 50304, 50336, 50328, 50330, + 0, 1, 49152, 50176, 50304, 50336, 50328, 0, + 1, 49152, 50176, 50304, 50336, 50337, 50332, 0, + 1, 49152, 50176, 50304, 50336, 50337, 50332, 0, + 1, 49152, 50176, 50304, 50336, 50337, 50332, 50334, + 0, 1, 49152, 50176, 50304, 0, 1, 49152, + 50176, 50304, 50336, 0, 1, 49152, 50176, 50304, + 50336, 0, 1, 49152, 50176, 50304, 50336, 50338, + 0, 1, 49152, 50176, 50304, 50336, 0, 1, + 49152, 50176, 50304, 50336, 50340, 0, 1, 49152, + 50176, 50304, 50336, 50340, 0, 1, 49152, 50176, + 50304, 50336, 50344, 50342, 0, 1, 49152, 50176, + 50304, 50336, 0, 1, 49152, 50176, 50304, 50336, + 50344, 0, 1, 49152, 50176, 50304, 50336, 50344, + 0, 1, 49152, 50176, 50304, 50336, 50344, 50346, + 0, 1, 49152, 50176, 50304, 50336, 50344, 0, + 1, 49152, 50176, 50304, 50336, 50352, 50348, 0, + 1, 49152, 50176, 50304, 50336, 50352, 50348, 0, + 1, 49152, 50176, 50304, 50336, 50352, 50353, 50350, + 0, 1, 49152, 50176, 50304, 50336, 0, 1, + 49152, 50176, 50304, 50368, 50352, 0, 1, 49152, + 50176, 50304, 50368, 50352, 0, 1, 49152, 50176, + 50304, 50368, 50352, 50354, 0, 1, 49152, 50176, + 50304, 50368, 50352, 0, 1, 49152, 50176, 50304, + 50368, 50352, 50356, 0, 1, 49152, 50176, 50304, + 50368, 50352, 50356, 0, 1, 49152, 50176, 50304, + 50368, 50352, 50360, 50358, 0, 1, 49152, 50176, + 50304, 50368, 50352, 0, 1, 49152, 50176, 50304, + 50368, 50369, 50360, 0, 1, 49152, 50176, 50304, + 50368, 50369, 50360, 0, 1, 49152, 50176, 50304, + 50368, 50369, 50360, 50362, 0, 1, 49152, 50176, + 50304, 50368, 50369, 50360, 0, 1, 49152, 50176, + 50304, 50368, 50369, 50360, 50364, 0, 1, 49152, + 50176, 50304, 50368, 50369, 50371, 50364, 0, 1, + 49152, 50176, 50304, 50368, 50369, 50371, 50364, 50366, + 0, 1, 49152, 50176, 50304, 0, 1, 49152, + 50176, 50432, 50368, 0, 1, 49152, 50176, 50432, + 50368, 0, 1, 49152, 50176, 50432, 50368, 50370, + 0, 1, 49152, 50176, 50432, 50368, 0, 1, + 49152, 50176, 50432, 50368, 50372, 0, 1, 49152, + 50176, 50432, 50368, 50372, 0, 1, 49152, 50176, + 50432, 50368, 50376, 50374, 0, 1, 49152, 50176, + 50432, 50368, 0, 1, 49152, 50176, 50432, 50368, + 50376, 0, 1, 49152, 50176, 50432, 50368, 50376, + 0, 1, 49152, 50176, 50432, 50368, 50376, 50378, + 0, 1, 49152, 50176, 50432, 50368, 50376, 0, + 1, 49152, 50176, 50432, 50368, 50384, 50380, 0, + 1, 49152, 50176, 50432, 50368, 50384, 50380, 0, + 1, 49152, 50176, 50432, 50368, 50384, 50385, 50382, + 0, 1, 49152, 50176, 50432, 50368, 0, 1, + 49152, 50176, 50432, 50368, 50384, 0, 1, 49152, + 50176, 50432, 50368, 50384, 0, 1, 49152, 50176, + 50432, 50368, 50384, 50386, 0, 1, 49152, 50176, + 50432, 50368, 50384, 0, 1, 49152, 50176, 50432, + 50368, 50384, 50388, 0, 1, 49152, 50176, 50432, + 50368, 50384, 50388, 0, 1, 49152, 50176, 50432, + 50368, 50384, 50392, 50390, 0, 1, 49152, 50176, + 50432, 50368, 50384, 0, 1, 49152, 50176, 50432, + 50368, 50400, 50392, 0, 1, 49152, 50176, 50432, + 50368, 50400, 50392, 0, 1, 49152, 50176, 50432, + 50368, 50400, 50392, 50394, 0, 1, 49152, 50176, + 50432, 50368, 50400, 50392, 0, 1, 49152, 50176, + 50432, 50368, 50400, 50401, 50396, 0, 1, 49152, + 50176, 50432, 50368, 50400, 50401, 50396, 0, 1, + 49152, 50176, 50432, 50368, 50400, 50401, 50396, 50398, + 0, 1, 49152, 50176, 50432, 50368, 0, 1, + 49152, 50176, 50432, 50433, 50400, 0, 1, 49152, + 50176, 50432, 50433, 50400, 0, 1, 49152, 50176, + 50432, 50433, 50400, 50402, 0, 1, 49152, 50176, + 50432, 50433, 50400, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50404, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50404, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50408, 50406, 0, 1, 49152, 50176, + 50432, 50433, 50400, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50408, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50408, 0, 1, 49152, 50176, 50432, + 50433, 50400, 50408, 50410, 0, 1, 49152, 50176, + 50432, 50433, 50400, 50408, 0, 1, 49152, 50176, + 50432, 50433, 50400, 50416, 50412, 0, 1, 49152, + 50176, 50432, 50433, 50400, 50416, 50412, 0, 1, + 49152, 50176, 50432, 50433, 50400, 50416, 50417, 50414, + 0, 1, 49152, 50176, 50432, 50433, 50400, 0, + 1, 49152, 50176, 50432, 50433, 50400, 50416, 0, + 1, 49152, 50176, 50432, 50433, 50435, 50416, 0, + 1, 49152, 50176, 50432, 50433, 50435, 50416, 50418, + 0, 1, 49152, 50176, 50432, 50433, 50435, 50416, + 0, 1, 49152, 50176, 50432, 50433, 50435, 50416, + 50420, 0, 1, 49152, 50176, 50432, 50433, 50435, + 50416, 50420, 0, 1, 49152, 50176, 50432, 50433, + 50435, 50416, 50424, 50422, 0, 1, 49152, 50176, + 50432, 50433, 50435, 50416, 0, 1, 49152, 50176, + 50432, 50433, 50435, 50416, 50424, 0, 1, 49152, + 50176, 50432, 50433, 50435, 50416, 50424, 0, 1, + 49152, 50176, 50432, 50433, 50435, 50416, 50424, 50426, + 0, 1, 49152, 50176, 50432, 50433, 50435, 50439, + 50424, 0, 1, 49152, 50176, 50432, 50433, 50435, + 50439, 50424, 50428, 0, 1, 49152, 50176, 50432, + 50433, 50435, 50439, 50424, 50428, 0, 1, 49152, + 50176, 50432, 50433, 50435, 50439, 50424, 50428, 50430, + 0, 1, 49152, 50176, 0, 1, 49152, 50176, + 50432, 0, 1, 49152, 50176, 50432, 0, 1, + 49152, 50176, 50432, 50434, 0, 1, 49152, 50176, + 50432, 0, 1, 49152, 50176, 50432, 50436, 0, + 1, 49152, 50176, 50432, 50436, 0, 1, 49152, + 50176, 50432, 50440, 50438, 0, 1, 49152, 50176, + 50432, 0, 1, 49152, 50176, 50432, 50440, 0, + 1, 49152, 50176, 50432, 50440, 0, 1, 49152, + 50176, 50432, 50440, 50442, 0, 1, 49152, 50176, + 50432, 50440, 0, 1, 49152, 50176, 50432, 50448, + 50444, 0, 1, 49152, 50176, 50432, 50448, 50444, + 0, 1, 49152, 50176, 50432, 50448, 50449, 50446, + 0, 1, 49152, 50176, 50432, 0, 1, 49152, + 50176, 50432, 50448, 0, 1, 49152, 50176, 50432, + 50448, 0, 1, 49152, 50176, 50432, 50448, 50450, + 0, 1, 49152, 50176, 50432, 50448, 0, 1, + 49152, 50176, 50432, 50448, 50452, 0, 1, 49152, + 50176, 50432, 50448, 50452, 0, 1, 49152, 50176, + 50432, 50448, 50456, 50454, 0, 1, 49152, 50176, + 50432, 50448, 0, 1, 49152, 50176, 50432, 50464, + 50456, 0, 1, 49152, 50176, 50432, 50464, 50456, + 0, 1, 49152, 50176, 50432, 50464, 50456, 50458, + 0, 1, 49152, 50176, 50432, 50464, 50456, 0, + 1, 49152, 50176, 50432, 50464, 50465, 50460, 0, + 1, 49152, 50176, 50432, 50464, 50465, 50460, 0, + 1, 49152, 50176, 50432, 50464, 50465, 50460, 50462, + 0, 1, 49152, 50176, 50432, 0, 1, 49152, + 50176, 50432, 50464, 0, 1, 49152, 50176, 50432, + 50464, 0, 1, 49152, 50176, 50432, 50464, 50466, + 0, 1, 49152, 50176, 50432, 50464, 0, 1, + 49152, 50176, 50432, 50464, 50468, 0, 1, 49152, + 50176, 50432, 50464, 50468, 0, 1, 49152, 50176, + 50432, 50464, 50472, 50470, 0, 1, 49152, 50176, + 50432, 50464, 0, 1, 49152, 50176, 50432, 50464, + 50472, 0, 1, 49152, 50176, 50432, 50464, 50472, + 0, 1, 49152, 50176, 50432, 50464, 50472, 50474, + 0, 1, 49152, 50176, 50432, 50464, 50472, 0, + 1, 49152, 50176, 50432, 50464, 50480, 50476, 0, + 1, 49152, 50176, 50432, 50464, 50480, 50476, 0, + 1, 49152, 50176, 50432, 50464, 50480, 50481, 50478, + 0, 1, 49152, 50176, 50432, 50464, 0, 1, + 49152, 50176, 50432, 50496, 50480, 0, 1, 49152, + 50176, 50432, 50496, 50480, 0, 1, 49152, 50176, + 50432, 50496, 50480, 50482, 0, 1, 49152, 50176, + 50432, 50496, 50480, 0, 1, 49152, 50176, 50432, + 50496, 50480, 50484, 0, 1, 49152, 50176, 50432, + 50496, 50480, 50484, 0, 1, 49152, 50176, 50432, + 50496, 50480, 50488, 50486, 0, 1, 49152, 50176, + 50432, 50496, 50480, 0, 1, 49152, 50176, 50432, + 50496, 50497, 50488, 0, 1, 49152, 50176, 50432, + 50496, 50497, 50488, 0, 1, 49152, 50176, 50432, + 50496, 50497, 50488, 50490, 0, 1, 49152, 50176, + 50432, 50496, 50497, 50488, 0, 1, 49152, 50176, + 50432, 50496, 50497, 50488, 50492, 0, 1, 49152, + 50176, 50432, 50496, 50497, 50499, 50492, 0, 1, + 49152, 50176, 50432, 50496, 50497, 50499, 50492, 50494, + 0, 1, 49152, 50176, 50432, 0, 1, 49152, + 50176, 50432, 50496, 0, 1, 49152, 50176, 50432, + 50496, 0, 1, 49152, 50176, 50432, 50496, 50498, + 0, 1, 49152, 50176, 50432, 50496, 0, 1, + 49152, 50176, 50432, 50496, 50500, 0, 1, 49152, + 50176, 50432, 50496, 50500, 0, 1, 49152, 50176, + 50432, 50496, 50504, 50502, 0, 1, 49152, 50176, + 50432, 50496, 0, 1, 49152, 50176, 50432, 50496, + 50504, 0, 1, 49152, 50176, 50432, 50496, 50504, + 0, 1, 49152, 50176, 50432, 50496, 50504, 50506, + 0, 1, 49152, 50176, 50432, 50496, 50504, 0, + 1, 49152, 50176, 50432, 50496, 50512, 50508, 0, + 1, 49152, 50176, 50432, 50496, 50512, 50508, 0, + 1, 49152, 50176, 50432, 50496, 50512, 50513, 50510, + 0, 1, 49152, 50176, 50432, 50496, 0, 1, + 49152, 50176, 50432, 50496, 50512, 0, 1, 49152, + 50176, 50432, 50496, 50512, 0, 1, 49152, 50176, + 50432, 50496, 50512, 50514, 0, 1, 49152, 50176, + 50432, 50496, 50512, 0, 1, 49152, 50176, 50432, + 50496, 50512, 50516, 0, 1, 49152, 50176, 50432, + 50496, 50512, 50516, 0, 1, 49152, 50176, 50432, + 50496, 50512, 50520, 50518, 0, 1, 49152, 50176, + 50432, 50496, 50512, 0, 1, 49152, 50176, 50432, + 50496, 50528, 50520, 0, 1, 49152, 50176, 50432, + 50496, 50528, 50520, 0, 1, 49152, 50176, 50432, + 50496, 50528, 50520, 50522, 0, 1, 49152, 50176, + 50432, 50496, 50528, 50520, 0, 1, 49152, 50176, + 50432, 50496, 50528, 50529, 50524, 0, 1, 49152, + 50176, 50432, 50496, 50528, 50529, 50524, 0, 1, + 49152, 50176, 50432, 50496, 50528, 50529, 50524, 50526, + 0, 1, 49152, 50176, 50432, 50496, 0, 1, + 49152, 50176, 50432, 50560, 50528, 0, 1, 49152, + 50176, 50432, 50560, 50528, 0, 1, 49152, 50176, + 50432, 50560, 50528, 50530, 0, 1, 49152, 50176, + 50432, 50560, 50528, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50532, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50532, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50536, 50534, 0, 1, 49152, 50176, + 50432, 50560, 50528, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50536, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50536, 0, 1, 49152, 50176, 50432, + 50560, 50528, 50536, 50538, 0, 1, 49152, 50176, + 50432, 50560, 50528, 50536, 0, 1, 49152, 50176, + 50432, 50560, 50528, 50544, 50540, 0, 1, 49152, + 50176, 50432, 50560, 50528, 50544, 50540, 0, 1, + 49152, 50176, 50432, 50560, 50528, 50544, 50545, 50542, + 0, 1, 49152, 50176, 50432, 50560, 50528, 0, + 1, 49152, 50176, 50432, 50560, 50561, 50544, 0, + 1, 49152, 50176, 50432, 50560, 50561, 50544, 0, + 1, 49152, 50176, 50432, 50560, 50561, 50544, 50546, + 0, 1, 49152, 50176, 50432, 50560, 50561, 50544, + 0, 1, 49152, 50176, 50432, 50560, 50561, 50544, + 50548, 0, 1, 49152, 50176, 50432, 50560, 50561, + 50544, 50548, 0, 1, 49152, 50176, 50432, 50560, + 50561, 50544, 50552, 50550, 0, 1, 49152, 50176, + 50432, 50560, 50561, 50544, 0, 1, 49152, 50176, + 50432, 50560, 50561, 50544, 50552, 0, 1, 49152, + 50176, 50432, 50560, 50561, 50563, 50552, 0, 1, + 49152, 50176, 50432, 50560, 50561, 50563, 50552, 50554, + 0, 1, 49152, 50176, 50432, 50560, 50561, 50563, + 50552, 0, 1, 49152, 50176, 50432, 50560, 50561, + 50563, 50552, 50556, 0, 1, 49152, 50176, 50432, + 50560, 50561, 50563, 50552, 50556, 0, 1, 49152, + 50176, 50432, 50560, 50561, 50563, 50552, 50556, 50558, + 0, 1, 49152, 50176, 50432, 0, 1, 49152, + 50176, 50688, 50560, 0, 1, 49152, 50176, 50688, + 50560, 0, 1, 49152, 50176, 50688, 50560, 50562, + 0, 1, 49152, 50176, 50688, 50560, 0, 1, + 49152, 50176, 50688, 50560, 50564, 0, 1, 49152, + 50176, 50688, 50560, 50564, 0, 1, 49152, 50176, + 50688, 50560, 50568, 50566, 0, 1, 49152, 50176, + 50688, 50560, 0, 1, 49152, 50176, 50688, 50560, + 50568, 0, 1, 49152, 50176, 50688, 50560, 50568, + 0, 1, 49152, 50176, 50688, 50560, 50568, 50570, + 0, 1, 49152, 50176, 50688, 50560, 50568, 0, + 1, 49152, 50176, 50688, 50560, 50576, 50572, 0, + 1, 49152, 50176, 50688, 50560, 50576, 50572, 0, + 1, 49152, 50176, 50688, 50560, 50576, 50577, 50574, + 0, 1, 49152, 50176, 50688, 50560, 0, 1, + 49152, 50176, 50688, 50560, 50576, 0, 1, 49152, + 50176, 50688, 50560, 50576, 0, 1, 49152, 50176, + 50688, 50560, 50576, 50578, 0, 1, 49152, 50176, + 50688, 50560, 50576, 0, 1, 49152, 50176, 50688, + 50560, 50576, 50580, 0, 1, 49152, 50176, 50688, + 50560, 50576, 50580, 0, 1, 49152, 50176, 50688, + 50560, 50576, 50584, 50582, 0, 1, 49152, 50176, + 50688, 50560, 50576, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50584, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50584, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50584, 50586, 0, 1, 49152, 50176, + 50688, 50560, 50592, 50584, 0, 1, 49152, 50176, + 50688, 50560, 50592, 50593, 50588, 0, 1, 49152, + 50176, 50688, 50560, 50592, 50593, 50588, 0, 1, + 49152, 50176, 50688, 50560, 50592, 50593, 50588, 50590, + 0, 1, 49152, 50176, 50688, 50560, 0, 1, + 49152, 50176, 50688, 50560, 50592, 0, 1, 49152, + 50176, 50688, 50560, 50592, 0, 1, 49152, 50176, + 50688, 50560, 50592, 50594, 0, 1, 49152, 50176, + 50688, 50560, 50592, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50596, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50596, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50600, 50598, 0, 1, 49152, 50176, + 50688, 50560, 50592, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50600, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50600, 0, 1, 49152, 50176, 50688, + 50560, 50592, 50600, 50602, 0, 1, 49152, 50176, + 50688, 50560, 50592, 50600, 0, 1, 49152, 50176, + 50688, 50560, 50592, 50608, 50604, 0, 1, 49152, + 50176, 50688, 50560, 50592, 50608, 50604, 0, 1, + 49152, 50176, 50688, 50560, 50592, 50608, 50609, 50606, + 0, 1, 49152, 50176, 50688, 50560, 50592, 0, + 1, 49152, 50176, 50688, 50560, 50624, 50608, 0, + 1, 49152, 50176, 50688, 50560, 50624, 50608, 0, + 1, 49152, 50176, 50688, 50560, 50624, 50608, 50610, + 0, 1, 49152, 50176, 50688, 50560, 50624, 50608, + 0, 1, 49152, 50176, 50688, 50560, 50624, 50608, + 50612, 0, 1, 49152, 50176, 50688, 50560, 50624, + 50608, 50612, 0, 1, 49152, 50176, 50688, 50560, + 50624, 50608, 50616, 50614, 0, 1, 49152, 50176, + 50688, 50560, 50624, 50608, 0, 1, 49152, 50176, + 50688, 50560, 50624, 50625, 50616, 0, 1, 49152, + 50176, 50688, 50560, 50624, 50625, 50616, 0, 1, + 49152, 50176, 50688, 50560, 50624, 50625, 50616, 50618, + 0, 1, 49152, 50176, 50688, 50560, 50624, 50625, + 50616, 0, 1, 49152, 50176, 50688, 50560, 50624, + 50625, 50616, 50620, 0, 1, 49152, 50176, 50688, + 50560, 50624, 50625, 50627, 50620, 0, 1, 49152, + 50176, 50688, 50560, 50624, 50625, 50627, 50620, 50622, + 0, 1, 49152, 50176, 50688, 50560, 0, 1, + 49152, 50176, 50688, 50689, 50624, 0, 1, 49152, + 50176, 50688, 50689, 50624, 0, 1, 49152, 50176, + 50688, 50689, 50624, 50626, 0, 1, 49152, 50176, + 50688, 50689, 50624, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50628, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50628, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50632, 50630, 0, 1, 49152, 50176, + 50688, 50689, 50624, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50632, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50632, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50632, 50634, 0, 1, 49152, 50176, + 50688, 50689, 50624, 50632, 0, 1, 49152, 50176, + 50688, 50689, 50624, 50640, 50636, 0, 1, 49152, + 50176, 50688, 50689, 50624, 50640, 50636, 0, 1, + 49152, 50176, 50688, 50689, 50624, 50640, 50641, 50638, + 0, 1, 49152, 50176, 50688, 50689, 50624, 0, + 1, 49152, 50176, 50688, 50689, 50624, 50640, 0, + 1, 49152, 50176, 50688, 50689, 50624, 50640, 0, + 1, 49152, 50176, 50688, 50689, 50624, 50640, 50642, + 0, 1, 49152, 50176, 50688, 50689, 50624, 50640, + 0, 1, 49152, 50176, 50688, 50689, 50624, 50640, + 50644, 0, 1, 49152, 50176, 50688, 50689, 50624, + 50640, 50644, 0, 1, 49152, 50176, 50688, 50689, + 50624, 50640, 50648, 50646, 0, 1, 49152, 50176, + 50688, 50689, 50624, 50640, 0, 1, 49152, 50176, + 50688, 50689, 50624, 50656, 50648, 0, 1, 49152, + 50176, 50688, 50689, 50624, 50656, 50648, 0, 1, + 49152, 50176, 50688, 50689, 50624, 50656, 50648, 50650, + 0, 1, 49152, 50176, 50688, 50689, 50624, 50656, + 50648, 0, 1, 49152, 50176, 50688, 50689, 50624, + 50656, 50657, 50652, 0, 1, 49152, 50176, 50688, + 50689, 50624, 50656, 50657, 50652, 0, 1, 49152, + 50176, 50688, 50689, 50624, 50656, 50657, 50652, 50654, + 0, 1, 49152, 50176, 50688, 50689, 50624, 0, + 1, 49152, 50176, 50688, 50689, 50624, 50656, 0, + 1, 49152, 50176, 50688, 50689, 50691, 50656, 0, + 1, 49152, 50176, 50688, 50689, 50691, 50656, 50658, + 0, 1, 49152, 50176, 50688, 50689, 50691, 50656, + 0, 1, 49152, 50176, 50688, 50689, 50691, 50656, + 50660, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50656, 50660, 0, 1, 49152, 50176, 50688, 50689, + 50691, 50656, 50664, 50662, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50656, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50656, 50664, 0, 1, 49152, + 50176, 50688, 50689, 50691, 50656, 50664, 0, 1, + 49152, 50176, 50688, 50689, 50691, 50656, 50664, 50666, + 0, 1, 49152, 50176, 50688, 50689, 50691, 50656, + 50664, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50656, 50672, 50668, 0, 1, 49152, 50176, 50688, + 50689, 50691, 50656, 50672, 50668, 0, 1, 49152, + 50176, 50688, 50689, 50691, 50656, 50672, 50673, 50670, + 0, 1, 49152, 50176, 50688, 50689, 50691, 50656, + 0, 1, 49152, 50176, 50688, 50689, 50691, 50656, + 50672, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50656, 50672, 0, 1, 49152, 50176, 50688, 50689, + 50691, 50656, 50672, 50674, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50695, 50672, 0, 1, 49152, + 50176, 50688, 50689, 50691, 50695, 50672, 50676, 0, + 1, 49152, 50176, 50688, 50689, 50691, 50695, 50672, + 50676, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50695, 50672, 50680, 50678, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50695, 50672, 0, 1, 49152, + 50176, 50688, 50689, 50691, 50695, 50672, 50680, 0, + 1, 49152, 50176, 50688, 50689, 50691, 50695, 50672, + 50680, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50695, 50672, 50680, 50682, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50695, 50672, 50680, 0, 1, + 49152, 50176, 50688, 50689, 50691, 50695, 50672, 50680, + 50684, 0, 1, 49152, 50176, 50688, 50689, 50691, + 50695, 50672, 50680, 50684, 0, 1, 49152, 50176, + 50688, 50689, 50691, 50695, 50672, 50680, 50684, 50686, + 0, 1, 49152, 50176, 0, 1, 49152, 51200, + 50688, 0, 1, 49152, 51200, 50688, 0, 1, + 49152, 51200, 50688, 50690, 0, 1, 49152, 51200, + 50688, 0, 1, 49152, 51200, 50688, 50692, 0, + 1, 49152, 51200, 50688, 50692, 0, 1, 49152, + 51200, 50688, 50696, 50694, 0, 1, 49152, 51200, + 50688, 0, 1, 49152, 51200, 50688, 50696, 0, + 1, 49152, 51200, 50688, 50696, 0, 1, 49152, + 51200, 50688, 50696, 50698, 0, 1, 49152, 51200, + 50688, 50696, 0, 1, 49152, 51200, 50688, 50704, + 50700, 0, 1, 49152, 51200, 50688, 50704, 50700, + 0, 1, 49152, 51200, 50688, 50704, 50705, 50702, + 0, 1, 49152, 51200, 50688, 0, 1, 49152, + 51200, 50688, 50704, 0, 1, 49152, 51200, 50688, + 50704, 0, 1, 49152, 51200, 50688, 50704, 50706, + 0, 1, 49152, 51200, 50688, 50704, 0, 1, + 49152, 51200, 50688, 50704, 50708, 0, 1, 49152, + 51200, 50688, 50704, 50708, 0, 1, 49152, 51200, + 50688, 50704, 50712, 50710, 0, 1, 49152, 51200, + 50688, 50704, 0, 1, 49152, 51200, 50688, 50720, + 50712, 0, 1, 49152, 51200, 50688, 50720, 50712, + 0, 1, 49152, 51200, 50688, 50720, 50712, 50714, + 0, 1, 49152, 51200, 50688, 50720, 50712, 0, + 1, 49152, 51200, 50688, 50720, 50721, 50716, 0, + 1, 49152, 51200, 50688, 50720, 50721, 50716, 0, + 1, 49152, 51200, 50688, 50720, 50721, 50716, 50718, + 0, 1, 49152, 51200, 50688, 0, 1, 49152, + 51200, 50688, 50720, 0, 1, 49152, 51200, 50688, + 50720, 0, 1, 49152, 51200, 50688, 50720, 50722, + 0, 1, 49152, 51200, 50688, 50720, 0, 1, + 49152, 51200, 50688, 50720, 50724, 0, 1, 49152, + 51200, 50688, 50720, 50724, 0, 1, 49152, 51200, + 50688, 50720, 50728, 50726, 0, 1, 49152, 51200, + 50688, 50720, 0, 1, 49152, 51200, 50688, 50720, + 50728, 0, 1, 49152, 51200, 50688, 50720, 50728, + 0, 1, 49152, 51200, 50688, 50720, 50728, 50730, + 0, 1, 49152, 51200, 50688, 50720, 50728, 0, + 1, 49152, 51200, 50688, 50720, 50736, 50732, 0, + 1, 49152, 51200, 50688, 50720, 50736, 50732, 0, + 1, 49152, 51200, 50688, 50720, 50736, 50737, 50734, + 0, 1, 49152, 51200, 50688, 50720, 0, 1, + 49152, 51200, 50688, 50752, 50736, 0, 1, 49152, + 51200, 50688, 50752, 50736, 0, 1, 49152, 51200, + 50688, 50752, 50736, 50738, 0, 1, 49152, 51200, + 50688, 50752, 50736, 0, 1, 49152, 51200, 50688, + 50752, 50736, 50740, 0, 1, 49152, 51200, 50688, + 50752, 50736, 50740, 0, 1, 49152, 51200, 50688, + 50752, 50736, 50744, 50742, 0, 1, 49152, 51200, + 50688, 50752, 50736, 0, 1, 49152, 51200, 50688, + 50752, 50753, 50744, 0, 1, 49152, 51200, 50688, + 50752, 50753, 50744, 0, 1, 49152, 51200, 50688, + 50752, 50753, 50744, 50746, 0, 1, 49152, 51200, + 50688, 50752, 50753, 50744, 0, 1, 49152, 51200, + 50688, 50752, 50753, 50744, 50748, 0, 1, 49152, + 51200, 50688, 50752, 50753, 50755, 50748, 0, 1, + 49152, 51200, 50688, 50752, 50753, 50755, 50748, 50750, + 0, 1, 49152, 51200, 50688, 0, 1, 49152, + 51200, 50688, 50752, 0, 1, 49152, 51200, 50688, + 50752, 0, 1, 49152, 51200, 50688, 50752, 50754, + 0, 1, 49152, 51200, 50688, 50752, 0, 1, + 49152, 51200, 50688, 50752, 50756, 0, 1, 49152, + 51200, 50688, 50752, 50756, 0, 1, 49152, 51200, + 50688, 50752, 50760, 50758, 0, 1, 49152, 51200, + 50688, 50752, 0, 1, 49152, 51200, 50688, 50752, + 50760, 0, 1, 49152, 51200, 50688, 50752, 50760, + 0, 1, 49152, 51200, 50688, 50752, 50760, 50762, + 0, 1, 49152, 51200, 50688, 50752, 50760, 0, + 1, 49152, 51200, 50688, 50752, 50768, 50764, 0, + 1, 49152, 51200, 50688, 50752, 50768, 50764, 0, + 1, 49152, 51200, 50688, 50752, 50768, 50769, 50766, + 0, 1, 49152, 51200, 50688, 50752, 0, 1, + 49152, 51200, 50688, 50752, 50768, 0, 1, 49152, + 51200, 50688, 50752, 50768, 0, 1, 49152, 51200, + 50688, 50752, 50768, 50770, 0, 1, 49152, 51200, + 50688, 50752, 50768, 0, 1, 49152, 51200, 50688, + 50752, 50768, 50772, 0, 1, 49152, 51200, 50688, + 50752, 50768, 50772, 0, 1, 49152, 51200, 50688, + 50752, 50768, 50776, 50774, 0, 1, 49152, 51200, + 50688, 50752, 50768, 0, 1, 49152, 51200, 50688, + 50752, 50784, 50776, 0, 1, 49152, 51200, 50688, + 50752, 50784, 50776, 0, 1, 49152, 51200, 50688, + 50752, 50784, 50776, 50778, 0, 1, 49152, 51200, + 50688, 50752, 50784, 50776, 0, 1, 49152, 51200, + 50688, 50752, 50784, 50785, 50780, 0, 1, 49152, + 51200, 50688, 50752, 50784, 50785, 50780, 0, 1, + 49152, 51200, 50688, 50752, 50784, 50785, 50780, 50782, + 0, 1, 49152, 51200, 50688, 50752, 0, 1, + 49152, 51200, 50688, 50816, 50784, 0, 1, 49152, + 51200, 50688, 50816, 50784, 0, 1, 49152, 51200, + 50688, 50816, 50784, 50786, 0, 1, 49152, 51200, + 50688, 50816, 50784, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50788, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50788, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50792, 50790, 0, 1, 49152, 51200, + 50688, 50816, 50784, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50792, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50792, 0, 1, 49152, 51200, 50688, + 50816, 50784, 50792, 50794, 0, 1, 49152, 51200, + 50688, 50816, 50784, 50792, 0, 1, 49152, 51200, + 50688, 50816, 50784, 50800, 50796, 0, 1, 49152, + 51200, 50688, 50816, 50784, 50800, 50796, 0, 1, + 49152, 51200, 50688, 50816, 50784, 50800, 50801, 50798, + 0, 1, 49152, 51200, 50688, 50816, 50784, 0, + 1, 49152, 51200, 50688, 50816, 50817, 50800, 0, + 1, 49152, 51200, 50688, 50816, 50817, 50800, 0, + 1, 49152, 51200, 50688, 50816, 50817, 50800, 50802, + 0, 1, 49152, 51200, 50688, 50816, 50817, 50800, + 0, 1, 49152, 51200, 50688, 50816, 50817, 50800, + 50804, 0, 1, 49152, 51200, 50688, 50816, 50817, + 50800, 50804, 0, 1, 49152, 51200, 50688, 50816, + 50817, 50800, 50808, 50806, 0, 1, 49152, 51200, + 50688, 50816, 50817, 50800, 0, 1, 49152, 51200, + 50688, 50816, 50817, 50800, 50808, 0, 1, 49152, + 51200, 50688, 50816, 50817, 50819, 50808, 0, 1, + 49152, 51200, 50688, 50816, 50817, 50819, 50808, 50810, + 0, 1, 49152, 51200, 50688, 50816, 50817, 50819, + 50808, 0, 1, 49152, 51200, 50688, 50816, 50817, + 50819, 50808, 50812, 0, 1, 49152, 51200, 50688, + 50816, 50817, 50819, 50808, 50812, 0, 1, 49152, + 51200, 50688, 50816, 50817, 50819, 50808, 50812, 50814, + 0, 1, 49152, 51200, 50688, 0, 1, 49152, + 51200, 50688, 50816, 0, 1, 49152, 51200, 50688, + 50816, 0, 1, 49152, 51200, 50688, 50816, 50818, + 0, 1, 49152, 51200, 50688, 50816, 0, 1, + 49152, 51200, 50688, 50816, 50820, 0, 1, 49152, + 51200, 50688, 50816, 50820, 0, 1, 49152, 51200, + 50688, 50816, 50824, 50822, 0, 1, 49152, 51200, + 50688, 50816, 0, 1, 49152, 51200, 50688, 50816, + 50824, 0, 1, 49152, 51200, 50688, 50816, 50824, + 0, 1, 49152, 51200, 50688, 50816, 50824, 50826, + 0, 1, 49152, 51200, 50688, 50816, 50824, 0, + 1, 49152, 51200, 50688, 50816, 50832, 50828, 0, + 1, 49152, 51200, 50688, 50816, 50832, 50828, 0, + 1, 49152, 51200, 50688, 50816, 50832, 50833, 50830, + 0, 1, 49152, 51200, 50688, 50816, 0, 1, + 49152, 51200, 50688, 50816, 50832, 0, 1, 49152, + 51200, 50688, 50816, 50832, 0, 1, 49152, 51200, + 50688, 50816, 50832, 50834, 0, 1, 49152, 51200, + 50688, 50816, 50832, 0, 1, 49152, 51200, 50688, + 50816, 50832, 50836, 0, 1, 49152, 51200, 50688, + 50816, 50832, 50836, 0, 1, 49152, 51200, 50688, + 50816, 50832, 50840, 50838, 0, 1, 49152, 51200, + 50688, 50816, 50832, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50840, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50840, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50840, 50842, 0, 1, 49152, 51200, + 50688, 50816, 50848, 50840, 0, 1, 49152, 51200, + 50688, 50816, 50848, 50849, 50844, 0, 1, 49152, + 51200, 50688, 50816, 50848, 50849, 50844, 0, 1, + 49152, 51200, 50688, 50816, 50848, 50849, 50844, 50846, + 0, 1, 49152, 51200, 50688, 50816, 0, 1, + 49152, 51200, 50688, 50816, 50848, 0, 1, 49152, + 51200, 50688, 50816, 50848, 0, 1, 49152, 51200, + 50688, 50816, 50848, 50850, 0, 1, 49152, 51200, + 50688, 50816, 50848, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50852, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50852, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50856, 50854, 0, 1, 49152, 51200, + 50688, 50816, 50848, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50856, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50856, 0, 1, 49152, 51200, 50688, + 50816, 50848, 50856, 50858, 0, 1, 49152, 51200, + 50688, 50816, 50848, 50856, 0, 1, 49152, 51200, + 50688, 50816, 50848, 50864, 50860, 0, 1, 49152, + 51200, 50688, 50816, 50848, 50864, 50860, 0, 1, + 49152, 51200, 50688, 50816, 50848, 50864, 50865, 50862, + 0, 1, 49152, 51200, 50688, 50816, 50848, 0, + 1, 49152, 51200, 50688, 50816, 50880, 50864, 0, + 1, 49152, 51200, 50688, 50816, 50880, 50864, 0, + 1, 49152, 51200, 50688, 50816, 50880, 50864, 50866, + 0, 1, 49152, 51200, 50688, 50816, 50880, 50864, + 0, 1, 49152, 51200, 50688, 50816, 50880, 50864, + 50868, 0, 1, 49152, 51200, 50688, 50816, 50880, + 50864, 50868, 0, 1, 49152, 51200, 50688, 50816, + 50880, 50864, 50872, 50870, 0, 1, 49152, 51200, + 50688, 50816, 50880, 50864, 0, 1, 49152, 51200, + 50688, 50816, 50880, 50881, 50872, 0, 1, 49152, + 51200, 50688, 50816, 50880, 50881, 50872, 0, 1, + 49152, 51200, 50688, 50816, 50880, 50881, 50872, 50874, + 0, 1, 49152, 51200, 50688, 50816, 50880, 50881, + 50872, 0, 1, 49152, 51200, 50688, 50816, 50880, + 50881, 50872, 50876, 0, 1, 49152, 51200, 50688, + 50816, 50880, 50881, 50883, 50876, 0, 1, 49152, + 51200, 50688, 50816, 50880, 50881, 50883, 50876, 50878, + 0, 1, 49152, 51200, 50688, 50816, 0, 1, + 49152, 51200, 50688, 50944, 50880, 0, 1, 49152, + 51200, 50688, 50944, 50880, 0, 1, 49152, 51200, + 50688, 50944, 50880, 50882, 0, 1, 49152, 51200, + 50688, 50944, 50880, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50884, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50884, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50888, 50886, 0, 1, 49152, 51200, + 50688, 50944, 50880, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50888, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50888, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50888, 50890, 0, 1, 49152, 51200, + 50688, 50944, 50880, 50888, 0, 1, 49152, 51200, + 50688, 50944, 50880, 50896, 50892, 0, 1, 49152, + 51200, 50688, 50944, 50880, 50896, 50892, 0, 1, + 49152, 51200, 50688, 50944, 50880, 50896, 50897, 50894, + 0, 1, 49152, 51200, 50688, 50944, 50880, 0, + 1, 49152, 51200, 50688, 50944, 50880, 50896, 0, + 1, 49152, 51200, 50688, 50944, 50880, 50896, 0, + 1, 49152, 51200, 50688, 50944, 50880, 50896, 50898, + 0, 1, 49152, 51200, 50688, 50944, 50880, 50896, + 0, 1, 49152, 51200, 50688, 50944, 50880, 50896, + 50900, 0, 1, 49152, 51200, 50688, 50944, 50880, + 50896, 50900, 0, 1, 49152, 51200, 50688, 50944, + 50880, 50896, 50904, 50902, 0, 1, 49152, 51200, + 50688, 50944, 50880, 50896, 0, 1, 49152, 51200, + 50688, 50944, 50880, 50912, 50904, 0, 1, 49152, + 51200, 50688, 50944, 50880, 50912, 50904, 0, 1, + 49152, 51200, 50688, 50944, 50880, 50912, 50904, 50906, + 0, 1, 49152, 51200, 50688, 50944, 50880, 50912, + 50904, 0, 1, 49152, 51200, 50688, 50944, 50880, + 50912, 50913, 50908, 0, 1, 49152, 51200, 50688, + 50944, 50880, 50912, 50913, 50908, 0, 1, 49152, + 51200, 50688, 50944, 50880, 50912, 50913, 50908, 50910, + 0, 1, 49152, 51200, 50688, 50944, 50880, 0, + 1, 49152, 51200, 50688, 50944, 50945, 50912, 0, + 1, 49152, 51200, 50688, 50944, 50945, 50912, 0, + 1, 49152, 51200, 50688, 50944, 50945, 50912, 50914, + 0, 1, 49152, 51200, 50688, 50944, 50945, 50912, + 0, 1, 49152, 51200, 50688, 50944, 50945, 50912, + 50916, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50912, 50916, 0, 1, 49152, 51200, 50688, 50944, + 50945, 50912, 50920, 50918, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50912, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50912, 50920, 0, 1, 49152, + 51200, 50688, 50944, 50945, 50912, 50920, 0, 1, + 49152, 51200, 50688, 50944, 50945, 50912, 50920, 50922, + 0, 1, 49152, 51200, 50688, 50944, 50945, 50912, + 50920, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50912, 50928, 50924, 0, 1, 49152, 51200, 50688, + 50944, 50945, 50912, 50928, 50924, 0, 1, 49152, + 51200, 50688, 50944, 50945, 50912, 50928, 50929, 50926, + 0, 1, 49152, 51200, 50688, 50944, 50945, 50912, + 0, 1, 49152, 51200, 50688, 50944, 50945, 50912, + 50928, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50947, 50928, 0, 1, 49152, 51200, 50688, 50944, + 50945, 50947, 50928, 50930, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50947, 50928, 0, 1, 49152, + 51200, 50688, 50944, 50945, 50947, 50928, 50932, 0, + 1, 49152, 51200, 50688, 50944, 50945, 50947, 50928, + 50932, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50947, 50928, 50936, 50934, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50947, 50928, 0, 1, 49152, + 51200, 50688, 50944, 50945, 50947, 50928, 50936, 0, + 1, 49152, 51200, 50688, 50944, 50945, 50947, 50928, + 50936, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50947, 50928, 50936, 50938, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50947, 50951, 50936, 0, 1, + 49152, 51200, 50688, 50944, 50945, 50947, 50951, 50936, + 50940, 0, 1, 49152, 51200, 50688, 50944, 50945, + 50947, 50951, 50936, 50940, 0, 1, 49152, 51200, + 50688, 50944, 50945, 50947, 50951, 50936, 50940, 50942, + 0, 1, 49152, 51200, 50688, 0, 1, 49152, + 51200, 50688, 50944, 0, 1, 49152, 51200, 51201, + 50944, 0, 1, 49152, 51200, 51201, 50944, 50946, + 0, 1, 49152, 51200, 51201, 50944, 0, 1, + 49152, 51200, 51201, 50944, 50948, 0, 1, 49152, + 51200, 51201, 50944, 50948, 0, 1, 49152, 51200, + 51201, 50944, 50952, 50950, 0, 1, 49152, 51200, + 51201, 50944, 0, 1, 49152, 51200, 51201, 50944, + 50952, 0, 1, 49152, 51200, 51201, 50944, 50952, + 0, 1, 49152, 51200, 51201, 50944, 50952, 50954, + 0, 1, 49152, 51200, 51201, 50944, 50952, 0, + 1, 49152, 51200, 51201, 50944, 50960, 50956, 0, + 1, 49152, 51200, 51201, 50944, 50960, 50956, 0, + 1, 49152, 51200, 51201, 50944, 50960, 50961, 50958, + 0, 1, 49152, 51200, 51201, 50944, 0, 1, + 49152, 51200, 51201, 50944, 50960, 0, 1, 49152, + 51200, 51201, 50944, 50960, 0, 1, 49152, 51200, + 51201, 50944, 50960, 50962, 0, 1, 49152, 51200, + 51201, 50944, 50960, 0, 1, 49152, 51200, 51201, + 50944, 50960, 50964, 0, 1, 49152, 51200, 51201, + 50944, 50960, 50964, 0, 1, 49152, 51200, 51201, + 50944, 50960, 50968, 50966, 0, 1, 49152, 51200, + 51201, 50944, 50960, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50968, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50968, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50968, 50970, 0, 1, 49152, 51200, + 51201, 50944, 50976, 50968, 0, 1, 49152, 51200, + 51201, 50944, 50976, 50977, 50972, 0, 1, 49152, + 51200, 51201, 50944, 50976, 50977, 50972, 0, 1, + 49152, 51200, 51201, 50944, 50976, 50977, 50972, 50974, + 0, 1, 49152, 51200, 51201, 50944, 0, 1, + 49152, 51200, 51201, 50944, 50976, 0, 1, 49152, + 51200, 51201, 50944, 50976, 0, 1, 49152, 51200, + 51201, 50944, 50976, 50978, 0, 1, 49152, 51200, + 51201, 50944, 50976, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50980, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50980, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50984, 50982, 0, 1, 49152, 51200, + 51201, 50944, 50976, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50984, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50984, 0, 1, 49152, 51200, 51201, + 50944, 50976, 50984, 50986, 0, 1, 49152, 51200, + 51201, 50944, 50976, 50984, 0, 1, 49152, 51200, + 51201, 50944, 50976, 50992, 50988, 0, 1, 49152, + 51200, 51201, 50944, 50976, 50992, 50988, 0, 1, + 49152, 51200, 51201, 50944, 50976, 50992, 50993, 50990, + 0, 1, 49152, 51200, 51201, 50944, 50976, 0, + 1, 49152, 51200, 51201, 50944, 51008, 50992, 0, + 1, 49152, 51200, 51201, 50944, 51008, 50992, 0, + 1, 49152, 51200, 51201, 50944, 51008, 50992, 50994, + 0, 1, 49152, 51200, 51201, 50944, 51008, 50992, + 0, 1, 49152, 51200, 51201, 50944, 51008, 50992, + 50996, 0, 1, 49152, 51200, 51201, 50944, 51008, + 50992, 50996, 0, 1, 49152, 51200, 51201, 50944, + 51008, 50992, 51000, 50998, 0, 1, 49152, 51200, + 51201, 50944, 51008, 50992, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51009, 51000, 0, 1, 49152, + 51200, 51201, 50944, 51008, 51009, 51000, 0, 1, + 49152, 51200, 51201, 50944, 51008, 51009, 51000, 51002, + 0, 1, 49152, 51200, 51201, 50944, 51008, 51009, + 51000, 0, 1, 49152, 51200, 51201, 50944, 51008, + 51009, 51000, 51004, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51009, 51011, 51004, 0, 1, 49152, + 51200, 51201, 50944, 51008, 51009, 51011, 51004, 51006, + 0, 1, 49152, 51200, 51201, 50944, 0, 1, + 49152, 51200, 51201, 50944, 51008, 0, 1, 49152, + 51200, 51201, 50944, 51008, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51010, 0, 1, 49152, 51200, + 51201, 50944, 51008, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51012, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51012, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51016, 51014, 0, 1, 49152, 51200, + 51201, 50944, 51008, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51016, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51016, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51016, 51018, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51016, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51024, 51020, 0, 1, 49152, + 51200, 51201, 50944, 51008, 51024, 51020, 0, 1, + 49152, 51200, 51201, 50944, 51008, 51024, 51025, 51022, + 0, 1, 49152, 51200, 51201, 50944, 51008, 0, + 1, 49152, 51200, 51201, 50944, 51008, 51024, 0, + 1, 49152, 51200, 51201, 50944, 51008, 51024, 0, + 1, 49152, 51200, 51201, 50944, 51008, 51024, 51026, + 0, 1, 49152, 51200, 51201, 50944, 51008, 51024, + 0, 1, 49152, 51200, 51201, 50944, 51008, 51024, + 51028, 0, 1, 49152, 51200, 51201, 50944, 51008, + 51024, 51028, 0, 1, 49152, 51200, 51201, 50944, + 51008, 51024, 51032, 51030, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51024, 0, 1, 49152, 51200, + 51201, 50944, 51008, 51040, 51032, 0, 1, 49152, + 51200, 51201, 50944, 51008, 51040, 51032, 0, 1, + 49152, 51200, 51201, 50944, 51008, 51040, 51032, 51034, + 0, 1, 49152, 51200, 51201, 50944, 51008, 51040, + 51032, 0, 1, 49152, 51200, 51201, 50944, 51008, + 51040, 51041, 51036, 0, 1, 49152, 51200, 51201, + 50944, 51008, 51040, 51041, 51036, 0, 1, 49152, + 51200, 51201, 50944, 51008, 51040, 51041, 51036, 51038, + 0, 1, 49152, 51200, 51201, 50944, 51008, 0, + 1, 49152, 51200, 51201, 50944, 51072, 51040, 0, + 1, 49152, 51200, 51201, 50944, 51072, 51040, 0, + 1, 49152, 51200, 51201, 50944, 51072, 51040, 51042, + 0, 1, 49152, 51200, 51201, 50944, 51072, 51040, + 0, 1, 49152, 51200, 51201, 50944, 51072, 51040, + 51044, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51040, 51044, 0, 1, 49152, 51200, 51201, 50944, + 51072, 51040, 51048, 51046, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51040, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51040, 51048, 0, 1, 49152, + 51200, 51201, 50944, 51072, 51040, 51048, 0, 1, + 49152, 51200, 51201, 50944, 51072, 51040, 51048, 51050, + 0, 1, 49152, 51200, 51201, 50944, 51072, 51040, + 51048, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51040, 51056, 51052, 0, 1, 49152, 51200, 51201, + 50944, 51072, 51040, 51056, 51052, 0, 1, 49152, + 51200, 51201, 50944, 51072, 51040, 51056, 51057, 51054, + 0, 1, 49152, 51200, 51201, 50944, 51072, 51040, + 0, 1, 49152, 51200, 51201, 50944, 51072, 51073, + 51056, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51073, 51056, 0, 1, 49152, 51200, 51201, 50944, + 51072, 51073, 51056, 51058, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51073, 51056, 0, 1, 49152, + 51200, 51201, 50944, 51072, 51073, 51056, 51060, 0, + 1, 49152, 51200, 51201, 50944, 51072, 51073, 51056, + 51060, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51073, 51056, 51064, 51062, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51073, 51056, 0, 1, 49152, + 51200, 51201, 50944, 51072, 51073, 51056, 51064, 0, + 1, 49152, 51200, 51201, 50944, 51072, 51073, 51075, + 51064, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51073, 51075, 51064, 51066, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51073, 51075, 51064, 0, 1, + 49152, 51200, 51201, 50944, 51072, 51073, 51075, 51064, + 51068, 0, 1, 49152, 51200, 51201, 50944, 51072, + 51073, 51075, 51064, 51068, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51073, 51075, 51064, 51068, 51070, + 0, 1, 49152, 51200, 51201, 50944, 0, 1, + 49152, 51200, 51201, 50944, 51072, 0, 1, 49152, + 51200, 51201, 50944, 51072, 0, 1, 49152, 51200, + 51201, 50944, 51072, 51074, 0, 1, 49152, 51200, + 51201, 51203, 51072, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51076, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51076, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51080, 51078, 0, 1, 49152, 51200, + 51201, 51203, 51072, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51080, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51080, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51080, 51082, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51080, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51088, 51084, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51088, 51084, 0, 1, + 49152, 51200, 51201, 51203, 51072, 51088, 51089, 51086, + 0, 1, 49152, 51200, 51201, 51203, 51072, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51088, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51088, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51088, 51090, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51088, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51088, + 51092, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51088, 51092, 0, 1, 49152, 51200, 51201, 51203, + 51072, 51088, 51096, 51094, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51088, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51104, 51096, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51104, 51096, 0, 1, + 49152, 51200, 51201, 51203, 51072, 51104, 51096, 51098, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51104, + 51096, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51104, 51105, 51100, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51104, 51105, 51100, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51104, 51105, 51100, 51102, + 0, 1, 49152, 51200, 51201, 51203, 51072, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51104, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51104, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51104, 51106, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51104, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51104, + 51108, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51104, 51108, 0, 1, 49152, 51200, 51201, 51203, + 51072, 51104, 51112, 51110, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51104, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51104, 51112, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51104, 51112, 0, 1, + 49152, 51200, 51201, 51203, 51072, 51104, 51112, 51114, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51104, + 51112, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51104, 51120, 51116, 0, 1, 49152, 51200, 51201, + 51203, 51072, 51104, 51120, 51116, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51104, 51120, 51121, 51118, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51104, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51136, + 51120, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51136, 51120, 0, 1, 49152, 51200, 51201, 51203, + 51072, 51136, 51120, 51122, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51136, 51120, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51136, 51120, 51124, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51136, 51120, + 51124, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51136, 51120, 51128, 51126, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51136, 51120, 0, 1, 49152, + 51200, 51201, 51203, 51072, 51136, 51137, 51128, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51136, 51137, + 51128, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51136, 51137, 51128, 51130, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51136, 51137, 51128, 0, 1, + 49152, 51200, 51201, 51203, 51072, 51136, 51137, 51128, + 51132, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51136, 51137, 51139, 51132, 0, 1, 49152, 51200, + 51201, 51203, 51072, 51136, 51137, 51139, 51132, 51134, + 0, 1, 49152, 51200, 51201, 51203, 51072, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51136, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51136, 0, + 1, 49152, 51200, 51201, 51203, 51072, 51136, 51138, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51136, + 0, 1, 49152, 51200, 51201, 51203, 51072, 51136, + 51140, 0, 1, 49152, 51200, 51201, 51203, 51072, + 51136, 51140, 0, 1, 49152, 51200, 51201, 51203, + 51072, 51136, 51144, 51142, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51144, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51144, 0, 1, + 49152, 51200, 51201, 51203, 51207, 51136, 51144, 51146, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51136, + 51144, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51152, 51148, 0, 1, 49152, 51200, 51201, + 51203, 51207, 51136, 51152, 51148, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51152, 51153, 51150, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51136, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51136, + 51152, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51152, 0, 1, 49152, 51200, 51201, 51203, + 51207, 51136, 51152, 51154, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51152, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51152, 51156, 0, + 1, 49152, 51200, 51201, 51203, 51207, 51136, 51152, + 51156, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51152, 51160, 51158, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51152, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51168, 51160, 0, + 1, 49152, 51200, 51201, 51203, 51207, 51136, 51168, + 51160, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 51160, 51162, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 51160, 0, 1, + 49152, 51200, 51201, 51203, 51207, 51136, 51168, 51169, + 51164, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 51169, 51164, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 51169, 51164, 51166, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51136, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51136, + 51168, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 0, 1, 49152, 51200, 51201, 51203, + 51207, 51136, 51168, 51170, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51168, 51172, 0, + 1, 49152, 51200, 51201, 51203, 51207, 51136, 51168, + 51172, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 51176, 51174, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51136, 51168, 51176, 0, + 1, 49152, 51200, 51201, 51203, 51207, 51136, 51168, + 51176, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 51176, 51178, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 51176, 0, 1, + 49152, 51200, 51201, 51203, 51207, 51136, 51168, 51184, + 51180, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51136, 51168, 51184, 51180, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51136, 51168, 51184, 51185, 51182, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51215, + 51168, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51215, 51168, 51184, 0, 1, 49152, 51200, 51201, + 51203, 51207, 51215, 51168, 51184, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51215, 51168, 51184, 51186, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51215, + 51168, 51184, 0, 1, 49152, 51200, 51201, 51203, + 51207, 51215, 51168, 51184, 51188, 0, 1, 49152, + 51200, 51201, 51203, 51207, 51215, 51168, 51184, 51188, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51215, + 51168, 51184, 51192, 51190, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51215, 51168, 51184, 0, 1, + 49152, 51200, 51201, 51203, 51207, 51215, 51168, 51184, + 51192, 0, 1, 49152, 51200, 51201, 51203, 51207, + 51215, 51168, 51184, 51192, 0, 1, 49152, 51200, + 51201, 51203, 51207, 51215, 51168, 51184, 51192, 51194, + 0, 1, 49152, 51200, 51201, 51203, 51207, 51215, + 51168, 51184, 51192, 0, 1, 49152, 51200, 51201, + 51203, 51207, 51215, 51168, 51184, 51192, 51196, 0, + 1, 49152, 51200, 51201, 51203, 51207, 51215, 51168, + 51184, 51192, 51196, 0, 1, 49152, 51200, 51201, + 51203, 51207, 51215, 51168, 51184, 51192, 51196, 51198, + 0, 1, 49152, 0, 1, 49152, 51200, 0, + 1, 49152, 51200, 0, 1, 49152, 51200, 51202, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51204, 0, 1, 49152, 51200, 51204, 0, 1, + 49152, 51200, 51208, 51206, 0, 1, 49152, 51200, + 0, 1, 49152, 51200, 51208, 0, 1, 49152, + 51200, 51208, 0, 1, 49152, 51200, 51208, 51210, + 0, 1, 49152, 51200, 51208, 0, 1, 49152, + 51200, 51216, 51212, 0, 1, 49152, 51200, 51216, + 51212, 0, 1, 49152, 51200, 51216, 51217, 51214, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51216, 0, 1, 49152, 51200, 51216, 0, 1, + 49152, 51200, 51216, 51218, 0, 1, 49152, 51200, + 51216, 0, 1, 49152, 51200, 51216, 51220, 0, + 1, 49152, 51200, 51216, 51220, 0, 1, 49152, + 51200, 51216, 51224, 51222, 0, 1, 49152, 51200, + 51216, 0, 1, 49152, 51200, 51232, 51224, 0, + 1, 49152, 51200, 51232, 51224, 0, 1, 49152, + 51200, 51232, 51224, 51226, 0, 1, 49152, 51200, + 51232, 51224, 0, 1, 49152, 51200, 51232, 51233, + 51228, 0, 1, 49152, 51200, 51232, 51233, 51228, + 0, 1, 49152, 51200, 51232, 51233, 51228, 51230, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51232, 0, 1, 49152, 51200, 51232, 0, 1, + 49152, 51200, 51232, 51234, 0, 1, 49152, 51200, + 51232, 0, 1, 49152, 51200, 51232, 51236, 0, + 1, 49152, 51200, 51232, 51236, 0, 1, 49152, + 51200, 51232, 51240, 51238, 0, 1, 49152, 51200, + 51232, 0, 1, 49152, 51200, 51232, 51240, 0, + 1, 49152, 51200, 51232, 51240, 0, 1, 49152, + 51200, 51232, 51240, 51242, 0, 1, 49152, 51200, + 51232, 51240, 0, 1, 49152, 51200, 51232, 51248, + 51244, 0, 1, 49152, 51200, 51232, 51248, 51244, + 0, 1, 49152, 51200, 51232, 51248, 51249, 51246, + 0, 1, 49152, 51200, 51232, 0, 1, 49152, + 51200, 51264, 51248, 0, 1, 49152, 51200, 51264, + 51248, 0, 1, 49152, 51200, 51264, 51248, 51250, + 0, 1, 49152, 51200, 51264, 51248, 0, 1, + 49152, 51200, 51264, 51248, 51252, 0, 1, 49152, + 51200, 51264, 51248, 51252, 0, 1, 49152, 51200, + 51264, 51248, 51256, 51254, 0, 1, 49152, 51200, + 51264, 51248, 0, 1, 49152, 51200, 51264, 51265, + 51256, 0, 1, 49152, 51200, 51264, 51265, 51256, + 0, 1, 49152, 51200, 51264, 51265, 51256, 51258, + 0, 1, 49152, 51200, 51264, 51265, 51256, 0, + 1, 49152, 51200, 51264, 51265, 51256, 51260, 0, + 1, 49152, 51200, 51264, 51265, 51267, 51260, 0, + 1, 49152, 51200, 51264, 51265, 51267, 51260, 51262, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51264, 0, 1, 49152, 51200, 51264, 0, 1, + 49152, 51200, 51264, 51266, 0, 1, 49152, 51200, + 51264, 0, 1, 49152, 51200, 51264, 51268, 0, + 1, 49152, 51200, 51264, 51268, 0, 1, 49152, + 51200, 51264, 51272, 51270, 0, 1, 49152, 51200, + 51264, 0, 1, 49152, 51200, 51264, 51272, 0, + 1, 49152, 51200, 51264, 51272, 0, 1, 49152, + 51200, 51264, 51272, 51274, 0, 1, 49152, 51200, + 51264, 51272, 0, 1, 49152, 51200, 51264, 51280, + 51276, 0, 1, 49152, 51200, 51264, 51280, 51276, + 0, 1, 49152, 51200, 51264, 51280, 51281, 51278, + 0, 1, 49152, 51200, 51264, 0, 1, 49152, + 51200, 51264, 51280, 0, 1, 49152, 51200, 51264, + 51280, 0, 1, 49152, 51200, 51264, 51280, 51282, + 0, 1, 49152, 51200, 51264, 51280, 0, 1, + 49152, 51200, 51264, 51280, 51284, 0, 1, 49152, + 51200, 51264, 51280, 51284, 0, 1, 49152, 51200, + 51264, 51280, 51288, 51286, 0, 1, 49152, 51200, + 51264, 51280, 0, 1, 49152, 51200, 51264, 51296, + 51288, 0, 1, 49152, 51200, 51264, 51296, 51288, + 0, 1, 49152, 51200, 51264, 51296, 51288, 51290, + 0, 1, 49152, 51200, 51264, 51296, 51288, 0, + 1, 49152, 51200, 51264, 51296, 51297, 51292, 0, + 1, 49152, 51200, 51264, 51296, 51297, 51292, 0, + 1, 49152, 51200, 51264, 51296, 51297, 51292, 51294, + 0, 1, 49152, 51200, 51264, 0, 1, 49152, + 51200, 51328, 51296, 0, 1, 49152, 51200, 51328, + 51296, 0, 1, 49152, 51200, 51328, 51296, 51298, + 0, 1, 49152, 51200, 51328, 51296, 0, 1, + 49152, 51200, 51328, 51296, 51300, 0, 1, 49152, + 51200, 51328, 51296, 51300, 0, 1, 49152, 51200, + 51328, 51296, 51304, 51302, 0, 1, 49152, 51200, + 51328, 51296, 0, 1, 49152, 51200, 51328, 51296, + 51304, 0, 1, 49152, 51200, 51328, 51296, 51304, + 0, 1, 49152, 51200, 51328, 51296, 51304, 51306, + 0, 1, 49152, 51200, 51328, 51296, 51304, 0, + 1, 49152, 51200, 51328, 51296, 51312, 51308, 0, + 1, 49152, 51200, 51328, 51296, 51312, 51308, 0, + 1, 49152, 51200, 51328, 51296, 51312, 51313, 51310, + 0, 1, 49152, 51200, 51328, 51296, 0, 1, + 49152, 51200, 51328, 51329, 51312, 0, 1, 49152, + 51200, 51328, 51329, 51312, 0, 1, 49152, 51200, + 51328, 51329, 51312, 51314, 0, 1, 49152, 51200, + 51328, 51329, 51312, 0, 1, 49152, 51200, 51328, + 51329, 51312, 51316, 0, 1, 49152, 51200, 51328, + 51329, 51312, 51316, 0, 1, 49152, 51200, 51328, + 51329, 51312, 51320, 51318, 0, 1, 49152, 51200, + 51328, 51329, 51312, 0, 1, 49152, 51200, 51328, + 51329, 51312, 51320, 0, 1, 49152, 51200, 51328, + 51329, 51331, 51320, 0, 1, 49152, 51200, 51328, + 51329, 51331, 51320, 51322, 0, 1, 49152, 51200, + 51328, 51329, 51331, 51320, 0, 1, 49152, 51200, + 51328, 51329, 51331, 51320, 51324, 0, 1, 49152, + 51200, 51328, 51329, 51331, 51320, 51324, 0, 1, + 49152, 51200, 51328, 51329, 51331, 51320, 51324, 51326, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51328, 0, 1, 49152, 51200, 51328, 0, 1, + 49152, 51200, 51328, 51330, 0, 1, 49152, 51200, + 51328, 0, 1, 49152, 51200, 51328, 51332, 0, + 1, 49152, 51200, 51328, 51332, 0, 1, 49152, + 51200, 51328, 51336, 51334, 0, 1, 49152, 51200, + 51328, 0, 1, 49152, 51200, 51328, 51336, 0, + 1, 49152, 51200, 51328, 51336, 0, 1, 49152, + 51200, 51328, 51336, 51338, 0, 1, 49152, 51200, + 51328, 51336, 0, 1, 49152, 51200, 51328, 51344, + 51340, 0, 1, 49152, 51200, 51328, 51344, 51340, + 0, 1, 49152, 51200, 51328, 51344, 51345, 51342, + 0, 1, 49152, 51200, 51328, 0, 1, 49152, + 51200, 51328, 51344, 0, 1, 49152, 51200, 51328, + 51344, 0, 1, 49152, 51200, 51328, 51344, 51346, + 0, 1, 49152, 51200, 51328, 51344, 0, 1, + 49152, 51200, 51328, 51344, 51348, 0, 1, 49152, + 51200, 51328, 51344, 51348, 0, 1, 49152, 51200, + 51328, 51344, 51352, 51350, 0, 1, 49152, 51200, + 51328, 51344, 0, 1, 49152, 51200, 51328, 51360, + 51352, 0, 1, 49152, 51200, 51328, 51360, 51352, + 0, 1, 49152, 51200, 51328, 51360, 51352, 51354, + 0, 1, 49152, 51200, 51328, 51360, 51352, 0, + 1, 49152, 51200, 51328, 51360, 51361, 51356, 0, + 1, 49152, 51200, 51328, 51360, 51361, 51356, 0, + 1, 49152, 51200, 51328, 51360, 51361, 51356, 51358, + 0, 1, 49152, 51200, 51328, 0, 1, 49152, + 51200, 51328, 51360, 0, 1, 49152, 51200, 51328, + 51360, 0, 1, 49152, 51200, 51328, 51360, 51362, + 0, 1, 49152, 51200, 51328, 51360, 0, 1, + 49152, 51200, 51328, 51360, 51364, 0, 1, 49152, + 51200, 51328, 51360, 51364, 0, 1, 49152, 51200, + 51328, 51360, 51368, 51366, 0, 1, 49152, 51200, + 51328, 51360, 0, 1, 49152, 51200, 51328, 51360, + 51368, 0, 1, 49152, 51200, 51328, 51360, 51368, + 0, 1, 49152, 51200, 51328, 51360, 51368, 51370, + 0, 1, 49152, 51200, 51328, 51360, 51368, 0, + 1, 49152, 51200, 51328, 51360, 51376, 51372, 0, + 1, 49152, 51200, 51328, 51360, 51376, 51372, 0, + 1, 49152, 51200, 51328, 51360, 51376, 51377, 51374, + 0, 1, 49152, 51200, 51328, 51360, 0, 1, + 49152, 51200, 51328, 51392, 51376, 0, 1, 49152, + 51200, 51328, 51392, 51376, 0, 1, 49152, 51200, + 51328, 51392, 51376, 51378, 0, 1, 49152, 51200, + 51328, 51392, 51376, 0, 1, 49152, 51200, 51328, + 51392, 51376, 51380, 0, 1, 49152, 51200, 51328, + 51392, 51376, 51380, 0, 1, 49152, 51200, 51328, + 51392, 51376, 51384, 51382, 0, 1, 49152, 51200, + 51328, 51392, 51376, 0, 1, 49152, 51200, 51328, + 51392, 51393, 51384, 0, 1, 49152, 51200, 51328, + 51392, 51393, 51384, 0, 1, 49152, 51200, 51328, + 51392, 51393, 51384, 51386, 0, 1, 49152, 51200, + 51328, 51392, 51393, 51384, 0, 1, 49152, 51200, + 51328, 51392, 51393, 51384, 51388, 0, 1, 49152, + 51200, 51328, 51392, 51393, 51395, 51388, 0, 1, + 49152, 51200, 51328, 51392, 51393, 51395, 51388, 51390, + 0, 1, 49152, 51200, 51328, 0, 1, 49152, + 51200, 51456, 51392, 0, 1, 49152, 51200, 51456, + 51392, 0, 1, 49152, 51200, 51456, 51392, 51394, + 0, 1, 49152, 51200, 51456, 51392, 0, 1, + 49152, 51200, 51456, 51392, 51396, 0, 1, 49152, + 51200, 51456, 51392, 51396, 0, 1, 49152, 51200, + 51456, 51392, 51400, 51398, 0, 1, 49152, 51200, + 51456, 51392, 0, 1, 49152, 51200, 51456, 51392, + 51400, 0, 1, 49152, 51200, 51456, 51392, 51400, + 0, 1, 49152, 51200, 51456, 51392, 51400, 51402, + 0, 1, 49152, 51200, 51456, 51392, 51400, 0, + 1, 49152, 51200, 51456, 51392, 51408, 51404, 0, + 1, 49152, 51200, 51456, 51392, 51408, 51404, 0, + 1, 49152, 51200, 51456, 51392, 51408, 51409, 51406, + 0, 1, 49152, 51200, 51456, 51392, 0, 1, + 49152, 51200, 51456, 51392, 51408, 0, 1, 49152, + 51200, 51456, 51392, 51408, 0, 1, 49152, 51200, + 51456, 51392, 51408, 51410, 0, 1, 49152, 51200, + 51456, 51392, 51408, 0, 1, 49152, 51200, 51456, + 51392, 51408, 51412, 0, 1, 49152, 51200, 51456, + 51392, 51408, 51412, 0, 1, 49152, 51200, 51456, + 51392, 51408, 51416, 51414, 0, 1, 49152, 51200, + 51456, 51392, 51408, 0, 1, 49152, 51200, 51456, + 51392, 51424, 51416, 0, 1, 49152, 51200, 51456, + 51392, 51424, 51416, 0, 1, 49152, 51200, 51456, + 51392, 51424, 51416, 51418, 0, 1, 49152, 51200, + 51456, 51392, 51424, 51416, 0, 1, 49152, 51200, + 51456, 51392, 51424, 51425, 51420, 0, 1, 49152, + 51200, 51456, 51392, 51424, 51425, 51420, 0, 1, + 49152, 51200, 51456, 51392, 51424, 51425, 51420, 51422, + 0, 1, 49152, 51200, 51456, 51392, 0, 1, + 49152, 51200, 51456, 51457, 51424, 0, 1, 49152, + 51200, 51456, 51457, 51424, 0, 1, 49152, 51200, + 51456, 51457, 51424, 51426, 0, 1, 49152, 51200, + 51456, 51457, 51424, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51428, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51428, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51432, 51430, 0, 1, 49152, 51200, + 51456, 51457, 51424, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51432, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51432, 0, 1, 49152, 51200, 51456, + 51457, 51424, 51432, 51434, 0, 1, 49152, 51200, + 51456, 51457, 51424, 51432, 0, 1, 49152, 51200, + 51456, 51457, 51424, 51440, 51436, 0, 1, 49152, + 51200, 51456, 51457, 51424, 51440, 51436, 0, 1, + 49152, 51200, 51456, 51457, 51424, 51440, 51441, 51438, + 0, 1, 49152, 51200, 51456, 51457, 51424, 0, + 1, 49152, 51200, 51456, 51457, 51424, 51440, 0, + 1, 49152, 51200, 51456, 51457, 51459, 51440, 0, + 1, 49152, 51200, 51456, 51457, 51459, 51440, 51442, + 0, 1, 49152, 51200, 51456, 51457, 51459, 51440, + 0, 1, 49152, 51200, 51456, 51457, 51459, 51440, + 51444, 0, 1, 49152, 51200, 51456, 51457, 51459, + 51440, 51444, 0, 1, 49152, 51200, 51456, 51457, + 51459, 51440, 51448, 51446, 0, 1, 49152, 51200, + 51456, 51457, 51459, 51440, 0, 1, 49152, 51200, + 51456, 51457, 51459, 51440, 51448, 0, 1, 49152, + 51200, 51456, 51457, 51459, 51440, 51448, 0, 1, + 49152, 51200, 51456, 51457, 51459, 51440, 51448, 51450, + 0, 1, 49152, 51200, 51456, 51457, 51459, 51463, + 51448, 0, 1, 49152, 51200, 51456, 51457, 51459, + 51463, 51448, 51452, 0, 1, 49152, 51200, 51456, + 51457, 51459, 51463, 51448, 51452, 0, 1, 49152, + 51200, 51456, 51457, 51459, 51463, 51448, 51452, 51454, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51456, 0, 1, 49152, 51200, 51456, 0, 1, + 49152, 51200, 51456, 51458, 0, 1, 49152, 51200, + 51456, 0, 1, 49152, 51200, 51456, 51460, 0, + 1, 49152, 51200, 51456, 51460, 0, 1, 49152, + 51200, 51456, 51464, 51462, 0, 1, 49152, 51200, + 51456, 0, 1, 49152, 51200, 51456, 51464, 0, + 1, 49152, 51200, 51456, 51464, 0, 1, 49152, + 51200, 51456, 51464, 51466, 0, 1, 49152, 51200, + 51456, 51464, 0, 1, 49152, 51200, 51456, 51472, + 51468, 0, 1, 49152, 51200, 51456, 51472, 51468, + 0, 1, 49152, 51200, 51456, 51472, 51473, 51470, + 0, 1, 49152, 51200, 51456, 0, 1, 49152, + 51200, 51456, 51472, 0, 1, 49152, 51200, 51456, + 51472, 0, 1, 49152, 51200, 51456, 51472, 51474, + 0, 1, 49152, 51200, 51456, 51472, 0, 1, + 49152, 51200, 51456, 51472, 51476, 0, 1, 49152, + 51200, 51456, 51472, 51476, 0, 1, 49152, 51200, + 51456, 51472, 51480, 51478, 0, 1, 49152, 51200, + 51456, 51472, 0, 1, 49152, 51200, 51456, 51488, + 51480, 0, 1, 49152, 51200, 51456, 51488, 51480, + 0, 1, 49152, 51200, 51456, 51488, 51480, 51482, + 0, 1, 49152, 51200, 51456, 51488, 51480, 0, + 1, 49152, 51200, 51456, 51488, 51489, 51484, 0, + 1, 49152, 51200, 51456, 51488, 51489, 51484, 0, + 1, 49152, 51200, 51456, 51488, 51489, 51484, 51486, + 0, 1, 49152, 51200, 51456, 0, 1, 49152, + 51200, 51456, 51488, 0, 1, 49152, 51200, 51456, + 51488, 0, 1, 49152, 51200, 51456, 51488, 51490, + 0, 1, 49152, 51200, 51456, 51488, 0, 1, + 49152, 51200, 51456, 51488, 51492, 0, 1, 49152, + 51200, 51456, 51488, 51492, 0, 1, 49152, 51200, + 51456, 51488, 51496, 51494, 0, 1, 49152, 51200, + 51456, 51488, 0, 1, 49152, 51200, 51456, 51488, + 51496, 0, 1, 49152, 51200, 51456, 51488, 51496, + 0, 1, 49152, 51200, 51456, 51488, 51496, 51498, + 0, 1, 49152, 51200, 51456, 51488, 51496, 0, + 1, 49152, 51200, 51456, 51488, 51504, 51500, 0, + 1, 49152, 51200, 51456, 51488, 51504, 51500, 0, + 1, 49152, 51200, 51456, 51488, 51504, 51505, 51502, + 0, 1, 49152, 51200, 51456, 51488, 0, 1, + 49152, 51200, 51456, 51520, 51504, 0, 1, 49152, + 51200, 51456, 51520, 51504, 0, 1, 49152, 51200, + 51456, 51520, 51504, 51506, 0, 1, 49152, 51200, + 51456, 51520, 51504, 0, 1, 49152, 51200, 51456, + 51520, 51504, 51508, 0, 1, 49152, 51200, 51456, + 51520, 51504, 51508, 0, 1, 49152, 51200, 51456, + 51520, 51504, 51512, 51510, 0, 1, 49152, 51200, + 51456, 51520, 51504, 0, 1, 49152, 51200, 51456, + 51520, 51521, 51512, 0, 1, 49152, 51200, 51456, + 51520, 51521, 51512, 0, 1, 49152, 51200, 51456, + 51520, 51521, 51512, 51514, 0, 1, 49152, 51200, + 51456, 51520, 51521, 51512, 0, 1, 49152, 51200, + 51456, 51520, 51521, 51512, 51516, 0, 1, 49152, + 51200, 51456, 51520, 51521, 51523, 51516, 0, 1, + 49152, 51200, 51456, 51520, 51521, 51523, 51516, 51518, + 0, 1, 49152, 51200, 51456, 0, 1, 49152, + 51200, 51456, 51520, 0, 1, 49152, 51200, 51456, + 51520, 0, 1, 49152, 51200, 51456, 51520, 51522, + 0, 1, 49152, 51200, 51456, 51520, 0, 1, + 49152, 51200, 51456, 51520, 51524, 0, 1, 49152, + 51200, 51456, 51520, 51524, 0, 1, 49152, 51200, + 51456, 51520, 51528, 51526, 0, 1, 49152, 51200, + 51456, 51520, 0, 1, 49152, 51200, 51456, 51520, + 51528, 0, 1, 49152, 51200, 51456, 51520, 51528, + 0, 1, 49152, 51200, 51456, 51520, 51528, 51530, + 0, 1, 49152, 51200, 51456, 51520, 51528, 0, + 1, 49152, 51200, 51456, 51520, 51536, 51532, 0, + 1, 49152, 51200, 51456, 51520, 51536, 51532, 0, + 1, 49152, 51200, 51456, 51520, 51536, 51537, 51534, + 0, 1, 49152, 51200, 51456, 51520, 0, 1, + 49152, 51200, 51456, 51520, 51536, 0, 1, 49152, + 51200, 51456, 51520, 51536, 0, 1, 49152, 51200, + 51456, 51520, 51536, 51538, 0, 1, 49152, 51200, + 51456, 51520, 51536, 0, 1, 49152, 51200, 51456, + 51520, 51536, 51540, 0, 1, 49152, 51200, 51456, + 51520, 51536, 51540, 0, 1, 49152, 51200, 51456, + 51520, 51536, 51544, 51542, 0, 1, 49152, 51200, + 51456, 51520, 51536, 0, 1, 49152, 51200, 51456, + 51520, 51552, 51544, 0, 1, 49152, 51200, 51456, + 51520, 51552, 51544, 0, 1, 49152, 51200, 51456, + 51520, 51552, 51544, 51546, 0, 1, 49152, 51200, + 51456, 51520, 51552, 51544, 0, 1, 49152, 51200, + 51456, 51520, 51552, 51553, 51548, 0, 1, 49152, + 51200, 51456, 51520, 51552, 51553, 51548, 0, 1, + 49152, 51200, 51456, 51520, 51552, 51553, 51548, 51550, + 0, 1, 49152, 51200, 51456, 51520, 0, 1, + 49152, 51200, 51456, 51584, 51552, 0, 1, 49152, + 51200, 51456, 51584, 51552, 0, 1, 49152, 51200, + 51456, 51584, 51552, 51554, 0, 1, 49152, 51200, + 51456, 51584, 51552, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51556, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51556, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51560, 51558, 0, 1, 49152, 51200, + 51456, 51584, 51552, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51560, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51560, 0, 1, 49152, 51200, 51456, + 51584, 51552, 51560, 51562, 0, 1, 49152, 51200, + 51456, 51584, 51552, 51560, 0, 1, 49152, 51200, + 51456, 51584, 51552, 51568, 51564, 0, 1, 49152, + 51200, 51456, 51584, 51552, 51568, 51564, 0, 1, + 49152, 51200, 51456, 51584, 51552, 51568, 51569, 51566, + 0, 1, 49152, 51200, 51456, 51584, 51552, 0, + 1, 49152, 51200, 51456, 51584, 51585, 51568, 0, + 1, 49152, 51200, 51456, 51584, 51585, 51568, 0, + 1, 49152, 51200, 51456, 51584, 51585, 51568, 51570, + 0, 1, 49152, 51200, 51456, 51584, 51585, 51568, + 0, 1, 49152, 51200, 51456, 51584, 51585, 51568, + 51572, 0, 1, 49152, 51200, 51456, 51584, 51585, + 51568, 51572, 0, 1, 49152, 51200, 51456, 51584, + 51585, 51568, 51576, 51574, 0, 1, 49152, 51200, + 51456, 51584, 51585, 51568, 0, 1, 49152, 51200, + 51456, 51584, 51585, 51568, 51576, 0, 1, 49152, + 51200, 51456, 51584, 51585, 51587, 51576, 0, 1, + 49152, 51200, 51456, 51584, 51585, 51587, 51576, 51578, + 0, 1, 49152, 51200, 51456, 51584, 51585, 51587, + 51576, 0, 1, 49152, 51200, 51456, 51584, 51585, + 51587, 51576, 51580, 0, 1, 49152, 51200, 51456, + 51584, 51585, 51587, 51576, 51580, 0, 1, 49152, + 51200, 51456, 51584, 51585, 51587, 51576, 51580, 51582, + 0, 1, 49152, 51200, 51456, 0, 1, 49152, + 51200, 51712, 51584, 0, 1, 49152, 51200, 51712, + 51584, 0, 1, 49152, 51200, 51712, 51584, 51586, + 0, 1, 49152, 51200, 51712, 51584, 0, 1, + 49152, 51200, 51712, 51584, 51588, 0, 1, 49152, + 51200, 51712, 51584, 51588, 0, 1, 49152, 51200, + 51712, 51584, 51592, 51590, 0, 1, 49152, 51200, + 51712, 51584, 0, 1, 49152, 51200, 51712, 51584, + 51592, 0, 1, 49152, 51200, 51712, 51584, 51592, + 0, 1, 49152, 51200, 51712, 51584, 51592, 51594, + 0, 1, 49152, 51200, 51712, 51584, 51592, 0, + 1, 49152, 51200, 51712, 51584, 51600, 51596, 0, + 1, 49152, 51200, 51712, 51584, 51600, 51596, 0, + 1, 49152, 51200, 51712, 51584, 51600, 51601, 51598, + 0, 1, 49152, 51200, 51712, 51584, 0, 1, + 49152, 51200, 51712, 51584, 51600, 0, 1, 49152, + 51200, 51712, 51584, 51600, 0, 1, 49152, 51200, + 51712, 51584, 51600, 51602, 0, 1, 49152, 51200, + 51712, 51584, 51600, 0, 1, 49152, 51200, 51712, + 51584, 51600, 51604, 0, 1, 49152, 51200, 51712, + 51584, 51600, 51604, 0, 1, 49152, 51200, 51712, + 51584, 51600, 51608, 51606, 0, 1, 49152, 51200, + 51712, 51584, 51600, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51608, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51608, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51608, 51610, 0, 1, 49152, 51200, + 51712, 51584, 51616, 51608, 0, 1, 49152, 51200, + 51712, 51584, 51616, 51617, 51612, 0, 1, 49152, + 51200, 51712, 51584, 51616, 51617, 51612, 0, 1, + 49152, 51200, 51712, 51584, 51616, 51617, 51612, 51614, + 0, 1, 49152, 51200, 51712, 51584, 0, 1, + 49152, 51200, 51712, 51584, 51616, 0, 1, 49152, + 51200, 51712, 51584, 51616, 0, 1, 49152, 51200, + 51712, 51584, 51616, 51618, 0, 1, 49152, 51200, + 51712, 51584, 51616, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51620, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51620, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51624, 51622, 0, 1, 49152, 51200, + 51712, 51584, 51616, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51624, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51624, 0, 1, 49152, 51200, 51712, + 51584, 51616, 51624, 51626, 0, 1, 49152, 51200, + 51712, 51584, 51616, 51624, 0, 1, 49152, 51200, + 51712, 51584, 51616, 51632, 51628, 0, 1, 49152, + 51200, 51712, 51584, 51616, 51632, 51628, 0, 1, + 49152, 51200, 51712, 51584, 51616, 51632, 51633, 51630, + 0, 1, 49152, 51200, 51712, 51584, 51616, 0, + 1, 49152, 51200, 51712, 51584, 51648, 51632, 0, + 1, 49152, 51200, 51712, 51584, 51648, 51632, 0, + 1, 49152, 51200, 51712, 51584, 51648, 51632, 51634, + 0, 1, 49152, 51200, 51712, 51584, 51648, 51632, + 0, 1, 49152, 51200, 51712, 51584, 51648, 51632, + 51636, 0, 1, 49152, 51200, 51712, 51584, 51648, + 51632, 51636, 0, 1, 49152, 51200, 51712, 51584, + 51648, 51632, 51640, 51638, 0, 1, 49152, 51200, + 51712, 51584, 51648, 51632, 0, 1, 49152, 51200, + 51712, 51584, 51648, 51649, 51640, 0, 1, 49152, + 51200, 51712, 51584, 51648, 51649, 51640, 0, 1, + 49152, 51200, 51712, 51584, 51648, 51649, 51640, 51642, + 0, 1, 49152, 51200, 51712, 51584, 51648, 51649, + 51640, 0, 1, 49152, 51200, 51712, 51584, 51648, + 51649, 51640, 51644, 0, 1, 49152, 51200, 51712, + 51584, 51648, 51649, 51651, 51644, 0, 1, 49152, + 51200, 51712, 51584, 51648, 51649, 51651, 51644, 51646, + 0, 1, 49152, 51200, 51712, 51584, 0, 1, + 49152, 51200, 51712, 51713, 51648, 0, 1, 49152, + 51200, 51712, 51713, 51648, 0, 1, 49152, 51200, + 51712, 51713, 51648, 51650, 0, 1, 49152, 51200, + 51712, 51713, 51648, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51652, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51652, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51656, 51654, 0, 1, 49152, 51200, + 51712, 51713, 51648, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51656, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51656, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51656, 51658, 0, 1, 49152, 51200, + 51712, 51713, 51648, 51656, 0, 1, 49152, 51200, + 51712, 51713, 51648, 51664, 51660, 0, 1, 49152, + 51200, 51712, 51713, 51648, 51664, 51660, 0, 1, + 49152, 51200, 51712, 51713, 51648, 51664, 51665, 51662, + 0, 1, 49152, 51200, 51712, 51713, 51648, 0, + 1, 49152, 51200, 51712, 51713, 51648, 51664, 0, + 1, 49152, 51200, 51712, 51713, 51648, 51664, 0, + 1, 49152, 51200, 51712, 51713, 51648, 51664, 51666, + 0, 1, 49152, 51200, 51712, 51713, 51648, 51664, + 0, 1, 49152, 51200, 51712, 51713, 51648, 51664, + 51668, 0, 1, 49152, 51200, 51712, 51713, 51648, + 51664, 51668, 0, 1, 49152, 51200, 51712, 51713, + 51648, 51664, 51672, 51670, 0, 1, 49152, 51200, + 51712, 51713, 51648, 51664, 0, 1, 49152, 51200, + 51712, 51713, 51648, 51680, 51672, 0, 1, 49152, + 51200, 51712, 51713, 51648, 51680, 51672, 0, 1, + 49152, 51200, 51712, 51713, 51648, 51680, 51672, 51674, + 0, 1, 49152, 51200, 51712, 51713, 51648, 51680, + 51672, 0, 1, 49152, 51200, 51712, 51713, 51648, + 51680, 51681, 51676, 0, 1, 49152, 51200, 51712, + 51713, 51648, 51680, 51681, 51676, 0, 1, 49152, + 51200, 51712, 51713, 51648, 51680, 51681, 51676, 51678, + 0, 1, 49152, 51200, 51712, 51713, 51648, 0, + 1, 49152, 51200, 51712, 51713, 51648, 51680, 0, + 1, 49152, 51200, 51712, 51713, 51715, 51680, 0, + 1, 49152, 51200, 51712, 51713, 51715, 51680, 51682, + 0, 1, 49152, 51200, 51712, 51713, 51715, 51680, + 0, 1, 49152, 51200, 51712, 51713, 51715, 51680, + 51684, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51680, 51684, 0, 1, 49152, 51200, 51712, 51713, + 51715, 51680, 51688, 51686, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51680, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51680, 51688, 0, 1, 49152, + 51200, 51712, 51713, 51715, 51680, 51688, 0, 1, + 49152, 51200, 51712, 51713, 51715, 51680, 51688, 51690, + 0, 1, 49152, 51200, 51712, 51713, 51715, 51680, + 51688, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51680, 51696, 51692, 0, 1, 49152, 51200, 51712, + 51713, 51715, 51680, 51696, 51692, 0, 1, 49152, + 51200, 51712, 51713, 51715, 51680, 51696, 51697, 51694, + 0, 1, 49152, 51200, 51712, 51713, 51715, 51680, + 0, 1, 49152, 51200, 51712, 51713, 51715, 51680, + 51696, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51680, 51696, 0, 1, 49152, 51200, 51712, 51713, + 51715, 51680, 51696, 51698, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51719, 51696, 0, 1, 49152, + 51200, 51712, 51713, 51715, 51719, 51696, 51700, 0, + 1, 49152, 51200, 51712, 51713, 51715, 51719, 51696, + 51700, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51719, 51696, 51704, 51702, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51719, 51696, 0, 1, 49152, + 51200, 51712, 51713, 51715, 51719, 51696, 51704, 0, + 1, 49152, 51200, 51712, 51713, 51715, 51719, 51696, + 51704, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51719, 51696, 51704, 51706, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51719, 51696, 51704, 0, 1, + 49152, 51200, 51712, 51713, 51715, 51719, 51696, 51704, + 51708, 0, 1, 49152, 51200, 51712, 51713, 51715, + 51719, 51696, 51704, 51708, 0, 1, 49152, 51200, + 51712, 51713, 51715, 51719, 51696, 51704, 51708, 51710, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 51712, 0, 1, 49152, 51200, 51712, 0, 1, + 49152, 51200, 51712, 51714, 0, 1, 49152, 51200, + 51712, 0, 1, 49152, 51200, 51712, 51716, 0, + 1, 49152, 51200, 51712, 51716, 0, 1, 49152, + 51200, 51712, 51720, 51718, 0, 1, 49152, 51200, + 51712, 0, 1, 49152, 51200, 51712, 51720, 0, + 1, 49152, 51200, 51712, 51720, 0, 1, 49152, + 51200, 51712, 51720, 51722, 0, 1, 49152, 51200, + 51712, 51720, 0, 1, 49152, 51200, 51712, 51728, + 51724, 0, 1, 49152, 51200, 51712, 51728, 51724, + 0, 1, 49152, 51200, 51712, 51728, 51729, 51726, + 0, 1, 49152, 51200, 51712, 0, 1, 49152, + 51200, 51712, 51728, 0, 1, 49152, 51200, 51712, + 51728, 0, 1, 49152, 51200, 51712, 51728, 51730, + 0, 1, 49152, 51200, 51712, 51728, 0, 1, + 49152, 51200, 51712, 51728, 51732, 0, 1, 49152, + 51200, 51712, 51728, 51732, 0, 1, 49152, 51200, + 51712, 51728, 51736, 51734, 0, 1, 49152, 51200, + 51712, 51728, 0, 1, 49152, 51200, 51712, 51744, + 51736, 0, 1, 49152, 51200, 51712, 51744, 51736, + 0, 1, 49152, 51200, 51712, 51744, 51736, 51738, + 0, 1, 49152, 51200, 51712, 51744, 51736, 0, + 1, 49152, 51200, 51712, 51744, 51745, 51740, 0, + 1, 49152, 51200, 51712, 51744, 51745, 51740, 0, + 1, 49152, 51200, 51712, 51744, 51745, 51740, 51742, + 0, 1, 49152, 51200, 51712, 0, 1, 49152, + 51200, 51712, 51744, 0, 1, 49152, 51200, 51712, + 51744, 0, 1, 49152, 51200, 51712, 51744, 51746, + 0, 1, 49152, 51200, 51712, 51744, 0, 1, + 49152, 51200, 51712, 51744, 51748, 0, 1, 49152, + 51200, 51712, 51744, 51748, 0, 1, 49152, 51200, + 51712, 51744, 51752, 51750, 0, 1, 49152, 51200, + 51712, 51744, 0, 1, 49152, 51200, 51712, 51744, + 51752, 0, 1, 49152, 51200, 51712, 51744, 51752, + 0, 1, 49152, 51200, 51712, 51744, 51752, 51754, + 0, 1, 49152, 51200, 51712, 51744, 51752, 0, + 1, 49152, 51200, 51712, 51744, 51760, 51756, 0, + 1, 49152, 51200, 51712, 51744, 51760, 51756, 0, + 1, 49152, 51200, 51712, 51744, 51760, 51761, 51758, + 0, 1, 49152, 51200, 51712, 51744, 0, 1, + 49152, 51200, 51712, 51776, 51760, 0, 1, 49152, + 51200, 51712, 51776, 51760, 0, 1, 49152, 51200, + 51712, 51776, 51760, 51762, 0, 1, 49152, 51200, + 51712, 51776, 51760, 0, 1, 49152, 51200, 51712, + 51776, 51760, 51764, 0, 1, 49152, 51200, 51712, + 51776, 51760, 51764, 0, 1, 49152, 51200, 51712, + 51776, 51760, 51768, 51766, 0, 1, 49152, 51200, + 51712, 51776, 51760, 0, 1, 49152, 51200, 51712, + 51776, 51777, 51768, 0, 1, 49152, 51200, 51712, + 51776, 51777, 51768, 0, 1, 49152, 51200, 51712, + 51776, 51777, 51768, 51770, 0, 1, 49152, 51200, + 51712, 51776, 51777, 51768, 0, 1, 49152, 51200, + 51712, 51776, 51777, 51768, 51772, 0, 1, 49152, + 51200, 51712, 51776, 51777, 51779, 51772, 0, 1, + 49152, 51200, 51712, 51776, 51777, 51779, 51772, 51774, + 0, 1, 49152, 51200, 51712, 0, 1, 49152, + 51200, 51712, 51776, 0, 1, 49152, 51200, 51712, + 51776, 0, 1, 49152, 51200, 51712, 51776, 51778, + 0, 1, 49152, 51200, 51712, 51776, 0, 1, + 49152, 51200, 51712, 51776, 51780, 0, 1, 49152, + 51200, 51712, 51776, 51780, 0, 1, 49152, 51200, + 51712, 51776, 51784, 51782, 0, 1, 49152, 51200, + 51712, 51776, 0, 1, 49152, 51200, 51712, 51776, + 51784, 0, 1, 49152, 51200, 51712, 51776, 51784, + 0, 1, 49152, 51200, 51712, 51776, 51784, 51786, + 0, 1, 49152, 51200, 51712, 51776, 51784, 0, + 1, 49152, 51200, 51712, 51776, 51792, 51788, 0, + 1, 49152, 51200, 51712, 51776, 51792, 51788, 0, + 1, 49152, 51200, 51712, 51776, 51792, 51793, 51790, + 0, 1, 49152, 51200, 51712, 51776, 0, 1, + 49152, 51200, 51712, 51776, 51792, 0, 1, 49152, + 51200, 51712, 51776, 51792, 0, 1, 49152, 51200, + 51712, 51776, 51792, 51794, 0, 1, 49152, 51200, + 51712, 51776, 51792, 0, 1, 49152, 51200, 51712, + 51776, 51792, 51796, 0, 1, 49152, 51200, 51712, + 51776, 51792, 51796, 0, 1, 49152, 51200, 51712, + 51776, 51792, 51800, 51798, 0, 1, 49152, 51200, + 51712, 51776, 51792, 0, 1, 49152, 51200, 51712, + 51776, 51808, 51800, 0, 1, 49152, 51200, 51712, + 51776, 51808, 51800, 0, 1, 49152, 51200, 51712, + 51776, 51808, 51800, 51802, 0, 1, 49152, 51200, + 51712, 51776, 51808, 51800, 0, 1, 49152, 51200, + 51712, 51776, 51808, 51809, 51804, 0, 1, 49152, + 51200, 51712, 51776, 51808, 51809, 51804, 0, 1, + 49152, 51200, 51712, 51776, 51808, 51809, 51804, 51806, + 0, 1, 49152, 51200, 51712, 51776, 0, 1, + 49152, 51200, 51712, 51840, 51808, 0, 1, 49152, + 51200, 51712, 51840, 51808, 0, 1, 49152, 51200, + 51712, 51840, 51808, 51810, 0, 1, 49152, 51200, + 51712, 51840, 51808, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51812, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51812, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51816, 51814, 0, 1, 49152, 51200, + 51712, 51840, 51808, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51816, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51816, 0, 1, 49152, 51200, 51712, + 51840, 51808, 51816, 51818, 0, 1, 49152, 51200, + 51712, 51840, 51808, 51816, 0, 1, 49152, 51200, + 51712, 51840, 51808, 51824, 51820, 0, 1, 49152, + 51200, 51712, 51840, 51808, 51824, 51820, 0, 1, + 49152, 51200, 51712, 51840, 51808, 51824, 51825, 51822, + 0, 1, 49152, 51200, 51712, 51840, 51808, 0, + 1, 49152, 51200, 51712, 51840, 51841, 51824, 0, + 1, 49152, 51200, 51712, 51840, 51841, 51824, 0, + 1, 49152, 51200, 51712, 51840, 51841, 51824, 51826, + 0, 1, 49152, 51200, 51712, 51840, 51841, 51824, + 0, 1, 49152, 51200, 51712, 51840, 51841, 51824, + 51828, 0, 1, 49152, 51200, 51712, 51840, 51841, + 51824, 51828, 0, 1, 49152, 51200, 51712, 51840, + 51841, 51824, 51832, 51830, 0, 1, 49152, 51200, + 51712, 51840, 51841, 51824, 0, 1, 49152, 51200, + 51712, 51840, 51841, 51824, 51832, 0, 1, 49152, + 51200, 51712, 51840, 51841, 51843, 51832, 0, 1, + 49152, 51200, 51712, 51840, 51841, 51843, 51832, 51834, + 0, 1, 49152, 51200, 51712, 51840, 51841, 51843, + 51832, 0, 1, 49152, 51200, 51712, 51840, 51841, + 51843, 51832, 51836, 0, 1, 49152, 51200, 51712, + 51840, 51841, 51843, 51832, 51836, 0, 1, 49152, + 51200, 51712, 51840, 51841, 51843, 51832, 51836, 51838, + 0, 1, 49152, 51200, 51712, 0, 1, 49152, + 51200, 51712, 51840, 0, 1, 49152, 51200, 51712, + 51840, 0, 1, 49152, 51200, 51712, 51840, 51842, + 0, 1, 49152, 51200, 51712, 51840, 0, 1, + 49152, 51200, 51712, 51840, 51844, 0, 1, 49152, + 51200, 51712, 51840, 51844, 0, 1, 49152, 51200, + 51712, 51840, 51848, 51846, 0, 1, 49152, 51200, + 51712, 51840, 0, 1, 49152, 51200, 51712, 51840, + 51848, 0, 1, 49152, 51200, 51712, 51840, 51848, + 0, 1, 49152, 51200, 51712, 51840, 51848, 51850, + 0, 1, 49152, 51200, 51712, 51840, 51848, 0, + 1, 49152, 51200, 51712, 51840, 51856, 51852, 0, + 1, 49152, 51200, 51712, 51840, 51856, 51852, 0, + 1, 49152, 51200, 51712, 51840, 51856, 51857, 51854, + 0, 1, 49152, 51200, 51712, 51840, 0, 1, + 49152, 51200, 51712, 51840, 51856, 0, 1, 49152, + 51200, 51712, 51840, 51856, 0, 1, 49152, 51200, + 51712, 51840, 51856, 51858, 0, 1, 49152, 51200, + 51712, 51840, 51856, 0, 1, 49152, 51200, 51712, + 51840, 51856, 51860, 0, 1, 49152, 51200, 51712, + 51840, 51856, 51860, 0, 1, 49152, 51200, 51712, + 51840, 51856, 51864, 51862, 0, 1, 49152, 51200, + 51712, 51840, 51856, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51864, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51864, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51864, 51866, 0, 1, 49152, 51200, + 51712, 51840, 51872, 51864, 0, 1, 49152, 51200, + 51712, 51840, 51872, 51873, 51868, 0, 1, 49152, + 51200, 51712, 51840, 51872, 51873, 51868, 0, 1, + 49152, 51200, 51712, 51840, 51872, 51873, 51868, 51870, + 0, 1, 49152, 51200, 51712, 51840, 0, 1, + 49152, 51200, 51712, 51840, 51872, 0, 1, 49152, + 51200, 51712, 51840, 51872, 0, 1, 49152, 51200, + 51712, 51840, 51872, 51874, 0, 1, 49152, 51200, + 51712, 51840, 51872, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51876, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51876, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51880, 51878, 0, 1, 49152, 51200, + 51712, 51840, 51872, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51880, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51880, 0, 1, 49152, 51200, 51712, + 51840, 51872, 51880, 51882, 0, 1, 49152, 51200, + 51712, 51840, 51872, 51880, 0, 1, 49152, 51200, + 51712, 51840, 51872, 51888, 51884, 0, 1, 49152, + 51200, 51712, 51840, 51872, 51888, 51884, 0, 1, + 49152, 51200, 51712, 51840, 51872, 51888, 51889, 51886, + 0, 1, 49152, 51200, 51712, 51840, 51872, 0, + 1, 49152, 51200, 51712, 51840, 51904, 51888, 0, + 1, 49152, 51200, 51712, 51840, 51904, 51888, 0, + 1, 49152, 51200, 51712, 51840, 51904, 51888, 51890, + 0, 1, 49152, 51200, 51712, 51840, 51904, 51888, + 0, 1, 49152, 51200, 51712, 51840, 51904, 51888, + 51892, 0, 1, 49152, 51200, 51712, 51840, 51904, + 51888, 51892, 0, 1, 49152, 51200, 51712, 51840, + 51904, 51888, 51896, 51894, 0, 1, 49152, 51200, + 51712, 51840, 51904, 51888, 0, 1, 49152, 51200, + 51712, 51840, 51904, 51905, 51896, 0, 1, 49152, + 51200, 51712, 51840, 51904, 51905, 51896, 0, 1, + 49152, 51200, 51712, 51840, 51904, 51905, 51896, 51898, + 0, 1, 49152, 51200, 51712, 51840, 51904, 51905, + 51896, 0, 1, 49152, 51200, 51712, 51840, 51904, + 51905, 51896, 51900, 0, 1, 49152, 51200, 51712, + 51840, 51904, 51905, 51907, 51900, 0, 1, 49152, + 51200, 51712, 51840, 51904, 51905, 51907, 51900, 51902, + 0, 1, 49152, 51200, 51712, 51840, 0, 1, + 49152, 51200, 51712, 51968, 51904, 0, 1, 49152, + 51200, 51712, 51968, 51904, 0, 1, 49152, 51200, + 51712, 51968, 51904, 51906, 0, 1, 49152, 51200, + 51712, 51968, 51904, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51908, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51908, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51912, 51910, 0, 1, 49152, 51200, + 51712, 51968, 51904, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51912, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51912, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51912, 51914, 0, 1, 49152, 51200, + 51712, 51968, 51904, 51912, 0, 1, 49152, 51200, + 51712, 51968, 51904, 51920, 51916, 0, 1, 49152, + 51200, 51712, 51968, 51904, 51920, 51916, 0, 1, + 49152, 51200, 51712, 51968, 51904, 51920, 51921, 51918, + 0, 1, 49152, 51200, 51712, 51968, 51904, 0, + 1, 49152, 51200, 51712, 51968, 51904, 51920, 0, + 1, 49152, 51200, 51712, 51968, 51904, 51920, 0, + 1, 49152, 51200, 51712, 51968, 51904, 51920, 51922, + 0, 1, 49152, 51200, 51712, 51968, 51904, 51920, + 0, 1, 49152, 51200, 51712, 51968, 51904, 51920, + 51924, 0, 1, 49152, 51200, 51712, 51968, 51904, + 51920, 51924, 0, 1, 49152, 51200, 51712, 51968, + 51904, 51920, 51928, 51926, 0, 1, 49152, 51200, + 51712, 51968, 51904, 51920, 0, 1, 49152, 51200, + 51712, 51968, 51904, 51936, 51928, 0, 1, 49152, + 51200, 51712, 51968, 51904, 51936, 51928, 0, 1, + 49152, 51200, 51712, 51968, 51904, 51936, 51928, 51930, + 0, 1, 49152, 51200, 51712, 51968, 51904, 51936, + 51928, 0, 1, 49152, 51200, 51712, 51968, 51904, + 51936, 51937, 51932, 0, 1, 49152, 51200, 51712, + 51968, 51904, 51936, 51937, 51932, 0, 1, 49152, + 51200, 51712, 51968, 51904, 51936, 51937, 51932, 51934, + 0, 1, 49152, 51200, 51712, 51968, 51904, 0, + 1, 49152, 51200, 51712, 51968, 51969, 51936, 0, + 1, 49152, 51200, 51712, 51968, 51969, 51936, 0, + 1, 49152, 51200, 51712, 51968, 51969, 51936, 51938, + 0, 1, 49152, 51200, 51712, 51968, 51969, 51936, + 0, 1, 49152, 51200, 51712, 51968, 51969, 51936, + 51940, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51936, 51940, 0, 1, 49152, 51200, 51712, 51968, + 51969, 51936, 51944, 51942, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51936, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51936, 51944, 0, 1, 49152, + 51200, 51712, 51968, 51969, 51936, 51944, 0, 1, + 49152, 51200, 51712, 51968, 51969, 51936, 51944, 51946, + 0, 1, 49152, 51200, 51712, 51968, 51969, 51936, + 51944, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51936, 51952, 51948, 0, 1, 49152, 51200, 51712, + 51968, 51969, 51936, 51952, 51948, 0, 1, 49152, + 51200, 51712, 51968, 51969, 51936, 51952, 51953, 51950, + 0, 1, 49152, 51200, 51712, 51968, 51969, 51936, + 0, 1, 49152, 51200, 51712, 51968, 51969, 51936, + 51952, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51971, 51952, 0, 1, 49152, 51200, 51712, 51968, + 51969, 51971, 51952, 51954, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51971, 51952, 0, 1, 49152, + 51200, 51712, 51968, 51969, 51971, 51952, 51956, 0, + 1, 49152, 51200, 51712, 51968, 51969, 51971, 51952, + 51956, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51971, 51952, 51960, 51958, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51971, 51952, 0, 1, 49152, + 51200, 51712, 51968, 51969, 51971, 51952, 51960, 0, + 1, 49152, 51200, 51712, 51968, 51969, 51971, 51952, + 51960, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51971, 51952, 51960, 51962, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51971, 51975, 51960, 0, 1, + 49152, 51200, 51712, 51968, 51969, 51971, 51975, 51960, + 51964, 0, 1, 49152, 51200, 51712, 51968, 51969, + 51971, 51975, 51960, 51964, 0, 1, 49152, 51200, + 51712, 51968, 51969, 51971, 51975, 51960, 51964, 51966, + 0, 1, 49152, 51200, 51712, 0, 1, 49152, + 51200, 52224, 51968, 0, 1, 49152, 51200, 52224, + 51968, 0, 1, 49152, 51200, 52224, 51968, 51970, + 0, 1, 49152, 51200, 52224, 51968, 0, 1, + 49152, 51200, 52224, 51968, 51972, 0, 1, 49152, + 51200, 52224, 51968, 51972, 0, 1, 49152, 51200, + 52224, 51968, 51976, 51974, 0, 1, 49152, 51200, + 52224, 51968, 0, 1, 49152, 51200, 52224, 51968, + 51976, 0, 1, 49152, 51200, 52224, 51968, 51976, + 0, 1, 49152, 51200, 52224, 51968, 51976, 51978, + 0, 1, 49152, 51200, 52224, 51968, 51976, 0, + 1, 49152, 51200, 52224, 51968, 51984, 51980, 0, + 1, 49152, 51200, 52224, 51968, 51984, 51980, 0, + 1, 49152, 51200, 52224, 51968, 51984, 51985, 51982, + 0, 1, 49152, 51200, 52224, 51968, 0, 1, + 49152, 51200, 52224, 51968, 51984, 0, 1, 49152, + 51200, 52224, 51968, 51984, 0, 1, 49152, 51200, + 52224, 51968, 51984, 51986, 0, 1, 49152, 51200, + 52224, 51968, 51984, 0, 1, 49152, 51200, 52224, + 51968, 51984, 51988, 0, 1, 49152, 51200, 52224, + 51968, 51984, 51988, 0, 1, 49152, 51200, 52224, + 51968, 51984, 51992, 51990, 0, 1, 49152, 51200, + 52224, 51968, 51984, 0, 1, 49152, 51200, 52224, + 51968, 52000, 51992, 0, 1, 49152, 51200, 52224, + 51968, 52000, 51992, 0, 1, 49152, 51200, 52224, + 51968, 52000, 51992, 51994, 0, 1, 49152, 51200, + 52224, 51968, 52000, 51992, 0, 1, 49152, 51200, + 52224, 51968, 52000, 52001, 51996, 0, 1, 49152, + 51200, 52224, 51968, 52000, 52001, 51996, 0, 1, + 49152, 51200, 52224, 51968, 52000, 52001, 51996, 51998, + 0, 1, 49152, 51200, 52224, 51968, 0, 1, + 49152, 51200, 52224, 51968, 52000, 0, 1, 49152, + 51200, 52224, 51968, 52000, 0, 1, 49152, 51200, + 52224, 51968, 52000, 52002, 0, 1, 49152, 51200, + 52224, 51968, 52000, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52004, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52004, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52008, 52006, 0, 1, 49152, 51200, + 52224, 51968, 52000, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52008, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52008, 0, 1, 49152, 51200, 52224, + 51968, 52000, 52008, 52010, 0, 1, 49152, 51200, + 52224, 51968, 52000, 52008, 0, 1, 49152, 51200, + 52224, 51968, 52000, 52016, 52012, 0, 1, 49152, + 51200, 52224, 51968, 52000, 52016, 52012, 0, 1, + 49152, 51200, 52224, 51968, 52000, 52016, 52017, 52014, + 0, 1, 49152, 51200, 52224, 51968, 52000, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52016, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52016, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52016, 52018, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52016, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52016, + 52020, 0, 1, 49152, 51200, 52224, 51968, 52032, + 52016, 52020, 0, 1, 49152, 51200, 52224, 51968, + 52032, 52016, 52024, 52022, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52016, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52033, 52024, 0, 1, 49152, + 51200, 52224, 51968, 52032, 52033, 52024, 0, 1, + 49152, 51200, 52224, 51968, 52032, 52033, 52024, 52026, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52033, + 52024, 0, 1, 49152, 51200, 52224, 51968, 52032, + 52033, 52024, 52028, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52033, 52035, 52028, 0, 1, 49152, + 51200, 52224, 51968, 52032, 52033, 52035, 52028, 52030, + 0, 1, 49152, 51200, 52224, 51968, 0, 1, + 49152, 51200, 52224, 51968, 52032, 0, 1, 49152, + 51200, 52224, 51968, 52032, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52034, 0, 1, 49152, 51200, + 52224, 51968, 52032, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52036, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52036, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52040, 52038, 0, 1, 49152, 51200, + 52224, 51968, 52032, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52040, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52040, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52040, 52042, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52040, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52048, 52044, 0, 1, 49152, + 51200, 52224, 51968, 52032, 52048, 52044, 0, 1, + 49152, 51200, 52224, 51968, 52032, 52048, 52049, 52046, + 0, 1, 49152, 51200, 52224, 51968, 52032, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52048, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52048, 0, + 1, 49152, 51200, 52224, 51968, 52032, 52048, 52050, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52048, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52048, + 52052, 0, 1, 49152, 51200, 52224, 51968, 52032, + 52048, 52052, 0, 1, 49152, 51200, 52224, 51968, + 52032, 52048, 52056, 52054, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52048, 0, 1, 49152, 51200, + 52224, 51968, 52032, 52064, 52056, 0, 1, 49152, + 51200, 52224, 51968, 52032, 52064, 52056, 0, 1, + 49152, 51200, 52224, 51968, 52032, 52064, 52056, 52058, + 0, 1, 49152, 51200, 52224, 51968, 52032, 52064, + 52056, 0, 1, 49152, 51200, 52224, 51968, 52032, + 52064, 52065, 52060, 0, 1, 49152, 51200, 52224, + 51968, 52032, 52064, 52065, 52060, 0, 1, 49152, + 51200, 52224, 51968, 52032, 52064, 52065, 52060, 52062, + 0, 1, 49152, 51200, 52224, 51968, 52032, 0, + 1, 49152, 51200, 52224, 51968, 52096, 52064, 0, + 1, 49152, 51200, 52224, 51968, 52096, 52064, 0, + 1, 49152, 51200, 52224, 51968, 52096, 52064, 52066, + 0, 1, 49152, 51200, 52224, 51968, 52096, 52064, + 0, 1, 49152, 51200, 52224, 51968, 52096, 52064, + 52068, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52064, 52068, 0, 1, 49152, 51200, 52224, 51968, + 52096, 52064, 52072, 52070, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52064, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52064, 52072, 0, 1, 49152, + 51200, 52224, 51968, 52096, 52064, 52072, 0, 1, + 49152, 51200, 52224, 51968, 52096, 52064, 52072, 52074, + 0, 1, 49152, 51200, 52224, 51968, 52096, 52064, + 52072, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52064, 52080, 52076, 0, 1, 49152, 51200, 52224, + 51968, 52096, 52064, 52080, 52076, 0, 1, 49152, + 51200, 52224, 51968, 52096, 52064, 52080, 52081, 52078, + 0, 1, 49152, 51200, 52224, 51968, 52096, 52064, + 0, 1, 49152, 51200, 52224, 51968, 52096, 52097, + 52080, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52097, 52080, 0, 1, 49152, 51200, 52224, 51968, + 52096, 52097, 52080, 52082, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52097, 52080, 0, 1, 49152, + 51200, 52224, 51968, 52096, 52097, 52080, 52084, 0, + 1, 49152, 51200, 52224, 51968, 52096, 52097, 52080, + 52084, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52097, 52080, 52088, 52086, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52097, 52080, 0, 1, 49152, + 51200, 52224, 51968, 52096, 52097, 52080, 52088, 0, + 1, 49152, 51200, 52224, 51968, 52096, 52097, 52099, + 52088, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52097, 52099, 52088, 52090, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52097, 52099, 52088, 0, 1, + 49152, 51200, 52224, 51968, 52096, 52097, 52099, 52088, + 52092, 0, 1, 49152, 51200, 52224, 51968, 52096, + 52097, 52099, 52088, 52092, 0, 1, 49152, 51200, + 52224, 51968, 52096, 52097, 52099, 52088, 52092, 52094, + 0, 1, 49152, 51200, 52224, 51968, 0, 1, + 49152, 51200, 52224, 51968, 52096, 0, 1, 49152, + 51200, 52224, 52225, 52096, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52098, 0, 1, 49152, 51200, + 52224, 52225, 52096, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52100, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52100, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52104, 52102, 0, 1, 49152, 51200, + 52224, 52225, 52096, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52104, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52104, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52104, 52106, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52104, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52112, 52108, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52112, 52108, 0, 1, + 49152, 51200, 52224, 52225, 52096, 52112, 52113, 52110, + 0, 1, 49152, 51200, 52224, 52225, 52096, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52112, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52112, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52112, 52114, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52112, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52112, + 52116, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52112, 52116, 0, 1, 49152, 51200, 52224, 52225, + 52096, 52112, 52120, 52118, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52112, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52128, 52120, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52128, 52120, 0, 1, + 49152, 51200, 52224, 52225, 52096, 52128, 52120, 52122, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52128, + 52120, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52128, 52129, 52124, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52128, 52129, 52124, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52128, 52129, 52124, 52126, + 0, 1, 49152, 51200, 52224, 52225, 52096, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52128, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52128, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52128, 52130, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52128, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52128, + 52132, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52128, 52132, 0, 1, 49152, 51200, 52224, 52225, + 52096, 52128, 52136, 52134, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52128, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52128, 52136, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52128, 52136, 0, 1, + 49152, 51200, 52224, 52225, 52096, 52128, 52136, 52138, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52128, + 52136, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52128, 52144, 52140, 0, 1, 49152, 51200, 52224, + 52225, 52096, 52128, 52144, 52140, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52128, 52144, 52145, 52142, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52128, + 0, 1, 49152, 51200, 52224, 52225, 52096, 52160, + 52144, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52160, 52144, 0, 1, 49152, 51200, 52224, 52225, + 52096, 52160, 52144, 52146, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52160, 52144, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52160, 52144, 52148, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52160, 52144, + 52148, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52160, 52144, 52152, 52150, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52160, 52144, 0, 1, 49152, + 51200, 52224, 52225, 52096, 52160, 52161, 52152, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52160, 52161, + 52152, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52160, 52161, 52152, 52154, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52160, 52161, 52152, 0, 1, + 49152, 51200, 52224, 52225, 52096, 52160, 52161, 52152, + 52156, 0, 1, 49152, 51200, 52224, 52225, 52096, + 52160, 52161, 52163, 52156, 0, 1, 49152, 51200, + 52224, 52225, 52096, 52160, 52161, 52163, 52156, 52158, + 0, 1, 49152, 51200, 52224, 52225, 52096, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52160, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52160, 0, + 1, 49152, 51200, 52224, 52225, 52096, 52160, 52162, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 52164, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52164, 0, 1, 49152, 51200, 52224, 52225, + 52227, 52160, 52168, 52166, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52168, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52160, 52168, 0, 1, + 49152, 51200, 52224, 52225, 52227, 52160, 52168, 52170, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 52168, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52176, 52172, 0, 1, 49152, 51200, 52224, + 52225, 52227, 52160, 52176, 52172, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52160, 52176, 52177, 52174, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 52176, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52176, 0, 1, 49152, 51200, 52224, 52225, + 52227, 52160, 52176, 52178, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52176, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52160, 52176, 52180, 0, + 1, 49152, 51200, 52224, 52225, 52227, 52160, 52176, + 52180, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52176, 52184, 52182, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52176, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52160, 52192, 52184, 0, + 1, 49152, 51200, 52224, 52225, 52227, 52160, 52192, + 52184, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52192, 52184, 52186, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52192, 52184, 0, 1, + 49152, 51200, 52224, 52225, 52227, 52160, 52192, 52193, + 52188, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52192, 52193, 52188, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52192, 52193, 52188, 52190, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52160, + 52192, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52192, 0, 1, 49152, 51200, 52224, 52225, + 52227, 52160, 52192, 52194, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52160, 52192, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52160, 52192, 52196, 0, + 1, 49152, 51200, 52224, 52225, 52227, 52160, 52192, + 52196, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52160, 52192, 52200, 52198, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52231, 52192, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52231, 52192, 52200, 0, + 1, 49152, 51200, 52224, 52225, 52227, 52231, 52192, + 52200, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52231, 52192, 52200, 52202, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52231, 52192, 52200, 0, 1, + 49152, 51200, 52224, 52225, 52227, 52231, 52192, 52208, + 52204, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52231, 52192, 52208, 52204, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52231, 52192, 52208, 52209, 52206, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52231, + 52192, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52231, 52192, 52208, 0, 1, 49152, 51200, 52224, + 52225, 52227, 52231, 52192, 52208, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52231, 52192, 52208, 52210, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52231, + 52192, 52208, 0, 1, 49152, 51200, 52224, 52225, + 52227, 52231, 52192, 52208, 52212, 0, 1, 49152, + 51200, 52224, 52225, 52227, 52231, 52192, 52208, 52212, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52231, + 52192, 52208, 52216, 52214, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52231, 52192, 52208, 0, 1, + 49152, 51200, 52224, 52225, 52227, 52231, 52192, 52208, + 52216, 0, 1, 49152, 51200, 52224, 52225, 52227, + 52231, 52192, 52208, 52216, 0, 1, 49152, 51200, + 52224, 52225, 52227, 52231, 52192, 52208, 52216, 52218, + 0, 1, 49152, 51200, 52224, 52225, 52227, 52231, + 52192, 52208, 52216, 0, 1, 49152, 51200, 52224, + 52225, 52227, 52231, 52192, 52208, 52216, 52220, 0, + 1, 49152, 51200, 52224, 52225, 52227, 52231, 52192, + 52208, 52216, 52220, 0, 1, 49152, 51200, 52224, + 52225, 52227, 52231, 52192, 52208, 52216, 52220, 52222, + 0, 1, 49152, 51200, 0, 1, 49152, 51200, + 52224, 0, 1, 49152, 51200, 52224, 0, 1, + 49152, 51200, 52224, 52226, 0, 1, 49152, 51200, + 52224, 0, 1, 49152, 51200, 52224, 52228, 0, + 1, 49152, 51200, 52224, 52228, 0, 1, 49152, + 51200, 52224, 52232, 52230, 0, 1, 49152, 51200, + 52224, 0, 1, 49152, 51200, 52224, 52232, 0, + 1, 49152, 51200, 52224, 52232, 0, 1, 49152, + 51200, 52224, 52232, 52234, 0, 1, 49152, 51200, + 52224, 52232, 0, 1, 49152, 51200, 52224, 52240, + 52236, 0, 1, 49152, 51200, 52224, 52240, 52236, + 0, 1, 49152, 51200, 52224, 52240, 52241, 52238, + 0, 1, 49152, 51200, 52224, 0, 1, 49152, + 51200, 52224, 52240, 0, 1, 49152, 51200, 52224, + 52240, 0, 1, 49152, 51200, 52224, 52240, 52242, + 0, 1, 49152, 51200, 52224, 52240, 0, 1, + 49152, 51200, 52224, 52240, 52244, 0, 1, 49152, + 51200, 52224, 52240, 52244, 0, 1, 49152, 51200, + 52224, 52240, 52248, 52246, 0, 1, 49152, 51200, + 52224, 52240, 0, 1, 49152, 51200, 52224, 52256, + 52248, 0, 1, 49152, 51200, 52224, 52256, 52248, + 0, 1, 49152, 51200, 52224, 52256, 52248, 52250, + 0, 1, 49152, 51200, 52224, 52256, 52248, 0, + 1, 49152, 51200, 52224, 52256, 52257, 52252, 0, + 1, 49152, 51200, 52224, 52256, 52257, 52252, 0, + 1, 49152, 51200, 52224, 52256, 52257, 52252, 52254, + 0, 1, 49152, 51200, 52224, 0, 1, 49152, + 51200, 52224, 52256, 0, 1, 49152, 51200, 52224, + 52256, 0, 1, 49152, 51200, 52224, 52256, 52258, + 0, 1, 49152, 51200, 52224, 52256, 0, 1, + 49152, 51200, 52224, 52256, 52260, 0, 1, 49152, + 51200, 52224, 52256, 52260, 0, 1, 49152, 51200, + 52224, 52256, 52264, 52262, 0, 1, 49152, 51200, + 52224, 52256, 0, 1, 49152, 51200, 52224, 52256, + 52264, 0, 1, 49152, 51200, 52224, 52256, 52264, + 0, 1, 49152, 51200, 52224, 52256, 52264, 52266, + 0, 1, 49152, 51200, 52224, 52256, 52264, 0, + 1, 49152, 51200, 52224, 52256, 52272, 52268, 0, + 1, 49152, 51200, 52224, 52256, 52272, 52268, 0, + 1, 49152, 51200, 52224, 52256, 52272, 52273, 52270, + 0, 1, 49152, 51200, 52224, 52256, 0, 1, + 49152, 51200, 52224, 52288, 52272, 0, 1, 49152, + 51200, 52224, 52288, 52272, 0, 1, 49152, 51200, + 52224, 52288, 52272, 52274, 0, 1, 49152, 51200, + 52224, 52288, 52272, 0, 1, 49152, 51200, 52224, + 52288, 52272, 52276, 0, 1, 49152, 51200, 52224, + 52288, 52272, 52276, 0, 1, 49152, 51200, 52224, + 52288, 52272, 52280, 52278, 0, 1, 49152, 51200, + 52224, 52288, 52272, 0, 1, 49152, 51200, 52224, + 52288, 52289, 52280, 0, 1, 49152, 51200, 52224, + 52288, 52289, 52280, 0, 1, 49152, 51200, 52224, + 52288, 52289, 52280, 52282, 0, 1, 49152, 51200, + 52224, 52288, 52289, 52280, 0, 1, 49152, 51200, + 52224, 52288, 52289, 52280, 52284, 0, 1, 49152, + 51200, 52224, 52288, 52289, 52291, 52284, 0, 1, + 49152, 51200, 52224, 52288, 52289, 52291, 52284, 52286, + 0, 1, 49152, 51200, 52224, 0, 1, 49152, + 51200, 52224, 52288, 0, 1, 49152, 51200, 52224, + 52288, 0, 1, 49152, 51200, 52224, 52288, 52290, + 0, 1, 49152, 51200, 52224, 52288, 0, 1, + 49152, 51200, 52224, 52288, 52292, 0, 1, 49152, + 51200, 52224, 52288, 52292, 0, 1, 49152, 51200, + 52224, 52288, 52296, 52294, 0, 1, 49152, 51200, + 52224, 52288, 0, 1, 49152, 51200, 52224, 52288, + 52296, 0, 1, 49152, 51200, 52224, 52288, 52296, + 0, 1, 49152, 51200, 52224, 52288, 52296, 52298, + 0, 1, 49152, 51200, 52224, 52288, 52296, 0, + 1, 49152, 51200, 52224, 52288, 52304, 52300, 0, + 1, 49152, 51200, 52224, 52288, 52304, 52300, 0, + 1, 49152, 51200, 52224, 52288, 52304, 52305, 52302, + 0, 1, 49152, 51200, 52224, 52288, 0, 1, + 49152, 51200, 52224, 52288, 52304, 0, 1, 49152, + 51200, 52224, 52288, 52304, 0, 1, 49152, 51200, + 52224, 52288, 52304, 52306, 0, 1, 49152, 51200, + 52224, 52288, 52304, 0, 1, 49152, 51200, 52224, + 52288, 52304, 52308, 0, 1, 49152, 51200, 52224, + 52288, 52304, 52308, 0, 1, 49152, 51200, 52224, + 52288, 52304, 52312, 52310, 0, 1, 49152, 51200, + 52224, 52288, 52304, 0, 1, 49152, 51200, 52224, + 52288, 52320, 52312, 0, 1, 49152, 51200, 52224, + 52288, 52320, 52312, 0, 1, 49152, 51200, 52224, + 52288, 52320, 52312, 52314, 0, 1, 49152, 51200, + 52224, 52288, 52320, 52312, 0, 1, 49152, 51200, + 52224, 52288, 52320, 52321, 52316, 0, 1, 49152, + 51200, 52224, 52288, 52320, 52321, 52316, 0, 1, + 49152, 51200, 52224, 52288, 52320, 52321, 52316, 52318, + 0, 1, 49152, 51200, 52224, 52288, 0, 1, + 49152, 51200, 52224, 52352, 52320, 0, 1, 49152, + 51200, 52224, 52352, 52320, 0, 1, 49152, 51200, + 52224, 52352, 52320, 52322, 0, 1, 49152, 51200, + 52224, 52352, 52320, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52324, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52324, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52328, 52326, 0, 1, 49152, 51200, + 52224, 52352, 52320, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52328, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52328, 0, 1, 49152, 51200, 52224, + 52352, 52320, 52328, 52330, 0, 1, 49152, 51200, + 52224, 52352, 52320, 52328, 0, 1, 49152, 51200, + 52224, 52352, 52320, 52336, 52332, 0, 1, 49152, + 51200, 52224, 52352, 52320, 52336, 52332, 0, 1, + 49152, 51200, 52224, 52352, 52320, 52336, 52337, 52334, + 0, 1, 49152, 51200, 52224, 52352, 52320, 0, + 1, 49152, 51200, 52224, 52352, 52353, 52336, 0, + 1, 49152, 51200, 52224, 52352, 52353, 52336, 0, + 1, 49152, 51200, 52224, 52352, 52353, 52336, 52338, + 0, 1, 49152, 51200, 52224, 52352, 52353, 52336, + 0, 1, 49152, 51200, 52224, 52352, 52353, 52336, + 52340, 0, 1, 49152, 51200, 52224, 52352, 52353, + 52336, 52340, 0, 1, 49152, 51200, 52224, 52352, + 52353, 52336, 52344, 52342, 0, 1, 49152, 51200, + 52224, 52352, 52353, 52336, 0, 1, 49152, 51200, + 52224, 52352, 52353, 52336, 52344, 0, 1, 49152, + 51200, 52224, 52352, 52353, 52355, 52344, 0, 1, + 49152, 51200, 52224, 52352, 52353, 52355, 52344, 52346, + 0, 1, 49152, 51200, 52224, 52352, 52353, 52355, + 52344, 0, 1, 49152, 51200, 52224, 52352, 52353, + 52355, 52344, 52348, 0, 1, 49152, 51200, 52224, + 52352, 52353, 52355, 52344, 52348, 0, 1, 49152, + 51200, 52224, 52352, 52353, 52355, 52344, 52348, 52350, + 0, 1, 49152, 51200, 52224, 0, 1, 49152, + 51200, 52224, 52352, 0, 1, 49152, 51200, 52224, + 52352, 0, 1, 49152, 51200, 52224, 52352, 52354, + 0, 1, 49152, 51200, 52224, 52352, 0, 1, + 49152, 51200, 52224, 52352, 52356, 0, 1, 49152, + 51200, 52224, 52352, 52356, 0, 1, 49152, 51200, + 52224, 52352, 52360, 52358, 0, 1, 49152, 51200, + 52224, 52352, 0, 1, 49152, 51200, 52224, 52352, + 52360, 0, 1, 49152, 51200, 52224, 52352, 52360, + 0, 1, 49152, 51200, 52224, 52352, 52360, 52362, + 0, 1, 49152, 51200, 52224, 52352, 52360, 0, + 1, 49152, 51200, 52224, 52352, 52368, 52364, 0, + 1, 49152, 51200, 52224, 52352, 52368, 52364, 0, + 1, 49152, 51200, 52224, 52352, 52368, 52369, 52366, + 0, 1, 49152, 51200, 52224, 52352, 0, 1, + 49152, 51200, 52224, 52352, 52368, 0, 1, 49152, + 51200, 52224, 52352, 52368, 0, 1, 49152, 51200, + 52224, 52352, 52368, 52370, 0, 1, 49152, 51200, + 52224, 52352, 52368, 0, 1, 49152, 51200, 52224, + 52352, 52368, 52372, 0, 1, 49152, 51200, 52224, + 52352, 52368, 52372, 0, 1, 49152, 51200, 52224, + 52352, 52368, 52376, 52374, 0, 1, 49152, 51200, + 52224, 52352, 52368, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52376, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52376, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52376, 52378, 0, 1, 49152, 51200, + 52224, 52352, 52384, 52376, 0, 1, 49152, 51200, + 52224, 52352, 52384, 52385, 52380, 0, 1, 49152, + 51200, 52224, 52352, 52384, 52385, 52380, 0, 1, + 49152, 51200, 52224, 52352, 52384, 52385, 52380, 52382, + 0, 1, 49152, 51200, 52224, 52352, 0, 1, + 49152, 51200, 52224, 52352, 52384, 0, 1, 49152, + 51200, 52224, 52352, 52384, 0, 1, 49152, 51200, + 52224, 52352, 52384, 52386, 0, 1, 49152, 51200, + 52224, 52352, 52384, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52388, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52388, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52392, 52390, 0, 1, 49152, 51200, + 52224, 52352, 52384, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52392, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52392, 0, 1, 49152, 51200, 52224, + 52352, 52384, 52392, 52394, 0, 1, 49152, 51200, + 52224, 52352, 52384, 52392, 0, 1, 49152, 51200, + 52224, 52352, 52384, 52400, 52396, 0, 1, 49152, + 51200, 52224, 52352, 52384, 52400, 52396, 0, 1, + 49152, 51200, 52224, 52352, 52384, 52400, 52401, 52398, + 0, 1, 49152, 51200, 52224, 52352, 52384, 0, + 1, 49152, 51200, 52224, 52352, 52416, 52400, 0, + 1, 49152, 51200, 52224, 52352, 52416, 52400, 0, + 1, 49152, 51200, 52224, 52352, 52416, 52400, 52402, + 0, 1, 49152, 51200, 52224, 52352, 52416, 52400, + 0, 1, 49152, 51200, 52224, 52352, 52416, 52400, + 52404, 0, 1, 49152, 51200, 52224, 52352, 52416, + 52400, 52404, 0, 1, 49152, 51200, 52224, 52352, + 52416, 52400, 52408, 52406, 0, 1, 49152, 51200, + 52224, 52352, 52416, 52400, 0, 1, 49152, 51200, + 52224, 52352, 52416, 52417, 52408, 0, 1, 49152, + 51200, 52224, 52352, 52416, 52417, 52408, 0, 1, + 49152, 51200, 52224, 52352, 52416, 52417, 52408, 52410, + 0, 1, 49152, 51200, 52224, 52352, 52416, 52417, + 52408, 0, 1, 49152, 51200, 52224, 52352, 52416, + 52417, 52408, 52412, 0, 1, 49152, 51200, 52224, + 52352, 52416, 52417, 52419, 52412, 0, 1, 49152, + 51200, 52224, 52352, 52416, 52417, 52419, 52412, 52414, + 0, 1, 49152, 51200, 52224, 52352, 0, 1, + 49152, 51200, 52224, 52480, 52416, 0, 1, 49152, + 51200, 52224, 52480, 52416, 0, 1, 49152, 51200, + 52224, 52480, 52416, 52418, 0, 1, 49152, 51200, + 52224, 52480, 52416, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52420, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52420, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52424, 52422, 0, 1, 49152, 51200, + 52224, 52480, 52416, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52424, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52424, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52424, 52426, 0, 1, 49152, 51200, + 52224, 52480, 52416, 52424, 0, 1, 49152, 51200, + 52224, 52480, 52416, 52432, 52428, 0, 1, 49152, + 51200, 52224, 52480, 52416, 52432, 52428, 0, 1, + 49152, 51200, 52224, 52480, 52416, 52432, 52433, 52430, + 0, 1, 49152, 51200, 52224, 52480, 52416, 0, + 1, 49152, 51200, 52224, 52480, 52416, 52432, 0, + 1, 49152, 51200, 52224, 52480, 52416, 52432, 0, + 1, 49152, 51200, 52224, 52480, 52416, 52432, 52434, + 0, 1, 49152, 51200, 52224, 52480, 52416, 52432, + 0, 1, 49152, 51200, 52224, 52480, 52416, 52432, + 52436, 0, 1, 49152, 51200, 52224, 52480, 52416, + 52432, 52436, 0, 1, 49152, 51200, 52224, 52480, + 52416, 52432, 52440, 52438, 0, 1, 49152, 51200, + 52224, 52480, 52416, 52432, 0, 1, 49152, 51200, + 52224, 52480, 52416, 52448, 52440, 0, 1, 49152, + 51200, 52224, 52480, 52416, 52448, 52440, 0, 1, + 49152, 51200, 52224, 52480, 52416, 52448, 52440, 52442, + 0, 1, 49152, 51200, 52224, 52480, 52416, 52448, + 52440, 0, 1, 49152, 51200, 52224, 52480, 52416, + 52448, 52449, 52444, 0, 1, 49152, 51200, 52224, + 52480, 52416, 52448, 52449, 52444, 0, 1, 49152, + 51200, 52224, 52480, 52416, 52448, 52449, 52444, 52446, + 0, 1, 49152, 51200, 52224, 52480, 52416, 0, + 1, 49152, 51200, 52224, 52480, 52481, 52448, 0, + 1, 49152, 51200, 52224, 52480, 52481, 52448, 0, + 1, 49152, 51200, 52224, 52480, 52481, 52448, 52450, + 0, 1, 49152, 51200, 52224, 52480, 52481, 52448, + 0, 1, 49152, 51200, 52224, 52480, 52481, 52448, + 52452, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52448, 52452, 0, 1, 49152, 51200, 52224, 52480, + 52481, 52448, 52456, 52454, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52448, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52448, 52456, 0, 1, 49152, + 51200, 52224, 52480, 52481, 52448, 52456, 0, 1, + 49152, 51200, 52224, 52480, 52481, 52448, 52456, 52458, + 0, 1, 49152, 51200, 52224, 52480, 52481, 52448, + 52456, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52448, 52464, 52460, 0, 1, 49152, 51200, 52224, + 52480, 52481, 52448, 52464, 52460, 0, 1, 49152, + 51200, 52224, 52480, 52481, 52448, 52464, 52465, 52462, + 0, 1, 49152, 51200, 52224, 52480, 52481, 52448, + 0, 1, 49152, 51200, 52224, 52480, 52481, 52448, + 52464, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52483, 52464, 0, 1, 49152, 51200, 52224, 52480, + 52481, 52483, 52464, 52466, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52483, 52464, 0, 1, 49152, + 51200, 52224, 52480, 52481, 52483, 52464, 52468, 0, + 1, 49152, 51200, 52224, 52480, 52481, 52483, 52464, + 52468, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52483, 52464, 52472, 52470, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52483, 52464, 0, 1, 49152, + 51200, 52224, 52480, 52481, 52483, 52464, 52472, 0, + 1, 49152, 51200, 52224, 52480, 52481, 52483, 52464, + 52472, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52483, 52464, 52472, 52474, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52483, 52487, 52472, 0, 1, + 49152, 51200, 52224, 52480, 52481, 52483, 52487, 52472, + 52476, 0, 1, 49152, 51200, 52224, 52480, 52481, + 52483, 52487, 52472, 52476, 0, 1, 49152, 51200, + 52224, 52480, 52481, 52483, 52487, 52472, 52476, 52478, + 0, 1, 49152, 51200, 52224, 0, 1, 49152, + 53248, 52224, 52480, 0, 1, 49152, 53248, 52224, + 52480, 0, 1, 49152, 53248, 52224, 52480, 52482, + 0, 1, 49152, 53248, 52224, 52480, 0, 1, + 49152, 53248, 52224, 52480, 52484, 0, 1, 49152, + 53248, 52224, 52480, 52484, 0, 1, 49152, 53248, + 52224, 52480, 52488, 52486, 0, 1, 49152, 53248, + 52224, 52480, 0, 1, 49152, 53248, 52224, 52480, + 52488, 0, 1, 49152, 53248, 52224, 52480, 52488, + 0, 1, 49152, 53248, 52224, 52480, 52488, 52490, + 0, 1, 49152, 53248, 52224, 52480, 52488, 0, + 1, 49152, 53248, 52224, 52480, 52496, 52492, 0, + 1, 49152, 53248, 52224, 52480, 52496, 52492, 0, + 1, 49152, 53248, 52224, 52480, 52496, 52497, 52494, + 0, 1, 49152, 53248, 52224, 52480, 0, 1, + 49152, 53248, 52224, 52480, 52496, 0, 1, 49152, + 53248, 52224, 52480, 52496, 0, 1, 49152, 53248, + 52224, 52480, 52496, 52498, 0, 1, 49152, 53248, + 52224, 52480, 52496, 0, 1, 49152, 53248, 52224, + 52480, 52496, 52500, 0, 1, 49152, 53248, 52224, + 52480, 52496, 52500, 0, 1, 49152, 53248, 52224, + 52480, 52496, 52504, 52502, 0, 1, 49152, 53248, + 52224, 52480, 52496, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52504, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52504, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52504, 52506, 0, 1, 49152, 53248, + 52224, 52480, 52512, 52504, 0, 1, 49152, 53248, + 52224, 52480, 52512, 52513, 52508, 0, 1, 49152, + 53248, 52224, 52480, 52512, 52513, 52508, 0, 1, + 49152, 53248, 52224, 52480, 52512, 52513, 52508, 52510, + 0, 1, 49152, 53248, 52224, 52480, 0, 1, + 49152, 53248, 52224, 52480, 52512, 0, 1, 49152, + 53248, 52224, 52480, 52512, 0, 1, 49152, 53248, + 52224, 52480, 52512, 52514, 0, 1, 49152, 53248, + 52224, 52480, 52512, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52516, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52516, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52520, 52518, 0, 1, 49152, 53248, + 52224, 52480, 52512, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52520, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52520, 0, 1, 49152, 53248, 52224, + 52480, 52512, 52520, 52522, 0, 1, 49152, 53248, + 52224, 52480, 52512, 52520, 0, 1, 49152, 53248, + 52224, 52480, 52512, 52528, 52524, 0, 1, 49152, + 53248, 52224, 52480, 52512, 52528, 52524, 0, 1, + 49152, 53248, 52224, 52480, 52512, 52528, 52529, 52526, + 0, 1, 49152, 53248, 52224, 52480, 52512, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52528, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52528, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52528, 52530, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52528, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52528, + 52532, 0, 1, 49152, 53248, 52224, 52480, 52544, + 52528, 52532, 0, 1, 49152, 53248, 52224, 52480, + 52544, 52528, 52536, 52534, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52528, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52545, 52536, 0, 1, 49152, + 53248, 52224, 52480, 52544, 52545, 52536, 0, 1, + 49152, 53248, 52224, 52480, 52544, 52545, 52536, 52538, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52545, + 52536, 0, 1, 49152, 53248, 52224, 52480, 52544, + 52545, 52536, 52540, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52545, 52547, 52540, 0, 1, 49152, + 53248, 52224, 52480, 52544, 52545, 52547, 52540, 52542, + 0, 1, 49152, 53248, 52224, 52480, 0, 1, + 49152, 53248, 52224, 52480, 52544, 0, 1, 49152, + 53248, 52224, 52480, 52544, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52546, 0, 1, 49152, 53248, + 52224, 52480, 52544, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52548, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52548, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52552, 52550, 0, 1, 49152, 53248, + 52224, 52480, 52544, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52552, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52552, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52552, 52554, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52552, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52560, 52556, 0, 1, 49152, + 53248, 52224, 52480, 52544, 52560, 52556, 0, 1, + 49152, 53248, 52224, 52480, 52544, 52560, 52561, 52558, + 0, 1, 49152, 53248, 52224, 52480, 52544, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52560, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52560, 0, + 1, 49152, 53248, 52224, 52480, 52544, 52560, 52562, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52560, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52560, + 52564, 0, 1, 49152, 53248, 52224, 52480, 52544, + 52560, 52564, 0, 1, 49152, 53248, 52224, 52480, + 52544, 52560, 52568, 52566, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52560, 0, 1, 49152, 53248, + 52224, 52480, 52544, 52576, 52568, 0, 1, 49152, + 53248, 52224, 52480, 52544, 52576, 52568, 0, 1, + 49152, 53248, 52224, 52480, 52544, 52576, 52568, 52570, + 0, 1, 49152, 53248, 52224, 52480, 52544, 52576, + 52568, 0, 1, 49152, 53248, 52224, 52480, 52544, + 52576, 52577, 52572, 0, 1, 49152, 53248, 52224, + 52480, 52544, 52576, 52577, 52572, 0, 1, 49152, + 53248, 52224, 52480, 52544, 52576, 52577, 52572, 52574, + 0, 1, 49152, 53248, 52224, 52480, 52544, 0, + 1, 49152, 53248, 52224, 52480, 52608, 52576, 0, + 1, 49152, 53248, 52224, 52480, 52608, 52576, 0, + 1, 49152, 53248, 52224, 52480, 52608, 52576, 52578, + 0, 1, 49152, 53248, 52224, 52480, 52608, 52576, + 0, 1, 49152, 53248, 52224, 52480, 52608, 52576, + 52580, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52576, 52580, 0, 1, 49152, 53248, 52224, 52480, + 52608, 52576, 52584, 52582, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52576, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52576, 52584, 0, 1, 49152, + 53248, 52224, 52480, 52608, 52576, 52584, 0, 1, + 49152, 53248, 52224, 52480, 52608, 52576, 52584, 52586, + 0, 1, 49152, 53248, 52224, 52480, 52608, 52576, + 52584, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52576, 52592, 52588, 0, 1, 49152, 53248, 52224, + 52480, 52608, 52576, 52592, 52588, 0, 1, 49152, + 53248, 52224, 52480, 52608, 52576, 52592, 52593, 52590, + 0, 1, 49152, 53248, 52224, 52480, 52608, 52576, + 0, 1, 49152, 53248, 52224, 52480, 52608, 52609, + 52592, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52609, 52592, 0, 1, 49152, 53248, 52224, 52480, + 52608, 52609, 52592, 52594, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52609, 52592, 0, 1, 49152, + 53248, 52224, 52480, 52608, 52609, 52592, 52596, 0, + 1, 49152, 53248, 52224, 52480, 52608, 52609, 52592, + 52596, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52609, 52592, 52600, 52598, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52609, 52592, 0, 1, 49152, + 53248, 52224, 52480, 52608, 52609, 52592, 52600, 0, + 1, 49152, 53248, 52224, 52480, 52608, 52609, 52611, + 52600, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52609, 52611, 52600, 52602, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52609, 52611, 52600, 0, 1, + 49152, 53248, 52224, 52480, 52608, 52609, 52611, 52600, + 52604, 0, 1, 49152, 53248, 52224, 52480, 52608, + 52609, 52611, 52600, 52604, 0, 1, 49152, 53248, + 52224, 52480, 52608, 52609, 52611, 52600, 52604, 52606, + 0, 1, 49152, 53248, 52224, 52480, 0, 1, + 49152, 53248, 52224, 52736, 52608, 0, 1, 49152, + 53248, 52224, 52736, 52608, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52610, 0, 1, 49152, 53248, + 52224, 52736, 52608, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52612, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52612, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52616, 52614, 0, 1, 49152, 53248, + 52224, 52736, 52608, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52616, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52616, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52616, 52618, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52616, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52624, 52620, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52624, 52620, 0, 1, + 49152, 53248, 52224, 52736, 52608, 52624, 52625, 52622, + 0, 1, 49152, 53248, 52224, 52736, 52608, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52624, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52624, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52624, 52626, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52624, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52624, + 52628, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52624, 52628, 0, 1, 49152, 53248, 52224, 52736, + 52608, 52624, 52632, 52630, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52624, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52640, 52632, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52640, 52632, 0, 1, + 49152, 53248, 52224, 52736, 52608, 52640, 52632, 52634, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52640, + 52632, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52640, 52641, 52636, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52640, 52641, 52636, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52640, 52641, 52636, 52638, + 0, 1, 49152, 53248, 52224, 52736, 52608, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52640, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52640, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52640, 52642, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52640, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52640, + 52644, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52640, 52644, 0, 1, 49152, 53248, 52224, 52736, + 52608, 52640, 52648, 52646, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52640, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52640, 52648, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52640, 52648, 0, 1, + 49152, 53248, 52224, 52736, 52608, 52640, 52648, 52650, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52640, + 52648, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52640, 52656, 52652, 0, 1, 49152, 53248, 52224, + 52736, 52608, 52640, 52656, 52652, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52640, 52656, 52657, 52654, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52640, + 0, 1, 49152, 53248, 52224, 52736, 52608, 52672, + 52656, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52672, 52656, 0, 1, 49152, 53248, 52224, 52736, + 52608, 52672, 52656, 52658, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52672, 52656, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52672, 52656, 52660, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52672, 52656, + 52660, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52672, 52656, 52664, 52662, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52672, 52656, 0, 1, 49152, + 53248, 52224, 52736, 52608, 52672, 52673, 52664, 0, + 1, 49152, 53248, 52224, 52736, 52608, 52672, 52673, + 52664, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52672, 52673, 52664, 52666, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52672, 52673, 52664, 0, 1, + 49152, 53248, 52224, 52736, 52608, 52672, 52673, 52664, + 52668, 0, 1, 49152, 53248, 52224, 52736, 52608, + 52672, 52673, 52675, 52668, 0, 1, 49152, 53248, + 52224, 52736, 52608, 52672, 52673, 52675, 52668, 52670, + 0, 1, 49152, 53248, 52224, 52736, 52608, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52672, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52672, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52672, 52674, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 52676, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52676, 0, 1, 49152, 53248, 52224, 52736, + 52737, 52672, 52680, 52678, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 52680, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52672, 52680, 0, 1, + 49152, 53248, 52224, 52736, 52737, 52672, 52680, 52682, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 52680, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52688, 52684, 0, 1, 49152, 53248, 52224, + 52736, 52737, 52672, 52688, 52684, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52672, 52688, 52689, 52686, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 52688, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52688, 0, 1, 49152, 53248, 52224, 52736, + 52737, 52672, 52688, 52690, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 52688, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52672, 52688, 52692, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52672, 52688, + 52692, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52688, 52696, 52694, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 52688, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52672, 52704, 52696, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52672, 52704, + 52696, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52704, 52696, 52698, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 52704, 52696, 0, 1, + 49152, 53248, 52224, 52736, 52737, 52672, 52704, 52705, + 52700, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52672, 52704, 52705, 52700, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52672, 52704, 52705, 52700, 52702, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52672, + 52704, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52704, 0, 1, 49152, 53248, 52224, 52736, + 52737, 52739, 52704, 52706, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52704, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52739, 52704, 52708, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52739, 52704, + 52708, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52704, 52712, 52710, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52704, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52739, 52704, 52712, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52739, 52704, + 52712, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52704, 52712, 52714, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52704, 52712, 0, 1, + 49152, 53248, 52224, 52736, 52737, 52739, 52704, 52720, + 52716, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52704, 52720, 52716, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52704, 52720, 52721, 52718, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52739, + 52704, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52704, 52720, 0, 1, 49152, 53248, 52224, + 52736, 52737, 52739, 52704, 52720, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52739, 52704, 52720, 52722, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52739, + 52743, 52720, 0, 1, 49152, 53248, 52224, 52736, + 52737, 52739, 52743, 52720, 52724, 0, 1, 49152, + 53248, 52224, 52736, 52737, 52739, 52743, 52720, 52724, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52739, + 52743, 52720, 52728, 52726, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52743, 52720, 0, 1, + 49152, 53248, 52224, 52736, 52737, 52739, 52743, 52720, + 52728, 0, 1, 49152, 53248, 52224, 52736, 52737, + 52739, 52743, 52720, 52728, 0, 1, 49152, 53248, + 52224, 52736, 52737, 52739, 52743, 52720, 52728, 52730, + 0, 1, 49152, 53248, 52224, 52736, 52737, 52739, + 52743, 52720, 52728, 0, 1, 49152, 53248, 52224, + 52736, 52737, 52739, 52743, 52720, 52728, 52732, 0, + 1, 49152, 53248, 52224, 52736, 52737, 52739, 52743, + 52720, 52728, 52732, 0, 1, 49152, 53248, 52224, + 52736, 52737, 52739, 52743, 52720, 52728, 52732, 52734, + 0, 1, 49152, 53248, 52224, 0, 1, 49152, + 53248, 52224, 52736, 0, 1, 49152, 53248, 53249, + 52736, 0, 1, 49152, 53248, 53249, 52736, 52738, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52740, 0, 1, 49152, + 53248, 53249, 52736, 52740, 0, 1, 49152, 53248, + 53249, 52736, 52744, 52742, 0, 1, 49152, 53248, + 53249, 52736, 0, 1, 49152, 53248, 53249, 52736, + 52744, 0, 1, 49152, 53248, 53249, 52736, 52744, + 0, 1, 49152, 53248, 53249, 52736, 52744, 52746, + 0, 1, 49152, 53248, 53249, 52736, 52744, 0, + 1, 49152, 53248, 53249, 52736, 52752, 52748, 0, + 1, 49152, 53248, 53249, 52736, 52752, 52748, 0, + 1, 49152, 53248, 53249, 52736, 52752, 52753, 52750, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52752, 0, 1, 49152, + 53248, 53249, 52736, 52752, 0, 1, 49152, 53248, + 53249, 52736, 52752, 52754, 0, 1, 49152, 53248, + 53249, 52736, 52752, 0, 1, 49152, 53248, 53249, + 52736, 52752, 52756, 0, 1, 49152, 53248, 53249, + 52736, 52752, 52756, 0, 1, 49152, 53248, 53249, + 52736, 52752, 52760, 52758, 0, 1, 49152, 53248, + 53249, 52736, 52752, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52760, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52760, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52760, 52762, 0, 1, 49152, 53248, + 53249, 52736, 52768, 52760, 0, 1, 49152, 53248, + 53249, 52736, 52768, 52769, 52764, 0, 1, 49152, + 53248, 53249, 52736, 52768, 52769, 52764, 0, 1, + 49152, 53248, 53249, 52736, 52768, 52769, 52764, 52766, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52768, 0, 1, 49152, + 53248, 53249, 52736, 52768, 0, 1, 49152, 53248, + 53249, 52736, 52768, 52770, 0, 1, 49152, 53248, + 53249, 52736, 52768, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52772, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52772, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52776, 52774, 0, 1, 49152, 53248, + 53249, 52736, 52768, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52776, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52776, 0, 1, 49152, 53248, 53249, + 52736, 52768, 52776, 52778, 0, 1, 49152, 53248, + 53249, 52736, 52768, 52776, 0, 1, 49152, 53248, + 53249, 52736, 52768, 52784, 52780, 0, 1, 49152, + 53248, 53249, 52736, 52768, 52784, 52780, 0, 1, + 49152, 53248, 53249, 52736, 52768, 52784, 52785, 52782, + 0, 1, 49152, 53248, 53249, 52736, 52768, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52784, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52784, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52784, 52786, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52784, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52784, + 52788, 0, 1, 49152, 53248, 53249, 52736, 52800, + 52784, 52788, 0, 1, 49152, 53248, 53249, 52736, + 52800, 52784, 52792, 52790, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52784, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52801, 52792, 0, 1, 49152, + 53248, 53249, 52736, 52800, 52801, 52792, 0, 1, + 49152, 53248, 53249, 52736, 52800, 52801, 52792, 52794, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52801, + 52792, 0, 1, 49152, 53248, 53249, 52736, 52800, + 52801, 52792, 52796, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52801, 52803, 52796, 0, 1, 49152, + 53248, 53249, 52736, 52800, 52801, 52803, 52796, 52798, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52800, 0, 1, 49152, + 53248, 53249, 52736, 52800, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52802, 0, 1, 49152, 53248, + 53249, 52736, 52800, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52804, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52804, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52808, 52806, 0, 1, 49152, 53248, + 53249, 52736, 52800, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52808, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52808, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52808, 52810, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52808, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52816, 52812, 0, 1, 49152, + 53248, 53249, 52736, 52800, 52816, 52812, 0, 1, + 49152, 53248, 53249, 52736, 52800, 52816, 52817, 52814, + 0, 1, 49152, 53248, 53249, 52736, 52800, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52816, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52816, 0, + 1, 49152, 53248, 53249, 52736, 52800, 52816, 52818, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52816, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52816, + 52820, 0, 1, 49152, 53248, 53249, 52736, 52800, + 52816, 52820, 0, 1, 49152, 53248, 53249, 52736, + 52800, 52816, 52824, 52822, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52816, 0, 1, 49152, 53248, + 53249, 52736, 52800, 52832, 52824, 0, 1, 49152, + 53248, 53249, 52736, 52800, 52832, 52824, 0, 1, + 49152, 53248, 53249, 52736, 52800, 52832, 52824, 52826, + 0, 1, 49152, 53248, 53249, 52736, 52800, 52832, + 52824, 0, 1, 49152, 53248, 53249, 52736, 52800, + 52832, 52833, 52828, 0, 1, 49152, 53248, 53249, + 52736, 52800, 52832, 52833, 52828, 0, 1, 49152, + 53248, 53249, 52736, 52800, 52832, 52833, 52828, 52830, + 0, 1, 49152, 53248, 53249, 52736, 52800, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52832, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52832, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52832, 52834, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52832, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52832, + 52836, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52832, 52836, 0, 1, 49152, 53248, 53249, 52736, + 52864, 52832, 52840, 52838, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52832, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52832, 52840, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52832, 52840, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52832, 52840, 52842, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52832, + 52840, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52832, 52848, 52844, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52832, 52848, 52844, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52832, 52848, 52849, 52846, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52832, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52865, + 52848, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52865, 52848, 0, 1, 49152, 53248, 53249, 52736, + 52864, 52865, 52848, 52850, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52865, 52848, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52865, 52848, 52852, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52865, 52848, + 52852, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52865, 52848, 52856, 52854, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52865, 52848, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52865, 52848, 52856, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52865, 52867, + 52856, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52865, 52867, 52856, 52858, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52865, 52867, 52856, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52865, 52867, 52856, + 52860, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52865, 52867, 52856, 52860, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52865, 52867, 52856, 52860, 52862, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52864, 0, 1, 49152, + 53248, 53249, 52736, 52864, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52866, 0, 1, 49152, 53248, + 53249, 52736, 52864, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52868, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52868, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52872, 52870, 0, 1, 49152, 53248, + 53249, 52736, 52864, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52872, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52872, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52872, 52874, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52872, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52880, 52876, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52880, 52876, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52880, 52881, 52878, + 0, 1, 49152, 53248, 53249, 52736, 52864, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52880, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52880, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52880, 52882, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52880, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52880, + 52884, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52880, 52884, 0, 1, 49152, 53248, 53249, 52736, + 52864, 52880, 52888, 52886, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52880, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52896, 52888, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52896, 52888, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52896, 52888, 52890, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52896, + 52888, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52896, 52897, 52892, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52896, 52897, 52892, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52896, 52897, 52892, 52894, + 0, 1, 49152, 53248, 53249, 52736, 52864, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52896, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52896, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52896, 52898, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52896, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52896, + 52900, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52896, 52900, 0, 1, 49152, 53248, 53249, 52736, + 52864, 52896, 52904, 52902, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52896, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52896, 52904, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52896, 52904, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52896, 52904, 52906, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52896, + 52904, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52896, 52912, 52908, 0, 1, 49152, 53248, 53249, + 52736, 52864, 52896, 52912, 52908, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52896, 52912, 52913, 52910, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52896, + 0, 1, 49152, 53248, 53249, 52736, 52864, 52928, + 52912, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52928, 52912, 0, 1, 49152, 53248, 53249, 52736, + 52864, 52928, 52912, 52914, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52928, 52912, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52928, 52912, 52916, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52928, 52912, + 52916, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52928, 52912, 52920, 52918, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52928, 52912, 0, 1, 49152, + 53248, 53249, 52736, 52864, 52928, 52929, 52920, 0, + 1, 49152, 53248, 53249, 52736, 52864, 52928, 52929, + 52920, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52928, 52929, 52920, 52922, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52928, 52929, 52920, 0, 1, + 49152, 53248, 53249, 52736, 52864, 52928, 52929, 52920, + 52924, 0, 1, 49152, 53248, 53249, 52736, 52864, + 52928, 52929, 52931, 52924, 0, 1, 49152, 53248, + 53249, 52736, 52864, 52928, 52929, 52931, 52924, 52926, + 0, 1, 49152, 53248, 53249, 52736, 52864, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52928, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52928, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52928, 52930, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 52932, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52932, 0, 1, 49152, 53248, 53249, 52736, + 52992, 52928, 52936, 52934, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 52936, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52928, 52936, 0, 1, + 49152, 53248, 53249, 52736, 52992, 52928, 52936, 52938, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 52936, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52944, 52940, 0, 1, 49152, 53248, 53249, + 52736, 52992, 52928, 52944, 52940, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52928, 52944, 52945, 52942, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 52944, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52944, 0, 1, 49152, 53248, 53249, 52736, + 52992, 52928, 52944, 52946, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 52944, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52928, 52944, 52948, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52928, 52944, + 52948, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52944, 52952, 52950, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 52944, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52928, 52960, 52952, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52928, 52960, + 52952, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52960, 52952, 52954, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 52960, 52952, 0, 1, + 49152, 53248, 53249, 52736, 52992, 52928, 52960, 52961, + 52956, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52928, 52960, 52961, 52956, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52928, 52960, 52961, 52956, 52958, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52928, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52993, + 52960, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52960, 0, 1, 49152, 53248, 53249, 52736, + 52992, 52993, 52960, 52962, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52960, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52993, 52960, 52964, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52993, 52960, + 52964, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52960, 52968, 52966, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52960, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52993, 52960, 52968, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52993, 52960, + 52968, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52960, 52968, 52970, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52960, 52968, 0, 1, + 49152, 53248, 53249, 52736, 52992, 52993, 52960, 52976, + 52972, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52960, 52976, 52972, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52960, 52976, 52977, 52974, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52993, + 52960, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52960, 52976, 0, 1, 49152, 53248, 53249, + 52736, 52992, 52993, 52995, 52976, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52993, 52995, 52976, 52978, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52993, + 52995, 52976, 0, 1, 49152, 53248, 53249, 52736, + 52992, 52993, 52995, 52976, 52980, 0, 1, 49152, + 53248, 53249, 52736, 52992, 52993, 52995, 52976, 52980, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52993, + 52995, 52976, 52984, 52982, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52995, 52976, 0, 1, + 49152, 53248, 53249, 52736, 52992, 52993, 52995, 52976, + 52984, 0, 1, 49152, 53248, 53249, 52736, 52992, + 52993, 52995, 52976, 52984, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52993, 52995, 52976, 52984, 52986, + 0, 1, 49152, 53248, 53249, 52736, 52992, 52993, + 52995, 52999, 52984, 0, 1, 49152, 53248, 53249, + 52736, 52992, 52993, 52995, 52999, 52984, 52988, 0, + 1, 49152, 53248, 53249, 52736, 52992, 52993, 52995, + 52999, 52984, 52988, 0, 1, 49152, 53248, 53249, + 52736, 52992, 52993, 52995, 52999, 52984, 52988, 52990, + 0, 1, 49152, 53248, 53249, 52736, 0, 1, + 49152, 53248, 53249, 52736, 52992, 0, 1, 49152, + 53248, 53249, 52736, 52992, 0, 1, 49152, 53248, + 53249, 52736, 52992, 52994, 0, 1, 49152, 53248, + 53249, 53251, 52992, 0, 1, 49152, 53248, 53249, + 53251, 52992, 52996, 0, 1, 49152, 53248, 53249, + 53251, 52992, 52996, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53000, 52998, 0, 1, 49152, 53248, + 53249, 53251, 52992, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53000, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53000, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53000, 53002, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53000, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53008, 53004, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53008, 53004, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53008, 53009, 53006, + 0, 1, 49152, 53248, 53249, 53251, 52992, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53008, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53008, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53008, 53010, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53008, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53008, + 53012, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53008, 53012, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53008, 53016, 53014, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53008, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53024, 53016, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53024, 53016, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53024, 53016, 53018, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53024, + 53016, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53024, 53025, 53020, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53024, 53025, 53020, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53024, 53025, 53020, 53022, + 0, 1, 49152, 53248, 53249, 53251, 52992, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53024, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53024, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53024, 53026, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53024, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53024, + 53028, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53024, 53028, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53024, 53032, 53030, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53024, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53024, 53032, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53024, 53032, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53024, 53032, 53034, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53024, + 53032, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53024, 53040, 53036, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53024, 53040, 53036, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53024, 53040, 53041, 53038, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53024, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 53040, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53040, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53056, 53040, 53042, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53040, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53040, 53044, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 53040, + 53044, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53040, 53048, 53046, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53040, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53057, 53048, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 53057, + 53048, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53057, 53048, 53050, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53057, 53048, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53056, 53057, 53048, + 53052, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53057, 53059, 53052, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53057, 53059, 53052, 53054, + 0, 1, 49152, 53248, 53249, 53251, 52992, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 53058, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 53060, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53060, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53056, 53064, 53062, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53064, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53064, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53056, 53064, 53066, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 53064, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53072, 53068, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53056, 53072, 53068, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53072, 53073, 53070, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 53072, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53072, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53056, 53072, 53074, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53072, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53072, 53076, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 53072, + 53076, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53072, 53080, 53078, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53072, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53056, 53088, 53080, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53056, 53088, + 53080, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53088, 53080, 53082, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53088, 53080, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53056, 53088, 53089, + 53084, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53056, 53088, 53089, 53084, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53056, 53088, 53089, 53084, 53086, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53056, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53088, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53088, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53120, 53088, 53090, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53088, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53120, 53088, 53092, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 53088, + 53092, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53088, 53096, 53094, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53088, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53120, 53088, 53096, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 53088, + 53096, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53088, 53096, 53098, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53088, 53096, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53120, 53088, 53104, + 53100, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53088, 53104, 53100, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53088, 53104, 53105, 53102, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53088, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53121, 53104, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53120, 53121, 53104, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53120, 53121, 53104, 53106, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53121, 53104, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53120, 53121, 53104, 53108, 0, 1, 49152, + 53248, 53249, 53251, 52992, 53120, 53121, 53104, 53108, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53121, 53104, 53112, 53110, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53121, 53104, 0, 1, + 49152, 53248, 53249, 53251, 52992, 53120, 53121, 53104, + 53112, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53121, 53123, 53112, 0, 1, 49152, 53248, + 53249, 53251, 52992, 53120, 53121, 53123, 53112, 53114, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53121, 53123, 53112, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53120, 53121, 53123, 53112, 53116, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 53121, + 53123, 53112, 53116, 0, 1, 49152, 53248, 53249, + 53251, 52992, 53120, 53121, 53123, 53112, 53116, 53118, + 0, 1, 49152, 53248, 53249, 53251, 52992, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 0, + 1, 49152, 53248, 53249, 53251, 52992, 53120, 53122, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 0, 1, 49152, 53248, 53249, 53251, 52992, 53120, + 53124, 0, 1, 49152, 53248, 53249, 53251, 52992, + 53120, 53124, 0, 1, 49152, 53248, 53249, 53251, + 52992, 53120, 53128, 53126, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53128, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53128, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53120, 53128, 53130, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53128, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53136, 53132, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53120, 53136, 53132, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53136, 53137, 53134, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53136, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53136, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53120, 53136, 53138, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53136, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53136, 53140, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53136, + 53140, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53136, 53144, 53142, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53136, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53152, 53144, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53152, + 53144, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 53144, 53146, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 53144, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53120, 53152, 53153, + 53148, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 53153, 53148, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 53153, 53148, 53150, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53152, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53120, 53152, 53154, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53152, 53156, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53152, + 53156, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 53160, 53158, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53152, 53160, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53152, + 53160, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 53160, 53162, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 53160, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53120, 53152, 53168, + 53164, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53152, 53168, 53164, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53152, 53168, 53169, 53166, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53152, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 53168, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53120, 53184, 53168, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53184, 53168, 53170, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53184, 53168, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53120, 53184, 53168, 53172, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53184, 53168, 53172, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53184, 53168, 53176, 53174, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 53168, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53120, 53184, 53185, + 53176, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 53185, 53176, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 53185, 53176, 53178, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53184, 53185, 53176, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53120, 53184, 53185, 53176, 53180, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53184, + 53185, 53187, 53180, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53120, 53184, 53185, 53187, 53180, 53182, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53120, + 53184, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53120, 53184, 53186, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53184, 53188, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53184, + 53188, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 53192, 53190, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53120, 53184, 53192, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53120, 53184, + 53192, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 53192, 53194, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 53192, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53120, 53184, 53200, + 53196, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53120, 53184, 53200, 53196, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53120, 53184, 53200, 53201, 53198, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53263, 53184, 53200, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53200, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53200, 53202, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53200, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53263, 53184, 53200, 53204, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53200, 53204, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53200, 53208, 53206, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53200, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53263, 53184, 53216, + 53208, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53263, 53184, 53216, 53208, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 53208, 53210, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 53208, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53217, 53212, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53217, 53212, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53217, 53212, 53214, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53263, 53184, 53216, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53216, 53218, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53263, 53184, 53216, 53220, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53216, 53220, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 53224, 53222, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 0, 1, + 49152, 53248, 53249, 53251, 53255, 53263, 53184, 53216, + 53224, 0, 1, 49152, 53248, 53249, 53251, 53255, + 53263, 53184, 53216, 53224, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 53224, 53226, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 53224, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53232, 53228, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53232, 53228, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53232, 53233, 53230, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53263, 53184, 53216, 53232, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53216, 53232, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 53232, 53234, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 53232, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53232, 53236, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53232, 53236, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53232, 53240, 53238, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 53232, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53232, 53240, 0, 1, 49152, 53248, 53249, + 53251, 53255, 53263, 53184, 53216, 53232, 53240, 0, + 1, 49152, 53248, 53249, 53251, 53255, 53263, 53184, + 53216, 53232, 53240, 53242, 0, 1, 49152, 53248, + 53249, 53251, 53255, 53263, 53184, 53216, 53232, 53240, + 0, 1, 49152, 53248, 53249, 53251, 53255, 53263, + 53184, 53216, 53232, 53240, 53244, 0, 1, 49152, + 53248, 53249, 53251, 53255, 53263, 53184, 53216, 53232, + 53240, 53244, 0, 1, 49152, 53248, 53249, 53251, + 53255, 53263, 53184, 53216, 53232, 53240, 53244, 53246, + 0, 1, 49152, 0, 1, 49152, 53248, 0, + 1, 49152, 53248, 0, 1, 49152, 53248, 53250, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53252, 0, 1, 49152, 53248, 53252, 0, 1, + 49152, 53248, 53256, 53254, 0, 1, 49152, 53248, + 0, 1, 49152, 53248, 53256, 0, 1, 49152, + 53248, 53256, 0, 1, 49152, 53248, 53256, 53258, + 0, 1, 49152, 53248, 53256, 0, 1, 49152, + 53248, 53264, 53260, 0, 1, 49152, 53248, 53264, + 53260, 0, 1, 49152, 53248, 53264, 53265, 53262, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53264, 0, 1, 49152, 53248, 53264, 0, 1, + 49152, 53248, 53264, 53266, 0, 1, 49152, 53248, + 53264, 0, 1, 49152, 53248, 53264, 53268, 0, + 1, 49152, 53248, 53264, 53268, 0, 1, 49152, + 53248, 53264, 53272, 53270, 0, 1, 49152, 53248, + 53264, 0, 1, 49152, 53248, 53280, 53272, 0, + 1, 49152, 53248, 53280, 53272, 0, 1, 49152, + 53248, 53280, 53272, 53274, 0, 1, 49152, 53248, + 53280, 53272, 0, 1, 49152, 53248, 53280, 53281, + 53276, 0, 1, 49152, 53248, 53280, 53281, 53276, + 0, 1, 49152, 53248, 53280, 53281, 53276, 53278, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53280, 0, 1, 49152, 53248, 53280, 0, 1, + 49152, 53248, 53280, 53282, 0, 1, 49152, 53248, + 53280, 0, 1, 49152, 53248, 53280, 53284, 0, + 1, 49152, 53248, 53280, 53284, 0, 1, 49152, + 53248, 53280, 53288, 53286, 0, 1, 49152, 53248, + 53280, 0, 1, 49152, 53248, 53280, 53288, 0, + 1, 49152, 53248, 53280, 53288, 0, 1, 49152, + 53248, 53280, 53288, 53290, 0, 1, 49152, 53248, + 53280, 53288, 0, 1, 49152, 53248, 53280, 53296, + 53292, 0, 1, 49152, 53248, 53280, 53296, 53292, + 0, 1, 49152, 53248, 53280, 53296, 53297, 53294, + 0, 1, 49152, 53248, 53280, 0, 1, 49152, + 53248, 53312, 53296, 0, 1, 49152, 53248, 53312, + 53296, 0, 1, 49152, 53248, 53312, 53296, 53298, + 0, 1, 49152, 53248, 53312, 53296, 0, 1, + 49152, 53248, 53312, 53296, 53300, 0, 1, 49152, + 53248, 53312, 53296, 53300, 0, 1, 49152, 53248, + 53312, 53296, 53304, 53302, 0, 1, 49152, 53248, + 53312, 53296, 0, 1, 49152, 53248, 53312, 53313, + 53304, 0, 1, 49152, 53248, 53312, 53313, 53304, + 0, 1, 49152, 53248, 53312, 53313, 53304, 53306, + 0, 1, 49152, 53248, 53312, 53313, 53304, 0, + 1, 49152, 53248, 53312, 53313, 53304, 53308, 0, + 1, 49152, 53248, 53312, 53313, 53315, 53308, 0, + 1, 49152, 53248, 53312, 53313, 53315, 53308, 53310, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53312, 0, 1, 49152, 53248, 53312, 0, 1, + 49152, 53248, 53312, 53314, 0, 1, 49152, 53248, + 53312, 0, 1, 49152, 53248, 53312, 53316, 0, + 1, 49152, 53248, 53312, 53316, 0, 1, 49152, + 53248, 53312, 53320, 53318, 0, 1, 49152, 53248, + 53312, 0, 1, 49152, 53248, 53312, 53320, 0, + 1, 49152, 53248, 53312, 53320, 0, 1, 49152, + 53248, 53312, 53320, 53322, 0, 1, 49152, 53248, + 53312, 53320, 0, 1, 49152, 53248, 53312, 53328, + 53324, 0, 1, 49152, 53248, 53312, 53328, 53324, + 0, 1, 49152, 53248, 53312, 53328, 53329, 53326, + 0, 1, 49152, 53248, 53312, 0, 1, 49152, + 53248, 53312, 53328, 0, 1, 49152, 53248, 53312, + 53328, 0, 1, 49152, 53248, 53312, 53328, 53330, + 0, 1, 49152, 53248, 53312, 53328, 0, 1, + 49152, 53248, 53312, 53328, 53332, 0, 1, 49152, + 53248, 53312, 53328, 53332, 0, 1, 49152, 53248, + 53312, 53328, 53336, 53334, 0, 1, 49152, 53248, + 53312, 53328, 0, 1, 49152, 53248, 53312, 53344, + 53336, 0, 1, 49152, 53248, 53312, 53344, 53336, + 0, 1, 49152, 53248, 53312, 53344, 53336, 53338, + 0, 1, 49152, 53248, 53312, 53344, 53336, 0, + 1, 49152, 53248, 53312, 53344, 53345, 53340, 0, + 1, 49152, 53248, 53312, 53344, 53345, 53340, 0, + 1, 49152, 53248, 53312, 53344, 53345, 53340, 53342, + 0, 1, 49152, 53248, 53312, 0, 1, 49152, + 53248, 53376, 53344, 0, 1, 49152, 53248, 53376, + 53344, 0, 1, 49152, 53248, 53376, 53344, 53346, + 0, 1, 49152, 53248, 53376, 53344, 0, 1, + 49152, 53248, 53376, 53344, 53348, 0, 1, 49152, + 53248, 53376, 53344, 53348, 0, 1, 49152, 53248, + 53376, 53344, 53352, 53350, 0, 1, 49152, 53248, + 53376, 53344, 0, 1, 49152, 53248, 53376, 53344, + 53352, 0, 1, 49152, 53248, 53376, 53344, 53352, + 0, 1, 49152, 53248, 53376, 53344, 53352, 53354, + 0, 1, 49152, 53248, 53376, 53344, 53352, 0, + 1, 49152, 53248, 53376, 53344, 53360, 53356, 0, + 1, 49152, 53248, 53376, 53344, 53360, 53356, 0, + 1, 49152, 53248, 53376, 53344, 53360, 53361, 53358, + 0, 1, 49152, 53248, 53376, 53344, 0, 1, + 49152, 53248, 53376, 53377, 53360, 0, 1, 49152, + 53248, 53376, 53377, 53360, 0, 1, 49152, 53248, + 53376, 53377, 53360, 53362, 0, 1, 49152, 53248, + 53376, 53377, 53360, 0, 1, 49152, 53248, 53376, + 53377, 53360, 53364, 0, 1, 49152, 53248, 53376, + 53377, 53360, 53364, 0, 1, 49152, 53248, 53376, + 53377, 53360, 53368, 53366, 0, 1, 49152, 53248, + 53376, 53377, 53360, 0, 1, 49152, 53248, 53376, + 53377, 53360, 53368, 0, 1, 49152, 53248, 53376, + 53377, 53379, 53368, 0, 1, 49152, 53248, 53376, + 53377, 53379, 53368, 53370, 0, 1, 49152, 53248, + 53376, 53377, 53379, 53368, 0, 1, 49152, 53248, + 53376, 53377, 53379, 53368, 53372, 0, 1, 49152, + 53248, 53376, 53377, 53379, 53368, 53372, 0, 1, + 49152, 53248, 53376, 53377, 53379, 53368, 53372, 53374, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53376, 0, 1, 49152, 53248, 53376, 0, 1, + 49152, 53248, 53376, 53378, 0, 1, 49152, 53248, + 53376, 0, 1, 49152, 53248, 53376, 53380, 0, + 1, 49152, 53248, 53376, 53380, 0, 1, 49152, + 53248, 53376, 53384, 53382, 0, 1, 49152, 53248, + 53376, 0, 1, 49152, 53248, 53376, 53384, 0, + 1, 49152, 53248, 53376, 53384, 0, 1, 49152, + 53248, 53376, 53384, 53386, 0, 1, 49152, 53248, + 53376, 53384, 0, 1, 49152, 53248, 53376, 53392, + 53388, 0, 1, 49152, 53248, 53376, 53392, 53388, + 0, 1, 49152, 53248, 53376, 53392, 53393, 53390, + 0, 1, 49152, 53248, 53376, 0, 1, 49152, + 53248, 53376, 53392, 0, 1, 49152, 53248, 53376, + 53392, 0, 1, 49152, 53248, 53376, 53392, 53394, + 0, 1, 49152, 53248, 53376, 53392, 0, 1, + 49152, 53248, 53376, 53392, 53396, 0, 1, 49152, + 53248, 53376, 53392, 53396, 0, 1, 49152, 53248, + 53376, 53392, 53400, 53398, 0, 1, 49152, 53248, + 53376, 53392, 0, 1, 49152, 53248, 53376, 53408, + 53400, 0, 1, 49152, 53248, 53376, 53408, 53400, + 0, 1, 49152, 53248, 53376, 53408, 53400, 53402, + 0, 1, 49152, 53248, 53376, 53408, 53400, 0, + 1, 49152, 53248, 53376, 53408, 53409, 53404, 0, + 1, 49152, 53248, 53376, 53408, 53409, 53404, 0, + 1, 49152, 53248, 53376, 53408, 53409, 53404, 53406, + 0, 1, 49152, 53248, 53376, 0, 1, 49152, + 53248, 53376, 53408, 0, 1, 49152, 53248, 53376, + 53408, 0, 1, 49152, 53248, 53376, 53408, 53410, + 0, 1, 49152, 53248, 53376, 53408, 0, 1, + 49152, 53248, 53376, 53408, 53412, 0, 1, 49152, + 53248, 53376, 53408, 53412, 0, 1, 49152, 53248, + 53376, 53408, 53416, 53414, 0, 1, 49152, 53248, + 53376, 53408, 0, 1, 49152, 53248, 53376, 53408, + 53416, 0, 1, 49152, 53248, 53376, 53408, 53416, + 0, 1, 49152, 53248, 53376, 53408, 53416, 53418, + 0, 1, 49152, 53248, 53376, 53408, 53416, 0, + 1, 49152, 53248, 53376, 53408, 53424, 53420, 0, + 1, 49152, 53248, 53376, 53408, 53424, 53420, 0, + 1, 49152, 53248, 53376, 53408, 53424, 53425, 53422, + 0, 1, 49152, 53248, 53376, 53408, 0, 1, + 49152, 53248, 53376, 53440, 53424, 0, 1, 49152, + 53248, 53376, 53440, 53424, 0, 1, 49152, 53248, + 53376, 53440, 53424, 53426, 0, 1, 49152, 53248, + 53376, 53440, 53424, 0, 1, 49152, 53248, 53376, + 53440, 53424, 53428, 0, 1, 49152, 53248, 53376, + 53440, 53424, 53428, 0, 1, 49152, 53248, 53376, + 53440, 53424, 53432, 53430, 0, 1, 49152, 53248, + 53376, 53440, 53424, 0, 1, 49152, 53248, 53376, + 53440, 53441, 53432, 0, 1, 49152, 53248, 53376, + 53440, 53441, 53432, 0, 1, 49152, 53248, 53376, + 53440, 53441, 53432, 53434, 0, 1, 49152, 53248, + 53376, 53440, 53441, 53432, 0, 1, 49152, 53248, + 53376, 53440, 53441, 53432, 53436, 0, 1, 49152, + 53248, 53376, 53440, 53441, 53443, 53436, 0, 1, + 49152, 53248, 53376, 53440, 53441, 53443, 53436, 53438, + 0, 1, 49152, 53248, 53376, 0, 1, 49152, + 53248, 53504, 53440, 0, 1, 49152, 53248, 53504, + 53440, 0, 1, 49152, 53248, 53504, 53440, 53442, + 0, 1, 49152, 53248, 53504, 53440, 0, 1, + 49152, 53248, 53504, 53440, 53444, 0, 1, 49152, + 53248, 53504, 53440, 53444, 0, 1, 49152, 53248, + 53504, 53440, 53448, 53446, 0, 1, 49152, 53248, + 53504, 53440, 0, 1, 49152, 53248, 53504, 53440, + 53448, 0, 1, 49152, 53248, 53504, 53440, 53448, + 0, 1, 49152, 53248, 53504, 53440, 53448, 53450, + 0, 1, 49152, 53248, 53504, 53440, 53448, 0, + 1, 49152, 53248, 53504, 53440, 53456, 53452, 0, + 1, 49152, 53248, 53504, 53440, 53456, 53452, 0, + 1, 49152, 53248, 53504, 53440, 53456, 53457, 53454, + 0, 1, 49152, 53248, 53504, 53440, 0, 1, + 49152, 53248, 53504, 53440, 53456, 0, 1, 49152, + 53248, 53504, 53440, 53456, 0, 1, 49152, 53248, + 53504, 53440, 53456, 53458, 0, 1, 49152, 53248, + 53504, 53440, 53456, 0, 1, 49152, 53248, 53504, + 53440, 53456, 53460, 0, 1, 49152, 53248, 53504, + 53440, 53456, 53460, 0, 1, 49152, 53248, 53504, + 53440, 53456, 53464, 53462, 0, 1, 49152, 53248, + 53504, 53440, 53456, 0, 1, 49152, 53248, 53504, + 53440, 53472, 53464, 0, 1, 49152, 53248, 53504, + 53440, 53472, 53464, 0, 1, 49152, 53248, 53504, + 53440, 53472, 53464, 53466, 0, 1, 49152, 53248, + 53504, 53440, 53472, 53464, 0, 1, 49152, 53248, + 53504, 53440, 53472, 53473, 53468, 0, 1, 49152, + 53248, 53504, 53440, 53472, 53473, 53468, 0, 1, + 49152, 53248, 53504, 53440, 53472, 53473, 53468, 53470, + 0, 1, 49152, 53248, 53504, 53440, 0, 1, + 49152, 53248, 53504, 53505, 53472, 0, 1, 49152, + 53248, 53504, 53505, 53472, 0, 1, 49152, 53248, + 53504, 53505, 53472, 53474, 0, 1, 49152, 53248, + 53504, 53505, 53472, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53476, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53476, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53480, 53478, 0, 1, 49152, 53248, + 53504, 53505, 53472, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53480, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53480, 0, 1, 49152, 53248, 53504, + 53505, 53472, 53480, 53482, 0, 1, 49152, 53248, + 53504, 53505, 53472, 53480, 0, 1, 49152, 53248, + 53504, 53505, 53472, 53488, 53484, 0, 1, 49152, + 53248, 53504, 53505, 53472, 53488, 53484, 0, 1, + 49152, 53248, 53504, 53505, 53472, 53488, 53489, 53486, + 0, 1, 49152, 53248, 53504, 53505, 53472, 0, + 1, 49152, 53248, 53504, 53505, 53472, 53488, 0, + 1, 49152, 53248, 53504, 53505, 53507, 53488, 0, + 1, 49152, 53248, 53504, 53505, 53507, 53488, 53490, + 0, 1, 49152, 53248, 53504, 53505, 53507, 53488, + 0, 1, 49152, 53248, 53504, 53505, 53507, 53488, + 53492, 0, 1, 49152, 53248, 53504, 53505, 53507, + 53488, 53492, 0, 1, 49152, 53248, 53504, 53505, + 53507, 53488, 53496, 53494, 0, 1, 49152, 53248, + 53504, 53505, 53507, 53488, 0, 1, 49152, 53248, + 53504, 53505, 53507, 53488, 53496, 0, 1, 49152, + 53248, 53504, 53505, 53507, 53488, 53496, 0, 1, + 49152, 53248, 53504, 53505, 53507, 53488, 53496, 53498, + 0, 1, 49152, 53248, 53504, 53505, 53507, 53511, + 53496, 0, 1, 49152, 53248, 53504, 53505, 53507, + 53511, 53496, 53500, 0, 1, 49152, 53248, 53504, + 53505, 53507, 53511, 53496, 53500, 0, 1, 49152, + 53248, 53504, 53505, 53507, 53511, 53496, 53500, 53502, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53504, 0, 1, 49152, 53248, 53504, 0, 1, + 49152, 53248, 53504, 53506, 0, 1, 49152, 53248, + 53504, 0, 1, 49152, 53248, 53504, 53508, 0, + 1, 49152, 53248, 53504, 53508, 0, 1, 49152, + 53248, 53504, 53512, 53510, 0, 1, 49152, 53248, + 53504, 0, 1, 49152, 53248, 53504, 53512, 0, + 1, 49152, 53248, 53504, 53512, 0, 1, 49152, + 53248, 53504, 53512, 53514, 0, 1, 49152, 53248, + 53504, 53512, 0, 1, 49152, 53248, 53504, 53520, + 53516, 0, 1, 49152, 53248, 53504, 53520, 53516, + 0, 1, 49152, 53248, 53504, 53520, 53521, 53518, + 0, 1, 49152, 53248, 53504, 0, 1, 49152, + 53248, 53504, 53520, 0, 1, 49152, 53248, 53504, + 53520, 0, 1, 49152, 53248, 53504, 53520, 53522, + 0, 1, 49152, 53248, 53504, 53520, 0, 1, + 49152, 53248, 53504, 53520, 53524, 0, 1, 49152, + 53248, 53504, 53520, 53524, 0, 1, 49152, 53248, + 53504, 53520, 53528, 53526, 0, 1, 49152, 53248, + 53504, 53520, 0, 1, 49152, 53248, 53504, 53536, + 53528, 0, 1, 49152, 53248, 53504, 53536, 53528, + 0, 1, 49152, 53248, 53504, 53536, 53528, 53530, + 0, 1, 49152, 53248, 53504, 53536, 53528, 0, + 1, 49152, 53248, 53504, 53536, 53537, 53532, 0, + 1, 49152, 53248, 53504, 53536, 53537, 53532, 0, + 1, 49152, 53248, 53504, 53536, 53537, 53532, 53534, + 0, 1, 49152, 53248, 53504, 0, 1, 49152, + 53248, 53504, 53536, 0, 1, 49152, 53248, 53504, + 53536, 0, 1, 49152, 53248, 53504, 53536, 53538, + 0, 1, 49152, 53248, 53504, 53536, 0, 1, + 49152, 53248, 53504, 53536, 53540, 0, 1, 49152, + 53248, 53504, 53536, 53540, 0, 1, 49152, 53248, + 53504, 53536, 53544, 53542, 0, 1, 49152, 53248, + 53504, 53536, 0, 1, 49152, 53248, 53504, 53536, + 53544, 0, 1, 49152, 53248, 53504, 53536, 53544, + 0, 1, 49152, 53248, 53504, 53536, 53544, 53546, + 0, 1, 49152, 53248, 53504, 53536, 53544, 0, + 1, 49152, 53248, 53504, 53536, 53552, 53548, 0, + 1, 49152, 53248, 53504, 53536, 53552, 53548, 0, + 1, 49152, 53248, 53504, 53536, 53552, 53553, 53550, + 0, 1, 49152, 53248, 53504, 53536, 0, 1, + 49152, 53248, 53504, 53568, 53552, 0, 1, 49152, + 53248, 53504, 53568, 53552, 0, 1, 49152, 53248, + 53504, 53568, 53552, 53554, 0, 1, 49152, 53248, + 53504, 53568, 53552, 0, 1, 49152, 53248, 53504, + 53568, 53552, 53556, 0, 1, 49152, 53248, 53504, + 53568, 53552, 53556, 0, 1, 49152, 53248, 53504, + 53568, 53552, 53560, 53558, 0, 1, 49152, 53248, + 53504, 53568, 53552, 0, 1, 49152, 53248, 53504, + 53568, 53569, 53560, 0, 1, 49152, 53248, 53504, + 53568, 53569, 53560, 0, 1, 49152, 53248, 53504, + 53568, 53569, 53560, 53562, 0, 1, 49152, 53248, + 53504, 53568, 53569, 53560, 0, 1, 49152, 53248, + 53504, 53568, 53569, 53560, 53564, 0, 1, 49152, + 53248, 53504, 53568, 53569, 53571, 53564, 0, 1, + 49152, 53248, 53504, 53568, 53569, 53571, 53564, 53566, + 0, 1, 49152, 53248, 53504, 0, 1, 49152, + 53248, 53504, 53568, 0, 1, 49152, 53248, 53504, + 53568, 0, 1, 49152, 53248, 53504, 53568, 53570, + 0, 1, 49152, 53248, 53504, 53568, 0, 1, + 49152, 53248, 53504, 53568, 53572, 0, 1, 49152, + 53248, 53504, 53568, 53572, 0, 1, 49152, 53248, + 53504, 53568, 53576, 53574, 0, 1, 49152, 53248, + 53504, 53568, 0, 1, 49152, 53248, 53504, 53568, + 53576, 0, 1, 49152, 53248, 53504, 53568, 53576, + 0, 1, 49152, 53248, 53504, 53568, 53576, 53578, + 0, 1, 49152, 53248, 53504, 53568, 53576, 0, + 1, 49152, 53248, 53504, 53568, 53584, 53580, 0, + 1, 49152, 53248, 53504, 53568, 53584, 53580, 0, + 1, 49152, 53248, 53504, 53568, 53584, 53585, 53582, + 0, 1, 49152, 53248, 53504, 53568, 0, 1, + 49152, 53248, 53504, 53568, 53584, 0, 1, 49152, + 53248, 53504, 53568, 53584, 0, 1, 49152, 53248, + 53504, 53568, 53584, 53586, 0, 1, 49152, 53248, + 53504, 53568, 53584, 0, 1, 49152, 53248, 53504, + 53568, 53584, 53588, 0, 1, 49152, 53248, 53504, + 53568, 53584, 53588, 0, 1, 49152, 53248, 53504, + 53568, 53584, 53592, 53590, 0, 1, 49152, 53248, + 53504, 53568, 53584, 0, 1, 49152, 53248, 53504, + 53568, 53600, 53592, 0, 1, 49152, 53248, 53504, + 53568, 53600, 53592, 0, 1, 49152, 53248, 53504, + 53568, 53600, 53592, 53594, 0, 1, 49152, 53248, + 53504, 53568, 53600, 53592, 0, 1, 49152, 53248, + 53504, 53568, 53600, 53601, 53596, 0, 1, 49152, + 53248, 53504, 53568, 53600, 53601, 53596, 0, 1, + 49152, 53248, 53504, 53568, 53600, 53601, 53596, 53598, + 0, 1, 49152, 53248, 53504, 53568, 0, 1, + 49152, 53248, 53504, 53632, 53600, 0, 1, 49152, + 53248, 53504, 53632, 53600, 0, 1, 49152, 53248, + 53504, 53632, 53600, 53602, 0, 1, 49152, 53248, + 53504, 53632, 53600, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53604, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53604, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53608, 53606, 0, 1, 49152, 53248, + 53504, 53632, 53600, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53608, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53608, 0, 1, 49152, 53248, 53504, + 53632, 53600, 53608, 53610, 0, 1, 49152, 53248, + 53504, 53632, 53600, 53608, 0, 1, 49152, 53248, + 53504, 53632, 53600, 53616, 53612, 0, 1, 49152, + 53248, 53504, 53632, 53600, 53616, 53612, 0, 1, + 49152, 53248, 53504, 53632, 53600, 53616, 53617, 53614, + 0, 1, 49152, 53248, 53504, 53632, 53600, 0, + 1, 49152, 53248, 53504, 53632, 53633, 53616, 0, + 1, 49152, 53248, 53504, 53632, 53633, 53616, 0, + 1, 49152, 53248, 53504, 53632, 53633, 53616, 53618, + 0, 1, 49152, 53248, 53504, 53632, 53633, 53616, + 0, 1, 49152, 53248, 53504, 53632, 53633, 53616, + 53620, 0, 1, 49152, 53248, 53504, 53632, 53633, + 53616, 53620, 0, 1, 49152, 53248, 53504, 53632, + 53633, 53616, 53624, 53622, 0, 1, 49152, 53248, + 53504, 53632, 53633, 53616, 0, 1, 49152, 53248, + 53504, 53632, 53633, 53616, 53624, 0, 1, 49152, + 53248, 53504, 53632, 53633, 53635, 53624, 0, 1, + 49152, 53248, 53504, 53632, 53633, 53635, 53624, 53626, + 0, 1, 49152, 53248, 53504, 53632, 53633, 53635, + 53624, 0, 1, 49152, 53248, 53504, 53632, 53633, + 53635, 53624, 53628, 0, 1, 49152, 53248, 53504, + 53632, 53633, 53635, 53624, 53628, 0, 1, 49152, + 53248, 53504, 53632, 53633, 53635, 53624, 53628, 53630, + 0, 1, 49152, 53248, 53504, 0, 1, 49152, + 53248, 53760, 53632, 0, 1, 49152, 53248, 53760, + 53632, 0, 1, 49152, 53248, 53760, 53632, 53634, + 0, 1, 49152, 53248, 53760, 53632, 0, 1, + 49152, 53248, 53760, 53632, 53636, 0, 1, 49152, + 53248, 53760, 53632, 53636, 0, 1, 49152, 53248, + 53760, 53632, 53640, 53638, 0, 1, 49152, 53248, + 53760, 53632, 0, 1, 49152, 53248, 53760, 53632, + 53640, 0, 1, 49152, 53248, 53760, 53632, 53640, + 0, 1, 49152, 53248, 53760, 53632, 53640, 53642, + 0, 1, 49152, 53248, 53760, 53632, 53640, 0, + 1, 49152, 53248, 53760, 53632, 53648, 53644, 0, + 1, 49152, 53248, 53760, 53632, 53648, 53644, 0, + 1, 49152, 53248, 53760, 53632, 53648, 53649, 53646, + 0, 1, 49152, 53248, 53760, 53632, 0, 1, + 49152, 53248, 53760, 53632, 53648, 0, 1, 49152, + 53248, 53760, 53632, 53648, 0, 1, 49152, 53248, + 53760, 53632, 53648, 53650, 0, 1, 49152, 53248, + 53760, 53632, 53648, 0, 1, 49152, 53248, 53760, + 53632, 53648, 53652, 0, 1, 49152, 53248, 53760, + 53632, 53648, 53652, 0, 1, 49152, 53248, 53760, + 53632, 53648, 53656, 53654, 0, 1, 49152, 53248, + 53760, 53632, 53648, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53656, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53656, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53656, 53658, 0, 1, 49152, 53248, + 53760, 53632, 53664, 53656, 0, 1, 49152, 53248, + 53760, 53632, 53664, 53665, 53660, 0, 1, 49152, + 53248, 53760, 53632, 53664, 53665, 53660, 0, 1, + 49152, 53248, 53760, 53632, 53664, 53665, 53660, 53662, + 0, 1, 49152, 53248, 53760, 53632, 0, 1, + 49152, 53248, 53760, 53632, 53664, 0, 1, 49152, + 53248, 53760, 53632, 53664, 0, 1, 49152, 53248, + 53760, 53632, 53664, 53666, 0, 1, 49152, 53248, + 53760, 53632, 53664, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53668, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53668, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53672, 53670, 0, 1, 49152, 53248, + 53760, 53632, 53664, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53672, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53672, 0, 1, 49152, 53248, 53760, + 53632, 53664, 53672, 53674, 0, 1, 49152, 53248, + 53760, 53632, 53664, 53672, 0, 1, 49152, 53248, + 53760, 53632, 53664, 53680, 53676, 0, 1, 49152, + 53248, 53760, 53632, 53664, 53680, 53676, 0, 1, + 49152, 53248, 53760, 53632, 53664, 53680, 53681, 53678, + 0, 1, 49152, 53248, 53760, 53632, 53664, 0, + 1, 49152, 53248, 53760, 53632, 53696, 53680, 0, + 1, 49152, 53248, 53760, 53632, 53696, 53680, 0, + 1, 49152, 53248, 53760, 53632, 53696, 53680, 53682, + 0, 1, 49152, 53248, 53760, 53632, 53696, 53680, + 0, 1, 49152, 53248, 53760, 53632, 53696, 53680, + 53684, 0, 1, 49152, 53248, 53760, 53632, 53696, + 53680, 53684, 0, 1, 49152, 53248, 53760, 53632, + 53696, 53680, 53688, 53686, 0, 1, 49152, 53248, + 53760, 53632, 53696, 53680, 0, 1, 49152, 53248, + 53760, 53632, 53696, 53697, 53688, 0, 1, 49152, + 53248, 53760, 53632, 53696, 53697, 53688, 0, 1, + 49152, 53248, 53760, 53632, 53696, 53697, 53688, 53690, + 0, 1, 49152, 53248, 53760, 53632, 53696, 53697, + 53688, 0, 1, 49152, 53248, 53760, 53632, 53696, + 53697, 53688, 53692, 0, 1, 49152, 53248, 53760, + 53632, 53696, 53697, 53699, 53692, 0, 1, 49152, + 53248, 53760, 53632, 53696, 53697, 53699, 53692, 53694, + 0, 1, 49152, 53248, 53760, 53632, 0, 1, + 49152, 53248, 53760, 53761, 53696, 0, 1, 49152, + 53248, 53760, 53761, 53696, 0, 1, 49152, 53248, + 53760, 53761, 53696, 53698, 0, 1, 49152, 53248, + 53760, 53761, 53696, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53700, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53700, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53704, 53702, 0, 1, 49152, 53248, + 53760, 53761, 53696, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53704, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53704, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53704, 53706, 0, 1, 49152, 53248, + 53760, 53761, 53696, 53704, 0, 1, 49152, 53248, + 53760, 53761, 53696, 53712, 53708, 0, 1, 49152, + 53248, 53760, 53761, 53696, 53712, 53708, 0, 1, + 49152, 53248, 53760, 53761, 53696, 53712, 53713, 53710, + 0, 1, 49152, 53248, 53760, 53761, 53696, 0, + 1, 49152, 53248, 53760, 53761, 53696, 53712, 0, + 1, 49152, 53248, 53760, 53761, 53696, 53712, 0, + 1, 49152, 53248, 53760, 53761, 53696, 53712, 53714, + 0, 1, 49152, 53248, 53760, 53761, 53696, 53712, + 0, 1, 49152, 53248, 53760, 53761, 53696, 53712, + 53716, 0, 1, 49152, 53248, 53760, 53761, 53696, + 53712, 53716, 0, 1, 49152, 53248, 53760, 53761, + 53696, 53712, 53720, 53718, 0, 1, 49152, 53248, + 53760, 53761, 53696, 53712, 0, 1, 49152, 53248, + 53760, 53761, 53696, 53728, 53720, 0, 1, 49152, + 53248, 53760, 53761, 53696, 53728, 53720, 0, 1, + 49152, 53248, 53760, 53761, 53696, 53728, 53720, 53722, + 0, 1, 49152, 53248, 53760, 53761, 53696, 53728, + 53720, 0, 1, 49152, 53248, 53760, 53761, 53696, + 53728, 53729, 53724, 0, 1, 49152, 53248, 53760, + 53761, 53696, 53728, 53729, 53724, 0, 1, 49152, + 53248, 53760, 53761, 53696, 53728, 53729, 53724, 53726, + 0, 1, 49152, 53248, 53760, 53761, 53696, 0, + 1, 49152, 53248, 53760, 53761, 53696, 53728, 0, + 1, 49152, 53248, 53760, 53761, 53763, 53728, 0, + 1, 49152, 53248, 53760, 53761, 53763, 53728, 53730, + 0, 1, 49152, 53248, 53760, 53761, 53763, 53728, + 0, 1, 49152, 53248, 53760, 53761, 53763, 53728, + 53732, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53728, 53732, 0, 1, 49152, 53248, 53760, 53761, + 53763, 53728, 53736, 53734, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53728, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53728, 53736, 0, 1, 49152, + 53248, 53760, 53761, 53763, 53728, 53736, 0, 1, + 49152, 53248, 53760, 53761, 53763, 53728, 53736, 53738, + 0, 1, 49152, 53248, 53760, 53761, 53763, 53728, + 53736, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53728, 53744, 53740, 0, 1, 49152, 53248, 53760, + 53761, 53763, 53728, 53744, 53740, 0, 1, 49152, + 53248, 53760, 53761, 53763, 53728, 53744, 53745, 53742, + 0, 1, 49152, 53248, 53760, 53761, 53763, 53728, + 0, 1, 49152, 53248, 53760, 53761, 53763, 53728, + 53744, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53728, 53744, 0, 1, 49152, 53248, 53760, 53761, + 53763, 53728, 53744, 53746, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53767, 53744, 0, 1, 49152, + 53248, 53760, 53761, 53763, 53767, 53744, 53748, 0, + 1, 49152, 53248, 53760, 53761, 53763, 53767, 53744, + 53748, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53767, 53744, 53752, 53750, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53767, 53744, 0, 1, 49152, + 53248, 53760, 53761, 53763, 53767, 53744, 53752, 0, + 1, 49152, 53248, 53760, 53761, 53763, 53767, 53744, + 53752, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53767, 53744, 53752, 53754, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53767, 53744, 53752, 0, 1, + 49152, 53248, 53760, 53761, 53763, 53767, 53744, 53752, + 53756, 0, 1, 49152, 53248, 53760, 53761, 53763, + 53767, 53744, 53752, 53756, 0, 1, 49152, 53248, + 53760, 53761, 53763, 53767, 53744, 53752, 53756, 53758, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 53760, 0, 1, 49152, 53248, 53760, 0, 1, + 49152, 53248, 53760, 53762, 0, 1, 49152, 53248, + 53760, 0, 1, 49152, 53248, 53760, 53764, 0, + 1, 49152, 53248, 53760, 53764, 0, 1, 49152, + 53248, 53760, 53768, 53766, 0, 1, 49152, 53248, + 53760, 0, 1, 49152, 53248, 53760, 53768, 0, + 1, 49152, 53248, 53760, 53768, 0, 1, 49152, + 53248, 53760, 53768, 53770, 0, 1, 49152, 53248, + 53760, 53768, 0, 1, 49152, 53248, 53760, 53776, + 53772, 0, 1, 49152, 53248, 53760, 53776, 53772, + 0, 1, 49152, 53248, 53760, 53776, 53777, 53774, + 0, 1, 49152, 53248, 53760, 0, 1, 49152, + 53248, 53760, 53776, 0, 1, 49152, 53248, 53760, + 53776, 0, 1, 49152, 53248, 53760, 53776, 53778, + 0, 1, 49152, 53248, 53760, 53776, 0, 1, + 49152, 53248, 53760, 53776, 53780, 0, 1, 49152, + 53248, 53760, 53776, 53780, 0, 1, 49152, 53248, + 53760, 53776, 53784, 53782, 0, 1, 49152, 53248, + 53760, 53776, 0, 1, 49152, 53248, 53760, 53792, + 53784, 0, 1, 49152, 53248, 53760, 53792, 53784, + 0, 1, 49152, 53248, 53760, 53792, 53784, 53786, + 0, 1, 49152, 53248, 53760, 53792, 53784, 0, + 1, 49152, 53248, 53760, 53792, 53793, 53788, 0, + 1, 49152, 53248, 53760, 53792, 53793, 53788, 0, + 1, 49152, 53248, 53760, 53792, 53793, 53788, 53790, + 0, 1, 49152, 53248, 53760, 0, 1, 49152, + 53248, 53760, 53792, 0, 1, 49152, 53248, 53760, + 53792, 0, 1, 49152, 53248, 53760, 53792, 53794, + 0, 1, 49152, 53248, 53760, 53792, 0, 1, + 49152, 53248, 53760, 53792, 53796, 0, 1, 49152, + 53248, 53760, 53792, 53796, 0, 1, 49152, 53248, + 53760, 53792, 53800, 53798, 0, 1, 49152, 53248, + 53760, 53792, 0, 1, 49152, 53248, 53760, 53792, + 53800, 0, 1, 49152, 53248, 53760, 53792, 53800, + 0, 1, 49152, 53248, 53760, 53792, 53800, 53802, + 0, 1, 49152, 53248, 53760, 53792, 53800, 0, + 1, 49152, 53248, 53760, 53792, 53808, 53804, 0, + 1, 49152, 53248, 53760, 53792, 53808, 53804, 0, + 1, 49152, 53248, 53760, 53792, 53808, 53809, 53806, + 0, 1, 49152, 53248, 53760, 53792, 0, 1, + 49152, 53248, 53760, 53824, 53808, 0, 1, 49152, + 53248, 53760, 53824, 53808, 0, 1, 49152, 53248, + 53760, 53824, 53808, 53810, 0, 1, 49152, 53248, + 53760, 53824, 53808, 0, 1, 49152, 53248, 53760, + 53824, 53808, 53812, 0, 1, 49152, 53248, 53760, + 53824, 53808, 53812, 0, 1, 49152, 53248, 53760, + 53824, 53808, 53816, 53814, 0, 1, 49152, 53248, + 53760, 53824, 53808, 0, 1, 49152, 53248, 53760, + 53824, 53825, 53816, 0, 1, 49152, 53248, 53760, + 53824, 53825, 53816, 0, 1, 49152, 53248, 53760, + 53824, 53825, 53816, 53818, 0, 1, 49152, 53248, + 53760, 53824, 53825, 53816, 0, 1, 49152, 53248, + 53760, 53824, 53825, 53816, 53820, 0, 1, 49152, + 53248, 53760, 53824, 53825, 53827, 53820, 0, 1, + 49152, 53248, 53760, 53824, 53825, 53827, 53820, 53822, + 0, 1, 49152, 53248, 53760, 0, 1, 49152, + 53248, 53760, 53824, 0, 1, 49152, 53248, 53760, + 53824, 0, 1, 49152, 53248, 53760, 53824, 53826, + 0, 1, 49152, 53248, 53760, 53824, 0, 1, + 49152, 53248, 53760, 53824, 53828, 0, 1, 49152, + 53248, 53760, 53824, 53828, 0, 1, 49152, 53248, + 53760, 53824, 53832, 53830, 0, 1, 49152, 53248, + 53760, 53824, 0, 1, 49152, 53248, 53760, 53824, + 53832, 0, 1, 49152, 53248, 53760, 53824, 53832, + 0, 1, 49152, 53248, 53760, 53824, 53832, 53834, + 0, 1, 49152, 53248, 53760, 53824, 53832, 0, + 1, 49152, 53248, 53760, 53824, 53840, 53836, 0, + 1, 49152, 53248, 53760, 53824, 53840, 53836, 0, + 1, 49152, 53248, 53760, 53824, 53840, 53841, 53838, + 0, 1, 49152, 53248, 53760, 53824, 0, 1, + 49152, 53248, 53760, 53824, 53840, 0, 1, 49152, + 53248, 53760, 53824, 53840, 0, 1, 49152, 53248, + 53760, 53824, 53840, 53842, 0, 1, 49152, 53248, + 53760, 53824, 53840, 0, 1, 49152, 53248, 53760, + 53824, 53840, 53844, 0, 1, 49152, 53248, 53760, + 53824, 53840, 53844, 0, 1, 49152, 53248, 53760, + 53824, 53840, 53848, 53846, 0, 1, 49152, 53248, + 53760, 53824, 53840, 0, 1, 49152, 53248, 53760, + 53824, 53856, 53848, 0, 1, 49152, 53248, 53760, + 53824, 53856, 53848, 0, 1, 49152, 53248, 53760, + 53824, 53856, 53848, 53850, 0, 1, 49152, 53248, + 53760, 53824, 53856, 53848, 0, 1, 49152, 53248, + 53760, 53824, 53856, 53857, 53852, 0, 1, 49152, + 53248, 53760, 53824, 53856, 53857, 53852, 0, 1, + 49152, 53248, 53760, 53824, 53856, 53857, 53852, 53854, + 0, 1, 49152, 53248, 53760, 53824, 0, 1, + 49152, 53248, 53760, 53888, 53856, 0, 1, 49152, + 53248, 53760, 53888, 53856, 0, 1, 49152, 53248, + 53760, 53888, 53856, 53858, 0, 1, 49152, 53248, + 53760, 53888, 53856, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53860, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53860, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53864, 53862, 0, 1, 49152, 53248, + 53760, 53888, 53856, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53864, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53864, 0, 1, 49152, 53248, 53760, + 53888, 53856, 53864, 53866, 0, 1, 49152, 53248, + 53760, 53888, 53856, 53864, 0, 1, 49152, 53248, + 53760, 53888, 53856, 53872, 53868, 0, 1, 49152, + 53248, 53760, 53888, 53856, 53872, 53868, 0, 1, + 49152, 53248, 53760, 53888, 53856, 53872, 53873, 53870, + 0, 1, 49152, 53248, 53760, 53888, 53856, 0, + 1, 49152, 53248, 53760, 53888, 53889, 53872, 0, + 1, 49152, 53248, 53760, 53888, 53889, 53872, 0, + 1, 49152, 53248, 53760, 53888, 53889, 53872, 53874, + 0, 1, 49152, 53248, 53760, 53888, 53889, 53872, + 0, 1, 49152, 53248, 53760, 53888, 53889, 53872, + 53876, 0, 1, 49152, 53248, 53760, 53888, 53889, + 53872, 53876, 0, 1, 49152, 53248, 53760, 53888, + 53889, 53872, 53880, 53878, 0, 1, 49152, 53248, + 53760, 53888, 53889, 53872, 0, 1, 49152, 53248, + 53760, 53888, 53889, 53872, 53880, 0, 1, 49152, + 53248, 53760, 53888, 53889, 53891, 53880, 0, 1, + 49152, 53248, 53760, 53888, 53889, 53891, 53880, 53882, + 0, 1, 49152, 53248, 53760, 53888, 53889, 53891, + 53880, 0, 1, 49152, 53248, 53760, 53888, 53889, + 53891, 53880, 53884, 0, 1, 49152, 53248, 53760, + 53888, 53889, 53891, 53880, 53884, 0, 1, 49152, + 53248, 53760, 53888, 53889, 53891, 53880, 53884, 53886, + 0, 1, 49152, 53248, 53760, 0, 1, 49152, + 53248, 53760, 53888, 0, 1, 49152, 53248, 53760, + 53888, 0, 1, 49152, 53248, 53760, 53888, 53890, + 0, 1, 49152, 53248, 53760, 53888, 0, 1, + 49152, 53248, 53760, 53888, 53892, 0, 1, 49152, + 53248, 53760, 53888, 53892, 0, 1, 49152, 53248, + 53760, 53888, 53896, 53894, 0, 1, 49152, 53248, + 53760, 53888, 0, 1, 49152, 53248, 53760, 53888, + 53896, 0, 1, 49152, 53248, 53760, 53888, 53896, + 0, 1, 49152, 53248, 53760, 53888, 53896, 53898, + 0, 1, 49152, 53248, 53760, 53888, 53896, 0, + 1, 49152, 53248, 53760, 53888, 53904, 53900, 0, + 1, 49152, 53248, 53760, 53888, 53904, 53900, 0, + 1, 49152, 53248, 53760, 53888, 53904, 53905, 53902, + 0, 1, 49152, 53248, 53760, 53888, 0, 1, + 49152, 53248, 53760, 53888, 53904, 0, 1, 49152, + 53248, 53760, 53888, 53904, 0, 1, 49152, 53248, + 53760, 53888, 53904, 53906, 0, 1, 49152, 53248, + 53760, 53888, 53904, 0, 1, 49152, 53248, 53760, + 53888, 53904, 53908, 0, 1, 49152, 53248, 53760, + 53888, 53904, 53908, 0, 1, 49152, 53248, 53760, + 53888, 53904, 53912, 53910, 0, 1, 49152, 53248, + 53760, 53888, 53904, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53912, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53912, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53912, 53914, 0, 1, 49152, 53248, + 53760, 53888, 53920, 53912, 0, 1, 49152, 53248, + 53760, 53888, 53920, 53921, 53916, 0, 1, 49152, + 53248, 53760, 53888, 53920, 53921, 53916, 0, 1, + 49152, 53248, 53760, 53888, 53920, 53921, 53916, 53918, + 0, 1, 49152, 53248, 53760, 53888, 0, 1, + 49152, 53248, 53760, 53888, 53920, 0, 1, 49152, + 53248, 53760, 53888, 53920, 0, 1, 49152, 53248, + 53760, 53888, 53920, 53922, 0, 1, 49152, 53248, + 53760, 53888, 53920, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53924, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53924, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53928, 53926, 0, 1, 49152, 53248, + 53760, 53888, 53920, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53928, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53928, 0, 1, 49152, 53248, 53760, + 53888, 53920, 53928, 53930, 0, 1, 49152, 53248, + 53760, 53888, 53920, 53928, 0, 1, 49152, 53248, + 53760, 53888, 53920, 53936, 53932, 0, 1, 49152, + 53248, 53760, 53888, 53920, 53936, 53932, 0, 1, + 49152, 53248, 53760, 53888, 53920, 53936, 53937, 53934, + 0, 1, 49152, 53248, 53760, 53888, 53920, 0, + 1, 49152, 53248, 53760, 53888, 53952, 53936, 0, + 1, 49152, 53248, 53760, 53888, 53952, 53936, 0, + 1, 49152, 53248, 53760, 53888, 53952, 53936, 53938, + 0, 1, 49152, 53248, 53760, 53888, 53952, 53936, + 0, 1, 49152, 53248, 53760, 53888, 53952, 53936, + 53940, 0, 1, 49152, 53248, 53760, 53888, 53952, + 53936, 53940, 0, 1, 49152, 53248, 53760, 53888, + 53952, 53936, 53944, 53942, 0, 1, 49152, 53248, + 53760, 53888, 53952, 53936, 0, 1, 49152, 53248, + 53760, 53888, 53952, 53953, 53944, 0, 1, 49152, + 53248, 53760, 53888, 53952, 53953, 53944, 0, 1, + 49152, 53248, 53760, 53888, 53952, 53953, 53944, 53946, + 0, 1, 49152, 53248, 53760, 53888, 53952, 53953, + 53944, 0, 1, 49152, 53248, 53760, 53888, 53952, + 53953, 53944, 53948, 0, 1, 49152, 53248, 53760, + 53888, 53952, 53953, 53955, 53948, 0, 1, 49152, + 53248, 53760, 53888, 53952, 53953, 53955, 53948, 53950, + 0, 1, 49152, 53248, 53760, 53888, 0, 1, + 49152, 53248, 53760, 54016, 53952, 0, 1, 49152, + 53248, 53760, 54016, 53952, 0, 1, 49152, 53248, + 53760, 54016, 53952, 53954, 0, 1, 49152, 53248, + 53760, 54016, 53952, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53956, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53956, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53960, 53958, 0, 1, 49152, 53248, + 53760, 54016, 53952, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53960, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53960, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53960, 53962, 0, 1, 49152, 53248, + 53760, 54016, 53952, 53960, 0, 1, 49152, 53248, + 53760, 54016, 53952, 53968, 53964, 0, 1, 49152, + 53248, 53760, 54016, 53952, 53968, 53964, 0, 1, + 49152, 53248, 53760, 54016, 53952, 53968, 53969, 53966, + 0, 1, 49152, 53248, 53760, 54016, 53952, 0, + 1, 49152, 53248, 53760, 54016, 53952, 53968, 0, + 1, 49152, 53248, 53760, 54016, 53952, 53968, 0, + 1, 49152, 53248, 53760, 54016, 53952, 53968, 53970, + 0, 1, 49152, 53248, 53760, 54016, 53952, 53968, + 0, 1, 49152, 53248, 53760, 54016, 53952, 53968, + 53972, 0, 1, 49152, 53248, 53760, 54016, 53952, + 53968, 53972, 0, 1, 49152, 53248, 53760, 54016, + 53952, 53968, 53976, 53974, 0, 1, 49152, 53248, + 53760, 54016, 53952, 53968, 0, 1, 49152, 53248, + 53760, 54016, 53952, 53984, 53976, 0, 1, 49152, + 53248, 53760, 54016, 53952, 53984, 53976, 0, 1, + 49152, 53248, 53760, 54016, 53952, 53984, 53976, 53978, + 0, 1, 49152, 53248, 53760, 54016, 53952, 53984, + 53976, 0, 1, 49152, 53248, 53760, 54016, 53952, + 53984, 53985, 53980, 0, 1, 49152, 53248, 53760, + 54016, 53952, 53984, 53985, 53980, 0, 1, 49152, + 53248, 53760, 54016, 53952, 53984, 53985, 53980, 53982, + 0, 1, 49152, 53248, 53760, 54016, 53952, 0, + 1, 49152, 53248, 53760, 54016, 54017, 53984, 0, + 1, 49152, 53248, 53760, 54016, 54017, 53984, 0, + 1, 49152, 53248, 53760, 54016, 54017, 53984, 53986, + 0, 1, 49152, 53248, 53760, 54016, 54017, 53984, + 0, 1, 49152, 53248, 53760, 54016, 54017, 53984, + 53988, 0, 1, 49152, 53248, 53760, 54016, 54017, + 53984, 53988, 0, 1, 49152, 53248, 53760, 54016, + 54017, 53984, 53992, 53990, 0, 1, 49152, 53248, + 53760, 54016, 54017, 53984, 0, 1, 49152, 53248, + 53760, 54016, 54017, 53984, 53992, 0, 1, 49152, + 53248, 53760, 54016, 54017, 53984, 53992, 0, 1, + 49152, 53248, 53760, 54016, 54017, 53984, 53992, 53994, + 0, 1, 49152, 53248, 53760, 54016, 54017, 53984, + 53992, 0, 1, 49152, 53248, 53760, 54016, 54017, + 53984, 54000, 53996, 0, 1, 49152, 53248, 53760, + 54016, 54017, 53984, 54000, 53996, 0, 1, 49152, + 53248, 53760, 54016, 54017, 53984, 54000, 54001, 53998, + 0, 1, 49152, 53248, 53760, 54016, 54017, 53984, + 0, 1, 49152, 53248, 53760, 54016, 54017, 53984, + 54000, 0, 1, 49152, 53248, 53760, 54016, 54017, + 54019, 54000, 0, 1, 49152, 53248, 53760, 54016, + 54017, 54019, 54000, 54002, 0, 1, 49152, 53248, + 53760, 54016, 54017, 54019, 54000, 0, 1, 49152, + 53248, 53760, 54016, 54017, 54019, 54000, 54004, 0, + 1, 49152, 53248, 53760, 54016, 54017, 54019, 54000, + 54004, 0, 1, 49152, 53248, 53760, 54016, 54017, + 54019, 54000, 54008, 54006, 0, 1, 49152, 53248, + 53760, 54016, 54017, 54019, 54000, 0, 1, 49152, + 53248, 53760, 54016, 54017, 54019, 54000, 54008, 0, + 1, 49152, 53248, 53760, 54016, 54017, 54019, 54000, + 54008, 0, 1, 49152, 53248, 53760, 54016, 54017, + 54019, 54000, 54008, 54010, 0, 1, 49152, 53248, + 53760, 54016, 54017, 54019, 54023, 54008, 0, 1, + 49152, 53248, 53760, 54016, 54017, 54019, 54023, 54008, + 54012, 0, 1, 49152, 53248, 53760, 54016, 54017, + 54019, 54023, 54008, 54012, 0, 1, 49152, 53248, + 53760, 54016, 54017, 54019, 54023, 54008, 54012, 54014, + 0, 1, 49152, 53248, 53760, 0, 1, 49152, + 53248, 54272, 54016, 0, 1, 49152, 53248, 54272, + 54016, 0, 1, 49152, 53248, 54272, 54016, 54018, + 0, 1, 49152, 53248, 54272, 54016, 0, 1, + 49152, 53248, 54272, 54016, 54020, 0, 1, 49152, + 53248, 54272, 54016, 54020, 0, 1, 49152, 53248, + 54272, 54016, 54024, 54022, 0, 1, 49152, 53248, + 54272, 54016, 0, 1, 49152, 53248, 54272, 54016, + 54024, 0, 1, 49152, 53248, 54272, 54016, 54024, + 0, 1, 49152, 53248, 54272, 54016, 54024, 54026, + 0, 1, 49152, 53248, 54272, 54016, 54024, 0, + 1, 49152, 53248, 54272, 54016, 54032, 54028, 0, + 1, 49152, 53248, 54272, 54016, 54032, 54028, 0, + 1, 49152, 53248, 54272, 54016, 54032, 54033, 54030, + 0, 1, 49152, 53248, 54272, 54016, 0, 1, + 49152, 53248, 54272, 54016, 54032, 0, 1, 49152, + 53248, 54272, 54016, 54032, 0, 1, 49152, 53248, + 54272, 54016, 54032, 54034, 0, 1, 49152, 53248, + 54272, 54016, 54032, 0, 1, 49152, 53248, 54272, + 54016, 54032, 54036, 0, 1, 49152, 53248, 54272, + 54016, 54032, 54036, 0, 1, 49152, 53248, 54272, + 54016, 54032, 54040, 54038, 0, 1, 49152, 53248, + 54272, 54016, 54032, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54040, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54040, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54040, 54042, 0, 1, 49152, 53248, + 54272, 54016, 54048, 54040, 0, 1, 49152, 53248, + 54272, 54016, 54048, 54049, 54044, 0, 1, 49152, + 53248, 54272, 54016, 54048, 54049, 54044, 0, 1, + 49152, 53248, 54272, 54016, 54048, 54049, 54044, 54046, + 0, 1, 49152, 53248, 54272, 54016, 0, 1, + 49152, 53248, 54272, 54016, 54048, 0, 1, 49152, + 53248, 54272, 54016, 54048, 0, 1, 49152, 53248, + 54272, 54016, 54048, 54050, 0, 1, 49152, 53248, + 54272, 54016, 54048, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54052, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54052, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54056, 54054, 0, 1, 49152, 53248, + 54272, 54016, 54048, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54056, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54056, 0, 1, 49152, 53248, 54272, + 54016, 54048, 54056, 54058, 0, 1, 49152, 53248, + 54272, 54016, 54048, 54056, 0, 1, 49152, 53248, + 54272, 54016, 54048, 54064, 54060, 0, 1, 49152, + 53248, 54272, 54016, 54048, 54064, 54060, 0, 1, + 49152, 53248, 54272, 54016, 54048, 54064, 54065, 54062, + 0, 1, 49152, 53248, 54272, 54016, 54048, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54064, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54064, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54064, 54066, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54064, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54064, + 54068, 0, 1, 49152, 53248, 54272, 54016, 54080, + 54064, 54068, 0, 1, 49152, 53248, 54272, 54016, + 54080, 54064, 54072, 54070, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54064, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54081, 54072, 0, 1, 49152, + 53248, 54272, 54016, 54080, 54081, 54072, 0, 1, + 49152, 53248, 54272, 54016, 54080, 54081, 54072, 54074, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54081, + 54072, 0, 1, 49152, 53248, 54272, 54016, 54080, + 54081, 54072, 54076, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54081, 54083, 54076, 0, 1, 49152, + 53248, 54272, 54016, 54080, 54081, 54083, 54076, 54078, + 0, 1, 49152, 53248, 54272, 54016, 0, 1, + 49152, 53248, 54272, 54016, 54080, 0, 1, 49152, + 53248, 54272, 54016, 54080, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54082, 0, 1, 49152, 53248, + 54272, 54016, 54080, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54084, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54084, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54088, 54086, 0, 1, 49152, 53248, + 54272, 54016, 54080, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54088, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54088, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54088, 54090, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54088, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54096, 54092, 0, 1, 49152, + 53248, 54272, 54016, 54080, 54096, 54092, 0, 1, + 49152, 53248, 54272, 54016, 54080, 54096, 54097, 54094, + 0, 1, 49152, 53248, 54272, 54016, 54080, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54096, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54096, 0, + 1, 49152, 53248, 54272, 54016, 54080, 54096, 54098, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54096, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54096, + 54100, 0, 1, 49152, 53248, 54272, 54016, 54080, + 54096, 54100, 0, 1, 49152, 53248, 54272, 54016, + 54080, 54096, 54104, 54102, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54096, 0, 1, 49152, 53248, + 54272, 54016, 54080, 54112, 54104, 0, 1, 49152, + 53248, 54272, 54016, 54080, 54112, 54104, 0, 1, + 49152, 53248, 54272, 54016, 54080, 54112, 54104, 54106, + 0, 1, 49152, 53248, 54272, 54016, 54080, 54112, + 54104, 0, 1, 49152, 53248, 54272, 54016, 54080, + 54112, 54113, 54108, 0, 1, 49152, 53248, 54272, + 54016, 54080, 54112, 54113, 54108, 0, 1, 49152, + 53248, 54272, 54016, 54080, 54112, 54113, 54108, 54110, + 0, 1, 49152, 53248, 54272, 54016, 54080, 0, + 1, 49152, 53248, 54272, 54016, 54144, 54112, 0, + 1, 49152, 53248, 54272, 54016, 54144, 54112, 0, + 1, 49152, 53248, 54272, 54016, 54144, 54112, 54114, + 0, 1, 49152, 53248, 54272, 54016, 54144, 54112, + 0, 1, 49152, 53248, 54272, 54016, 54144, 54112, + 54116, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54112, 54116, 0, 1, 49152, 53248, 54272, 54016, + 54144, 54112, 54120, 54118, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54112, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54112, 54120, 0, 1, 49152, + 53248, 54272, 54016, 54144, 54112, 54120, 0, 1, + 49152, 53248, 54272, 54016, 54144, 54112, 54120, 54122, + 0, 1, 49152, 53248, 54272, 54016, 54144, 54112, + 54120, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54112, 54128, 54124, 0, 1, 49152, 53248, 54272, + 54016, 54144, 54112, 54128, 54124, 0, 1, 49152, + 53248, 54272, 54016, 54144, 54112, 54128, 54129, 54126, + 0, 1, 49152, 53248, 54272, 54016, 54144, 54112, + 0, 1, 49152, 53248, 54272, 54016, 54144, 54145, + 54128, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54145, 54128, 0, 1, 49152, 53248, 54272, 54016, + 54144, 54145, 54128, 54130, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54145, 54128, 0, 1, 49152, + 53248, 54272, 54016, 54144, 54145, 54128, 54132, 0, + 1, 49152, 53248, 54272, 54016, 54144, 54145, 54128, + 54132, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54145, 54128, 54136, 54134, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54145, 54128, 0, 1, 49152, + 53248, 54272, 54016, 54144, 54145, 54128, 54136, 0, + 1, 49152, 53248, 54272, 54016, 54144, 54145, 54147, + 54136, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54145, 54147, 54136, 54138, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54145, 54147, 54136, 0, 1, + 49152, 53248, 54272, 54016, 54144, 54145, 54147, 54136, + 54140, 0, 1, 49152, 53248, 54272, 54016, 54144, + 54145, 54147, 54136, 54140, 0, 1, 49152, 53248, + 54272, 54016, 54144, 54145, 54147, 54136, 54140, 54142, + 0, 1, 49152, 53248, 54272, 54016, 0, 1, + 49152, 53248, 54272, 54016, 54144, 0, 1, 49152, + 53248, 54272, 54273, 54144, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54146, 0, 1, 49152, 53248, + 54272, 54273, 54144, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54148, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54148, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54152, 54150, 0, 1, 49152, 53248, + 54272, 54273, 54144, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54152, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54152, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54152, 54154, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54152, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54160, 54156, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54160, 54156, 0, 1, + 49152, 53248, 54272, 54273, 54144, 54160, 54161, 54158, + 0, 1, 49152, 53248, 54272, 54273, 54144, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54160, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54160, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54160, 54162, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54160, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54160, + 54164, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54160, 54164, 0, 1, 49152, 53248, 54272, 54273, + 54144, 54160, 54168, 54166, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54160, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54176, 54168, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54176, 54168, 0, 1, + 49152, 53248, 54272, 54273, 54144, 54176, 54168, 54170, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54176, + 54168, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54176, 54177, 54172, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54176, 54177, 54172, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54176, 54177, 54172, 54174, + 0, 1, 49152, 53248, 54272, 54273, 54144, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54176, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54176, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54176, 54178, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54176, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54176, + 54180, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54176, 54180, 0, 1, 49152, 53248, 54272, 54273, + 54144, 54176, 54184, 54182, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54176, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54176, 54184, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54176, 54184, 0, 1, + 49152, 53248, 54272, 54273, 54144, 54176, 54184, 54186, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54176, + 54184, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54176, 54192, 54188, 0, 1, 49152, 53248, 54272, + 54273, 54144, 54176, 54192, 54188, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54176, 54192, 54193, 54190, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54176, + 0, 1, 49152, 53248, 54272, 54273, 54144, 54208, + 54192, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54208, 54192, 0, 1, 49152, 53248, 54272, 54273, + 54144, 54208, 54192, 54194, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54208, 54192, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54208, 54192, 54196, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54208, 54192, + 54196, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54208, 54192, 54200, 54198, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54208, 54192, 0, 1, 49152, + 53248, 54272, 54273, 54144, 54208, 54209, 54200, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54208, 54209, + 54200, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54208, 54209, 54200, 54202, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54208, 54209, 54200, 0, 1, + 49152, 53248, 54272, 54273, 54144, 54208, 54209, 54200, + 54204, 0, 1, 49152, 53248, 54272, 54273, 54144, + 54208, 54209, 54211, 54204, 0, 1, 49152, 53248, + 54272, 54273, 54144, 54208, 54209, 54211, 54204, 54206, + 0, 1, 49152, 53248, 54272, 54273, 54144, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54208, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54208, 0, + 1, 49152, 53248, 54272, 54273, 54144, 54208, 54210, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 54212, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54212, 0, 1, 49152, 53248, 54272, 54273, + 54275, 54208, 54216, 54214, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54216, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54208, 54216, 0, 1, + 49152, 53248, 54272, 54273, 54275, 54208, 54216, 54218, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 54216, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54224, 54220, 0, 1, 49152, 53248, 54272, + 54273, 54275, 54208, 54224, 54220, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54208, 54224, 54225, 54222, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 54224, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54224, 0, 1, 49152, 53248, 54272, 54273, + 54275, 54208, 54224, 54226, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54224, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54208, 54224, 54228, 0, + 1, 49152, 53248, 54272, 54273, 54275, 54208, 54224, + 54228, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54224, 54232, 54230, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54224, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54208, 54240, 54232, 0, + 1, 49152, 53248, 54272, 54273, 54275, 54208, 54240, + 54232, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54240, 54232, 54234, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54240, 54232, 0, 1, + 49152, 53248, 54272, 54273, 54275, 54208, 54240, 54241, + 54236, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54240, 54241, 54236, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54240, 54241, 54236, 54238, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54208, + 54240, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54240, 0, 1, 49152, 53248, 54272, 54273, + 54275, 54208, 54240, 54242, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54208, 54240, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54208, 54240, 54244, 0, + 1, 49152, 53248, 54272, 54273, 54275, 54208, 54240, + 54244, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54208, 54240, 54248, 54246, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54279, 54240, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54279, 54240, 54248, 0, + 1, 49152, 53248, 54272, 54273, 54275, 54279, 54240, + 54248, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54279, 54240, 54248, 54250, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54279, 54240, 54248, 0, 1, + 49152, 53248, 54272, 54273, 54275, 54279, 54240, 54256, + 54252, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54279, 54240, 54256, 54252, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54279, 54240, 54256, 54257, 54254, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54279, + 54240, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54279, 54240, 54256, 0, 1, 49152, 53248, 54272, + 54273, 54275, 54279, 54240, 54256, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54279, 54240, 54256, 54258, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54279, + 54240, 54256, 0, 1, 49152, 53248, 54272, 54273, + 54275, 54279, 54240, 54256, 54260, 0, 1, 49152, + 53248, 54272, 54273, 54275, 54279, 54240, 54256, 54260, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54279, + 54240, 54256, 54264, 54262, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54279, 54240, 54256, 0, 1, + 49152, 53248, 54272, 54273, 54275, 54279, 54240, 54256, + 54264, 0, 1, 49152, 53248, 54272, 54273, 54275, + 54279, 54240, 54256, 54264, 0, 1, 49152, 53248, + 54272, 54273, 54275, 54279, 54240, 54256, 54264, 54266, + 0, 1, 49152, 53248, 54272, 54273, 54275, 54279, + 54240, 54256, 54264, 0, 1, 49152, 53248, 54272, + 54273, 54275, 54279, 54240, 54256, 54264, 54268, 0, + 1, 49152, 53248, 54272, 54273, 54275, 54279, 54240, + 54256, 54264, 54268, 0, 1, 49152, 53248, 54272, + 54273, 54275, 54279, 54240, 54256, 54264, 54268, 54270, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 54272, 0, 1, 49152, 53248, 54272, 0, 1, + 49152, 53248, 54272, 54274, 0, 1, 49152, 53248, + 54272, 0, 1, 49152, 53248, 54272, 54276, 0, + 1, 49152, 53248, 54272, 54276, 0, 1, 49152, + 53248, 54272, 54280, 54278, 0, 1, 49152, 53248, + 54272, 0, 1, 49152, 53248, 54272, 54280, 0, + 1, 49152, 53248, 54272, 54280, 0, 1, 49152, + 53248, 54272, 54280, 54282, 0, 1, 49152, 53248, + 54272, 54280, 0, 1, 49152, 53248, 54272, 54288, + 54284, 0, 1, 49152, 53248, 54272, 54288, 54284, + 0, 1, 49152, 53248, 54272, 54288, 54289, 54286, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 54272, 54288, 0, 1, 49152, 53248, 54272, + 54288, 0, 1, 49152, 53248, 54272, 54288, 54290, + 0, 1, 49152, 53248, 54272, 54288, 0, 1, + 49152, 53248, 54272, 54288, 54292, 0, 1, 49152, + 53248, 54272, 54288, 54292, 0, 1, 49152, 53248, + 54272, 54288, 54296, 54294, 0, 1, 49152, 53248, + 54272, 54288, 0, 1, 49152, 53248, 54272, 54304, + 54296, 0, 1, 49152, 53248, 54272, 54304, 54296, + 0, 1, 49152, 53248, 54272, 54304, 54296, 54298, + 0, 1, 49152, 53248, 54272, 54304, 54296, 0, + 1, 49152, 53248, 54272, 54304, 54305, 54300, 0, + 1, 49152, 53248, 54272, 54304, 54305, 54300, 0, + 1, 49152, 53248, 54272, 54304, 54305, 54300, 54302, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 54272, 54304, 0, 1, 49152, 53248, 54272, + 54304, 0, 1, 49152, 53248, 54272, 54304, 54306, + 0, 1, 49152, 53248, 54272, 54304, 0, 1, + 49152, 53248, 54272, 54304, 54308, 0, 1, 49152, + 53248, 54272, 54304, 54308, 0, 1, 49152, 53248, + 54272, 54304, 54312, 54310, 0, 1, 49152, 53248, + 54272, 54304, 0, 1, 49152, 53248, 54272, 54304, + 54312, 0, 1, 49152, 53248, 54272, 54304, 54312, + 0, 1, 49152, 53248, 54272, 54304, 54312, 54314, + 0, 1, 49152, 53248, 54272, 54304, 54312, 0, + 1, 49152, 53248, 54272, 54304, 54320, 54316, 0, + 1, 49152, 53248, 54272, 54304, 54320, 54316, 0, + 1, 49152, 53248, 54272, 54304, 54320, 54321, 54318, + 0, 1, 49152, 53248, 54272, 54304, 0, 1, + 49152, 53248, 54272, 54336, 54320, 0, 1, 49152, + 53248, 54272, 54336, 54320, 0, 1, 49152, 53248, + 54272, 54336, 54320, 54322, 0, 1, 49152, 53248, + 54272, 54336, 54320, 0, 1, 49152, 53248, 54272, + 54336, 54320, 54324, 0, 1, 49152, 53248, 54272, + 54336, 54320, 54324, 0, 1, 49152, 53248, 54272, + 54336, 54320, 54328, 54326, 0, 1, 49152, 53248, + 54272, 54336, 54320, 0, 1, 49152, 53248, 54272, + 54336, 54337, 54328, 0, 1, 49152, 53248, 54272, + 54336, 54337, 54328, 0, 1, 49152, 53248, 54272, + 54336, 54337, 54328, 54330, 0, 1, 49152, 53248, + 54272, 54336, 54337, 54328, 0, 1, 49152, 53248, + 54272, 54336, 54337, 54328, 54332, 0, 1, 49152, + 53248, 54272, 54336, 54337, 54339, 54332, 0, 1, + 49152, 53248, 54272, 54336, 54337, 54339, 54332, 54334, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 54272, 54336, 0, 1, 49152, 53248, 54272, + 54336, 0, 1, 49152, 53248, 54272, 54336, 54338, + 0, 1, 49152, 53248, 54272, 54336, 0, 1, + 49152, 53248, 54272, 54336, 54340, 0, 1, 49152, + 53248, 54272, 54336, 54340, 0, 1, 49152, 53248, + 54272, 54336, 54344, 54342, 0, 1, 49152, 53248, + 54272, 54336, 0, 1, 49152, 53248, 54272, 54336, + 54344, 0, 1, 49152, 53248, 54272, 54336, 54344, + 0, 1, 49152, 53248, 54272, 54336, 54344, 54346, + 0, 1, 49152, 53248, 54272, 54336, 54344, 0, + 1, 49152, 53248, 54272, 54336, 54352, 54348, 0, + 1, 49152, 53248, 54272, 54336, 54352, 54348, 0, + 1, 49152, 53248, 54272, 54336, 54352, 54353, 54350, + 0, 1, 49152, 53248, 54272, 54336, 0, 1, + 49152, 53248, 54272, 54336, 54352, 0, 1, 49152, + 53248, 54272, 54336, 54352, 0, 1, 49152, 53248, + 54272, 54336, 54352, 54354, 0, 1, 49152, 53248, + 54272, 54336, 54352, 0, 1, 49152, 53248, 54272, + 54336, 54352, 54356, 0, 1, 49152, 53248, 54272, + 54336, 54352, 54356, 0, 1, 49152, 53248, 54272, + 54336, 54352, 54360, 54358, 0, 1, 49152, 53248, + 54272, 54336, 54352, 0, 1, 49152, 53248, 54272, + 54336, 54368, 54360, 0, 1, 49152, 53248, 54272, + 54336, 54368, 54360, 0, 1, 49152, 53248, 54272, + 54336, 54368, 54360, 54362, 0, 1, 49152, 53248, + 54272, 54336, 54368, 54360, 0, 1, 49152, 53248, + 54272, 54336, 54368, 54369, 54364, 0, 1, 49152, + 53248, 54272, 54336, 54368, 54369, 54364, 0, 1, + 49152, 53248, 54272, 54336, 54368, 54369, 54364, 54366, + 0, 1, 49152, 53248, 54272, 54336, 0, 1, + 49152, 53248, 54272, 54400, 54368, 0, 1, 49152, + 53248, 54272, 54400, 54368, 0, 1, 49152, 53248, + 54272, 54400, 54368, 54370, 0, 1, 49152, 53248, + 54272, 54400, 54368, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54372, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54372, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54376, 54374, 0, 1, 49152, 53248, + 54272, 54400, 54368, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54376, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54376, 0, 1, 49152, 53248, 54272, + 54400, 54368, 54376, 54378, 0, 1, 49152, 53248, + 54272, 54400, 54368, 54376, 0, 1, 49152, 53248, + 54272, 54400, 54368, 54384, 54380, 0, 1, 49152, + 53248, 54272, 54400, 54368, 54384, 54380, 0, 1, + 49152, 53248, 54272, 54400, 54368, 54384, 54385, 54382, + 0, 1, 49152, 53248, 54272, 54400, 54368, 0, + 1, 49152, 53248, 54272, 54400, 54401, 54384, 0, + 1, 49152, 53248, 54272, 54400, 54401, 54384, 0, + 1, 49152, 53248, 54272, 54400, 54401, 54384, 54386, + 0, 1, 49152, 53248, 54272, 54400, 54401, 54384, + 0, 1, 49152, 53248, 54272, 54400, 54401, 54384, + 54388, 0, 1, 49152, 53248, 54272, 54400, 54401, + 54384, 54388, 0, 1, 49152, 53248, 54272, 54400, + 54401, 54384, 54392, 54390, 0, 1, 49152, 53248, + 54272, 54400, 54401, 54384, 0, 1, 49152, 53248, + 54272, 54400, 54401, 54384, 54392, 0, 1, 49152, + 53248, 54272, 54400, 54401, 54403, 54392, 0, 1, + 49152, 53248, 54272, 54400, 54401, 54403, 54392, 54394, + 0, 1, 49152, 53248, 54272, 54400, 54401, 54403, + 54392, 0, 1, 49152, 53248, 54272, 54400, 54401, + 54403, 54392, 54396, 0, 1, 49152, 53248, 54272, + 54400, 54401, 54403, 54392, 54396, 0, 1, 49152, + 53248, 54272, 54400, 54401, 54403, 54392, 54396, 54398, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 54272, 54400, 0, 1, 49152, 53248, 54272, + 54400, 0, 1, 49152, 53248, 54272, 54400, 54402, + 0, 1, 49152, 53248, 54272, 54400, 0, 1, + 49152, 53248, 54272, 54400, 54404, 0, 1, 49152, + 53248, 54272, 54400, 54404, 0, 1, 49152, 53248, + 54272, 54400, 54408, 54406, 0, 1, 49152, 53248, + 54272, 54400, 0, 1, 49152, 53248, 54272, 54400, + 54408, 0, 1, 49152, 53248, 54272, 54400, 54408, + 0, 1, 49152, 53248, 54272, 54400, 54408, 54410, + 0, 1, 49152, 53248, 54272, 54400, 54408, 0, + 1, 49152, 53248, 54272, 54400, 54416, 54412, 0, + 1, 49152, 53248, 54272, 54400, 54416, 54412, 0, + 1, 49152, 53248, 54272, 54400, 54416, 54417, 54414, + 0, 1, 49152, 53248, 54272, 54400, 0, 1, + 49152, 53248, 54272, 54400, 54416, 0, 1, 49152, + 53248, 54272, 54400, 54416, 0, 1, 49152, 53248, + 54272, 54400, 54416, 54418, 0, 1, 49152, 53248, + 54272, 54400, 54416, 0, 1, 49152, 53248, 54272, + 54400, 54416, 54420, 0, 1, 49152, 53248, 54272, + 54400, 54416, 54420, 0, 1, 49152, 53248, 54272, + 54400, 54416, 54424, 54422, 0, 1, 49152, 53248, + 54272, 54400, 54416, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54424, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54424, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54424, 54426, 0, 1, 49152, 53248, + 54272, 54400, 54432, 54424, 0, 1, 49152, 53248, + 54272, 54400, 54432, 54433, 54428, 0, 1, 49152, + 53248, 54272, 54400, 54432, 54433, 54428, 0, 1, + 49152, 53248, 54272, 54400, 54432, 54433, 54428, 54430, + 0, 1, 49152, 53248, 54272, 54400, 0, 1, + 49152, 53248, 54272, 54400, 54432, 0, 1, 49152, + 53248, 54272, 54400, 54432, 0, 1, 49152, 53248, + 54272, 54400, 54432, 54434, 0, 1, 49152, 53248, + 54272, 54400, 54432, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54436, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54436, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54440, 54438, 0, 1, 49152, 53248, + 54272, 54400, 54432, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54440, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54440, 0, 1, 49152, 53248, 54272, + 54400, 54432, 54440, 54442, 0, 1, 49152, 53248, + 54272, 54400, 54432, 54440, 0, 1, 49152, 53248, + 54272, 54400, 54432, 54448, 54444, 0, 1, 49152, + 53248, 54272, 54400, 54432, 54448, 54444, 0, 1, + 49152, 53248, 54272, 54400, 54432, 54448, 54449, 54446, + 0, 1, 49152, 53248, 54272, 54400, 54432, 0, + 1, 49152, 53248, 54272, 54400, 54464, 54448, 0, + 1, 49152, 53248, 54272, 54400, 54464, 54448, 0, + 1, 49152, 53248, 54272, 54400, 54464, 54448, 54450, + 0, 1, 49152, 53248, 54272, 54400, 54464, 54448, + 0, 1, 49152, 53248, 54272, 54400, 54464, 54448, + 54452, 0, 1, 49152, 53248, 54272, 54400, 54464, + 54448, 54452, 0, 1, 49152, 53248, 54272, 54400, + 54464, 54448, 54456, 54454, 0, 1, 49152, 53248, + 54272, 54400, 54464, 54448, 0, 1, 49152, 53248, + 54272, 54400, 54464, 54465, 54456, 0, 1, 49152, + 53248, 54272, 54400, 54464, 54465, 54456, 0, 1, + 49152, 53248, 54272, 54400, 54464, 54465, 54456, 54458, + 0, 1, 49152, 53248, 54272, 54400, 54464, 54465, + 54456, 0, 1, 49152, 53248, 54272, 54400, 54464, + 54465, 54456, 54460, 0, 1, 49152, 53248, 54272, + 54400, 54464, 54465, 54467, 54460, 0, 1, 49152, + 53248, 54272, 54400, 54464, 54465, 54467, 54460, 54462, + 0, 1, 49152, 53248, 54272, 54400, 0, 1, + 49152, 53248, 54272, 54528, 54464, 0, 1, 49152, + 53248, 54272, 54528, 54464, 0, 1, 49152, 53248, + 54272, 54528, 54464, 54466, 0, 1, 49152, 53248, + 54272, 54528, 54464, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54468, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54468, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54472, 54470, 0, 1, 49152, 53248, + 54272, 54528, 54464, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54472, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54472, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54472, 54474, 0, 1, 49152, 53248, + 54272, 54528, 54464, 54472, 0, 1, 49152, 53248, + 54272, 54528, 54464, 54480, 54476, 0, 1, 49152, + 53248, 54272, 54528, 54464, 54480, 54476, 0, 1, + 49152, 53248, 54272, 54528, 54464, 54480, 54481, 54478, + 0, 1, 49152, 53248, 54272, 54528, 54464, 0, + 1, 49152, 53248, 54272, 54528, 54464, 54480, 0, + 1, 49152, 53248, 54272, 54528, 54464, 54480, 0, + 1, 49152, 53248, 54272, 54528, 54464, 54480, 54482, + 0, 1, 49152, 53248, 54272, 54528, 54464, 54480, + 0, 1, 49152, 53248, 54272, 54528, 54464, 54480, + 54484, 0, 1, 49152, 53248, 54272, 54528, 54464, + 54480, 54484, 0, 1, 49152, 53248, 54272, 54528, + 54464, 54480, 54488, 54486, 0, 1, 49152, 53248, + 54272, 54528, 54464, 54480, 0, 1, 49152, 53248, + 54272, 54528, 54464, 54496, 54488, 0, 1, 49152, + 53248, 54272, 54528, 54464, 54496, 54488, 0, 1, + 49152, 53248, 54272, 54528, 54464, 54496, 54488, 54490, + 0, 1, 49152, 53248, 54272, 54528, 54464, 54496, + 54488, 0, 1, 49152, 53248, 54272, 54528, 54464, + 54496, 54497, 54492, 0, 1, 49152, 53248, 54272, + 54528, 54464, 54496, 54497, 54492, 0, 1, 49152, + 53248, 54272, 54528, 54464, 54496, 54497, 54492, 54494, + 0, 1, 49152, 53248, 54272, 54528, 54464, 0, + 1, 49152, 53248, 54272, 54528, 54529, 54496, 0, + 1, 49152, 53248, 54272, 54528, 54529, 54496, 0, + 1, 49152, 53248, 54272, 54528, 54529, 54496, 54498, + 0, 1, 49152, 53248, 54272, 54528, 54529, 54496, + 0, 1, 49152, 53248, 54272, 54528, 54529, 54496, + 54500, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54496, 54500, 0, 1, 49152, 53248, 54272, 54528, + 54529, 54496, 54504, 54502, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54496, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54496, 54504, 0, 1, 49152, + 53248, 54272, 54528, 54529, 54496, 54504, 0, 1, + 49152, 53248, 54272, 54528, 54529, 54496, 54504, 54506, + 0, 1, 49152, 53248, 54272, 54528, 54529, 54496, + 54504, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54496, 54512, 54508, 0, 1, 49152, 53248, 54272, + 54528, 54529, 54496, 54512, 54508, 0, 1, 49152, + 53248, 54272, 54528, 54529, 54496, 54512, 54513, 54510, + 0, 1, 49152, 53248, 54272, 54528, 54529, 54496, + 0, 1, 49152, 53248, 54272, 54528, 54529, 54496, + 54512, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54531, 54512, 0, 1, 49152, 53248, 54272, 54528, + 54529, 54531, 54512, 54514, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54531, 54512, 0, 1, 49152, + 53248, 54272, 54528, 54529, 54531, 54512, 54516, 0, + 1, 49152, 53248, 54272, 54528, 54529, 54531, 54512, + 54516, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54531, 54512, 54520, 54518, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54531, 54512, 0, 1, 49152, + 53248, 54272, 54528, 54529, 54531, 54512, 54520, 0, + 1, 49152, 53248, 54272, 54528, 54529, 54531, 54512, + 54520, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54531, 54512, 54520, 54522, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54531, 54535, 54520, 0, 1, + 49152, 53248, 54272, 54528, 54529, 54531, 54535, 54520, + 54524, 0, 1, 49152, 53248, 54272, 54528, 54529, + 54531, 54535, 54520, 54524, 0, 1, 49152, 53248, + 54272, 54528, 54529, 54531, 54535, 54520, 54524, 54526, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 54272, 54528, 0, 1, 49152, 53248, 54272, + 54528, 0, 1, 49152, 53248, 54272, 54528, 54530, + 0, 1, 49152, 53248, 54272, 54528, 0, 1, + 49152, 53248, 54272, 54528, 54532, 0, 1, 49152, + 53248, 54272, 54528, 54532, 0, 1, 49152, 53248, + 54272, 54528, 54536, 54534, 0, 1, 49152, 53248, + 54272, 54528, 0, 1, 49152, 53248, 54272, 54528, + 54536, 0, 1, 49152, 53248, 54272, 54528, 54536, + 0, 1, 49152, 53248, 54272, 54528, 54536, 54538, + 0, 1, 49152, 53248, 54272, 54528, 54536, 0, + 1, 49152, 53248, 54272, 54528, 54544, 54540, 0, + 1, 49152, 53248, 54272, 54528, 54544, 54540, 0, + 1, 49152, 53248, 54272, 54528, 54544, 54545, 54542, + 0, 1, 49152, 53248, 54272, 54528, 0, 1, + 49152, 53248, 54272, 54528, 54544, 0, 1, 49152, + 53248, 54272, 54528, 54544, 0, 1, 49152, 53248, + 54272, 54528, 54544, 54546, 0, 1, 49152, 53248, + 54272, 54528, 54544, 0, 1, 49152, 53248, 54272, + 54528, 54544, 54548, 0, 1, 49152, 53248, 54272, + 54528, 54544, 54548, 0, 1, 49152, 53248, 54272, + 54528, 54544, 54552, 54550, 0, 1, 49152, 53248, + 54272, 54528, 54544, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54552, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54552, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54552, 54554, 0, 1, 49152, 53248, + 54272, 54528, 54560, 54552, 0, 1, 49152, 53248, + 54272, 54528, 54560, 54561, 54556, 0, 1, 49152, + 53248, 54272, 54528, 54560, 54561, 54556, 0, 1, + 49152, 53248, 54272, 54528, 54560, 54561, 54556, 54558, + 0, 1, 49152, 53248, 54272, 54528, 0, 1, + 49152, 53248, 54272, 54528, 54560, 0, 1, 49152, + 53248, 54272, 54528, 54560, 0, 1, 49152, 53248, + 54272, 54528, 54560, 54562, 0, 1, 49152, 53248, + 54272, 54528, 54560, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54564, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54564, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54568, 54566, 0, 1, 49152, 53248, + 54272, 54528, 54560, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54568, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54568, 0, 1, 49152, 53248, 54272, + 54528, 54560, 54568, 54570, 0, 1, 49152, 53248, + 54272, 54528, 54560, 54568, 0, 1, 49152, 53248, + 54272, 54528, 54560, 54576, 54572, 0, 1, 49152, + 53248, 54272, 54528, 54560, 54576, 54572, 0, 1, + 49152, 53248, 54272, 54528, 54560, 54576, 54577, 54574, + 0, 1, 49152, 53248, 54272, 54528, 54560, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54576, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54576, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54576, 54578, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54576, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54576, + 54580, 0, 1, 49152, 53248, 54272, 54528, 54592, + 54576, 54580, 0, 1, 49152, 53248, 54272, 54528, + 54592, 54576, 54584, 54582, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54576, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54593, 54584, 0, 1, 49152, + 53248, 54272, 54528, 54592, 54593, 54584, 0, 1, + 49152, 53248, 54272, 54528, 54592, 54593, 54584, 54586, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54593, + 54584, 0, 1, 49152, 53248, 54272, 54528, 54592, + 54593, 54584, 54588, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54593, 54595, 54588, 0, 1, 49152, + 53248, 54272, 54528, 54592, 54593, 54595, 54588, 54590, + 0, 1, 49152, 53248, 54272, 54528, 0, 1, + 49152, 53248, 54272, 54528, 54592, 0, 1, 49152, + 53248, 54272, 54528, 54592, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54594, 0, 1, 49152, 53248, + 54272, 54528, 54592, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54596, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54596, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54600, 54598, 0, 1, 49152, 53248, + 54272, 54528, 54592, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54600, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54600, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54600, 54602, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54600, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54608, 54604, 0, 1, 49152, + 53248, 54272, 54528, 54592, 54608, 54604, 0, 1, + 49152, 53248, 54272, 54528, 54592, 54608, 54609, 54606, + 0, 1, 49152, 53248, 54272, 54528, 54592, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54608, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54608, 0, + 1, 49152, 53248, 54272, 54528, 54592, 54608, 54610, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54608, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54608, + 54612, 0, 1, 49152, 53248, 54272, 54528, 54592, + 54608, 54612, 0, 1, 49152, 53248, 54272, 54528, + 54592, 54608, 54616, 54614, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54608, 0, 1, 49152, 53248, + 54272, 54528, 54592, 54624, 54616, 0, 1, 49152, + 53248, 54272, 54528, 54592, 54624, 54616, 0, 1, + 49152, 53248, 54272, 54528, 54592, 54624, 54616, 54618, + 0, 1, 49152, 53248, 54272, 54528, 54592, 54624, + 54616, 0, 1, 49152, 53248, 54272, 54528, 54592, + 54624, 54625, 54620, 0, 1, 49152, 53248, 54272, + 54528, 54592, 54624, 54625, 54620, 0, 1, 49152, + 53248, 54272, 54528, 54592, 54624, 54625, 54620, 54622, + 0, 1, 49152, 53248, 54272, 54528, 54592, 0, + 1, 49152, 53248, 54272, 54528, 54656, 54624, 0, + 1, 49152, 53248, 54272, 54528, 54656, 54624, 0, + 1, 49152, 53248, 54272, 54528, 54656, 54624, 54626, + 0, 1, 49152, 53248, 54272, 54528, 54656, 54624, + 0, 1, 49152, 53248, 54272, 54528, 54656, 54624, + 54628, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54624, 54628, 0, 1, 49152, 53248, 54272, 54528, + 54656, 54624, 54632, 54630, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54624, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54624, 54632, 0, 1, 49152, + 53248, 54272, 54528, 54656, 54624, 54632, 0, 1, + 49152, 53248, 54272, 54528, 54656, 54624, 54632, 54634, + 0, 1, 49152, 53248, 54272, 54528, 54656, 54624, + 54632, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54624, 54640, 54636, 0, 1, 49152, 53248, 54272, + 54528, 54656, 54624, 54640, 54636, 0, 1, 49152, + 53248, 54272, 54528, 54656, 54624, 54640, 54641, 54638, + 0, 1, 49152, 53248, 54272, 54528, 54656, 54624, + 0, 1, 49152, 53248, 54272, 54528, 54656, 54657, + 54640, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54657, 54640, 0, 1, 49152, 53248, 54272, 54528, + 54656, 54657, 54640, 54642, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54657, 54640, 0, 1, 49152, + 53248, 54272, 54528, 54656, 54657, 54640, 54644, 0, + 1, 49152, 53248, 54272, 54528, 54656, 54657, 54640, + 54644, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54657, 54640, 54648, 54646, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54657, 54640, 0, 1, 49152, + 53248, 54272, 54528, 54656, 54657, 54640, 54648, 0, + 1, 49152, 53248, 54272, 54528, 54656, 54657, 54659, + 54648, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54657, 54659, 54648, 54650, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54657, 54659, 54648, 0, 1, + 49152, 53248, 54272, 54528, 54656, 54657, 54659, 54648, + 54652, 0, 1, 49152, 53248, 54272, 54528, 54656, + 54657, 54659, 54648, 54652, 0, 1, 49152, 53248, + 54272, 54528, 54656, 54657, 54659, 54648, 54652, 54654, + 0, 1, 49152, 53248, 54272, 54528, 0, 1, + 49152, 53248, 54272, 54784, 54656, 0, 1, 49152, + 53248, 54272, 54784, 54656, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54658, 0, 1, 49152, 53248, + 54272, 54784, 54656, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54660, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54660, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54664, 54662, 0, 1, 49152, 53248, + 54272, 54784, 54656, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54664, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54664, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54664, 54666, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54664, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54672, 54668, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54672, 54668, 0, 1, + 49152, 53248, 54272, 54784, 54656, 54672, 54673, 54670, + 0, 1, 49152, 53248, 54272, 54784, 54656, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54672, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54672, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54672, 54674, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54672, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54672, + 54676, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54672, 54676, 0, 1, 49152, 53248, 54272, 54784, + 54656, 54672, 54680, 54678, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54672, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54688, 54680, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54688, 54680, 0, 1, + 49152, 53248, 54272, 54784, 54656, 54688, 54680, 54682, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54688, + 54680, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54688, 54689, 54684, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54688, 54689, 54684, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54688, 54689, 54684, 54686, + 0, 1, 49152, 53248, 54272, 54784, 54656, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54688, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54688, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54688, 54690, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54688, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54688, + 54692, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54688, 54692, 0, 1, 49152, 53248, 54272, 54784, + 54656, 54688, 54696, 54694, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54688, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54688, 54696, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54688, 54696, 0, 1, + 49152, 53248, 54272, 54784, 54656, 54688, 54696, 54698, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54688, + 54696, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54688, 54704, 54700, 0, 1, 49152, 53248, 54272, + 54784, 54656, 54688, 54704, 54700, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54688, 54704, 54705, 54702, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54688, + 0, 1, 49152, 53248, 54272, 54784, 54656, 54720, + 54704, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54720, 54704, 0, 1, 49152, 53248, 54272, 54784, + 54656, 54720, 54704, 54706, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54720, 54704, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54720, 54704, 54708, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54720, 54704, + 54708, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54720, 54704, 54712, 54710, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54720, 54704, 0, 1, 49152, + 53248, 54272, 54784, 54656, 54720, 54721, 54712, 0, + 1, 49152, 53248, 54272, 54784, 54656, 54720, 54721, + 54712, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54720, 54721, 54712, 54714, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54720, 54721, 54712, 0, 1, + 49152, 53248, 54272, 54784, 54656, 54720, 54721, 54712, + 54716, 0, 1, 49152, 53248, 54272, 54784, 54656, + 54720, 54721, 54723, 54716, 0, 1, 49152, 53248, + 54272, 54784, 54656, 54720, 54721, 54723, 54716, 54718, + 0, 1, 49152, 53248, 54272, 54784, 54656, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54720, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54720, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54720, 54722, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 54724, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54724, 0, 1, 49152, 53248, 54272, 54784, + 54785, 54720, 54728, 54726, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 54728, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54720, 54728, 0, 1, + 49152, 53248, 54272, 54784, 54785, 54720, 54728, 54730, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 54728, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54736, 54732, 0, 1, 49152, 53248, 54272, + 54784, 54785, 54720, 54736, 54732, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54720, 54736, 54737, 54734, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 54736, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54736, 0, 1, 49152, 53248, 54272, 54784, + 54785, 54720, 54736, 54738, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 54736, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54720, 54736, 54740, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54720, 54736, + 54740, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54736, 54744, 54742, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 54736, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54720, 54752, 54744, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54720, 54752, + 54744, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54752, 54744, 54746, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 54752, 54744, 0, 1, + 49152, 53248, 54272, 54784, 54785, 54720, 54752, 54753, + 54748, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54720, 54752, 54753, 54748, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54720, 54752, 54753, 54748, 54750, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54720, + 54752, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54752, 0, 1, 49152, 53248, 54272, 54784, + 54785, 54787, 54752, 54754, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54752, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54787, 54752, 54756, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54787, 54752, + 54756, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54752, 54760, 54758, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54752, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54787, 54752, 54760, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54787, 54752, + 54760, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54752, 54760, 54762, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54752, 54760, 0, 1, + 49152, 53248, 54272, 54784, 54785, 54787, 54752, 54768, + 54764, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54752, 54768, 54764, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54752, 54768, 54769, 54766, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54787, + 54752, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54752, 54768, 0, 1, 49152, 53248, 54272, + 54784, 54785, 54787, 54752, 54768, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54787, 54752, 54768, 54770, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54787, + 54791, 54768, 0, 1, 49152, 53248, 54272, 54784, + 54785, 54787, 54791, 54768, 54772, 0, 1, 49152, + 53248, 54272, 54784, 54785, 54787, 54791, 54768, 54772, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54787, + 54791, 54768, 54776, 54774, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54791, 54768, 0, 1, + 49152, 53248, 54272, 54784, 54785, 54787, 54791, 54768, + 54776, 0, 1, 49152, 53248, 54272, 54784, 54785, + 54787, 54791, 54768, 54776, 0, 1, 49152, 53248, + 54272, 54784, 54785, 54787, 54791, 54768, 54776, 54778, + 0, 1, 49152, 53248, 54272, 54784, 54785, 54787, + 54791, 54768, 54776, 0, 1, 49152, 53248, 54272, + 54784, 54785, 54787, 54791, 54768, 54776, 54780, 0, + 1, 49152, 53248, 54272, 54784, 54785, 54787, 54791, + 54768, 54776, 54780, 0, 1, 49152, 53248, 54272, + 54784, 54785, 54787, 54791, 54768, 54776, 54780, 54782, + 0, 1, 49152, 53248, 54272, 0, 1, 49152, + 53248, 55296, 54784, 0, 1, 49152, 53248, 55296, + 54784, 0, 1, 49152, 53248, 55296, 54784, 54786, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 54788, 0, 1, 49152, + 53248, 55296, 54784, 54788, 0, 1, 49152, 53248, + 55296, 54784, 54792, 54790, 0, 1, 49152, 53248, + 55296, 54784, 0, 1, 49152, 53248, 55296, 54784, + 54792, 0, 1, 49152, 53248, 55296, 54784, 54792, + 0, 1, 49152, 53248, 55296, 54784, 54792, 54794, + 0, 1, 49152, 53248, 55296, 54784, 54792, 0, + 1, 49152, 53248, 55296, 54784, 54800, 54796, 0, + 1, 49152, 53248, 55296, 54784, 54800, 54796, 0, + 1, 49152, 53248, 55296, 54784, 54800, 54801, 54798, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 54800, 0, 1, 49152, + 53248, 55296, 54784, 54800, 0, 1, 49152, 53248, + 55296, 54784, 54800, 54802, 0, 1, 49152, 53248, + 55296, 54784, 54800, 0, 1, 49152, 53248, 55296, + 54784, 54800, 54804, 0, 1, 49152, 53248, 55296, + 54784, 54800, 54804, 0, 1, 49152, 53248, 55296, + 54784, 54800, 54808, 54806, 0, 1, 49152, 53248, + 55296, 54784, 54800, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54808, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54808, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54808, 54810, 0, 1, 49152, 53248, + 55296, 54784, 54816, 54808, 0, 1, 49152, 53248, + 55296, 54784, 54816, 54817, 54812, 0, 1, 49152, + 53248, 55296, 54784, 54816, 54817, 54812, 0, 1, + 49152, 53248, 55296, 54784, 54816, 54817, 54812, 54814, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 54816, 0, 1, 49152, + 53248, 55296, 54784, 54816, 0, 1, 49152, 53248, + 55296, 54784, 54816, 54818, 0, 1, 49152, 53248, + 55296, 54784, 54816, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54820, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54820, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54824, 54822, 0, 1, 49152, 53248, + 55296, 54784, 54816, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54824, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54824, 0, 1, 49152, 53248, 55296, + 54784, 54816, 54824, 54826, 0, 1, 49152, 53248, + 55296, 54784, 54816, 54824, 0, 1, 49152, 53248, + 55296, 54784, 54816, 54832, 54828, 0, 1, 49152, + 53248, 55296, 54784, 54816, 54832, 54828, 0, 1, + 49152, 53248, 55296, 54784, 54816, 54832, 54833, 54830, + 0, 1, 49152, 53248, 55296, 54784, 54816, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54832, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54832, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54832, 54834, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54832, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54832, + 54836, 0, 1, 49152, 53248, 55296, 54784, 54848, + 54832, 54836, 0, 1, 49152, 53248, 55296, 54784, + 54848, 54832, 54840, 54838, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54832, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54849, 54840, 0, 1, 49152, + 53248, 55296, 54784, 54848, 54849, 54840, 0, 1, + 49152, 53248, 55296, 54784, 54848, 54849, 54840, 54842, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54849, + 54840, 0, 1, 49152, 53248, 55296, 54784, 54848, + 54849, 54840, 54844, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54849, 54851, 54844, 0, 1, 49152, + 53248, 55296, 54784, 54848, 54849, 54851, 54844, 54846, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 54848, 0, 1, 49152, + 53248, 55296, 54784, 54848, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54850, 0, 1, 49152, 53248, + 55296, 54784, 54848, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54852, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54852, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54856, 54854, 0, 1, 49152, 53248, + 55296, 54784, 54848, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54856, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54856, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54856, 54858, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54856, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54864, 54860, 0, 1, 49152, + 53248, 55296, 54784, 54848, 54864, 54860, 0, 1, + 49152, 53248, 55296, 54784, 54848, 54864, 54865, 54862, + 0, 1, 49152, 53248, 55296, 54784, 54848, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54864, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54864, 0, + 1, 49152, 53248, 55296, 54784, 54848, 54864, 54866, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54864, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54864, + 54868, 0, 1, 49152, 53248, 55296, 54784, 54848, + 54864, 54868, 0, 1, 49152, 53248, 55296, 54784, + 54848, 54864, 54872, 54870, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54864, 0, 1, 49152, 53248, + 55296, 54784, 54848, 54880, 54872, 0, 1, 49152, + 53248, 55296, 54784, 54848, 54880, 54872, 0, 1, + 49152, 53248, 55296, 54784, 54848, 54880, 54872, 54874, + 0, 1, 49152, 53248, 55296, 54784, 54848, 54880, + 54872, 0, 1, 49152, 53248, 55296, 54784, 54848, + 54880, 54881, 54876, 0, 1, 49152, 53248, 55296, + 54784, 54848, 54880, 54881, 54876, 0, 1, 49152, + 53248, 55296, 54784, 54848, 54880, 54881, 54876, 54878, + 0, 1, 49152, 53248, 55296, 54784, 54848, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54880, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54880, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54880, 54882, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54880, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54880, + 54884, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54880, 54884, 0, 1, 49152, 53248, 55296, 54784, + 54912, 54880, 54888, 54886, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54880, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54880, 54888, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54880, 54888, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54880, 54888, 54890, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54880, + 54888, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54880, 54896, 54892, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54880, 54896, 54892, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54880, 54896, 54897, 54894, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54880, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54913, + 54896, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54913, 54896, 0, 1, 49152, 53248, 55296, 54784, + 54912, 54913, 54896, 54898, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54913, 54896, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54913, 54896, 54900, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54913, 54896, + 54900, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54913, 54896, 54904, 54902, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54913, 54896, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54913, 54896, 54904, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54913, 54915, + 54904, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54913, 54915, 54904, 54906, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54913, 54915, 54904, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54913, 54915, 54904, + 54908, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54913, 54915, 54904, 54908, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54913, 54915, 54904, 54908, 54910, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 54912, 0, 1, 49152, + 53248, 55296, 54784, 54912, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54914, 0, 1, 49152, 53248, + 55296, 54784, 54912, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54916, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54916, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54920, 54918, 0, 1, 49152, 53248, + 55296, 54784, 54912, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54920, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54920, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54920, 54922, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54920, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54928, 54924, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54928, 54924, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54928, 54929, 54926, + 0, 1, 49152, 53248, 55296, 54784, 54912, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54928, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54928, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54928, 54930, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54928, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54928, + 54932, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54928, 54932, 0, 1, 49152, 53248, 55296, 54784, + 54912, 54928, 54936, 54934, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54928, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54944, 54936, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54944, 54936, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54944, 54936, 54938, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54944, + 54936, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54944, 54945, 54940, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54944, 54945, 54940, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54944, 54945, 54940, 54942, + 0, 1, 49152, 53248, 55296, 54784, 54912, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54944, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54944, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54944, 54946, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54944, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54944, + 54948, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54944, 54948, 0, 1, 49152, 53248, 55296, 54784, + 54912, 54944, 54952, 54950, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54944, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54944, 54952, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54944, 54952, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54944, 54952, 54954, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54944, + 54952, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54944, 54960, 54956, 0, 1, 49152, 53248, 55296, + 54784, 54912, 54944, 54960, 54956, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54944, 54960, 54961, 54958, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54944, + 0, 1, 49152, 53248, 55296, 54784, 54912, 54976, + 54960, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54976, 54960, 0, 1, 49152, 53248, 55296, 54784, + 54912, 54976, 54960, 54962, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54976, 54960, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54976, 54960, 54964, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54976, 54960, + 54964, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54976, 54960, 54968, 54966, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54976, 54960, 0, 1, 49152, + 53248, 55296, 54784, 54912, 54976, 54977, 54968, 0, + 1, 49152, 53248, 55296, 54784, 54912, 54976, 54977, + 54968, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54976, 54977, 54968, 54970, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54976, 54977, 54968, 0, 1, + 49152, 53248, 55296, 54784, 54912, 54976, 54977, 54968, + 54972, 0, 1, 49152, 53248, 55296, 54784, 54912, + 54976, 54977, 54979, 54972, 0, 1, 49152, 53248, + 55296, 54784, 54912, 54976, 54977, 54979, 54972, 54974, + 0, 1, 49152, 53248, 55296, 54784, 54912, 0, + 1, 49152, 53248, 55296, 54784, 55040, 54976, 0, + 1, 49152, 53248, 55296, 54784, 55040, 54976, 0, + 1, 49152, 53248, 55296, 54784, 55040, 54976, 54978, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 54980, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 54980, 0, 1, 49152, 53248, 55296, 54784, + 55040, 54976, 54984, 54982, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 54984, 0, 1, 49152, + 53248, 55296, 54784, 55040, 54976, 54984, 0, 1, + 49152, 53248, 55296, 54784, 55040, 54976, 54984, 54986, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 54984, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 54992, 54988, 0, 1, 49152, 53248, 55296, + 54784, 55040, 54976, 54992, 54988, 0, 1, 49152, + 53248, 55296, 54784, 55040, 54976, 54992, 54993, 54990, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 54992, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 54992, 0, 1, 49152, 53248, 55296, 54784, + 55040, 54976, 54992, 54994, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 54992, 0, 1, 49152, + 53248, 55296, 54784, 55040, 54976, 54992, 54996, 0, + 1, 49152, 53248, 55296, 54784, 55040, 54976, 54992, + 54996, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 54992, 55000, 54998, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 54992, 0, 1, 49152, + 53248, 55296, 54784, 55040, 54976, 55008, 55000, 0, + 1, 49152, 53248, 55296, 54784, 55040, 54976, 55008, + 55000, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 55008, 55000, 55002, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 55008, 55000, 0, 1, + 49152, 53248, 55296, 54784, 55040, 54976, 55008, 55009, + 55004, 0, 1, 49152, 53248, 55296, 54784, 55040, + 54976, 55008, 55009, 55004, 0, 1, 49152, 53248, + 55296, 54784, 55040, 54976, 55008, 55009, 55004, 55006, + 0, 1, 49152, 53248, 55296, 54784, 55040, 54976, + 0, 1, 49152, 53248, 55296, 54784, 55040, 55041, + 55008, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55008, 0, 1, 49152, 53248, 55296, 54784, + 55040, 55041, 55008, 55010, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55008, 0, 1, 49152, + 53248, 55296, 54784, 55040, 55041, 55008, 55012, 0, + 1, 49152, 53248, 55296, 54784, 55040, 55041, 55008, + 55012, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55008, 55016, 55014, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55008, 0, 1, 49152, + 53248, 55296, 54784, 55040, 55041, 55008, 55016, 0, + 1, 49152, 53248, 55296, 54784, 55040, 55041, 55008, + 55016, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55008, 55016, 55018, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55008, 55016, 0, 1, + 49152, 53248, 55296, 54784, 55040, 55041, 55008, 55024, + 55020, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55008, 55024, 55020, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55008, 55024, 55025, 55022, + 0, 1, 49152, 53248, 55296, 54784, 55040, 55041, + 55008, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55008, 55024, 0, 1, 49152, 53248, 55296, + 54784, 55040, 55041, 55043, 55024, 0, 1, 49152, + 53248, 55296, 54784, 55040, 55041, 55043, 55024, 55026, + 0, 1, 49152, 53248, 55296, 54784, 55040, 55041, + 55043, 55024, 0, 1, 49152, 53248, 55296, 54784, + 55040, 55041, 55043, 55024, 55028, 0, 1, 49152, + 53248, 55296, 54784, 55040, 55041, 55043, 55024, 55028, + 0, 1, 49152, 53248, 55296, 54784, 55040, 55041, + 55043, 55024, 55032, 55030, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55043, 55024, 0, 1, + 49152, 53248, 55296, 54784, 55040, 55041, 55043, 55024, + 55032, 0, 1, 49152, 53248, 55296, 54784, 55040, + 55041, 55043, 55024, 55032, 0, 1, 49152, 53248, + 55296, 54784, 55040, 55041, 55043, 55024, 55032, 55034, + 0, 1, 49152, 53248, 55296, 54784, 55040, 55041, + 55043, 55047, 55032, 0, 1, 49152, 53248, 55296, + 54784, 55040, 55041, 55043, 55047, 55032, 55036, 0, + 1, 49152, 53248, 55296, 54784, 55040, 55041, 55043, + 55047, 55032, 55036, 0, 1, 49152, 53248, 55296, + 54784, 55040, 55041, 55043, 55047, 55032, 55036, 55038, + 0, 1, 49152, 53248, 55296, 54784, 0, 1, + 49152, 53248, 55296, 54784, 55040, 0, 1, 49152, + 53248, 55296, 55297, 55040, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55042, 0, 1, 49152, 53248, + 55296, 55297, 55040, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55044, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55044, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55048, 55046, 0, 1, 49152, 53248, + 55296, 55297, 55040, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55048, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55048, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55048, 55050, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55048, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55056, 55052, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55056, 55052, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55056, 55057, 55054, + 0, 1, 49152, 53248, 55296, 55297, 55040, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55056, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55056, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55056, 55058, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55056, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55056, + 55060, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55056, 55060, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55056, 55064, 55062, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55056, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55072, 55064, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55072, 55064, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55072, 55064, 55066, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55072, + 55064, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55072, 55073, 55068, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55072, 55073, 55068, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55072, 55073, 55068, 55070, + 0, 1, 49152, 53248, 55296, 55297, 55040, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55072, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55072, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55072, 55074, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55072, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55072, + 55076, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55072, 55076, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55072, 55080, 55078, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55072, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55072, 55080, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55072, 55080, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55072, 55080, 55082, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55072, + 55080, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55072, 55088, 55084, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55072, 55088, 55084, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55072, 55088, 55089, 55086, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55072, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 55088, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55088, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55104, 55088, 55090, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55088, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55088, 55092, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 55088, + 55092, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55088, 55096, 55094, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55088, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55105, 55096, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 55105, + 55096, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55105, 55096, 55098, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55105, 55096, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55104, 55105, 55096, + 55100, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55105, 55107, 55100, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55105, 55107, 55100, 55102, + 0, 1, 49152, 53248, 55296, 55297, 55040, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 55106, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 55108, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55108, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55104, 55112, 55110, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55112, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55112, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55104, 55112, 55114, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 55112, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55120, 55116, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55104, 55120, 55116, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55120, 55121, 55118, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 55120, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55120, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55104, 55120, 55122, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55120, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55120, 55124, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 55120, + 55124, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55120, 55128, 55126, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55120, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55104, 55136, 55128, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55104, 55136, + 55128, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55136, 55128, 55130, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55136, 55128, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55104, 55136, 55137, + 55132, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55104, 55136, 55137, 55132, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55104, 55136, 55137, 55132, 55134, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55104, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55168, + 55136, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55136, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55168, 55136, 55138, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55136, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55168, 55136, 55140, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 55136, + 55140, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55136, 55144, 55142, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55136, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55168, 55136, 55144, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 55136, + 55144, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55136, 55144, 55146, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55136, 55144, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55168, 55136, 55152, + 55148, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55136, 55152, 55148, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55136, 55152, 55153, 55150, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55168, + 55136, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55169, 55152, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55168, 55169, 55152, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55168, 55169, 55152, 55154, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55168, + 55169, 55152, 0, 1, 49152, 53248, 55296, 55297, + 55040, 55168, 55169, 55152, 55156, 0, 1, 49152, + 53248, 55296, 55297, 55040, 55168, 55169, 55152, 55156, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55168, + 55169, 55152, 55160, 55158, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55169, 55152, 0, 1, + 49152, 53248, 55296, 55297, 55040, 55168, 55169, 55152, + 55160, 0, 1, 49152, 53248, 55296, 55297, 55040, + 55168, 55169, 55171, 55160, 0, 1, 49152, 53248, + 55296, 55297, 55040, 55168, 55169, 55171, 55160, 55162, + 0, 1, 49152, 53248, 55296, 55297, 55040, 55168, + 55169, 55171, 55160, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55168, 55169, 55171, 55160, 55164, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 55169, + 55171, 55160, 55164, 0, 1, 49152, 53248, 55296, + 55297, 55040, 55168, 55169, 55171, 55160, 55164, 55166, + 0, 1, 49152, 53248, 55296, 55297, 55040, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 0, + 1, 49152, 53248, 55296, 55297, 55040, 55168, 55170, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55172, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55172, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55168, 55176, 55174, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55176, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55176, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55168, 55176, 55178, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55176, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55184, 55180, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55168, 55184, 55180, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55184, 55185, 55182, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55184, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55184, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55168, 55184, 55186, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55184, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55184, 55188, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55184, + 55188, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55184, 55192, 55190, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55184, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55200, 55192, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55200, + 55192, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 55192, 55194, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 55192, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55168, 55200, 55201, + 55196, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 55201, 55196, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 55201, 55196, 55198, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55200, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55168, 55200, 55202, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55200, 55204, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55200, + 55204, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 55208, 55206, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55200, 55208, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55200, + 55208, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 55208, 55210, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 55208, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55168, 55200, 55216, + 55212, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55200, 55216, 55212, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55200, 55216, 55217, 55214, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55200, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55232, 55216, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55168, 55232, 55216, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55232, 55216, 55218, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55232, 55216, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55168, 55232, 55216, 55220, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55232, 55216, 55220, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55232, 55216, 55224, 55222, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55232, 55216, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55168, 55232, 55233, + 55224, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55232, 55233, 55224, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55232, 55233, 55224, 55226, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55232, 55233, 55224, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55168, 55232, 55233, 55224, 55228, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55232, + 55233, 55235, 55228, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55168, 55232, 55233, 55235, 55228, 55230, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55168, + 55232, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55232, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55168, 55232, 55234, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55168, 55232, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55168, 55232, 55236, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55168, 55232, + 55236, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55168, 55232, 55240, 55238, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55232, 55240, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55232, + 55240, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55240, 55242, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55240, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55303, 55232, 55248, + 55244, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55248, 55244, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55248, 55249, 55246, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55248, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55248, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55232, 55248, 55250, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55248, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55303, 55232, 55248, 55252, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55232, 55248, 55252, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55248, 55256, 55254, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55248, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55303, 55232, 55264, + 55256, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55264, 55256, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55264, 55256, 55258, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55264, 55256, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55264, 55265, 55260, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55232, + 55264, 55265, 55260, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55264, 55265, 55260, 55262, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55264, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55264, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55232, 55264, 55266, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55264, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55303, 55232, 55264, 55268, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55232, 55264, 55268, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55264, 55272, 55270, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55264, 0, 1, + 49152, 53248, 55296, 55297, 55299, 55303, 55232, 55264, + 55272, 0, 1, 49152, 53248, 55296, 55297, 55299, + 55303, 55232, 55264, 55272, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55232, 55264, 55272, 55274, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55232, 55264, 55272, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55264, 55280, 55276, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55232, + 55264, 55280, 55276, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55232, 55264, 55280, 55281, 55278, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55311, 55264, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55303, 55311, 55264, 55280, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55311, 55264, 55280, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55311, 55264, 55280, 55282, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55311, 55264, 55280, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55311, + 55264, 55280, 55284, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55311, 55264, 55280, 55284, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55311, + 55264, 55280, 55288, 55286, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55311, 55264, 55280, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55311, + 55264, 55280, 55288, 0, 1, 49152, 53248, 55296, + 55297, 55299, 55303, 55311, 55264, 55280, 55288, 0, + 1, 49152, 53248, 55296, 55297, 55299, 55303, 55311, + 55264, 55280, 55288, 55290, 0, 1, 49152, 53248, + 55296, 55297, 55299, 55303, 55311, 55264, 55280, 55288, + 0, 1, 49152, 53248, 55296, 55297, 55299, 55303, + 55311, 55264, 55280, 55288, 55292, 0, 1, 49152, + 53248, 55296, 55297, 55299, 55303, 55311, 55264, 55280, + 55288, 55292, 0, 1, 49152, 53248, 55296, 55297, + 55299, 55303, 55311, 55264, 55280, 55288, 55292, 55294, + 0, 1, 49152, 53248, 0, 1, 49152, 53248, + 55296, 0, 1, 49152, 53248, 55296, 0, 1, + 49152, 53248, 55296, 55298, 0, 1, 49152, 53248, + 55296, 0, 1, 49152, 53248, 55296, 55300, 0, + 1, 49152, 53248, 55296, 55300, 0, 1, 49152, + 53248, 55296, 55304, 55302, 0, 1, 49152, 53248, + 55296, 0, 1, 49152, 53248, 55296, 55304, 0, + 1, 49152, 53248, 55296, 55304, 0, 1, 49152, + 53248, 55296, 55304, 55306, 0, 1, 49152, 53248, + 55296, 55304, 0, 1, 49152, 53248, 55296, 55312, + 55308, 0, 1, 49152, 53248, 55296, 55312, 55308, + 0, 1, 49152, 53248, 55296, 55312, 55313, 55310, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55312, 0, 1, 49152, 53248, 55296, + 55312, 0, 1, 49152, 53248, 55296, 55312, 55314, + 0, 1, 49152, 53248, 55296, 55312, 0, 1, + 49152, 53248, 55296, 55312, 55316, 0, 1, 49152, + 53248, 55296, 55312, 55316, 0, 1, 49152, 53248, + 55296, 55312, 55320, 55318, 0, 1, 49152, 53248, + 55296, 55312, 0, 1, 49152, 53248, 55296, 55328, + 55320, 0, 1, 49152, 53248, 55296, 55328, 55320, + 0, 1, 49152, 53248, 55296, 55328, 55320, 55322, + 0, 1, 49152, 53248, 55296, 55328, 55320, 0, + 1, 49152, 53248, 55296, 55328, 55329, 55324, 0, + 1, 49152, 53248, 55296, 55328, 55329, 55324, 0, + 1, 49152, 53248, 55296, 55328, 55329, 55324, 55326, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55328, 0, 1, 49152, 53248, 55296, + 55328, 0, 1, 49152, 53248, 55296, 55328, 55330, + 0, 1, 49152, 53248, 55296, 55328, 0, 1, + 49152, 53248, 55296, 55328, 55332, 0, 1, 49152, + 53248, 55296, 55328, 55332, 0, 1, 49152, 53248, + 55296, 55328, 55336, 55334, 0, 1, 49152, 53248, + 55296, 55328, 0, 1, 49152, 53248, 55296, 55328, + 55336, 0, 1, 49152, 53248, 55296, 55328, 55336, + 0, 1, 49152, 53248, 55296, 55328, 55336, 55338, + 0, 1, 49152, 53248, 55296, 55328, 55336, 0, + 1, 49152, 53248, 55296, 55328, 55344, 55340, 0, + 1, 49152, 53248, 55296, 55328, 55344, 55340, 0, + 1, 49152, 53248, 55296, 55328, 55344, 55345, 55342, + 0, 1, 49152, 53248, 55296, 55328, 0, 1, + 49152, 53248, 55296, 55360, 55344, 0, 1, 49152, + 53248, 55296, 55360, 55344, 0, 1, 49152, 53248, + 55296, 55360, 55344, 55346, 0, 1, 49152, 53248, + 55296, 55360, 55344, 0, 1, 49152, 53248, 55296, + 55360, 55344, 55348, 0, 1, 49152, 53248, 55296, + 55360, 55344, 55348, 0, 1, 49152, 53248, 55296, + 55360, 55344, 55352, 55350, 0, 1, 49152, 53248, + 55296, 55360, 55344, 0, 1, 49152, 53248, 55296, + 55360, 55361, 55352, 0, 1, 49152, 53248, 55296, + 55360, 55361, 55352, 0, 1, 49152, 53248, 55296, + 55360, 55361, 55352, 55354, 0, 1, 49152, 53248, + 55296, 55360, 55361, 55352, 0, 1, 49152, 53248, + 55296, 55360, 55361, 55352, 55356, 0, 1, 49152, + 53248, 55296, 55360, 55361, 55363, 55356, 0, 1, + 49152, 53248, 55296, 55360, 55361, 55363, 55356, 55358, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55360, 0, 1, 49152, 53248, 55296, + 55360, 0, 1, 49152, 53248, 55296, 55360, 55362, + 0, 1, 49152, 53248, 55296, 55360, 0, 1, + 49152, 53248, 55296, 55360, 55364, 0, 1, 49152, + 53248, 55296, 55360, 55364, 0, 1, 49152, 53248, + 55296, 55360, 55368, 55366, 0, 1, 49152, 53248, + 55296, 55360, 0, 1, 49152, 53248, 55296, 55360, + 55368, 0, 1, 49152, 53248, 55296, 55360, 55368, + 0, 1, 49152, 53248, 55296, 55360, 55368, 55370, + 0, 1, 49152, 53248, 55296, 55360, 55368, 0, + 1, 49152, 53248, 55296, 55360, 55376, 55372, 0, + 1, 49152, 53248, 55296, 55360, 55376, 55372, 0, + 1, 49152, 53248, 55296, 55360, 55376, 55377, 55374, + 0, 1, 49152, 53248, 55296, 55360, 0, 1, + 49152, 53248, 55296, 55360, 55376, 0, 1, 49152, + 53248, 55296, 55360, 55376, 0, 1, 49152, 53248, + 55296, 55360, 55376, 55378, 0, 1, 49152, 53248, + 55296, 55360, 55376, 0, 1, 49152, 53248, 55296, + 55360, 55376, 55380, 0, 1, 49152, 53248, 55296, + 55360, 55376, 55380, 0, 1, 49152, 53248, 55296, + 55360, 55376, 55384, 55382, 0, 1, 49152, 53248, + 55296, 55360, 55376, 0, 1, 49152, 53248, 55296, + 55360, 55392, 55384, 0, 1, 49152, 53248, 55296, + 55360, 55392, 55384, 0, 1, 49152, 53248, 55296, + 55360, 55392, 55384, 55386, 0, 1, 49152, 53248, + 55296, 55360, 55392, 55384, 0, 1, 49152, 53248, + 55296, 55360, 55392, 55393, 55388, 0, 1, 49152, + 53248, 55296, 55360, 55392, 55393, 55388, 0, 1, + 49152, 53248, 55296, 55360, 55392, 55393, 55388, 55390, + 0, 1, 49152, 53248, 55296, 55360, 0, 1, + 49152, 53248, 55296, 55424, 55392, 0, 1, 49152, + 53248, 55296, 55424, 55392, 0, 1, 49152, 53248, + 55296, 55424, 55392, 55394, 0, 1, 49152, 53248, + 55296, 55424, 55392, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55396, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55396, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55400, 55398, 0, 1, 49152, 53248, + 55296, 55424, 55392, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55400, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55400, 0, 1, 49152, 53248, 55296, + 55424, 55392, 55400, 55402, 0, 1, 49152, 53248, + 55296, 55424, 55392, 55400, 0, 1, 49152, 53248, + 55296, 55424, 55392, 55408, 55404, 0, 1, 49152, + 53248, 55296, 55424, 55392, 55408, 55404, 0, 1, + 49152, 53248, 55296, 55424, 55392, 55408, 55409, 55406, + 0, 1, 49152, 53248, 55296, 55424, 55392, 0, + 1, 49152, 53248, 55296, 55424, 55425, 55408, 0, + 1, 49152, 53248, 55296, 55424, 55425, 55408, 0, + 1, 49152, 53248, 55296, 55424, 55425, 55408, 55410, + 0, 1, 49152, 53248, 55296, 55424, 55425, 55408, + 0, 1, 49152, 53248, 55296, 55424, 55425, 55408, + 55412, 0, 1, 49152, 53248, 55296, 55424, 55425, + 55408, 55412, 0, 1, 49152, 53248, 55296, 55424, + 55425, 55408, 55416, 55414, 0, 1, 49152, 53248, + 55296, 55424, 55425, 55408, 0, 1, 49152, 53248, + 55296, 55424, 55425, 55408, 55416, 0, 1, 49152, + 53248, 55296, 55424, 55425, 55427, 55416, 0, 1, + 49152, 53248, 55296, 55424, 55425, 55427, 55416, 55418, + 0, 1, 49152, 53248, 55296, 55424, 55425, 55427, + 55416, 0, 1, 49152, 53248, 55296, 55424, 55425, + 55427, 55416, 55420, 0, 1, 49152, 53248, 55296, + 55424, 55425, 55427, 55416, 55420, 0, 1, 49152, + 53248, 55296, 55424, 55425, 55427, 55416, 55420, 55422, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55424, 0, 1, 49152, 53248, 55296, + 55424, 0, 1, 49152, 53248, 55296, 55424, 55426, + 0, 1, 49152, 53248, 55296, 55424, 0, 1, + 49152, 53248, 55296, 55424, 55428, 0, 1, 49152, + 53248, 55296, 55424, 55428, 0, 1, 49152, 53248, + 55296, 55424, 55432, 55430, 0, 1, 49152, 53248, + 55296, 55424, 0, 1, 49152, 53248, 55296, 55424, + 55432, 0, 1, 49152, 53248, 55296, 55424, 55432, + 0, 1, 49152, 53248, 55296, 55424, 55432, 55434, + 0, 1, 49152, 53248, 55296, 55424, 55432, 0, + 1, 49152, 53248, 55296, 55424, 55440, 55436, 0, + 1, 49152, 53248, 55296, 55424, 55440, 55436, 0, + 1, 49152, 53248, 55296, 55424, 55440, 55441, 55438, + 0, 1, 49152, 53248, 55296, 55424, 0, 1, + 49152, 53248, 55296, 55424, 55440, 0, 1, 49152, + 53248, 55296, 55424, 55440, 0, 1, 49152, 53248, + 55296, 55424, 55440, 55442, 0, 1, 49152, 53248, + 55296, 55424, 55440, 0, 1, 49152, 53248, 55296, + 55424, 55440, 55444, 0, 1, 49152, 53248, 55296, + 55424, 55440, 55444, 0, 1, 49152, 53248, 55296, + 55424, 55440, 55448, 55446, 0, 1, 49152, 53248, + 55296, 55424, 55440, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55448, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55448, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55448, 55450, 0, 1, 49152, 53248, + 55296, 55424, 55456, 55448, 0, 1, 49152, 53248, + 55296, 55424, 55456, 55457, 55452, 0, 1, 49152, + 53248, 55296, 55424, 55456, 55457, 55452, 0, 1, + 49152, 53248, 55296, 55424, 55456, 55457, 55452, 55454, + 0, 1, 49152, 53248, 55296, 55424, 0, 1, + 49152, 53248, 55296, 55424, 55456, 0, 1, 49152, + 53248, 55296, 55424, 55456, 0, 1, 49152, 53248, + 55296, 55424, 55456, 55458, 0, 1, 49152, 53248, + 55296, 55424, 55456, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55460, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55460, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55464, 55462, 0, 1, 49152, 53248, + 55296, 55424, 55456, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55464, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55464, 0, 1, 49152, 53248, 55296, + 55424, 55456, 55464, 55466, 0, 1, 49152, 53248, + 55296, 55424, 55456, 55464, 0, 1, 49152, 53248, + 55296, 55424, 55456, 55472, 55468, 0, 1, 49152, + 53248, 55296, 55424, 55456, 55472, 55468, 0, 1, + 49152, 53248, 55296, 55424, 55456, 55472, 55473, 55470, + 0, 1, 49152, 53248, 55296, 55424, 55456, 0, + 1, 49152, 53248, 55296, 55424, 55488, 55472, 0, + 1, 49152, 53248, 55296, 55424, 55488, 55472, 0, + 1, 49152, 53248, 55296, 55424, 55488, 55472, 55474, + 0, 1, 49152, 53248, 55296, 55424, 55488, 55472, + 0, 1, 49152, 53248, 55296, 55424, 55488, 55472, + 55476, 0, 1, 49152, 53248, 55296, 55424, 55488, + 55472, 55476, 0, 1, 49152, 53248, 55296, 55424, + 55488, 55472, 55480, 55478, 0, 1, 49152, 53248, + 55296, 55424, 55488, 55472, 0, 1, 49152, 53248, + 55296, 55424, 55488, 55489, 55480, 0, 1, 49152, + 53248, 55296, 55424, 55488, 55489, 55480, 0, 1, + 49152, 53248, 55296, 55424, 55488, 55489, 55480, 55482, + 0, 1, 49152, 53248, 55296, 55424, 55488, 55489, + 55480, 0, 1, 49152, 53248, 55296, 55424, 55488, + 55489, 55480, 55484, 0, 1, 49152, 53248, 55296, + 55424, 55488, 55489, 55491, 55484, 0, 1, 49152, + 53248, 55296, 55424, 55488, 55489, 55491, 55484, 55486, + 0, 1, 49152, 53248, 55296, 55424, 0, 1, + 49152, 53248, 55296, 55552, 55488, 0, 1, 49152, + 53248, 55296, 55552, 55488, 0, 1, 49152, 53248, + 55296, 55552, 55488, 55490, 0, 1, 49152, 53248, + 55296, 55552, 55488, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55492, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55492, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55496, 55494, 0, 1, 49152, 53248, + 55296, 55552, 55488, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55496, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55496, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55496, 55498, 0, 1, 49152, 53248, + 55296, 55552, 55488, 55496, 0, 1, 49152, 53248, + 55296, 55552, 55488, 55504, 55500, 0, 1, 49152, + 53248, 55296, 55552, 55488, 55504, 55500, 0, 1, + 49152, 53248, 55296, 55552, 55488, 55504, 55505, 55502, + 0, 1, 49152, 53248, 55296, 55552, 55488, 0, + 1, 49152, 53248, 55296, 55552, 55488, 55504, 0, + 1, 49152, 53248, 55296, 55552, 55488, 55504, 0, + 1, 49152, 53248, 55296, 55552, 55488, 55504, 55506, + 0, 1, 49152, 53248, 55296, 55552, 55488, 55504, + 0, 1, 49152, 53248, 55296, 55552, 55488, 55504, + 55508, 0, 1, 49152, 53248, 55296, 55552, 55488, + 55504, 55508, 0, 1, 49152, 53248, 55296, 55552, + 55488, 55504, 55512, 55510, 0, 1, 49152, 53248, + 55296, 55552, 55488, 55504, 0, 1, 49152, 53248, + 55296, 55552, 55488, 55520, 55512, 0, 1, 49152, + 53248, 55296, 55552, 55488, 55520, 55512, 0, 1, + 49152, 53248, 55296, 55552, 55488, 55520, 55512, 55514, + 0, 1, 49152, 53248, 55296, 55552, 55488, 55520, + 55512, 0, 1, 49152, 53248, 55296, 55552, 55488, + 55520, 55521, 55516, 0, 1, 49152, 53248, 55296, + 55552, 55488, 55520, 55521, 55516, 0, 1, 49152, + 53248, 55296, 55552, 55488, 55520, 55521, 55516, 55518, + 0, 1, 49152, 53248, 55296, 55552, 55488, 0, + 1, 49152, 53248, 55296, 55552, 55553, 55520, 0, + 1, 49152, 53248, 55296, 55552, 55553, 55520, 0, + 1, 49152, 53248, 55296, 55552, 55553, 55520, 55522, + 0, 1, 49152, 53248, 55296, 55552, 55553, 55520, + 0, 1, 49152, 53248, 55296, 55552, 55553, 55520, + 55524, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55520, 55524, 0, 1, 49152, 53248, 55296, 55552, + 55553, 55520, 55528, 55526, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55520, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55520, 55528, 0, 1, 49152, + 53248, 55296, 55552, 55553, 55520, 55528, 0, 1, + 49152, 53248, 55296, 55552, 55553, 55520, 55528, 55530, + 0, 1, 49152, 53248, 55296, 55552, 55553, 55520, + 55528, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55520, 55536, 55532, 0, 1, 49152, 53248, 55296, + 55552, 55553, 55520, 55536, 55532, 0, 1, 49152, + 53248, 55296, 55552, 55553, 55520, 55536, 55537, 55534, + 0, 1, 49152, 53248, 55296, 55552, 55553, 55520, + 0, 1, 49152, 53248, 55296, 55552, 55553, 55520, + 55536, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55555, 55536, 0, 1, 49152, 53248, 55296, 55552, + 55553, 55555, 55536, 55538, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55555, 55536, 0, 1, 49152, + 53248, 55296, 55552, 55553, 55555, 55536, 55540, 0, + 1, 49152, 53248, 55296, 55552, 55553, 55555, 55536, + 55540, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55555, 55536, 55544, 55542, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55555, 55536, 0, 1, 49152, + 53248, 55296, 55552, 55553, 55555, 55536, 55544, 0, + 1, 49152, 53248, 55296, 55552, 55553, 55555, 55536, + 55544, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55555, 55536, 55544, 55546, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55555, 55559, 55544, 0, 1, + 49152, 53248, 55296, 55552, 55553, 55555, 55559, 55544, + 55548, 0, 1, 49152, 53248, 55296, 55552, 55553, + 55555, 55559, 55544, 55548, 0, 1, 49152, 53248, + 55296, 55552, 55553, 55555, 55559, 55544, 55548, 55550, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55552, 0, 1, 49152, 53248, 55296, + 55552, 0, 1, 49152, 53248, 55296, 55552, 55554, + 0, 1, 49152, 53248, 55296, 55552, 0, 1, + 49152, 53248, 55296, 55552, 55556, 0, 1, 49152, + 53248, 55296, 55552, 55556, 0, 1, 49152, 53248, + 55296, 55552, 55560, 55558, 0, 1, 49152, 53248, + 55296, 55552, 0, 1, 49152, 53248, 55296, 55552, + 55560, 0, 1, 49152, 53248, 55296, 55552, 55560, + 0, 1, 49152, 53248, 55296, 55552, 55560, 55562, + 0, 1, 49152, 53248, 55296, 55552, 55560, 0, + 1, 49152, 53248, 55296, 55552, 55568, 55564, 0, + 1, 49152, 53248, 55296, 55552, 55568, 55564, 0, + 1, 49152, 53248, 55296, 55552, 55568, 55569, 55566, + 0, 1, 49152, 53248, 55296, 55552, 0, 1, + 49152, 53248, 55296, 55552, 55568, 0, 1, 49152, + 53248, 55296, 55552, 55568, 0, 1, 49152, 53248, + 55296, 55552, 55568, 55570, 0, 1, 49152, 53248, + 55296, 55552, 55568, 0, 1, 49152, 53248, 55296, + 55552, 55568, 55572, 0, 1, 49152, 53248, 55296, + 55552, 55568, 55572, 0, 1, 49152, 53248, 55296, + 55552, 55568, 55576, 55574, 0, 1, 49152, 53248, + 55296, 55552, 55568, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55576, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55576, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55576, 55578, 0, 1, 49152, 53248, + 55296, 55552, 55584, 55576, 0, 1, 49152, 53248, + 55296, 55552, 55584, 55585, 55580, 0, 1, 49152, + 53248, 55296, 55552, 55584, 55585, 55580, 0, 1, + 49152, 53248, 55296, 55552, 55584, 55585, 55580, 55582, + 0, 1, 49152, 53248, 55296, 55552, 0, 1, + 49152, 53248, 55296, 55552, 55584, 0, 1, 49152, + 53248, 55296, 55552, 55584, 0, 1, 49152, 53248, + 55296, 55552, 55584, 55586, 0, 1, 49152, 53248, + 55296, 55552, 55584, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55588, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55588, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55592, 55590, 0, 1, 49152, 53248, + 55296, 55552, 55584, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55592, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55592, 0, 1, 49152, 53248, 55296, + 55552, 55584, 55592, 55594, 0, 1, 49152, 53248, + 55296, 55552, 55584, 55592, 0, 1, 49152, 53248, + 55296, 55552, 55584, 55600, 55596, 0, 1, 49152, + 53248, 55296, 55552, 55584, 55600, 55596, 0, 1, + 49152, 53248, 55296, 55552, 55584, 55600, 55601, 55598, + 0, 1, 49152, 53248, 55296, 55552, 55584, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55600, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55600, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55600, 55602, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55600, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55600, + 55604, 0, 1, 49152, 53248, 55296, 55552, 55616, + 55600, 55604, 0, 1, 49152, 53248, 55296, 55552, + 55616, 55600, 55608, 55606, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55600, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55617, 55608, 0, 1, 49152, + 53248, 55296, 55552, 55616, 55617, 55608, 0, 1, + 49152, 53248, 55296, 55552, 55616, 55617, 55608, 55610, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55617, + 55608, 0, 1, 49152, 53248, 55296, 55552, 55616, + 55617, 55608, 55612, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55617, 55619, 55612, 0, 1, 49152, + 53248, 55296, 55552, 55616, 55617, 55619, 55612, 55614, + 0, 1, 49152, 53248, 55296, 55552, 0, 1, + 49152, 53248, 55296, 55552, 55616, 0, 1, 49152, + 53248, 55296, 55552, 55616, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55618, 0, 1, 49152, 53248, + 55296, 55552, 55616, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55620, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55620, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55624, 55622, 0, 1, 49152, 53248, + 55296, 55552, 55616, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55624, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55624, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55624, 55626, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55624, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55632, 55628, 0, 1, 49152, + 53248, 55296, 55552, 55616, 55632, 55628, 0, 1, + 49152, 53248, 55296, 55552, 55616, 55632, 55633, 55630, + 0, 1, 49152, 53248, 55296, 55552, 55616, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55632, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55632, 0, + 1, 49152, 53248, 55296, 55552, 55616, 55632, 55634, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55632, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55632, + 55636, 0, 1, 49152, 53248, 55296, 55552, 55616, + 55632, 55636, 0, 1, 49152, 53248, 55296, 55552, + 55616, 55632, 55640, 55638, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55632, 0, 1, 49152, 53248, + 55296, 55552, 55616, 55648, 55640, 0, 1, 49152, + 53248, 55296, 55552, 55616, 55648, 55640, 0, 1, + 49152, 53248, 55296, 55552, 55616, 55648, 55640, 55642, + 0, 1, 49152, 53248, 55296, 55552, 55616, 55648, + 55640, 0, 1, 49152, 53248, 55296, 55552, 55616, + 55648, 55649, 55644, 0, 1, 49152, 53248, 55296, + 55552, 55616, 55648, 55649, 55644, 0, 1, 49152, + 53248, 55296, 55552, 55616, 55648, 55649, 55644, 55646, + 0, 1, 49152, 53248, 55296, 55552, 55616, 0, + 1, 49152, 53248, 55296, 55552, 55680, 55648, 0, + 1, 49152, 53248, 55296, 55552, 55680, 55648, 0, + 1, 49152, 53248, 55296, 55552, 55680, 55648, 55650, + 0, 1, 49152, 53248, 55296, 55552, 55680, 55648, + 0, 1, 49152, 53248, 55296, 55552, 55680, 55648, + 55652, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55648, 55652, 0, 1, 49152, 53248, 55296, 55552, + 55680, 55648, 55656, 55654, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55648, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55648, 55656, 0, 1, 49152, + 53248, 55296, 55552, 55680, 55648, 55656, 0, 1, + 49152, 53248, 55296, 55552, 55680, 55648, 55656, 55658, + 0, 1, 49152, 53248, 55296, 55552, 55680, 55648, + 55656, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55648, 55664, 55660, 0, 1, 49152, 53248, 55296, + 55552, 55680, 55648, 55664, 55660, 0, 1, 49152, + 53248, 55296, 55552, 55680, 55648, 55664, 55665, 55662, + 0, 1, 49152, 53248, 55296, 55552, 55680, 55648, + 0, 1, 49152, 53248, 55296, 55552, 55680, 55681, + 55664, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55681, 55664, 0, 1, 49152, 53248, 55296, 55552, + 55680, 55681, 55664, 55666, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55681, 55664, 0, 1, 49152, + 53248, 55296, 55552, 55680, 55681, 55664, 55668, 0, + 1, 49152, 53248, 55296, 55552, 55680, 55681, 55664, + 55668, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55681, 55664, 55672, 55670, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55681, 55664, 0, 1, 49152, + 53248, 55296, 55552, 55680, 55681, 55664, 55672, 0, + 1, 49152, 53248, 55296, 55552, 55680, 55681, 55683, + 55672, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55681, 55683, 55672, 55674, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55681, 55683, 55672, 0, 1, + 49152, 53248, 55296, 55552, 55680, 55681, 55683, 55672, + 55676, 0, 1, 49152, 53248, 55296, 55552, 55680, + 55681, 55683, 55672, 55676, 0, 1, 49152, 53248, + 55296, 55552, 55680, 55681, 55683, 55672, 55676, 55678, + 0, 1, 49152, 53248, 55296, 55552, 0, 1, + 49152, 53248, 55296, 55808, 55680, 0, 1, 49152, + 53248, 55296, 55808, 55680, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55682, 0, 1, 49152, 53248, + 55296, 55808, 55680, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55684, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55684, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55688, 55686, 0, 1, 49152, 53248, + 55296, 55808, 55680, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55688, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55688, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55688, 55690, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55688, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55696, 55692, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55696, 55692, 0, 1, + 49152, 53248, 55296, 55808, 55680, 55696, 55697, 55694, + 0, 1, 49152, 53248, 55296, 55808, 55680, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55696, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55696, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55696, 55698, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55696, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55696, + 55700, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55696, 55700, 0, 1, 49152, 53248, 55296, 55808, + 55680, 55696, 55704, 55702, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55696, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55712, 55704, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55712, 55704, 0, 1, + 49152, 53248, 55296, 55808, 55680, 55712, 55704, 55706, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55712, + 55704, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55712, 55713, 55708, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55712, 55713, 55708, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55712, 55713, 55708, 55710, + 0, 1, 49152, 53248, 55296, 55808, 55680, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55712, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55712, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55712, 55714, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55712, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55712, + 55716, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55712, 55716, 0, 1, 49152, 53248, 55296, 55808, + 55680, 55712, 55720, 55718, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55712, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55712, 55720, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55712, 55720, 0, 1, + 49152, 53248, 55296, 55808, 55680, 55712, 55720, 55722, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55712, + 55720, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55712, 55728, 55724, 0, 1, 49152, 53248, 55296, + 55808, 55680, 55712, 55728, 55724, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55712, 55728, 55729, 55726, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55712, + 0, 1, 49152, 53248, 55296, 55808, 55680, 55744, + 55728, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55744, 55728, 0, 1, 49152, 53248, 55296, 55808, + 55680, 55744, 55728, 55730, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55744, 55728, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55744, 55728, 55732, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55744, 55728, + 55732, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55744, 55728, 55736, 55734, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55744, 55728, 0, 1, 49152, + 53248, 55296, 55808, 55680, 55744, 55745, 55736, 0, + 1, 49152, 53248, 55296, 55808, 55680, 55744, 55745, + 55736, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55744, 55745, 55736, 55738, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55744, 55745, 55736, 0, 1, + 49152, 53248, 55296, 55808, 55680, 55744, 55745, 55736, + 55740, 0, 1, 49152, 53248, 55296, 55808, 55680, + 55744, 55745, 55747, 55740, 0, 1, 49152, 53248, + 55296, 55808, 55680, 55744, 55745, 55747, 55740, 55742, + 0, 1, 49152, 53248, 55296, 55808, 55680, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55744, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55744, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55744, 55746, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 55748, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55748, 0, 1, 49152, 53248, 55296, 55808, + 55809, 55744, 55752, 55750, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 55752, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55744, 55752, 0, 1, + 49152, 53248, 55296, 55808, 55809, 55744, 55752, 55754, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 55752, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55760, 55756, 0, 1, 49152, 53248, 55296, + 55808, 55809, 55744, 55760, 55756, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55744, 55760, 55761, 55758, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 55760, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55760, 0, 1, 49152, 53248, 55296, 55808, + 55809, 55744, 55760, 55762, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 55760, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55744, 55760, 55764, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55744, 55760, + 55764, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55760, 55768, 55766, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 55760, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55744, 55776, 55768, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55744, 55776, + 55768, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55776, 55768, 55770, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 55776, 55768, 0, 1, + 49152, 53248, 55296, 55808, 55809, 55744, 55776, 55777, + 55772, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55744, 55776, 55777, 55772, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55744, 55776, 55777, 55772, 55774, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55744, + 55776, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55776, 0, 1, 49152, 53248, 55296, 55808, + 55809, 55811, 55776, 55778, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55776, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55811, 55776, 55780, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55811, 55776, + 55780, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55776, 55784, 55782, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55776, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55811, 55776, 55784, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55811, 55776, + 55784, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55776, 55784, 55786, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55776, 55784, 0, 1, + 49152, 53248, 55296, 55808, 55809, 55811, 55776, 55792, + 55788, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55776, 55792, 55788, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55776, 55792, 55793, 55790, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55811, + 55776, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55776, 55792, 0, 1, 49152, 53248, 55296, + 55808, 55809, 55811, 55776, 55792, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55811, 55776, 55792, 55794, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55811, + 55815, 55792, 0, 1, 49152, 53248, 55296, 55808, + 55809, 55811, 55815, 55792, 55796, 0, 1, 49152, + 53248, 55296, 55808, 55809, 55811, 55815, 55792, 55796, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55811, + 55815, 55792, 55800, 55798, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55815, 55792, 0, 1, + 49152, 53248, 55296, 55808, 55809, 55811, 55815, 55792, + 55800, 0, 1, 49152, 53248, 55296, 55808, 55809, + 55811, 55815, 55792, 55800, 0, 1, 49152, 53248, + 55296, 55808, 55809, 55811, 55815, 55792, 55800, 55802, + 0, 1, 49152, 53248, 55296, 55808, 55809, 55811, + 55815, 55792, 55800, 0, 1, 49152, 53248, 55296, + 55808, 55809, 55811, 55815, 55792, 55800, 55804, 0, + 1, 49152, 53248, 55296, 55808, 55809, 55811, 55815, + 55792, 55800, 55804, 0, 1, 49152, 53248, 55296, + 55808, 55809, 55811, 55815, 55792, 55800, 55804, 55806, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 55808, 0, 1, 49152, 53248, 55296, + 55808, 0, 1, 49152, 53248, 55296, 55808, 55810, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 55808, 55812, 0, 1, 49152, + 53248, 55296, 55808, 55812, 0, 1, 49152, 53248, + 55296, 55808, 55816, 55814, 0, 1, 49152, 53248, + 55296, 55808, 0, 1, 49152, 53248, 55296, 55808, + 55816, 0, 1, 49152, 53248, 55296, 55808, 55816, + 0, 1, 49152, 53248, 55296, 55808, 55816, 55818, + 0, 1, 49152, 53248, 55296, 55808, 55816, 0, + 1, 49152, 53248, 55296, 55808, 55824, 55820, 0, + 1, 49152, 53248, 55296, 55808, 55824, 55820, 0, + 1, 49152, 53248, 55296, 55808, 55824, 55825, 55822, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 55808, 55824, 0, 1, 49152, + 53248, 55296, 55808, 55824, 0, 1, 49152, 53248, + 55296, 55808, 55824, 55826, 0, 1, 49152, 53248, + 55296, 55808, 55824, 0, 1, 49152, 53248, 55296, + 55808, 55824, 55828, 0, 1, 49152, 53248, 55296, + 55808, 55824, 55828, 0, 1, 49152, 53248, 55296, + 55808, 55824, 55832, 55830, 0, 1, 49152, 53248, + 55296, 55808, 55824, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55832, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55832, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55832, 55834, 0, 1, 49152, 53248, + 55296, 55808, 55840, 55832, 0, 1, 49152, 53248, + 55296, 55808, 55840, 55841, 55836, 0, 1, 49152, + 53248, 55296, 55808, 55840, 55841, 55836, 0, 1, + 49152, 53248, 55296, 55808, 55840, 55841, 55836, 55838, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 55808, 55840, 0, 1, 49152, + 53248, 55296, 55808, 55840, 0, 1, 49152, 53248, + 55296, 55808, 55840, 55842, 0, 1, 49152, 53248, + 55296, 55808, 55840, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55844, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55844, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55848, 55846, 0, 1, 49152, 53248, + 55296, 55808, 55840, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55848, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55848, 0, 1, 49152, 53248, 55296, + 55808, 55840, 55848, 55850, 0, 1, 49152, 53248, + 55296, 55808, 55840, 55848, 0, 1, 49152, 53248, + 55296, 55808, 55840, 55856, 55852, 0, 1, 49152, + 53248, 55296, 55808, 55840, 55856, 55852, 0, 1, + 49152, 53248, 55296, 55808, 55840, 55856, 55857, 55854, + 0, 1, 49152, 53248, 55296, 55808, 55840, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55856, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55856, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55856, 55858, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55856, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55856, + 55860, 0, 1, 49152, 53248, 55296, 55808, 55872, + 55856, 55860, 0, 1, 49152, 53248, 55296, 55808, + 55872, 55856, 55864, 55862, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55856, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55873, 55864, 0, 1, 49152, + 53248, 55296, 55808, 55872, 55873, 55864, 0, 1, + 49152, 53248, 55296, 55808, 55872, 55873, 55864, 55866, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55873, + 55864, 0, 1, 49152, 53248, 55296, 55808, 55872, + 55873, 55864, 55868, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55873, 55875, 55868, 0, 1, 49152, + 53248, 55296, 55808, 55872, 55873, 55875, 55868, 55870, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 55808, 55872, 0, 1, 49152, + 53248, 55296, 55808, 55872, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55874, 0, 1, 49152, 53248, + 55296, 55808, 55872, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55876, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55876, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55880, 55878, 0, 1, 49152, 53248, + 55296, 55808, 55872, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55880, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55880, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55880, 55882, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55880, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55888, 55884, 0, 1, 49152, + 53248, 55296, 55808, 55872, 55888, 55884, 0, 1, + 49152, 53248, 55296, 55808, 55872, 55888, 55889, 55886, + 0, 1, 49152, 53248, 55296, 55808, 55872, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55888, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55888, 0, + 1, 49152, 53248, 55296, 55808, 55872, 55888, 55890, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55888, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55888, + 55892, 0, 1, 49152, 53248, 55296, 55808, 55872, + 55888, 55892, 0, 1, 49152, 53248, 55296, 55808, + 55872, 55888, 55896, 55894, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55888, 0, 1, 49152, 53248, + 55296, 55808, 55872, 55904, 55896, 0, 1, 49152, + 53248, 55296, 55808, 55872, 55904, 55896, 0, 1, + 49152, 53248, 55296, 55808, 55872, 55904, 55896, 55898, + 0, 1, 49152, 53248, 55296, 55808, 55872, 55904, + 55896, 0, 1, 49152, 53248, 55296, 55808, 55872, + 55904, 55905, 55900, 0, 1, 49152, 53248, 55296, + 55808, 55872, 55904, 55905, 55900, 0, 1, 49152, + 53248, 55296, 55808, 55872, 55904, 55905, 55900, 55902, + 0, 1, 49152, 53248, 55296, 55808, 55872, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55904, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55904, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55904, 55906, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55904, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55904, + 55908, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55904, 55908, 0, 1, 49152, 53248, 55296, 55808, + 55936, 55904, 55912, 55910, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55904, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55904, 55912, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55904, 55912, 0, 1, + 49152, 53248, 55296, 55808, 55936, 55904, 55912, 55914, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55904, + 55912, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55904, 55920, 55916, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55904, 55920, 55916, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55904, 55920, 55921, 55918, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55904, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55937, + 55920, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55937, 55920, 0, 1, 49152, 53248, 55296, 55808, + 55936, 55937, 55920, 55922, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55937, 55920, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55937, 55920, 55924, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55937, 55920, + 55924, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55937, 55920, 55928, 55926, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55937, 55920, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55937, 55920, 55928, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55937, 55939, + 55928, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55937, 55939, 55928, 55930, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55937, 55939, 55928, 0, 1, + 49152, 53248, 55296, 55808, 55936, 55937, 55939, 55928, + 55932, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55937, 55939, 55928, 55932, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55937, 55939, 55928, 55932, 55934, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 55808, 55936, 0, 1, 49152, + 53248, 55296, 55808, 55936, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55938, 0, 1, 49152, 53248, + 55296, 55808, 55936, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55940, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55940, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55944, 55942, 0, 1, 49152, 53248, + 55296, 55808, 55936, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55944, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55944, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55944, 55946, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55944, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55952, 55948, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55952, 55948, 0, 1, + 49152, 53248, 55296, 55808, 55936, 55952, 55953, 55950, + 0, 1, 49152, 53248, 55296, 55808, 55936, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55952, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55952, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55952, 55954, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55952, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55952, + 55956, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55952, 55956, 0, 1, 49152, 53248, 55296, 55808, + 55936, 55952, 55960, 55958, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55952, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55968, 55960, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55968, 55960, 0, 1, + 49152, 53248, 55296, 55808, 55936, 55968, 55960, 55962, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55968, + 55960, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55968, 55969, 55964, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55968, 55969, 55964, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55968, 55969, 55964, 55966, + 0, 1, 49152, 53248, 55296, 55808, 55936, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55968, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55968, 0, + 1, 49152, 53248, 55296, 55808, 55936, 55968, 55970, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55968, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55968, + 55972, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55968, 55972, 0, 1, 49152, 53248, 55296, 55808, + 55936, 55968, 55976, 55974, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55968, 0, 1, 49152, 53248, + 55296, 55808, 55936, 55968, 55976, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55968, 55976, 0, 1, + 49152, 53248, 55296, 55808, 55936, 55968, 55976, 55978, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55968, + 55976, 0, 1, 49152, 53248, 55296, 55808, 55936, + 55968, 55984, 55980, 0, 1, 49152, 53248, 55296, + 55808, 55936, 55968, 55984, 55980, 0, 1, 49152, + 53248, 55296, 55808, 55936, 55968, 55984, 55985, 55982, + 0, 1, 49152, 53248, 55296, 55808, 55936, 55968, + 0, 1, 49152, 53248, 55296, 55808, 55936, 56000, + 55984, 0, 1, 49152, 53248, 55296, 55808, 55936, + 56000, 55984, 0, 1, 49152, 53248, 55296, 55808, + 55936, 56000, 55984, 55986, 0, 1, 49152, 53248, + 55296, 55808, 55936, 56000, 55984, 0, 1, 49152, + 53248, 55296, 55808, 55936, 56000, 55984, 55988, 0, + 1, 49152, 53248, 55296, 55808, 55936, 56000, 55984, + 55988, 0, 1, 49152, 53248, 55296, 55808, 55936, + 56000, 55984, 55992, 55990, 0, 1, 49152, 53248, + 55296, 55808, 55936, 56000, 55984, 0, 1, 49152, + 53248, 55296, 55808, 55936, 56000, 56001, 55992, 0, + 1, 49152, 53248, 55296, 55808, 55936, 56000, 56001, + 55992, 0, 1, 49152, 53248, 55296, 55808, 55936, + 56000, 56001, 55992, 55994, 0, 1, 49152, 53248, + 55296, 55808, 55936, 56000, 56001, 55992, 0, 1, + 49152, 53248, 55296, 55808, 55936, 56000, 56001, 55992, + 55996, 0, 1, 49152, 53248, 55296, 55808, 55936, + 56000, 56001, 56003, 55996, 0, 1, 49152, 53248, + 55296, 55808, 55936, 56000, 56001, 56003, 55996, 55998, + 0, 1, 49152, 53248, 55296, 55808, 55936, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56000, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56000, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56000, 56002, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 56004, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56004, 0, 1, 49152, 53248, 55296, 55808, + 56064, 56000, 56008, 56006, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 56008, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56000, 56008, 0, 1, + 49152, 53248, 55296, 55808, 56064, 56000, 56008, 56010, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 56008, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56016, 56012, 0, 1, 49152, 53248, 55296, + 55808, 56064, 56000, 56016, 56012, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56000, 56016, 56017, 56014, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 56016, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56016, 0, 1, 49152, 53248, 55296, 55808, + 56064, 56000, 56016, 56018, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 56016, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56000, 56016, 56020, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56000, 56016, + 56020, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56016, 56024, 56022, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 56016, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56000, 56032, 56024, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56000, 56032, + 56024, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56032, 56024, 56026, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 56032, 56024, 0, 1, + 49152, 53248, 55296, 55808, 56064, 56000, 56032, 56033, + 56028, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56000, 56032, 56033, 56028, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56000, 56032, 56033, 56028, 56030, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56000, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56065, + 56032, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56032, 0, 1, 49152, 53248, 55296, 55808, + 56064, 56065, 56032, 56034, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56032, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56065, 56032, 56036, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56065, 56032, + 56036, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56032, 56040, 56038, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56032, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56065, 56032, 56040, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56065, 56032, + 56040, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56032, 56040, 56042, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56032, 56040, 0, 1, + 49152, 53248, 55296, 55808, 56064, 56065, 56032, 56048, + 56044, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56032, 56048, 56044, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56032, 56048, 56049, 56046, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56065, + 56032, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56032, 56048, 0, 1, 49152, 53248, 55296, + 55808, 56064, 56065, 56067, 56048, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56065, 56067, 56048, 56050, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56065, + 56067, 56048, 0, 1, 49152, 53248, 55296, 55808, + 56064, 56065, 56067, 56048, 56052, 0, 1, 49152, + 53248, 55296, 55808, 56064, 56065, 56067, 56048, 56052, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56065, + 56067, 56048, 56056, 56054, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56067, 56048, 0, 1, + 49152, 53248, 55296, 55808, 56064, 56065, 56067, 56048, + 56056, 0, 1, 49152, 53248, 55296, 55808, 56064, + 56065, 56067, 56048, 56056, 0, 1, 49152, 53248, + 55296, 55808, 56064, 56065, 56067, 56048, 56056, 56058, + 0, 1, 49152, 53248, 55296, 55808, 56064, 56065, + 56067, 56071, 56056, 0, 1, 49152, 53248, 55296, + 55808, 56064, 56065, 56067, 56071, 56056, 56060, 0, + 1, 49152, 53248, 55296, 55808, 56064, 56065, 56067, + 56071, 56056, 56060, 0, 1, 49152, 53248, 55296, + 55808, 56064, 56065, 56067, 56071, 56056, 56060, 56062, + 0, 1, 49152, 53248, 55296, 55808, 0, 1, + 49152, 53248, 55296, 56320, 56064, 0, 1, 49152, + 53248, 55296, 56320, 56064, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56066, 0, 1, 49152, 53248, + 55296, 56320, 56064, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56068, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56068, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56072, 56070, 0, 1, 49152, 53248, + 55296, 56320, 56064, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56072, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56072, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56072, 56074, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56072, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56080, 56076, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56080, 56076, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56080, 56081, 56078, + 0, 1, 49152, 53248, 55296, 56320, 56064, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56080, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56080, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56080, 56082, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56080, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56080, + 56084, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56080, 56084, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56080, 56088, 56086, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56080, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56096, 56088, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56096, 56088, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56096, 56088, 56090, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56096, + 56088, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56096, 56097, 56092, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56096, 56097, 56092, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56096, 56097, 56092, 56094, + 0, 1, 49152, 53248, 55296, 56320, 56064, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56096, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56096, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56096, 56098, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56096, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56096, + 56100, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56096, 56100, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56096, 56104, 56102, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56096, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56096, 56104, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56096, 56104, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56096, 56104, 56106, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56096, + 56104, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56096, 56112, 56108, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56096, 56112, 56108, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56096, 56112, 56113, 56110, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56096, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 56112, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56112, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56128, 56112, 56114, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56112, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56112, 56116, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 56112, + 56116, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56112, 56120, 56118, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56112, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56129, 56120, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 56129, + 56120, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56129, 56120, 56122, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56129, 56120, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56128, 56129, 56120, + 56124, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56129, 56131, 56124, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56129, 56131, 56124, 56126, + 0, 1, 49152, 53248, 55296, 56320, 56064, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 56130, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 56132, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56132, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56128, 56136, 56134, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56136, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56136, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56128, 56136, 56138, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 56136, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56144, 56140, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56128, 56144, 56140, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56144, 56145, 56142, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 56144, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56144, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56128, 56144, 56146, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56144, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56144, 56148, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 56144, + 56148, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56144, 56152, 56150, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56144, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56128, 56160, 56152, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56128, 56160, + 56152, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56160, 56152, 56154, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56160, 56152, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56128, 56160, 56161, + 56156, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56128, 56160, 56161, 56156, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56128, 56160, 56161, 56156, 56158, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56128, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56192, + 56160, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56160, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56192, 56160, 56162, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56160, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56192, 56160, 56164, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56192, 56160, + 56164, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56160, 56168, 56166, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56160, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56192, 56160, 56168, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56192, 56160, + 56168, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56160, 56168, 56170, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56160, 56168, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56192, 56160, 56176, + 56172, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56160, 56176, 56172, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56160, 56176, 56177, 56174, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56192, + 56160, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56193, 56176, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56192, 56193, 56176, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56192, 56193, 56176, 56178, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56192, + 56193, 56176, 0, 1, 49152, 53248, 55296, 56320, + 56064, 56192, 56193, 56176, 56180, 0, 1, 49152, + 53248, 55296, 56320, 56064, 56192, 56193, 56176, 56180, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56192, + 56193, 56176, 56184, 56182, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56193, 56176, 0, 1, + 49152, 53248, 55296, 56320, 56064, 56192, 56193, 56176, + 56184, 0, 1, 49152, 53248, 55296, 56320, 56064, + 56192, 56193, 56195, 56184, 0, 1, 49152, 53248, + 55296, 56320, 56064, 56192, 56193, 56195, 56184, 56186, + 0, 1, 49152, 53248, 55296, 56320, 56064, 56192, + 56193, 56195, 56184, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56192, 56193, 56195, 56184, 56188, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56192, 56193, + 56195, 56184, 56188, 0, 1, 49152, 53248, 55296, + 56320, 56064, 56192, 56193, 56195, 56184, 56188, 56190, + 0, 1, 49152, 53248, 55296, 56320, 56064, 0, + 1, 49152, 53248, 55296, 56320, 56064, 56192, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56194, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56196, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56196, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56192, 56200, 56198, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56200, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56200, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56192, 56200, 56202, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56200, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56208, 56204, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56192, 56208, 56204, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56208, 56209, 56206, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56208, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56208, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56192, 56208, 56210, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56208, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56208, 56212, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56208, + 56212, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56208, 56216, 56214, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56208, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56224, 56216, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56224, + 56216, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 56216, 56218, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 56216, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56192, 56224, 56225, + 56220, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 56225, 56220, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 56225, 56220, 56222, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56224, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56192, 56224, 56226, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56224, 56228, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56224, + 56228, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 56232, 56230, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56224, 56232, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56224, + 56232, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 56232, 56234, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 56232, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56192, 56224, 56240, + 56236, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56224, 56240, 56236, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56224, 56240, 56241, 56238, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56224, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56256, 56240, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56192, 56256, 56240, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56256, 56240, 56242, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56256, 56240, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56192, 56256, 56240, 56244, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56192, 56256, 56240, 56244, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56256, 56240, 56248, 56246, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56256, 56240, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56192, 56256, 56257, + 56248, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56256, 56257, 56248, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56192, 56256, 56257, 56248, 56250, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56256, 56257, 56248, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56192, 56256, 56257, 56248, 56252, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56192, 56256, + 56257, 56259, 56252, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56192, 56256, 56257, 56259, 56252, 56254, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56192, + 56256, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56192, 56256, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56192, 56256, 56258, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56260, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56256, + 56260, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56264, 56262, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56264, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56256, + 56264, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56264, 56266, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 56264, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56323, 56256, 56272, + 56268, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56272, 56268, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 56272, 56273, 56270, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56272, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56256, 56272, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56272, 56274, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 56272, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56323, 56256, 56272, 56276, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56272, 56276, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 56272, 56280, 56278, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 56272, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56323, 56256, 56288, + 56280, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56288, 56280, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56256, 56288, 56280, 56282, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 56288, 56280, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56256, 56288, 56289, 56284, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56256, + 56288, 56289, 56284, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56256, 56288, 56289, 56284, 56286, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56256, 56288, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56256, 56288, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56288, 56290, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 56288, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56323, 56256, 56288, 56292, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56256, 56288, 56292, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56256, 56288, 56296, 56294, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56327, 56288, 0, 1, + 49152, 53248, 55296, 56320, 56321, 56323, 56327, 56288, + 56296, 0, 1, 49152, 53248, 55296, 56320, 56321, + 56323, 56327, 56288, 56296, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56327, 56288, 56296, 56298, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56327, 56288, 56296, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56327, 56288, 56304, 56300, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56327, + 56288, 56304, 56300, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56327, 56288, 56304, 56305, 56302, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56327, 56288, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56323, 56327, 56288, 56304, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56327, 56288, 56304, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56327, 56288, 56304, 56306, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56327, 56288, 56304, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56327, + 56288, 56304, 56308, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56327, 56288, 56304, 56308, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56327, + 56288, 56304, 56312, 56310, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56327, 56288, 56304, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56327, + 56288, 56304, 56312, 0, 1, 49152, 53248, 55296, + 56320, 56321, 56323, 56327, 56288, 56304, 56312, 0, + 1, 49152, 53248, 55296, 56320, 56321, 56323, 56327, + 56288, 56304, 56312, 56314, 0, 1, 49152, 53248, + 55296, 56320, 56321, 56323, 56327, 56288, 56304, 56312, + 0, 1, 49152, 53248, 55296, 56320, 56321, 56323, + 56327, 56288, 56304, 56312, 56316, 0, 1, 49152, + 53248, 55296, 56320, 56321, 56323, 56327, 56288, 56304, + 56312, 56316, 0, 1, 49152, 53248, 55296, 56320, + 56321, 56323, 56327, 56288, 56304, 56312, 56316, 56318, + 0, 1, 49152, 53248, 55296, 0, 1, 49152, + 53248, 55296, 56320, 0, 1, 49152, 53248, 55296, + 56320, 0, 1, 49152, 53248, 55296, 56320, 56322, + 0, 1, 49152, 53248, 55296, 56320, 0, 1, + 49152, 53248, 55296, 56320, 56324, 0, 1, 49152, + 53248, 55296, 56320, 56324, 0, 1, 49152, 53248, + 55296, 56320, 56328, 56326, 0, 1, 49152, 53248, + 55296, 56320, 0, 1, 49152, 53248, 55296, 56320, + 56328, 0, 1, 49152, 53248, 55296, 56320, 56328, + 0, 1, 49152, 53248, 55296, 56320, 56328, 56330, + 0, 1, 49152, 53248, 55296, 56320, 56328, 0, + 1, 49152, 53248, 55296, 56320, 56336, 56332, 0, + 1, 49152, 53248, 55296, 56320, 56336, 56332, 0, + 1, 49152, 53248, 55296, 56320, 56336, 56337, 56334, + 0, 1, 49152, 53248, 55296, 56320, 0, 1, + 49152, 53248, 55296, 56320, 56336, 0, 1, 49152, + 53248, 55296, 56320, 56336, 0, 1, 49152, 53248, + 55296, 56320, 56336, 56338, 0, 1, 49152, 53248, + 55296, 56320, 56336, 0, 1, 49152, 53248, 55296, + 56320, 56336, 56340, 0, 1, 49152, 53248, 55296, + 56320, 56336, 56340, 0, 1, 49152, 53248, 55296, + 56320, 56336, 56344, 56342, 0, 1, 49152, 53248, + 55296, 56320, 56336, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56344, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56344, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56344, 56346, 0, 1, 49152, 53248, + 55296, 56320, 56352, 56344, 0, 1, 49152, 53248, + 55296, 56320, 56352, 56353, 56348, 0, 1, 49152, + 53248, 55296, 56320, 56352, 56353, 56348, 0, 1, + 49152, 53248, 55296, 56320, 56352, 56353, 56348, 56350, + 0, 1, 49152, 53248, 55296, 56320, 0, 1, + 49152, 53248, 55296, 56320, 56352, 0, 1, 49152, + 53248, 55296, 56320, 56352, 0, 1, 49152, 53248, + 55296, 56320, 56352, 56354, 0, 1, 49152, 53248, + 55296, 56320, 56352, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56356, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56356, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56360, 56358, 0, 1, 49152, 53248, + 55296, 56320, 56352, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56360, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56360, 0, 1, 49152, 53248, 55296, + 56320, 56352, 56360, 56362, 0, 1, 49152, 53248, + 55296, 56320, 56352, 56360, 0, 1, 49152, 53248, + 55296, 56320, 56352, 56368, 56364, 0, 1, 49152, + 53248, 55296, 56320, 56352, 56368, 56364, 0, 1, + 49152, 53248, 55296, 56320, 56352, 56368, 56369, 56366, + 0, 1, 49152, 53248, 55296, 56320, 56352, 0, + 1, 49152, 53248, 55296, 56320, 56384, 56368, 0, + 1, 49152, 53248, 55296, 56320, 56384, 56368, 0, + 1, 49152, 53248, 55296, 56320, 56384, 56368, 56370, + 0, 1, 49152, 53248, 55296, 56320, 56384, 56368, + 0, 1, 49152, 53248, 55296, 56320, 56384, 56368, + 56372, 0, 1, 49152, 53248, 55296, 56320, 56384, + 56368, 56372, 0, 1, 49152, 53248, 55296, 56320, + 56384, 56368, 56376, 56374, 0, 1, 49152, 53248, + 55296, 56320, 56384, 56368, 0, 1, 49152, 53248, + 55296, 56320, 56384, 56385, 56376, 0, 1, 49152, + 53248, 55296, 56320, 56384, 56385, 56376, 0, 1, + 49152, 53248, 55296, 56320, 56384, 56385, 56376, 56378, + 0, 1, 49152, 53248, 55296, 56320, 56384, 56385, + 56376, 0, 1, 49152, 53248, 55296, 56320, 56384, + 56385, 56376, 56380, 0, 1, 49152, 53248, 55296, + 56320, 56384, 56385, 56387, 56380, 0, 1, 49152, + 53248, 55296, 56320, 56384, 56385, 56387, 56380, 56382, + 0, 1, 49152, 53248, 55296, 56320, 0, 1, + 49152, 57344, 55296, 56320, 56384, 0, 1, 49152, + 57344, 55296, 56320, 56384, 0, 1, 49152, 57344, + 55296, 56320, 56384, 56386, 0, 1, 49152, 57344, + 55296, 56320, 56384, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56388, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56388, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56392, 56390, 0, 1, 49152, 57344, + 55296, 56320, 56384, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56392, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56392, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56392, 56394, 0, 1, 49152, 57344, + 55296, 56320, 56384, 56392, 0, 1, 49152, 57344, + 55296, 56320, 56384, 56400, 56396, 0, 1, 49152, + 57344, 55296, 56320, 56384, 56400, 56396, 0, 1, + 49152, 57344, 55296, 56320, 56384, 56400, 56401, 56398, + 0, 1, 49152, 57344, 55296, 56320, 56384, 0, + 1, 49152, 57344, 55296, 56320, 56384, 56400, 0, + 1, 49152, 57344, 55296, 56320, 56384, 56400, 0, + 1, 49152, 57344, 55296, 56320, 56384, 56400, 56402, + 0, 1, 49152, 57344, 55296, 56320, 56384, 56400, + 0, 1, 49152, 57344, 55296, 56320, 56384, 56400, + 56404, 0, 1, 49152, 57344, 55296, 56320, 56384, + 56400, 56404, 0, 1, 49152, 57344, 55296, 56320, + 56384, 56400, 56408, 56406, 0, 1, 49152, 57344, + 55296, 56320, 56384, 56400, 0, 1, 49152, 57344, + 55296, 56320, 56384, 56416, 56408, 0, 1, 49152, + 57344, 55296, 56320, 56384, 56416, 56408, 0, 1, + 49152, 57344, 55296, 56320, 56384, 56416, 56408, 56410, + 0, 1, 49152, 57344, 55296, 56320, 56384, 56416, + 56408, 0, 1, 49152, 57344, 55296, 56320, 56384, + 56416, 56417, 56412, 0, 1, 49152, 57344, 55296, + 56320, 56384, 56416, 56417, 56412, 0, 1, 49152, + 57344, 55296, 56320, 56384, 56416, 56417, 56412, 56414, + 0, 1, 49152, 57344, 55296, 56320, 56384, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56416, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56416, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56416, 56418, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56416, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56416, + 56420, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56416, 56420, 0, 1, 49152, 57344, 55296, 56320, + 56448, 56416, 56424, 56422, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56416, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56416, 56424, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56416, 56424, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56416, 56424, 56426, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56416, + 56424, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56416, 56432, 56428, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56416, 56432, 56428, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56416, 56432, 56433, 56430, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56416, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56449, + 56432, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56449, 56432, 0, 1, 49152, 57344, 55296, 56320, + 56448, 56449, 56432, 56434, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56449, 56432, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56449, 56432, 56436, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56449, 56432, + 56436, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56449, 56432, 56440, 56438, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56449, 56432, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56449, 56432, 56440, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56449, 56451, + 56440, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56449, 56451, 56440, 56442, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56449, 56451, 56440, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56449, 56451, 56440, + 56444, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56449, 56451, 56440, 56444, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56449, 56451, 56440, 56444, 56446, + 0, 1, 49152, 57344, 55296, 56320, 0, 1, + 49152, 57344, 55296, 56320, 56448, 0, 1, 49152, + 57344, 55296, 56320, 56448, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56450, 0, 1, 49152, 57344, + 55296, 56320, 56448, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56452, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56452, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56456, 56454, 0, 1, 49152, 57344, + 55296, 56320, 56448, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56456, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56456, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56456, 56458, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56456, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56464, 56460, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56464, 56460, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56464, 56465, 56462, + 0, 1, 49152, 57344, 55296, 56320, 56448, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56464, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56464, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56464, 56466, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56464, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56464, + 56468, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56464, 56468, 0, 1, 49152, 57344, 55296, 56320, + 56448, 56464, 56472, 56470, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56464, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56480, 56472, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56480, 56472, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56480, 56472, 56474, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56480, + 56472, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56480, 56481, 56476, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56480, 56481, 56476, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56480, 56481, 56476, 56478, + 0, 1, 49152, 57344, 55296, 56320, 56448, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56480, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56480, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56480, 56482, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56480, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56480, + 56484, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56480, 56484, 0, 1, 49152, 57344, 55296, 56320, + 56448, 56480, 56488, 56486, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56480, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56480, 56488, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56480, 56488, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56480, 56488, 56490, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56480, + 56488, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56480, 56496, 56492, 0, 1, 49152, 57344, 55296, + 56320, 56448, 56480, 56496, 56492, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56480, 56496, 56497, 56494, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56480, + 0, 1, 49152, 57344, 55296, 56320, 56448, 56512, + 56496, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56512, 56496, 0, 1, 49152, 57344, 55296, 56320, + 56448, 56512, 56496, 56498, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56512, 56496, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56512, 56496, 56500, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56512, 56496, + 56500, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56512, 56496, 56504, 56502, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56512, 56496, 0, 1, 49152, + 57344, 55296, 56320, 56448, 56512, 56513, 56504, 0, + 1, 49152, 57344, 55296, 56320, 56448, 56512, 56513, + 56504, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56512, 56513, 56504, 56506, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56512, 56513, 56504, 0, 1, + 49152, 57344, 55296, 56320, 56448, 56512, 56513, 56504, + 56508, 0, 1, 49152, 57344, 55296, 56320, 56448, + 56512, 56513, 56515, 56508, 0, 1, 49152, 57344, + 55296, 56320, 56448, 56512, 56513, 56515, 56508, 56510, + 0, 1, 49152, 57344, 55296, 56320, 56448, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56512, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56512, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56512, 56514, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 56516, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56516, 0, 1, 49152, 57344, 55296, 56320, + 56576, 56512, 56520, 56518, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 56520, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56512, 56520, 0, 1, + 49152, 57344, 55296, 56320, 56576, 56512, 56520, 56522, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 56520, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56528, 56524, 0, 1, 49152, 57344, 55296, + 56320, 56576, 56512, 56528, 56524, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56512, 56528, 56529, 56526, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 56528, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56528, 0, 1, 49152, 57344, 55296, 56320, + 56576, 56512, 56528, 56530, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 56528, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56512, 56528, 56532, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56512, 56528, + 56532, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56528, 56536, 56534, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 56528, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56512, 56544, 56536, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56512, 56544, + 56536, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56544, 56536, 56538, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 56544, 56536, 0, 1, + 49152, 57344, 55296, 56320, 56576, 56512, 56544, 56545, + 56540, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56512, 56544, 56545, 56540, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56512, 56544, 56545, 56540, 56542, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56512, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56577, + 56544, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56544, 0, 1, 49152, 57344, 55296, 56320, + 56576, 56577, 56544, 56546, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56544, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56577, 56544, 56548, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56577, 56544, + 56548, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56544, 56552, 56550, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56544, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56577, 56544, 56552, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56577, 56544, + 56552, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56544, 56552, 56554, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56544, 56552, 0, 1, + 49152, 57344, 55296, 56320, 56576, 56577, 56544, 56560, + 56556, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56544, 56560, 56556, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56544, 56560, 56561, 56558, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56577, + 56544, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56544, 56560, 0, 1, 49152, 57344, 55296, + 56320, 56576, 56577, 56579, 56560, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56577, 56579, 56560, 56562, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56577, + 56579, 56560, 0, 1, 49152, 57344, 55296, 56320, + 56576, 56577, 56579, 56560, 56564, 0, 1, 49152, + 57344, 55296, 56320, 56576, 56577, 56579, 56560, 56564, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56577, + 56579, 56560, 56568, 56566, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56579, 56560, 0, 1, + 49152, 57344, 55296, 56320, 56576, 56577, 56579, 56560, + 56568, 0, 1, 49152, 57344, 55296, 56320, 56576, + 56577, 56579, 56560, 56568, 0, 1, 49152, 57344, + 55296, 56320, 56576, 56577, 56579, 56560, 56568, 56570, + 0, 1, 49152, 57344, 55296, 56320, 56576, 56577, + 56579, 56583, 56568, 0, 1, 49152, 57344, 55296, + 56320, 56576, 56577, 56579, 56583, 56568, 56572, 0, + 1, 49152, 57344, 55296, 56320, 56576, 56577, 56579, + 56583, 56568, 56572, 0, 1, 49152, 57344, 55296, + 56320, 56576, 56577, 56579, 56583, 56568, 56572, 56574, + 0, 1, 49152, 57344, 55296, 56320, 0, 1, + 49152, 57344, 55296, 56320, 56576, 0, 1, 49152, + 57344, 57345, 56320, 56576, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56578, 0, 1, 49152, 57344, + 57345, 56320, 56576, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56580, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56580, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56584, 56582, 0, 1, 49152, 57344, + 57345, 56320, 56576, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56584, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56584, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56584, 56586, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56584, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56592, 56588, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56592, 56588, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56592, 56593, 56590, + 0, 1, 49152, 57344, 57345, 56320, 56576, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56592, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56592, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56592, 56594, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56592, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56592, + 56596, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56592, 56596, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56592, 56600, 56598, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56592, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56608, 56600, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56608, 56600, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56608, 56600, 56602, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56608, + 56600, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56608, 56609, 56604, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56608, 56609, 56604, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56608, 56609, 56604, 56606, + 0, 1, 49152, 57344, 57345, 56320, 56576, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56608, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56608, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56608, 56610, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56608, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56608, + 56612, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56608, 56612, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56608, 56616, 56614, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56608, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56608, 56616, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56608, 56616, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56608, 56616, 56618, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56608, + 56616, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56608, 56624, 56620, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56608, 56624, 56620, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56608, 56624, 56625, 56622, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56608, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 56624, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56624, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56640, 56624, 56626, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56624, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56624, 56628, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 56624, + 56628, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56624, 56632, 56630, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56624, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56641, 56632, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 56641, + 56632, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56641, 56632, 56634, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56641, 56632, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56640, 56641, 56632, + 56636, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56641, 56643, 56636, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56641, 56643, 56636, 56638, + 0, 1, 49152, 57344, 57345, 56320, 56576, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 56642, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 56644, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56644, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56640, 56648, 56646, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56648, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56648, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56640, 56648, 56650, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 56648, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56656, 56652, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56640, 56656, 56652, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56656, 56657, 56654, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 56656, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56656, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56640, 56656, 56658, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56656, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56656, 56660, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 56656, + 56660, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56656, 56664, 56662, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56656, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56640, 56672, 56664, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56640, 56672, + 56664, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56672, 56664, 56666, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56672, 56664, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56640, 56672, 56673, + 56668, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56640, 56672, 56673, 56668, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56640, 56672, 56673, 56668, 56670, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56640, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56704, + 56672, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56672, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56704, 56672, 56674, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56672, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56704, 56672, 56676, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56704, 56672, + 56676, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56672, 56680, 56678, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56672, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56704, 56672, 56680, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56704, 56672, + 56680, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56672, 56680, 56682, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56672, 56680, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56704, 56672, 56688, + 56684, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56672, 56688, 56684, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56672, 56688, 56689, 56686, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56704, + 56672, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56705, 56688, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56704, 56705, 56688, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56704, 56705, 56688, 56690, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56704, + 56705, 56688, 0, 1, 49152, 57344, 57345, 56320, + 56576, 56704, 56705, 56688, 56692, 0, 1, 49152, + 57344, 57345, 56320, 56576, 56704, 56705, 56688, 56692, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56704, + 56705, 56688, 56696, 56694, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56705, 56688, 0, 1, + 49152, 57344, 57345, 56320, 56576, 56704, 56705, 56688, + 56696, 0, 1, 49152, 57344, 57345, 56320, 56576, + 56704, 56705, 56707, 56696, 0, 1, 49152, 57344, + 57345, 56320, 56576, 56704, 56705, 56707, 56696, 56698, + 0, 1, 49152, 57344, 57345, 56320, 56576, 56704, + 56705, 56707, 56696, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56704, 56705, 56707, 56696, 56700, 0, + 1, 49152, 57344, 57345, 56320, 56576, 56704, 56705, + 56707, 56696, 56700, 0, 1, 49152, 57344, 57345, + 56320, 56576, 56704, 56705, 56707, 56696, 56700, 56702, + 0, 1, 49152, 57344, 57345, 56320, 56576, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56706, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56708, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56708, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56704, 56712, 56710, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56712, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56712, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56704, 56712, 56714, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56712, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56720, 56716, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56704, 56720, 56716, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56720, 56721, 56718, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56720, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56720, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56704, 56720, 56722, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56720, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56720, 56724, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56720, + 56724, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56720, 56728, 56726, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56720, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56736, 56728, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56736, + 56728, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 56728, 56730, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 56728, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56704, 56736, 56737, + 56732, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 56737, 56732, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 56737, 56732, 56734, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56736, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56704, 56736, 56738, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56736, 56740, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56736, + 56740, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 56744, 56742, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56736, 56744, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56736, + 56744, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 56744, 56746, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 56744, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56704, 56736, 56752, + 56748, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56736, 56752, 56748, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56736, 56752, 56753, 56750, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56736, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56768, 56752, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56704, 56768, 56752, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56768, 56752, 56754, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56768, 56752, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56704, 56768, 56752, 56756, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56704, 56768, 56752, 56756, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56768, 56752, 56760, 56758, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56768, 56752, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56704, 56768, 56769, + 56760, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56704, 56768, 56769, 56760, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56704, 56768, 56769, 56760, 56762, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 56768, 56769, 56760, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56704, 56768, 56769, 56760, 56764, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56704, 56768, + 56769, 56771, 56764, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56704, 56768, 56769, 56771, 56764, 56766, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56704, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56833, 56768, 56770, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56768, 56772, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56768, + 56772, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56776, 56774, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56768, 56776, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56768, + 56776, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56776, 56778, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 56776, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56833, 56768, 56784, + 56780, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56784, 56780, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 56784, 56785, 56782, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56784, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56768, 56784, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56768, 56784, 56786, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 56784, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56833, 56768, 56784, 56788, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56768, 56784, 56788, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 56784, 56792, 56790, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 56784, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56833, 56768, 56800, + 56792, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56800, 56792, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56768, 56800, 56792, 56794, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 56800, 56792, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56768, 56800, 56801, 56796, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56768, + 56800, 56801, 56796, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56768, 56800, 56801, 56796, 56798, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56768, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56768, 56800, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56835, 56800, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56835, 56800, 56802, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56800, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56833, 56835, 56800, 56804, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56835, 56800, 56804, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56800, 56808, 56806, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56835, 56800, 0, 1, + 49152, 57344, 57345, 56320, 56832, 56833, 56835, 56800, + 56808, 0, 1, 49152, 57344, 57345, 56320, 56832, + 56833, 56835, 56800, 56808, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56835, 56800, 56808, 56810, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56800, 56808, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56835, 56800, 56816, 56812, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56835, + 56800, 56816, 56812, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56835, 56800, 56816, 56817, 56814, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56800, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56833, 56835, 56800, 56816, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56835, 56800, 56816, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56800, 56816, 56818, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56835, 56839, 56816, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56835, + 56839, 56816, 56820, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56835, 56839, 56816, 56820, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56835, + 56839, 56816, 56824, 56822, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56835, 56839, 56816, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56835, + 56839, 56816, 56824, 0, 1, 49152, 57344, 57345, + 56320, 56832, 56833, 56835, 56839, 56816, 56824, 0, + 1, 49152, 57344, 57345, 56320, 56832, 56833, 56835, + 56839, 56816, 56824, 56826, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56833, 56835, 56839, 56816, 56824, + 0, 1, 49152, 57344, 57345, 56320, 56832, 56833, + 56835, 56839, 56816, 56824, 56828, 0, 1, 49152, + 57344, 57345, 56320, 56832, 56833, 56835, 56839, 56816, + 56824, 56828, 0, 1, 49152, 57344, 57345, 56320, + 56832, 56833, 56835, 56839, 56816, 56824, 56828, 56830, + 0, 1, 49152, 57344, 57345, 56320, 0, 1, + 49152, 57344, 57345, 56320, 56832, 0, 1, 49152, + 57344, 57345, 56320, 56832, 0, 1, 49152, 57344, + 57345, 56320, 56832, 56834, 0, 1, 49152, 57344, + 57345, 57347, 56832, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56836, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56836, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56840, 56838, 0, 1, 49152, 57344, + 57345, 57347, 56832, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56840, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56840, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56840, 56842, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56840, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56848, 56844, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56848, 56844, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56848, 56849, 56846, + 0, 1, 49152, 57344, 57345, 57347, 56832, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56848, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56848, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56848, 56850, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56848, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56848, + 56852, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56848, 56852, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56848, 56856, 56854, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56848, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56864, 56856, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56864, 56856, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56864, 56856, 56858, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56864, + 56856, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56864, 56865, 56860, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56864, 56865, 56860, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56864, 56865, 56860, 56862, + 0, 1, 49152, 57344, 57345, 57347, 56832, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56864, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56864, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56864, 56866, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56864, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56864, + 56868, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56864, 56868, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56864, 56872, 56870, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56864, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56864, 56872, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56864, 56872, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56864, 56872, 56874, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56864, + 56872, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56864, 56880, 56876, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56864, 56880, 56876, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56864, 56880, 56881, 56878, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56864, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 56880, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56880, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56896, 56880, 56882, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56880, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56880, 56884, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 56880, + 56884, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56880, 56888, 56886, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56880, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56897, 56888, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 56897, + 56888, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56897, 56888, 56890, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56897, 56888, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56896, 56897, 56888, + 56892, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56897, 56899, 56892, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56897, 56899, 56892, 56894, + 0, 1, 49152, 57344, 57345, 57347, 56832, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 56898, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 56900, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56900, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56896, 56904, 56902, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56904, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56904, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56896, 56904, 56906, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 56904, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56912, 56908, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56896, 56912, 56908, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56912, 56913, 56910, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 56912, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56912, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56896, 56912, 56914, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56912, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56912, 56916, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 56912, + 56916, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56912, 56920, 56918, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56912, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56896, 56928, 56920, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56896, 56928, + 56920, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56928, 56920, 56922, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56928, 56920, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56896, 56928, 56929, + 56924, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56896, 56928, 56929, 56924, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56896, 56928, 56929, 56924, 56926, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56896, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56928, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56928, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 56928, 56930, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56928, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56928, 56932, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56928, + 56932, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56928, 56936, 56934, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56928, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56928, 56936, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56928, + 56936, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56928, 56936, 56938, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56928, 56936, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 56928, 56944, + 56940, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56928, 56944, 56940, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56928, 56944, 56945, 56942, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56928, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56961, 56944, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 56961, 56944, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56961, 56944, 56946, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56961, 56944, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 56961, 56944, 56948, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56961, 56944, 56948, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56961, 56944, 56952, 56950, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56961, 56944, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 56961, 56944, + 56952, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56961, 56963, 56952, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56961, 56963, 56952, 56954, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56961, 56963, 56952, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 56961, 56963, 56952, 56956, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56961, + 56963, 56952, 56956, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 56961, 56963, 56952, 56956, 56958, + 0, 1, 49152, 57344, 57345, 57347, 56832, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56962, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56964, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56964, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 56968, 56966, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56968, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56968, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 56968, 56970, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56968, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56976, 56972, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 56976, 56972, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56976, 56977, 56974, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56976, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56976, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 56976, 56978, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56976, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56976, 56980, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56976, + 56980, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56976, 56984, 56982, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56976, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56992, 56984, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56992, + 56984, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 56984, 56986, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 56984, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 56992, 56993, + 56988, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 56993, 56988, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 56993, 56988, 56990, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56992, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 56992, 56994, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56992, 56996, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56992, + 56996, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 57000, 56998, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 56992, 57000, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 56992, + 57000, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 57000, 57002, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 57000, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 56992, 57008, + 57004, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 56992, 57008, 57004, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 56992, 57008, 57009, 57006, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 56992, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 57024, 57008, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 57024, 57008, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 57024, 57008, 57010, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 57024, 57008, 0, 1, 49152, 57344, 57345, 57347, + 56832, 56960, 57024, 57008, 57012, 0, 1, 49152, + 57344, 57345, 57347, 56832, 56960, 57024, 57008, 57012, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 57024, 57008, 57016, 57014, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 57024, 57008, 0, 1, + 49152, 57344, 57345, 57347, 56832, 56960, 57024, 57025, + 57016, 0, 1, 49152, 57344, 57345, 57347, 56832, + 56960, 57024, 57025, 57016, 0, 1, 49152, 57344, + 57345, 57347, 56832, 56960, 57024, 57025, 57016, 57018, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 57024, 57025, 57016, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 57024, 57025, 57016, 57020, 0, + 1, 49152, 57344, 57345, 57347, 56832, 56960, 57024, + 57025, 57027, 57020, 0, 1, 49152, 57344, 57345, + 57347, 56832, 56960, 57024, 57025, 57027, 57020, 57022, + 0, 1, 49152, 57344, 57345, 57347, 56832, 56960, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57024, 57026, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57024, 57028, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57024, + 57028, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 57032, 57030, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57024, 57032, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57024, + 57032, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 57032, 57034, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 57032, 0, 1, + 49152, 57344, 57345, 57347, 56832, 57088, 57024, 57040, + 57036, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 57040, 57036, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 57040, 57041, 57038, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 57040, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57024, 57040, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57024, 57040, 57042, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 57040, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57024, 57040, 57044, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57024, 57040, 57044, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 57040, 57048, 57046, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 57040, 0, 1, + 49152, 57344, 57345, 57347, 56832, 57088, 57024, 57056, + 57048, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57024, 57056, 57048, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57024, 57056, 57048, 57050, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 57056, 57048, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57024, 57056, 57057, 57052, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57024, + 57056, 57057, 57052, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57024, 57056, 57057, 57052, 57054, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57024, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57089, 57056, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57089, 57056, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57089, 57056, 57058, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57056, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57089, 57056, 57060, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57089, 57056, 57060, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57056, 57064, 57062, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57089, 57056, 0, 1, + 49152, 57344, 57345, 57347, 56832, 57088, 57089, 57056, + 57064, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57089, 57056, 57064, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57089, 57056, 57064, 57066, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57056, 57064, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57089, 57056, 57072, 57068, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57089, + 57056, 57072, 57068, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57089, 57056, 57072, 57073, 57070, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57056, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57089, 57056, 57072, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57089, 57091, 57072, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57091, 57072, 57074, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57089, 57091, 57072, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57089, + 57091, 57072, 57076, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57089, 57091, 57072, 57076, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57089, + 57091, 57072, 57080, 57078, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57089, 57091, 57072, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57089, + 57091, 57072, 57080, 0, 1, 49152, 57344, 57345, + 57347, 56832, 57088, 57089, 57091, 57072, 57080, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57089, + 57091, 57072, 57080, 57082, 0, 1, 49152, 57344, + 57345, 57347, 56832, 57088, 57089, 57091, 57095, 57080, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57089, 57091, 57095, 57080, 57084, 0, 1, 49152, + 57344, 57345, 57347, 56832, 57088, 57089, 57091, 57095, + 57080, 57084, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57089, 57091, 57095, 57080, 57084, 57086, + 0, 1, 49152, 57344, 57345, 57347, 56832, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 0, + 1, 49152, 57344, 57345, 57347, 56832, 57088, 57090, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 0, 1, 49152, 57344, 57345, 57347, 56832, 57088, + 57092, 0, 1, 49152, 57344, 57345, 57347, 56832, + 57088, 57092, 0, 1, 49152, 57344, 57345, 57347, + 56832, 57088, 57096, 57094, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57096, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57096, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57096, 57098, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57096, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57104, 57100, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57104, 57100, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57104, 57105, 57102, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57104, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57104, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57104, 57106, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57104, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57104, 57108, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57104, + 57108, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57104, 57112, 57110, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57104, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57120, 57112, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57120, + 57112, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 57112, 57114, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 57112, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57120, 57121, + 57116, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 57121, 57116, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 57121, 57116, 57118, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57120, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57120, 57122, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57120, 57124, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57120, + 57124, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 57128, 57126, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57120, 57128, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57120, + 57128, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 57128, 57130, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 57128, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57120, 57136, + 57132, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57120, 57136, 57132, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57120, 57136, 57137, 57134, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57120, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57136, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57136, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57136, 57138, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57136, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57152, 57136, 57140, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57136, 57140, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57136, 57144, 57142, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57136, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57152, 57153, + 57144, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57153, 57144, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57153, 57144, 57146, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57153, 57144, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57153, 57144, 57148, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57152, + 57153, 57155, 57148, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57153, 57155, 57148, 57150, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57152, 57154, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57156, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57152, + 57156, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57160, 57158, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57160, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57152, + 57160, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57160, 57162, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57160, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57152, 57168, + 57164, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57168, 57164, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57168, 57169, 57166, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57168, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57168, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57168, 57170, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57168, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57152, 57168, 57172, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57152, 57168, 57172, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57168, 57176, 57174, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57168, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57152, 57184, + 57176, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57152, 57184, 57176, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57152, 57184, 57176, 57178, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 57184, 57176, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57184, 57185, 57180, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57152, + 57184, 57185, 57180, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57152, 57184, 57185, 57180, 57182, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57152, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 57184, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57216, 57184, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57184, 57186, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57184, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57216, 57184, 57188, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57184, 57188, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57184, 57192, 57190, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57184, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57216, 57184, + 57192, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 57184, 57192, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57184, 57192, 57194, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57184, 57192, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57216, 57184, 57200, 57196, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57184, 57200, 57196, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57216, 57184, 57200, 57201, 57198, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57184, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57216, 57217, 57200, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57217, 57200, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57217, 57200, 57202, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57217, 57200, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57217, 57200, 57204, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57216, 57217, 57200, 57204, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57217, 57200, 57208, 57206, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57217, 57200, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57217, 57200, 57208, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57088, 57216, 57217, 57219, 57208, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57217, 57219, 57208, 57210, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57217, 57219, 57208, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 57217, 57219, 57208, 57212, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57217, 57219, + 57208, 57212, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57216, 57217, 57219, 57208, 57212, 57214, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57088, + 57216, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57088, 57216, 57218, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57220, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57220, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 57224, 57222, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57088, 57216, 57224, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57088, 57216, + 57224, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 57224, 57226, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57224, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57088, 57216, 57232, + 57228, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57088, 57216, 57232, 57228, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57088, 57216, 57232, 57233, 57230, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57232, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57232, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57232, 57234, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57232, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57232, 57236, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57232, 57236, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57232, 57240, 57238, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57232, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57359, 57216, 57248, + 57240, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57248, 57240, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57248, 57240, 57242, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57248, 57240, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57248, 57249, 57244, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57248, 57249, 57244, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57248, 57249, 57244, 57246, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57248, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57248, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57248, 57250, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57248, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57248, 57252, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57248, 57252, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57248, 57256, 57254, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57248, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57359, 57216, 57248, + 57256, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57248, 57256, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57248, 57256, 57258, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57248, 57256, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57248, 57264, 57260, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57248, 57264, 57260, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57248, 57264, 57265, 57262, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57248, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57280, 57264, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57264, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57264, 57266, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57264, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57264, 57268, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57264, 57268, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57264, 57272, 57270, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57264, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57281, 57272, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57281, 57272, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57281, 57272, 57274, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57281, 57272, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57281, 57272, 57276, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57281, + 57283, 57276, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57280, 57281, 57283, 57276, 57278, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57280, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57282, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57280, 57284, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57284, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57288, 57286, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57359, 57216, 57280, + 57288, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57216, 57280, 57288, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57288, 57290, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57288, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57296, 57292, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57296, 57292, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57296, 57297, 57294, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57280, 57296, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57296, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57296, 57298, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57296, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57296, 57300, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57296, 57300, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57296, 57304, 57302, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57296, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57312, 57304, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57216, 57280, 57312, 57304, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57216, + 57280, 57312, 57304, 57306, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57216, 57280, 57312, 57304, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57216, 57280, 57312, 57313, 57308, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57216, 57280, 57312, + 57313, 57308, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57216, 57280, 57312, 57313, 57308, 57310, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57375, 57280, 57312, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57375, 57280, 57312, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 57314, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57375, 57280, 57312, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57375, + 57280, 57312, 57316, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57375, 57280, 57312, 57316, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57375, + 57280, 57312, 57320, 57318, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57375, 57280, 57312, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57375, + 57280, 57312, 57320, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57375, 57280, 57312, 57320, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57375, + 57280, 57312, 57320, 57322, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57375, 57280, 57312, 57320, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 57328, 57324, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57375, 57280, 57312, + 57328, 57324, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57375, 57280, 57312, 57328, 57329, 57326, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57375, 57280, 57312, 57328, 0, + 1, 49152, 57344, 57345, 57347, 57351, 57359, 57375, + 57280, 57312, 57328, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57375, 57280, 57312, 57328, 57330, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 57328, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57375, 57280, 57312, 57328, + 57332, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57375, 57280, 57312, 57328, 57332, 0, 1, + 49152, 57344, 57345, 57347, 57351, 57359, 57375, 57280, + 57312, 57328, 57336, 57334, 0, 1, 49152, 57344, + 57345, 57347, 57351, 57359, 57375, 57280, 57312, 57328, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 57328, 57336, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57375, 57280, 57312, + 57328, 57336, 0, 1, 49152, 57344, 57345, 57347, + 57351, 57359, 57375, 57280, 57312, 57328, 57336, 57338, + 0, 1, 49152, 57344, 57345, 57347, 57351, 57359, + 57375, 57280, 57312, 57328, 57336, 0, 1, 49152, + 57344, 57345, 57347, 57351, 57359, 57375, 57280, 57312, + 57328, 57336, 57340, 0, 1, 49152, 57344, 57345, + 57347, 57351, 57359, 57375, 57280, 57312, 57328, 57336, + 57340, 0, 1, 49152, 57344, 57345, 57347, 57351, + 57359, 57375, 57280, 57312, 57328, 57336, 57340, 57342, + 0, 1, 49152, 0, 1, 49152, 57344, 0, + 1, 49152, 57344, 0, 1, 49152, 57344, 57346, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57348, 0, 1, 49152, 57344, 57348, 0, 1, + 49152, 57344, 57352, 57350, 0, 1, 49152, 57344, + 0, 1, 49152, 57344, 57352, 0, 1, 49152, + 57344, 57352, 0, 1, 49152, 57344, 57352, 57354, + 0, 1, 49152, 57344, 57352, 0, 1, 49152, + 57344, 57360, 57356, 0, 1, 49152, 57344, 57360, + 57356, 0, 1, 49152, 57344, 57360, 57361, 57358, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57360, 0, 1, 49152, 57344, 57360, 0, 1, + 49152, 57344, 57360, 57362, 0, 1, 49152, 57344, + 57360, 0, 1, 49152, 57344, 57360, 57364, 0, + 1, 49152, 57344, 57360, 57364, 0, 1, 49152, + 57344, 57360, 57368, 57366, 0, 1, 49152, 57344, + 57360, 0, 1, 49152, 57344, 57376, 57368, 0, + 1, 49152, 57344, 57376, 57368, 0, 1, 49152, + 57344, 57376, 57368, 57370, 0, 1, 49152, 57344, + 57376, 57368, 0, 1, 49152, 57344, 57376, 57377, + 57372, 0, 1, 49152, 57344, 57376, 57377, 57372, + 0, 1, 49152, 57344, 57376, 57377, 57372, 57374, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57376, 0, 1, 49152, 57344, 57376, 0, 1, + 49152, 57344, 57376, 57378, 0, 1, 49152, 57344, + 57376, 0, 1, 49152, 57344, 57376, 57380, 0, + 1, 49152, 57344, 57376, 57380, 0, 1, 49152, + 57344, 57376, 57384, 57382, 0, 1, 49152, 57344, + 57376, 0, 1, 49152, 57344, 57376, 57384, 0, + 1, 49152, 57344, 57376, 57384, 0, 1, 49152, + 57344, 57376, 57384, 57386, 0, 1, 49152, 57344, + 57376, 57384, 0, 1, 49152, 57344, 57376, 57392, + 57388, 0, 1, 49152, 57344, 57376, 57392, 57388, + 0, 1, 49152, 57344, 57376, 57392, 57393, 57390, + 0, 1, 49152, 57344, 57376, 0, 1, 49152, + 57344, 57408, 57392, 0, 1, 49152, 57344, 57408, + 57392, 0, 1, 49152, 57344, 57408, 57392, 57394, + 0, 1, 49152, 57344, 57408, 57392, 0, 1, + 49152, 57344, 57408, 57392, 57396, 0, 1, 49152, + 57344, 57408, 57392, 57396, 0, 1, 49152, 57344, + 57408, 57392, 57400, 57398, 0, 1, 49152, 57344, + 57408, 57392, 0, 1, 49152, 57344, 57408, 57409, + 57400, 0, 1, 49152, 57344, 57408, 57409, 57400, + 0, 1, 49152, 57344, 57408, 57409, 57400, 57402, + 0, 1, 49152, 57344, 57408, 57409, 57400, 0, + 1, 49152, 57344, 57408, 57409, 57400, 57404, 0, + 1, 49152, 57344, 57408, 57409, 57411, 57404, 0, + 1, 49152, 57344, 57408, 57409, 57411, 57404, 57406, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57408, 0, 1, 49152, 57344, 57408, 0, 1, + 49152, 57344, 57408, 57410, 0, 1, 49152, 57344, + 57408, 0, 1, 49152, 57344, 57408, 57412, 0, + 1, 49152, 57344, 57408, 57412, 0, 1, 49152, + 57344, 57408, 57416, 57414, 0, 1, 49152, 57344, + 57408, 0, 1, 49152, 57344, 57408, 57416, 0, + 1, 49152, 57344, 57408, 57416, 0, 1, 49152, + 57344, 57408, 57416, 57418, 0, 1, 49152, 57344, + 57408, 57416, 0, 1, 49152, 57344, 57408, 57424, + 57420, 0, 1, 49152, 57344, 57408, 57424, 57420, + 0, 1, 49152, 57344, 57408, 57424, 57425, 57422, + 0, 1, 49152, 57344, 57408, 0, 1, 49152, + 57344, 57408, 57424, 0, 1, 49152, 57344, 57408, + 57424, 0, 1, 49152, 57344, 57408, 57424, 57426, + 0, 1, 49152, 57344, 57408, 57424, 0, 1, + 49152, 57344, 57408, 57424, 57428, 0, 1, 49152, + 57344, 57408, 57424, 57428, 0, 1, 49152, 57344, + 57408, 57424, 57432, 57430, 0, 1, 49152, 57344, + 57408, 57424, 0, 1, 49152, 57344, 57408, 57440, + 57432, 0, 1, 49152, 57344, 57408, 57440, 57432, + 0, 1, 49152, 57344, 57408, 57440, 57432, 57434, + 0, 1, 49152, 57344, 57408, 57440, 57432, 0, + 1, 49152, 57344, 57408, 57440, 57441, 57436, 0, + 1, 49152, 57344, 57408, 57440, 57441, 57436, 0, + 1, 49152, 57344, 57408, 57440, 57441, 57436, 57438, + 0, 1, 49152, 57344, 57408, 0, 1, 49152, + 57344, 57472, 57440, 0, 1, 49152, 57344, 57472, + 57440, 0, 1, 49152, 57344, 57472, 57440, 57442, + 0, 1, 49152, 57344, 57472, 57440, 0, 1, + 49152, 57344, 57472, 57440, 57444, 0, 1, 49152, + 57344, 57472, 57440, 57444, 0, 1, 49152, 57344, + 57472, 57440, 57448, 57446, 0, 1, 49152, 57344, + 57472, 57440, 0, 1, 49152, 57344, 57472, 57440, + 57448, 0, 1, 49152, 57344, 57472, 57440, 57448, + 0, 1, 49152, 57344, 57472, 57440, 57448, 57450, + 0, 1, 49152, 57344, 57472, 57440, 57448, 0, + 1, 49152, 57344, 57472, 57440, 57456, 57452, 0, + 1, 49152, 57344, 57472, 57440, 57456, 57452, 0, + 1, 49152, 57344, 57472, 57440, 57456, 57457, 57454, + 0, 1, 49152, 57344, 57472, 57440, 0, 1, + 49152, 57344, 57472, 57473, 57456, 0, 1, 49152, + 57344, 57472, 57473, 57456, 0, 1, 49152, 57344, + 57472, 57473, 57456, 57458, 0, 1, 49152, 57344, + 57472, 57473, 57456, 0, 1, 49152, 57344, 57472, + 57473, 57456, 57460, 0, 1, 49152, 57344, 57472, + 57473, 57456, 57460, 0, 1, 49152, 57344, 57472, + 57473, 57456, 57464, 57462, 0, 1, 49152, 57344, + 57472, 57473, 57456, 0, 1, 49152, 57344, 57472, + 57473, 57456, 57464, 0, 1, 49152, 57344, 57472, + 57473, 57475, 57464, 0, 1, 49152, 57344, 57472, + 57473, 57475, 57464, 57466, 0, 1, 49152, 57344, + 57472, 57473, 57475, 57464, 0, 1, 49152, 57344, + 57472, 57473, 57475, 57464, 57468, 0, 1, 49152, + 57344, 57472, 57473, 57475, 57464, 57468, 0, 1, + 49152, 57344, 57472, 57473, 57475, 57464, 57468, 57470, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57472, 0, 1, 49152, 57344, 57472, 0, 1, + 49152, 57344, 57472, 57474, 0, 1, 49152, 57344, + 57472, 0, 1, 49152, 57344, 57472, 57476, 0, + 1, 49152, 57344, 57472, 57476, 0, 1, 49152, + 57344, 57472, 57480, 57478, 0, 1, 49152, 57344, + 57472, 0, 1, 49152, 57344, 57472, 57480, 0, + 1, 49152, 57344, 57472, 57480, 0, 1, 49152, + 57344, 57472, 57480, 57482, 0, 1, 49152, 57344, + 57472, 57480, 0, 1, 49152, 57344, 57472, 57488, + 57484, 0, 1, 49152, 57344, 57472, 57488, 57484, + 0, 1, 49152, 57344, 57472, 57488, 57489, 57486, + 0, 1, 49152, 57344, 57472, 0, 1, 49152, + 57344, 57472, 57488, 0, 1, 49152, 57344, 57472, + 57488, 0, 1, 49152, 57344, 57472, 57488, 57490, + 0, 1, 49152, 57344, 57472, 57488, 0, 1, + 49152, 57344, 57472, 57488, 57492, 0, 1, 49152, + 57344, 57472, 57488, 57492, 0, 1, 49152, 57344, + 57472, 57488, 57496, 57494, 0, 1, 49152, 57344, + 57472, 57488, 0, 1, 49152, 57344, 57472, 57504, + 57496, 0, 1, 49152, 57344, 57472, 57504, 57496, + 0, 1, 49152, 57344, 57472, 57504, 57496, 57498, + 0, 1, 49152, 57344, 57472, 57504, 57496, 0, + 1, 49152, 57344, 57472, 57504, 57505, 57500, 0, + 1, 49152, 57344, 57472, 57504, 57505, 57500, 0, + 1, 49152, 57344, 57472, 57504, 57505, 57500, 57502, + 0, 1, 49152, 57344, 57472, 0, 1, 49152, + 57344, 57472, 57504, 0, 1, 49152, 57344, 57472, + 57504, 0, 1, 49152, 57344, 57472, 57504, 57506, + 0, 1, 49152, 57344, 57472, 57504, 0, 1, + 49152, 57344, 57472, 57504, 57508, 0, 1, 49152, + 57344, 57472, 57504, 57508, 0, 1, 49152, 57344, + 57472, 57504, 57512, 57510, 0, 1, 49152, 57344, + 57472, 57504, 0, 1, 49152, 57344, 57472, 57504, + 57512, 0, 1, 49152, 57344, 57472, 57504, 57512, + 0, 1, 49152, 57344, 57472, 57504, 57512, 57514, + 0, 1, 49152, 57344, 57472, 57504, 57512, 0, + 1, 49152, 57344, 57472, 57504, 57520, 57516, 0, + 1, 49152, 57344, 57472, 57504, 57520, 57516, 0, + 1, 49152, 57344, 57472, 57504, 57520, 57521, 57518, + 0, 1, 49152, 57344, 57472, 57504, 0, 1, + 49152, 57344, 57472, 57536, 57520, 0, 1, 49152, + 57344, 57472, 57536, 57520, 0, 1, 49152, 57344, + 57472, 57536, 57520, 57522, 0, 1, 49152, 57344, + 57472, 57536, 57520, 0, 1, 49152, 57344, 57472, + 57536, 57520, 57524, 0, 1, 49152, 57344, 57472, + 57536, 57520, 57524, 0, 1, 49152, 57344, 57472, + 57536, 57520, 57528, 57526, 0, 1, 49152, 57344, + 57472, 57536, 57520, 0, 1, 49152, 57344, 57472, + 57536, 57537, 57528, 0, 1, 49152, 57344, 57472, + 57536, 57537, 57528, 0, 1, 49152, 57344, 57472, + 57536, 57537, 57528, 57530, 0, 1, 49152, 57344, + 57472, 57536, 57537, 57528, 0, 1, 49152, 57344, + 57472, 57536, 57537, 57528, 57532, 0, 1, 49152, + 57344, 57472, 57536, 57537, 57539, 57532, 0, 1, + 49152, 57344, 57472, 57536, 57537, 57539, 57532, 57534, + 0, 1, 49152, 57344, 57472, 0, 1, 49152, + 57344, 57600, 57536, 0, 1, 49152, 57344, 57600, + 57536, 0, 1, 49152, 57344, 57600, 57536, 57538, + 0, 1, 49152, 57344, 57600, 57536, 0, 1, + 49152, 57344, 57600, 57536, 57540, 0, 1, 49152, + 57344, 57600, 57536, 57540, 0, 1, 49152, 57344, + 57600, 57536, 57544, 57542, 0, 1, 49152, 57344, + 57600, 57536, 0, 1, 49152, 57344, 57600, 57536, + 57544, 0, 1, 49152, 57344, 57600, 57536, 57544, + 0, 1, 49152, 57344, 57600, 57536, 57544, 57546, + 0, 1, 49152, 57344, 57600, 57536, 57544, 0, + 1, 49152, 57344, 57600, 57536, 57552, 57548, 0, + 1, 49152, 57344, 57600, 57536, 57552, 57548, 0, + 1, 49152, 57344, 57600, 57536, 57552, 57553, 57550, + 0, 1, 49152, 57344, 57600, 57536, 0, 1, + 49152, 57344, 57600, 57536, 57552, 0, 1, 49152, + 57344, 57600, 57536, 57552, 0, 1, 49152, 57344, + 57600, 57536, 57552, 57554, 0, 1, 49152, 57344, + 57600, 57536, 57552, 0, 1, 49152, 57344, 57600, + 57536, 57552, 57556, 0, 1, 49152, 57344, 57600, + 57536, 57552, 57556, 0, 1, 49152, 57344, 57600, + 57536, 57552, 57560, 57558, 0, 1, 49152, 57344, + 57600, 57536, 57552, 0, 1, 49152, 57344, 57600, + 57536, 57568, 57560, 0, 1, 49152, 57344, 57600, + 57536, 57568, 57560, 0, 1, 49152, 57344, 57600, + 57536, 57568, 57560, 57562, 0, 1, 49152, 57344, + 57600, 57536, 57568, 57560, 0, 1, 49152, 57344, + 57600, 57536, 57568, 57569, 57564, 0, 1, 49152, + 57344, 57600, 57536, 57568, 57569, 57564, 0, 1, + 49152, 57344, 57600, 57536, 57568, 57569, 57564, 57566, + 0, 1, 49152, 57344, 57600, 57536, 0, 1, + 49152, 57344, 57600, 57601, 57568, 0, 1, 49152, + 57344, 57600, 57601, 57568, 0, 1, 49152, 57344, + 57600, 57601, 57568, 57570, 0, 1, 49152, 57344, + 57600, 57601, 57568, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57572, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57572, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57576, 57574, 0, 1, 49152, 57344, + 57600, 57601, 57568, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57576, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57576, 0, 1, 49152, 57344, 57600, + 57601, 57568, 57576, 57578, 0, 1, 49152, 57344, + 57600, 57601, 57568, 57576, 0, 1, 49152, 57344, + 57600, 57601, 57568, 57584, 57580, 0, 1, 49152, + 57344, 57600, 57601, 57568, 57584, 57580, 0, 1, + 49152, 57344, 57600, 57601, 57568, 57584, 57585, 57582, + 0, 1, 49152, 57344, 57600, 57601, 57568, 0, + 1, 49152, 57344, 57600, 57601, 57568, 57584, 0, + 1, 49152, 57344, 57600, 57601, 57603, 57584, 0, + 1, 49152, 57344, 57600, 57601, 57603, 57584, 57586, + 0, 1, 49152, 57344, 57600, 57601, 57603, 57584, + 0, 1, 49152, 57344, 57600, 57601, 57603, 57584, + 57588, 0, 1, 49152, 57344, 57600, 57601, 57603, + 57584, 57588, 0, 1, 49152, 57344, 57600, 57601, + 57603, 57584, 57592, 57590, 0, 1, 49152, 57344, + 57600, 57601, 57603, 57584, 0, 1, 49152, 57344, + 57600, 57601, 57603, 57584, 57592, 0, 1, 49152, + 57344, 57600, 57601, 57603, 57584, 57592, 0, 1, + 49152, 57344, 57600, 57601, 57603, 57584, 57592, 57594, + 0, 1, 49152, 57344, 57600, 57601, 57603, 57607, + 57592, 0, 1, 49152, 57344, 57600, 57601, 57603, + 57607, 57592, 57596, 0, 1, 49152, 57344, 57600, + 57601, 57603, 57607, 57592, 57596, 0, 1, 49152, + 57344, 57600, 57601, 57603, 57607, 57592, 57596, 57598, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57600, 0, 1, 49152, 57344, 57600, 0, 1, + 49152, 57344, 57600, 57602, 0, 1, 49152, 57344, + 57600, 0, 1, 49152, 57344, 57600, 57604, 0, + 1, 49152, 57344, 57600, 57604, 0, 1, 49152, + 57344, 57600, 57608, 57606, 0, 1, 49152, 57344, + 57600, 0, 1, 49152, 57344, 57600, 57608, 0, + 1, 49152, 57344, 57600, 57608, 0, 1, 49152, + 57344, 57600, 57608, 57610, 0, 1, 49152, 57344, + 57600, 57608, 0, 1, 49152, 57344, 57600, 57616, + 57612, 0, 1, 49152, 57344, 57600, 57616, 57612, + 0, 1, 49152, 57344, 57600, 57616, 57617, 57614, + 0, 1, 49152, 57344, 57600, 0, 1, 49152, + 57344, 57600, 57616, 0, 1, 49152, 57344, 57600, + 57616, 0, 1, 49152, 57344, 57600, 57616, 57618, + 0, 1, 49152, 57344, 57600, 57616, 0, 1, + 49152, 57344, 57600, 57616, 57620, 0, 1, 49152, + 57344, 57600, 57616, 57620, 0, 1, 49152, 57344, + 57600, 57616, 57624, 57622, 0, 1, 49152, 57344, + 57600, 57616, 0, 1, 49152, 57344, 57600, 57632, + 57624, 0, 1, 49152, 57344, 57600, 57632, 57624, + 0, 1, 49152, 57344, 57600, 57632, 57624, 57626, + 0, 1, 49152, 57344, 57600, 57632, 57624, 0, + 1, 49152, 57344, 57600, 57632, 57633, 57628, 0, + 1, 49152, 57344, 57600, 57632, 57633, 57628, 0, + 1, 49152, 57344, 57600, 57632, 57633, 57628, 57630, + 0, 1, 49152, 57344, 57600, 0, 1, 49152, + 57344, 57600, 57632, 0, 1, 49152, 57344, 57600, + 57632, 0, 1, 49152, 57344, 57600, 57632, 57634, + 0, 1, 49152, 57344, 57600, 57632, 0, 1, + 49152, 57344, 57600, 57632, 57636, 0, 1, 49152, + 57344, 57600, 57632, 57636, 0, 1, 49152, 57344, + 57600, 57632, 57640, 57638, 0, 1, 49152, 57344, + 57600, 57632, 0, 1, 49152, 57344, 57600, 57632, + 57640, 0, 1, 49152, 57344, 57600, 57632, 57640, + 0, 1, 49152, 57344, 57600, 57632, 57640, 57642, + 0, 1, 49152, 57344, 57600, 57632, 57640, 0, + 1, 49152, 57344, 57600, 57632, 57648, 57644, 0, + 1, 49152, 57344, 57600, 57632, 57648, 57644, 0, + 1, 49152, 57344, 57600, 57632, 57648, 57649, 57646, + 0, 1, 49152, 57344, 57600, 57632, 0, 1, + 49152, 57344, 57600, 57664, 57648, 0, 1, 49152, + 57344, 57600, 57664, 57648, 0, 1, 49152, 57344, + 57600, 57664, 57648, 57650, 0, 1, 49152, 57344, + 57600, 57664, 57648, 0, 1, 49152, 57344, 57600, + 57664, 57648, 57652, 0, 1, 49152, 57344, 57600, + 57664, 57648, 57652, 0, 1, 49152, 57344, 57600, + 57664, 57648, 57656, 57654, 0, 1, 49152, 57344, + 57600, 57664, 57648, 0, 1, 49152, 57344, 57600, + 57664, 57665, 57656, 0, 1, 49152, 57344, 57600, + 57664, 57665, 57656, 0, 1, 49152, 57344, 57600, + 57664, 57665, 57656, 57658, 0, 1, 49152, 57344, + 57600, 57664, 57665, 57656, 0, 1, 49152, 57344, + 57600, 57664, 57665, 57656, 57660, 0, 1, 49152, + 57344, 57600, 57664, 57665, 57667, 57660, 0, 1, + 49152, 57344, 57600, 57664, 57665, 57667, 57660, 57662, + 0, 1, 49152, 57344, 57600, 0, 1, 49152, + 57344, 57600, 57664, 0, 1, 49152, 57344, 57600, + 57664, 0, 1, 49152, 57344, 57600, 57664, 57666, + 0, 1, 49152, 57344, 57600, 57664, 0, 1, + 49152, 57344, 57600, 57664, 57668, 0, 1, 49152, + 57344, 57600, 57664, 57668, 0, 1, 49152, 57344, + 57600, 57664, 57672, 57670, 0, 1, 49152, 57344, + 57600, 57664, 0, 1, 49152, 57344, 57600, 57664, + 57672, 0, 1, 49152, 57344, 57600, 57664, 57672, + 0, 1, 49152, 57344, 57600, 57664, 57672, 57674, + 0, 1, 49152, 57344, 57600, 57664, 57672, 0, + 1, 49152, 57344, 57600, 57664, 57680, 57676, 0, + 1, 49152, 57344, 57600, 57664, 57680, 57676, 0, + 1, 49152, 57344, 57600, 57664, 57680, 57681, 57678, + 0, 1, 49152, 57344, 57600, 57664, 0, 1, + 49152, 57344, 57600, 57664, 57680, 0, 1, 49152, + 57344, 57600, 57664, 57680, 0, 1, 49152, 57344, + 57600, 57664, 57680, 57682, 0, 1, 49152, 57344, + 57600, 57664, 57680, 0, 1, 49152, 57344, 57600, + 57664, 57680, 57684, 0, 1, 49152, 57344, 57600, + 57664, 57680, 57684, 0, 1, 49152, 57344, 57600, + 57664, 57680, 57688, 57686, 0, 1, 49152, 57344, + 57600, 57664, 57680, 0, 1, 49152, 57344, 57600, + 57664, 57696, 57688, 0, 1, 49152, 57344, 57600, + 57664, 57696, 57688, 0, 1, 49152, 57344, 57600, + 57664, 57696, 57688, 57690, 0, 1, 49152, 57344, + 57600, 57664, 57696, 57688, 0, 1, 49152, 57344, + 57600, 57664, 57696, 57697, 57692, 0, 1, 49152, + 57344, 57600, 57664, 57696, 57697, 57692, 0, 1, + 49152, 57344, 57600, 57664, 57696, 57697, 57692, 57694, + 0, 1, 49152, 57344, 57600, 57664, 0, 1, + 49152, 57344, 57600, 57728, 57696, 0, 1, 49152, + 57344, 57600, 57728, 57696, 0, 1, 49152, 57344, + 57600, 57728, 57696, 57698, 0, 1, 49152, 57344, + 57600, 57728, 57696, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57700, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57700, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57704, 57702, 0, 1, 49152, 57344, + 57600, 57728, 57696, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57704, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57704, 0, 1, 49152, 57344, 57600, + 57728, 57696, 57704, 57706, 0, 1, 49152, 57344, + 57600, 57728, 57696, 57704, 0, 1, 49152, 57344, + 57600, 57728, 57696, 57712, 57708, 0, 1, 49152, + 57344, 57600, 57728, 57696, 57712, 57708, 0, 1, + 49152, 57344, 57600, 57728, 57696, 57712, 57713, 57710, + 0, 1, 49152, 57344, 57600, 57728, 57696, 0, + 1, 49152, 57344, 57600, 57728, 57729, 57712, 0, + 1, 49152, 57344, 57600, 57728, 57729, 57712, 0, + 1, 49152, 57344, 57600, 57728, 57729, 57712, 57714, + 0, 1, 49152, 57344, 57600, 57728, 57729, 57712, + 0, 1, 49152, 57344, 57600, 57728, 57729, 57712, + 57716, 0, 1, 49152, 57344, 57600, 57728, 57729, + 57712, 57716, 0, 1, 49152, 57344, 57600, 57728, + 57729, 57712, 57720, 57718, 0, 1, 49152, 57344, + 57600, 57728, 57729, 57712, 0, 1, 49152, 57344, + 57600, 57728, 57729, 57712, 57720, 0, 1, 49152, + 57344, 57600, 57728, 57729, 57731, 57720, 0, 1, + 49152, 57344, 57600, 57728, 57729, 57731, 57720, 57722, + 0, 1, 49152, 57344, 57600, 57728, 57729, 57731, + 57720, 0, 1, 49152, 57344, 57600, 57728, 57729, + 57731, 57720, 57724, 0, 1, 49152, 57344, 57600, + 57728, 57729, 57731, 57720, 57724, 0, 1, 49152, + 57344, 57600, 57728, 57729, 57731, 57720, 57724, 57726, + 0, 1, 49152, 57344, 57600, 0, 1, 49152, + 57344, 57856, 57728, 0, 1, 49152, 57344, 57856, + 57728, 0, 1, 49152, 57344, 57856, 57728, 57730, + 0, 1, 49152, 57344, 57856, 57728, 0, 1, + 49152, 57344, 57856, 57728, 57732, 0, 1, 49152, + 57344, 57856, 57728, 57732, 0, 1, 49152, 57344, + 57856, 57728, 57736, 57734, 0, 1, 49152, 57344, + 57856, 57728, 0, 1, 49152, 57344, 57856, 57728, + 57736, 0, 1, 49152, 57344, 57856, 57728, 57736, + 0, 1, 49152, 57344, 57856, 57728, 57736, 57738, + 0, 1, 49152, 57344, 57856, 57728, 57736, 0, + 1, 49152, 57344, 57856, 57728, 57744, 57740, 0, + 1, 49152, 57344, 57856, 57728, 57744, 57740, 0, + 1, 49152, 57344, 57856, 57728, 57744, 57745, 57742, + 0, 1, 49152, 57344, 57856, 57728, 0, 1, + 49152, 57344, 57856, 57728, 57744, 0, 1, 49152, + 57344, 57856, 57728, 57744, 0, 1, 49152, 57344, + 57856, 57728, 57744, 57746, 0, 1, 49152, 57344, + 57856, 57728, 57744, 0, 1, 49152, 57344, 57856, + 57728, 57744, 57748, 0, 1, 49152, 57344, 57856, + 57728, 57744, 57748, 0, 1, 49152, 57344, 57856, + 57728, 57744, 57752, 57750, 0, 1, 49152, 57344, + 57856, 57728, 57744, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57752, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57752, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57752, 57754, 0, 1, 49152, 57344, + 57856, 57728, 57760, 57752, 0, 1, 49152, 57344, + 57856, 57728, 57760, 57761, 57756, 0, 1, 49152, + 57344, 57856, 57728, 57760, 57761, 57756, 0, 1, + 49152, 57344, 57856, 57728, 57760, 57761, 57756, 57758, + 0, 1, 49152, 57344, 57856, 57728, 0, 1, + 49152, 57344, 57856, 57728, 57760, 0, 1, 49152, + 57344, 57856, 57728, 57760, 0, 1, 49152, 57344, + 57856, 57728, 57760, 57762, 0, 1, 49152, 57344, + 57856, 57728, 57760, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57764, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57764, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57768, 57766, 0, 1, 49152, 57344, + 57856, 57728, 57760, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57768, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57768, 0, 1, 49152, 57344, 57856, + 57728, 57760, 57768, 57770, 0, 1, 49152, 57344, + 57856, 57728, 57760, 57768, 0, 1, 49152, 57344, + 57856, 57728, 57760, 57776, 57772, 0, 1, 49152, + 57344, 57856, 57728, 57760, 57776, 57772, 0, 1, + 49152, 57344, 57856, 57728, 57760, 57776, 57777, 57774, + 0, 1, 49152, 57344, 57856, 57728, 57760, 0, + 1, 49152, 57344, 57856, 57728, 57792, 57776, 0, + 1, 49152, 57344, 57856, 57728, 57792, 57776, 0, + 1, 49152, 57344, 57856, 57728, 57792, 57776, 57778, + 0, 1, 49152, 57344, 57856, 57728, 57792, 57776, + 0, 1, 49152, 57344, 57856, 57728, 57792, 57776, + 57780, 0, 1, 49152, 57344, 57856, 57728, 57792, + 57776, 57780, 0, 1, 49152, 57344, 57856, 57728, + 57792, 57776, 57784, 57782, 0, 1, 49152, 57344, + 57856, 57728, 57792, 57776, 0, 1, 49152, 57344, + 57856, 57728, 57792, 57793, 57784, 0, 1, 49152, + 57344, 57856, 57728, 57792, 57793, 57784, 0, 1, + 49152, 57344, 57856, 57728, 57792, 57793, 57784, 57786, + 0, 1, 49152, 57344, 57856, 57728, 57792, 57793, + 57784, 0, 1, 49152, 57344, 57856, 57728, 57792, + 57793, 57784, 57788, 0, 1, 49152, 57344, 57856, + 57728, 57792, 57793, 57795, 57788, 0, 1, 49152, + 57344, 57856, 57728, 57792, 57793, 57795, 57788, 57790, + 0, 1, 49152, 57344, 57856, 57728, 0, 1, + 49152, 57344, 57856, 57857, 57792, 0, 1, 49152, + 57344, 57856, 57857, 57792, 0, 1, 49152, 57344, + 57856, 57857, 57792, 57794, 0, 1, 49152, 57344, + 57856, 57857, 57792, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57796, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57796, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57800, 57798, 0, 1, 49152, 57344, + 57856, 57857, 57792, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57800, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57800, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57800, 57802, 0, 1, 49152, 57344, + 57856, 57857, 57792, 57800, 0, 1, 49152, 57344, + 57856, 57857, 57792, 57808, 57804, 0, 1, 49152, + 57344, 57856, 57857, 57792, 57808, 57804, 0, 1, + 49152, 57344, 57856, 57857, 57792, 57808, 57809, 57806, + 0, 1, 49152, 57344, 57856, 57857, 57792, 0, + 1, 49152, 57344, 57856, 57857, 57792, 57808, 0, + 1, 49152, 57344, 57856, 57857, 57792, 57808, 0, + 1, 49152, 57344, 57856, 57857, 57792, 57808, 57810, + 0, 1, 49152, 57344, 57856, 57857, 57792, 57808, + 0, 1, 49152, 57344, 57856, 57857, 57792, 57808, + 57812, 0, 1, 49152, 57344, 57856, 57857, 57792, + 57808, 57812, 0, 1, 49152, 57344, 57856, 57857, + 57792, 57808, 57816, 57814, 0, 1, 49152, 57344, + 57856, 57857, 57792, 57808, 0, 1, 49152, 57344, + 57856, 57857, 57792, 57824, 57816, 0, 1, 49152, + 57344, 57856, 57857, 57792, 57824, 57816, 0, 1, + 49152, 57344, 57856, 57857, 57792, 57824, 57816, 57818, + 0, 1, 49152, 57344, 57856, 57857, 57792, 57824, + 57816, 0, 1, 49152, 57344, 57856, 57857, 57792, + 57824, 57825, 57820, 0, 1, 49152, 57344, 57856, + 57857, 57792, 57824, 57825, 57820, 0, 1, 49152, + 57344, 57856, 57857, 57792, 57824, 57825, 57820, 57822, + 0, 1, 49152, 57344, 57856, 57857, 57792, 0, + 1, 49152, 57344, 57856, 57857, 57792, 57824, 0, + 1, 49152, 57344, 57856, 57857, 57859, 57824, 0, + 1, 49152, 57344, 57856, 57857, 57859, 57824, 57826, + 0, 1, 49152, 57344, 57856, 57857, 57859, 57824, + 0, 1, 49152, 57344, 57856, 57857, 57859, 57824, + 57828, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57824, 57828, 0, 1, 49152, 57344, 57856, 57857, + 57859, 57824, 57832, 57830, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57824, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57824, 57832, 0, 1, 49152, + 57344, 57856, 57857, 57859, 57824, 57832, 0, 1, + 49152, 57344, 57856, 57857, 57859, 57824, 57832, 57834, + 0, 1, 49152, 57344, 57856, 57857, 57859, 57824, + 57832, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57824, 57840, 57836, 0, 1, 49152, 57344, 57856, + 57857, 57859, 57824, 57840, 57836, 0, 1, 49152, + 57344, 57856, 57857, 57859, 57824, 57840, 57841, 57838, + 0, 1, 49152, 57344, 57856, 57857, 57859, 57824, + 0, 1, 49152, 57344, 57856, 57857, 57859, 57824, + 57840, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57824, 57840, 0, 1, 49152, 57344, 57856, 57857, + 57859, 57824, 57840, 57842, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57863, 57840, 0, 1, 49152, + 57344, 57856, 57857, 57859, 57863, 57840, 57844, 0, + 1, 49152, 57344, 57856, 57857, 57859, 57863, 57840, + 57844, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57863, 57840, 57848, 57846, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57863, 57840, 0, 1, 49152, + 57344, 57856, 57857, 57859, 57863, 57840, 57848, 0, + 1, 49152, 57344, 57856, 57857, 57859, 57863, 57840, + 57848, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57863, 57840, 57848, 57850, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57863, 57840, 57848, 0, 1, + 49152, 57344, 57856, 57857, 57859, 57863, 57840, 57848, + 57852, 0, 1, 49152, 57344, 57856, 57857, 57859, + 57863, 57840, 57848, 57852, 0, 1, 49152, 57344, + 57856, 57857, 57859, 57863, 57840, 57848, 57852, 57854, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 57856, 0, 1, 49152, 57344, 57856, 0, 1, + 49152, 57344, 57856, 57858, 0, 1, 49152, 57344, + 57856, 0, 1, 49152, 57344, 57856, 57860, 0, + 1, 49152, 57344, 57856, 57860, 0, 1, 49152, + 57344, 57856, 57864, 57862, 0, 1, 49152, 57344, + 57856, 0, 1, 49152, 57344, 57856, 57864, 0, + 1, 49152, 57344, 57856, 57864, 0, 1, 49152, + 57344, 57856, 57864, 57866, 0, 1, 49152, 57344, + 57856, 57864, 0, 1, 49152, 57344, 57856, 57872, + 57868, 0, 1, 49152, 57344, 57856, 57872, 57868, + 0, 1, 49152, 57344, 57856, 57872, 57873, 57870, + 0, 1, 49152, 57344, 57856, 0, 1, 49152, + 57344, 57856, 57872, 0, 1, 49152, 57344, 57856, + 57872, 0, 1, 49152, 57344, 57856, 57872, 57874, + 0, 1, 49152, 57344, 57856, 57872, 0, 1, + 49152, 57344, 57856, 57872, 57876, 0, 1, 49152, + 57344, 57856, 57872, 57876, 0, 1, 49152, 57344, + 57856, 57872, 57880, 57878, 0, 1, 49152, 57344, + 57856, 57872, 0, 1, 49152, 57344, 57856, 57888, + 57880, 0, 1, 49152, 57344, 57856, 57888, 57880, + 0, 1, 49152, 57344, 57856, 57888, 57880, 57882, + 0, 1, 49152, 57344, 57856, 57888, 57880, 0, + 1, 49152, 57344, 57856, 57888, 57889, 57884, 0, + 1, 49152, 57344, 57856, 57888, 57889, 57884, 0, + 1, 49152, 57344, 57856, 57888, 57889, 57884, 57886, + 0, 1, 49152, 57344, 57856, 0, 1, 49152, + 57344, 57856, 57888, 0, 1, 49152, 57344, 57856, + 57888, 0, 1, 49152, 57344, 57856, 57888, 57890, + 0, 1, 49152, 57344, 57856, 57888, 0, 1, + 49152, 57344, 57856, 57888, 57892, 0, 1, 49152, + 57344, 57856, 57888, 57892, 0, 1, 49152, 57344, + 57856, 57888, 57896, 57894, 0, 1, 49152, 57344, + 57856, 57888, 0, 1, 49152, 57344, 57856, 57888, + 57896, 0, 1, 49152, 57344, 57856, 57888, 57896, + 0, 1, 49152, 57344, 57856, 57888, 57896, 57898, + 0, 1, 49152, 57344, 57856, 57888, 57896, 0, + 1, 49152, 57344, 57856, 57888, 57904, 57900, 0, + 1, 49152, 57344, 57856, 57888, 57904, 57900, 0, + 1, 49152, 57344, 57856, 57888, 57904, 57905, 57902, + 0, 1, 49152, 57344, 57856, 57888, 0, 1, + 49152, 57344, 57856, 57920, 57904, 0, 1, 49152, + 57344, 57856, 57920, 57904, 0, 1, 49152, 57344, + 57856, 57920, 57904, 57906, 0, 1, 49152, 57344, + 57856, 57920, 57904, 0, 1, 49152, 57344, 57856, + 57920, 57904, 57908, 0, 1, 49152, 57344, 57856, + 57920, 57904, 57908, 0, 1, 49152, 57344, 57856, + 57920, 57904, 57912, 57910, 0, 1, 49152, 57344, + 57856, 57920, 57904, 0, 1, 49152, 57344, 57856, + 57920, 57921, 57912, 0, 1, 49152, 57344, 57856, + 57920, 57921, 57912, 0, 1, 49152, 57344, 57856, + 57920, 57921, 57912, 57914, 0, 1, 49152, 57344, + 57856, 57920, 57921, 57912, 0, 1, 49152, 57344, + 57856, 57920, 57921, 57912, 57916, 0, 1, 49152, + 57344, 57856, 57920, 57921, 57923, 57916, 0, 1, + 49152, 57344, 57856, 57920, 57921, 57923, 57916, 57918, + 0, 1, 49152, 57344, 57856, 0, 1, 49152, + 57344, 57856, 57920, 0, 1, 49152, 57344, 57856, + 57920, 0, 1, 49152, 57344, 57856, 57920, 57922, + 0, 1, 49152, 57344, 57856, 57920, 0, 1, + 49152, 57344, 57856, 57920, 57924, 0, 1, 49152, + 57344, 57856, 57920, 57924, 0, 1, 49152, 57344, + 57856, 57920, 57928, 57926, 0, 1, 49152, 57344, + 57856, 57920, 0, 1, 49152, 57344, 57856, 57920, + 57928, 0, 1, 49152, 57344, 57856, 57920, 57928, + 0, 1, 49152, 57344, 57856, 57920, 57928, 57930, + 0, 1, 49152, 57344, 57856, 57920, 57928, 0, + 1, 49152, 57344, 57856, 57920, 57936, 57932, 0, + 1, 49152, 57344, 57856, 57920, 57936, 57932, 0, + 1, 49152, 57344, 57856, 57920, 57936, 57937, 57934, + 0, 1, 49152, 57344, 57856, 57920, 0, 1, + 49152, 57344, 57856, 57920, 57936, 0, 1, 49152, + 57344, 57856, 57920, 57936, 0, 1, 49152, 57344, + 57856, 57920, 57936, 57938, 0, 1, 49152, 57344, + 57856, 57920, 57936, 0, 1, 49152, 57344, 57856, + 57920, 57936, 57940, 0, 1, 49152, 57344, 57856, + 57920, 57936, 57940, 0, 1, 49152, 57344, 57856, + 57920, 57936, 57944, 57942, 0, 1, 49152, 57344, + 57856, 57920, 57936, 0, 1, 49152, 57344, 57856, + 57920, 57952, 57944, 0, 1, 49152, 57344, 57856, + 57920, 57952, 57944, 0, 1, 49152, 57344, 57856, + 57920, 57952, 57944, 57946, 0, 1, 49152, 57344, + 57856, 57920, 57952, 57944, 0, 1, 49152, 57344, + 57856, 57920, 57952, 57953, 57948, 0, 1, 49152, + 57344, 57856, 57920, 57952, 57953, 57948, 0, 1, + 49152, 57344, 57856, 57920, 57952, 57953, 57948, 57950, + 0, 1, 49152, 57344, 57856, 57920, 0, 1, + 49152, 57344, 57856, 57984, 57952, 0, 1, 49152, + 57344, 57856, 57984, 57952, 0, 1, 49152, 57344, + 57856, 57984, 57952, 57954, 0, 1, 49152, 57344, + 57856, 57984, 57952, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57956, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57956, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57960, 57958, 0, 1, 49152, 57344, + 57856, 57984, 57952, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57960, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57960, 0, 1, 49152, 57344, 57856, + 57984, 57952, 57960, 57962, 0, 1, 49152, 57344, + 57856, 57984, 57952, 57960, 0, 1, 49152, 57344, + 57856, 57984, 57952, 57968, 57964, 0, 1, 49152, + 57344, 57856, 57984, 57952, 57968, 57964, 0, 1, + 49152, 57344, 57856, 57984, 57952, 57968, 57969, 57966, + 0, 1, 49152, 57344, 57856, 57984, 57952, 0, + 1, 49152, 57344, 57856, 57984, 57985, 57968, 0, + 1, 49152, 57344, 57856, 57984, 57985, 57968, 0, + 1, 49152, 57344, 57856, 57984, 57985, 57968, 57970, + 0, 1, 49152, 57344, 57856, 57984, 57985, 57968, + 0, 1, 49152, 57344, 57856, 57984, 57985, 57968, + 57972, 0, 1, 49152, 57344, 57856, 57984, 57985, + 57968, 57972, 0, 1, 49152, 57344, 57856, 57984, + 57985, 57968, 57976, 57974, 0, 1, 49152, 57344, + 57856, 57984, 57985, 57968, 0, 1, 49152, 57344, + 57856, 57984, 57985, 57968, 57976, 0, 1, 49152, + 57344, 57856, 57984, 57985, 57987, 57976, 0, 1, + 49152, 57344, 57856, 57984, 57985, 57987, 57976, 57978, + 0, 1, 49152, 57344, 57856, 57984, 57985, 57987, + 57976, 0, 1, 49152, 57344, 57856, 57984, 57985, + 57987, 57976, 57980, 0, 1, 49152, 57344, 57856, + 57984, 57985, 57987, 57976, 57980, 0, 1, 49152, + 57344, 57856, 57984, 57985, 57987, 57976, 57980, 57982, + 0, 1, 49152, 57344, 57856, 0, 1, 49152, + 57344, 57856, 57984, 0, 1, 49152, 57344, 57856, + 57984, 0, 1, 49152, 57344, 57856, 57984, 57986, + 0, 1, 49152, 57344, 57856, 57984, 0, 1, + 49152, 57344, 57856, 57984, 57988, 0, 1, 49152, + 57344, 57856, 57984, 57988, 0, 1, 49152, 57344, + 57856, 57984, 57992, 57990, 0, 1, 49152, 57344, + 57856, 57984, 0, 1, 49152, 57344, 57856, 57984, + 57992, 0, 1, 49152, 57344, 57856, 57984, 57992, + 0, 1, 49152, 57344, 57856, 57984, 57992, 57994, + 0, 1, 49152, 57344, 57856, 57984, 57992, 0, + 1, 49152, 57344, 57856, 57984, 58000, 57996, 0, + 1, 49152, 57344, 57856, 57984, 58000, 57996, 0, + 1, 49152, 57344, 57856, 57984, 58000, 58001, 57998, + 0, 1, 49152, 57344, 57856, 57984, 0, 1, + 49152, 57344, 57856, 57984, 58000, 0, 1, 49152, + 57344, 57856, 57984, 58000, 0, 1, 49152, 57344, + 57856, 57984, 58000, 58002, 0, 1, 49152, 57344, + 57856, 57984, 58000, 0, 1, 49152, 57344, 57856, + 57984, 58000, 58004, 0, 1, 49152, 57344, 57856, + 57984, 58000, 58004, 0, 1, 49152, 57344, 57856, + 57984, 58000, 58008, 58006, 0, 1, 49152, 57344, + 57856, 57984, 58000, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58008, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58008, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58008, 58010, 0, 1, 49152, 57344, + 57856, 57984, 58016, 58008, 0, 1, 49152, 57344, + 57856, 57984, 58016, 58017, 58012, 0, 1, 49152, + 57344, 57856, 57984, 58016, 58017, 58012, 0, 1, + 49152, 57344, 57856, 57984, 58016, 58017, 58012, 58014, + 0, 1, 49152, 57344, 57856, 57984, 0, 1, + 49152, 57344, 57856, 57984, 58016, 0, 1, 49152, + 57344, 57856, 57984, 58016, 0, 1, 49152, 57344, + 57856, 57984, 58016, 58018, 0, 1, 49152, 57344, + 57856, 57984, 58016, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58020, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58020, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58024, 58022, 0, 1, 49152, 57344, + 57856, 57984, 58016, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58024, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58024, 0, 1, 49152, 57344, 57856, + 57984, 58016, 58024, 58026, 0, 1, 49152, 57344, + 57856, 57984, 58016, 58024, 0, 1, 49152, 57344, + 57856, 57984, 58016, 58032, 58028, 0, 1, 49152, + 57344, 57856, 57984, 58016, 58032, 58028, 0, 1, + 49152, 57344, 57856, 57984, 58016, 58032, 58033, 58030, + 0, 1, 49152, 57344, 57856, 57984, 58016, 0, + 1, 49152, 57344, 57856, 57984, 58048, 58032, 0, + 1, 49152, 57344, 57856, 57984, 58048, 58032, 0, + 1, 49152, 57344, 57856, 57984, 58048, 58032, 58034, + 0, 1, 49152, 57344, 57856, 57984, 58048, 58032, + 0, 1, 49152, 57344, 57856, 57984, 58048, 58032, + 58036, 0, 1, 49152, 57344, 57856, 57984, 58048, + 58032, 58036, 0, 1, 49152, 57344, 57856, 57984, + 58048, 58032, 58040, 58038, 0, 1, 49152, 57344, + 57856, 57984, 58048, 58032, 0, 1, 49152, 57344, + 57856, 57984, 58048, 58049, 58040, 0, 1, 49152, + 57344, 57856, 57984, 58048, 58049, 58040, 0, 1, + 49152, 57344, 57856, 57984, 58048, 58049, 58040, 58042, + 0, 1, 49152, 57344, 57856, 57984, 58048, 58049, + 58040, 0, 1, 49152, 57344, 57856, 57984, 58048, + 58049, 58040, 58044, 0, 1, 49152, 57344, 57856, + 57984, 58048, 58049, 58051, 58044, 0, 1, 49152, + 57344, 57856, 57984, 58048, 58049, 58051, 58044, 58046, + 0, 1, 49152, 57344, 57856, 57984, 0, 1, + 49152, 57344, 57856, 58112, 58048, 0, 1, 49152, + 57344, 57856, 58112, 58048, 0, 1, 49152, 57344, + 57856, 58112, 58048, 58050, 0, 1, 49152, 57344, + 57856, 58112, 58048, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58052, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58052, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58056, 58054, 0, 1, 49152, 57344, + 57856, 58112, 58048, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58056, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58056, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58056, 58058, 0, 1, 49152, 57344, + 57856, 58112, 58048, 58056, 0, 1, 49152, 57344, + 57856, 58112, 58048, 58064, 58060, 0, 1, 49152, + 57344, 57856, 58112, 58048, 58064, 58060, 0, 1, + 49152, 57344, 57856, 58112, 58048, 58064, 58065, 58062, + 0, 1, 49152, 57344, 57856, 58112, 58048, 0, + 1, 49152, 57344, 57856, 58112, 58048, 58064, 0, + 1, 49152, 57344, 57856, 58112, 58048, 58064, 0, + 1, 49152, 57344, 57856, 58112, 58048, 58064, 58066, + 0, 1, 49152, 57344, 57856, 58112, 58048, 58064, + 0, 1, 49152, 57344, 57856, 58112, 58048, 58064, + 58068, 0, 1, 49152, 57344, 57856, 58112, 58048, + 58064, 58068, 0, 1, 49152, 57344, 57856, 58112, + 58048, 58064, 58072, 58070, 0, 1, 49152, 57344, + 57856, 58112, 58048, 58064, 0, 1, 49152, 57344, + 57856, 58112, 58048, 58080, 58072, 0, 1, 49152, + 57344, 57856, 58112, 58048, 58080, 58072, 0, 1, + 49152, 57344, 57856, 58112, 58048, 58080, 58072, 58074, + 0, 1, 49152, 57344, 57856, 58112, 58048, 58080, + 58072, 0, 1, 49152, 57344, 57856, 58112, 58048, + 58080, 58081, 58076, 0, 1, 49152, 57344, 57856, + 58112, 58048, 58080, 58081, 58076, 0, 1, 49152, + 57344, 57856, 58112, 58048, 58080, 58081, 58076, 58078, + 0, 1, 49152, 57344, 57856, 58112, 58048, 0, + 1, 49152, 57344, 57856, 58112, 58113, 58080, 0, + 1, 49152, 57344, 57856, 58112, 58113, 58080, 0, + 1, 49152, 57344, 57856, 58112, 58113, 58080, 58082, + 0, 1, 49152, 57344, 57856, 58112, 58113, 58080, + 0, 1, 49152, 57344, 57856, 58112, 58113, 58080, + 58084, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58080, 58084, 0, 1, 49152, 57344, 57856, 58112, + 58113, 58080, 58088, 58086, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58080, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58080, 58088, 0, 1, 49152, + 57344, 57856, 58112, 58113, 58080, 58088, 0, 1, + 49152, 57344, 57856, 58112, 58113, 58080, 58088, 58090, + 0, 1, 49152, 57344, 57856, 58112, 58113, 58080, + 58088, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58080, 58096, 58092, 0, 1, 49152, 57344, 57856, + 58112, 58113, 58080, 58096, 58092, 0, 1, 49152, + 57344, 57856, 58112, 58113, 58080, 58096, 58097, 58094, + 0, 1, 49152, 57344, 57856, 58112, 58113, 58080, + 0, 1, 49152, 57344, 57856, 58112, 58113, 58080, + 58096, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58115, 58096, 0, 1, 49152, 57344, 57856, 58112, + 58113, 58115, 58096, 58098, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58115, 58096, 0, 1, 49152, + 57344, 57856, 58112, 58113, 58115, 58096, 58100, 0, + 1, 49152, 57344, 57856, 58112, 58113, 58115, 58096, + 58100, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58115, 58096, 58104, 58102, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58115, 58096, 0, 1, 49152, + 57344, 57856, 58112, 58113, 58115, 58096, 58104, 0, + 1, 49152, 57344, 57856, 58112, 58113, 58115, 58096, + 58104, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58115, 58096, 58104, 58106, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58115, 58119, 58104, 0, 1, + 49152, 57344, 57856, 58112, 58113, 58115, 58119, 58104, + 58108, 0, 1, 49152, 57344, 57856, 58112, 58113, + 58115, 58119, 58104, 58108, 0, 1, 49152, 57344, + 57856, 58112, 58113, 58115, 58119, 58104, 58108, 58110, + 0, 1, 49152, 57344, 57856, 0, 1, 49152, + 57344, 58368, 58112, 0, 1, 49152, 57344, 58368, + 58112, 0, 1, 49152, 57344, 58368, 58112, 58114, + 0, 1, 49152, 57344, 58368, 58112, 0, 1, + 49152, 57344, 58368, 58112, 58116, 0, 1, 49152, + 57344, 58368, 58112, 58116, 0, 1, 49152, 57344, + 58368, 58112, 58120, 58118, 0, 1, 49152, 57344, + 58368, 58112, 0, 1, 49152, 57344, 58368, 58112, + 58120, 0, 1, 49152, 57344, 58368, 58112, 58120, + 0, 1, 49152, 57344, 58368, 58112, 58120, 58122, + 0, 1, 49152, 57344, 58368, 58112, 58120, 0, + 1, 49152, 57344, 58368, 58112, 58128, 58124, 0, + 1, 49152, 57344, 58368, 58112, 58128, 58124, 0, + 1, 49152, 57344, 58368, 58112, 58128, 58129, 58126, + 0, 1, 49152, 57344, 58368, 58112, 0, 1, + 49152, 57344, 58368, 58112, 58128, 0, 1, 49152, + 57344, 58368, 58112, 58128, 0, 1, 49152, 57344, + 58368, 58112, 58128, 58130, 0, 1, 49152, 57344, + 58368, 58112, 58128, 0, 1, 49152, 57344, 58368, + 58112, 58128, 58132, 0, 1, 49152, 57344, 58368, + 58112, 58128, 58132, 0, 1, 49152, 57344, 58368, + 58112, 58128, 58136, 58134, 0, 1, 49152, 57344, + 58368, 58112, 58128, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58136, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58136, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58136, 58138, 0, 1, 49152, 57344, + 58368, 58112, 58144, 58136, 0, 1, 49152, 57344, + 58368, 58112, 58144, 58145, 58140, 0, 1, 49152, + 57344, 58368, 58112, 58144, 58145, 58140, 0, 1, + 49152, 57344, 58368, 58112, 58144, 58145, 58140, 58142, + 0, 1, 49152, 57344, 58368, 58112, 0, 1, + 49152, 57344, 58368, 58112, 58144, 0, 1, 49152, + 57344, 58368, 58112, 58144, 0, 1, 49152, 57344, + 58368, 58112, 58144, 58146, 0, 1, 49152, 57344, + 58368, 58112, 58144, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58148, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58148, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58152, 58150, 0, 1, 49152, 57344, + 58368, 58112, 58144, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58152, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58152, 0, 1, 49152, 57344, 58368, + 58112, 58144, 58152, 58154, 0, 1, 49152, 57344, + 58368, 58112, 58144, 58152, 0, 1, 49152, 57344, + 58368, 58112, 58144, 58160, 58156, 0, 1, 49152, + 57344, 58368, 58112, 58144, 58160, 58156, 0, 1, + 49152, 57344, 58368, 58112, 58144, 58160, 58161, 58158, + 0, 1, 49152, 57344, 58368, 58112, 58144, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58160, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58160, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58160, 58162, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58160, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58160, + 58164, 0, 1, 49152, 57344, 58368, 58112, 58176, + 58160, 58164, 0, 1, 49152, 57344, 58368, 58112, + 58176, 58160, 58168, 58166, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58160, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58177, 58168, 0, 1, 49152, + 57344, 58368, 58112, 58176, 58177, 58168, 0, 1, + 49152, 57344, 58368, 58112, 58176, 58177, 58168, 58170, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58177, + 58168, 0, 1, 49152, 57344, 58368, 58112, 58176, + 58177, 58168, 58172, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58177, 58179, 58172, 0, 1, 49152, + 57344, 58368, 58112, 58176, 58177, 58179, 58172, 58174, + 0, 1, 49152, 57344, 58368, 58112, 0, 1, + 49152, 57344, 58368, 58112, 58176, 0, 1, 49152, + 57344, 58368, 58112, 58176, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58178, 0, 1, 49152, 57344, + 58368, 58112, 58176, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58180, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58180, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58184, 58182, 0, 1, 49152, 57344, + 58368, 58112, 58176, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58184, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58184, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58184, 58186, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58184, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58192, 58188, 0, 1, 49152, + 57344, 58368, 58112, 58176, 58192, 58188, 0, 1, + 49152, 57344, 58368, 58112, 58176, 58192, 58193, 58190, + 0, 1, 49152, 57344, 58368, 58112, 58176, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58192, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58192, 0, + 1, 49152, 57344, 58368, 58112, 58176, 58192, 58194, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58192, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58192, + 58196, 0, 1, 49152, 57344, 58368, 58112, 58176, + 58192, 58196, 0, 1, 49152, 57344, 58368, 58112, + 58176, 58192, 58200, 58198, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58192, 0, 1, 49152, 57344, + 58368, 58112, 58176, 58208, 58200, 0, 1, 49152, + 57344, 58368, 58112, 58176, 58208, 58200, 0, 1, + 49152, 57344, 58368, 58112, 58176, 58208, 58200, 58202, + 0, 1, 49152, 57344, 58368, 58112, 58176, 58208, + 58200, 0, 1, 49152, 57344, 58368, 58112, 58176, + 58208, 58209, 58204, 0, 1, 49152, 57344, 58368, + 58112, 58176, 58208, 58209, 58204, 0, 1, 49152, + 57344, 58368, 58112, 58176, 58208, 58209, 58204, 58206, + 0, 1, 49152, 57344, 58368, 58112, 58176, 0, + 1, 49152, 57344, 58368, 58112, 58240, 58208, 0, + 1, 49152, 57344, 58368, 58112, 58240, 58208, 0, + 1, 49152, 57344, 58368, 58112, 58240, 58208, 58210, + 0, 1, 49152, 57344, 58368, 58112, 58240, 58208, + 0, 1, 49152, 57344, 58368, 58112, 58240, 58208, + 58212, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58208, 58212, 0, 1, 49152, 57344, 58368, 58112, + 58240, 58208, 58216, 58214, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58208, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58208, 58216, 0, 1, 49152, + 57344, 58368, 58112, 58240, 58208, 58216, 0, 1, + 49152, 57344, 58368, 58112, 58240, 58208, 58216, 58218, + 0, 1, 49152, 57344, 58368, 58112, 58240, 58208, + 58216, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58208, 58224, 58220, 0, 1, 49152, 57344, 58368, + 58112, 58240, 58208, 58224, 58220, 0, 1, 49152, + 57344, 58368, 58112, 58240, 58208, 58224, 58225, 58222, + 0, 1, 49152, 57344, 58368, 58112, 58240, 58208, + 0, 1, 49152, 57344, 58368, 58112, 58240, 58241, + 58224, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58241, 58224, 0, 1, 49152, 57344, 58368, 58112, + 58240, 58241, 58224, 58226, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58241, 58224, 0, 1, 49152, + 57344, 58368, 58112, 58240, 58241, 58224, 58228, 0, + 1, 49152, 57344, 58368, 58112, 58240, 58241, 58224, + 58228, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58241, 58224, 58232, 58230, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58241, 58224, 0, 1, 49152, + 57344, 58368, 58112, 58240, 58241, 58224, 58232, 0, + 1, 49152, 57344, 58368, 58112, 58240, 58241, 58243, + 58232, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58241, 58243, 58232, 58234, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58241, 58243, 58232, 0, 1, + 49152, 57344, 58368, 58112, 58240, 58241, 58243, 58232, + 58236, 0, 1, 49152, 57344, 58368, 58112, 58240, + 58241, 58243, 58232, 58236, 0, 1, 49152, 57344, + 58368, 58112, 58240, 58241, 58243, 58232, 58236, 58238, + 0, 1, 49152, 57344, 58368, 58112, 0, 1, + 49152, 57344, 58368, 58112, 58240, 0, 1, 49152, + 57344, 58368, 58369, 58240, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58242, 0, 1, 49152, 57344, + 58368, 58369, 58240, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58244, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58244, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58248, 58246, 0, 1, 49152, 57344, + 58368, 58369, 58240, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58248, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58248, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58248, 58250, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58248, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58256, 58252, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58256, 58252, 0, 1, + 49152, 57344, 58368, 58369, 58240, 58256, 58257, 58254, + 0, 1, 49152, 57344, 58368, 58369, 58240, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58256, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58256, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58256, 58258, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58256, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58256, + 58260, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58256, 58260, 0, 1, 49152, 57344, 58368, 58369, + 58240, 58256, 58264, 58262, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58256, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58272, 58264, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58272, 58264, 0, 1, + 49152, 57344, 58368, 58369, 58240, 58272, 58264, 58266, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58272, + 58264, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58272, 58273, 58268, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58272, 58273, 58268, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58272, 58273, 58268, 58270, + 0, 1, 49152, 57344, 58368, 58369, 58240, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58272, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58272, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58272, 58274, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58272, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58272, + 58276, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58272, 58276, 0, 1, 49152, 57344, 58368, 58369, + 58240, 58272, 58280, 58278, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58272, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58272, 58280, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58272, 58280, 0, 1, + 49152, 57344, 58368, 58369, 58240, 58272, 58280, 58282, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58272, + 58280, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58272, 58288, 58284, 0, 1, 49152, 57344, 58368, + 58369, 58240, 58272, 58288, 58284, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58272, 58288, 58289, 58286, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58272, + 0, 1, 49152, 57344, 58368, 58369, 58240, 58304, + 58288, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58304, 58288, 0, 1, 49152, 57344, 58368, 58369, + 58240, 58304, 58288, 58290, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58304, 58288, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58304, 58288, 58292, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58304, 58288, + 58292, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58304, 58288, 58296, 58294, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58304, 58288, 0, 1, 49152, + 57344, 58368, 58369, 58240, 58304, 58305, 58296, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58304, 58305, + 58296, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58304, 58305, 58296, 58298, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58304, 58305, 58296, 0, 1, + 49152, 57344, 58368, 58369, 58240, 58304, 58305, 58296, + 58300, 0, 1, 49152, 57344, 58368, 58369, 58240, + 58304, 58305, 58307, 58300, 0, 1, 49152, 57344, + 58368, 58369, 58240, 58304, 58305, 58307, 58300, 58302, + 0, 1, 49152, 57344, 58368, 58369, 58240, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58304, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58304, 0, + 1, 49152, 57344, 58368, 58369, 58240, 58304, 58306, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 58308, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58308, 0, 1, 49152, 57344, 58368, 58369, + 58371, 58304, 58312, 58310, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58312, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58304, 58312, 0, 1, + 49152, 57344, 58368, 58369, 58371, 58304, 58312, 58314, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 58312, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58320, 58316, 0, 1, 49152, 57344, 58368, + 58369, 58371, 58304, 58320, 58316, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58304, 58320, 58321, 58318, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 58320, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58320, 0, 1, 49152, 57344, 58368, 58369, + 58371, 58304, 58320, 58322, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58320, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58304, 58320, 58324, 0, + 1, 49152, 57344, 58368, 58369, 58371, 58304, 58320, + 58324, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58320, 58328, 58326, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58320, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58304, 58336, 58328, 0, + 1, 49152, 57344, 58368, 58369, 58371, 58304, 58336, + 58328, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58336, 58328, 58330, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58336, 58328, 0, 1, + 49152, 57344, 58368, 58369, 58371, 58304, 58336, 58337, + 58332, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58336, 58337, 58332, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58336, 58337, 58332, 58334, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58304, + 58336, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58336, 0, 1, 49152, 57344, 58368, 58369, + 58371, 58304, 58336, 58338, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58304, 58336, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58304, 58336, 58340, 0, + 1, 49152, 57344, 58368, 58369, 58371, 58304, 58336, + 58340, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58304, 58336, 58344, 58342, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58375, 58336, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58375, 58336, 58344, 0, + 1, 49152, 57344, 58368, 58369, 58371, 58375, 58336, + 58344, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58375, 58336, 58344, 58346, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58375, 58336, 58344, 0, 1, + 49152, 57344, 58368, 58369, 58371, 58375, 58336, 58352, + 58348, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58375, 58336, 58352, 58348, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58375, 58336, 58352, 58353, 58350, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58375, + 58336, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58375, 58336, 58352, 0, 1, 49152, 57344, 58368, + 58369, 58371, 58375, 58336, 58352, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58375, 58336, 58352, 58354, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58375, + 58336, 58352, 0, 1, 49152, 57344, 58368, 58369, + 58371, 58375, 58336, 58352, 58356, 0, 1, 49152, + 57344, 58368, 58369, 58371, 58375, 58336, 58352, 58356, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58375, + 58336, 58352, 58360, 58358, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58375, 58336, 58352, 0, 1, + 49152, 57344, 58368, 58369, 58371, 58375, 58336, 58352, + 58360, 0, 1, 49152, 57344, 58368, 58369, 58371, + 58375, 58336, 58352, 58360, 0, 1, 49152, 57344, + 58368, 58369, 58371, 58375, 58336, 58352, 58360, 58362, + 0, 1, 49152, 57344, 58368, 58369, 58371, 58375, + 58336, 58352, 58360, 0, 1, 49152, 57344, 58368, + 58369, 58371, 58375, 58336, 58352, 58360, 58364, 0, + 1, 49152, 57344, 58368, 58369, 58371, 58375, 58336, + 58352, 58360, 58364, 0, 1, 49152, 57344, 58368, + 58369, 58371, 58375, 58336, 58352, 58360, 58364, 58366, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 58368, 0, 1, 49152, 57344, 58368, 0, 1, + 49152, 57344, 58368, 58370, 0, 1, 49152, 57344, + 58368, 0, 1, 49152, 57344, 58368, 58372, 0, + 1, 49152, 57344, 58368, 58372, 0, 1, 49152, + 57344, 58368, 58376, 58374, 0, 1, 49152, 57344, + 58368, 0, 1, 49152, 57344, 58368, 58376, 0, + 1, 49152, 57344, 58368, 58376, 0, 1, 49152, + 57344, 58368, 58376, 58378, 0, 1, 49152, 57344, + 58368, 58376, 0, 1, 49152, 57344, 58368, 58384, + 58380, 0, 1, 49152, 57344, 58368, 58384, 58380, + 0, 1, 49152, 57344, 58368, 58384, 58385, 58382, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 58368, 58384, 0, 1, 49152, 57344, 58368, + 58384, 0, 1, 49152, 57344, 58368, 58384, 58386, + 0, 1, 49152, 57344, 58368, 58384, 0, 1, + 49152, 57344, 58368, 58384, 58388, 0, 1, 49152, + 57344, 58368, 58384, 58388, 0, 1, 49152, 57344, + 58368, 58384, 58392, 58390, 0, 1, 49152, 57344, + 58368, 58384, 0, 1, 49152, 57344, 58368, 58400, + 58392, 0, 1, 49152, 57344, 58368, 58400, 58392, + 0, 1, 49152, 57344, 58368, 58400, 58392, 58394, + 0, 1, 49152, 57344, 58368, 58400, 58392, 0, + 1, 49152, 57344, 58368, 58400, 58401, 58396, 0, + 1, 49152, 57344, 58368, 58400, 58401, 58396, 0, + 1, 49152, 57344, 58368, 58400, 58401, 58396, 58398, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 58368, 58400, 0, 1, 49152, 57344, 58368, + 58400, 0, 1, 49152, 57344, 58368, 58400, 58402, + 0, 1, 49152, 57344, 58368, 58400, 0, 1, + 49152, 57344, 58368, 58400, 58404, 0, 1, 49152, + 57344, 58368, 58400, 58404, 0, 1, 49152, 57344, + 58368, 58400, 58408, 58406, 0, 1, 49152, 57344, + 58368, 58400, 0, 1, 49152, 57344, 58368, 58400, + 58408, 0, 1, 49152, 57344, 58368, 58400, 58408, + 0, 1, 49152, 57344, 58368, 58400, 58408, 58410, + 0, 1, 49152, 57344, 58368, 58400, 58408, 0, + 1, 49152, 57344, 58368, 58400, 58416, 58412, 0, + 1, 49152, 57344, 58368, 58400, 58416, 58412, 0, + 1, 49152, 57344, 58368, 58400, 58416, 58417, 58414, + 0, 1, 49152, 57344, 58368, 58400, 0, 1, + 49152, 57344, 58368, 58432, 58416, 0, 1, 49152, + 57344, 58368, 58432, 58416, 0, 1, 49152, 57344, + 58368, 58432, 58416, 58418, 0, 1, 49152, 57344, + 58368, 58432, 58416, 0, 1, 49152, 57344, 58368, + 58432, 58416, 58420, 0, 1, 49152, 57344, 58368, + 58432, 58416, 58420, 0, 1, 49152, 57344, 58368, + 58432, 58416, 58424, 58422, 0, 1, 49152, 57344, + 58368, 58432, 58416, 0, 1, 49152, 57344, 58368, + 58432, 58433, 58424, 0, 1, 49152, 57344, 58368, + 58432, 58433, 58424, 0, 1, 49152, 57344, 58368, + 58432, 58433, 58424, 58426, 0, 1, 49152, 57344, + 58368, 58432, 58433, 58424, 0, 1, 49152, 57344, + 58368, 58432, 58433, 58424, 58428, 0, 1, 49152, + 57344, 58368, 58432, 58433, 58435, 58428, 0, 1, + 49152, 57344, 58368, 58432, 58433, 58435, 58428, 58430, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 58368, 58432, 0, 1, 49152, 57344, 58368, + 58432, 0, 1, 49152, 57344, 58368, 58432, 58434, + 0, 1, 49152, 57344, 58368, 58432, 0, 1, + 49152, 57344, 58368, 58432, 58436, 0, 1, 49152, + 57344, 58368, 58432, 58436, 0, 1, 49152, 57344, + 58368, 58432, 58440, 58438, 0, 1, 49152, 57344, + 58368, 58432, 0, 1, 49152, 57344, 58368, 58432, + 58440, 0, 1, 49152, 57344, 58368, 58432, 58440, + 0, 1, 49152, 57344, 58368, 58432, 58440, 58442, + 0, 1, 49152, 57344, 58368, 58432, 58440, 0, + 1, 49152, 57344, 58368, 58432, 58448, 58444, 0, + 1, 49152, 57344, 58368, 58432, 58448, 58444, 0, + 1, 49152, 57344, 58368, 58432, 58448, 58449, 58446, + 0, 1, 49152, 57344, 58368, 58432, 0, 1, + 49152, 57344, 58368, 58432, 58448, 0, 1, 49152, + 57344, 58368, 58432, 58448, 0, 1, 49152, 57344, + 58368, 58432, 58448, 58450, 0, 1, 49152, 57344, + 58368, 58432, 58448, 0, 1, 49152, 57344, 58368, + 58432, 58448, 58452, 0, 1, 49152, 57344, 58368, + 58432, 58448, 58452, 0, 1, 49152, 57344, 58368, + 58432, 58448, 58456, 58454, 0, 1, 49152, 57344, + 58368, 58432, 58448, 0, 1, 49152, 57344, 58368, + 58432, 58464, 58456, 0, 1, 49152, 57344, 58368, + 58432, 58464, 58456, 0, 1, 49152, 57344, 58368, + 58432, 58464, 58456, 58458, 0, 1, 49152, 57344, + 58368, 58432, 58464, 58456, 0, 1, 49152, 57344, + 58368, 58432, 58464, 58465, 58460, 0, 1, 49152, + 57344, 58368, 58432, 58464, 58465, 58460, 0, 1, + 49152, 57344, 58368, 58432, 58464, 58465, 58460, 58462, + 0, 1, 49152, 57344, 58368, 58432, 0, 1, + 49152, 57344, 58368, 58496, 58464, 0, 1, 49152, + 57344, 58368, 58496, 58464, 0, 1, 49152, 57344, + 58368, 58496, 58464, 58466, 0, 1, 49152, 57344, + 58368, 58496, 58464, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58468, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58468, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58472, 58470, 0, 1, 49152, 57344, + 58368, 58496, 58464, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58472, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58472, 0, 1, 49152, 57344, 58368, + 58496, 58464, 58472, 58474, 0, 1, 49152, 57344, + 58368, 58496, 58464, 58472, 0, 1, 49152, 57344, + 58368, 58496, 58464, 58480, 58476, 0, 1, 49152, + 57344, 58368, 58496, 58464, 58480, 58476, 0, 1, + 49152, 57344, 58368, 58496, 58464, 58480, 58481, 58478, + 0, 1, 49152, 57344, 58368, 58496, 58464, 0, + 1, 49152, 57344, 58368, 58496, 58497, 58480, 0, + 1, 49152, 57344, 58368, 58496, 58497, 58480, 0, + 1, 49152, 57344, 58368, 58496, 58497, 58480, 58482, + 0, 1, 49152, 57344, 58368, 58496, 58497, 58480, + 0, 1, 49152, 57344, 58368, 58496, 58497, 58480, + 58484, 0, 1, 49152, 57344, 58368, 58496, 58497, + 58480, 58484, 0, 1, 49152, 57344, 58368, 58496, + 58497, 58480, 58488, 58486, 0, 1, 49152, 57344, + 58368, 58496, 58497, 58480, 0, 1, 49152, 57344, + 58368, 58496, 58497, 58480, 58488, 0, 1, 49152, + 57344, 58368, 58496, 58497, 58499, 58488, 0, 1, + 49152, 57344, 58368, 58496, 58497, 58499, 58488, 58490, + 0, 1, 49152, 57344, 58368, 58496, 58497, 58499, + 58488, 0, 1, 49152, 57344, 58368, 58496, 58497, + 58499, 58488, 58492, 0, 1, 49152, 57344, 58368, + 58496, 58497, 58499, 58488, 58492, 0, 1, 49152, + 57344, 58368, 58496, 58497, 58499, 58488, 58492, 58494, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 58368, 58496, 0, 1, 49152, 57344, 58368, + 58496, 0, 1, 49152, 57344, 58368, 58496, 58498, + 0, 1, 49152, 57344, 58368, 58496, 0, 1, + 49152, 57344, 58368, 58496, 58500, 0, 1, 49152, + 57344, 58368, 58496, 58500, 0, 1, 49152, 57344, + 58368, 58496, 58504, 58502, 0, 1, 49152, 57344, + 58368, 58496, 0, 1, 49152, 57344, 58368, 58496, + 58504, 0, 1, 49152, 57344, 58368, 58496, 58504, + 0, 1, 49152, 57344, 58368, 58496, 58504, 58506, + 0, 1, 49152, 57344, 58368, 58496, 58504, 0, + 1, 49152, 57344, 58368, 58496, 58512, 58508, 0, + 1, 49152, 57344, 58368, 58496, 58512, 58508, 0, + 1, 49152, 57344, 58368, 58496, 58512, 58513, 58510, + 0, 1, 49152, 57344, 58368, 58496, 0, 1, + 49152, 57344, 58368, 58496, 58512, 0, 1, 49152, + 57344, 58368, 58496, 58512, 0, 1, 49152, 57344, + 58368, 58496, 58512, 58514, 0, 1, 49152, 57344, + 58368, 58496, 58512, 0, 1, 49152, 57344, 58368, + 58496, 58512, 58516, 0, 1, 49152, 57344, 58368, + 58496, 58512, 58516, 0, 1, 49152, 57344, 58368, + 58496, 58512, 58520, 58518, 0, 1, 49152, 57344, + 58368, 58496, 58512, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58520, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58520, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58520, 58522, 0, 1, 49152, 57344, + 58368, 58496, 58528, 58520, 0, 1, 49152, 57344, + 58368, 58496, 58528, 58529, 58524, 0, 1, 49152, + 57344, 58368, 58496, 58528, 58529, 58524, 0, 1, + 49152, 57344, 58368, 58496, 58528, 58529, 58524, 58526, + 0, 1, 49152, 57344, 58368, 58496, 0, 1, + 49152, 57344, 58368, 58496, 58528, 0, 1, 49152, + 57344, 58368, 58496, 58528, 0, 1, 49152, 57344, + 58368, 58496, 58528, 58530, 0, 1, 49152, 57344, + 58368, 58496, 58528, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58532, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58532, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58536, 58534, 0, 1, 49152, 57344, + 58368, 58496, 58528, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58536, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58536, 0, 1, 49152, 57344, 58368, + 58496, 58528, 58536, 58538, 0, 1, 49152, 57344, + 58368, 58496, 58528, 58536, 0, 1, 49152, 57344, + 58368, 58496, 58528, 58544, 58540, 0, 1, 49152, + 57344, 58368, 58496, 58528, 58544, 58540, 0, 1, + 49152, 57344, 58368, 58496, 58528, 58544, 58545, 58542, + 0, 1, 49152, 57344, 58368, 58496, 58528, 0, + 1, 49152, 57344, 58368, 58496, 58560, 58544, 0, + 1, 49152, 57344, 58368, 58496, 58560, 58544, 0, + 1, 49152, 57344, 58368, 58496, 58560, 58544, 58546, + 0, 1, 49152, 57344, 58368, 58496, 58560, 58544, + 0, 1, 49152, 57344, 58368, 58496, 58560, 58544, + 58548, 0, 1, 49152, 57344, 58368, 58496, 58560, + 58544, 58548, 0, 1, 49152, 57344, 58368, 58496, + 58560, 58544, 58552, 58550, 0, 1, 49152, 57344, + 58368, 58496, 58560, 58544, 0, 1, 49152, 57344, + 58368, 58496, 58560, 58561, 58552, 0, 1, 49152, + 57344, 58368, 58496, 58560, 58561, 58552, 0, 1, + 49152, 57344, 58368, 58496, 58560, 58561, 58552, 58554, + 0, 1, 49152, 57344, 58368, 58496, 58560, 58561, + 58552, 0, 1, 49152, 57344, 58368, 58496, 58560, + 58561, 58552, 58556, 0, 1, 49152, 57344, 58368, + 58496, 58560, 58561, 58563, 58556, 0, 1, 49152, + 57344, 58368, 58496, 58560, 58561, 58563, 58556, 58558, + 0, 1, 49152, 57344, 58368, 58496, 0, 1, + 49152, 57344, 58368, 58624, 58560, 0, 1, 49152, + 57344, 58368, 58624, 58560, 0, 1, 49152, 57344, + 58368, 58624, 58560, 58562, 0, 1, 49152, 57344, + 58368, 58624, 58560, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58564, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58564, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58568, 58566, 0, 1, 49152, 57344, + 58368, 58624, 58560, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58568, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58568, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58568, 58570, 0, 1, 49152, 57344, + 58368, 58624, 58560, 58568, 0, 1, 49152, 57344, + 58368, 58624, 58560, 58576, 58572, 0, 1, 49152, + 57344, 58368, 58624, 58560, 58576, 58572, 0, 1, + 49152, 57344, 58368, 58624, 58560, 58576, 58577, 58574, + 0, 1, 49152, 57344, 58368, 58624, 58560, 0, + 1, 49152, 57344, 58368, 58624, 58560, 58576, 0, + 1, 49152, 57344, 58368, 58624, 58560, 58576, 0, + 1, 49152, 57344, 58368, 58624, 58560, 58576, 58578, + 0, 1, 49152, 57344, 58368, 58624, 58560, 58576, + 0, 1, 49152, 57344, 58368, 58624, 58560, 58576, + 58580, 0, 1, 49152, 57344, 58368, 58624, 58560, + 58576, 58580, 0, 1, 49152, 57344, 58368, 58624, + 58560, 58576, 58584, 58582, 0, 1, 49152, 57344, + 58368, 58624, 58560, 58576, 0, 1, 49152, 57344, + 58368, 58624, 58560, 58592, 58584, 0, 1, 49152, + 57344, 58368, 58624, 58560, 58592, 58584, 0, 1, + 49152, 57344, 58368, 58624, 58560, 58592, 58584, 58586, + 0, 1, 49152, 57344, 58368, 58624, 58560, 58592, + 58584, 0, 1, 49152, 57344, 58368, 58624, 58560, + 58592, 58593, 58588, 0, 1, 49152, 57344, 58368, + 58624, 58560, 58592, 58593, 58588, 0, 1, 49152, + 57344, 58368, 58624, 58560, 58592, 58593, 58588, 58590, + 0, 1, 49152, 57344, 58368, 58624, 58560, 0, + 1, 49152, 57344, 58368, 58624, 58625, 58592, 0, + 1, 49152, 57344, 58368, 58624, 58625, 58592, 0, + 1, 49152, 57344, 58368, 58624, 58625, 58592, 58594, + 0, 1, 49152, 57344, 58368, 58624, 58625, 58592, + 0, 1, 49152, 57344, 58368, 58624, 58625, 58592, + 58596, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58592, 58596, 0, 1, 49152, 57344, 58368, 58624, + 58625, 58592, 58600, 58598, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58592, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58592, 58600, 0, 1, 49152, + 57344, 58368, 58624, 58625, 58592, 58600, 0, 1, + 49152, 57344, 58368, 58624, 58625, 58592, 58600, 58602, + 0, 1, 49152, 57344, 58368, 58624, 58625, 58592, + 58600, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58592, 58608, 58604, 0, 1, 49152, 57344, 58368, + 58624, 58625, 58592, 58608, 58604, 0, 1, 49152, + 57344, 58368, 58624, 58625, 58592, 58608, 58609, 58606, + 0, 1, 49152, 57344, 58368, 58624, 58625, 58592, + 0, 1, 49152, 57344, 58368, 58624, 58625, 58592, + 58608, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58627, 58608, 0, 1, 49152, 57344, 58368, 58624, + 58625, 58627, 58608, 58610, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58627, 58608, 0, 1, 49152, + 57344, 58368, 58624, 58625, 58627, 58608, 58612, 0, + 1, 49152, 57344, 58368, 58624, 58625, 58627, 58608, + 58612, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58627, 58608, 58616, 58614, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58627, 58608, 0, 1, 49152, + 57344, 58368, 58624, 58625, 58627, 58608, 58616, 0, + 1, 49152, 57344, 58368, 58624, 58625, 58627, 58608, + 58616, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58627, 58608, 58616, 58618, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58627, 58631, 58616, 0, 1, + 49152, 57344, 58368, 58624, 58625, 58627, 58631, 58616, + 58620, 0, 1, 49152, 57344, 58368, 58624, 58625, + 58627, 58631, 58616, 58620, 0, 1, 49152, 57344, + 58368, 58624, 58625, 58627, 58631, 58616, 58620, 58622, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 58368, 58624, 0, 1, 49152, 57344, 58368, + 58624, 0, 1, 49152, 57344, 58368, 58624, 58626, + 0, 1, 49152, 57344, 58368, 58624, 0, 1, + 49152, 57344, 58368, 58624, 58628, 0, 1, 49152, + 57344, 58368, 58624, 58628, 0, 1, 49152, 57344, + 58368, 58624, 58632, 58630, 0, 1, 49152, 57344, + 58368, 58624, 0, 1, 49152, 57344, 58368, 58624, + 58632, 0, 1, 49152, 57344, 58368, 58624, 58632, + 0, 1, 49152, 57344, 58368, 58624, 58632, 58634, + 0, 1, 49152, 57344, 58368, 58624, 58632, 0, + 1, 49152, 57344, 58368, 58624, 58640, 58636, 0, + 1, 49152, 57344, 58368, 58624, 58640, 58636, 0, + 1, 49152, 57344, 58368, 58624, 58640, 58641, 58638, + 0, 1, 49152, 57344, 58368, 58624, 0, 1, + 49152, 57344, 58368, 58624, 58640, 0, 1, 49152, + 57344, 58368, 58624, 58640, 0, 1, 49152, 57344, + 58368, 58624, 58640, 58642, 0, 1, 49152, 57344, + 58368, 58624, 58640, 0, 1, 49152, 57344, 58368, + 58624, 58640, 58644, 0, 1, 49152, 57344, 58368, + 58624, 58640, 58644, 0, 1, 49152, 57344, 58368, + 58624, 58640, 58648, 58646, 0, 1, 49152, 57344, + 58368, 58624, 58640, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58648, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58648, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58648, 58650, 0, 1, 49152, 57344, + 58368, 58624, 58656, 58648, 0, 1, 49152, 57344, + 58368, 58624, 58656, 58657, 58652, 0, 1, 49152, + 57344, 58368, 58624, 58656, 58657, 58652, 0, 1, + 49152, 57344, 58368, 58624, 58656, 58657, 58652, 58654, + 0, 1, 49152, 57344, 58368, 58624, 0, 1, + 49152, 57344, 58368, 58624, 58656, 0, 1, 49152, + 57344, 58368, 58624, 58656, 0, 1, 49152, 57344, + 58368, 58624, 58656, 58658, 0, 1, 49152, 57344, + 58368, 58624, 58656, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58660, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58660, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58664, 58662, 0, 1, 49152, 57344, + 58368, 58624, 58656, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58664, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58664, 0, 1, 49152, 57344, 58368, + 58624, 58656, 58664, 58666, 0, 1, 49152, 57344, + 58368, 58624, 58656, 58664, 0, 1, 49152, 57344, + 58368, 58624, 58656, 58672, 58668, 0, 1, 49152, + 57344, 58368, 58624, 58656, 58672, 58668, 0, 1, + 49152, 57344, 58368, 58624, 58656, 58672, 58673, 58670, + 0, 1, 49152, 57344, 58368, 58624, 58656, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58672, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58672, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58672, 58674, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58672, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58672, + 58676, 0, 1, 49152, 57344, 58368, 58624, 58688, + 58672, 58676, 0, 1, 49152, 57344, 58368, 58624, + 58688, 58672, 58680, 58678, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58672, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58689, 58680, 0, 1, 49152, + 57344, 58368, 58624, 58688, 58689, 58680, 0, 1, + 49152, 57344, 58368, 58624, 58688, 58689, 58680, 58682, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58689, + 58680, 0, 1, 49152, 57344, 58368, 58624, 58688, + 58689, 58680, 58684, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58689, 58691, 58684, 0, 1, 49152, + 57344, 58368, 58624, 58688, 58689, 58691, 58684, 58686, + 0, 1, 49152, 57344, 58368, 58624, 0, 1, + 49152, 57344, 58368, 58624, 58688, 0, 1, 49152, + 57344, 58368, 58624, 58688, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58690, 0, 1, 49152, 57344, + 58368, 58624, 58688, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58692, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58692, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58696, 58694, 0, 1, 49152, 57344, + 58368, 58624, 58688, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58696, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58696, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58696, 58698, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58696, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58704, 58700, 0, 1, 49152, + 57344, 58368, 58624, 58688, 58704, 58700, 0, 1, + 49152, 57344, 58368, 58624, 58688, 58704, 58705, 58702, + 0, 1, 49152, 57344, 58368, 58624, 58688, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58704, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58704, 0, + 1, 49152, 57344, 58368, 58624, 58688, 58704, 58706, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58704, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58704, + 58708, 0, 1, 49152, 57344, 58368, 58624, 58688, + 58704, 58708, 0, 1, 49152, 57344, 58368, 58624, + 58688, 58704, 58712, 58710, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58704, 0, 1, 49152, 57344, + 58368, 58624, 58688, 58720, 58712, 0, 1, 49152, + 57344, 58368, 58624, 58688, 58720, 58712, 0, 1, + 49152, 57344, 58368, 58624, 58688, 58720, 58712, 58714, + 0, 1, 49152, 57344, 58368, 58624, 58688, 58720, + 58712, 0, 1, 49152, 57344, 58368, 58624, 58688, + 58720, 58721, 58716, 0, 1, 49152, 57344, 58368, + 58624, 58688, 58720, 58721, 58716, 0, 1, 49152, + 57344, 58368, 58624, 58688, 58720, 58721, 58716, 58718, + 0, 1, 49152, 57344, 58368, 58624, 58688, 0, + 1, 49152, 57344, 58368, 58624, 58752, 58720, 0, + 1, 49152, 57344, 58368, 58624, 58752, 58720, 0, + 1, 49152, 57344, 58368, 58624, 58752, 58720, 58722, + 0, 1, 49152, 57344, 58368, 58624, 58752, 58720, + 0, 1, 49152, 57344, 58368, 58624, 58752, 58720, + 58724, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58720, 58724, 0, 1, 49152, 57344, 58368, 58624, + 58752, 58720, 58728, 58726, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58720, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58720, 58728, 0, 1, 49152, + 57344, 58368, 58624, 58752, 58720, 58728, 0, 1, + 49152, 57344, 58368, 58624, 58752, 58720, 58728, 58730, + 0, 1, 49152, 57344, 58368, 58624, 58752, 58720, + 58728, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58720, 58736, 58732, 0, 1, 49152, 57344, 58368, + 58624, 58752, 58720, 58736, 58732, 0, 1, 49152, + 57344, 58368, 58624, 58752, 58720, 58736, 58737, 58734, + 0, 1, 49152, 57344, 58368, 58624, 58752, 58720, + 0, 1, 49152, 57344, 58368, 58624, 58752, 58753, + 58736, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58753, 58736, 0, 1, 49152, 57344, 58368, 58624, + 58752, 58753, 58736, 58738, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58753, 58736, 0, 1, 49152, + 57344, 58368, 58624, 58752, 58753, 58736, 58740, 0, + 1, 49152, 57344, 58368, 58624, 58752, 58753, 58736, + 58740, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58753, 58736, 58744, 58742, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58753, 58736, 0, 1, 49152, + 57344, 58368, 58624, 58752, 58753, 58736, 58744, 0, + 1, 49152, 57344, 58368, 58624, 58752, 58753, 58755, + 58744, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58753, 58755, 58744, 58746, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58753, 58755, 58744, 0, 1, + 49152, 57344, 58368, 58624, 58752, 58753, 58755, 58744, + 58748, 0, 1, 49152, 57344, 58368, 58624, 58752, + 58753, 58755, 58744, 58748, 0, 1, 49152, 57344, + 58368, 58624, 58752, 58753, 58755, 58744, 58748, 58750, + 0, 1, 49152, 57344, 58368, 58624, 0, 1, + 49152, 57344, 58368, 58880, 58752, 0, 1, 49152, + 57344, 58368, 58880, 58752, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58754, 0, 1, 49152, 57344, + 58368, 58880, 58752, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58756, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58756, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58760, 58758, 0, 1, 49152, 57344, + 58368, 58880, 58752, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58760, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58760, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58760, 58762, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58760, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58768, 58764, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58768, 58764, 0, 1, + 49152, 57344, 58368, 58880, 58752, 58768, 58769, 58766, + 0, 1, 49152, 57344, 58368, 58880, 58752, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58768, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58768, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58768, 58770, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58768, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58768, + 58772, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58768, 58772, 0, 1, 49152, 57344, 58368, 58880, + 58752, 58768, 58776, 58774, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58768, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58784, 58776, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58784, 58776, 0, 1, + 49152, 57344, 58368, 58880, 58752, 58784, 58776, 58778, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58784, + 58776, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58784, 58785, 58780, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58784, 58785, 58780, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58784, 58785, 58780, 58782, + 0, 1, 49152, 57344, 58368, 58880, 58752, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58784, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58784, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58784, 58786, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58784, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58784, + 58788, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58784, 58788, 0, 1, 49152, 57344, 58368, 58880, + 58752, 58784, 58792, 58790, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58784, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58784, 58792, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58784, 58792, 0, 1, + 49152, 57344, 58368, 58880, 58752, 58784, 58792, 58794, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58784, + 58792, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58784, 58800, 58796, 0, 1, 49152, 57344, 58368, + 58880, 58752, 58784, 58800, 58796, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58784, 58800, 58801, 58798, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58784, + 0, 1, 49152, 57344, 58368, 58880, 58752, 58816, + 58800, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58816, 58800, 0, 1, 49152, 57344, 58368, 58880, + 58752, 58816, 58800, 58802, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58816, 58800, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58816, 58800, 58804, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58816, 58800, + 58804, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58816, 58800, 58808, 58806, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58816, 58800, 0, 1, 49152, + 57344, 58368, 58880, 58752, 58816, 58817, 58808, 0, + 1, 49152, 57344, 58368, 58880, 58752, 58816, 58817, + 58808, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58816, 58817, 58808, 58810, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58816, 58817, 58808, 0, 1, + 49152, 57344, 58368, 58880, 58752, 58816, 58817, 58808, + 58812, 0, 1, 49152, 57344, 58368, 58880, 58752, + 58816, 58817, 58819, 58812, 0, 1, 49152, 57344, + 58368, 58880, 58752, 58816, 58817, 58819, 58812, 58814, + 0, 1, 49152, 57344, 58368, 58880, 58752, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58816, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58816, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58816, 58818, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 58820, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58820, 0, 1, 49152, 57344, 58368, 58880, + 58881, 58816, 58824, 58822, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 58824, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58816, 58824, 0, 1, + 49152, 57344, 58368, 58880, 58881, 58816, 58824, 58826, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 58824, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58832, 58828, 0, 1, 49152, 57344, 58368, + 58880, 58881, 58816, 58832, 58828, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58816, 58832, 58833, 58830, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 58832, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58832, 0, 1, 49152, 57344, 58368, 58880, + 58881, 58816, 58832, 58834, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 58832, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58816, 58832, 58836, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58816, 58832, + 58836, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58832, 58840, 58838, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 58832, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58816, 58848, 58840, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58816, 58848, + 58840, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58848, 58840, 58842, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 58848, 58840, 0, 1, + 49152, 57344, 58368, 58880, 58881, 58816, 58848, 58849, + 58844, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58816, 58848, 58849, 58844, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58816, 58848, 58849, 58844, 58846, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58816, + 58848, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58848, 0, 1, 49152, 57344, 58368, 58880, + 58881, 58883, 58848, 58850, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58848, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58883, 58848, 58852, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58883, 58848, + 58852, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58848, 58856, 58854, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58848, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58883, 58848, 58856, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58883, 58848, + 58856, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58848, 58856, 58858, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58848, 58856, 0, 1, + 49152, 57344, 58368, 58880, 58881, 58883, 58848, 58864, + 58860, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58848, 58864, 58860, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58848, 58864, 58865, 58862, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58883, + 58848, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58848, 58864, 0, 1, 49152, 57344, 58368, + 58880, 58881, 58883, 58848, 58864, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58883, 58848, 58864, 58866, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58883, + 58887, 58864, 0, 1, 49152, 57344, 58368, 58880, + 58881, 58883, 58887, 58864, 58868, 0, 1, 49152, + 57344, 58368, 58880, 58881, 58883, 58887, 58864, 58868, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58883, + 58887, 58864, 58872, 58870, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58887, 58864, 0, 1, + 49152, 57344, 58368, 58880, 58881, 58883, 58887, 58864, + 58872, 0, 1, 49152, 57344, 58368, 58880, 58881, + 58883, 58887, 58864, 58872, 0, 1, 49152, 57344, + 58368, 58880, 58881, 58883, 58887, 58864, 58872, 58874, + 0, 1, 49152, 57344, 58368, 58880, 58881, 58883, + 58887, 58864, 58872, 0, 1, 49152, 57344, 58368, + 58880, 58881, 58883, 58887, 58864, 58872, 58876, 0, + 1, 49152, 57344, 58368, 58880, 58881, 58883, 58887, + 58864, 58872, 58876, 0, 1, 49152, 57344, 58368, + 58880, 58881, 58883, 58887, 58864, 58872, 58876, 58878, + 0, 1, 49152, 57344, 58368, 0, 1, 49152, + 57344, 59392, 58880, 0, 1, 49152, 57344, 59392, + 58880, 0, 1, 49152, 57344, 59392, 58880, 58882, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 58884, 0, 1, 49152, + 57344, 59392, 58880, 58884, 0, 1, 49152, 57344, + 59392, 58880, 58888, 58886, 0, 1, 49152, 57344, + 59392, 58880, 0, 1, 49152, 57344, 59392, 58880, + 58888, 0, 1, 49152, 57344, 59392, 58880, 58888, + 0, 1, 49152, 57344, 59392, 58880, 58888, 58890, + 0, 1, 49152, 57344, 59392, 58880, 58888, 0, + 1, 49152, 57344, 59392, 58880, 58896, 58892, 0, + 1, 49152, 57344, 59392, 58880, 58896, 58892, 0, + 1, 49152, 57344, 59392, 58880, 58896, 58897, 58894, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 58896, 0, 1, 49152, + 57344, 59392, 58880, 58896, 0, 1, 49152, 57344, + 59392, 58880, 58896, 58898, 0, 1, 49152, 57344, + 59392, 58880, 58896, 0, 1, 49152, 57344, 59392, + 58880, 58896, 58900, 0, 1, 49152, 57344, 59392, + 58880, 58896, 58900, 0, 1, 49152, 57344, 59392, + 58880, 58896, 58904, 58902, 0, 1, 49152, 57344, + 59392, 58880, 58896, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58904, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58904, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58904, 58906, 0, 1, 49152, 57344, + 59392, 58880, 58912, 58904, 0, 1, 49152, 57344, + 59392, 58880, 58912, 58913, 58908, 0, 1, 49152, + 57344, 59392, 58880, 58912, 58913, 58908, 0, 1, + 49152, 57344, 59392, 58880, 58912, 58913, 58908, 58910, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 58912, 0, 1, 49152, + 57344, 59392, 58880, 58912, 0, 1, 49152, 57344, + 59392, 58880, 58912, 58914, 0, 1, 49152, 57344, + 59392, 58880, 58912, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58916, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58916, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58920, 58918, 0, 1, 49152, 57344, + 59392, 58880, 58912, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58920, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58920, 0, 1, 49152, 57344, 59392, + 58880, 58912, 58920, 58922, 0, 1, 49152, 57344, + 59392, 58880, 58912, 58920, 0, 1, 49152, 57344, + 59392, 58880, 58912, 58928, 58924, 0, 1, 49152, + 57344, 59392, 58880, 58912, 58928, 58924, 0, 1, + 49152, 57344, 59392, 58880, 58912, 58928, 58929, 58926, + 0, 1, 49152, 57344, 59392, 58880, 58912, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58928, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58928, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58928, 58930, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58928, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58928, + 58932, 0, 1, 49152, 57344, 59392, 58880, 58944, + 58928, 58932, 0, 1, 49152, 57344, 59392, 58880, + 58944, 58928, 58936, 58934, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58928, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58945, 58936, 0, 1, 49152, + 57344, 59392, 58880, 58944, 58945, 58936, 0, 1, + 49152, 57344, 59392, 58880, 58944, 58945, 58936, 58938, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58945, + 58936, 0, 1, 49152, 57344, 59392, 58880, 58944, + 58945, 58936, 58940, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58945, 58947, 58940, 0, 1, 49152, + 57344, 59392, 58880, 58944, 58945, 58947, 58940, 58942, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 58944, 0, 1, 49152, + 57344, 59392, 58880, 58944, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58946, 0, 1, 49152, 57344, + 59392, 58880, 58944, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58948, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58948, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58952, 58950, 0, 1, 49152, 57344, + 59392, 58880, 58944, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58952, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58952, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58952, 58954, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58952, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58960, 58956, 0, 1, 49152, + 57344, 59392, 58880, 58944, 58960, 58956, 0, 1, + 49152, 57344, 59392, 58880, 58944, 58960, 58961, 58958, + 0, 1, 49152, 57344, 59392, 58880, 58944, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58960, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58960, 0, + 1, 49152, 57344, 59392, 58880, 58944, 58960, 58962, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58960, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58960, + 58964, 0, 1, 49152, 57344, 59392, 58880, 58944, + 58960, 58964, 0, 1, 49152, 57344, 59392, 58880, + 58944, 58960, 58968, 58966, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58960, 0, 1, 49152, 57344, + 59392, 58880, 58944, 58976, 58968, 0, 1, 49152, + 57344, 59392, 58880, 58944, 58976, 58968, 0, 1, + 49152, 57344, 59392, 58880, 58944, 58976, 58968, 58970, + 0, 1, 49152, 57344, 59392, 58880, 58944, 58976, + 58968, 0, 1, 49152, 57344, 59392, 58880, 58944, + 58976, 58977, 58972, 0, 1, 49152, 57344, 59392, + 58880, 58944, 58976, 58977, 58972, 0, 1, 49152, + 57344, 59392, 58880, 58944, 58976, 58977, 58972, 58974, + 0, 1, 49152, 57344, 59392, 58880, 58944, 0, + 1, 49152, 57344, 59392, 58880, 59008, 58976, 0, + 1, 49152, 57344, 59392, 58880, 59008, 58976, 0, + 1, 49152, 57344, 59392, 58880, 59008, 58976, 58978, + 0, 1, 49152, 57344, 59392, 58880, 59008, 58976, + 0, 1, 49152, 57344, 59392, 58880, 59008, 58976, + 58980, 0, 1, 49152, 57344, 59392, 58880, 59008, + 58976, 58980, 0, 1, 49152, 57344, 59392, 58880, + 59008, 58976, 58984, 58982, 0, 1, 49152, 57344, + 59392, 58880, 59008, 58976, 0, 1, 49152, 57344, + 59392, 58880, 59008, 58976, 58984, 0, 1, 49152, + 57344, 59392, 58880, 59008, 58976, 58984, 0, 1, + 49152, 57344, 59392, 58880, 59008, 58976, 58984, 58986, + 0, 1, 49152, 57344, 59392, 58880, 59008, 58976, + 58984, 0, 1, 49152, 57344, 59392, 58880, 59008, + 58976, 58992, 58988, 0, 1, 49152, 57344, 59392, + 58880, 59008, 58976, 58992, 58988, 0, 1, 49152, + 57344, 59392, 58880, 59008, 58976, 58992, 58993, 58990, + 0, 1, 49152, 57344, 59392, 58880, 59008, 58976, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59009, + 58992, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59009, 58992, 0, 1, 49152, 57344, 59392, 58880, + 59008, 59009, 58992, 58994, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59009, 58992, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59009, 58992, 58996, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59009, 58992, + 58996, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59009, 58992, 59000, 58998, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59009, 58992, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59009, 58992, 59000, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59009, 59011, + 59000, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59009, 59011, 59000, 59002, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59009, 59011, 59000, 0, 1, + 49152, 57344, 59392, 58880, 59008, 59009, 59011, 59000, + 59004, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59009, 59011, 59000, 59004, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59009, 59011, 59000, 59004, 59006, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 59008, 0, 1, 49152, + 57344, 59392, 58880, 59008, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59010, 0, 1, 49152, 57344, + 59392, 58880, 59008, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59012, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59012, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59016, 59014, 0, 1, 49152, 57344, + 59392, 58880, 59008, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59016, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59016, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59016, 59018, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59016, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59024, 59020, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59024, 59020, 0, 1, + 49152, 57344, 59392, 58880, 59008, 59024, 59025, 59022, + 0, 1, 49152, 57344, 59392, 58880, 59008, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59024, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59024, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59024, 59026, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59024, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59024, + 59028, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59024, 59028, 0, 1, 49152, 57344, 59392, 58880, + 59008, 59024, 59032, 59030, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59024, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59040, 59032, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59040, 59032, 0, 1, + 49152, 57344, 59392, 58880, 59008, 59040, 59032, 59034, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59040, + 59032, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59040, 59041, 59036, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59040, 59041, 59036, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59040, 59041, 59036, 59038, + 0, 1, 49152, 57344, 59392, 58880, 59008, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59040, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59040, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59040, 59042, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59040, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59040, + 59044, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59040, 59044, 0, 1, 49152, 57344, 59392, 58880, + 59008, 59040, 59048, 59046, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59040, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59040, 59048, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59040, 59048, 0, 1, + 49152, 57344, 59392, 58880, 59008, 59040, 59048, 59050, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59040, + 59048, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59040, 59056, 59052, 0, 1, 49152, 57344, 59392, + 58880, 59008, 59040, 59056, 59052, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59040, 59056, 59057, 59054, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59040, + 0, 1, 49152, 57344, 59392, 58880, 59008, 59072, + 59056, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59072, 59056, 0, 1, 49152, 57344, 59392, 58880, + 59008, 59072, 59056, 59058, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59072, 59056, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59072, 59056, 59060, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59072, 59056, + 59060, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59072, 59056, 59064, 59062, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59072, 59056, 0, 1, 49152, + 57344, 59392, 58880, 59008, 59072, 59073, 59064, 0, + 1, 49152, 57344, 59392, 58880, 59008, 59072, 59073, + 59064, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59072, 59073, 59064, 59066, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59072, 59073, 59064, 0, 1, + 49152, 57344, 59392, 58880, 59008, 59072, 59073, 59064, + 59068, 0, 1, 49152, 57344, 59392, 58880, 59008, + 59072, 59073, 59075, 59068, 0, 1, 49152, 57344, + 59392, 58880, 59008, 59072, 59073, 59075, 59068, 59070, + 0, 1, 49152, 57344, 59392, 58880, 59008, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59072, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59072, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59072, 59074, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 59076, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59076, 0, 1, 49152, 57344, 59392, 58880, + 59136, 59072, 59080, 59078, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 59080, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59072, 59080, 0, 1, + 49152, 57344, 59392, 58880, 59136, 59072, 59080, 59082, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 59080, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59088, 59084, 0, 1, 49152, 57344, 59392, + 58880, 59136, 59072, 59088, 59084, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59072, 59088, 59089, 59086, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 59088, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59088, 0, 1, 49152, 57344, 59392, 58880, + 59136, 59072, 59088, 59090, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 59088, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59072, 59088, 59092, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59072, 59088, + 59092, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59088, 59096, 59094, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 59088, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59072, 59104, 59096, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59072, 59104, + 59096, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59104, 59096, 59098, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 59104, 59096, 0, 1, + 49152, 57344, 59392, 58880, 59136, 59072, 59104, 59105, + 59100, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59072, 59104, 59105, 59100, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59072, 59104, 59105, 59100, 59102, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59072, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59137, + 59104, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59104, 0, 1, 49152, 57344, 59392, 58880, + 59136, 59137, 59104, 59106, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59104, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59137, 59104, 59108, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59137, 59104, + 59108, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59104, 59112, 59110, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59104, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59137, 59104, 59112, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59137, 59104, + 59112, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59104, 59112, 59114, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59104, 59112, 0, 1, + 49152, 57344, 59392, 58880, 59136, 59137, 59104, 59120, + 59116, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59104, 59120, 59116, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59104, 59120, 59121, 59118, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59137, + 59104, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59104, 59120, 0, 1, 49152, 57344, 59392, + 58880, 59136, 59137, 59139, 59120, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59137, 59139, 59120, 59122, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59137, + 59139, 59120, 0, 1, 49152, 57344, 59392, 58880, + 59136, 59137, 59139, 59120, 59124, 0, 1, 49152, + 57344, 59392, 58880, 59136, 59137, 59139, 59120, 59124, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59137, + 59139, 59120, 59128, 59126, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59139, 59120, 0, 1, + 49152, 57344, 59392, 58880, 59136, 59137, 59139, 59120, + 59128, 0, 1, 49152, 57344, 59392, 58880, 59136, + 59137, 59139, 59120, 59128, 0, 1, 49152, 57344, + 59392, 58880, 59136, 59137, 59139, 59120, 59128, 59130, + 0, 1, 49152, 57344, 59392, 58880, 59136, 59137, + 59139, 59143, 59128, 0, 1, 49152, 57344, 59392, + 58880, 59136, 59137, 59139, 59143, 59128, 59132, 0, + 1, 49152, 57344, 59392, 58880, 59136, 59137, 59139, + 59143, 59128, 59132, 0, 1, 49152, 57344, 59392, + 58880, 59136, 59137, 59139, 59143, 59128, 59132, 59134, + 0, 1, 49152, 57344, 59392, 58880, 0, 1, + 49152, 57344, 59392, 58880, 59136, 0, 1, 49152, + 57344, 59392, 59393, 59136, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59138, 0, 1, 49152, 57344, + 59392, 59393, 59136, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59140, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59140, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59144, 59142, 0, 1, 49152, 57344, + 59392, 59393, 59136, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59144, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59144, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59144, 59146, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59144, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59152, 59148, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59152, 59148, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59152, 59153, 59150, + 0, 1, 49152, 57344, 59392, 59393, 59136, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59152, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59152, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59152, 59154, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59152, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59152, + 59156, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59152, 59156, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59152, 59160, 59158, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59152, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59168, 59160, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59168, 59160, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59168, 59160, 59162, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59168, + 59160, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59168, 59169, 59164, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59168, 59169, 59164, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59168, 59169, 59164, 59166, + 0, 1, 49152, 57344, 59392, 59393, 59136, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59168, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59168, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59168, 59170, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59168, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59168, + 59172, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59168, 59172, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59168, 59176, 59174, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59168, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59168, 59176, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59168, 59176, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59168, 59176, 59178, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59168, + 59176, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59168, 59184, 59180, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59168, 59184, 59180, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59168, 59184, 59185, 59182, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59168, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 59184, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59184, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59200, 59184, 59186, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59184, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59184, 59188, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 59184, + 59188, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59184, 59192, 59190, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59184, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59201, 59192, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 59201, + 59192, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59201, 59192, 59194, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59201, 59192, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59200, 59201, 59192, + 59196, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59201, 59203, 59196, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59201, 59203, 59196, 59198, + 0, 1, 49152, 57344, 59392, 59393, 59136, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 59202, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 59204, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59204, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59200, 59208, 59206, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59208, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59208, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59200, 59208, 59210, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 59208, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59216, 59212, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59200, 59216, 59212, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59216, 59217, 59214, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 59216, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59216, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59200, 59216, 59218, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59216, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59216, 59220, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 59216, + 59220, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59216, 59224, 59222, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59216, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59200, 59232, 59224, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59200, 59232, + 59224, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59232, 59224, 59226, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59232, 59224, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59200, 59232, 59233, + 59228, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59200, 59232, 59233, 59228, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59200, 59232, 59233, 59228, 59230, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59200, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59264, + 59232, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59232, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59264, 59232, 59234, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59232, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59264, 59232, 59236, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 59232, + 59236, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59232, 59240, 59238, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59232, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59264, 59232, 59240, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 59232, + 59240, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59232, 59240, 59242, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59232, 59240, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59264, 59232, 59248, + 59244, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59232, 59248, 59244, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59232, 59248, 59249, 59246, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59264, + 59232, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59265, 59248, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59264, 59265, 59248, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59264, 59265, 59248, 59250, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59264, + 59265, 59248, 0, 1, 49152, 57344, 59392, 59393, + 59136, 59264, 59265, 59248, 59252, 0, 1, 49152, + 57344, 59392, 59393, 59136, 59264, 59265, 59248, 59252, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59264, + 59265, 59248, 59256, 59254, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59265, 59248, 0, 1, + 49152, 57344, 59392, 59393, 59136, 59264, 59265, 59248, + 59256, 0, 1, 49152, 57344, 59392, 59393, 59136, + 59264, 59265, 59267, 59256, 0, 1, 49152, 57344, + 59392, 59393, 59136, 59264, 59265, 59267, 59256, 59258, + 0, 1, 49152, 57344, 59392, 59393, 59136, 59264, + 59265, 59267, 59256, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59264, 59265, 59267, 59256, 59260, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 59265, + 59267, 59256, 59260, 0, 1, 49152, 57344, 59392, + 59393, 59136, 59264, 59265, 59267, 59256, 59260, 59262, + 0, 1, 49152, 57344, 59392, 59393, 59136, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 0, + 1, 49152, 57344, 59392, 59393, 59136, 59264, 59266, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59268, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59268, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59264, 59272, 59270, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59272, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59272, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59264, 59272, 59274, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59272, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59280, 59276, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59264, 59280, 59276, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59280, 59281, 59278, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59280, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59280, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59264, 59280, 59282, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59280, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59280, 59284, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59280, + 59284, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59280, 59288, 59286, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59280, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59296, 59288, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59296, + 59288, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 59288, 59290, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 59288, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59264, 59296, 59297, + 59292, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 59297, 59292, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 59297, 59292, 59294, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59296, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59264, 59296, 59298, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59296, 59300, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59296, + 59300, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 59304, 59302, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59296, 59304, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59296, + 59304, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 59304, 59306, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 59304, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59264, 59296, 59312, + 59308, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59296, 59312, 59308, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59296, 59312, 59313, 59310, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59296, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59328, 59312, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59264, 59328, 59312, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59328, 59312, 59314, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59328, 59312, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59264, 59328, 59312, 59316, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59328, 59312, 59316, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59328, 59312, 59320, 59318, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59328, 59312, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59264, 59328, 59329, + 59320, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59328, 59329, 59320, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59328, 59329, 59320, 59322, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59328, 59329, 59320, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59264, 59328, 59329, 59320, 59324, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59328, + 59329, 59331, 59324, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59264, 59328, 59329, 59331, 59324, 59326, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59264, + 59328, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59328, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59264, 59328, 59330, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59264, 59328, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59264, 59328, 59332, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59264, 59328, + 59332, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59264, 59328, 59336, 59334, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59328, 59336, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59328, + 59336, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59336, 59338, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59336, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59399, 59328, 59344, + 59340, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59344, 59340, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59344, 59345, 59342, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59344, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59344, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59328, 59344, 59346, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59344, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59399, 59328, 59344, 59348, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59328, 59344, 59348, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59344, 59352, 59350, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59344, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59399, 59328, 59360, + 59352, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59360, 59352, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59360, 59352, 59354, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59360, 59352, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59360, 59361, 59356, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59328, + 59360, 59361, 59356, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59360, 59361, 59356, 59358, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59360, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59360, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59328, 59360, 59362, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59360, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59399, 59328, 59360, 59364, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59328, 59360, 59364, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59360, 59368, 59366, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59360, 0, 1, + 49152, 57344, 59392, 59393, 59395, 59399, 59328, 59360, + 59368, 0, 1, 49152, 57344, 59392, 59393, 59395, + 59399, 59328, 59360, 59368, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59328, 59360, 59368, 59370, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59328, 59360, 59368, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59360, 59376, 59372, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59328, + 59360, 59376, 59372, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59328, 59360, 59376, 59377, 59374, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59407, 59360, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59399, 59407, 59360, 59376, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59407, 59360, 59376, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59407, 59360, 59376, 59378, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59407, 59360, 59376, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59407, + 59360, 59376, 59380, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59407, 59360, 59376, 59380, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59407, + 59360, 59376, 59384, 59382, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59407, 59360, 59376, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59407, + 59360, 59376, 59384, 0, 1, 49152, 57344, 59392, + 59393, 59395, 59399, 59407, 59360, 59376, 59384, 0, + 1, 49152, 57344, 59392, 59393, 59395, 59399, 59407, + 59360, 59376, 59384, 59386, 0, 1, 49152, 57344, + 59392, 59393, 59395, 59399, 59407, 59360, 59376, 59384, + 0, 1, 49152, 57344, 59392, 59393, 59395, 59399, + 59407, 59360, 59376, 59384, 59388, 0, 1, 49152, + 57344, 59392, 59393, 59395, 59399, 59407, 59360, 59376, + 59384, 59388, 0, 1, 49152, 57344, 59392, 59393, + 59395, 59399, 59407, 59360, 59376, 59384, 59388, 59390, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 59392, 0, 1, 49152, 57344, 59392, 0, 1, + 49152, 57344, 59392, 59394, 0, 1, 49152, 57344, + 59392, 0, 1, 49152, 57344, 59392, 59396, 0, + 1, 49152, 57344, 59392, 59396, 0, 1, 49152, + 57344, 59392, 59400, 59398, 0, 1, 49152, 57344, + 59392, 0, 1, 49152, 57344, 59392, 59400, 0, + 1, 49152, 57344, 59392, 59400, 0, 1, 49152, + 57344, 59392, 59400, 59402, 0, 1, 49152, 57344, + 59392, 59400, 0, 1, 49152, 57344, 59392, 59408, + 59404, 0, 1, 49152, 57344, 59392, 59408, 59404, + 0, 1, 49152, 57344, 59392, 59408, 59409, 59406, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59408, 0, 1, 49152, 57344, 59392, + 59408, 0, 1, 49152, 57344, 59392, 59408, 59410, + 0, 1, 49152, 57344, 59392, 59408, 0, 1, + 49152, 57344, 59392, 59408, 59412, 0, 1, 49152, + 57344, 59392, 59408, 59412, 0, 1, 49152, 57344, + 59392, 59408, 59416, 59414, 0, 1, 49152, 57344, + 59392, 59408, 0, 1, 49152, 57344, 59392, 59424, + 59416, 0, 1, 49152, 57344, 59392, 59424, 59416, + 0, 1, 49152, 57344, 59392, 59424, 59416, 59418, + 0, 1, 49152, 57344, 59392, 59424, 59416, 0, + 1, 49152, 57344, 59392, 59424, 59425, 59420, 0, + 1, 49152, 57344, 59392, 59424, 59425, 59420, 0, + 1, 49152, 57344, 59392, 59424, 59425, 59420, 59422, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59424, 0, 1, 49152, 57344, 59392, + 59424, 0, 1, 49152, 57344, 59392, 59424, 59426, + 0, 1, 49152, 57344, 59392, 59424, 0, 1, + 49152, 57344, 59392, 59424, 59428, 0, 1, 49152, + 57344, 59392, 59424, 59428, 0, 1, 49152, 57344, + 59392, 59424, 59432, 59430, 0, 1, 49152, 57344, + 59392, 59424, 0, 1, 49152, 57344, 59392, 59424, + 59432, 0, 1, 49152, 57344, 59392, 59424, 59432, + 0, 1, 49152, 57344, 59392, 59424, 59432, 59434, + 0, 1, 49152, 57344, 59392, 59424, 59432, 0, + 1, 49152, 57344, 59392, 59424, 59440, 59436, 0, + 1, 49152, 57344, 59392, 59424, 59440, 59436, 0, + 1, 49152, 57344, 59392, 59424, 59440, 59441, 59438, + 0, 1, 49152, 57344, 59392, 59424, 0, 1, + 49152, 57344, 59392, 59456, 59440, 0, 1, 49152, + 57344, 59392, 59456, 59440, 0, 1, 49152, 57344, + 59392, 59456, 59440, 59442, 0, 1, 49152, 57344, + 59392, 59456, 59440, 0, 1, 49152, 57344, 59392, + 59456, 59440, 59444, 0, 1, 49152, 57344, 59392, + 59456, 59440, 59444, 0, 1, 49152, 57344, 59392, + 59456, 59440, 59448, 59446, 0, 1, 49152, 57344, + 59392, 59456, 59440, 0, 1, 49152, 57344, 59392, + 59456, 59457, 59448, 0, 1, 49152, 57344, 59392, + 59456, 59457, 59448, 0, 1, 49152, 57344, 59392, + 59456, 59457, 59448, 59450, 0, 1, 49152, 57344, + 59392, 59456, 59457, 59448, 0, 1, 49152, 57344, + 59392, 59456, 59457, 59448, 59452, 0, 1, 49152, + 57344, 59392, 59456, 59457, 59459, 59452, 0, 1, + 49152, 57344, 59392, 59456, 59457, 59459, 59452, 59454, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59456, 0, 1, 49152, 57344, 59392, + 59456, 0, 1, 49152, 57344, 59392, 59456, 59458, + 0, 1, 49152, 57344, 59392, 59456, 0, 1, + 49152, 57344, 59392, 59456, 59460, 0, 1, 49152, + 57344, 59392, 59456, 59460, 0, 1, 49152, 57344, + 59392, 59456, 59464, 59462, 0, 1, 49152, 57344, + 59392, 59456, 0, 1, 49152, 57344, 59392, 59456, + 59464, 0, 1, 49152, 57344, 59392, 59456, 59464, + 0, 1, 49152, 57344, 59392, 59456, 59464, 59466, + 0, 1, 49152, 57344, 59392, 59456, 59464, 0, + 1, 49152, 57344, 59392, 59456, 59472, 59468, 0, + 1, 49152, 57344, 59392, 59456, 59472, 59468, 0, + 1, 49152, 57344, 59392, 59456, 59472, 59473, 59470, + 0, 1, 49152, 57344, 59392, 59456, 0, 1, + 49152, 57344, 59392, 59456, 59472, 0, 1, 49152, + 57344, 59392, 59456, 59472, 0, 1, 49152, 57344, + 59392, 59456, 59472, 59474, 0, 1, 49152, 57344, + 59392, 59456, 59472, 0, 1, 49152, 57344, 59392, + 59456, 59472, 59476, 0, 1, 49152, 57344, 59392, + 59456, 59472, 59476, 0, 1, 49152, 57344, 59392, + 59456, 59472, 59480, 59478, 0, 1, 49152, 57344, + 59392, 59456, 59472, 0, 1, 49152, 57344, 59392, + 59456, 59488, 59480, 0, 1, 49152, 57344, 59392, + 59456, 59488, 59480, 0, 1, 49152, 57344, 59392, + 59456, 59488, 59480, 59482, 0, 1, 49152, 57344, + 59392, 59456, 59488, 59480, 0, 1, 49152, 57344, + 59392, 59456, 59488, 59489, 59484, 0, 1, 49152, + 57344, 59392, 59456, 59488, 59489, 59484, 0, 1, + 49152, 57344, 59392, 59456, 59488, 59489, 59484, 59486, + 0, 1, 49152, 57344, 59392, 59456, 0, 1, + 49152, 57344, 59392, 59520, 59488, 0, 1, 49152, + 57344, 59392, 59520, 59488, 0, 1, 49152, 57344, + 59392, 59520, 59488, 59490, 0, 1, 49152, 57344, + 59392, 59520, 59488, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59492, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59492, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59496, 59494, 0, 1, 49152, 57344, + 59392, 59520, 59488, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59496, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59496, 0, 1, 49152, 57344, 59392, + 59520, 59488, 59496, 59498, 0, 1, 49152, 57344, + 59392, 59520, 59488, 59496, 0, 1, 49152, 57344, + 59392, 59520, 59488, 59504, 59500, 0, 1, 49152, + 57344, 59392, 59520, 59488, 59504, 59500, 0, 1, + 49152, 57344, 59392, 59520, 59488, 59504, 59505, 59502, + 0, 1, 49152, 57344, 59392, 59520, 59488, 0, + 1, 49152, 57344, 59392, 59520, 59521, 59504, 0, + 1, 49152, 57344, 59392, 59520, 59521, 59504, 0, + 1, 49152, 57344, 59392, 59520, 59521, 59504, 59506, + 0, 1, 49152, 57344, 59392, 59520, 59521, 59504, + 0, 1, 49152, 57344, 59392, 59520, 59521, 59504, + 59508, 0, 1, 49152, 57344, 59392, 59520, 59521, + 59504, 59508, 0, 1, 49152, 57344, 59392, 59520, + 59521, 59504, 59512, 59510, 0, 1, 49152, 57344, + 59392, 59520, 59521, 59504, 0, 1, 49152, 57344, + 59392, 59520, 59521, 59504, 59512, 0, 1, 49152, + 57344, 59392, 59520, 59521, 59523, 59512, 0, 1, + 49152, 57344, 59392, 59520, 59521, 59523, 59512, 59514, + 0, 1, 49152, 57344, 59392, 59520, 59521, 59523, + 59512, 0, 1, 49152, 57344, 59392, 59520, 59521, + 59523, 59512, 59516, 0, 1, 49152, 57344, 59392, + 59520, 59521, 59523, 59512, 59516, 0, 1, 49152, + 57344, 59392, 59520, 59521, 59523, 59512, 59516, 59518, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59520, 0, 1, 49152, 57344, 59392, + 59520, 0, 1, 49152, 57344, 59392, 59520, 59522, + 0, 1, 49152, 57344, 59392, 59520, 0, 1, + 49152, 57344, 59392, 59520, 59524, 0, 1, 49152, + 57344, 59392, 59520, 59524, 0, 1, 49152, 57344, + 59392, 59520, 59528, 59526, 0, 1, 49152, 57344, + 59392, 59520, 0, 1, 49152, 57344, 59392, 59520, + 59528, 0, 1, 49152, 57344, 59392, 59520, 59528, + 0, 1, 49152, 57344, 59392, 59520, 59528, 59530, + 0, 1, 49152, 57344, 59392, 59520, 59528, 0, + 1, 49152, 57344, 59392, 59520, 59536, 59532, 0, + 1, 49152, 57344, 59392, 59520, 59536, 59532, 0, + 1, 49152, 57344, 59392, 59520, 59536, 59537, 59534, + 0, 1, 49152, 57344, 59392, 59520, 0, 1, + 49152, 57344, 59392, 59520, 59536, 0, 1, 49152, + 57344, 59392, 59520, 59536, 0, 1, 49152, 57344, + 59392, 59520, 59536, 59538, 0, 1, 49152, 57344, + 59392, 59520, 59536, 0, 1, 49152, 57344, 59392, + 59520, 59536, 59540, 0, 1, 49152, 57344, 59392, + 59520, 59536, 59540, 0, 1, 49152, 57344, 59392, + 59520, 59536, 59544, 59542, 0, 1, 49152, 57344, + 59392, 59520, 59536, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59544, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59544, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59544, 59546, 0, 1, 49152, 57344, + 59392, 59520, 59552, 59544, 0, 1, 49152, 57344, + 59392, 59520, 59552, 59553, 59548, 0, 1, 49152, + 57344, 59392, 59520, 59552, 59553, 59548, 0, 1, + 49152, 57344, 59392, 59520, 59552, 59553, 59548, 59550, + 0, 1, 49152, 57344, 59392, 59520, 0, 1, + 49152, 57344, 59392, 59520, 59552, 0, 1, 49152, + 57344, 59392, 59520, 59552, 0, 1, 49152, 57344, + 59392, 59520, 59552, 59554, 0, 1, 49152, 57344, + 59392, 59520, 59552, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59556, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59556, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59560, 59558, 0, 1, 49152, 57344, + 59392, 59520, 59552, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59560, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59560, 0, 1, 49152, 57344, 59392, + 59520, 59552, 59560, 59562, 0, 1, 49152, 57344, + 59392, 59520, 59552, 59560, 0, 1, 49152, 57344, + 59392, 59520, 59552, 59568, 59564, 0, 1, 49152, + 57344, 59392, 59520, 59552, 59568, 59564, 0, 1, + 49152, 57344, 59392, 59520, 59552, 59568, 59569, 59566, + 0, 1, 49152, 57344, 59392, 59520, 59552, 0, + 1, 49152, 57344, 59392, 59520, 59584, 59568, 0, + 1, 49152, 57344, 59392, 59520, 59584, 59568, 0, + 1, 49152, 57344, 59392, 59520, 59584, 59568, 59570, + 0, 1, 49152, 57344, 59392, 59520, 59584, 59568, + 0, 1, 49152, 57344, 59392, 59520, 59584, 59568, + 59572, 0, 1, 49152, 57344, 59392, 59520, 59584, + 59568, 59572, 0, 1, 49152, 57344, 59392, 59520, + 59584, 59568, 59576, 59574, 0, 1, 49152, 57344, + 59392, 59520, 59584, 59568, 0, 1, 49152, 57344, + 59392, 59520, 59584, 59585, 59576, 0, 1, 49152, + 57344, 59392, 59520, 59584, 59585, 59576, 0, 1, + 49152, 57344, 59392, 59520, 59584, 59585, 59576, 59578, + 0, 1, 49152, 57344, 59392, 59520, 59584, 59585, + 59576, 0, 1, 49152, 57344, 59392, 59520, 59584, + 59585, 59576, 59580, 0, 1, 49152, 57344, 59392, + 59520, 59584, 59585, 59587, 59580, 0, 1, 49152, + 57344, 59392, 59520, 59584, 59585, 59587, 59580, 59582, + 0, 1, 49152, 57344, 59392, 59520, 0, 1, + 49152, 57344, 59392, 59648, 59584, 0, 1, 49152, + 57344, 59392, 59648, 59584, 0, 1, 49152, 57344, + 59392, 59648, 59584, 59586, 0, 1, 49152, 57344, + 59392, 59648, 59584, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59588, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59588, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59592, 59590, 0, 1, 49152, 57344, + 59392, 59648, 59584, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59592, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59592, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59592, 59594, 0, 1, 49152, 57344, + 59392, 59648, 59584, 59592, 0, 1, 49152, 57344, + 59392, 59648, 59584, 59600, 59596, 0, 1, 49152, + 57344, 59392, 59648, 59584, 59600, 59596, 0, 1, + 49152, 57344, 59392, 59648, 59584, 59600, 59601, 59598, + 0, 1, 49152, 57344, 59392, 59648, 59584, 0, + 1, 49152, 57344, 59392, 59648, 59584, 59600, 0, + 1, 49152, 57344, 59392, 59648, 59584, 59600, 0, + 1, 49152, 57344, 59392, 59648, 59584, 59600, 59602, + 0, 1, 49152, 57344, 59392, 59648, 59584, 59600, + 0, 1, 49152, 57344, 59392, 59648, 59584, 59600, + 59604, 0, 1, 49152, 57344, 59392, 59648, 59584, + 59600, 59604, 0, 1, 49152, 57344, 59392, 59648, + 59584, 59600, 59608, 59606, 0, 1, 49152, 57344, + 59392, 59648, 59584, 59600, 0, 1, 49152, 57344, + 59392, 59648, 59584, 59616, 59608, 0, 1, 49152, + 57344, 59392, 59648, 59584, 59616, 59608, 0, 1, + 49152, 57344, 59392, 59648, 59584, 59616, 59608, 59610, + 0, 1, 49152, 57344, 59392, 59648, 59584, 59616, + 59608, 0, 1, 49152, 57344, 59392, 59648, 59584, + 59616, 59617, 59612, 0, 1, 49152, 57344, 59392, + 59648, 59584, 59616, 59617, 59612, 0, 1, 49152, + 57344, 59392, 59648, 59584, 59616, 59617, 59612, 59614, + 0, 1, 49152, 57344, 59392, 59648, 59584, 0, + 1, 49152, 57344, 59392, 59648, 59649, 59616, 0, + 1, 49152, 57344, 59392, 59648, 59649, 59616, 0, + 1, 49152, 57344, 59392, 59648, 59649, 59616, 59618, + 0, 1, 49152, 57344, 59392, 59648, 59649, 59616, + 0, 1, 49152, 57344, 59392, 59648, 59649, 59616, + 59620, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59616, 59620, 0, 1, 49152, 57344, 59392, 59648, + 59649, 59616, 59624, 59622, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59616, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59616, 59624, 0, 1, 49152, + 57344, 59392, 59648, 59649, 59616, 59624, 0, 1, + 49152, 57344, 59392, 59648, 59649, 59616, 59624, 59626, + 0, 1, 49152, 57344, 59392, 59648, 59649, 59616, + 59624, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59616, 59632, 59628, 0, 1, 49152, 57344, 59392, + 59648, 59649, 59616, 59632, 59628, 0, 1, 49152, + 57344, 59392, 59648, 59649, 59616, 59632, 59633, 59630, + 0, 1, 49152, 57344, 59392, 59648, 59649, 59616, + 0, 1, 49152, 57344, 59392, 59648, 59649, 59616, + 59632, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59651, 59632, 0, 1, 49152, 57344, 59392, 59648, + 59649, 59651, 59632, 59634, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59651, 59632, 0, 1, 49152, + 57344, 59392, 59648, 59649, 59651, 59632, 59636, 0, + 1, 49152, 57344, 59392, 59648, 59649, 59651, 59632, + 59636, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59651, 59632, 59640, 59638, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59651, 59632, 0, 1, 49152, + 57344, 59392, 59648, 59649, 59651, 59632, 59640, 0, + 1, 49152, 57344, 59392, 59648, 59649, 59651, 59632, + 59640, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59651, 59632, 59640, 59642, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59651, 59655, 59640, 0, 1, + 49152, 57344, 59392, 59648, 59649, 59651, 59655, 59640, + 59644, 0, 1, 49152, 57344, 59392, 59648, 59649, + 59651, 59655, 59640, 59644, 0, 1, 49152, 57344, + 59392, 59648, 59649, 59651, 59655, 59640, 59644, 59646, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59648, 0, 1, 49152, 57344, 59392, + 59648, 0, 1, 49152, 57344, 59392, 59648, 59650, + 0, 1, 49152, 57344, 59392, 59648, 0, 1, + 49152, 57344, 59392, 59648, 59652, 0, 1, 49152, + 57344, 59392, 59648, 59652, 0, 1, 49152, 57344, + 59392, 59648, 59656, 59654, 0, 1, 49152, 57344, + 59392, 59648, 0, 1, 49152, 57344, 59392, 59648, + 59656, 0, 1, 49152, 57344, 59392, 59648, 59656, + 0, 1, 49152, 57344, 59392, 59648, 59656, 59658, + 0, 1, 49152, 57344, 59392, 59648, 59656, 0, + 1, 49152, 57344, 59392, 59648, 59664, 59660, 0, + 1, 49152, 57344, 59392, 59648, 59664, 59660, 0, + 1, 49152, 57344, 59392, 59648, 59664, 59665, 59662, + 0, 1, 49152, 57344, 59392, 59648, 0, 1, + 49152, 57344, 59392, 59648, 59664, 0, 1, 49152, + 57344, 59392, 59648, 59664, 0, 1, 49152, 57344, + 59392, 59648, 59664, 59666, 0, 1, 49152, 57344, + 59392, 59648, 59664, 0, 1, 49152, 57344, 59392, + 59648, 59664, 59668, 0, 1, 49152, 57344, 59392, + 59648, 59664, 59668, 0, 1, 49152, 57344, 59392, + 59648, 59664, 59672, 59670, 0, 1, 49152, 57344, + 59392, 59648, 59664, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59672, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59672, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59672, 59674, 0, 1, 49152, 57344, + 59392, 59648, 59680, 59672, 0, 1, 49152, 57344, + 59392, 59648, 59680, 59681, 59676, 0, 1, 49152, + 57344, 59392, 59648, 59680, 59681, 59676, 0, 1, + 49152, 57344, 59392, 59648, 59680, 59681, 59676, 59678, + 0, 1, 49152, 57344, 59392, 59648, 0, 1, + 49152, 57344, 59392, 59648, 59680, 0, 1, 49152, + 57344, 59392, 59648, 59680, 0, 1, 49152, 57344, + 59392, 59648, 59680, 59682, 0, 1, 49152, 57344, + 59392, 59648, 59680, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59684, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59684, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59688, 59686, 0, 1, 49152, 57344, + 59392, 59648, 59680, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59688, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59688, 0, 1, 49152, 57344, 59392, + 59648, 59680, 59688, 59690, 0, 1, 49152, 57344, + 59392, 59648, 59680, 59688, 0, 1, 49152, 57344, + 59392, 59648, 59680, 59696, 59692, 0, 1, 49152, + 57344, 59392, 59648, 59680, 59696, 59692, 0, 1, + 49152, 57344, 59392, 59648, 59680, 59696, 59697, 59694, + 0, 1, 49152, 57344, 59392, 59648, 59680, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59696, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59696, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59696, 59698, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59696, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59696, + 59700, 0, 1, 49152, 57344, 59392, 59648, 59712, + 59696, 59700, 0, 1, 49152, 57344, 59392, 59648, + 59712, 59696, 59704, 59702, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59696, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59713, 59704, 0, 1, 49152, + 57344, 59392, 59648, 59712, 59713, 59704, 0, 1, + 49152, 57344, 59392, 59648, 59712, 59713, 59704, 59706, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59713, + 59704, 0, 1, 49152, 57344, 59392, 59648, 59712, + 59713, 59704, 59708, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59713, 59715, 59708, 0, 1, 49152, + 57344, 59392, 59648, 59712, 59713, 59715, 59708, 59710, + 0, 1, 49152, 57344, 59392, 59648, 0, 1, + 49152, 57344, 59392, 59648, 59712, 0, 1, 49152, + 57344, 59392, 59648, 59712, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59714, 0, 1, 49152, 57344, + 59392, 59648, 59712, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59716, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59716, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59720, 59718, 0, 1, 49152, 57344, + 59392, 59648, 59712, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59720, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59720, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59720, 59722, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59720, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59728, 59724, 0, 1, 49152, + 57344, 59392, 59648, 59712, 59728, 59724, 0, 1, + 49152, 57344, 59392, 59648, 59712, 59728, 59729, 59726, + 0, 1, 49152, 57344, 59392, 59648, 59712, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59728, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59728, 0, + 1, 49152, 57344, 59392, 59648, 59712, 59728, 59730, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59728, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59728, + 59732, 0, 1, 49152, 57344, 59392, 59648, 59712, + 59728, 59732, 0, 1, 49152, 57344, 59392, 59648, + 59712, 59728, 59736, 59734, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59728, 0, 1, 49152, 57344, + 59392, 59648, 59712, 59744, 59736, 0, 1, 49152, + 57344, 59392, 59648, 59712, 59744, 59736, 0, 1, + 49152, 57344, 59392, 59648, 59712, 59744, 59736, 59738, + 0, 1, 49152, 57344, 59392, 59648, 59712, 59744, + 59736, 0, 1, 49152, 57344, 59392, 59648, 59712, + 59744, 59745, 59740, 0, 1, 49152, 57344, 59392, + 59648, 59712, 59744, 59745, 59740, 0, 1, 49152, + 57344, 59392, 59648, 59712, 59744, 59745, 59740, 59742, + 0, 1, 49152, 57344, 59392, 59648, 59712, 0, + 1, 49152, 57344, 59392, 59648, 59776, 59744, 0, + 1, 49152, 57344, 59392, 59648, 59776, 59744, 0, + 1, 49152, 57344, 59392, 59648, 59776, 59744, 59746, + 0, 1, 49152, 57344, 59392, 59648, 59776, 59744, + 0, 1, 49152, 57344, 59392, 59648, 59776, 59744, + 59748, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59744, 59748, 0, 1, 49152, 57344, 59392, 59648, + 59776, 59744, 59752, 59750, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59744, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59744, 59752, 0, 1, 49152, + 57344, 59392, 59648, 59776, 59744, 59752, 0, 1, + 49152, 57344, 59392, 59648, 59776, 59744, 59752, 59754, + 0, 1, 49152, 57344, 59392, 59648, 59776, 59744, + 59752, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59744, 59760, 59756, 0, 1, 49152, 57344, 59392, + 59648, 59776, 59744, 59760, 59756, 0, 1, 49152, + 57344, 59392, 59648, 59776, 59744, 59760, 59761, 59758, + 0, 1, 49152, 57344, 59392, 59648, 59776, 59744, + 0, 1, 49152, 57344, 59392, 59648, 59776, 59777, + 59760, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59777, 59760, 0, 1, 49152, 57344, 59392, 59648, + 59776, 59777, 59760, 59762, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59777, 59760, 0, 1, 49152, + 57344, 59392, 59648, 59776, 59777, 59760, 59764, 0, + 1, 49152, 57344, 59392, 59648, 59776, 59777, 59760, + 59764, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59777, 59760, 59768, 59766, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59777, 59760, 0, 1, 49152, + 57344, 59392, 59648, 59776, 59777, 59760, 59768, 0, + 1, 49152, 57344, 59392, 59648, 59776, 59777, 59779, + 59768, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59777, 59779, 59768, 59770, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59777, 59779, 59768, 0, 1, + 49152, 57344, 59392, 59648, 59776, 59777, 59779, 59768, + 59772, 0, 1, 49152, 57344, 59392, 59648, 59776, + 59777, 59779, 59768, 59772, 0, 1, 49152, 57344, + 59392, 59648, 59776, 59777, 59779, 59768, 59772, 59774, + 0, 1, 49152, 57344, 59392, 59648, 0, 1, + 49152, 57344, 59392, 59904, 59776, 0, 1, 49152, + 57344, 59392, 59904, 59776, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59778, 0, 1, 49152, 57344, + 59392, 59904, 59776, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59780, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59780, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59784, 59782, 0, 1, 49152, 57344, + 59392, 59904, 59776, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59784, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59784, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59784, 59786, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59784, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59792, 59788, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59792, 59788, 0, 1, + 49152, 57344, 59392, 59904, 59776, 59792, 59793, 59790, + 0, 1, 49152, 57344, 59392, 59904, 59776, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59792, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59792, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59792, 59794, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59792, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59792, + 59796, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59792, 59796, 0, 1, 49152, 57344, 59392, 59904, + 59776, 59792, 59800, 59798, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59792, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59808, 59800, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59808, 59800, 0, 1, + 49152, 57344, 59392, 59904, 59776, 59808, 59800, 59802, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59808, + 59800, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59808, 59809, 59804, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59808, 59809, 59804, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59808, 59809, 59804, 59806, + 0, 1, 49152, 57344, 59392, 59904, 59776, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59808, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59808, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59808, 59810, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59808, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59808, + 59812, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59808, 59812, 0, 1, 49152, 57344, 59392, 59904, + 59776, 59808, 59816, 59814, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59808, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59808, 59816, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59808, 59816, 0, 1, + 49152, 57344, 59392, 59904, 59776, 59808, 59816, 59818, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59808, + 59816, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59808, 59824, 59820, 0, 1, 49152, 57344, 59392, + 59904, 59776, 59808, 59824, 59820, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59808, 59824, 59825, 59822, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59808, + 0, 1, 49152, 57344, 59392, 59904, 59776, 59840, + 59824, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59840, 59824, 0, 1, 49152, 57344, 59392, 59904, + 59776, 59840, 59824, 59826, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59840, 59824, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59840, 59824, 59828, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59840, 59824, + 59828, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59840, 59824, 59832, 59830, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59840, 59824, 0, 1, 49152, + 57344, 59392, 59904, 59776, 59840, 59841, 59832, 0, + 1, 49152, 57344, 59392, 59904, 59776, 59840, 59841, + 59832, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59840, 59841, 59832, 59834, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59840, 59841, 59832, 0, 1, + 49152, 57344, 59392, 59904, 59776, 59840, 59841, 59832, + 59836, 0, 1, 49152, 57344, 59392, 59904, 59776, + 59840, 59841, 59843, 59836, 0, 1, 49152, 57344, + 59392, 59904, 59776, 59840, 59841, 59843, 59836, 59838, + 0, 1, 49152, 57344, 59392, 59904, 59776, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59840, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59840, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59840, 59842, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 59844, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59844, 0, 1, 49152, 57344, 59392, 59904, + 59905, 59840, 59848, 59846, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 59848, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59840, 59848, 0, 1, + 49152, 57344, 59392, 59904, 59905, 59840, 59848, 59850, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 59848, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59856, 59852, 0, 1, 49152, 57344, 59392, + 59904, 59905, 59840, 59856, 59852, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59840, 59856, 59857, 59854, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 59856, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59856, 0, 1, 49152, 57344, 59392, 59904, + 59905, 59840, 59856, 59858, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 59856, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59840, 59856, 59860, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59840, 59856, + 59860, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59856, 59864, 59862, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 59856, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59840, 59872, 59864, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59840, 59872, + 59864, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59872, 59864, 59866, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 59872, 59864, 0, 1, + 49152, 57344, 59392, 59904, 59905, 59840, 59872, 59873, + 59868, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59840, 59872, 59873, 59868, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59840, 59872, 59873, 59868, 59870, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59840, + 59872, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59872, 0, 1, 49152, 57344, 59392, 59904, + 59905, 59907, 59872, 59874, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59872, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59907, 59872, 59876, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59907, 59872, + 59876, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59872, 59880, 59878, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59872, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59907, 59872, 59880, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59907, 59872, + 59880, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59872, 59880, 59882, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59872, 59880, 0, 1, + 49152, 57344, 59392, 59904, 59905, 59907, 59872, 59888, + 59884, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59872, 59888, 59884, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59872, 59888, 59889, 59886, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59907, + 59872, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59872, 59888, 0, 1, 49152, 57344, 59392, + 59904, 59905, 59907, 59872, 59888, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59907, 59872, 59888, 59890, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59907, + 59911, 59888, 0, 1, 49152, 57344, 59392, 59904, + 59905, 59907, 59911, 59888, 59892, 0, 1, 49152, + 57344, 59392, 59904, 59905, 59907, 59911, 59888, 59892, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59907, + 59911, 59888, 59896, 59894, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59911, 59888, 0, 1, + 49152, 57344, 59392, 59904, 59905, 59907, 59911, 59888, + 59896, 0, 1, 49152, 57344, 59392, 59904, 59905, + 59907, 59911, 59888, 59896, 0, 1, 49152, 57344, + 59392, 59904, 59905, 59907, 59911, 59888, 59896, 59898, + 0, 1, 49152, 57344, 59392, 59904, 59905, 59907, + 59911, 59888, 59896, 0, 1, 49152, 57344, 59392, + 59904, 59905, 59907, 59911, 59888, 59896, 59900, 0, + 1, 49152, 57344, 59392, 59904, 59905, 59907, 59911, + 59888, 59896, 59900, 0, 1, 49152, 57344, 59392, + 59904, 59905, 59907, 59911, 59888, 59896, 59900, 59902, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 59904, 0, 1, 49152, 57344, 59392, + 59904, 0, 1, 49152, 57344, 59392, 59904, 59906, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 59904, 59908, 0, 1, 49152, + 57344, 59392, 59904, 59908, 0, 1, 49152, 57344, + 59392, 59904, 59912, 59910, 0, 1, 49152, 57344, + 59392, 59904, 0, 1, 49152, 57344, 59392, 59904, + 59912, 0, 1, 49152, 57344, 59392, 59904, 59912, + 0, 1, 49152, 57344, 59392, 59904, 59912, 59914, + 0, 1, 49152, 57344, 59392, 59904, 59912, 0, + 1, 49152, 57344, 59392, 59904, 59920, 59916, 0, + 1, 49152, 57344, 59392, 59904, 59920, 59916, 0, + 1, 49152, 57344, 59392, 59904, 59920, 59921, 59918, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 59904, 59920, 0, 1, 49152, + 57344, 59392, 59904, 59920, 0, 1, 49152, 57344, + 59392, 59904, 59920, 59922, 0, 1, 49152, 57344, + 59392, 59904, 59920, 0, 1, 49152, 57344, 59392, + 59904, 59920, 59924, 0, 1, 49152, 57344, 59392, + 59904, 59920, 59924, 0, 1, 49152, 57344, 59392, + 59904, 59920, 59928, 59926, 0, 1, 49152, 57344, + 59392, 59904, 59920, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59928, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59928, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59928, 59930, 0, 1, 49152, 57344, + 59392, 59904, 59936, 59928, 0, 1, 49152, 57344, + 59392, 59904, 59936, 59937, 59932, 0, 1, 49152, + 57344, 59392, 59904, 59936, 59937, 59932, 0, 1, + 49152, 57344, 59392, 59904, 59936, 59937, 59932, 59934, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 59904, 59936, 0, 1, 49152, + 57344, 59392, 59904, 59936, 0, 1, 49152, 57344, + 59392, 59904, 59936, 59938, 0, 1, 49152, 57344, + 59392, 59904, 59936, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59940, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59940, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59944, 59942, 0, 1, 49152, 57344, + 59392, 59904, 59936, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59944, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59944, 0, 1, 49152, 57344, 59392, + 59904, 59936, 59944, 59946, 0, 1, 49152, 57344, + 59392, 59904, 59936, 59944, 0, 1, 49152, 57344, + 59392, 59904, 59936, 59952, 59948, 0, 1, 49152, + 57344, 59392, 59904, 59936, 59952, 59948, 0, 1, + 49152, 57344, 59392, 59904, 59936, 59952, 59953, 59950, + 0, 1, 49152, 57344, 59392, 59904, 59936, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59952, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59952, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59952, 59954, + 0, 1, 49152, 57344, 59392, 59904, 59968, 59952, + 0, 1, 49152, 57344, 59392, 59904, 59968, 59952, + 59956, 0, 1, 49152, 57344, 59392, 59904, 59968, + 59952, 59956, 0, 1, 49152, 57344, 59392, 59904, + 59968, 59952, 59960, 59958, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59952, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59969, 59960, 0, 1, 49152, + 57344, 59392, 59904, 59968, 59969, 59960, 0, 1, + 49152, 57344, 59392, 59904, 59968, 59969, 59960, 59962, + 0, 1, 49152, 57344, 59392, 59904, 59968, 59969, + 59960, 0, 1, 49152, 57344, 59392, 59904, 59968, + 59969, 59960, 59964, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59969, 59971, 59964, 0, 1, 49152, + 57344, 59392, 59904, 59968, 59969, 59971, 59964, 59966, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 59904, 59968, 0, 1, 49152, + 57344, 59392, 59904, 59968, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59970, 0, 1, 49152, 57344, + 59392, 59904, 59968, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59972, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59972, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59976, 59974, 0, 1, 49152, 57344, + 59392, 59904, 59968, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59976, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59976, 0, 1, 49152, 57344, 59392, + 59904, 59968, 59976, 59978, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59976, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59984, 59980, 0, 1, 49152, + 57344, 59392, 59904, 59968, 59984, 59980, 0, 1, + 49152, 57344, 59392, 59904, 59968, 59984, 59985, 59982, + 0, 1, 49152, 57344, 59392, 59904, 59968, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59984, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59984, 0, + 1, 49152, 57344, 59392, 59904, 59968, 59984, 59986, + 0, 1, 49152, 57344, 59392, 59904, 59968, 59984, + 0, 1, 49152, 57344, 59392, 59904, 59968, 59984, + 59988, 0, 1, 49152, 57344, 59392, 59904, 59968, + 59984, 59988, 0, 1, 49152, 57344, 59392, 59904, + 59968, 59984, 59992, 59990, 0, 1, 49152, 57344, + 59392, 59904, 59968, 59984, 0, 1, 49152, 57344, + 59392, 59904, 59968, 60000, 59992, 0, 1, 49152, + 57344, 59392, 59904, 59968, 60000, 59992, 0, 1, + 49152, 57344, 59392, 59904, 59968, 60000, 59992, 59994, + 0, 1, 49152, 57344, 59392, 59904, 59968, 60000, + 59992, 0, 1, 49152, 57344, 59392, 59904, 59968, + 60000, 60001, 59996, 0, 1, 49152, 57344, 59392, + 59904, 59968, 60000, 60001, 59996, 0, 1, 49152, + 57344, 59392, 59904, 59968, 60000, 60001, 59996, 59998, + 0, 1, 49152, 57344, 59392, 59904, 59968, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60000, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60000, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60000, 60002, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60000, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60000, + 60004, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60000, 60004, 0, 1, 49152, 57344, 59392, 59904, + 60032, 60000, 60008, 60006, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60000, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60000, 60008, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60000, 60008, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60000, 60008, 60010, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60000, + 60008, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60000, 60016, 60012, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60000, 60016, 60012, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60000, 60016, 60017, 60014, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60000, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60033, + 60016, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60033, 60016, 0, 1, 49152, 57344, 59392, 59904, + 60032, 60033, 60016, 60018, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60033, 60016, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60033, 60016, 60020, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60033, 60016, + 60020, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60033, 60016, 60024, 60022, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60033, 60016, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60033, 60016, 60024, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60033, 60035, + 60024, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60033, 60035, 60024, 60026, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60033, 60035, 60024, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60033, 60035, 60024, + 60028, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60033, 60035, 60024, 60028, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60033, 60035, 60024, 60028, 60030, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 59904, 60032, 0, 1, 49152, + 57344, 59392, 59904, 60032, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60034, 0, 1, 49152, 57344, + 59392, 59904, 60032, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60036, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60036, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60040, 60038, 0, 1, 49152, 57344, + 59392, 59904, 60032, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60040, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60040, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60040, 60042, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60040, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60048, 60044, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60048, 60044, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60048, 60049, 60046, + 0, 1, 49152, 57344, 59392, 59904, 60032, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60048, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60048, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60048, 60050, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60048, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60048, + 60052, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60048, 60052, 0, 1, 49152, 57344, 59392, 59904, + 60032, 60048, 60056, 60054, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60048, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60064, 60056, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60064, 60056, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60064, 60056, 60058, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60064, + 60056, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60064, 60065, 60060, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60064, 60065, 60060, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60064, 60065, 60060, 60062, + 0, 1, 49152, 57344, 59392, 59904, 60032, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60064, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60064, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60064, 60066, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60064, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60064, + 60068, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60064, 60068, 0, 1, 49152, 57344, 59392, 59904, + 60032, 60064, 60072, 60070, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60064, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60064, 60072, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60064, 60072, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60064, 60072, 60074, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60064, + 60072, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60064, 60080, 60076, 0, 1, 49152, 57344, 59392, + 59904, 60032, 60064, 60080, 60076, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60064, 60080, 60081, 60078, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60064, + 0, 1, 49152, 57344, 59392, 59904, 60032, 60096, + 60080, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60096, 60080, 0, 1, 49152, 57344, 59392, 59904, + 60032, 60096, 60080, 60082, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60096, 60080, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60096, 60080, 60084, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60096, 60080, + 60084, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60096, 60080, 60088, 60086, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60096, 60080, 0, 1, 49152, + 57344, 59392, 59904, 60032, 60096, 60097, 60088, 0, + 1, 49152, 57344, 59392, 59904, 60032, 60096, 60097, + 60088, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60096, 60097, 60088, 60090, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60096, 60097, 60088, 0, 1, + 49152, 57344, 59392, 59904, 60032, 60096, 60097, 60088, + 60092, 0, 1, 49152, 57344, 59392, 59904, 60032, + 60096, 60097, 60099, 60092, 0, 1, 49152, 57344, + 59392, 59904, 60032, 60096, 60097, 60099, 60092, 60094, + 0, 1, 49152, 57344, 59392, 59904, 60032, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60096, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60096, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60096, 60098, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 60100, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60100, 0, 1, 49152, 57344, 59392, 59904, + 60160, 60096, 60104, 60102, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 60104, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60096, 60104, 0, 1, + 49152, 57344, 59392, 59904, 60160, 60096, 60104, 60106, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 60104, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60112, 60108, 0, 1, 49152, 57344, 59392, + 59904, 60160, 60096, 60112, 60108, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60096, 60112, 60113, 60110, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 60112, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60112, 0, 1, 49152, 57344, 59392, 59904, + 60160, 60096, 60112, 60114, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 60112, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60096, 60112, 60116, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60096, 60112, + 60116, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60112, 60120, 60118, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 60112, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60096, 60128, 60120, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60096, 60128, + 60120, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60128, 60120, 60122, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 60128, 60120, 0, 1, + 49152, 57344, 59392, 59904, 60160, 60096, 60128, 60129, + 60124, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60096, 60128, 60129, 60124, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60096, 60128, 60129, 60124, 60126, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60096, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60161, + 60128, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60128, 0, 1, 49152, 57344, 59392, 59904, + 60160, 60161, 60128, 60130, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60128, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60161, 60128, 60132, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60161, 60128, + 60132, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60128, 60136, 60134, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60128, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60161, 60128, 60136, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60161, 60128, + 60136, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60128, 60136, 60138, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60128, 60136, 0, 1, + 49152, 57344, 59392, 59904, 60160, 60161, 60128, 60144, + 60140, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60128, 60144, 60140, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60128, 60144, 60145, 60142, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60161, + 60128, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60128, 60144, 0, 1, 49152, 57344, 59392, + 59904, 60160, 60161, 60163, 60144, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60161, 60163, 60144, 60146, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60161, + 60163, 60144, 0, 1, 49152, 57344, 59392, 59904, + 60160, 60161, 60163, 60144, 60148, 0, 1, 49152, + 57344, 59392, 59904, 60160, 60161, 60163, 60144, 60148, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60161, + 60163, 60144, 60152, 60150, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60163, 60144, 0, 1, + 49152, 57344, 59392, 59904, 60160, 60161, 60163, 60144, + 60152, 0, 1, 49152, 57344, 59392, 59904, 60160, + 60161, 60163, 60144, 60152, 0, 1, 49152, 57344, + 59392, 59904, 60160, 60161, 60163, 60144, 60152, 60154, + 0, 1, 49152, 57344, 59392, 59904, 60160, 60161, + 60163, 60167, 60152, 0, 1, 49152, 57344, 59392, + 59904, 60160, 60161, 60163, 60167, 60152, 60156, 0, + 1, 49152, 57344, 59392, 59904, 60160, 60161, 60163, + 60167, 60152, 60156, 0, 1, 49152, 57344, 59392, + 59904, 60160, 60161, 60163, 60167, 60152, 60156, 60158, + 0, 1, 49152, 57344, 59392, 59904, 0, 1, + 49152, 57344, 59392, 60416, 60160, 0, 1, 49152, + 57344, 59392, 60416, 60160, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60162, 0, 1, 49152, 57344, + 59392, 60416, 60160, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60164, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60164, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60168, 60166, 0, 1, 49152, 57344, + 59392, 60416, 60160, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60168, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60168, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60168, 60170, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60168, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60176, 60172, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60176, 60172, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60176, 60177, 60174, + 0, 1, 49152, 57344, 59392, 60416, 60160, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60176, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60176, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60176, 60178, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60176, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60176, + 60180, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60176, 60180, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60176, 60184, 60182, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60176, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60192, 60184, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60192, 60184, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60192, 60184, 60186, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60192, + 60184, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60192, 60193, 60188, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60192, 60193, 60188, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60192, 60193, 60188, 60190, + 0, 1, 49152, 57344, 59392, 60416, 60160, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60192, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60192, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60192, 60194, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60192, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60192, + 60196, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60192, 60196, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60192, 60200, 60198, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60192, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60192, 60200, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60192, 60200, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60192, 60200, 60202, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60192, + 60200, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60192, 60208, 60204, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60192, 60208, 60204, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60192, 60208, 60209, 60206, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60192, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 60208, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60208, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60224, 60208, 60210, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60208, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60208, 60212, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 60208, + 60212, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60208, 60216, 60214, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60208, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60225, 60216, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 60225, + 60216, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60225, 60216, 60218, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60225, 60216, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60224, 60225, 60216, + 60220, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60225, 60227, 60220, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60225, 60227, 60220, 60222, + 0, 1, 49152, 57344, 59392, 60416, 60160, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 60226, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 60228, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60228, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60224, 60232, 60230, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60232, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60232, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60224, 60232, 60234, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 60232, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60240, 60236, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60224, 60240, 60236, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60240, 60241, 60238, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 60240, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60240, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60224, 60240, 60242, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60240, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60240, 60244, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 60240, + 60244, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60240, 60248, 60246, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60240, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60224, 60256, 60248, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60224, 60256, + 60248, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60256, 60248, 60250, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60256, 60248, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60224, 60256, 60257, + 60252, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60224, 60256, 60257, 60252, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60224, 60256, 60257, 60252, 60254, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60224, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60288, + 60256, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60256, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60288, 60256, 60258, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60256, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60288, 60256, 60260, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60288, 60256, + 60260, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60256, 60264, 60262, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60256, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60288, 60256, 60264, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60288, 60256, + 60264, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60256, 60264, 60266, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60256, 60264, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60288, 60256, 60272, + 60268, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60256, 60272, 60268, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60256, 60272, 60273, 60270, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60288, + 60256, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60289, 60272, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60288, 60289, 60272, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60288, 60289, 60272, 60274, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60288, + 60289, 60272, 0, 1, 49152, 57344, 59392, 60416, + 60160, 60288, 60289, 60272, 60276, 0, 1, 49152, + 57344, 59392, 60416, 60160, 60288, 60289, 60272, 60276, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60288, + 60289, 60272, 60280, 60278, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60289, 60272, 0, 1, + 49152, 57344, 59392, 60416, 60160, 60288, 60289, 60272, + 60280, 0, 1, 49152, 57344, 59392, 60416, 60160, + 60288, 60289, 60291, 60280, 0, 1, 49152, 57344, + 59392, 60416, 60160, 60288, 60289, 60291, 60280, 60282, + 0, 1, 49152, 57344, 59392, 60416, 60160, 60288, + 60289, 60291, 60280, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60288, 60289, 60291, 60280, 60284, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60288, 60289, + 60291, 60280, 60284, 0, 1, 49152, 57344, 59392, + 60416, 60160, 60288, 60289, 60291, 60280, 60284, 60286, + 0, 1, 49152, 57344, 59392, 60416, 60160, 0, + 1, 49152, 57344, 59392, 60416, 60160, 60288, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60290, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60292, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60292, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60288, 60296, 60294, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60296, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60296, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60288, 60296, 60298, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60296, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60304, 60300, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60288, 60304, 60300, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60304, 60305, 60302, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60304, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60304, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60288, 60304, 60306, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60304, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60304, 60308, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60304, + 60308, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60304, 60312, 60310, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60304, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60320, 60312, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60320, + 60312, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 60312, 60314, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 60312, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60288, 60320, 60321, + 60316, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 60321, 60316, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 60321, 60316, 60318, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60320, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60288, 60320, 60322, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60320, 60324, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60320, + 60324, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 60328, 60326, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60320, 60328, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60320, + 60328, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 60328, 60330, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 60328, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60288, 60320, 60336, + 60332, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60320, 60336, 60332, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60320, 60336, 60337, 60334, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60320, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60352, 60336, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60288, 60352, 60336, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60352, 60336, 60338, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60352, 60336, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60288, 60352, 60336, 60340, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60288, 60352, 60336, 60340, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60352, 60336, 60344, 60342, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60352, 60336, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60288, 60352, 60353, + 60344, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60352, 60353, 60344, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60288, 60352, 60353, 60344, 60346, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60352, 60353, 60344, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60288, 60352, 60353, 60344, 60348, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60288, 60352, + 60353, 60355, 60348, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60288, 60352, 60353, 60355, 60348, 60350, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60288, + 60352, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60288, 60352, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60288, 60352, 60354, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60356, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60352, + 60356, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60360, 60358, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60360, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60352, + 60360, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60360, 60362, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 60360, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60419, 60352, 60368, + 60364, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60368, 60364, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 60368, 60369, 60366, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60368, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60352, 60368, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60368, 60370, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 60368, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60419, 60352, 60368, 60372, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60368, 60372, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 60368, 60376, 60374, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 60368, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60419, 60352, 60384, + 60376, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60384, 60376, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60352, 60384, 60376, 60378, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 60384, 60376, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60352, 60384, 60385, 60380, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60352, + 60384, 60385, 60380, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60352, 60384, 60385, 60380, 60382, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60352, 60384, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60352, 60384, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60384, 60386, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 60384, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60419, 60352, 60384, 60388, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60352, 60384, 60388, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60352, 60384, 60392, 60390, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60423, 60384, 0, 1, + 49152, 57344, 59392, 60416, 60417, 60419, 60423, 60384, + 60392, 0, 1, 49152, 57344, 59392, 60416, 60417, + 60419, 60423, 60384, 60392, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60423, 60384, 60392, 60394, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60423, 60384, 60392, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60423, 60384, 60400, 60396, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60423, + 60384, 60400, 60396, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60423, 60384, 60400, 60401, 60398, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60423, 60384, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60419, 60423, 60384, 60400, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60423, 60384, 60400, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60423, 60384, 60400, 60402, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60423, 60384, 60400, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60423, + 60384, 60400, 60404, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60423, 60384, 60400, 60404, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60423, + 60384, 60400, 60408, 60406, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60423, 60384, 60400, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60423, + 60384, 60400, 60408, 0, 1, 49152, 57344, 59392, + 60416, 60417, 60419, 60423, 60384, 60400, 60408, 0, + 1, 49152, 57344, 59392, 60416, 60417, 60419, 60423, + 60384, 60400, 60408, 60410, 0, 1, 49152, 57344, + 59392, 60416, 60417, 60419, 60423, 60384, 60400, 60408, + 0, 1, 49152, 57344, 59392, 60416, 60417, 60419, + 60423, 60384, 60400, 60408, 60412, 0, 1, 49152, + 57344, 59392, 60416, 60417, 60419, 60423, 60384, 60400, + 60408, 60412, 0, 1, 49152, 57344, 59392, 60416, + 60417, 60419, 60423, 60384, 60400, 60408, 60412, 60414, + 0, 1, 49152, 57344, 59392, 0, 1, 49152, + 57344, 59392, 60416, 0, 1, 49152, 57344, 59392, + 60416, 0, 1, 49152, 57344, 59392, 60416, 60418, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 59392, 60416, 60420, 0, 1, 49152, + 57344, 59392, 60416, 60420, 0, 1, 49152, 57344, + 59392, 60416, 60424, 60422, 0, 1, 49152, 57344, + 59392, 60416, 0, 1, 49152, 57344, 59392, 60416, + 60424, 0, 1, 49152, 57344, 59392, 60416, 60424, + 0, 1, 49152, 57344, 59392, 60416, 60424, 60426, + 0, 1, 49152, 57344, 59392, 60416, 60424, 0, + 1, 49152, 57344, 59392, 60416, 60432, 60428, 0, + 1, 49152, 57344, 59392, 60416, 60432, 60428, 0, + 1, 49152, 57344, 59392, 60416, 60432, 60433, 60430, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 59392, 60416, 60432, 0, 1, 49152, + 57344, 59392, 60416, 60432, 0, 1, 49152, 57344, + 59392, 60416, 60432, 60434, 0, 1, 49152, 57344, + 59392, 60416, 60432, 0, 1, 49152, 57344, 59392, + 60416, 60432, 60436, 0, 1, 49152, 57344, 59392, + 60416, 60432, 60436, 0, 1, 49152, 57344, 59392, + 60416, 60432, 60440, 60438, 0, 1, 49152, 57344, + 59392, 60416, 60432, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60440, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60440, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60440, 60442, 0, 1, 49152, 57344, + 59392, 60416, 60448, 60440, 0, 1, 49152, 57344, + 59392, 60416, 60448, 60449, 60444, 0, 1, 49152, + 57344, 59392, 60416, 60448, 60449, 60444, 0, 1, + 49152, 57344, 59392, 60416, 60448, 60449, 60444, 60446, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 59392, 60416, 60448, 0, 1, 49152, + 57344, 59392, 60416, 60448, 0, 1, 49152, 57344, + 59392, 60416, 60448, 60450, 0, 1, 49152, 57344, + 59392, 60416, 60448, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60452, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60452, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60456, 60454, 0, 1, 49152, 57344, + 59392, 60416, 60448, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60456, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60456, 0, 1, 49152, 57344, 59392, + 60416, 60448, 60456, 60458, 0, 1, 49152, 57344, + 59392, 60416, 60448, 60456, 0, 1, 49152, 57344, + 59392, 60416, 60448, 60464, 60460, 0, 1, 49152, + 57344, 59392, 60416, 60448, 60464, 60460, 0, 1, + 49152, 57344, 59392, 60416, 60448, 60464, 60465, 60462, + 0, 1, 49152, 57344, 59392, 60416, 60448, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60464, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60464, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60464, 60466, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60464, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60464, + 60468, 0, 1, 49152, 57344, 59392, 60416, 60480, + 60464, 60468, 0, 1, 49152, 57344, 59392, 60416, + 60480, 60464, 60472, 60470, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60464, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60481, 60472, 0, 1, 49152, + 57344, 59392, 60416, 60480, 60481, 60472, 0, 1, + 49152, 57344, 59392, 60416, 60480, 60481, 60472, 60474, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60481, + 60472, 0, 1, 49152, 57344, 59392, 60416, 60480, + 60481, 60472, 60476, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60481, 60483, 60476, 0, 1, 49152, + 57344, 59392, 60416, 60480, 60481, 60483, 60476, 60478, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 59392, 60416, 60480, 0, 1, 49152, + 57344, 59392, 60416, 60480, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60482, 0, 1, 49152, 57344, + 59392, 60416, 60480, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60484, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60484, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60488, 60486, 0, 1, 49152, 57344, + 59392, 60416, 60480, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60488, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60488, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60488, 60490, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60488, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60496, 60492, 0, 1, 49152, + 57344, 59392, 60416, 60480, 60496, 60492, 0, 1, + 49152, 57344, 59392, 60416, 60480, 60496, 60497, 60494, + 0, 1, 49152, 57344, 59392, 60416, 60480, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60496, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60496, 0, + 1, 49152, 57344, 59392, 60416, 60480, 60496, 60498, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60496, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60496, + 60500, 0, 1, 49152, 57344, 59392, 60416, 60480, + 60496, 60500, 0, 1, 49152, 57344, 59392, 60416, + 60480, 60496, 60504, 60502, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60496, 0, 1, 49152, 57344, + 59392, 60416, 60480, 60512, 60504, 0, 1, 49152, + 57344, 59392, 60416, 60480, 60512, 60504, 0, 1, + 49152, 57344, 59392, 60416, 60480, 60512, 60504, 60506, + 0, 1, 49152, 57344, 59392, 60416, 60480, 60512, + 60504, 0, 1, 49152, 57344, 59392, 60416, 60480, + 60512, 60513, 60508, 0, 1, 49152, 57344, 59392, + 60416, 60480, 60512, 60513, 60508, 0, 1, 49152, + 57344, 59392, 60416, 60480, 60512, 60513, 60508, 60510, + 0, 1, 49152, 57344, 59392, 60416, 60480, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60512, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60512, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60512, 60514, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60512, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60512, + 60516, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60512, 60516, 0, 1, 49152, 57344, 59392, 60416, + 60544, 60512, 60520, 60518, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60512, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60512, 60520, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60512, 60520, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60512, 60520, 60522, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60512, + 60520, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60512, 60528, 60524, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60512, 60528, 60524, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60512, 60528, 60529, 60526, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60512, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60545, + 60528, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60545, 60528, 0, 1, 49152, 57344, 59392, 60416, + 60544, 60545, 60528, 60530, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60545, 60528, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60545, 60528, 60532, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60545, 60528, + 60532, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60545, 60528, 60536, 60534, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60545, 60528, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60545, 60528, 60536, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60545, 60547, + 60536, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60545, 60547, 60536, 60538, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60545, 60547, 60536, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60545, 60547, 60536, + 60540, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60545, 60547, 60536, 60540, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60545, 60547, 60536, 60540, 60542, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 59392, 60416, 60544, 0, 1, 49152, + 57344, 59392, 60416, 60544, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60546, 0, 1, 49152, 57344, + 59392, 60416, 60544, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60548, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60548, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60552, 60550, 0, 1, 49152, 57344, + 59392, 60416, 60544, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60552, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60552, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60552, 60554, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60552, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60560, 60556, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60560, 60556, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60560, 60561, 60558, + 0, 1, 49152, 57344, 59392, 60416, 60544, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60560, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60560, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60560, 60562, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60560, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60560, + 60564, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60560, 60564, 0, 1, 49152, 57344, 59392, 60416, + 60544, 60560, 60568, 60566, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60560, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60576, 60568, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60576, 60568, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60576, 60568, 60570, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60576, + 60568, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60576, 60577, 60572, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60576, 60577, 60572, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60576, 60577, 60572, 60574, + 0, 1, 49152, 57344, 59392, 60416, 60544, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60576, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60576, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60576, 60578, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60576, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60576, + 60580, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60576, 60580, 0, 1, 49152, 57344, 59392, 60416, + 60544, 60576, 60584, 60582, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60576, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60576, 60584, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60576, 60584, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60576, 60584, 60586, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60576, + 60584, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60576, 60592, 60588, 0, 1, 49152, 57344, 59392, + 60416, 60544, 60576, 60592, 60588, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60576, 60592, 60593, 60590, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60576, + 0, 1, 49152, 57344, 59392, 60416, 60544, 60608, + 60592, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60608, 60592, 0, 1, 49152, 57344, 59392, 60416, + 60544, 60608, 60592, 60594, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60608, 60592, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60608, 60592, 60596, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60608, 60592, + 60596, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60608, 60592, 60600, 60598, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60608, 60592, 0, 1, 49152, + 57344, 59392, 60416, 60544, 60608, 60609, 60600, 0, + 1, 49152, 57344, 59392, 60416, 60544, 60608, 60609, + 60600, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60608, 60609, 60600, 60602, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60608, 60609, 60600, 0, 1, + 49152, 57344, 59392, 60416, 60544, 60608, 60609, 60600, + 60604, 0, 1, 49152, 57344, 59392, 60416, 60544, + 60608, 60609, 60611, 60604, 0, 1, 49152, 57344, + 59392, 60416, 60544, 60608, 60609, 60611, 60604, 60606, + 0, 1, 49152, 57344, 59392, 60416, 60544, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60608, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60608, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60608, 60610, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 60612, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60612, 0, 1, 49152, 57344, 59392, 60416, + 60672, 60608, 60616, 60614, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 60616, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60608, 60616, 0, 1, + 49152, 57344, 59392, 60416, 60672, 60608, 60616, 60618, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 60616, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60624, 60620, 0, 1, 49152, 57344, 59392, + 60416, 60672, 60608, 60624, 60620, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60608, 60624, 60625, 60622, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 60624, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60624, 0, 1, 49152, 57344, 59392, 60416, + 60672, 60608, 60624, 60626, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 60624, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60608, 60624, 60628, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60608, 60624, + 60628, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60624, 60632, 60630, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 60624, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60608, 60640, 60632, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60608, 60640, + 60632, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60640, 60632, 60634, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 60640, 60632, 0, 1, + 49152, 57344, 59392, 60416, 60672, 60608, 60640, 60641, + 60636, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60608, 60640, 60641, 60636, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60608, 60640, 60641, 60636, 60638, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60608, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60673, + 60640, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60640, 0, 1, 49152, 57344, 59392, 60416, + 60672, 60673, 60640, 60642, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60640, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60673, 60640, 60644, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60673, 60640, + 60644, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60640, 60648, 60646, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60640, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60673, 60640, 60648, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60673, 60640, + 60648, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60640, 60648, 60650, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60640, 60648, 0, 1, + 49152, 57344, 59392, 60416, 60672, 60673, 60640, 60656, + 60652, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60640, 60656, 60652, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60640, 60656, 60657, 60654, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60673, + 60640, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60640, 60656, 0, 1, 49152, 57344, 59392, + 60416, 60672, 60673, 60675, 60656, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60673, 60675, 60656, 60658, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60673, + 60675, 60656, 0, 1, 49152, 57344, 59392, 60416, + 60672, 60673, 60675, 60656, 60660, 0, 1, 49152, + 57344, 59392, 60416, 60672, 60673, 60675, 60656, 60660, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60673, + 60675, 60656, 60664, 60662, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60675, 60656, 0, 1, + 49152, 57344, 59392, 60416, 60672, 60673, 60675, 60656, + 60664, 0, 1, 49152, 57344, 59392, 60416, 60672, + 60673, 60675, 60656, 60664, 0, 1, 49152, 57344, + 59392, 60416, 60672, 60673, 60675, 60656, 60664, 60666, + 0, 1, 49152, 57344, 59392, 60416, 60672, 60673, + 60675, 60679, 60664, 0, 1, 49152, 57344, 59392, + 60416, 60672, 60673, 60675, 60679, 60664, 60668, 0, + 1, 49152, 57344, 59392, 60416, 60672, 60673, 60675, + 60679, 60664, 60668, 0, 1, 49152, 57344, 59392, + 60416, 60672, 60673, 60675, 60679, 60664, 60668, 60670, + 0, 1, 49152, 57344, 59392, 60416, 0, 1, + 49152, 57344, 61440, 60416, 60672, 0, 1, 49152, + 57344, 61440, 60416, 60672, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60674, 0, 1, 49152, 57344, + 61440, 60416, 60672, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60676, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60676, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60680, 60678, 0, 1, 49152, 57344, + 61440, 60416, 60672, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60680, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60680, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60680, 60682, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60680, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60688, 60684, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60688, 60684, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60688, 60689, 60686, + 0, 1, 49152, 57344, 61440, 60416, 60672, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60688, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60688, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60688, 60690, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60688, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60688, + 60692, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60688, 60692, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60688, 60696, 60694, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60688, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60704, 60696, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60704, 60696, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60704, 60696, 60698, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60704, + 60696, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60704, 60705, 60700, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60704, 60705, 60700, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60704, 60705, 60700, 60702, + 0, 1, 49152, 57344, 61440, 60416, 60672, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60704, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60704, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60704, 60706, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60704, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60704, + 60708, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60704, 60708, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60704, 60712, 60710, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60704, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60704, 60712, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60704, 60712, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60704, 60712, 60714, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60704, + 60712, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60704, 60720, 60716, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60704, 60720, 60716, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60704, 60720, 60721, 60718, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60704, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 60720, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60720, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60736, 60720, 60722, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60720, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60720, 60724, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 60720, + 60724, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60720, 60728, 60726, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60720, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60737, 60728, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 60737, + 60728, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60737, 60728, 60730, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60737, 60728, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60736, 60737, 60728, + 60732, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60737, 60739, 60732, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60737, 60739, 60732, 60734, + 0, 1, 49152, 57344, 61440, 60416, 60672, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 60738, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 60740, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60740, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60736, 60744, 60742, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60744, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60744, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60736, 60744, 60746, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 60744, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60752, 60748, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60736, 60752, 60748, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60752, 60753, 60750, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 60752, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60752, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60736, 60752, 60754, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60752, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60752, 60756, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 60752, + 60756, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60752, 60760, 60758, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60752, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60736, 60768, 60760, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60736, 60768, + 60760, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60768, 60760, 60762, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60768, 60760, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60736, 60768, 60769, + 60764, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60736, 60768, 60769, 60764, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60736, 60768, 60769, 60764, 60766, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60736, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60800, + 60768, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60768, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60800, 60768, 60770, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60768, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60800, 60768, 60772, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60800, 60768, + 60772, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60768, 60776, 60774, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60768, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60800, 60768, 60776, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60800, 60768, + 60776, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60768, 60776, 60778, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60768, 60776, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60800, 60768, 60784, + 60780, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60768, 60784, 60780, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60768, 60784, 60785, 60782, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60800, + 60768, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60801, 60784, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60800, 60801, 60784, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60800, 60801, 60784, 60786, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60800, + 60801, 60784, 0, 1, 49152, 57344, 61440, 60416, + 60672, 60800, 60801, 60784, 60788, 0, 1, 49152, + 57344, 61440, 60416, 60672, 60800, 60801, 60784, 60788, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60800, + 60801, 60784, 60792, 60790, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60801, 60784, 0, 1, + 49152, 57344, 61440, 60416, 60672, 60800, 60801, 60784, + 60792, 0, 1, 49152, 57344, 61440, 60416, 60672, + 60800, 60801, 60803, 60792, 0, 1, 49152, 57344, + 61440, 60416, 60672, 60800, 60801, 60803, 60792, 60794, + 0, 1, 49152, 57344, 61440, 60416, 60672, 60800, + 60801, 60803, 60792, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60800, 60801, 60803, 60792, 60796, 0, + 1, 49152, 57344, 61440, 60416, 60672, 60800, 60801, + 60803, 60792, 60796, 0, 1, 49152, 57344, 61440, + 60416, 60672, 60800, 60801, 60803, 60792, 60796, 60798, + 0, 1, 49152, 57344, 61440, 60416, 60672, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60802, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60804, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60804, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60800, 60808, 60806, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60808, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60808, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60800, 60808, 60810, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60808, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60816, 60812, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60800, 60816, 60812, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60816, 60817, 60814, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60816, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60816, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60800, 60816, 60818, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60816, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60816, 60820, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60816, + 60820, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60816, 60824, 60822, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60816, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60832, 60824, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60832, + 60824, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 60824, 60826, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 60824, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60800, 60832, 60833, + 60828, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 60833, 60828, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 60833, 60828, 60830, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60832, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60800, 60832, 60834, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60832, 60836, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60832, + 60836, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 60840, 60838, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60832, 60840, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60832, + 60840, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 60840, 60842, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 60840, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60800, 60832, 60848, + 60844, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60832, 60848, 60844, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60832, 60848, 60849, 60846, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60832, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60864, 60848, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60800, 60864, 60848, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60864, 60848, 60850, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60864, 60848, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60800, 60864, 60848, 60852, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60800, 60864, 60848, 60852, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60864, 60848, 60856, 60854, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60864, 60848, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60800, 60864, 60865, + 60856, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60800, 60864, 60865, 60856, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60800, 60864, 60865, 60856, 60858, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 60864, 60865, 60856, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60800, 60864, 60865, 60856, 60860, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60800, 60864, + 60865, 60867, 60860, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60800, 60864, 60865, 60867, 60860, 60862, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60800, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60929, 60864, 60866, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60864, 60868, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60864, + 60868, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60872, 60870, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60864, 60872, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60864, + 60872, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60872, 60874, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 60872, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60929, 60864, 60880, + 60876, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60880, 60876, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 60880, 60881, 60878, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60880, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60864, 60880, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60864, 60880, 60882, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 60880, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60929, 60864, 60880, 60884, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60864, 60880, 60884, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 60880, 60888, 60886, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 60880, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60929, 60864, 60896, + 60888, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60896, 60888, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60864, 60896, 60888, 60890, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 60896, 60888, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60864, 60896, 60897, 60892, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60864, + 60896, 60897, 60892, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60864, 60896, 60897, 60892, 60894, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60864, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60864, 60896, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60931, 60896, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60931, 60896, 60898, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60896, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60929, 60931, 60896, 60900, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60931, 60896, 60900, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60896, 60904, 60902, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60931, 60896, 0, 1, + 49152, 57344, 61440, 60416, 60928, 60929, 60931, 60896, + 60904, 0, 1, 49152, 57344, 61440, 60416, 60928, + 60929, 60931, 60896, 60904, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60931, 60896, 60904, 60906, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60896, 60904, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60931, 60896, 60912, 60908, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60931, + 60896, 60912, 60908, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60931, 60896, 60912, 60913, 60910, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60896, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60929, 60931, 60896, 60912, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60931, 60896, 60912, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60896, 60912, 60914, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60931, 60935, 60912, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60931, + 60935, 60912, 60916, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60931, 60935, 60912, 60916, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60931, + 60935, 60912, 60920, 60918, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60931, 60935, 60912, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60931, + 60935, 60912, 60920, 0, 1, 49152, 57344, 61440, + 60416, 60928, 60929, 60931, 60935, 60912, 60920, 0, + 1, 49152, 57344, 61440, 60416, 60928, 60929, 60931, + 60935, 60912, 60920, 60922, 0, 1, 49152, 57344, + 61440, 60416, 60928, 60929, 60931, 60935, 60912, 60920, + 0, 1, 49152, 57344, 61440, 60416, 60928, 60929, + 60931, 60935, 60912, 60920, 60924, 0, 1, 49152, + 57344, 61440, 60416, 60928, 60929, 60931, 60935, 60912, + 60920, 60924, 0, 1, 49152, 57344, 61440, 60416, + 60928, 60929, 60931, 60935, 60912, 60920, 60924, 60926, + 0, 1, 49152, 57344, 61440, 60416, 0, 1, + 49152, 57344, 61440, 60416, 60928, 0, 1, 49152, + 57344, 61440, 61441, 60928, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60930, 0, 1, 49152, 57344, + 61440, 61441, 60928, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60932, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60932, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60936, 60934, 0, 1, 49152, 57344, + 61440, 61441, 60928, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60936, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60936, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60936, 60938, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60936, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60944, 60940, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60944, 60940, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60944, 60945, 60942, + 0, 1, 49152, 57344, 61440, 61441, 60928, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60944, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60944, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60944, 60946, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60944, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60944, + 60948, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60944, 60948, 0, 1, 49152, 57344, 61440, 61441, + 60928, 60944, 60952, 60950, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60944, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60960, 60952, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60960, 60952, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60960, 60952, 60954, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60960, + 60952, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60960, 60961, 60956, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60960, 60961, 60956, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60960, 60961, 60956, 60958, + 0, 1, 49152, 57344, 61440, 61441, 60928, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60960, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60960, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60960, 60962, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60960, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60960, + 60964, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60960, 60964, 0, 1, 49152, 57344, 61440, 61441, + 60928, 60960, 60968, 60966, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60960, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60960, 60968, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60960, 60968, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60960, 60968, 60970, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60960, + 60968, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60960, 60976, 60972, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60960, 60976, 60972, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60960, 60976, 60977, 60974, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60960, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 60976, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 60976, 0, 1, 49152, 57344, 61440, 61441, + 60928, 60992, 60976, 60978, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 60976, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 60976, 60980, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 60976, + 60980, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 60976, 60984, 60982, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 60976, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 60993, 60984, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 60993, + 60984, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 60993, 60984, 60986, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 60993, 60984, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60992, 60993, 60984, + 60988, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 60993, 60995, 60988, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 60993, 60995, 60988, 60990, + 0, 1, 49152, 57344, 61440, 61441, 60928, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 60994, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 60996, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 60996, 0, 1, 49152, 57344, 61440, 61441, + 60928, 60992, 61000, 60998, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 61000, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 61000, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60992, 61000, 61002, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 61000, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 61008, 61004, 0, 1, 49152, 57344, 61440, + 61441, 60928, 60992, 61008, 61004, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 61008, 61009, 61006, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 61008, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 61008, 0, 1, 49152, 57344, 61440, 61441, + 60928, 60992, 61008, 61010, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 61008, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 61008, 61012, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 61008, + 61012, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 61008, 61016, 61014, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 61008, 0, 1, 49152, + 57344, 61440, 61441, 60928, 60992, 61024, 61016, 0, + 1, 49152, 57344, 61440, 61441, 60928, 60992, 61024, + 61016, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 61024, 61016, 61018, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 61024, 61016, 0, 1, + 49152, 57344, 61440, 61441, 60928, 60992, 61024, 61025, + 61020, 0, 1, 49152, 57344, 61440, 61441, 60928, + 60992, 61024, 61025, 61020, 0, 1, 49152, 57344, + 61440, 61441, 60928, 60992, 61024, 61025, 61020, 61022, + 0, 1, 49152, 57344, 61440, 61441, 60928, 60992, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61024, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61024, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61024, 61026, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61024, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61024, 61028, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61024, + 61028, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61024, 61032, 61030, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61024, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61024, 61032, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61024, + 61032, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61024, 61032, 61034, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61024, 61032, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61024, 61040, + 61036, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61024, 61040, 61036, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61024, 61040, 61041, 61038, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61024, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61057, 61040, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61057, 61040, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61057, 61040, 61042, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61057, 61040, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61057, 61040, 61044, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61057, 61040, 61044, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61057, 61040, 61048, 61046, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61057, 61040, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61057, 61040, + 61048, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61057, 61059, 61048, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61057, 61059, 61048, 61050, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61057, 61059, 61048, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61057, 61059, 61048, 61052, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61057, + 61059, 61048, 61052, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61057, 61059, 61048, 61052, 61054, + 0, 1, 49152, 57344, 61440, 61441, 60928, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61058, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61060, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61060, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61064, 61062, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61064, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61064, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61064, 61066, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61064, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61072, 61068, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61072, 61068, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61072, 61073, 61070, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61072, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61072, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61072, 61074, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61072, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61072, 61076, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61072, + 61076, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61072, 61080, 61078, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61072, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61088, 61080, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61088, + 61080, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 61080, 61082, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 61080, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61088, 61089, + 61084, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 61089, 61084, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 61089, 61084, 61086, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61088, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61088, 61090, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61088, 61092, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61088, + 61092, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 61096, 61094, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61088, 61096, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61088, + 61096, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 61096, 61098, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 61096, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61088, 61104, + 61100, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61088, 61104, 61100, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61088, 61104, 61105, 61102, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61088, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61120, 61104, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61120, 61104, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61120, 61104, 61106, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61120, 61104, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61056, 61120, 61104, 61108, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61056, 61120, 61104, 61108, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61120, 61104, 61112, 61110, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61120, 61104, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61056, 61120, 61121, + 61112, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61056, 61120, 61121, 61112, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61056, 61120, 61121, 61112, 61114, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 61120, 61121, 61112, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61120, 61121, 61112, 61116, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61056, 61120, + 61121, 61123, 61116, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61056, 61120, 61121, 61123, 61116, 61118, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61056, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61184, 61120, 61122, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61120, 61124, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61120, + 61124, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 61128, 61126, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61120, 61128, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61120, + 61128, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 61128, 61130, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 61128, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61184, 61120, 61136, + 61132, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 61136, 61132, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 61136, 61137, 61134, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 61136, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61120, 61136, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61120, 61136, 61138, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 61136, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61184, 61120, 61136, 61140, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61120, 61136, 61140, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 61136, 61144, 61142, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 61136, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61184, 61120, 61152, + 61144, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61120, 61152, 61144, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61120, 61152, 61144, 61146, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 61152, 61144, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61120, 61152, 61153, 61148, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61120, + 61152, 61153, 61148, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61120, 61152, 61153, 61148, 61150, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61120, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61185, 61152, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61185, 61152, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61185, 61152, 61154, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61152, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61184, 61185, 61152, 61156, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61185, 61152, 61156, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61152, 61160, 61158, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61185, 61152, 0, 1, + 49152, 57344, 61440, 61441, 60928, 61184, 61185, 61152, + 61160, 0, 1, 49152, 57344, 61440, 61441, 60928, + 61184, 61185, 61152, 61160, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61185, 61152, 61160, 61162, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61152, 61160, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61185, 61152, 61168, 61164, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61185, + 61152, 61168, 61164, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61185, 61152, 61168, 61169, 61166, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61152, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61184, 61185, 61152, 61168, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61185, 61187, 61168, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61187, 61168, 61170, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61185, 61187, 61168, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61185, + 61187, 61168, 61172, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61185, 61187, 61168, 61172, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61185, + 61187, 61168, 61176, 61174, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61185, 61187, 61168, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61185, + 61187, 61168, 61176, 0, 1, 49152, 57344, 61440, + 61441, 60928, 61184, 61185, 61187, 61168, 61176, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61185, + 61187, 61168, 61176, 61178, 0, 1, 49152, 57344, + 61440, 61441, 60928, 61184, 61185, 61187, 61191, 61176, + 0, 1, 49152, 57344, 61440, 61441, 60928, 61184, + 61185, 61187, 61191, 61176, 61180, 0, 1, 49152, + 57344, 61440, 61441, 60928, 61184, 61185, 61187, 61191, + 61176, 61180, 0, 1, 49152, 57344, 61440, 61441, + 60928, 61184, 61185, 61187, 61191, 61176, 61180, 61182, + 0, 1, 49152, 57344, 61440, 61441, 60928, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 0, + 1, 49152, 57344, 61440, 61441, 60928, 61184, 61186, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61188, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61188, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61192, 61190, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61192, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61192, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61192, 61194, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61192, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61200, 61196, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61200, 61196, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61200, 61201, 61198, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61200, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61200, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61200, 61202, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61200, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61200, 61204, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61200, + 61204, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61200, 61208, 61206, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61200, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61216, 61208, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61216, + 61208, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 61208, 61210, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 61208, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61216, 61217, + 61212, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 61217, 61212, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 61217, 61212, 61214, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61216, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61216, 61218, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61216, 61220, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61216, + 61220, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 61224, 61222, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61216, 61224, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61216, + 61224, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 61224, 61226, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 61224, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61216, 61232, + 61228, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61216, 61232, 61228, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61216, 61232, 61233, 61230, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61216, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61232, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61232, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61232, 61234, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61232, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61248, 61232, 61236, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61232, 61236, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61232, 61240, 61238, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61232, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61248, 61249, + 61240, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61249, 61240, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61249, 61240, 61242, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61249, 61240, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61249, 61240, 61244, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61248, + 61249, 61251, 61244, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61249, 61251, 61244, 61246, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61248, 61250, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61252, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61248, + 61252, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61256, 61254, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61256, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61248, + 61256, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61256, 61258, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61256, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61248, 61264, + 61260, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61264, 61260, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61264, 61265, 61262, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61264, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61264, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61264, 61266, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61264, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61248, 61264, 61268, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61248, 61264, 61268, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61264, 61272, 61270, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61264, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61248, 61280, + 61272, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61248, 61280, 61272, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61248, 61280, 61272, 61274, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 61280, 61272, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61280, 61281, 61276, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61248, + 61280, 61281, 61276, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61248, 61280, 61281, 61276, 61278, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61248, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61312, 61280, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61312, 61280, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61312, 61280, 61282, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61280, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61312, 61280, 61284, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61312, 61280, 61284, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61280, 61288, 61286, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 61280, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61184, 61312, 61280, + 61288, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61312, 61280, 61288, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 61280, 61288, 61290, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61280, 61288, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61312, 61280, 61296, 61292, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61280, 61296, 61292, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61312, 61280, 61296, 61297, 61294, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61280, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61312, 61313, 61296, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61312, 61313, 61296, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61313, 61296, 61298, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 61313, 61296, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61313, 61296, 61300, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61312, 61313, 61296, 61300, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61313, 61296, 61304, 61302, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 61313, 61296, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61313, 61296, 61304, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61184, 61312, 61313, 61315, 61304, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61313, 61315, 61304, 61306, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 61313, 61315, 61304, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 61313, 61315, 61304, 61308, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61312, 61313, 61315, + 61304, 61308, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61312, 61313, 61315, 61304, 61308, 61310, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61184, + 61312, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61312, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61184, 61312, 61314, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61184, 61312, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61184, 61312, 61316, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61184, 61312, + 61316, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61184, 61312, 61320, 61318, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61320, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61320, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61320, 61322, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61320, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61447, 61312, 61328, + 61324, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61328, 61324, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61328, 61329, 61326, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61328, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61328, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61328, 61330, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61328, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61312, 61328, 61332, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61328, 61332, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61328, 61336, 61334, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61328, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61447, 61312, 61344, + 61336, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61344, 61336, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61344, 61336, 61338, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61344, 61336, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61344, 61345, 61340, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61344, 61345, 61340, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61344, 61345, 61340, 61342, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61344, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61344, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61344, 61346, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61344, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61312, 61344, 61348, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61344, 61348, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61344, 61352, 61350, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61344, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61447, 61312, 61344, + 61352, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61344, 61352, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61344, 61352, 61354, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61344, 61352, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61344, 61360, 61356, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61344, 61360, 61356, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61344, 61360, 61361, 61358, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61344, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61312, 61376, 61360, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61376, 61360, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61376, 61360, 61362, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61376, 61360, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61376, 61360, 61364, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61376, 61360, 61364, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61376, 61360, 61368, 61366, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61376, 61360, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61376, 61377, 61368, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61376, 61377, 61368, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61376, 61377, 61368, 61370, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61376, 61377, 61368, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61376, 61377, 61368, 61372, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61376, 61377, + 61379, 61372, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61312, 61376, 61377, 61379, 61372, 61374, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61376, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61376, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61376, 61378, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61376, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61312, 61376, 61380, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61312, 61376, 61380, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61376, 61384, 61382, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61376, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61447, 61312, 61376, + 61384, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61312, 61376, 61384, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61312, 61376, 61384, 61386, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61312, 61376, 61384, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61376, 61392, 61388, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61312, + 61376, 61392, 61388, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61312, 61376, 61392, 61393, 61390, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61455, 61376, 61392, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61392, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61392, 61394, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61392, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61392, 61396, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61392, 61396, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61392, 61400, 61398, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61392, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61400, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61400, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61400, 61402, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 61400, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61409, 61404, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61408, + 61409, 61404, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61455, 61376, 61408, 61409, 61404, 61406, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61455, 61376, 61408, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61408, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61410, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61412, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61412, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61416, 61414, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61416, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61416, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61416, 61418, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 61416, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61424, 61420, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61408, + 61424, 61420, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61455, 61376, 61408, 61424, 61425, 61422, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61424, 0, + 1, 49152, 57344, 61440, 61441, 61443, 61447, 61455, + 61376, 61408, 61424, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61424, 61426, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61424, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 61424, + 61428, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61455, 61376, 61408, 61424, 61428, 0, 1, + 49152, 57344, 61440, 61441, 61443, 61447, 61455, 61376, + 61408, 61424, 61432, 61430, 0, 1, 49152, 57344, + 61440, 61441, 61443, 61447, 61455, 61376, 61408, 61424, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61424, 61432, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61408, + 61424, 61432, 0, 1, 49152, 57344, 61440, 61441, + 61443, 61447, 61455, 61376, 61408, 61424, 61432, 61434, + 0, 1, 49152, 57344, 61440, 61441, 61443, 61447, + 61455, 61376, 61408, 61424, 61432, 0, 1, 49152, + 57344, 61440, 61441, 61443, 61447, 61455, 61376, 61408, + 61424, 61432, 61436, 0, 1, 49152, 57344, 61440, + 61441, 61443, 61447, 61455, 61376, 61408, 61424, 61432, + 61436, 0, 1, 49152, 57344, 61440, 61441, 61443, + 61447, 61455, 61376, 61408, 61424, 61432, 61436, 61438, + 0, 1, 49152, 57344, 0, 1, 49152, 57344, + 61440, 0, 1, 49152, 57344, 61440, 0, 1, + 49152, 57344, 61440, 61442, 0, 1, 49152, 57344, + 61440, 0, 1, 49152, 57344, 61440, 61444, 0, + 1, 49152, 57344, 61440, 61444, 0, 1, 49152, + 57344, 61440, 61448, 61446, 0, 1, 49152, 57344, + 61440, 0, 1, 49152, 57344, 61440, 61448, 0, + 1, 49152, 57344, 61440, 61448, 0, 1, 49152, + 57344, 61440, 61448, 61450, 0, 1, 49152, 57344, + 61440, 61448, 0, 1, 49152, 57344, 61440, 61456, + 61452, 0, 1, 49152, 57344, 61440, 61456, 61452, + 0, 1, 49152, 57344, 61440, 61456, 61457, 61454, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61456, 0, 1, 49152, 57344, 61440, + 61456, 0, 1, 49152, 57344, 61440, 61456, 61458, + 0, 1, 49152, 57344, 61440, 61456, 0, 1, + 49152, 57344, 61440, 61456, 61460, 0, 1, 49152, + 57344, 61440, 61456, 61460, 0, 1, 49152, 57344, + 61440, 61456, 61464, 61462, 0, 1, 49152, 57344, + 61440, 61456, 0, 1, 49152, 57344, 61440, 61472, + 61464, 0, 1, 49152, 57344, 61440, 61472, 61464, + 0, 1, 49152, 57344, 61440, 61472, 61464, 61466, + 0, 1, 49152, 57344, 61440, 61472, 61464, 0, + 1, 49152, 57344, 61440, 61472, 61473, 61468, 0, + 1, 49152, 57344, 61440, 61472, 61473, 61468, 0, + 1, 49152, 57344, 61440, 61472, 61473, 61468, 61470, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61472, 0, 1, 49152, 57344, 61440, + 61472, 0, 1, 49152, 57344, 61440, 61472, 61474, + 0, 1, 49152, 57344, 61440, 61472, 0, 1, + 49152, 57344, 61440, 61472, 61476, 0, 1, 49152, + 57344, 61440, 61472, 61476, 0, 1, 49152, 57344, + 61440, 61472, 61480, 61478, 0, 1, 49152, 57344, + 61440, 61472, 0, 1, 49152, 57344, 61440, 61472, + 61480, 0, 1, 49152, 57344, 61440, 61472, 61480, + 0, 1, 49152, 57344, 61440, 61472, 61480, 61482, + 0, 1, 49152, 57344, 61440, 61472, 61480, 0, + 1, 49152, 57344, 61440, 61472, 61488, 61484, 0, + 1, 49152, 57344, 61440, 61472, 61488, 61484, 0, + 1, 49152, 57344, 61440, 61472, 61488, 61489, 61486, + 0, 1, 49152, 57344, 61440, 61472, 0, 1, + 49152, 57344, 61440, 61504, 61488, 0, 1, 49152, + 57344, 61440, 61504, 61488, 0, 1, 49152, 57344, + 61440, 61504, 61488, 61490, 0, 1, 49152, 57344, + 61440, 61504, 61488, 0, 1, 49152, 57344, 61440, + 61504, 61488, 61492, 0, 1, 49152, 57344, 61440, + 61504, 61488, 61492, 0, 1, 49152, 57344, 61440, + 61504, 61488, 61496, 61494, 0, 1, 49152, 57344, + 61440, 61504, 61488, 0, 1, 49152, 57344, 61440, + 61504, 61505, 61496, 0, 1, 49152, 57344, 61440, + 61504, 61505, 61496, 0, 1, 49152, 57344, 61440, + 61504, 61505, 61496, 61498, 0, 1, 49152, 57344, + 61440, 61504, 61505, 61496, 0, 1, 49152, 57344, + 61440, 61504, 61505, 61496, 61500, 0, 1, 49152, + 57344, 61440, 61504, 61505, 61507, 61500, 0, 1, + 49152, 57344, 61440, 61504, 61505, 61507, 61500, 61502, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61504, 0, 1, 49152, 57344, 61440, + 61504, 0, 1, 49152, 57344, 61440, 61504, 61506, + 0, 1, 49152, 57344, 61440, 61504, 0, 1, + 49152, 57344, 61440, 61504, 61508, 0, 1, 49152, + 57344, 61440, 61504, 61508, 0, 1, 49152, 57344, + 61440, 61504, 61512, 61510, 0, 1, 49152, 57344, + 61440, 61504, 0, 1, 49152, 57344, 61440, 61504, + 61512, 0, 1, 49152, 57344, 61440, 61504, 61512, + 0, 1, 49152, 57344, 61440, 61504, 61512, 61514, + 0, 1, 49152, 57344, 61440, 61504, 61512, 0, + 1, 49152, 57344, 61440, 61504, 61520, 61516, 0, + 1, 49152, 57344, 61440, 61504, 61520, 61516, 0, + 1, 49152, 57344, 61440, 61504, 61520, 61521, 61518, + 0, 1, 49152, 57344, 61440, 61504, 0, 1, + 49152, 57344, 61440, 61504, 61520, 0, 1, 49152, + 57344, 61440, 61504, 61520, 0, 1, 49152, 57344, + 61440, 61504, 61520, 61522, 0, 1, 49152, 57344, + 61440, 61504, 61520, 0, 1, 49152, 57344, 61440, + 61504, 61520, 61524, 0, 1, 49152, 57344, 61440, + 61504, 61520, 61524, 0, 1, 49152, 57344, 61440, + 61504, 61520, 61528, 61526, 0, 1, 49152, 57344, + 61440, 61504, 61520, 0, 1, 49152, 57344, 61440, + 61504, 61536, 61528, 0, 1, 49152, 57344, 61440, + 61504, 61536, 61528, 0, 1, 49152, 57344, 61440, + 61504, 61536, 61528, 61530, 0, 1, 49152, 57344, + 61440, 61504, 61536, 61528, 0, 1, 49152, 57344, + 61440, 61504, 61536, 61537, 61532, 0, 1, 49152, + 57344, 61440, 61504, 61536, 61537, 61532, 0, 1, + 49152, 57344, 61440, 61504, 61536, 61537, 61532, 61534, + 0, 1, 49152, 57344, 61440, 61504, 0, 1, + 49152, 57344, 61440, 61568, 61536, 0, 1, 49152, + 57344, 61440, 61568, 61536, 0, 1, 49152, 57344, + 61440, 61568, 61536, 61538, 0, 1, 49152, 57344, + 61440, 61568, 61536, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61540, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61540, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61544, 61542, 0, 1, 49152, 57344, + 61440, 61568, 61536, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61544, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61544, 0, 1, 49152, 57344, 61440, + 61568, 61536, 61544, 61546, 0, 1, 49152, 57344, + 61440, 61568, 61536, 61544, 0, 1, 49152, 57344, + 61440, 61568, 61536, 61552, 61548, 0, 1, 49152, + 57344, 61440, 61568, 61536, 61552, 61548, 0, 1, + 49152, 57344, 61440, 61568, 61536, 61552, 61553, 61550, + 0, 1, 49152, 57344, 61440, 61568, 61536, 0, + 1, 49152, 57344, 61440, 61568, 61569, 61552, 0, + 1, 49152, 57344, 61440, 61568, 61569, 61552, 0, + 1, 49152, 57344, 61440, 61568, 61569, 61552, 61554, + 0, 1, 49152, 57344, 61440, 61568, 61569, 61552, + 0, 1, 49152, 57344, 61440, 61568, 61569, 61552, + 61556, 0, 1, 49152, 57344, 61440, 61568, 61569, + 61552, 61556, 0, 1, 49152, 57344, 61440, 61568, + 61569, 61552, 61560, 61558, 0, 1, 49152, 57344, + 61440, 61568, 61569, 61552, 0, 1, 49152, 57344, + 61440, 61568, 61569, 61552, 61560, 0, 1, 49152, + 57344, 61440, 61568, 61569, 61571, 61560, 0, 1, + 49152, 57344, 61440, 61568, 61569, 61571, 61560, 61562, + 0, 1, 49152, 57344, 61440, 61568, 61569, 61571, + 61560, 0, 1, 49152, 57344, 61440, 61568, 61569, + 61571, 61560, 61564, 0, 1, 49152, 57344, 61440, + 61568, 61569, 61571, 61560, 61564, 0, 1, 49152, + 57344, 61440, 61568, 61569, 61571, 61560, 61564, 61566, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61568, 0, 1, 49152, 57344, 61440, + 61568, 0, 1, 49152, 57344, 61440, 61568, 61570, + 0, 1, 49152, 57344, 61440, 61568, 0, 1, + 49152, 57344, 61440, 61568, 61572, 0, 1, 49152, + 57344, 61440, 61568, 61572, 0, 1, 49152, 57344, + 61440, 61568, 61576, 61574, 0, 1, 49152, 57344, + 61440, 61568, 0, 1, 49152, 57344, 61440, 61568, + 61576, 0, 1, 49152, 57344, 61440, 61568, 61576, + 0, 1, 49152, 57344, 61440, 61568, 61576, 61578, + 0, 1, 49152, 57344, 61440, 61568, 61576, 0, + 1, 49152, 57344, 61440, 61568, 61584, 61580, 0, + 1, 49152, 57344, 61440, 61568, 61584, 61580, 0, + 1, 49152, 57344, 61440, 61568, 61584, 61585, 61582, + 0, 1, 49152, 57344, 61440, 61568, 0, 1, + 49152, 57344, 61440, 61568, 61584, 0, 1, 49152, + 57344, 61440, 61568, 61584, 0, 1, 49152, 57344, + 61440, 61568, 61584, 61586, 0, 1, 49152, 57344, + 61440, 61568, 61584, 0, 1, 49152, 57344, 61440, + 61568, 61584, 61588, 0, 1, 49152, 57344, 61440, + 61568, 61584, 61588, 0, 1, 49152, 57344, 61440, + 61568, 61584, 61592, 61590, 0, 1, 49152, 57344, + 61440, 61568, 61584, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61592, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61592, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61592, 61594, 0, 1, 49152, 57344, + 61440, 61568, 61600, 61592, 0, 1, 49152, 57344, + 61440, 61568, 61600, 61601, 61596, 0, 1, 49152, + 57344, 61440, 61568, 61600, 61601, 61596, 0, 1, + 49152, 57344, 61440, 61568, 61600, 61601, 61596, 61598, + 0, 1, 49152, 57344, 61440, 61568, 0, 1, + 49152, 57344, 61440, 61568, 61600, 0, 1, 49152, + 57344, 61440, 61568, 61600, 0, 1, 49152, 57344, + 61440, 61568, 61600, 61602, 0, 1, 49152, 57344, + 61440, 61568, 61600, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61604, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61604, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61608, 61606, 0, 1, 49152, 57344, + 61440, 61568, 61600, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61608, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61608, 0, 1, 49152, 57344, 61440, + 61568, 61600, 61608, 61610, 0, 1, 49152, 57344, + 61440, 61568, 61600, 61608, 0, 1, 49152, 57344, + 61440, 61568, 61600, 61616, 61612, 0, 1, 49152, + 57344, 61440, 61568, 61600, 61616, 61612, 0, 1, + 49152, 57344, 61440, 61568, 61600, 61616, 61617, 61614, + 0, 1, 49152, 57344, 61440, 61568, 61600, 0, + 1, 49152, 57344, 61440, 61568, 61632, 61616, 0, + 1, 49152, 57344, 61440, 61568, 61632, 61616, 0, + 1, 49152, 57344, 61440, 61568, 61632, 61616, 61618, + 0, 1, 49152, 57344, 61440, 61568, 61632, 61616, + 0, 1, 49152, 57344, 61440, 61568, 61632, 61616, + 61620, 0, 1, 49152, 57344, 61440, 61568, 61632, + 61616, 61620, 0, 1, 49152, 57344, 61440, 61568, + 61632, 61616, 61624, 61622, 0, 1, 49152, 57344, + 61440, 61568, 61632, 61616, 0, 1, 49152, 57344, + 61440, 61568, 61632, 61633, 61624, 0, 1, 49152, + 57344, 61440, 61568, 61632, 61633, 61624, 0, 1, + 49152, 57344, 61440, 61568, 61632, 61633, 61624, 61626, + 0, 1, 49152, 57344, 61440, 61568, 61632, 61633, + 61624, 0, 1, 49152, 57344, 61440, 61568, 61632, + 61633, 61624, 61628, 0, 1, 49152, 57344, 61440, + 61568, 61632, 61633, 61635, 61628, 0, 1, 49152, + 57344, 61440, 61568, 61632, 61633, 61635, 61628, 61630, + 0, 1, 49152, 57344, 61440, 61568, 0, 1, + 49152, 57344, 61440, 61696, 61632, 0, 1, 49152, + 57344, 61440, 61696, 61632, 0, 1, 49152, 57344, + 61440, 61696, 61632, 61634, 0, 1, 49152, 57344, + 61440, 61696, 61632, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61636, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61636, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61640, 61638, 0, 1, 49152, 57344, + 61440, 61696, 61632, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61640, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61640, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61640, 61642, 0, 1, 49152, 57344, + 61440, 61696, 61632, 61640, 0, 1, 49152, 57344, + 61440, 61696, 61632, 61648, 61644, 0, 1, 49152, + 57344, 61440, 61696, 61632, 61648, 61644, 0, 1, + 49152, 57344, 61440, 61696, 61632, 61648, 61649, 61646, + 0, 1, 49152, 57344, 61440, 61696, 61632, 0, + 1, 49152, 57344, 61440, 61696, 61632, 61648, 0, + 1, 49152, 57344, 61440, 61696, 61632, 61648, 0, + 1, 49152, 57344, 61440, 61696, 61632, 61648, 61650, + 0, 1, 49152, 57344, 61440, 61696, 61632, 61648, + 0, 1, 49152, 57344, 61440, 61696, 61632, 61648, + 61652, 0, 1, 49152, 57344, 61440, 61696, 61632, + 61648, 61652, 0, 1, 49152, 57344, 61440, 61696, + 61632, 61648, 61656, 61654, 0, 1, 49152, 57344, + 61440, 61696, 61632, 61648, 0, 1, 49152, 57344, + 61440, 61696, 61632, 61664, 61656, 0, 1, 49152, + 57344, 61440, 61696, 61632, 61664, 61656, 0, 1, + 49152, 57344, 61440, 61696, 61632, 61664, 61656, 61658, + 0, 1, 49152, 57344, 61440, 61696, 61632, 61664, + 61656, 0, 1, 49152, 57344, 61440, 61696, 61632, + 61664, 61665, 61660, 0, 1, 49152, 57344, 61440, + 61696, 61632, 61664, 61665, 61660, 0, 1, 49152, + 57344, 61440, 61696, 61632, 61664, 61665, 61660, 61662, + 0, 1, 49152, 57344, 61440, 61696, 61632, 0, + 1, 49152, 57344, 61440, 61696, 61697, 61664, 0, + 1, 49152, 57344, 61440, 61696, 61697, 61664, 0, + 1, 49152, 57344, 61440, 61696, 61697, 61664, 61666, + 0, 1, 49152, 57344, 61440, 61696, 61697, 61664, + 0, 1, 49152, 57344, 61440, 61696, 61697, 61664, + 61668, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61664, 61668, 0, 1, 49152, 57344, 61440, 61696, + 61697, 61664, 61672, 61670, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61664, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61664, 61672, 0, 1, 49152, + 57344, 61440, 61696, 61697, 61664, 61672, 0, 1, + 49152, 57344, 61440, 61696, 61697, 61664, 61672, 61674, + 0, 1, 49152, 57344, 61440, 61696, 61697, 61664, + 61672, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61664, 61680, 61676, 0, 1, 49152, 57344, 61440, + 61696, 61697, 61664, 61680, 61676, 0, 1, 49152, + 57344, 61440, 61696, 61697, 61664, 61680, 61681, 61678, + 0, 1, 49152, 57344, 61440, 61696, 61697, 61664, + 0, 1, 49152, 57344, 61440, 61696, 61697, 61664, + 61680, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61699, 61680, 0, 1, 49152, 57344, 61440, 61696, + 61697, 61699, 61680, 61682, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61699, 61680, 0, 1, 49152, + 57344, 61440, 61696, 61697, 61699, 61680, 61684, 0, + 1, 49152, 57344, 61440, 61696, 61697, 61699, 61680, + 61684, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61699, 61680, 61688, 61686, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61699, 61680, 0, 1, 49152, + 57344, 61440, 61696, 61697, 61699, 61680, 61688, 0, + 1, 49152, 57344, 61440, 61696, 61697, 61699, 61680, + 61688, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61699, 61680, 61688, 61690, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61699, 61703, 61688, 0, 1, + 49152, 57344, 61440, 61696, 61697, 61699, 61703, 61688, + 61692, 0, 1, 49152, 57344, 61440, 61696, 61697, + 61699, 61703, 61688, 61692, 0, 1, 49152, 57344, + 61440, 61696, 61697, 61699, 61703, 61688, 61692, 61694, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61696, 0, 1, 49152, 57344, 61440, + 61696, 0, 1, 49152, 57344, 61440, 61696, 61698, + 0, 1, 49152, 57344, 61440, 61696, 0, 1, + 49152, 57344, 61440, 61696, 61700, 0, 1, 49152, + 57344, 61440, 61696, 61700, 0, 1, 49152, 57344, + 61440, 61696, 61704, 61702, 0, 1, 49152, 57344, + 61440, 61696, 0, 1, 49152, 57344, 61440, 61696, + 61704, 0, 1, 49152, 57344, 61440, 61696, 61704, + 0, 1, 49152, 57344, 61440, 61696, 61704, 61706, + 0, 1, 49152, 57344, 61440, 61696, 61704, 0, + 1, 49152, 57344, 61440, 61696, 61712, 61708, 0, + 1, 49152, 57344, 61440, 61696, 61712, 61708, 0, + 1, 49152, 57344, 61440, 61696, 61712, 61713, 61710, + 0, 1, 49152, 57344, 61440, 61696, 0, 1, + 49152, 57344, 61440, 61696, 61712, 0, 1, 49152, + 57344, 61440, 61696, 61712, 0, 1, 49152, 57344, + 61440, 61696, 61712, 61714, 0, 1, 49152, 57344, + 61440, 61696, 61712, 0, 1, 49152, 57344, 61440, + 61696, 61712, 61716, 0, 1, 49152, 57344, 61440, + 61696, 61712, 61716, 0, 1, 49152, 57344, 61440, + 61696, 61712, 61720, 61718, 0, 1, 49152, 57344, + 61440, 61696, 61712, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61720, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61720, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61720, 61722, 0, 1, 49152, 57344, + 61440, 61696, 61728, 61720, 0, 1, 49152, 57344, + 61440, 61696, 61728, 61729, 61724, 0, 1, 49152, + 57344, 61440, 61696, 61728, 61729, 61724, 0, 1, + 49152, 57344, 61440, 61696, 61728, 61729, 61724, 61726, + 0, 1, 49152, 57344, 61440, 61696, 0, 1, + 49152, 57344, 61440, 61696, 61728, 0, 1, 49152, + 57344, 61440, 61696, 61728, 0, 1, 49152, 57344, + 61440, 61696, 61728, 61730, 0, 1, 49152, 57344, + 61440, 61696, 61728, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61732, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61732, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61736, 61734, 0, 1, 49152, 57344, + 61440, 61696, 61728, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61736, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61736, 0, 1, 49152, 57344, 61440, + 61696, 61728, 61736, 61738, 0, 1, 49152, 57344, + 61440, 61696, 61728, 61736, 0, 1, 49152, 57344, + 61440, 61696, 61728, 61744, 61740, 0, 1, 49152, + 57344, 61440, 61696, 61728, 61744, 61740, 0, 1, + 49152, 57344, 61440, 61696, 61728, 61744, 61745, 61742, + 0, 1, 49152, 57344, 61440, 61696, 61728, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61744, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61744, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61744, 61746, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61744, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61744, + 61748, 0, 1, 49152, 57344, 61440, 61696, 61760, + 61744, 61748, 0, 1, 49152, 57344, 61440, 61696, + 61760, 61744, 61752, 61750, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61744, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61761, 61752, 0, 1, 49152, + 57344, 61440, 61696, 61760, 61761, 61752, 0, 1, + 49152, 57344, 61440, 61696, 61760, 61761, 61752, 61754, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61761, + 61752, 0, 1, 49152, 57344, 61440, 61696, 61760, + 61761, 61752, 61756, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61761, 61763, 61756, 0, 1, 49152, + 57344, 61440, 61696, 61760, 61761, 61763, 61756, 61758, + 0, 1, 49152, 57344, 61440, 61696, 0, 1, + 49152, 57344, 61440, 61696, 61760, 0, 1, 49152, + 57344, 61440, 61696, 61760, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61762, 0, 1, 49152, 57344, + 61440, 61696, 61760, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61764, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61764, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61768, 61766, 0, 1, 49152, 57344, + 61440, 61696, 61760, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61768, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61768, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61768, 61770, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61768, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61776, 61772, 0, 1, 49152, + 57344, 61440, 61696, 61760, 61776, 61772, 0, 1, + 49152, 57344, 61440, 61696, 61760, 61776, 61777, 61774, + 0, 1, 49152, 57344, 61440, 61696, 61760, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61776, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61776, 0, + 1, 49152, 57344, 61440, 61696, 61760, 61776, 61778, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61776, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61776, + 61780, 0, 1, 49152, 57344, 61440, 61696, 61760, + 61776, 61780, 0, 1, 49152, 57344, 61440, 61696, + 61760, 61776, 61784, 61782, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61776, 0, 1, 49152, 57344, + 61440, 61696, 61760, 61792, 61784, 0, 1, 49152, + 57344, 61440, 61696, 61760, 61792, 61784, 0, 1, + 49152, 57344, 61440, 61696, 61760, 61792, 61784, 61786, + 0, 1, 49152, 57344, 61440, 61696, 61760, 61792, + 61784, 0, 1, 49152, 57344, 61440, 61696, 61760, + 61792, 61793, 61788, 0, 1, 49152, 57344, 61440, + 61696, 61760, 61792, 61793, 61788, 0, 1, 49152, + 57344, 61440, 61696, 61760, 61792, 61793, 61788, 61790, + 0, 1, 49152, 57344, 61440, 61696, 61760, 0, + 1, 49152, 57344, 61440, 61696, 61824, 61792, 0, + 1, 49152, 57344, 61440, 61696, 61824, 61792, 0, + 1, 49152, 57344, 61440, 61696, 61824, 61792, 61794, + 0, 1, 49152, 57344, 61440, 61696, 61824, 61792, + 0, 1, 49152, 57344, 61440, 61696, 61824, 61792, + 61796, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61792, 61796, 0, 1, 49152, 57344, 61440, 61696, + 61824, 61792, 61800, 61798, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61792, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61792, 61800, 0, 1, 49152, + 57344, 61440, 61696, 61824, 61792, 61800, 0, 1, + 49152, 57344, 61440, 61696, 61824, 61792, 61800, 61802, + 0, 1, 49152, 57344, 61440, 61696, 61824, 61792, + 61800, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61792, 61808, 61804, 0, 1, 49152, 57344, 61440, + 61696, 61824, 61792, 61808, 61804, 0, 1, 49152, + 57344, 61440, 61696, 61824, 61792, 61808, 61809, 61806, + 0, 1, 49152, 57344, 61440, 61696, 61824, 61792, + 0, 1, 49152, 57344, 61440, 61696, 61824, 61825, + 61808, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61825, 61808, 0, 1, 49152, 57344, 61440, 61696, + 61824, 61825, 61808, 61810, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61825, 61808, 0, 1, 49152, + 57344, 61440, 61696, 61824, 61825, 61808, 61812, 0, + 1, 49152, 57344, 61440, 61696, 61824, 61825, 61808, + 61812, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61825, 61808, 61816, 61814, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61825, 61808, 0, 1, 49152, + 57344, 61440, 61696, 61824, 61825, 61808, 61816, 0, + 1, 49152, 57344, 61440, 61696, 61824, 61825, 61827, + 61816, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61825, 61827, 61816, 61818, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61825, 61827, 61816, 0, 1, + 49152, 57344, 61440, 61696, 61824, 61825, 61827, 61816, + 61820, 0, 1, 49152, 57344, 61440, 61696, 61824, + 61825, 61827, 61816, 61820, 0, 1, 49152, 57344, + 61440, 61696, 61824, 61825, 61827, 61816, 61820, 61822, + 0, 1, 49152, 57344, 61440, 61696, 0, 1, + 49152, 57344, 61440, 61952, 61824, 0, 1, 49152, + 57344, 61440, 61952, 61824, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61826, 0, 1, 49152, 57344, + 61440, 61952, 61824, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61828, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61828, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61832, 61830, 0, 1, 49152, 57344, + 61440, 61952, 61824, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61832, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61832, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61832, 61834, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61832, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61840, 61836, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61840, 61836, 0, 1, + 49152, 57344, 61440, 61952, 61824, 61840, 61841, 61838, + 0, 1, 49152, 57344, 61440, 61952, 61824, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61840, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61840, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61840, 61842, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61840, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61840, + 61844, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61840, 61844, 0, 1, 49152, 57344, 61440, 61952, + 61824, 61840, 61848, 61846, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61840, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61856, 61848, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61856, 61848, 0, 1, + 49152, 57344, 61440, 61952, 61824, 61856, 61848, 61850, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61856, + 61848, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61856, 61857, 61852, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61856, 61857, 61852, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61856, 61857, 61852, 61854, + 0, 1, 49152, 57344, 61440, 61952, 61824, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61856, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61856, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61856, 61858, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61856, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61856, + 61860, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61856, 61860, 0, 1, 49152, 57344, 61440, 61952, + 61824, 61856, 61864, 61862, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61856, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61856, 61864, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61856, 61864, 0, 1, + 49152, 57344, 61440, 61952, 61824, 61856, 61864, 61866, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61856, + 61864, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61856, 61872, 61868, 0, 1, 49152, 57344, 61440, + 61952, 61824, 61856, 61872, 61868, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61856, 61872, 61873, 61870, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61856, + 0, 1, 49152, 57344, 61440, 61952, 61824, 61888, + 61872, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61888, 61872, 0, 1, 49152, 57344, 61440, 61952, + 61824, 61888, 61872, 61874, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61888, 61872, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61888, 61872, 61876, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61888, 61872, + 61876, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61888, 61872, 61880, 61878, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61888, 61872, 0, 1, 49152, + 57344, 61440, 61952, 61824, 61888, 61889, 61880, 0, + 1, 49152, 57344, 61440, 61952, 61824, 61888, 61889, + 61880, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61888, 61889, 61880, 61882, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61888, 61889, 61880, 0, 1, + 49152, 57344, 61440, 61952, 61824, 61888, 61889, 61880, + 61884, 0, 1, 49152, 57344, 61440, 61952, 61824, + 61888, 61889, 61891, 61884, 0, 1, 49152, 57344, + 61440, 61952, 61824, 61888, 61889, 61891, 61884, 61886, + 0, 1, 49152, 57344, 61440, 61952, 61824, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61888, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61888, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61888, 61890, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 61892, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61892, 0, 1, 49152, 57344, 61440, 61952, + 61953, 61888, 61896, 61894, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 61896, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61888, 61896, 0, 1, + 49152, 57344, 61440, 61952, 61953, 61888, 61896, 61898, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 61896, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61904, 61900, 0, 1, 49152, 57344, 61440, + 61952, 61953, 61888, 61904, 61900, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61888, 61904, 61905, 61902, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 61904, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61904, 0, 1, 49152, 57344, 61440, 61952, + 61953, 61888, 61904, 61906, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 61904, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61888, 61904, 61908, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61888, 61904, + 61908, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61904, 61912, 61910, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 61904, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61888, 61920, 61912, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61888, 61920, + 61912, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61920, 61912, 61914, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 61920, 61912, 0, 1, + 49152, 57344, 61440, 61952, 61953, 61888, 61920, 61921, + 61916, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61888, 61920, 61921, 61916, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61888, 61920, 61921, 61916, 61918, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61888, + 61920, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61920, 0, 1, 49152, 57344, 61440, 61952, + 61953, 61955, 61920, 61922, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61920, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61955, 61920, 61924, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61955, 61920, + 61924, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61920, 61928, 61926, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61920, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61955, 61920, 61928, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61955, 61920, + 61928, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61920, 61928, 61930, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61920, 61928, 0, 1, + 49152, 57344, 61440, 61952, 61953, 61955, 61920, 61936, + 61932, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61920, 61936, 61932, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61920, 61936, 61937, 61934, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61955, + 61920, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61920, 61936, 0, 1, 49152, 57344, 61440, + 61952, 61953, 61955, 61920, 61936, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61955, 61920, 61936, 61938, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61955, + 61959, 61936, 0, 1, 49152, 57344, 61440, 61952, + 61953, 61955, 61959, 61936, 61940, 0, 1, 49152, + 57344, 61440, 61952, 61953, 61955, 61959, 61936, 61940, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61955, + 61959, 61936, 61944, 61942, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61959, 61936, 0, 1, + 49152, 57344, 61440, 61952, 61953, 61955, 61959, 61936, + 61944, 0, 1, 49152, 57344, 61440, 61952, 61953, + 61955, 61959, 61936, 61944, 0, 1, 49152, 57344, + 61440, 61952, 61953, 61955, 61959, 61936, 61944, 61946, + 0, 1, 49152, 57344, 61440, 61952, 61953, 61955, + 61959, 61936, 61944, 0, 1, 49152, 57344, 61440, + 61952, 61953, 61955, 61959, 61936, 61944, 61948, 0, + 1, 49152, 57344, 61440, 61952, 61953, 61955, 61959, + 61936, 61944, 61948, 0, 1, 49152, 57344, 61440, + 61952, 61953, 61955, 61959, 61936, 61944, 61948, 61950, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 61952, 0, 1, 49152, 57344, 61440, + 61952, 0, 1, 49152, 57344, 61440, 61952, 61954, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 61952, 61956, 0, 1, 49152, + 57344, 61440, 61952, 61956, 0, 1, 49152, 57344, + 61440, 61952, 61960, 61958, 0, 1, 49152, 57344, + 61440, 61952, 0, 1, 49152, 57344, 61440, 61952, + 61960, 0, 1, 49152, 57344, 61440, 61952, 61960, + 0, 1, 49152, 57344, 61440, 61952, 61960, 61962, + 0, 1, 49152, 57344, 61440, 61952, 61960, 0, + 1, 49152, 57344, 61440, 61952, 61968, 61964, 0, + 1, 49152, 57344, 61440, 61952, 61968, 61964, 0, + 1, 49152, 57344, 61440, 61952, 61968, 61969, 61966, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 61952, 61968, 0, 1, 49152, + 57344, 61440, 61952, 61968, 0, 1, 49152, 57344, + 61440, 61952, 61968, 61970, 0, 1, 49152, 57344, + 61440, 61952, 61968, 0, 1, 49152, 57344, 61440, + 61952, 61968, 61972, 0, 1, 49152, 57344, 61440, + 61952, 61968, 61972, 0, 1, 49152, 57344, 61440, + 61952, 61968, 61976, 61974, 0, 1, 49152, 57344, + 61440, 61952, 61968, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61976, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61976, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61976, 61978, 0, 1, 49152, 57344, + 61440, 61952, 61984, 61976, 0, 1, 49152, 57344, + 61440, 61952, 61984, 61985, 61980, 0, 1, 49152, + 57344, 61440, 61952, 61984, 61985, 61980, 0, 1, + 49152, 57344, 61440, 61952, 61984, 61985, 61980, 61982, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 61952, 61984, 0, 1, 49152, + 57344, 61440, 61952, 61984, 0, 1, 49152, 57344, + 61440, 61952, 61984, 61986, 0, 1, 49152, 57344, + 61440, 61952, 61984, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61988, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61988, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61992, 61990, 0, 1, 49152, 57344, + 61440, 61952, 61984, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61992, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61992, 0, 1, 49152, 57344, 61440, + 61952, 61984, 61992, 61994, 0, 1, 49152, 57344, + 61440, 61952, 61984, 61992, 0, 1, 49152, 57344, + 61440, 61952, 61984, 62000, 61996, 0, 1, 49152, + 57344, 61440, 61952, 61984, 62000, 61996, 0, 1, + 49152, 57344, 61440, 61952, 61984, 62000, 62001, 61998, + 0, 1, 49152, 57344, 61440, 61952, 61984, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62000, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62000, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62000, 62002, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62000, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62000, + 62004, 0, 1, 49152, 57344, 61440, 61952, 62016, + 62000, 62004, 0, 1, 49152, 57344, 61440, 61952, + 62016, 62000, 62008, 62006, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62000, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62017, 62008, 0, 1, 49152, + 57344, 61440, 61952, 62016, 62017, 62008, 0, 1, + 49152, 57344, 61440, 61952, 62016, 62017, 62008, 62010, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62017, + 62008, 0, 1, 49152, 57344, 61440, 61952, 62016, + 62017, 62008, 62012, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62017, 62019, 62012, 0, 1, 49152, + 57344, 61440, 61952, 62016, 62017, 62019, 62012, 62014, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 61952, 62016, 0, 1, 49152, + 57344, 61440, 61952, 62016, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62018, 0, 1, 49152, 57344, + 61440, 61952, 62016, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62020, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62020, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62024, 62022, 0, 1, 49152, 57344, + 61440, 61952, 62016, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62024, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62024, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62024, 62026, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62024, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62032, 62028, 0, 1, 49152, + 57344, 61440, 61952, 62016, 62032, 62028, 0, 1, + 49152, 57344, 61440, 61952, 62016, 62032, 62033, 62030, + 0, 1, 49152, 57344, 61440, 61952, 62016, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62032, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62032, 0, + 1, 49152, 57344, 61440, 61952, 62016, 62032, 62034, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62032, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62032, + 62036, 0, 1, 49152, 57344, 61440, 61952, 62016, + 62032, 62036, 0, 1, 49152, 57344, 61440, 61952, + 62016, 62032, 62040, 62038, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62032, 0, 1, 49152, 57344, + 61440, 61952, 62016, 62048, 62040, 0, 1, 49152, + 57344, 61440, 61952, 62016, 62048, 62040, 0, 1, + 49152, 57344, 61440, 61952, 62016, 62048, 62040, 62042, + 0, 1, 49152, 57344, 61440, 61952, 62016, 62048, + 62040, 0, 1, 49152, 57344, 61440, 61952, 62016, + 62048, 62049, 62044, 0, 1, 49152, 57344, 61440, + 61952, 62016, 62048, 62049, 62044, 0, 1, 49152, + 57344, 61440, 61952, 62016, 62048, 62049, 62044, 62046, + 0, 1, 49152, 57344, 61440, 61952, 62016, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62048, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62048, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62048, 62050, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62048, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62048, + 62052, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62048, 62052, 0, 1, 49152, 57344, 61440, 61952, + 62080, 62048, 62056, 62054, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62048, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62048, 62056, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62048, 62056, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62048, 62056, 62058, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62048, + 62056, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62048, 62064, 62060, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62048, 62064, 62060, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62048, 62064, 62065, 62062, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62048, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62081, + 62064, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62081, 62064, 0, 1, 49152, 57344, 61440, 61952, + 62080, 62081, 62064, 62066, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62081, 62064, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62081, 62064, 62068, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62081, 62064, + 62068, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62081, 62064, 62072, 62070, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62081, 62064, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62081, 62064, 62072, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62081, 62083, + 62072, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62081, 62083, 62072, 62074, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62081, 62083, 62072, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62081, 62083, 62072, + 62076, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62081, 62083, 62072, 62076, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62081, 62083, 62072, 62076, 62078, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 61952, 62080, 0, 1, 49152, + 57344, 61440, 61952, 62080, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62082, 0, 1, 49152, 57344, + 61440, 61952, 62080, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62084, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62084, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62088, 62086, 0, 1, 49152, 57344, + 61440, 61952, 62080, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62088, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62088, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62088, 62090, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62088, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62096, 62092, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62096, 62092, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62096, 62097, 62094, + 0, 1, 49152, 57344, 61440, 61952, 62080, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62096, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62096, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62096, 62098, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62096, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62096, + 62100, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62096, 62100, 0, 1, 49152, 57344, 61440, 61952, + 62080, 62096, 62104, 62102, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62096, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62112, 62104, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62112, 62104, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62112, 62104, 62106, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62112, + 62104, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62112, 62113, 62108, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62112, 62113, 62108, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62112, 62113, 62108, 62110, + 0, 1, 49152, 57344, 61440, 61952, 62080, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62112, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62112, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62112, 62114, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62112, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62112, + 62116, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62112, 62116, 0, 1, 49152, 57344, 61440, 61952, + 62080, 62112, 62120, 62118, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62112, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62112, 62120, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62112, 62120, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62112, 62120, 62122, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62112, + 62120, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62112, 62128, 62124, 0, 1, 49152, 57344, 61440, + 61952, 62080, 62112, 62128, 62124, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62112, 62128, 62129, 62126, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62112, + 0, 1, 49152, 57344, 61440, 61952, 62080, 62144, + 62128, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62144, 62128, 0, 1, 49152, 57344, 61440, 61952, + 62080, 62144, 62128, 62130, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62144, 62128, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62144, 62128, 62132, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62144, 62128, + 62132, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62144, 62128, 62136, 62134, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62144, 62128, 0, 1, 49152, + 57344, 61440, 61952, 62080, 62144, 62145, 62136, 0, + 1, 49152, 57344, 61440, 61952, 62080, 62144, 62145, + 62136, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62144, 62145, 62136, 62138, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62144, 62145, 62136, 0, 1, + 49152, 57344, 61440, 61952, 62080, 62144, 62145, 62136, + 62140, 0, 1, 49152, 57344, 61440, 61952, 62080, + 62144, 62145, 62147, 62140, 0, 1, 49152, 57344, + 61440, 61952, 62080, 62144, 62145, 62147, 62140, 62142, + 0, 1, 49152, 57344, 61440, 61952, 62080, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62144, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62144, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62144, 62146, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 62148, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62148, 0, 1, 49152, 57344, 61440, 61952, + 62208, 62144, 62152, 62150, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 62152, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62144, 62152, 0, 1, + 49152, 57344, 61440, 61952, 62208, 62144, 62152, 62154, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 62152, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62160, 62156, 0, 1, 49152, 57344, 61440, + 61952, 62208, 62144, 62160, 62156, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62144, 62160, 62161, 62158, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 62160, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62160, 0, 1, 49152, 57344, 61440, 61952, + 62208, 62144, 62160, 62162, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 62160, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62144, 62160, 62164, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62144, 62160, + 62164, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62160, 62168, 62166, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 62160, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62144, 62176, 62168, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62144, 62176, + 62168, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62176, 62168, 62170, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 62176, 62168, 0, 1, + 49152, 57344, 61440, 61952, 62208, 62144, 62176, 62177, + 62172, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62144, 62176, 62177, 62172, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62144, 62176, 62177, 62172, 62174, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62144, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62209, + 62176, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62176, 0, 1, 49152, 57344, 61440, 61952, + 62208, 62209, 62176, 62178, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62176, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62209, 62176, 62180, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62209, 62176, + 62180, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62176, 62184, 62182, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62176, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62209, 62176, 62184, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62209, 62176, + 62184, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62176, 62184, 62186, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62176, 62184, 0, 1, + 49152, 57344, 61440, 61952, 62208, 62209, 62176, 62192, + 62188, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62176, 62192, 62188, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62176, 62192, 62193, 62190, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62209, + 62176, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62176, 62192, 0, 1, 49152, 57344, 61440, + 61952, 62208, 62209, 62211, 62192, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62209, 62211, 62192, 62194, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62209, + 62211, 62192, 0, 1, 49152, 57344, 61440, 61952, + 62208, 62209, 62211, 62192, 62196, 0, 1, 49152, + 57344, 61440, 61952, 62208, 62209, 62211, 62192, 62196, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62209, + 62211, 62192, 62200, 62198, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62211, 62192, 0, 1, + 49152, 57344, 61440, 61952, 62208, 62209, 62211, 62192, + 62200, 0, 1, 49152, 57344, 61440, 61952, 62208, + 62209, 62211, 62192, 62200, 0, 1, 49152, 57344, + 61440, 61952, 62208, 62209, 62211, 62192, 62200, 62202, + 0, 1, 49152, 57344, 61440, 61952, 62208, 62209, + 62211, 62215, 62200, 0, 1, 49152, 57344, 61440, + 61952, 62208, 62209, 62211, 62215, 62200, 62204, 0, + 1, 49152, 57344, 61440, 61952, 62208, 62209, 62211, + 62215, 62200, 62204, 0, 1, 49152, 57344, 61440, + 61952, 62208, 62209, 62211, 62215, 62200, 62204, 62206, + 0, 1, 49152, 57344, 61440, 61952, 0, 1, + 49152, 57344, 61440, 62464, 62208, 0, 1, 49152, + 57344, 61440, 62464, 62208, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62210, 0, 1, 49152, 57344, + 61440, 62464, 62208, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62212, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62212, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62216, 62214, 0, 1, 49152, 57344, + 61440, 62464, 62208, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62216, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62216, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62216, 62218, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62216, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62224, 62220, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62224, 62220, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62224, 62225, 62222, + 0, 1, 49152, 57344, 61440, 62464, 62208, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62224, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62224, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62224, 62226, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62224, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62224, + 62228, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62224, 62228, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62224, 62232, 62230, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62224, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62240, 62232, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62240, 62232, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62240, 62232, 62234, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62240, + 62232, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62240, 62241, 62236, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62240, 62241, 62236, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62240, 62241, 62236, 62238, + 0, 1, 49152, 57344, 61440, 62464, 62208, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62240, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62240, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62240, 62242, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62240, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62240, + 62244, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62240, 62244, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62240, 62248, 62246, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62240, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62240, 62248, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62240, 62248, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62240, 62248, 62250, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62240, + 62248, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62240, 62256, 62252, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62240, 62256, 62252, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62240, 62256, 62257, 62254, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62240, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 62256, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62256, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62272, 62256, 62258, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62256, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62256, 62260, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 62256, + 62260, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62256, 62264, 62262, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62256, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62273, 62264, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 62273, + 62264, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62273, 62264, 62266, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62273, 62264, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62272, 62273, 62264, + 62268, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62273, 62275, 62268, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62273, 62275, 62268, 62270, + 0, 1, 49152, 57344, 61440, 62464, 62208, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 62274, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 62276, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62276, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62272, 62280, 62278, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62280, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62280, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62272, 62280, 62282, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 62280, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62288, 62284, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62272, 62288, 62284, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62288, 62289, 62286, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 62288, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62288, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62272, 62288, 62290, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62288, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62288, 62292, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 62288, + 62292, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62288, 62296, 62294, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62288, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62272, 62304, 62296, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62272, 62304, + 62296, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62304, 62296, 62298, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62304, 62296, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62272, 62304, 62305, + 62300, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62272, 62304, 62305, 62300, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62272, 62304, 62305, 62300, 62302, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62272, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62336, + 62304, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62304, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62336, 62304, 62306, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62304, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62336, 62304, 62308, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62336, 62304, + 62308, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62304, 62312, 62310, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62304, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62336, 62304, 62312, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62336, 62304, + 62312, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62304, 62312, 62314, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62304, 62312, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62336, 62304, 62320, + 62316, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62304, 62320, 62316, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62304, 62320, 62321, 62318, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62336, + 62304, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62337, 62320, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62336, 62337, 62320, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62336, 62337, 62320, 62322, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62336, + 62337, 62320, 0, 1, 49152, 57344, 61440, 62464, + 62208, 62336, 62337, 62320, 62324, 0, 1, 49152, + 57344, 61440, 62464, 62208, 62336, 62337, 62320, 62324, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62336, + 62337, 62320, 62328, 62326, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62337, 62320, 0, 1, + 49152, 57344, 61440, 62464, 62208, 62336, 62337, 62320, + 62328, 0, 1, 49152, 57344, 61440, 62464, 62208, + 62336, 62337, 62339, 62328, 0, 1, 49152, 57344, + 61440, 62464, 62208, 62336, 62337, 62339, 62328, 62330, + 0, 1, 49152, 57344, 61440, 62464, 62208, 62336, + 62337, 62339, 62328, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62336, 62337, 62339, 62328, 62332, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62336, 62337, + 62339, 62328, 62332, 0, 1, 49152, 57344, 61440, + 62464, 62208, 62336, 62337, 62339, 62328, 62332, 62334, + 0, 1, 49152, 57344, 61440, 62464, 62208, 0, + 1, 49152, 57344, 61440, 62464, 62208, 62336, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62338, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62340, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62340, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62336, 62344, 62342, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62344, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62344, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62336, 62344, 62346, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62344, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62352, 62348, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62336, 62352, 62348, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62352, 62353, 62350, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62352, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62352, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62336, 62352, 62354, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62352, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62352, 62356, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62352, + 62356, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62352, 62360, 62358, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62352, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62368, 62360, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62368, + 62360, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 62360, 62362, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 62360, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62336, 62368, 62369, + 62364, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 62369, 62364, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 62369, 62364, 62366, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62368, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62336, 62368, 62370, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62368, 62372, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62368, + 62372, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 62376, 62374, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62368, 62376, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62368, + 62376, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 62376, 62378, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 62376, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62336, 62368, 62384, + 62380, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62368, 62384, 62380, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62368, 62384, 62385, 62382, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62368, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62400, 62384, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62336, 62400, 62384, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62400, 62384, 62386, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62400, 62384, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62336, 62400, 62384, 62388, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62336, 62400, 62384, 62388, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62400, 62384, 62392, 62390, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62400, 62384, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62336, 62400, 62401, + 62392, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62400, 62401, 62392, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62336, 62400, 62401, 62392, 62394, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62400, 62401, 62392, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62336, 62400, 62401, 62392, 62396, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62336, 62400, + 62401, 62403, 62396, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62336, 62400, 62401, 62403, 62396, 62398, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62336, + 62400, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62336, 62400, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62336, 62400, 62402, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62404, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62400, + 62404, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62408, 62406, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62408, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62400, + 62408, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62408, 62410, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 62408, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62467, 62400, 62416, + 62412, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62416, 62412, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 62416, 62417, 62414, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62416, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62400, 62416, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62416, 62418, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 62416, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62467, 62400, 62416, 62420, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62416, 62420, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 62416, 62424, 62422, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 62416, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62467, 62400, 62432, + 62424, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62432, 62424, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62400, 62432, 62424, 62426, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 62432, 62424, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62400, 62432, 62433, 62428, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62400, + 62432, 62433, 62428, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62400, 62432, 62433, 62428, 62430, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62400, 62432, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62400, 62432, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62432, 62434, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 62432, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62467, 62400, 62432, 62436, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62400, 62432, 62436, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62400, 62432, 62440, 62438, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62471, 62432, 0, 1, + 49152, 57344, 61440, 62464, 62465, 62467, 62471, 62432, + 62440, 0, 1, 49152, 57344, 61440, 62464, 62465, + 62467, 62471, 62432, 62440, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62471, 62432, 62440, 62442, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62471, 62432, 62440, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62471, 62432, 62448, 62444, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62471, + 62432, 62448, 62444, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62471, 62432, 62448, 62449, 62446, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62471, 62432, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62467, 62471, 62432, 62448, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62471, 62432, 62448, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62471, 62432, 62448, 62450, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62471, 62432, 62448, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62471, + 62432, 62448, 62452, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62471, 62432, 62448, 62452, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62471, + 62432, 62448, 62456, 62454, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62471, 62432, 62448, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62471, + 62432, 62448, 62456, 0, 1, 49152, 57344, 61440, + 62464, 62465, 62467, 62471, 62432, 62448, 62456, 0, + 1, 49152, 57344, 61440, 62464, 62465, 62467, 62471, + 62432, 62448, 62456, 62458, 0, 1, 49152, 57344, + 61440, 62464, 62465, 62467, 62471, 62432, 62448, 62456, + 0, 1, 49152, 57344, 61440, 62464, 62465, 62467, + 62471, 62432, 62448, 62456, 62460, 0, 1, 49152, + 57344, 61440, 62464, 62465, 62467, 62471, 62432, 62448, + 62456, 62460, 0, 1, 49152, 57344, 61440, 62464, + 62465, 62467, 62471, 62432, 62448, 62456, 62460, 62462, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 62464, 0, 1, 49152, 57344, 61440, + 62464, 0, 1, 49152, 57344, 61440, 62464, 62466, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62468, 0, 1, 49152, + 57344, 61440, 62464, 62468, 0, 1, 49152, 57344, + 61440, 62464, 62472, 62470, 0, 1, 49152, 57344, + 61440, 62464, 0, 1, 49152, 57344, 61440, 62464, + 62472, 0, 1, 49152, 57344, 61440, 62464, 62472, + 0, 1, 49152, 57344, 61440, 62464, 62472, 62474, + 0, 1, 49152, 57344, 61440, 62464, 62472, 0, + 1, 49152, 57344, 61440, 62464, 62480, 62476, 0, + 1, 49152, 57344, 61440, 62464, 62480, 62476, 0, + 1, 49152, 57344, 61440, 62464, 62480, 62481, 62478, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62480, 0, 1, 49152, + 57344, 61440, 62464, 62480, 0, 1, 49152, 57344, + 61440, 62464, 62480, 62482, 0, 1, 49152, 57344, + 61440, 62464, 62480, 0, 1, 49152, 57344, 61440, + 62464, 62480, 62484, 0, 1, 49152, 57344, 61440, + 62464, 62480, 62484, 0, 1, 49152, 57344, 61440, + 62464, 62480, 62488, 62486, 0, 1, 49152, 57344, + 61440, 62464, 62480, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62488, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62488, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62488, 62490, 0, 1, 49152, 57344, + 61440, 62464, 62496, 62488, 0, 1, 49152, 57344, + 61440, 62464, 62496, 62497, 62492, 0, 1, 49152, + 57344, 61440, 62464, 62496, 62497, 62492, 0, 1, + 49152, 57344, 61440, 62464, 62496, 62497, 62492, 62494, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62496, 0, 1, 49152, + 57344, 61440, 62464, 62496, 0, 1, 49152, 57344, + 61440, 62464, 62496, 62498, 0, 1, 49152, 57344, + 61440, 62464, 62496, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62500, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62500, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62504, 62502, 0, 1, 49152, 57344, + 61440, 62464, 62496, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62504, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62504, 0, 1, 49152, 57344, 61440, + 62464, 62496, 62504, 62506, 0, 1, 49152, 57344, + 61440, 62464, 62496, 62504, 0, 1, 49152, 57344, + 61440, 62464, 62496, 62512, 62508, 0, 1, 49152, + 57344, 61440, 62464, 62496, 62512, 62508, 0, 1, + 49152, 57344, 61440, 62464, 62496, 62512, 62513, 62510, + 0, 1, 49152, 57344, 61440, 62464, 62496, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62512, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62512, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62512, 62514, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62512, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62512, + 62516, 0, 1, 49152, 57344, 61440, 62464, 62528, + 62512, 62516, 0, 1, 49152, 57344, 61440, 62464, + 62528, 62512, 62520, 62518, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62512, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62529, 62520, 0, 1, 49152, + 57344, 61440, 62464, 62528, 62529, 62520, 0, 1, + 49152, 57344, 61440, 62464, 62528, 62529, 62520, 62522, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62529, + 62520, 0, 1, 49152, 57344, 61440, 62464, 62528, + 62529, 62520, 62524, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62529, 62531, 62524, 0, 1, 49152, + 57344, 61440, 62464, 62528, 62529, 62531, 62524, 62526, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62528, 0, 1, 49152, + 57344, 61440, 62464, 62528, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62530, 0, 1, 49152, 57344, + 61440, 62464, 62528, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62532, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62532, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62536, 62534, 0, 1, 49152, 57344, + 61440, 62464, 62528, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62536, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62536, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62536, 62538, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62536, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62544, 62540, 0, 1, 49152, + 57344, 61440, 62464, 62528, 62544, 62540, 0, 1, + 49152, 57344, 61440, 62464, 62528, 62544, 62545, 62542, + 0, 1, 49152, 57344, 61440, 62464, 62528, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62544, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62544, 0, + 1, 49152, 57344, 61440, 62464, 62528, 62544, 62546, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62544, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62544, + 62548, 0, 1, 49152, 57344, 61440, 62464, 62528, + 62544, 62548, 0, 1, 49152, 57344, 61440, 62464, + 62528, 62544, 62552, 62550, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62544, 0, 1, 49152, 57344, + 61440, 62464, 62528, 62560, 62552, 0, 1, 49152, + 57344, 61440, 62464, 62528, 62560, 62552, 0, 1, + 49152, 57344, 61440, 62464, 62528, 62560, 62552, 62554, + 0, 1, 49152, 57344, 61440, 62464, 62528, 62560, + 62552, 0, 1, 49152, 57344, 61440, 62464, 62528, + 62560, 62561, 62556, 0, 1, 49152, 57344, 61440, + 62464, 62528, 62560, 62561, 62556, 0, 1, 49152, + 57344, 61440, 62464, 62528, 62560, 62561, 62556, 62558, + 0, 1, 49152, 57344, 61440, 62464, 62528, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62560, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62560, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62560, 62562, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62560, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62560, + 62564, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62560, 62564, 0, 1, 49152, 57344, 61440, 62464, + 62592, 62560, 62568, 62566, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62560, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62560, 62568, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62560, 62568, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62560, 62568, 62570, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62560, + 62568, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62560, 62576, 62572, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62560, 62576, 62572, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62560, 62576, 62577, 62574, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62560, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62593, + 62576, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62593, 62576, 0, 1, 49152, 57344, 61440, 62464, + 62592, 62593, 62576, 62578, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62593, 62576, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62593, 62576, 62580, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62593, 62576, + 62580, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62593, 62576, 62584, 62582, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62593, 62576, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62593, 62576, 62584, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62593, 62595, + 62584, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62593, 62595, 62584, 62586, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62593, 62595, 62584, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62593, 62595, 62584, + 62588, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62593, 62595, 62584, 62588, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62593, 62595, 62584, 62588, 62590, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62592, 0, 1, 49152, + 57344, 61440, 62464, 62592, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62594, 0, 1, 49152, 57344, + 61440, 62464, 62592, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62596, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62596, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62600, 62598, 0, 1, 49152, 57344, + 61440, 62464, 62592, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62600, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62600, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62600, 62602, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62600, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62608, 62604, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62608, 62604, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62608, 62609, 62606, + 0, 1, 49152, 57344, 61440, 62464, 62592, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62608, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62608, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62608, 62610, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62608, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62608, + 62612, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62608, 62612, 0, 1, 49152, 57344, 61440, 62464, + 62592, 62608, 62616, 62614, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62608, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62624, 62616, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62624, 62616, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62624, 62616, 62618, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62624, + 62616, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62624, 62625, 62620, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62624, 62625, 62620, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62624, 62625, 62620, 62622, + 0, 1, 49152, 57344, 61440, 62464, 62592, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62624, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62624, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62624, 62626, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62624, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62624, + 62628, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62624, 62628, 0, 1, 49152, 57344, 61440, 62464, + 62592, 62624, 62632, 62630, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62624, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62624, 62632, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62624, 62632, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62624, 62632, 62634, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62624, + 62632, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62624, 62640, 62636, 0, 1, 49152, 57344, 61440, + 62464, 62592, 62624, 62640, 62636, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62624, 62640, 62641, 62638, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62624, + 0, 1, 49152, 57344, 61440, 62464, 62592, 62656, + 62640, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62656, 62640, 0, 1, 49152, 57344, 61440, 62464, + 62592, 62656, 62640, 62642, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62656, 62640, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62656, 62640, 62644, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62656, 62640, + 62644, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62656, 62640, 62648, 62646, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62656, 62640, 0, 1, 49152, + 57344, 61440, 62464, 62592, 62656, 62657, 62648, 0, + 1, 49152, 57344, 61440, 62464, 62592, 62656, 62657, + 62648, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62656, 62657, 62648, 62650, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62656, 62657, 62648, 0, 1, + 49152, 57344, 61440, 62464, 62592, 62656, 62657, 62648, + 62652, 0, 1, 49152, 57344, 61440, 62464, 62592, + 62656, 62657, 62659, 62652, 0, 1, 49152, 57344, + 61440, 62464, 62592, 62656, 62657, 62659, 62652, 62654, + 0, 1, 49152, 57344, 61440, 62464, 62592, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62656, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62656, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62656, 62658, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 62660, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62660, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62656, 62664, 62662, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 62664, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62656, 62664, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62656, 62664, 62666, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 62664, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62672, 62668, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62656, 62672, 62668, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62656, 62672, 62673, 62670, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 62672, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62672, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62656, 62672, 62674, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 62672, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62656, 62672, 62676, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62656, 62672, + 62676, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62672, 62680, 62678, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 62672, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62656, 62688, 62680, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62656, 62688, + 62680, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62688, 62680, 62682, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 62688, 62680, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62656, 62688, 62689, + 62684, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62656, 62688, 62689, 62684, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62656, 62688, 62689, 62684, 62686, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62656, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62721, + 62688, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62688, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62721, 62688, 62690, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62688, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62721, 62688, 62692, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62721, 62688, + 62692, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62688, 62696, 62694, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62688, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62721, 62688, 62696, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62721, 62688, + 62696, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62688, 62696, 62698, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62688, 62696, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62721, 62688, 62704, + 62700, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62688, 62704, 62700, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62688, 62704, 62705, 62702, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62721, + 62688, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62688, 62704, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62721, 62723, 62704, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62721, 62723, 62704, 62706, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62721, + 62723, 62704, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62721, 62723, 62704, 62708, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62721, 62723, 62704, 62708, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62721, + 62723, 62704, 62712, 62710, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62723, 62704, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62721, 62723, 62704, + 62712, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62721, 62723, 62704, 62712, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62721, 62723, 62704, 62712, 62714, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62721, + 62723, 62727, 62712, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62721, 62723, 62727, 62712, 62716, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62721, 62723, + 62727, 62712, 62716, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62721, 62723, 62727, 62712, 62716, 62718, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 62464, 62720, 0, 1, 49152, + 57344, 61440, 62464, 62720, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62722, 0, 1, 49152, 57344, + 61440, 62464, 62720, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62724, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62724, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62728, 62726, 0, 1, 49152, 57344, + 61440, 62464, 62720, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62728, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62728, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62728, 62730, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62728, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62736, 62732, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62736, 62732, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62736, 62737, 62734, + 0, 1, 49152, 57344, 61440, 62464, 62720, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62736, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62736, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62736, 62738, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62736, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62736, + 62740, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62736, 62740, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62736, 62744, 62742, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62736, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62752, 62744, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62752, 62744, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62752, 62744, 62746, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62752, + 62744, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62752, 62753, 62748, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62752, 62753, 62748, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62752, 62753, 62748, 62750, + 0, 1, 49152, 57344, 61440, 62464, 62720, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62752, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62752, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62752, 62754, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62752, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62752, + 62756, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62752, 62756, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62752, 62760, 62758, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62752, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62752, 62760, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62752, 62760, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62752, 62760, 62762, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62752, + 62760, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62752, 62768, 62764, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62752, 62768, 62764, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62752, 62768, 62769, 62766, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62752, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 62768, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62768, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62784, 62768, 62770, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62768, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62768, 62772, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 62768, + 62772, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62768, 62776, 62774, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62768, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62785, 62776, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 62785, + 62776, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62785, 62776, 62778, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62785, 62776, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62784, 62785, 62776, + 62780, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62785, 62787, 62780, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62785, 62787, 62780, 62782, + 0, 1, 49152, 57344, 61440, 62464, 62720, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 62786, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 62788, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62788, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62784, 62792, 62790, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62792, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62792, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62784, 62792, 62794, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 62792, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62800, 62796, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62784, 62800, 62796, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62800, 62801, 62798, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 62800, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62800, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62784, 62800, 62802, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62800, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62800, 62804, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 62800, + 62804, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62800, 62808, 62806, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62800, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62784, 62816, 62808, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62784, 62816, + 62808, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62816, 62808, 62810, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62816, 62808, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62784, 62816, 62817, + 62812, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62784, 62816, 62817, 62812, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62784, 62816, 62817, 62812, 62814, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62784, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62848, + 62816, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62816, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62848, 62816, 62818, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62816, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62848, 62816, 62820, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62848, 62816, + 62820, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62816, 62824, 62822, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62816, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62848, 62816, 62824, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62848, 62816, + 62824, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62816, 62824, 62826, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62816, 62824, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62848, 62816, 62832, + 62828, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62816, 62832, 62828, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62816, 62832, 62833, 62830, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62848, + 62816, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62849, 62832, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62848, 62849, 62832, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62848, 62849, 62832, 62834, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62848, + 62849, 62832, 0, 1, 49152, 57344, 61440, 62464, + 62720, 62848, 62849, 62832, 62836, 0, 1, 49152, + 57344, 61440, 62464, 62720, 62848, 62849, 62832, 62836, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62848, + 62849, 62832, 62840, 62838, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62849, 62832, 0, 1, + 49152, 57344, 61440, 62464, 62720, 62848, 62849, 62832, + 62840, 0, 1, 49152, 57344, 61440, 62464, 62720, + 62848, 62849, 62851, 62840, 0, 1, 49152, 57344, + 61440, 62464, 62720, 62848, 62849, 62851, 62840, 62842, + 0, 1, 49152, 57344, 61440, 62464, 62720, 62848, + 62849, 62851, 62840, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62848, 62849, 62851, 62840, 62844, 0, + 1, 49152, 57344, 61440, 62464, 62720, 62848, 62849, + 62851, 62840, 62844, 0, 1, 49152, 57344, 61440, + 62464, 62720, 62848, 62849, 62851, 62840, 62844, 62846, + 0, 1, 49152, 57344, 61440, 62464, 62720, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62850, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62852, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62852, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62848, 62856, 62854, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62856, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62856, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62848, 62856, 62858, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62856, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62864, 62860, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62848, 62864, 62860, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62864, 62865, 62862, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62864, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62864, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62848, 62864, 62866, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62864, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62864, 62868, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62864, + 62868, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62864, 62872, 62870, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62864, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62880, 62872, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62880, + 62872, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 62872, 62874, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 62872, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62848, 62880, 62881, + 62876, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 62881, 62876, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 62881, 62876, 62878, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62880, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62848, 62880, 62882, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62880, 62884, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62880, + 62884, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 62888, 62886, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62880, 62888, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62880, + 62888, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 62888, 62890, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 62888, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62848, 62880, 62896, + 62892, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62880, 62896, 62892, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62880, 62896, 62897, 62894, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62880, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62912, 62896, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62848, 62912, 62896, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62912, 62896, 62898, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62912, 62896, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62848, 62912, 62896, 62900, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62848, 62912, 62896, 62900, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62912, 62896, 62904, 62902, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62912, 62896, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62848, 62912, 62913, + 62904, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62848, 62912, 62913, 62904, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62848, 62912, 62913, 62904, 62906, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 62912, 62913, 62904, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62848, 62912, 62913, 62904, 62908, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62848, 62912, + 62913, 62915, 62908, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62848, 62912, 62913, 62915, 62908, 62910, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62848, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62977, 62912, 62914, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62912, 62916, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62912, + 62916, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62920, 62918, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62912, 62920, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62912, + 62920, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62920, 62922, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 62920, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62977, 62912, 62928, + 62924, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62928, 62924, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 62928, 62929, 62926, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62928, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62912, 62928, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62912, 62928, 62930, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 62928, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62977, 62912, 62928, 62932, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62912, 62928, 62932, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 62928, 62936, 62934, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 62928, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62977, 62912, 62944, + 62936, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62944, 62936, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62912, 62944, 62936, 62938, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 62944, 62936, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62912, 62944, 62945, 62940, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62912, + 62944, 62945, 62940, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62912, 62944, 62945, 62940, 62942, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62912, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62912, 62944, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62979, 62944, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62979, 62944, 62946, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62944, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62977, 62979, 62944, 62948, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62979, 62944, 62948, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62944, 62952, 62950, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62979, 62944, 0, 1, + 49152, 57344, 61440, 62464, 62976, 62977, 62979, 62944, + 62952, 0, 1, 49152, 57344, 61440, 62464, 62976, + 62977, 62979, 62944, 62952, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62979, 62944, 62952, 62954, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62944, 62952, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62979, 62944, 62960, 62956, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62979, + 62944, 62960, 62956, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62979, 62944, 62960, 62961, 62958, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62944, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62977, 62979, 62944, 62960, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62979, 62944, 62960, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62944, 62960, 62962, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62979, 62983, 62960, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62979, + 62983, 62960, 62964, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62979, 62983, 62960, 62964, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62979, + 62983, 62960, 62968, 62966, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62979, 62983, 62960, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62979, + 62983, 62960, 62968, 0, 1, 49152, 57344, 61440, + 62464, 62976, 62977, 62979, 62983, 62960, 62968, 0, + 1, 49152, 57344, 61440, 62464, 62976, 62977, 62979, + 62983, 62960, 62968, 62970, 0, 1, 49152, 57344, + 61440, 62464, 62976, 62977, 62979, 62983, 62960, 62968, + 0, 1, 49152, 57344, 61440, 62464, 62976, 62977, + 62979, 62983, 62960, 62968, 62972, 0, 1, 49152, + 57344, 61440, 62464, 62976, 62977, 62979, 62983, 62960, + 62968, 62972, 0, 1, 49152, 57344, 61440, 62464, + 62976, 62977, 62979, 62983, 62960, 62968, 62972, 62974, + 0, 1, 49152, 57344, 61440, 62464, 0, 1, + 49152, 57344, 61440, 63488, 62976, 0, 1, 49152, + 57344, 61440, 63488, 62976, 0, 1, 49152, 57344, + 61440, 63488, 62976, 62978, 0, 1, 49152, 57344, + 61440, 63488, 62976, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62980, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62980, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62984, 62982, 0, 1, 49152, 57344, + 61440, 63488, 62976, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62984, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62984, 0, 1, 49152, 57344, 61440, + 63488, 62976, 62984, 62986, 0, 1, 49152, 57344, + 61440, 63488, 62976, 62984, 0, 1, 49152, 57344, + 61440, 63488, 62976, 62992, 62988, 0, 1, 49152, + 57344, 61440, 63488, 62976, 62992, 62988, 0, 1, + 49152, 57344, 61440, 63488, 62976, 62992, 62993, 62990, + 0, 1, 49152, 57344, 61440, 63488, 62976, 0, + 1, 49152, 57344, 61440, 63488, 62976, 62992, 0, + 1, 49152, 57344, 61440, 63488, 62976, 62992, 0, + 1, 49152, 57344, 61440, 63488, 62976, 62992, 62994, + 0, 1, 49152, 57344, 61440, 63488, 62976, 62992, + 0, 1, 49152, 57344, 61440, 63488, 62976, 62992, + 62996, 0, 1, 49152, 57344, 61440, 63488, 62976, + 62992, 62996, 0, 1, 49152, 57344, 61440, 63488, + 62976, 62992, 63000, 62998, 0, 1, 49152, 57344, + 61440, 63488, 62976, 62992, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63008, 63000, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63008, 63000, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63008, 63000, 63002, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63008, + 63000, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63008, 63009, 63004, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63008, 63009, 63004, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63008, 63009, 63004, 63006, + 0, 1, 49152, 57344, 61440, 63488, 62976, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63008, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63008, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63008, 63010, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63008, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63008, + 63012, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63008, 63012, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63008, 63016, 63014, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63008, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63008, 63016, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63008, 63016, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63008, 63016, 63018, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63008, + 63016, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63008, 63024, 63020, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63008, 63024, 63020, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63008, 63024, 63025, 63022, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63008, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 63024, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63024, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63040, 63024, 63026, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63024, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63024, 63028, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 63024, + 63028, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63024, 63032, 63030, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63024, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63041, 63032, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 63041, + 63032, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63041, 63032, 63034, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63041, 63032, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63040, 63041, 63032, + 63036, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63041, 63043, 63036, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63041, 63043, 63036, 63038, + 0, 1, 49152, 57344, 61440, 63488, 62976, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 63042, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 63044, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63044, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63040, 63048, 63046, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63048, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63048, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63040, 63048, 63050, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 63048, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63056, 63052, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63040, 63056, 63052, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63056, 63057, 63054, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 63056, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63056, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63040, 63056, 63058, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63056, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63056, 63060, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 63056, + 63060, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63056, 63064, 63062, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63056, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63040, 63072, 63064, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63040, 63072, + 63064, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63072, 63064, 63066, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63072, 63064, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63040, 63072, 63073, + 63068, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63040, 63072, 63073, 63068, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63040, 63072, 63073, 63068, 63070, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63040, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63072, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63072, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63072, 63074, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63072, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63072, 63076, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63072, + 63076, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63072, 63080, 63078, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63072, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63072, 63080, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63072, + 63080, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63072, 63080, 63082, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63072, 63080, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63072, 63088, + 63084, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63072, 63088, 63084, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63072, 63088, 63089, 63086, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63072, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63105, 63088, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63105, 63088, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63105, 63088, 63090, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63105, 63088, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63105, 63088, 63092, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63105, 63088, 63092, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63105, 63088, 63096, 63094, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63105, 63088, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63105, 63088, + 63096, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63105, 63107, 63096, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63105, 63107, 63096, 63098, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63105, 63107, 63096, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63105, 63107, 63096, 63100, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63105, + 63107, 63096, 63100, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63105, 63107, 63096, 63100, 63102, + 0, 1, 49152, 57344, 61440, 63488, 62976, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63106, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63108, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63108, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63112, 63110, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63112, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63112, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63112, 63114, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63112, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63120, 63116, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63120, 63116, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63120, 63121, 63118, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63120, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63120, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63120, 63122, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63120, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63120, 63124, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63120, + 63124, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63120, 63128, 63126, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63120, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63136, 63128, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63136, + 63128, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 63128, 63130, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 63128, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63136, 63137, + 63132, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 63137, 63132, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 63137, 63132, 63134, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63136, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63136, 63138, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63136, 63140, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63136, + 63140, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 63144, 63142, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63136, 63144, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63136, + 63144, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 63144, 63146, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 63144, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63136, 63152, + 63148, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63136, 63152, 63148, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63136, 63152, 63153, 63150, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63136, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63168, 63152, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63168, 63152, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63168, 63152, 63154, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63168, 63152, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63104, 63168, 63152, 63156, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63104, 63168, 63152, 63156, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63168, 63152, 63160, 63158, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63168, 63152, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63104, 63168, 63169, + 63160, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63104, 63168, 63169, 63160, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63104, 63168, 63169, 63160, 63162, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 63168, 63169, 63160, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63168, 63169, 63160, 63164, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63104, 63168, + 63169, 63171, 63164, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63104, 63168, 63169, 63171, 63164, 63166, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63104, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63232, 63168, 63170, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63168, 63172, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63168, + 63172, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 63176, 63174, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63168, 63176, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63168, + 63176, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 63176, 63178, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 63176, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63232, 63168, 63184, + 63180, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 63184, 63180, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 63184, 63185, 63182, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 63184, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63168, 63184, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63168, 63184, 63186, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 63184, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63232, 63168, 63184, 63188, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63168, 63184, 63188, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 63184, 63192, 63190, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 63184, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63232, 63168, 63200, + 63192, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63168, 63200, 63192, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63168, 63200, 63192, 63194, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 63200, 63192, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63168, 63200, 63201, 63196, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63168, + 63200, 63201, 63196, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63168, 63200, 63201, 63196, 63198, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63168, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63233, 63200, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63233, 63200, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63233, 63200, 63202, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63200, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63232, 63233, 63200, 63204, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63233, 63200, 63204, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63200, 63208, 63206, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63233, 63200, 0, 1, + 49152, 57344, 61440, 63488, 62976, 63232, 63233, 63200, + 63208, 0, 1, 49152, 57344, 61440, 63488, 62976, + 63232, 63233, 63200, 63208, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63233, 63200, 63208, 63210, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63200, 63208, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63233, 63200, 63216, 63212, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63233, + 63200, 63216, 63212, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63233, 63200, 63216, 63217, 63214, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63200, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63232, 63233, 63200, 63216, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63233, 63235, 63216, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63235, 63216, 63218, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63233, 63235, 63216, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63233, + 63235, 63216, 63220, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63233, 63235, 63216, 63220, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63233, + 63235, 63216, 63224, 63222, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63233, 63235, 63216, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63233, + 63235, 63216, 63224, 0, 1, 49152, 57344, 61440, + 63488, 62976, 63232, 63233, 63235, 63216, 63224, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 63233, + 63235, 63216, 63224, 63226, 0, 1, 49152, 57344, + 61440, 63488, 62976, 63232, 63233, 63235, 63239, 63224, + 0, 1, 49152, 57344, 61440, 63488, 62976, 63232, + 63233, 63235, 63239, 63224, 63228, 0, 1, 49152, + 57344, 61440, 63488, 62976, 63232, 63233, 63235, 63239, + 63224, 63228, 0, 1, 49152, 57344, 61440, 63488, + 62976, 63232, 63233, 63235, 63239, 63224, 63228, 63230, + 0, 1, 49152, 57344, 61440, 63488, 62976, 0, + 1, 49152, 57344, 61440, 63488, 62976, 63232, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63234, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63236, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63236, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63240, 63238, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63240, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63240, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63240, 63242, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63240, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63248, 63244, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63248, 63244, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63248, 63249, 63246, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63248, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63248, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63248, 63250, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63248, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63248, 63252, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63248, + 63252, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63248, 63256, 63254, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63248, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63264, 63256, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63264, + 63256, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 63256, 63258, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 63256, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63264, 63265, + 63260, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 63265, 63260, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 63265, 63260, 63262, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63264, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63264, 63266, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63264, 63268, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63264, + 63268, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 63272, 63270, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63264, 63272, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63264, + 63272, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 63272, 63274, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 63272, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63264, 63280, + 63276, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63264, 63280, 63276, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63264, 63280, 63281, 63278, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63264, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63280, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63280, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63280, 63282, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63280, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63296, 63280, 63284, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63280, 63284, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63280, 63288, 63286, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63280, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63296, 63297, + 63288, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63297, 63288, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63297, 63288, 63290, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63297, 63288, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63297, 63288, 63292, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63296, + 63297, 63299, 63292, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63297, 63299, 63292, 63294, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63296, 63298, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63300, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63296, + 63300, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63304, 63302, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63304, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63296, + 63304, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63304, 63306, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63304, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63296, 63312, + 63308, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63312, 63308, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63312, 63313, 63310, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63312, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63312, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63312, 63314, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63312, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63296, 63312, 63316, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63296, 63312, 63316, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63312, 63320, 63318, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63312, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63296, 63328, + 63320, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63296, 63328, 63320, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63296, 63328, 63320, 63322, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 63328, 63320, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63328, 63329, 63324, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63296, + 63328, 63329, 63324, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63296, 63328, 63329, 63324, 63326, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63296, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63360, 63328, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63360, 63328, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63360, 63328, 63330, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63328, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63360, 63328, 63332, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63360, 63328, 63332, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63328, 63336, 63334, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63360, 63328, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63232, 63360, 63328, + 63336, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63360, 63328, 63336, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63360, 63328, 63336, 63338, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63328, 63336, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63360, 63328, 63344, 63340, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63360, + 63328, 63344, 63340, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63360, 63328, 63344, 63345, 63342, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63328, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63360, 63361, 63344, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63360, 63361, 63344, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63361, 63344, 63346, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63360, 63361, 63344, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63360, + 63361, 63344, 63348, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63360, 63361, 63344, 63348, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63360, + 63361, 63344, 63352, 63350, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63360, 63361, 63344, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63360, + 63361, 63344, 63352, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63232, 63360, 63361, 63363, 63352, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63232, 63360, + 63361, 63363, 63352, 63354, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63232, 63360, 63361, 63363, 63352, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 63361, 63363, 63352, 63356, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63232, 63360, 63361, 63363, + 63352, 63356, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63360, 63361, 63363, 63352, 63356, 63358, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63232, + 63360, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63232, 63360, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63232, 63360, 63362, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63364, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63364, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63368, 63366, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63368, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63368, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63368, 63370, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63368, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63491, 63360, 63376, + 63372, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63376, 63372, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63376, 63377, 63374, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63376, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63376, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63376, 63378, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63376, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63360, 63376, 63380, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63376, 63380, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63376, 63384, 63382, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63376, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63491, 63360, 63392, + 63384, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63392, 63384, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63392, 63384, 63386, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63392, 63384, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63392, 63393, 63388, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63392, 63393, 63388, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63392, 63393, 63388, 63390, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63392, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63392, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63392, 63394, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63392, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63360, 63392, 63396, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63392, 63396, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63392, 63400, 63398, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63392, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63491, 63360, 63392, + 63400, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63392, 63400, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63392, 63400, 63402, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63392, 63400, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63392, 63408, 63404, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63392, 63408, 63404, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63392, 63408, 63409, 63406, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63392, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63360, 63424, 63408, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63424, 63408, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63424, 63408, 63410, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63424, 63408, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63424, 63408, 63412, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63424, 63408, 63412, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63424, 63408, 63416, 63414, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63424, 63408, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63424, 63425, 63416, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63424, 63425, 63416, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63360, + 63424, 63425, 63416, 63418, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63360, 63424, 63425, 63416, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63424, 63425, 63416, 63420, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63424, 63425, + 63427, 63420, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63360, 63424, 63425, 63427, 63420, 63422, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63360, 63424, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63360, 63424, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63424, 63426, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63424, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63360, 63424, 63428, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63360, 63424, 63428, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63360, 63424, 63432, 63430, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63491, 63495, 63424, + 63432, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63495, 63424, 63432, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63432, 63434, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 63432, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63440, 63436, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63440, 63436, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63440, 63441, 63438, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63495, 63424, 63440, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63424, 63440, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 63440, 63442, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63440, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63440, 63444, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63440, 63444, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63440, 63448, 63446, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63440, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63448, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63456, 63448, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63448, 63450, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63456, 63448, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 63456, 63457, 63452, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63424, 63456, + 63457, 63452, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63495, 63424, 63456, 63457, 63452, 63454, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63495, 63424, 63456, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63424, 63456, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 63456, 63458, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63456, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63460, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63456, 63460, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63464, 63462, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63456, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63464, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63424, 63456, 63464, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63424, 63456, 63464, 63466, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63424, 63456, 63464, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63424, 63456, 63472, 63468, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63424, 63456, + 63472, 63468, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63495, 63424, 63456, 63472, 63473, 63470, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63503, 63456, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63503, 63456, 63472, 0, + 1, 49152, 57344, 61440, 63488, 63489, 63491, 63495, + 63503, 63456, 63472, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63503, 63456, 63472, 63474, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63503, 63456, 63472, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63503, 63456, 63472, + 63476, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63495, 63503, 63456, 63472, 63476, 0, 1, + 49152, 57344, 61440, 63488, 63489, 63491, 63495, 63503, + 63456, 63472, 63480, 63478, 0, 1, 49152, 57344, + 61440, 63488, 63489, 63491, 63495, 63503, 63456, 63472, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63503, 63456, 63472, 63480, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63503, 63456, + 63472, 63480, 0, 1, 49152, 57344, 61440, 63488, + 63489, 63491, 63495, 63503, 63456, 63472, 63480, 63482, + 0, 1, 49152, 57344, 61440, 63488, 63489, 63491, + 63495, 63503, 63456, 63472, 63480, 0, 1, 49152, + 57344, 61440, 63488, 63489, 63491, 63495, 63503, 63456, + 63472, 63480, 63484, 0, 1, 49152, 57344, 61440, + 63488, 63489, 63491, 63495, 63503, 63456, 63472, 63480, + 63484, 0, 1, 49152, 57344, 61440, 63488, 63489, + 63491, 63495, 63503, 63456, 63472, 63480, 63484, 63486, + 0, 1, 49152, 57344, 61440, 0, 1, 49152, + 57344, 61440, 63488, 0, 1, 49152, 57344, 61440, + 63488, 0, 1, 49152, 57344, 61440, 63488, 63490, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63492, 0, 1, 49152, + 57344, 61440, 63488, 63492, 0, 1, 49152, 57344, + 61440, 63488, 63496, 63494, 0, 1, 49152, 57344, + 61440, 63488, 0, 1, 49152, 57344, 61440, 63488, + 63496, 0, 1, 49152, 57344, 61440, 63488, 63496, + 0, 1, 49152, 57344, 61440, 63488, 63496, 63498, + 0, 1, 49152, 57344, 61440, 63488, 63496, 0, + 1, 49152, 57344, 61440, 63488, 63504, 63500, 0, + 1, 49152, 57344, 61440, 63488, 63504, 63500, 0, + 1, 49152, 57344, 61440, 63488, 63504, 63505, 63502, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63504, 0, 1, 49152, + 57344, 61440, 63488, 63504, 0, 1, 49152, 57344, + 61440, 63488, 63504, 63506, 0, 1, 49152, 57344, + 61440, 63488, 63504, 0, 1, 49152, 57344, 61440, + 63488, 63504, 63508, 0, 1, 49152, 57344, 61440, + 63488, 63504, 63508, 0, 1, 49152, 57344, 61440, + 63488, 63504, 63512, 63510, 0, 1, 49152, 57344, + 61440, 63488, 63504, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63512, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63512, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63512, 63514, 0, 1, 49152, 57344, + 61440, 63488, 63520, 63512, 0, 1, 49152, 57344, + 61440, 63488, 63520, 63521, 63516, 0, 1, 49152, + 57344, 61440, 63488, 63520, 63521, 63516, 0, 1, + 49152, 57344, 61440, 63488, 63520, 63521, 63516, 63518, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63520, 0, 1, 49152, + 57344, 61440, 63488, 63520, 0, 1, 49152, 57344, + 61440, 63488, 63520, 63522, 0, 1, 49152, 57344, + 61440, 63488, 63520, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63524, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63524, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63528, 63526, 0, 1, 49152, 57344, + 61440, 63488, 63520, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63528, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63528, 0, 1, 49152, 57344, 61440, + 63488, 63520, 63528, 63530, 0, 1, 49152, 57344, + 61440, 63488, 63520, 63528, 0, 1, 49152, 57344, + 61440, 63488, 63520, 63536, 63532, 0, 1, 49152, + 57344, 61440, 63488, 63520, 63536, 63532, 0, 1, + 49152, 57344, 61440, 63488, 63520, 63536, 63537, 63534, + 0, 1, 49152, 57344, 61440, 63488, 63520, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63536, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63536, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63536, 63538, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63536, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63536, + 63540, 0, 1, 49152, 57344, 61440, 63488, 63552, + 63536, 63540, 0, 1, 49152, 57344, 61440, 63488, + 63552, 63536, 63544, 63542, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63536, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63553, 63544, 0, 1, 49152, + 57344, 61440, 63488, 63552, 63553, 63544, 0, 1, + 49152, 57344, 61440, 63488, 63552, 63553, 63544, 63546, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63553, + 63544, 0, 1, 49152, 57344, 61440, 63488, 63552, + 63553, 63544, 63548, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63553, 63555, 63548, 0, 1, 49152, + 57344, 61440, 63488, 63552, 63553, 63555, 63548, 63550, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63552, 0, 1, 49152, + 57344, 61440, 63488, 63552, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63554, 0, 1, 49152, 57344, + 61440, 63488, 63552, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63556, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63556, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63560, 63558, 0, 1, 49152, 57344, + 61440, 63488, 63552, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63560, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63560, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63560, 63562, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63560, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63568, 63564, 0, 1, 49152, + 57344, 61440, 63488, 63552, 63568, 63564, 0, 1, + 49152, 57344, 61440, 63488, 63552, 63568, 63569, 63566, + 0, 1, 49152, 57344, 61440, 63488, 63552, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63568, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63568, 0, + 1, 49152, 57344, 61440, 63488, 63552, 63568, 63570, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63568, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63568, + 63572, 0, 1, 49152, 57344, 61440, 63488, 63552, + 63568, 63572, 0, 1, 49152, 57344, 61440, 63488, + 63552, 63568, 63576, 63574, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63568, 0, 1, 49152, 57344, + 61440, 63488, 63552, 63584, 63576, 0, 1, 49152, + 57344, 61440, 63488, 63552, 63584, 63576, 0, 1, + 49152, 57344, 61440, 63488, 63552, 63584, 63576, 63578, + 0, 1, 49152, 57344, 61440, 63488, 63552, 63584, + 63576, 0, 1, 49152, 57344, 61440, 63488, 63552, + 63584, 63585, 63580, 0, 1, 49152, 57344, 61440, + 63488, 63552, 63584, 63585, 63580, 0, 1, 49152, + 57344, 61440, 63488, 63552, 63584, 63585, 63580, 63582, + 0, 1, 49152, 57344, 61440, 63488, 63552, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63584, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63584, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63584, 63586, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63584, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63584, + 63588, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63584, 63588, 0, 1, 49152, 57344, 61440, 63488, + 63616, 63584, 63592, 63590, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63584, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63584, 63592, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63584, 63592, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63584, 63592, 63594, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63584, + 63592, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63584, 63600, 63596, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63584, 63600, 63596, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63584, 63600, 63601, 63598, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63584, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63617, + 63600, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63617, 63600, 0, 1, 49152, 57344, 61440, 63488, + 63616, 63617, 63600, 63602, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63617, 63600, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63617, 63600, 63604, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63617, 63600, + 63604, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63617, 63600, 63608, 63606, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63617, 63600, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63617, 63600, 63608, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63617, 63619, + 63608, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63617, 63619, 63608, 63610, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63617, 63619, 63608, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63617, 63619, 63608, + 63612, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63617, 63619, 63608, 63612, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63617, 63619, 63608, 63612, 63614, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63616, 0, 1, 49152, + 57344, 61440, 63488, 63616, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63618, 0, 1, 49152, 57344, + 61440, 63488, 63616, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63620, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63620, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63624, 63622, 0, 1, 49152, 57344, + 61440, 63488, 63616, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63624, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63624, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63624, 63626, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63624, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63632, 63628, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63632, 63628, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63632, 63633, 63630, + 0, 1, 49152, 57344, 61440, 63488, 63616, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63632, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63632, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63632, 63634, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63632, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63632, + 63636, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63632, 63636, 0, 1, 49152, 57344, 61440, 63488, + 63616, 63632, 63640, 63638, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63632, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63648, 63640, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63648, 63640, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63648, 63640, 63642, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63648, + 63640, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63648, 63649, 63644, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63648, 63649, 63644, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63648, 63649, 63644, 63646, + 0, 1, 49152, 57344, 61440, 63488, 63616, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63648, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63648, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63648, 63650, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63648, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63648, + 63652, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63648, 63652, 0, 1, 49152, 57344, 61440, 63488, + 63616, 63648, 63656, 63654, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63648, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63648, 63656, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63648, 63656, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63648, 63656, 63658, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63648, + 63656, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63648, 63664, 63660, 0, 1, 49152, 57344, 61440, + 63488, 63616, 63648, 63664, 63660, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63648, 63664, 63665, 63662, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63648, + 0, 1, 49152, 57344, 61440, 63488, 63616, 63680, + 63664, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63680, 63664, 0, 1, 49152, 57344, 61440, 63488, + 63616, 63680, 63664, 63666, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63680, 63664, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63680, 63664, 63668, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63680, 63664, + 63668, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63680, 63664, 63672, 63670, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63680, 63664, 0, 1, 49152, + 57344, 61440, 63488, 63616, 63680, 63681, 63672, 0, + 1, 49152, 57344, 61440, 63488, 63616, 63680, 63681, + 63672, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63680, 63681, 63672, 63674, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63680, 63681, 63672, 0, 1, + 49152, 57344, 61440, 63488, 63616, 63680, 63681, 63672, + 63676, 0, 1, 49152, 57344, 61440, 63488, 63616, + 63680, 63681, 63683, 63676, 0, 1, 49152, 57344, + 61440, 63488, 63616, 63680, 63681, 63683, 63676, 63678, + 0, 1, 49152, 57344, 61440, 63488, 63616, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63680, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63680, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63680, 63682, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 63684, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63684, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63680, 63688, 63686, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 63688, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63680, 63688, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63680, 63688, 63690, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 63688, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63696, 63692, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63680, 63696, 63692, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63680, 63696, 63697, 63694, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 63696, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63696, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63680, 63696, 63698, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 63696, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63680, 63696, 63700, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63680, 63696, + 63700, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63696, 63704, 63702, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 63696, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63680, 63712, 63704, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63680, 63712, + 63704, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63712, 63704, 63706, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 63712, 63704, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63680, 63712, 63713, + 63708, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63680, 63712, 63713, 63708, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63680, 63712, 63713, 63708, 63710, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63680, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63745, + 63712, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63712, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63745, 63712, 63714, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63712, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63745, 63712, 63716, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63745, 63712, + 63716, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63712, 63720, 63718, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63712, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63745, 63712, 63720, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63745, 63712, + 63720, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63712, 63720, 63722, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63712, 63720, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63745, 63712, 63728, + 63724, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63712, 63728, 63724, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63712, 63728, 63729, 63726, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63745, + 63712, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63712, 63728, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63745, 63747, 63728, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63745, 63747, 63728, 63730, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63745, + 63747, 63728, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63745, 63747, 63728, 63732, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63745, 63747, 63728, 63732, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63745, + 63747, 63728, 63736, 63734, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63747, 63728, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63745, 63747, 63728, + 63736, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63745, 63747, 63728, 63736, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63745, 63747, 63728, 63736, 63738, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63745, + 63747, 63751, 63736, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63745, 63747, 63751, 63736, 63740, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63745, 63747, + 63751, 63736, 63740, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63745, 63747, 63751, 63736, 63740, 63742, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 63744, 0, 1, 49152, + 57344, 61440, 63488, 63744, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63746, 0, 1, 49152, 57344, + 61440, 63488, 63744, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63748, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63748, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63752, 63750, 0, 1, 49152, 57344, + 61440, 63488, 63744, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63752, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63752, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63752, 63754, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63752, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63760, 63756, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63760, 63756, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63760, 63761, 63758, + 0, 1, 49152, 57344, 61440, 63488, 63744, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63760, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63760, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63760, 63762, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63760, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63760, + 63764, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63760, 63764, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63760, 63768, 63766, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63760, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63776, 63768, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63776, 63768, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63776, 63768, 63770, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63776, + 63768, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63776, 63777, 63772, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63776, 63777, 63772, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63776, 63777, 63772, 63774, + 0, 1, 49152, 57344, 61440, 63488, 63744, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63776, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63776, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63776, 63778, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63776, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63776, + 63780, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63776, 63780, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63776, 63784, 63782, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63776, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63776, 63784, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63776, 63784, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63776, 63784, 63786, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63776, + 63784, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63776, 63792, 63788, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63776, 63792, 63788, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63776, 63792, 63793, 63790, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63776, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 63792, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63792, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63808, 63792, 63794, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63792, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63792, 63796, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 63792, + 63796, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63792, 63800, 63798, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63792, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63809, 63800, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 63809, + 63800, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63809, 63800, 63802, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63809, 63800, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63808, 63809, 63800, + 63804, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63809, 63811, 63804, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63809, 63811, 63804, 63806, + 0, 1, 49152, 57344, 61440, 63488, 63744, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 63810, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 63812, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63812, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63808, 63816, 63814, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63816, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63816, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63808, 63816, 63818, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 63816, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63824, 63820, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63808, 63824, 63820, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63824, 63825, 63822, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 63824, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63824, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63808, 63824, 63826, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63824, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63824, 63828, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 63824, + 63828, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63824, 63832, 63830, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63824, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63808, 63840, 63832, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63808, 63840, + 63832, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63840, 63832, 63834, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63840, 63832, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63808, 63840, 63841, + 63836, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63808, 63840, 63841, 63836, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63808, 63840, 63841, 63836, 63838, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63808, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63872, + 63840, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63840, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63872, 63840, 63842, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63840, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63872, 63840, 63844, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63872, 63840, + 63844, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63840, 63848, 63846, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63840, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63872, 63840, 63848, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63872, 63840, + 63848, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63840, 63848, 63850, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63840, 63848, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63872, 63840, 63856, + 63852, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63840, 63856, 63852, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63840, 63856, 63857, 63854, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63872, + 63840, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63873, 63856, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63872, 63873, 63856, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63872, 63873, 63856, 63858, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63872, + 63873, 63856, 0, 1, 49152, 57344, 61440, 63488, + 63744, 63872, 63873, 63856, 63860, 0, 1, 49152, + 57344, 61440, 63488, 63744, 63872, 63873, 63856, 63860, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63872, + 63873, 63856, 63864, 63862, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63873, 63856, 0, 1, + 49152, 57344, 61440, 63488, 63744, 63872, 63873, 63856, + 63864, 0, 1, 49152, 57344, 61440, 63488, 63744, + 63872, 63873, 63875, 63864, 0, 1, 49152, 57344, + 61440, 63488, 63744, 63872, 63873, 63875, 63864, 63866, + 0, 1, 49152, 57344, 61440, 63488, 63744, 63872, + 63873, 63875, 63864, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63872, 63873, 63875, 63864, 63868, 0, + 1, 49152, 57344, 61440, 63488, 63744, 63872, 63873, + 63875, 63864, 63868, 0, 1, 49152, 57344, 61440, + 63488, 63744, 63872, 63873, 63875, 63864, 63868, 63870, + 0, 1, 49152, 57344, 61440, 63488, 63744, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63874, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63876, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63876, 0, 1, 49152, 57344, 61440, 63488, + 64000, 63872, 63880, 63878, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63880, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63880, 0, 1, + 49152, 57344, 61440, 63488, 64000, 63872, 63880, 63882, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63880, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63888, 63884, 0, 1, 49152, 57344, 61440, + 63488, 64000, 63872, 63888, 63884, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63888, 63889, 63886, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63888, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63888, 0, 1, 49152, 57344, 61440, 63488, + 64000, 63872, 63888, 63890, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63888, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63888, 63892, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63888, + 63892, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63888, 63896, 63894, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63888, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63904, 63896, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63904, + 63896, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 63896, 63898, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 63896, 0, 1, + 49152, 57344, 61440, 63488, 64000, 63872, 63904, 63905, + 63900, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 63905, 63900, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 63905, 63900, 63902, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63904, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 0, 1, 49152, 57344, 61440, 63488, + 64000, 63872, 63904, 63906, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63904, 63908, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63904, + 63908, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 63912, 63910, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63904, 63912, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63904, + 63912, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 63912, 63914, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 63912, 0, 1, + 49152, 57344, 61440, 63488, 64000, 63872, 63904, 63920, + 63916, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63904, 63920, 63916, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63904, 63920, 63921, 63918, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63904, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63936, 63920, 0, 1, 49152, 57344, 61440, + 63488, 64000, 63872, 63936, 63920, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63936, 63920, 63922, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63936, 63920, 0, 1, 49152, 57344, 61440, 63488, + 64000, 63872, 63936, 63920, 63924, 0, 1, 49152, + 57344, 61440, 63488, 64000, 63872, 63936, 63920, 63924, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63936, 63920, 63928, 63926, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63936, 63920, 0, 1, + 49152, 57344, 61440, 63488, 64000, 63872, 63936, 63937, + 63928, 0, 1, 49152, 57344, 61440, 63488, 64000, + 63872, 63936, 63937, 63928, 0, 1, 49152, 57344, + 61440, 63488, 64000, 63872, 63936, 63937, 63928, 63930, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 63936, 63937, 63928, 0, 1, 49152, 57344, 61440, + 63488, 64000, 63872, 63936, 63937, 63928, 63932, 0, + 1, 49152, 57344, 61440, 63488, 64000, 63872, 63936, + 63937, 63939, 63932, 0, 1, 49152, 57344, 61440, + 63488, 64000, 63872, 63936, 63937, 63939, 63932, 63934, + 0, 1, 49152, 57344, 61440, 63488, 64000, 63872, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64001, 63936, 63938, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 63936, 63940, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 63936, + 63940, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63944, 63942, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 63936, 63944, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 63936, + 63944, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63944, 63946, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 63944, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64001, 63936, 63952, + 63948, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63952, 63948, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 63952, 63953, 63950, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63952, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 63936, 63952, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 63936, 63952, 63954, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 63952, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64001, 63936, 63952, 63956, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 63936, 63952, 63956, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 63952, 63960, 63958, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 63952, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64001, 63936, 63968, + 63960, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63968, 63960, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 63936, 63968, 63960, 63962, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 63968, 63960, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 63936, 63968, 63969, 63964, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 63936, + 63968, 63969, 63964, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 63936, 63968, 63969, 63964, 63966, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 63936, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 63936, 63968, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 64003, 63968, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 64003, 63968, 63970, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 63968, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64001, 64003, 63968, 63972, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 64003, 63968, 63972, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 63968, 63976, 63974, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 64003, 63968, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64001, 64003, 63968, + 63976, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64001, 64003, 63968, 63976, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 64003, 63968, 63976, 63978, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 63968, 63976, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 64003, 63968, 63984, 63980, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 64003, + 63968, 63984, 63980, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 64003, 63968, 63984, 63985, 63982, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 63968, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64001, 64003, 63968, 63984, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 64003, 63968, 63984, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 63968, 63984, 63986, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 64003, 64007, 63984, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 64003, + 64007, 63984, 63988, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 64003, 64007, 63984, 63988, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 64003, + 64007, 63984, 63992, 63990, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 64003, 64007, 63984, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 64003, + 64007, 63984, 63992, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64001, 64003, 64007, 63984, 63992, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64001, 64003, + 64007, 63984, 63992, 63994, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64001, 64003, 64007, 63984, 63992, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64001, + 64003, 64007, 63984, 63992, 63996, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64001, 64003, 64007, 63984, + 63992, 63996, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64001, 64003, 64007, 63984, 63992, 63996, 63998, + 0, 1, 49152, 57344, 61440, 63488, 0, 1, + 49152, 57344, 61440, 63488, 64000, 0, 1, 49152, + 57344, 61440, 63488, 64000, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64002, 0, 1, 49152, 57344, + 61440, 63488, 64000, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64004, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64004, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64008, 64006, 0, 1, 49152, 57344, + 61440, 63488, 64000, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64008, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64008, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64008, 64010, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64008, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64016, 64012, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64016, 64012, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64016, 64017, 64014, + 0, 1, 49152, 57344, 61440, 63488, 64000, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64016, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64016, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64016, 64018, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64016, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64016, + 64020, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64016, 64020, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64016, 64024, 64022, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64016, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64032, 64024, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64032, 64024, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64032, 64024, 64026, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64032, + 64024, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64032, 64033, 64028, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64032, 64033, 64028, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64032, 64033, 64028, 64030, + 0, 1, 49152, 57344, 61440, 63488, 64000, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64032, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64032, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64032, 64034, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64032, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64032, + 64036, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64032, 64036, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64032, 64040, 64038, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64032, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64032, 64040, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64032, 64040, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64032, 64040, 64042, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64032, + 64040, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64032, 64048, 64044, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64032, 64048, 64044, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64032, 64048, 64049, 64046, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64032, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 64048, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64048, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64064, 64048, 64050, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64048, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64048, 64052, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 64048, + 64052, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64048, 64056, 64054, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64048, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64065, 64056, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 64065, + 64056, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64065, 64056, 64058, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64065, 64056, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64064, 64065, 64056, + 64060, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64065, 64067, 64060, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64065, 64067, 64060, 64062, + 0, 1, 49152, 57344, 61440, 63488, 64000, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 64066, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 64068, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64068, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64064, 64072, 64070, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64072, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64072, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64064, 64072, 64074, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 64072, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64080, 64076, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64064, 64080, 64076, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64080, 64081, 64078, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 64080, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64080, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64064, 64080, 64082, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64080, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64080, 64084, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 64080, + 64084, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64080, 64088, 64086, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64080, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64064, 64096, 64088, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64064, 64096, + 64088, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64096, 64088, 64090, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64096, 64088, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64064, 64096, 64097, + 64092, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64064, 64096, 64097, 64092, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64064, 64096, 64097, 64092, 64094, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64064, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64096, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64096, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64096, 64098, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64096, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64096, 64100, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64096, + 64100, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64096, 64104, 64102, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64096, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64096, 64104, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64096, + 64104, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64096, 64104, 64106, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64096, 64104, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64096, 64112, + 64108, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64096, 64112, 64108, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64096, 64112, 64113, 64110, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64096, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64129, 64112, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64129, 64112, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64129, 64112, 64114, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64129, 64112, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64129, 64112, 64116, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64129, 64112, 64116, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64129, 64112, 64120, 64118, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64129, 64112, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64129, 64112, + 64120, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64129, 64131, 64120, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64129, 64131, 64120, 64122, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64129, 64131, 64120, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64129, 64131, 64120, 64124, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64129, + 64131, 64120, 64124, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64129, 64131, 64120, 64124, 64126, + 0, 1, 49152, 57344, 61440, 63488, 64000, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64130, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64132, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64132, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64136, 64134, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64136, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64136, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64136, 64138, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64136, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64144, 64140, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64144, 64140, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64144, 64145, 64142, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64144, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64144, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64144, 64146, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64144, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64144, 64148, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64144, + 64148, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64144, 64152, 64150, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64144, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64160, 64152, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64160, + 64152, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 64152, 64154, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 64152, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64160, 64161, + 64156, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 64161, 64156, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 64161, 64156, 64158, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64160, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64160, 64162, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64160, 64164, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64160, + 64164, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 64168, 64166, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64160, 64168, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64160, + 64168, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 64168, 64170, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 64168, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64160, 64176, + 64172, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64160, 64176, 64172, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64160, 64176, 64177, 64174, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64160, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64192, 64176, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64192, 64176, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64192, 64176, 64178, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64192, 64176, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64128, 64192, 64176, 64180, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64128, 64192, 64176, 64180, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64192, 64176, 64184, 64182, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64192, 64176, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64128, 64192, 64193, + 64184, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64128, 64192, 64193, 64184, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64128, 64192, 64193, 64184, 64186, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 64192, 64193, 64184, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64192, 64193, 64184, 64188, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64128, 64192, + 64193, 64195, 64188, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64128, 64192, 64193, 64195, 64188, 64190, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64128, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64192, 64194, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64192, 64196, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64192, + 64196, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 64200, 64198, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64192, 64200, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64192, + 64200, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 64200, 64202, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 64200, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64192, 64208, + 64204, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 64208, 64204, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 64208, 64209, 64206, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 64208, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64192, 64208, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64192, 64208, 64210, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 64208, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64192, 64208, 64212, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64192, 64208, 64212, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 64208, 64216, 64214, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 64208, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64192, 64224, + 64216, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64192, 64224, 64216, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64192, 64224, 64216, 64218, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 64224, 64216, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64192, 64224, 64225, 64220, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64192, + 64224, 64225, 64220, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64192, 64224, 64225, 64220, 64222, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64192, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64257, 64224, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64257, 64224, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64257, 64224, 64226, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64224, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64257, 64224, 64228, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64257, 64224, 64228, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64224, 64232, 64230, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64257, 64224, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64257, 64224, + 64232, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64257, 64224, 64232, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64257, 64224, 64232, 64234, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64224, 64232, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64257, 64224, 64240, 64236, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64257, + 64224, 64240, 64236, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64257, 64224, 64240, 64241, 64238, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64224, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64257, 64224, 64240, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64257, 64259, 64240, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64259, 64240, 64242, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64257, 64259, 64240, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64257, + 64259, 64240, 64244, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64257, 64259, 64240, 64244, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64257, + 64259, 64240, 64248, 64246, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64257, 64259, 64240, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64257, + 64259, 64240, 64248, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64257, 64259, 64240, 64248, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64257, + 64259, 64240, 64248, 64250, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64257, 64259, 64263, 64248, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64257, 64259, 64263, 64248, 64252, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64257, 64259, 64263, + 64248, 64252, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64257, 64259, 64263, 64248, 64252, 64254, + 0, 1, 49152, 57344, 61440, 63488, 64000, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64258, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64260, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64260, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64264, 64262, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64264, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64264, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64264, 64266, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64264, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64272, 64268, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64272, 64268, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64272, 64273, 64270, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64272, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64272, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64272, 64274, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64272, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64272, 64276, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64272, + 64276, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64272, 64280, 64278, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64272, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64288, 64280, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64288, + 64280, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 64280, 64282, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 64280, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64288, 64289, + 64284, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 64289, 64284, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 64289, 64284, 64286, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64288, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64288, 64290, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64288, 64292, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64288, + 64292, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 64296, 64294, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64288, 64296, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64288, + 64296, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 64296, 64298, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 64296, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64288, 64304, + 64300, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64288, 64304, 64300, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64288, 64304, 64305, 64302, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64288, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64304, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64304, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64304, 64306, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64304, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64320, 64304, 64308, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64304, 64308, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64304, 64312, 64310, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64304, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64320, 64321, + 64312, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64321, 64312, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64321, 64312, 64314, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64321, 64312, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64321, 64312, 64316, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64320, + 64321, 64323, 64316, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64321, 64323, 64316, 64318, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64320, 64322, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64324, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64320, + 64324, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64328, 64326, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64328, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64320, + 64328, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64328, 64330, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64328, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64320, 64336, + 64332, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64336, 64332, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64336, 64337, 64334, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64336, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64336, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64336, 64338, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64336, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64320, 64336, 64340, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64320, 64336, 64340, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64336, 64344, 64342, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64336, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64320, 64352, + 64344, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64320, 64352, 64344, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64320, 64352, 64344, 64346, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 64352, 64344, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64352, 64353, 64348, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64320, + 64352, 64353, 64348, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64320, 64352, 64353, 64348, 64350, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64320, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64352, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64352, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64352, 64354, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64352, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64352, 64356, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64352, 64356, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64352, 64360, 64358, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64352, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64352, + 64360, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64352, 64360, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64352, 64360, 64362, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64352, 64360, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64352, 64368, 64364, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64352, 64368, 64364, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64352, 64368, 64369, 64366, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64352, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64385, 64368, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64385, 64368, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64385, 64368, 64370, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64385, 64368, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64385, 64368, 64372, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64385, 64368, 64372, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64385, 64368, 64376, 64374, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64385, 64368, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64385, 64368, 64376, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64385, 64387, 64376, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64385, 64387, 64376, 64378, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64385, 64387, 64376, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64385, 64387, 64376, 64380, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64385, 64387, + 64376, 64380, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64385, 64387, 64376, 64380, 64382, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64386, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64388, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64388, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64392, 64390, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64392, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64392, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64392, 64394, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64392, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64400, + 64396, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64400, 64396, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64400, 64401, 64398, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64400, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64400, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64400, 64402, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64400, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64400, 64404, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64400, 64404, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64400, 64408, 64406, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64400, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64416, + 64408, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64416, 64408, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64416, 64408, 64410, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64416, 64408, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64416, 64417, 64412, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64416, 64417, 64412, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64416, 64417, 64412, 64414, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64416, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64416, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64416, 64418, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64416, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64416, 64420, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64416, 64420, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64416, 64424, 64422, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64416, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64416, + 64424, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64416, 64424, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64416, 64424, 64426, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64416, 64424, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64416, 64432, 64428, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64416, 64432, 64428, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64416, 64432, 64433, 64430, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64416, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64432, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64432, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64432, 64434, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64432, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64432, 64436, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64432, 64436, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64432, 64440, 64438, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64432, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64449, 64440, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64449, 64440, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64449, 64440, 64442, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64449, 64440, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64449, 64440, 64444, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64449, + 64451, 64444, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64449, 64451, 64444, 64446, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64448, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64450, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64452, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64452, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64456, 64454, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64448, + 64456, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64448, 64456, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64456, 64458, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64456, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64464, 64460, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64464, 64460, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64464, 64465, 64462, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64464, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64464, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64464, 64466, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64464, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64464, 64468, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64464, 64468, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64464, 64472, 64470, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64464, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64472, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64472, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64472, 64474, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 64472, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64481, 64476, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64480, + 64481, 64476, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64480, 64481, 64476, 64478, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64480, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64480, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64482, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64484, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64484, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64488, 64486, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64488, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64488, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64488, 64490, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 64488, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64496, 64492, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64480, + 64496, 64492, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64480, 64496, 64497, 64494, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64496, 0, + 1, 49152, 57344, 61440, 63488, 64000, 64256, 64384, + 64448, 64480, 64496, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64496, 64498, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64496, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 64496, + 64500, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64448, 64480, 64496, 64500, 0, 1, + 49152, 57344, 61440, 63488, 64000, 64256, 64384, 64448, + 64480, 64496, 64504, 64502, 0, 1, 49152, 57344, + 61440, 63488, 64000, 64256, 64384, 64448, 64480, 64496, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64496, 64504, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64480, + 64496, 64504, 0, 1, 49152, 57344, 61440, 63488, + 64000, 64256, 64384, 64448, 64480, 64496, 64504, 64506, + 0, 1, 49152, 57344, 61440, 63488, 64000, 64256, + 64384, 64448, 64480, 64496, 64504, 0, 1, 49152, + 57344, 61440, 63488, 64000, 64256, 64384, 64448, 64480, + 64496, 64504, 64508, 0, 1, 49152, 57344, 61440, + 63488, 64000, 64256, 64384, 64448, 64480, 64496, 64504, + 64508, 0, 1, 49152, 57344, 61440, 63488, 64000, + 64256, 64384, 64448, 64480, 64496, 64504, 64508, 64510, + 0, 1, 3, 7, 15, 31, 0, 1, + 3, 7, 15, 31, 63, 0, 1, 3, + 7, 15, 31, 63, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 0, 1, 3, 7, 15, + 31, 63, 127, 255, 511, 1023, 2047, 4095, + 8191, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 0, 1, + 3, 7, 15, 31, 63, 127, 255, 511, + 1023, 2047, 4095, 8191, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 8191, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 16383, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 0, + 1, 3, 7, 15, 31, 63, 127, 255, + 511, 1023, 2047, 4095, 8191, 0, 1, 3, + 7, 15, 31, 63, 127, 255, 511, 1023, + 2047, 4095, 8191, 16383, 0, 1, 3, 7, + 15, 31, 63, 127, 255, 511, 1023, 2047, + 4095, 8191, 0, 1, 3, 7, 15, 31, + 63, 127, 255, 511, 1023, 2047, 4095, 8191, + 16383, 0, 1, 3, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, + 0, 1, 3, 7, 15, 31, 63, 127, + 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, +}; + + diff --git a/IlmImfExamples/CMakeLists.txt b/IlmImfExamples/CMakeLists.txt new file mode 100644 index 0000000..03061cb --- /dev/null +++ b/IlmImfExamples/CMakeLists.txt @@ -0,0 +1,23 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( IlmImfExamples + drawImage.cpp + generalInterfaceExamples.cpp + generalInterfaceTiledExamples.cpp + lowLevelIoExamples.cpp + main.cpp + previewImageExamples.cpp + rgbaInterfaceExamples.cpp + rgbaInterfaceTiledExamples.cpp + ) + + +TARGET_LINK_LIBRARIES ( IlmImfExamples + IlmImf + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} ${ZLIB_LIBRARIES} + ) + diff --git a/IlmImfExamples/Makefile.am b/IlmImfExamples/Makefile.am new file mode 100644 index 0000000..83a5b15 --- /dev/null +++ b/IlmImfExamples/Makefile.am @@ -0,0 +1,32 @@ +## Process this file with automake to produce Makefile.in + +if BUILD_IMFEXAMPLES +noinst_PROGRAMS = imfexamples +endif + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +imfexamples_SOURCES = main.cpp drawImage.cpp rgbaInterfaceExamples.cpp \ + rgbaInterfaceTiledExamples.cpp \ + generalInterfaceExamples.cpp \ + lowLevelIoExamples.cpp previewImageExamples.cpp \ + generalInterfaceTiledExamples.cpp \ + generalInterfaceTiledExamples.h drawImage.h \ + rgbaInterfaceExamples.h generalInterfaceExamples.h \ + rgbaInterfaceTiledExamples.h \ + lowLevelIoExamples.h previewImageExamples.h \ + namespaceAlias.h + +examplesdir = $(datadir)/doc/OpenEXR-@OPENEXR_VERSION@/examples +examples_DATA = $(imfexamples_SOURCES) + +imfexamplesdir = $(examplesdir) + +EXTRA_DIST = CMakeLists.txt + diff --git a/IlmImfExamples/Makefile.in b/IlmImfExamples/Makefile.in new file mode 100644 index 0000000..9b11d36 --- /dev/null +++ b/IlmImfExamples/Makefile.in @@ -0,0 +1,581 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_IMFEXAMPLES_TRUE@noinst_PROGRAMS = imfexamples$(EXEEXT) +subdir = IlmImfExamples +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_imfexamples_OBJECTS = main.$(OBJEXT) drawImage.$(OBJEXT) \ + rgbaInterfaceExamples.$(OBJEXT) \ + rgbaInterfaceTiledExamples.$(OBJEXT) \ + generalInterfaceExamples.$(OBJEXT) \ + lowLevelIoExamples.$(OBJEXT) previewImageExamples.$(OBJEXT) \ + generalInterfaceTiledExamples.$(OBJEXT) +imfexamples_OBJECTS = $(am_imfexamples_OBJECTS) +imfexamples_LDADD = $(LDADD) +imfexamples_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(imfexamples_SOURCES) +DIST_SOURCES = $(imfexamples_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(examplesdir)" +DATA = $(examples_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +imfexamples_SOURCES = main.cpp drawImage.cpp rgbaInterfaceExamples.cpp \ + rgbaInterfaceTiledExamples.cpp \ + generalInterfaceExamples.cpp \ + lowLevelIoExamples.cpp previewImageExamples.cpp \ + generalInterfaceTiledExamples.cpp \ + generalInterfaceTiledExamples.h drawImage.h \ + rgbaInterfaceExamples.h generalInterfaceExamples.h \ + rgbaInterfaceTiledExamples.h \ + lowLevelIoExamples.h previewImageExamples.h \ + namespaceAlias.h + +examplesdir = $(datadir)/doc/OpenEXR-@OPENEXR_VERSION@/examples +examples_DATA = $(imfexamples_SOURCES) +imfexamplesdir = $(examplesdir) +EXTRA_DIST = CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImfExamples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImfExamples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +imfexamples$(EXEEXT): $(imfexamples_OBJECTS) $(imfexamples_DEPENDENCIES) + @rm -f imfexamples$(EXEEXT) + $(CXXLINK) $(imfexamples_OBJECTS) $(imfexamples_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalInterfaceExamples.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generalInterfaceTiledExamples.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lowLevelIoExamples.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/previewImageExamples.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgbaInterfaceExamples.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgbaInterfaceTiledExamples.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-examplesDATA: $(examples_DATA) + @$(NORMAL_INSTALL) + test -z "$(examplesdir)" || $(MKDIR_P) "$(DESTDIR)$(examplesdir)" + @list='$(examples_DATA)'; test -n "$(examplesdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(examplesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(examplesdir)" || exit $$?; \ + done + +uninstall-examplesDATA: + @$(NORMAL_UNINSTALL) + @list='$(examples_DATA)'; test -n "$(examplesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(examplesdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(examplesdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(examplesdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-examplesDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-examplesDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-examplesDATA install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-examplesDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImfExamples/drawImage.cpp b/IlmImfExamples/drawImage.cpp new file mode 100644 index 0000000..a27062f --- /dev/null +++ b/IlmImfExamples/drawImage.cpp @@ -0,0 +1,475 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Functions that algorithmically generate images, so that +// the code examples for image file reading and writing have +// data they can work with. +// Note that it is not necessary to study the code below in +// order to understand how the file I/O code examples work. +// +//----------------------------------------------------------------------------- + + +#include "drawImage.h" + +#include +#include +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; + +namespace +{ + +float +pw (float x, int y) +{ + float p = 1; + + while (y) + { + if (y & 1) + p *= x; + + x *= x; + y >>= 1; + } + + return p; +} + + +void +sp (Array2D &px, int w, int h, + float xc, float yc, float rc, + float rd, float gn, float bl, float lm) +{ + int x1 = int (max ((float) floor (xc - rc), 0.0f)); + int x2 = int (min ((float) ceil (xc + rc), w - 1.0f)); + int y1 = int (max ((float) floor (yc - rc), 0.0f)); + int y2 = int (min ((float) ceil (yc + rc), h - 1.0f)); + + for (int y = y1; y <= y2; ++y) + { + for (int x = x1; x <= x2; ++x) + { + float xl = (x - xc) / rc; + float yl = (y - yc) / rc; + float r = sqrt (xl * xl + yl * yl); + + if (r >= 1) + continue; + + float a = 1; + + if (r * rc > rc - 1) + a = rc - r * rc; + + float zl = sqrt (1 - r * r); + float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710; + + if (dl < 0) + dl *= -0.1; + + float hl = pw (dl, 50) * 4; + float dr = (dl + hl) * rd; + float dg = (dl + hl) * gn; + float db = (dl + hl) * bl; + + Rgba &p = px[y][x]; + p.r = p.r * (1 - a) + dr * lm * a; + p.g = p.g * (1 - a) + dg * lm * a; + p.b = p.b * (1 - a) + db * lm * a; + p.a = 1 - (1 - p.a) * (1 - a); + } + } +} + + +void +zsp (Array2D &gpx, Array2D &zpx, int w, int h, + float xc, float yc, float zc, float rc, float gn) +{ + int x1 = int (max ((float) floor (xc - rc), 0.0f)); + int x2 = int (min ((float) ceil (xc + rc), w - 1.0f)); + int y1 = int (max ((float) floor (yc - rc), 0.0f)); + int y2 = int (min ((float) ceil (yc + rc), h - 1.0f)); + + for (int x = x1; x <= x2; ++x) + { + for (int y = y1; y <= y2; ++y) + { + float xl = (x - xc) / rc; + float yl = (y - yc) / rc; + float r = sqrt (xl * xl + yl * yl); + + if (r >= 1) + continue; + + float a = 1; + + if (r * rc > rc - 1) + a = rc - r * rc; + + float zl = sqrt (1 - r * r); + float zp = zc - rc * zl; + + if (zp >= zpx[y][x]) + continue; + + float dl = xl * 0.42426 - yl * 0.56568 + zl * 0.70710; + + if (dl < 0) + dl *= -0.1; + + float hl = pw (dl, 50) * 4; + float dg = (dl + hl) * gn; + + gpx[y][x] = dg; + zpx[y][x] = zp; + } + } +} + + +inline float +z (float k) +{ + k = 2 * (k - int (k)); + return (k < 1)? k: 2 - k; +} + + +inline void +clear (Rgba &color) +{ + color.r = 0; + color.g = 0; + color.b = 0; +} + + +inline void +clear (GZ &gz) +{ + gz.g = 0; + gz.z = 0; +} + + +void +add (float k, Rgba &color) +{ + color.a = k; + k *= 4; + color.r += 0.1f + 4 * z (k); + color.g += 0.1f + 4 * z (k + .33333f); + color.b += 0.1f + 4 * z (k + .66667f); +} + + +void +add (float k, GZ &gz) +{ + k *= 5; + gz.g += 4 * z (k); + gz.z = k; +} + + +inline void +scale (float f, Rgba &color) +{ + color.r *= f; + color.g *= f; + color.b *= f; + color.a *= f; +} + + +inline void +scale (float f, GZ &gz) +{ + gz.g *= f; + gz.z *= f; +} + + +template +void +mndl (Array2D

&px, + int w, int h, + int xMin, int xMax, + int yMin, int yMax, + int xSamples, int ySamples, + double rMin, + double rMax, + double iMin, + double aspect, + double rSeed, + double iSeed) +{ + if (xSamples > 6) + xSamples = 6; + + if (ySamples > 6) + ySamples = 6; + + double iMax = iMin + aspect * (rMax - rMin) * h / w; + double sx = double (rMax - rMin) / w; + double sy = double (iMax - iMin) / h; + double tx = 1.f / xSamples; + double ty = 1.f / ySamples; + float t = tx * ty; + + for (int y = yMin; y < yMax; ++y) + { + for (int x = xMin; x < xMax; ++x) + { + P &p = px[y - yMin][x - xMin]; + + clear (p); + + for (int i = 0; i < xSamples; ++i) + { + for (int j = 0; j < ySamples; ++j) + { + const double a = rMin + sx * (x + i * tx); + const double b = iMin + sy * (y + j * ty); + const double sMax = 100; + const int kMax = 256; + double r = rSeed; + double i = iSeed; + double s = 0; + int k = 0; + + while (k < kMax && s < sMax) + { + s = r * r - i * i; + i = 2 * r * i + b; + r = s + a; + k++; + } + + add (k / float (kMax), p); + } + } + + scale (t, p); + } + } +} + +} // namespace + + +void +drawImage1 (Array2D &px, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = px[y][x]; + p.r = 0; + p.g = 0; + p.b = 0; + p.a = 0; + } + } + + int n = 5600; + + for (int i = 0; i < n; ++i) + { + float t = (i * 2.0 * M_PI) / n; + float xp = sin (t * 2.0) + 0.2 * sin (t * 15.0); + float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0); + float r = float (i + 1) / float (n); + float xq = xp + 0.3 * r * sin (t * 80.0); + float yq = yp + 0.3 * r * cos (t * 80.0); + float xr = xp + 0.3 * r * sin (t * 80.0 + M_PI / 2); + float yr = yp + 0.3 * r * cos (t * 80.0 + M_PI / 2); + + if (i % 10 == 0) + sp (px, w, h, + xp * w / 3 + w / 2, yp * h / 3 + h / 2, + w * 0.05 * r, + 2.0, 0.8, 0.1, + 0.5 * r * r); + + sp (px, w, h, + xq * w / 3 + w / 2, yq * h / 3 + h / 2, + w * 0.01 * r, + 0.7, 0.2, 2.0, + 0.5 * r * r); + + sp (px, w, h, + xr * w / 3 + w / 2, yr * h / 3 + h / 2, + w * 0.01 * r, + 0.2, 1.5, 0.1, + 0.5 * r * r); + } +} + + +void +drawImage2 (Array2D &gpx, Array2D &zpx, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + gpx[y][x] = 0; + zpx[y][x] = FLT_MAX; + } + } + + int n = 2000; + + for (int i = 0; i < n; ++i) + { + float t = (i * 2.0 * M_PI) / n; + float xp = sin (t * 4.0) + 0.2 * sin (t * 15.0); + float yp = cos (t * 3.0) + 0.2 * cos (t * 15.0); + float zp = sin (t * 5.0); + float rd = 0.7 + 0.3 * sin (t * 15.0); + float gn = 0.5 - 0.5 * zp + 0.2; + + zsp (gpx, zpx, w, h, + xp * w / 3 + w / 2, + yp * h / 3 + h / 2, + zp * w + 3 * w, + w * rd * 0.05, + 2.5 * gn * gn); + } +} + + +void +drawImage3 (Array2D &px, + int w, int h, + int xMin, int xMax, + int yMin, int yMax, + int xLevel, int yLevel) +{ + mndl (px, + w, h, + xMin, xMax, + yMin, yMax, + (1 << xLevel), (1 << yLevel), + 0.328, 0.369, + 0.5, + double (1 << yLevel) / double (1 << xLevel), + -0.713, 0.9738); +} + + +void +drawImage4 (Array2D &px, + int w, int h, + int xMin, int xMax, + int yMin, int yMax, + int xLevel, int yLevel) +{ + mndl (px, + w, h, + xMin, xMax, + yMin, yMax, + (1 << xLevel), (1 << yLevel), + 0.3247, 0.33348, + 0.4346, + double (1 << yLevel) / double (1 << xLevel), + 0.4, -0.765); +} + + +void +drawImage5 (Array2D &px, + int w, int h, + int xMin, int xMax, + int yMin, int yMax, + int xLevel, int yLevel) +{ + mndl (px, + w, h, + xMin, xMax, + yMin, yMax, + (1 << xLevel), (1 << yLevel), + 0.2839, 0.2852, + 0.00961, + double (1 << yLevel) / double (1 << xLevel), + 0.25, 0.31); +} + + +void +drawImage6 (Array2D &px, int w, int h) +{ + mndl (px, + w, h, + 0, w, + 0, h, + 3, 3, + -2.5, 1.0, + -1.3333, + 1, + 0, 0); +} + + +void +drawImage7 (Array &px, int w, int h, int y) +{ + for (int x = 0; x < w; ++x) + { + float xc = x - w / 2; + float yc = y - h / 2; + float a = atan2 (xc, yc); + float r = sqrt (xc * xc + yc * yc); + + Rgba &p = px[x]; + p.r = sin (3.0f * a + 0.3f * sin (0.10f * r)) * 0.5f + 0.5f; + p.g = sin (3.0f * a + 0.3f * sin (0.11f * r)) * 0.5f + 0.5f; + p.b = sin (3.0f * a + 0.3f * sin (0.12f * r)) * 0.5f + 0.5f; + p.a = 1; + } +} diff --git a/IlmImfExamples/drawImage.h b/IlmImfExamples/drawImage.h new file mode 100644 index 0000000..9a52ab0 --- /dev/null +++ b/IlmImfExamples/drawImage.h @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include + +#include "namespaceAlias.h" + + +struct GZ +{ + half g; + float z; +}; + + +void drawImage1 (IMF::Array2D &pixels, + int width, + int height); + +void drawImage2 (IMF::Array2D &gPixels, + IMF::Array2D &zPixels, + int width, + int height); + +void drawImage3 (IMF::Array2D &pixels, + int width, + int height, + int xMin, int xMax, + int yMin, int yMax, + int xLevel = 0, int yLevel = 0); + +void drawImage4 (IMF::Array2D &pixels, + int width, + int height, + int xMin, int xMax, + int yMin, int yMax, + int xLevel = 0, int yLevel = 0); + +void drawImage5 (IMF::Array2D &pixels, + int width, + int height, + int xMin, int xMax, + int yMin, int yMax, + int xLevel = 0, int yLevel = 0); + +void drawImage6 (IMF::Array2D &pixels, + int width, + int height); + +void drawImage7 (IMF::Array &pixels, + int width, + int height, + int y); diff --git a/IlmImfExamples/generalInterfaceExamples.cpp b/IlmImfExamples/generalInterfaceExamples.cpp new file mode 100644 index 0000000..f0dad47 --- /dev/null +++ b/IlmImfExamples/generalInterfaceExamples.cpp @@ -0,0 +1,296 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how class InputFile and class OutputFile +// can be used to read and write OpenEXR image files with an arbitrary +// set of channels. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include + +#include "drawImage.h" + +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +void +writeGZ1 (const char fileName[], + const half *gPixels, + const float *zPixels, + int width, + int height) +{ + // + // Write an image with only a G (green) and a Z (depth) channel, + // using class OutputFile. + // + // - create a file header + // - add G and Z channels to the header + // - open the file, and store the header in the file + // - describe the memory layout of the G anx Z pixels + // - store the pixels in the file + // + + Header header (width, height); + header.channels().insert ("G", Channel (IMF::HALF)); + header.channels().insert ("Z", Channel (IMF::FLOAT)); + + OutputFile file (fileName, header); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) gPixels, // base + sizeof (*gPixels) * 1, // xStride + sizeof (*gPixels) * width)); // yStride + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) zPixels, // base + sizeof (*zPixels) * 1, // xStride + sizeof (*zPixels) * width)); // yStride + + file.setFrameBuffer (frameBuffer); + file.writePixels (height); +} + + +void +writeGZ2 (const char fileName[], + const half *gPixels, + const float *zPixels, + int width, + int height, + const Box2i &dataWindow) +{ + // + // Write an image with only a G (green) and a Z (depth) channel, + // using class OutputFile. Don't store the whole image in the + // file, but crop it according to the given data window. + // + // - create a file header + // - set the header's data window + // - add G and Z channels to the header + // - open the file, and store the header in the file + // - describe the memory layout of the G anx Z pixels + // - store the pixels in the file + // + + Header header (width, height); + header.dataWindow() = dataWindow; + header.channels().insert ("G", Channel (IMF::HALF)); + header.channels().insert ("Z", Channel (IMF::FLOAT)); + + OutputFile file (fileName, header); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) gPixels, // base + sizeof (*gPixels) * 1, // xStride + sizeof (*gPixels) * width)); // yStride + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) zPixels, // base + sizeof (*zPixels) * 1, // xStride + sizeof (*zPixels) * width)); // yStride + + file.setFrameBuffer (frameBuffer); + file.writePixels (dataWindow.max.y - dataWindow.min.y + 1); +} + + +void +readGZ1 (const char fileName[], + Array2D &rPixels, + Array2D &gPixels, + Array2D &zPixels, + int &width, int &height) +{ + // + // Read an image using class InputFile. Try to read two + // channels, R and G, of type HALF, and one channel, Z, + // of type FLOAT. Store the R, G, and Z pixels in three + // separate memory buffers. + // If a channel is missing in the file, the buffer for that + // channel will be filled with an appropriate default value. + // + // - open the file + // - allocate memory for the pixels + // - describe the layout of the R, G, and Z pixel buffers + // - read the pixels from the file + // + + InputFile file (fileName); + + Box2i dw = file.header().dataWindow(); + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + + rPixels.resizeErase (height, width); + gPixels.resizeErase (height, width); + zPixels.resizeErase (height, width); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("R", // name + Slice (IMF::HALF, // type + (char *) (&rPixels[0][0] - // base + dw.min.x - + dw.min.y * width), + sizeof (rPixels[0][0]) * 1, // xStride + sizeof (rPixels[0][0]) * width, // yStride + 1, 1, // x/y sampling + 0.0)); // fillValue + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) (&gPixels[0][0] - // base + dw.min.x - + dw.min.y * width), + sizeof (gPixels[0][0]) * 1, // xStride + sizeof (gPixels[0][0]) * width, // yStride + 1, 1, // x/y sampling + 0.0)); // fillValue + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) (&zPixels[0][0] - // base + dw.min.x - + dw.min.y * width), + sizeof (zPixels[0][0]) * 1, // xStride + sizeof (zPixels[0][0]) * width, // yStride + 1, 1, // x/y sampling + FLT_MAX)); // fillValue + + file.setFrameBuffer (frameBuffer); + file.readPixels (dw.min.y, dw.max.y); +} + + +void +readGZ2 (const char fileName[], + Array2D &pixels, + int &width, int &height) +{ + // + // Read an image using class InputFile. Try to read one channel, + // G, of type HALF, and one channel, Z, of type FLOAT. In memory, + // the G and Z channels will be interleaved in a single buffer. + // + // - open the file + // - allocate memory for the pixels + // - describe the layout of the GZ pixel buffer + // - read the pixels from the file + // + + InputFile file (fileName); + + Box2i dw = file.header().dataWindow(); + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + pixels.resizeErase (height, width); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) &pixels[-dy][-dx].g, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) &pixels[-dy][-dx].z, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + file.setFrameBuffer (frameBuffer); + file.readPixels (dw.min.y, dw.max.y); +} + + +void +generalInterfaceExamples () +{ + cout << "\nGZ (green, depth) images\n" << endl; + cout << "drawing image" << endl; + + int w = 800; + int h = 600; + + Array2D gp (h, w); + Array2D zp (h, w); + drawImage2 (gp, zp, w, h); + + cout << "writing entire image" << endl; + + writeGZ1 ("gz1.exr", &gp[0][0], &zp[0][0], w, h); + + cout << "writing cropped image" << endl; + + writeGZ2 ("gz2.exr", &gp[0][0], &zp[0][0], w, h, + Box2i (V2i (w/6, h/6), V2i (w/2, h/2))); + + cout << "reading file into separate per-channel buffers" << endl; + + Array2D rp (1, 1); + readGZ1 ("gz2.exr", rp, gp, zp, w, h); + + cout << "reading file into interleaved multi-channel buffer" << endl; + + Array2D gzp (1, 1); + readGZ2 ("gz2.exr", gzp, w, h); +} diff --git a/IlmImfExamples/generalInterfaceExamples.h b/IlmImfExamples/generalInterfaceExamples.h new file mode 100644 index 0000000..8342e59 --- /dev/null +++ b/IlmImfExamples/generalInterfaceExamples.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +void generalInterfaceExamples (); + diff --git a/IlmImfExamples/generalInterfaceTiledExamples.cpp b/IlmImfExamples/generalInterfaceTiledExamples.cpp new file mode 100644 index 0000000..672dc8d --- /dev/null +++ b/IlmImfExamples/generalInterfaceTiledExamples.cpp @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how class TiledInputFile and +// class TiledOutputFile can be used to read and write +// OpenEXR image files with an arbitrary set of channels. +// +//----------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include + +#include "drawImage.h" + +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +void +writeTiled1 (const char fileName[], + Array2D &pixels, + int width, int height, + int tileWidth, int tileHeight) +{ + Header header (width, height); + header.channels().insert ("G", Channel (IMF::HALF)); + header.channels().insert ("Z", Channel (IMF::FLOAT)); + + header.setTileDescription + (TileDescription (tileWidth, tileHeight, ONE_LEVEL)); + + TiledOutputFile out (fileName, header); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) &pixels[0][0].g, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) &pixels[0][0].z, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + out.setFrameBuffer (frameBuffer); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); +} + + +void +readTiled1 (const char fileName[], + Array2D &pixels, + int &width, int &height) +{ + TiledInputFile in (fileName); + + Box2i dw = in.header().dataWindow(); + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + pixels.resizeErase (height, width); + + FrameBuffer frameBuffer; + + frameBuffer.insert ("G", // name + Slice (IMF::HALF, // type + (char *) &pixels[-dy][-dx].g, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + frameBuffer.insert ("Z", // name + Slice (IMF::FLOAT, // type + (char *) &pixels[-dy][-dx].z, // base + sizeof (pixels[0][0]) * 1, // xStride + sizeof (pixels[0][0]) * width)); // yStride + + in.setFrameBuffer (frameBuffer); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); +} + + +void +generalInterfaceTiledExamples () +{ + cout << "\nGZ (green, depth) tiled files\n" << endl; + cout << "drawing image" << endl; + + int w = 800; + int h = 600; + + Array2D pixels (h, w); + drawImage6 (pixels, w, h); + + cout << "writing file" << endl; + + writeTiled1 ("tiledgz1.exr", pixels, w, h, 64, 64); + + cout << "reading file" << endl; + + readTiled1 ("tiledgz1.exr", pixels, w, h); +} diff --git a/IlmImfExamples/generalInterfaceTiledExamples.h b/IlmImfExamples/generalInterfaceTiledExamples.h new file mode 100644 index 0000000..ee36c05 --- /dev/null +++ b/IlmImfExamples/generalInterfaceTiledExamples.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +void generalInterfaceTiledExamples (); + diff --git a/IlmImfExamples/lowLevelIoExamples.cpp b/IlmImfExamples/lowLevelIoExamples.cpp new file mode 100644 index 0000000..8e52e96 --- /dev/null +++ b/IlmImfExamples/lowLevelIoExamples.cpp @@ -0,0 +1,292 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how implement custom low-level +// file input and output for OpenEXR files: +// +// Classes C_IStream and C_OStream are derived from IlmImf's +// abstract IStream and OStreamd classes. They allow OpenEXR +// file input and output via C stdio files (FILE *). +// +//----------------------------------------------------------------------------- + +#include +#include +#include "Iex.h" + +#include "drawImage.h" + +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +class C_IStream: public IStream +{ + public: + + C_IStream (FILE *file, const char fileName[]): + IStream (fileName), _file (file) {} + + virtual bool read (char c[/*n*/], int n); + virtual Int64 tellg (); + virtual void seekg (Int64 pos); + virtual void clear (); + + private: + + FILE * _file; +}; + + +class C_OStream: public OStream +{ + public: + + C_OStream (FILE *file, const char fileName[]): + OStream (fileName), _file (file) {} + + virtual void write (const char c[/*n*/], int n); + virtual Int64 tellp (); + virtual void seekp (Int64 pos); + + private: + + FILE * _file; +}; + + +bool +C_IStream::read (char c[/*n*/], int n) +{ + if (n != fread (c, 1, n, _file)) + { + // + // fread() failed, but the return value does not distinguish + // between I/O errors and end of file, so we call ferror() to + // determine what happened. + // + + if (ferror (_file)) + IEX_NAMESPACE::throwErrnoExc(); + else + throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); + } + + return feof (_file); +} + + +Int64 +C_IStream::tellg () +{ + return ftell (_file); +} + + +void +C_IStream::seekg (Int64 pos) +{ + clearerr (_file); + fseek (_file, pos, SEEK_SET); +} + + +void +C_IStream::clear () +{ + clearerr (_file); +} + + +void +C_OStream::write (const char c[/*n*/], int n) +{ + clearerr (_file); + + if (n != fwrite (c, 1, n, _file)) + IEX_NAMESPACE::throwErrnoExc(); +} + + +Int64 +C_OStream::tellp () +{ + return ftell (_file); +} + + +void +C_OStream::seekp (Int64 pos) +{ + clearerr (_file); + fseek (_file, pos, SEEK_SET); +} + + +void +writeRgbaFILE (FILE *cfile, + const char fileName[], + const Rgba *pixels, + int width, + int height) +{ + // + // Store an RGBA image in a C stdio file that has already been opened: + // + // - create a C_OStream object for writing to the file + // - create an RgbaOutputFile object, and attach it to the C_OStream + // - describe the memory layout of the pixels + // - store the pixels in the file + // + + + C_OStream ostr (cfile, fileName); + RgbaOutputFile file (ostr, Header (width, height), WRITE_RGBA); + file.setFrameBuffer (pixels, 1, width); + file.writePixels (height); +} + + +void +readRgbaFILE (FILE *cfile, + const char fileName[], + Array2D &pixels, + int &width, + int &height) +{ + // + // Read an RGBA image from a C stdio file that has already been opened: + // + // - create a C_IStream object for reading from the file + // - create an RgbaInputFile object, and attach it to the C_IStream + // - allocate memory for the pixels + // - describe the memory layout of the pixels + // - read the pixels from the file + // + + C_IStream istr (cfile, fileName); + RgbaInputFile file (istr); + Box2i dw = file.dataWindow(); + + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + pixels.resizeErase (height, width); + + file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); + file.readPixels (dw.min.y, dw.max.y); +} + + +void +lowLevelIoExamples () +{ + cout << "\nCustom low-level file I/O\n" << endl; + cout << "drawing image" << endl; + + int w = 800; + int h = 600; + const char *fileName = "rgba4.exr"; + + Array2D p (h, w); + drawImage1 (p, w, h); + + // + // The following code is somewhat complicated because + // fopen() returns 0 on error, but writeRgbaFILE() and + // readRgbaFILE() throw exceptions. Also, if a FILE * + // goes out of scope, the corresponding file is not + // automatically closed. In order to avoid leaking + // file descriptors, we have to make sure fclose() is + // called in all cases. + // + + cout << "writing image" << endl; + + { + FILE *file = fopen (fileName, "wb"); + + if (file == 0) + { + THROW_ERRNO ("Cannot open file " << fileName << " (%T)."); + } + else + { + try + { + writeRgbaFILE (file, fileName, &p[0][0], w, h); + } + catch (...) + { + fclose (file); + throw; + } + + fclose (file); + } + } + + cout << "reading image" << endl; + + { + FILE *file = fopen (fileName, "rb"); + + if (file == 0) + { + THROW_ERRNO ("Cannot open file " << fileName << " (%T)."); + } + else + { + try + { + readRgbaFILE (file, fileName, p, w, h); + } + catch (...) + { + fclose (file); + throw; + } + + fclose (file); + } + } +} diff --git a/IlmImfExamples/lowLevelIoExamples.h b/IlmImfExamples/lowLevelIoExamples.h new file mode 100644 index 0000000..0b2b86e --- /dev/null +++ b/IlmImfExamples/lowLevelIoExamples.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +void lowLevelIoExamples (); + diff --git a/IlmImfExamples/main.cpp b/IlmImfExamples/main.cpp new file mode 100644 index 0000000..e911336 --- /dev/null +++ b/IlmImfExamples/main.cpp @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include "rgbaInterfaceExamples.h" +#include "rgbaInterfaceTiledExamples.h" +#include "generalInterfaceExamples.h" +#include "generalInterfaceTiledExamples.h" +#include "lowLevelIoExamples.h" +#include "previewImageExamples.h" + +#include +#include + + +int +main (int argc, char *argv[]) +{ + try + { + rgbaInterfaceExamples(); + generalInterfaceExamples(); + + rgbaInterfaceTiledExamples(); + generalInterfaceTiledExamples(); + + lowLevelIoExamples(); + + previewImageExamples(); + } + catch (const std::exception &exc) + { + std::cerr << exc.what() << std::endl; + return 1; + } + + return 0; +} diff --git a/IlmImfExamples/namespaceAlias.h b/IlmImfExamples/namespaceAlias.h new file mode 100644 index 0000000..5e763d1 --- /dev/null +++ b/IlmImfExamples/namespaceAlias.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +#ifndef NAMESPACEALIAS_H_ +#define NAMESPACEALIAS_H_ + +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; + +#endif /* NAMESPACEALIAS_H_ */ diff --git a/IlmImfExamples/previewImageExamples.cpp b/IlmImfExamples/previewImageExamples.cpp new file mode 100644 index 0000000..fb426a3 --- /dev/null +++ b/IlmImfExamples/previewImageExamples.cpp @@ -0,0 +1,219 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how to add preview images +// (also known as thumbnais) to OpenEXR image files. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "ImathFun.h" + +#include "drawImage.h" + +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +unsigned char +gamma (float x) +{ + // + // Convert a floating-point pixel value to an 8-bit gamma-2.2 + // preview pixel. (This routine is a simplified version of + // how the exrdisplay program transforms floating-point pixel + // values in order to display them on the screen.) + // + + x = pow (5.5555f * max (0.f, x), 0.4545f) * 84.66f; + return (unsigned char) clamp (x, 0.f, 255.f); +} + + +void +makePreviewImage (const Array2D &pixels, + int width, + int height, + Array2D &previewPixels, + int &previewWidth, + int &previewHeight) +{ + const int N = 8; + + previewWidth = width / N; + previewHeight = height / N; + previewPixels.resizeErase (previewHeight, previewWidth); + + for (int y = 0; y < previewHeight; ++y) + { + for (int x = 0; x < previewWidth; ++x) + { + const Rgba &inPixel = pixels[y * N][x * N]; + PreviewRgba &outPixel = previewPixels[y][x]; + + outPixel.r = gamma (inPixel.r); + outPixel.g = gamma (inPixel.g); + outPixel.b = gamma (inPixel.b); + outPixel.a = int (clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f); + } + } +} + + +void +writeRgbaWithPreview1 (const char fileName[], + const Array2D &pixels, + int width, + int height) +{ + // + // Write an image file with a preview image, version 1: + // + // - generate the preview image by subsampling the main image + // - generate a file header + // - add the preview image to the file header + // - open the file (this stores the header with the + // preview image in the file) + // - describe the memory layout of the main image's pixels + // - store the main image's pixels in the file + // + + Array2D previewPixels; + int previewWidth; + int previewHeight; + + makePreviewImage (pixels, width, height, + previewPixels, previewWidth, previewHeight); + + Header header (width, height); + + header.setPreviewImage + (PreviewImage (previewWidth, previewHeight, &previewPixels[0][0])); + + RgbaOutputFile file (fileName, header, WRITE_RGBA); + file.setFrameBuffer (&pixels[0][0], 1, width); + file.writePixels (height); +} + + +void +writeRgbaWithPreview2 (const char fileName[], + int width, + int height) +{ + // + // Write an image file with a preview image, version 2: + // + // - generate a file header + // - add a dummy preview image to the file header + // - open the file (this stores the header with the dummy + // preview image in the file) + // - render the main image's pixels one scan line at a time, + // and store each scan line in the file before rendering + // the next scan line + // - generate the preview image on the fly, while the main + // image is being rendered + // - once the main image has been rendered, store the preview + // image in the file, overwriting the dummy preview + // + + Array pixels (width); + + const int N = 8; + + int previewWidth = width / N; + int previewHeight = height / N; + Array2D previewPixels (previewHeight, previewWidth); + + Header header (width, height); + header.setPreviewImage (PreviewImage (previewWidth, previewHeight)); + + RgbaOutputFile file (fileName, header, WRITE_RGBA); + file.setFrameBuffer (pixels, 1, 0); + + for (int y = 0; y < height; ++y) + { + drawImage7 (pixels, width, height, y); + file.writePixels (1); + + if (y % N == 0) + { + for (int x = 0; x < width; x += N) + { + const Rgba &inPixel = pixels[x]; + PreviewRgba &outPixel = previewPixels[y / N][x / N]; + + outPixel.r = gamma (inPixel.r); + outPixel.g = gamma (inPixel.g); + outPixel.b = gamma (inPixel.b); + outPixel.a = int (clamp (inPixel.a * 255.f, 0.f, 255.f) + 0.5f); + } + } + } + + file.updatePreviewImage (&previewPixels[0][0]); +} + + +void +previewImageExamples () +{ + cout << "\nfiles with preview images\n" << endl; + + cout << "drawing image then writing file" << endl; + + int w = 800; + int h = 600; + + Array2D p (h, w); + drawImage1 (p, w, h); + writeRgbaWithPreview1 ("rgbaWithPreview1.exr", p, w, h); + + cout << "drawing image while writing file" << endl; + + writeRgbaWithPreview2 ("rgbaWithPreview2.exr", w, h); + + cout << endl; +} diff --git a/IlmImfExamples/previewImageExamples.h b/IlmImfExamples/previewImageExamples.h new file mode 100644 index 0000000..63a435b --- /dev/null +++ b/IlmImfExamples/previewImageExamples.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +void previewImageExamples (); + diff --git a/IlmImfExamples/rgbaInterfaceExamples.cpp b/IlmImfExamples/rgbaInterfaceExamples.cpp new file mode 100644 index 0000000..4c0ce2f --- /dev/null +++ b/IlmImfExamples/rgbaInterfaceExamples.cpp @@ -0,0 +1,265 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how class RgbaInputFile and +// class RgbaOutputFile can be used to read and write +// OpenEXR image files with 16-bit floating-point red, +// green, blue and alpha channels. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include + +#include "drawImage.h" + +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +void +writeRgba1 (const char fileName[], + const Rgba *pixels, + int width, + int height) +{ + // + // Write an RGBA image using class RgbaOutputFile. + // + // - open the file + // - describe the memory layout of the pixels + // - store the pixels in the file + // + + + RgbaOutputFile file (fileName, width, height, WRITE_RGBA); + file.setFrameBuffer (pixels, 1, width); + file.writePixels (height); +} + + +void +writeRgba2 (const char fileName[], + const Rgba *pixels, + int width, + int height, + const Box2i &dataWindow) +{ + // + // Write an RGBA image using class RgbaOutputFile. + // Don't store the whole image in the file, but + // crop it according to the given data window. + // + // - open the file + // - describe the memory layout of the pixels + // - store the pixels in the file + // + + Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); + RgbaOutputFile file (fileName, displayWindow, dataWindow, WRITE_RGBA); + file.setFrameBuffer (pixels, 1, width); + file.writePixels (dataWindow.max.y - dataWindow.min.y + 1); +} + + +void +writeRgba3 (const char fileName[], + const Rgba *pixels, + int width, + int height, + const char comments[], + const M44f &cameraTransform) +{ + // + // Write an RGBA image using class RgbaOutputFile. + // Store two extra attributes in the image header: + // a string and a 4x4 transformation matrix. + // + // - open the file + // - describe the memory layout of the pixels + // - store the pixels in the file + // + + Header header (width, height); + header.insert ("comments", StringAttribute (comments)); + header.insert ("cameraTransform", M44fAttribute (cameraTransform)); + + RgbaOutputFile file (fileName, header, WRITE_RGBA); + file.setFrameBuffer (pixels, 1, width); + file.writePixels (height); +} + + +void +readRgba1 (const char fileName[], + Array2D &pixels, + int &width, + int &height) +{ + // + // Read an RGBA image using class RgbaInputFile: + // + // - open the file + // - allocate memory for the pixels + // - describe the memory layout of the pixels + // - read the pixels from the file + // + + RgbaInputFile file (fileName); + Box2i dw = file.dataWindow(); + + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + pixels.resizeErase (height, width); + + file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); + file.readPixels (dw.min.y, dw.max.y); +} + + +void +readRgba2 (const char fileName[]) +{ + // + // Read an RGBA image using class RgbaInputFile. + // Read the pixels, 10 scan lines at a time, and + // store the pixel data in a buffer that is just + // large enough to hold 10 scan lines worth of data. + // + // - open the file + // - allocate memory for the pixels + // - for each block of 10 scan lines, + // describe the memory layout of the pixels, + // read the pixels from the file, + // process the pixels and discard them + // + + RgbaInputFile file (fileName); + Box2i dw = file.dataWindow(); + + int width = dw.max.x - dw.min.x + 1; + int height = dw.max.y - dw.min.y + 1; + Array2D pixels (10, width); + + while (dw.min.y <= dw.max.y) + { + file.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, + 1, width); + + file.readPixels (dw.min.y, min (dw.min.y + 9, dw.max.y)); + // processPixels (pixels) + + dw.min.y += 10; + } +} + + +void +readHeader (const char fileName[]) +{ + // + // Read an image's header from a file, and if the header + // contains comments and camera transformation attributes, + // print the values of those attributes. + // + // - open the file + // - get the file header + // - look for the attributes + // + + RgbaInputFile file (fileName); + + const StringAttribute *comments = + file.header().findTypedAttribute ("comments"); + + const M44fAttribute *cameraTransform = + file.header().findTypedAttribute ("cameraTransform"); + + if (comments) + cout << "comments\n " << comments->value() << endl; + + if (cameraTransform) + cout << "cameraTransform\n" << cameraTransform->value() << flush; +} + + +void +rgbaInterfaceExamples () +{ + cout << "\nRGBA images\n" << endl; + cout << "drawing image" << endl; + + int w = 800; + int h = 600; + + Array2D p (h, w); + drawImage1 (p, w, h); + + cout << "writing entire image" << endl; + + writeRgba1 ("rgba1.exr", &p[0][0], w, h); + + cout << "writing cropped image" << endl; + + writeRgba2 ("rgba2.exr", &p[0][0], w, h, + Box2i (V2i (w/6, h/6), V2i (w/2, h/2))); + + cout << "writing image with extra header attributes" << endl; + + writeRgba3 ("rgba3.exr", &p[0][0], w, h, + "may contain peanuts", M44f()); + + cout << "reading rgba file" << endl; + + readRgba1 ("rgba2.exr", p, w, h); + + cout << "reading rgba file into 10-scanline buffer" << endl; + + readRgba2 ("rgba2.exr"); + + cout << "reading extra file header attributes" << endl; + + readHeader ("rgba3.exr"); +} diff --git a/IlmImfExamples/rgbaInterfaceExamples.h b/IlmImfExamples/rgbaInterfaceExamples.h new file mode 100644 index 0000000..d056d92 --- /dev/null +++ b/IlmImfExamples/rgbaInterfaceExamples.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +void rgbaInterfaceExamples (); + diff --git a/IlmImfExamples/rgbaInterfaceTiledExamples.cpp b/IlmImfExamples/rgbaInterfaceTiledExamples.cpp new file mode 100644 index 0000000..7d623eb --- /dev/null +++ b/IlmImfExamples/rgbaInterfaceTiledExamples.cpp @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Code examples that show how class TiledRgbaInputFile and +// class TiledRgbaOutputFile can be used to read and write +// OpenEXR image files with 16-bit floating-point red, +// green, blue and alpha channels. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include + +#include "drawImage.h" + +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +void +writeTiledRgbaONE1 (const char fileName[], + const Rgba *pixels, + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with one level using an image-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + ONE_LEVEL, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + out.setFrameBuffer (pixels, 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); +} + + +void +writeTiledRgbaONE2 (const char fileName[], + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with one level using a tile-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + ONE_LEVEL, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + Array2D pixels (tileHeight, tileWidth); + + for (int tileY = 0; tileY < out.numYTiles (); ++tileY) + { + for (int tileX = 0; tileX < out.numXTiles (); ++tileX) + { + Box2i range = out.dataWindowForTile (tileX, tileY); + + drawImage3 (pixels, + width, height, + range.min.x, range.max.x + 1, + range.min.y, range.max.y + 1, + 0, 0); + + out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], + 1, // xStride + tileWidth); // yStride + + out.writeTile (tileX, tileY); + } + } +} + + +void +writeTiledRgbaMIP1 (const char fileName[], + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with mipmap levels using an image-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + MIPMAP_LEVELS, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + Array2D pixels (height, width); + out.setFrameBuffer (&pixels[0][0], 1, width); + + for (int level = 0; level < out.numLevels (); ++level) + { + drawImage4 (pixels, + out.levelWidth (level), out.levelHeight (level), + 0, out.levelWidth (level), + 0, out.levelHeight (level), + level, level); + + out.writeTiles (0, out.numXTiles (level) - 1, + 0, out.numYTiles (level) - 1, + level); + } +} + + +void +writeTiledRgbaMIP2 (const char fileName[], + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with mipmap levels using a tile-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + MIPMAP_LEVELS, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + Array2D pixels (tileHeight, tileWidth); + + for (int level = 0; level < out.numLevels (); ++level) + { + for (int tileY = 0; tileY < out.numYTiles (level); ++tileY) + { + for (int tileX = 0; tileX < out.numXTiles (level); ++tileX) + { + Box2i range = out.dataWindowForTile (tileX, tileY, level); + + drawImage4 (pixels, + out.levelWidth (level), out.levelHeight (level), + range.min.x, range.max.x + 1, + range.min.y, range.max.y + 1, + level, level); + + out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], + 1, // xStride + tileWidth); // yStride + + out.writeTile (tileX, tileY, level); + } + } + } +} + + + +void +writeTiledRgbaRIP1 (const char fileName[], + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with ripmap levels using an image-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + RIPMAP_LEVELS, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + Array2D pixels (height, width); + out.setFrameBuffer (&pixels[0][0], 1, width); + + for (int yLevel = 0; yLevel < out.numYLevels (); ++yLevel) + { + for (int xLevel = 0; xLevel < out.numXLevels (); ++xLevel) + { + drawImage5 (pixels, + out.levelWidth (xLevel), out.levelHeight (yLevel), + 0, out.levelWidth (xLevel), + 0, out.levelHeight (yLevel), + xLevel, yLevel); + + out.writeTiles (0, out.numXTiles (xLevel) - 1, + 0, out.numYTiles (yLevel) - 1, + xLevel, + yLevel); + } + } +} + + +void +writeTiledRgbaRIP2 (const char fileName[], + int width, int height, + int tileWidth, int tileHeight) +{ + // + // Write a tiled image with ripmap levels using a tile-sized framebuffer. + // + + TiledRgbaOutputFile out (fileName, + width, height, // image size + tileWidth, tileHeight, // tile size + RIPMAP_LEVELS, // level mode + ROUND_DOWN, // rounding mode + WRITE_RGBA); // channels in file + + Array2D pixels (tileHeight, tileWidth); + + for (int yLevel = 0; yLevel < out.numYLevels(); ++yLevel) + { + for (int xLevel = 0; xLevel < out.numXLevels(); ++xLevel) + { + for (int tileY = 0; tileY < out.numYTiles (yLevel); ++tileY) + { + for (int tileX = 0; tileX < out.numXTiles (xLevel); ++tileX) + { + Box2i range = out.dataWindowForTile (tileX, tileY, + xLevel, yLevel); + + drawImage5 (pixels , + out.levelWidth(xLevel), out.levelHeight(yLevel), + range.min.x, range.max.x + 1, + range.min.y, range.max.y + 1, + xLevel, yLevel); + + out.setFrameBuffer (&pixels[-range.min.y][-range.min.x], + 1, // xStride + tileWidth); // yStride + + out.writeTile (tileX, tileY, xLevel, yLevel); + } + } + } + } +} + + +void +readTiledRgba1 (const char fileName[], + Array2D &pixels, + int &width, + int &height) +{ + TiledRgbaInputFile in (fileName); + Box2i dw = in.dataWindow(); + + width = dw.max.x - dw.min.x + 1; + height = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + pixels.resizeErase (height, width); + + in.setFrameBuffer (&pixels[-dy][-dx], 1, width); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); +} + + +void +rgbaInterfaceTiledExamples () +{ + cout << "\nRGBA tiled images\n" << endl; + + const int tw = 100; + const int th = 75; + int w = 600; + int h = 400; + + cout << "writing tiled image with image-size framebuffer" << endl; + + Array2D pixels (h, w); + drawImage3 (pixels, w, h, 0, w, 0, h, 0); + writeTiledRgbaONE1 ("tiledrgba1.exr", &pixels[0][0], w, h, tw, th); + + cout << "writing tiled image with tile-size framebuffer" << endl; + + writeTiledRgbaONE2 ("tiledrgba2.exr", w, h, tw, th); + + cout << "writing tiled mipmap image with image-size framebuffer" << endl; + + writeTiledRgbaMIP1 ("tiledrgba3.exr", 512, 512, tw, th); + + cout << "writing tiled mipmap image with tile-size framebuffer" << endl; + + writeTiledRgbaMIP2 ("tiledrgba4.exr", 512, 512, tw, th); + + cout << "writing tiled ripmap image with image-size framebuffer" << endl; + + writeTiledRgbaRIP1 ("tiledrgba5.exr", 256, 256, tw, th); + + cout << "writing tiled ripmap image with tile-size framebuffer" << endl; + + writeTiledRgbaRIP2 ("tiledrgba6.exr", 256, 256, tw, th); + + cout << "reading tiled rgba file" << endl; + + readTiledRgba1 ("tiledrgba1.exr", pixels, w, h); +} diff --git a/IlmImfExamples/rgbaInterfaceTiledExamples.h b/IlmImfExamples/rgbaInterfaceTiledExamples.h new file mode 100644 index 0000000..44126df --- /dev/null +++ b/IlmImfExamples/rgbaInterfaceTiledExamples.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +void rgbaInterfaceTiledExamples (); + diff --git a/IlmImfFuzzTest/CMakeLists.txt b/IlmImfFuzzTest/CMakeLists.txt new file mode 100644 index 0000000..12fe072 --- /dev/null +++ b/IlmImfFuzzTest/CMakeLists.txt @@ -0,0 +1,20 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( IlmImfFuzzTest + fuzzFile.cpp + main.cpp + testFuzzDeepTiles.cpp + testFuzzDeepScanLines.cpp + testFuzzScanLines.cpp + testFuzzTiles.cpp + ) + +TARGET_LINK_LIBRARIES ( IlmImfFuzzTest + IlmImf + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} ${ZLIB_LIBRARIES}) + +ADD_TEST ( TestIlmImfFuzz IlmImfFuzzTest ) diff --git a/IlmImfFuzzTest/Makefile.am b/IlmImfFuzzTest/Makefile.am new file mode 100644 index 0000000..56818b7 --- /dev/null +++ b/IlmImfFuzzTest/Makefile.am @@ -0,0 +1,27 @@ +## Process this file with automake to produce Makefile.in + +if BUILD_IMFFUZZTEST +check_PROGRAMS = IlmImfFuzzTest +endif + +IlmImfFuzzTest_SOURCES = fuzzFile.cpp fuzzFile.h main.cpp tmpDir.h \ + testFuzzScanLines.cpp testFuzzScanLines.h \ + testFuzzDeepScanLines.cpp testFuzzDeepScanLines.h \ + testFuzzDeepTiles.cpp testFuzzDeepTiles.h \ + testFuzzTiles.cpp testFuzzTiles.h + + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +if BUILD_IMFFUZZTEST +TESTS = IlmImfFuzzTest +endif + +EXTRA_DIST = CMakeLists.txt diff --git a/IlmImfFuzzTest/Makefile.in b/IlmImfFuzzTest/Makefile.in new file mode 100644 index 0000000..441a904 --- /dev/null +++ b/IlmImfFuzzTest/Makefile.in @@ -0,0 +1,617 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_IMFFUZZTEST_TRUE@check_PROGRAMS = IlmImfFuzzTest$(EXEEXT) +@BUILD_IMFFUZZTEST_TRUE@TESTS = IlmImfFuzzTest$(EXEEXT) +subdir = IlmImfFuzzTest +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_IlmImfFuzzTest_OBJECTS = fuzzFile.$(OBJEXT) main.$(OBJEXT) \ + testFuzzScanLines.$(OBJEXT) testFuzzDeepScanLines.$(OBJEXT) \ + testFuzzDeepTiles.$(OBJEXT) testFuzzTiles.$(OBJEXT) +IlmImfFuzzTest_OBJECTS = $(am_IlmImfFuzzTest_OBJECTS) +IlmImfFuzzTest_LDADD = $(LDADD) +IlmImfFuzzTest_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(IlmImfFuzzTest_SOURCES) +DIST_SOURCES = $(IlmImfFuzzTest_SOURCES) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +IlmImfFuzzTest_SOURCES = fuzzFile.cpp fuzzFile.h main.cpp tmpDir.h \ + testFuzzScanLines.cpp testFuzzScanLines.h \ + testFuzzDeepScanLines.cpp testFuzzDeepScanLines.h \ + testFuzzDeepTiles.cpp testFuzzDeepTiles.h \ + testFuzzTiles.cpp testFuzzTiles.h + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +EXTRA_DIST = CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImfFuzzTest/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImfFuzzTest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +IlmImfFuzzTest$(EXEEXT): $(IlmImfFuzzTest_OBJECTS) $(IlmImfFuzzTest_DEPENDENCIES) + @rm -f IlmImfFuzzTest$(EXEEXT) + $(CXXLINK) $(IlmImfFuzzTest_OBJECTS) $(IlmImfFuzzTest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzzFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzDeepScanLines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzDeepTiles.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzScanLines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzTiles.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImfFuzzTest/fuzzFile.cpp b/IlmImfFuzzTest/fuzzFile.cpp new file mode 100644 index 0000000..f7d3b33 --- /dev/null +++ b/IlmImfFuzzTest/fuzzFile.cpp @@ -0,0 +1,198 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +#include +#include +#include +#include + +#include +#include + +// Handle the case when the custom namespace is not exposed +#include +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +Int64 +lengthOfFile (const char fileName[]) +{ + ifstream ifs (fileName, ios_base::binary); + + if (!ifs) + return 0; + + ifs.seekg (0, ios_base::end); + return ifs.tellg(); +} + + +void +fuzzFile (const char goodFile[], + const char brokenFile[], + Int64 offset, + Int64 windowSize, + Rand48 &random, + double fuzzAmount) +{ + // + // Read the input file. + // + + ifstream ifs (goodFile, ios_base::binary); + + if (!ifs) + THROW_ERRNO ("Cannot open file " << goodFile << " (%T)."); + + ifs.seekg (0, ios_base::end); + Int64 fileLength = ifs.tellg(); + ifs.seekg (0, ios_base::beg); + + Array data (fileLength); + ifs.read (data, fileLength); + + if (!ifs) + THROW_ERRNO ("Cannot read file " << goodFile << " (%T)." << endl); + + // + // Damage the contents of the file by overwriting some of the bytes + // in a window of size windowSize, starting at the specified offset. + // + + for (Int64 i = offset; i < offset + windowSize; ++i) + { + if (random.nextf() < fuzzAmount) + data[i] = char (random.nexti()); + } + + // + // Save the damaged file contents in the output file. + // + + ofstream ofs (brokenFile, ios_base::binary); + + if (!ofs) + THROW_ERRNO ("Cannot open file " << brokenFile << " (%T)." << endl); + + ofs.write (data, fileLength); + + if (!ofs) + THROW_ERRNO ("Cannot write file " << brokenFile << " (%T)." << endl); +} + +} // namespace + + +void +fuzzFile (const char goodFile[], + const char brokenFile[], + void (*readFile) (const char[]), + int nSlidingWindow, + int nFixedWindow, + Rand48 &random) +{ + // + // We want to test how resilient the IlmImf library is with respect + // to malformed OpenEXR input files. In order to do this we damage + // a good input file by overwriting parts of it with random data. + // We then call function readFile() to try and read the damaged file. + // Provided the IlmImf library works as advertised, a try/catch(...) + // block in readFile() should be able to handle all errors that could + // possibly result from reading a broken OpenEXR file. We repeat + // this damage/read cycle many times, overwriting different parts + // of the file: + // + // First we slide a window along the file. The size of the window + // is fileSize*2/nSlidingWindow bytes. In each damage/read cycle + // we overwrite up to 10% of the bytes the window, try to read the + // file, and advance the window by fileSize/nSlidingWindow bytes. + // + // Next we overwrite up to 10% of the file's first 2048 bytes and + // try to read the file. We repeat this nFixedWindow times. + // + + { + Int64 fileSize = lengthOfFile (goodFile); + Int64 windowSize = fileSize * 2 / nSlidingWindow; + Int64 lastWindowOffset = fileSize - windowSize; + + cout << "sliding " << windowSize << "-byte window" << endl; + + for (int i = 0; i < nSlidingWindow; ++i) + { + if (i % 100 == 0) + cout << i << "\r" << flush; + + Int64 offset = lastWindowOffset * i / (nSlidingWindow - 1); + double fuzzAmount = random.nextf (0.0, 0.1); + + fuzzFile (goodFile, brokenFile, + offset, windowSize, + random, fuzzAmount); + + readFile (brokenFile); + } + + cout << nSlidingWindow << endl; + } + + { + Int64 windowSize = 2048; + + cout << windowSize << "-byte window at start of file" << endl; + + for (int i = 0; i < nFixedWindow; ++i) + { + if (i % 100 == 0) + cout << i << "\r" << flush; + + double fuzzAmount = random.nextf (0.0, 0.1); + + fuzzFile (goodFile, brokenFile, + 0, windowSize, + random, fuzzAmount); + + readFile (brokenFile); + } + + cout << nFixedWindow << endl; + } +} diff --git a/IlmImfFuzzTest/fuzzFile.h b/IlmImfFuzzTest/fuzzFile.h new file mode 100644 index 0000000..5453b7d --- /dev/null +++ b/IlmImfFuzzTest/fuzzFile.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_FUZZ_FILE_H +#define INCLUDED_FUZZ_FILE_H + +#include + + +void +fuzzFile (const char goodFile[], + const char brokenFile[], + void (*readFile) (const char[]), + int nSlidingWindow, + int nFixedWindow, + IMATH_NAMESPACE::Rand48 &random); + + +#endif diff --git a/IlmImfFuzzTest/main.cpp b/IlmImfFuzzTest/main.cpp new file mode 100644 index 0000000..0c30e4a --- /dev/null +++ b/IlmImfFuzzTest/main.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImfNamespace.h" +#include "testFuzzDeepScanLines.h" +#include "testFuzzDeepTiles.h" +#include "testFuzzScanLines.h" +#include "testFuzzTiles.h" + +#include +#include +#include + +#ifdef OPENEXR_IMF_HAVE_LINUX_PROCFS + #include + #include +#endif + +#define TEST(x) if (argc < 2 || !strcmp (argv[1], #x)) x(); + +int +main (int argc, char *argv[]) +{ + TEST (testFuzzScanLines); + TEST (testFuzzTiles); + TEST (testFuzzDeepScanLines); + TEST (testFuzzDeepTiles); + +#ifdef OPENEXR_IMF_HAVE_LINUX_PROCFS + + // + // Allow the user to check for file descriptor leaks + // + + std::cout << "open file descriptors:" << std::endl; + + std::stringstream ss; + ss << "ls -lG /proc/" << getpid() << "/fd"; + + system (ss.str().c_str()); +#endif + + return 0; +} diff --git a/IlmImfFuzzTest/testFuzzDeepScanLines.cpp b/IlmImfFuzzTest/testFuzzDeepScanLines.cpp new file mode 100644 index 0000000..8967137 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzDeepScanLines.cpp @@ -0,0 +1,431 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC and Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include "fuzzFile.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" + + +// Handle the case when the custom namespace is not exposed +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + + +namespace +{ + +const int width = 90; +const int height = 80; +const int minX = 10; +const int minY = 11; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); + +Array2D sampleCount; + +void generateRandomFile(const char filename[], int channelCount,int parts , Compression compression) +{ + cout << "generating file with " << parts << " parts and compression " << compression << flush; + vector

headers(parts); + + headers[0] = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + + + + for (int i = 0; i < channelCount; i++) + { + stringstream ss; + ss << i; + string str = ss.str(); + headers[0].channels().insert(str, Channel(IMF::FLOAT)); + } + + headers[0].setType(DEEPSCANLINE); + + headers[0].setName("bob"); + + for(int p=1;p > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + sampleCount.resizeErase(height, width); + + remove (filename); + + + MultiPartOutputFile file(filename,&headers[0],parts); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&sampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + for (int i = 0; i < channelCount; i++) + { + PixelType type = IMF::FLOAT; + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof(char *); + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + for(int p=0;p localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + + + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&localSampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + vector read_channel(channelCount); + + + for (int i = 0; i < channelCount; i++) + { + PixelType type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + + + file.setFrameBuffer(frameBuffer); + file.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); + for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) + { + int y = i + dataWindow.min.y; + + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + data[k][i][j] = new float[localSampleCount[i][j]]; + } + } + + } + + try{ + file.readPixels(dataWindow.min.y, dataWindow.max.y); + }catch(...) + { + // if readPixels excepts we must clean up + } + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + for (int k = 0; k < channelCount; k++) + { + delete[] (float*) data[k][i][j]; + } + + }catch(std::exception & e) + { + /* ... yeah, that's likely to happen a lot ... */ + } + + + try{ + + MultiPartInputFile file(filename, 8); + + + for(int p=0;p localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + + + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&localSampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + vector read_channel(channelCount); + + + for (int i = 0; i < channelCount; i++) + { + PixelType type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + inpart.setFrameBuffer(frameBuffer); + inpart.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); + for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) + { + int y = i + dataWindow.min.y; + + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + data[k][i][j] = new float[localSampleCount[i][j]]; + } + } + } + try{ + inpart.readPixels(dataWindow.min.y, dataWindow.max.y); + }catch(...) + { + + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + delete[] (float*) data[k][i][j]; + } + } + } + } + }catch(...) + { + // nothing + } +} + + +void +fuzzDeepScanLines (int numThreads, Rand48 &random) +{ + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (numThreads); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + Header::setMaxImageSize (10000, 10000); + + const char *goodFile = IMF_TMP_DIR "imf_test_deep_scanline_file_fuzz_good.exr"; + const char *brokenFile = IMF_TMP_DIR "imf_test_deep_scanline_file_fuzz_broken.exr"; + + // read file if it already exists: allows re-testing reading of broken file + readFile(brokenFile); + + for(int parts=1 ; parts < 3 ; parts++) + { + for(int comp_method=0;comp_method<2;comp_method++) + { + generateRandomFile(goodFile,8,parts,comp_method==0 ? NO_COMPRESSION : ZIPS_COMPRESSION); + fuzzFile (goodFile, brokenFile, readFile, 5000, 3000, random); + } + } + + remove (goodFile); + remove (brokenFile); +} + +} // namespace + + +void +testFuzzDeepScanLines () +{ + try + { + cout << "Testing deep scanline-based files " + "with randomly inserted errors" << endl; + + Rand48 random (1); + + fuzzDeepScanLines (0, random); + + if (ILMTHREAD_NAMESPACE::supportsThreads()) + fuzzDeepScanLines (2, random); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfFuzzTest/testFuzzDeepScanLines.h b/IlmImfFuzzTest/testFuzzDeepScanLines.h new file mode 100644 index 0000000..9619589 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzDeepScanLines.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC and Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +void testFuzzDeepScanLines (); + diff --git a/IlmImfFuzzTest/testFuzzDeepTiles.cpp b/IlmImfFuzzTest/testFuzzDeepTiles.cpp new file mode 100644 index 0000000..becd622 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzDeepTiles.cpp @@ -0,0 +1,524 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC and Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include "fuzzFile.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" + + +// Handle the case when the custom namespace is not exposed +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace +{ + +const int width = 127; +const int height = 46; +const int minX = 10; +const int minY = 11; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); +Array2D< Array2D > sampleCountWhole; +Header header; + +void generateRandomFile(const char filename[], int channelCount, int parts , Compression compression) +{ + + vector
headers(parts); + + cout << "generating " << flush; + headers[0] = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression + ); + cout << "compression " << compression << " " << flush; + + for (int i = 0; i < channelCount; i++) + { + ostringstream ss; + ss << i; + string str = ss.str(); + headers[0].channels().insert(str, Channel(IMF::FLOAT)); + } + + headers[0].setType(DEEPTILE); + headers[0].setTileDescription( TileDescription(rand() % width + 1, rand() % height + 1, RIPMAP_LEVELS)); + + headers[0].setName("bob"); + + for(int p=1;p > data(channelCount); + for (int i = 0; i < channelCount; i++) + { + data[i].resizeErase(height, width); + } + + Array2D sampleCount; + sampleCount.resizeErase(height, width); + + remove (filename); + + MultiPartOutputFile file(filename, &headers[0], parts); + + DeepTiledOutputPart part(file,0); + + cout << "tileSizeX " << part.tileXSize() << " tileSizeY " << part.tileYSize() << " "; + + sampleCountWhole.resizeErase(part.numYLevels(), part.numXLevels()); + for (int i = 0; i < sampleCountWhole.height(); i++) + { + for (int j = 0; j < sampleCountWhole.width(); j++) + { + sampleCountWhole[i][j].resizeErase(height, width); + } + } + + DeepFrameBuffer frameBuffer; + + int memOffset = dataWindow.min.x + dataWindow.min.y * width; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width) ); + for (int i = 0; i < channelCount; i++) + { + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (IMF::FLOAT, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize)); + } + + for(int part=0;part localSampleCount; + + Box2i dataWindow = fileHeader.dataWindow(); + + int height = dataWindow.size().y+1; + int width = dataWindow.size().x+1; + + + localSampleCount.resizeErase(height, width); + + int channelCount=0; + for(ChannelList::ConstIterator i=fileHeader.channels().begin();i!=fileHeader.channels().end();++i, channelCount++); + + Array > data(channelCount); + + for (int i = 0; i < channelCount; i++) + { + data[i].resizeErase(height, width); + } + + DeepFrameBuffer frameBuffer; + + int memOffset = dataWindow.min.x + dataWindow.min.y * width; + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&localSampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width) + ); + + for (int i = 0; i < channelCount; i++) + { + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (IMF::FLOAT, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize) ); + } + + file.setFrameBuffer(frameBuffer); + for (int ly = 0; ly < file.numYLevels(); ly++) + { + for (int lx = 0; lx < file.numXLevels(); lx++) + { + Box2i dataWindowL = file.dataWindowForLevel(lx, ly); + + + file.readPixelSampleCounts(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + + for (int i = 0; i < file.numYTiles(ly); i++) + { + for (int j = 0; j < file.numXTiles(lx); j++) + { + Box2i box = file.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + + for (int k = 0; k < channelCount; k++) + { + data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; + } + } + } + } + + try{ + + file.readTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + }catch(...) + { + // catch exceptions thrown by readTiles, clean up anyway + } + for (int i = 0; i < file.levelHeight(ly); i++) + { + for (int j = 0; j < file.levelWidth(lx); j++) + { + for (int k = 0; k < channelCount; k++) + { + delete[] (float*) data[k][i][j]; + } + } + } + } + } + + }catch(std::exception & e) + { + /* expect to get exceptions*/ + } + + + // test multipart inputfile interface + + try + { + MultiPartInputFile file(filename, 8); + + for(int p=0;p localSampleCount; + + Box2i dataWindow = fileHeader.dataWindow(); + + int height = dataWindow.size().y+1; + int width = dataWindow.size().x+1; + + + localSampleCount.resizeErase(height, width); + + int channelCount=0; + for(ChannelList::ConstIterator i=fileHeader.channels().begin();i!=fileHeader.channels().end();++i, channelCount++); + + Array > data(channelCount); + + for (int i = 0; i < channelCount; i++) + { + data[i].resizeErase(height, width); + } + + DeepFrameBuffer frameBuffer; + + int memOffset = dataWindow.min.x + dataWindow.min.y * width; + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&localSampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width) + ); + + for (int i = 0; i < channelCount; i++) + { + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (IMF::FLOAT, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize) ); + } + + part.setFrameBuffer(frameBuffer); + + for (int ly = 0; ly < part.numYLevels(); ly++) + { + for (int lx = 0; lx < part.numXLevels(); lx++) + { + Box2i dataWindowL = part.dataWindowForLevel(lx, ly); + + + part.readPixelSampleCounts(0, part.numXTiles(lx) - 1, 0, part.numYTiles(ly) - 1, lx, ly); + + for (int i = 0; i < part.numYTiles(ly); i++) + { + for (int j = 0; j < part.numXTiles(lx); j++) + { + Box2i box = part.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + + for (int k = 0; k < channelCount; k++) + { + data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; + } + } + } + } + + try{ + part.readTiles(0, part.numXTiles(lx) - 1, 0, part.numYTiles(ly) - 1, lx, ly); + }catch(...) + { + + } + + for (int i = 0; i < part.levelHeight(ly); i++) + { + for (int j = 0; j < part.levelWidth(lx); j++) + { + for (int k = 0; k < channelCount; k++) + { + delete[] (float*) data[k][i][j]; + } + } + } + } + } + } + }catch(std::exception & e) + { + /* expect to get exceptions*/ + } + +} + + +void +fuzzDeepTiles (int numThreads, Rand48 &random) +{ + + + + + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (numThreads); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + Header::setMaxImageSize (10000, 10000); + + const char *goodFile = IMF_TMP_DIR "imf_test_deep_tile_file_fuzz_good.exr"; + const char *brokenFile = IMF_TMP_DIR "imf_test_deel_tile_file_fuzz_broken.exr"; + + + // read file if it already exists: allows re-testing reading of broken file + readFile(brokenFile); + + + for(int parts=1;parts<3;parts++) + { + + for(int comp_method=0;comp_method<2;comp_method++) + { + generateRandomFile(goodFile,8,parts , comp_method==0 ? NO_COMPRESSION : ZIPS_COMPRESSION); + fuzzFile (goodFile, brokenFile, readFile, 5000, 3000, random); + } + } + + remove (goodFile); + remove (brokenFile); +} + +} // namespace + + +void +testFuzzDeepTiles () +{ + + + try + { + cout << "Testing deep tile-based files " + "with randomly inserted errors" << endl; + + Rand48 random (1); + + fuzzDeepTiles (0, random); + + if (ILMTHREAD_NAMESPACE::supportsThreads()) + fuzzDeepTiles (2, random); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfFuzzTest/testFuzzDeepTiles.h b/IlmImfFuzzTest/testFuzzDeepTiles.h new file mode 100644 index 0000000..ffb4a4a --- /dev/null +++ b/IlmImfFuzzTest/testFuzzDeepTiles.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC and Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +void testFuzzDeepTiles (); + diff --git a/IlmImfFuzzTest/testFuzzScanLines.cpp b/IlmImfFuzzTest/testFuzzScanLines.cpp new file mode 100644 index 0000000..27e02b1 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzScanLines.cpp @@ -0,0 +1,273 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "fuzzFile.h" + + + + +// Handle the case when the custom namespace is not exposed +#include +#include +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +writeImage (const char fileName[], + int width, + int height, + const Array2D &pixels, + int parts, + Compression comp) +{ + // + // Save the image with the specified compression. + // + + cout << parts << " parts with compression: " << comp << endl; + + Header header (width, height); + header.compression() = comp; + + if(parts==1) + { + RgbaOutputFile out (fileName, header, WRITE_RGBA); + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writePixels (height); + }else{ + + header.setType(SCANLINEIMAGE); + + header.channels().insert("R",Channel(HALF)); + header.channels().insert("G",Channel(HALF)); + header.channels().insert("B",Channel(HALF)); + header.channels().insert("A",Channel(HALF)); + + vector
headers(parts); + for(int i=0;i (1 << 24)) + return; + + Array pixels (w); + in.setFrameBuffer (&pixels[-dx], 1, 0); + + for (int y = dw.min.y; y <= dw.max.y; ++y) + in.readPixels (y); + }catch(...) + { + // expect exceptions + } + try{ + // now test Multipart interface (even for single part files) + + MultiPartInputFile file(fileName); + + for(int p=0;p (1 << 24)) + return; + + Array pixels (w); + FrameBuffer i; + i.insert("R",Slice(HALF,(char *)&(pixels[-dx].r),sizeof(Rgba),0)); + i.insert("G",Slice(HALF,(char *)&(pixels[-dx].g),sizeof(Rgba),0)); + i.insert("B",Slice(HALF,(char *)&(pixels[-dx].b),sizeof(Rgba),0)); + i.insert("A",Slice(HALF,(char *)&(pixels[-dx].a),sizeof(Rgba),0)); + + in.setFrameBuffer (i); + for (int y = dw.min.y; y <= dw.max.y; ++y) + in.readPixels (y); + + } + } + catch (...) + { + // empty + } +} + + +void +fuzzScanLines (int numThreads, Rand48 &random) +{ + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (numThreads); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + Header::setMaxImageSize (10000, 10000); + + const int W = 217; + const int H = 197; + + Array2D pixels (H, W); + fillPixels (pixels, W, H); + + const char *goodFile = IMF_TMP_DIR "imf_test_scanline_file_fuzz_good.exr"; + const char *brokenFile = IMF_TMP_DIR "imf_test_scanline_file_fuzz_broken.exr"; + + // re-attempt to read broken file if it still remains on disk from previous aborted run + readImage(brokenFile); + + for (int parts = 1 ; parts<4 ; ++parts) + { + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeImage (goodFile, W, H, pixels, parts,Compression (comp)); + fuzzFile (goodFile, brokenFile, readImage, 5000, 3000, random); + } + } + + remove (goodFile); + remove (brokenFile); +} + +} // namespace + + +void +testFuzzScanLines () +{ + try + { + cout << "Testing scanline-based files " + "with randomly inserted errors" << endl; + + Rand48 random (1); + + fuzzScanLines (0, random); + + if (ILMTHREAD_NAMESPACE::supportsThreads()) + fuzzScanLines (2, random); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfFuzzTest/testFuzzScanLines.h b/IlmImfFuzzTest/testFuzzScanLines.h new file mode 100644 index 0000000..71838b9 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzScanLines.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +void testFuzzScanLines (); + diff --git a/IlmImfFuzzTest/testFuzzTiles.cpp b/IlmImfFuzzTest/testFuzzTiles.cpp new file mode 100644 index 0000000..0ef10c8 --- /dev/null +++ b/IlmImfFuzzTest/testFuzzTiles.cpp @@ -0,0 +1,423 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// Handle the case when the custom namespace is not exposed +#include +#include +#include +#include +#include +#include +#include +using namespace OPENEXR_IMF_INTERNAL_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +writeImageONE (const char fileName[], + int width, int height, + int xSize, int ySize, + int parts, + Compression comp) +{ + cout << "levelMode 0" << ", compression " << comp << " parts " << parts << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array2D pixels (height, width); + fillPixels (pixels, width, height); + + if(parts==1) + { + TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, + xSize, ySize, ONE_LEVEL); + + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + }else{ + + header.setTileDescription(TileDescription(xSize,ySize,ONE_LEVEL)); + + header.setType(TILEDIMAGE); + + header.channels().insert("R",Channel(HALF)); + header.channels().insert("G",Channel(HALF)); + header.channels().insert("B",Channel(HALF)); + header.channels().insert("A",Channel(HALF)); + + + FrameBuffer f; + f.insert("R",Slice(HALF,(char *) &(pixels[0][0].r),sizeof(Rgba),width*sizeof(Rgba))); + f.insert("G",Slice(HALF,(char *) &(pixels[0][0].g),sizeof(Rgba),width*sizeof(Rgba))); + f.insert("B",Slice(HALF,(char *) &(pixels[0][0].b),sizeof(Rgba),width*sizeof(Rgba))); + f.insert("A",Slice(HALF,(char *) &(pixels[0][0].a),sizeof(Rgba),width*sizeof(Rgba))); + + + vector
headers(parts); + for(int p=0;p pixels (h, w); + in.setFrameBuffer (&pixels[-dwy][-dwx], 1, w); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + } + catch (...) + { + // empty + } + try + { + + // attempt MultiPart interface + MultiPartInputFile in(fileName); + for(int p=0;p pixels (h, w); + FrameBuffer i; + i.insert("R",Slice(HALF,(char *)&(pixels[-dwy][-dwx].r),sizeof(Rgba),w*sizeof(Rgba))); + i.insert("G",Slice(HALF,(char *)&(pixels[-dwy][-dwx].g),sizeof(Rgba),w*sizeof(Rgba))); + i.insert("B",Slice(HALF,(char *)&(pixels[-dwy][-dwx].b),sizeof(Rgba),w*sizeof(Rgba))); + i.insert("A",Slice(HALF,(char *)&(pixels[-dwy][-dwx].a),sizeof(Rgba),w*sizeof(Rgba))); + + inpart.setFrameBuffer (i); + inpart.readTiles (0, inpart.numXTiles() - 1, 0, inpart.numYTiles() - 1); + } + } + catch (...) + { + // empty + } +} + + +void +writeImageMIP (const char fileName[], + int width, int height, + int xSize, int ySize, + int parts, ///\todo support multipart MIP files + Compression comp) +{ + cout << "levelMode 1" << ", compression " << comp << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array < Array2D > levels; + + TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, + xSize, ySize, MIPMAP_LEVELS, ROUND_DOWN); + + int numLevels = out.numLevels(); + levels.resizeErase (numLevels); + + for (int level = 0; level < out.numLevels(); ++level) + { + int levelWidth = out.levelWidth(level); + int levelHeight = out.levelHeight(level); + levels[level].resizeErase(levelHeight, levelWidth); + fillPixels (levels[level], levelWidth, levelHeight); + + out.setFrameBuffer (&(levels[level])[0][0], 1, levelWidth); + out.writeTiles (0, out.numXTiles(level) - 1, + 0, out.numYTiles(level) - 1, level); + } +} + + +void +readImageMIP (const char fileName[]) +{ + // + // Try to read the specified mipmap file, which may be damaged. + // Reading should either succeed or throw an exception, but it + // should not cause a crash. + // + + try + { + TiledRgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numLevels = in.numLevels(); + Array < Array2D > levels2 (numLevels); + + for (int level = 0; level < numLevels; ++level) + { + int levelWidth = in.levelWidth(level); + int levelHeight = in.levelHeight(level); + levels2[level].resizeErase(levelHeight, levelWidth); + + in.setFrameBuffer (&(levels2[level])[-dwy][-dwx], 1, levelWidth); + in.readTiles (0, in.numXTiles(level) - 1, + 0, in.numYTiles(level) - 1, level); + } + } + catch (...) + { + // empty + } +} + + +void +writeImageRIP (const char fileName[], + int width, int height, + int xSize, int ySize, + int parts, ///\todo support multipart RIP files + Compression comp) +{ + cout << "levelMode 2" << ", compression " << comp << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array2D < Array2D > levels; + + TiledRgbaOutputFile out (fileName, header, WRITE_RGBA, + xSize, ySize, RIPMAP_LEVELS, ROUND_UP); + + levels.resizeErase (out.numYLevels(), out.numXLevels()); + + for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) + { + for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) + { + int levelWidth = out.levelWidth(xlevel); + int levelHeight = out.levelHeight(ylevel); + levels[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + fillPixels (levels[ylevel][xlevel], levelWidth, levelHeight); + + out.setFrameBuffer (&(levels[ylevel][xlevel])[0][0], 1, + levelWidth); + out.writeTiles (0, out.numXTiles(xlevel) - 1, + 0, out.numYTiles(ylevel) - 1, xlevel, ylevel); + } + } +} + + +void +readImageRIP (const char fileName[]) +{ + // + // Try to read the specified ripmap file, which may be damaged. + // Reading should either succeed or throw an exception, but it + // should not cause a crash. + // + + try + { + TiledRgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numXLevels = in.numXLevels(); + int numYLevels = in.numYLevels(); + Array2D < Array2D > levels2 (numYLevels, numXLevels); + + for (int ylevel = 0; ylevel < numYLevels; ++ylevel) + { + for (int xlevel = 0; xlevel < numXLevels; ++xlevel) + { + int levelWidth = in.levelWidth(xlevel); + int levelHeight = in.levelHeight(ylevel); + levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + in.setFrameBuffer (&(levels2[ylevel][xlevel])[-dwy][-dwx], 1, + levelWidth); + + in.readTiles (0, in.numXTiles(xlevel) - 1, + 0, in.numYTiles(ylevel) - 1, xlevel, ylevel); + } + } + } + catch (...) + { + // empty + } +} + + +void +fuzzTiles (int numThreads, Rand48 &random) +{ + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (numThreads); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + Header::setMaxImageSize (10000, 10000); + Header::setMaxTileSize (10000, 10000); + + const int W = 217; + const int H = 197; + const int TW = 64; + const int TH = 64; + + const char *goodFile = IMF_TMP_DIR "imf_test_tile_file_fuzz_good.exr"; + const char *brokenFile = IMF_TMP_DIR "imf_test_tile_file_fuzz_broken.exr"; + + for (int parts = 1 ; parts < 3 ; parts++) + { + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeImageONE (goodFile, W, H, TW, TH, parts , Compression (comp)); + fuzzFile (goodFile, brokenFile, readImageONE, 5000, 3000, random); + + if(parts==1) + { + writeImageMIP (goodFile, W, H, TW, TH, parts , Compression (comp)); + fuzzFile (goodFile, brokenFile, readImageMIP, 5000, 3000, random); + + writeImageRIP (goodFile, W, H, TW, TH, parts , Compression (comp)); + fuzzFile (goodFile, brokenFile, readImageRIP, 5000, 3000, random); + } + } + } + remove (goodFile); + remove (brokenFile); +} + +} // namespace + + +void +testFuzzTiles () +{ + try + { + cout << "Testing tile-based files " + "with randomly inserted errors" << endl; + + Rand48 random (5); + + fuzzTiles (0, random); + + if (ILMTHREAD_NAMESPACE::supportsThreads()) + fuzzTiles (2, random); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfFuzzTest/testFuzzTiles.h b/IlmImfFuzzTest/testFuzzTiles.h new file mode 100644 index 0000000..12f3bdd --- /dev/null +++ b/IlmImfFuzzTest/testFuzzTiles.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +void testFuzzTiles (); + diff --git a/IlmImfFuzzTest/tmpDir.h b/IlmImfFuzzTest/tmpDir.h new file mode 100644 index 0000000..0a550d8 --- /dev/null +++ b/IlmImfFuzzTest/tmpDir.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#if defined(_WIN32) || defined(_WIN64) || defined(__MWERKS__) || defined(__ANDROID__) + #define IMF_TMP_DIR "" +#else + #define IMF_TMP_DIR "/var/tmp/" +#endif diff --git a/IlmImfTest/CMakeLists.txt b/IlmImfTest/CMakeLists.txt new file mode 100644 index 0000000..c07d9f2 --- /dev/null +++ b/IlmImfTest/CMakeLists.txt @@ -0,0 +1,74 @@ +# yue.nicholas@gmail.com + +# IlmImfTest + +ADD_EXECUTABLE ( IlmImfTest + compareB44.cpp + compareDwa.cpp + compareFloat.cpp + main.cpp + testAttributes.cpp + testBackwardCompatibility.cpp + testBadTypeAttributes.cpp + testChannels.cpp + testCompositeDeepScanLine.cpp + testCompression.cpp + testConversion.cpp + testCopyDeepScanLine.cpp + testCopyDeepTiled.cpp + testCopyMultiPartFile.cpp + testCopyPixels.cpp + testCustomAttributes.cpp + testDeepScanLineBasic.cpp + testDeepScanLineHuge.cpp + testDeepScanLineMultipleRead.cpp + testDeepTiledBasic.cpp + testDwaCompressorSimd.cpp + testExistingStreams.cpp + testFutureProofing.cpp + testHuf.cpp + testInputPart.cpp + testIsComplete.cpp + testLineOrder.cpp + testLut.cpp + testMagic.cpp + testMultiPartApi.cpp + testMultiPartFileMixingBasic.cpp + testMultiPartSharedAttributes.cpp + testMultiPartThreading.cpp + testMultiScanlinePartThreading.cpp + testMultiTiledPartThreading.cpp + testMultiView.cpp + testNativeFormat.cpp + testOptimized.cpp + testOptimizedInterleavePatterns.cpp + testPartHelper.cpp + testPreviewImage.cpp + testRgba.cpp + testRgbaThreading.cpp + testRle.cpp + testSampleImages.cpp + testScanLineApi.cpp + testSharedFrameBuffer.cpp + testStandardAttributes.cpp + testTiledCompression.cpp + testTiledCopyPixels.cpp + testTiledLineOrder.cpp + testTiledRgba.cpp + testTiledYa.cpp + testWav.cpp + testXdr.cpp + testYca.cpp + ) + + +ADD_TEST ( TestIlmImf IlmImfTest ) +TARGET_LINK_LIBRARIES ( IlmImfTest + IlmImf + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} ${ZLIB_LIBRARIES} + ) + diff --git a/IlmImfTest/Makefile.am b/IlmImfTest/Makefile.am new file mode 100644 index 0000000..3051d60 --- /dev/null +++ b/IlmImfTest/Makefile.am @@ -0,0 +1,82 @@ +## Process this file with automake to produce Makefile.in + +check_PROGRAMS = IlmImfTest + +IlmImfTest_SOURCES = main.cpp tmpDir.h testAttributes.cpp testChannels.cpp \ + testCompression.cpp testCopyPixels.cpp \ + testCustomAttributes.cpp testHuf.cpp testLineOrder.cpp \ + testLut.cpp testRgba.cpp testRgbaThreading.cpp \ + testSampleImages.cpp testSharedFrameBuffer.cpp \ + testWav.cpp testXdr.cpp testAttributes.h testChannels.h \ + testCompression.h testCopyPixels.h \ + testCustomAttributes.h testHuf.h testLineOrder.h \ + testLut.h testRgba.h testRgbaThreading.h \ + testSampleImages.h testWav.h testSharedFrameBuffer.h \ + testXdr.h testConversion.cpp testConversion.h \ + testNativeFormat.cpp testNativeFormat.h \ + testPreviewImage.cpp testPreviewImage.h \ + testMagic.cpp testMagic.h testStandardAttributes.cpp \ + testStandardAttributes.h testExistingStreams.cpp \ + testExistingStreams.h testScanLineApi.cpp \ + testScanLineApi.h testTiledCompression.cpp \ + testTiledCompression.h testTiledCopyPixels.cpp \ + testTiledCopyPixels.h testTiledLineOrder.cpp \ + testTiledLineOrder.h testTiledRgba.cpp \ + testTiledRgba.h compareFloat.h compareFloat.cpp \ + testTiledYa.cpp testTiledYa.h \ + testYca.cpp testYca.h compareB44.h compareB44.cpp \ + testMultiView.cpp testMultiView.h \ + testIsComplete.cpp testIsComplete.h \ + testMultiPartApi.cpp testMultiPartApi.h \ + testMultiPartThreading.cpp testMultiPartThreading.h \ + testMultiScanlinePartThreading.cpp testMultiScanlinePartThreading.h \ + testMultiTiledPartThreading.cpp testMultiTiledPartThreading.h \ + testDeepScanLineBasic.cpp testDeepScanLineBasic.h \ + testDeepTiledBasic.cpp testDeepTiledBasic.h \ + testMultiPartFileMixingBasic.cpp testMultiPartFileMixingBasic.h \ + testMultiPartSharedAttributes.cpp testMultiPartSharedAttributes.h \ + testBackwardCompatibility.cpp testBackwardCompatibility.h \ + testCopyDeepScanLine.cpp testCopyDeepScanLine.h \ + testCopyDeepTiled.cpp testCopyDeepTiled.h \ + testCopyMultiPartFile.h testCopyMultiPartFile.cpp \ + testCompositeDeepScanLine.h testCompositeDeepScanLine.cpp \ + testInputPart.cpp testInputPart.h \ + testDeepScanLineMultipleRead.h testDeepScanLineMultipleRead.cpp \ + testPartHelper.h testPartHelper.cpp \ + testOptimized.cpp testOptimized.h \ + testOptimizedInterleavePatterns.cpp testOptimizedInterleavePatterns.h \ + testBadTypeAttributes.cpp testBadTypeAttributes.h \ + testFutureProofing.cpp testFutureProofing.h \ + compareDwa.cpp compareDwa.h \ + testDwaCompressorSimd.cpp testDwaCompressorSimd.h \ + testRle.cpp testRle.h + +AM_CPPFLAGS = -DILM_IMF_TEST_IMAGEDIR=\"$(srcdir)/\" + +if BUILD_IMFHUGETEST +IlmImfTest_SOURCES += testDeepScanLineHuge.cpp testDeepScanLineHuge.h +AM_CPPFLAGS += -DENABLE_IMFHUGETEST +endif + + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +TESTS = IlmImfTest + +EXTRA_DIST = comp_none.exr comp_piz.exr comp_rle.exr comp_zip.exr \ + comp_zips.exr lineOrder_decreasing.exr lineOrder_increasing.exr \ + test_native1.exr test_native2.exr invalid.exr \ + tiled.exr comp_b44.exr comp_b44_piz.exr \ + v1.7.test.planar.exr v1.7.test.tiled.exr v1.7.test.1.exr v1.7.test.interleaved.exr \ + invalid_shared_attrs_multipart.exr \ + tiled_with_scanlineimage_type.exr scanline_with_tiledimage_type.exr \ + tiled_with_deepscanline_type.exr tiled_with_deeptile_type.exr \ + scanline_with_deepscanline_type.exr scanline_with_deeptiled_type.exr \ + CMakeLists.txt diff --git a/IlmImfTest/Makefile.in b/IlmImfTest/Makefile.in new file mode 100644 index 0000000..1458627 --- /dev/null +++ b/IlmImfTest/Makefile.in @@ -0,0 +1,794 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = IlmImfTest$(EXEEXT) +@BUILD_IMFHUGETEST_TRUE@am__append_1 = testDeepScanLineHuge.cpp testDeepScanLineHuge.h +@BUILD_IMFHUGETEST_TRUE@am__append_2 = -DENABLE_IMFHUGETEST +TESTS = IlmImfTest$(EXEEXT) +subdir = IlmImfTest +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__IlmImfTest_SOURCES_DIST = main.cpp tmpDir.h testAttributes.cpp \ + testChannels.cpp testCompression.cpp testCopyPixels.cpp \ + testCustomAttributes.cpp testHuf.cpp testLineOrder.cpp \ + testLut.cpp testRgba.cpp testRgbaThreading.cpp \ + testSampleImages.cpp testSharedFrameBuffer.cpp testWav.cpp \ + testXdr.cpp testAttributes.h testChannels.h testCompression.h \ + testCopyPixels.h testCustomAttributes.h testHuf.h \ + testLineOrder.h testLut.h testRgba.h testRgbaThreading.h \ + testSampleImages.h testWav.h testSharedFrameBuffer.h testXdr.h \ + testConversion.cpp testConversion.h testNativeFormat.cpp \ + testNativeFormat.h testPreviewImage.cpp testPreviewImage.h \ + testMagic.cpp testMagic.h testStandardAttributes.cpp \ + testStandardAttributes.h testExistingStreams.cpp \ + testExistingStreams.h testScanLineApi.cpp testScanLineApi.h \ + testTiledCompression.cpp testTiledCompression.h \ + testTiledCopyPixels.cpp testTiledCopyPixels.h \ + testTiledLineOrder.cpp testTiledLineOrder.h testTiledRgba.cpp \ + testTiledRgba.h compareFloat.h compareFloat.cpp \ + testTiledYa.cpp testTiledYa.h testYca.cpp testYca.h \ + compareB44.h compareB44.cpp testMultiView.cpp testMultiView.h \ + testIsComplete.cpp testIsComplete.h testMultiPartApi.cpp \ + testMultiPartApi.h testMultiPartThreading.cpp \ + testMultiPartThreading.h testMultiScanlinePartThreading.cpp \ + testMultiScanlinePartThreading.h \ + testMultiTiledPartThreading.cpp testMultiTiledPartThreading.h \ + testDeepScanLineBasic.cpp testDeepScanLineBasic.h \ + testDeepTiledBasic.cpp testDeepTiledBasic.h \ + testMultiPartFileMixingBasic.cpp \ + testMultiPartFileMixingBasic.h \ + testMultiPartSharedAttributes.cpp \ + testMultiPartSharedAttributes.h testBackwardCompatibility.cpp \ + testBackwardCompatibility.h testCopyDeepScanLine.cpp \ + testCopyDeepScanLine.h testCopyDeepTiled.cpp \ + testCopyDeepTiled.h testCopyMultiPartFile.h \ + testCopyMultiPartFile.cpp testCompositeDeepScanLine.h \ + testCompositeDeepScanLine.cpp testInputPart.cpp \ + testInputPart.h testDeepScanLineMultipleRead.h \ + testDeepScanLineMultipleRead.cpp testPartHelper.h \ + testPartHelper.cpp testOptimized.cpp testOptimized.h \ + testOptimizedInterleavePatterns.cpp \ + testOptimizedInterleavePatterns.h testBadTypeAttributes.cpp \ + testBadTypeAttributes.h testFutureProofing.cpp \ + testFutureProofing.h compareDwa.cpp compareDwa.h \ + testDwaCompressorSimd.cpp testDwaCompressorSimd.h testRle.cpp \ + testRle.h testDeepScanLineHuge.cpp testDeepScanLineHuge.h +@BUILD_IMFHUGETEST_TRUE@am__objects_1 = \ +@BUILD_IMFHUGETEST_TRUE@ testDeepScanLineHuge.$(OBJEXT) +am_IlmImfTest_OBJECTS = main.$(OBJEXT) testAttributes.$(OBJEXT) \ + testChannels.$(OBJEXT) testCompression.$(OBJEXT) \ + testCopyPixels.$(OBJEXT) testCustomAttributes.$(OBJEXT) \ + testHuf.$(OBJEXT) testLineOrder.$(OBJEXT) testLut.$(OBJEXT) \ + testRgba.$(OBJEXT) testRgbaThreading.$(OBJEXT) \ + testSampleImages.$(OBJEXT) testSharedFrameBuffer.$(OBJEXT) \ + testWav.$(OBJEXT) testXdr.$(OBJEXT) testConversion.$(OBJEXT) \ + testNativeFormat.$(OBJEXT) testPreviewImage.$(OBJEXT) \ + testMagic.$(OBJEXT) testStandardAttributes.$(OBJEXT) \ + testExistingStreams.$(OBJEXT) testScanLineApi.$(OBJEXT) \ + testTiledCompression.$(OBJEXT) testTiledCopyPixels.$(OBJEXT) \ + testTiledLineOrder.$(OBJEXT) testTiledRgba.$(OBJEXT) \ + compareFloat.$(OBJEXT) testTiledYa.$(OBJEXT) testYca.$(OBJEXT) \ + compareB44.$(OBJEXT) testMultiView.$(OBJEXT) \ + testIsComplete.$(OBJEXT) testMultiPartApi.$(OBJEXT) \ + testMultiPartThreading.$(OBJEXT) \ + testMultiScanlinePartThreading.$(OBJEXT) \ + testMultiTiledPartThreading.$(OBJEXT) \ + testDeepScanLineBasic.$(OBJEXT) testDeepTiledBasic.$(OBJEXT) \ + testMultiPartFileMixingBasic.$(OBJEXT) \ + testMultiPartSharedAttributes.$(OBJEXT) \ + testBackwardCompatibility.$(OBJEXT) \ + testCopyDeepScanLine.$(OBJEXT) testCopyDeepTiled.$(OBJEXT) \ + testCopyMultiPartFile.$(OBJEXT) \ + testCompositeDeepScanLine.$(OBJEXT) testInputPart.$(OBJEXT) \ + testDeepScanLineMultipleRead.$(OBJEXT) \ + testPartHelper.$(OBJEXT) testOptimized.$(OBJEXT) \ + testOptimizedInterleavePatterns.$(OBJEXT) \ + testBadTypeAttributes.$(OBJEXT) testFutureProofing.$(OBJEXT) \ + compareDwa.$(OBJEXT) testDwaCompressorSimd.$(OBJEXT) \ + testRle.$(OBJEXT) $(am__objects_1) +IlmImfTest_OBJECTS = $(am_IlmImfTest_OBJECTS) +IlmImfTest_LDADD = $(LDADD) +IlmImfTest_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(IlmImfTest_SOURCES) +DIST_SOURCES = $(am__IlmImfTest_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +IlmImfTest_SOURCES = main.cpp tmpDir.h testAttributes.cpp \ + testChannels.cpp testCompression.cpp testCopyPixels.cpp \ + testCustomAttributes.cpp testHuf.cpp testLineOrder.cpp \ + testLut.cpp testRgba.cpp testRgbaThreading.cpp \ + testSampleImages.cpp testSharedFrameBuffer.cpp testWav.cpp \ + testXdr.cpp testAttributes.h testChannels.h testCompression.h \ + testCopyPixels.h testCustomAttributes.h testHuf.h \ + testLineOrder.h testLut.h testRgba.h testRgbaThreading.h \ + testSampleImages.h testWav.h testSharedFrameBuffer.h testXdr.h \ + testConversion.cpp testConversion.h testNativeFormat.cpp \ + testNativeFormat.h testPreviewImage.cpp testPreviewImage.h \ + testMagic.cpp testMagic.h testStandardAttributes.cpp \ + testStandardAttributes.h testExistingStreams.cpp \ + testExistingStreams.h testScanLineApi.cpp testScanLineApi.h \ + testTiledCompression.cpp testTiledCompression.h \ + testTiledCopyPixels.cpp testTiledCopyPixels.h \ + testTiledLineOrder.cpp testTiledLineOrder.h testTiledRgba.cpp \ + testTiledRgba.h compareFloat.h compareFloat.cpp \ + testTiledYa.cpp testTiledYa.h testYca.cpp testYca.h \ + compareB44.h compareB44.cpp testMultiView.cpp testMultiView.h \ + testIsComplete.cpp testIsComplete.h testMultiPartApi.cpp \ + testMultiPartApi.h testMultiPartThreading.cpp \ + testMultiPartThreading.h testMultiScanlinePartThreading.cpp \ + testMultiScanlinePartThreading.h \ + testMultiTiledPartThreading.cpp testMultiTiledPartThreading.h \ + testDeepScanLineBasic.cpp testDeepScanLineBasic.h \ + testDeepTiledBasic.cpp testDeepTiledBasic.h \ + testMultiPartFileMixingBasic.cpp \ + testMultiPartFileMixingBasic.h \ + testMultiPartSharedAttributes.cpp \ + testMultiPartSharedAttributes.h testBackwardCompatibility.cpp \ + testBackwardCompatibility.h testCopyDeepScanLine.cpp \ + testCopyDeepScanLine.h testCopyDeepTiled.cpp \ + testCopyDeepTiled.h testCopyMultiPartFile.h \ + testCopyMultiPartFile.cpp testCompositeDeepScanLine.h \ + testCompositeDeepScanLine.cpp testInputPart.cpp \ + testInputPart.h testDeepScanLineMultipleRead.h \ + testDeepScanLineMultipleRead.cpp testPartHelper.h \ + testPartHelper.cpp testOptimized.cpp testOptimized.h \ + testOptimizedInterleavePatterns.cpp \ + testOptimizedInterleavePatterns.h testBadTypeAttributes.cpp \ + testBadTypeAttributes.h testFutureProofing.cpp \ + testFutureProofing.h compareDwa.cpp compareDwa.h \ + testDwaCompressorSimd.cpp testDwaCompressorSimd.h testRle.cpp \ + testRle.h $(am__append_1) +AM_CPPFLAGS = -DILM_IMF_TEST_IMAGEDIR=\"$(srcdir)/\" $(am__append_2) +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImf -lz + +EXTRA_DIST = comp_none.exr comp_piz.exr comp_rle.exr comp_zip.exr \ + comp_zips.exr lineOrder_decreasing.exr lineOrder_increasing.exr \ + test_native1.exr test_native2.exr invalid.exr \ + tiled.exr comp_b44.exr comp_b44_piz.exr \ + v1.7.test.planar.exr v1.7.test.tiled.exr v1.7.test.1.exr v1.7.test.interleaved.exr \ + invalid_shared_attrs_multipart.exr \ + tiled_with_scanlineimage_type.exr scanline_with_tiledimage_type.exr \ + tiled_with_deepscanline_type.exr tiled_with_deeptile_type.exr \ + scanline_with_deepscanline_type.exr scanline_with_deeptiled_type.exr \ + CMakeLists.txt + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImfTest/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImfTest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +IlmImfTest$(EXEEXT): $(IlmImfTest_OBJECTS) $(IlmImfTest_DEPENDENCIES) + @rm -f IlmImfTest$(EXEEXT) + $(CXXLINK) $(IlmImfTest_OBJECTS) $(IlmImfTest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compareB44.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compareDwa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compareFloat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testAttributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testBackwardCompatibility.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testBadTypeAttributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testChannels.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCompositeDeepScanLine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCompression.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testConversion.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCopyDeepScanLine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCopyDeepTiled.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCopyMultiPartFile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCopyPixels.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testCustomAttributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDeepScanLineBasic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDeepScanLineHuge.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDeepScanLineMultipleRead.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDeepTiledBasic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDwaCompressorSimd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testExistingStreams.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFutureProofing.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testHuf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testInputPart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testIsComplete.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testLineOrder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testLut.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMagic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiPartApi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiPartFileMixingBasic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiPartSharedAttributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiPartThreading.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiScanlinePartThreading.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiTiledPartThreading.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMultiView.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testNativeFormat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testOptimized.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testOptimizedInterleavePatterns.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testPartHelper.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testPreviewImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testRgba.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testRgbaThreading.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testRle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testSampleImages.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testScanLineApi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testSharedFrameBuffer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testStandardAttributes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTiledCompression.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTiledCopyPixels.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTiledLineOrder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTiledRgba.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTiledYa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testWav.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testXdr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testYca.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImfTest/comp_b44.exr b/IlmImfTest/comp_b44.exr new file mode 100644 index 0000000..08898b2 Binary files /dev/null and b/IlmImfTest/comp_b44.exr differ diff --git a/IlmImfTest/comp_b44_piz.exr b/IlmImfTest/comp_b44_piz.exr new file mode 100644 index 0000000..ae68410 Binary files /dev/null and b/IlmImfTest/comp_b44_piz.exr differ diff --git a/IlmImfTest/comp_none.exr b/IlmImfTest/comp_none.exr new file mode 100644 index 0000000..55ffb45 Binary files /dev/null and b/IlmImfTest/comp_none.exr differ diff --git a/IlmImfTest/comp_piz.exr b/IlmImfTest/comp_piz.exr new file mode 100644 index 0000000..220792e Binary files /dev/null and b/IlmImfTest/comp_piz.exr differ diff --git a/IlmImfTest/comp_rle.exr b/IlmImfTest/comp_rle.exr new file mode 100644 index 0000000..b28f9c0 Binary files /dev/null and b/IlmImfTest/comp_rle.exr differ diff --git a/IlmImfTest/comp_zip.exr b/IlmImfTest/comp_zip.exr new file mode 100644 index 0000000..f7d234e Binary files /dev/null and b/IlmImfTest/comp_zip.exr differ diff --git a/IlmImfTest/comp_zips.exr b/IlmImfTest/comp_zips.exr new file mode 100644 index 0000000..5e9b117 Binary files /dev/null and b/IlmImfTest/comp_zips.exr differ diff --git a/IlmImfTest/compareB44.cpp b/IlmImfTest/compareB44.cpp new file mode 100644 index 0000000..963f4f1 --- /dev/null +++ b/IlmImfTest/compareB44.cpp @@ -0,0 +1,374 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "compareB44.h" + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +int +shiftAndRound (int x, int shift) +{ + x <<= 1; + int a = (1 << shift) - 1; + shift += 1; + int b = (x >> shift) & 1; + return (x + a + b) >> shift; +} + + +bool +withinB44ErrorBounds (const half A[4][4], const half B[4][4]) +{ + // + // Assuming that a 4x4 pixel block, B, was generated by + // compressing and uncompressing another pixel block, A, + // using OpenEXR's B44 compression method, check whether + // the differences between A and B are what we would + // expect from the compressor. + // + + // + // The block may not have been compressed at all if it + // was part of a very small tile. + // + + bool equal = true; + + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) + if (A[i][j] != B[i][j]) + equal = false; + + if (equal) + return true; + + // + // The block was compressed. + // + // Perform a "light" version of the B44 compression on A + // (see the pack() function in ImfB44Compressor.cpp). + // + + unsigned short t[16]; + + for (int i = 0; i < 16; ++i) + { + unsigned short Abits = A[i / 4][i % 4].bits(); + + if ((Abits & 0x7c00) == 0x7c00) + t[i] = 0x8000; + else if (Abits & 0x8000) + t[i] = ~Abits; + else + t[i] = Abits | 0x8000; + } + + unsigned short tMax = 0; + + for (int i = 0; i < 16; ++i) + if (tMax < t[i]) + tMax = t[i]; + + int shift = -1; + int d[16]; + int r[15]; + int rMin; + int rMax; + + do + { + shift += 1; + + for (int i = 0; i < 16; ++i) + d[i] = shiftAndRound (tMax - t[i], shift); + + const int bias = 0x20; + + r[ 0] = d[ 0] - d[ 4] + bias; + r[ 1] = d[ 4] - d[ 8] + bias; + r[ 2] = d[ 8] - d[12] + bias; + + r[ 3] = d[ 0] - d[ 1] + bias; + r[ 4] = d[ 4] - d[ 5] + bias; + r[ 5] = d[ 8] - d[ 9] + bias; + r[ 6] = d[12] - d[13] + bias; + + r[ 7] = d[ 1] - d[ 2] + bias; + r[ 8] = d[ 5] - d[ 6] + bias; + r[ 9] = d[ 9] - d[10] + bias; + r[10] = d[13] - d[14] + bias; + + r[11] = d[ 2] - d[ 3] + bias; + r[12] = d[ 6] - d[ 7] + bias; + r[13] = d[10] - d[11] + bias; + r[14] = d[14] - d[15] + bias; + + rMin = r[0]; + rMax = r[0]; + + for (int i = 1; i < 15; ++i) + { + if (rMin > r[i]) + rMin = r[i]; + + if (rMax < r[i]) + rMax = r[i]; + } + } + while (rMin < 0 || rMax > 0x3f); + + t[0] = tMax - (d[0] << shift); + + // + // Now perform a "light" version of the decompression method. + // (see the unpack() function in ImfB44Compressor.cpp). + // + + unsigned short A1[16]; + const int bias = 0x20 << shift; + + A1[ 0] = t[ 0]; + A1[ 4] = A1[ 0] + (r[ 0] << shift) - bias; + A1[ 8] = A1[ 4] + (r[ 1] << shift) - bias; + A1[12] = A1[ 8] + (r[ 2] << shift) - bias; + + A1[ 1] = A1[ 0] + (r[ 3] << shift) - bias; + A1[ 5] = A1[ 4] + (r[ 4] << shift) - bias; + A1[ 9] = A1[ 8] + (r[ 5] << shift) - bias; + A1[13] = A1[12] + (r[ 6] << shift) - bias; + + A1[ 2] = A1[ 1] + (r[ 7] << shift) - bias; + A1[ 6] = A1[ 5] + (r[ 8] << shift) - bias; + A1[10] = A1[ 9] + (r[ 9] << shift) - bias; + A1[14] = A1[13] + (r[10] << shift) - bias; + + A1[ 3] = A1[ 2] + (r[11] << shift) - bias; + A1[ 7] = A1[ 6] + (r[12] << shift) - bias; + A1[11] = A1[10] + (r[13] << shift) - bias; + A1[15] = A1[14] + (r[14] << shift) - bias; + + // + // Compare the result with B, allowing for an difference + // of a couple of units in the last place. + // + + for (int i = 0; i < 16; ++i) + { + unsigned short A1bits = A1[i]; + unsigned short Bbits = B[i / 4][i % 4].bits(); + + if (Bbits & 0x8000) + Bbits = ~Bbits; + else + Bbits = Bbits | 0x8000; + + if (Bbits > A1bits + 5 || Bbits < A1bits - 5) + return false; + } + + return true; +} + + +void +compareB44 (int width, + int height, + const Array2D &p1, + const Array2D &p2) +{ + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + half A[4][4]; + half B[4][4]; + + for (int y1 = 0; y1 < 4; ++y1) + { + for (int x1 = 0; x1 < 4; ++x1) + { + int y2 = min (y + y1, height - 1); + int x2 = min (x + x1, width - 1); + A[y1][x1] = p1[y2][x2]; + B[y1][x1] = p2[y2][x2]; + } + } + + assert (withinB44ErrorBounds (A, B)); + } + } +} + + +void +compareB44 (int width, + int height, + const Array2D &p1, + const Array2D &p2, + RgbaChannels channels) +{ + if (channels & WRITE_R) + { + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + half A[4][4]; + half B[4][4]; + + for (int y1 = 0; y1 < 4; ++y1) + { + for (int x1 = 0; x1 < 4; ++x1) + { + int y2 = min (y + y1, height - 1); + int x2 = min (x + x1, width - 1); + A[y1][x1] = p1[y2][x2].r; + B[y1][x1] = p2[y2][x2].r; + } + } + + assert (withinB44ErrorBounds (A, B)); + } + } + } + else + { + for (int y = 0; y < height; y += 1) + for (int x = 0; x < width; x += 1) + assert (p2[y][x].r == 0); + } + + if (channels & WRITE_G) + { + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + half A[4][4]; + half B[4][4]; + + for (int y1 = 0; y1 < 4; ++y1) + { + for (int x1 = 0; x1 < 4; ++x1) + { + int y2 = min (y + y1, height - 1); + int x2 = min (x + x1, width - 1); + A[y1][x1] = p1[y2][x2].g; + B[y1][x1] = p2[y2][x2].g; + } + } + + assert (withinB44ErrorBounds (A, B)); + } + } + } + else + { + for (int y = 0; y < height; y += 1) + for (int x = 0; x < width; x += 1) + assert (p2[y][x].g == 0); + } + + if (channels & WRITE_B) + { + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + half A[4][4]; + half B[4][4]; + + for (int y1 = 0; y1 < 4; ++y1) + { + for (int x1 = 0; x1 < 4; ++x1) + { + int y2 = min (y + y1, height - 1); + int x2 = min (x + x1, width - 1); + A[y1][x1] = p1[y2][x2].b; + B[y1][x1] = p2[y2][x2].b; + } + } + + assert (withinB44ErrorBounds (A, B)); + } + } + } + else + { + for (int y = 0; y < height; y += 1) + for (int x = 0; x < width; x += 1) + assert (p2[y][x].b == 0); + } + + if (channels & WRITE_A) + { + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + half A[4][4]; + half B[4][4]; + + for (int y1 = 0; y1 < 4; ++y1) + { + for (int x1 = 0; x1 < 4; ++x1) + { + int y2 = min (y + y1, height - 1); + int x2 = min (x + x1, width - 1); + A[y1][x1] = p1[y2][x2].a; + B[y1][x1] = p2[y2][x2].a; + } + } + + assert (withinB44ErrorBounds (A, B)); + } + } + } + else + { + for (int y = 0; y < height; y += 1) + for (int x = 0; x < width; x += 1) + assert (p2[y][x].a == 1); + } +} diff --git a/IlmImfTest/compareB44.h b/IlmImfTest/compareB44.h new file mode 100644 index 0000000..18f9b6e --- /dev/null +++ b/IlmImfTest/compareB44.h @@ -0,0 +1,54 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// +#include "ImfNamespace.h" + +#include +#include + +bool withinB44ErrorBounds (const half A[4][4], const half B[4][4]); + +void compareB44 (int width, + int height, + const OPENEXR_IMF_NAMESPACE::Array2D &p1, + const OPENEXR_IMF_NAMESPACE::Array2D &p2); + +void compareB44 (int width, + int height, + const OPENEXR_IMF_NAMESPACE::Array2D &p1, + const OPENEXR_IMF_NAMESPACE::Array2D &p2, + OPENEXR_IMF_NAMESPACE::RgbaChannels channels); diff --git a/IlmImfTest/compareDwa.cpp b/IlmImfTest/compareDwa.cpp new file mode 100644 index 0000000..f64c746 --- /dev/null +++ b/IlmImfTest/compareDwa.cpp @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "half.h" +#include "compareDwa.h" + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + +// +// Convert from linear to a nonlinear representation, +// + +half +toNonlinear(half linear) +{ + float sign = 1; + float logBase = pow(2.7182818, 2.2); + + if ((float)linear < 0) { + sign = -1; + } + + if ((linear.bits() & 0x7c00) == 0x7c00) { + return (half)0.0; + } + + if ( fabs( (float)linear ) <= 1.0f) { + return (half)(sign * pow(fabs((float)linear), 1.f/2.2f)); + } else { + return (half)(sign * ( log(fabs((float)linear)) / log(logBase) + 1.0f) ); + } + + return (half)0.0f; +} + + +void +compareDwa(int width, + int height, + const Array2D &src, + const Array2D &test, + RgbaChannels channels) +{ + half srcNonlin, testNonlin; + float relError; + + for (int y=0; y &src, + const OPENEXR_IMF_NAMESPACE::Array2D &test, + OPENEXR_IMF_NAMESPACE::RgbaChannels channels); + +#endif diff --git a/IlmImfTest/compareFloat.cpp b/IlmImfTest/compareFloat.cpp new file mode 100644 index 0000000..179dfa4 --- /dev/null +++ b/IlmImfTest/compareFloat.cpp @@ -0,0 +1,68 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "compareFloat.h" + +using namespace OPENEXR_IMF_NAMESPACE; + +bool +equivalent (float f1, float f2, Compression comp) +{ + // + // Test if a float, f1, is "equivalent" to another float, f2, + // which results from storing f1 in an image file, and reading + // it back: + // If the file was compressed with PXR24_COMPRESSION, then f1 + // and f2 must the same as f1 rounded to 24 bits (see class + // ImfPxr24Compressor); otherwise f1 and f2 must be the same. + // + + union + { + float f; + unsigned int i; + } u1, u2; + + u1.f = f1; + u2.f = f2; + + if (comp == PXR24_COMPRESSION) + return (u2.i >> 8) - (u1.i >> 8) < 2; + else + return u2.i == u1.i; +} diff --git a/IlmImfTest/compareFloat.h b/IlmImfTest/compareFloat.h new file mode 100644 index 0000000..f7fb877 --- /dev/null +++ b/IlmImfTest/compareFloat.h @@ -0,0 +1,42 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// +#include "ImfNamespace.h" +#include "ImfCompression.h" + +bool equivalent (float f1, float f2, OPENEXR_IMF_NAMESPACE::Compression comp); + diff --git a/IlmImfTest/invalid.exr b/IlmImfTest/invalid.exr new file mode 100644 index 0000000..abf955d --- /dev/null +++ b/IlmImfTest/invalid.exr @@ -0,0 +1,2 @@ +this is not a valid EXR file + diff --git a/IlmImfTest/invalid_shared_attrs_multipart.exr b/IlmImfTest/invalid_shared_attrs_multipart.exr new file mode 100644 index 0000000..236c40a Binary files /dev/null and b/IlmImfTest/invalid_shared_attrs_multipart.exr differ diff --git a/IlmImfTest/lineOrder_decreasing.exr b/IlmImfTest/lineOrder_decreasing.exr new file mode 100644 index 0000000..cc95ecc Binary files /dev/null and b/IlmImfTest/lineOrder_decreasing.exr differ diff --git a/IlmImfTest/lineOrder_increasing.exr b/IlmImfTest/lineOrder_increasing.exr new file mode 100644 index 0000000..6d7ed0c Binary files /dev/null and b/IlmImfTest/lineOrder_increasing.exr differ diff --git a/IlmImfTest/main.cpp b/IlmImfTest/main.cpp new file mode 100644 index 0000000..f8e238a --- /dev/null +++ b/IlmImfTest/main.cpp @@ -0,0 +1,236 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2013, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImfNamespace.h" + +#include "testXdr.h" +#include "testMagic.h" +#include "testHuf.h" +#include "testWav.h" +#include "testChannels.h" +#include "testAttributes.h" +#include "testCustomAttributes.h" +#include "testLineOrder.h" +#include "testCompression.h" +#include "testCopyPixels.h" +#include "testRgba.h" +#include "testRgbaThreading.h" +#include "testLut.h" +#include "testSampleImages.h" +#include "testPreviewImage.h" +#include "testConversion.h" +#include "testStandardAttributes.h" +#include "testNativeFormat.h" +#include "testTiledRgba.h" +#include "testTiledCompression.h" +#include "testTiledCopyPixels.h" +#include "testTiledLineOrder.h" +#include "testScanLineApi.h" +#include "testExistingStreams.h" +#include "testYca.h" +#include "testTiledYa.h" +#include "testIsComplete.h" +#include "testSharedFrameBuffer.h" +#include "testMultiView.h" +#include "testMultiPartApi.h" +#include "testMultiPartSharedAttributes.h" +#include "testMultiPartThreading.h" +#include "testMultiScanlinePartThreading.h" +#include "testMultiTiledPartThreading.h" +#include "testDeepScanLineBasic.h" +#include "testCopyDeepScanLine.h" +#include "testDeepScanLineMultipleRead.h" +#include "testDeepScanLineHuge.h" +#include "testDeepTiledBasic.h" +#include "testCopyDeepTiled.h" +#include "testCompositeDeepScanLine.h" +#include "testMultiPartFileMixingBasic.h" +#include "testInputPart.h" +#include "testBackwardCompatibility.h" +#include "testCopyMultiPartFile.h" +#include "testPartHelper.h" +#include "testOptimized.h" +#include "testOptimizedInterleavePatterns.h" +#include "testBadTypeAttributes.h" +#include "testFutureProofing.h" +#include "testPartHelper.h" +#include "testDwaCompressorSimd.h" +#include "testRle.h" + +#include "tmpDir.h" +#include "ImathRandom.h" + +// system includes + +#include +#include +#include +#include +#include + +#if defined(OPENEXR_IMF_HAVE_LINUX_PROCFS) || defined(OPENEXR_IMF_HAVE_DARWIN) + #include + #include +#endif + +using namespace std; + +#define TEST(x,y) \ + if (argc < 2 || (!strcmp (argv[1], #x) || !strcmp (argv[1], y))) \ + { \ + cout << "\n=======\nRunning " << #x < + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; + +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &pf, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + pf[y][x] = x % 10 + 10 * (y % 17); +} + + +void +writeReadAttr (const Array2D &pf1, + const char fileName[], + int width, + int height) +{ + // + // We don't test ChannelList, LineOrder, Compression and opaque + // attributes here; those types are covered by other tests. + // + + Box2i a1 (V2i (1, 2), V2i (3, 4)); + Box2f a2 (V2f (1.5, 2.5), V2f (3.5, 4.5)); + float a3 (3.14159); + int a4 (17); + M33f a5 (11, 12, 13, 14, 15, 16, 17, 18, 19); + M44f a6 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + string a7 ("extensive rebuilding by Nebuchadrezzar has left"); + V2i a8 (27, 28); + V2f a9 (27.5, 28.5); + V3i a10 (37, 38, 39); + V3f a11 (37.5, 38.5, 39.5); + double a12 (7.12342341419); + Chromaticities a13 (V2f (1, 2), V2f (3, 4), V2f (5, 6), V2f (7, 8)); + Envmap a14 (ENVMAP_CUBE); + + StringVector a15; + a15.push_back ("who can spin"); + a15.push_back (""); + a15.push_back ("straw into"); + a15.push_back ("gold"); + M33d a16 (12, 13, 14, 15, 16, 17, 18, 19, 20); + M44d a17 (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17); + V2d a18 (27.51, 28.51); + V3d a19 (37.51, 38.51, 39.51); + + StringVector a20; + + DeepImageState a21 (DIS_TIDY); + + FloatVector a22; + FloatVector a23; + a23.push_back (1.5f); + a23.push_back (-1.5f); + a23.push_back (15.0f); + a23.push_back (150.0f); + + // + // Write an image file with extra attributes in the header + // + + { + Header hdr (width, height); + + hdr.insert ("a1", Box2iAttribute (a1)); + hdr.insert ("a2", Box2fAttribute (a2)); + hdr.insert ("a3", FloatAttribute (a3)); + hdr.insert ("a4", IntAttribute (a4)); + hdr.insert ("a5", M33fAttribute (a5)); + hdr.insert ("a6", M44fAttribute (a6)); + hdr.insert ("a7", StringAttribute (a7)); + hdr.insert ("a8", V2iAttribute (a8)); + hdr.insert ("a9", V2fAttribute (a9)); + hdr.insert ("a10", V3iAttribute (a10)); + hdr.insert ("a11", V3fAttribute (a11)); + hdr.insert ("a12", DoubleAttribute (a12)); + hdr.insert ("a13", ChromaticitiesAttribute (a13)); + hdr.insert ("a14", EnvmapAttribute (a14)); + hdr.insert ("a15", StringVectorAttribute (a15)); + hdr.insert ("a16", M33dAttribute (a16)); + hdr.insert ("a17", M44dAttribute (a17)); + hdr.insert ("a18", V2dAttribute (a18)); + hdr.insert ("a19", V3dAttribute (a19)); + hdr.insert ("a20", StringVectorAttribute (a20)); + hdr.insert ("a21", DeepImageStateAttribute (a21)); + hdr.insert ("a22", FloatVectorAttribute (a22)); + hdr.insert ("a23", FloatVectorAttribute (a23)); + + hdr.channels().insert ("F", // name + Channel (IMF::FLOAT, // type + 1, // xSampling + 1) // ySampling + ); + + FrameBuffer fb; + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[0][0], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + // + // Read the header back from the file, and see if the + // values of the extra attributes come back correctly. + // + + { + cout << " reading" << flush; + + InputFile in (fileName); + + cout << " (version " << in.version() << ")" << flush; + + const Header &hdr = in.header(); + + assert (hdr.typedAttribute ("a1").value() == a1); + assert (hdr.typedAttribute ("a2").value() == a2); + assert (hdr.typedAttribute ("a3").value() == a3); + assert (hdr.typedAttribute ("a4").value() == a4); + assert (hdr.typedAttribute ("a5").value() == a5); + assert (hdr.typedAttribute ("a6").value() == a6); + assert (hdr.typedAttribute ("a7").value() == a7); + assert (hdr.typedAttribute ("a8").value() == a8); + assert (hdr.typedAttribute ("a9").value() == a9); + assert (hdr.typedAttribute ("a10").value() == a10); + assert (hdr.typedAttribute ("a11").value() == a11); + assert (hdr.typedAttribute ("a12").value() == a12); + + assert (hdr.typedAttribute + ("a13").value().red == a13.red); + + assert (hdr.typedAttribute + ("a13").value().green == a13.green); + + assert (hdr.typedAttribute + ("a13").value().blue == a13.blue); + + assert (hdr.typedAttribute + ("a13").value().white == a13.white); + + assert (hdr.typedAttribute ("a14").value() == a14); + + assert (hdr.typedAttribute + ("a15").value().size() == 4); + + assert (hdr.typedAttribute + ("a15").value()[0] == "who can spin"); + + assert (hdr.typedAttribute + ("a15").value()[1] == ""); + + assert (hdr.typedAttribute + ("a15").value()[2] == "straw into"); + + assert (hdr.typedAttribute + ("a15").value()[3] == "gold"); + + assert (hdr.typedAttribute ("a16").value() == a16); + assert (hdr.typedAttribute ("a17").value() == a17); + assert (hdr.typedAttribute ("a18").value() == a18); + assert (hdr.typedAttribute ("a19").value() == a19); + + assert (hdr.typedAttribute + ("a20").value() == a20); + + assert (hdr.typedAttribute + ("a21").value() == a21); + + assert (hdr.typedAttribute + ("a22").value() == a22); + + assert (hdr.typedAttribute + ("a23").value() == a23); + } + + remove (fileName); + cout << endl; +} + + +void +channelList () +{ + cout << "channel list" << endl; + + { + // test channelsWithPrefix() + + ChannelList channels; + + channels.insert ("b0", Channel (IMF::HALF, 1, 1)); + channels.insert ("b1", Channel (IMF::HALF, 1, 1)); + channels.insert ("b2", Channel (IMF::HALF, 1, 1)); + channels.insert ("d3", Channel (IMF::HALF, 1, 1)); + channels.insert ("e4", Channel (IMF::HALF, 1, 1)); + + ChannelList::Iterator first; + ChannelList::Iterator last; + + channels.channelsWithPrefix ("a", first, last); + assert (first != channels.end()); + assert (first == last); + + channels.channelsWithPrefix ("b", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("b0")); + assert (first++.name() == Name ("b1")); + assert (first++.name() == Name ("b2")); + assert (first == last); + + channels.channelsWithPrefix ("b1", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("b1")); + assert (first == last); + + channels.channelsWithPrefix ("b11", first, last); + assert (first != channels.end()); + assert (first == last); + + channels.channelsWithPrefix ("c", first, last); + assert (first != channels.end()); + assert (first == last); + + channels.channelsWithPrefix ("d", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("d3")); + assert (first == last); + + channels.channelsWithPrefix ("e", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("e4")); + assert (first == last); + + channels.channelsWithPrefix ("f", first, last); + assert (first == channels.end()); + assert (first == last); + } + + { + // Test support for layers + + ChannelList channels; + + channels.insert ("a", Channel (IMF::HALF, 1, 1)); + channels.insert (".a", Channel (IMF::HALF, 1, 1)); + channels.insert ("a.", Channel (IMF::HALF, 1, 1)); + + channels.insert ("layer1.R", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer1.G", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer1.B", Channel (IMF::HALF, 1, 1)); + + channels.insert ("layer1.sublayer1.AA", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer1.sublayer1.R", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer1.sublayer1.G", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer1.sublayer1.B", Channel (IMF::HALF, 1, 1)); + + channels.insert ("layer1.sublayer2.R", Channel (IMF::HALF, 1, 1)); + + channels.insert ("layer2.R", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer2.G", Channel (IMF::HALF, 1, 1)); + channels.insert ("layer2.B", Channel (IMF::HALF, 1, 1)); + + set layerNames; + channels.layers (layerNames); + + set::iterator i = layerNames.begin(); + assert (*i++ == "layer1"); + assert (*i++ == "layer1.sublayer1"); + assert (*i++ == "layer1.sublayer2"); + assert (*i++ == "layer2"); + assert (i == layerNames.end()); + + ChannelList::ConstIterator first, last; + + channels.channelsInLayer ("layer1.sublayer1", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("layer1.sublayer1.AA")); + assert (first++.name() == Name ("layer1.sublayer1.B")); + assert (first++.name() == Name ("layer1.sublayer1.G")); + assert (first++.name() == Name ("layer1.sublayer1.R")); + assert (first == last); + + channels.channelsInLayer ("layer2", first, last); + assert (first != channels.end()); + assert (first != last); + assert (first++.name() == Name ("layer2.B")); + assert (first++.name() == Name ("layer2.G")); + assert (first++.name() == Name ("layer2.R")); + assert (first == last); + } +} + + +void +longNames (const Array2D &pf1, + const char fileName[], + int width, + int height) +{ + // + // Verify that long attibute or channel names in the header + // set the LONG_NAMES_FLAG in the file version number. + // + + FrameBuffer fb; + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[0][0], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << "only short names" << endl; + + { + Header hdr (width, height); + + hdr.channels().insert ("F", // name + Channel (IMF::FLOAT, // type + 1, // xSampling + 1) // ySampling + ); + + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " reading" << endl; + + InputFile in (fileName); + assert (!(in.version() & LONG_NAMES_FLAG)); + } + + static const char longName[] = "x2345678901234567890123456789012"; + + cout << "long attribute name" << endl; + + { + Header hdr (width, height); + hdr.insert (longName, StringAttribute ("y")); + + hdr.channels().insert ("F", // name + Channel (IMF::FLOAT, // type + 1, // xSampling + 1) // ySampling + ); + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " reading" << endl; + + InputFile in (fileName); + assert (in.version() & LONG_NAMES_FLAG); + + const Header &hdr = in.header(); + assert (hdr.typedAttribute (longName).value() == "y"); + } + + cout << "long channel name" << endl; + + { + Header hdr (width, height); + + hdr.channels().insert (longName, // name + Channel (IMF::FLOAT, // type + 1, // xSampling + 1) // ySampling + ); + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " reading" << endl; + + InputFile in (fileName); + assert (in.version() & LONG_NAMES_FLAG); + + const Header &hdr = in.header(); + assert (hdr.channels().findChannel (longName)); + } + + remove (fileName); + cout << endl; +} + + +} // namespace + + +template void +print_type(const OPENEXR_IMF_NAMESPACE::TypedAttribute & object) +{ + cout << object.typeName() << endl; +} + +void +testAttributes (const std::string &tempDir) +{ + try + { + cout << "Testing built-in attributes" << endl; + + const int W = 217; + const int H = 197; + + Array2D pf (H, W); + fillPixels (pf, W, H); + + std::string filename = tempDir + "imf_test_attr.exr"; + + writeReadAttr (pf, filename.c_str(), W, H); + channelList(); + longNames(pf, filename.c_str(), W, H); + + print_type(OPENEXR_IMF_NAMESPACE::TypedAttribute()); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testAttributes.h b/IlmImfTest/testAttributes.h new file mode 100644 index 0000000..bc733b7 --- /dev/null +++ b/IlmImfTest/testAttributes.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testAttributes (const std::string &tempDir); + diff --git a/IlmImfTest/testBackwardCompatibility.cpp b/IlmImfTest/testBackwardCompatibility.cpp new file mode 100644 index 0000000..9035e98 --- /dev/null +++ b/IlmImfTest/testBackwardCompatibility.cpp @@ -0,0 +1,393 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testBackwardCompatibility.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif // WIN32 + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; +using namespace std; + + +namespace { + +// +// Make this true if you wish to generate images when building +// the v1.7 code base. +// +const int generateImagesOnly = false; + + +const int W = 217; +const int H = 197; + + + + +void +diffImageFiles (const char * fn1, const char * fn2) +{ + ifstream i1 (fn1, ios::binary); + ifstream i2 (fn2, ios::binary); + + if(!i1.good()){THROW (IEX_NAMESPACE::BaseExc, string("cannot open ") + string(fn1));} + if(!i2.good()){THROW (IEX_NAMESPACE::BaseExc, string("cannot open ") + string(fn2));} + + while (!i1.eof() && !i2.eof()) + { + if (i1.get() != i2.get()) + { + string e = string ("v1.7 and current differences between '") + + string (fn1) + string ("' & '") + string (fn2) + + string ("'"); + THROW (IEX_NAMESPACE::BaseExc, e); + } + } +} + +void +addPreviewImageToHeader (OPENEXR_IMF_NAMESPACE::Header & hdr) +{ + size_t pW = 32; + size_t pH = 32; + + OPENEXR_IMF_NAMESPACE::Array2D previewPixels (pW, pH); + for (size_t h=0; h pf (H, W); pf.resizeErase(H, W); + Array2D ph (H, W); ph.resizeErase(H, W); + + for (int i = 0; i < H; i++) + { + for (int j = 0; j < W; j++) + { + pf[i][j] = (float)((i * W + j) / (float(W*H))); + ph[i][j] = (half)(pf[i][j]); + } + } + + IMATH_NAMESPACE::Box2i dod (IMATH_NAMESPACE::V2f(20), IMATH_NAMESPACE::V2f(W-20, H-23)); + OPENEXR_IMF_NAMESPACE::Header header = Header (W, H, dod); + header.channels().insert("Z", Channel(IMF::FLOAT)); + header.channels().insert("R", Channel(IMF::HALF)); + header.channels().insert("G", Channel(IMF::HALF)); + header.channels().insert("B", Channel(IMF::HALF)); + addUserAttributesToHeader (header); + + FrameBuffer fb; + + fb.insert ("Z", + Slice (IMF::FLOAT, + (char *) &pf[0][0], + sizeof (pf[0][0]), + sizeof (pf[0][0]) * W)); + + fb.insert ("R", + Slice (IMF::HALF, + (char *) &ph[0][0], + sizeof (ph[0][0]), + sizeof (ph[0][0]) * W)); + fb.insert ("G", + Slice (IMF::HALF, + (char *) &ph[0][0], + sizeof (ph[0][0]), + sizeof (ph[0][0]) * W)); + fb.insert ("B", + Slice (IMF::HALF, + (char *) &ph[0][0], + sizeof (ph[0][0]), + sizeof (ph[0][0]) * W)); + + OutputFile file (fn, header); + file.setFrameBuffer (fb); + file.writePixels (H-40); +} + +struct RZ +{ + float z; + half g; +}; + +void +generateScanlineInterleavedImage (const char * fn) +{ + // generate a v 1.7 image and check against ground truth on disk + Array2D rz (H, W); rz.resizeErase(H, W); + + for (int i = 0; i < H; i++) + { + for (int j = 0; j < W; j++) + { + rz[i][j].z = (float)((i * W + j) / (float(W*H))); + rz[i][j].g = (half)(rz[i][j].z); + } + } + + IMATH_NAMESPACE::Box2i dod (IMATH_NAMESPACE::V2f(20), IMATH_NAMESPACE::V2f(W-20, H-23)); + OPENEXR_IMF_NAMESPACE::Header header = Header (W, H, dod); + header.channels().insert("Z", Channel(IMF::FLOAT)); + header.channels().insert("R", Channel(IMF::HALF)); + addUserAttributesToHeader (header); + + FrameBuffer fb; + + fb.insert ("Z", + Slice (IMF::FLOAT, + (char *) &(rz[0][0].z), + sizeof (rz[0][0]), + sizeof (rz[0][0]) * W)); + + fb.insert ("G", + Slice (IMF::HALF, + (char *) &(rz[0][0].g), + sizeof (rz[0][0]), + sizeof (rz[0][0]) * W)); + + OutputFile file (fn, header); + file.setFrameBuffer (fb); + file.writePixels (H-40); +} + +void +diffScanlineImages (const std::string & planarScanlineName, + const std::string & interleavedScanlineName) +{ + // Planar Images + generateScanlinePlanarImage (planarScanlineName.c_str()); + diffImageFiles (planarScanlineName.c_str(), + ILM_IMF_TEST_IMAGEDIR "v1.7.test.planar.exr"); + + // Interleaved Images + generateScanlineInterleavedImage (interleavedScanlineName.c_str()); + diffImageFiles (interleavedScanlineName.c_str(), + ILM_IMF_TEST_IMAGEDIR "v1.7.test.interleaved.exr"); +} + + +void +generateTiledImage (const char * fn) +{ + Array2D rz (H, W); rz.resizeErase(H, W); + + for (int i = 0; i < H; i++) + { + for (int j = 0; j < W; j++) + { + rz[i][j].z = (float)((i * W + j) / (float(W*H))); + rz[i][j].g = (half)(rz[i][j].z); + } + } + + Header header (W, H); + header.channels().insert ("G", Channel (IMF::HALF)); + header.channels().insert ("Z", Channel (IMF::FLOAT)); + + int tileW = 12; + int tileH = 24; + header.setTileDescription (TileDescription (tileW, tileH, ONE_LEVEL)); + + OPENEXR_IMF_NAMESPACE::TiledOutputFile out (fn, header); + OPENEXR_IMF_NAMESPACE::FrameBuffer frameBuffer; // 6 + frameBuffer.insert ("G", + Slice (IMF::HALF, + (char *) &rz[0][0].g, + sizeof (rz[0][0]) * 1, + sizeof (rz[0][0]) * W)); + + frameBuffer.insert ("Z", + Slice (IMF::FLOAT, + (char *) &rz[0][0].z, + sizeof (rz[0][0]) * 1, + sizeof (rz[0][0]) * W)); + + out.setFrameBuffer (frameBuffer); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); +} + + +void +diffTiledImages (const std::string & fn) +{ + // Planar Images + generateTiledImage (fn.c_str()); + diffImageFiles (fn.c_str(), ILM_IMF_TEST_IMAGEDIR "v1.7.test.tiled.exr"); +} + + +} // namespace + + +void +testBackwardCompatibility (const std::string & tempDir) +{ + try + { + cout << "Testing backward compatibility" << endl; + + + // Run this code with the 1.7 code base to generate the + // images used in the test. + if (generateImagesOnly) + { + generateScanlinePlanarImage ("v1.7.test.planar.exr"); + generateScanlineInterleavedImage ("v1.7.test.interleaved.exr"); + generateTiledImage ("v1.7.test.tiled.exr"); + } + else + { + std::string planarFn = tempDir + "v1.7.test.planar.exr"; + std::string interleavedFn = tempDir + "v1.7.test.interleaved.exr"; + diffScanlineImages (planarFn, interleavedFn); + + std::string fn = tempDir + "v1.7.test.tiled.exr"; + diffTiledImages (fn); + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testBackwardCompatibility.h b/IlmImfTest/testBackwardCompatibility.h new file mode 100644 index 0000000..234390a --- /dev/null +++ b/IlmImfTest/testBackwardCompatibility.h @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef TESTBACKWARDCOMPATIBILITY_H_ +#define TESTBACKWARDCOMPATIBILITY_H_ + +#include + +void testBackwardCompatibility (const std::string & tempDir); + +#endif /* TESTBACKWARDCOMPATIBILITY_H_ */ diff --git a/IlmImfTest/testBadTypeAttributes.cpp b/IlmImfTest/testBadTypeAttributes.cpp new file mode 100644 index 0000000..dc48ab5 --- /dev/null +++ b/IlmImfTest/testBadTypeAttributes.cpp @@ -0,0 +1,373 @@ + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfInputFile.h" +#include "ImfInputPart.h" +#include "ImfTiledInputFile.h" +#include "ImfTiledInputPart.h" + +#include "ImfDeepScanLineInputFile.h" +#include "ImfDeepScanLineInputPart.h" +#include "ImfDeepTiledInputFile.h" +#include "ImfDeepTiledInputPart.h" + +#include "ImfChannelList.h" +#include "ImfMultiPartInputFile.h" +#include "ImfPartType.h" +#include +#include + +#include + +#include "tmpDir.h" + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + +namespace +{ + + +void doFrameBuffer(vector& storage, const Header & hdr,FrameBuffer& dummy) +{ + + int chans=0; + for( ChannelList::ConstIterator q =hdr.channels().begin() ; q!=hdr.channels().end() ; q++) + { + chans++; + } + + Box2i dw= hdr.dataWindow(); + + storage.resize( (dw.size().x+1)*(dw.size().y+1)*chans); + + int xstride = chans*sizeof(half); + int ystride = xstride*(dw.size().x+1); + int offset = ystride*dw.min.y + dw.min.x*xstride; + + int chan=0; + for( ChannelList::ConstIterator q = hdr.channels().begin() ; q!=hdr.channels().end() ; q++) + { + dummy.insert(q.name(),Slice(HALF,((char*) &storage[chan])-offset,xstride,ystride)); + chan++; + } + +} + +template void readTiledThing(T & input,bool test) +{ + vector value; + FrameBuffer dummy; + doFrameBuffer(value,input.header(),dummy); + input.setFrameBuffer(dummy); + int x_levels; + int y_levels; + + if(test && input.header().hasType()) + { + if(input.header().type()!=TILEDIMAGE) + { + std::cerr << "tiled image/part didn't have tiledimage type\n"; + //assert(input.type()==TILEDIMAGE); + } + } + + TileDescription t = input.header().tileDescription(); + switch(t.mode) + { + case ONE_LEVEL : + x_levels = 1; + y_levels = 1; + break; + case MIPMAP_LEVELS : + x_levels = input.numXLevels(); + y_levels = 1; + break; + case RIPMAP_LEVELS : + x_levels = input.numXLevels(); + y_levels = input.numYLevels(); + } + + for(int x_level = 0 ; x_level < x_levels ; x_level++) + { + for(int y_level = 0 ; y_level < y_levels ;y_level++) + { + // unless we are RIPMapped, the y_level=x_level, not 0 + int actual_y_level = t.mode==RIPMAP_LEVELS ? y_level : x_level; + + input.readTiles(0,input.numXTiles(x_level)-1,0,input.numYTiles(actual_y_level)-1,x_level,actual_y_level); + + } + } +} + + +template void readScanlineThing(T& input,bool test) +{ + + + if(test && input.header().hasType()) + { + if(input.header().type()!=SCANLINEIMAGE) + { + std::cerr << "tiled image/part didn't have tiledimage type\n"; + //assert(input.type()==TILEDIMAGE); + } + } + + vector value; + FrameBuffer dummy; + doFrameBuffer(value,input.header(),dummy); + input.setFrameBuffer(dummy); + input.readPixels(input.header().dataWindow().min.x,input.header().dataWindow().max.x); +} + +void checkDeepTypesFailToLoad(const char * file) +{ + + // trying to open it as a deep tiled file should fail + try{ + DeepTiledInputFile f(file); + assert(false); + }catch(...) + { + } + // trying to open it as a deep tiled part of a multipart file should fail + try{ + MultiPartInputFile multiin(file); + DeepTiledInputPart p(multiin,0); + assert(false); + }catch(...) + { + } + + // trying to open it as a deep scanline file should fail + try{ + DeepScanLineInputFile f(file); + assert(false); + }catch(...) + { + + } + // trying to open it as a deep scanline part of a multipart file should fail + try{ + MultiPartInputFile multiin(file); + DeepScanLineInputPart p(multiin,0); + assert(false); + }catch(...) + { + + } + +} + + +void testTiledWithBadAttribute(const char* file) +{ + // it's a tiled file, so it should read as a file + TiledInputFile in(file); + readTiledThing(in,false); + + { + // it should also read using the multipart API (and have its attribute fixed) + MultiPartInputFile multiin(file); + TiledInputPart tip(multiin,0); + readTiledThing(tip,true); + + // it should also read using the regular file API as a scanline file + InputFile sin(file); + readScanlineThing(sin,false); + + } + { + // it should also read using the multipart API as a scanline file + MultiPartInputFile multiin(file); + + InputPart ip(multiin,0); + readScanlineThing(ip,false); + } + + checkDeepTypesFailToLoad(file); + +} + +void testScanLineWithBadAttribute(const char * file) +{ + InputFile in(file); + readScanlineThing(in,false); + + MultiPartInputFile multiin(file); + InputPart ip(multiin,0); + readScanlineThing(ip,false); + + + checkDeepTypesFailToLoad(file); + + // trying to open it as a tiled file should also fail + try{ + TiledInputFile f(file); + assert(false); + }catch(...) + { + } + // trying to open it as a tiled part of a multipart file should fail + try{ + MultiPartInputFile multiin(file); + TiledInputPart p(multiin,0); + assert(false); + }catch(...) + { + } +} + +const std::string & NOTYPEATTR=""; + +template void check(const char* filename,const string& inputtype,const string &outputtype,bool add_tiledesc) +{ + Header f; + + if(inputtype!=NOTYPEATTR) + { + f.setType(inputtype); + } + f.compression()=ZIPS_COMPRESSION; + if(add_tiledesc) + { + f.setTileDescription(TileDescription()); + } + + remove(filename); + { + OUT file(filename,f); + } + + { + IMF::MultiPartInputFile file(filename); + + if(outputtype!=NOTYPEATTR && file.header(0).type()!=outputtype) + { + cerr << "Error: expected type in header to be " << outputtype << " but got " << file.header(0).type() << " from multipart when input type was " << (inputtype==NOTYPEATTR ? "unset" : inputtype )<< std::endl; + } + + assert(outputtype==NOTYPEATTR || file.header(0).type()==outputtype); + } + + { + IN file(filename); + if(outputtype==NOTYPEATTR) + { + if(file.header().hasType()) + { + cerr << " type attribute got inserted when it shouldn't have been\n"; + } + + assert( !file.header().hasType() ); + + }else if(file.header().type()!=outputtype) + { + cerr << "Error: expected type in header to be " << outputtype << " but got " << file.header().type() << " when input type was " << (inputtype==NOTYPEATTR ? "unset" : inputtype )<< std::endl; + } + + } + remove(filename); +} + +void testWriteBadTypes() +{ + static const char* tmpfile = IMF_TMP_DIR "badfile.exr"; + + // attributes should be added automatically for deep files + check(tmpfile,NOTYPEATTR,DEEPSCANLINE,false); + check(tmpfile,NOTYPEATTR,DEEPTILE,true); + + // attributes should NOT be added automatically for normal images + check(tmpfile,NOTYPEATTR,NOTYPEATTR,false); + check(tmpfile,NOTYPEATTR,NOTYPEATTR,true); + check(tmpfile,NOTYPEATTR,NOTYPEATTR,true); + + + // if an attribute is provided, it should get changed to the correct one + check(tmpfile,SCANLINEIMAGE,SCANLINEIMAGE,false); + check(tmpfile,SCANLINEIMAGE,TILEDIMAGE,true); + check(tmpfile,SCANLINEIMAGE,TILEDIMAGE,true); + check(tmpfile,SCANLINEIMAGE,DEEPSCANLINE,false); + check(tmpfile,SCANLINEIMAGE,DEEPTILE,true); + + check(tmpfile,TILEDIMAGE,SCANLINEIMAGE,false); + check(tmpfile,TILEDIMAGE,TILEDIMAGE,true); + check(tmpfile,TILEDIMAGE,TILEDIMAGE,true); + check(tmpfile,TILEDIMAGE,DEEPSCANLINE,false); + check(tmpfile,TILEDIMAGE,DEEPTILE,true); + + check(tmpfile,DEEPSCANLINE,SCANLINEIMAGE,false); + check(tmpfile,DEEPSCANLINE,TILEDIMAGE,true); + check(tmpfile,DEEPSCANLINE,TILEDIMAGE,true); + check(tmpfile,DEEPSCANLINE,DEEPSCANLINE,false); + check(tmpfile,DEEPSCANLINE,DEEPTILE,true); + + check(tmpfile,DEEPTILE,SCANLINEIMAGE,false); + check(tmpfile,DEEPTILE,TILEDIMAGE,true); + check(tmpfile,DEEPTILE,TILEDIMAGE,true); + check(tmpfile,DEEPTILE,DEEPSCANLINE,false); + check(tmpfile,DEEPTILE,DEEPTILE,true); + +} + +} + +void testBadTypeAttributes(const std::string & tempDir) +{ + cout << "Testing whether bad type attributes are fixed on read... " << endl; + + testTiledWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "tiled_with_scanlineimage_type.exr"); + testTiledWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "tiled_with_deepscanline_type.exr"); + testTiledWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "tiled_with_deeptile_type.exr"); + + testScanLineWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "scanline_with_tiledimage_type.exr"); + testScanLineWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "scanline_with_deeptiled_type.exr"); + testScanLineWithBadAttribute (ILM_IMF_TEST_IMAGEDIR "scanline_with_deepscanline_type.exr"); + + cout << "Testing whether bad type attributes are fixed on write... " << endl; + + testWriteBadTypes(); + + cout << "ok\n" << endl; +} + diff --git a/IlmImfTest/testBadTypeAttributes.h b/IlmImfTest/testBadTypeAttributes.h new file mode 100644 index 0000000..5402d1a --- /dev/null +++ b/IlmImfTest/testBadTypeAttributes.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TEST_BAD_TYPE_ATTRIBUTES +#define TEST_BAD_TYPE_ATTRIBUTES + +#include + +void testBadTypeAttributes (const std::string & tempDir); + +#endif diff --git a/IlmImfTest/testChannels.cpp b/IlmImfTest/testChannels.cpp new file mode 100644 index 0000000..45a93a3 --- /dev/null +++ b/IlmImfTest/testChannels.cpp @@ -0,0 +1,260 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include +#include +#include +#include "half.h" + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + +namespace { + +void +fillPixels (Array2D &ph1, + Array2D &ph2, + int width, int height) +{ + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + ph1[y][x] = x % 10 + 10 * (y % 17); + ph2[y][x] = x % 11 + 11 * (y % 15); + } + } +} + + +void +writeRead (const Array2D &h1out, + const Array2D &h2out, + const char fileName[], + int width, + int height) +{ + // + // Write an image file with three channels, H1, H2 and H3. + // Our frame buffer contains pixel data only for H1 and H2; + // the file's H3 channel should be filled with zeroes. + // + + Header hdr (width, height); + + hdr.channels().insert ("H1", // name + Channel (HALF, // type + 1, // xSampling + 1) // ySampling + ); + + hdr.channels().insert ("H2", // name + Channel (HALF, // type + 1, // xSampling + 1) // ySampling + ); + + hdr.channels().insert ("H3", // name + Channel (HALF, // type + 1, // xSampling + 1) // ySampling + ); + + { + FrameBuffer fb; + + fb.insert ("H1", // name + Slice (HALF, // type + (char *) &h1out[0][0], // base + sizeof (h1out[0][0]), // xStride + sizeof (h1out[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + fb.insert ("H2", // name + Slice (HALF, // type + (char *) &h2out[0][0], // base + sizeof (h2out[0][0]), // xStride + sizeof (h2out[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + // + // Read the image back from the file. Our frame buffer now + // contains space for the three channels, H1, H3 and H4. + // H1 and H3 should be read back from the file (but H3 + // should contain only zeroes), and H4 should be filled + // with a default value, 3.0, because the file contains + // no data for it. The file's H2 channel should be ignored. + // + + { + cout << " reading" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D h1in (h, w); + Array2D h3in (h, w); + Array2D h4in (h, w); + + FrameBuffer fb; + + fb.insert ("H1", // name + Slice (HALF, // type + (char *) &h1in[-dy][-dx], // base + sizeof (h1in[0][0]), // xStride + sizeof (h1in[0][0]) * w, // yStride + 1, // xSampling + 1, // ySampling + 3.0) // fillValue + ); + + fb.insert ("H3", // name + Slice (HALF, // type + (char *) &h3in[-dy][-dx], // base + sizeof (h3in[0][0]), // xStride + sizeof (h3in[0][0]) * w, // yStride + 1, // xSampling + 1, // ySampling + 3.0) // fillValue + ); + + fb.insert ("H4", // name + Slice (HALF, // type + (char *) &h4in[-dy][-dx], // base + sizeof (h4in[0][0]), // xStride + sizeof (h4in[0][0]) * w, // yStride + 1, // xSampling + 1, // ySampling + 3.0) // fillValue + ); + + in.setFrameBuffer (fb); + in.readPixels (dw.min.y, dw.max.y); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (h1in[y][x] == h1out[y][x]); + assert (h3in[y][x] == 0.0); + assert (h4in[y][x] == 3.0); + } + } + } + + remove (fileName); + cout << endl; +} + + +} // namespace + + +void +testChannels (const std::string &tempDir) +{ + try + { + cout << "Testing filling of missing channels" << endl; + + const int W = 117; + const int H = 97; + + Array2D ph1 (H, W); + Array2D ph2 (H, W); + fillPixels (ph1, ph2, W, H); + + std::string filename = tempDir + "imf_test_channels.exr"; + + writeRead (ph1, ph2, filename.c_str(), W, H); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testChannels.h b/IlmImfTest/testChannels.h new file mode 100644 index 0000000..af84ca1 --- /dev/null +++ b/IlmImfTest/testChannels.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testChannels (const std::string &tempDir); + diff --git a/IlmImfTest/testCompositeDeepScanLine.cpp b/IlmImfTest/testCompositeDeepScanLine.cpp new file mode 100644 index 0000000..89f0344 --- /dev/null +++ b/IlmImfTest/testCompositeDeepScanLine.cpp @@ -0,0 +1,719 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testCompositeDeepScanLine.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + + +using std::vector; +using std::string; +using std::ostream; +using std::endl; +using std::cout; +using std::ostringstream; + + +using OPENEXR_IMF_NAMESPACE::DeepScanLineOutputFile; +using OPENEXR_IMF_NAMESPACE::MultiPartInputFile; +using OPENEXR_IMF_NAMESPACE::DeepScanLineOutputPart; +using OPENEXR_IMF_NAMESPACE::DeepScanLineInputPart; + +using OPENEXR_IMF_NAMESPACE::Header; +using OPENEXR_IMF_NAMESPACE::PixelType; +using OPENEXR_IMF_NAMESPACE::DeepFrameBuffer; +using OPENEXR_IMF_NAMESPACE::FrameBuffer; +using OPENEXR_IMF_NAMESPACE::FLOAT; +using OPENEXR_IMF_NAMESPACE::HALF; +using OPENEXR_IMF_NAMESPACE::UINT; +using OPENEXR_IMF_NAMESPACE::Slice; +using OPENEXR_IMF_NAMESPACE::DeepSlice; +using OPENEXR_IMF_NAMESPACE::MultiPartOutputFile; +using IMATH_NAMESPACE::Box2i; +using OPENEXR_IMF_NAMESPACE::DEEPSCANLINE; +using OPENEXR_IMF_NAMESPACE::ZIPS_COMPRESSION; +using OPENEXR_IMF_NAMESPACE::InputFile; +using OPENEXR_IMF_NAMESPACE::setGlobalThreadCount; +using OPENEXR_IMF_NAMESPACE::CompositeDeepScanLine; + +// a marker to say we've done inserting values into a sample: do mydata << end() +struct end{}; + +// a marker to say we're about to send the final result, not another sample: do mydata << result() +struct result{}; + + +// +// support class that generates deep data, along with the 'ground truth' +// result +// +template +class data +{ + public: + vector _channels; // channel names - same size and order as in all other arrays, + vector _current_result; // one value per channel: the ground truth value for the given pixel + vector >_results; // a list of result pixels + + + bool _inserting_result; + bool _started; // we've started to assemble the values - no more channels permitted + vector _current_sample; // one value per channel for the sample currently being inserted + vector< vector > _current_pixel; // a list of results for the current pixwel + vector< vector< vector > > _samples; // a list of pixels + PixelType _type; + + data() : _inserting_result(false),_started(false) + { + if(typeid(T)==typeid(half)) + { + _type = OPENEXR_IMF_NAMESPACE::HALF; + } + else + { + _type = OPENEXR_IMF_NAMESPACE::FLOAT; + } + } + + + // add a value to the current sample + data & operator << (float value) + { + if(_inserting_result) + { + _current_result.push_back(value); + }else{ + _current_sample.push_back(T(value)); + } + _started=true; + return *this; + } + + // switch between writing samples and the result + data & operator << (const result &) + { + if(_current_sample.size()!=0) + { + throw IEX_NAMESPACE::ArgExc("bug in test code: can't switch to inserting result: values written without 'end' statement"); + } + if(_current_result.size()!=0) + { + throw IEX_NAMESPACE::ArgExc("bug in test suite: already inserting result"); + } + _inserting_result=true; + return *this; + } + + // finalise the current sample/results + + data & operator << (const end &) + { + if(_inserting_result) + { + if(_current_result.size()!=_channels.size()) + { + throw IEX_NAMESPACE::ArgExc("bug in test suite: cannot end result: wrong number of values written"); + } + _results.push_back(_current_result); + _current_result.resize(0); + + // + // also cause the current_samples to be written as the given number of pixels + // + _samples.push_back(_current_pixel); + _current_pixel.resize(0); + _inserting_result=false; + } + else + { + if(_current_sample.size()!=_channels.size()) + { + throw IEX_NAMESPACE::ArgExc("bug in test suite: cannot end sample: wrong number of values written"); + } + _current_pixel.push_back(_current_sample); + _current_sample.resize(0); + } + return *this; + } + + // add a new channel + + data & operator << (const string & s) + { + if(_started) + { + throw IEX_NAMESPACE::ArgExc("bug in test suite: cannot insert new channels here"); + } + _channels.push_back(s); + return *this; + } + + + // total number of samples - storage for one copy of everything is sizeof(T)*channels.size()*totalSamples + size_t totalSamples() const + { + size_t answer=0; + for(size_t i=0;i<_samples.size();i++) + { + answer+=_samples[i].size(); + } + return answer; + } + + //copy the channels into the header list + void + setHeader(Header & hdr) const + { + for(size_t i=0;i<_channels.size();i++) + { + hdr.channels().insert(_channels[i],_type); + } + } + + + void frak(vector< data > & parts) const + { + for(size_t i=0;i counts(output_pixels); + + // buffers for sample pointers + vector< vector > sample_pointers(_channels.size()); + + // buffer for actual sample data + vector< vector > sample_buffers(_channels.size()); + + for(size_t i=0;i0 ) + { + for(size_t c=0 ; c<_channels.size() ; c++) + { + for(size_t s=0 ; s < count ; s++ ) + { + sample_buffers[c][sample+s]=_samples[pixel][s][c]; + } + sample_pointers[c][p]=&sample_buffers[c][sample]; + } + sample+=count; + } + pixel++; + if(pixel==_samples.size()) pixel=0; + } + cout << " wrote " << sample << " samples into " << output_pixels << " pixels\n"; + + DeepFrameBuffer fb; + fb.insertSampleCountSlice(Slice(UINT, + (char *)(&counts[0]-dw.min.x-(dw.size().x+1)*dw.min.y), + sizeof(unsigned int), + sizeof(unsigned int)*(dw.size().x+1) + ) + ); + for(size_t c=0;c<_channels.size();c++) + { + fb.insert(_channels[c], + DeepSlice(_type,(char *)(&sample_pointers[c][0]-dw.min.x-(dw.size().x+1)*dw.min.y), + sizeof(T *), + sizeof(T *)*(dw.size().x+1), + sizeof(T) + ) + ); + } + part.setFrameBuffer(fb); + part.writePixels(dw.size().y+1); + + } + + void + setUpFrameBuffer(vector & data,FrameBuffer & framebuf,const Box2i & dw,bool dontbotherloadingdepth) const + { + + // allocate enough space for all channels (even the depth channel) + data.resize(_channels.size()*(dw.size().x+1)*(dw.size().y+1)); + for(size_t i=0;i<_channels.size();i++) + { + if(!dontbotherloadingdepth || (_channels[i]!="Z" && _channels[i]!="ZBack") ) + { + framebuf.insert(_channels[i].c_str(), + Slice(_type,(char *) (&data[i] - (dw.min.x + dw.min.y*(dw.size().x+1))*_channels.size() ), + sizeof(T)*_channels.size(), + sizeof(T)*(dw.size().x+1)*_channels.size()) + ); + } + } + } + + + // + // check values are within a suitable tolerance of the expected value (expect some errors due to half float storage etc) + // + void + checkValues(const vector & data,const Box2i & dw,bool dontbothercheckingdepth) + { + size_t size = _channels.size()+(dw.size().x+1)*(dw.size().y+1); + size_t pel=0; + size_t channel=0; + if(dontbothercheckingdepth) + { + for(size_t i=0;i0.005) + { + cout << "sample " << i << " (channel " << _channels[channel] << " of pixel " << i % _channels.size() << ") "; + cout << "doesn't match expected value (channel " << channel << " of pixel " << pel << ") : "; + cout << "got " << data[i] << " expected " << _results[pel][channel] << endl; + } + assert(fabs(_results[pel][channel]- data[i])<=0.005); + } + channel++; + if(channel==_channels.size()) + { + channel=0; + pel++; + if(pel==_results.size()) + { + pel=0; + } + } + + } + }else{ + for(size_t i=0;i0.005) + { + cout << "sample " << i << " (channel " << _channels[channel] << " of pixel " << i % _channels.size() << ") "; + cout << "doesn't match expected value (channel " << channel << " of pixel " << pel << ") : "; + cout << "got " << data[i] << " expected " << _results[pel][channel] << endl; + } + assert(fabs(_results[pel][channel] - data[i])<=0.005); + channel++; + if(channel==_channels.size()) + { + channel=0; + pel++; + if(pel==_results.size()) + { + pel=0; + } + } + } + } + + } + +}; + +template +ostream & operator << (ostream & o,data & d) +{ + o << "channels: [ "; + for(size_t i=0;i +void +make_pattern(data & bob,int pattern_number) +{ + + if (pattern_number==0) + { + // set channels + + bob << string("Z") << string("ZBack") << string("A") << string("R"); + PixelType t; + + // regular two-pixel composite + bob << 1.0 << 2.0 << 0.0 << 1.0 << end(); + bob << 2.1 << 2.3 << 0.5 << 0.4 << end(); + bob << result(); + bob << 3.1 << 4.3 << 0.5 << 1.4 << end(); + + bob << 10 << 20 << 1.0 << 1.0 << end(); + bob << 20 << 30 << 1.0 << 2.0 << end(); + bob << result(); + bob << 10 << 20 << 1.0 << 1.0 << end(); + + bob << result(); + bob << 0.0 << 0.0 << 0.0 << 0.0 << end(); + } + else if (pattern_number==1) + { + // + // out of order channels, no zback - should-re-order them for us + // + bob << string("Z") << string("R") << string("G") << string("B") << string("A"); + + + // write this four times, so we get various patterns for splitting the blocks + for(int pass=0;pass<4;pass++) + { + // regular four-pixel composite + bob << 1.0 << 0.4 << 1.25 << -0.1 << 0.7 << end(); + bob << 2.2 << 0.2 << -0.1 << 0.0 << 0.24 << end(); + bob << 2.3 << 0.9 << 0.56 << 2.26 << 0.9 << end(); + bob << 5.0 << 1.0 << 0.5 << 0.60 << 0.2 << end(); + bob << result(); + + // eight-pixel composite + bob << 2.2984 << 0.68800 << 1.35908 << 0.42896 << 0.9817 << end(); + bob << 1.0 << 0.4 << 1.25 << -0.1 << 0.7 << end(); + bob << 2.2 << 0.2 << -0.1 << 0.0 << 0.24 << end(); + bob << 2.3 << 0.9 << 0.56 << 2.26 << 0.9 << end(); + bob << 5.0 << 1.0 << 0.5 << 0.60 << 0.2 << end(); + bob << 11.0 << 0.4 << 1.25 << -0.1 << 0.7 << end(); + bob << 12.2 << 0.2 << -0.1 << 0.0 << 0.24 << end(); + bob << 12.3 << 0.9 << 0.56 << 2.26 << 0.9 << end(); + bob << 15.0 << 1.0 << 0.5 << 0.60 << 0.2 << end(); + bob << result(); + bob << 2.62319 << 0.7005 << 1.38387 << 0.43678 << 0.99967 << end(); + + // one-pixel composite + + bob << 27.0 << 1.0 << -1.0 << 42.0 << 14 << end(); // alpha>1 should still work + bob << result(); + bob << 27.0 << 1.0 << -1.0 << 42.0 << 14 << end(); + } + + + } +} + +template +void +write_file(const char * filename, const data & master, int number_of_parts) +{ + vector
headers(number_of_parts); + + // all headers are the same in this test + headers[0].displayWindow().max.x=164; + headers[0].displayWindow().max.y=216; + headers[0].dataWindow().min.x=rand()%400 - 200; + headers[0].dataWindow().max.x=headers[0].dataWindow().min.x+40+rand()%400; + headers[0].dataWindow().min.y=rand()%400 - 200; + headers[0].dataWindow().max.y=headers[0].dataWindow().min.y+40+rand()%400; + cout << "data window: " << headers[0].dataWindow().min.x << ',' << headers[0].dataWindow().min.y << ' ' << + headers[0].dataWindow().max.x << ',' << headers[0].dataWindow().max.y << endl; + headers[0].setType(DEEPSCANLINE); + headers[0].compression()=ZIPS_COMPRESSION; + headers[0].setName("Part0"); + + for(int i=1;i > sub_parts(number_of_parts); + + if(number_of_parts>1) + { + master.frak(sub_parts); + } + + if(number_of_parts==1) + { + master.setHeader(headers[0]); + }else{ + + for(int i=0;i +void +test_parts (int pattern_number, + int number_of_parts, + bool load_depths, + bool entire_buffer, + const std::string &tempDir) +{ + std::string fn = tempDir + "imf_test_composite_deep_scanline_source.exr"; + + data master; + make_pattern (master, pattern_number); + write_file (fn.c_str(), master,number_of_parts); + + + { + vector data; + CompositeDeepScanLine comp; + FrameBuffer testbuf; + MultiPartInputFile input(fn.c_str()); + vector parts(number_of_parts); + + + // use 'part' interface TODO test file interface too + for(int i=0;icomp.dataWindow().max.y) + high = comp.dataWindow().max.y; + comp.readPixels(low,high); + low = high; + } + } + + master.checkValues(data,comp.dataWindow(),load_depths); + + for(int i=0;i data; + FrameBuffer testbuf; + const Box2i & dataWindow = file.header().dataWindow(); + master.setUpFrameBuffer(data,testbuf,dataWindow,load_depths); + file.setFrameBuffer(testbuf); + if(entire_buffer) + { + file.readPixels(dataWindow.min.y,dataWindow.max.y); + }else{ + int low = dataWindow.min.y; + while(lowdataWindow.max.y) + high = dataWindow.max.y; + file.readPixels(low,high); + low = high; + } + } + + master.checkValues (data, dataWindow, load_depths); + + } + remove (fn.c_str()); +} + +} + +void testCompositeDeepScanLine (const std::string & tempDir) +{ + + cout << "\n\nTesting deep compositing interface basic functionality:\n" << endl; + + int passes=2; + if (!ILMTHREAD_NAMESPACE::supportsThreads ()) + { + passes=1; + } + + + srand(1); + + for(int pass=0;pass<2;pass++) + { + + test_parts(0, 1, true, true, tempDir); + test_parts(0, 1, false, false, tempDir); + test_parts (0, 1, true, false, tempDir); + test_parts (0, 1, false, true, tempDir); + + // + // test pattern 1: tested by confirming data is written correctly and + // then reading correct results in Nuke + // + test_parts(1, 1, true, false, tempDir); + test_parts(1, 1, false, true, tempDir); + test_parts (1, 1, true, true, tempDir); + test_parts (1, 1, false, false, tempDir); + + + cout << "Testing deep compositing across multiple parts:\n" << endl; + + test_parts(0, 5, true, false, tempDir); + test_parts(0, 5, false, true, tempDir); + test_parts (0, 5, true, false, tempDir); + test_parts (0, 5, false, true, tempDir); + + test_parts(1, 3, true, true, tempDir); + test_parts(1, 3, false, false, tempDir); + test_parts (1, 3, true, true, tempDir); + test_parts (1, 3, false, false, tempDir); + + test_parts(1, 4, true, true, tempDir); + test_parts(1, 4, false, false, tempDir); + test_parts (1, 4, true, false, tempDir); + test_parts (1, 4, false, true, tempDir); + + if(passes==2 && pass==0) + { + cout << " testing with multithreading...\n"; + setGlobalThreadCount(64); + } + } + cout << " ok\n" << endl; +} diff --git a/IlmImfTest/testCompositeDeepScanLine.h b/IlmImfTest/testCompositeDeepScanLine.h new file mode 100644 index 0000000..054930a --- /dev/null +++ b/IlmImfTest/testCompositeDeepScanLine.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTCOMPOSITEDEEPSCANLINE_H_ +#define TESTCOMPOSITEDEEPSCANLINE_H_ + +#include + +void testCompositeDeepScanLine (const std::string & tempDir); + +#endif /* TESTCOMPOSITEDEEPSCANLINE_H_ */ diff --git a/IlmImfTest/testCompression.cpp b/IlmImfTest/testCompression.cpp new file mode 100644 index 0000000..aad9cf6 --- /dev/null +++ b/IlmImfTest/testCompression.cpp @@ -0,0 +1,435 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" + +#include +#include +#include +#include +#include +#include +#include "compareFloat.h" + +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels1 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "only zeroes" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = 0; + ph[y][x] = 0; + pf[y][x] = 0; + } +} + + +void +fillPixels2 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "pattern 1" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = (x + y) & 1; + ph[y][x] = pi[y][x]; + pf[y][x] = pi[y][x]; + } +} + + +void +fillPixels3 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "pattern 2" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = x % 100 + 100 * (y % 100); + ph[y][x] = sin (double (x)) + sin (y * 0.5); + pf[y][x] = sin (double (y)) + sin (x * 0.5); + } +} + + +void +fillPixels4 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "random bits" << endl; + + // + // Use of a union to extract the bit pattern from a float, as is + // done below, works only if int and float have the same size. + // + + assert (sizeof (int) == sizeof (float)); + + Rand48 rand; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = rand.nexti(); + + ph[y][x].setBits (rand.nexti()); + + union {int i; float f;} u; + u.i = rand.nexti(); + + pf[y][x] = u.f; + } +} + + +void +writeRead (const Array2D &pi1, + const Array2D &ph1, + const Array2D &pf1, + const char fileName[], + int width, + int height, + int xOffset, + int yOffset, + Compression comp, + int xs, + int ys) +{ + // + // Write the pixel data in pi1, ph1 and ph2 to an + // image file using the specified compression type + // and subsampling rates. Read the pixel data back + // from the file and verify that the data did not + // change. + // + + cout << "compression " << comp << + ", x sampling " << xs << + ", y sampling " << ys << + ":" << flush; + + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + + hdr.channels().insert ("I", // name + Channel (IMF::UINT, // type + xs, // xSampling + ys) // ySampling + ); + + hdr.channels().insert ("H", // name + Channel (IMF::HALF, // type + xs, // xSampling + ys) // ySampling + ); + + hdr.channels().insert ("F", // name + Channel (IMF::FLOAT, // type + xs, // xSampling + ys) // ySampling + ); + + { + FrameBuffer fb; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi1[-yOffset / ys][-xOffset / xs], // base + sizeof (pi1[0][0]), // xStride + sizeof (pi1[0][0]) * (width / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph1[-yOffset / ys][-xOffset / xs], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * (width / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[-yOffset / ys][-xOffset / xs], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * (width / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + + cout << " writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " reading" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D pi2 (h / ys, w / xs); + Array2D ph2 (h / ys, w / xs); + Array2D pf2 (h / ys, w / xs); + + FrameBuffer fb; + + { + int xs = in.header().channels()["I"].xSampling; + int ys = in.header().channels()["I"].ySampling; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi2[-dy / ys][-dx / xs], // base + sizeof (pi2[0][0]), // xStride + sizeof (pi2[0][0]) * (w / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + } + + { + int xs = in.header().channels()["H"].xSampling; + int ys = in.header().channels()["H"].ySampling; + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph2[-dy / ys][-dx / xs], // base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * (w / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + } + + { + int xs = in.header().channels()["F"].xSampling; + int ys = in.header().channels()["F"].ySampling; + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf2[-dy / ys][-dx / xs], // base + sizeof (pf2[0][0]), // xStride + sizeof (pf2[0][0]) * (w / xs), // yStride + xs, // xSampling + ys) // ySampling + ); + } + + in.setFrameBuffer (fb); + in.readPixels (dw.min.y, dw.max.y); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h / ys; ++y) + { + for (int x = 0; x < w / xs; ++x) + { + assert (pi1[y][x] == pi2[y][x]); + assert (equivalent (pf1[y][x], pf2[y][x], comp)); + + if (comp != B44_COMPRESSION && + comp != B44A_COMPRESSION) + { + assert (ph1[y][x].bits() == ph2[y][x].bits()); + } + } + } + + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION) + { + Array2D ph3 (h / ys, w / xs); + + for (int y = 0; y < h / ys; ++y) + for (int x = 0; x < w / xs; ++x) + ph3[y][x] = ph1[y][x]; + + compareB44 (w / xs, h / ys, ph3, ph2); + } + } + + remove (fileName); + cout << endl; +} + + +void +writeRead (const std::string &tempDir, + const Array2D &pi, + const Array2D &ph, + const Array2D &pf, + int w, + int h, + int dx, + int dy) +{ + std::string filename = tempDir + "imf_test_comp.exr"; + + for (int xs = 1; xs <= 2; ++xs) + { + for (int ys = 1; ys <= 2; ++ys) + { + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeRead (pi, ph, pf, + filename.c_str(), + w * xs, h * ys, + dx * xs, dy * ys, + Compression (comp), + xs, ys); + } + } + } +} + +} // namespace + + +void +testCompression (const std::string &tempDir) +{ + try + { + cout << "Testing pixel data types, " + "subsampling and " + "compression schemes" << endl; + + const int W = 1371; + const int H = 159; + const int DX = 17; + const int DY = 29; + + Array2D pi (H, W); + Array2D ph (H, W); + Array2D pf (H, W); + + // + // If the following assertion fails, new pixel types have + // been added to the Imf library; testing code for the new + // pixel types should be added to this file. + // + + assert (NUM_PIXELTYPES == 3); + + fillPixels1 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, DX, DY); + + fillPixels2 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, DX, DY); + + fillPixels3 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, DX, DY); + + fillPixels4 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, DX, DY); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testCompression.h b/IlmImfTest/testCompression.h new file mode 100644 index 0000000..28b5693 --- /dev/null +++ b/IlmImfTest/testCompression.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testCompression (const std::string &tempDir); + diff --git a/IlmImfTest/testConversion.cpp b/IlmImfTest/testConversion.cpp new file mode 100644 index 0000000..7e5db5c --- /dev/null +++ b/IlmImfTest/testConversion.cpp @@ -0,0 +1,413 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "compareFloat.h" + +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +// +// Functions to test conversion of individual numbers +// + +void +testFloatToUint (unsigned int floatVal, unsigned int uintVal) +{ + union {unsigned int ui; float f;} u; + u.ui = floatVal; + cout << "floatToUint (" << u.f << ") == " << floatToUint(u.f) << endl; + assert (floatToUint (u.f) == uintVal); +} + + +void +testHalfToUint (unsigned int halfVal, unsigned int uintVal) +{ + half h; + h.setBits (halfVal); + cout << "halfToUint (" << h << ") == " << halfToUint(h) << endl; + assert (halfToUint (h) == uintVal); +} + + +void +testFloatToHalf (unsigned int floatVal, unsigned int halfVal) +{ + union {unsigned int ui; float f;} u; + u.ui = floatVal; + cout << "floatToHalf (" << u.f << ") == " << floatToHalf(u.f) << endl; + assert (floatToHalf(u.f).bits() == halfVal); +} + + +void +testUintToHalf (unsigned int uintVal, unsigned int halfVal) +{ + cout << "uintToHalf (" << uintVal << ") == " << uintToHalf(uintVal) << endl; + assert (uintToHalf(uintVal).bits() == halfVal); +} + +void +testNumbers () +{ + testFloatToUint (0x00000000, 0); // 0.0 + testFloatToUint (0x3f000000, 0); // +0.5 + testFloatToUint (0xbf000000, 0); // -0.5 + testFloatToUint (0x42f82000, 124); // +124.0625 + testFloatToUint (0xc2f82000, 0); // -124.0625 + testFloatToUint (0x58635fa9, 0xffffffff); // +1.0e15 + testFloatToUint (0xd8635fa9, 0); // -1.0e15 + testFloatToUint (0x7f800000, 0xffffffff); // +infinity + testFloatToUint (0xff800000, 0); // -infinity + testFloatToUint (0x7fffffff, 0); // NaN + testFloatToUint (0xffffffff, 0); // NaN + + testHalfToUint (0x0000, 0); // 0.0 + testHalfToUint (0x3800, 0); // +0.5 + testHalfToUint (0xb800, 0); // -0.5 + testHalfToUint (0x57c1, 124); // +124.0625 + testHalfToUint (0xd7c1, 0); // -124.0625 + testHalfToUint (0x7c00, 0xffffffff); // +infinity + testHalfToUint (0xfc00, 0); // -infinity + testHalfToUint (0x7fff, 0); // NaN + testHalfToUint (0xffff, 0); // NaN + + testFloatToHalf (0x00000000, 0x0000); // 0.0 + testFloatToHalf (0x3f000000, 0x3800); // +0.5 + testFloatToHalf (0xbf000000, 0xb800); // -0.5 + testFloatToHalf (0x42f82000, 0x57c1); // +124.0625 + testFloatToHalf (0xc2f82000, 0xd7c1); // -124.0625 + testFloatToHalf (0x58635fa9, 0x7c00); // +1.0e15 + testFloatToHalf (0xd8635fa9, 0xfc00); // -1.0e15 + testFloatToHalf (0x7f800000, 0x7c00); // +infinity + testFloatToHalf (0xff800000, 0xfc00); // -infinity + testFloatToHalf (0x7fffffff, 0x7fff); // NaN + testFloatToHalf (0xffffffff, 0xffff); // NaN + + testUintToHalf (0, 0x0000); + testUintToHalf (1, 0x3c00); + testUintToHalf (124, 0x57c0); + testUintToHalf (1000000, 0x7c00); + testUintToHalf (0xffffffff, 0x7c00); +} + + +template +bool +isEquivalent (T t1, T t2, Compression compression) +{ + return t1 == t2; +} + + +template<> +bool +isEquivalent (float t1, float t2, Compression compression) +{ + return equivalent (t1, t2, compression); +} + + +template +void +testScanLineImageChannel (const char fileName[], + int width, int height, + Compression compression) +{ + cout << "scan lines, " + "compression " << compression << ", " << + "output type " << OutTypeTag << ", " << + "input type " << InTypeTag << ":\n " << flush; + + Array2D outPixels (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + outPixels[y][x] = x * 10 + y; + + { + Header hdr (width, height); + + hdr.compression() = compression; + + hdr.channels().insert ("X", // name + Channel (OutTypeTag)); // type + + FrameBuffer fb; + + fb.insert ("X", // name + Slice (OutTypeTag, // type + (char *) &outPixels[0][0], // base + sizeof (outPixels[0][0]), // xStride + sizeof (outPixels[0][0]) * width)); // yStride + + cout << "writing " << flush; + + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + Array2D inPixels (height, width); + + { + cout << "reading " << flush; + + FrameBuffer fb; + + fb.insert ("X", // name + Slice (InTypeTag, // type + (char *) &inPixels[0][0], // base + sizeof (inPixels[0][0]), // xStride + sizeof (inPixels[0][0]) * width)); // yStride + + InputFile in (fileName); + in.setFrameBuffer (fb); + in.readPixels (0, height - 1); + } + + cout << "comparing" << flush; + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + assert (isEquivalent (inPixels[y][x], + InType (outPixels[y][x]), + compression)); + } + } + + cout << endl; + + remove (fileName); +} + + +template +void +testTiledImageChannel (const char fileName[], + int width, int height, + Compression compression) +{ + cout << "tiles, " + "compression " << compression << ", " << + "output type " << OutTypeTag << ", " << + "input type " << InTypeTag << ":\n " << flush; + + Array2D outPixels (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + outPixels[y][x] = x * 10 + y; + + { + Header hdr (width, height); + + hdr.setTileDescription (TileDescription (67, 67, ONE_LEVEL)); + + hdr.compression() = compression; + + hdr.channels().insert ("X", // name + Channel (OutTypeTag)); // type + + FrameBuffer fb; + + fb.insert ("X", // name + Slice (OutTypeTag, // type + (char *) &outPixels[0][0], // base + sizeof (outPixels[0][0]), // xStride + sizeof (outPixels[0][0]) * width)); // yStride + + cout << "writing " << flush; + + TiledOutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + Array2D inPixels (height, width); + + { + cout << "reading " << flush; + + FrameBuffer fb; + + fb.insert ("X", // name + Slice (InTypeTag, // type + (char *) &inPixels[0][0], // base + sizeof (inPixels[0][0]), // xStride + sizeof (inPixels[0][0]) * width)); // yStride + + TiledInputFile in (fileName); + in.setFrameBuffer (fb); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + } + + cout << "comparing" << flush; + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + assert (isEquivalent (inPixels[y][x], + InType (outPixels[y][x]), + compression)); + } + } + + cout << endl; + + remove (fileName); +} + + +template +void +testImageChannel (const std::string &fileName, + int width, int height, + Compression compression) +{ + testScanLineImageChannel + (fileName.c_str(), width, height, compression); + + testTiledImageChannel + (fileName.c_str(), width, height, compression); +} + + + +} // namespace + + +void +testConversion (const std::string &tempDir) +{ + try + { + cout << "Testing conversion between pixel data types" << endl; + + cout << "individual numbers" << endl; + + testNumbers(); + + cout << "conversion of image channels while reading a file " << endl; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION) + { + continue; + } + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + testImageChannel + (tempDir + "imf_test_conv.exr", + 317, 539, + Compression (comp)); + + } + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testConversion.h b/IlmImfTest/testConversion.h new file mode 100644 index 0000000..aa80d48 --- /dev/null +++ b/IlmImfTest/testConversion.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testConversion (const std::string &tempDir); + + diff --git a/IlmImfTest/testCopyDeepScanLine.cpp b/IlmImfTest/testCopyDeepScanLine.cpp new file mode 100644 index 0000000..2d67a35 --- /dev/null +++ b/IlmImfTest/testCopyDeepScanLine.cpp @@ -0,0 +1,441 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testCopyDeepScanLine.h" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int width = 538; +const int height = 234; +const int minX = 42; +const int minY = 51; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); +const char source_filename[] = IMF_TMP_DIR "imf_test_copy_deep_scanline_source.exr"; +const char copy_filename[] = IMF_TMP_DIR "imf_test_copy_deep_scanline_copy.exr"; + +vector channelTypes; +Array2D sampleCount; +Header header; + +void generateRandomFile (const std::string & source_filename, + int channelCount, + Compression compression) +{ + cout << "generating " << flush; + header = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + + cout << "compression " << compression << " " << flush; + + // + // Add channels. + // + + channelTypes.clear(); + + for (int i = 0; i < channelCount; i++) + { + int type = rand() % 3; + stringstream ss; + ss << i; + string str = ss.str(); + if (type == 0) + header.channels().insert(str, Channel(IMF::UINT)); + if (type == 1) + header.channels().insert(str, Channel(IMF::HALF)); + if (type == 2) + header.channels().insert(str, Channel(IMF::FLOAT)); + channelTypes.push_back(type); + } + + header.setType(DEEPSCANLINE); + + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + sampleCount.resizeErase(height, width); + + remove (source_filename.c_str()); + DeepScanLineOutputFile file(source_filename.c_str(), header, 8); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&sampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof(char *); + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + file.setFrameBuffer(frameBuffer); + + cout << "writing " << flush; + for (int i = 0; i < height; i++) + { + // + // Fill in data at the last minute. + // + + for (int j = 0; j < width; j++) + { + sampleCount[i][j] = rand() % 10 + 1; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][i][j] = new unsigned int[sampleCount[i][j]]; + if (channelTypes[k] == 1) + data[k][i][j] = new half[sampleCount[i][j]]; + if (channelTypes[k] == 2) + data[k][i][j] = new float[sampleCount[i][j]]; + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][i][j])[l] = (i * width + j) % 2049; + } + } + } + } + + file.writePixels(height); + + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } +} + +void copyFile (const std::string & source_filename, + const std::string & copy_filename) +{ + cout << "copying " ; + cout.flush(); + { + DeepScanLineInputFile in_file(source_filename.c_str(), 8); + remove (copy_filename.c_str()); + DeepScanLineOutputFile out_file (copy_filename.c_str(), + in_file.header(), + 8); + out_file.copyPixels(in_file); + } + // remove the source file here to prevent accidentally reading it + // remove (source_filename); + +} + +void readFile (const std::string & copy_filename, int channelCount) +{ + cout << "reading " ; + cout.flush(); + DeepScanLineInputFile file(copy_filename.c_str(), 8); + + const Header& fileHeader = file.header(); + assert (fileHeader.displayWindow() == header.displayWindow()); + assert (fileHeader.dataWindow() == header.dataWindow()); + assert (fileHeader.pixelAspectRatio() == header.pixelAspectRatio()); + assert (fileHeader.screenWindowCenter() == header.screenWindowCenter()); + assert (fileHeader.screenWindowWidth() == header.screenWindowWidth()); + assert (fileHeader.lineOrder() == header.lineOrder()); + assert (fileHeader.compression() == header.compression()); + assert (fileHeader.channels() == header.channels()); + assert (fileHeader.type() == header.type()); + + Array2D localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&localSampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + + + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + + + } + + + file.setFrameBuffer(frameBuffer); + + file.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); + for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) + { + int y = i + dataWindow.min.y; + + for (int j = 0; j < width; j++) + assert(localSampleCount[i][j] == sampleCount[i][j]); + + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][i][j] = new unsigned int[localSampleCount[i][j]]; + if (channelTypes[k] == 1) + data[k][i][j] = new half[localSampleCount[i][j]]; + if (channelTypes[k] == 2) + data[k][i][j] = new float[localSampleCount[i][j]]; + } + } + } + + file.readPixels(dataWindow.min.y, dataWindow.max.y); + + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + for (int k = 0; k < channelCount; k++) + { + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + { + unsigned int* value = (unsigned int*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 1) + { + half* value = (half*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((half*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 2) + { + float* value = (float*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((float*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + } + } + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } +} + +void readCopyWriteTest (const std::string & tempDir, + int channelCount, + int testTimes) +{ + cout << "Testing files with " << channelCount << " channels " << testTimes << " times." + << endl << flush; + + std::string source_filename = tempDir + "imf_test_copy_deep_scanline_source.exr"; + std::string copy_filename = tempDir + "imf_test_copy_deep_scanline_copy.exr"; + + for (int i = 0; i < testTimes; i++) + { + int compressionIndex = i % 3; + Compression compression; + switch (compressionIndex) + { + case 0: + compression = NO_COMPRESSION; + break; + case 1: + compression = RLE_COMPRESSION; + break; + case 2: + compression = ZIPS_COMPRESSION; + break; + } + + generateRandomFile (source_filename, channelCount, compression); + copyFile (source_filename, copy_filename); + readFile (copy_filename, channelCount ); + remove (source_filename.c_str()); + remove (copy_filename.c_str()); + cout << endl << flush; + + } +} + + +}; // namespace + +void testCopyDeepScanLine (const std::string &tempDir) +{ + try + { + cout << "\n\nTesting raw data copy in DeepScanLineInput/OutputFile:\n" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(4); + + + readCopyWriteTest (tempDir, 1, 100); + readCopyWriteTest (tempDir, 3, 50); + readCopyWriteTest (tempDir, 10, 10); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testCopyDeepScanLine.h b/IlmImfTest/testCopyDeepScanLine.h new file mode 100644 index 0000000..3453bb9 --- /dev/null +++ b/IlmImfTest/testCopyDeepScanLine.h @@ -0,0 +1,45 @@ + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012, Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTCOPYDEEPSCANLINE_H_ +#define TESTCOPYDEEPSCANLINE_H_ + +#include + +void testCopyDeepScanLine (const std::string &tempDir); + +#endif /* TESTCOPYDEEPSCANLINE_H_ */ diff --git a/IlmImfTest/testCopyDeepTiled.cpp b/IlmImfTest/testCopyDeepTiled.cpp new file mode 100644 index 0000000..332c8fa --- /dev/null +++ b/IlmImfTest/testCopyDeepTiled.cpp @@ -0,0 +1,519 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testCopyDeepTiled.h" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "tmpDir.h" + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; +using namespace std; + +namespace +{ + +const int width = 199; +const int height = 369; +const int minX = 23; +const int minY = 59; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); + + +vector channelTypes; +Array2D< Array2D > sampleCountWhole; +Header header; + +void +generateRandomFile (int channelCount, + Compression compression, + const std::string & srcFn) +{ + + cout << "generating " << flush; + header = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + cout << "compression " << compression << " " << flush; + + // + // Add channels. + // + + channelTypes.clear(); + + for (int i = 0; i < channelCount; i++) + { + int type = rand() % 3; + stringstream ss; + ss << i; + string str = ss.str(); + if (type == 0) + header.channels().insert(str, Channel(IMF::UINT)); + if (type == 1) + header.channels().insert(str, Channel(IMF::HALF)); + if (type == 2) + header.channels().insert(str, Channel(IMF::FLOAT)); + channelTypes.push_back(type); + } + + header.setType(DEEPTILE); + header.setTileDescription( + TileDescription(rand() % width + 1, rand() % height + 1, RIPMAP_LEVELS)); + + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + Array2D sampleCount; + sampleCount.resizeErase(height, width); + + remove (srcFn.c_str()); + DeepTiledOutputFile file(srcFn.c_str(), header, 8); + + cout << "tileSizeX " << file.tileXSize() << " tileSizeY " << file.tileYSize() << " "; + + sampleCountWhole.resizeErase(file.numYLevels(), file.numXLevels()); + for (int i = 0; i < sampleCountWhole.height(); i++) + for (int j = 0; j < sampleCountWhole.width(); j++) + sampleCountWhole[i][j].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + int memOffset = dataWindow.min.x + dataWindow.min.y * width; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width, + 1, 1, + 0, + false, + false)); + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize, + 1, 1, + 0, + false, + false)); + } + + file.setFrameBuffer(frameBuffer); + + cout << "writing " << flush; + + for (int ly = 0; ly < file.numYLevels(); ly++) + for (int lx = 0; lx < file.numXLevels(); lx++) + { + Box2i dataWindowL = file.dataWindowForLevel(lx, ly); + + // + // Bulk write (without relative coordinates). + // + + for (int j = 0; j < file.numYTiles(ly); j++) + { + for (int i = 0; i < file.numXTiles(lx); i++) + { + Box2i box = file.dataWindowForTile(i, j, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + sampleCount[dwy][dwx] = rand() % 10 + 1; + sampleCountWhole[ly][lx][dwy][dwx] = sampleCount[dwy][dwx]; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[sampleCount[dwy][dwx]]; + for (int l = 0; l < sampleCount[dwy][dwx]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][dwy][dwx])[l] = (dwy* width + dwx) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + } + } + } + } + } + + file.writeTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + + + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } + } +} + +void +checkValue (void* sampleRawData, int sampleCount, int channelType, int dwx, int dwy) +{ + for (int l = 0; l < sampleCount; l++) + { + if (channelType == 0) + { + unsigned int* value = (unsigned int*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + if (channelType == 1) + { + half* value = (half*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + if (channelType == 2) + { + float* value = (float*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + } +} + +void +readFile (int channelCount, const std::string & cpyFn) +{ + + cout << "reading " << flush; + + DeepTiledInputFile file (cpyFn.c_str(), 4); + + const Header& fileHeader = file.header(); + assert (fileHeader.displayWindow() == header.displayWindow()); + assert (fileHeader.dataWindow() == header.dataWindow()); + assert (fileHeader.pixelAspectRatio() == header.pixelAspectRatio()); + assert (fileHeader.screenWindowCenter() == header.screenWindowCenter()); + assert (fileHeader.screenWindowWidth() == header.screenWindowWidth()); + assert (fileHeader.lineOrder() == header.lineOrder()); + assert (fileHeader.compression() == header.compression()); + assert (fileHeader.channels() == header.channels()); + assert (fileHeader.type() == header.type()); + assert (fileHeader.tileDescription() == header.tileDescription()); + + Array2D localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + int memOffset = dataWindow.min.x + dataWindow.min.y * width; + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&localSampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width, + 1, 1, + 0, + false, + false)); + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize, + 1, 1, + 0, + false, + false)); + } + + file.setFrameBuffer(frameBuffer); + + + for (int ly = 0; ly < file.numYLevels(); ly++) + for (int lx = 0; lx < file.numXLevels(); lx++) + { + Box2i dataWindowL = file.dataWindowForLevel(lx, ly); + + // + // Testing bulk read (without relative coordinates). + // + + file.readPixelSampleCounts(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + + for (int i = 0; i < file.numYTiles(ly); i++) + { + for (int j = 0; j < file.numXTiles(lx); j++) + { + Box2i box = file.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + assert(localSampleCount[dwy][dwx] == sampleCountWhole[ly][lx][dwy][dwx]); + + for (int k = 0; k < channelTypes.size(); k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; + } + } + } + } + + file.readTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + + + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + for (int l = 0; l < localSampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + { + unsigned int* value = (unsigned int*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 1) + { + half* value = (half*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((half*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 2) + { + float* value = (float*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((float*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + } + } + + + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } + } +} + +void +copyFile (const std::string & srcFn, const std::string & cpyFn) +{ + cout << "copying " ; + cout.flush(); + { + DeepTiledInputFile in_file (srcFn.c_str(),8); + remove (cpyFn.c_str()); + DeepTiledOutputFile out_file (cpyFn.c_str(), in_file.header()); + out_file.copyPixels (in_file); + } + // prevent accidentally reading souce instead of copy + remove (srcFn.c_str()); +} + +void +readCopyWriteTest (int channelCount, int testTimes, const std::string & tempDir) +{ + cout << "Testing files with " << channelCount << " channels, using absolute coordinates " + << testTimes << " times." + << endl << flush; + + std::string cpyFn = tempDir + "imf_test_copy_deep_tiled_copy.exr"; + std::string srcFn = tempDir + "imf_test_copy_deep_tiled_source.exr"; + + for (int i = 0; i < testTimes; i++) + { + int compressionIndex = i % 3; + Compression compression; + switch (compressionIndex) + { + case 0: + compression = NO_COMPRESSION; + break; + case 1: + compression = RLE_COMPRESSION; + break; + case 2: + compression = ZIPS_COMPRESSION; + break; + } + + generateRandomFile (channelCount, compression, srcFn); + copyFile (srcFn, cpyFn); + readFile (channelCount, cpyFn); + remove (cpyFn.c_str()); + cout << endl << flush; + + } +} + +} // namespace + +void testCopyDeepTiled (const std::string & tempDir) +{ + try + { + cout << "Testing raw copy in DeepTiledInput/OutputFile " << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(2); + + readCopyWriteTest ( 3, 1, tempDir); + readCopyWriteTest ( 5, 2, tempDir); + readCopyWriteTest (11, 3, tempDir); + + ThreadPool::globalThreadPool().setNumThreads (numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testCopyDeepTiled.h b/IlmImfTest/testCopyDeepTiled.h new file mode 100644 index 0000000..293e523 --- /dev/null +++ b/IlmImfTest/testCopyDeepTiled.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTCOPYDEEPTILED_H_ +#define TESTCOPYDEEPTILED_H_ + +#include + +void testCopyDeepTiled (const std::string & tempDir); + +#endif /* TESTCOPYDEEPTILED_H_ */ diff --git a/IlmImfTest/testCopyMultiPartFile.cpp b/IlmImfTest/testCopyMultiPartFile.cpp new file mode 100644 index 0000000..69881ed --- /dev/null +++ b/IlmImfTest/testCopyMultiPartFile.cpp @@ -0,0 +1,980 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// Weta Digital nor any other ontributors may be used to endorse +// or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testCopyMultiPartFile.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 247; +const int width = 233; + +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +void fillPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + ph[y][x] = new T[sampleCount[y][x]]; + for (int i = 0; i < sampleCount[y][x]; i++) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x][i] = (y * width + x) % 2049; + } + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + uintData[y][x] = new unsigned int[sampleCount[y][x]]; + if (type == 1) + floatData[y][x] = new float[sampleCount[y][x]]; + if (type == 2) + halfData[y][x] = new half[sampleCount[y][x]]; + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + allocatePixels(type, sampleCount, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + delete[] uintData[y][x]; + if (type == 1) + delete[] floatData[y][x]; + if (type == 2) + delete[] halfData[y][x]; + } +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + releasePixels(type, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, + int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + { + for (int i = 0; i < sampleCount[y][x]; i++) + { + if (ph[y][x][i] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ", sample " << i << ": " << ph[y][x][i] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + } + } + return true; +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + return checkPixels (sampleCount, ph, 0, width - 1, 0, height - 1, width); +} + +bool checkSampleCount(Array2D& sampleCount, int x1, int x2, int y1, int y2, int width) +{ + for (int i = y1; i <= y2; i++) + for (int j = x1; j <= x2; j++) + { + if (sampleCount[i][j] != ((i * width) + j) % 10 + 1) + { + cout << "sample count at " << j << ", " << i << ": " << sampleCount[i][j] + << ", should be " << (i * width + j) % 10 + 1 << endl << flush; + return false; + } + } + return true; +} + +bool checkSampleCount(Array2D& sampleCount, int width, int height) +{ + return checkSampleCount(sampleCount, 0, width - 1, 0, height - 1, width); +} + +void generateRandomHeaders(int partCount, vector
& headers) +{ + cout << "Generating headers and data" << endl << flush; + + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header (width, + height, + 1.f, + IMATH_NAMESPACE::V2f (0, 0), + 1.f, + INCREASING_Y, + ZIPS_COMPRESSION); + + int pixelType = rand() % 3; + int partType = rand() % 4; + + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + case 2: + header.setType(DEEPSCANLINE); + break; + case 3: + header.setType(DEEPTILE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1 || partType == 3) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + + int order = rand() % NUM_LINEORDERS; + if(partType==0 || partType ==2) + { + // can't write random scanlines + order = rand() % (NUM_LINEORDERS-1); + } + LineOrder l; + switch(order) + { + case 0 : + l = INCREASING_Y; + break; + case 1 : + l = DECREASING_Y; + break; + case 2 : + l = RANDOM_Y; + break; + } + + header.lineOrder()=l; + + + if (partType == 0 || partType == 2) + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " line order =" << header.lineOrder() << endl << flush; + } + else + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " tile order =" << header.lineOrder() + << " levelMode = " << levelModes[i] << endl << flush; + } + + headers.push_back(header); + } +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setOutputDeepFrameBuffer(DeepFrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void setInputDeepFrameBuffer(DeepFrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void +generateRandomFile (int partCount, const std::string & srcFn) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + + Array2D sampleCount; + Array2D deepHalfData; + Array2D deepFloatData; + Array2D deepUintData; + + vector outputfiles; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + generateRandomHeaders(partCount, headers); + + remove(srcFn.c_str()); + MultiPartOutputFile file(srcFn.c_str(), &headers[0],headers.size()); + + // + // Writing files. + // + cout << "Writing files " << flush; + + // + // Pre-generating frameBuffers. + // + for (int i = 0; i < partCount; i++) + { + switch (partTypes[i]) + { + case 0: + { + OutputPart part(file, i); + + FrameBuffer frameBuffer; + + fillPixels (uintData, width, height); + fillPixels (floatData, width, height); + fillPixels (halfData, width, height); + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + break; + } + case 1: + { + TiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + + fillPixels (uintData, w, h); + fillPixels (floatData, w, h); + fillPixels (halfData, w, h); + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + uintData, floatData, halfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + } + + break; + } + case 2: + { + DeepScanLineOutputPart part(file, i); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + for (int j = 0; j < height; j++) + for (int k = 0; k < width; k++) + sampleCount[j][k] = (j * width + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, width, height); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, width, height); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, width, height); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, width, height); + + break; + } + case 3: + { + DeepTiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + for (int j = 0; j < h; j++) + for (int k = 0; k < w; k++) + sampleCount[j][k] = (j * w + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, w, h); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, w, h); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, w, h); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, w, h); + } + + break; + } + } + } +} + +void +readWholeFiles (const std::string & cpyFn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + MultiPartInputFile file(cpyFn.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + cout << "Reading whole files " << flush; + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < headers.size(); i++) + { + int a = rand() % headers.size(); + int b = rand() % headers.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < headers.size(); i++) + { + partNumber = shuffledPartNumber[i]; + switch (partTypes[partNumber]) + { + case 0: + { + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + break; + } + case 1: + { + TiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, w, h)); + break; + case 1: + assert(checkPixels(fData, w, h)); + break; + case 2: + assert(checkPixels(hData, w, h)); + break; + } + } + break; + } + case 2: + { + DeepScanLineInputPart part(file, partNumber); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(0, height - 1); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, width, height); + + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, width, height)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, width, height)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, width, height)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + break; + } + case 3: + { + DeepTiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + + part.readPixelSampleCounts(0, numXTiles - 1, 0, numYTiles - 1, + xLevel, yLevel); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, w, h); + + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, w, h)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, w, h)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, w, h)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + } + + break; + } + } + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + + +void +copyFile (const std::string & srcFn, const std::string & cpyFn) +{ + cout << "copying "; + cout.flush(); + + MultiPartInputFile in(srcFn.c_str()); + + + vector
in_hdr(in.parts()); + for(int i=0;i + +void testCopyMultiPartFile (const std::string & tempDir); + +#endif /* TESTCOPYMULTIPARTFILE_H_ */ diff --git a/IlmImfTest/testCopyPixels.cpp b/IlmImfTest/testCopyPixels.cpp new file mode 100644 index 0000000..4467ac1 --- /dev/null +++ b/IlmImfTest/testCopyPixels.cpp @@ -0,0 +1,229 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &ph, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + ph[y][x] = sin (double (x)) + sin (y * 0.5); +} + + +void +writeCopyRead (const Array2D &ph1, + const char fileName1[], + const char fileName2[], + int width, + int height, + int xOffset, + int yOffset, + Compression comp) +{ + // + // Write the pixel data in ph1 to an image file using the + // specified compression type and subsampling rates. + // Then copy the image file using OutputFile::copyPixels() + // Read the pixel data back from the copied file verify + // that the data are the same as those in ph1. + // + + cout << "compression " << comp << ":" << flush; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + { + FrameBuffer fb; + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph1[-yOffset][-xOffset], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << " writing" << flush; + + remove (fileName1); + OutputFile out (fileName1, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " copying" << flush; + + remove (fileName2); + InputFile in (fileName1); + OutputFile out (fileName2, in.header()); + out.copyPixels (in); + } + + { + cout << " reading" << flush; + + InputFile in1 (fileName1); + InputFile in2 (fileName2); + + const Box2i &dw = in2.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D ph1 (h, w); + Array2D ph2 (h, w); + + FrameBuffer fb1; + FrameBuffer fb2; + + fb1.insert ("H", // name + Slice (HALF, // type + (char *) &ph1[-dy][-dx], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * w, // yStride + 1, // xSampling + 1) // ySampling + ); + + fb2.insert ("H", // name + Slice (HALF, // type + (char *) &ph2[-dy][-dx], // base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * w, // yStride + 1, // xSampling + 1) // ySampling + ); + + in1.setFrameBuffer (fb1); + in1.readPixels (dw.min.y, dw.max.y); + in2.setFrameBuffer (fb2); + in2.readPixels (dw.min.y, dw.max.y); + + cout << " comparing" << flush; + + assert (in2.header().displayWindow() == hdr.displayWindow()); + assert (in2.header().dataWindow() == hdr.dataWindow()); + assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in2.header().lineOrder() == hdr.lineOrder()); + assert (in2.header().compression() == hdr.compression()); + assert (in2.header().channels() == hdr.channels()); + + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + assert (ph1[y][x] == ph2[y][x]); + } + + remove (fileName1); + remove (fileName2); + cout << endl; +} + + +void +writeCopyRead (const std::string &tempDir, const Array2D &ph, int w, int h, int dx, int dy) +{ + std::string filename1 = tempDir + "imf_test_copy1.exr"; + std::string filename2 = tempDir + "imf_test_copy2.exr"; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeCopyRead (ph, + filename1.c_str(), + filename2.c_str(), + w, h, + dx, dy, + Compression (comp)); + } +} + +} // namespace + + +void +testCopyPixels (const std::string &tempDir) +{ + try + { + cout << "Testing fast pixel copying" << endl; + + const int W = 371; + const int H = 559; + const int DX = 17; + const int DY = 29; + + Array2D ph (H, W); + + fillPixels (ph, W, H); + writeCopyRead (tempDir, ph, W, H, 0, 0); + writeCopyRead (tempDir, ph, W, H, 0, DY); + writeCopyRead (tempDir, ph, W, H, DX, 0); + writeCopyRead (tempDir, ph, W, H, DX, DY); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testCopyPixels.h b/IlmImfTest/testCopyPixels.h new file mode 100644 index 0000000..1194999 --- /dev/null +++ b/IlmImfTest/testCopyPixels.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testCopyPixels (const std::string &tempDir); + diff --git a/IlmImfTest/testCustomAttributes.cpp b/IlmImfTest/testCustomAttributes.cpp new file mode 100644 index 0000000..091b107 --- /dev/null +++ b/IlmImfTest/testCustomAttributes.cpp @@ -0,0 +1,279 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + + +// +// Definition of the custom GlorpAttribute type. +// Note that this must be in the same namespace as the definition +// + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +struct Glorp +{ + int a, b; + Glorp (int a = 0, int b = 0): a(a), b(b) {} +}; + + +typedef TypedAttribute GlorpAttribute; +template <> const char *GlorpAttribute::staticTypeName (); +template <> void GlorpAttribute::writeValueTo (OStream &, int) const; +template <> void GlorpAttribute::readValueFrom (IStream &, int, int); + +template <> +const char * +GlorpAttribute::staticTypeName () +{ + return "glorp"; +} + + +template <> +void +GlorpAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.a); + Xdr::write (os, _value.b); +} + + +template <> +void +GlorpAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.a); + Xdr::read (is, _value.b); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT + + +namespace { + + +void +fillPixels (Array2D &pf, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + pf[y][x] = x % 10 + 10 * (y % 17); +} + + +void +writeReadCustomAttr (const Array2D &pf1, + const char fileName[], + int width, + int height) +{ + // + // Tell the image file library about the custom GlorpAttribute type. + // + + GlorpAttribute::registerAttributeType(); + + // + // Write an image file with two custom attributes: + // "custom1", of type IntAttribute, and + // "custom2", of type GlorpAttribute. + // + + { + Header hdr (width, height); + + hdr.insert ("custom1", IntAttribute (25)); + hdr.insert ("custom2", GlorpAttribute (Glorp (4, 9))); + + hdr.channels().insert ("F", // name + Channel (IMF::FLOAT, // type + 1, // xSampling + 1) // ySampling + ); + + FrameBuffer fb; + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[0][0], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << "writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + // + // Tell the image file library to forget the GlorpAttribute type. + // + + GlorpAttribute::unRegisterAttributeType(); + + // + // Read the header back from the file: + // "custom1" should come back as an IntAttribute, and + // "custom2" should come back as an OpaqueAttribute. + // + + Header hdr; + + { + cout << " reading" << flush; + + InputFile in (fileName); + + const IntAttribute *c1; + const OpaqueAttribute *c2; + + c1 = in.header().findTypedAttribute ("custom1"); + c2 = in.header().findTypedAttribute ("custom2"); + + assert (c1 != 0 && c1->value() == 25); + assert (c2 != 0); + + hdr = in.header(); + } + + // + // Tell the image file library to remember the custom GlorpAttribute type. + // + + GlorpAttribute::registerAttributeType(); + + // + // Write a new image file using the header read back from + // the previous file file. The two custom attributes should + // be stored in the new file. + // + + { + FrameBuffer fb; + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[0][0], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << " writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + // + // Read the header of the new image file: + // "custom1" should come back as an IntAttribute, and + // "custom2" should come back as a GlorpAttribute. + // + + { + cout << " reading" << flush; + + InputFile in (fileName); + + const IntAttribute *c1; + const GlorpAttribute *c2; + + c1 = in.header().findTypedAttribute ("custom1"); + c2 = in.header().findTypedAttribute ("custom2"); + + assert (c1 != 0 && c1->value() == 25); + assert (c2 != 0 && c2->value().a == 4 && c2->value().b == 9); + } + + remove (fileName); + cout << endl; +} + + +} // namespace + + +void +testCustomAttributes (const std::string &tempDir) +{ + try + { + cout << "Testing custom attributes" << endl; + + const int W = 217; + const int H = 197; + + Array2D pf (H, W); + fillPixels (pf, W, H); + + std::string filename = tempDir + "imf_test_custom_attr.exr"; + + writeReadCustomAttr (pf, filename.c_str(), W, H); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testCustomAttributes.h b/IlmImfTest/testCustomAttributes.h new file mode 100644 index 0000000..fe3f6b1 --- /dev/null +++ b/IlmImfTest/testCustomAttributes.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testCustomAttributes (const std::string &tempDir); + diff --git a/IlmImfTest/testDeepScanLineBasic.cpp b/IlmImfTest/testDeepScanLineBasic.cpp new file mode 100644 index 0000000..5e9cd60 --- /dev/null +++ b/IlmImfTest/testDeepScanLineBasic.cpp @@ -0,0 +1,576 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testDeepScanLineBasic.h" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int width = 273; +const int height = 173; +const int minX = 10; +const int minY = 11; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); + +vector channelTypes; +Array2D sampleCount; +Header header; + +void generateRandomFile (const std::string filename, + int channelCount, + Compression compression, + bool bulkWrite) +{ + cout << "generating " << flush; + header = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + + cout << "compression " << compression << " " << flush; + + // + // Add channels. + // + + channelTypes.clear(); + + for (int i = 0; i < channelCount; i++) + { + int type = rand() % 3; + stringstream ss; + ss << i; + string str = ss.str(); + if (type == 0) + header.channels().insert(str, Channel(IMF::UINT)); + if (type == 1) + header.channels().insert(str, Channel(IMF::HALF)); + if (type == 2) + header.channels().insert(str, Channel(IMF::FLOAT)); + channelTypes.push_back(type); + } + + header.setType(DEEPSCANLINE); + + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + sampleCount.resizeErase(height, width); + + remove (filename.c_str()); + DeepScanLineOutputFile file(filename.c_str(), header, 8); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&sampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base + sizeof (unsigned int) * 1, // xStride + sizeof (unsigned int) * width)); // yStride + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof(char *); + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + file.setFrameBuffer(frameBuffer); + + cout << "writing " << flush; + if (bulkWrite) + { + cout << "bulk " << flush; + for (int i = 0; i < height; i++) + { + // + // Fill in data at the last minute. + // + + for (int j = 0; j < width; j++) + { + sampleCount[i][j] = rand() % 10 + 1; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][i][j] = new unsigned int[sampleCount[i][j]]; + if (channelTypes[k] == 1) + data[k][i][j] = new half[sampleCount[i][j]]; + if (channelTypes[k] == 2) + data[k][i][j] = new float[sampleCount[i][j]]; + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][i][j])[l] = (i * width + j) % 2049; + } + } + } + } + + file.writePixels(height); + } + else + { + cout << "per-line " << flush; + for (int i = 0; i < height; i++) + { + // + // Fill in data at the last minute. + // + + for (int j = 0; j < width; j++) + { + sampleCount[i][j] = rand() % 10 + 1; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][i][j] = new unsigned int[sampleCount[i][j]]; + if (channelTypes[k] == 1) + data[k][i][j] = new half[sampleCount[i][j]]; + if (channelTypes[k] == 2) + data[k][i][j] = new float[sampleCount[i][j]]; + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][i][j])[l] = (i * width + j) % 2049; + } + } + } + file.writePixels(1); + } + } + + for (int i = 0; i < height; i++) + for (int j = 0; j < width; j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } +} + +void readFile (const std::string & filename, + int channelCount, + bool bulkRead, + bool randomChannels) +{ + if(randomChannels) + { + cout << " reading random channels " << flush; + } + else + { + cout << " reading all channels " << flush; + } + + DeepScanLineInputFile file(filename.c_str(), 8); + + const Header& fileHeader = file.header(); + assert (fileHeader.displayWindow() == header.displayWindow()); + assert (fileHeader.dataWindow() == header.dataWindow()); + assert (fileHeader.pixelAspectRatio() == header.pixelAspectRatio()); + assert (fileHeader.screenWindowCenter() == header.screenWindowCenter()); + assert (fileHeader.screenWindowWidth() == header.screenWindowWidth()); + assert (fileHeader.lineOrder() == header.lineOrder()); + assert (fileHeader.compression() == header.compression()); + assert (fileHeader.channels() == header.channels()); + assert (fileHeader.type() == header.type()); + + Array2D localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&localSampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + vector read_channel(channelCount); + + + int channels_added=0; + + for (int i = 0; i < channelCount; i++) + { + if(randomChannels) + { + read_channel[i] = rand() % 2; + + } + if(!randomChannels || read_channel[i]==1) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + channels_added++; + } + } + + + if(channels_added==0) + { + cout << "skipping " <1) + readFile (filename, channelCount, false , true ); + remove (filename.c_str()); + cout << endl << flush; + + generateRandomFile (filename, channelCount, compression, true); + readFile (filename, channelCount, true , false ); + if (channelCount>1) + readFile (filename, channelCount, true , true ); + remove (filename.c_str()); + cout << endl << flush; + } +} + +void testCompressionTypeChecks() +{ + Header h; + h.setType(DEEPTILE); + h.compression()=NO_COMPRESSION; + h.sanityCheck(); + h.compression()=ZIPS_COMPRESSION; + h.sanityCheck(); + h.compression()=RLE_COMPRESSION; + h.sanityCheck(); + + cout << "accepted valid compression types\n"; + // + // these should fail + // + try{ + h.compression()=ZIP_COMPRESSION; + h.sanityCheck(); + assert(false); + }catch(...){ + cout << "correctly identified bad compression setting (zip)\n"; + } + try{ + h.compression()=B44_COMPRESSION; + h.sanityCheck(); + assert(false); + }catch(...){ + cout << "correctly identified bad compression setting (b44)\n"; + } + try{ + h.compression()=B44A_COMPRESSION; + h.sanityCheck(); + assert(false); + }catch(...) { + cout << "correctly identified bad compression setting (b44a)\n"; + } + try{ + h.compression()=PXR24_COMPRESSION; + h.sanityCheck(); + assert(false); + }catch(...) { + cout << "correctly identified bad compression setting (pxr24)\n"; + } + + + return; +} + +}; // namespace + +void testDeepScanLineBasic (const std::string &tempDir) +{ + try + { + cout << "\n\nTesting the DeepScanLineInput/OutputFile for basic use:\n" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(4); + + + testCompressionTypeChecks(); + + readWriteTest (tempDir, 1, 100); + readWriteTest (tempDir, 3, 50); + readWriteTest (tempDir,10, 10); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testDeepScanLineBasic.h b/IlmImfTest/testDeepScanLineBasic.h new file mode 100644 index 0000000..c2f017b --- /dev/null +++ b/IlmImfTest/testDeepScanLineBasic.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTDEEPSCANLINEBASIC_H_ +#define TESTDEEPSCANLINEBASIC_H_ + +#include + +void testDeepScanLineBasic (const std::string &tempDir); + +#endif /* TESTDEEPSCANLINEBASIC_H_ */ diff --git a/IlmImfTest/testDeepScanLineHuge.cpp b/IlmImfTest/testDeepScanLineHuge.cpp new file mode 100644 index 0000000..8887789 --- /dev/null +++ b/IlmImfTest/testDeepScanLineHuge.cpp @@ -0,0 +1,438 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testDeepScanLineBasic.h" + +#include "ImfDeepScanLineInputFile.h" +#include "ImfDeepScanLineOutputFile.h" +#include "ImfDeepFrameBuffer.h" +#include "ImfPartType.h" +#include "ImfChannelList.h" +#include "ImfArray.h" +#include "IlmThreadPool.h" + +#include "tmpDir.h" + +#include +#include +#include +#include + +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int width = 8193; +const int height = 1; +const int minX = 0; +const int minY = 0; +const long numGib = 1; // number of GiB to allocate for huge test +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); + +vector channelTypes; +Array2D sampleCount; +vector storage; // actual pixel storage for entire image (effectively) + +Header header; + +void +generateRandomFile (int channelCount, + Compression compression, + bool random_channel_data, + const std::string & fn) +{ + cout << "generating ... " << flush; + header = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + + cout << "compression " << compression << " " << flush; + + // + // Add channels. + // + + channelTypes.clear(); + + for (int i = 0; i < channelCount; i++) + { + int type = rand() % 3; + stringstream ss; + ss << i; + string str = ss.str(); + if (type == 0) + header.channels().insert(str, Channel(IMF::UINT)); + if (type == 1) + header.channels().insert(str, Channel(IMF::HALF)); + if (type == 2) + header.channels().insert(str, Channel(IMF::FLOAT)); + channelTypes.push_back(type); + } + + header.setType(DEEPSCANLINE); + + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + sampleCount.resizeErase(height, width); + + remove (fn.c_str()); + DeepScanLineOutputFile file (fn.c_str(), header, 8); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&sampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + + // count total size of all pixels + Int64 bytes_per_sample = 0; + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof(char *); + + bytes_per_sample+=sampleSize; + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8 + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + file.setFrameBuffer(frameBuffer); + + cout << "writing file " << endl; + + Int64 total_number_of_samples = 0; + + // compute ideal number of samples per pixel assuming we want abotut 5GiB of data + // int samples_per_pixel = int(5l*1024l*1024l*1024l/Int64(width*height)) / bytes_per_sample; + + // compute ideal number of samples per pixel assuming we want abotut 15GiB of data + int samples_per_pixel = int(numGib*1024l*1024l*1024l/Int64(width*height)) / bytes_per_sample; + + cout << " generating approx. " << samples_per_pixel << " samples per pixel\n"; + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + sampleCount[i][j] = (rand() % 4000) + (samples_per_pixel-2000); + total_number_of_samples += sampleCount[i][j]; + } + } + + cout << " total number of samples: " << total_number_of_samples << std::endl; + cout << " storage required: " << total_number_of_samples*bytes_per_sample << " bytes (" << + ((total_number_of_samples*bytes_per_sample)>>30) << "GiB)" << std::endl; + + + // + // storage layout scheme: + // [Pixel1: [Channel1: [Sample1 Sample2 Sample...] ] [Channel2: [Sample1 Sample2...] ] [Channnel...] ] + // [Pixel2: [Channel1: [Sample1 Sample2 Sample...] ] [Channel2: [Sample1 Sample2...] ] [Channnel...] ] + // [Pixel...] + // + storage.resize(total_number_of_samples*bytes_per_sample); + + + + Int64 write_pointer=0; + + for (int i = 0; i < height; i++) + { + // + // Fill in data at the last minute. + // + + + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + data[k][i][j]=&storage[write_pointer]; + if (channelTypes[k] == 0) + write_pointer+=sizeof(int)*sampleCount[i][j]; + if (channelTypes[k] == 1) + write_pointer+=sizeof(half)*sampleCount[i][j]; + if (channelTypes[k] == 2) + write_pointer+=sizeof(float)*sampleCount[i][j]; + + if(random_channel_data) + { + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][i][j])[l] = rand(); + if (channelTypes[k] == 1) + ((half*)data[k][i][j])[l] = rand()/RAND_MAX; + if (channelTypes[k] == 2) + ((float*)data[k][i][j])[l] = rand()/RAND_MAX; + } + } + else + { + for (int l = 0; l < sampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][i][j])[l] = (i * width + j) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][i][j])[l] = (i * width + j) % 2049; + } + } + } + + } + } + + cout << " data prepared, writing ..."; + + file.writePixels(height); + cout << " data written\n"; + +} + +void +readFile (int channelCount, bool bulkRead, const std::string & fn) +{ + cout << "reading \n" << flush; + + DeepScanLineInputFile file (fn.c_str(), 8); + + const Header& fileHeader = file.header(); + assert (fileHeader.displayWindow() == header.displayWindow()); + assert (fileHeader.dataWindow() == header.dataWindow()); + assert (fileHeader.pixelAspectRatio() == header.pixelAspectRatio()); + assert (fileHeader.screenWindowCenter() == header.screenWindowCenter()); + assert (fileHeader.screenWindowWidth() == header.screenWindowWidth()); + assert (fileHeader.lineOrder() == header.lineOrder()); + assert (fileHeader.compression() == header.compression()); + assert (fileHeader.channels() == header.channels()); + assert (fileHeader.type() == header.type()); + + Array2D localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, // type // 7 + (char *) (&localSampleCount[0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + sizeof (unsigned int) * 1, // xStride// 9 + sizeof (unsigned int) * width)); // yStride// 10 + + Int64 bytes_per_sample=0; + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + bytes_per_sample+=sampleSize; + + frameBuffer.insert (str, // name // 6 + DeepSlice (type, // type // 7 + (char *) (&data[i][0][0] + - dataWindow.min.x + - dataWindow.min.y * width), // base // 8) + pointerSize * 1, // xStride// 9 + pointerSize * width, // yStride// 10 + sampleSize)); // sampleStride + } + + file.setFrameBuffer(frameBuffer); + + file.readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y); + Int64 total_pixel_count = 0; + + for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) + { + int y = i + dataWindow.min.y; + + + for (int j = 0; j < width; j++) + { + assert(localSampleCount[i][j] == sampleCount[i][j]); + total_pixel_count += localSampleCount[i][j]; + } + } + + + vector localstorage(total_pixel_count*bytes_per_sample); + + Int64 write_pointer=0; + + for (int i = 0; i < height; i++) + { + // + // Fill in data at the last minute. + // + + + for (int j = 0; j < width; j++) + { + for (int k = 0; k < channelCount; k++) + { + data[k][i][j]=&localstorage[write_pointer]; + if (channelTypes[k] == 0) + write_pointer+=sizeof(int)*sampleCount[i][j]; + if (channelTypes[k] == 1) + write_pointer+=sizeof(half)*sampleCount[i][j]; + if (channelTypes[k] == 2) + write_pointer+=sizeof(float)*sampleCount[i][j]; + } + } + } + + cout << "reading image data ... " << flush; + + file.readPixels(dataWindow.min.y, dataWindow.max.y); + + cout << " image read \n" << flush; + +} + +void +readWriteTest (int channelCount, + int testTimes, + bool random_channel_data, + const std::string & fn) +{ + cout << "Testing files with " << channelCount << " channels " << testTimes << " times." + << endl << flush; + for (int i = 0; i < testTimes; i++) + { + int compressionIndex = i % 3; + Compression compression; + switch (compressionIndex) + { + case 0: + compression = NO_COMPRESSION; + break; + case 1: + compression = RLE_COMPRESSION; + break; + case 2: + compression = ZIPS_COMPRESSION; + break; + } + + generateRandomFile (channelCount, compression, random_channel_data, fn); + readFile (channelCount, false, fn); + remove (fn.c_str()); + + } +} + +}; // namespace + +void testDeepScanLineHuge (const std::string & tempDir) +{ + try + { + cout << "\n\nTesting the DeepScanLineInput/OutputFile for huge scanlines:\n" << endl; + + srand(1); + std::string fn = tempDir + "imf_test_deep_scanline_huge.exr"; + + readWriteTest (10, 5 , false, fn); + readWriteTest (10, 5 , true, fn); + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} + diff --git a/IlmImfTest/testDeepScanLineHuge.h b/IlmImfTest/testDeepScanLineHuge.h new file mode 100644 index 0000000..ba8709e --- /dev/null +++ b/IlmImfTest/testDeepScanLineHuge.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTDEEPSCANLINEHUGE_H_ +#define TESTDEEPSCANLINEHUGE_H_ + +void testDeepScanLineHuge (const std::string & tempDir); + +#endif /* TESTDEEPSCANLINEHUGE_H_ */ diff --git a/IlmImfTest/testDeepScanLineMultipleRead.cpp b/IlmImfTest/testDeepScanLineMultipleRead.cpp new file mode 100644 index 0000000..e5f0b03 --- /dev/null +++ b/IlmImfTest/testDeepScanLineMultipleRead.cpp @@ -0,0 +1,229 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testCompositeDeepScanLine.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "tmpDir.h" + +namespace{ + +const char source_filename[] = IMF_TMP_DIR "imf_test_multiple_read.exr"; + +using std::cout; +using std::endl; +using std::flush; +using std::vector; + +using OPENEXR_IMF_NAMESPACE::Header; +using OPENEXR_IMF_NAMESPACE::Channel; +using OPENEXR_IMF_NAMESPACE::UINT; +using OPENEXR_IMF_NAMESPACE::FLOAT; +using OPENEXR_IMF_NAMESPACE::DEEPSCANLINE; +using OPENEXR_IMF_NAMESPACE::ZIPS_COMPRESSION; +using OPENEXR_IMF_NAMESPACE::DeepScanLineOutputFile; +using OPENEXR_IMF_NAMESPACE::DeepScanLineInputFile; +using OPENEXR_IMF_NAMESPACE::DeepFrameBuffer; +using OPENEXR_IMF_NAMESPACE::Slice; +using OPENEXR_IMF_NAMESPACE::DeepSlice; +using IMATH_NAMESPACE::Box2i; + +namespace IMF = OPENEXR_IMF_NAMESPACE; + +static void +make_file(const char * filename) +{ + + int width=4; + int height=48; + + // + // create a deep output file of widthxheight, where each pixel has 'y' samples, + // each with value 'x' + // + + Header header( width,height); + header.channels().insert("Z", Channel(IMF::FLOAT)); + header.compression()=ZIPS_COMPRESSION; + header.setType(DEEPSCANLINE); + + remove (filename); + DeepScanLineOutputFile file(filename, header); + + unsigned int sample_count; + float sample; + float * sample_ptr = &sample; + + DeepFrameBuffer fb; + + fb.insertSampleCountSlice(Slice(IMF::UINT,(char *)&sample_count)); + fb.insert("Z",DeepSlice(IMF::FLOAT,(char *) &sample_ptr)); + + + file.setFrameBuffer(fb); + + for( int y=0 ; y < height ; y++ ) + { + // + // ensure each scanline contains a different number of samples, + // with different values. We don't care that each sample has the same + // value, or that each pixel on the scanline is identical + // + sample_count = y; + sample = y+100.0; + + file.writePixels(1); + + } + +} + +static void read_file(const char * filename) +{ + DeepScanLineInputFile file(filename); + + Box2i datawin = file.header().dataWindow(); + int width = datawin.size().x+1; + int height = datawin.size().y+1; + int x_offset = datawin.min.x; + int y_offset = datawin.min.y; + const char * channel = file.header().channels().begin().name(); + + vector samplecounts(width); + vector sample_pointers(width); + vector samples; + + DeepFrameBuffer fb; + + fb.insertSampleCountSlice(Slice(IMF::UINT,(char *) (&samplecounts[0]-x_offset) , sizeof(unsigned int))); + + fb.insert( channel, DeepSlice(IMF::FLOAT,(char *) (&sample_pointers[0]-x_offset) , sizeof(float *),0,sizeof(float)) ); + + file.setFrameBuffer(fb); + + for(int count=0;count<4000;count++) + { + int row = rand() % height + y_offset; + + // + // read row y (at random) + // + + file.readPixelSampleCounts(row,row); + // + // check that's correct, and also resize samples array + // + + int total_samples = 0; + for(int i=0;i + +void testDeepScanLineMultipleRead(const std::string & tempDir); + +#endif /* DEEPSCANLINEMULTIPLEREAD_H_ */ diff --git a/IlmImfTest/testDeepTiledBasic.cpp b/IlmImfTest/testDeepTiledBasic.cpp new file mode 100644 index 0000000..081005e --- /dev/null +++ b/IlmImfTest/testDeepTiledBasic.cpp @@ -0,0 +1,761 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testDeepTiledBasic.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; +using namespace std; + +namespace +{ + +const int width = 273; +const int height = 169; +const int minX = 10; +const int minY = 11; +const Box2i dataWindow(V2i(minX, minY), V2i(minX + width - 1, minY + height - 1)); +const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2)); + +vector channelTypes; +Array2D< Array2D > sampleCountWhole; +Header header; + +void generateRandomFile (int channelCount, + Compression compression, + bool bulkWrite, + bool relativeCoords, + const std::string & filename) +{ + if (relativeCoords) + assert(bulkWrite == false); + + cout << "generating " << flush; + header = Header(displayWindow, dataWindow, + 1, + IMATH_NAMESPACE::V2f (0, 0), + 1, + INCREASING_Y, + compression); + cout << "compression " << compression << " " << flush; + + // + // Add channels. + // + + channelTypes.clear(); + + for (int i = 0; i < channelCount; i++) + { + int type = rand() % 3; + stringstream ss; + ss << i; + string str = ss.str(); + if (type == 0) + header.channels().insert(str, Channel(IMF::UINT)); + if (type == 1) + header.channels().insert(str, Channel(IMF::HALF)); + if (type == 2) + header.channels().insert(str, Channel(IMF::FLOAT)); + channelTypes.push_back(type); + } + + header.setType(DEEPTILE); + header.setTileDescription( + TileDescription(rand() % width + 1, rand() % height + 1, RIPMAP_LEVELS)); + + + // + // Set up the output file + // + remove (filename.c_str()); + DeepTiledOutputFile file(filename.c_str(), header, 8); + + DeepFrameBuffer frameBuffer; + + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + Array2D sampleCount; + sampleCount.resizeErase(height, width); + + cout << " tileSizeX " << file.tileXSize() + << " tileSizeY " << file.tileYSize() << " "; + + sampleCountWhole.resizeErase(file.numYLevels(), file.numXLevels()); + for (int i = 0; i < sampleCountWhole.height(); i++) + for (int j = 0; j < sampleCountWhole.width(); j++) + sampleCountWhole[i][j].resizeErase(height, width); + + int memOffset; + if (relativeCoords) + memOffset = 0; + else + memOffset = dataWindow.min.x + dataWindow.min.y * width; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width, + 1, 1, + 0, + relativeCoords, + relativeCoords)); + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize, + 1, 1, + 0, + relativeCoords, + relativeCoords)); + } + + file.setFrameBuffer(frameBuffer); + + cout << "writing " << flush; + + if (bulkWrite) + cout << "bulk " << flush; + else + { + if (relativeCoords == false) + cout << "per-tile " << flush; + else + cout << "per-tile with relative coordinates " << flush; + } + + for (int ly = 0; ly < file.numYLevels(); ly++) + for (int lx = 0; lx < file.numXLevels(); lx++) + { + Box2i dataWindowL = file.dataWindowForLevel(lx, ly); + + if (bulkWrite) + { + // + // Bulk write (without relative coordinates). + // + + for (int j = 0; j < file.numYTiles(ly); j++) + { + for (int i = 0; i < file.numXTiles(lx); i++) + { + Box2i box = file.dataWindowForTile(i, j, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + sampleCount[dwy][dwx] = rand() % 10 + 1; + sampleCountWhole[ly][lx][dwy][dwx] = sampleCount[dwy][dwx]; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[sampleCount[dwy][dwx]]; + for (int l = 0; l < sampleCount[dwy][dwx]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][dwy][dwx])[l] = (dwy* width + dwx) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + } + } + } + } + } + + file.writeTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + } + else if (bulkWrite == false) + { + if (relativeCoords == false) + { + // + // Per-tile write without relative coordinates. + // + + for (int j = 0; j < file.numYTiles(ly); j++) + { + for (int i = 0; i < file.numXTiles(lx); i++) + { + Box2i box = file.dataWindowForTile(i, j, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + sampleCount[dwy][dwx] = rand() % 10 + 1; + sampleCountWhole[ly][lx][dwy][dwx] = sampleCount[dwy][dwx]; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[sampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[sampleCount[dwy][dwx]]; + for (int l = 0; l < sampleCount[dwy][dwx]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][dwy][dwx])[l] = (dwy* width + dwx) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][dwy][dwx])[l] = (dwy * width + dwx) % 2049; + } + } + } + file.writeTile(i, j, lx, ly); + } + } + } + else if (relativeCoords) + { + // + // Per-tile write with relative coordinates. + // + + for (int j = 0; j < file.numYTiles(ly); j++) + { + for (int i = 0; i < file.numXTiles(lx); i++) + { + Box2i box = file.dataWindowForTile(i, j, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + int ty = y - box.min.y; + int tx = x - box.min.x; + sampleCount[ty][tx] = rand() % 10 + 1; + sampleCountWhole[ly][lx][dwy][dwx] = sampleCount[ty][tx]; + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + data[k][ty][tx] = new unsigned int[sampleCount[ty][tx]]; + if (channelTypes[k] == 1) + data[k][ty][tx] = new half[sampleCount[ty][tx]]; + if (channelTypes[k] == 2) + data[k][ty][tx] = new float[sampleCount[ty][tx]]; + for (int l = 0; l < sampleCount[ty][tx]; l++) + { + if (channelTypes[k] == 0) + ((unsigned int*)data[k][ty][tx])[l] = + (dwy * width + dwx) % 2049; + if (channelTypes[k] == 1) + ((half*)data[k][ty][tx])[l] = + (dwy * width + dwx) % 2049; + if (channelTypes[k] == 2) + ((float*)data[k][ty][tx])[l] = + (dwy * width + dwx) % 2049; + } + } + } + file.writeTile(i, j, lx, ly); + + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + for (int k = 0; k < channelCount; k++) + { + int ty = y - box.min.y; + int tx = x - box.min.x; + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][ty][tx]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][ty][tx]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][ty][tx]; + } + } + } + } + } + + if (relativeCoords == false) + { + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } + } + } +} + +void checkValue (void* sampleRawData, + int sampleCount, + int channelType, + int dwx, + int dwy) +{ + for (int l = 0; l < sampleCount; l++) + { + if (channelType == 0) + { + unsigned int* value = (unsigned int*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + if (channelType == 1) + { + half* value = (half*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + if (channelType == 2) + { + float* value = (float*)(sampleRawData); + if (value[l] != (dwy * width + dwx) % 2049) + cout << dwx << ", " << dwy << " error, should be " + << (dwy * width + dwx) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (dwy * width + dwx) % 2049); + } + } +} + +void readFile (int channelCount, + bool bulkRead, + bool relativeCoords, + const std::string & filename) +{ + if (relativeCoords) + assert(bulkRead == false); + + cout << "reading " << flush; + + DeepTiledInputFile file (filename.c_str(), 4); + + const Header& fileHeader = file.header(); + assert (fileHeader.displayWindow() == header.displayWindow()); + assert (fileHeader.dataWindow() == header.dataWindow()); + assert (fileHeader.pixelAspectRatio() == header.pixelAspectRatio()); + assert (fileHeader.screenWindowCenter() == header.screenWindowCenter()); + assert (fileHeader.screenWindowWidth() == header.screenWindowWidth()); + assert (fileHeader.lineOrder() == header.lineOrder()); + assert (fileHeader.compression() == header.compression()); + assert (fileHeader.channels() == header.channels()); + assert (fileHeader.type() == header.type()); + assert (fileHeader.tileDescription() == header.tileDescription()); + + Array2D localSampleCount; + localSampleCount.resizeErase(height, width); + Array > data(channelCount); + for (int i = 0; i < channelCount; i++) + data[i].resizeErase(height, width); + + DeepFrameBuffer frameBuffer; + + int memOffset; + if (relativeCoords) + memOffset = 0; + else + memOffset = dataWindow.min.x + dataWindow.min.y * width; + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&localSampleCount[0][0] - memOffset), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width, + 1, 1, + 0, + relativeCoords, + relativeCoords)); + + for (int i = 0; i < channelCount; i++) + { + PixelType type; + if (channelTypes[i] == 0) + type = IMF::UINT; + if (channelTypes[i] == 1) + type = IMF::HALF; + if (channelTypes[i] == 2) + type = IMF::FLOAT; + + stringstream ss; + ss << i; + string str = ss.str(); + + int sampleSize; + if (channelTypes[i] == 0) sampleSize = sizeof (unsigned int); + if (channelTypes[i] == 1) sampleSize = sizeof (half); + if (channelTypes[i] == 2) sampleSize = sizeof (float); + + int pointerSize = sizeof (char *); + + frameBuffer.insert (str, + DeepSlice (type, + (char *) (&data[i][0][0] - memOffset), + pointerSize * 1, + pointerSize * width, + sampleSize, + 1, 1, + 0, + relativeCoords, + relativeCoords)); + } + + file.setFrameBuffer(frameBuffer); + + if (bulkRead) + cout << "bulk " << flush; + else + { + if (relativeCoords == false) + cout << "per-tile " << flush; + else + cout << "per-tile with relative coordinates " << flush; + } + + for (int ly = 0; ly < file.numYLevels(); ly++) + for (int lx = 0; lx < file.numXLevels(); lx++) + { + Box2i dataWindowL = file.dataWindowForLevel(lx, ly); + + if (bulkRead) + { + // + // Testing bulk read (without relative coordinates). + // + + file.readPixelSampleCounts(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + + for (int i = 0; i < file.numYTiles(ly); i++) + { + for (int j = 0; j < file.numXTiles(lx); j++) + { + Box2i box = file.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + assert(localSampleCount[dwy][dwx] == sampleCountWhole[ly][lx][dwy][dwx]); + + for (int k = 0; k < channelTypes.size(); k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; + } + } + } + } + + file.readTiles(0, file.numXTiles(lx) - 1, 0, file.numYTiles(ly) - 1, lx, ly); + } + else if (bulkRead == false) + { + if (relativeCoords == false) + { + // + // Testing per-tile read without relative coordinates. + // + + for (int i = 0; i < file.numYTiles(ly); i++) + { + for (int j = 0; j < file.numXTiles(lx); j++) + { + file.readPixelSampleCount(j, i, lx, ly); + + Box2i box = file.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + assert(localSampleCount[dwy][dwx] == sampleCountWhole[ly][lx][dwy][dwx]); + + for (int k = 0; k < channelTypes.size(); k++) + { + if (channelTypes[k] == 0) + data[k][dwy][dwx] = new unsigned int[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 1) + data[k][dwy][dwx] = new half[localSampleCount[dwy][dwx]]; + if (channelTypes[k] == 2) + data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]]; + } + } + + file.readTile(j, i, lx, ly); + } + } + } + else if (relativeCoords) + { + // + // Testing per-tile read with relative coordinates. + // + + for (int i = 0; i < file.numYTiles(ly); i++) + { + for (int j = 0; j < file.numXTiles(lx); j++) + { + file.readPixelSampleCount(j, i, lx, ly); + + Box2i box = file.dataWindowForTile(j, i, lx, ly); + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + int ty = y - box.min.y; + int tx = x - box.min.x; + assert(localSampleCount[ty][tx] == sampleCountWhole[ly][lx][dwy][dwx]); + + for (int k = 0; k < channelTypes.size(); k++) + { + if (channelTypes[k] == 0) + data[k][ty][tx] = new unsigned int[localSampleCount[ty][tx]]; + if (channelTypes[k] == 1) + data[k][ty][tx] = new half[localSampleCount[ty][tx]]; + if (channelTypes[k] == 2) + data[k][ty][tx] = new float[localSampleCount[ty][tx]]; + } + } + + file.readTile(j, i, lx, ly); + + for (int y = box.min.y; y <= box.max.y; y++) + for (int x = box.min.x; x <= box.max.x; x++) + { + int dwy = y - dataWindowL.min.y; + int dwx = x - dataWindowL.min.x; + int ty = y - box.min.y; + int tx = x - box.min.x; + + for (int k = 0; k < channelTypes.size(); k++) + { + checkValue(data[k][ty][tx], + localSampleCount[ty][tx], + channelTypes[k], + dwx, dwy); + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][ty][tx]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][ty][tx]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][ty][tx]; + } + } + } + } + } + } + + if (relativeCoords == false) + { + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + for (int l = 0; l < localSampleCount[i][j]; l++) + { + if (channelTypes[k] == 0) + { + unsigned int* value = (unsigned int*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (value[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 1) + { + half* value = (half*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((half*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + if (channelTypes[k] == 2) + { + float* value = (float*)(data[k][i][j]); + if (value[l] != (i * width + j) % 2049) + cout << j << ", " << i << " error, should be " + << (i * width + j) % 2049 << ", is " << value[l] + << endl << flush; + assert (((float*)(data[k][i][j]))[l] == (i * width + j) % 2049); + } + } + } + + for (int i = 0; i < file.levelHeight(ly); i++) + for (int j = 0; j < file.levelWidth(lx); j++) + for (int k = 0; k < channelCount; k++) + { + if (channelTypes[k] == 0) + delete[] (unsigned int*) data[k][i][j]; + if (channelTypes[k] == 1) + delete[] (half*) data[k][i][j]; + if (channelTypes[k] == 2) + delete[] (float*) data[k][i][j]; + } + } + } +} + +void readWriteTestWithAbsoluateCoordinates (int channelCount, + int testTimes, + const std::string & tempDir) +{ + cout << "Testing files with " << channelCount + << " channels, using absolute coordinates " + << testTimes << " times." + << endl << flush; + + std::string fn = tempDir + "imf_test_deep_tiled_basic.exr"; + + for (int i = 0; i < testTimes; i++) + { + int compressionIndex = i % 3; + Compression compression; + switch (compressionIndex) + { + case 0: + compression = NO_COMPRESSION; + break; + case 1: + compression = RLE_COMPRESSION; + break; + case 2: + compression = ZIPS_COMPRESSION; + break; + } + + generateRandomFile (channelCount, compression, false, false, fn); + readFile (channelCount, false, false, fn); + remove (fn.c_str()); + cout << endl << flush; + + generateRandomFile (channelCount, compression, true, false, fn); + readFile (channelCount, true, false, fn); + remove (fn.c_str()); + cout << endl << flush; + + generateRandomFile (channelCount, compression, false, true, fn); + readFile (channelCount, false, true, fn); + remove (fn.c_str()); + cout << endl << flush; + } +} + +} // namespace + +void testDeepTiledBasic (const std::string & tempDir) +{ + try + { + cout << "Testing the DeepTiledInput/OutputFile for basic use" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(2); + + readWriteTestWithAbsoluateCoordinates ( 1, 2, tempDir); + readWriteTestWithAbsoluateCoordinates ( 3, 2, tempDir); + readWriteTestWithAbsoluateCoordinates (10, 2, tempDir); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testDeepTiledBasic.h b/IlmImfTest/testDeepTiledBasic.h new file mode 100644 index 0000000..0b8a8d2 --- /dev/null +++ b/IlmImfTest/testDeepTiledBasic.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTDEEPTILEDBASIC_H_ +#define TESTDEEPTILEDBASIC_H_ + +#include + +void testDeepTiledBasic (const std::string & tempDir); + +#endif /* TESTDEEPTILEDBASIC_H_ */ diff --git a/IlmImfTest/testDwaCompressorSimd.cpp b/IlmImfTest/testDwaCompressorSimd.cpp new file mode 100644 index 0000000..c2dfaea --- /dev/null +++ b/IlmImfTest/testDwaCompressorSimd.cpp @@ -0,0 +1,502 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace std; + + +namespace +{ + +void +dumpBuffer (const SimdAlignedBuffer64f &buffer) +{ + for (int i=0; i<8; ++i) + { + for (int j=0; j<8; ++j) + { + cout << buffer._buffer[i*8+j] << " "; + } + cout << endl; + } +} + +void +compareBuffer (const SimdAlignedBuffer64f &src, + const SimdAlignedBuffer64f &dst, + const float errThresh) +{ + for (int i=0; i<64; ++i) + { + double diff = fabs(src._buffer[i] - dst._buffer[i]); + + if (diff > errThresh) + { + cout << scientific; + cout << "Error exceeded threshold on element " << i << endl; + cout << " diff: " << diff << endl; + cout << "Goal (src): " << scientific << endl; + dumpBuffer(src); + cout << "Test (dst): " << endl; + dumpBuffer(dst); + + assert(false); + } + } +} + +void +compareBufferRelative (const SimdAlignedBuffer64f &src, + const SimdAlignedBuffer64f &dst, + const float relErrThresh, + const float absErrThresh) +{ + for (int i=0; i<64; ++i) + { + double diff = fabs(src._buffer[i] - dst._buffer[i]); + double relDiff = diff / fabs(src._buffer[i]); + + if (relDiff > relErrThresh && diff > absErrThresh) + { + cout << scientific; + cout << "Error exceeded threshold on element " << i << endl; + cout << " diff: " << diff << " relErr: " << fixed << 100.0*relDiff << " %" << endl; + cout << "Goal (src): " << scientific << endl; + dumpBuffer(src); + cout << "Test (dst): " << endl; + dumpBuffer(dst); + + assert(false); + } + } +} + +// +// Test that we can round trip CSC data with reasonable precision +// +void +testCsc() +{ + const int numIter = 1000000; + Rand48 rand48(0); + SimdAlignedBuffer64f orig[3]; + SimdAlignedBuffer64f test[3]; + + cout << " Color Space Conversion Round Trip " << endl; + cout << " csc709Forward64() - 64 x csc709Inverse()" << endl; + for (int iter=0; iter(test._buffer); + + compareBufferRelative(orig, test, .02, 1e-3); + } + + cout << " Inverse, DC Only" << endl; + for (int iter=0; iter(orig._buffer); + dctInverse8x8DcOnly(test._buffer); + + compareBufferRelative(orig, test, .01, 1e-6); + } + + +#define INVERSE_DCT_SCALAR_TEST_N(_func, _n, _desc) \ + cout << " " << _desc << endl; \ + for (int iter=0; iter(orig._buffer); \ + _func<_n>(test._buffer); \ + compareBufferRelative(orig, test, .01, 1e-6); \ + } + + cout << " Inverse, Scalar: " << endl; + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 0, "8x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 1, "7x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 2, "6x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 3, "5x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 4, "4x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 5, "3x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 6, "2x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 7, "1x8") + + CpuId cpuid; + if (cpuid.sse2) + { + cout << " Inverse, SSE2: " << endl; + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 0, "8x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 1, "7x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 2, "6x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 3, "5x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 4, "4x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 5, "3x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 6, "2x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 7, "1x8") + } + + if (cpuid.avx) + { + cout << " Inverse, AVX: " << endl; + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 0, "8x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 1, "7x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 2, "6x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 3, "5x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 4, "4x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 5, "3x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 6, "2x8") + INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 7, "1x8") + } +} + +// +// Test FLOAT -> HALF conversion, mostly for F16C enabled processors +// +void +testFloatToHalf() +{ + cout << " FLOAT -> HALF conversion" << endl; + + const int numIter = 1000000; + Rand48 rand48(0); + SimdAlignedBuffer64f src; + SimdAlignedBuffer64us dst; + + cout << " convertFloatToHalf64_scalar()" << endl; + for (int iter=0; iter " << dst._buffer[i] + << " expected " << value.bits() << endl; + assert(false); + } + } + } + + + CpuId cpuid; + if (cpuid.avx && cpuid.f16c) + { + cout << " convertFloatToHalf64_f16c()" << endl; + for (int iter=0; iter " << dst._buffer[i] + << " expected " << value.bits() << endl; + assert(false); + } + } + } + } +} + +// +// Test ZigZag reordering + HALF -> FLOAT conversion +// +void +testFromHalfZigZag() +{ + SimdAlignedBuffer64us src; + SimdAlignedBuffer64f dst; + + cout << " ZigZag re-ordering with HALF -> FLOAT conversion" << endl; + + // First off, simple check to see that the reordering is working + // This pattern, when converted, should give 0.0 - 63.0 as floats + // in order. + unsigned short pattern[] = { + 0x0000, 0x3c00, 0x4800, 0x4c00, 0x4880, 0x4000, 0x4200, 0x4900, + 0x4c40, 0x4e00, 0x5000, 0x4e40, 0x4c80, 0x4980, 0x4400, 0x4500, + 0x4a00, 0x4cc0, 0x4e80, 0x5020, 0x5100, 0x5200, 0x5120, 0x5040, + 0x4ec0, 0x4d00, 0x4a80, 0x4600, 0x4700, 0x4b00, 0x4d40, 0x4f00, + 0x5060, 0x5140, 0x5220, 0x5300, 0x5320, 0x5240, 0x5160, 0x5080, + 0x4f40, 0x4d80, 0x4b80, 0x4dc0, 0x4f80, 0x50a0, 0x5180, 0x5260, + 0x5340, 0x5360, 0x5280, 0x51a0, 0x50c0, 0x4fc0, 0x50e0, 0x51c0, + 0x52a0, 0x5380, 0x53a0, 0x52c0, 0x51e0, 0x52e0, 0x53c0, 0x53e0 + }; + + cout << " fromHalfZigZag_scaler()" << endl; + for (int i=0; i<64; ++i) + { + src._buffer[i] = pattern[i]; + } + fromHalfZigZag_scalar(src._buffer, dst._buffer); + for (int i=0; i<64; ++i) + { + if ( fabsf(dst._buffer[i] - (float)i) > 1e-5 ) + { + cout << "At index " << i << ": "; + cout << "expecting " << (float)i << "; got " << dst._buffer[i] << endl; + assert(false); + } + } + + // Then compare the two implementations, if supported + CpuId cpuid; + if (cpuid.avx && cpuid.f16c) + { + const int numIter = 1000000; + Rand48 rand48(0); + half h; + SimdAlignedBuffer64f dstF16c; + + cout << " fromHalfZigZag_f16c()" << endl; + + for (int iter=0; iter 1e-5 ) + { + cout << "At index " << i << ": "; + cout << "expecting " << dst._buffer[i] << "; got " + << dstF16c._buffer[i] << endl; + assert(false); + } + } + } // iter + } // f16c +} + + +} // namespace + +void +testDwaCompressorSimd (const string&) +{ + cout << "SIMD helper functions for DwaCompressor:" << endl; + + try + { + + testCsc(); + testInterleave(); + testFloatToHalf(); + testFromHalfZigZag(); + + testDct(); + + } + catch (const exception &e) + { + cout << "unexpected exception: " << e.what() << endl; + assert (false); + } + catch (...) + { + cout << "unexpected exception" << endl; + assert (false); + } + + cout << "ok\n" << endl; +} diff --git a/IlmImfTest/testDwaCompressorSimd.h b/IlmImfTest/testDwaCompressorSimd.h new file mode 100644 index 0000000..55f3927 --- /dev/null +++ b/IlmImfTest/testDwaCompressorSimd.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTDWACOMPRESSORSIMD_H_ +#define TESTDWACOMPRESSORSIMD_H_ + +#include +void testDwaCompressorSimd(const std::string&); + +#endif /* TESTDWACOMPRESSORSIMD_H_ */ + diff --git a/IlmImfTest/testExistingStreams.cpp b/IlmImfTest/testExistingStreams.cpp new file mode 100644 index 0000000..69658c3 --- /dev/null +++ b/IlmImfTest/testExistingStreams.cpp @@ -0,0 +1,566 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "Iex.h" +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + +namespace { + +void +fillPixels1 (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = (x & 1); + p.g = ((x + y) & 1); + p.b = (y & 1); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +fillPixels2 (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = (x & 2); + p.g = ((x + y) & 2); + p.b = (y & 2); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +// +// class MMIFStream -- a memory-mapped implementation of +// class IStream based on class std::ifstream +// + +class MMIFStream: public OPENEXR_IMF_NAMESPACE::IStream +{ + public: + + //------------------------------------------------------- + // A constructor that opens the file with the given name. + // It reads the whole file into an internal buffer and + // then immediately closes the file. + //------------------------------------------------------- + + MMIFStream (const char fileName[]); + + virtual ~MMIFStream (); + + virtual bool isMemoryMapped () const {return true;} + + virtual bool read (char c[/*n*/], int n); + virtual char* readMemoryMapped (int n); + virtual Int64 tellg () {return _pos;} + virtual void seekg (Int64 pos) {_pos = pos;} + virtual void clear () {} + + private: + + char* _buffer; + Int64 _length; + Int64 _pos; +}; + + + +MMIFStream::MMIFStream (const char fileName[]): + OPENEXR_IMF_NAMESPACE::IStream (fileName), + _buffer (0), + _length (0), + _pos (0) +{ + std::ifstream ifs (fileName, ios_base::binary); + + // + // Get length of file + // + + ifs.seekg (0, ios::end); + _length = ifs.tellg(); + ifs.seekg (0, ios::beg); + + // + // Allocate memory + // + + _buffer = new char [_length]; + + // + // Read the entire file + // + + ifs.read (_buffer, _length); + ifs.close(); +} + + +MMIFStream::~MMIFStream () +{ + delete [] _buffer; +} + + +bool +MMIFStream::read (char c[/*n*/], int n) +{ + if ((_pos < 0 || _pos >= _length) && n != 0) + throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); + + Int64 n2 = n; + bool retVal = true; + + if (_length - _pos <= n2) + { + n2 = _length - _pos; + retVal = false; + } + + memcpy (c, &(_buffer[_pos]), n2); + _pos += n2; + return retVal; +} + + +char* +MMIFStream::readMemoryMapped (int n) +{ + if (_pos < 0 || _pos >= _length) + throw IEX_NAMESPACE::InputExc ("Unexpected end of file."); + + if (_pos + n > _length) + throw IEX_NAMESPACE::InputExc ("Reading past end of file."); + + char* retVal = &(_buffer[_pos]); + _pos += n; + return retVal; +} + + +void +writeReadScanLines (const char fileName[], + int width, + int height, + const Array2D &p1) +{ + // + // Save a scanline-based RGBA image, but instead of + // letting the RgbaOutputFile object open the file, + // make the RgbaOutputFile object use an existing + // StdOFStream. Read the image back, using an + // existing StdIFStream, and compare the pixels + // with the original data. Then read the image + // back a second time using a memory-mapped + // MMIFStream (see above). + // + + cout << "scan-line based file:" << endl; + + Header header (width, height); + + { + cout << "writing"; + remove (fileName); + std::ofstream os (fileName, ios_base::binary); + StdOFStream ofs (os, fileName); + RgbaOutputFile out (ofs, header, WRITE_RGBA); + out.setFrameBuffer (&p1[0][0], 1, width); + out.writePixels (height); + } + + { + cout << ", reading"; + std::ifstream is (fileName, ios_base::binary); + StdIFStream ifs (is, fileName); + RgbaInputFile in (ifs); + + const Box2i &dw = in.dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readPixels (dw.min.y, dw.max.y); + + cout << ", comparing"; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + + { + cout << ", reading (memory-mapped)"; + MMIFStream ifs (fileName); + RgbaInputFile in (ifs); + + const Box2i &dw = in.dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readPixels (dw.min.y, dw.max.y); + + cout << ", comparing"; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + + cout << endl; + + remove (fileName); +} +void +writeReadMultiPart (const char fileName[], + int width, + int height, + const Array2D &p1) +{ + // + // Save a two scanline parts in an image, but instead of + // letting the MultiPartOutputFile object open the file, + // make the MultiPartOutputFile object use an existing + // StdOFStream. Read the image back, using an + // existing StdIFStream, and compare the pixels + // with the original data. Then read the image + // back a second time using a memory-mapped + // MMIFStream (see above). + // + + cout << "scan-line based mulitpart file:" << endl; + + vector
headers(2); + headers[0] = Header(width, height); + headers[0].setName("part1"); + headers[0].channels().insert("R",Channel()); + headers[0].channels().insert("G",Channel()); + headers[0].channels().insert("B",Channel()); + headers[0].channels().insert("A",Channel()); + headers[0].setType(SCANLINEIMAGE); + + headers[1]=headers[0]; + headers[1].setName("part2"); + + + { + cout << "writing"; + remove (fileName); + std::ofstream os (fileName, ios_base::binary); + StdOFStream ofs (os, fileName); + MultiPartOutputFile out (ofs, &headers[0],2); + FrameBuffer f; + f.insert("R",Slice(HALF,(char *) &p1[0][0].r,sizeof(Rgba),width*sizeof(Rgba))); + f.insert("G",Slice(HALF,(char *) &p1[0][0].g,sizeof(Rgba),width*sizeof(Rgba))); + f.insert("B",Slice(HALF,(char *) &p1[0][0].b,sizeof(Rgba),width*sizeof(Rgba))); + f.insert("A",Slice(HALF,(char *) &p1[0][0].a,sizeof(Rgba),width*sizeof(Rgba))); + + for(int i=0;i<2;i++) + { + OutputPart p(out,i); + p.setFrameBuffer (f); + p.writePixels (height); + } + } + + { + cout << ", reading"; + std::ifstream is (fileName, ios_base::binary); + StdIFStream ifs (is, fileName); + MultiPartInputFile in (ifs); + + assert(in.parts() == 2); + + assert(in.header(0).dataWindow()==in.header(1).dataWindow()); + + const Box2i &dw = in.header(0).dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + FrameBuffer f; + f.insert("R",Slice(HALF,(char *) &p2[-dy][-dx].r,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("G",Slice(HALF,(char *) &p2[-dy][-dx].g,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("B",Slice(HALF,(char *) &p2[-dy][-dx].b,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("A",Slice(HALF,(char *) &p2[-dy][-dx].a,sizeof(Rgba),w*sizeof(Rgba))); + + for(int part=0;part<2;part++) + { + InputPart p(in,part); + p.setFrameBuffer(f); + p.readPixels (dw.min.y, dw.max.y); + + cout << ", comparing pt " << part; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + } + + { + cout << ", reading (memory-mapped)"; + MMIFStream ifs (fileName); + MultiPartInputFile in (ifs); + + assert(in.parts() == 2); + + assert(in.header(0).dataWindow()==in.header(1).dataWindow()); + + + const Box2i &dw = in.header(0).dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + FrameBuffer f; + f.insert("R",Slice(HALF,(char *) &p2[-dy][-dx].r,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("G",Slice(HALF,(char *) &p2[-dy][-dx].g,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("B",Slice(HALF,(char *) &p2[-dy][-dx].b,sizeof(Rgba),w*sizeof(Rgba))); + f.insert("A",Slice(HALF,(char *) &p2[-dy][-dx].a,sizeof(Rgba),w*sizeof(Rgba))); + + for(int part=0;part<2;part++) + { + InputPart p(in,part); + p.setFrameBuffer(f); + p.readPixels (dw.min.y, dw.max.y); + + cout << ", comparing pt " << part; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + } + + cout << endl; + + remove (fileName); +} + + + +void +writeReadTiles (const char fileName[], + int width, + int height, + const Array2D &p1) +{ + // + // Save a tiled RGBA image, but instead of letting + // the TiledRgbaOutputFile object open the file, make + // it use an existing StdOFStream. Read the image back, + // using an existing StdIFStream, and compare the pixels + // with the original data. Then read the image back a + // second time using a memory-mapped MMIFStream (see above). + // + + cout << "tiled file:" << endl; + + Header header (width, height); + + { + cout << "writing"; + remove (fileName); + std::ofstream os (fileName, ios_base::binary); + StdOFStream ofs (os, fileName); + TiledRgbaOutputFile out (ofs, header, WRITE_RGBA, 20, 20, ONE_LEVEL); + out.setFrameBuffer (&p1[0][0], 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + cout << ", reading"; + std::ifstream is (fileName, ios_base::binary); + StdIFStream ifs (is, fileName); + TiledRgbaInputFile in (ifs); + + const Box2i &dw = in.dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + cout << ", comparing"; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + + { + cout << ", reading (memory-mapped)"; + MMIFStream ifs (fileName); + TiledRgbaInputFile in (ifs); + + const Box2i &dw = in.dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + cout << ", comparing"; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (p2[y][x].r == p1[y][x].r); + assert (p2[y][x].g == p1[y][x].g); + assert (p2[y][x].b == p1[y][x].b); + assert (p2[y][x].a == p1[y][x].a); + } + } + } + + cout << endl; + + remove (fileName); +} + + +} // namespace + + +void +testExistingStreams (const std::string &tempDir) +{ + try + { + cout << "Testing reading and writing using existing streams" << endl; + + const int W = 119; + const int H = 237; + + Array2D p1 (H, W); + + fillPixels1 (p1, W, H); + writeReadScanLines ((tempDir + "imf_test_streams.exr").c_str(), W, H, p1); + + fillPixels2 (p1, W, H); + writeReadTiles ((tempDir + "imf_test_streams2.exr").c_str(), W, H, p1); + + fillPixels1 (p1, W, H); + writeReadMultiPart ((tempDir + "imf_test_streams3.exr").c_str(), W, H, p1); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testExistingStreams.h b/IlmImfTest/testExistingStreams.h new file mode 100644 index 0000000..3c0900d --- /dev/null +++ b/IlmImfTest/testExistingStreams.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testExistingStreams (const std::string &tempDir); + diff --git a/IlmImfTest/testFutureProofing.cpp b/IlmImfTest/testFutureProofing.cpp new file mode 100644 index 0000000..0671587 --- /dev/null +++ b/IlmImfTest/testFutureProofing.cpp @@ -0,0 +1,1384 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2013, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// Weta Digital nor any other ontributors may be used to endorse +// or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testFutureProofing.h" +#include "testMultiPartFileMixingBasic.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 16; +const int width = 16; +std::string filename; +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +template +void +fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +void +fillPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + ph[y][x] = new T[sampleCount[y][x]]; + for (int i = 0; i < sampleCount[y][x]; i++) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x][i] = (y * width + x) % 2049; + } + } +} + +void +allocatePixels (int type, + Array2D& sampleCount, + Array2D& uintData, + Array2D& floatData, + Array2D& halfData, + int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + { + for (int x = x1; x <= x2; x++) + { + if (type == 0) + uintData[y][x] = new unsigned int[sampleCount[y][x]]; + if (type == 1) + floatData[y][x] = new float[sampleCount[y][x]]; + if (type == 2) + halfData[y][x] = new half[sampleCount[y][x]]; + } + } +} + +void +allocatePixels (int type, + Array2D& sampleCount, + Array2D& uintData, + Array2D& floatData, + Array2D& halfData, + int width, int height) +{ + allocatePixels(type, sampleCount, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +void +releasePixels (int type, + Array2D& uintData, + Array2D& floatData, + Array2D& halfData, + int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + { + for (int x = x1; x <= x2; x++) + { + if (type == 0) + delete[] uintData[y][x]; + if (type == 1) + delete[] floatData[y][x]; + if (type == 2) + delete[] halfData[y][x]; + } + } +} + +void +releasePixels (int type, + Array2D& uintData, + Array2D& floatData, + Array2D& halfData, + int width, int height) +{ + releasePixels(type, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +template +bool +checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + { + for (int x = lx; x <= rx; ++x) + { + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + } + } + + return true; +} + +template +bool +checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +template +bool +checkPixels (Array2D& sampleCount, + Array2D &ph, + int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + { + for (int x = lx; x <= rx; ++x) + { + for (int i = 0; i < sampleCount[y][x]; i++) + { + if (ph[y][x][i] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ", sample " << i << ": " << ph[y][x][i] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + } + } + } + + return true; +} + +template +bool +checkPixels (Array2D& sampleCount, + Array2D &ph, + int width, int height) +{ + return checkPixels (sampleCount, ph, 0, width - 1, 0, height - 1, width); +} + +bool +checkSampleCount (Array2D& sampleCount, + int x1, int x2, int y1, int y2, int width) +{ + for (int i = y1; i <= y2; i++) + { + for (int j = x1; j <= x2; j++) + { + if (sampleCount[i][j] != ((i * width) + j) % 10 + 1) + { + cout << "sample count at " << j << ", " << i << ": " << sampleCount[i][j] + << ", should be " << (i * width + j) % 10 + 1 << endl << flush; + return false; + } + } + } + return true; +} + +bool +checkSampleCount (Array2D& sampleCount, int width, int height) +{ + return checkSampleCount(sampleCount, 0, width - 1, 0, height - 1, width); +} + +void +generateRandomHeaders (int partCount, vector
& headers) +{ + cout << "Generating headers and data" << endl << flush; + + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header (width, + height, + 1.f, + IMATH_NAMESPACE::V2f (0, 0), + 1.f, + INCREASING_Y, + ZIPS_COMPRESSION); + + int pixelType = rand() % 3; + int partType = rand() % 4; + + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + case 2: + header.setType(DEEPSCANLINE); + break; + case 3: + header.setType(DEEPTILE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1 || partType == 3) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + + int order = rand() % NUM_LINEORDERS; + if(partType==0 || partType ==2) + { + // can't write random scanlines + order = rand() % (NUM_LINEORDERS-1); + } + LineOrder l; + switch(order) + { + case 0 : + l = INCREASING_Y; + break; + case 1 : + l = DECREASING_Y; + break; + case 2 : + l = RANDOM_Y; + break; + } + + header.lineOrder()=l; + + + if (partType == 0 || partType == 2) + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " line order =" << header.lineOrder() << endl << flush; + } + else + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " tile order =" << header.lineOrder() + << " levelMode = " << levelModes[i] << endl << flush; + } + // future types MUST have a chunkCount attribute - ommitting causes the library + // to raise an exception (can't compute chunkOffsetTable) and prevents us from reading + // the rest of the image + header.setChunkCount(getChunkOffsetTableSize(header,true)); + headers.push_back(header); + } +} + +void +setOutputFrameBuffer (FrameBuffer& frameBuffer, + int pixelType, + Array2D& uData, + Array2D& fData, + Array2D& hData, + int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void +setOutputDeepFrameBuffer (DeepFrameBuffer& frameBuffer, + int pixelType, + Array2D& uData, + Array2D& fData, + Array2D& hData, + int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void +setInputFrameBuffer (FrameBuffer& frameBuffer, + int pixelType, + Array2D& uData, + Array2D& fData, + Array2D& hData, + int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void +setInputDeepFrameBuffer (DeepFrameBuffer& frameBuffer, + int pixelType, + Array2D& uData, + Array2D& fData, + Array2D& hData, + int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void +generateRandomFile (int partCount) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + + Array2D sampleCount; + Array2D deepHalfData; + Array2D deepFloatData; + Array2D deepUintData; + + vector outputfiles; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + generateRandomHeaders(partCount, headers); + + remove(filename.c_str()); + MultiPartOutputFile file(filename.c_str(), &headers[0],headers.size()); + + // + // Writing files. + // + cout << "Writing files " << flush; + + // + // Pre-generating frameBuffers. + // + for (int i = 0; i < partCount; i++) + { + switch (partTypes[i]) + { + case 0: + { + OutputPart part(file, i); + + FrameBuffer frameBuffer; + + fillPixels (uintData, width, height); + fillPixels (floatData, width, height); + fillPixels (halfData, width, height); + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + break; + } + case 1: + { + TiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + + fillPixels (uintData, w, h); + fillPixels (floatData, w, h); + fillPixels (halfData, w, h); + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + uintData, floatData, halfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + } + + break; + } + case 2: + { + DeepScanLineOutputPart part(file, i); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + for (int j = 0; j < height; j++) + for (int k = 0; k < width; k++) + sampleCount[j][k] = (j * width + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, width, height); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, width, height); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, width, height); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, width, height); + + break; + } + case 3: + { + DeepTiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + for (int j = 0; j < h; j++) + for (int k = 0; k < w; k++) + sampleCount[j][k] = (j * w + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, w, h); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, w, h); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, w, h); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, w, h); + } + + break; + } + } + } +} + +void +readWholeFiles (int modification) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + MultiPartInputFile file(filename.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + if(modification==1 && i==0) + { + assert (header.type() != headers[i].type()); + }else{ + assert (header.type() == headers[i].type()); + } + } + + cout << "Reading whole files " << flush; + + + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = modification>0 ? 1 : 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < shuffledPartNumber.size(); i++) + { + int a = rand() % shuffledPartNumber.size(); + int b = rand() % shuffledPartNumber.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + + + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < shuffledPartNumber.size(); i++) + { + partNumber = shuffledPartNumber[i]; + switch (partTypes[partNumber]) + { + case 0: + { + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + break; + } + case 1: + { + TiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, w, h)); + break; + case 1: + assert(checkPixels(fData, w, h)); + break; + case 2: + assert(checkPixels(hData, w, h)); + break; + } + } + break; + } + case 2: + { + DeepScanLineInputPart part(file, partNumber); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(0, height - 1); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, width, height); + + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, width, height)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, width, height)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, width, height)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + break; + } + case 3: + { + DeepTiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + + part.readPixelSampleCounts(0, numXTiles - 1, 0, numYTiles - 1, + xLevel, yLevel); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, w, h); + + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, w, h)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, w, h)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, w, h)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + } + + break; + } + } + cerr << "part " << partNumber << " ok "; + + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + +void +readFirstPart() +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + cout << "Reading first part " << flush; + int pixelType = pixelTypes[0]; + int partType = partTypes[0]; + int levelMode = levelModes[0]; + switch (partType) + { + case 0: + { + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + InputFile part(filename.c_str()); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + + break; + } + case 1: + { + int tx1, tx2, ty1, ty2; + int lx, ly; + + TiledInputFile part(filename.c_str()); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 1: + assert(checkPixels(fData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 2: + assert(checkPixels(hData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + } + + break; + } + case 2: + { + DeepScanLineInputFile part(filename.c_str()); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + part.readPixelSampleCounts(l1, l2); + assert(checkSampleCount(sampleCount, 0, width - 1, l1, l2, width)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, 0, width - 1, l1, l2, width)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + break; + } + case 3: + { + DeepTiledInputFile part(filename.c_str()); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + int tx1, tx2, ty1, ty2; + int lx, ly; + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + assert(checkSampleCount(sampleCount, b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + break; + } + } +} + + + +void +modifyType (bool modify_version) +{ + FILE * f = fopen(filename.c_str(),"r+b"); + + cout << " simulating new part type "; + cout.flush(); + + for(int i=0;i<4;i++) + { + fgetc(f); // magic number + } + fpos_t verflag_pos; + fgetpos (f, &verflag_pos); + for(int i=0;i<4;i++) + { + fgetc(f); // version + } + + // skip over each header + for(int i=0;i' + fpos_t position; + fgetpos (f, &position); + fsetpos (f, &position); + char x='X'; + fwrite(&x,1,1,f); + + // need to set the 'not just an image' byte for single part regular image files + // and clear the tiled bit + if(headers.size()==1 && (headers[0].type()==SCANLINEIMAGE || headers[0].type()==TILEDIMAGE)) + { + cerr << " flipping header "; + + fsetpos(f,&verflag_pos); + char x=2; + char y=8; + fwrite(&x,1,1,f); + fwrite(&y,1,1,f); + } + fclose(f); + + cerr << " modified "; + return; + } + + if(modify_version && attrib_name=="version") + { + fpos_t position; + fgetpos (f, &position); + fsetpos (f, &position); + char x='X'; + fwrite(&x,1,1,f); + fclose(f); + cerr << " modified "; + return; + + } + + //value of attribute + for(int i=0;i +void testFutureProofing (const std::string & tempDir); + +#endif diff --git a/IlmImfTest/testHuf.cpp b/IlmImfTest/testHuf.cpp new file mode 100644 index 0000000..d2728fb --- /dev/null +++ b/IlmImfTest/testHuf.cpp @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include "ImathRandom.h" +#include +#include +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +namespace { + +void +fill1 (unsigned short data[/*n*/], int n, float bias, IMATH_NAMESPACE::Rand48 & rand48) +{ + for (int i = 0; i < n; ++i) + data[i] = (unsigned short) + (pow (rand48.nextf(), double(bias)) * (USHRT_MAX + 1)); +} + + +void +fill2 (unsigned short data[/*n*/], int n, int m, IMATH_NAMESPACE::Rand48 & rand48) +{ + for (int i = 0; i < n; ++i) + data[i] = 0; + + for (int i = 0; i < m; ++i) + data[rand48.nexti() % n] = (unsigned short) (rand48.nextf() * (USHRT_MAX + 1)); +} + + +void +fill3 (unsigned short data[/*n*/], int n, int m) +{ + for (int i = 0; i < n; ++i) + data[i] = m; +} + + +void +fill4 (unsigned short data[/*n*/], int n) +{ + for (int i = 0; i < n; ++i) + data[i] = i & USHRT_MAX; +} + + +void +fill5 (unsigned short data[/*n*/], int n) +{ + for (int i = 0; i < n; ++i) + data[i] = 0; + + int j = 0, k = 0; + + for (int i = 0; i < n; ++i) + { + data[i] = j; + j = j + k; + k = k + 1; + + if (j > USHRT_MAX) + break; + } +} + + +void +compressUncompress (const unsigned short raw[], int n) +{ + Array compressed (3 * n + 4 * 65536); + Array uncompressed (n); + + cout << "compressing " << flush; + + int nCompressed = hufCompress (raw, n, compressed); + + cout << "uncompressing " << flush; + + hufUncompress (compressed, nCompressed, uncompressed, n); + + cout << "comparing: " << flush; + + for (int i = 0; i < n; ++i) + assert (uncompressed[i] == raw[i]); + + cout << sizeof (raw[0]) * n << " bytes, compressed " << + nCompressed << " bytes" << endl; +} + +void +compressUncompressSubset(const unsigned short raw[], int n) +{ + // Test various subsets of the data set + + Array compressed (3 * n + 4 * 65536); + Array uncompressed (n); + + int maxOffset = 16; + if (n <= maxOffset) { + maxOffset = n-1; + } + + for (int offset=1; offset raw (N); + + fill1 (raw, N, 1, rand48); // test various symbol distributions + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill1 (raw, N, 10, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill1 (raw, N, 100, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill1 (raw, N, 1000, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + + fill2 (raw, N, 1, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill2 (raw, N, 10, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill2 (raw, N, 100, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill2 (raw, N, 1000, rand48); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + + fill3 (raw, N, 0); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill3 (raw, N, 1); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill3 (raw, N, USHRT_MAX - 1); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + fill3 (raw, N, USHRT_MAX); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + + fill4 (raw, USHRT_MAX + 1); + compressUncompress (raw, USHRT_MAX + 1); + compressUncompressSubset (raw, USHRT_MAX + 1); + fill4 (raw, N); + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + + fill4 (raw, 0); + compressUncompress (raw, 0); // test small input data sets + fill4 (raw, 1); + compressUncompress (raw, 1); + fill4 (raw, 2); + compressUncompress (raw, 2); + fill4 (raw, 3); + compressUncompress (raw, 3); + + fill5 (raw, N); // test run-length coding of code table + compressUncompress (raw, N); + compressUncompressSubset (raw, N); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testHuf.h b/IlmImfTest/testHuf.h new file mode 100644 index 0000000..258a117 --- /dev/null +++ b/IlmImfTest/testHuf.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testHuf (const std::string &tempDir); + diff --git a/IlmImfTest/testInputPart.cpp b/IlmImfTest/testInputPart.cpp new file mode 100644 index 0000000..2369a55 --- /dev/null +++ b/IlmImfTest/testInputPart.cpp @@ -0,0 +1,729 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// Weta Digital nor any other ontributors may be used to endorse +// or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testInputPart.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 267; +const int width = 193; + +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +void fillPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + ph[y][x] = new T[sampleCount[y][x]]; + for (int i = 0; i < sampleCount[y][x]; i++) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x][i] = (y * width + x) % 2049; + } + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + uintData[y][x] = new unsigned int[sampleCount[y][x]]; + if (type == 1) + floatData[y][x] = new float[sampleCount[y][x]]; + if (type == 2) + halfData[y][x] = new half[sampleCount[y][x]]; + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + allocatePixels(type, sampleCount, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + delete[] uintData[y][x]; + if (type == 1) + delete[] floatData[y][x]; + if (type == 2) + delete[] halfData[y][x]; + } +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + releasePixels(type, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, + int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + { + for (int i = 0; i < sampleCount[y][x]; i++) + { + if (ph[y][x][i] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ", sample " << i << ": " << ph[y][x][i] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + } + } + return true; +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + return checkPixels (sampleCount, ph, 0, width - 1, 0, height - 1, width); +} + +bool checkSampleCount(Array2D& sampleCount, int x1, int x2, int y1, int y2, int width) +{ + for (int i = y1; i <= y2; i++) + for (int j = x1; j <= x2; j++) + { + if (sampleCount[i][j] != ((i * width) + j) % 10 + 1) + { + cout << "sample count at " << j << ", " << i << ": " << sampleCount[i][j] + << ", should be " << (i * width + j) % 10 + 1 << endl << flush; + return false; + } + } + return true; +} + +bool checkSampleCount(Array2D& sampleCount, int width, int height) +{ + return checkSampleCount(sampleCount, 0, width - 1, 0, height - 1, width); +} + +void generateRandomHeaders(int partCount, vector
& headers) +{ + cout << "Generating headers and data" << endl << flush; + + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header (width, + height, + 1.f, + IMATH_NAMESPACE::V2f (0, 0), + 1.f, + INCREASING_Y, + ZIPS_COMPRESSION); + + int pixelType = rand() % 3; + int partType = rand() % 2; + + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + + int order = rand() % NUM_LINEORDERS; + if(partType==0 || partType ==2) + { + // can't write random scanlines + order = rand() % (NUM_LINEORDERS-1); + } + LineOrder l; + switch(order) + { + case 0 : + l = INCREASING_Y; + break; + case 1 : + l = DECREASING_Y; + break; + case 2 : + l = RANDOM_Y; + break; + } + + header.lineOrder()=l; + + + if (partType == 0) + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " line order =" << header.lineOrder() << endl << flush; + } + else + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " tile order =" << header.lineOrder() + << " levelMode = " << levelModes[i] << endl << flush; + } + + headers.push_back(header); + } +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void +generateRandomFile (int partCount, const std::string & fn) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + + Array2D sampleCount; + Array2D deepHalfData; + Array2D deepFloatData; + Array2D deepUintData; + + vector outputfiles; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + generateRandomHeaders(partCount, headers); + + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + + // + // Writing files. + // + cout << "Writing files " << flush; + + // + // Pre-generating frameBuffers. + // + for (int i = 0; i < partCount; i++) + { + switch (partTypes[i]) + { + case 0: + { + OutputPart part(file, i); + + FrameBuffer frameBuffer; + + fillPixels (uintData, width, height); + fillPixels (floatData, width, height); + fillPixels (halfData, width, height); + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + break; + } + case 1: + { + TiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + + fillPixels (uintData, w, h); + fillPixels (floatData, w, h); + fillPixels (halfData, w, h); + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + uintData, floatData, halfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + } + + break; + } + } + } +} + +void +readWholeFiles (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + MultiPartInputFile file(fn.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + cout << "Reading whole files " << flush; + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < headers.size(); i++) + { + int a = rand() % headers.size(); + int b = rand() % headers.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < headers.size(); i++) + { + partNumber = shuffledPartNumber[i]; + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + +void +readFirstPart (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + cout << "Reading first part " << flush; + int pixelType = pixelTypes[0]; + int levelMode = levelModes[0]; + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + InputFile part(fn.c_str()); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } +} + +void +readPartialFiles (int randomReadCount, const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + cout << "Reading partial files " << flush; + MultiPartInputFile file(fn.c_str()); + + for (int i = 0; i < randomReadCount; i++) + { + int partNumber = rand() % file.parts(); + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + + if (l1 > l2) swap(l1, l2); + + InputPart part(file, partNumber); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + } +} + + + +void +testWriteRead (int partNumber, + int runCount, + int randomReadCount, + const std::string & tempDir) +{ + cout << "Testing file with " << partNumber << " part(s)." << endl << flush; + + const std::string fn = tempDir + "imf_test_input_part.exr"; + + for (int i = 0; i < runCount; i++) + { + generateRandomFile (partNumber, fn); + readWholeFiles (fn); + readFirstPart (fn); + readPartialFiles (randomReadCount, fn); + + remove (fn.c_str()); + + cout << endl << flush; + } +} + +} // namespace + + +void testInputPart (const std::string & tempDir) +{ + try + { + cout << "Testing reading multipart tiles and scanlines with InputPart" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(4); + + testWriteRead ( 1, 1, 5, tempDir); + testWriteRead ( 2, 2, 1, tempDir); + testWriteRead ( 8, 4, 2, tempDir); + testWriteRead (50, 3, 11, tempDir); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testInputPart.h b/IlmImfTest/testInputPart.h new file mode 100644 index 0000000..edd3ba5 --- /dev/null +++ b/IlmImfTest/testInputPart.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTINPUTPART_H_ +#define TESTINPUTPART_H_ + +#include + +void testInputPart (const std::string & tempDir); + +#endif /* TESTINPUTPART_H_ */ diff --git a/IlmImfTest/testIsComplete.cpp b/IlmImfTest/testIsComplete.cpp new file mode 100644 index 0000000..fe74d5f --- /dev/null +++ b/IlmImfTest/testIsComplete.cpp @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +writeFiles (const char completeScanLinesName[], + const char incompleteScanLinesName[], + const char completeTilesName[], + const char incompleteTilesName[], + int width, + int height, + int tileXSize, + int tileYSize) +{ + Array2D pixels (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + pixels[y][x] = Rgba (x, y, 0.0, 1.0); + + { + RgbaOutputFile out (completeScanLinesName, width, height); + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writePixels (height); + } + + { + RgbaOutputFile out (incompleteScanLinesName, width, height); + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writePixels (height - 1); + } + + { + TiledRgbaOutputFile out (completeTilesName, + width, height, + tileXSize, tileYSize, + ONE_LEVEL); + + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + TiledRgbaOutputFile out (incompleteTilesName, + width, height, + tileXSize, tileYSize, + ONE_LEVEL); + + out.setFrameBuffer (&pixels[0][0], 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 2); + } +} + + +void +checkFiles (const char completeScanLinesName[], + const char incompleteScanLinesName[], + const char completeTilesName[], + const char incompleteTilesName[]) +{ + { + RgbaInputFile in (completeScanLinesName); + assert (in.isComplete()); + } + + { + RgbaInputFile in (incompleteScanLinesName); + assert (!in.isComplete()); + } + + { + RgbaInputFile in (completeTilesName); + assert (in.isComplete()); + } + + { + RgbaInputFile in (incompleteTilesName); + assert (!in.isComplete()); + } + + { + TiledRgbaInputFile in (completeTilesName); + assert (in.isComplete()); + } + + { + TiledRgbaInputFile in (incompleteTilesName); + assert (!in.isComplete()); + } +} + +} // namespace + + +void +testIsComplete (const std::string &tempDir) +{ + try + { + cout << "Testing isComplete() function" << endl; + + std::string csl = tempDir + "imf_test_complete_sl.exr"; + std::string icsl = tempDir + "imf_test_incomplete_sl.exr"; + std::string ct = tempDir + "imf_test_complete_t.exr"; + std::string ict = tempDir + "imf_test_incomplete_t.exr"; + + writeFiles (csl.c_str(), icsl.c_str(), ct.c_str(), ict.c_str(), 327, 289, 17, 17); + checkFiles (csl.c_str(), icsl.c_str(), ct.c_str(), ict.c_str()); + + remove (csl.c_str()); + remove (icsl.c_str()); + remove (ct.c_str()); + remove (ict.c_str()); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testIsComplete.h b/IlmImfTest/testIsComplete.h new file mode 100644 index 0000000..18f0ca9 --- /dev/null +++ b/IlmImfTest/testIsComplete.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testIsComplete (const std::string &tempDir); + + diff --git a/IlmImfTest/testLineOrder.cpp b/IlmImfTest/testLineOrder.cpp new file mode 100644 index 0000000..4ec6424 --- /dev/null +++ b/IlmImfTest/testLineOrder.cpp @@ -0,0 +1,227 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include "IlmThread.h" +#include "half.h" + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &ph, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + ph[y][x] = x % 10 + 10 * (y % 17); +} + + +void +writeRead (const Array2D &ph1, + const char fileName[], + int width, + int height, + LineOrder lorder) +{ + // + // Write the pixel data in ph1 to an image file using + // the specified line order. Read the pixel data back + // from the file in pseudo-random order and verify that + // the data did not change. + // + + cout << "line order " << lorder << + ":" << flush; + + Header hdr (width, height); + hdr.lineOrder() = lorder; + + hdr.channels().insert ("H", // name + Channel (HALF, // type + 1, // xSampling + 1) // ySampling + ); + + { + FrameBuffer fb; + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph1[0][0], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * width, // yStride + 1, // xSampling + 1) // ySampling + ); + + cout << " writing" << flush; + + remove (fileName); + OutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writePixels (height); + } + + { + cout << " reading" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D ph2 (h, w); + + FrameBuffer fb; + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph2[-dy][-dx], // base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * w, // yStride + 1, // xSampling + 1) // ySampling + ); + + in.setFrameBuffer (fb); + + // + // Read the scan lines in this order: + // 0, N, 2N, 3N, ... 1, N+1, 2N+1, ... 2, N+2, 2N+2, ... + // + + const int N = 7; + + for (int i = 0; i < N; ++i) + for (int y = dw.min.y + i; y <= dw.max.y; y += N) + in.readPixels (y); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + assert (ph1[y][x] == ph2[y][x]); + } + + remove (fileName); + cout << endl; +} + + +} // namespace + + +void +testLineOrder (const std::string &tempDir) +{ + try + { + cout << "Testing line order and random access to scan lines" << endl; + + const int W = 117; + const int H = 97; + + Array2D ph (H, W); + fillPixels (ph, W, H); + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + std::string filename = tempDir + "imf_test_lorder.exr"; + + for (int lorder = 0; lorder < RANDOM_Y; ++lorder) + { + writeRead (ph, + filename.c_str(), + W, H, + LineOrder (lorder)); + } + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testLineOrder.h b/IlmImfTest/testLineOrder.h new file mode 100644 index 0000000..982d26e --- /dev/null +++ b/IlmImfTest/testLineOrder.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testLineOrder (const std::string &tempDir); + diff --git a/IlmImfTest/testLut.cpp b/IlmImfTest/testLut.cpp new file mode 100644 index 0000000..26455fc --- /dev/null +++ b/IlmImfTest/testLut.cpp @@ -0,0 +1,256 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include +#include "ImathRandom.h" +#include + +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +half +one (half) +{ + return 1; +} + + +void +testHalfLut () +{ + const int NX = 67; + const int NY = 31; + + Array2D h (NY, NX); + HalfLut lut (one); + + // + // apply (data, nData, stride); + // + + for (int y = 0; y < NY; ++y) + for (int x = 0; x < NX; ++x) + h[y][x] = 0; + + lut.apply (&h[0][0], NX * NY, 1); + + for (int y = 0; y < NY; ++y) + for (int x = 0; x < NX; ++x) + assert (h[y][x] == 1); + + // + // apply (slice, dataWindow); + // + + for (int y = 0; y < NY; ++y) + for (int x = 0; x < NX; ++x) + h[y][x] = 0; + + Slice s (HALF, // type + (char *) &h[0][0], // base + sizeof (h[0][0]), // xStride + sizeof (h[0][0]) * NX, // yStride + 1, 1); // xSampling, ySampling + + Box2i dw (V2i (3, 5), V2i (45, 27)); + + lut.apply (s, dw); + + for (int y = 0; y < NY; ++y) + for (int x = 0; x < NX; ++x) + if (dw.intersects (V2i (x, y))) + assert (h[y][x] == 1); + else + assert (h[y][x] == 0); +} + + +void +testRgbaLut () +{ + const int NX = 67; + const int NY = 31; + + Array2D rgba (NY, NX); + RgbaLut lut (one, WRITE_RGB); + + // + // apply (data, nData, stride); + // + + for (int y = 0; y < NY; ++y) + { + for (int x = 0; x < NX; ++x) + { + rgba[y][x].r = 0; + rgba[y][x].g = 0; + rgba[y][x].b = 0; + rgba[y][x].a = 0; + } + } + + lut.apply (&rgba[0][0], NX * NY, 1); + + for (int y = 0; y < NY; ++y) + { + for (int x = 0; x < NX; ++x) + { + assert (rgba[y][x].r == 1); + assert (rgba[y][x].g == 1); + assert (rgba[y][x].b == 1); + assert (rgba[y][x].a == 0); + } + } + + // + // apply (base, xStride, yStride, dataWindow); + // + + for (int y = 0; y < NY; ++y) + { + for (int x = 0; x < NX; ++x) + { + rgba[y][x].r = 0; + rgba[y][x].g = 0; + rgba[y][x].b = 0; + rgba[y][x].a = 0; + } + } + + Box2i dw (V2i (3, 5), V2i (45, 27)); + + lut.apply (&rgba[0][0], 1, NX, dw); + + for (int y = 0; y < NY; ++y) + { + for (int x = 0; x < NX; ++x) + { + if (dw.intersects (V2i (x, y))) + { + assert (rgba[y][x].r == 1); + assert (rgba[y][x].g == 1); + assert (rgba[y][x].b == 1); + assert (rgba[y][x].a == 0); + } + else + { + assert (rgba[y][x].r == 0); + assert (rgba[y][x].g == 0); + assert (rgba[y][x].b == 0); + assert (rgba[y][x].a == 0); + } + } + } +} + + +void +testRounding () +{ + // + // For each rounding function, f, + // f(f(x)) == f(x) must be true. + // + + Rand32 rand; + + for (int i = 0; i < 10000; ++i) + { + half h = rand.nextf (HALF_MIN, HALF_MAX); + assert (round12log (h) == round12log (round12log (h))); + } + + for (int n = 0; n <= 10; ++n) + { + roundNBit rn (n); + + for (int i = 0; i < 10000; ++i) + { + half h = rand.nextf (HALF_MIN, HALF_MAX); + assert (rn (h) == rn (rn (h))); + } + } + + // + // Special cases: + // + + assert (round12log (-1) == 0); + assert (round12log (0) == 0); + assert (round12log (0.5) == 0.5); + assert (round12log (1) == 1); + assert (round12log (2) == 2); + + roundNBit r3 (3); + + assert (r3 (-1) == -1); + assert (r3 (0) == 0); + assert (r3 (0.5) == 0.5); + assert (r3 (1) == 1); + assert (r3 (2) == 2); +} + + +} // namespace + + +void +testLut (const std::string&) +{ + try + { + cout << "Testing lookup tables" << endl; + + testHalfLut(); + testRgbaLut(); + testRounding(); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testLut.h b/IlmImfTest/testLut.h new file mode 100644 index 0000000..d5446a3 --- /dev/null +++ b/IlmImfTest/testLut.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testLut (const std::string &tempDir); + diff --git a/IlmImfTest/testMagic.cpp b/IlmImfTest/testMagic.cpp new file mode 100644 index 0000000..afe87e1 --- /dev/null +++ b/IlmImfTest/testMagic.cpp @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +namespace { + +void +testFile1 (const char fileName[], bool isImfFile) +{ + cout << fileName << " " << flush; + + ifstream f (fileName, ios_base::binary); + assert (!!f); + + char bytes[4]; + f.read (bytes, sizeof (bytes)); + + assert (!!f && isImfFile == isImfMagic (bytes)); + + cout << "is " << (isImfMagic (bytes)? "": "not ") << "an OpenEXR file\n"; +} + + +void +testFile2 (const char fileName[], bool exists, bool exrFile, bool tiledFile) +{ + cout << fileName << " " << flush; + + bool exr, tiled; + + exr = isOpenExrFile (fileName, tiled); + assert (exr == exrFile && tiled == tiledFile); + + exr = isOpenExrFile (fileName); + assert (exr == exrFile); + + tiled = isTiledOpenExrFile (fileName); + assert (tiled == tiledFile); + + if (exists) + { + StdIFStream is (fileName); + + exr = isOpenExrFile (is, tiled); + assert (exr == exrFile && tiled == tiledFile); + + if (exr) + assert (is.tellg() == 0); + + exr = isOpenExrFile (is); + assert (exr == exrFile); + + if (exr) + assert (is.tellg() == 0); + + tiled = isTiledOpenExrFile (is); + assert (tiled == tiledFile); + + if (tiled) + assert (is.tellg() == 0); + } + + cout << (exists? "exists": "does not exist") << ", " << + (exrFile? "is an OpenEXR file": "is not an OpenEXR file") << ", " << + (tiledFile? "is tiled": "is not tiled") << endl; +} + +} // namespace + + +void +testMagic (const std::string &) +{ + try + { + cout << "Testing magic number" << endl; + + testFile1 (ILM_IMF_TEST_IMAGEDIR "comp_none.exr", true); + testFile1 (ILM_IMF_TEST_IMAGEDIR "invalid.exr", false); + + testFile2 (ILM_IMF_TEST_IMAGEDIR "tiled.exr", true, true, true); + testFile2 (ILM_IMF_TEST_IMAGEDIR "comp_none.exr", true, true, false); + testFile2 (ILM_IMF_TEST_IMAGEDIR "invalid.exr", true, false, false); + testFile2 (ILM_IMF_TEST_IMAGEDIR "does_not_exist.exr", false, false, false); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMagic.h b/IlmImfTest/testMagic.h new file mode 100644 index 0000000..0dfa1e6 --- /dev/null +++ b/IlmImfTest/testMagic.h @@ -0,0 +1,38 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testMagic(const std::string &tempDir); diff --git a/IlmImfTest/testMultiPartApi.cpp b/IlmImfTest/testMultiPartApi.cpp new file mode 100644 index 0000000..2fd7b47 --- /dev/null +++ b/IlmImfTest/testMultiPartApi.cpp @@ -0,0 +1,744 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testMultiPartApi.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + +namespace +{ + +const int height = 263; +const int width = 197; + +struct Task +{ + int partNumber; + int tx, ty, lx, ly; + + Task(int partNumber): + partNumber(partNumber) + {} + + Task(int partNumber, int tx, int ty, int lx, int ly): + partNumber(partNumber), + tx(tx), + ty(ty), + lx(lx), + ly(ly) + {} +}; + +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +void generateRandomHeaders(int partCount, vector
& headers, vector& taskList) +{ + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header(width, height); + int pixelType = rand() % 3; + int partType = rand() % 2; + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + // + // Add lines or tiles to task list. + // + if (partType == 0) + { + for (int j = 0; j < height; j++) + taskList.push_back(Task(i)); + } + else + { + int numXLevel; + int numYLevel; + int* numXTiles; + int* numYTiles; + precalculateTileInfo (header.tileDescription(), + 0, width - 1, + 0, height - 1, + numXTiles, numYTiles, + numXLevel, numYLevel); + + for (int lx = 0; lx < numXLevel; lx++) + for (int ly = 0; ly < numYLevel; ly++) + { + if (levelMode == 1) + if (lx != ly) continue; + + // Get all tasks for this level. + for (int tx = 0; tx < numXTiles[lx]; tx++) + for (int ty = 0; ty < numYTiles[ly]; ty++) + taskList.push_back(Task(i, tx, ty, lx, ly)); + } + + delete[] numXTiles; + delete[] numYTiles; + } + +// if (partType == 0) +// { +// cout << "pixelType = " << pixelType << " partType = " << partType +// << endl << flush; +// } +// else +// { +// cout << "pixelType = " << pixelType << " partType = " << partType +// << " levelMode = " << levelModes[i] << endl << flush; +// } + + headers.push_back(header); + } +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void +generateRandomFile (int partCount, const std::string & fn) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + fillPixels(uintData, width, height); + fillPixels(halfData, width, height); + fillPixels(floatData, width, height); + + Array2D< Array2D< half > >* tiledHalfData = new Array2D< Array2D< half > >[partCount]; + Array2D< Array2D< float > >* tiledFloatData = new Array2D< Array2D< float > >[partCount]; + Array2D< Array2D< unsigned int > >* tiledUintData = new Array2D< Array2D< unsigned int > >[partCount]; + + vector outputfiles; + vector taskList; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + cout << "Generating headers and data " << flush; + generateRandomHeaders(partCount, headers, taskList); + + // + // Shuffle tasks. + // + cout << "Shuffling " << taskList.size() << " tasks " << flush; + int taskListSize = taskList.size(); + for (int i = 0; i < taskListSize; i++) + { + int a, b; + a = rand() % taskListSize; + b = rand() % taskListSize; + swap(taskList[a], taskList[b]); + } + + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + + // + // Writing tasks. + // + cout << "Writing tasks " << flush; + + // + // Pre-generating frameBuffers. + // + vector parts; + vector frameBuffers(partCount); + Array > tiledFrameBuffers(partCount); + for (int i = 0; i < partCount; i++) + { + if (partTypes[i] == 0) + { + OutputPart* part = new OutputPart(file, i); + parts.push_back((void*) part); + + FrameBuffer& frameBuffer = frameBuffers[i]; + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part->setFrameBuffer(frameBuffer); + } + else + { + TiledOutputPart* part = new TiledOutputPart(file, i); + parts.push_back((void*) part); + + int numXLevels = part->numXLevels(); + int numYLevels = part->numYLevels(); + + // Allocating space. + switch (pixelTypes[i]) + { + case 0: + tiledUintData[i].resizeErase(numYLevels, numXLevels); + break; + case 1: + tiledFloatData[i].resizeErase(numYLevels, numXLevels); + break; + case 2: + tiledHalfData[i].resizeErase(numYLevels, numXLevels); + break; + } + + tiledFrameBuffers[i].resizeErase(numYLevels, numXLevels); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part->isValidLevel(xLevel, yLevel)) + continue; + + int w = part->levelWidth(xLevel); + int h = part->levelHeight(yLevel); + + FrameBuffer& frameBuffer = tiledFrameBuffers[i][yLevel][xLevel]; + + switch (pixelTypes[i]) + { + case 0: + fillPixels(tiledUintData[i][yLevel][xLevel], w, h); + break; + case 1: + fillPixels(tiledFloatData[i][yLevel][xLevel], w, h); + break; + case 2: + fillPixels(tiledHalfData[i][yLevel][xLevel], w, h); + break; + } + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + tiledUintData[i][yLevel][xLevel], + tiledFloatData[i][yLevel][xLevel], + tiledHalfData[i][yLevel][xLevel], + w); + } + } + } + + // + // Writing tasks. + // + for (int i = 0; i < taskListSize; i++) + { + int partNumber = taskList[i].partNumber; + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + if (partType == 0) + { + OutputPart* part = (OutputPart*) parts[partNumber]; + part->writePixels(); + } + else + { + int tx = taskList[i].tx; + int ty = taskList[i].ty; + int lx = taskList[i].lx; + int ly = taskList[i].ly; + TiledOutputPart* part = (TiledOutputPart*) parts[partNumber]; + part->setFrameBuffer(tiledFrameBuffers[partNumber][ly][lx]); + part->writeTile(tx, ty, lx, ly); + } + } + + delete[] tiledHalfData; + delete[] tiledUintData; + delete[] tiledFloatData; +} + +void +readWholeFiles (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + MultiPartInputFile file(fn.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + + // + // It rarely fails here. Added code to see what's wrong when it happens. + // + ChannelList::ConstIterator i1 = header.channels().begin(); + ChannelList::ConstIterator i2 = headers[i].channels().begin(); + Channel c1 = i1.channel(); + Channel c2 = i2.channel(); + if (!(c1 == c2)) + { + cout << " type is " << c1.type << ", should be " << c2.type + << " xSampling is " << c1.xSampling << ", should be " << c2.xSampling + << " ySampling is " << c1.ySampling << ", should be " << c2.ySampling + << " pLinear is " << c1.pLinear << ", should be " << c2.pLinear << flush; + } + + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + cout << "Reading whole files " << flush; + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < headers.size(); i++) + { + int a = rand() % headers.size(); + int b = rand() % headers.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < headers.size(); i++) + { + partNumber = shuffledPartNumber[i]; + if (partTypes[partNumber] == 0) + { + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + } + else + { + FrameBuffer frameBuffer; + TiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, w, h)); + break; + case 1: + assert(checkPixels(fData, w, h)); + break; + case 2: + assert(checkPixels(hData, w, h)); + break; + } + } + } + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + +void +readPartialFiles (int randomReadCount, const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + cout << "Reading partial files " << flush; + MultiPartInputFile file(fn.c_str()); + //const vector
& headers = file.parts(); + for (int i = 0; i < randomReadCount; i++) + { + int partNumber = rand() % headers.size(); + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + + if (partType == 0) + { + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + InputPart part(file, partNumber); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + } + else + { + int tx1, tx2, ty1, ty2; + int lx, ly; + + TiledInputPart part(file, partNumber); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 1: + assert(checkPixels(fData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 2: + assert(checkPixels(hData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + } + } + } +} + +void +testWriteRead (int partNumber, + int runCount, + int randomReadCount, + const std::string & tempDir) +{ + cout << "Testing file with " << partNumber << " part(s)." << endl << flush; + + std::string fn = tempDir + "imf_test_multipart_api.exr"; + + for (int i = 0; i < runCount; i++) + { + generateRandomFile (partNumber, fn); + readWholeFiles (fn); + readPartialFiles (randomReadCount, fn); + + remove (fn.c_str()); + + cout << endl << flush; + } +} + +} // namespace + + +void testMultiPartApi (const std::string & tempDir) +{ + try + { + cout << "Testing the multi part APIs for normal use" << endl; + + srand(1); + + testWriteRead ( 1, 2, 5, tempDir); + testWriteRead ( 2, 5, 10, tempDir); + testWriteRead ( 5, 1, 25, tempDir); + testWriteRead (50, 2, 100, tempDir); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiPartApi.h b/IlmImfTest/testMultiPartApi.h new file mode 100644 index 0000000..0abb34c --- /dev/null +++ b/IlmImfTest/testMultiPartApi.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTMULTIPARTAPI_H_ +#define TESTMULTIPARTAPI_H_ + +#include + +void testMultiPartApi (const std::string & tempDir); + +#endif /* TESTMULTIPARTAPI_H_ */ diff --git a/IlmImfTest/testMultiPartFileMixingBasic.cpp b/IlmImfTest/testMultiPartFileMixingBasic.cpp new file mode 100644 index 0000000..1fdb631 --- /dev/null +++ b/IlmImfTest/testMultiPartFileMixingBasic.cpp @@ -0,0 +1,1480 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// Portions (c) 2012, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// Weta Digital nor any other ontributors may be used to endorse +// or promote products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testMultiPartFileMixingBasic.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 267; +const int width = 193; + +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +void fillPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + ph[y][x] = new T[sampleCount[y][x]]; + for (int i = 0; i < sampleCount[y][x]; i++) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x][i] = (y * width + x) % 2049; + } + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + uintData[y][x] = new unsigned int[sampleCount[y][x]]; + if (type == 1) + floatData[y][x] = new float[sampleCount[y][x]]; + if (type == 2) + halfData[y][x] = new half[sampleCount[y][x]]; + } +} + +void allocatePixels(int type, Array2D& sampleCount, + Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + allocatePixels(type, sampleCount, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int x1, int x2, int y1, int y2) +{ + for (int y = y1; y <= y2; y++) + for (int x = x1; x <= x2; x++) + { + if (type == 0) + delete[] uintData[y][x]; + if (type == 1) + delete[] floatData[y][x]; + if (type == 2) + delete[] halfData[y][x]; + } +} + +void releasePixels(int type, Array2D& uintData, Array2D& floatData, + Array2D& halfData, int width, int height) +{ + releasePixels(type, uintData, floatData, halfData, 0, width - 1, 0, height - 1); +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, + int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + { + for (int i = 0; i < sampleCount[y][x]; i++) + { + if (ph[y][x][i] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ", sample " << i << ": " << ph[y][x][i] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + } + } + return true; +} + +template +bool checkPixels (Array2D& sampleCount, Array2D &ph, int width, int height) +{ + return checkPixels (sampleCount, ph, 0, width - 1, 0, height - 1, width); +} + +bool checkSampleCount(Array2D& sampleCount, int x1, int x2, int y1, int y2, int width) +{ + for (int i = y1; i <= y2; i++) + for (int j = x1; j <= x2; j++) + { + if (sampleCount[i][j] != ((i * width) + j) % 10 + 1) + { + cout << "sample count at " << j << ", " << i << ": " << sampleCount[i][j] + << ", should be " << (i * width + j) % 10 + 1 << endl << flush; + return false; + } + } + return true; +} + +bool checkSampleCount(Array2D& sampleCount, int width, int height) +{ + return checkSampleCount(sampleCount, 0, width - 1, 0, height - 1, width); +} + +void generateRandomHeaders(int partCount, vector
& headers) +{ + cout << "Generating headers and data" << endl << flush; + + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header (width, + height, + 1.f, + IMATH_NAMESPACE::V2f (0, 0), + 1.f, + INCREASING_Y, + ZIPS_COMPRESSION); + + int pixelType = rand() % 3; + int partType = rand() % 4; + + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + case 2: + header.setType(DEEPSCANLINE); + break; + case 3: + header.setType(DEEPTILE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1 || partType == 3) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + + int order = rand() % NUM_LINEORDERS; + if(partType==0 || partType ==2) + { + // can't write random scanlines + order = rand() % (NUM_LINEORDERS-1); + } + LineOrder l; + switch(order) + { + case 0 : + l = INCREASING_Y; + break; + case 1 : + l = DECREASING_Y; + break; + case 2 : + l = RANDOM_Y; + break; + } + + header.lineOrder()=l; + + + if (partType == 0 || partType == 2) + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " line order =" << header.lineOrder() << endl << flush; + } + else + { + cout << "pixelType = " << pixelType << " partType = " << partType + << " tile order =" << header.lineOrder() + << " levelMode = " << levelModes[i] << endl << flush; + } + + headers.push_back(header); + } +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setOutputDeepFrameBuffer(DeepFrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void setInputDeepFrameBuffer(DeepFrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + DeepSlice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + sizeof (unsigned int))); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + DeepSlice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + sizeof (float))); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + DeepSlice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + sizeof (half))); + break; + } +} + +void +generateRandomFile (int partCount, const std::string & fn) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + + Array2D sampleCount; + Array2D deepHalfData; + Array2D deepFloatData; + Array2D deepUintData; + + vector outputfiles; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + generateRandomHeaders(partCount, headers); + + remove (fn.c_str()); + MultiPartOutputFile file (fn.c_str(), &headers[0],headers.size()); + + // + // Writing files. + // + cout << "Writing files " << flush; + + // + // Pre-generating frameBuffers. + // + for (int i = 0; i < partCount; i++) + { + switch (partTypes[i]) + { + case 0: + { + OutputPart part(file, i); + + FrameBuffer frameBuffer; + + fillPixels (uintData, width, height); + fillPixels (floatData, width, height); + fillPixels (halfData, width, height); + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + break; + } + case 1: + { + TiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + + fillPixels (uintData, w, h); + fillPixels (floatData, w, h); + fillPixels (halfData, w, h); + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + uintData, floatData, halfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + } + + break; + } + case 2: + { + DeepScanLineOutputPart part(file, i); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + for (int j = 0; j < height; j++) + for (int k = 0; k < width; k++) + sampleCount[j][k] = (j * width + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, width, height); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, width, height); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, width, height); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + width); + + part.setFrameBuffer(frameBuffer); + + part.writePixels(height); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, width, height); + + break; + } + case 3: + { + DeepTiledOutputPart part(file, i); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + for (int j = 0; j < h; j++) + for (int k = 0; k < w; k++) + sampleCount[j][k] = (j * w + k) % 10 + 1; + + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + if (pixelTypes[i] == 0) + fillPixels (sampleCount, deepUintData, w, h); + if (pixelTypes[i] == 1) + fillPixels (sampleCount, deepFloatData, w, h); + if (pixelTypes[i] == 2) + fillPixels (sampleCount, deepHalfData, w, h); + setOutputDeepFrameBuffer(frameBuffer, pixelTypes[i], + deepUintData, deepFloatData, deepHalfData, + w); + + part.setFrameBuffer(frameBuffer); + + part.writeTiles(0, part.numXTiles(xLevel) - 1, + 0, part.numYTiles(yLevel) - 1, + xLevel, yLevel); + + releasePixels(pixelTypes[i], deepUintData, deepFloatData, deepHalfData, w, h); + } + + break; + } + } + } +} + +void +readWholeFiles (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + MultiPartInputFile file (fn.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + cout << "Reading whole files " << flush; + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < headers.size(); i++) + { + int a = rand() % headers.size(); + int b = rand() % headers.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < headers.size(); i++) + { + partNumber = shuffledPartNumber[i]; + switch (partTypes[partNumber]) + { + case 0: + { + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + break; + } + case 1: + { + TiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, w, h)); + break; + case 1: + assert(checkPixels(fData, w, h)); + break; + case 2: + assert(checkPixels(hData, w, h)); + break; + } + } + break; + } + case 2: + { + DeepScanLineInputPart part(file, partNumber); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(0, height - 1); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, width, height); + + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, width, height)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, width, height)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, width, height)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, width, height); + + break; + } + case 3: + { + DeepTiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + + part.readPixelSampleCounts(0, numXTiles - 1, 0, numYTiles - 1, + xLevel, yLevel); + + allocatePixels(pixelTypes[partNumber], sampleCount, + deepUData, deepFData, deepHData, w, h); + + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(sampleCount, deepUData, w, h)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, w, h)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, w, h)); + break; + } + + releasePixels(pixelTypes[partNumber], + deepUData, deepFData, deepHData, w, h); + } + + break; + } + } + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + +void +readFirstPart (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + cout << "Reading first part " << flush; + int pixelType = pixelTypes[0]; + int partType = partTypes[0]; + int levelMode = levelModes[0]; + switch (partType) + { + case 0: + { + InputFile part (fn.c_str()); + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + + break; + } + case 1: + { + TiledInputFile part(fn.c_str()); + + int tx1, tx2, ty1, ty2; + int lx, ly; + + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 1: + assert(checkPixels(fData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 2: + assert(checkPixels(hData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + } + + break; + } + case 2: + { + DeepScanLineInputFile part (fn.c_str()); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (OPENEXR_IMF_NAMESPACE::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + part.readPixelSampleCounts(l1, l2); + assert(checkSampleCount(sampleCount, 0, width - 1, l1, l2, width)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, 0, width - 1, l1, l2, width)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + break; + } + case 3: + { + DeepTiledInputFile part (fn.c_str()); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + int tx1, tx2, ty1, ty2; + int lx, ly; + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + assert(checkSampleCount(sampleCount, b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + break; + } + } +} + +void +readPartialFiles (int randomReadCount, const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + Array2D deepUData; + Array2D deepFData; + Array2D deepHData; + + Array2D sampleCount; + + cout << "Reading partial files " << flush; + MultiPartInputFile file (fn.c_str()); + + for (int i = 0; i < randomReadCount; i++) + { + int partNumber = rand() % file.parts(); + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + + switch (partType) + { + case 0: + { + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + InputPart part(file, partNumber); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + + break; + } + case 1: + { + int tx1, tx2, ty1, ty2; + int lx, ly; + + TiledInputPart part(file, partNumber); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 1: + assert(checkPixels(fData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 2: + assert(checkPixels(hData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + } + + break; + } + case 2: + { + DeepScanLineInputPart part(file, partNumber); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(height, width); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * width)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, width, height); + + part.setFrameBuffer(frameBuffer); + + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + part.readPixelSampleCounts(l1, l2); + assert(checkSampleCount(sampleCount, 0, width - 1, l1, l2, width)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, 0, width - 1, l1, l2, width)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, 0, width - 1, l1, l2); + + break; + } + case 3: + { + DeepTiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + int tx1, tx2, ty1, ty2; + int lx, ly; + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + DeepFrameBuffer frameBuffer; + + sampleCount.resizeErase(h, w); + frameBuffer.insertSampleCountSlice (Slice (IMF::UINT, + (char *) (&sampleCount[0][0]), + sizeof (unsigned int) * 1, + sizeof (unsigned int) * w)); + + setInputDeepFrameBuffer(frameBuffer, pixelType, + deepUData, deepFData, deepHData, w, h); + + part.setFrameBuffer(frameBuffer); + + part.readPixelSampleCounts(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + assert(checkSampleCount(sampleCount, b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + + allocatePixels(pixelType, sampleCount, + deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(sampleCount, deepUData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 1: + assert(checkPixels(sampleCount, deepFData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + case 2: + assert(checkPixels(sampleCount, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y, w)); + break; + } + + releasePixels(pixelType, deepUData, deepFData, deepHData, + b1.min.x, b2.max.x, b1.min.y, b2.max.y); + + break; + } + } + } +} + + +void +killOffsetTables (const std::string & fn) +{ + FILE * f = fopen (fn.c_str(),"r+b"); + + cout << " simulating incomplete file "; + cout.flush(); + + for(int i=0;i<4;i++) + { + fgetc(f); // magic number + } + for(int i=0;i<4;i++) + { + fgetc(f); // version + } + + // skip over each header + for(int i=0;i1) + { + fgetc(f); + } + + // blow away all chunk offset tables + + int size=0; + for(int i=0;i new_offset_tables(size); + fwrite(&new_offset_tables[0],sizeof(Int64),size,f); + + fclose(f); + +} + +void +testWriteRead (int partNumber, + int runCount, + int randomReadCount, + const std::string & tempDir) +{ + cout << "Testing file with " << partNumber << " part(s)." << endl << flush; + + std::string fn = tempDir + "imf_test_multipart_mixing_basic.exr"; + + for (int i = 0; i < runCount; i++) + { + generateRandomFile (partNumber, fn); + readWholeFiles (fn); + readFirstPart (fn); + readPartialFiles (randomReadCount, fn); + killOffsetTables (fn); + readFirstPart (fn); + readWholeFiles (fn); + + remove (fn.c_str()); + cout << endl << flush; + } +} + +} // namespace + + + +void testMultiPartFileMixingBasic (const std::string & tempDir) +{ + try + { + cout << "Testing the mixed (ScanLine, Tiled, DeepScanLine and DeepTiled)" + " multi-part file" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(4); + + testWriteRead ( 1, 1, 50, tempDir); + testWriteRead ( 2, 2, 100, tempDir); + testWriteRead ( 5, 3, 250, tempDir); + testWriteRead (50, 4, 2500, tempDir); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiPartFileMixingBasic.h b/IlmImfTest/testMultiPartFileMixingBasic.h new file mode 100644 index 0000000..08e805b --- /dev/null +++ b/IlmImfTest/testMultiPartFileMixingBasic.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTMULTIPARTFILEMIXINGBASIC_H_ +#define TESTMULTIPARTFILEMIXINGBASIC_H_ + +#include + +void testMultiPartFileMixingBasic (const std::string & tempDir); + +#endif /* TESTMULTIPARTFILEMIXINGBASIC_H_ */ diff --git a/IlmImfTest/testMultiPartSharedAttributes.cpp b/IlmImfTest/testMultiPartSharedAttributes.cpp new file mode 100644 index 0000000..2b73b15 --- /dev/null +++ b/IlmImfTest/testMultiPartSharedAttributes.cpp @@ -0,0 +1,527 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testMultiPartSharedAttributes.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + +namespace +{ + +const int height = 263; +const int width = 197; + + +void +generateRandomHeaders (int partCount, vector
& headers) +{ + headers.clear(); + + for (int i = 0; i < partCount; i++) + { + Header header(width, height); + int pixelType = rand() % 3; + int partType = rand() % 2; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(IMF::SCANLINEIMAGE); + break; + case 1: + header.setType(IMF::TILEDIMAGE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + headers.push_back(header); + } +} + +void +testMultiPartOutputFileForExpectedFailure (const vector
& headers, + const std::string & fn, + const string & failMessage="") +{ + try + { + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + cerr << "ERROR -- " << failMessage << endl; + assert (false); + } + catch (const IEX_NAMESPACE::ArgExc & e) + { + // expected behaviour + } + + return; +} + + +void +testDisplayWindow (const vector
& hs, const std::string & fn) +{ + vector
headers(hs); + IMATH_NAMESPACE::Box2i newDisplayWindow = headers[0].displayWindow(); + Header newHeader (newDisplayWindow.size().x+10, newDisplayWindow.size().y+10); + newHeader.setType (headers[0].type()); + newHeader.setName (headers[0].name() + string("_newHeader")); + headers.push_back (newHeader); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Shared Attributes : displayWindow : should fail for !=values"); + + return; +} + +void +testPixelAspectRatio (const vector
& hs, const std::string & fn) +{ + vector
headers(hs); + + IMATH_NAMESPACE::Box2i newDisplayWindow = headers[0].displayWindow(); + Header newHeader (headers[0].displayWindow().size().x+1, + headers[0].displayWindow().size().y+1, + headers[0].pixelAspectRatio() + 1.f); + newHeader.setType (headers[0].type()); + newHeader.setName (headers[0].name() + string("_newHeader")); + headers.push_back (newHeader); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Shared Attributes : pixelAspecRatio : should fail for !=values"); + + return; +} + +void +testTimeCode (const vector
& hs, const std::string & fn) +{ + vector
headers(hs); + + Header newHeader (headers[0]); + newHeader.setName (headers[0].name() + string("_newHeader")); + + + // + // Test against a vector of headers that has no attributes of this type + // + TimeCode t(1234567); + TimeCodeAttribute ta(t); + newHeader.insert(TimeCodeAttribute::staticTypeName(), ta); + headers.push_back (newHeader); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Shared Attributes : timecode : should fail for !presence"); + + + // + // Test against a vector of headers that has chromaticities attribute + // but of differing value + // + for (int i=0; i & hs, const std::string & fn) +{ + vector
headers(hs); + + Header newHeader (headers[0]); + newHeader.setName (headers[0].name() + string("_newHeader")); + + Chromaticities c; + ChromaticitiesAttribute ca(c); + newHeader.insert (ChromaticitiesAttribute::staticTypeName(), ca); + + // + // Test against a vector of headers that has no attributes of this type + // + headers.push_back (newHeader); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Shared Attributes : chromaticities : should fail for !present"); + + + // + // Test against a vector of headers that has chromaticities attribute + // but of differing value + // + for (int i=0; i headers; + + + // This will generate headers that are valid for all parts + generateRandomHeaders (partCount, headers); + + // expect this to be successful + { + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + } + + // Adding a header a that has non-complient standard attributes will throw + // an exception. + + // Run the tests + testDisplayWindow (headers, fn); + testPixelAspectRatio (headers, fn); + testTimeCode (headers, fn); + testChromaticities (headers, fn); +} + + +template +void +testDiskAttrValue (const Header & diskHeader, const T & testAttribute) +{ + const string & attrName = testAttribute.typeName(); + const T & diskAttr = dynamic_cast (diskHeader[attrName]); + if (diskAttr.value() != testAttribute.value()) + { + throw IEX_NAMESPACE::InputExc ("incorrect value from disk"); + } + + return; +} + + +void +testHeaders (const std::string & fn) +{ + // + // In a multipart context the headers must be subject to the following + // constraints + // * type must be set and valid + // * unique names + // + + + vector
headers; + + // + // expect this to fail - empty header list + // + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Header : empty header list passed"); + + + // + // expect this to fail - header has no image attribute type + // + Header h; + headers.push_back (h); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Header : empty image type passed"); + + + // + // expect this to fail - header name duplication + // + headers[0].setType (IMF::SCANLINEIMAGE); + Header hh(headers[0]); + headers.push_back(hh); + testMultiPartOutputFileForExpectedFailure (headers, + fn, + "Header: duplicate header names passed"); + + + // + // expect this to fail - header has incorrect image attribute type + // + try + { + headers[0].setType ("invalid image type"); + cerr << "Header : unsupported image type passed" << endl; + assert (false); + } + catch (const IEX_NAMESPACE::ArgExc & e) + { + // expected behaviour + } + + + // + // Write and Read the data off disk and check values + // + TimeCode t(1234567); + TimeCodeAttribute ta(t); + Chromaticities c; + ChromaticitiesAttribute ca(c); + vector ia; + for (int i=0; i (diskHeader, ta); + } + catch (const IEX_NAMESPACE::InputExc &e) + { + cerr << "Shared Attributes : TimeCode : " << e.what() << endl; + assert (false); + } + + // + // Test Chromaticities + // + try + { + testDiskAttrValue (diskHeader, ca); + } + catch (const IEX_NAMESPACE::InputExc &e) + { + cerr << "Shared Attributes : Chromaticities : " << e.what() << endl; + assert (false); + } + + // + // Test for non-shared attribute that can have differing values across + // multiple parts + // + try + { + testDiskAttrValue (diskHeader, ia[i]); + } + catch (const IEX_NAMESPACE::InputExc &e) + { + cerr << "Shared Attributes : IntAttribute : " << e.what() << endl; + assert (false); + } + } + + + // + // Test the code against an incorrectly constructed file + // + try + { + MultiPartInputFile file (ILM_IMF_TEST_IMAGEDIR "invalid_shared_attrs_multipart.exr"); + cerr << "Shared Attributes : InputFile : incorrect input file passed\n"; + assert (false); + } + catch (const IEX_NAMESPACE::InputExc &e) + { + // expectected behaviour + } + + return; +} + + +} // namespace + +void +testMultiPartSharedAttributes (const std::string & tempDir) +{ + try + { + cout << "Testing multi part APIs : shared attributes, header... " << endl; + + std::string fn = tempDir + "imf_test_multipart_shared_attrs.exr"; + + testSharedAttributes (fn); + testHeaders (fn); + + cout << " ... ok\n" << endl; + } + catch (const IEX_NAMESPACE::BaseExc & e) + { + cerr << "ERROR -- caught IEX_NAMESPACE::BaseExc exception: " << e.what() << endl; + assert (false); + } + catch (const std::exception & e) + { + cerr << "ERROR -- caught std::exception exception: " << e.what() << endl; + assert (false); + } +} + diff --git a/IlmImfTest/testMultiPartSharedAttributes.h b/IlmImfTest/testMultiPartSharedAttributes.h new file mode 100644 index 0000000..53502b8 --- /dev/null +++ b/IlmImfTest/testMultiPartSharedAttributes.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +#ifndef TESTMULTIPARTSHAREDATTRIBUTES_H_ +#define TESTMULTIPARTSHAREDATTRIBUTES_H_ + +#include + +void testMultiPartSharedAttributes (const std::string & tempDir); + +#endif /* TESTMULTIPARTSHAREDATTRIBUTES_H_ */ diff --git a/IlmImfTest/testMultiPartThreading.cpp b/IlmImfTest/testMultiPartThreading.cpp new file mode 100644 index 0000000..a726c7c --- /dev/null +++ b/IlmImfTest/testMultiPartThreading.cpp @@ -0,0 +1,829 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" +#include "testMultiPartThreading.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 263; +const int width = 197; + +vector
headers; +vector pixelTypes; +vector partTypes; +vector levelModes; + +Mutex mutexes[200]; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +struct WritingTaskData +{ + int partNumber; + int tx, ty, lx, ly; + + WritingTaskData(int partNumber): + partNumber(partNumber) + {} + + WritingTaskData(int partNumber, int tx, int ty, int lx, int ly): + partNumber(partNumber), + tx(tx), + ty(ty), + lx(lx), + ly(ly) + {} +}; + +class WritingTask: public Task +{ + public: + WritingTask (TaskGroup *group, MultiPartOutputFile* file, vector data, + Array2D* tiledFrameBuffers): + Task(group), + file(file), + data(data), + tiledFrameBuffers(tiledFrameBuffers) + {} + + void execute() + { + for (int i = 0; i < data.size(); i++) + { + int partNumber = data[i]->partNumber; + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + + if (partType == 0) + { + OutputPart part(*file, partNumber); + part.writePixels(); + } + else + { + int tx = data[i]->tx; + int ty = data[i]->ty; + int lx = data[i]->lx; + int ly = data[i]->ly; + TiledOutputPart part(*file, partNumber); + + // + // We add lock here to assure that two threads that accessing + // the same part won't mess things up. + // + + Lock lock(mutexes[partNumber]); + + part.setFrameBuffer(tiledFrameBuffers[partNumber][ly][lx]); + part.writeTile(tx, ty, lx, ly); + } + } + } + + private: + MultiPartOutputFile* file; + vector data; + Array2D* tiledFrameBuffers; +}; + +class RandomReadingTask : public Task +{ + public: + RandomReadingTask (TaskGroup *group, MultiPartInputFile* file): + Task(group), + file(file) + {} + + void execute() + { + int partNumber = rand() % headers.size(); + int partType = partTypes[partNumber]; + int pixelType = pixelTypes[partNumber]; + int levelMode = levelModes[partNumber]; + + Array2D uData; + Array2D fData; + Array2D hData; + if (partType == 0) + { + int l1, l2; + l1 = rand() % height; + l2 = rand() % height; + if (l1 > l2) swap(l1, l2); + + InputPart part(*file, partNumber); + // + // We add lock here to assure that two threads that accessing + // the same part won't mess things up. + // + Lock lock(mutexes[partNumber]); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + part.readPixels(l1, l2); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, 0, width - 1, l1, l2, width)); + break; + case 1: + assert(checkPixels(fData, 0, width - 1, l1, l2, width)); + break; + case 2: + assert(checkPixels(hData, 0, width - 1, l1, l2, width)); + break; + } + } + else + { + int tx1, tx2, ty1, ty2; + int lx, ly; + + TiledInputPart part(*file, partNumber); + // + // We add lock here to assure that two threads that accessing + // the same part won't mess things up. + // + Lock lock(mutexes[partNumber]); + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + lx = rand() % numXLevels; + ly = rand() % numYLevels; + if (levelMode == 1) ly = lx; + + int w = part.levelWidth(lx); + int h = part.levelHeight(ly); + + int numXTiles = part.numXTiles(lx); + int numYTiles = part.numYTiles(ly); + tx1 = rand() % numXTiles; + tx2 = rand() % numXTiles; + ty1 = rand() % numYTiles; + ty2 = rand() % numYTiles; + if (tx1 > tx2) swap(tx1, tx2); + if (ty1 > ty2) swap(ty1, ty2); + + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelType, + uData, fData, hData, w, h); + + part.setFrameBuffer(frameBuffer); + part.readTiles(tx1, tx2, ty1, ty2, lx, ly); + + Box2i b1 = part.dataWindowForTile(tx1, ty1, lx, ly); + Box2i b2 = part.dataWindowForTile(tx2, ty2, lx, ly); + + switch (pixelType) + { + case 0: + assert(checkPixels(uData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 1: + assert(checkPixels(fData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + case 2: + assert(checkPixels(hData, b1.min.x, b2.max.x, b1.min.y, b2.max.y, + w)); + break; + } + } + } + + private: + MultiPartInputFile* file; +}; + +void generateRandomHeaders(int partCount, vector
& headers, vector& taskList) +{ + headers.clear(); + for (int i = 0; i < partCount; i++) + { + Header header(width, height); + int pixelType = rand() % 3; + int partType = rand() % 2; + pixelTypes[i] = pixelType; + partTypes[i] = partType; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + switch (partType) + { + case 0: + header.setType(SCANLINEIMAGE); + break; + case 1: + header.setType(TILEDIMAGE); + break; + } + + int tileX; + int tileY; + int levelMode; + if (partType == 1) + { + tileX = rand() % width + 1; + tileY = rand() % height + 1; + levelMode = rand() % 3; + levelModes[i] = levelMode; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + } + + // + // Add lines or tiles to task list. + // + if (partType == 0) + { + for (int j = 0; j < height; j++) + taskList.push_back(WritingTaskData(i)); + } + else + { + int numXLevel; + int numYLevel; + int* numXTiles; + int* numYTiles; + precalculateTileInfo (header.tileDescription(), + 0, width - 1, + 0, height - 1, + numXTiles, numYTiles, + numXLevel, numYLevel); + + for (int lx = 0; lx < numXLevel; lx++) + for (int ly = 0; ly < numYLevel; ly++) + { + if (levelMode == 1) + if (lx != ly) continue; + + // Get all tasks for this level. + for (int tx = 0; tx < numXTiles[lx]; tx++) + for (int ty = 0; ty < numYTiles[ly]; ty++) + taskList.push_back(WritingTaskData(i, tx, ty, lx, ly)); + } + + delete[] numXTiles; + delete[] numYTiles; + } + +// if (partType == 0) +// { +// cout << "pixelType = " << pixelType << " partType = " << partType +// << endl << flush; +// } +// else +// { +// cout << "pixelType = " << pixelType << " partType = " << partType +// << " levelMode = " << levelModes[i] << endl << flush; +// } + + headers.push_back(header); + } +} + +void +generateRandomFile (int partCount, const std::string & fn) +{ + // + // Init data. + // + Array2D halfData; + Array2D floatData; + Array2D uintData; + fillPixels(uintData, width, height); + fillPixels(halfData, width, height); + fillPixels(floatData, width, height); + + Array2D< Array2D< half > >* tiledHalfData = new Array2D< Array2D< half > >[partCount]; + Array2D< Array2D< float > >* tiledFloatData = new Array2D< Array2D< float > >[partCount]; + Array2D< Array2D< unsigned int > >* tiledUintData = new Array2D< Array2D< unsigned int > >[partCount]; + + vector outputfiles; + vector taskList; + + pixelTypes.resize(partCount); + partTypes.resize(partCount); + levelModes.resize(partCount); + + // + // Generate headers and data. + // + cout << "Generating headers and data " << flush; + generateRandomHeaders(partCount, headers, taskList); + + // + // Shuffle tasks. + // + cout << "Shuffling " << taskList.size() << " tasks " << flush; + int taskListSize = taskList.size(); + for (int i = 0; i < taskListSize; i++) + { + int a, b; + a = rand() % taskListSize; + b = rand() % taskListSize; + swap(taskList[a], taskList[b]); + } + + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + + // + // Writing tasks. + // + cout << "Writing tasks " << flush; + + // + // Pre-generating frameBuffers. + // + vector parts; + vector frameBuffers(partCount); + Array >tiledFrameBuffers(partCount); + for (int i = 0; i < partCount; i++) + { + if (partTypes[i] == 0) + { + OutputPart* part = new OutputPart(file, i); + parts.push_back((void*) part); + + FrameBuffer& frameBuffer = frameBuffers[i]; + + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + + part->setFrameBuffer(frameBuffer); + } + else + { + TiledOutputPart* part = new TiledOutputPart(file, i); + parts.push_back((void*) part); + + int numXLevels = part->numXLevels(); + int numYLevels = part->numYLevels(); + + // Allocating space. + switch (pixelTypes[i]) + { + case 0: + tiledUintData[i].resizeErase(numYLevels, numXLevels); + break; + case 1: + tiledFloatData[i].resizeErase(numYLevels, numXLevels); + break; + case 2: + tiledHalfData[i].resizeErase(numYLevels, numXLevels); + break; + } + + tiledFrameBuffers[i].resizeErase(numYLevels, numXLevels); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part->isValidLevel(xLevel, yLevel)) + continue; + + int w = part->levelWidth(xLevel); + int h = part->levelHeight(yLevel); + + FrameBuffer& frameBuffer = tiledFrameBuffers[i][yLevel][xLevel]; + + switch (pixelTypes[i]) + { + case 0: + fillPixels(tiledUintData[i][yLevel][xLevel], w, h); + break; + case 1: + fillPixels(tiledFloatData[i][yLevel][xLevel], w, h); + break; + case 2: + fillPixels(tiledHalfData[i][yLevel][xLevel], w, h); + break; + } + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + tiledUintData[i][yLevel][xLevel], + tiledFloatData[i][yLevel][xLevel], + tiledHalfData[i][yLevel][xLevel], + w); + } + } + } + + // + // Writing tasks. + // + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(32); + vector list; + for (int i = 0; i < taskListSize; i++) + { + list.push_back(&taskList[i]); + if (i % 10 == 0 || i == taskListSize - 1) + { + threadPool->addTask( + (new WritingTask (&taskGroup, &file, list, tiledFrameBuffers))); + list.clear(); + } + } + + delete threadPool; + + delete[] tiledHalfData; + delete[] tiledUintData; + delete[] tiledFloatData; +} + +void +readWholeFiles (const std::string & fn) +{ + Array2D uData; + Array2D fData; + Array2D hData; + + MultiPartInputFile file(fn.c_str()); + for (size_t i = 0; i < file.parts(); i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + + // + // It rarely fails here. Added code to see what's wrong when it happens. + // + ChannelList::ConstIterator i1 = header.channels().begin(); + ChannelList::ConstIterator i2 = headers[i].channels().begin(); + Channel c1 = i1.channel(); + Channel c2 = i2.channel(); + if (!(c1 == c2)) + { + cout << " type " << c1.type << ", " << c2.type + << " xSampling " << c1.xSampling << ", " << c2.xSampling + << " ySampling " << c1.ySampling << ", " << c2.ySampling + << " pLinear " << c1.pLinear << ", " << c2.pLinear << flush; + } + + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + cout << "Reading whole files " << flush; + + // + // Shuffle part numbers. + // + vector shuffledPartNumber; + for (int i = 0; i < headers.size(); i++) + shuffledPartNumber.push_back(i); + for (int i = 0; i < headers.size(); i++) + { + int a = rand() % headers.size(); + int b = rand() % headers.size(); + swap (shuffledPartNumber[a], shuffledPartNumber[b]); + } + + // + // Start reading whole files. + // + int i; + int partNumber; + try + { + for (i = 0; i < headers.size(); i++) + { + partNumber = shuffledPartNumber[i]; + if (partTypes[partNumber] == 0) + { + FrameBuffer frameBuffer; + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + InputPart part(file, partNumber); + part.setFrameBuffer(frameBuffer); + part.readPixels(0, height - 1); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, width, height)); + break; + case 1: + assert(checkPixels(fData, width, height)); + break; + case 2: + assert(checkPixels(hData, width, height)); + break; + } + } + else + { + FrameBuffer frameBuffer; + TiledInputPart part(file, partNumber); + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + setInputFrameBuffer(frameBuffer, pixelTypes[partNumber], + uData, fData, hData, width, height); + + part.setFrameBuffer(frameBuffer); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + part.readTiles(0, numXTiles - 1, 0, numYTiles - 1, xLevel, yLevel); + switch (pixelTypes[partNumber]) + { + case 0: + assert(checkPixels(uData, w, h)); + break; + case 1: + assert(checkPixels(fData, w, h)); + break; + case 2: + assert(checkPixels(hData, w, h)); + break; + } + } + } + } + } + catch (...) + { + cout << "Error while reading part " << partNumber << endl << flush; + throw; + } +} + +void +readPartialFiles (int randomReadCount, const std::string & fn) +{ + cout << "Reading partial files " << flush; + MultiPartInputFile file(fn.c_str()); + + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(32); + + for (int i = 0; i < randomReadCount; i++) + { + threadPool->addTask( + (new RandomReadingTask (&taskGroup, &file))); + } + + delete threadPool; +} + +void +testWriteRead (int partNumber, + int runCount, + int randomReadCount, + const std::string & tempDir) +{ + cout << "Testing file with " << partNumber << " part(s)." << endl << flush; + std::string fn = tempDir + "imf_test_multipart_threading.exr"; + + for (int i = 0; i < runCount; i++) + { + generateRandomFile (partNumber, fn); + readWholeFiles (fn); + readPartialFiles (randomReadCount, fn); + + remove (fn.c_str()); + + cout << endl << flush; + } +} + +} // namespace + +void testMultiPartThreading (const std::string & tempDir) +{ + try + { + cout << "Testing the multi part APIs for multi-thread use" << endl; + + srand(1); + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(32); + + testWriteRead ( 1, 1, 5, tempDir); + testWriteRead ( 2, 2, 10, tempDir); + testWriteRead ( 5, 5, 25, tempDir); + testWriteRead (50, 2, 250, tempDir); + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiPartThreading.h b/IlmImfTest/testMultiPartThreading.h new file mode 100644 index 0000000..e3d54c4 --- /dev/null +++ b/IlmImfTest/testMultiPartThreading.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTMULTIPARTTHREADING_H_ +#define TESTMULTIPARTTHREADING_H_ + +#include + +void testMultiPartThreading (const std::string & tempDir); + +#endif /* TESTMULTIPARTTHREADING_H_ */ diff --git a/IlmImfTest/testMultiScanlinePartThreading.cpp b/IlmImfTest/testMultiScanlinePartThreading.cpp new file mode 100644 index 0000000..85058c4 --- /dev/null +++ b/IlmImfTest/testMultiScanlinePartThreading.cpp @@ -0,0 +1,438 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" + +#include "testMultiScanlinePartThreading.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +namespace +{ + +const int height = 263; +const int width = 197; + +vector
headers; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +class WritingTask: public Task +{ + public: + WritingTask (TaskGroup *group, OutputPart& part, int outputLines): + Task(group), + part(part), + outputLines(outputLines) + {} + + void execute() + { + for (int i = 0; i < outputLines; i++) + part.writePixels(); + } + + private: + OutputPart& part; + int outputLines; +}; + +class ReadingTask: public Task +{ + public: + ReadingTask (TaskGroup *group, InputPart& part, int startPos): + Task(group), + part(part), + startPos(startPos) + {} + + void execute() + { + int endPos = startPos + 9; + if (endPos >= height) endPos = height - 1; + part.readPixels(startPos, endPos); + } + + private: + InputPart& part; + int startPos; +}; + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +void +generateFiles (int pixelTypes[], const std::string & fn) +{ + // + // Generate headers. + // + + cout << "Generating headers " << flush; + headers.clear(); + for (int i = 0; i < 2; i++) + { + Header header(width, height); + int pixelType = pixelTypes[i]; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + header.setType(SCANLINEIMAGE); + + headers.push_back(header); + } + + // + // Preparing. + // + + cout << "Writing files " << flush; + Array2D halfData; + Array2D floatData; + Array2D uintData; + fillPixels(uintData, width, height); + fillPixels(halfData, width, height); + fillPixels(floatData, width, height); + + remove(fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size() ); + + vector parts; + FrameBuffer frameBuffers[2]; + for (int i = 0; i < 2; i++) + { + OutputPart part(file, i); + + FrameBuffer& frameBuffer = frameBuffers[i]; + setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width); + part.setFrameBuffer(frameBuffer); + + parts.push_back(part); + } + + // + // Writing tasks. + // + + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(2); + for (int i = 0; i < height / 10; i++) + { + threadPool->addTask((new WritingTask (&taskGroup, parts[0], 10))); + threadPool->addTask((new WritingTask (&taskGroup, parts[1], 10))); + } + threadPool->addTask((new WritingTask (&taskGroup, parts[0], height % 10))); + threadPool->addTask((new WritingTask (&taskGroup, parts[1], height % 10))); + delete threadPool; +} + +void +readFiles (int pixelTypes[], const std::string & fn) +{ + cout << "Checking headers " << flush; + MultiPartInputFile file(fn.c_str()); + assert (file.parts() == 2); + for (size_t i = 0; i < 2; i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + // + // Preparing. + // + + Array2D uData[2]; + Array2D fData[2]; + Array2D hData[2]; + vector parts; + FrameBuffer frameBuffers[2]; + for (int i = 0; i < 2; i++) + { + InputPart part(file, i); + + FrameBuffer& frameBuffer = frameBuffers[i]; + setInputFrameBuffer(frameBuffer, pixelTypes[i], uData[i], fData[i], hData[i], width, height); + part.setFrameBuffer(frameBuffer); + + parts.push_back(part); + } + + // + // Reading files. + // + + cout << "Reading files " << flush; + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(2); + for (int i = 0; i <= height / 10; i++) + { + threadPool->addTask((new ReadingTask (&taskGroup, parts[0], i * 10))); + threadPool->addTask((new ReadingTask (&taskGroup, parts[1], i * 10))); + } + delete threadPool; + + // + // Checking data. + // + + cout << "Comparing" << endl << flush; + for (int i = 0; i < 2; i++) + { + switch (pixelTypes[i]) + { + case 0: + assert(checkPixels(uData[i], width, height)); + break; + case 1: + assert(checkPixels(fData[i], width, height)); + break; + case 2: + assert(checkPixels(hData[i], width, height)); + break; + } + } +} + +void +testWriteRead (int pixelTypes[], const std::string & tempDir) +{ + std::string fn = tempDir + "imf_test_multi_scanline_part_threading.exr"; + + string typeNames[2]; + for (int i = 0; i < 2; i++) + { + switch (pixelTypes[i]) + { + case 0: + typeNames[i] = "unsigned int"; + break; + case 1: + typeNames[i] = "float"; + break; + case 2: + typeNames[i] = "half"; + break; + } + } + cout << "part 1: " << typeNames[0] << " scanline part, " + << "part 2: " << typeNames[1] << " scanline part. " << endl << flush; + + generateFiles (pixelTypes, fn); + readFiles (pixelTypes, fn); + + remove (fn.c_str()); + + cout << endl << flush; +} + +} // namespace + +void testMultiScanlinePartThreading (const std::string & tempDir) +{ + try + { + cout << "Testing the two threads reading/writing on two-scanline-part file" << endl; + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(2); + + int pixelTypes[2]; + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + { + pixelTypes[0] = i; + pixelTypes[1] = j; + testWriteRead (pixelTypes, tempDir); + } + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiScanlinePartThreading.h b/IlmImfTest/testMultiScanlinePartThreading.h new file mode 100644 index 0000000..aedbc98 --- /dev/null +++ b/IlmImfTest/testMultiScanlinePartThreading.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTMULTISCANLINEPARTTHREADING_H_ +#define TESTMULTISCANLINEPARTTHREADING_H_ + +#include + +void testMultiScanlinePartThreading (const std::string & tempDir); + +#endif /* TESTMULTISCANLINEPARTTHREADING_H_ */ diff --git a/IlmImfTest/testMultiTiledPartThreading.cpp b/IlmImfTest/testMultiTiledPartThreading.cpp new file mode 100644 index 0000000..d85af6b --- /dev/null +++ b/IlmImfTest/testMultiTiledPartThreading.cpp @@ -0,0 +1,550 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include + +#include "tmpDir.h" + +#include "testMultiTiledPartThreading.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace +{ + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + +const int height = 263; +const int width = 197; + +vector
headers; +int pixelTypes[2]; +int levelMode; +int tileSize; + +template +void fillPixels (Array2D &ph, int width, int height) +{ + ph.resizeErase(height, width); + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + // + // We do this because half cannot store number bigger than 2048 exactly. + // + ph[y][x] = (y * width + x) % 2049; + } +} + +template +bool checkPixels (Array2D &ph, int lx, int rx, int ly, int ry, int width) +{ + for (int y = ly; y <= ry; ++y) + for (int x = lx; x <= rx; ++x) + if (ph[y][x] != (y * width + x) % 2049) + { + cout << "value at " << x << ", " << y << ": " << ph[y][x] + << ", should be " << (y * width + x) % 2049 << endl << flush; + return false; + } + return true; +} + +template +bool checkPixels (Array2D &ph, int width, int height) +{ + return checkPixels (ph, 0, width - 1, 0, height - 1, width); +} + +void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width) +{ + switch (pixelType) + { + case 0: + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width)); + break; + case 1: + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width)); + break; + case 2: + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width)); + break; + } +} + +void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType, + Array2D& uData, Array2D& fData, + Array2D& hData, int width, int height) +{ + switch (pixelType) + { + case 0: + uData.resizeErase(height, width); + frameBuffer.insert ("UINT", + Slice (IMF::UINT, + (char *) (&uData[0][0]), + sizeof (uData[0][0]) * 1, + sizeof (uData[0][0]) * width, + 1, 1, + 0)); + break; + case 1: + fData.resizeErase(height, width); + frameBuffer.insert ("FLOAT", + Slice (IMF::FLOAT, + (char *) (&fData[0][0]), + sizeof (fData[0][0]) * 1, + sizeof (fData[0][0]) * width, + 1, 1, + 0)); + break; + case 2: + hData.resizeErase(height, width); + frameBuffer.insert ("HALF", + Slice (IMF::HALF, + (char *) (&hData[0][0]), + sizeof (hData[0][0]) * 1, + sizeof (hData[0][0]) * width, + 1, 1, + 0)); + break; + } +} + +class WritingTask: public Task +{ + public: + WritingTask (TaskGroup *group, TiledOutputPart& part, + int lx, int ly, int startY, int numXTiles): + Task(group), + part(part), + lx(lx), + ly(ly), + startY(startY), + numXTiles(numXTiles) + {} + + void execute() + { + part.writeTiles(0, numXTiles - 1, startY, startY, lx, ly); + } + + private: + TiledOutputPart& part; + int lx, ly; + int startY; + int numXTiles; +}; + +class ReadingTask: public Task +{ + public: + ReadingTask (TaskGroup *group, TiledInputPart& part, + int lx, int ly, int startY, int numXTiles): + Task(group), + part(part), + lx(lx), + ly(ly), + startY(startY), + numXTiles(numXTiles) + {} + + void execute() + { + part.readTiles(0, numXTiles - 1, startY, startY, lx, ly); + } + + private: + TiledInputPart& part; + int lx, ly; + int startY; + int numXTiles; +}; + +void +generateFiles (const std::string & fn) +{ + // + // Generating headers. + // + + cout << "Generating headers " << flush; + headers.clear(); + for (int i = 0; i < 2; i++) + { + Header header(width, height); + int pixelType = pixelTypes[i]; + + stringstream ss; + ss << i; + header.setName(ss.str()); + + switch (pixelType) + { + case 0: + header.channels().insert("UINT", Channel(IMF::UINT)); + break; + case 1: + header.channels().insert("FLOAT", Channel(IMF::FLOAT)); + break; + case 2: + header.channels().insert("HALF", Channel(IMF::HALF)); + break; + } + + header.setType(TILEDIMAGE); + + int tileX = tileSize; + int tileY = tileSize; + LevelMode lm; + switch (levelMode) + { + case 0: + lm = ONE_LEVEL; + break; + case 1: + lm = MIPMAP_LEVELS; + break; + case 2: + lm = RIPMAP_LEVELS; + break; + } + header.setTileDescription(TileDescription(tileX, tileY, lm)); + + headers.push_back(header); + } + + // + // Preparing. + // + remove (fn.c_str()); + MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size()); + vector parts; + Array2D halfData[2]; + Array2D floatData[2]; + Array2D uintData[2]; + for (int i = 0; i < 2; i++) + { + TiledOutputPart part(file, i); + parts.push_back(part); + } + + // + // Writing files. + // + cout << "Writing files " << flush; + + // + // Two parts are the same, and we pick parts[0]. + // + TiledOutputPart& part = parts[0]; + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffers[2]; + + for (int i = 0; i < 2; i++) + { + FrameBuffer& frameBuffer = frameBuffers[i]; + + switch (pixelTypes[i]) + { + case 0: + fillPixels(uintData[i], w, h); + break; + case 1: + fillPixels(floatData[i], w, h); + break; + case 2: + fillPixels(halfData[i], w, h); + break; + } + setOutputFrameBuffer(frameBuffer, pixelTypes[i], + uintData[i], + floatData[i], + halfData[i], + w); + parts[i].setFrameBuffer(frameBuffer); + } + + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(2); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + for (int i = 0; i < numYTiles; i++) + { + threadPool->addTask( + (new WritingTask (&taskGroup, parts[0], + xLevel, yLevel, i, numXTiles))); + threadPool->addTask( + (new WritingTask (&taskGroup, parts[1], + xLevel, yLevel, i, numXTiles))); + } + delete threadPool; + } +} + +void +readFiles (const std::string & fn) +{ + + cout << "Checking headers " << flush; + MultiPartInputFile file(fn.c_str()); + assert (file.parts() == 2); + for (size_t i = 0; i < 2; i++) + { + const Header& header = file.header(i); + assert (header.displayWindow() == headers[i].displayWindow()); + assert (header.dataWindow() == headers[i].dataWindow()); + assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio()); + assert (header.screenWindowCenter() == headers[i].screenWindowCenter()); + assert (header.screenWindowWidth() == headers[i].screenWindowWidth()); + assert (header.lineOrder() == headers[i].lineOrder()); + assert (header.compression() == headers[i].compression()); + assert (header.channels() == headers[i].channels()); + assert (header.name() == headers[i].name()); + assert (header.type() == headers[i].type()); + } + + // + // Preparing. + // + + Array2D uData[2]; + Array2D fData[2]; + Array2D hData[2]; + vector parts; + for (int i = 0; i < 2; i++) + { + TiledInputPart part(file, i); + parts.push_back(part); + } + + // + // Reading files. + // + + cout << "Reading and comparing files " << flush; + TiledInputPart& part = parts[0]; + + int numXLevels = part.numXLevels(); + int numYLevels = part.numYLevels(); + + for (int xLevel = 0; xLevel < numXLevels; xLevel++) + for (int yLevel = 0; yLevel < numYLevels; yLevel++) + { + if (!part.isValidLevel(xLevel, yLevel)) + continue; + + int w = part.levelWidth(xLevel); + int h = part.levelHeight(yLevel); + + FrameBuffer frameBuffers[2]; + + for (int i = 0; i < 2; i++) + { + FrameBuffer& frameBuffer = frameBuffers[i]; + + setInputFrameBuffer(frameBuffer, pixelTypes[i], + uData[i], + fData[i], + hData[i], + w, h); + parts[i].setFrameBuffer(frameBuffer); + } + + TaskGroup taskGroup; + ThreadPool* threadPool = new ThreadPool(2); + int numXTiles = part.numXTiles(xLevel); + int numYTiles = part.numYTiles(yLevel); + for (int i = 0; i < numYTiles; i++) + { + threadPool->addTask( + (new ReadingTask (&taskGroup, parts[0], + xLevel, yLevel, i, numXTiles))); + threadPool->addTask( + (new ReadingTask (&taskGroup, parts[1], + xLevel, yLevel, i, numXTiles))); + } + delete threadPool; + + for (int i = 0; i < 2; i++) + { + switch (pixelTypes[i]) + { + case 0: + assert(checkPixels(uData[i], w, h)); + break; + case 1: + assert(checkPixels(fData[i], w, h)); + break; + case 2: + assert(checkPixels(hData[i], w, h)); + break; + } + } + } +} + +void +testWriteRead (const std::string & tempDir) +{ + std::string fn = tempDir + "imf_test_multi_tiled_part_threading.exr"; + string typeNames[2]; + string levelModeName; + for (int i = 0; i < 2; i++) + { + switch (pixelTypes[i]) + { + case 0: + typeNames[i] = "unsigned int"; + break; + case 1: + typeNames[i] = "float"; + break; + case 2: + typeNames[i] = "half"; + break; + } + + switch (levelMode) + { + case 0: + levelModeName = "ONE_LEVEL"; + break; + case 1: + levelModeName = "MIPMAP"; + break; + case 2: + levelModeName = "RIPMAP"; + break; + } + } + cout << "part 1: type " << typeNames[0] + << " tiled part, " + << "part 2: type " << typeNames[1] + << " tiled part, " + << "level mode " << levelModeName + << " tile size " << tileSize << "x" << tileSize + << endl << flush; + + generateFiles (fn); + readFiles (fn); + + remove (fn.c_str()); + + cout << endl << flush; +} + +} // namespace + +void testMultiTiledPartThreading (const std::string & tempDir) +{ + try + { + cout << "Testing the two threads reading/writing on two-tiled-part file" << endl; + + int numThreads = ThreadPool::globalThreadPool().numThreads(); + ThreadPool::globalThreadPool().setNumThreads(2); + + for (int pt1 = 0; pt1 < 3; pt1++) + for (int pt2 = 0; pt2 < 3; pt2++) + for (int lm = 0; lm < 3; lm++) + for (int size = 1; size < min(width, height); size += 50) + { + pixelTypes[0] = pt1; + pixelTypes[1] = pt2; + levelMode = lm; + tileSize = size; + testWriteRead (tempDir); + } + + ThreadPool::globalThreadPool().setNumThreads(numThreads); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiTiledPartThreading.h b/IlmImfTest/testMultiTiledPartThreading.h new file mode 100644 index 0000000..6af38e8 --- /dev/null +++ b/IlmImfTest/testMultiTiledPartThreading.h @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTMULTITILEDPARTTHREADING_H_ +#define TESTMULTITILEDPARTTHREADING_H_ + +#include + +void testMultiTiledPartThreading (const std::string & tempDir); + +#endif /* TESTMULTITILEDPARTTHREADING_H_ */ diff --git a/IlmImfTest/testMultiView.cpp b/IlmImfTest/testMultiView.cpp new file mode 100644 index 0000000..34ef967 --- /dev/null +++ b/IlmImfTest/testMultiView.cpp @@ -0,0 +1,510 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007 Weta Digital Ltd +// Copyright (c) 2012 Industrial Light & Magic, a division of Lucasfilm +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include + +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +namespace { + +ChannelList +buildList (const char *name, ...) +{ + // + // nice function to build channel lists + // + + ChannelList list; + const char *channelName = name; + + va_list ap; + va_start (ap, name); + + while (channelName != 0) + { + list.insert (channelName, Channel()); + channelName = va_arg (ap, char *); + } + + va_end (ap); + return list; +} + + +void +testMultiViewFunctions () +{ + StringVector multiView; + + multiView.push_back ("right"); + multiView.push_back ("left"); + multiView.push_back ("centre"); + + // + // Test viewFromChannelName() + // + + // default view + + assert (viewFromChannelName ("R", multiView) == "right"); + + // explicitly specified default view + + assert (viewFromChannelName ("right.balween", multiView) == "right"); + + // non-default view: two sections + + assert (viewFromChannelName ("left.gritstone", multiView) == "left"); + + // non-default view: two sections + + assert (viewFromChannelName ("centre.ronaldsay", multiView) == "centre"); + + // non-default view: three sections + + assert (viewFromChannelName ("swaledale.left.lonk", multiView) == "left"); + + // explicitly specified default view: four sections + + assert (viewFromChannelName ("manx.loghtan.right.shetland", + multiView) == "right"); + + // non-default view: five sections + + assert (viewFromChannelName ("dorset.down.hebridean.centre.r", + multiView) == "centre"); + + // shouldn't happen that we have null channel names + + assert (viewFromChannelName ("", multiView) == ""); + + // single section with no view name: default view + + assert (viewFromChannelName ("dartmoor", multiView) == "right"); + + // two sections with no view name: no view + + assert (viewFromChannelName ("scottish.blackface", multiView) == ""); + + // three sections with no view name: no view + + assert (viewFromChannelName ("beulah.speckled.face", multiView) == ""); + + // four sections with no view name: no view + + assert (viewFromChannelName ("devon.and.cornwall.longwool", + multiView) == ""); + + // + // Test areCounterparts() + // + + // two non default channel names in list + + assert (areCounterparts ("right.R", + "centre.R", + multiView) == true); + + // two channel names, both explicit and in list, + // even though one is default channel + + assert (areCounterparts ("left.R", + "right.R", + multiView) == true); + + // default view with non-default view + + assert (areCounterparts ("R", + "left.R", + multiView) == true); + + // as above, but other way round + + assert (areCounterparts ("left.R", + "R", + multiView) == true); + + // same channel name specified in two different ways + + assert (areCounterparts ("right.R", + "R", + multiView) == false); + + // as above, but other way round + + assert (areCounterparts ("R", + "right.R", + multiView) == false); + + // none.R is not in a view + + assert (areCounterparts ("none.R", + "left.R", + multiView) == false); + + // as above, but other way round + + assert (areCounterparts ("left.R", + "none.R", + multiView) == false); + + // as above, but with default channel + + assert (areCounterparts ("X", + "none.X", + multiView) == false); + + // as above, but other way round + + assert (areCounterparts ("none.B", + "B", + multiView) == false); + + // both not in a view + + assert (areCounterparts ("southdown.none.G", + "wiltshire.horn.G", + multiView) == false); + + // as above, but different lengths of names + + assert (areCounterparts ("wiltshire.horn.G", + "cotswold.G", + multiView) == false); + + // three section pairs + + assert (areCounterparts ("wensleydale.left.baa", + "wensleydale.right.baa", + multiView) == true); + + // different in first section + + assert (areCounterparts ("wensleydal.left.baa", + "wensleydale.right.baa", + multiView) == false); + + // different in last section + + assert (areCounterparts ("wensleydale.left.bah", + "wensleydale.right.baa", + multiView) == false); + + // same channel + + assert (areCounterparts ("wensleydale.left.baa", + "wensleydale.left.baa", + multiView) == false); + + // second is in no view + + assert (areCounterparts ("wensleydale.right.fell", + "wensleydale.rough.fell", + multiView) == false); + + // first is in no view + + assert (areCounterparts ("wensleydale.rough.fell", + "wensleydale.left.fell", + multiView) == false); + + // four sectons + + assert (areCounterparts ("lincoln.longwool.right.A", + "lincoln.longwool.left.A", + multiView) == true); + + // different in final section + + assert (areCounterparts ("lincoln.longwool.right.B", + "lincoln.longwool.left.A", + multiView) == false); + + // different in second section + + assert (areCounterparts ("lincoln.shortwool.right.A", + "lincoln.longwool.left.A", + multiView) == false); + + // different in first section + + assert (areCounterparts ("cumbria.longwool.right.A", + "lincoln.longwool.left.A", + multiView) == false); + + // enough said + + assert (areCounterparts ("baa.baa.black.sheep", + "lincoln.longwool.left.A", + multiView) == false); + + + // three sections with default - only last is same + + assert (areCounterparts ("portland.left.baa", + "baa", + multiView) == false); + + // four sections with default + + assert (areCounterparts ("dorset.down.left.baa", + "baa", + multiView) == false); + + // + // Channel list tests + // + + // list of channels in some multiview image + + ChannelList a = buildList + ("A", + "B", + "C", + "right.jacob", + "shropshire.right.D", + "castlemilk.moorit.right.A", + "black.welsh.mountain.right.A", + "left.A", + "left.B", + "left.C", + "left.jacob", + "shropshire.left.D", + "castlemilk.moorit.left.A", + "black.welsh.mountain.left.A", + "centre.A", + "centre.B", + "centre.C", + "shropshire.centre.D", + "castlemilk.moorit.centre.A", + "none.A", + "none.B", + "none.C", + "none.D", + "none.jacob", + "shropshire.none.D", + "rough.fell", + (char *) 0); + + // + // List of channels in each view + // + + // all left channels + + ChannelList realLeft = buildList + ("left.A", + "left.B", + "left.C", + "left.jacob", + "shropshire.left.D", + "castlemilk.moorit.left.A", + "black.welsh.mountain.left.A", + (char *) 0); + + ChannelList realRight = buildList + ("A", + "B", + "C", + "right.jacob", + "shropshire.right.D", + "castlemilk.moorit.right.A", + "black.welsh.mountain.right.A", + (char *) 0); + + // all the right channels including the default channels + + ChannelList realCentre = buildList + ("centre.A", + "centre.B", + "centre.C", + "shropshire.centre.D", + "castlemilk.moorit.centre.A", + (char *) 0); + + // no jacob channel + // there IS a jacob channel but it has no counterparts because + // this is in "no view" + + ChannelList realNone = buildList + ("none.A", + "none.B", + "none.D", + "none.C", + "none.jacob", + "shropshire.none.D", + "rough.fell", + (char *) 0); + + // have a dummy name just to throw a wolf amongst the sheep + + multiView.push_back ("wolf"); + + // no channels + + ChannelList realNull = buildList ((char *) 0); + + // + // Test channelsInView() + // + + // default view channel extraction + + assert (channelsInView ("right", a, multiView) == realRight); + + // non-default view channel extraction + + assert (channelsInView ("left", a, multiView) == realLeft); + + // missing 'centre.jacob' + + assert (channelsInView ("centre", a, multiView) == realCentre); + + // "none" isn't a view name, no channels returned + + assert (channelsInView ("none", a, multiView) == realNull); + + // "wolf" has no channels, no channels returned + + assert (channelsInView ("wolf", a, multiView) == realNull); + + // all no view channels + + assert (channelsInNoView (a, multiView) == realNone); + + + // + // Test channelInAllViews() + // + + ChannelList realA = buildList + ("left.A", + "A", + "centre.A", + (char *) 0); + + ChannelList realB = buildList + ("left.B", + "B", + "centre.B", + (char *) 0); + + ChannelList realJacob = buildList + ("left.jacob", + "right.jacob", + (char *) 0); + + ChannelList realCm = buildList + ("castlemilk.moorit.left.A", + "castlemillk.moorit.right.A", + "castlemilk.moorit.centre.A", + (char *) 0); + + ChannelList realBwm = buildList + ("black.welsh.mountain.left.A", + "black.welsh.mountain.right.A", + (char *) 0); + + assert (channelInAllViews ("left.A", a, multiView) == realA); + + assert (channelInAllViews ("A", a, multiView) == realA); + + assert (channelInAllViews ("centre.B", a, multiView) == realB); + + assert (channelInAllViews ("right.jacob", a, multiView) == realJacob); + + assert (channelInAllViews ("castlemilk.moorit.centre.A", + a, multiView) == realCm); + + assert (channelInAllViews ("black.welsh.mountain.right.A", + a, multiView) == realBwm); + + // + // Test insertViewName() + // + + assert (insertViewName ("A", multiView, 0) == + "A"); + + assert (insertViewName ("mountain.A", multiView, 0) == + "mountain.right.A"); + + assert (insertViewName ("welsh.mountain.A", multiView, 0) == + "welsh.mountain.right.A"); + + assert (insertViewName ("black.welsh.mountain.A", multiView, 0) == + "black.welsh.mountain.right.A"); + + assert (insertViewName ("A", multiView, 1) == + "left.A"); + + assert (insertViewName ("mountain.A", multiView, 1) == + "mountain.left.A"); + + assert (insertViewName ("welsh.mountain.A", multiView, 1) == + "welsh.mountain.left.A"); + + assert (insertViewName ("black.welsh.mountain.A", multiView, 1) == + "black.welsh.mountain.left.A"); +} + +} // namespace + + +void +testMultiView (const std::string&) +{ + try + { + cout << "Testing multi-view channel list functions" << endl; + testMultiViewFunctions(); + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testMultiView.h b/IlmImfTest/testMultiView.h new file mode 100644 index 0000000..bc5642e --- /dev/null +++ b/IlmImfTest/testMultiView.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007 Weta Digital Ltd +// Copyright (c) 2012 Industrial Light & Magic, a division of Lucasfilm +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testMultiView (const std::string &tempDir); + diff --git a/IlmImfTest/testNativeFormat.cpp b/IlmImfTest/testNativeFormat.cpp new file mode 100644 index 0000000..7555fc1 --- /dev/null +++ b/IlmImfTest/testNativeFormat.cpp @@ -0,0 +1,294 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include + +#include +#include + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +readImage (const char fileName[], + Array2D& pixels, + int& w, + int& h, + unsigned int correctChecksum) +{ + RgbaInputFile in (fileName); + + const Box2i &dw = in.dataWindow(); + + w = dw.max.x - dw.min.x + 1; + h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + pixels.resizeErase (h, w); + in.setFrameBuffer (&pixels[0][0] - dx - dy * w, 1, w); + in.readPixels (in.dataWindow().min.y, in.dataWindow().max.y); + + unsigned int checksum = 0; + + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + { + checksum ^= pixels[y][x].r.bits(); + checksum ^= pixels[y][x].g.bits(); + checksum ^= pixels[y][x].b.bits(); + checksum ^= pixels[y][x].a.bits(); + } + + cout << "checksum = " << checksum << flush; + + assert (checksum == correctChecksum); + + cout << ", ok" << flush; +} + + +void +readBackImage (const char fileName[], + Array2D& pixels, + const Array2D& pixels2, + int& w, + int& h, + const int& xs, + const int& ys) +{ + InputFile file (fileName); + + Box2i dw = file.header().dataWindow(); + w = dw.max.x - dw.min.x + 1; + h = dw.max.y - dw.min.y + 1; + + pixels.resizeErase (h, w); + + FrameBuffer frameBuffer; + + Rgba *base = &pixels[0][0] - dw.min.x - dw.min.y * w; + int xStride = sizeof (pixels[0][0]) * xs; + int yStride = sizeof (pixels[0][0]) * w * ys; + + frameBuffer.insert ("R", // name + Slice (HALF, // type + (char *) &base[0].r, // base + xStride, // xStride + yStride, // yStride + xs, ys, // x/y sampling + 0.0)); // fillValue + + frameBuffer.insert ("G", // name + Slice (HALF, // type + (char *) &base[0].g, // base + xStride, // xStride + yStride, // yStride + xs, ys, // x/y sampling + 0.0)); // fillValue + + frameBuffer.insert ("B", // name + Slice (HALF, // type + (char *) &base[0].b, // base + xStride, // xStride + yStride, // yStride + xs, ys, // x/y sampling + 0.0)); // fillValue + + frameBuffer.insert ("A", // name + Slice (HALF, // type + (char *) &base[0].a, // base + xStride, // xStride + yStride, // yStride + xs, ys, // x/y sampling + 1.0)); // fillValue + + file.setFrameBuffer (frameBuffer); + file.readPixels (dw.min.y, dw.max.y); + + cout << "comparing, " << flush; + for (int y = 0; y < h; y+=ys) + for (int x = 0; x < w; x+=xs) + { + assert(pixels2[y][x].r.bits() == pixels[y][x].r.bits()); + assert(pixels2[y][x].g.bits() == pixels[y][x].g.bits()); + assert(pixels2[y][x].b.bits() == pixels[y][x].b.bits()); + assert(pixels2[y][x].a.bits() == pixels[y][x].a.bits()); + } + cout << "ok" << endl << flush; + +} + + +void +writeImage (const char fileName[], + const Array2D& pixels, + const int& width, + const int& height, + const int& xs = 1, + const int& ys = 1) +{ + // + // Write the image to fileName one scanline at a time + // + + Header header (width, height); + header.compression() = PIZ_COMPRESSION; + header.channels().insert ("R", Channel (HALF,xs,ys)); + header.channels().insert ("G", Channel (HALF,xs,ys)); + header.channels().insert ("B", Channel (HALF,xs,ys)); + header.channels().insert ("A", Channel (HALF,xs,ys)); + + OutputFile file (fileName, header); + FrameBuffer frameBuffer; + + const Rgba *base = &pixels[0][0]; + int xStride = sizeof (pixels[0][0]) * xs; + int yStride = sizeof (pixels[0][0]) * 0; + + frameBuffer.insert ("R", // name + Slice (HALF, // type + (char *) &base[0].r, // base + xStride, // xStride + yStride, // yStride + xs, ys)); // x/y sampling + + frameBuffer.insert ("G", // name + Slice (HALF, // type + (char *) &base[0].g, // base + xStride, // xStride + yStride, // yStride + xs, ys)); // x/y sampling + + frameBuffer.insert ("B", // name + Slice (HALF, // type + (char *) &base[0].b, // base + xStride, // xStride + yStride, // yStride + xs, ys)); // x/y sampling + + frameBuffer.insert ("A", // name + Slice (HALF, // type + (char *) &base[0].a, // base + xStride, // xStride + yStride, // yStride + xs, ys)); // x/y sampling + + // iterate over all scanlines, and write them out + for (int y = 0; y < height; ++y) + { + // set the base address for this scanline + base = &pixels[y][0]; + frameBuffer["R"].base = (char *) &base[0].r; + frameBuffer["G"].base = (char *) &base[0].g; + frameBuffer["B"].base = (char *) &base[0].b; + frameBuffer["A"].base = (char *) &base[0].a; + + // set the framebuffer and write the pixels + file.setFrameBuffer (frameBuffer); + file.writePixels (1); + } +} + + +void +readCopyRead (const std::string &tempDir, + const char* infilename, + unsigned int correctChecksum) +{ + std::string outfilename = tempDir + "imf_test_native.exr"; + + int w, h; + Array2D pixels (1,1); + + cout << " reading, " << flush; + readImage(infilename, pixels, w, h, correctChecksum); + cout << endl; + + for (int xs = 1; xs <= 2; ++xs) + { + for (int ys = 1; ys <= 2; ++ys) + { + cout << " x sampling " << xs << ", y sampling " << ys << + ": writing image, " << flush; + writeImage(outfilename.c_str(), pixels, w, h, xs, ys); + + Array2D pixels2 (1,1); + cout << "reading back, " << flush; + readBackImage(outfilename.c_str(), pixels2, pixels, w, h, xs, ys); + + remove(outfilename.c_str()); + } + } +} + +} // namespace + + +void +testNativeFormat (const std::string &tempDir) +{ + try + { + cout << "Testing if uncompressible pixel data are written " + "in Xdr, not native format" << endl; + + cout << "image 1:" << endl; + readCopyRead(tempDir, ILM_IMF_TEST_IMAGEDIR "test_native1.exr", 54435); + + cout << "image 2:" << endl; + readCopyRead(tempDir, ILM_IMF_TEST_IMAGEDIR "test_native2.exr", 37639); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testNativeFormat.h b/IlmImfTest/testNativeFormat.h new file mode 100644 index 0000000..19c9ba6 --- /dev/null +++ b/IlmImfTest/testNativeFormat.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testNativeFormat (const std::string &tempDir); + diff --git a/IlmImfTest/testOptimized.cpp b/IlmImfTest/testOptimized.cpp new file mode 100644 index 0000000..427090c --- /dev/null +++ b/IlmImfTest/testOptimized.cpp @@ -0,0 +1,626 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include "half.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + + +using namespace std; +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; + +namespace IMATH = IMATH_NAMESPACE; +using namespace IMATH; + + +namespace +{ + +static const int IMAGE_2K_HEIGHT = 1152; +static const int IMAGE_2K_WIDTH = 2048; + +static const char* CHANNEL_NAMES[] = {"R", "G", "B", "A"}; +static const char* CHANNEL_NAMES_LEFT[] = {"left.R", "left.G", "left.B", "left.A"}; + +static const half ALPHA_DEFAULT_VALUE(1.0f); + +#define RGB_FILENAME "imf_optimized_aces_rgb.exr" +#define RGBA_FILENAME "imf_optimized_aces_rgba.exr" +#define RGB_STEREO_FILENAME "imf_optimized_aces_rgb_stereo.exr" +#define RGBA_STEREO_FILENAME "imf_optimized_aces_rgba_stereo.exr" + +typedef enum EImageType +{ + IMAGE_TYPE_RGB = 1, + IMAGE_TYPE_RGBA = 2, + IMAGE_TYPE_OTHER =3 +} EImageType; + +int +getNbChannels(EImageType pImageType) +{ + int retVal = 0; + + switch(pImageType) + { + case IMAGE_TYPE_RGB: + retVal = 3; + break; + case IMAGE_TYPE_RGBA: + retVal = 4; + break; + case IMAGE_TYPE_OTHER: + retVal = 2; + break; + default: + retVal = 0; + break; + } + + return retVal; +} + +// +// +// +void +generatePixel (int i, int j, half* rgbaValue, bool pIsLeft) +{ + float redValue = 0.0f; + float greenValue = 0.0f; + float blueValue = 0.0f; + float alphaValue = 0.0f; + + // These formulas are arbitrary but generate results that vary + // depending on pixel position. They are used to validate that + // pixels are read/written correctly, because if we had only one + // value for the whole image, the tests would still pass if we read + // only one pixel and copied it all across the buffer. + if(pIsLeft) + { + redValue = ((i + j) % 10 + 0.004f * j) / 10.0f; + greenValue = ((j + j) % 10 + 0.006f * i) / 10.0f; + blueValue = ((j * j + i) % 10 + 0.003f * j) / 10.0f; + alphaValue = ALPHA_DEFAULT_VALUE; + } + else + { + redValue = ((i * j) % 10 + 0.005f * j) / 10.0f; + greenValue = ((i + i) % 10 + 0.007f * i) / 10.0f; + blueValue = ((i * i + j) % 10 + 0.006f * j) / 10.0f; + alphaValue = ALPHA_DEFAULT_VALUE; + } + + + rgbaValue[0] = redValue; + rgbaValue[1] = greenValue; + rgbaValue[2] = blueValue; + rgbaValue[3] = alphaValue; +} + +// +// Given a buffer, fill the pixels with arbitrary but deterministic values. +// Used to fill the pixels in a buffer before writing them to a file. +// +void +fillPixels (const int& pImageHeight, + const int& pImageWidth, + Array2D& pPixels, + int pNbChannels, + bool pIsLeft) +{ + for(int i = 0; i < pImageHeight; ++i) + { + for(int j = 0; j < pImageWidth; ++j) + { + half rgbaValue[4]; + + generatePixel(i, j, &rgbaValue[0], pIsLeft); + memcpy( (void*)&pPixels[i][j * pNbChannels], + &rgbaValue[0], + pNbChannels * sizeof(half)); + } + } +} + +// +// Validate that the pixels value are the same as what we used to fill them. +// Used after reading the pixels from the file to validate that it was read +// properly. +// +void +validatePixels (const int& pImageHeight, + const int& pImageWidth, + Array2D& pPixels, + int pNbChannels, + bool pIsLeft) +{ + for(int i = 0; i < pImageHeight; ++i) + { + for(int j = 0; j < pImageWidth; ++j) + { + int retVal = -1; + half rgbaValue[4]; + generatePixel(i, j, &rgbaValue[0], pIsLeft); + + retVal = memcmp ((void*)&pPixels[i][j * pNbChannels], + (void*)&rgbaValue[0], + pNbChannels * sizeof(half)); + + if(retVal != 0) + { + cout << "ERROR at pixel [" << i << ";" << j << "]" << endl; + cout << "\tExpected [" << rgbaValue[0] << ", " + << rgbaValue[1] << ", " + << rgbaValue[2] << "] " << endl; + + cout << "\tReceived [" << pPixels[i][j * pNbChannels] << ", " + << pPixels[i][j * pNbChannels + 1] << ", " + << pPixels[i][j * pNbChannels + 2] << "]" << endl; + assert(retVal == 0); + } + + } + } +} + +// +// Write pixels to a file (mono version) +// +void +writePixels (const char pFilename[], + const int& pImageHeight, + const int& pImageWidth, + Array2D& pPixels, + int pNbChannels, + Compression pCompression) +{ + Header header (pImageWidth, + pImageHeight, + 1.0f, + V2f(0.0f,0.0f), + 1.0f, + INCREASING_Y, + pCompression); + for(int i = 0; i < pNbChannels; ++i) + { + header.channels().insert (CHANNEL_NAMES[i], Channel(HALF)); + } + + OutputFile lFile(pFilename, header); + FrameBuffer lOutputFrameBuffer; + + for(int i = 0; i < pNbChannels; ++i) + { + lOutputFrameBuffer.insert (CHANNEL_NAMES[i], + Slice (HALF, + (char *) &pPixels[0][i], + sizeof (pPixels[0][0]) * pNbChannels, + sizeof (pPixels[0][0]) * pNbChannels * pImageWidth)); + } + + lFile.setFrameBuffer (lOutputFrameBuffer); + lFile.writePixels (pImageHeight); +} + +// +// Write pixels to a file (stereo version) +// +void +writePixels (const char pFilename[], + const int& pImageHeight, + const int& pImageWidth, + Array2D& pPixels, + Array2D& pPixelsLeft, + int pNbChannels, + Compression pCompression) +{ + Header header (pImageWidth, + pImageHeight, + 1.0f, + V2f(0.0f,0.0f), + 1.0f, + INCREASING_Y, + pCompression); + for(int i = 0; i < pNbChannels; ++i) + { + header.channels().insert (CHANNEL_NAMES[i], Channel(HALF)); + header.channels().insert (CHANNEL_NAMES_LEFT[i], Channel(HALF)); + } + + StringVector multiView; + multiView.push_back ("right"); + multiView.push_back ("left"); + header.insert("multiView", IMF::TypedAttribute(multiView)); + + OutputFile lFile(pFilename, header); + FrameBuffer lOutputFrameBuffer; + + for(int i = 0; i < pNbChannels; ++i) + { + lOutputFrameBuffer.insert (CHANNEL_NAMES[i], + Slice (HALF, + (char *) &pPixels[0][i], + sizeof (pPixels[0][0]) * pNbChannels, + sizeof (pPixels[0][0]) * pNbChannels * pImageWidth)); + + lOutputFrameBuffer.insert (CHANNEL_NAMES_LEFT[i], + Slice (HALF, + (char *) &pPixelsLeft[0][i], + sizeof (pPixelsLeft[0][0]) * pNbChannels, + sizeof (pPixelsLeft[0][0]) * pNbChannels * pImageWidth)); + } + + lFile.setFrameBuffer (lOutputFrameBuffer); + lFile.writePixels (pImageHeight); +} + +// +// Read pixels from a file (mono version). +// +void +readPixels (const char pFilename[], int pNbChannels, Array2D& pPixels) +{ + InputFile lFile(pFilename); + IMATH::Box2i lDataWindow = lFile.header().dataWindow(); + + int lWidth = lDataWindow.max.x - lDataWindow.min.x + 1; + int lHeight = lDataWindow.max.y - lDataWindow.min.y + 1; + + FrameBuffer lInputFrameBuffer; + + for(int i = 0; i < pNbChannels; ++i) + { + lInputFrameBuffer.insert (CHANNEL_NAMES[i], + Slice (HALF, + (char *) &pPixels[0][i], + sizeof (pPixels[0][0]) * pNbChannels, + sizeof (pPixels[0][0]) * pNbChannels * lWidth, + 1, + 1, + ALPHA_DEFAULT_VALUE)); + } + + lFile.setFrameBuffer (lInputFrameBuffer); + + bool is_optimized = lFile.isOptimizationEnabled(); + if(is_optimized) + { + cout << " optimization enabled\n"; + + if(pNbChannels==2) + { + cerr << " error: isOptimizationEnabled returned TRUE, but " + "optimization not known to work for two channel images\n"; + assert(pNbChannels!=2); + } + + }else{ + cout << " optimization disabled\n"; +#ifdef IMF_HAVE_SSE2 + if(pNbChannels!=2) + { + cerr << " error: isOptimizationEnabled returned FALSE, but " + "should work for " << pNbChannels << "channel images\n"; + assert(pNbChannels==2); + } + +#endif + } + + lFile.readPixels (lDataWindow.min.y, lDataWindow.max.y); +} + +// +// Read pixels from a file (stereo version). +// +void +readPixels (const char pFilename[], + int pNbChannels, + Array2D& pPixels, + Array2D& pPixelsLeft) +{ + InputFile lFile(pFilename); + IMATH::Box2i lDataWindow = lFile.header().dataWindow(); + + int lWidth = lDataWindow.max.x - lDataWindow.min.x + 1; + int lHeight = lDataWindow.max.y - lDataWindow.min.y + 1; + + FrameBuffer lInputFrameBuffer; + + for(int i = 0; i < pNbChannels; ++i) + { + lInputFrameBuffer.insert (CHANNEL_NAMES[i], + Slice (HALF, + (char *) &pPixels[0][i], + sizeof (pPixels[0][0]) * pNbChannels, + sizeof (pPixels[0][0]) * pNbChannels * lWidth, + 1, + 1, + ALPHA_DEFAULT_VALUE)); + + lInputFrameBuffer.insert (CHANNEL_NAMES_LEFT[i], + Slice (HALF, + (char *) &pPixelsLeft[0][i], + sizeof (pPixelsLeft[0][0]) * pNbChannels, + sizeof (pPixelsLeft[0][0]) * pNbChannels * lWidth, + 1, + 1, + ALPHA_DEFAULT_VALUE)); + } + + lFile.setFrameBuffer (lInputFrameBuffer); + lFile.readPixels (lDataWindow.min.y, lDataWindow.max.y); +} + +// +// Allocate an array of pixels, fill them with values and then write +// them to a file. +void +writeFile (const char pFilename[], + int pHeight, + int pWidth, + EImageType pImageType, + bool pIsStereo, + Compression pCompression) +{ + const int lNbChannels = getNbChannels (pImageType); + Array2D lPixels; + + lPixels.resizeErase (pHeight, pWidth * lNbChannels); + fillPixels (pHeight, pWidth, lPixels, lNbChannels, false); + + if(pIsStereo) + { + Array2D lPixelsLeft; + + lPixelsLeft.resizeErase (pHeight, pWidth * lNbChannels); + fillPixels (pHeight, + pWidth, + lPixelsLeft, + lNbChannels, + true); + + writePixels (pFilename, + pHeight, + pWidth, + lPixels, + lPixelsLeft, + lNbChannels, + pCompression); + } + else + { + writePixels (pFilename, + pHeight, + pWidth, + lPixels, + lNbChannels, + pCompression); + } +} + +// +// Read pixels from a file and then validate that the values are the +// same as what was used to fill them before writing. +// +void +readValidateFile (const char pFilename[], + int pHeight, + int pWidth, + EImageType + pImageType, + bool pIsStereo) +{ + const int lNbChannels = getNbChannels(pImageType); + + Array2D lPixels; + lPixels.resizeErase(pHeight, pWidth * lNbChannels); + //readPixels(pFilename, lNbChannels, lPixels); + //writePixels("pkTest.exr", pHeight, pWidth, lPixels, lNbChannels, NO_COMPRESSION); + + + if(pIsStereo) + { + Array2D lPixelsLeft; + lPixelsLeft.resizeErase (pHeight, pWidth * lNbChannels); + readPixels (pFilename, lNbChannels, lPixels, lPixelsLeft); + validatePixels (pHeight, pWidth, lPixels, lNbChannels, false); + validatePixels (pHeight, pWidth, lPixelsLeft, lNbChannels, true); + } + else + { + readPixels (pFilename, lNbChannels, lPixels); + validatePixels (pHeight, pWidth, lPixels, lNbChannels, false); + } +} + +// +// confirm the optimization flag returns false for non-RGB files +// +void +testNonOptimized (const std::string & tempDir) +{ + const int pHeight = IMAGE_2K_HEIGHT - 1; + const int pWidth = IMAGE_2K_WIDTH - 1; + std::string fn = tempDir + RGB_FILENAME; + const char* filename = fn.c_str(); + + remove(filename); + writeFile (filename, pHeight, pWidth, IMAGE_TYPE_OTHER, false, NO_COMPRESSION); + readValidateFile(filename,pHeight,pWidth,IMAGE_TYPE_OTHER,false); + remove(filename); +} + +// +// Test all combinations of file/framebuffer +// RGB file to RGB framebuffer +// RGB file to RGBA framebuffer +// RGBA file to RGB framebuffer +// RGBA file to RGBA framebuffer +// Given a switch that determines whether the pixels will be SSE-aligned, +// whether the file is mono or stereo, and the compression algorithm used +// to write the file. +// +void +testAllCombinations (bool isAligned, + bool isStereo, + Compression pCompression, + const std::string & tempDir) +{ + std::string pRgb = isStereo ? RGB_STEREO_FILENAME : + RGB_FILENAME; + pRgb = tempDir + pRgb; + std::string pRgba = isStereo ? RGBA_STEREO_FILENAME : + RGBA_FILENAME; + pRgba = tempDir + pRgba; + + const char * pRgbFilename = pRgb.c_str(); + const char * pRgbaFilename = pRgba.c_str(); + + const int pHeight = isAligned ? IMAGE_2K_HEIGHT : IMAGE_2K_HEIGHT - 1; + const int pWidth = isAligned ? IMAGE_2K_WIDTH : IMAGE_2K_WIDTH - 1; + + remove(pRgbFilename); + remove(pRgbaFilename); + + writeFile (pRgbFilename, pHeight, pWidth, IMAGE_TYPE_RGB, isStereo, pCompression); + writeFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo, pCompression); + + cout << "\t\tRGB file to RGB framebuffer" << endl; + readValidateFile (pRgbFilename, pHeight, pWidth, IMAGE_TYPE_RGB, isStereo); + + + cout << "\t\tRGB file to RGB framebuffer" << endl; + readValidateFile (pRgbFilename, pHeight, pWidth, IMAGE_TYPE_RGB, isStereo); + + cout << "\t\tRGB file to RGBA framebuffer" << endl; + readValidateFile (pRgbFilename, pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo); + + cout << "\t\tRGBA file to RGB framebuffer" << endl; + readValidateFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGB, isStereo); + + cout << "\t\tRGBA file to RGBA framebuffer" << endl; + readValidateFile (pRgbaFilename, pHeight, pWidth, IMAGE_TYPE_RGBA, isStereo); + + remove(pRgbFilename); + remove(pRgbaFilename); + +} + +} // anonymous namespace + + +void +testOptimized (const std::string & tempDir) +{ + try + { + // Test all combinations + // Aligned file with no compression + // Unaligned file with no compression + // Aligned file with zip compression + // Unaligned file with zip compression + // + // Other algorithms are not necessary because we are not testing + // compression but whetherthe optimized readPixels() code works + // with a compressed file. + // MONO + cout << "\nTesting optimized code path for rgb(a) images-- " + "2048x1152 (alignment respected) UNCOMPRESSED" << endl; + + + cout << "\tNON-OPTIMIZABLE file" << endl; + testNonOptimized(tempDir); + + cout << "\tALIGNED -- MONO -- NO COMPRESSION" << endl; + testAllCombinations (true, false, NO_COMPRESSION, tempDir); + + cout << "\tUNALIGNED -- MONO -- NO COMPRESSION" << endl; + testAllCombinations (false, false, NO_COMPRESSION, tempDir); + + cout << "\tALIGNED -- MONO -- ZIP COMPRESSION" << endl; + testAllCombinations (true, false, ZIP_COMPRESSION, tempDir); + + cout << "\tUNALIGNED -- MONO -- ZIP COMPRESSION" << endl; + testAllCombinations (false, false, ZIP_COMPRESSION, tempDir); + + + //// STEREO + cout << "\tALIGNED -- STEREO -- NO COMPRESSION" << endl; + testAllCombinations (true, true, NO_COMPRESSION, tempDir); + + cout << "\tUNALIGNED -- STEREO -- NO COMPRESSION" << endl; + testAllCombinations (false, true, NO_COMPRESSION, tempDir); + + cout << "\tALIGNED -- STEREO -- ZIP COMPRESSION" << endl; + testAllCombinations (true, true, ZIP_COMPRESSION, tempDir); + + cout << "\tUNALIGNED -- STEREO -- ZIP COMPRESSION" << endl; + testAllCombinations (false, true, ZIP_COMPRESSION, tempDir); + + cout << "RGB(A) files validation complete \n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } + +} diff --git a/IlmImfTest/testOptimized.h b/IlmImfTest/testOptimized.h new file mode 100644 index 0000000..ee1dff9 --- /dev/null +++ b/IlmImfTest/testOptimized.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testOptimized (const std::string &tempDir); + diff --git a/IlmImfTest/testOptimizedInterleavePatterns.cpp b/IlmImfTest/testOptimizedInterleavePatterns.cpp new file mode 100644 index 0000000..f6b37b8 --- /dev/null +++ b/IlmImfTest/testOptimizedInterleavePatterns.cpp @@ -0,0 +1,624 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Weta Digital Ltd +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfInputFile.h" +#include +#include +#include "ImfChannelList.h" +#include "ImfOutputFile.h" +#include "ImfCompression.h" +#include "ImfStandardAttributes.h" +#include +#include +#include +#include +#include + +#include "tmpDir.h" + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + + +namespace +{ + +using OPENEXR_IMF_NAMESPACE::UINT; +using OPENEXR_IMF_NAMESPACE::FLOAT; + +std::string filename; + +vector writingBuffer; // buffer as file was written +vector readingBuffer; // buffer containing new image (and filled channels?) +vector preReadBuffer; // buffer as it was before reading - unread, unfilled channels should be unchanged + +int gOptimisedReads = 0; +int gSuccesses = 0; +int gFailures = 0; + + +// +// @todo Needs a description of what this is used for. +// +// +struct Schema +{ + const char* _name; // name of this scheme + const char* const* _active; // channels to be read + const char* const * _passive; // channels to be ignored (keep in buffer passed to inputfile, should not be overwritten) + int _banks; + const char* const * _views; // list of views to write, or NULL + const PixelType* _types; // NULL for all HALF, otherwise per-channel type + + vector views() const + { + const char * const* v = _views; + vector svec; + while(*v!=NULL) + { + svec.push_back (*v); + v++; + } + return svec; + } +}; + + +const char * rgb[] = {"R","G","B",NULL}; +const char * rgba[] = {"R","G","B","A",NULL}; +const char * bgr[] = {"B","G","R",NULL}; +const char * abgr[] = {"A","B","G","R",NULL}; +const char * alpha[] = {"A",NULL}; +const char * redalpha[] = {"R","A",NULL}; +const char * rgbrightrgb[] = {"R","G","B","right.R","right.G","right.B",NULL}; +const char * rgbleftrgb[] = {"R","G","B","left.R","left.G","left.B",NULL}; +const char * rgbarightrgba[] = {"R","G","B","A","right.R","right.G","right.B","right.A",NULL}; +const char * rgbaleftrgba[] = {"R","G","B","A","left.R","left.G","left.B","left.A",NULL}; +const char * rgbrightrgba[] = {"R","G","B","right.R","right.G","right.B","right.A",NULL}; +const char * rgbleftrgba[] = {"R","G","B","left.R","left.G","left.B","left.A",NULL}; +const char * rgbarightrgb[] = {"R","G","B","A","right.R","right.G","right.B",NULL}; +const char * rgbaleftrgb[] = {"R","G","B","A","left.R","left.G","left.B",NULL}; +const char * rightrgba[] = {"right.R","right.G","right.B","right.A",NULL}; +const char * leftrgba[] = {"left.R","left.G","left.B","left.A",NULL}; +const char * rightrgb[] = {"right.R","right.G","right.B",NULL}; +const char * leftrgb[] = {"left.R","left.G","left.B",NULL}; +const char * threeview[] ={"R","G","B","A","left.R","left.G","left.B","left.A","right.R","right.G","right.B","right.A",NULL}; +const char * trees[] = {"rimu","pohutukawa","manuka","kauri",NULL}; +const char * treesandbirds[]= {"kiwi","rimu","pohutukawa","kakapu","kauri","manuka","moa","fantail",NULL}; + +const char * lefthero[] = {"left","right",NULL}; +const char * righthero[] = {"right","left",NULL}; +const char * centrehero[] = {"centre","left","right",NULL}; + +const PixelType four_floats[] = {IMF::FLOAT,IMF::FLOAT,IMF::FLOAT,IMF::FLOAT}; +const PixelType hhhfff[] = {IMF::HALF,IMF::HALF,IMF::HALF,IMF::FLOAT,IMF::FLOAT,IMF::FLOAT}; +const PixelType hhhhffff[] = {IMF::HALF,IMF::HALF,IMF::HALF,IMF::HALF,IMF::FLOAT,IMF::FLOAT,IMF::FLOAT,IMF::FLOAT}; + +Schema Schemes[] = +{ + {"RGBHalf" ,rgb ,NULL ,1 ,NULL ,NULL }, + {"RGBAHalf" ,rgba ,NULL ,1 ,NULL ,NULL }, + {"ABGRHalf" ,abgr ,NULL ,1 ,NULL ,NULL }, + {"RGBFloat" ,rgb ,NULL ,1 ,NULL ,four_floats}, + {"BGRHalf" ,bgr ,NULL ,1 ,NULL ,NULL }, + {"RGBLeftRGB" ,rgbleftrgb ,NULL ,1 ,righthero ,NULL }, + {"RGBRightRGB" ,rgbrightrgb ,NULL ,1 ,lefthero ,NULL }, + {"RGBALeftRGBA" ,rgbaleftrgba ,NULL ,1 ,righthero ,NULL }, + {"RGBARightRGBA" ,rgbarightrgba ,NULL ,1 ,lefthero ,NULL }, + {"LeftRGB" ,leftrgb ,NULL ,1 ,NULL ,NULL }, + {"RightRGB" ,rightrgb ,NULL ,1 ,NULL ,NULL }, + {"LeftRGBA" ,leftrgba ,NULL ,1 ,NULL ,NULL }, + {"RightRGBA" ,rightrgba ,NULL ,1 ,NULL ,NULL }, + {"TripleView" ,threeview ,NULL ,1 ,centrehero ,NULL }, + {"Trees" ,trees ,NULL ,1 ,NULL ,NULL }, + {"TreesAndBirds" ,treesandbirds ,NULL ,1 ,NULL ,NULL }, + {"RGBLeftRGBA" ,rgbleftrgba ,NULL ,1 ,righthero ,NULL }, + {"RGBRightRGBA" ,rgbrightrgba ,NULL ,1 ,lefthero ,NULL }, + {"RGBALeftRGB" ,rgbaleftrgb ,NULL ,1 ,righthero ,NULL }, + {"RGBARightRGB" ,rgbarightrgb ,NULL ,1 ,lefthero ,NULL }, + {"TwinRGBLeftRGB" ,rgbleftrgb ,NULL ,2 ,righthero ,NULL }, + {"TwinRGBRightRGB" ,rgbrightrgb ,NULL ,2 ,lefthero ,NULL }, + {"TwinRGBALeftRGBA" ,rgbaleftrgba ,NULL ,2 ,righthero ,NULL }, + {"TwinRGBARightRGBA" ,rgbarightrgba ,NULL , 2 ,lefthero ,NULL }, + {"TripleTripleView" ,threeview ,NULL ,3 ,centrehero ,NULL }, + {"Alpha" ,alpha ,NULL ,1 ,NULL ,NULL }, + {"RedAlpha" ,redalpha ,NULL ,1 ,NULL ,NULL }, + {"RG+BA" ,rgba ,NULL ,2 ,NULL ,NULL },//interleave only RG, then BA + {"RGBpassiveA" ,rgb ,alpha ,1 ,NULL ,NULL },//interleave only RG, then BA + {"RGBpassiveleftRGB" ,rgb ,leftrgb ,1 ,NULL ,NULL }, + {"RGBFloatA" ,rgba ,NULL ,1 ,NULL ,hhhfff }, + {"RGBFloatLeftRGB" ,rgbleftrgb ,NULL ,1 ,righthero ,hhhfff }, + {"RGBAFloatLeftRGBA" ,rgbaleftrgba ,NULL ,1 ,righthero ,hhhhffff }, + {"RGBApassiverightRGBA" ,rgba ,rightrgba ,1 ,NULL ,NULL }, + {"BanksOfTreesAndBirds" ,treesandbirds ,NULL ,2 ,NULL ,NULL }, + {NULL,NULL,NULL,0,NULL,NULL} +}; + + + +bool compare(const FrameBuffer& asRead, + const FrameBuffer& asWritten, + const Box2i& dataWindow, + bool nonfatal + ) +{ + for (FrameBuffer::ConstIterator i =asRead.begin();i!=asRead.end();i++) + { + FrameBuffer::ConstIterator p = asWritten.find(i.name()); + for (int y=dataWindow.min.y; y<= dataWindow.max.y; y++) + { + for (int x = dataWindow.min.x; x <= dataWindow.max.x; x++) + + { + char * ptr = (i.slice().base+i.slice().yStride*y +i.slice().xStride*x); + half readHalf; + switch (i.slice().type) + { + case IMF::FLOAT : + readHalf = half(*(float*) ptr); + break; + case IMF::HALF : + readHalf = half(*(half*) ptr); + break; + case IMF::UINT : + continue; // can't very well check this + default : + cout << "don't know about that\n"; + exit(1); + } + + half writtenHalf; + + if (p!=asWritten.end()) + { + char * ptr = p.slice().base+p.slice().yStride*y + + p.slice().xStride*x; + switch (p.slice().type) + { + case IMF::FLOAT : + writtenHalf = half(*(float*) ptr); + break; + case IMF::HALF : + writtenHalf = half(*(half*) ptr); + break; + case IMF::UINT : + continue; + default : + cout << "don't know about that\n"; + exit(1); + } + } + else + { + writtenHalf=half(i.slice().fillValue); + } + + if (writtenHalf.bits()!=readHalf.bits()) + { + if (nonfatal) + { + return false; + } + else + { + cout << "\n\nerror reading back channel " << i.name() << " pixel " << x << ',' << y << " got " << readHalf << " expected " << writtenHalf << endl; + assert(writtenHalf.bits()==readHalf.bits()); + exit(1); + } + } + } + + } + } + return true; +} + +// +// allocate readingBuffer or writingBuffer, setting up a framebuffer to point to the right thing +// +ChannelList +setupBuffer (const Header& hdr, // header to grab datawindow from + const char * const *channels, // NULL terminated list of channels to write + const char * const *passivechannels, // NULL terminated list of channels to write + const PixelType* pt, // type of each channel, or NULL for all HALF + FrameBuffer& buf, // buffer to fill with pointers to channel + FrameBuffer& prereadbuf, // channels which aren't being read - indexes into the preread buffer + FrameBuffer& postreadbuf, // channels which aren't being read - indexes into the postread buffer + int banks, // number of banks - channels within each bank are interleaved, banks are scanline interleaved + bool writing // true if should allocate + ) +{ + Box2i dw = hdr.dataWindow(); + + // + // how many channels in total + // + int activechans = 0; + int bytes_per_pixel =0; + + while (channels[activechans]!=NULL) + { + if (pt==NULL) + { + bytes_per_pixel+=2; + } + else + { + switch (pt[activechans]) + { + case IMF::HALF : bytes_per_pixel+=2;break; + case IMF::FLOAT : case IMF::UINT : bytes_per_pixel+=4;break; + default : + cout << "Unexpected PixelType?\n"; + exit(1); + } + } + activechans++; + } + + + int passivechans=0; + while (passivechannels!=NULL && passivechannels[passivechans]!=NULL) + { + if (pt==NULL) + { + bytes_per_pixel+=2; + } + else + { + switch (pt[passivechans+activechans]) + { + case IMF::HALF : bytes_per_pixel+=2;break; + case IMF::FLOAT : case IMF::UINT : bytes_per_pixel+=4;break; + default : + cout << "Unexpected PixelType?\n"; + exit(1); + } + } + passivechans++; + } + + int chans = activechans+passivechans; + + + int bytes_per_bank = bytes_per_pixel/banks; + + int samples = (hdr.dataWindow().max.x+1-hdr.dataWindow().min.x)* + (hdr.dataWindow().max.y+1-hdr.dataWindow().min.y)*chans; + + int size = samples*bytes_per_pixel; + + + if (writing) + { + writingBuffer.resize(size); + } + else + { + readingBuffer.resize(size); + } + + const char * write_ptr = writing ? &writingBuffer[0] : &readingBuffer[0]; + // fill with random halfs, casting to floats for float channels + int chan=0; + for (int i=0;i0 ) + { + cout << " TESTS FAILED\n"; + assert(false); + } +} + + +} // namespace anon + + +void +testOptimizedInterleavePatterns (const std::string & tempDir) +{ + filename = tempDir + "imf_test_interleave_patterns.exr"; + + + cout << "Testing SSE optimisation with different interleave patterns (large images) ... " << endl; + runtests (false,false); + + cout << "Testing SSE optimisation with different interleave patterns (tiny images) ... " << endl; + runtests (false,true); + + cout << "ok\n" << endl; +} + diff --git a/IlmImfTest/testOptimizedInterleavePatterns.h b/IlmImfTest/testOptimizedInterleavePatterns.h new file mode 100644 index 0000000..4eeb643 --- /dev/null +++ b/IlmImfTest/testOptimizedInterleavePatterns.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2013, Weta Digital Ltd +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef _TEST_OPTIMIZED_INTERLEAVE_PATTERNS_ +#define _TEST_OPTIMIZED_INTERLEAVE_PATTERNS_ + +void testOptimizedInterleavePatterns (const std::string &tempDir); + +#endif diff --git a/IlmImfTest/testPartHelper.cpp b/IlmImfTest/testPartHelper.cpp new file mode 100644 index 0000000..f5f2e59 --- /dev/null +++ b/IlmImfTest/testPartHelper.cpp @@ -0,0 +1,193 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "testPartHelper.h" + +#include +#include +#include +#include + + +using std::vector; +using std::cout; +using std::endl; +using std::max; +using OPENEXR_IMF_NAMESPACE::MultiViewChannelName; +using OPENEXR_IMF_NAMESPACE::SplitChannels; + +namespace +{ + +template +void +print(const T & begin,const T & end) +{ + int parts=1; + for(T i=begin;i!=end;i++) + { + parts=max(i->part_number,parts); + } + + for(int p=0;ppart_number==p) + { + cout << i->part_number << ' ' << i->name << " in " << i->view + << ' ' << ' ' << i->internal_name << "\n"; + } + } + } +} + +void +testSingleView() +{ + cout << "testing with single view" << endl; + + + vector chans(12); + chans[0].name="R"; + chans[1].name="G"; + chans[2].name="B"; + chans[3].name="A"; + chans[4].name="bunny.foo"; + chans[5].name="velocity.X"; + chans[6].name="velocity.Y"; + chans[7].name="foo.fred"; + chans[8].name="Z"; + chans[9].name="multiple.layers.in.name"; + chans[10].name="multiple.layers.in.othername"; + chans[11].name="foo.shiela"; + + + cout << " one part:\n"; + SplitChannels(chans.begin(),chans.end(),false,""); + + print(chans.begin(),chans.end()); + + cout << "multi part:\n"; + + SplitChannels(chans.begin(),chans.end(),true,""); + + print(chans.begin(),chans.end()); + +} + +void +testMultiView() +{ + MultiViewChannelName chans[20]; + // Bob layer, only in left + chans[0].name="bob.one"; + chans[0].view="left"; + chans[1].name="bob.two"; + chans[1].view="left"; + + chans[2].name="fred.one"; + chans[2].view="right"; + chans[3].name="fred.one"; + chans[3].view="left"; + chans[4].name="fred.two"; + chans[4].view="left"; + chans[5].name="fred.two"; + chans[5].view="right"; + + chans[6].name="R"; + chans[6].view="left"; + chans[7].name="R"; + chans[7].view="right"; + + chans[8].name="G"; + chans[8].view="right"; + chans[9].name="G"; + chans[9].view="left"; + + chans[10].name="B"; + chans[10].view="left"; + chans[11].name="B"; + chans[11].view="right"; + + chans[12].name="multiple.layers.in.name"; + chans[12].view="left"; + chans[13].name="multiple.layers.in.name"; + chans[13].view="right"; + + chans[14].name="multiple.layers.in.othername"; + chans[14].view="left"; + chans[15].name="multiple.layers.in.othername"; + chans[15].view="right"; + + chans[16].name="multiple.layers.different.name"; + chans[16].view="left"; + chans[17].name="multiple.layers.different.name"; + chans[17].view="right"; + + chans[18].name="multiple.layers.different.othername"; + chans[18].view="left"; + chans[19].name="multiple.layers.different.othername"; + chans[19].view="right"; + + cout << "multiview, hero left, single part:\n"; + SplitChannels(chans+0,chans+20,false,"left"); + print(chans+0,chans+20); + + cout << "multiview, hero left, multipart:\n"; + SplitChannels(chans+0,chans+20,true,"left"); + print(chans+0,chans+20); + + + cout << "multiview, hero right, single part:\n"; + SplitChannels(chans+0,chans+20,false,"right"); + print(chans+0,chans+20); + + cout << "multiview, hero right, multipart:\n"; + SplitChannels(chans+0,chans+20,true,"right"); + print(chans+0,chans+20); + +} +} + +void +testPartHelper (const std::string & tempDir) +{ + + cout << "\n\nTesting part helper\n" << endl; + + testSingleView(); + testMultiView(); + cout << " ok\n" << endl; + +} diff --git a/IlmImfTest/testPartHelper.h b/IlmImfTest/testPartHelper.h new file mode 100644 index 0000000..6f66433 --- /dev/null +++ b/IlmImfTest/testPartHelper.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef TESTPARTHELPER_H_ +#define TESTPARTHELPER_H_ + +#include +void testPartHelper (const std::string & tempDir); + +#endif /* TESTPARTHELPER_H_ */ diff --git a/IlmImfTest/testPreviewImage.cpp b/IlmImfTest/testPreviewImage.cpp new file mode 100644 index 0000000..16c0573 --- /dev/null +++ b/IlmImfTest/testPreviewImage.cpp @@ -0,0 +1,224 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +readWriteFiles (const char fileName1[], + const char fileName2[], + const char fileName3[]) +{ + // + // Test if the preview image attribute works correctly: + // + // Read file1, which does not contain a preview image. + // + // Generate a preview image, and store both the pixels + // from file 1 and the preview image in file 2. + // + // Read file 2, and verify that both the preview image, and + // the main image are exactly what we stored in the file. + // + // Write file 3, with the same main image as file 2, but + // initially leave the preview image blank. Update the + // preview image half way through writing the main image's + // pixels. + // + // Compare file 2 and file 3 byte by byte, and verify that + // the files are identical. + // + + cout << "reading file " << fileName1 << endl; + + RgbaInputFile file1 (fileName1); + + assert (!file1.header().hasPreviewImage()); + + const Box2i &dw = file1.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array pixels1 (w * h); + file1.setFrameBuffer (pixels1 - dx - dy * w, 1, w); + file1.readPixels (dw.min.y, dw.max.y); + + cout << "generating preview image" << endl; + + const int PREVIEW_WIDTH = 128; + const int PREVIEW_HEIGHT = 64; + + PreviewImage preview1 (PREVIEW_WIDTH, PREVIEW_HEIGHT); + + for (int y = 0; y < PREVIEW_HEIGHT; ++y) + for (int x = 0; x < PREVIEW_WIDTH; ++x) + preview1.pixel (x, y) = PreviewRgba (x*2, y*4, x+y, 128); + + cout << "writing file " << fileName2 << endl; + + { + Header header (file1.header()); + header.setPreviewImage (preview1); + + RgbaOutputFile file2 (fileName2, header); + file2.setFrameBuffer (pixels1 - dx - dy * w, 1, w); + + for (int y = dw.min.y; y <= dw.max.y; ++y) + file2.writePixels (1); + } + + cout << "reading file " << fileName2 << endl; + + { + RgbaInputFile file2 (fileName2); + + assert (file2.header().hasPreviewImage()); + + const PreviewImage &preview2 = file2.header().previewImage(); + + for (int i = 0; i < PREVIEW_WIDTH * PREVIEW_HEIGHT; ++i) + { + assert (preview1.pixels()[i].r == preview2.pixels()[i].r); + assert (preview1.pixels()[i].g == preview2.pixels()[i].g); + assert (preview1.pixels()[i].b == preview2.pixels()[i].b); + assert (preview1.pixels()[i].a == preview2.pixels()[i].a); + } + + assert (dw == file2.dataWindow()); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array pixels2 (w * h); + file2.setFrameBuffer (pixels2 - dx - dy * w, 1, w); + file2.readPixels (dw.min.y, dw.max.y); + + for (int i = 0; i < w * h; ++h) + { + assert (pixels1[i].r == pixels2[i].r); + assert (pixels1[i].g == pixels2[i].g); + assert (pixels1[i].b == pixels2[i].b); + assert (pixels1[i].a == pixels2[i].a); + } + } + + cout << "writing file " << fileName3 << endl; + + { + Header header (file1.header()); + header.setPreviewImage (PreviewImage (PREVIEW_WIDTH, PREVIEW_HEIGHT)); + + RgbaOutputFile file3 (fileName3, header); + file3.setFrameBuffer (pixels1 - dx - dy * w, 1, w); + + for (int y = dw.min.y; y <= dw.max.y; ++y) + { + file3.writePixels (1); + + if (y == (dw.min.y + dw.max.y) / 2) + file3.updatePreviewImage (preview1.pixels()); + } + } + + cout << "comparing files " << fileName2 << " and " << fileName3 << endl; + + { + ifstream file2 (fileName2, std::ios_base::binary); + ifstream file3 (fileName3, std::ios_base::binary); + + while (true) + { + int c2 = file2.get(); + int c3 = file3.get(); + + if (file2.eof()) + break; + + assert (c2 == c3); + assert (!!file2 && !!file3); + } + } + + remove (fileName2); + remove (fileName3); +} + +} // namespace + + +void +testPreviewImage (const std::string &tempDir) +{ + std::string filename1 = tempDir + "imf_preview1.exr"; + std::string filename2 = tempDir + "imf_preview2.exr"; + + try + { + cout << "Testing preview image attribute" << endl; + + readWriteFiles (ILM_IMF_TEST_IMAGEDIR "comp_piz.exr", + filename1.c_str(), + filename2.c_str()); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} + diff --git a/IlmImfTest/testPreviewImage.h b/IlmImfTest/testPreviewImage.h new file mode 100644 index 0000000..b5c6d0a --- /dev/null +++ b/IlmImfTest/testPreviewImage.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testPreviewImage (const std::string &tempDir); + + diff --git a/IlmImfTest/testRgba.cpp b/IlmImfTest/testRgba.cpp new file mode 100644 index 0000000..eff1304 --- /dev/null +++ b/IlmImfTest/testRgba.cpp @@ -0,0 +1,660 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" +#include "compareDwa.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +rgbaMethods () +{ + // + // Verify that the constructors and the assignment + // operator for struct Rgba work. + // + + Rgba x (2.f, 3.f, 4.f); + assert (x.r == 2.f && x.g == 3.f && x.b == 4.f && x.a == 1.f); + + Rgba y (5.f, 6.f, 7.f, 0.f); + assert (y.r == 5.f && y.g == 6.f && y.b == 7.f && y.a == 0.f); + + Rgba z; + + z = x; + assert (z.r == 2.f && z.g == 3.f && z.b == 4.f && z.a == 1.f); + + z = y; + assert (z.r == 5.f && z.g == 6.f && z.b == 7.f && z.a == 0.f); + + Rgba w (z); + assert (w.r == 5.f && w.g == 6.f && w.b == 7.f && w.a == 0.f); +} + + +void +fillPixels (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +writeReadRGBA (const char fileName[], + int width, + int height, + const Array2D &p1, + RgbaChannels channels, + LineOrder lorder, + Compression comp) +{ + // + // Save the selected channels of RGBA image p1; save the + // scan lines in the specified order. Read the image back + // from the file, and compare the data with the orignal. + // + + cout << "channels " << + ((channels & WRITE_R)? "R": "") << + ((channels & WRITE_G)? "G": "") << + ((channels & WRITE_B)? "B": "") << + ((channels & WRITE_A)? "A": "") << + ", line order " << lorder << + ", compression " << comp << endl; + + Header header (width, height); + header.lineOrder() = lorder; + header.compression() = comp; + + cout << "writing "; + cout.flush(); + + { + remove (fileName); + RgbaOutputFile out (fileName, header, channels); + out.setFrameBuffer (&p1[0][0], 1, width); + out.writePixels (height); + } + + cout << "reading "; + cout.flush(); + + { + RgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readPixels (dw.min.y, dw.max.y); + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + if (in.compression() == B44_COMPRESSION || + in.compression() == B44A_COMPRESSION) + { + compareB44 (width, height, p1, p2, channels); + } + else if (in.compression() == DWAA_COMPRESSION || + in.compression() == DWAB_COMPRESSION) + { + compareDwa (width, height, p1, p2, channels); + } + else + { + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + if (channels & WRITE_R) + assert (p2[y][x].r == p1[y][x].r); + else + assert (p2[y][x].r == 0); + + if (channels & WRITE_G) + assert (p2[y][x].g == p1[y][x].g); + else + assert (p2[y][x].g == 0); + + if (channels & WRITE_B) + assert (p2[y][x].b == p1[y][x].b); + else + assert (p2[y][x].b == 0); + + if (channels & WRITE_A) + assert (p2[y][x].a == p1[y][x].a); + else + assert (p2[y][x].a == 1); + } + } + } + } + + remove (fileName); +} + + +void +writeReadIncomplete (const std::string &tempDir) +{ + cout << "\nfile with missing and broken scan lines" << endl; + + std::string fileName = tempDir + "imf_test_incomplete.exr"; + + // + // Write a file where some scan lines are missing or broken. + // Then try read the file and verify that all existing good + // scan lines can actually be read. + // + + const int width = 400; + const int height = 300; + + Array2D p1 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p1[y][x] = Rgba (x % 5, x % 17, y % 23, y % 29); + + { + cout << "writing" << endl; + + remove (fileName.c_str()); + + Header header (width, height); + header.compression() = ZIPS_COMPRESSION; + + RgbaOutputFile out (fileName.c_str(), header, WRITE_RGBA); + + out.setFrameBuffer (&p1[0][0], 1, width); + out.writePixels (height / 2); // write only half of the + // scan lines in the image + + out.breakScanLine (10, 10, 10, 0xff); // destroy scan lines + out.breakScanLine (25, 10, 10, 0xff); // 10 and 25 + } + + { + Array2D p2 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p2[y][x] = Rgba (-1, -1, -1, -1); + + cout << "reading one scan line at a time," << flush; + + RgbaInputFile in (fileName.c_str()); + const Box2i &dw = in.dataWindow(); + + assert (dw.max.x - dw.min.x + 1 == width); + assert (dw.max.y - dw.min.y + 1 == height); + assert (dw.min.x == 0); + assert (dw.min.y == 0); + + in.setFrameBuffer (&p2[0][0], 1, width); + + for (int y = 0; y < height; ++y) + { + bool scanLinePresent = true; + bool scanLineBroken = false; + + try + { + in.readPixels (y); + } + catch (const IEX_NAMESPACE::InputExc &) + { + scanLinePresent = false; // scan line is missing + } + catch (const IEX_NAMESPACE::IoExc &) + { + scanLineBroken = true; // scan line cannot be decoded + } + + if (y == 10 || y == 25) + assert (scanLineBroken); + else + assert (scanLinePresent == (y < height / 2)); + } + + cout << " comparing" << endl << flush; + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + const Rgba &s = p1[y][x]; + const Rgba &t = p2[y][x]; + + if (y < height / 2 && y != 10 && y != 25) + { + assert (t.r == s.r && + t.g == s.g && + t.b == s.b && + t.a == s.a); + } + else + { + assert (t.r == -1 && + t.g == -1 && + t.b == -1 && + t.a == -1); + } + } + } + } + + { + Array2D p2 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p2[y][x] = Rgba (-1, -1, -1, -1); + + cout << "reading multiple scan lines at a time," << flush; + + RgbaInputFile in (fileName.c_str()); + const Box2i &dw = in.dataWindow(); + + assert (dw.max.x - dw.min.x + 1 == width); + assert (dw.max.y - dw.min.y + 1 == height); + assert (dw.min.x == 0); + assert (dw.min.y == 0); + + in.setFrameBuffer (&p2[0][0], 1, width); + + bool scanLinesMissing = false; + bool scanLinesBroken = false; + + try + { + in.readPixels (0, height - 1); + } + catch (const IEX_NAMESPACE::InputExc &) + { + scanLinesMissing = true; + } + catch (const IEX_NAMESPACE::IoExc &) + { + scanLinesBroken = true; + } + + assert (scanLinesMissing || scanLinesBroken); + + cout << " comparing" << endl << flush; + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + const Rgba &s = p1[y][x]; + const Rgba &t = p2[y][x]; + + assert ((t.r == -1 && t.g == -1 && t.b == -1 && t.a == -1) || + (t.r == s.r && t.g == s.g && t.b == s.b && t.a == s.a)); + } + } + } + + remove (fileName.c_str()); +} + + +void +writeReadLayers (const std::string &tempDir) +{ + cout << "\nreading multi-layer file" << endl; + + std::string fileName = tempDir + "imf_test_multi_layer_rgba.exr"; + + const int W = 237; + const int H = 119; + + Array2D p1 (H, W); + Array2D p2 (H, W); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + p1[y][x] = half (y % 23 + x % 17); + p2[y][x] = half (y % 29 + x % 19); + } + } + + { + Header hdr (W, H); + hdr.channels().insert ("R", Channel (HALF)); + hdr.channels().insert ("foo.R", Channel (HALF)); + + FrameBuffer fb; + + fb.insert ("R", + Slice (HALF, // type + (char *) &p1[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + fb.insert ("foo.R", + Slice (HALF, // type + (char *) &p2[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + OutputFile out (fileName.c_str(), hdr); + out.setFrameBuffer (fb); + out.writePixels (H); + } + + { + RgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + RgbaInputFile in (fileName.c_str(), "foo"); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + RgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H / 2 - 1); + + in.setLayerName ("foo"); + + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (H / 2, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + if (y < H / 2) + assert (p3[y][x].r == p1[y][x]); + else + assert (p3[y][x].r == p2[y][x]); + + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + Header hdr (W, H); + hdr.channels().insert ("Y", Channel (HALF)); + hdr.channels().insert ("foo.Y", Channel (HALF)); + + FrameBuffer fb; + + fb.insert ("Y", + Slice (HALF, // type + (char *) &p1[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + fb.insert ("foo.Y", + Slice (HALF, // type + (char *) &p2[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + OutputFile out (fileName.c_str(), hdr); + out.setFrameBuffer (fb); + out.writePixels (H); + } + + { + RgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == p1[y][x]); + assert (p3[y][x].b == p1[y][x]); + assert (p3[y][x].a == 1); + } + } + } + + { + RgbaInputFile in (fileName.c_str(), "foo"); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == p2[y][x]); + assert (p3[y][x].b == p2[y][x]); + assert (p3[y][x].a == 1); + } + } + } + + { + RgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (0, H / 2 - 1); + + in.setLayerName ("foo"); + + in.setFrameBuffer (&p3[0][0], 1, W); + in.readPixels (H / 2, H - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + if (y < H / 2) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == p1[y][x]); + assert (p3[y][x].b == p1[y][x]); + } + else + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == p2[y][x]); + assert (p3[y][x].b == p2[y][x]); + } + + assert (p3[y][x].a == 1); + } + } + } + + remove (fileName.c_str()); +} + + +} // namespace + + +void +testRgba (const std::string &tempDir) +{ + try + { + cout << "Testing the RGBA image interface" << endl; + + rgbaMethods (); + + const int W = 237; + const int H = 119; + + Array2D p1 (H, W); + fillPixels (p1, W, H); + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + for (int lorder = 0; lorder < RANDOM_Y; ++lorder) + { + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGBA, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGB, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_A, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + RgbaChannels (WRITE_R | WRITE_B), + LineOrder (lorder), + Compression (comp)); + } + } + + writeReadIncomplete (tempDir); + } + + writeReadLayers (tempDir); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testRgba.h b/IlmImfTest/testRgba.h new file mode 100644 index 0000000..1bd453b --- /dev/null +++ b/IlmImfTest/testRgba.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testRgba (const std::string &tempDir); + diff --git a/IlmImfTest/testRgbaThreading.cpp b/IlmImfTest/testRgbaThreading.cpp new file mode 100644 index 0000000..7ad2b4a --- /dev/null +++ b/IlmImfTest/testRgbaThreading.cpp @@ -0,0 +1,270 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" +#include "compareDwa.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +Rand32 rand1 (27); + +void +fillPixels (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +writeReadRGBA (const char fileName[], + int width, + int height, + const Array2D &p1, + RgbaChannels channels, + LineOrder lorder, + Compression comp) +{ + // + // Save the selected channels of RGBA image p1; save the + // scan lines in the specified order. Read the image back + // from the file, and compare the data with the orignal. + // + + cout << "channels " << + ((channels & WRITE_R)? "R": "") << + ((channels & WRITE_G)? "G": "") << + ((channels & WRITE_B)? "B": "") << + ((channels & WRITE_A)? "A": "") << + ", line order " << lorder << + ", compression " << comp << endl; + + Header header (width, height); + header.lineOrder() = lorder; + header.compression() = comp; + + { + remove (fileName); + RgbaOutputFile out (fileName, header, channels); + out.setFrameBuffer (&p1[0][0], 1, width); + + int numLeft = height; + int numWrite = 1; + + // + // Iterate over all scanlines, and write them out in random-size chunks + // + + while (numLeft) + { + numWrite = int (rand1.nextf() * numLeft + 0.5f); + out.writePixels (numWrite); + numLeft -= numWrite; + } + } + + { + RgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + in.readPixels (dw.min.y, dw.max.y); + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + if (in.compression() == B44_COMPRESSION || + in.compression() == B44A_COMPRESSION) + { + compareB44 (w, h, p1, p2, channels); + } + else if (in.compression() == DWAA_COMPRESSION || + in.compression() == DWAB_COMPRESSION) + { + compareDwa (w, h, p1, p2, channels); + } + else + { + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + if (channels & WRITE_R) + assert (p2[y][x].r == p1[y][x].r); + else + assert (p2[y][x].r == 0); + + if (channels & WRITE_G) + assert (p2[y][x].g == p1[y][x].g); + else + assert (p2[y][x].g == 0); + + if (channels & WRITE_B) + assert (p2[y][x].b == p1[y][x].b); + else + assert (p2[y][x].b == 0); + + if (channels & WRITE_A) + assert (p2[y][x].a == p1[y][x].a); + else + assert (p2[y][x].a == 1); + } + } + } + } + + remove (fileName); +} + + +} // namespace + + +void +testRgbaThreading (const std::string &tempDir) +{ + try + { + cout << "Testing setGlobalThreadCount()" << endl; + + if (!ILMTHREAD_NAMESPACE::supportsThreads ()) + { + cout << " Threading not supported!" << endl << endl; + return; + } + + for (int i = 0; i < 10000; i++) + { + int numThreads = int (rand1.nextf() * 32 + 0.5f); + setGlobalThreadCount (numThreads); + + if (i % 2000 == 0) + cout << "." << flush; + } + + cout << "\nok\n" << endl; + + cout << "Testing multi-threaded writing of scanlines\n" + "in random-sized blocks" << endl; + + const int W = 237; + const int H = 119; + + Array2D p1 (H, W); + fillPixels (p1, W, H); + + for (int n = 0; n <= 8; n++) + { + int numThreads = (n * 3) % 8; + + setGlobalThreadCount (numThreads); + cout << "number of threads: " << globalThreadCount () << endl; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + for (int lorder = 0; lorder < RANDOM_Y; ++lorder) + { + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGBA, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGB, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_A, + LineOrder (lorder), + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + RgbaChannels (WRITE_R | WRITE_B), + LineOrder (lorder), + Compression (comp)); + } + } + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testRgbaThreading.h b/IlmImfTest/testRgbaThreading.h new file mode 100644 index 0000000..16ae78f --- /dev/null +++ b/IlmImfTest/testRgbaThreading.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testRgbaThreading (const std::string &tempDir); + diff --git a/IlmImfTest/testRle.cpp b/IlmImfTest/testRle.cpp new file mode 100644 index 0000000..60b25c3 --- /dev/null +++ b/IlmImfTest/testRle.cpp @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009-2014 DreamWorks Animation LLC. +// +// 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 DreamWorks Animation nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace std; + +namespace { + +// Generate a random sequence of runs and single values +void +generateData(char *buffer, int bufferLen) +{ + char value = 0; + int i = 0; + Rand48 rand48(0); + + while (i < bufferLen) { + + if (rand48.nextf() < .5) { + + // Insert a single value + buffer[i++] = value; + + } else { + + // Insert a run + int runLen = (int)rand48.nextf(2.0, 1024.0); + + for (int j=0; j= bufferLen) break; + } + + } + + value = (int)(value+1) & 0xff; + } +} + +// Compress, decompress, and compare with the original +void +testRoundTrip(int bufferLen) +{ + char *src = new char[bufferLen]; + signed char *compressed = new signed char[2*bufferLen]; + char *test = new char[bufferLen]; + + generateData(src, bufferLen); + + int compressedLen = rleCompress(bufferLen, src, compressed); + + assert(rleUncompress(compressedLen, bufferLen, compressed, test) > 0); + + for (int i=0; i +void testRle(const std::string&); + +#endif /* TESTRLE_H_ */ diff --git a/IlmImfTest/testSampleImages.cpp b/IlmImfTest/testSampleImages.cpp new file mode 100644 index 0000000..9c2eb7c --- /dev/null +++ b/IlmImfTest/testSampleImages.cpp @@ -0,0 +1,183 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include + +#ifndef ILM_IMF_TEST_IMAGEDIR + #define ILM_IMF_TEST_IMAGEDIR +#endif + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +readImage (const char fileName[], unsigned int correctChecksum) +{ + cout << "file " << fileName << " " << flush; + + OPENEXR_IMF_NAMESPACE::RgbaInputFile in (fileName); + + cout << "version " << in.version() << " " << flush; + + const Box2i &dw = in.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array pixels (w * h); + in.setFrameBuffer (pixels - dx - dy * w, 1, w); + in.readPixels (in.dataWindow().min.y, in.dataWindow().max.y); + + unsigned int checksum = 0; + + for (int i = 0; i < w * h; ++i) + { + checksum ^= pixels[i].r.bits(); + checksum ^= pixels[i].g.bits(); + checksum ^= pixels[i].b.bits(); + checksum ^= pixels[i].a.bits(); + } + + cout << "checksum = " << checksum << endl; + + assert (checksum == correctChecksum); +} + + +bool +approximatelyEqual (float x, float y) +{ + float z = (x + 0.01f) / (y + 0.01f); + return z >= 0.99f && z <= 1.01f; +} + + +void +compareImages (const char fileName1[], const char fileName2[]) +{ + cout << "comparing files " << fileName1 << " and " << fileName2 << endl; + + OPENEXR_IMF_NAMESPACE::RgbaInputFile in1 (fileName1); + OPENEXR_IMF_NAMESPACE::RgbaInputFile in2 (fileName1); + + assert (in1.dataWindow() == in2.dataWindow()); + + const Box2i &dw = in1.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array pixels1 (w * h); + Array pixels2 (w * h); + + in1.setFrameBuffer (pixels1 - dx - dy * w, 1, w); + in2.setFrameBuffer (pixels2 - dx - dy * w, 1, w); + + in1.readPixels (in1.dataWindow().min.y, in1.dataWindow().max.y); + in2.readPixels (in2.dataWindow().min.y, in2.dataWindow().max.y); + + for (int i = 0; i < w * h; ++i) + { + assert (approximatelyEqual (pixels1[i].r, pixels2[i].r)); + assert (approximatelyEqual (pixels1[i].g, pixels2[i].g)); + assert (approximatelyEqual (pixels1[i].b, pixels2[i].b)); + assert (approximatelyEqual (pixels1[i].a, pixels2[i].a)); + } +} + +} // namespace + + +void +testSampleImages (const std::string&) +{ + try + { + cout << "Testing sample image files" << endl; + + readImage (ILM_IMF_TEST_IMAGEDIR "comp_none.exr", 24988); + readImage (ILM_IMF_TEST_IMAGEDIR "comp_rle.exr", 24988); + readImage (ILM_IMF_TEST_IMAGEDIR "comp_zips.exr", 24988); + readImage (ILM_IMF_TEST_IMAGEDIR "comp_zip.exr", 24988); + readImage (ILM_IMF_TEST_IMAGEDIR "comp_piz.exr", 24988); + + for (int i = 0; i < 5; i++) + { + if (ILMTHREAD_NAMESPACE::supportsThreads ()) + { + setGlobalThreadCount (i); + + readImage (ILM_IMF_TEST_IMAGEDIR "lineOrder_increasing.exr", + 46515); + + readImage (ILM_IMF_TEST_IMAGEDIR "lineOrder_decreasing.exr", + 46515); + } + } + + compareImages (ILM_IMF_TEST_IMAGEDIR "comp_b44.exr", + ILM_IMF_TEST_IMAGEDIR "comp_b44_piz.exr"); + + compareImages (ILM_IMF_TEST_IMAGEDIR "comp_dwaa_v1.exr", + ILM_IMF_TEST_IMAGEDIR "comp_dwaa_piz.exr"); + compareImages (ILM_IMF_TEST_IMAGEDIR "comp_dwaa_v2.exr", + ILM_IMF_TEST_IMAGEDIR "comp_dwaa_piz.exr"); + + compareImages (ILM_IMF_TEST_IMAGEDIR "comp_dwab_v1.exr", + ILM_IMF_TEST_IMAGEDIR "comp_dwab_piz.exr"); + compareImages (ILM_IMF_TEST_IMAGEDIR "comp_dwab_v2.exr", + ILM_IMF_TEST_IMAGEDIR "comp_dwab_piz.exr"); + + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testSampleImages.h b/IlmImfTest/testSampleImages.h new file mode 100644 index 0000000..119c1f9 --- /dev/null +++ b/IlmImfTest/testSampleImages.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testSampleImages (const std::string &tempDir); + diff --git a/IlmImfTest/testScanLineApi.cpp b/IlmImfTest/testScanLineApi.cpp new file mode 100644 index 0000000..365ee7d --- /dev/null +++ b/IlmImfTest/testScanLineApi.cpp @@ -0,0 +1,604 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "IlmThread.h" +#include "ImathRandom.h" +#include +#include +#include +#include +#include +#include + + +namespace IMF = OPENEXR_IMF_NAMESPACE; +using namespace IMF; +using namespace std; +using namespace IMATH_NAMESPACE; + +namespace { + + +void +fillPixels (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = x % 100 + 100 * (y % 100); + ph[y][x] = sin (double (x)) + sin (y * 0.5); + pf[y][x] = sin (double (y)) + sin (x * 0.5); + } +} + + +void +writeRead (const Array2D &pi1, + const Array2D &ph1, + const Array2D &pf1, + const char fileName[], + LineOrder lorder, + int width, + int height, + int xSize, + int ySize, + int xOffset, + int yOffset, + Compression comp, + LevelMode mode, + LevelRoundingMode rmode) +{ + // + // Write the pixel data in pi1, ph1 and ph2 to a tiled + // image file using the specified parameters. + // Read the pixel data back from the file using the scanline + // interface one scanline at a time, and verify that the data did + // not change. + // For MIPMAP and RIPMAP_LEVELS, the lower levels of the images + // are filled in cropped versions of the level(0,0) image, + // i.e. no filtering is done. + // + + cout << "levelMode " << mode << + ", roundingMode " << rmode << + ", line order " << lorder << + ",\ntileSize " << xSize << "x" << ySize << + ", xOffset " << xOffset << + ", yOffset "<< yOffset << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + hdr.lineOrder() = lorder; + hdr.compression() = comp; + + hdr.channels().insert ("I", Channel (IMF::UINT)); + hdr.channels().insert ("H", Channel (IMF::HALF)); + hdr.channels().insert ("F", Channel (IMF::FLOAT)); + + hdr.setTileDescription(TileDescription(xSize, ySize, mode, rmode)); + { + FrameBuffer fb; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi1[-yOffset][-xOffset], // base + sizeof (pi1[0][0]), // xStride + sizeof (pi1[0][0]) * width) // yStride + ); + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph1[-yOffset][-xOffset], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * width) // yStride + ); + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf1[-yOffset][-xOffset], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width) // yStride + ); + + cout << " writing" << flush; + + remove (fileName); + TiledOutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + + int startTileY = -1; + int endTileY = -1; + int dy; + + switch (mode) + { + case ONE_LEVEL: + { + if (lorder == DECREASING_Y) + { + startTileY = out.numYTiles() - 1; + endTileY = -1; + + dy = -1; + } + else + { + startTileY = 0; + endTileY = out.numYTiles(); + + dy = 1; + } + + for (int tileY = startTileY; tileY != endTileY; tileY += dy) + for (int tileX = 0; tileX < out.numXTiles(); ++tileX) + out.writeTile (tileX, tileY); + } + break; + + case MIPMAP_LEVELS: + { + if (lorder == DECREASING_Y) + { + endTileY = -1; + dy = -1; + } + else + { + startTileY = 0; + dy = 1; + } + + for (int level = 0; level < out.numLevels(); ++level) + { + if (lorder == DECREASING_Y) + startTileY = out.numYTiles(level) - 1; + else + endTileY = out.numYTiles(level); + + for (int tileY = startTileY; tileY != endTileY; tileY += dy) + for (int tileX = 0; tileX < out.numXTiles(level); ++tileX) + out.writeTile (tileX, tileY, level); + } + } + break; + + case RIPMAP_LEVELS: + { + for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) + { + if (lorder == DECREASING_Y) + { + startTileY = out.numYTiles(ylevel) - 1; + endTileY = -1; + + dy = -1; + } + else + { + startTileY = 0; + endTileY = out.numYTiles(ylevel); + + dy = 1; + } + + for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) + { + for (int tileY = startTileY; tileY != endTileY; + tileY += dy) + for (int tileX = 0; tileX < out.numXTiles (xlevel); + ++tileX) + out.writeTile (tileX, tileY, xlevel, ylevel); + } + } + } + break; + } + } + + { + cout << " reading INCREASING_Y" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D pi2 (h, w); + Array2D ph2 (h, w); + Array2D pf2 (h, w); + + FrameBuffer fb; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi2[-dwy][-dwx],// base + sizeof (pi2[0][0]), // xStride + sizeof (pi2[0][0]) * w) // yStride + ); + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph2[-dwy][-dwx],// base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * w) // yStride + ); + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf2[-dwy][-dwx],// base + sizeof (pf2[0][0]), // xStride + sizeof (pf2[0][0]) * w) // yStride + ); + + in.setFrameBuffer (fb); + for (int y = dw.min.y; y <= dw.max.y; ++y) + in.readPixels (y); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (pi1[y][x] == pi2[y][x]); + assert (ph1[y][x] == ph2[y][x]); + assert (pf1[y][x] == pf2[y][x]); + } + } + } + + { + cout << endl << " reading DECREASING_Y" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D pi2 (h, w); + Array2D ph2 (h, w); + Array2D pf2 (h, w); + + FrameBuffer fb; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi2[-dwy][-dwx],// base + sizeof (pi2[0][0]), // xStride + sizeof (pi2[0][0]) * w) // yStride + ); + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph2[-dwy][-dwx],// base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * w) // yStride + ); + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf2[-dwy][-dwx],// base + sizeof (pf2[0][0]), // xStride + sizeof (pf2[0][0]) * w) // yStride + ); + + in.setFrameBuffer (fb); + for (int y = dw.max.y; y >= dw.min.y; --y) + in.readPixels (y); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (pi1[y][x] == pi2[y][x]); + assert (ph1[y][x] == ph2[y][x]); + assert (pf1[y][x] == pf2[y][x]); + } + } + } + + { + cout << endl << " reading INCREASING_Y " + "(new frame buffer on every line)" << flush; + + InputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D pi2 (h, w); + Array2D ph2 (h, w); + Array2D pf2 (h, w); + + for (int y = dw.min.y; y <= dw.max.y; ++y) + { + FrameBuffer fb; + + fb.insert ("I", // name + Slice (IMF::UINT, // type + (char *) &pi2[y - dwy][-dwx], // base + sizeof (pi2[0][0]), // xStride + 0) // yStride + ); + + fb.insert ("H", // name + Slice (IMF::HALF, // type + (char *) &ph2[y - dwy][-dwx], // base + sizeof (ph2[0][0]), // xStride + 0) // yStride + ); + + fb.insert ("F", // name + Slice (IMF::FLOAT, // type + (char *) &pf2[y - dwy][-dwx], // base + sizeof (pf2[0][0]), // xStride + 0) // yStride + ); + + in.setFrameBuffer (fb); + in.readPixels (y); + } + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (pi1[y][x] == pi2[y][x]); + assert (ph1[y][x] == ph2[y][x]); + assert (pf1[y][x] == pf2[y][x]); + } + } + } + + remove (fileName); + cout << endl; +} + + +void +writeRead (const std::string &tempDir, + const Array2D &pi, + const Array2D &ph, + const Array2D &pf, + int W, + int H, + LineOrder lorder, + Compression comp, + LevelRoundingMode rmode, + int dx, int dy, + int xSize, int ySize) +{ + std::string filename = tempDir + "imf_test_scanline_api.exr"; + + writeRead (pi, ph, pf, filename.c_str(), lorder, W, H, + xSize, ySize, dx, dy, comp, ONE_LEVEL, rmode); + writeRead (pi, ph, pf, filename.c_str(), lorder, W, H, + xSize, ySize, dx, dy, comp, MIPMAP_LEVELS, rmode); + writeRead (pi, ph, pf, filename.c_str(), lorder, W, H, + xSize, ySize, dx, dy, comp, RIPMAP_LEVELS, rmode); +} + +} // namespace + + +void +testScanLineApi (const std::string &tempDir) +{ + try + { + cout << "Testing the scanline API for tiled files" << endl; + + const int W = 48; + const int H = 81; + const int DX = -17; + const int DY = -29; + + Array2D pi (H, W); + Array2D ph (H, W); + Array2D pf (H, W); + fillPixels (pi, ph, pf, W, H); + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + for (int lorder = 0; lorder < NUM_LINEORDERS; ++lorder) + { + for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode) + { + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + 0, 0, 1, 1); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + DX, DY, 1, 1); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + 0, 0, 24, 26); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + DX, DY, 24, 26); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + 0, 0, 48, 81); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + DX, DY, 48, 81); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + 0, 0, 128, 96); + + writeRead (tempDir, pi, ph, pf, W, H, + LineOrder (lorder), + ZIP_COMPRESSION, + LevelRoundingMode (rmode), + DX, DY, 128, 96); + } + } + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testScanLineApi.h b/IlmImfTest/testScanLineApi.h new file mode 100644 index 0000000..54721a1 --- /dev/null +++ b/IlmImfTest/testScanLineApi.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testScanLineApi (const std::string &tempDir); + diff --git a/IlmImfTest/testSharedFrameBuffer.cpp b/IlmImfTest/testSharedFrameBuffer.cpp new file mode 100644 index 0000000..87c3074 --- /dev/null +++ b/IlmImfTest/testSharedFrameBuffer.cpp @@ -0,0 +1,352 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" +#include "compareDwa.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; +using namespace ILMTHREAD_NAMESPACE; + + +namespace { + +Rand48 rand1 (27); +Mutex scanlineMutex; +Semaphore threadSemaphore; +int remainingScanlines = 0; + + +void +fillPixels (Array2D &pixels, int w, int h) +{ + assert (sizeof (int) == sizeof (float)); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = x % 100 + 100 * (y % 100) + + rand1.nextf (-0.01f, -0.01f); + + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y) + + rand1.nextf (-0.01f, -0.01f); + + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y) + + rand1.nextf (-0.01f, -0.01f); + + p.a = rand1.nextf (0.0f, 1.0f); + } + } +} + + +class WriterThread: public Thread +{ + public: + + WriterThread (RgbaOutputFile *outfile); + + virtual void run (); + + private: + + RgbaOutputFile * _outfile; +}; + + +WriterThread::WriterThread (RgbaOutputFile *outfile): _outfile (outfile) +{ + start(); +} + +void +WriterThread::run () +{ + // + // Signal that the thread has started + // + + threadSemaphore.post(); + + while (true) + { + Lock lock (scanlineMutex); + + if (remainingScanlines) + { + int n = int (rand1.nextf (0.0f, remainingScanlines) + 0.5f); + _outfile->writePixels (n); + remainingScanlines -= n; + } + else + { + break; + } + } +} + + +class ReaderThread : public Thread +{ + public: + + ReaderThread (RgbaInputFile *infile, int start, int step); + + virtual void run (); + + private: + + RgbaInputFile * _infile; + int _start; + int _step; +}; + + +ReaderThread::ReaderThread (RgbaInputFile *infile, int start, int step): + _infile (infile), _start (start), _step (step) +{ + Thread::start(); +} + + +void +ReaderThread::run () +{ + // + // Signal that the thread has started + // + + threadSemaphore.post (); + + int num = _infile->header().dataWindow().max.y - + _infile->header().dataWindow().min.y + 1; + + for (int i = _start; i < num; i += _step) + _infile->readPixels (i); +} + + +void +writeReadRGBA (const char fileName[], + int width, + int height, + const Array2D &p1, + RgbaChannels channels, + Compression comp) +{ + // + // Save the selected channels of RGBA image p1; save the + // scan lines in the specified order. Read the image back + // from the file, and compare the data with the orignal. + // + + cout << "channels " << + ((channels & WRITE_R)? "R": "") << + ((channels & WRITE_G)? "G": "") << + ((channels & WRITE_B)? "B": "") << + ((channels & WRITE_A)? "A": "") << + ", compression " << comp << ", " << flush; + + Header header (width, height); + header.compression() = comp; + + { + remove (fileName); + cout << "writing " << flush; + RgbaOutputFile out (fileName, header, channels); + out.setFrameBuffer (&p1[0][0], 1, width); + + remainingScanlines = height; + WriterThread writer1 (&out); + WriterThread writer2 (&out); + threadSemaphore.wait(); + threadSemaphore.wait(); + } + + { + cout << "reading " << flush; + RgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dy][-dx], 1, w); + + { + ReaderThread reader1 (&in, 0, 2); + ReaderThread reader2 (&in, 1, 2); + threadSemaphore.wait(); + threadSemaphore.wait(); + } + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + cout << "comparing " << endl; + + if (in.compression() == B44_COMPRESSION || + in.compression() == B44A_COMPRESSION) + { + compareB44 (width, height, p1, p2, channels); + } + else if (in.compression() == DWAA_COMPRESSION || + in.compression() == DWAB_COMPRESSION) + { + compareDwa (width, height, p1, p2, channels); + } + else + { + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + if (channels & WRITE_R) + assert (p2[y][x].r == p1[y][x].r); + else + assert (p2[y][x].r == 0); + + if (channels & WRITE_G) + assert (p2[y][x].g == p1[y][x].g); + else + assert (p2[y][x].g == 0); + + if (channels & WRITE_B) + assert (p2[y][x].b == p1[y][x].b); + else + assert (p2[y][x].b == 0); + + if (channels & WRITE_A) + assert (p2[y][x].a == p1[y][x].a); + else + assert (p2[y][x].a == 1); + } + } + } + } + + remove (fileName); +} + + +} // namespace + + +void +testSharedFrameBuffer (const std::string &tempDir) +{ + try + { + cout << "Testing reading from and writing to files using\n" + "multiple threads and a shared framebuffer" << endl; + + if (!ILMTHREAD_NAMESPACE::supportsThreads ()) + { + cout << " Threading not supported!" << endl << endl; + return; + } + + const int W = 1371; + const int H = 159; + + Array2D p1 (H, W); + fillPixels (p1, W, H); + + for (int n = 0; n <= 8; n++) + { + int numThreads = (n * 3) % 8; + + setGlobalThreadCount (numThreads); + cout << "number of threads: " << globalThreadCount () << endl; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGBA, + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_RGB, + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + WRITE_A, + Compression (comp)); + + writeReadRGBA ((tempDir + "imf_test_rgba.exr").c_str(), + W, H, p1, + RgbaChannels (WRITE_R | WRITE_B), + Compression (comp)); + } + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testSharedFrameBuffer.h b/IlmImfTest/testSharedFrameBuffer.h new file mode 100644 index 0000000..8eee223 --- /dev/null +++ b/IlmImfTest/testSharedFrameBuffer.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testSharedFrameBuffer (const std::string &tempDir); + diff --git a/IlmImfTest/testStandardAttributes.cpp b/IlmImfTest/testStandardAttributes.cpp new file mode 100644 index 0000000..d5873a7 --- /dev/null +++ b/IlmImfTest/testStandardAttributes.cpp @@ -0,0 +1,966 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include "ImathRandom.h" +#include +#include +#include +#include + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +convertRGBtoXYZ () +{ + cout << "conversion from RGB to XYZ" << endl; + + Chromaticities c; + float Y = 100; + M44f M1 = RGBtoXYZ (c, Y); + + V3f R1 = V3f (1, 0, 0) * M1; + V3f G1 = V3f (0, 1, 0) * M1; + V3f B1 = V3f (0, 0, 1) * M1; + V3f W1 = V3f (1, 1, 1) * M1; + + cout << "red XYZ = " << R1 << endl; + cout << "green XYZ = " << G1 << endl; + cout << "blue XYZ = " << B1 << endl; + cout << "white XYZ = " << W1 << endl; + + V2f r1 (R1.x / (R1.x + R1.y + R1.z), R1.y / (R1.x + R1.y + R1.z)); + V2f g1 (G1.x / (G1.x + G1.y + G1.z), G1.y / (G1.x + G1.y + G1.z)); + V2f b1 (B1.x / (B1.x + B1.y + B1.z), B1.y / (B1.x + B1.y + B1.z)); + V2f w1 (W1.x / (W1.x + W1.y + W1.z), W1.y / (W1.x + W1.y + W1.z)); + + cout << "red xy = " << r1 << endl; + cout << "green xy = " << g1 << endl; + cout << "blue xy = " << b1 << endl; + cout << "white xy = " << w1 << endl; + + assert (equalWithRelError (W1.y, Y, 1e-5F)); + assert (r1.equalWithAbsError (c.red, 1e-5F)); + assert (g1.equalWithAbsError (c.green, 1e-5F)); + assert (b1.equalWithAbsError (c.blue, 1e-5F)); + assert (w1.equalWithAbsError (c.white, 1e-5F)); + + cout << "conversion from XYZ to RGB" << endl; + + M44f M2 = XYZtoRGB (c, Y); + + V3f R2 = R1 * M2; + V3f G2 = G1 * M2; + V3f B2 = B1 * M2; + V3f W2 = W1 * M2; + + cout << "red RGB = " << R2 << endl; + cout << "green RGB = " << G2 << endl; + cout << "blue RGB = " << B2 << endl; + cout << "white RGB = " << W2 << endl; + + assert (R2.equalWithAbsError (V3f (1, 0, 0), 1e-3F)); + assert (G2.equalWithAbsError (V3f (0, 1, 0), 1e-3F)); + assert (B2.equalWithAbsError (V3f (0, 0, 1), 1e-3F)); + assert (W2.equalWithAbsError (V3f (1, 1, 1), 1e-3F)); +} + + +void +writeReadChromaticities (const char fileName[]) +{ + cout << "chromaticities attribute" << endl; + + cout << "writing, "; + + Chromaticities c1 (V2f (1, 2), V2f (3, 4), V2f (5, 6), V2f (7, 8)); + static const int W = 100; + static const int H = 100; + + Header header (W, H); + assert (hasChromaticities (header) == false); + + addChromaticities (header, c1); + assert (hasChromaticities (header) == true); + + { + RgbaOutputFile out (fileName, header); + Rgba pixels[W]; + + for (int i = 0; i < W; ++i) + { + pixels[i].r = 1; + pixels[i].g = 1; + pixels[i].b = 1; + pixels[i].a = 1; + } + + out.setFrameBuffer (pixels, 1, 0); + out.writePixels (H); + } + + cout << "reading, comparing" << endl; + + { + RgbaInputFile in (fileName); + const Chromaticities &c2 = chromaticities (in.header()); + + assert (hasChromaticities (in.header()) == true); + assert (c1.red == c2.red); + assert (c1.green == c2.green); + assert (c1.blue == c2.blue); + assert (c1.white == c2.white); + } + + remove (fileName); +} + + +void +latLongMap (const char fileName1[], const char fileName2[]) +{ + cout << "latitude-longitude environment map" << endl; + const int W = 360; + const int H = 180; + + Header header (W, H); + addEnvmap (header, ENVMAP_LATLONG); + + V2f pos; + + pos = LatLongMap::latLong (V3f (0, 1, 0)); + assert (equalWithAbsError (pos.x, float (M_PI/2), 1e-6f)); + + pos = LatLongMap::latLong (V3f (0, -1, 0)); + assert (equalWithAbsError (pos.x, float (-M_PI/2), 1e-6f)); + + pos = LatLongMap::latLong (V3f (0, 0, 1)); + assert (pos.equalWithAbsError (V2f (0, 0), 1e-6f)); + + pos = LatLongMap::latLong (V3f (1, 0, 0)); + assert (pos.equalWithAbsError (V2f (0, M_PI/2), 1e-6f)); + + pos = LatLongMap::latLong (V3f (-1, 0, 0)); + assert (pos.equalWithAbsError (V2f (0, -M_PI/2), 1e-6f)); + + pos = LatLongMap::latLong (V3f (0, 1, 1)); + assert (pos.equalWithAbsError (V2f (M_PI/4, 0), 1e-6f)); + + pos = LatLongMap::latLong (V3f (0, -1, 1)); + assert (pos.equalWithAbsError (V2f (-M_PI/4, 0), 1e-6f)); + + pos = LatLongMap::pixelPosition (header.dataWindow(), V2f (M_PI/2, M_PI)); + assert (pos.equalWithAbsError (V2f (0, 0), 1e-6f * W)); + + pos = LatLongMap::pixelPosition(header.dataWindow(), V2f (-M_PI/2, -M_PI)); + assert (pos.equalWithAbsError (V2f (header.dataWindow().max), 1e-6f * W)); + + Array2D pixels (H, W); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + Rgba &p = pixels[y][x]; + V3f dir = LatLongMap::direction (header.dataWindow(), V2f (x, y)); + + p.r = dir.x + 1; + p.g = dir.y + 1; + p.b = dir.z + 1; + } + } + + { + RgbaOutputFile out (fileName1, header, WRITE_RGB); + out.setFrameBuffer (&pixels[0][0], 1, W); + out.writePixels (H); + } + + Rand48 rand (0); + + for (int i = 0; i < W * H * 3; ++i) + { + V3f dir = hollowSphereRand (rand); + V2f pos = LatLongMap::pixelPosition (header.dataWindow(), dir); + + Rgba &p = pixels[int (pos.y + 0.5)][int (pos.x + 0.5)]; + + p.r = (dir.x + 1) * 0.8; + p.g = (dir.y + 1) * 0.8; + p.b = (dir.z + 1) * 0.8; + + V3f dir1 = LatLongMap::direction (header.dataWindow(), pos); + assert (dir.equalWithAbsError (dir1.normalized(), 1e-5f)); + } + + { + RgbaOutputFile out (fileName2, header, WRITE_RGB); + out.setFrameBuffer (&pixels[0][0], 1, W); + out.writePixels (H); + } + + + remove (fileName1); + remove (fileName2); +} + + +void +cubeMap (const char fileName1[], const char fileName2[]) +{ + cout << "cube environment map" << endl; + const int N = 128; + const int W = N; + const int H = N * 6; + + Header header (W, H); + addEnvmap (header, ENVMAP_CUBE); + + int sof = CubeMap::sizeOfFace (header.dataWindow()); + + assert (sof == N); + + for (int face1 = 0; face1 < 6; ++face1) + { + Box2i dw1 = CubeMap::dataWindowForFace (CubeMapFace (face1), + header.dataWindow()); + + assert (dw1.max.x - dw1.min.x == sof - 1); + assert (dw1.max.y - dw1.min.y == sof - 1); + assert (header.dataWindow().intersects (dw1.min)); + assert (header.dataWindow().intersects (dw1.max)); + + for (int face2 = face1 + 1; face2 < 6; ++face2) + { + Box2i dw2 = CubeMap::dataWindowForFace (CubeMapFace (face2), + header.dataWindow()); + assert (!dw1.intersects (dw2)); + } + } + + CubeMapFace face; + V2f pos; + + CubeMap::faceAndPixelPosition (V3f (1, 0, 0), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_POS_X); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + CubeMap::faceAndPixelPosition (V3f (-1, 0, 0), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_NEG_X); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + CubeMap::faceAndPixelPosition (V3f (0, 1, 0), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_POS_Y); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + CubeMap::faceAndPixelPosition (V3f (0, -1, 0), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_NEG_Y); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + CubeMap::faceAndPixelPosition (V3f (0, 0, 1), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_POS_Z); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + CubeMap::faceAndPixelPosition (V3f (0, 0, -1), + header.dataWindow(), + face, pos); + + assert (face == CUBEFACE_NEG_Z); + assert (pos.equalWithAbsError (V2f ((sof - 1), (sof - 1)) / 2, 1e-6 * W)); + + Array2D pixels (H, W); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + Rgba &p = pixels[y][x]; + p.r = p.g = p.b = 0; + } + } + + for (int face = 0; face < 6; ++face) + { + for (int y = 0; y < sof; ++y) + { + for (int x = 0; x < sof; ++x) + { + V2f px = CubeMap::pixelPosition (CubeMapFace (face), + header.dataWindow(), + V2f (x, y)); + + Rgba &p = pixels[int (px.y + 0.5)][int (px.x + 0.5)]; + + V3f dir = CubeMap::direction (CubeMapFace (face), + header.dataWindow(), + V2f (x, y)); + dir.normalize(); + + p.r = dir.x + 1; + p.g = dir.y + 1; + p.b = dir.z + 1; + } + } + } + + { + RgbaOutputFile out (fileName1, header, WRITE_RGB); + out.setFrameBuffer (&pixels[0][0], 1, W); + out.writePixels (H); + } + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + Rgba &p = pixels[y][x]; + assert (p.r != 0 || p.g != 0 || p.b != 0); + } + } + + Rand48 rand (0); + + for (int i = 0; i < W * H * 3; ++i) + { + V3f dir = hollowSphereRand (rand); + + CubeMapFace face; + V2f pif; + + CubeMap::faceAndPixelPosition (dir, header.dataWindow(), face, pif); + + V2f pos = CubeMap::pixelPosition (face, header.dataWindow(), pif); + + Rgba &p = pixels[int (pos.y + 0.5)][int (pos.x + 0.5)]; + + p.r = (dir.x + 1) * 0.8; + p.g = (dir.y + 1) * 0.8; + p.b = (dir.z + 1) * 0.8; + + V3f dir1 = CubeMap::direction (face, header.dataWindow(), pif); + assert (dir.equalWithAbsError (dir1.normalized(), 1e-6f)); + } + + { + RgbaOutputFile out (fileName2, header, WRITE_RGB); + out.setFrameBuffer (&pixels[0][0], 1, W); + out.writePixels (H); + } + + remove (fileName1); + remove (fileName2); +} + + +void +writeReadKeyCode (const char fileName[]) +{ + cout << "key code attribute" << endl; + + cout << "writing, "; + + KeyCode k1 (12, // filmMfcCode + 34, // filmType + 123456, // prefix + 1234, // count + 45, // perfOffset + 3, // perfsPerFrame + 80); // perfsPerCount + + assert (k1.filmMfcCode() == 12); + assert (k1.filmType() == 34); + assert (k1.prefix() == 123456); + assert (k1.count() == 1234); + assert (k1.perfOffset() == 45); + assert (k1.perfsPerFrame() == 3); + assert (k1.perfsPerCount() == 80); + + static const int W = 100; + static const int H = 100; + + Header header (W, H); + assert (hasKeyCode (header) == false); + + addKeyCode (header, k1); + assert (hasKeyCode (header) == true); + + { + RgbaOutputFile out (fileName, header); + Rgba pixels[W]; + + for (int i = 0; i < W; ++i) + { + pixels[i].r = 1; + pixels[i].g = 1; + pixels[i].b = 1; + pixels[i].a = 1; + } + + out.setFrameBuffer (pixels, 1, 0); + out.writePixels (H); + } + + cout << "reading, comparing" << endl; + + { + RgbaInputFile in (fileName); + const KeyCode &k2 = keyCode (in.header()); + + assert (hasKeyCode (in.header()) == true); + assert (k1.filmMfcCode() == k2.filmMfcCode()); + assert (k1.filmType() == k2.filmType()); + assert (k1.prefix() == k2.prefix()); + assert (k1.count() == k2.count()); + assert (k1.perfOffset() == k2.perfOffset()); + assert (k1.perfsPerFrame() == k2.perfsPerFrame()); + assert (k1.perfsPerCount() == k2.perfsPerCount()); + } + + remove (fileName); +} + + +void +timeCodeMethods () +{ + cout << "time code methods" << endl; + + TimeCode t; + + assert (t.timeAndFlags() == 0); + assert (t.userData() == 0); + + // Frames + + t.setTimeAndFlags (0x00000000); + t.setFrame (29); + assert (t.frame() == 29); + assert (t.timeAndFlags() == 0x00000029); + + t.setTimeAndFlags (0xffffffff); + t.setFrame (0); + assert (t.frame() == 0); + assert (t.timeAndFlags() == 0xffffffc0); + + // Seconds + + t.setTimeAndFlags (0x00000000); + t.setSeconds (59); + assert (t.seconds() == 59); + assert (t.timeAndFlags() == 0x00005900); + + t.setTimeAndFlags (0xffffffff); + t.setSeconds (0); + assert (t.seconds() == 0); + assert (t.timeAndFlags() == 0xffff80ff); + + // Minutes + + t.setTimeAndFlags (0x00000000); + t.setMinutes (59); + assert (t.minutes() == 59); + assert (t.timeAndFlags() == 0x00590000); + + t.setTimeAndFlags (0xffffffff); + t.setMinutes (0); + assert (t.minutes() == 0); + assert (t.timeAndFlags() == 0xff80ffff); + + // Hours + + t.setTimeAndFlags (0x00000000); + t.setHours (23); + assert (t.hours() == 23); + assert (t.timeAndFlags() == 0x23000000); + + t.setTimeAndFlags (0xffffffff); + t.setHours (0); + assert (t.hours() == 0); + assert (t.timeAndFlags() == 0xc0ffffff); + + // Drop frame flag + + t.setTimeAndFlags (0x00000000); + t.setDropFrame (true); + assert (t.dropFrame() == true); + assert (t.timeAndFlags() == 0x00000040); + + t.setTimeAndFlags (0xffffffff); + t.setDropFrame (false); + assert (t.dropFrame() == false); + assert (t.timeAndFlags() == 0xffffffbf); + + // Color frame flag + + t.setTimeAndFlags (0x00000000); + t.setColorFrame (true); + assert (t.colorFrame() == true); + assert (t.timeAndFlags() == 0x00000080); + + t.setTimeAndFlags (0xffffffff); + t.setColorFrame (false); + assert (t.colorFrame() == false); + assert (t.timeAndFlags() == 0xffffff7f); + + // Field/phase flag + + t.setTimeAndFlags (0x00000000); + t.setFieldPhase (true); + assert (t.fieldPhase() == true); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0x00008000); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0x80000000); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x00008000); + + t.setTimeAndFlags (0xffffffff); + t.setFieldPhase (false); + assert (t.fieldPhase() == false); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0xffff7fff); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0x7fffffbf); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xffff7f3f); + + t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::TV60_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00008000)); + + t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::TV50_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00008000)); + + t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::FILM24_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00008000)); + + // bgf0 + + t.setTimeAndFlags (0x00000000); + t.setBgf0 (true); + assert (t.bgf0() == true); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0x00800000); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0x00008000); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x00800000); + + t.setTimeAndFlags (0xffffffff); + t.setBgf0 (false); + assert (t.bgf0() == false); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0xff7fffff); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0xffff7fbf); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xff7fff3f); + + t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::TV60_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00800000)); + + t.setTimeAndFlags (0x23595929 | 0x00008000, TimeCode::TV50_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00800000)); + + t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::FILM24_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x00800000)); + + // bgf1 + + t.setTimeAndFlags (0x00000000); + t.setBgf1 (true); + assert (t.bgf1() == true); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0x40000000); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0x40000000); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x40000000); + + t.setTimeAndFlags (0xffffffff); + t.setBgf1 (false); + assert (t.bgf1() == false); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0xbfffffff); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0xbfffffbf); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0xbfffff3f); + + t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::TV60_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x40000000)); + + t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::TV50_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x40000000)); + + t.setTimeAndFlags (0x23595929 | 0x40000000, TimeCode::FILM24_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x40000000)); + + // bgf2 + + t.setTimeAndFlags (0x00000000); + t.setBgf2 (true); + assert (t.bgf2() == true); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0x80000000); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0x00800000); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x80000000); + + t.setTimeAndFlags (0xffffffff); + t.setBgf2 (false); + assert (t.bgf2() == false); + assert (t.timeAndFlags (TimeCode::TV60_PACKING) == 0x7fffffff); + assert (t.timeAndFlags (TimeCode::TV50_PACKING) == 0xff7fffbf); + assert (t.timeAndFlags (TimeCode::FILM24_PACKING) == 0x7fffff3f); + + t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::TV60_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x80000000)); + + t.setTimeAndFlags (0x23595929 | 0x00800000, TimeCode::TV50_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x80000000)); + + t.setTimeAndFlags (0x23595929 | 0x80000000, TimeCode::FILM24_PACKING); + assert (t.timeAndFlags() == (0x23595929 | 0x80000000)); + + // User-defined data + + t.setUserData (0x87654321); + assert (t.userData() == 0x87654321); + + assert (t.binaryGroup (1) == 1); + assert (t.binaryGroup (2) == 2); + assert (t.binaryGroup (3) == 3); + assert (t.binaryGroup (4) == 4); + assert (t.binaryGroup (5) == 5); + assert (t.binaryGroup (6) == 6); + assert (t.binaryGroup (7) == 7); + + t.setBinaryGroup (1, 2); + t.setBinaryGroup (2, 3); + t.setBinaryGroup (3, 4); + t.setBinaryGroup (4, 5); + t.setBinaryGroup (5, 6); + t.setBinaryGroup (6, 7); + t.setBinaryGroup (7, 8); + t.setBinaryGroup (8, 9); + + assert (t.userData() == 0x98765432); + + // Assignment + + TimeCode t1 (12, 17, 57, 14, // hours, minutes, seconds, frame + false, false, false, // dropFrame, colorFrame, fieldPhase + false, false, false, // bgf0, bgf1, bgf2 + 1, 2, 3, 4, 5, 6, 7, 8); // binary groups 1 to 8 + t = t1; + + assert (t.timeAndFlags() == 0x12175714); + assert (t.userData() == 0x87654321); +} + + +void +writeReadTimeCode (const char fileName[]) +{ + cout << "time code attribute" << endl; + + cout << "writing, "; + + TimeCode t1 (0x23595829, 0x12345678, TimeCode::FILM24_PACKING); + + assert (t1.timeAndFlags (TimeCode::FILM24_PACKING) == 0x23595829); + assert (t1.userData() == 0x12345678); + + static const int W = 100; + static const int H = 100; + + Header header (W, H); + assert (hasTimeCode (header) == false); + + addTimeCode (header, t1); + assert (hasTimeCode (header) == true); + + { + RgbaOutputFile out (fileName, header); + Rgba pixels[W]; + + for (int i = 0; i < W; ++i) + { + pixels[i].r = 1; + pixels[i].g = 1; + pixels[i].b = 1; + pixels[i].a = 1; + } + + out.setFrameBuffer (pixels, 1, 0); + out.writePixels (H); + } + + cout << "reading, comparing" << endl; + + { + RgbaInputFile in (fileName); + const TimeCode &t2 = timeCode (in.header()); + + assert (hasTimeCode (in.header()) == true); + assert (t1.timeAndFlags() == t2.timeAndFlags()); + assert (t1.userData() == t2.userData()); + } + + remove (fileName); +} + + +bool +equal (const Rational &a, const Rational &b) +{ + return a.n == b.n && a.d == b.d; +} + + +void +rationalMethods () +{ + cout << "rational methods" << endl; + + Rational r0 (0, 1); + assert (r0 == 0); + + Rational r1 (1, 1); + assert (r1 == 1); + + Rational r2 (1, 4); + assert (r2 == 0.25); + + Rational r3 (-8, 2); + assert (r3 == -4); + + Rational r4 (0.0); + assert (r4 == 0); + + Rational r5 (1e-50); + assert (r5 == 0); + + Rational r6 (1.0); + assert (r6 == 1.0 && r6.n == 1 && r6.d == 1); + + Rational r7 (-10.0); + assert (r7 == -10.0 && r7.n == -10 && r7.d == 1); + + Rational r8 (0.03125); + assert (r8 == 0.03125 && r8.n == 1 && r8.d == 32); + + Rational r9 (0.53125); + assert (r9 == 0.53125 && r9.n == 17 && r9.d == 32); + + Rational r10 (10.1); + assert (equalWithAbsError (double (r10), 10.1, 1e-8)); + + Rational r11 (double ((1U << 30) - 1)); + assert (r11 == double ((1U << 30) - 1)); + + assert (equal (guessExactFps (23.976), fps_23_976())); + assert (equal (guessExactFps (24.000), fps_24())); + assert (equal (guessExactFps (25.000), fps_25())); + assert (equal (guessExactFps (29.970), fps_29_97())); + assert (equal (guessExactFps (30.000), fps_30())); + assert (equal (guessExactFps (47.952), fps_47_952())); + assert (equal (guessExactFps (48.000), fps_48())); + assert (equal (guessExactFps (50.000), fps_50())); + assert (equal (guessExactFps (59.940), fps_59_94())); + assert (equal (guessExactFps (60.000), fps_60())); + assert (equal (guessExactFps (70.500), Rational (141, 2))); +} + + +void +writeReadRational (const char fileName[]) +{ + cout << "rational attribute" << endl; + + cout << "writing, "; + + Rational r1 (12, 17); + Rational r2 (-12, 3); + + static const int W = 100; + static const int H = 100; + + Header header (W, H); + header.insert ("r1", RationalAttribute (r1)); + header.insert ("r2", RationalAttribute (r2)); + + { + RgbaOutputFile out (fileName, header); + Rgba pixels[W]; + + for (int i = 0; i < W; ++i) + { + pixels[i].r = 1; + pixels[i].g = 1; + pixels[i].b = 1; + pixels[i].a = 1; + } + + out.setFrameBuffer (pixels, 1, 0); + out.writePixels (H); + } + + cout << "reading, comparing" << endl; + + { + RgbaInputFile in (fileName); + + const Rational &r3 = + in.header().typedAttribute("r1").value(); + + const Rational &r4 = + in.header().typedAttribute("r2").value(); + + assert (equal (r1, r3)); + assert (equal (r2, r4)); + } + + remove (fileName); +} + + +void +generatedFunctions () +{ + // + // Most optional standard attributes are of type string, float, + // etc. The attribute types are already being tested elsewhere + // (testAttributes.C), and the convenience functions to access + // the standard attributes are all generated via macros. Here + // we just verify that all the convenience functions exist + // (that is, ImfStandardAttributes.C and ImfStandardAttributes.h + // contain the right macro invocations). If any functions are + // missing, we should get an error during compiling or linking. + // + + cout << "automatically generated functions" << endl; + + Header header; + + assert (hasChromaticities (header) == false); + assert (hasWhiteLuminance (header) == false); + assert (hasAdoptedNeutral (header) == false); + assert (hasRenderingTransform (header) == false); + assert (hasLookModTransform (header) == false); + assert (hasXDensity (header) == false); + assert (hasOwner (header) == false); + assert (hasComments (header) == false); + assert (hasCapDate (header) == false); + assert (hasUtcOffset (header) == false); + assert (hasLongitude (header) == false); + assert (hasLatitude (header) == false); + assert (hasAltitude (header) == false); + assert (hasFocus (header) == false); + assert (hasExpTime (header) == false); + assert (hasAperture (header) == false); + assert (hasIsoSpeed (header) == false); + assert (hasEnvmap (header) == false); + assert (hasKeyCode (header) == false); + assert (hasTimeCode (header) == false); + assert (hasWrapmodes (header) == false); + assert (hasFramesPerSecond (header) == false); + assert (hasMultiView (header) == false); + assert (hasWorldToCamera (header) == false); + assert (hasWorldToNDC (header) == false); + assert (hasDeepImageState (header) == false); + assert (hasOriginalDataWindow (header) == false); +} + + +} // namespace + + +void +testStandardAttributes (const std::string &tempDir) +{ + try + { + cout << "Testing optional standard attributes" << endl; + + convertRGBtoXYZ(); + + { + std::string filename = tempDir + "imf_test_chromaticities.exr"; + writeReadChromaticities (filename.c_str()); + } + + { + std::string fn1 = tempDir + "imf_test_latlong1.exr"; + std::string fn2 = tempDir + "imf_test_latlong2.exr"; + latLongMap (fn1.c_str(), fn2.c_str()); + } + + { + std::string fn1 = tempDir + "imf_test_cube1.exr"; + std::string fn2 = tempDir + "imf_test_cube2.exr"; + cubeMap (fn1.c_str(), fn2.c_str()); + } + + { + std::string filename = tempDir + "imf_test_keycode.exr"; + writeReadKeyCode (filename.c_str()); + } + + { + timeCodeMethods(); + std::string filename = tempDir + "imf_test_timecode.exr"; + writeReadTimeCode (filename.c_str()); + } + + { + rationalMethods(); + std::string filename = tempDir + "imf_test_rational.exr"; + writeReadRational (filename.c_str()); + } + + generatedFunctions(); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testStandardAttributes.h b/IlmImfTest/testStandardAttributes.h new file mode 100644 index 0000000..4ca2e80 --- /dev/null +++ b/IlmImfTest/testStandardAttributes.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include + +void testStandardAttributes (const std::string &tempDir); + + + diff --git a/IlmImfTest/testTiledCompression.cpp b/IlmImfTest/testTiledCompression.cpp new file mode 100644 index 0000000..74554fb --- /dev/null +++ b/IlmImfTest/testTiledCompression.cpp @@ -0,0 +1,549 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" +#include "compareDwa.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "compareFloat.h" + +#include +#include +#include + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels1 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "only zeroes" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = 0; + ph[y][x] = 0; + pf[y][x] = 0; + } +} + + +void +fillPixels2 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "pattern 1" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = (x + y) & 1; + ph[y][x] = pi[y][x]; + pf[y][x] = pi[y][x]; + } +} + + +void +fillPixels3 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "pattern 2" << endl; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = x % 100 + 100 * (y % 100); + ph[y][x] = sin (double (x)) + sin (y * 0.5); + pf[y][x] = sin (double (y)) + sin (x * 0.5); + } +} + + +void +fillPixels4 (Array2D &pi, + Array2D &ph, + Array2D &pf, + int width, + int height) +{ + cout << "random bits" << endl; + + // + // Use of a union to extract the bit pattern from a float, as is + // done below, works only if int and float have the same size. + // + + assert (sizeof (int) == sizeof (float)); + + Rand48 rand; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + { + pi[y][x] = rand.nexti(); + + do + { + ph[y][x].setBits (rand.nexti()); + } + while (ph[y][x].isNan()); + + union {int i; float f;} u; + + do + { + u.i = rand.nexti(); + pf[y][x] = u.f; + } + while (pf[y][x] != pf[y][x]); + } +} + + +void +writeRead (const Array2D &pi1, + const Array2D &ph1, + const Array2D &pf1, + const char fileName[], + LineOrder lorder, + int width, + int height, + int xSize, + int ySize, + int xOffset, + int yOffset, + Compression comp) +{ + // + // Write the pixel data in pi1, ph1 and ph2 to an + // image file using the specified compression type. + // Read the pixel data back + // from the file and verify that the data did not + // change. + // + + cout << "compression " << comp << ":" << flush; + + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = lorder; + + hdr.channels().insert ("I", Channel (UINT)); + hdr.channels().insert ("H", Channel (HALF)); + hdr.channels().insert ("F", Channel (FLOAT)); + + hdr.setTileDescription(TileDescription(xSize, ySize, ONE_LEVEL)); + + { + FrameBuffer fb; + + fb.insert ("I", // name + Slice (UINT, // type + (char *) &pi1[-yOffset][-xOffset], // base + sizeof (pi1[0][0]), // xStride + sizeof (pi1[0][0]) * width) // yStride + ); + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph1[-yOffset][-xOffset], // base + sizeof (ph1[0][0]), // xStride + sizeof (ph1[0][0]) * width) // yStride + ); + + fb.insert ("F", // name + Slice (FLOAT, // type + (char *) &pf1[-yOffset][-xOffset], // base + sizeof (pf1[0][0]), // xStride + sizeof (pf1[0][0]) * width) // yStride + ); + + cout << " writing" << flush; + + remove (fileName); + TiledOutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + cout << ", reading (whole file)" << flush; + + TiledInputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D pi2 (h, w); + Array2D ph2 (h, w); + Array2D pf2 (h, w); + + FrameBuffer fb; + + fb.insert ("I", // name + Slice (UINT, // type + (char *) &pi2[-dwy][-dwx],// base + sizeof (pi2[0][0]), // xStride + sizeof (pi2[0][0]) * w) // yStride + ); + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph2[-dwy][-dwx],// base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * w) // yStride + ); + + fb.insert ("F", // name + Slice (FLOAT, // type + (char *) &pf2[-dwy][-dwx],// base + sizeof (pf2[0][0]), // xStride + sizeof (pf2[0][0]) * w) // yStride + ); + + in.setFrameBuffer (fb); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + + cout << ", comparing (whole file)" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION || + comp == DWAA_COMPRESSION || + comp == DWAB_COMPRESSION) + { + for (int y = 0; y < h; y += ySize) + { + for (int x = 0; x < w; x += xSize) + { + int nx = min (w - x, xSize); + int ny = min (h - y, ySize); + + Array2D ph3 (ny, nx); + Array2D ph4 (ny, nx); + + for (int y1 = 0; y1 < ny; ++y1) + { + for (int x1 = 0; x1 < nx; ++x1) + { + ph3[y1][x1] = ph1[y + y1][x + x1]; + ph4[y1][x1] = ph2[y + y1][x + x1]; + } + } + + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION) + { + compareB44 (nx, ny, ph3, ph4); + } + else if (comp == DWAA_COMPRESSION || + comp == DWAB_COMPRESSION) + { + //XXX compareDwa (nx, ny, ph3, ph4); + } + } + } + } + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + assert (pi1[y][x] == pi2[y][x]); + + if (comp != B44_COMPRESSION && + comp != B44A_COMPRESSION && + comp != DWAA_COMPRESSION && + comp != DWAB_COMPRESSION) + { + assert (ph1[y][x] == ph2[y][x]); + } + + assert (equivalent (pf1[y][x], pf2[y][x], comp)); + } + } + } + + { + cout << ", reading and comparing (tile-by-tile)" << flush; + + TiledInputFile in (fileName); + + Array2D pi2 (ySize, xSize); + Array2D ph2 (ySize, xSize); + Array2D pf2 (ySize, xSize); + + FrameBuffer fb; + + fb.insert ("I", // name + Slice (UINT, // type + (char *) &pi2[0][0], // base + sizeof (pi2[0][0]), // xStride + sizeof (pi2[0][0]) * xSize, // yStride + 1, // xSampling + 1, // ySampling + 0.0, // fillValue + true, // reuse tiles + true) + ); + + fb.insert ("H", // name + Slice (HALF, // type + (char *) &ph2[0][0], // base + sizeof (ph2[0][0]), // xStride + sizeof (ph2[0][0]) * xSize, // yStride + 1, // xSampling + 1, // ySampling + 0.0, // fillValue + true, // reuse tiles + true) + ); + + fb.insert ("F", // name + Slice (FLOAT, // type + (char *) &pf2[0][0], // base + sizeof (pf2[0][0]), // xStride + sizeof (pf2[0][0]) * xSize, // yStride + 1, // xSampling + 1, // ySampling + 0.0, // fillValue + true, // reuse tiles + true) + ); + + in.setFrameBuffer (fb); + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + + ChannelList::ConstIterator hi = hdr.channels().begin(); + ChannelList::ConstIterator ii = in.header().channels().begin(); + + while (hi != hdr.channels().end()) + { + assert (!strcmp (hi.name(), ii.name())); + assert (hi.channel().type == ii.channel().type); + assert (hi.channel().xSampling == ii.channel().xSampling); + assert (hi.channel().ySampling == ii.channel().ySampling); + + ++hi; + ++ii; + } + + assert (ii == in.header().channels().end()); + + for (int tileY = 0; tileY < in.numYTiles(); tileY++) + { + for (int tileX = 0; tileX < in.numXTiles(); ++tileX) + { + in.readTile (tileX, tileY); + + IMATH_NAMESPACE::Box2i win = in.dataWindowForTile (tileX, tileY); + int oX = win.min.x - xOffset; + int oY = win.min.y - yOffset; + + for (int y = 0, y2 = win.min.y; y < ySize && y2 <= win.max.y; + ++y, y2++) + { + for (int x = 0, x2 = win.min.x; + x < xSize && x2 <= win.max.x; ++x, x2++) + { + assert (pi1[oY + y][oX + x] == pi2[y][x]); + + if (comp != B44_COMPRESSION && + comp != B44A_COMPRESSION && + comp != DWAA_COMPRESSION && + comp != DWAB_COMPRESSION) + { + assert (ph1[oY + y][oX + x] == ph2[y][x]); + } + + assert (equivalent (pf1[oY + y][oX + x], + pf2[y][x], comp)); + } + } + } + } + } + + remove (fileName); + cout << endl; +} + + +void +writeRead (const std::string &tempDir, + const Array2D &pi, + const Array2D &ph, + const Array2D &pf, + int w, + int h, + int xs, + int ys, + int dx, + int dy) +{ + std::string filename = tempDir + "imf_test_comp.exr"; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + writeRead (pi, ph, pf, + filename.c_str(), + LineOrder (0), + w, h, + xs, ys, + dx, dy, + Compression (comp)); + } +} + +} // namespace + + +void +testTiledCompression (const std::string &tempDir) +{ + try + { + cout << "Testing pixel data types and data " + "window offsets for tiled files" << endl; + + const int W = 171; + const int H = 59; + const int DX[] = {-17, 0, 23}; + const int DY[] = {-29, 0, 13}; + const int XS = 15; + const int YS = 15; + + Array2D pi (H, W); + Array2D ph (H, W); + Array2D pf (H, W); + + // + // If the following assertion fails, new pixel types have + // been added to the Imf library; testing code for the new + // pixel types should be added to this file. + // + + assert (NUM_PIXELTYPES == 3); + + for (int i = 0; i < 3; ++i) + { + cout << endl << + "xOffset = " << DX[i] << ", " + "yOffset = " << DY[i] << endl; + + fillPixels1 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]); + + fillPixels2 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]); + + fillPixels3 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]); + + fillPixels4 (pi, ph, pf, W, H); + writeRead (tempDir, pi, ph, pf, W, H, XS, YS, DX[i], DY[i]); + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testTiledCompression.h b/IlmImfTest/testTiledCompression.h new file mode 100644 index 0000000..b631f40 --- /dev/null +++ b/IlmImfTest/testTiledCompression.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testTiledCompression (const std::string &tempDir); + diff --git a/IlmImfTest/testTiledCopyPixels.cpp b/IlmImfTest/testTiledCopyPixels.cpp new file mode 100644 index 0000000..c4e036f --- /dev/null +++ b/IlmImfTest/testTiledCopyPixels.cpp @@ -0,0 +1,524 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &ph, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + ph[y][x] = sin (double (x)) + sin (y * 0.5); +} + + +void +writeCopyReadONE (const char fileName1[], + const char fileName2[], + int width, + int height, + int xSize, + int ySize, + int xOffset, + int yOffset, + Compression comp, + LevelRoundingMode rmode) +{ + cout << "levelMode 0, " << "compression " << comp << + ", roundingMode " << rmode << + ", xOffset " << xOffset << ", yOffset " << yOffset << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, ONE_LEVEL, rmode)); + + Array2D ph1 (height, width); + fillPixels (ph1, width, height); + + { + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &ph1[-yOffset][-xOffset], + sizeof (ph1[0][0]), + sizeof (ph1[0][0]) * width)); + + cout << " writing" << flush; + + remove (fileName1); + TiledOutputFile out (fileName1, hdr); + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + cout << " copying" << flush; + + remove (fileName2); + InputFile in (fileName1); + TiledOutputFile out (fileName2, in.header()); + out.copyPixels (in); + } + + { + cout << " reading" << flush; + + TiledInputFile in1 (fileName1); + TiledInputFile in2 (fileName2); + + const Box2i &dw = in2.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dx = dw.min.x; + int dy = dw.min.y; + + Array2D ph1 (h, w); + Array2D ph2 (h, w); + + FrameBuffer fb1; + FrameBuffer fb2; + + fb1.insert ("H", + Slice (HALF, + (char *) &ph1[-dy][-dx], + sizeof (ph1[0][0]), + sizeof (ph1[0][0]) * w)); + + fb2.insert ("H", + Slice (HALF, + (char *) &ph2[-dy][-dx], + sizeof (ph2[0][0]), + sizeof (ph2[0][0]) * w)); + + in1.setFrameBuffer (fb1); + in1.readTiles (0, in1.numXTiles() - 1, 0, in1.numYTiles() - 1); + in2.setFrameBuffer (fb2); + in2.readTiles (0, in2.numXTiles() - 1, 0, in2.numYTiles() - 1); + + cout << " comparing" << flush; + + assert (in2.header().displayWindow() == hdr.displayWindow()); + assert (in2.header().dataWindow() == hdr.dataWindow()); + assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in2.header().lineOrder() == hdr.lineOrder()); + assert (in2.header().compression() == hdr.compression()); + assert (in2.header().channels() == hdr.channels()); + + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + assert (ph1[y][x] == ph2[y][x]); + } + + remove (fileName1); + remove (fileName2); + cout << endl; +} + + + +void +writeCopyReadMIP (const char fileName1[], + const char fileName2[], + int width, + int height, + int xSize, + int ySize, + int xOffset, + int yOffset, + Compression comp, + LevelRoundingMode rmode) +{ + cout << "levelMode 1, " << "compression " << comp << + ", roundingMode " << rmode << + ", xOffset " << xOffset << ", yOffset " << yOffset << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, MIPMAP_LEVELS, rmode)); + + Array < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName1); + TiledOutputFile out (fileName1, hdr); + + int numLevels = out.numLevels(); + levels.resizeErase (numLevels); + + for (int level = 0; level < out.numLevels(); ++level) + { + int levelWidth = out.levelWidth(level); + int levelHeight = out.levelHeight(level); + levels[level].resizeErase(levelHeight, levelWidth); + fillPixels (levels[level], levelWidth, levelHeight); + + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &levels[level][-yOffset][-xOffset], + sizeof (levels[level][0][0]), + sizeof (levels[level][0][0]) * levelWidth)); + + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles(level) - 1, + 0, out.numYTiles(level) - 1, level); + } + } + + { + cout << " copying" << flush; + + remove (fileName2); + InputFile in (fileName1); + TiledOutputFile out (fileName2, in.header()); + out.copyPixels (in); + } + + { + cout << " reading" << flush; + + TiledInputFile in1 (fileName1); + TiledInputFile in2 (fileName2); + + const Box2i &dw = in2.header().dataWindow(); + int dx = dw.min.x; + int dy = dw.min.y; + + int numLevels = in2.numLevels(); + Array < Array2D > levels1 (numLevels); + Array < Array2D > levels2 (numLevels); + + for (int level = 0; level < numLevels; ++level) + { + int levelWidth = in2.levelWidth(level); + int levelHeight = in2.levelHeight(level); + levels1[level].resizeErase(levelHeight, levelWidth); + levels2[level].resizeErase(levelHeight, levelWidth); + + FrameBuffer fb1; + FrameBuffer fb2; + + fb1.insert ("H", + Slice (HALF, + (char *) &levels1[level][-dy][-dx], + sizeof (levels1[level][0][0]), + sizeof (levels1[level][0][0]) * levelWidth)); + + fb2.insert ("H", + Slice (HALF, + (char *) &levels2[level][-dy][-dx], + sizeof (levels2[level][0][0]), + sizeof (levels2[level][0][0]) * levelWidth)); + + in1.setFrameBuffer (fb1); + in2.setFrameBuffer (fb2); + + in1.readTiles (0, in1.numXTiles(level) - 1, + 0, in1.numYTiles(level) - 1, level); + + in2.readTiles (0, in2.numXTiles(level) - 1, + 0, in2.numYTiles(level) - 1, level); + } + + cout << " comparing" << flush; + + assert (in2.header().displayWindow() == hdr.displayWindow()); + assert (in2.header().dataWindow() == hdr.dataWindow()); + assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in2.header().lineOrder() == hdr.lineOrder()); + assert (in2.header().compression() == hdr.compression()); + assert (in2.header().channels() == hdr.channels()); + + for (int l = 0; l < numLevels; ++l) + for (int y = 0; y < in1.levelHeight(l); ++y) + for (int x = 0; x < in1.levelWidth(l); ++x) + { + assert ((levels2[l])[y][x] == (levels1[l])[y][x]); + + if (comp != B44_COMPRESSION && comp != B44A_COMPRESSION) + assert ((levels2[l])[y][x] == (levels[l])[y][x]); + } + } + + remove (fileName1); + remove (fileName2); + cout << endl; +} + + +void +writeCopyReadRIP (const char fileName1[], + const char fileName2[], + int width, + int height, + int xSize, + int ySize, + int xOffset, + int yOffset, + Compression comp, + LevelRoundingMode rmode) +{ + cout << "levelMode 2, " << "compression " << comp << + ", roundingMode " << rmode << + ", xOffset " << xOffset << ", yOffset " << yOffset << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (xOffset, yOffset), // data window + V2i (xOffset + width - 1, yOffset + height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, RIPMAP_LEVELS, rmode)); + + Array2D < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName1); + TiledOutputFile out (fileName1, hdr); + + levels.resizeErase (out.numYLevels(), out.numXLevels()); + + for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) + { + for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) + { + int levelWidth = out.levelWidth(xlevel); + int levelHeight = out.levelHeight(ylevel); + levels[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + fillPixels (levels[ylevel][xlevel], levelWidth, levelHeight); + + FrameBuffer fb; + fb.insert ("H", + Slice (HALF, + (char *) &levels[ylevel][xlevel][-yOffset][-xOffset], + sizeof (levels[ylevel][xlevel][0][0]), + sizeof (levels[ylevel][xlevel][0][0]) * levelWidth)); + + out.setFrameBuffer (fb); + + out.writeTiles (0, out.numXTiles(xlevel) - 1, + 0, out.numYTiles(ylevel) - 1, xlevel, ylevel); + } + } + } + + { + cout << " copying" << flush; + + remove (fileName2); + InputFile in (fileName1); + TiledOutputFile out (fileName2, in.header()); + out.copyPixels (in); + } + + { + cout << " reading" << flush; + + TiledInputFile in1 (fileName1); + TiledInputFile in2 (fileName2); + + const Box2i &dw = in2.header().dataWindow(); + int dx = dw.min.x; + int dy = dw.min.y; + + int numXLevels = in2.numXLevels(); + int numYLevels = in2.numYLevels(); + Array2D < Array2D > levels1 (numYLevels, numXLevels); + Array2D < Array2D > levels2 (numYLevels, numXLevels); + + for (int ylevel = 0; ylevel < numYLevels; ++ylevel) + { + for (int xlevel = 0; xlevel < numXLevels; ++xlevel) + { + int levelWidth = in2.levelWidth(xlevel); + int levelHeight = in2.levelHeight(ylevel); + levels1[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + + FrameBuffer fb1; + FrameBuffer fb2; + + fb1.insert ("H", + Slice (HALF, + (char *) &levels1[ylevel][xlevel][-dy][-dx], + sizeof (levels1[ylevel][xlevel][0][0]), + sizeof (levels1[ylevel][xlevel][0][0]) * levelWidth)); + + fb2.insert ("H", + Slice (HALF, + (char *) &levels2[ylevel][xlevel][-dy][-dx], + sizeof (levels2[ylevel][xlevel][0][0]), + sizeof (levels2[ylevel][xlevel][0][0]) * levelWidth)); + + in1.setFrameBuffer (fb1); + in2.setFrameBuffer (fb2); + + in1.readTiles (0, in1.numXTiles(xlevel) - 1, + 0, in1.numYTiles(ylevel) - 1, + xlevel, ylevel); + + in2.readTiles (0, in2.numXTiles(xlevel) - 1, + 0, in2.numYTiles(ylevel) - 1, + xlevel, ylevel); + } + } + + cout << " comparing" << flush; + + assert (in2.header().displayWindow() == hdr.displayWindow()); + assert (in2.header().dataWindow() == hdr.dataWindow()); + assert (in2.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in2.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in2.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in2.header().lineOrder() == hdr.lineOrder()); + assert (in2.header().compression() == hdr.compression()); + assert (in2.header().channels() == hdr.channels()); + + for (int ly = 0; ly < numYLevels; ++ly) + for (int lx = 0; lx < numXLevels; ++lx) + for (int y = 0; y < in1.levelHeight(ly); ++y) + for (int x = 0; x < in1.levelWidth(lx); ++x) + { + assert ((levels2[ly][lx])[y][x] == + (levels1[ly][lx])[y][x]); + + if (comp != B44_COMPRESSION && comp != B44A_COMPRESSION) + assert ((levels2[ly][lx])[y][x] == + (levels[ly][lx])[y][x]); + + } + } + + remove (fileName1); + remove (fileName2); + cout << endl; +} + + +void +writeCopyRead (const std::string &tempDir, int w, int h, int xs, int ys, int dx, int dy) +{ + std::string filename1 = tempDir + "imf_test_copy1.exr"; + std::string filename2 = tempDir + "imf_test_copy2.exr"; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode) + { + writeCopyReadONE (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy, + Compression (comp), LevelRoundingMode (rmode)); + + writeCopyReadMIP (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy, + Compression (comp), LevelRoundingMode (rmode)); + + writeCopyReadRIP (filename1.c_str(), filename2.c_str(), w, h, xs, ys, dx, dy, + Compression (comp), LevelRoundingMode (rmode)); + } + } +} + +} // namespace + + +void +testTiledCopyPixels (const std::string &tempDir) +{ + try + { + cout << "Testing fast pixel copying for tiled files" << endl; + + const int W = 171; + const int H = 259; + const int DX = 17; + const int DY = 29; + const int YS = 55; + + writeCopyRead (tempDir, W, H, DX, YS, 0, 0); + writeCopyRead (tempDir, W, H, DX, YS, 0, DY); + writeCopyRead (tempDir, W, H, DX, YS, DX, 0); + writeCopyRead (tempDir, W, H, DX, YS, DX, DY); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testTiledCopyPixels.h b/IlmImfTest/testTiledCopyPixels.h new file mode 100644 index 0000000..0acbbe9 --- /dev/null +++ b/IlmImfTest/testTiledCopyPixels.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testTiledCopyPixels (const std::string &tempDir); + diff --git a/IlmImfTest/testTiledLineOrder.cpp b/IlmImfTest/testTiledLineOrder.cpp new file mode 100644 index 0000000..5779f9f --- /dev/null +++ b/IlmImfTest/testTiledLineOrder.cpp @@ -0,0 +1,666 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &ph, int width, int height) +{ + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + ph[y][x] = sin (double (x)) + sin (y * 0.5); +} + + +void +writeCopyReadONE (const char fileName[], + int width, + int height, + LineOrder lorder, + LevelRoundingMode rmode, + int xSize, + int ySize, + Compression comp, + bool triggerBuffering, + bool triggerSeeks) +{ + cout << "LineOrder " << lorder << ", buffer " << triggerBuffering << + ", seek " << triggerSeeks << ", levelMode 0, " << + "roundingMode " << rmode << ", " + "compression " << comp << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (0, 0), // data window + V2i (width - 1, height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, ONE_LEVEL, rmode)); + + Array2D ph1 (height, width); + fillPixels (ph1, width, height); + + { + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &ph1[0][0], + sizeof (ph1[0][0]), + sizeof (ph1[0][0]) * width)); + + cout << " writing" << flush; + + remove (fileName); + TiledOutputFile out (fileName, hdr); + out.setFrameBuffer (fb); + + int i; + + Rand32 rand1 = Rand32(); + std::vector tileYs = std::vector(out.numYTiles()); + std::vector tileXs = std::vector(out.numXTiles()); + for (i = 0; i < out.numYTiles(); i++) + { + if (lorder == DECREASING_Y) + tileYs[out.numYTiles()-1-i] = i; + else + tileYs[i] = i; + } + + for (i = 0; i < out.numXTiles(); i++) + { + tileXs[i] = i; + } + + if (triggerBuffering) + { + // shuffle the tile orders + for (i = 0; i < out.numYTiles(); i++) + std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles()-1) + 0.5)]); + + for (i = 0; i < out.numXTiles(); i++) + std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles()-1) + 0.5)]); + } + + for (int tileY = 0; tileY < out.numYTiles(); tileY++) + for (int tileX = 0; tileX < out.numXTiles(); tileX++) + out.writeTile (tileXs[tileX], tileYs[tileY]); + } + + { + cout << " reading" << flush; + + TiledInputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D ph2 (h, w); + + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &ph2[-dwy][-dwx], + sizeof (ph2[0][0]), + sizeof (ph2[0][0]) * w)); + + in.setFrameBuffer (fb); + + int startTileY, endTileY; + int dy; + + if ((lorder == DECREASING_Y && !triggerSeeks) || + (lorder == INCREASING_Y && triggerSeeks) || + (lorder == RANDOM_Y && triggerSeeks)) + { + startTileY = in.numYTiles() - 1; + endTileY = -1; + + dy = -1; + } + else + { + startTileY = 0; + endTileY = in.numYTiles(); + + dy = 1; + } + + for (int tileY = startTileY; tileY != endTileY; tileY += dy) + for (int tileX = 0; tileX < in.numXTiles(); ++tileX) + in.readTile (tileX, tileY); + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + assert (in.header().channels() == hdr.channels()); + + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + assert (ph1[y][x] == ph2[y][x]); + } + + remove (fileName); + cout << endl; +} + + + +void +writeCopyReadMIP (const char fileName[], + int width, + int height, + LineOrder lorder, + LevelRoundingMode rmode, + int xSize, + int ySize, + Compression comp, + bool triggerBuffering, + bool triggerSeeks) +{ + cout << "LineOrder " << lorder << ", buffer " << triggerBuffering << + ", seek " << triggerSeeks << ", levelMode 1, " << + "roundingMode " << rmode << ", " + "compression " << comp << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (0, 0), // data window + V2i (width - 1, height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, MIPMAP_LEVELS, rmode)); + + Array < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName); + TiledOutputFile out (fileName, hdr); + + int numLevels = out.numLevels(); + levels.resizeErase (numLevels); + + int i; + + Rand32 rand1 = Rand32(); + std::vector shuffled_levels = std::vector(numLevels); + + for (i = 0; i < numLevels; i++) + shuffled_levels[i] = i; + + if (triggerBuffering) + // shuffle the level order + for (i = 0; i < numLevels; i++) + std::swap(shuffled_levels[i], shuffled_levels[int(rand1.nextf(i,numLevels-1) + 0.5)]); + + for (int level = 0; level < numLevels; ++level) + { + const int slevel = shuffled_levels[level]; + + int levelWidth = out.levelWidth(slevel); + int levelHeight = out.levelHeight(slevel); + levels[slevel].resizeErase(levelHeight, levelWidth); + fillPixels (levels[slevel], levelWidth, levelHeight); + + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &levels[slevel][0][0], + sizeof (levels[slevel][0][0]), + sizeof (levels[slevel][0][0]) * levelWidth)); + + out.setFrameBuffer (fb); + + std::vector tileYs = std::vector(out.numYTiles(slevel)); + std::vector tileXs = std::vector(out.numXTiles(slevel)); + for (i = 0; i < out.numYTiles(slevel); i++) + { + if (lorder == DECREASING_Y) + tileYs[out.numYTiles(slevel)-1-i] = i; + else + tileYs[i] = i; + } + + for (i = 0; i < out.numXTiles(slevel); i++) + tileXs[i] = i; + + if (triggerBuffering) + { + // shuffle the tile orders + for (i = 0; i < out.numYTiles(slevel); i++) + std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles(slevel)-1) + 0.5)]); + + for (i = 0; i < out.numXTiles(slevel); i++) + std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles(slevel)-1) + 0.5)]); + } + + for (int tileY = 0; tileY < out.numYTiles(slevel); ++tileY) + for (int tileX = 0; tileX < out.numXTiles(slevel); ++tileX) + out.writeTile (tileXs[tileX], tileYs[tileY], slevel); + } + } + + { + cout << " reading" << flush; + + TiledInputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numLevels = in.numLevels(); + Array < Array2D > levels2 (numLevels); + + int startTileY, endTileY; + int dy; + + for (int level = 0; level < in.numLevels(); ++level) + { + int levelWidth = in.levelWidth(level); + int levelHeight = in.levelHeight(level); + levels2[level].resizeErase(levelHeight, levelWidth); + + FrameBuffer fb; + + fb.insert ("H", + Slice (HALF, + (char *) &levels2[level][-dwy][-dwx], + sizeof (levels2[level][0][0]), + sizeof (levels2[level][0][0]) * levelWidth)); + + in.setFrameBuffer (fb); + + if ((lorder == DECREASING_Y && !triggerSeeks) || + (lorder == INCREASING_Y && triggerSeeks) || + (lorder == RANDOM_Y && triggerSeeks)) + { + startTileY = in.numYTiles(level) - 1; + endTileY = -1; + + dy = -1; + } + else + { + startTileY = 0; + endTileY = in.numYTiles(level); + + dy = 1; + } + + for (int tileY = startTileY; tileY != endTileY; tileY += dy) + for (int tileX = 0; tileX < in.numXTiles (level); ++tileX) + in.readTile (tileX, tileY, level); + } + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + assert (in.header().channels() == hdr.channels()); + + for (int l = 0; l < numLevels; ++l) + for (int y = 0; y < in.levelHeight(l); ++y) + for (int x = 0; x < in.levelWidth(l); ++x) + assert ((levels2[l])[y][x] == (levels[l])[y][x]); + } + + remove (fileName); + cout << endl; +} + + +void +writeCopyReadRIP (const char fileName[], + int width, + int height, + LineOrder lorder, + LevelRoundingMode rmode, + int xSize, + int ySize, + Compression comp, + bool triggerBuffering, + bool triggerSeeks) +{ + cout << "LineOrder " << lorder << ", buffer " << triggerBuffering << + ", seek " << triggerSeeks << ", levelMode 2, " << + "roundingMode " << rmode << ", " + "compression " << comp << endl; + + Header hdr ((Box2i (V2i (0, 0), // display window + V2i (width - 1, height -1))), + (Box2i (V2i (0, 0), // data window + V2i (width - 1, height - 1)))); + + hdr.compression() = comp; + hdr.lineOrder() = INCREASING_Y; + hdr.channels().insert ("H", Channel (HALF, 1, 1)); + + hdr.setTileDescription(TileDescription(xSize, ySize, RIPMAP_LEVELS, rmode)); + + Array2D < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName); + TiledOutputFile out (fileName, hdr); + + levels.resizeErase (out.numYLevels(), out.numXLevels()); + + int i; + + Rand32 rand1 = Rand32(); + std::vector shuffled_xLevels = std::vector(out.numXLevels()); + std::vector shuffled_yLevels = std::vector(out.numYLevels()); + + for (i = 0; i < out.numXLevels(); i++) + shuffled_xLevels[i] = i; + + for (i = 0; i < out.numYLevels(); i++) + shuffled_yLevels[i] = i; + + if (triggerBuffering) + { + // shuffle the level orders + for (i = 0; i < out.numXLevels(); i++) + std::swap(shuffled_xLevels[i], shuffled_xLevels[int(rand1.nextf(i,out.numXLevels()-1) + 0.5)]); + + for (i = 0; i < out.numYLevels(); i++) + std::swap(shuffled_yLevels[i], shuffled_yLevels[int(rand1.nextf(i,out.numYLevels()-1) + 0.5)]); + } + + for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) + { + const int sylevel = shuffled_yLevels[ylevel]; + + std::vector tileYs = std::vector(out.numYTiles(sylevel)); + for (i = 0; i < out.numYTiles(sylevel); i++) + { + if (lorder == DECREASING_Y) + tileYs[out.numYTiles(sylevel)-1-i] = i; + else + tileYs[i] = i; + } + + if (triggerBuffering) + // shuffle the tile orders + for (i = 0; i < out.numYTiles(sylevel); i++) + std::swap(tileYs[i], tileYs[int(rand1.nextf(i,out.numYTiles(sylevel)-1) + 0.5)]); + + for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) + { + const int sxlevel = shuffled_xLevels[xlevel]; + + int levelWidth = out.levelWidth(sxlevel); + int levelHeight = out.levelHeight(sylevel); + levels[sylevel][sxlevel].resizeErase(levelHeight, levelWidth); + fillPixels (levels[sylevel][sxlevel], levelWidth, levelHeight); + + FrameBuffer fb; + fb.insert ("H", + Slice (HALF, + (char *) &levels[sylevel][sxlevel][0][0], + sizeof (levels[sylevel][sxlevel][0][0]), + sizeof (levels[sylevel][sxlevel][0][0]) * levelWidth)); + + out.setFrameBuffer (fb); + + std::vector tileXs = std::vector(out.numXTiles(sxlevel)); + for (i = 0; i < out.numXTiles(sxlevel); i++) + tileXs[i] = i; + + if (triggerBuffering) + // shuffle the tile orders + for (i = 0; i < out.numXTiles(sxlevel); i++) + std::swap(tileXs[i], tileXs[int(rand1.nextf(i,out.numXTiles(sxlevel)-1) + 0.5)]); + + for (int tileY = 0; tileY < out.numYTiles(sylevel); ++tileY) + for (int tileX = 0; tileX < out.numXTiles(sxlevel); ++tileX) + out.writeTile(tileXs[tileX], tileYs[tileY], sxlevel, sylevel); + } + } + } + + { + cout << " reading" << flush; + + TiledInputFile in (fileName); + + const Box2i &dw = in.header().dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numXLevels = in.numXLevels(); + int numYLevels = in.numYLevels(); + Array2D < Array2D > levels2 (numYLevels, numXLevels); + + int startTileY, endTileY; + int dy; + + for (int ylevel = 0; ylevel < in.numYLevels(); ++ylevel) + { + if ((lorder == DECREASING_Y && !triggerSeeks) || + (lorder == INCREASING_Y && triggerSeeks) || + (lorder == RANDOM_Y && triggerSeeks)) + { + startTileY = in.numYTiles(ylevel) - 1; + endTileY = -1; + + dy = -1; + } + else + { + startTileY = 0; + endTileY = in.numYTiles(ylevel); + + dy = 1; + } + + for (int xlevel = 0; xlevel < in.numXLevels(); ++xlevel) + { + int levelWidth = in.levelWidth(xlevel); + int levelHeight = in.levelHeight(ylevel); + levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + + FrameBuffer fb; + fb.insert ("H", + Slice (HALF, + (char *) &levels2[ylevel][xlevel][-dwy][-dwx], + sizeof (levels2[ylevel][xlevel][0][0]), + sizeof (levels2[ylevel][xlevel][0][0]) * levelWidth)); + + in.setFrameBuffer (fb); + + for (int tileY = startTileY; tileY != endTileY; tileY += dy) + for (int tileX = 0; tileX < in.numXTiles (xlevel); ++tileX) + in.readTile (tileX, tileY, xlevel, ylevel); + } + } + + cout << " comparing" << flush; + + assert (in.header().displayWindow() == hdr.displayWindow()); + assert (in.header().dataWindow() == hdr.dataWindow()); + assert (in.header().pixelAspectRatio() == hdr.pixelAspectRatio()); + assert (in.header().screenWindowCenter() == hdr.screenWindowCenter()); + assert (in.header().screenWindowWidth() == hdr.screenWindowWidth()); + assert (in.header().lineOrder() == hdr.lineOrder()); + assert (in.header().compression() == hdr.compression()); + assert (in.header().channels() == hdr.channels()); + + for (int ly = 0; ly < numYLevels; ++ly) + for (int lx = 0; lx < numXLevels; ++lx) + for (int y = 0; y < in.levelHeight(ly); ++y) + for (int x = 0; x < in.levelWidth(lx); ++x) + assert ((levels2[ly][lx])[y][x] == + (levels[ly][lx])[y][x]); + } + + remove (fileName); + cout << endl; +} + + +void +writeCopyRead (const std::string &tempDir, int w, int h, int xs, int ys) +{ + std::string filename = tempDir + "imf_test_copy.exr"; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION) + { + continue; + } + + for (int lorder = 0; lorder < RANDOM_Y; ++lorder) + { + for (int rmode = 0; rmode < NUM_ROUNDINGMODES; ++rmode) + { + for (int tb = 0; tb <= 1; ++tb) + { + for (int ts = 0; ts <= 1; ++ts) + { + writeCopyReadONE (filename.c_str(), w, h, + (LineOrder)lorder, + (LevelRoundingMode) rmode, + xs, ys, + Compression (comp), + (bool)tb, (bool)ts); + + writeCopyReadMIP (filename.c_str(), w, h, + (LineOrder)lorder, + (LevelRoundingMode) rmode, + xs, ys, + Compression (comp), + (bool)tb, (bool)ts); + + writeCopyReadRIP (filename.c_str(), w, h, + (LineOrder)lorder, + (LevelRoundingMode) rmode, + xs, ys, + Compression (comp), + (bool)tb, (bool)ts); + } + } + } + } + } +} + +} // namespace + + +void +testTiledLineOrder (const std::string &tempDir) +{ + try + { + cout << "Testing line orders for tiled files and " + "buffered/unbuffered tile writes" << endl; + + const int W = 171; + const int H = 259; + const int XS = 55; + const int YS = 55; + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + writeCopyRead (tempDir, W, H, XS, YS); + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testTiledLineOrder.h b/IlmImfTest/testTiledLineOrder.h new file mode 100644 index 0000000..cb51f79 --- /dev/null +++ b/IlmImfTest/testTiledLineOrder.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testTiledLineOrder (const std::string &tempDir); + diff --git a/IlmImfTest/testTiledRgba.cpp b/IlmImfTest/testTiledRgba.cpp new file mode 100644 index 0000000..455479f --- /dev/null +++ b/IlmImfTest/testTiledRgba.cpp @@ -0,0 +1,941 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "compareB44.h" +#include "compareDwa.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +fillPixels (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.5 + 0.5 * sin (0.1 * x + 0.1 * y); + p.g = 0.5 + 0.5 * sin (0.1 * x + 0.2 * y); + p.b = 0.5 + 0.5 * sin (0.1 * x + 0.3 * y); + p.a = (p.r + p.b + p.g) / 3.0; + } + } +} + + +void +writeReadRGBAONE (const char fileName[], + int width, + int height, + RgbaChannels channels, + Compression comp, + int xSize, int ySize) +{ + cout << "levelMode 0" << + ", compression " << comp << + ", tileSize " << xSize << "x" << ySize << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array2D p1 (height, width); + + { + cout << " writing" << flush; + + remove (fileName); + TiledRgbaOutputFile out (fileName, header, channels, + xSize, ySize, ONE_LEVEL); + + fillPixels (p1, width, height); + out.setFrameBuffer (&p1[0][0], 1, width); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + cout << " reading" << flush; + + TiledRgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + int dwx = dw.min.x; + int dwy = dw.min.y; + + Array2D p2 (h, w); + in.setFrameBuffer (&p2[-dwy][-dwx], 1, w); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + cout << " comparing" << endl << flush; + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION || + comp == DWAA_COMPRESSION || + comp == DWAB_COMPRESSION) + { + for (int y = 0; y < h; y += ySize) + { + for (int x = 0; x < w; x += xSize) + { + int nx = min (w - x, xSize); + int ny = min (h - y, ySize); + + Array2D p3 (ny, nx); + Array2D p4 (ny, nx); + + for (int y1 = 0; y1 < ny; ++y1) + { + for (int x1 = 0; x1 < nx; ++x1) + { + p3[y1][x1] = p1[y + y1][x + x1]; + p4[y1][x1] = p2[y + y1][x + x1]; + } + } + + if (comp == B44_COMPRESSION || + comp == B44A_COMPRESSION) + { + compareB44 (nx, ny, p3, p4, channels); + } + else if (comp == DWAA_COMPRESSION || + comp == DWAB_COMPRESSION) + { + compareDwa (nx, ny, p3, p4, channels); + } + } + } + } + else + { + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + if (channels & WRITE_R) + assert (p2[y][x].r == p1[y][x].r); + else + assert (p2[y][x].r == 0); + + if (channels & WRITE_G) + assert (p2[y][x].g == p1[y][x].g); + else + assert (p2[y][x].g == 0); + + if (channels & WRITE_B) + assert (p2[y][x].b == p1[y][x].b); + else + assert (p2[y][x].b == 0); + + if (channels & WRITE_A) + assert (p2[y][x].a == p1[y][x].a); + else + assert (p2[y][x].a == 1); + } + } + } + } + + remove (fileName); +} + + +void +writeReadRGBAMIP (const char fileName[], + int width, + int height, + RgbaChannels channels, + Compression comp, + int xSize, int ySize) +{ + cout << "levelMode 1" << + ", compression " << comp << + ", tileSize " << xSize << "x" << ySize << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName); + TiledRgbaOutputFile out (fileName, header, channels, + xSize, ySize, MIPMAP_LEVELS, ROUND_DOWN); + + int numLevels = out.numLevels(); + levels.resizeErase (numLevels); + + for (int level = 0; level < out.numLevels(); ++level) + { + int levelWidth = out.levelWidth(level); + int levelHeight = out.levelHeight(level); + levels[level].resizeErase(levelHeight, levelWidth); + fillPixels (levels[level], levelWidth, levelHeight); + + out.setFrameBuffer (&(levels[level])[0][0], 1, levelWidth); + out.writeTiles (0, out.numXTiles(level) - 1, + 0, out.numYTiles(level) - 1, level); + } + } + + { + cout << " reading" << flush; + + TiledRgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numLevels = in.numLevels(); + Array < Array2D > levels2 (numLevels); + + for (int level = 0; level < numLevels; ++level) + { + int levelWidth = in.levelWidth(level); + int levelHeight = in.levelHeight(level); + levels2[level].resizeErase(levelHeight, levelWidth); + + in.setFrameBuffer (&(levels2[level])[-dwy][-dwx], 1, levelWidth); + in.readTiles (0, in.numXTiles(level) - 1, + 0, in.numYTiles(level) - 1, level); + } + + cout << " comparing" << endl << flush; + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + for (int l = 0; l < numLevels; ++l) + { + for (int y = 0; y < in.levelHeight(l); ++y) + { + for (int x = 0; x < in.levelWidth(l); ++x) + { + if (channels & WRITE_R) + assert ((levels2[l])[y][x].r == (levels[l])[y][x].r); + else + assert ((levels2[l])[y][x].r == 0); + + if (channels & WRITE_G) + assert ((levels2[l])[y][x].g == (levels[l])[y][x].g); + else + assert ((levels2[l])[y][x].g == 0); + + if (channels & WRITE_B) + assert ((levels2[l])[y][x].b == (levels[l])[y][x].b); + else + assert ((levels2[l])[y][x].b == 0); + + if (channels & WRITE_A) + assert ((levels2[l])[y][x].a == (levels[l])[y][x].a); + else + assert ((levels2[l])[y][x].a == 1); + } + } + } + } + + remove (fileName); +} + + +void +writeReadRGBARIP (const char fileName[], + int width, + int height, + RgbaChannels channels, + Compression comp, + int xSize, int ySize) +{ + cout << "levelMode 2" << + ", compression " << comp << + ", tileSize " << xSize << "x" << ySize << endl; + + Header header (width, height); + header.lineOrder() = INCREASING_Y; + header.compression() = comp; + + Array2D < Array2D > levels; + + { + cout << " writing" << flush; + + remove (fileName); + TiledRgbaOutputFile out (fileName, header, channels, + xSize, ySize, RIPMAP_LEVELS, ROUND_UP); + + levels.resizeErase (out.numYLevels(), out.numXLevels()); + + for (int ylevel = 0; ylevel < out.numYLevels(); ++ylevel) + { + for (int xlevel = 0; xlevel < out.numXLevels(); ++xlevel) + { + int levelWidth = out.levelWidth(xlevel); + int levelHeight = out.levelHeight(ylevel); + levels[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + fillPixels (levels[ylevel][xlevel], levelWidth, levelHeight); + + out.setFrameBuffer (&(levels[ylevel][xlevel])[0][0], 1, + levelWidth); + out.writeTiles (0, out.numXTiles(xlevel) - 1, + 0, out.numYTiles(ylevel) - 1, xlevel, ylevel); + } + } + } + + { + cout << " reading" << flush; + + TiledRgbaInputFile in (fileName); + const Box2i &dw = in.dataWindow(); + int dwx = dw.min.x; + int dwy = dw.min.y; + + int numXLevels = in.numXLevels(); + int numYLevels = in.numYLevels(); + Array2D < Array2D > levels2 (numYLevels, numXLevels); + + for (int ylevel = 0; ylevel < numYLevels; ++ylevel) + { + for (int xlevel = 0; xlevel < numXLevels; ++xlevel) + { + int levelWidth = in.levelWidth(xlevel); + int levelHeight = in.levelHeight(ylevel); + levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth); + in.setFrameBuffer (&(levels2[ylevel][xlevel])[-dwy][-dwx], 1, + levelWidth); + + in.readTiles (0, in.numXTiles(xlevel) - 1, + 0, in.numYTiles(ylevel) - 1, xlevel, ylevel); + } + } + + cout << " comparing" << endl << flush; + + assert (in.displayWindow() == header.displayWindow()); + assert (in.dataWindow() == header.dataWindow()); + assert (in.pixelAspectRatio() == header.pixelAspectRatio()); + assert (in.screenWindowCenter() == header.screenWindowCenter()); + assert (in.screenWindowWidth() == header.screenWindowWidth()); + assert (in.lineOrder() == header.lineOrder()); + assert (in.compression() == header.compression()); + assert (in.channels() == channels); + + for (int ly = 0; ly < numYLevels; ++ly) + { + for (int lx = 0; lx < numXLevels; ++lx) + { + for (int y = 0; y < in.levelHeight(ly); ++y) + { + for (int x = 0; x < in.levelWidth(lx); ++x) + { + if (channels & WRITE_R) + assert ((levels2[ly][lx])[y][x].r == + (levels[ly][lx])[y][x].r); + else + assert ((levels2[ly][lx])[y][x].r == 0); + + if (channels & WRITE_G) + assert ((levels2[ly][lx])[y][x].g == + (levels[ly][lx])[y][x].g); + else + assert ((levels2[ly][lx])[y][x].g == 0); + + if (channels & WRITE_B) + assert ((levels2[ly][lx])[y][x].b == + (levels[ly][lx])[y][x].b); + else + assert ((levels2[ly][lx])[y][x].b == 0); + + if (channels & WRITE_A) + assert ((levels2[ly][lx])[y][x].a == + (levels[ly][lx])[y][x].a); + else + assert ((levels2[ly][lx])[y][x].a == 1); + } + } + } + } + } + + remove (fileName); +} + + +void +writeRead (const std::string &tempDir, + int W, + int H, + Compression comp, + int xSize, + int ySize) +{ + std::string filename = tempDir + "imf_test_tiled_rgba.exr"; + + writeReadRGBAONE (filename.c_str(), W, H, WRITE_RGBA, comp, xSize, ySize); + + if (comp != B44_COMPRESSION && + comp != B44A_COMPRESSION && + comp != DWAA_COMPRESSION && + comp != DWAB_COMPRESSION) + { + // + // Skip mipmaps and ripmaps with B44 or DWA compression; writing + // an image with a single resolution level, above, should be enough + // to verify that B44 and DWA compression work with tiled files. + // + + writeReadRGBAMIP + (filename.c_str(), W, H, WRITE_RGBA, comp, xSize, ySize); + + writeReadRGBARIP + (filename.c_str(), W, H, WRITE_RGBA, comp, xSize, ySize); + } +} + + +void +writeReadIncomplete (const std::string &tempDir) +{ + cout << "\nfile with missing and broken tiles" << endl; + + std::string fileName = tempDir + "imf_test_tiled_incomplete.exr"; + + // + // Write a file where every other tile is missing or broken. + // Then try read the file and verify that all existing good + // tiles can actually be read. + // + + const int width = 400; + const int height = 300; + const int tileXSize = 30; + const int tileYSize = 40; + + Array2D p1 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p1[y][x] = Rgba (x % 5, x % 17, y % 23, y % 29); + + { + cout << "writing" << endl; + + remove (fileName.c_str()); + + Header header (width, height); + header.lineOrder() = RANDOM_Y; + + TiledRgbaOutputFile out (fileName.c_str(), header, WRITE_RGBA, + tileXSize, tileYSize, ONE_LEVEL); + + out.setFrameBuffer (&p1[0][0], 1, width); + + out.writeTile (0, 0); + + for (int tileY = 0; tileY < out.numYTiles(); ++tileY) + for (int tileX = 0; tileX < out.numXTiles(); ++tileX) + if ((tileX + tileY) & 1) + out.writeTile (tileX, tileY); + + out.writeTile (2, 0); + + out.breakTile (0, 0, 0, 0, 25, 10, 0xff); // destroy tiles + out.breakTile (2, 0, 0, 0, 25, 10, 0xff); // (0,0) and (2,0) + } + + { + Array2D p2 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p2[y][x] = Rgba (-1, -1, -1, -1); + + cout << "reading one tile at a time," << flush; + + TiledRgbaInputFile in (fileName.c_str()); + const Box2i &dw = in.dataWindow(); + + assert (dw.max.x - dw.min.x + 1 == width); + assert (dw.max.y - dw.min.y + 1 == height); + assert (dw.min.x == 0); + assert (dw.min.y == 0); + + in.setFrameBuffer (&p2[0][0], 1, width); + + for (int tileY = 0; tileY < in.numYTiles(); ++tileY) + { + for (int tileX = 0; tileX < in.numXTiles(); ++tileX) + { + bool tilePresent = true; + bool tileBroken = false; + + try + { + in.readTile (tileX, tileY); + } + catch (const IEX_NAMESPACE::InputExc &) + { + tilePresent = false; // tile is missing + } + catch (const IEX_NAMESPACE::IoExc &) + { + tileBroken = true; // tile cannot be decoded + } + + assert (tileBroken || (tilePresent == ((tileX + tileY) & 1))); + } + } + + cout << " comparing" << endl << flush; + + for (int y = 0; y < height; ++y) + { + int tileY = y / tileYSize; + + for (int x = 0; x < width; ++x) + { + int tileX = x / tileXSize; + + const Rgba &s = p1[y][x]; + const Rgba &t = p2[y][x]; + + if ((tileX + tileY) & 1) + { + assert (t.r == s.r && + t.g == s.g && + t.b == s.b && + t.a == s.a); + } + else + { + assert (t.r == -1 && + t.g == -1 && + t.b == -1 && + t.a == -1); + } + } + } + } + + { + Array2D p2 (height, width); + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + p2[y][x] = Rgba (-1, -1, -1, -1); + + cout << "reading multiple tiles at a time," << flush; + + TiledRgbaInputFile in (fileName.c_str()); + const Box2i &dw = in.dataWindow(); + + assert (dw.max.x - dw.min.x + 1 == width); + assert (dw.max.y - dw.min.y + 1 == height); + assert (dw.min.x == 0); + assert (dw.min.y == 0); + + in.setFrameBuffer (&p2[0][0], 1, width); + + for (int tileY = 0; tileY < in.numYTiles(); ++tileY) + { + bool tilesMissing = false; + bool tilesBroken = false; + + try + { + in.readTiles (0, in.numXTiles() - 1, tileY, tileY); + } + catch (const IEX_NAMESPACE::InputExc &) + { + tilesMissing = true; + } + catch (const IEX_NAMESPACE::IoExc &) + { + tilesBroken = true; + } + + assert (tilesMissing || tilesBroken); + } + + cout << " comparing" << endl << flush; + + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + const Rgba &s = p1[y][x]; + const Rgba &t = p2[y][x]; + + assert ((t.r == -1 && t.g == -1 && t.b == -1 && t.a == -1) || + (t.r == s.r && t.g == s.g && t.b == s.b && t.a == s.a)); + } + } + } + + remove (fileName.c_str()); +} + + +void +writeReadLayers(const std::string &tempDir) +{ + cout << "\nreading multi-layer file" << endl; + + std::string fileName = tempDir + "imf_test_tiled_multi_layer_rgba.exr"; + + const int W = 237; + const int H = 119; + + Array2D p1 (H, W); + Array2D p2 (H, W); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + p1[y][x] = half (y % 23 + x % 17); + p2[y][x] = half (y % 29 + x % 19); + } + } + + { + Header hdr (W, H); + hdr.setTileDescription (TileDescription()); + hdr.channels().insert ("R", Channel (HALF)); + hdr.channels().insert ("foo.R", Channel (HALF)); + + FrameBuffer fb; + + fb.insert ("R", + Slice (HALF, // type + (char *) &p1[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + fb.insert ("foo.R", + Slice (HALF, // type + (char *) &p2[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + TiledOutputFile out (fileName.c_str(), hdr); + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + TiledRgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + TiledRgbaInputFile in (fileName.c_str(), "foo"); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + TiledRgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + + in.setFrameBuffer (&p3[0][0], 1, W); + + in.readTiles (0, in.numXTiles() - 1, + 0, in.numYTiles() / 2 - 1); + + in.setLayerName ("foo"); + + in.setFrameBuffer (&p3[0][0], 1, W); + + in.readTiles (0, in.numXTiles() - 1, + in.numYTiles() / 2, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + if (y < in.numYTiles() / 2 * in.tileYSize()) + assert (p3[y][x].r == p1[y][x]); + else + assert (p3[y][x].r == p2[y][x]); + + assert (p3[y][x].g == 0); + assert (p3[y][x].b == 0); + assert (p3[y][x].a == 1); + } + } + } + + { + Header hdr (W, H); + hdr.setTileDescription (TileDescription()); + hdr.channels().insert ("Y", Channel (HALF)); + hdr.channels().insert ("foo.Y", Channel (HALF)); + + FrameBuffer fb; + + fb.insert ("Y", + Slice (HALF, // type + (char *) &p1[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + fb.insert ("foo.Y", + Slice (HALF, // type + (char *) &p2[0][0], // base + sizeof (half), // xStride + sizeof (half) * W)); // yStride + + TiledOutputFile out (fileName.c_str(), hdr); + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + { + TiledRgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == p1[y][x]); + assert (p3[y][x].b == p1[y][x]); + assert (p3[y][x].a == 1); + } + } + } + + { + TiledRgbaInputFile in (fileName.c_str(), "foo"); + + Array2D p3 (H, W); + in.setFrameBuffer (&p3[0][0], 1, W); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == p2[y][x]); + assert (p3[y][x].b == p2[y][x]); + assert (p3[y][x].a == 1); + } + } + } + + { + TiledRgbaInputFile in (fileName.c_str(), ""); + + Array2D p3 (H, W); + + in.setFrameBuffer (&p3[0][0], 1, W); + + in.readTiles (0, in.numXTiles() - 1, + 0, in.numYTiles() / 2 - 1); + + in.setLayerName ("foo"); + + in.setFrameBuffer (&p3[0][0], 1, W); + + in.readTiles (0, in.numXTiles() - 1, + in.numYTiles() / 2, in.numYTiles() - 1); + + for (int y = 0; y < H; ++y) + { + for (int x = 0; x < W; ++x) + { + if (y < in.numYTiles() / 2 * in.tileYSize()) + { + assert (p3[y][x].r == p1[y][x]); + assert (p3[y][x].g == p1[y][x]); + assert (p3[y][x].b == p1[y][x]); + } + else + { + assert (p3[y][x].r == p2[y][x]); + assert (p3[y][x].g == p2[y][x]); + assert (p3[y][x].b == p2[y][x]); + } + + assert (p3[y][x].a == 1); + } + } + } + + remove (fileName.c_str()); +} + +} // namespace + + +void +testTiledRgba (const std::string &tempDir) +{ + try + { + cout << "Testing the tiled RGBA image interface" << endl; + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + const int W[] = { 9, 69, 75, 80 }; + const int H[] = { 7, 50, 52, 55 }; + + for (int i = 0; i < 4; ++i) + { + cout << "\nImage size = " << W[i] << " x " << H[i] << endl; + + for (int comp = 0; comp < NUM_COMPRESSION_METHODS; ++comp) + { + // + // for tiled files, ZIPS and ZIP are the same thing + // + + if (comp == ZIP_COMPRESSION) + comp++; + + if (i == 0) + { + // + // for single-pixel tiles, we don't gain anything + // by testing multiple image sizes (and singe-pixel + // tiles are rather slow anyway) + // + + writeRead (tempDir, W[i], H[i], Compression (comp), 1, 1); + } + + writeRead (tempDir, W[i], H[i], Compression (comp), 35, 26); + writeRead (tempDir, W[i], H[i], Compression (comp), 75, 52); + writeRead (tempDir, W[i], H[i], Compression (comp), 264, 129); + } + } + + writeReadIncomplete (tempDir); + } + + writeReadLayers (tempDir); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testTiledRgba.h b/IlmImfTest/testTiledRgba.h new file mode 100644 index 0000000..f444251 --- /dev/null +++ b/IlmImfTest/testTiledRgba.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include + +void testTiledRgba (const std::string &tempDir); + diff --git a/IlmImfTest/testTiledYa.cpp b/IlmImfTest/testTiledYa.cpp new file mode 100644 index 0000000..d2f415a --- /dev/null +++ b/IlmImfTest/testTiledYa.cpp @@ -0,0 +1,205 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include "IlmThread.h" +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + + +namespace { + +void +waves (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = (0.5 + 0.5 * sin (0.1 * x + 0.1 * y)) + + (0.5 + 0.5 * sin (-0.1 * x + 0.2 * y)); + + p.g = p.r; + p.b = p.r; + + p.a = (0.5 + 0.5 * sin (1.1 * x + 0.5 * y)); + } + } +} + + +void +wheel (Array2D &pixels, int w, int h) +{ + float n = 40; + float m = 0.5; + float radMin = 2 * n / M_PI; + float xCen = w * 0.5; + float yCen = h * 0.5; + float radMax = (xCen < yCen)? xCen: yCen; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + float rad = sqrt ((x-xCen) * (x-xCen) + (y-yCen) * (y-yCen)); + + if (rad <= radMax && rad >= radMin) + { + float phi = atan2 (y - yCen, x - xCen); + float c = 0.5 + 0.5 * sin (phi * n + rad * m); + + p.r = 0.5 + 0.5 * c; + p.g = p.r; + p.b = p.r; + p.a = 0.5 - 0.5 * c; + } + else + { + p.r = 0.5; + p.g = p.r; + p.b = p.r; + p.a = p.r; + } + } + } +} + + +void +writeReadYa (Box2i &dw, + int tileSizeX, + int tileSizeY, + const char fileName[], + void (* fillPixels) (Array2D &pixels, int w, int h)) +{ + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + Array2D pixels1 (h, w); + Array2D pixels2 (h, w); + + fillPixels (pixels1, w, h); + + cout << "writing " << flush; + + { + TiledRgbaOutputFile out (fileName, + tileSizeX, tileSizeY, + ONE_LEVEL, ROUND_DOWN, + dw, dw, + WRITE_YA); + + out.setFrameBuffer (&pixels1[-dw.min.y][-dw.min.x], 1, w); + out.writeTiles (0, out.numXTiles() - 1, 0, out.numYTiles() - 1); + } + + cout << "reading " << flush; + + { + TiledRgbaInputFile in (fileName); + + in.setFrameBuffer (&pixels2[-dw.min.y][-dw.min.x], 1, w); + in.readTiles (0, in.numXTiles() - 1, 0, in.numYTiles() - 1); + } + + cout << "comparing" << endl; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const Rgba &p1 = pixels1[y][x]; + const Rgba &p2 = pixels2[y][x]; + + assert (p1.r == p2.r); + assert (p1.g == p2.g); + assert (p1.b == p2.b); + assert (p1.a == p2.a); + } + } + + remove (fileName); +} + +} // namespace + + +void +testTiledYa (const std::string &tempDir) +{ + try + { + cout << "Testing tiled luminance input and output" << endl; + + std::string fileName = tempDir + "imf_test_tiled_ya.exr"; + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + Box2i dataWindow (V2i (-17, -29), V2i (348, 556)); + writeReadYa (dataWindow, 19, 27, fileName.c_str(), waves); + writeReadYa (dataWindow, 19, 27, fileName.c_str(), wheel); + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testTiledYa.h b/IlmImfTest/testTiledYa.h new file mode 100644 index 0000000..acecf58 --- /dev/null +++ b/IlmImfTest/testTiledYa.h @@ -0,0 +1,42 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include + +void testTiledYa (const std::string &tempDir); + diff --git a/IlmImfTest/testWav.cpp b/IlmImfTest/testWav.cpp new file mode 100644 index 0000000..fa6e5a5 --- /dev/null +++ b/IlmImfTest/testWav.cpp @@ -0,0 +1,289 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include "ImathRandom.h" +#include +#include +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +namespace { + + +void +fill1_14bit (Array2D &a, + Array2D &b, + int nx, + int ny, + IMATH_NAMESPACE::Rand48 & rand48) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = rand48.nexti() & 0x3fff; +} + + +void +fill1_16bit (Array2D &a, + Array2D &b, + int nx, + int ny, + IMATH_NAMESPACE::Rand48 & rand48) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = rand48.nexti() & 0xffff; +} + + +void +fill2 (Array2D &a, + Array2D &b, + int nx, + int ny, + unsigned short v) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = v; +} + + +void +fill3_14bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = (x & 1)? 0: 0x3fff; +} + + +void +fill3_16bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = (x & 1)? 0: 0xffff; +} + + +void +fill4_14bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = (y & 1)? 0: 0x3fff; +} + + +void +fill4_16bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = (y & 1)? 0: 0xffff; +} + + +void +fill5_14bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = ((x + y) & 1)? 0: 0x3fff; +} + + +void +fill5_16bit (Array2D &a, + Array2D &b, + int nx, + int ny) +{ + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + a[y][x] = b[y][x] = ((x + y) & 1)? 0: 0xffff; +} + + +unsigned short +maxValue (const Array2D &a, int nx, int ny) +{ + unsigned short mx = 0; + + for (int y = 0; y < ny; ++y) + for (int x = 0; x < nx; ++x) + if (mx < a[y][x]) + mx = a[y][x]; + + // cout << "max value = " << mx << endl; + + return mx; +} + + +void +wavEncodeDecode (Array2D &a, + const Array2D &b, + int nx, + int ny) +{ + unsigned short mx = maxValue (a, nx, ny); + + //cout << "encoding " << flush; + + wav2Encode (&a[0][0], nx, 1, ny, nx, mx); + + //cout << "decoding " << flush; + + wav2Decode (&a[0][0], nx, 1, ny, nx, mx); + + //cout << "comparing" << endl; + + for (int y = 0; y < ny; ++y) + { + for (int x = 0; x < nx; ++x) + { + //cout << x << ' ' << y << ' ' << a[y][x] << ' ' << b[y][x] << endl; + assert (a[y][x] == b[y][x]); + } + } +} + + +void +test (int nx, int ny) +{ + cout << nx << " x " << ny << endl; + + Array2D a (ny, nx); + Array2D b (ny, nx); + + IMATH_NAMESPACE::Rand48 rand48 (0); + + fill1_14bit (a, b, nx, ny, rand48); + wavEncodeDecode (a, b, nx, ny); + + fill1_16bit (a, b, nx, ny, rand48); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 0); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 1); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 0x3ffe); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 0x3fff); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 0xfffe); + wavEncodeDecode (a, b, nx, ny); + + fill2 (a, b, nx, ny, 0xffff); + wavEncodeDecode (a, b, nx, ny); + + fill3_14bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); + + fill3_16bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); + + fill4_14bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); + + fill4_16bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); + + fill5_14bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); + + fill5_16bit (a, b, nx, ny); + wavEncodeDecode (a, b, nx, ny); +} + +} // namespace + + +void +testWav (const std::string&) +{ + try + { + cout << "Testing Wavelet encoder" << endl; + + test (1, 1); + test (2, 2); + test (32, 32); + test (1024, 16); + test (16, 1024); + test (997, 37); + test (37, 997); + test (1024, 1024); + test (997, 997); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testWav.h b/IlmImfTest/testWav.h new file mode 100644 index 0000000..83df25b --- /dev/null +++ b/IlmImfTest/testWav.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testWav (const std::string &tempDir); + diff --git a/IlmImfTest/testXdr.cpp b/IlmImfTest/testXdr.cpp new file mode 100644 index 0000000..4b2ce28 --- /dev/null +++ b/IlmImfTest/testXdr.cpp @@ -0,0 +1,260 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include +#include +#include +#include + +#if defined (__GNUC__) && __GNUC__ == 2 +#include +#else +#include +#endif + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +namespace { + + +struct CharIO +{ + static void + writeChars (ostream &os, const char c[], int n) + { + os.write (c, n); + } + + static bool + readChars (istream &is, char c[], int n) + { + is.read (c, n); + return true; + } +}; + + +void +writeData (ostream &os) +{ + Xdr::write (os, (bool) true); + Xdr::write (os, (bool) false); + Xdr::write (os, (char) 'r'); + Xdr::write (os, (char) 'e'); + Xdr::write (os, (signed char) 'u'); + Xdr::write (os, (signed char) 'c'); + Xdr::write (os, (unsigned char) 'k'); + Xdr::write (os, (unsigned char) 'y'); + Xdr::write (os, (signed short) 8765); + Xdr::write (os, (signed short) -9876); + Xdr::write (os, (unsigned short) 6543); + Xdr::write (os, (unsigned short) 17432); + Xdr::write (os, (signed int) 2023456789); + Xdr::write (os, (signed int) -2012345678); + Xdr::write (os, (unsigned int) 1234567890u); + Xdr::write (os, (unsigned int) 2345678901u); + Xdr::write (os, (signed long) 2034567890); + Xdr::write (os, (signed long) -2045678901); + Xdr::write (os, (unsigned long) 1345678901u); + Xdr::write (os, (unsigned long) 2456789012u); + Xdr::write (os, (Int64) 0x1122334455667788ll); + Xdr::write (os, (Int64) 0xf1f2f3f4f5f6f7f8ll); + Xdr::write (os, (float) 0.0f); + Xdr::write (os, (float) 3.141592653589793f); + Xdr::write (os, (float) 6.141592653589793f); + Xdr::write (os, (double) 0); + Xdr::write (os, (double) 1.41421356237309504880); + Xdr::write (os, (double) 2.41421356237309504880); + Xdr::write (os, (half) 0); + Xdr::write (os, (half) 3.4142); + Xdr::write (os, (half) 4.4142); + Xdr::write (os, "abcdefgh", 4); // fixed-size char array + Xdr::write (os, "rstuvwxy", 5); + Xdr::write (os, "qwerty"); // zero-terminated string + Xdr::write (os, "asdfghjkl"); + Xdr::write (os, ""); + Xdr::pad (os, 17); + Xdr::write (os, (int) 1); + Xdr::pad (os, 0); + Xdr::write (os, (int) 2); + Xdr::pad (os, 17); + Xdr::write (os, (int) 3); + + assert (!os == false); +} + +template +void +check (istream &is, T c) +{ + T v; + + Xdr::read (is, v); + cout << typeid(v).name() << ": expected " << c << ", got " << v << endl; + assert (c == v); +} + + +template <> +void +check (istream &is, const char * c) +{ + char v[1024]; + + Xdr::read (is, sizeof (v), v); + + cout << "zero-terminated string: " + "expected \"" << c << "\", " + "got \"" << v << "\"" << endl; + + assert (!strcmp (c, v)); +} + + +void +check (istream &is, const char c[/*n*/], int n) +{ + char v[1024]; + + assert (n <= (int) sizeof (v)); + + Xdr::read (is, v, n); + + cout << "char[" << n << "]: expected \""; + + for (int i = 0; i < n; i++) + cout << c[i]; + + cout << "\", got \""; + + for (int i = 0; i < n; i++) + cout << v[i]; + + cout << "\"" << endl; + + for (int i = 0; i < n; i++) + assert (c[i] == v[i]); +} + + +void +readData (istream &is) +{ + check (is, (bool) true); + check (is, (bool) false); + check (is, (char) 'r'); + check (is, (char) 'e'); + check (is, (signed char) 'u'); + check (is, (signed char) 'c'); + check (is, (unsigned char) 'k'); + check (is, (unsigned char) 'y'); + check (is, (signed short) 8765); + check (is, (signed short) -9876); + check (is, (unsigned short) 6543); + check (is, (unsigned short) 17432); + check (is, (signed int) 2023456789); + check (is, (signed int) -2012345678); + check (is, (unsigned int) 1234567890u); + check (is, (unsigned int) 2345678901u); + check (is, (signed long) 2034567890); + check (is, (signed long) -2045678901); + check (is, (unsigned long) 1345678901u); + check (is, (unsigned long) 2456789012u); + check (is, (Int64) 0x1122334455667788ll); + check (is, (Int64) 0xf1f2f3f4f5f6f7f8ll); + check (is, (float) 0.0f); + check (is, (float) 3.141592653589793f); + check (is, (float) 6.141592653589793f); + check (is, (double) 0.0); + check (is, (double) 1.41421356237309504880); + check (is, (double) 2.41421356237309504880); + check (is, (half) 0); + check (is, (half) 3.4142); + check (is, (half) 4.4142); + check (is, (const char *) "abcdefgh", 4); + check (is, (const char *) "rstuvwxy", 5); + check (is, (const char *) "qwerty"); + check (is, (const char *) "asdfghjkl"); + check (is, (const char *) ""); + Xdr::skip (is, 17); + check (is, (int) 1); + Xdr::skip (is, 0); + check (is, (int) 2); + Xdr::skip (is, 17); + check (is, (int) 3); + assert (!is == false); +} + + +} // namespace + + +void +testXdr (const std::string&) +{ + cout << "Testing Xdr" << endl; + + try + { + assert (sizeof (Int64) == 8); + +#if defined (__GNUC__) && __GNUC__ == 2 + strstream s; +#else + stringstream s; +#endif + + writeData (s); + s.seekg (0); + readData (s); + } + catch (const std::exception &e) + { + cout << "unexpected exception: " << e.what() << endl; + assert (false); + } + catch (...) + { + cout << "unexpected exception" << endl; + assert (false); + } + + cout << "ok\n" << endl; +} diff --git a/IlmImfTest/testXdr.h b/IlmImfTest/testXdr.h new file mode 100644 index 0000000..60e684a --- /dev/null +++ b/IlmImfTest/testXdr.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testXdr (const std::string &tempDir); + diff --git a/IlmImfTest/testYca.cpp b/IlmImfTest/testYca.cpp new file mode 100644 index 0000000..0d3459e --- /dev/null +++ b/IlmImfTest/testYca.cpp @@ -0,0 +1,277 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include "IlmThread.h" +#include "ImathMath.h" +#include +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; +using namespace IMATH_NAMESPACE; + +namespace { + +void +fillPixelsColor (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.8 + 0.5 * sin (x * 0.05); + p.g = 0.8 + 0.5 * sin (x * 0.02 + y * 0.02); + p.b = 0.8 + 0.5 * sin (y * 0.03); + + float t = 0.8 + 0.5 * sin (x * 0.05 - y * 0.05); + + p.r *= t; + p.g *= t; + p.b *= t; + p.a = t; + } + } +} + + +void +fillPixelsGray (Array2D &pixels, int w, int h) +{ + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = pixels[y][x]; + + p.r = 0.8 + 0.5 * sin (x * 0.05 - y * 0.05); + p.g = p.r; + p.b = p.r; + p.a = 0.5 + 0.5 * cos (x * 0.05 - y * 0.05); + } + } +} + + +void +writeReadYca (const char fileName[], + const Box2i &dw, + RgbaChannels channels, + LineOrder writeOrder, + LineOrder readOrder, + void (* fillPixels) (Array2D &pixels, int w, int h)) +{ + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + Array2D pixels1 (h, w); + Array2D pixels2 (h, w); + + cout << w << " by " << h << " pixels, " + "channels " << channels << ", " + "write order " << writeOrder << ", " + "read order " << readOrder << + endl; + + fillPixels (pixels1, w, h); + + cout << "writing " << flush; + + { + RgbaOutputFile out (fileName, + dw, dw, // display window, data window + channels, + 1, // pixelAspectRatio + V2f (0, 0), // screenWindowCenter + 1, // screenWindowWidth + writeOrder); + + out.setYCRounding (9, 9); + out.setFrameBuffer (&pixels1[-dw.min.y][-dw.min.x], 1, w); + out.writePixels (h); + } + + cout << "reading " << flush; + + { + RgbaInputFile in (fileName); + + in.setFrameBuffer (&pixels2[-dw.min.y][-dw.min.x], 1, w); + + switch (readOrder) + { + case INCREASING_Y: + + for (int y = dw.min.y; y <= dw.max.y; ++y) + in.readPixels (y); + + break; + + case DECREASING_Y: + + for (int y = dw.max.y; y >= dw.min.y; --y) + in.readPixels (y); + + break; + + case RANDOM_Y: + + assert (h % 5 != 0); + + for (int i = 0; i < h; ++i) + { + int y = dw.min.y + (i * 5) % h; + in.readPixels (y); + } + + break; + } + } + + cout << "comparing" << endl; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const Rgba &p1 = pixels1[y][x]; + const Rgba &p2 = pixels2[y][x]; + + if (channels & WRITE_C) + { + float p1Max = max (p1.r, max (p1.g, p1.b)); + float p2Max = max (p2.r, max (p2.g, p2.b)); + + assert (equalWithAbsError (p1Max, p2Max, 0.03f)); + } + else + { + assert (p1.g == p2.g); + } + + if (channels & WRITE_A) + { + assert (p1.a == p2.a); + } + } + } + + remove (fileName); +} + +} // namespace + + +void +testYca (const std::string &tempDir) +{ + try + { + cout << "Testing luminance/chroma input and output" << endl; + + std::string fileName = tempDir + "imf_test_yca.exr"; + + Box2i dataWindow[6]; + dataWindow[0] = Box2i (V2i (0, 0), V2i (1, 17)); + dataWindow[1] = Box2i (V2i (0, 0), V2i (5, 17)); + dataWindow[2] = Box2i (V2i (0, 0), V2i (17, 1)); + dataWindow[3] = Box2i (V2i (0, 0), V2i (17, 5)); + dataWindow[4] = Box2i (V2i (0, 0), V2i (1, 1)); + dataWindow[5] = Box2i (V2i (-18, -28), V2i (247, 255)); + + int maxThreads = ILMTHREAD_NAMESPACE::supportsThreads()? 3: 0; + + for (int n = 0; n <= maxThreads; ++n) + { + if (ILMTHREAD_NAMESPACE::supportsThreads()) + { + setGlobalThreadCount (n); + cout << "\nnumber of threads: " << globalThreadCount() << endl; + } + + for (int i = 0; i < 6; ++i) + { + for (int writeOrder = INCREASING_Y; + writeOrder <= DECREASING_Y; + ++writeOrder) + { + for (int readOrder = INCREASING_Y; + readOrder <= RANDOM_Y; + ++readOrder) + { + writeReadYca (fileName.c_str(), dataWindow[i], + WRITE_YCA, + LineOrder (writeOrder), + LineOrder (readOrder), + fillPixelsColor); + + writeReadYca (fileName.c_str(), dataWindow[i], + WRITE_YC, + LineOrder (writeOrder), + LineOrder (readOrder), + fillPixelsColor); + + writeReadYca (fileName.c_str(), dataWindow[i], + WRITE_YA, + LineOrder (writeOrder), + LineOrder (readOrder), + fillPixelsGray); + + writeReadYca (fileName.c_str(), dataWindow[i], + WRITE_Y, + LineOrder (writeOrder), + LineOrder (readOrder), + fillPixelsGray); + } + } + } + } + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfTest/testYca.h b/IlmImfTest/testYca.h new file mode 100644 index 0000000..a7fc533 --- /dev/null +++ b/IlmImfTest/testYca.h @@ -0,0 +1,42 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include + +void testYca (const std::string &tempDir); + diff --git a/IlmImfTest/test_native1.exr b/IlmImfTest/test_native1.exr new file mode 100644 index 0000000..7865573 Binary files /dev/null and b/IlmImfTest/test_native1.exr differ diff --git a/IlmImfTest/test_native2.exr b/IlmImfTest/test_native2.exr new file mode 100644 index 0000000..5935445 Binary files /dev/null and b/IlmImfTest/test_native2.exr differ diff --git a/IlmImfTest/tiled.exr b/IlmImfTest/tiled.exr new file mode 100644 index 0000000..ff72865 Binary files /dev/null and b/IlmImfTest/tiled.exr differ diff --git a/IlmImfTest/tiled_with_deepscanline_type.exr b/IlmImfTest/tiled_with_deepscanline_type.exr new file mode 100644 index 0000000..433c0b3 Binary files /dev/null and b/IlmImfTest/tiled_with_deepscanline_type.exr differ diff --git a/IlmImfTest/tiled_with_deeptile_type.exr b/IlmImfTest/tiled_with_deeptile_type.exr new file mode 100644 index 0000000..e2c9171 Binary files /dev/null and b/IlmImfTest/tiled_with_deeptile_type.exr differ diff --git a/IlmImfTest/tiled_with_scanlineimage_type.exr b/IlmImfTest/tiled_with_scanlineimage_type.exr new file mode 100644 index 0000000..19a4c28 Binary files /dev/null and b/IlmImfTest/tiled_with_scanlineimage_type.exr differ diff --git a/IlmImfTest/tmpDir.h b/IlmImfTest/tmpDir.h new file mode 100644 index 0000000..62c4cd5 --- /dev/null +++ b/IlmImfTest/tmpDir.h @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#if defined(ANDROID) || defined(__ANDROID_API__) + #define IMF_TMP_DIR "/sdcard/" + #define IMF_PATH_SEPARATOR "/" +#elif defined(_WIN32) || defined(_WIN64) || defined(__MWERKS__) + #define IMF_TMP_DIR "" // TODO: get this from GetTempPath() or env var $TEMP or $TMP + #define IMF_PATH_SEPARATOR "\\" + #include // for _mkdir, _rmdir + #define mkdir(name,mode) _mkdir(name) + #define rmdir _rmdir +#else + #include // for mkdir + #define IMF_TMP_DIR "/var/tmp/" + #define IMF_PATH_SEPARATOR "/" +#endif diff --git a/IlmImfTest/v1.7.test.1.exr b/IlmImfTest/v1.7.test.1.exr new file mode 100644 index 0000000..80f6113 Binary files /dev/null and b/IlmImfTest/v1.7.test.1.exr differ diff --git a/IlmImfTest/v1.7.test.interleaved.exr b/IlmImfTest/v1.7.test.interleaved.exr new file mode 100644 index 0000000..e480b82 Binary files /dev/null and b/IlmImfTest/v1.7.test.interleaved.exr differ diff --git a/IlmImfTest/v1.7.test.planar.exr b/IlmImfTest/v1.7.test.planar.exr new file mode 100644 index 0000000..b5259ff Binary files /dev/null and b/IlmImfTest/v1.7.test.planar.exr differ diff --git a/IlmImfTest/v1.7.test.tiled.exr b/IlmImfTest/v1.7.test.tiled.exr new file mode 100644 index 0000000..b1369c9 Binary files /dev/null and b/IlmImfTest/v1.7.test.tiled.exr differ diff --git a/IlmImfUtil/CMakeLists.txt b/IlmImfUtil/CMakeLists.txt new file mode 100644 index 0000000..3eca4bc --- /dev/null +++ b/IlmImfUtil/CMakeLists.txt @@ -0,0 +1,67 @@ + +SET ( ILMIMFUTIL_SRCS + ImfImageChannel.cpp + ImfFlatImageChannel.cpp + ImfDeepImageChannel.cpp + ImfSampleCountChannel.cpp + ImfImageLevel.cpp + ImfFlatImageLevel.cpp + ImfDeepImageLevel.cpp + ImfImage.cpp + ImfFlatImage.cpp + ImfDeepImage.cpp + ImfImageIO.cpp + ImfFlatImageIO.cpp + ImfDeepImageIO.cpp + ImfImageDataWindow.cpp +) + +IF(BUILD_SHARED_LIBS) + ADD_DEFINITIONS(-DILMIMF_EXPORTS) +ENDIF() + +LINK_DIRECTORIES ( ${CMAKE_CURRENT_BINARY_DIR}/../IlmImf ) + +ADD_LIBRARY ( IlmImfUtil ${LIB_TYPE} + ${ILMIMFUTIL_SRCS} +) + +TARGET_LINK_LIBRARIES ( IlmImfUtil + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + IlmImf + ${PTHREAD_LIB} ${ZLIB_LIBRARIES} +) + + +# Libraries + +INSTALL ( TARGETS + IlmImfUtil + DESTINATION + ${CMAKE_INSTALL_PREFIX}/lib +) + +# Headers +INSTALL ( FILES + ImfImageChannel.h + ImfFlatImageChannel.h + ImfDeepImageChannel.h + ImfSampleCountChannel.h + ImfImageLevel.h + ImfFlatImageLevel.h + ImfDeepImageLevel.h + ImfImage.h + ImfFlatImage.h + ImfDeepImage.h + ImfImageIO.h + ImfFlatImageIO.h + ImfDeepImageIO.h + ImfImageDataWindow.h + ImfImageChannelRenaming.h + DESTINATION + ${CMAKE_INSTALL_PREFIX}/include/OpenEXR + ) + diff --git a/IlmImfUtil/ImfDeepImage.cpp b/IlmImfUtil/ImfDeepImage.cpp new file mode 100644 index 0000000..ba510cd --- /dev/null +++ b/IlmImfUtil/ImfDeepImage.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class DeepImage +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImage.h" +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +DeepImage::DeepImage (): + Image () +{ + resize (Box2i (V2i (0, 0), V2i (-1, -1)), ONE_LEVEL, ROUND_DOWN); +} + + +DeepImage::DeepImage + (const Box2i &dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +: + Image () +{ + resize (dataWindow, levelMode, levelRoundingMode); +} + + +DeepImage::~DeepImage () +{ + // empty +} + + +DeepImageLevel & +DeepImage::level (int l) +{ + return static_cast (Image::level (l)); +} + + +const DeepImageLevel & +DeepImage::level (int l) const +{ + return static_cast (Image::level (l)); +} + + +DeepImageLevel & +DeepImage::level (int lx, int ly) +{ + return static_cast (Image::level (lx, ly)); +} + + +const DeepImageLevel & +DeepImage::level (int lx, int ly) const +{ + return static_cast (Image::level (lx, ly)); +} + + +DeepImageLevel * +DeepImage::newLevel (int lx, int ly, const Box2i &dataWindow) +{ + return new DeepImageLevel (*this, lx, ly, dataWindow); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfDeepImage.h b/IlmImfUtil/ImfDeepImage.h new file mode 100644 index 0000000..0bbdd00 --- /dev/null +++ b/IlmImfUtil/ImfDeepImage.h @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DEEP_IMAGE_H +#define INCLUDED_IMF_DEEP_IMAGE_H + +//---------------------------------------------------------------------------- +// +// class DeepImage +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImageLevel.h" +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT DeepImage : public Image +{ + public: + + // + // Constructors and destructor. + // The default constructor constructs an image with an empty data + // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. + // + + DeepImage(); + + DeepImage(const IMATH_NAMESPACE::Box2i &dataWindow, + LevelMode levelMode = ONE_LEVEL, + LevelRoundingMode levelRoundingMode = ROUND_DOWN); + + virtual ~DeepImage(); + + + // + // Accessing image levels by level number + // + + virtual DeepImageLevel & level(int l = 0); + virtual const DeepImageLevel & level(int l = 0) const; + + virtual DeepImageLevel & level(int lx, int ly); + virtual const DeepImageLevel & level(int lx, int ly) const; + + protected: + + virtual DeepImageLevel * + newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfDeepImageChannel.cpp b/IlmImfUtil/ImfDeepImageChannel.cpp new file mode 100644 index 0000000..194666a --- /dev/null +++ b/IlmImfUtil/ImfDeepImageChannel.cpp @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class DeepImageChannel +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImageChannel.h" +#include "ImfDeepImageLevel.h" +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +DeepImageChannel::DeepImageChannel + (DeepImageLevel &level, + bool pLinear) +: + ImageChannel (level, 1, 1, pLinear) +{ + // empty +} + + +DeepImageChannel::~DeepImageChannel () +{ + // empty +} + +DeepImageLevel & +DeepImageChannel::deepLevel () +{ + return static_cast (level()); +} + + +const DeepImageLevel & +DeepImageChannel::deepLevel () const +{ + return static_cast (level()); +} + + +SampleCountChannel & +DeepImageChannel::sampleCounts () +{ + return deepLevel().sampleCounts(); +} + + +const SampleCountChannel & +DeepImageChannel::sampleCounts () const +{ + return deepLevel().sampleCounts(); +} + + +void +DeepImageChannel::resize () +{ + ImageChannel::resize(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfDeepImageChannel.h b/IlmImfUtil/ImfDeepImageChannel.h new file mode 100644 index 0000000..f53ce9d --- /dev/null +++ b/IlmImfUtil/ImfDeepImageChannel.h @@ -0,0 +1,533 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DEEP_IMAGE_CHANNEL_H +#define INCLUDED_IMF_DEEP_IMAGE_CHANNEL_H + +//---------------------------------------------------------------------------- +// +// class DeepImageChannel, +// template class TypedDeepImageChannel +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include "ImfImageChannel.h" +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class DeepImageLevel; +class SampleCountChannel; + +// +// Image channels: +// +// A TypedDeepImageChannel holds the pixel data for a single channel +// of one level of a deep image. Each pixel in the channel contains an +// array of n samples of type T, where T is either half, float or +// unsigned int, and n is stored in a separate sample count channel. +// Sample storage is allocated only for pixels within the data window +// of the level. +// + +class DeepImageChannel: public ImageChannel +{ + public: + + // + // Construct an OpenEXR frame buffer slice for this channel. + // This function is needed reading an image from an OpenEXR + // file and for saving an image in an OpenEXR file. + // + + virtual DeepSlice slice () const = 0; + + // + // Access to the image level to which this channel belongs. + // + + IMF_EXPORT DeepImageLevel & deepLevel(); + IMF_EXPORT const DeepImageLevel & deepLevel() const; + + + // + // Access to the sample count channel for this deep channel. + // + + IMF_EXPORT SampleCountChannel & sampleCounts(); + IMF_EXPORT const SampleCountChannel & sampleCounts() const; + + + protected: + + friend class DeepImageLevel; + + DeepImageChannel (DeepImageLevel &level, bool pLinear); + virtual ~DeepImageChannel(); + + virtual void setSamplesToZero + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples) = 0; + + virtual void moveSampleList + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition) = 0; + + virtual void moveSamplesToNewBuffer + (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions) = 0; + + virtual void initializeSampleLists () = 0; + + virtual void resize (); + + virtual void resetBasePointer () = 0; +}; + + +template +class TypedDeepImageChannel: public DeepImageChannel +{ + public: + + // + // The OpenEXR pixel type of this channel (HALF, FLOAT or UINT). + // + + virtual PixelType pixelType () const; + + + // + // Construct an OpenEXR frame buffer slice for this channel. + // This function is needed reading an image from an OpenEXR + // file and for saving an image in an OpenEXR file. + // + + virtual DeepSlice slice () const; + + + // + // Access to the pixel at pixel space location (x, y), without bounds + // checking. Accessing a location outside the data window of the image + // level results in undefined behavior. + // + // The pixel contains a pointer to an array of samples to type T. The + // number of samples in this array is sampleCounts().at(x,y). + // + + T * operator () (int x, int y); + const T * operator () (int x, int y) const; + + + // + // Access to the pixel at pixel space location (x, y), with bounds + // checking. Accessing a location outside the data window of the + // image level throws an Iex::ArgExc exception. + // + + T * at (int x, int y); + const T * at (int x, int y) const; + + // + // Faster access to all pixels in a single horizontal row of the + // channel. Access is not bounds checked; accessing out of bounds + // rows or pixels results in undefined behavior. + // + // Rows are numbered from 0 to pixelsPerColumn()-1, and each row + // contains pixelsPerRow() values. The number of samples in + // row(r)[i] is sampleCounts().row(r)[i]. + // + + T * const * row (int r); + const T * const * row (int r) const; + + private: + + friend class DeepImageLevel; + + TypedDeepImageChannel (DeepImageLevel &level, bool pLinear); + virtual ~TypedDeepImageChannel (); + + virtual void setSamplesToZero + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples); + + virtual void moveSampleList + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition); + + virtual void moveSamplesToNewBuffer + (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions); + + virtual void initializeSampleLists (); + + virtual void resize (); + + virtual void resetBasePointer (); + + T ** _sampleListPointers; // Array of pointers to per-pixel + //sample lists + + T ** _base; // Base pointer for faster access + // to entries in _sampleListPointers + + T * _sampleBuffer; // Contiguous memory block that + // contains all sample lists for + // this channel +}; + + +// +// Channel typedefs for the pixel data types supported by OpenEXR. +// + +typedef TypedDeepImageChannel DeepHalfChannel; +typedef TypedDeepImageChannel DeepFloatChannel; +typedef TypedDeepImageChannel DeepUIntChannel; + + +//----------------------------------------------------------------------------- +// Implementation of templates and inline functions +//----------------------------------------------------------------------------- + +template +TypedDeepImageChannel::TypedDeepImageChannel + (DeepImageLevel &level, + bool pLinear) +: + DeepImageChannel (level, pLinear), + _sampleListPointers (0), + _base (0), + _sampleBuffer (0) +{ + resize(); +} + + +template +TypedDeepImageChannel::~TypedDeepImageChannel () +{ + delete [] _sampleListPointers; + delete [] _sampleBuffer; +} + + +template <> +inline PixelType +DeepHalfChannel::pixelType () const +{ + return HALF; +} + + +template <> +inline PixelType +DeepFloatChannel::pixelType () const +{ + return FLOAT; +} + + +template <> +inline PixelType +DeepUIntChannel::pixelType () const +{ + return UINT; +} + + +template +DeepSlice +TypedDeepImageChannel::slice () const +{ + return DeepSlice (pixelType(), // type + (char *) _base, // base + sizeof (T*), // xStride + pixelsPerRow() * sizeof (T*), // yStride + sizeof (T), // sampleStride + xSampling(), + ySampling()); +} + + +template +inline T * +TypedDeepImageChannel::operator () (int x, int y) +{ + return _base[y * pixelsPerRow() + x]; +} + + +template +inline const T * +TypedDeepImageChannel::operator () (int x, int y) const +{ + return _base[y * pixelsPerRow() + x]; +} + + +template +inline T * +TypedDeepImageChannel::at (int x, int y) +{ + boundsCheck (x, y); + return _base[y * pixelsPerRow() + x]; +} + + +template +inline const T * +TypedDeepImageChannel::at (int x, int y) const +{ + boundsCheck (x, y); + return _base[y * pixelsPerRow() + x]; +} + + +template +inline T * const * +TypedDeepImageChannel::row (int r) +{ + return _base + r * pixelsPerRow(); +} + + +template +inline const T * const * +TypedDeepImageChannel::row (int r) const +{ + return _base + r * pixelsPerRow(); +} + + +template +void +TypedDeepImageChannel::setSamplesToZero + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples) +{ + // + // Expand the size of a sample list for a single pixel and + // set the new samples in the list to 0. + // + // i The position of the affected pixel in + // the channel's _sampleListPointers. + // + // oldNumSamples Original number of samples in the sample list. + // + // newNumSamples New number of samples in the sample list. + // + + for (int j = oldNumSamples; j < newNumSamples; ++j) + _sampleListPointers[i][j] = 0; +} + + +template +void +TypedDeepImageChannel::moveSampleList + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition) +{ + // + // Resize the sample list for a single pixel and move it to a new + // position in the sample buffer for this channel. + // + // i The position of the affected pixel in + // the channel's _sampleListPointers. + // + // oldNumSamples Original number of samples in sample list. + // + // newNumSamples New number of samples in the sample list. + // If the new number of samples is larger than + // the old number of samples for a given sample + // list, then the end of the new sample list + // is filled with zeroes. If the new number of + // samples is smaller than the old one, then + // samples at the end of the old sample list + // are discarded. + // + // newSampleListPosition The new position of the sample list in the + // sample buffer. + // + + T * oldSampleList = _sampleListPointers[i]; + T * newSampleList = _sampleBuffer + newSampleListPosition; + + if (oldNumSamples > newNumSamples) + { + for (int j = 0; j < newNumSamples; ++j) + newSampleList[j] = oldSampleList[j]; + } + else + { + for (int j = 0; j < oldNumSamples; ++j) + newSampleList[j] = oldSampleList[j]; + + for (int j = oldNumSamples; j < newNumSamples; ++j) + newSampleList[j] = 0; + } + + _sampleListPointers[i] = newSampleList; +} + + +template +void +TypedDeepImageChannel::moveSamplesToNewBuffer + (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions) +{ + // + // Allocate a new sample buffer for this channel. + // Copy the sample lists for all pixels into the new buffer. + // Then delete the old sample buffer. + // + // oldNumSamples Number of samples in each sample list in the + // old sample buffer. + // + // newNumSamples Number of samples in each sample list in + // the new sample buffer. If the new number + // of samples is larger than the old number of + // samples for a given sample list, then the + // end of the new sample list is filled with + // zeroes. If the new number of samples is + // smaller than the old one, then samples at + // the end of the old sample list are discarded. + // + // newSampleListPositions The positions of the new sample lists in the + // new sample buffer. + // + + T * oldSampleBuffer = _sampleBuffer; + _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; + + for (size_t i = 0; i < numPixels(); ++i) + { + T * oldSampleList = _sampleListPointers[i]; + T * newSampleList = _sampleBuffer + newSampleListPositions[i]; + + if (oldNumSamples[i] > newNumSamples[i]) + { + for (int j = 0; j < newNumSamples[i]; ++j) + newSampleList[j] = oldSampleList[j]; + } + else + { + for (int j = 0; j < oldNumSamples[i]; ++j) + newSampleList[j] = oldSampleList[j]; + + for (int j = oldNumSamples[i]; j < newNumSamples[i]; ++j) + newSampleList[j] = 0; + } + + _sampleListPointers[i] = newSampleList; + } + + delete [] oldSampleBuffer; +} + + +template +void +TypedDeepImageChannel::initializeSampleLists () +{ + // + // Allocate a new set of sample lists for this channel, and + // construct zero-filled sample lists for the pixels. + // + + delete [] _sampleBuffer; + + _sampleBuffer = 0; // set to 0 to prevent double deletion + // in case of an exception + + const unsigned int * numSamples = sampleCounts().numSamples(); + const size_t * sampleListPositions = sampleCounts().sampleListPositions(); + + _sampleBuffer = new T [sampleCounts().sampleBufferSize()]; + + resetBasePointer(); + + for (size_t i = 0; i < numPixels(); ++i) + { + _sampleListPointers[i] = _sampleBuffer + sampleListPositions[i]; + + for (unsigned int j = 0; j < numSamples[i]; ++j) + _sampleListPointers[i][j] = T (0); + } +} + +template +void +TypedDeepImageChannel::resize () +{ + DeepImageChannel::resize(); + + delete [] _sampleListPointers; + _sampleListPointers = 0; + _sampleListPointers = new T * [numPixels()]; + initializeSampleLists(); +} + + +template +void +TypedDeepImageChannel::resetBasePointer () +{ + _base = _sampleListPointers - + level().dataWindow().min.y * pixelsPerRow() - + level().dataWindow().min.x; +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfDeepImageIO.cpp b/IlmImfUtil/ImfDeepImageIO.cpp new file mode 100644 index 0000000..70211db --- /dev/null +++ b/IlmImfUtil/ImfDeepImageIO.cpp @@ -0,0 +1,459 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// OpenEXR file I/O for deep images. +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImageIO.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +void +saveDeepImage + (const string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws) +{ + if (img.levelMode() != ONE_LEVEL || hdr.hasTileDescription()) + saveDeepTiledImage (fileName, hdr, img, dws); + else + saveDeepScanLineImage (fileName, hdr, img, dws); +} + + +void +saveDeepImage + (const string &fileName, + const DeepImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveDeepImage (fileName, hdr, img); +} + + +void +loadDeepImage + (const string &fileName, + Header &hdr, + DeepImage &img) +{ + bool tiled, deep, multiPart; + + if (!isOpenExrFile (fileName.c_str(), tiled, deep, multiPart)) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "The file is not an OpenEXR file."); + } + + if (multiPart) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "Multi-part file loading is not supported."); + } + + if (!deep) + { + THROW (ArgExc, "Cannot load flat image file " << fileName << " " + "as a deep image."); + } + + //XXX TODO: the tiled flag obtained above is unreliable; + // open the file as a multi-part file and inspect the header. + // Can the IlmImf library be fixed? + + { + MultiPartInputFile mpi (fileName.c_str()); + + tiled = (mpi.parts() > 0 && + mpi.header(0).hasType() && + isTiled (mpi.header(0).type())); + } + + if (tiled) + loadDeepTiledImage (fileName, hdr, img); + else + loadDeepScanLineImage (fileName, hdr, img); +} + + +void +loadDeepImage + (const string &fileName, + DeepImage &img) +{ + Header hdr; + loadDeepImage (fileName, hdr, img); +} + + +void +saveDeepScanLineImage + (const string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws) +{ + Header newHdr; + + for (Header::ConstIterator i = hdr.begin(); i != hdr.end(); ++i) + { + if (strcmp (i.name(), "dataWindow") && + strcmp (i.name(), "tiles") && + strcmp (i.name(), "channels")) + { + newHdr.insert (i.name(), i.attribute()); + } + } + + newHdr.dataWindow() = dataWindowForFile (hdr, img, dws); + + //XXX TODO: setting the compression to, for example, ZIP_COMPRESSION, + //then the IlmImf library will save the file, but later it will not be + //able to read it. Fix the library! + + newHdr.compression() = ZIPS_COMPRESSION; + + const DeepImageLevel &level = img.level(); + DeepFrameBuffer fb; + + fb.insertSampleCountSlice (level.sampleCounts().slice()); + + for (DeepImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + { + newHdr.channels().insert (i.name(), i.channel().channel()); + fb.insert (i.name(), i.channel().slice()); + } + + DeepScanLineOutputFile out (fileName.c_str(), newHdr); + out.setFrameBuffer (fb); + out.writePixels (newHdr.dataWindow().max.y - newHdr.dataWindow().min.y + 1); +} + + +void +saveDeepScanLineImage + (const string &fileName, + const DeepImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveDeepScanLineImage (fileName, hdr, img); +} + + +void +loadDeepScanLineImage + (const string &fileName, + Header &hdr, + DeepImage &img) +{ + DeepScanLineInputFile in (fileName.c_str()); + + const ChannelList &cl = in.header().channels(); + + img.clearChannels(); + + for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) + img.insertChannel (i.name(), i.channel()); + + img.resize (in.header().dataWindow(), ONE_LEVEL, ROUND_DOWN); + + DeepImageLevel &level = img.level(); + DeepFrameBuffer fb; + + fb.insertSampleCountSlice (level.sampleCounts().slice()); + + for (DeepImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + in.setFrameBuffer (fb); + + { + SampleCountChannel::Edit edit (level.sampleCounts()); + + in.readPixelSampleCounts + (level.dataWindow().min.y, level.dataWindow().max.y); + } + + in.readPixels (level.dataWindow().min.y, level.dataWindow().max.y); + + for (Header::ConstIterator i = in.header().begin(); + i != in.header().end(); + ++i) + { + if (strcmp (i.name(), "tiles")) + hdr.insert (i.name(), i.attribute()); + } +} + + +void +loadDeepScanLineImage + (const string &fileName, + DeepImage &img) +{ + Header hdr; + loadDeepScanLineImage (fileName, hdr, img); +} + + +namespace { + +void +saveLevel (DeepTiledOutputFile &out, const DeepImage &img, int x, int y) +{ + const DeepImageLevel &level = img.level (x, y); + DeepFrameBuffer fb; + + fb.insertSampleCountSlice (level.sampleCounts().slice()); + + for (DeepImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles (x) - 1, 0, out.numYTiles (y) - 1, x, y); +} + +} // namespace + + +void +saveDeepTiledImage + (const string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws) +{ + Header newHdr; + + for (Header::ConstIterator i = hdr.begin(); i != hdr.end(); ++i) + { + if (strcmp (i.name(), "dataWindow") && + strcmp (i.name(), "tiles") && + strcmp (i.name(), "channels")) + { + newHdr.insert (i.name(), i.attribute()); + } + } + + if (hdr.hasTileDescription()) + { + newHdr.setTileDescription + (TileDescription (hdr.tileDescription().xSize, + hdr.tileDescription().ySize, + img.levelMode(), + img.levelRoundingMode())); + } + else + { + newHdr.setTileDescription + (TileDescription (64, // xSize + 64, // ySize + img.levelMode(), + img.levelRoundingMode())); + } + + newHdr.dataWindow() = dataWindowForFile (hdr, img, dws); + + //XXX TODO: setting the compression to, for example, ZIP_COMPRESSION, + //then the IlmImf library will save the file, but later it will not be + //able to read it. Fix the library! + + newHdr.compression() = ZIPS_COMPRESSION; + + const DeepImageLevel &level = img.level (0, 0); + + for (DeepImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + newHdr.channels().insert (i.name(), i.channel().channel()); + + DeepTiledOutputFile out (fileName.c_str(), newHdr); + + switch (img.levelMode()) + { + case ONE_LEVEL: + + saveLevel (out, img, 0, 0); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < out.numLevels(); ++x) + saveLevel (out, img, x, x); + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < out.numYLevels(); ++y) + for (int x = 0; x < out.numXLevels(); ++x) + saveLevel (out, img, x, y); + + break; + + default: + + assert (false); + } +} + + +void +saveDeepTiledImage + (const string &fileName, + const DeepImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveDeepTiledImage (fileName, hdr, img); +} + + +namespace { + +void +loadLevel (DeepTiledInputFile &in, DeepImage &img, int x, int y) +{ + DeepImageLevel &level = img.level (x, y); + DeepFrameBuffer fb; + + fb.insertSampleCountSlice (level.sampleCounts().slice()); + + for (DeepImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + in.setFrameBuffer (fb); + + { + SampleCountChannel::Edit edit (level.sampleCounts()); + + in.readPixelSampleCounts + (0, in.numXTiles (x) - 1, 0, in.numYTiles (y) - 1, x, y); + } + + in.readTiles (0, in.numXTiles (x) - 1, 0, in.numYTiles (y) - 1, x, y); +} + +} // namespace + + +void +loadDeepTiledImage + (const string &fileName, + Header &hdr, + DeepImage &img) +{ + DeepTiledInputFile in (fileName.c_str()); + + const ChannelList &cl = in.header().channels(); + + img.clearChannels(); + + for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) + img.insertChannel (i.name(), i.channel()); + + img.resize (in.header().dataWindow(), + in.header().tileDescription().mode, + in.header().tileDescription().roundingMode); + + switch (img.levelMode()) + { + case ONE_LEVEL: + + loadLevel (in, img, 0, 0); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img.numLevels(); ++x) + loadLevel (in, img, x, x); + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img.numYLevels(); ++y) + for (int x = 0; x < img.numXLevels(); ++x) + loadLevel (in, img, x, y); + + break; + + default: + + assert (false); + } + + for (Header::ConstIterator i = in.header().begin(); + i != in.header().end(); + ++i) + { + hdr.insert (i.name(), i.attribute()); + } +} + + +void +loadDeepTiledImage + (const string &fileName, + DeepImage &img) +{ + Header hdr; + loadDeepTiledImage (fileName, hdr, img); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfDeepImageIO.h b/IlmImfUtil/ImfDeepImageIO.h new file mode 100644 index 0000000..e189696 --- /dev/null +++ b/IlmImfUtil/ImfDeepImageIO.h @@ -0,0 +1,220 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DEEP_IMAGE_IO_H +#define INCLUDED_IMF_DEEP_IMAGE_IO_H + +//---------------------------------------------------------------------------- +// +// Functions to load deep images from OpenEXR files +// and to save deep images in OpenEXR files. +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImage.h" +#include "ImfImageDataWindow.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// saveDeepImage (n, h, i,d) or +// saveDeepImage (n, i) +// +// Saves image i in an OpenEXR file with name n. The file will be +// tiled if the image has more than one level, or if a header, h, is +// given and contains a tile description attribute; otherwise the +// file will be scan-line based. +// +// If header h is given, then the channel list in h is replaced with +// the channel list in i, and the levelMode and the levelRounding mode +// fields of the tile description are replaced with the level mode +// and the levelRounding mode of i. In addition, if the data window +// source flag, d, is set to USE_IMAGE_DATA_WINDOW, then the data +// window in the image is copied into the header; if d is set to +// USE_HEADER_DATA_WINDOW, then the data window in the header is +// replaced with the intersection of the original data window in the +// header and the data window in the image. The modified header then +// becomes the header of the image file. +// + +IMF_EXPORT +void +saveDeepImage + (const std::string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveDeepImage + (const std::string &fileName, + const DeepImage &img); + +// +// loadDeepImage (n, h, i) or +// loadDeepImage (n, i) +// +// Loads deep image i from the OpenEXR file with name n. +// +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadDeepImage + (const std::string &fileName, + Header &hdr, + DeepImage &img); + + +IMF_EXPORT +void +loadDeepImage + (const std::string &fileName, + DeepImage &img); + + +// +// saveDeepScanLineImage (n, h, i, d) or +// saveDeepScanLineImage (n, i) +// +// Saves image i in a scan-line based deep OpenEXR file with file name n. +// +// If header h is given, then the channel list in h is replaced with +// the channel list in i. In addition, if the data window source flag, d, +// is set to USE_IMAGE_DATA_WINDOW, then the data window in the image is +// copied into the header; if d is set to USE_HEADER_DATA_WINDOW, then +// the data window in the header is replaced with the intersection of +// the original data window in the header and the data window in the +// image. The modified header then becomes the header of the image file. +// + +IMF_EXPORT +void +saveDeepScanLineImage + (const std::string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveDeepScanLineImage + (const std::string &fileName, + const DeepImage &img); + + +// +// loadDeepScanLineImage (n, h, i) or +// loadDeepScanLineImage (n, i) +// +// Loads image i from a scan-line based deep OpenEXR file with file name n. +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadDeepScanLineImage + (const std::string &fileName, + Header &hdr, + DeepImage &img); + +IMF_EXPORT +void +loadDeepScanLineImage + (const std::string &fileName, + DeepImage &img); + +// +// saveDeepTiledImage (n, h, i, d) or +// saveDeepTiledImage (n, i) +// +// Saves image i in a tiled deep OpenEXR file with file name n. +// +// If header h is given, then the channel list in h is replaced with +// the channel list i, and the levelMode and the levelRounding mode +// fields of the tile description are replaced with the level mode +// and the levelRounding mode of i. In addition, if the data window +// source flag, d, is set to USE_IMAGE_DATA_WINDOW, then the data +// window in the image is copied into the header; if d is set to +// USE_HEADER_DATA_WINDOW, then the data window in the header is +// replaced with the intersection of the original data window in the +// header and the data window in the image. The modified header then +// becomes the header of the image file. +// +// Note: USE_HEADER_DATA_WINDOW can only be used for images with +// level mode ONE_LEVEL. +// + +IMF_EXPORT +void +saveDeepTiledImage + (const std::string &fileName, + const Header &hdr, + const DeepImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveDeepTiledImage + (const std::string &fileName, + const DeepImage &img); + +// +// loadDeepTiledImage (n, h, i) or +// loadDeepTiledImage (n, i) +// +// Loads image i from a tiled deep OpenEXR file with file name n. +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadDeepTiledImage + (const std::string &fileName, + Header &hdr, + DeepImage &img); + +IMF_EXPORT +void +loadDeepTiledImage + (const std::string &fileName, + DeepImage &img); + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfDeepImageLevel.cpp b/IlmImfUtil/ImfDeepImageLevel.cpp new file mode 100644 index 0000000..79e5b56 --- /dev/null +++ b/IlmImfUtil/ImfDeepImageLevel.cpp @@ -0,0 +1,327 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class DeepImageLevel +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImageLevel.h" +#include "ImfDeepImage.h" +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +DeepImageLevel::DeepImageLevel + (DeepImage& image, + int xLevelNumber, + int yLevelNumber, + const Box2i& dataWindow) +: + ImageLevel (image, xLevelNumber, yLevelNumber), + _sampleCounts (*this) +{ + resize (dataWindow); +} + + +DeepImage & +DeepImageLevel::deepImage () +{ + return static_cast (image()); +} + + +const DeepImage & +DeepImageLevel::deepImage () const +{ + return static_cast (image()); +} + + +DeepImageLevel::~DeepImageLevel () +{ + clearChannels(); +} + + +void +DeepImageLevel::setSamplesToZero + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples) +{ + for (ChannelMap::iterator j = _channels.begin(); j != _channels.end(); ++j) + { + j->second->setSamplesToZero (i, oldNumSamples, newNumSamples); + } +} + + +void +DeepImageLevel::moveSampleList + (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition) +{ + for (ChannelMap::iterator j = _channels.begin(); j != _channels.end(); ++j) + { + j->second->moveSampleList (i, + oldNumSamples, + newNumSamples, + newSampleListPosition); + } +} + + +void +DeepImageLevel::moveSamplesToNewBuffer + (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions) +{ + for (ChannelMap::iterator j = _channels.begin(); j != _channels.end(); ++j) + { + j->second->moveSamplesToNewBuffer (oldNumSamples, + newNumSamples, + newSampleListPositions); + } +} + + +void +DeepImageLevel::initializeSampleLists () +{ + for (ChannelMap::iterator j = _channels.begin(); j != _channels.end(); ++j) + j->second->initializeSampleLists(); +} + + +void +DeepImageLevel::resize (const Imath::Box2i& dataWindow) +{ + // + // Note: if the following code throws an exception, then the image level + // may be left in an inconsistent state where some channels have been + // resized, but others have not. However, the image to which this level + // belongs will catch the exception and clean up the mess. + // + + ImageLevel::resize (dataWindow); + _sampleCounts.resize(); + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resize(); +} + + +void +DeepImageLevel::shiftPixels (int dx, int dy) +{ + ImageLevel::shiftPixels (dx, dy); + + _sampleCounts.resetBasePointer(); + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resetBasePointer(); +} + + +void +DeepImageLevel::insertChannel + (const string& name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear) +{ + if (xSampling != 1 && ySampling != 1) + { + THROW (ArgExc, "Cannot create deep image channel " << name << " " + "with x sampling rate " << xSampling << " and " + "and y sampling rate " << ySampling << ". X and y " + "sampling rates for deep channels must be 1."); + } + + if (_channels.find (name) != _channels.end()) + throwChannelExists (name); + + switch (type) + { + case HALF: + _channels[name] = new DeepHalfChannel (*this, pLinear); + break; + + case FLOAT: + _channels[name] = new DeepFloatChannel (*this, pLinear); + break; + + case UINT: + _channels[name] = new DeepUIntChannel (*this, pLinear); + break; + + default: + assert (false); + } +} + + +void +DeepImageLevel::eraseChannel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i != _channels.end()) + { + delete i->second; + _channels.erase (i); + } +} + + +void +DeepImageLevel::clearChannels () +{ + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + delete i->second; + + _channels.clear(); +} + + +void +DeepImageLevel::renameChannel (const string &oldName, const string &newName) +{ + ChannelMap::iterator oldChannel = _channels.find (oldName); + + assert (oldChannel != _channels.end()); + assert (_channels.find (newName) == _channels.end()); + + _channels[newName] = oldChannel->second; + _channels.erase (oldChannel); +} + + +void +DeepImageLevel::renameChannels (const RenamingMap &oldToNewNames) +{ + renameChannelsInMap (oldToNewNames, _channels); +} + + +DeepImageChannel * +DeepImageLevel::findChannel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i != _channels.end()) + return i->second; + else + return 0; +} + + +const DeepImageChannel * +DeepImageLevel::findChannel (const string& name) const +{ + ChannelMap::const_iterator i = _channels.find (name); + + if (i != _channels.end()) + return i->second; + else + return 0; +} + + +DeepImageChannel & +DeepImageLevel::channel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i == _channels.end()) + throwBadChannelName (name); + + return *i->second; +} + + +const DeepImageChannel & +DeepImageLevel::channel (const string& name) const +{ + ChannelMap::const_iterator i = _channels.find (name); + + if (i == _channels.end()) + throwBadChannelName (name); + + return *i->second; +} + + +DeepImageLevel::Iterator +DeepImageLevel::begin () +{ + return _channels.begin(); +} + + +DeepImageLevel::ConstIterator +DeepImageLevel::begin () const +{ + return _channels.begin(); +} + + +DeepImageLevel::Iterator +DeepImageLevel::end () +{ + return _channels.end(); +} + + +DeepImageLevel::ConstIterator +DeepImageLevel::end () const +{ + return _channels.end(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfDeepImageLevel.h b/IlmImfUtil/ImfDeepImageLevel.h new file mode 100644 index 0000000..f698e72 --- /dev/null +++ b/IlmImfUtil/ImfDeepImageLevel.h @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_DEEP_IMAGE_LEVEL_H +#define INCLUDED_IMF_DEEP_IMAGE_LEVEL_H + +//---------------------------------------------------------------------------- +// +// class DeepImageLevel +// class DeepImageLevel::Iterator +// class DeepImageLevel::ConstIterator +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include "ImfDeepImageChannel.h" +#include "ImfSampleCountChannel.h" +#include "ImfImageLevel.h" +#include "ImfExport.h" +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class DeepImage; + +class IMF_EXPORT DeepImageLevel : public ImageLevel +{ + public: + + // + // Access to the image to which the level belongs. + // + + DeepImage & deepImage (); + const DeepImage & deepImage () const; + + + // + // Access to deep channels by name: + // + // findChannel(n) returns a pointer to the image channel with + // name n, or 0 if no such channel exists. + // + // channel(n) returns a reference to the image channel with + // name n, or throws an Iex::ArgExc exception if + // no such channel exists. + // + // findTypedChannel(n) returns a pointer to the image channel with + // name n and type T, or 0 if no such channel + // exists. + // + // typedChannel(n) returns a reference to the image channel with + // name n and type T, or throws an Iex::ArgExc + // exception if no such channel exists. + // + + + DeepImageChannel * findChannel (const std::string& name); + const DeepImageChannel * findChannel (const std::string& name) const; + + DeepImageChannel & channel (const std::string& name); + const DeepImageChannel & channel (const std::string& name) const; + + template + TypedDeepImageChannel * findTypedChannel + (const std::string& name); + + template + const TypedDeepImageChannel * findTypedChannel + (const std::string& name) const; + + template + TypedDeepImageChannel & typedChannel + (const std::string& name); + + template + const TypedDeepImageChannel & typedChannel + (const std::string& name) const; + + // + // Iterator-style access to deep channels + // + + typedef std::map ChannelMap; + + class Iterator; + class ConstIterator; + + Iterator begin(); + ConstIterator begin() const; + + Iterator end(); + ConstIterator end() const; + + // + // Access to the sample count channel + // + + SampleCountChannel & sampleCounts(); + const SampleCountChannel & sampleCounts() const; + + private: + + friend class DeepImage; + friend class SampleCountChannel; + + // + // The constructor and destructor are private. + // Deep image levels exist only as part of a deep image. + // + + DeepImageLevel (DeepImage& image, + int xLevelNumber, + int yLevelNumber, + const IMATH_NAMESPACE::Box2i& dataWindow); + + ~DeepImageLevel (); + + void setSamplesToZero (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples); + + void moveSampleList (size_t i, + unsigned int oldNumSamples, + unsigned int newNumSamples, + size_t newSampleListPosition); + + void moveSamplesToNewBuffer (const unsigned int * oldNumSamples, + const unsigned int * newNumSamples, + const size_t * newSampleListPositions); + + void initializeSampleLists (); + + virtual void resize (const IMATH_NAMESPACE::Box2i& dataWindow); + + virtual void shiftPixels (int dx, int dy); + + virtual void insertChannel (const std::string& name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear); + + virtual void eraseChannel (const std::string& name); + + virtual void clearChannels (); + + virtual void renameChannel (const std::string &oldName, + const std::string &newName); + + virtual void renameChannels (const RenamingMap &oldToNewNames); + + ChannelMap _channels; + SampleCountChannel _sampleCounts; +}; + + +class DeepImageLevel::Iterator +{ + public: + + Iterator (); + Iterator (const DeepImageLevel::ChannelMap::iterator& i); + + + // + // Advance the iterator + // + + Iterator & operator ++ (); + Iterator operator ++ (int); + + + // + // Access to the channel to which the iterator points, + // and to the name of that channel. + // + + const std::string & name () const; + DeepImageChannel & channel () const; + + private: + + friend class DeepImageLevel::ConstIterator; + + DeepImageLevel::ChannelMap::iterator _i; +}; + + +class DeepImageLevel::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const DeepImageLevel::ChannelMap::const_iterator& i); + ConstIterator (const DeepImageLevel::Iterator& other); + + + // + // Advance the iterator + // + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + + // + // Access to the channel to which the iterator points, + // and to the name of that channel. + // + + const std::string & name () const; + const DeepImageChannel & channel () const; + + private: + + friend bool operator == + (const ConstIterator &, const ConstIterator &); + + friend bool operator != + (const ConstIterator &, const ConstIterator &); + + DeepImageLevel::ChannelMap::const_iterator _i; +}; + + +//----------------------------------------------------------------------------- +// Implementation of inline functions +//----------------------------------------------------------------------------- + +template +TypedDeepImageChannel * +DeepImageLevel::findTypedChannel (const std::string& name) +{ + return dynamic_cast *> (findChannel (name)); +} + + +template +const TypedDeepImageChannel * +DeepImageLevel::findTypedChannel (const std::string& name) const +{ + return dynamic_cast *> (findChannel (name)); +} + + +template +TypedDeepImageChannel & +DeepImageLevel::typedChannel (const std::string& name) +{ + TypedDeepImageChannel * ptr = findTypedChannel (name); + + if (ptr == 0) + throwBadChannelNameOrType (name); + + return *ptr; +} + + +template +const TypedDeepImageChannel & +DeepImageLevel::typedChannel (const std::string& name) const +{ + const TypedDeepImageChannel * ptr = findTypedChannel (name); + + if (ptr == 0) + throwBadChannelNameOrType (name); + + return *ptr; +} + + +inline SampleCountChannel & +DeepImageLevel::sampleCounts () +{ + return _sampleCounts; +} + + +inline const SampleCountChannel & +DeepImageLevel::sampleCounts () const +{ + return _sampleCounts; +} + + +inline +DeepImageLevel::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +DeepImageLevel::Iterator::Iterator + (const DeepImageLevel::ChannelMap::iterator& i) +: + _i (i) +{ + // empty +} + + +inline DeepImageLevel::Iterator & +DeepImageLevel::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline DeepImageLevel::Iterator +DeepImageLevel::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const std::string & +DeepImageLevel::Iterator::name () const +{ + return _i->first; +} + + +inline DeepImageChannel & +DeepImageLevel::Iterator::channel () const +{ + return *_i->second; +} + + +inline +DeepImageLevel::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +DeepImageLevel::ConstIterator::ConstIterator + (const DeepImageLevel::ChannelMap::const_iterator& i): _i (i) +{ + // empty +} + + +inline +DeepImageLevel::ConstIterator::ConstIterator + (const DeepImageLevel::Iterator& other): _i (other._i) +{ + // empty +} + +inline DeepImageLevel::ConstIterator & +DeepImageLevel::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline DeepImageLevel::ConstIterator +DeepImageLevel::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const std::string & +DeepImageLevel::ConstIterator::name () const +{ + return _i->first; +} + +inline const DeepImageChannel & +DeepImageLevel::ConstIterator::channel () const +{ + return *_i->second; +} + + +inline bool +operator == (const DeepImageLevel::ConstIterator& x, + const DeepImageLevel::ConstIterator& y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const DeepImageLevel::ConstIterator& x, + const DeepImageLevel::ConstIterator& y) +{ + return !(x == y); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfFlatImage.cpp b/IlmImfUtil/ImfFlatImage.cpp new file mode 100644 index 0000000..d9b6c34 --- /dev/null +++ b/IlmImfUtil/ImfFlatImage.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class FlatImage +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImage.h" +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +FlatImage::FlatImage (): + Image () +{ + resize (Box2i (V2i (0, 0), V2i (-1, -1)), ONE_LEVEL, ROUND_DOWN); +} + + +FlatImage::FlatImage + (const Box2i &dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +: + Image () +{ + resize (dataWindow, levelMode, levelRoundingMode); +} + + +FlatImage::~FlatImage () +{ + // empty +} + + +FlatImageLevel & +FlatImage::level (int l) +{ + return static_cast (Image::level (l)); +} + + +const FlatImageLevel & +FlatImage::level (int l) const +{ + return static_cast (Image::level (l)); +} + + +FlatImageLevel & +FlatImage::level (int lx, int ly) +{ + return static_cast (Image::level (lx, ly)); +} + + +const FlatImageLevel & +FlatImage::level (int lx, int ly) const +{ + return static_cast (Image::level (lx, ly)); +} + + +FlatImageLevel * +FlatImage::newLevel (int lx, int ly, const Box2i &dataWindow) +{ + return new FlatImageLevel (*this, lx, ly, dataWindow); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfFlatImage.h b/IlmImfUtil/ImfFlatImage.h new file mode 100644 index 0000000..2cb4d83 --- /dev/null +++ b/IlmImfUtil/ImfFlatImage.h @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FLAT_IMAGE_H +#define INCLUDED_IMF_FLAT_IMAGE_H + +//---------------------------------------------------------------------------- +// +// class FlatImage +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImageLevel.h" +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +class IMF_EXPORT FlatImage : public Image +{ + public: + + // + // Constructors and destructor. + // The default constructor constructs an image with an empty data + // window level mode ONE_LEVEL and level rounding mode ROUND_DOWN. + // + + FlatImage(); + + FlatImage(const IMATH_NAMESPACE::Box2i &dataWindow, + LevelMode levelMode = ONE_LEVEL, + LevelRoundingMode levelRoundingMode = ROUND_DOWN); + + virtual ~FlatImage(); + + + // + // Accessing image levels by level number + // + + virtual FlatImageLevel & level(int l = 0); + virtual const FlatImageLevel & level(int l = 0) const; + + virtual FlatImageLevel & level(int lx, int ly); + virtual const FlatImageLevel & level(int lx, int ly) const; + + protected: + + virtual FlatImageLevel * + newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow); +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfFlatImageChannel.cpp b/IlmImfUtil/ImfFlatImageChannel.cpp new file mode 100644 index 0000000..f5baac4 --- /dev/null +++ b/IlmImfUtil/ImfFlatImageChannel.cpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class FlatImageChannel +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImageChannel.h" +#include "ImfFlatImageLevel.h" +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +FlatImageChannel::FlatImageChannel + (FlatImageLevel &level, + int xSampling, + int ySampling, + bool pLinear) +: + ImageChannel (level, xSampling, ySampling, pLinear) +{ + // empty +} + + +FlatImageChannel::~FlatImageChannel () +{ + // empty +} + +FlatImageLevel & +FlatImageChannel::flatLevel () +{ + return static_cast (level()); +} + + +const FlatImageLevel & +FlatImageChannel::flatLevel () const +{ + return static_cast (level()); +} + + +void +FlatImageChannel::resize () +{ + ImageChannel::resize(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfFlatImageChannel.h b/IlmImfUtil/ImfFlatImageChannel.h new file mode 100644 index 0000000..4ffa146 --- /dev/null +++ b/IlmImfUtil/ImfFlatImageChannel.h @@ -0,0 +1,330 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FLAT_IMAGE_CHANNEL_H +#define INCLUDED_IMF_FLAT_IMAGE_CHANNEL_H + +//---------------------------------------------------------------------------- +// +// class FlatImageChannel, +// template class TypedFlatImageChannel +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class FlatImageLevel; + +// +// Image channels: +// +// A TypedFlatImageChannel holds the pixel data for a single channel +// of one level of a flat image. The pixels in the channel are of type T, +// where T is either half, float or unsigned int. Storage is allocated +// only for pixels within the data window of the level. +// + +class FlatImageChannel: public ImageChannel +{ + public: + + // + // Construct an OpenEXR frame buffer slice for this channel. + // This function is needed reading an image from an OpenEXR + // file and for saving an image in an OpenEXR file. + // + + virtual Slice slice () const = 0; + + + // + // Access to the flat image level to which this channel belongs. + // + + FlatImageLevel & flatLevel (); + const FlatImageLevel & flatLevel () const; + + protected: + + friend class FlatImageLevel; + + FlatImageChannel (FlatImageLevel &level, + int xSampling, + int ySampling, + bool pLinear); + + virtual ~FlatImageChannel(); + + virtual void resize (); + + virtual void resetBasePointer () = 0; +}; + + +template +class TypedFlatImageChannel: public FlatImageChannel +{ + public: + + // + // The OpenEXR pixel type of this channel (HALF, FLOAT or UINT). + // + + virtual PixelType pixelType () const; + + + // + // Construct an OpenEXR frame buffer slice for this channel. + // + + virtual Slice slice () const; + + + // + // Access to the pixel at pixel space location (x, y), without + // bounds checking. Accessing a location outside the data window + // of the image level results in undefined behavior. + // + + T & operator () (int x, int y); + const T & operator () (int x, int y) const; + + + // + // Access to the pixel at pixel space location (x, y), with bounds + // checking. Accessing a location outside the data window of the + // image level throws an Iex::ArgExc exception. + // + + T & at (int x, int y); + const T & at (int x, int y) const; + + // + // Faster access to all pixels in a single horizontal row of the + // channel. Rows are numbered from 0 to pixelsPerColumn()-1, and + // each row contains pixelsPerRow() values. + // Access is not bounds checked; accessing out of bounds rows or + // pixels results in undefined behavior. + // + + T * row (int r); + const T * row (int r) const; + + private: + + friend class FlatImageLevel; + + // + // The constructor and destructor are not public because flat + // image channels exist only as parts of a flat image level. + // + + TypedFlatImageChannel (FlatImageLevel &level, + int xSampling, + int ySampling, + bool pLinear); + + virtual ~TypedFlatImageChannel (); + + virtual void resize (); + + virtual void resetBasePointer (); + + T * _pixels; // Pointer to allocated storage + T * _base; // Base pointer for faster pixel access +}; + + +// +// Channel typedefs for the pixel data types supported by OpenEXR. +// + +typedef TypedFlatImageChannel FlatHalfChannel; +typedef TypedFlatImageChannel FlatFloatChannel; +typedef TypedFlatImageChannel FlatUIntChannel; + + +//----------------------------------------------------------------------------- +// Implementation of templates and inline functions +//----------------------------------------------------------------------------- + + +template +TypedFlatImageChannel::TypedFlatImageChannel + (FlatImageLevel &level, + int xSampling, + int ySampling, + bool pLinear) +: + FlatImageChannel (level, xSampling, ySampling, pLinear), + _pixels (0), + _base (0) +{ + resize(); +} + + +template +TypedFlatImageChannel::~TypedFlatImageChannel () +{ + delete [] _pixels; +} + + +template <> +inline PixelType +FlatHalfChannel::pixelType () const +{ + return HALF; +} + + +template <> +inline PixelType +FlatFloatChannel::pixelType () const +{ + return FLOAT; +} + + +template <> +inline PixelType +FlatUIntChannel::pixelType () const +{ + return UINT; +} + + +template +Slice +TypedFlatImageChannel::slice () const +{ + return Slice (pixelType(), // type + (char *) _base, // base + sizeof (T), // xStride + pixelsPerRow() * sizeof (T), // yStride + xSampling(), + ySampling()); +} + + +template +inline T & +TypedFlatImageChannel::operator () (int x, int y) +{ + return _base[(y / ySampling()) * pixelsPerRow() + (x / xSampling())]; +} + + +template +inline const T & +TypedFlatImageChannel::operator () (int x, int y) const +{ + return _base[(y / ySampling()) * pixelsPerRow() + (x / xSampling())]; +} + + +template +inline T & +TypedFlatImageChannel::at (int x, int y) +{ + boundsCheck (x, y); + return _base[(y / ySampling()) * pixelsPerRow() + (x / xSampling())]; +} + + +template +inline const T & +TypedFlatImageChannel::at (int x, int y) const +{ + boundsCheck (x, y); + return _base[(y / ySampling()) * pixelsPerRow() + (x / xSampling())]; +} + + +template +inline T * +TypedFlatImageChannel::row (int r) +{ + return _base + r * pixelsPerRow(); +} + + +template +inline const T * +TypedFlatImageChannel::row (int n) const +{ + return _base + n * pixelsPerRow(); +} + + +template +void +TypedFlatImageChannel::resize () +{ + delete [] _pixels; + _pixels = 0; + + FlatImageChannel::resize(); // may throw an exception + + _pixels = new T [numPixels()]; + + for (size_t i = 0; i < numPixels(); ++i) + _pixels[i] = T (0); + + resetBasePointer (); +} + + +template +void +TypedFlatImageChannel::resetBasePointer () +{ + _base = _pixels - + (level().dataWindow().min.y / ySampling()) * pixelsPerRow() - + (level().dataWindow().min.x / xSampling()); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfFlatImageIO.cpp b/IlmImfUtil/ImfFlatImageIO.cpp new file mode 100644 index 0000000..410d1fd --- /dev/null +++ b/IlmImfUtil/ImfFlatImageIO.cpp @@ -0,0 +1,409 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// OpenEXR file I/O for flat images. +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImageIO.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +void +saveFlatImage + (const string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws) +{ + if (img.levelMode() != ONE_LEVEL || hdr.hasTileDescription()) + saveFlatTiledImage (fileName, hdr, img, dws); + else + saveFlatScanLineImage (fileName, hdr, img, dws); +} + + +void +saveFlatImage + (const string &fileName, + const FlatImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveFlatImage (fileName, hdr, img); +} + + +void +loadFlatImage + (const string &fileName, + Header &hdr, + FlatImage &img) +{ + bool tiled, deep, multiPart; + + if (!isOpenExrFile (fileName.c_str(), tiled, deep, multiPart)) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "The file is not an OpenEXR file."); + } + + if (multiPart) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "Multi-part file loading is not supported."); + } + + if (deep) + { + THROW (ArgExc, "Cannot load deep image file " << fileName << " " + "as a flat image."); + } + + if (tiled) + loadFlatTiledImage (fileName, hdr, img); + else + loadFlatScanLineImage (fileName, hdr, img); +} + + +void +loadFlatImage + (const string &fileName, + FlatImage &img) +{ + Header hdr; + loadFlatImage (fileName, hdr, img); +} + + +void +saveFlatScanLineImage + (const string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws) +{ + Header newHdr; + + for (Header::ConstIterator i = hdr.begin(); i != hdr.end(); ++i) + { + if (strcmp (i.name(), "dataWindow") && + strcmp (i.name(), "tiles") && + strcmp (i.name(), "channels")) + { + newHdr.insert (i.name(), i.attribute()); + } + } + + newHdr.dataWindow() = dataWindowForFile (hdr, img, dws); + + const FlatImageLevel &level = img.level(); + FrameBuffer fb; + + for (FlatImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + { + newHdr.channels().insert (i.name(), i.channel().channel()); + fb.insert (i.name(), i.channel().slice()); + } + + OutputFile out (fileName.c_str(), newHdr); + out.setFrameBuffer (fb); + out.writePixels (newHdr.dataWindow().max.y - newHdr.dataWindow().min.y + 1); +} + + +void +saveFlatScanLineImage + (const string &fileName, + const FlatImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveFlatScanLineImage (fileName, hdr, img); +} + + +void +loadFlatScanLineImage + (const string &fileName, + Header &hdr, + FlatImage &img) +{ + InputFile in (fileName.c_str()); + + const ChannelList &cl = in.header().channels(); + + img.clearChannels(); + + for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) + img.insertChannel (i.name(), i.channel()); + + img.resize (in.header().dataWindow(), ONE_LEVEL, ROUND_DOWN); + + FlatImageLevel &level = img.level(); + FrameBuffer fb; + + for (FlatImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + in.setFrameBuffer (fb); + in.readPixels (level.dataWindow().min.y, level.dataWindow().max.y); + + for (Header::ConstIterator i = in.header().begin(); + i != in.header().end(); + ++i) + { + if (strcmp (i.name(), "tiles")) + hdr.insert (i.name(), i.attribute()); + } +} + + +void +loadFlatScanLineImage + (const string &fileName, + FlatImage &img) +{ + Header hdr; + loadFlatScanLineImage (fileName, hdr, img); +} + + +namespace { + +void +saveLevel (TiledOutputFile &out, const FlatImage &img, int x, int y) +{ + const FlatImageLevel &level = img.level (x, y); + FrameBuffer fb; + + for (FlatImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + out.setFrameBuffer (fb); + out.writeTiles (0, out.numXTiles (x) - 1, 0, out.numYTiles (y) - 1, x, y); +} + +} // namespace + + +void +saveFlatTiledImage + (const string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws) +{ + Header newHdr; + + for (Header::ConstIterator i = hdr.begin(); i != hdr.end(); ++i) + { + if (strcmp (i.name(), "dataWindow") && + strcmp (i.name(), "tiles") && + strcmp (i.name(), "channels")) + { + newHdr.insert (i.name(), i.attribute()); + } + } + + if (hdr.hasTileDescription()) + { + newHdr.setTileDescription + (TileDescription (hdr.tileDescription().xSize, + hdr.tileDescription().ySize, + img.levelMode(), + img.levelRoundingMode())); + } + else + { + newHdr.setTileDescription + (TileDescription (64, // xSize + 64, // ySize + img.levelMode(), + img.levelRoundingMode())); + } + + newHdr.dataWindow() = dataWindowForFile (hdr, img, dws); + + const FlatImageLevel &level = img.level (0, 0); + + for (FlatImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + newHdr.channels().insert (i.name(), i.channel().channel()); + + TiledOutputFile out (fileName.c_str(), newHdr); + + switch (img.levelMode()) + { + case ONE_LEVEL: + + saveLevel (out, img, 0, 0); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < out.numLevels(); ++x) + saveLevel (out, img, x, x); + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < out.numYLevels(); ++y) + for (int x = 0; x < out.numXLevels(); ++x) + saveLevel (out, img, x, y); + + break; + + default: + + assert (false); + } +} + + +void +saveFlatTiledImage + (const string &fileName, + const FlatImage &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveFlatTiledImage (fileName, hdr, img); +} + + +namespace { + +void +loadLevel (TiledInputFile &in, FlatImage &img, int x, int y) +{ + FlatImageLevel &level = img.level (x, y); + FrameBuffer fb; + + for (FlatImageLevel::ConstIterator i = level.begin(); i != level.end(); ++i) + fb.insert (i.name(), i.channel().slice()); + + in.setFrameBuffer (fb); + in.readTiles (0, in.numXTiles (x) - 1, 0, in.numYTiles (y) - 1, x, y); +} + +} // namespace + + +void +loadFlatTiledImage + (const string &fileName, + Header &hdr, + FlatImage &img) +{ + TiledInputFile in (fileName.c_str()); + + const ChannelList &cl = in.header().channels(); + + img.clearChannels(); + + for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) + img.insertChannel (i.name(), i.channel()); + + img.resize (in.header().dataWindow(), + in.header().tileDescription().mode, + in.header().tileDescription().roundingMode); + + switch (img.levelMode()) + { + case ONE_LEVEL: + + loadLevel (in, img, 0, 0); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img.numLevels(); ++x) + loadLevel (in, img, x, x); + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img.numYLevels(); ++y) + for (int x = 0; x < img.numXLevels(); ++x) + loadLevel (in, img, x, y); + + break; + + default: + + assert (false); + } + + for (Header::ConstIterator i = in.header().begin(); + i != in.header().end(); + ++i) + { + hdr.insert (i.name(), i.attribute()); + } +} + + +void +loadFlatTiledImage + (const string &fileName, + FlatImage &img) +{ + Header hdr; + loadFlatTiledImage (fileName, hdr, img); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfFlatImageIO.h b/IlmImfUtil/ImfFlatImageIO.h new file mode 100644 index 0000000..2cce0ee --- /dev/null +++ b/IlmImfUtil/ImfFlatImageIO.h @@ -0,0 +1,220 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FLAT_IMAGE_IO_H +#define INCLUDED_IMF_FLAT_IMAGE_IO_H + +//---------------------------------------------------------------------------- +// +// Functions to load flat images from OpenEXR files +// and to save flat images in OpenEXR files. +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImage.h" +#include "ImfImageDataWindow.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// saveFlatImage (n, h, i, d) or +// saveFlatImage (n, i) +// +// Saves image i in an OpenEXR file with name n. The file will be +// tiled if the image has more than one level, or if a header, h, is +// given and contains a tile description attribute; otherwise the +// file will be scan-line based. +// +// If header h is given, then the channel list in h is replaced with +// the channel list in i, and the levelMode and the levelRounding mode +// fields of the tile description are replaced with the level mode +// and the levelRounding mode of i. In addition, if the data window +// source flag, d, is set to USE_IMAGE_DATA_WINDOW, then the data +// window in the image is copied into the header; if d is set to +// USE_HEADER_DATA_WINDOW, then the data window in the header is +// replaced with the intersection of the original data window in the +// header and the data window in the image. The modified header then +// becomes the header of the image file. +// + +IMF_EXPORT +void +saveFlatImage + (const std::string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveFlatImage + (const std::string &fileName, + const FlatImage &img); + +// +// loadFlatImage (n, h, i) or +// loadFlatImage (n, i) +// +// Loads flat image i from the OpenEXR file with name n. +// +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadFlatImage + (const std::string &fileName, + Header &hdr, + FlatImage &img); + + +IMF_EXPORT +void +loadFlatImage + (const std::string &fileName, + FlatImage &img); + + +// +// saveFlatScanLineImage (n, h, i, d) or +// saveFlatScanLineImage (n, i) +// +// Saves image i in a scan-line based flat OpenEXR file with file name n. +// +// If header h is given, then the channel list in h is replaced with +// the channel list in i. In addition, if the data window source flag, d, +// is set to USE_IMAGE_DATA_WINDOW, then the data window in the image is +// copied into the header; if d is set to USE_HEADER_DATA_WINDOW, then +// the data window in the header is replaced with the intersection of +// the original data window in the header and the data window in the +// image. The modified header then becomes the header of the image file. +// + +IMF_EXPORT +void +saveFlatScanLineImage + (const std::string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveFlatScanLineImage + (const std::string &fileName, + const FlatImage &img); + + +// +// loadFlatScanLineImage (n, h, i) or +// loadFlatScanLineImage (n, i) +// +// Loads image i from a scan-line based flat OpenEXR file with file name n. +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadFlatScanLineImage + (const std::string &fileName, + Header &hdr, + FlatImage &img); + +IMF_EXPORT +void +loadFlatScanLineImage + (const std::string &fileName, + FlatImage &img); + +// +// saveFlatTiledImage (n, h, i, d) or +// saveFlatTiledImage (n, i) +// +// Saves image i in a tiled flat OpenEXR file with file name n. +// +// If header h is given, then the channel list in h is replaced with +// the channel list i, and the levelMode and the levelRounding mode +// fields of the tile description are replaced with the level mode +// and the levelRounding mode of i. In addition, if the data window +// source flag, d, is set to USE_IMAGE_DATA_WINDOW, then the data +// window in the image is copied into the header; if d is set to +// USE_HEADER_DATA_WINDOW, then the data window in the header is +// replaced with the intersection of the original data window in the +// header and the data window in the image. The modified header then +// becomes the header of the image file. +// +// Note: USE_HEADER_DATA_WINDOW can only be used for images with +// level mode ONE_LEVEL. +// + +IMF_EXPORT +void +saveFlatTiledImage + (const std::string &fileName, + const Header &hdr, + const FlatImage &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveFlatTiledImage + (const std::string &fileName, + const FlatImage &img); + +// +// loadFlatTiledImage (n, h, i) or +// loadFlatTiledImage (n, i) +// +// Loads image i from a tiled flat OpenEXR file with file name n. +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +void +loadFlatTiledImage + (const std::string &fileName, + Header &hdr, + FlatImage &img); + +IMF_EXPORT +void +loadFlatTiledImage + (const std::string &fileName, + FlatImage &img); + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfFlatImageLevel.cpp b/IlmImfUtil/ImfFlatImageLevel.cpp new file mode 100644 index 0000000..dea943d --- /dev/null +++ b/IlmImfUtil/ImfFlatImageLevel.cpp @@ -0,0 +1,265 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class FlatImageLevel +// +//---------------------------------------------------------------------------- + +#include "ImfFlatImageLevel.h" +#include "ImfFlatImage.h" +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +FlatImageLevel::FlatImageLevel + (FlatImage& image, + int xLevelNumber, + int yLevelNumber, + const Box2i& dataWindow) +: + ImageLevel (image, xLevelNumber, yLevelNumber) +{ + resize (dataWindow); +} + + +FlatImage & +FlatImageLevel::flatImage () +{ + return static_cast (image()); +} + + +const FlatImage & +FlatImageLevel::flatImage () const +{ + return static_cast (image()); +} + + +FlatImageLevel::~FlatImageLevel () +{ + clearChannels(); +} + + +void +FlatImageLevel::resize (const Imath::Box2i& dataWindow) +{ + // + // Note: if the following code throws an exception, then the image level + // may be left in an inconsistent state where some channels have been + // resized, but others have not. However, the image to which this level + // belongs will catch the exception and clean up the mess. + // + + ImageLevel::resize (dataWindow); + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resize(); +} + + +void +FlatImageLevel::shiftPixels (int dx, int dy) +{ + ImageLevel::shiftPixels (dx, dy); + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resetBasePointer(); +} + + +void +FlatImageLevel::insertChannel + (const string& name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear) +{ + if (_channels.find (name) != _channels.end()) + throwChannelExists (name); + + switch (type) + { + case HALF: + _channels[name] = + new FlatHalfChannel (*this, xSampling, ySampling, pLinear); + break; + + case FLOAT: + _channels[name] = + new FlatFloatChannel (*this, xSampling, ySampling, pLinear); + break; + + case UINT: + _channels[name] = + new FlatUIntChannel (*this, xSampling, ySampling, pLinear); + break; + + default: + assert (false); + } +} + + +void +FlatImageLevel::eraseChannel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i != _channels.end()) + { + delete i->second; + _channels.erase (i); + } +} + + +void +FlatImageLevel::clearChannels () +{ + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + delete i->second; + + _channels.clear(); +} + + +void +FlatImageLevel::renameChannel (const string &oldName, const string &newName) +{ + ChannelMap::iterator oldChannel = _channels.find (oldName); + + assert (oldChannel != _channels.end()); + assert (_channels.find (newName) == _channels.end()); + + _channels[newName] = oldChannel->second; + _channels.erase (oldChannel); +} + + +void +FlatImageLevel::renameChannels (const RenamingMap &oldToNewNames) +{ + renameChannelsInMap (oldToNewNames, _channels); +} + + +FlatImageChannel * +FlatImageLevel::findChannel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i != _channels.end()) + return i->second; + else + return 0; +} + + +const FlatImageChannel * +FlatImageLevel::findChannel (const string& name) const +{ + ChannelMap::const_iterator i = _channels.find (name); + + if (i != _channels.end()) + return i->second; + else + return 0; +} + + +FlatImageChannel & +FlatImageLevel::channel (const string& name) +{ + ChannelMap::iterator i = _channels.find (name); + + if (i == _channels.end()) + throwBadChannelName (name); + + return *i->second; +} + + +const FlatImageChannel & +FlatImageLevel::channel (const string& name) const +{ + ChannelMap::const_iterator i = _channels.find (name); + + if (i == _channels.end()) + throwBadChannelName (name); + + return *i->second; +} + + +FlatImageLevel::Iterator +FlatImageLevel::begin () +{ + return _channels.begin(); +} + + +FlatImageLevel::ConstIterator +FlatImageLevel::begin () const +{ + return _channels.begin(); +} + + +FlatImageLevel::Iterator +FlatImageLevel::end () +{ + return _channels.end(); +} + + +FlatImageLevel::ConstIterator +FlatImageLevel::end () const +{ + return _channels.end(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfFlatImageLevel.h b/IlmImfUtil/ImfFlatImageLevel.h new file mode 100644 index 0000000..5e3639d --- /dev/null +++ b/IlmImfUtil/ImfFlatImageLevel.h @@ -0,0 +1,398 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_FLAT_IMAGE_LEVEL_H +#define INCLUDED_IMF_FLAT_IMAGE_LEVEL_H + +//---------------------------------------------------------------------------- +// +// class FlatImageLevel +// class FlatImageLevel::Iterator +// class FlatImageLevel::ConstIterator +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class FlatImage; + +class IMF_EXPORT FlatImageLevel : public ImageLevel +{ + public: + + // + // Access to the flat image to which the level belongs. + // + + FlatImage & flatImage(); + const FlatImage & flatImage() const; + + + + // + // Accessing channels by name: + // + // findChannel(n) returns a pointer to the image channel with + // name n, or 0 if no such channel exists. + // + // channel(n) returns a reference to the image channel with + // name n, or throws an Iex::ArgExc exception if + // no such channel exists. + // + // findTypedChannel(n) returns a pointer to the image channel with + // name n and type T, or 0 if no such channel + // exists. + // + // typedChannel(n) returns a reference to the image channel with + // name n and type T, or throws an Iex::ArgExc + // exception if no such channel exists. + // + + FlatImageChannel * findChannel (const std::string& name); + const FlatImageChannel * findChannel (const std::string& name) const; + + FlatImageChannel & channel (const std::string& name); + const FlatImageChannel & channel (const std::string& name) const; + + template + TypedFlatImageChannel * findTypedChannel + (const std::string& name); + + template + const TypedFlatImageChannel * findTypedChannel + (const std::string& name) const; + + template + TypedFlatImageChannel & typedChannel + (const std::string& name); + + template + const TypedFlatImageChannel & typedChannel + (const std::string& name) const; + + // + // Iterator-style access to channels + // + + typedef std::map ChannelMap; + + class Iterator; + class ConstIterator; + + Iterator begin(); + ConstIterator begin() const; + + Iterator end(); + ConstIterator end() const; + + private: + + friend class FlatImage; + + // + // The constructor and destructor are private. + // Image levels exist only as part of an image. + // + + FlatImageLevel (FlatImage& image, + int xLevelNumber, + int yLevelNumber, + const IMATH_NAMESPACE::Box2i& dataWindow); + + virtual ~FlatImageLevel (); + + virtual void resize (const IMATH_NAMESPACE::Box2i& dataWindow); + + virtual void shiftPixels (int dx, int dy); + + virtual void insertChannel (const std::string& name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear); + + virtual void eraseChannel (const std::string& name); + + virtual void clearChannels (); + + virtual void renameChannel (const std::string &oldName, + const std::string &newName); + + virtual void renameChannels (const RenamingMap &oldToNewNames); + + ChannelMap _channels; +}; + + +class FlatImageLevel::Iterator +{ + public: + + Iterator (); + Iterator (const FlatImageLevel::ChannelMap::iterator& i); + + + // + // Advance the iterator + // + + Iterator & operator ++ (); + Iterator operator ++ (int); + + + // + // Access to the channel to which the iterator points, + // and to the name of that channel. + // + + const std::string & name () const; + FlatImageChannel & channel () const; + + private: + + friend class FlatImageLevel::ConstIterator; + + FlatImageLevel::ChannelMap::iterator _i; +}; + + +class FlatImageLevel::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const FlatImageLevel::ChannelMap::const_iterator& i); + ConstIterator (const FlatImageLevel::Iterator& other); + + + // + // Advance the iterator + // + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + + // + // Access to the channel to which the iterator points, + // and to the name of that channel. + // + + const std::string & name () const; + const FlatImageChannel & channel () const; + + private: + + friend bool operator == + (const ConstIterator &, const ConstIterator &); + + friend bool operator != + (const ConstIterator &, const ConstIterator &); + + FlatImageLevel::ChannelMap::const_iterator _i; +}; + + +//----------------------------------------------------------------------------- +// Implementation of templates and inline functions +//----------------------------------------------------------------------------- + + +template +TypedFlatImageChannel * +FlatImageLevel::findTypedChannel (const std::string& name) +{ + return dynamic_cast *> (findChannel (name)); +} + + +template +const TypedFlatImageChannel * +FlatImageLevel::findTypedChannel (const std::string& name) const +{ + return dynamic_cast *> (findChannel (name)); +} + + +template +TypedFlatImageChannel & +FlatImageLevel::typedChannel (const std::string& name) +{ + TypedFlatImageChannel * ptr = findTypedChannel (name); + + if (ptr == 0) + throwBadChannelNameOrType (name); + + return *ptr; +} + + +template +const TypedFlatImageChannel & +FlatImageLevel::typedChannel (const std::string& name) const +{ + const TypedFlatImageChannel * ptr = findTypedChannel (name); + + if (ptr == 0) + throwBadChannelNameOrType (name); + + return *ptr; +} + + +inline +FlatImageLevel::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +FlatImageLevel::Iterator::Iterator (const FlatImageLevel::ChannelMap::iterator& i): + _i (i) +{ + // empty +} + + +inline FlatImageLevel::Iterator & +FlatImageLevel::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FlatImageLevel::Iterator +FlatImageLevel::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const std::string & +FlatImageLevel::Iterator::name () const +{ + return _i->first; +} + + +inline FlatImageChannel & +FlatImageLevel::Iterator::channel () const +{ + return *_i->second; +} + + +inline +FlatImageLevel::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +FlatImageLevel::ConstIterator::ConstIterator + (const FlatImageLevel::ChannelMap::const_iterator& i): _i (i) +{ + // empty +} + + +inline +FlatImageLevel::ConstIterator::ConstIterator + (const FlatImageLevel::Iterator& other): _i (other._i) +{ + // empty +} + +inline FlatImageLevel::ConstIterator & +FlatImageLevel::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FlatImageLevel::ConstIterator +FlatImageLevel::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const std::string & +FlatImageLevel::ConstIterator::name () const +{ + return _i->first; +} + +inline const FlatImageChannel & +FlatImageLevel::ConstIterator::channel () const +{ + return *_i->second; +} + + +inline bool +operator == (const FlatImageLevel::ConstIterator& x, + const FlatImageLevel::ConstIterator& y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const FlatImageLevel::ConstIterator& x, + const FlatImageLevel::ConstIterator& y) +{ + return !(x == y); +} + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImage.cpp b/IlmImfUtil/ImfImage.cpp new file mode 100644 index 0000000..bf0d64b --- /dev/null +++ b/IlmImfUtil/ImfImage.cpp @@ -0,0 +1,671 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class Image +// +//---------------------------------------------------------------------------- + +#include "ImfImage.h" +#include +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + +namespace { + +int +levelSize (int min, int max, int l, LevelRoundingMode levelRoundingMode) +{ + assert (l >= 0); + + if (max < min) + return 0; + + int a = max - min + 1; + int b = (1 << l); + int size = a / b; + + if (levelRoundingMode == ROUND_UP && size * b < a) + size += 1; + + return std::max (size, 1); +} + + +Box2i +computeDataWindowForLevel + (const Box2i& dataWindow, + int lx, int ly, + LevelRoundingMode lrMode) +{ + V2i levelMax = + dataWindow.min + + V2i (levelSize (dataWindow.min.x, dataWindow.max.x, lx, lrMode) - 1, + levelSize (dataWindow.min.y, dataWindow.max.y, ly, lrMode) - 1); + + return Box2i (dataWindow.min, levelMax); +} + +int +floorLog2 (int x) +{ + // + // For x > 0, floorLog2(y) returns floor(log(x)/log(2)). + // + + int y = 0; + + while (x > 1) + { + y += 1; + x >>= 1; + } + + return y; +} + + +int +ceilLog2 (int x) +{ + // + // For x > 0, ceilLog2(y) returns ceil(log(x)/log(2)). + // + + int y = 0; + int r = 0; + + while (x > 1) + { + if (x & 1) + r = 1; + + y += 1; + x >>= 1; + } + + return y + r; +} + + +int +roundLog2 (int x, LevelRoundingMode levelRoundingMode) +{ + if (x < 1) + return 1; + + return (levelRoundingMode == ROUND_DOWN)? floorLog2 (x): ceilLog2 (x); +} + + +int +computeNumXLevels + (const Box2i& dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +{ + int n = 0; + + switch (levelMode) + { + case ONE_LEVEL: + + n = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = dataWindow.max.x - dataWindow.min.x + 1; + int h = dataWindow.max.y - dataWindow.min.y + 1; + n = roundLog2 (std::max (w, h), levelRoundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int w = dataWindow.max.x - dataWindow.min.x + 1; + n = roundLog2 (w, levelRoundingMode) + 1; + } + break; + + default: + + assert (false); + } + + return n; +} + + +int +computeNumYLevels + (const Box2i& dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +{ + int n = 0; + + switch (levelMode) + { + case ONE_LEVEL: + + n = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = dataWindow.max.x - dataWindow.min.x + 1; + int h = dataWindow.max.y - dataWindow.min.y + 1; + n = roundLog2 (std::max (w, h), levelRoundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int h = dataWindow.max.y - dataWindow.min.y + 1; + n = roundLog2 (h, levelRoundingMode) + 1; + } + break; + + default: + + assert (false); + } + + return n; +} + +} // namespace + + +Image::Image (): + _dataWindow (Box2i (V2i (0, 0), V2i (-1, -1))), + _levelMode (ONE_LEVEL), + _levelRoundingMode (ROUND_DOWN), + _channels(), + _levels() +{ + // empty +} + + +Image::~Image () +{ + clearLevels(); + clearChannels(); +} + + +LevelMode +Image::levelMode () const +{ + return _levelMode; +} + + +LevelRoundingMode +Image::levelRoundingMode () const +{ + return _levelRoundingMode; +} + + +int +Image::numLevels () const +{ + if (_levelMode == ONE_LEVEL || _levelMode == MIPMAP_LEVELS) + return numXLevels(); + else + throw LogicExc ("Number of levels query for image " + "must specify x or y direction."); +} + + +int +Image::numXLevels () const +{ + return _levels.width(); +} + + +int +Image::numYLevels () const +{ + return _levels.height(); +} + + +const Box2i & +Image::dataWindow () const +{ + return _dataWindow; +} + + +const Box2i & +Image::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +const Box2i & +Image::dataWindowForLevel (int lx, int ly) const +{ + if (!levelNumberIsValid (lx, ly)) + { + THROW (ArgExc, + "Cannot get data window for invalid image " + "level (" << lx << ", " << ly << ")."); + } + + return _levels[ly][lx]->dataWindow(); +} + + +int +Image::levelWidth (int lx) const +{ + if (lx < 0 || lx >= numXLevels()) + { + THROW (ArgExc, + "Cannot get level width for invalid " + "image level number " << lx << "."); + } + + return levelSize (_dataWindow.min.x, _dataWindow.max.x, + lx, _levelRoundingMode); +} + + +int +Image::levelHeight (int ly) const +{ + if (ly < 0 || ly >= numYLevels()) + { + THROW (ArgExc, + "Cannot get level height for invalid " + "image level number " << ly << "."); + } + + return levelSize (_dataWindow.min.y, _dataWindow.max.y, + ly, _levelRoundingMode); +} + + +void +Image::resize (const Imath::Box2i &dataWindow) +{ + resize (dataWindow, _levelMode, _levelRoundingMode); +} + + +void +Image::resize + (const Imath::Box2i &dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +{ + try + { + clearLevels(); + + int nx = computeNumXLevels (dataWindow, levelMode, levelRoundingMode); + int ny = computeNumYLevels (dataWindow, levelMode, levelRoundingMode); + + _levels.resizeErase (ny, nx); + + for (int y = 0; y < ny; ++y) + { + for (int x = 0; x < nx; ++x) + { + if (levelMode == MIPMAP_LEVELS && x != y) + { + _levels[y][x] = 0; + continue; + } + + Box2i levelDataWindow = + computeDataWindowForLevel (dataWindow, + x, y, + levelRoundingMode); + + _levels[y][x] = newLevel (x, y, levelDataWindow); + + for (ChannelMap::iterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + _levels[y][x]->insertChannel (i->first, + i->second.type, + i->second.xSampling, + i->second.ySampling, + i->second.pLinear); + } + } + } + + _dataWindow = dataWindow; + _levelMode = levelMode; + _levelRoundingMode = levelRoundingMode; + } + catch (...) + { + clearLevels(); + throw; + } +} + + +void +Image::shiftPixels (int dx, int dy) +{ + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + { + if (dx % i->second.xSampling != 0) + { + THROW (ArgExc, "Cannot shift image horizontally by " << dx << " " + "pixels. The shift distance must be a multiple " + "of the x sampling rate of all channels, but the " + "x sampling rate channel " << i->first << " " + "is " << i->second.xSampling << "."); + } + + if (dy % i->second.ySampling != 0) + { + THROW (ArgExc, "Cannot shift image vertically by " << dy << " " + "pixels. The shift distance must be a multiple " + "of the y sampling rate of all channels, but the " + "y sampling rate channel " << i->first << " " + "is " << i->second.ySampling << "."); + } + } + + _dataWindow.min.x += dx; + _dataWindow.min.y += dy; + _dataWindow.max.x += dx; + _dataWindow.max.y += dy; + + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->shiftPixels (dx, dy); +} + + +void +Image::insertChannel + (const std::string &name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear) +{ + try + { + _channels[name] = ChannelInfo (type, xSampling, ySampling, pLinear); + + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->insertChannel + (name, type, xSampling, ySampling, pLinear); + } + catch (...) + { + eraseChannel (name); + throw; + } +} + + +void +Image::insertChannel (const string &name, const Channel &channel) +{ + insertChannel (name, + channel.type, + channel.xSampling, + channel.ySampling, + channel.pLinear); +} + + +void +Image::eraseChannel (const std::string &name) +{ + // + // Note: eraseChannel() is called to clean up if an exception is + // thrown during a call during insertChannel(), so eraseChannel() + // must work correctly even after an incomplete insertChannel() + // operation. + // + + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->eraseChannel (name); + + ChannelMap::iterator i = _channels.find (name); + + if (i != _channels.end()) + _channels.erase (i); +} + + +void +Image::clearChannels () +{ + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->clearChannels(); + + _channels.clear(); +} + + +void +Image::renameChannel (const string &oldName, const string &newName) +{ + if (oldName == newName) + return; + + ChannelMap::iterator oldChannel = _channels.find (oldName); + + if (oldChannel == _channels.end()) + { + THROW (ArgExc, "Cannot rename image channel " << oldName << " " + "to " << newName << ". The image does not have " + "a channel called " << oldName << "."); + } + + if (_channels.find (newName) != _channels.end()) + { + THROW (ArgExc, "Cannot rename image channel " << oldName << " " + "to " << newName << ". The image already has " + "a channel called " << newName << "."); + } + + try + { + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->renameChannel (oldName, newName); + + _channels[newName] = oldChannel->second; + _channels.erase (oldChannel); + } + catch (...) + { + eraseChannel (oldName); + eraseChannel (newName); + throw; + } +} + + +void +Image::renameChannels (const RenamingMap &oldToNewNames) +{ + set newNames; + + for (ChannelMap::const_iterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + RenamingMap::const_iterator j = oldToNewNames.find (i->first); + std::string newName = (j == oldToNewNames.end())? i->first: j->second; + + if (newNames.find (newName) != newNames.end()) + { + THROW (ArgExc, "Cannot rename image channels. More than one " + "channel would be named \"" << newName << "\"."); + } + else + { + newNames.insert (newName); + } + } + + try + { + renameChannelsInMap (oldToNewNames, _channels); + + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + if (_levels[y][x]) + _levels[y][x]->renameChannels (oldToNewNames); + } + catch (...) + { + clearChannels(); + throw; + } +} + + +ImageLevel & +Image::level (int l) +{ + return level (l, l); +} + + +const ImageLevel & +Image::level (int l) const +{ + return level (l, l); +} + + +ImageLevel & +Image::level (int lx, int ly) +{ + if (!levelNumberIsValid (lx, ly)) + { + THROW (ArgExc, + "Cannot access image level with invalid " + "level number (" << lx << ", " << ly << ")."); + } + + return *_levels[ly][lx]; +} + + +const ImageLevel & +Image::level (int lx, int ly) const +{ + if (!levelNumberIsValid (lx, ly)) + { + THROW (ArgExc, + "Cannot access image level with invalid " + "level number (" << lx << ", " << ly << ")."); + } + + return *_levels[ly][lx]; +} + + +bool +Image::levelNumberIsValid (int lx, int ly) const +{ + return lx >= 0 && lx < _levels.width() && + ly >= 0 && ly < _levels.height() && + _levels[ly][lx] != 0; +} + + +void +Image::clearLevels () +{ + _dataWindow = Box2i (V2i (0, 0), V2i (-1, -1)); + + for (int y = 0; y < _levels.height(); ++y) + for (int x = 0; x < _levels.width(); ++x) + delete _levels[y][x]; + + _levels.resizeErase (0, 0); +} + + +Image::ChannelInfo::ChannelInfo + (PixelType type, + int xSampling, + int ySampling, + bool pLinear) +: + type (type), + xSampling (xSampling), + ySampling (ySampling), + pLinear (pLinear) +{ + // empty +} + + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfImage.h b/IlmImfUtil/ImfImage.h new file mode 100644 index 0000000..a65c1d1 --- /dev/null +++ b/IlmImfUtil/ImfImage.h @@ -0,0 +1,374 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_H +#define INCLUDED_IMF_IMAGE_H + +//---------------------------------------------------------------------------- +// +// class Image -- an in-memory data structure that can hold an arbitrary +// OpenEXR image, flat or deep, with one or multiple resolution levels, +// and with an arbitrary set of channels. +// +// An image is a container for a set of image levels, and an image level +// is a container for a set of image channels. An image channel contains +// an array of pixel values of type half, float or unsigned int. +// +// For example: +// +// image --+-- level 0 --+-- channel "R" --- pixel data +// | | +// | +-- channel "G" --- pixel data +// | | +// | +-- channel "B" --- pixel data +// | +// +-- level 1 --+-- channel "R" --- pixel data +// | | +// | +-- channel "G" --- pixel data +// | | +// | +-- channel "B" --- pixel data +// | +// +-- level 2 --+-- channel "R" --- pixel data +// | +// +-- channel "G" --- pixel data +// | +// +-- channel "B" --- pixel data +// +// An image has a level mode, which can be ONE_LEVEL, MIPMAP_LEVELS or +// RIPMAP_LEVELS, and a level rounding mode, which can be ROUND_UP or +// ROUND_DOWN. Together, the level mode and the level rounding mode +// determine how many levels an image contains, and how large the data +// window for each level is. All levels in an image have the same set +// of channels. +// +// An image channel has a name (e.g. "R", "Z", or "xVelocity"), a type +// (HALF, FLOAT or UINT) and x and y sampling rates. A channel stores +// samples for a pixel if the pixel is inside the data window of the +// level to which the channel belongs, and the x and y coordinates of +// the pixel are divisible by the x and y sampling rates of the channel. +// +// An image can be either flat or deep. In a flat image each channel +// in each level stores at most one value per pixel. In a deep image +// each channel in each level stores an arbitrary number of values per +// pixel. As an exception, each level of a deep image has a sample count +// channel with a single value per pixel; this value determines how many +// values each of the other channels in the same level has at the same +// pixel location. +// +// The classes Image, ImageLevel and ImageChannel are abstract base +// classes. Two sets of concrete classes, one for flat and one for +// deep images, are derived from the base classes. +// +//---------------------------------------------------------------------------- + +#include "ImfImageLevel.h" +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class Channel; + + +class IMF_EXPORT Image +{ + public: + + // + // Constructor and destructor + // + + Image (); + virtual ~Image (); + + + // + // Access to the image's level mode and level rounding mode. + // + + LevelMode levelMode() const; + LevelRoundingMode levelRoundingMode() const; + + + // + // Number of levels: + // + // numXLevels() returns the image's number of levels in the x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // h is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the image's number of levels in the y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with MIPMAP_LEVELS images. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // a LogicExc exception is thrown + // + + int numLevels() const; + int numXLevels() const; + int numYLevels() const; + + + // + // Per-level data windows + // + // dataWindow() returns the data window for the image; this is the + // same as the data window for the level with level number (0, 0). + // + // dataWindowForLevel(lx, ly) returns the data window for level x, + // that is, the window for which the image level with level number + // (lx, ly) has allocated pixel storage. + // + // return value is a Box2i with min value: + // (dataWindow().min.x, + // dataWindow().min.y) + // + // and max value: + // (dataWindow().min.x + levelWidth(lx) - 1, + // dataWindow().min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(l) is a convenience function used for ONE_LEVEL + // and MIPMAP_LEVELS files. It returns dataWindowForLevel(l,l)). + // + + const IMATH_NAMESPACE::Box2i & dataWindow() const; + const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int l) const; + const IMATH_NAMESPACE::Box2i & dataWindowForLevel(int lx, int ly) const; + + + // + // Size of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + // + // Resize the image: + // + // resize(dw,lm,lrm) sets the data window of the image to dw, + // sets the level mode to lm and the level rounding mode to lrm, + // and allocates new storage for image levels and image channels. + // The set of channels in the image does not change. + // + // The contents of the image are lost; pixel data are not preserved + // across the resize operation. If resizing fails, then the image + // will be left with an empty data window and no image levels. + // + // resize(dw) is the same as resize(dw,levelMode(),levelRoundingMode()) + // + + void resize(const IMATH_NAMESPACE::Box2i &dataWindow); + + virtual void resize(const IMATH_NAMESPACE::Box2i &dataWindow, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode); + + // + // Shift the pixels and the data window of an image: + // + // shiftPixels(dx,dy) shifts the image by dx pixels horizontally and + // dy pixels vertically. A pixel at location (x,y) moves to position + // (x+dx, y+dy). The data window of the image is shifted along with + // the pixels. No pixel data are lost. + // + // The horizontal and vertical shift distances must be multiples of + // the x and y sampling rates of all image channels. If they are not, + // shiftPixels() throws an ArgExc exception. + // + + void shiftPixels(int dx, int dy); + + + // + // Insert a new channel into the image. + // + // The arguments to this function are the same as for adding a + // a channel to an OpenEXR file: channel name, x and y sampling + // rates, and a "perceptually approximately linear" flag. + // + // If the image already contains a channel with the same name + // as the new name then the existing channel is deleted before + // the new channel is added. + // + + void insertChannel (const std::string &name, + PixelType type, + int xSampling = 1, + int ySampling = 1, + bool pLinear = false); + + void insertChannel (const std::string &name, + const Channel &channel); + + // + // Erase channels from an image: + // + // eraseChannel(n) erases the channel with name n. + // clearChannels() erases all channels. + // + + void eraseChannel(const std::string &name); + void clearChannels(); + + + // + // Rename an image channel: + // + // renameChannel(nOld,nNew) changes the name of the image channel + // with name nOld to nNew. + // + // If the image already contains a channel called nNew, or if the + // image does not contain a channel called nOld, then renameChannel() + // throws an ArgExc exception. + // + // In the (unlikely) event that renaming the image channel causes + // the program to run out of memory, renameChannel() erases the + // channel that is being renamed, and throws an exception. + // + + void renameChannel(const std::string &oldName, + const std::string &newName); + + // + // Rename multiple image channels at the same time: + // + // Given a map, m, from old to new channel names, renameChannels(m) + // assigns new names to the channels in the image. If m has an entry + // for a channel named c, then the channel will be renamed to m[c]. + // If m has no entry for c, then the channel keeps its old name. + // + // If the same name would be assigned to more than one channel, then + // renameChannels() does not rename any channels but throws an ArgExc + // exception instead. + // + // In the (unlikely) event that renaming the image channel causes the + // program to run out of memory, renameChannels() erases all channels + // in the image and throws an exception. + // + + void renameChannels(const RenamingMap &oldToNewNames); + + + // + // Accessing image levels by level number. + // + // level(lx,ly) returns a reference to the image level + // with level number (lx,ly). + // + // level(l) returns level(l,l). + // + + virtual ImageLevel & level (int l = 0); + virtual const ImageLevel & level (int l = 0) const; + + virtual ImageLevel & level (int lx, int ly); + virtual const ImageLevel & level (int lx, int ly) const; + + + protected: + + virtual ImageLevel * + newLevel (int lx, int ly, const IMATH_NAMESPACE::Box2i &dataWindow) = 0; + + private: + + bool levelNumberIsValid (int lx, int ly) const; + void clearLevels (); + + struct ChannelInfo + { + ChannelInfo (PixelType type = HALF, + int xSampling = 1, + int ySampling = 1, + bool pLinear = false); + + PixelType type; + int xSampling; + int ySampling; + bool pLinear; + }; + + typedef std::map ChannelMap; + + IMATH_NAMESPACE::Box2i _dataWindow; + LevelMode _levelMode; + LevelRoundingMode _levelRoundingMode; + ChannelMap _channels; + Array2D _levels; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImageChannel.cpp b/IlmImfUtil/ImfImageChannel.cpp new file mode 100644 index 0000000..3580bf7 --- /dev/null +++ b/IlmImfUtil/ImfImageChannel.cpp @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class ImageChannel +// +//---------------------------------------------------------------------------- + +#include "ImfImageChannel.h" +#include "ImfImageLevel.h" +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +ImageChannel::ImageChannel + (ImageLevel &level, + int xSampling, + int ySampling, + bool pLinear) +: + _level (level), + _xSampling (xSampling), + _ySampling (ySampling), + _pLinear (pLinear), + _pixelsPerRow (0), + _pixelsPerColumn (0), + _numPixels (0) +{ + // empty +} + + +ImageChannel::~ImageChannel () +{ + // empty +} + + +Channel +ImageChannel::channel () const +{ + return Channel (pixelType(), xSampling(), ySampling(), pLinear()); +} + + +void +ImageChannel::resize () +{ + const Box2i& dataWindow = level().dataWindow(); + + if (dataWindow.min.x % _xSampling || dataWindow.min.y % _ySampling) + { + throw ArgExc ("The minimum x and y coordinates of the data window " + "of an image level must be multiples of the x and y " + "subsampling factors of all channels in the image."); + } + + int width = dataWindow.max.x - dataWindow.min.x + 1; + int height = dataWindow.max.y - dataWindow.min.y + 1; + + if (width % _xSampling || height % _ySampling) + { + throw ArgExc ("The width and height of the data window of an image " + "level must be multiples of the x and y subsampling " + "factors of all channels in the image."); + } + + _pixelsPerRow = width / _xSampling; + _pixelsPerColumn = height / _ySampling; + _numPixels = _pixelsPerRow * _pixelsPerColumn; +} + + +void +ImageChannel::boundsCheck (int x, int y) const +{ + const Box2i &dataWindow = level().dataWindow(); + + if (x < dataWindow.min.x || x > dataWindow.max.x || + y < dataWindow.min.y || y > dataWindow.max.y) + { + THROW (ArgExc, + "Attempt to access a pixel at location " + "(" << x << ", " << y << ") in an image whose data window is " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << ")."); + } + + if (x % _xSampling || y % _ySampling) + { + THROW (ArgExc, + "Attempt to access a pixel at location " + "(" << x << ", " << y << ") in a channel whose x and y sampling " + "rates are " << _xSampling << " and " << _ySampling << ". The " + "pixel coordinates are not divisible by the sampling rates."); + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfImageChannel.h b/IlmImfUtil/ImfImageChannel.h new file mode 100644 index 0000000..7aeeafd --- /dev/null +++ b/IlmImfUtil/ImfImageChannel.h @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_CHANNEL_H +#define INCLUDED_IMF_IMAGE_CHANNEL_H + +//---------------------------------------------------------------------------- +// +// class ImageChannel +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class ImageLevel; + +// +// Image channels: +// +// An image channel holds the pixel data for a single channel of one level +// of an image. Separate classes for flat and deep channels are derived +// from the ImageChannel base class. +// + +class ImageLevel; + +class IMF_EXPORT ImageChannel +{ + public: + + // + // The OpenEXR pixel type of this channel (HALF, FLOAT or UINT). + // + + virtual PixelType pixelType () const = 0; + + // + // Generate an OpenEXR channel for this image channel. + // + + Channel channel () const; + + + // + // Access to x and y sampling rates, "perceptually linear" flag, + // and the number of pixels that are stored in this channel. + // + + int xSampling () const {return _xSampling;} + int ySampling () const {return _ySampling;} + bool pLinear () const {return _pLinear;} + int pixelsPerRow () const {return _pixelsPerRow;} + int pixelsPerColumn () const {return _pixelsPerColumn;} + size_t numPixels () const {return _numPixels;} + + + // + // Access to the image level to which this channel belongs. + // + + ImageLevel & level () {return _level;} + const ImageLevel & level () const {return _level;} + + protected: + + ImageChannel (ImageLevel &level, + int xSampling, + int ySampling, + bool pLinear); + + virtual ~ImageChannel(); + + virtual void resize (); + + void boundsCheck(int x, int y) const; + + private: + + ImageChannel (const ImageChannel &); // not implemented + ImageChannel & operator = (const ImageChannel &); // not implemented + + ImageLevel & _level; + int _xSampling; + int _ySampling; + bool _pLinear; + int _pixelsPerRow; + int _pixelsPerColumn; + size_t _numPixels; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImageChannelRenaming.h b/IlmImfUtil/ImfImageChannelRenaming.h new file mode 100644 index 0000000..04c15ef --- /dev/null +++ b/IlmImfUtil/ImfImageChannelRenaming.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_CHANNEL_RENAMING_H +#define INCLUDED_IMF_IMAGE_CHANNEL_RENAMING_H + +//---------------------------------------------------------------------------- +// +// typedef RenamingMap, +// helper functions for image channel renaming. +// +//---------------------------------------------------------------------------- + +#include +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// Given a map from old channel names to new channel names, +// rename the channels in an image or image level. +// This function assumes that the channel old-to-new-names +// map has already been checked for collisions. +// + +typedef std::map RenamingMap; + +template +void +renameChannelsInMap (const RenamingMap oldToNewNames, ChannelMap &channels); + + +//----------------------------------------------------------------------------- +// Implementation +//----------------------------------------------------------------------------- + +template +void +renameChannelsInMap (const RenamingMap oldToNewNames, ChannelMap &channels) +{ + ChannelMap renamedChannels; + + for (typename ChannelMap::const_iterator i = channels.begin(); + i != channels.end(); + ++i) + { + RenamingMap::const_iterator j = oldToNewNames.find (i->first); + std::string newName = (j == oldToNewNames.end())? i->first: j->second; + renamedChannels[newName] = i->second; + } + + channels = renamedChannels; +} + + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImageDataWindow.cpp b/IlmImfUtil/ImfImageDataWindow.cpp new file mode 100644 index 0000000..92acd81 --- /dev/null +++ b/IlmImfUtil/ImfImageDataWindow.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// Function dataWindowForFile() +// +//---------------------------------------------------------------------------- + +#include "ImfImageDataWindow.h" +#include "ImfImage.h" +#include +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +Box2i +dataWindowForFile (const Header &hdr, const Image &img, DataWindowSource dws) +{ + switch (dws) + { + case USE_IMAGE_DATA_WINDOW: + + return img.dataWindow(); + + case USE_HEADER_DATA_WINDOW: + + { + if (img.levelMode() != ONE_LEVEL) + throw ArgExc ("Cannot crop multi-resolution images."); + + const Box2i &hdw = hdr.dataWindow(); + const Box2i &idw = img.dataWindow(); + + return Box2i (V2i (max (hdw.min.x, idw.min.x), + max (hdw.min.y, idw.min.y)), + V2i (min (hdw.max.x, idw.max.x), + min (hdw.max.y, idw.max.y))); + } + + default: + + assert (false); + } +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfImageDataWindow.h b/IlmImfUtil/ImfImageDataWindow.h new file mode 100644 index 0000000..0bd31e7 --- /dev/null +++ b/IlmImfUtil/ImfImageDataWindow.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_DATA_WINDOW_H +#define INCLUDED_IMF_IMAGE_DATA_WINDOW_H + +//---------------------------------------------------------------------------- +// +// enum DataWindowSource, +// function dataWindowForFile() +// +//---------------------------------------------------------------------------- + +#include +#include + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +enum DataWindowSource +{ + USE_IMAGE_DATA_WINDOW, + USE_HEADER_DATA_WINDOW +}; + + +// +// Given the an image, i, an OpenEXR file header, h, and a data window +// source flag, d, dataWindowForFile(i,h,d) returns i.dataWindow() if d +// is USE_IMAGE_DATA_WINDOW, or the intersection of i.dataWindow() and +// h.dataWindow() if d is USE_HEADER_DATA_WINDOW. +// + +class Image; +class Header; + +IMATH_NAMESPACE::Box2i +dataWindowForFile (const Header &hdr, const Image &img, DataWindowSource dws); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImageIO.cpp b/IlmImfUtil/ImfImageIO.cpp new file mode 100644 index 0000000..bd0ae0d --- /dev/null +++ b/IlmImfUtil/ImfImageIO.cpp @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// OpenEXR file I/O for deep images. +// +//---------------------------------------------------------------------------- + +#include "ImfImageIO.h" +#include "ImfFlatImageIO.h" +#include "ImfDeepImageIO.h" +#include +#include +#include +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +void +saveImage + (const string &fileName, + const Header &hdr, + const Image &img, + DataWindowSource dws) +{ + if (const FlatImage *fimg = dynamic_cast (&img)) + { + if (fimg->levelMode() != ONE_LEVEL || hdr.hasTileDescription()) + saveFlatTiledImage (fileName, hdr, *fimg, dws); + else + saveFlatScanLineImage (fileName, hdr, *fimg, dws); + } + + if (const DeepImage *dimg = dynamic_cast (&img)) + { + if (dimg->levelMode() != ONE_LEVEL || hdr.hasTileDescription()) + saveDeepTiledImage (fileName, hdr, *dimg, dws); + else + saveDeepScanLineImage (fileName, hdr, *dimg, dws); + } +} + + +void +saveImage (const string &fileName, const Image &img) +{ + Header hdr; + hdr.displayWindow() = img.dataWindow(); + saveImage (fileName, hdr, img); +} + + +Image * +loadImage (const string &fileName, Header &hdr) +{ + bool tiled, deep, multiPart; + + if (!isOpenExrFile (fileName.c_str(), tiled, deep, multiPart)) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "The file is not an OpenEXR file."); + } + + if (multiPart) + { + THROW (ArgExc, "Cannot load image file " << fileName << ". " + "Multi-part file loading is not supported."); + } + + //XXX TODO: the tiled flag obtained above is unreliable; + // open the file as a multi-part file and inspect the header. + // Can the IlmImf library be fixed? + + { + MultiPartInputFile mpi (fileName.c_str()); + + tiled = (mpi.parts() > 0 && + mpi.header(0).hasType() && + isTiled (mpi.header(0).type())); + } + + Image *img = 0; + + try + { + if (deep) + { + DeepImage *dimg = new DeepImage; + img = dimg; + + if (tiled) + loadDeepTiledImage (fileName, hdr, *dimg); + else + loadDeepScanLineImage (fileName, hdr, *dimg); + } + else + { + FlatImage *fimg = new FlatImage; + img = fimg; + + if (tiled) + loadFlatTiledImage (fileName, hdr, *fimg); + else + loadFlatScanLineImage (fileName, hdr, *fimg); + } + } + catch (...) + { + delete img; + throw; + } + + return img; +} + + +Image * +loadImage (const string &fileName) +{ + Header hdr; + return loadImage (fileName, hdr); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfImageIO.h b/IlmImfUtil/ImfImageIO.h new file mode 100644 index 0000000..53875b5 --- /dev/null +++ b/IlmImfUtil/ImfImageIO.h @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_IO_H +#define INCLUDED_IMF_IMAGE_IO_H + +//---------------------------------------------------------------------------- +// +// Functions to load flat or deep images from OpenEXR files +// and to save flat or deep images in OpenEXR files. +// +//---------------------------------------------------------------------------- + +#include "ImfImage.h" +#include "ImfImageDataWindow.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + + +// +// saveImage (n, h, i, d) or +// saveImage (n, i) +// +// Saves image i in an OpenEXR file with name n. The file will be +// tiled if the image has more than one level, or if a header, h, is +// given and contains a tile description attribute; otherwise the +// file will be scan-line based. The file will be deep if the image +// is deep; otherwise the file will be flat. +// +// If header h is given, then the channel list in h is replaced with +// the channel list in i, and the levelMode and the levelRounding mode +// fields of the tile description are replaced with the level mode +// and the levelRounding mode of i. In addition, if the data window +// source flag, d, is set to USE_IMAGE_DATA_WINDOW, then the data +// window in the image is copied into the header; if d is set to +// USE_HEADER_DATA_WINDOW, then the data window in the header is +// replaced with the intersection of the original data window in the +// header and the data window in the image. The modified header then +// becomes the header of the image file. +// +// Note: USE_HEADER_DATA_WINDOW can only be used for images with +// level mode ONE_LEVEL. +// + +IMF_EXPORT +void +saveImage + (const std::string &fileName, + const Header &hdr, + const Image &img, + DataWindowSource dws = USE_IMAGE_DATA_WINDOW); + +IMF_EXPORT +void +saveImage + (const std::string &fileName, + const Image &img); + +// +// loadImage (n, h) or +// loadImage (n) +// +// Loads deep an image from the OpenEXR file with name n, and returns +// a pointer to the image. The caller owns the image and is responsible +// for deleting it. +// +// If header h is given, then the header of the file is copied into h. +// + +IMF_EXPORT +Image * +loadImage + (const std::string &fileName, + Header &hdr); + +IMF_EXPORT +Image * +loadImage + (const std::string &fileName); + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfImageLevel.cpp b/IlmImfUtil/ImfImageLevel.cpp new file mode 100644 index 0000000..0c65818 --- /dev/null +++ b/IlmImfUtil/ImfImageLevel.cpp @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class ImageLevel +// +//---------------------------------------------------------------------------- + +#include "ImfImageLevel.h" +#include +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER + + +ImageLevel::ImageLevel + (Image& image, + int xLevelNumber, + int yLevelNumber) +: + _image (image), + _xLevelNumber (xLevelNumber), + _yLevelNumber (yLevelNumber), + _dataWindow (Box2i (V2i (0, 0), V2i (-1, -1))) +{ + // empty +} + + +ImageLevel::~ImageLevel () +{ + // empty +} + + +void +ImageLevel::resize (const Imath::Box2i& dataWindow) +{ + if (dataWindow.max.x < dataWindow.min.x - 1|| + dataWindow.max.y < dataWindow.min.y - 1) + { + THROW (ArgExc, + "Cannot reset data window for image level to " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << "). " + "The new data window is invalid."); + } + + _dataWindow = dataWindow; +} + + +void +ImageLevel::shiftPixels (int dx, int dy) +{ + _dataWindow.min.x += dx; + _dataWindow.min.y += dy; + _dataWindow.max.x += dx; + _dataWindow.max.y += dy; +} + + +void +ImageLevel::throwChannelExists (const string& name) const +{ + THROW (ArgExc, "Cannot insert a new image channel with " + "name \"" << name << "\" into an image level. " + "A channel with the same name exists already."); +} + + +void +ImageLevel::throwBadChannelName (const string& name) const +{ + THROW (ArgExc, "Attempt to access non-existent " + "image channel \"" << name << "\"."); +} + + +void +ImageLevel::throwBadChannelNameOrType (const string& name) const +{ + THROW (ArgExc, "Image channel \"" << name << "\" does not exist " + "or is not of the expected type."); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfImageLevel.h b/IlmImfUtil/ImfImageLevel.h new file mode 100644 index 0000000..872af5c --- /dev/null +++ b/IlmImfUtil/ImfImageLevel.h @@ -0,0 +1,127 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_IMAGE_LEVEL_H +#define INCLUDED_IMF_IMAGE_LEVEL_H + +//---------------------------------------------------------------------------- +// +// class ImageLevel +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class Image; + + +class ImageLevel +{ + public: + + // + // Access to the image to which the level belongs. + // + + Image & image () {return _image;} + const Image & image () const {return _image;} + + + // + // Access to the level number and the data window of this level. + // + + int xLevelNumber () const {return _xLevelNumber;} + int yLevelNumber () const {return _yLevelNumber;} + + const IMATH_NAMESPACE::Box2i & dataWindow () const {return _dataWindow;} + + + protected: + + friend class Image; + + ImageLevel (Image& image, + int xLevelNumber, + int yLevelNumber); + + virtual ~ImageLevel (); + + virtual void resize (const IMATH_NAMESPACE::Box2i& dataWindow); + + virtual void shiftPixels (int dx, int dy); + + virtual void insertChannel (const std::string& name, + PixelType type, + int xSampling, + int ySampling, + bool pLinear) = 0; + + virtual void eraseChannel (const std::string& name) = 0; + + virtual void clearChannels () = 0; + + virtual void renameChannel (const std::string &oldName, + const std::string &newName) = 0; + + virtual void renameChannels (const RenamingMap &oldToNewNames) = 0; + + IMF_EXPORT void throwChannelExists(const std::string& name) const; + IMF_EXPORT void throwBadChannelName(const std::string& name) const; + IMF_EXPORT void throwBadChannelNameOrType (const std::string& name) const; + + private: + + ImageLevel (const ImageLevel &); // not implemented + ImageLevel & operator = (const ImageLevel &); // not implemented + + Image & _image; + int _xLevelNumber; + int _yLevelNumber; + IMATH_NAMESPACE::Box2i _dataWindow; +}; + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/ImfSampleCountChannel.cpp b/IlmImfUtil/ImfSampleCountChannel.cpp new file mode 100644 index 0000000..149f5a5 --- /dev/null +++ b/IlmImfUtil/ImfSampleCountChannel.cpp @@ -0,0 +1,377 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------- +// +// class FlatImageChannel +// +//---------------------------------------------------------------------------- + +#include "ImfSampleCountChannel.h" +#include "ImfDeepImageLevel.h" +#include "ImfImage.h" +#include + +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER +namespace { + +unsigned int +roundListSizeUp (unsigned int n) +{ + // + // Calculate the number of samples to be allocated for a sample list + // with n entries by rounding n up to the next power of two. + // + + if (n == 0) + return 0; + + unsigned int s = 1; + + while (s < n) + s <<= 1; + + return s; +} + + +size_t +roundBufferSizeUp (size_t n) +{ + // + // Calculate the number of samples to be allocated for n samples. + // Leave some extra space for new samples that may be added later. + // + + return n + n / 2; +} + + +} // namespace + + +SampleCountChannel::SampleCountChannel (DeepImageLevel& level): + ImageChannel (level, 1, 1, false), + _numSamples (0), + _base (0), + _sampleListSizes (0), + _sampleListPositions (0), + _totalNumSamples (0), + _totalSamplesOccupied (0), + _sampleBufferSize (0) +{ + resize(); +} + + +SampleCountChannel::~SampleCountChannel () +{ + delete [] _numSamples; + delete [] _sampleListSizes; + delete [] _sampleListPositions; +} + + +PixelType +SampleCountChannel::pixelType () const +{ + return UINT; +} + + +Slice +SampleCountChannel::slice () const +{ + return Slice (UINT, // type + (char *) _base, // base + sizeof (unsigned int), // xStride + pixelsPerRow() * sizeof (unsigned int), // yStride + xSampling(), + ySampling()); +} + + +DeepImageLevel & +SampleCountChannel::deepLevel () +{ + return static_cast (level()); +} + + +const DeepImageLevel & +SampleCountChannel::deepLevel () const +{ + return static_cast (level()); +} + + +void +SampleCountChannel::set (int x, int y, unsigned int newNumSamples) +{ + // + // Set the number of samples for pixel (x,y) to newNumSamples. + // Compute the position of the pixel in the the various + // arrays that describe it. + // + + size_t i = (_base + y * pixelsPerRow() + x) - _numSamples; + + if (newNumSamples <= _numSamples[i]) + { + // + // The number of samples for the pixel becomes smaller. + // Save the new number of samples. + // + + _totalNumSamples -= _numSamples[i] - newNumSamples; + _numSamples[i] = newNumSamples; + return; + } + + if (newNumSamples <= _sampleListSizes[i]) + { + // + // The number of samples for the pixel becomes larger, but the new + // number of samples still fits into the space that has been allocated + // for the sample list. Set the new samples at the end of the list to + // zero. + // + + deepLevel().setSamplesToZero (i, + _numSamples[i], + newNumSamples); + + _totalNumSamples += newNumSamples - _numSamples[i]; + _numSamples[i] = newNumSamples; + return; + } + + int newSampleListSize = roundListSizeUp (newNumSamples); + + if (_totalSamplesOccupied + newSampleListSize <= _sampleBufferSize) + { + // + // The number of samples in the pixel no longer fits into the + // space that has been allocated for the sample list, but there + // is space available at the end of the sample buffer. Allocate + // space for a new list at the end of the sample buffer, and move + // the sample list from its old location to its new, larger place. + // + + deepLevel().moveSampleList + (i, _numSamples[i], newNumSamples, _totalSamplesOccupied); + + _sampleListPositions[i] = _totalSamplesOccupied; + _totalSamplesOccupied += newSampleListSize; + _totalNumSamples += newNumSamples - _numSamples[i]; + _numSamples[i] = newNumSamples; + return; + } + + // + // The new number of samples no longer fits into the space that has + // been allocated for the sample list, and there is not enough room + // at the end of the sample buffer for a new, larger sample list. + // Allocate an entirely new sample buffer, and move all existing + // sample lists into it. + // + + unsigned int * oldNumSamples = 0; + size_t * oldSampleListPositions = 0; + + try + { + _totalNumSamples += newNumSamples - _numSamples[i]; + + oldNumSamples = _numSamples; + _numSamples = new unsigned int [numPixels()]; + + resetBasePointer(); + + oldSampleListPositions = _sampleListPositions; + _sampleListPositions = new size_t [numPixels()]; + + _totalSamplesOccupied = 0; + + for (size_t j = 0; j < numPixels(); ++j) + { + if (j == i) + _numSamples[j] = newNumSamples; + else + _numSamples[j] = oldNumSamples[j]; + + _sampleListPositions[j] = _totalSamplesOccupied; + _sampleListSizes[j] = roundListSizeUp (_numSamples[j]); + _totalSamplesOccupied += _sampleListSizes[j]; + } + + _sampleBufferSize = roundBufferSizeUp (_totalSamplesOccupied); + + deepLevel().moveSamplesToNewBuffer (oldNumSamples, + _numSamples, + _sampleListPositions); + + delete [] oldNumSamples; + delete [] oldSampleListPositions; + } + catch (...) + { + delete [] oldNumSamples; + delete [] oldSampleListPositions; + + level().image().resize (Box2i (V2i (0, 0), V2i (-1, -1))); + throw; + } +} + + +void +SampleCountChannel::set (int r, unsigned int newNumSamples[]) +{ + int x = level().dataWindow().min.x; + int y = r + level().dataWindow().min.x; + + for (int i = 0; i < pixelsPerRow(); ++i, ++x) + set (x, y, newNumSamples[i]); +} + + +void +SampleCountChannel::clear () +{ + try + { + for (size_t i = 0; i < numPixels(); ++i) + { + _numSamples[i] = 0; + _sampleListSizes[i] = 0; + _sampleListPositions[i] = 0; + } + + _totalNumSamples = 0; + _totalSamplesOccupied = 0; + _sampleBufferSize = roundBufferSizeUp (_totalSamplesOccupied); + + deepLevel().initializeSampleLists(); + } + catch (...) + { + level().image().resize (Box2i (V2i (0, 0), V2i (-1, -1))); + throw; + } +} + + +unsigned int * +SampleCountChannel::beginEdit () +{ + return _numSamples; +} + + +void +SampleCountChannel::endEdit () +{ + try + { + _totalNumSamples = 0; + _totalSamplesOccupied = 0; + + for (size_t i = 0; i < numPixels(); ++i) + { + _sampleListSizes[i] = roundListSizeUp (_numSamples[i]); + _sampleListPositions[i] = _totalSamplesOccupied; + _totalNumSamples += _numSamples[i]; + _totalSamplesOccupied += _sampleListSizes[i]; + } + + _sampleBufferSize = roundBufferSizeUp (_totalSamplesOccupied); + + deepLevel().initializeSampleLists(); + } + catch (...) + { + level().image().resize (Box2i (V2i (0, 0), V2i (-1, -1))); + throw; + } +} + + +void +SampleCountChannel::resize () +{ + ImageChannel::resize(); + + delete [] _numSamples; + delete [] _sampleListSizes; + delete [] _sampleListPositions; + + _numSamples = 0; // set to 0 to prevent double + _sampleListSizes = 0; // deletion in case of an exception + _sampleListPositions = 0; + + _numSamples = new unsigned int [numPixels()]; + _sampleListSizes = new unsigned int [numPixels()]; + _sampleListPositions = new size_t [numPixels()]; + + resetBasePointer(); + + for (size_t i = 0; i < numPixels(); ++i) + { + _numSamples[i] = 0; + _sampleListSizes[i] = 0; + _sampleListPositions[i] = 0; + } + + _totalNumSamples = 0; + _totalSamplesOccupied = 0; + + _sampleBufferSize = roundBufferSizeUp (_totalSamplesOccupied); +} + + +void +SampleCountChannel::resetBasePointer () +{ + _base = _numSamples - + level().dataWindow().min.y * pixelsPerRow() - + level().dataWindow().min.x; +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT diff --git a/IlmImfUtil/ImfSampleCountChannel.h b/IlmImfUtil/ImfSampleCountChannel.h new file mode 100644 index 0000000..732cf07 --- /dev/null +++ b/IlmImfUtil/ImfSampleCountChannel.h @@ -0,0 +1,356 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMF_SAMPLE_COUNT_CHANNEL_H +#define INCLUDED_IMF_SAMPLE_COUNT_CHANNEL_H + +//---------------------------------------------------------------------------- +// +// class SampleCountChannel +// +// For an explanation of images, levels and channels, +// see the comments in header file Image.h. +// +//---------------------------------------------------------------------------- + +#include "ImfImageChannel.h" +#include "ImfExport.h" + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER + +class DeepImageLevel; + +// +// Sample count channel for a deep image level: +// +// Each deep image level has a number of samples channel. For each +// pixel location (x,y) within the data window of the level, the sample +// count channel stores a single integer, n(x,y). A deep channel, c, +// in the level as the sample count channel stores n(x,y) samples at +// location (x,y) if +// +// x % c.xSampling() == 0 and y % c.ySampling() == 0. +// +// The deep channel stores no samples at location (x,y) if +// +// x % c.xSampling() != 0 or y % c.ySampling() != 0, +// + +class IMF_EXPORT SampleCountChannel : public ImageChannel +{ + public: + + // + // The OpenEXR pixel type of this channel (HALF, FLOAT or UINT). + // + + virtual PixelType pixelType () const; + + + // + // Construct an OpenEXR frame buffer slice for this channel. + // This function is needed reading an image from an OpenEXR + // file and for saving an image in an OpenEXR file. + // + + Slice slice () const; + + + // + // Access to the image level to which this channel belongs. + // + + DeepImageLevel & deepLevel (); + const DeepImageLevel & deepLevel () const; + + + // + // Access to n(x,y), without bounds checking. Accessing a location + // outside the data window of the image level results in undefined + // behavior. + // + + const unsigned int & operator () (int x, int y) const; + + + // + // Access to n(x,y), with bounds checking. Accessing a location outside + // the data window of the image level throws an Iex::ArgExc exception. + // + + const unsigned int & at (int x, int y) const; + + // + // Faster access to n(x,y) for all pixels in a single horizontal row of + // the channel. Rows are numbered from 0 to pixelsPerColumn()-1, and + // each row contains pixelsPerRow() values. + // Access is not bounds checked; accessing out of bounds rows or pixels + // results in undefined behavior. + // + + const unsigned int * row (int r) const; + + + // + // Change the sample counts in one or more pixels: + // + // set(x,y,m) sets n(x,y) to m. + // + // set(r,m) sets n(x,y) for all pixels in row r according to the + // values in array m. The array must contain pixelsPerRow() + // entries, and the row number must be in the range from 0 + // to pixelsPerColumn()-1. + // + // clear() sets n(x,y) to 0 for all pixels within the data window + // of the level. + // + // If the sample count for a pixel is increased, then new samples are + // appended at the end of the sample list of each deep channel. The + // new samples are initialized to zero. If the sample count in a pixel + // is decreased, then sample list of each deep channel is truncated by + // discarding samples at the end of the list. + // + // Access is bounds-checked; attempting to set the number of samples of + // a pixel outside the data window throws an Iex::ArgExc exception. + // + // Memory allocation for the sample lists is not particularly clever; + // repeatedly increasing and decreasing the number of samples in the + // pixels of a level is likely to result in serious memory fragmentation. + // + // Setting the number of samples for one or more pixels may cause the + // program to run out of memory. If this happens, the image is resized + // to zero by zero pixels and an exception is thrown. Note that the + // resizing operation deletes this sample count channel and the image + // level to which it belongs. + // + + void set(int x, int y, unsigned int newNumSamples); + void set(int r, unsigned int newNumSamples[]); + void clear(); + + + // + // OpenEXR file reading support / make sample counts editable: + // + // beginEdit() frees all memory that has been allocated for samples + // in the deep channels, and returns a pointer to an + // array of pixelsPerRow() by pixelsPerColumn() sample + // counts in row-major order. + // + // After beginEdit() returns, application code is + // free to change the values in the sample count array. + // In particular, the application can fill the array by + // reading the sample counts from an OpenEXR file. + // + // However, since memory for the samples in the deep + // channels has been freed, attempting to access any + // sample in a deep channel results in undefined + // behavior, most likely a program crash. + // + // endEdit() allocates new memory for all samples in the deep + // channels of the layer, according to the current + // sample counts, and sets the samples to zero. + // + // Application code must take make sure that each call to beginEdit() + // is followed by a corresponding endEdit() call, even if an + // exception occurs while the sample counts are acessed. In order to + // do that, application code may want to create a temporary Edit + // object instead of calling beginEdit() and endEdit() directly. + // + // Setting the number of samples for all pixels in the image may + // cause the program to run out of memory. If this happens, the image + // is resized to zero by zero pixels and an exception is thrown. + // Note that the resizing operation deletes this sample count channel + // and the image level to which it belongs. + // + + unsigned int * beginEdit(); + void endEdit(); + + class Edit + { + public: + + // + // Constructor calls level->beginEdit(), + // destructor calls level->endEdit(). + // + + Edit (SampleCountChannel& level); + ~Edit (); + + // + // Access to the writable sample count array. + // + + unsigned int * sampleCounts () const; + + private: + + SampleCountChannel & _channel; + unsigned int * _sampleCounts; + }; + + + // + // Functions that support the implementation of deep image channels. + // + + const unsigned int * numSamples () const; + const unsigned int * sampleListSizes () const; + const size_t * sampleListPositions () const; + size_t sampleBufferSize () const; + + + private: + + friend class DeepImageLevel; + + // + // The constructor and destructor are not public because + // image channels exist only as parts of a deep image level. + // + + SampleCountChannel (DeepImageLevel &level); + virtual ~SampleCountChannel(); + + virtual void resize (); + + void resetBasePointer (); + + unsigned int * _numSamples; // Array of per-pixel sample counts + + unsigned int * _base; // Base pointer for faster access + // to entries in _numSamples + + unsigned int * _sampleListSizes; // Array of allocated sizes of + // per-pixel sample lists + + size_t * _sampleListPositions; // Array of positions of per-pixel + // sample lists within sample list + // buffer + + size_t _totalNumSamples; // Sum of all entries in the + // _numSamples array + + size_t _totalSamplesOccupied; // Total number of samples within + // sample list buffer that have + // either been allocated for sample + // lists or lost to fragmentation + + size_t _sampleBufferSize; // Size of the sample list buffer. +}; + + + +//----------------------------------------------------------------------------- +// Implementation of templates and inline functions +//----------------------------------------------------------------------------- + +inline +SampleCountChannel::Edit::Edit (SampleCountChannel &channel): + _channel (channel), + _sampleCounts (channel.beginEdit()) +{ + // empty +} + + +inline +SampleCountChannel::Edit::~Edit () +{ + _channel.endEdit(); +} + + +inline unsigned int * +SampleCountChannel::Edit::sampleCounts () const +{ + return _sampleCounts; +} + + +inline const unsigned int * +SampleCountChannel::numSamples () const +{ + return _numSamples; +} + + +inline const unsigned int * +SampleCountChannel::sampleListSizes () const +{ + return _sampleListSizes; +} + + +inline const size_t * +SampleCountChannel::sampleListPositions () const +{ + return _sampleListPositions; +} + + +inline size_t +SampleCountChannel::sampleBufferSize () const +{ + return _sampleBufferSize; +} + + +inline const unsigned int & +SampleCountChannel::operator () (int x, int y) const +{ + return _base[y * pixelsPerRow() + x]; +} + + +inline const unsigned int & +SampleCountChannel::at (int x, int y) const +{ + boundsCheck (x, y); + return _base[y * pixelsPerRow() + x]; +} + + +inline const unsigned int * +SampleCountChannel::row (int n) const +{ + return _base + n * pixelsPerRow(); +} + + +OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT + +#endif diff --git a/IlmImfUtil/Makefile.am b/IlmImfUtil/Makefile.am new file mode 100644 index 0000000..38cdb9b --- /dev/null +++ b/IlmImfUtil/Makefile.am @@ -0,0 +1,42 @@ +## Process this file with automake to produce Makefile.in + +lib_LTLIBRARIES = libIlmImfUtil.la + +libIlmImfUtil_la_SOURCES = \ + ImfImageChannel.h ImfImageChannel.cpp \ + ImfFlatImageChannel.h ImfFlatImageChannel.cpp \ + ImfDeepImageChannel.h ImfDeepImageChannel.cpp \ + ImfSampleCountChannel.h ImfSampleCountChannel.cpp \ + ImfImageLevel.h ImfImageLevel.cpp \ + ImfFlatImageLevel.h ImfFlatImageLevel.cpp \ + ImfDeepImageLevel.h ImfDeepImageLevel.cpp \ + ImfImage.h ImfImage.cpp \ + ImfFlatImage.h ImfFlatImage.cpp \ + ImfDeepImage.h ImfDeepImage.cpp \ + ImfImageIO.h ImfImageIO.cpp \ + ImfFlatImageIO.h ImfFlatImageIO.cpp \ + ImfDeepImageIO.h ImfDeepImageIO.cpp \ + ImfImageDataWindow.h ImfImageDataWindow.cpp \ + ImfImageChannelRenaming.h + + +libIlmImfUtil_la_LDFLAGS = @ILMBASE_LDFLAGS@ -version-info @LIBTOOL_VERSION@ \ + -no-undefined + + +if LIB_SUFFIX_EXISTS +libIlmImfUtil_la_LDFLAGS += -release @LIB_SUFFIX@ +endif + + +libIlmImfUtil_la_LIBADD = -L$(top_builddir)/IlmImf @ILMBASE_LIBS@ -lIlmImf + +libIlmImfUtilincludedir = $(includedir)/OpenEXR + +EXTRA_DIST = CMakeLists.txt + +INCLUDES = @ILMBASE_CXXFLAGS@ \ + -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config + diff --git a/IlmImfUtil/Makefile.in b/IlmImfUtil/Makefile.in new file mode 100644 index 0000000..95e90f9 --- /dev/null +++ b/IlmImfUtil/Makefile.in @@ -0,0 +1,593 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@LIB_SUFFIX_EXISTS_TRUE@am__append_1 = -release @LIB_SUFFIX@ +subdir = IlmImfUtil +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libIlmImfUtil_la_DEPENDENCIES = +am_libIlmImfUtil_la_OBJECTS = ImfImageChannel.lo \ + ImfFlatImageChannel.lo ImfDeepImageChannel.lo \ + ImfSampleCountChannel.lo ImfImageLevel.lo ImfFlatImageLevel.lo \ + ImfDeepImageLevel.lo ImfImage.lo ImfFlatImage.lo \ + ImfDeepImage.lo ImfImageIO.lo ImfFlatImageIO.lo \ + ImfDeepImageIO.lo ImfImageDataWindow.lo +libIlmImfUtil_la_OBJECTS = $(am_libIlmImfUtil_la_OBJECTS) +libIlmImfUtil_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libIlmImfUtil_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libIlmImfUtil_la_SOURCES) +DIST_SOURCES = $(libIlmImfUtil_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +lib_LTLIBRARIES = libIlmImfUtil.la +libIlmImfUtil_la_SOURCES = \ + ImfImageChannel.h ImfImageChannel.cpp \ + ImfFlatImageChannel.h ImfFlatImageChannel.cpp \ + ImfDeepImageChannel.h ImfDeepImageChannel.cpp \ + ImfSampleCountChannel.h ImfSampleCountChannel.cpp \ + ImfImageLevel.h ImfImageLevel.cpp \ + ImfFlatImageLevel.h ImfFlatImageLevel.cpp \ + ImfDeepImageLevel.h ImfDeepImageLevel.cpp \ + ImfImage.h ImfImage.cpp \ + ImfFlatImage.h ImfFlatImage.cpp \ + ImfDeepImage.h ImfDeepImage.cpp \ + ImfImageIO.h ImfImageIO.cpp \ + ImfFlatImageIO.h ImfFlatImageIO.cpp \ + ImfDeepImageIO.h ImfDeepImageIO.cpp \ + ImfImageDataWindow.h ImfImageDataWindow.cpp \ + ImfImageChannelRenaming.h + +libIlmImfUtil_la_LDFLAGS = @ILMBASE_LDFLAGS@ -version-info \ + @LIBTOOL_VERSION@ -no-undefined $(am__append_1) +libIlmImfUtil_la_LIBADD = -L$(top_builddir)/IlmImf @ILMBASE_LIBS@ -lIlmImf +libIlmImfUtilincludedir = $(includedir)/OpenEXR +EXTRA_DIST = CMakeLists.txt +INCLUDES = @ILMBASE_CXXFLAGS@ \ + -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/config + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImfUtil/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImfUtil/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libIlmImfUtil.la: $(libIlmImfUtil_la_OBJECTS) $(libIlmImfUtil_la_DEPENDENCIES) + $(libIlmImfUtil_la_LINK) -rpath $(libdir) $(libIlmImfUtil_la_OBJECTS) $(libIlmImfUtil_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepImage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepImageChannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepImageIO.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfDeepImageLevel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFlatImage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFlatImageChannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFlatImageIO.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfFlatImageLevel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfImage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfImageChannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfImageDataWindow.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfImageIO.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfImageLevel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImfSampleCountChannel.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImfUtil/README b/IlmImfUtil/README new file mode 100644 index 0000000..39f0f58 --- /dev/null +++ b/IlmImfUtil/README @@ -0,0 +1,270 @@ +The IlmImfUtil Library +---------------------- + +The IlmImfUtil library implements an in-memory image data structure, as +well as simple function calls for saving images in OpenEXR files, and for +constructing images from the contents of existing OpenEXR files. + +The OpenEXR file format has a fairly large number of options for on-file +image storage, including arbitrary sets of channels, per-channel pixel +format selection, sub-sampled channels, multi-resolution images, deep +images, or storing images as tiles or scan lines. While reading a simple +RGBA image does not require a lot of code, reading the contents of an +arbitrary OpenEXR file, and representing those contents in main memory +is not trivial. The IlmImfUtil library simplifies those tasks. + +Image, Image Level, Image Channel +--------------------------------- + +An image (class Image) is a container for a set of image levels (class +ImageLevel), and an image level is a container for a set of image channels +(class ImageChannel). An image channel contains an array of pixel values. + +For example: + + image --+-- level 0,0 --+-- channel "R" --- pixel data + | | + | +-- channel "G" --- pixel data + | | + | +-- channel "B" --- pixel data + | + +-- level 1,1 --+-- channel "R" --- pixel data + | | + | +-- channel "G" --- pixel data + | | + | +-- channel "B" --- pixel data + | + +-- level 2,2 --+-- channel "R" --- pixel data + | + +-- channel "G" --- pixel data + | + +-- channel "B" --- pixel data + +An image has a level mode (enum LevelMode), which can be ONE_LEVEL, +MIPMAP_LEVELS or RIPMAP_LEVELS. A ONE_LEVEL image contains only a single +level, but a multi-resolution image, that is, one with level mode set to +MIPMAP_LEVELS or RIPMAP_LEVELS, contains multiple levels. The levels are +analogous to the levels in an OpenEXR file, as described in the "Technical +Introduction to OpenEXR" document. + +Levels are indexed by a pairs of level numbers. Level (0,0) contains the +highest-resolution version of the image; level (lx,ly) contains an image +whose resolution is reduced in x and y by a factor of 2^lx and 2^ly +respectively. The level has a data window that indicates the range of +x and y for which pixel data are stored in the level. + +All levels in an image have the same set of image channels. + +An image channel has a name (e.g. "R", "Z", or "xVelocity"), a type (HALF, +FLOAT or UINT) and x and y sampling rates. A channel stores samples for +a pixel if the pixel is inside the data window of the level to which the +channel belongs, and the x and y coordinates of the pixel are divisible by +the x and y sampling rates of the channel. + +An image can be either flat or deep. In a flat image each channel in each +level stores at most one value per pixel. In a deep image each channel in +each level stores an arbitrary number of values per pixel. As an exception, +each level of a deep image has a sample count channel with a single value +per pixel; this value determines how many values each of the other channels +in the same level has at the same pixel location. + +The Image, ImageLevel and ImageChannel classes are abstact base classes. +Two sets of classes, one for flat images and one for deep images, are +derived from the base classes. The FlatImageChannel and DeepImageChannel +classes, derived from ImageChannel, are themselves base classes for the +templates TypedFlatImageChannel and TypedDeepImageChannel: + + Image -> FlatImage + -> DeepImage + + ImageLevel -> FlatImageLevel + -> DeepImageLevel + + + ImageChannel -> FlatImageChannel -> TypedFlatImageChannel + -> DeepImageChannel -> TypedDeepImageChannel + -> SampleCountChannel + +Channel objects of type TypedFlatImageChannel and TypedDeepImageChannel +contain pixel values of type T, where T is either half, float or unsigned int. +For convenience, the following typedefs are provided: + + typedef TypedFlatImageChannel FlatHalfChannel; + typedef TypedFlatImageChannel FlatFloatChannel; + typedef TypedFlatImageChannel FlatUIntChannel; + + typedef TypedDeepImageChannel DeepHalfChannel; + typedef TypedDeepImageChannel DeepFloatChannel; + typedef TypedDeepImageChannel DeepUIntChannel; + + +File I/O +-------- + +An Image object can be saved in an OpenEXR file with a single function call: + + saveImage ("foo.exr", myImage); + +The saveImage() function automatically creates a flat or a deep image file, +depending on the type of the image. All channels and all image levels will +be saved in the file. + +Optionally an OpenEXR Header object can be passed to the saveImage() function; +this allows application code save custom attributes in the file, and to control +how the file will be compressed: + + Header myHeader; + myHeader.compression() = PIZ_COMPRESSION; + myHeader.pixelAspectRatio() = 1.5; + + saveImage ("foo.exr", myHeader, myImage); + +Loading an image from an OpenEXR file also requires only one function call, +either + + Image* myImage = loadImage ("foo.exr"); + +or + + Header myHeader; + Image* myImage = loadImage ("foo.exr", myHeader); + +The application owns the image that is returned by the loadImage() call. +It is the application's responsibility to delete the Image object. + +The IlmImfUtil library also provides versions of the saveImage() and +loadImage() functions that work only on flat images or only on deep images: + + saveFlatImage() + saveFlatScanLineImage() + saveFlatTiledImage() + saveDeepImage() + saveDeepScanLineImage() + saveDeepTiledImage() + +For details the the ImfFlatImageIO.h and ImfDeepImageIO.h header files. + + +Manipulating Images in Memory +----------------------------- + +Creating a mip-mapped flat image with two channels: + + FlatImage fimg (Box2i (V2i (0, 0), V2i (255, 255)), // data window + MIPMAP_LEVELS); // level mode + + fimg.insertChannel ("R", HALF); + fimg.insertChannel ("Z", FLOAT); + +Creating a single-level deep image: + + DeepImage dimg (Box2i (V2i (0, 0), V2i (255, 255)), // data window + ONE_LEVEL); // level mode + + dimg.insertChannel ("R", HALF); + dimg.insertChannel ("Z", FLOAT); + +Reading and writing pixels in level (2,2) of the mip-mapped flat image +(note: a mip-mapped image contains only levels where the x and y level +numbers are equal. For convenience, mip-map levels can be addressed +using a single level number): + + FlatImageLevel &level = fimg.level (2); + FlatHalfChannel &R = level.typedChannel ("R); + + half r1 = R.at (20, 15); // read pixel (20,15), with bounds checking + // (exception for access outside data window) + + half r2 = R (17, 4); // read pixel (17,4) without bounds checking + // faster, but crashes for access outside + // data window + + R.at (20, 15) = 2 * r1; // change pixel value, with and + R (17, 4) = 2 * r2; // without bounds checking + +Reading and writing pixels in the single-level deep image: + + DeepImageLevel &level = dimg.level(); + DeepHalfChannel &R = level.typedChannel ("R); + + // with bounds checking + + unsigned int n1 = R.sampleCounts().at (20, 15); + half r1; + + if (n1 > 0) + r1 = R.at(20, 15)[n1 - 1]; // read the last sample in pixel (20,15) + + // without bounds checking + + unsigned int n2 = R.sampleCounts()(20, 15); + half r2; + + if (n > 0) + r2 = R(17, 4)[n2 - 1]; // read the last sample in pixel (17,4) + + // change the value of an existing sample + + if (n1 > 0) + R(20,15)[n1 - 1] = r1 * 2; + + // append a new sample to a pixel and set the sample to 3.0 + + R.sampleCounts().set (20, 15, n1 + 1); + R.(20, 15)[n1] = 3.0; + +In addition to functions for reading and writing individual pixels, there +are functions for accessing a whole row of pixels with a single function +call. For details see the ImfFlatImageChannel.h, ImfDeepImageChannel.h +and ImfSampleCountChannel.h header files in the IlmImf library: + + T* TypedFlatImageChannel::row (int r); + const T* TypedFlatImageChannel::row (int r) const; + + T * const * TypedDeepImageChannel::row (int r); + const T * const * TypedDeepImageChannel::row (int r) const; + const unsigned int * SampleCountChannel::row (int r) const; + +To change the number of samples in all pixels in one row of a deep image +level, use: + + void SampleCountChannel::set (int r, unsigned int newNumSamples[]); + +Use an Edit object to temporarily make all sample counts in a deep image +level editable: + + class SampleCountChannel::Edit; + +Miscellaneous Functions: +------------------------ + +Change the data window and the level mode of an image (pixel data are not +preserved across the call): + + void Image::resize (const Box2i &dataWindow, LevelMode levelMode); + +Shift the data window in x and y; shift the pixels along with the data window: + + void Image::shiftPixels (int dx, int dy); + +Erase a channel, rename a channel, rename multiple channels at the same time: + + void Image::eraseChannel (const string &name); + void Image::renameChannel (const string &oldName, const string &newName); + void Image::renameChannels (const RenamingMap &oldToNewNames); + +Missing Functionality: +---------------------- + +At this point, the IlmImfUtil library cannot read or write multi-part +files. A future version of the library should probably define a new class +MultiPartImage that contains a set of regular images. The library should +also define corresponding loadMultiPartImage() and saveMultiPartImage() +functions. + +Sample Code +----------- + +See the exrsave, exrmakescanlines, exrclip utilities. + + diff --git a/IlmImfUtilTest/CMakeLists.txt b/IlmImfUtilTest/CMakeLists.txt new file mode 100644 index 0000000..3663dc0 --- /dev/null +++ b/IlmImfUtilTest/CMakeLists.txt @@ -0,0 +1,25 @@ + +# IlmImfUtilTest + +LINK_DIRECTORIES ( ${CMAKE_CURRENT_BINARY_DIR}/../IlmImf ) + + +ADD_EXECUTABLE ( IlmImfUtilTest + main.cpp + testFlatImage.cpp + testDeepImage.cpp + testIO.cpp + ) + + +ADD_TEST ( TestIlmImfUtil IlmImfUtilTest ) +TARGET_LINK_LIBRARIES ( IlmImfUtilTest + IlmImfUtil + IlmImf + Half + Iex${ILMBASE_LIBSUFFIX} + Imath${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} ${ZLIB_LIBRARIES} + ) + diff --git a/IlmImfUtilTest/Makefile.am b/IlmImfUtilTest/Makefile.am new file mode 100644 index 0000000..09d6d9e --- /dev/null +++ b/IlmImfUtilTest/Makefile.am @@ -0,0 +1,23 @@ +## Process this file with automake to produce Makefile.in + +check_PROGRAMS = IlmImfUtilTest + +IlmImfUtilTest_SOURCES = main.cpp \ + testFlatImage.h testFlatImage.cpp \ + testDeepImage.h testDeepImage.cpp \ + testIO.h testIO.cpp tmpDir.h + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/IlmImfUtil \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + -L$(top_builddir)/IlmImfUtil \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImfUtil -lIlmImf -lz + +TESTS = IlmImfUtilTest + +EXTRA_DIST = CMakeLists.txt diff --git a/IlmImfUtilTest/Makefile.in b/IlmImfUtilTest/Makefile.in new file mode 100644 index 0000000..acde804 --- /dev/null +++ b/IlmImfUtilTest/Makefile.in @@ -0,0 +1,615 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = IlmImfUtilTest$(EXEEXT) +TESTS = IlmImfUtilTest$(EXEEXT) +subdir = IlmImfUtilTest +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_IlmImfUtilTest_OBJECTS = main.$(OBJEXT) testFlatImage.$(OBJEXT) \ + testDeepImage.$(OBJEXT) testIO.$(OBJEXT) +IlmImfUtilTest_OBJECTS = $(am_IlmImfUtilTest_OBJECTS) +IlmImfUtilTest_LDADD = $(LDADD) +IlmImfUtilTest_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(IlmImfUtilTest_SOURCES) +DIST_SOURCES = $(IlmImfUtilTest_SOURCES) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +IlmImfUtilTest_SOURCES = main.cpp \ + testFlatImage.h testFlatImage.cpp \ + testDeepImage.h testDeepImage.cpp \ + testIO.h testIO.cpp tmpDir.h + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf \ + -I$(top_srcdir)/IlmImfUtil \ + -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = -L$(top_builddir)/IlmImf \ + -L$(top_builddir)/IlmImfUtil \ + @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + -lIlmImfUtil -lIlmImf -lz + +EXTRA_DIST = CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IlmImfUtilTest/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu IlmImfUtilTest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +IlmImfUtilTest$(EXEEXT): $(IlmImfUtilTest_OBJECTS) $(IlmImfUtilTest_DEPENDENCIES) + @rm -f IlmImfUtilTest$(EXEEXT) + $(CXXLINK) $(IlmImfUtilTest_OBJECTS) $(IlmImfUtilTest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDeepImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFlatImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testIO.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/IlmImfUtilTest/main.cpp b/IlmImfUtilTest/main.cpp new file mode 100644 index 0000000..eb1e0b0 --- /dev/null +++ b/IlmImfUtilTest/main.cpp @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImfNamespace.h" + +#include "testFlatImage.h" +#include "testDeepImage.h" +#include "testIO.h" +#include "tmpDir.h" +#include + +#include +#include +#include +#include +#include + +#if defined(OPENEXR_IMF_HAVE_LINUX_PROCFS) || defined(OPENEXR_IMF_HAVE_DARWIN) + #include +#endif + +using namespace std; + +#define TEST(test) {if (argc < 2 || !strcmp (argv[1], #test)) test(tempDir);} + + +int +main (int argc, char *argv[]) +{ + // + // Create temporary files in a uniquely named private temporary + // subdirectory of IMF_TMP_DIR to avoid colliding with other running + // instances of this program. + // + + IMATH_NAMESPACE::Rand48 rand48 (time ((time_t*)0) ); + std::string tempDir; + + while (true) + { + tempDir = IMF_TMP_DIR "IlmImfTest_"; + + for (int i = 0; i < 8; ++i) + tempDir += ('A' + rand48.nexti() % 26); + + if (mkdir (tempDir.c_str(), 0777) == 0) + { + tempDir += IMF_PATH_SEPARATOR; + break; // success + } + + if (errno != EEXIST) + { + cerr << "Cannot create directory " << tempDir << ". " << + strerror (errno) << endl; + + return 1; + } + } + + cout << "using temporary directory " << tempDir << endl; + + TEST (testFlatImage); + TEST (testDeepImage); + TEST (testIO); + + cout << "removing temporary directory " << tempDir << endl; + rmdir (tempDir.c_str()); + + return 0; +} diff --git a/IlmImfUtilTest/testDeepImage.cpp b/IlmImfUtilTest/testDeepImage.cpp new file mode 100644 index 0000000..38dda72 --- /dev/null +++ b/IlmImfUtilTest/testDeepImage.cpp @@ -0,0 +1,749 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +namespace { + + +template +void +verifyPixelsAreEqual + (const DeepImageChannel &c1, + const DeepImageChannel &c2, + int dx, + int dy) +{ + const TypedDeepImageChannel &tc1 = + dynamic_cast &> (c1); + + const TypedDeepImageChannel &tc2 = + dynamic_cast &> (c2); + + const Box2i &dataWindow = c1.level().dataWindow(); + const SampleCountChannel &scc1 = c1.deepLevel().sampleCounts(); + const SampleCountChannel &scc2 = c2.deepLevel().sampleCounts(); + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; ++y) + { + for (int x = dataWindow.min.x; x <= dataWindow.max.x; ++x) + { + int n1 = scc1.at (x, y); + int n2 = scc2.at (x + dx, y + dy); + + if (n1 != n2) + throw ArgExc ("different pixel sample counts"); + + const T* s1 = tc1.at (x, y); + const T* s2 = tc2.at (x + dx, y + dy); + + for (int i = 0; i < n1; ++i) + if (s1[i] != s2[i]) + throw ArgExc ("different sample values"); + } + } +} + + +void +verifyLevelsAreEqual + (const DeepImageLevel &level1, + const DeepImageLevel &level2, + int dx, + int dy) +{ + if (level1.dataWindow().min.x != level2.dataWindow().min.x - dx || + level1.dataWindow().min.y != level2.dataWindow().min.y - dy || + level1.dataWindow().max.x != level2.dataWindow().max.x - dx || + level1.dataWindow().max.y != level2.dataWindow().max.y - dy) + { + throw ArgExc ("different data windows"); + } + + DeepImageLevel::ConstIterator i1 = level1.begin(); + DeepImageLevel::ConstIterator i2 = level2.begin(); + + while (i1 != level1.end() && i2 != level2.end()) + { + cout << " channel " << i1.name() << endl; + + if (i1.name() != i2.name()) + throw ArgExc ("different channel names"); + + if (i1.channel().pixelType() != i2.channel().pixelType()) + throw ArgExc ("different channel types"); + + if (i1.channel().xSampling() != i2.channel().xSampling() || + i1.channel().ySampling() != i2.channel().ySampling()) + throw ArgExc ("different channel sampling rates"); + + if (i1.channel().pLinear() != i2.channel().pLinear()) + throw ArgExc ("different channel types"); + + switch (i1.channel().pixelType()) + { + case HALF: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + case FLOAT: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + case UINT: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + default: + assert (false); + } + + ++i1; + ++i2; + } + + if (i1 != level1.end() || i2 != level2.end()) + throw ArgExc ("different channel lists"); +} + + +void +verifyImagesAreEqual + (const DeepImage &img1, + const DeepImage &img2, + int dx = 0, + int dy = 0) +{ + if (img1.levelMode() != img2.levelMode()) + throw ArgExc ("different level modes"); + + if (img1.levelRoundingMode() != img2.levelRoundingMode()) + throw ArgExc ("different level rounding modes"); + + if (img1.numXLevels() != img2.numXLevels() || + img1.numYLevels() != img2.numYLevels()) + throw ArgExc ("different number of levels"); + + switch (img1.levelMode()) + { + case ONE_LEVEL: + + cout << " level 0" << endl; + + verifyLevelsAreEqual + (img1.level(), img2.level(), dx, dy); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img1.numLevels(); ++x) + { + cout << " level " << x << "" << endl; + + verifyLevelsAreEqual + (img1.level (x), img2.level (x), dx, dy); + } + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img1.numYLevels(); ++y) + { + for (int x = 0; x < img1.numXLevels(); ++x) + { + cout << " level (" << x << ", " << y << ")" << endl; + + verifyLevelsAreEqual + (img1.level (x, y), img2.level (x, y), dx, dy); + } + } + + break; + + default: + + assert (false); + } +} + + +void +fillSampleCounts (Rand48 &random, SampleCountChannel &scc) +{ + // + // Fill the sample count channel with random numbers + // + + size_t numPixels = scc.pixelsPerRow() * scc.pixelsPerColumn(); + SampleCountChannel::Edit edit (scc); + + for (size_t i = 0; i < numPixels; ++i) + edit.sampleCounts()[i] = random.nexti() % 10; +} + + +template +void +fillChannel (Rand48 &random, DeepImageChannel &c) +{ + // + // Fill image channel tc with random numbers + // + + TypedDeepImageChannel &tc = + dynamic_cast &> (c); + + const Box2i &dataWindow = tc.level().dataWindow(); + const SampleCountChannel &scc = c.deepLevel().sampleCounts(); + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; ++y) + { + for (int x = dataWindow.min.x; x <= dataWindow.max.x; ++x) + { + int n = scc.at (x, y); + T* s = tc.at (x, y); + + for (int i = 0; i < n; ++i) + s[i] = T (random.nextf (0.0, 100.0)); + } + } +} + + +void +fillChannels (Rand48 &random, DeepImageLevel &level) +{ + cout << " sample counts " << endl; + fillSampleCounts (random, level.sampleCounts()); + + for (DeepImageLevel::Iterator i = level.begin(); i != level.end(); ++i) + { + cout << " channel " << i.name() << endl; + + switch (i.channel().pixelType()) + { + case HALF: + fillChannel (random, i.channel()); + break; + + case FLOAT: + fillChannel (random, i.channel()); + break; + + case UINT: + fillChannel (random, i.channel()); + break; + + default: + assert (false); + } + } +} + + +void +fillChannels (Rand48 &random, DeepImage &img) +{ + switch (img.levelMode()) + { + case ONE_LEVEL: + + cout << " level 0" << endl; + fillChannels (random, img.level()); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img.numLevels(); ++x) + { + cout << " level " << x << "" << endl; + fillChannels (random, img.level (x)); + } + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img.numYLevels(); ++y) + { + for (int x = 0; x < img.numXLevels(); ++x) + { + cout << " level (" << x << ", " << y << ")" << endl; + fillChannels (random, img.level (x, y)); + } + } + + break; + + default: + + assert (false); + } +} + + +void +testScanLineImage + (const Box2i &dataWindow, + const string &fileName) +{ + cout << "scan lines, data window = " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << ")" << endl; + + DeepImage img1; + img1.resize (dataWindow); + + img1.insertChannel ("H1", HALF, 1, 1, false); + img1.insertChannel ("H2", HALF, 1, 1, true); + img1.insertChannel ("F", FLOAT, 1, 1, false); + img1.insertChannel ("UI", UINT, 1, 1, false); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + cout << " saving file" << endl; + saveDeepScanLineImage (fileName, img1); + + DeepImage img2; + + cout << " loading file" << endl; + loadDeepImage (fileName, img2); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2); + + remove (fileName.c_str()); +} + + +void +testScanLineImages (const string &fileName) +{ + testScanLineImage (Box2i (V2i (0, 0), V2i (399, 499)), fileName); + testScanLineImage (Box2i (V2i (-10, -50), V2i (499, 599)), fileName); + testScanLineImage (Box2i (V2i (50, 10), V2i (699, 199)), fileName); +} + + +void +testTiledImage + (const Box2i &dataWindow, + const string &fileName, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +{ + cout << "tiles, data window = " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << "), " + "level mode = " << levelMode << ", " + "rounding mode = " << levelRoundingMode << endl; + + DeepImage img1; + img1.resize (dataWindow, levelMode, levelRoundingMode); + + img1.insertChannel ("H1", HALF, 1, 1, false); + img1.insertChannel ("H2", HALF, 1, 1, true); + img1.insertChannel ("F", FLOAT, 1, 1, false); + img1.insertChannel ("UI", UINT, 1, 1, false); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + cout << " saving file" << endl; + saveDeepTiledImage (fileName, img1); + + DeepImage img2; + + cout << " loading file" << endl; + loadDeepImage (fileName, img2); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2); + + remove (fileName.c_str()); +} + + +void +testTiledImage + (const Box2i &dataWindow, + const string &fileName) +{ + testTiledImage (dataWindow, fileName, ONE_LEVEL, ROUND_DOWN); + testTiledImage (dataWindow, fileName, MIPMAP_LEVELS, ROUND_DOWN); + testTiledImage (dataWindow, fileName, MIPMAP_LEVELS, ROUND_UP); + testTiledImage (dataWindow, fileName, RIPMAP_LEVELS, ROUND_DOWN); + testTiledImage (dataWindow, fileName, RIPMAP_LEVELS, ROUND_UP); +} + + +void +testTiledImages (const string &fileName) +{ + testTiledImage (Box2i (V2i (0, 0), V2i (399, 499)), fileName); + testTiledImage (Box2i (V2i (-10, -50), V2i (499, 599)), fileName); + testTiledImage (Box2i (V2i (50, 10), V2i (699, 199)), fileName); +} + + +void +testSetSampleCounts (const Box2i &dataWindow) +{ + cout << "change sample counts, data window = " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << ")" << endl; + + DeepImage img; + img.resize (dataWindow, ONE_LEVEL, ROUND_DOWN); + img.insertChannel ("F", FLOAT, 1, 1, false); + + Rand48 random (0); + + DeepImageLevel &level = img.level(); + DeepFloatChannel &channel = level.typedChannel ("F"); + SampleCountChannel &sampleCounts = level.sampleCounts(); + + const int MAX_SAMPLES = 20; + + for (size_t i = 0; i < channel.numPixels(); ++i) + { + int x = dataWindow.min.x + random.nexti() % channel.pixelsPerRow(); + int y = dataWindow.min.y + random.nexti() % channel.pixelsPerColumn(); + + int oldN = sampleCounts.at (x, y); + int newN = random.nexti() % (MAX_SAMPLES + 1); + + float oldSamples[MAX_SAMPLES]; + + for (int j = 0; j < oldN; ++j) + oldSamples[j] = channel(x, y)[j]; + + sampleCounts.set (x, y, newN); + + if (newN > oldN) + { + for (int j = 0; j < oldN; ++j) + assert (channel(x, y)[j] == oldSamples[j]); + + for (int j = oldN; j < newN; ++j) + { + assert (channel(x, y)[j] == 0); + channel(x, y)[j] = random.nextf(); + } + } + else + { + for (int j = 0; j < newN; ++j) + assert (channel(x, y)[j] == oldSamples[j]); + } + } +} + + +void +testSetSampleCounts () +{ + testSetSampleCounts (Box2i (V2i (0, 0), V2i (399, 499))); + testSetSampleCounts (Box2i (V2i (-10, -50), V2i (499, 599))); + testSetSampleCounts (Box2i (V2i (50, 10), V2i (699, 199))); +} + + +void +testShiftPixels () +{ + cout << "pixel shifting" << endl; + + DeepImage img1 (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img1.insertChannel ("A", HALF); + img1.insertChannel ("B", HALF); + + DeepImage img2 (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img2.insertChannel ("A", HALF); + img2.insertChannel ("B", HALF); + + cout << " generating random pixel values" << endl; + + { + Rand48 random (1); + fillChannels (random, img1); + } + + { + Rand48 random (1); + fillChannels (random, img2); + } + + int DX = 5; + int DY = 7; + + cout << " shifting, dx = " << DX << ", dy = " << DY << endl; + img2.shiftPixels (DX, DY); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2, DX, DY); +} + + +void +testCropping (const string &fileName) +{ + cout << "cropping an image" << endl; + + DeepImage img1 (Box2i (V2i (10, 20), V2i (110, 120)), ONE_LEVEL); + img1.insertChannel ("A", HALF); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + Header hdr; + hdr.dataWindow() = Box2i (V2i (40, 50), V2i (60, 70)); + + cout << " saving scan line file" << endl; + saveDeepScanLineImage (fileName, hdr, img1, USE_HEADER_DATA_WINDOW); + + cout << " loading file" << endl; + DeepImage img2; + loadDeepImage (fileName, img2); + + assert (img2.dataWindow() != img1.dataWindow()); + assert (img2.dataWindow() == hdr.dataWindow()); + + cout << " comparing" << endl; + + verifyPixelsAreEqual (img2.level().channel ("A"), + img1.level().channel ("A"), + 0, 0); + + + cout << " saving tiled file" << endl; + saveDeepTiledImage (fileName, hdr, img1, USE_HEADER_DATA_WINDOW); + + cout << " loading file" << endl; + DeepImage img3; + loadDeepImage (fileName, img3); + + assert (img3.dataWindow() != img1.dataWindow()); + assert (img3.dataWindow() == hdr.dataWindow()); + + cout << " comparing" << endl; + + verifyPixelsAreEqual (img3.level(0).channel ("A"), + img1.level(0).channel ("A"), + 0, 0); +} + + +void +testRenameChannel () +{ + cout << "channel renaming" << endl; + + DeepImage img (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img.insertChannel ("A", HALF); + img.insertChannel ("B", HALF); + + for (int i = 0; i < img.numLevels(); ++i) + { + const DeepImageLevel &level = img.level (i); + assert (level.findTypedChannel ("A") != 0); + assert (level.findTypedChannel ("B") != 0); + assert (level.findTypedChannel ("C") == 0); + } + + img.renameChannel ("A", "C"); + + for (int i = 0; i < img.numLevels(); ++i) + { + const DeepImageLevel &level = img.level (i); + assert (level.findTypedChannel ("A") == 0); + assert (level.findTypedChannel ("B") != 0); + assert (level.findTypedChannel ("C") != 0); + } + + try + { + img.renameChannel ("A", "D"); // "A" doesn't exist + assert (false); + } + catch (...) + { + // expecting exception + } + + try + { + img.renameChannel ("C", "B"); // "B" exists already + assert (false); + } + catch (...) + { + // expecting exception + } +} + + +void +testRenameChannels () +{ + cout << "renaming multiple channels at the same time" << endl; + + DeepImage img (Box2i (V2i (0, 0), V2i (10, 10)), MIPMAP_LEVELS); + img.insertChannel ("A", HALF); + img.insertChannel ("B", HALF); + img.insertChannel ("C", HALF); + img.insertChannel ("D", HALF); + + img.level(0).sampleCounts().set (0, 0, 1); + img.level(0).typedChannel("A").at(0, 0)[0] = 1; + img.level(0).typedChannel("B").at(0, 0)[0] = 2; + img.level(0).typedChannel("C").at(0, 0)[0] = 3; + img.level(0).typedChannel("D").at(0, 0)[0] = 4; + + img.level(1).sampleCounts().set (0, 0, 1); + img.level(1).typedChannel("A").at(0, 0)[0] = 1; + img.level(1).typedChannel("B").at(0, 0)[0] = 2; + img.level(1).typedChannel("C").at(0, 0)[0] = 3; + img.level(1).typedChannel("D").at(0, 0)[0] = 4; + + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "B"; + oldToNewNames["B"] = "A"; + oldToNewNames["C"] = "E"; + oldToNewNames["X"] = "Y"; + + img.renameChannels (oldToNewNames); + } + + assert (img.level(0).findChannel("A") != 0); + assert (img.level(0).findChannel("B") != 0); + assert (img.level(0).findChannel("C") == 0); + assert (img.level(0).findChannel("D") != 0); + assert (img.level(0).findChannel("E") != 0); + + assert (img.level(0).typedChannel("A").at(0, 0)[0] == 2); + assert (img.level(0).typedChannel("B").at(0, 0)[0] == 1); + assert (img.level(0).typedChannel("D").at(0, 0)[0] == 4); + assert (img.level(0).typedChannel("E").at(0, 0)[0] == 3); + + assert (img.level(1).typedChannel("A").at(0, 0)[0] == 2); + assert (img.level(1).typedChannel("B").at(0, 0)[0] == 1); + assert (img.level(1).typedChannel("D").at(0, 0)[0] == 4); + assert (img.level(1).typedChannel("E").at(0, 0)[0] == 3); + + try + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "F"; + oldToNewNames["B"] = "F"; // duplicate new name "F" + + img.renameChannels (oldToNewNames); + assert (false); + } + catch (...) + { + // expecting exception + } + + try + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "B"; // duplicate new name "B" + + img.renameChannels (oldToNewNames); + assert (false); + } + catch (...) + { + // expecting exception + } +} + +} // namespace + + +void +testDeepImage (const string &tempDir) +{ + try + { + cout << "Testing class DeepImage" << endl; + + testScanLineImages (tempDir + "deepScanLines.exr"); + testTiledImages (tempDir + "deepTiles.exr"); + testSetSampleCounts(); + testShiftPixels(); + testCropping (tempDir + "deepCropped.exr"); + testRenameChannel(); + testRenameChannels(); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfUtilTest/testDeepImage.h b/IlmImfUtilTest/testDeepImage.h new file mode 100644 index 0000000..cd09185 --- /dev/null +++ b/IlmImfUtilTest/testDeepImage.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testDeepImage (const std::string &tempDir); + diff --git a/IlmImfUtilTest/testFlatImage.cpp b/IlmImfUtilTest/testFlatImage.cpp new file mode 100644 index 0000000..57d0c89 --- /dev/null +++ b/IlmImfUtilTest/testFlatImage.cpp @@ -0,0 +1,646 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +namespace { + + +template +void +verifyPixelsAreEqual + (const FlatImageChannel &c1, + const FlatImageChannel &c2, + int dx, + int dy) +{ + const TypedFlatImageChannel &tc1 = + dynamic_cast &> (c1); + + const TypedFlatImageChannel &tc2 = + dynamic_cast &> (c2); + + const Box2i &dataWindow = c1.level().dataWindow(); + int xStep = c1.xSampling(); + int yStep = c1.ySampling(); + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; y += yStep) + for (int x = dataWindow.min.x; x <= dataWindow.max.x; x += xStep) + if (tc1.at (x, y) != tc2.at (x + dx, y + dy)) + throw ArgExc ("different pixel values"); +} + + +void +verifyLevelsAreEqual + (const FlatImageLevel &level1, + const FlatImageLevel &level2, + int dx, + int dy) +{ + if (level1.dataWindow().min.x != level2.dataWindow().min.x - dx || + level1.dataWindow().min.y != level2.dataWindow().min.y - dy || + level1.dataWindow().max.x != level2.dataWindow().max.x - dx || + level1.dataWindow().max.y != level2.dataWindow().max.y - dy) + { + throw ArgExc ("different data windows"); + } + + FlatImageLevel::ConstIterator i1 = level1.begin(); + FlatImageLevel::ConstIterator i2 = level2.begin(); + + while (i1 != level1.end() && i2 != level2.end()) + { + cout << " channel " << i1.name() << endl; + + if (i1.name() != i2.name()) + throw ArgExc ("different channel names"); + + if (i1.channel().pixelType() != i2.channel().pixelType()) + throw ArgExc ("different channel types"); + + if (i1.channel().xSampling() != i2.channel().xSampling() || + i1.channel().ySampling() != i2.channel().ySampling()) + throw ArgExc ("different channel sampling rates"); + + if (i1.channel().pLinear() != i2.channel().pLinear()) + throw ArgExc ("different channel types"); + + switch (i1.channel().pixelType()) + { + case HALF: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + case FLOAT: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + case UINT: + + verifyPixelsAreEqual + (i1.channel(), i2.channel(), dx, dy); + + break; + + default: + assert (false); + } + + ++i1; + ++i2; + } + + if (i1 != level1.end() || i2 != level2.end()) + throw ArgExc ("different channel lists"); +} + + +void +verifyImagesAreEqual + (const FlatImage &img1, + const FlatImage &img2, + int dx = 0, + int dy = 0) +{ + if (img1.levelMode() != img2.levelMode()) + throw ArgExc ("different level modes"); + + if (img1.levelRoundingMode() != img2.levelRoundingMode()) + throw ArgExc ("different level rounding modes"); + + if (img1.numXLevels() != img2.numXLevels() || + img1.numYLevels() != img2.numYLevels()) + throw ArgExc ("different number of levels"); + + switch (img1.levelMode()) + { + case ONE_LEVEL: + + cout << " level 0" << endl; + + verifyLevelsAreEqual + (img1.level(), img2.level(), dx, dy); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img1.numLevels(); ++x) + { + cout << " level " << x << "" << endl; + + verifyLevelsAreEqual + (img1.level (x), img2.level (x), dx, dy); + } + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img1.numYLevels(); ++y) + { + for (int x = 0; x < img1.numXLevels(); ++x) + { + cout << " level (" << x << ", " << y << ")" << endl; + + verifyLevelsAreEqual + (img1.level (x, y), img2.level (x, y), dx, dy); + } + } + + break; + + default: + + assert (false); + } +} + + +template +void +fillChannel (Rand48 &random, FlatImageChannel &c) +{ + // + // Fill image channel tc with random numbers + // + + TypedFlatImageChannel &tc = + dynamic_cast &> (c); + + const Box2i &dataWindow = tc.level().dataWindow(); + int xStep = tc.xSampling(); + int yStep = tc.ySampling(); + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; y += yStep) + for (int x = dataWindow.min.x; x <= dataWindow.max.x; x += xStep) + tc.at (x, y) = T (random.nextf (0.0, 100.0)); +} + + +void +fillChannels (Rand48 &random, FlatImageLevel &level) +{ + for (FlatImageLevel::Iterator i = level.begin(); i != level.end(); ++i) + { + cout << " channel " << i.name() << endl; + + switch (i.channel().pixelType()) + { + case HALF: + fillChannel (random, i.channel()); + break; + + case FLOAT: + fillChannel (random, i.channel()); + break; + + case UINT: + fillChannel (random, i.channel()); + break; + + default: + assert (false); + } + } +} + + +void +fillChannels (Rand48 &random, FlatImage &img) +{ + switch (img.levelMode()) + { + case ONE_LEVEL: + + cout << " level 0" << endl; + fillChannels (random, img.level()); + + break; + + case MIPMAP_LEVELS: + + for (int x = 0; x < img.numLevels(); ++x) + { + cout << " level " << x << "" << endl; + fillChannels (random, img.level (x)); + } + + break; + + case RIPMAP_LEVELS: + + for (int y = 0; y < img.numYLevels(); ++y) + { + for (int x = 0; x < img.numXLevels(); ++x) + { + cout << " level (" << x << ", " << y << ")" << endl; + fillChannels (random, img.level (x, y)); + } + } + + break; + + default: + + assert (false); + } +} + + +void +testScanLineImage + (const Box2i &dataWindow, + const string &fileName) +{ + cout << "scan lines, data window = " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << ")" << endl; + + FlatImage img1; + img1.resize (dataWindow); + + img1.insertChannel ("H11", HALF, 1, 1, false); + img1.insertChannel ("H22", HALF, 2, 2, true); + img1.insertChannel ("H12", HALF, 1, 2, true); + img1.insertChannel ("H21", HALF, 2, 1, true); + img1.insertChannel ("F", FLOAT, 1, 1, false); + img1.insertChannel ("UI", UINT, 1, 1, false); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + cout << " saving file" << endl; + saveFlatScanLineImage (fileName, img1); + + FlatImage img2; + + cout << " loading file" << endl; + loadFlatImage (fileName, img2); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2); + + remove (fileName.c_str()); +} + + +void +testScanLineImages (const string &fileName) +{ + testScanLineImage (Box2i (V2i (0, 0), V2i (399, 499)), fileName); + testScanLineImage (Box2i (V2i (-10, -50), V2i (499, 599)), fileName); + testScanLineImage (Box2i (V2i (50, 10), V2i (699, 199)), fileName); +} + + +void +testTiledImage + (const Box2i &dataWindow, + const string &fileName, + LevelMode levelMode, + LevelRoundingMode levelRoundingMode) +{ + cout << "tiles, data window = " + "(" << dataWindow.min.x << ", " << dataWindow.min.y << ") - " + "(" << dataWindow.max.x << ", " << dataWindow.max.y << "), " + "level mode = " << levelMode << ", " + "rounding mode = " << levelRoundingMode << endl; + + FlatImage img1; + img1.resize (dataWindow, levelMode, levelRoundingMode); + + img1.insertChannel ("H1", HALF, 1, 1, false); + img1.insertChannel ("H2", HALF, 1, 1, true); + img1.insertChannel ("F", FLOAT, 1, 1, false); + img1.insertChannel ("UI", UINT, 1, 1, false); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + cout << " saving file" << endl; + saveFlatTiledImage (fileName, img1); + + FlatImage img2; + + cout << " loading file" << endl; + loadFlatImage (fileName, img2); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2); + + remove (fileName.c_str()); +} + + +void +testTiledImage + (const Box2i &dataWindow, + const string &fileName) +{ + testTiledImage (dataWindow, fileName, ONE_LEVEL, ROUND_DOWN); + testTiledImage (dataWindow, fileName, MIPMAP_LEVELS, ROUND_DOWN); + testTiledImage (dataWindow, fileName, MIPMAP_LEVELS, ROUND_UP); + testTiledImage (dataWindow, fileName, RIPMAP_LEVELS, ROUND_DOWN); + testTiledImage (dataWindow, fileName, RIPMAP_LEVELS, ROUND_UP); +} + + +void +testTiledImages (const string &fileName) +{ + testTiledImage (Box2i (V2i (0, 0), V2i (399, 499)), fileName); + testTiledImage (Box2i (V2i (-10, -50), V2i (499, 599)), fileName); + testTiledImage (Box2i (V2i (50, 10), V2i (699, 199)), fileName); +} + + +void +testShiftPixels () +{ + cout << "pixel shifting" << endl; + + FlatImage img1 (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img1.insertChannel ("A", HALF); + img1.insertChannel ("B", HALF); + + FlatImage img2 (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img2.insertChannel ("A", HALF); + img2.insertChannel ("B", HALF); + + cout << " generating random pixel values" << endl; + + { + Rand48 random (1); + fillChannels (random, img1); + } + + { + Rand48 random (1); + fillChannels (random, img2); + } + + int DX = 5; + int DY = 7; + + cout << " shifting, dx = " << DX << ", dy = " << DY << endl; + img2.shiftPixels (DX, DY); + + cout << " comparing" << endl; + verifyImagesAreEqual (img1, img2, DX, DY); +} + + +void +testCropping (const string &fileName) +{ + cout << "cropping an image" << endl; + + FlatImage img1 (Box2i (V2i (10, 20), V2i (110, 120)), ONE_LEVEL); + img1.insertChannel ("A", HALF); + + Rand48 random (0); + cout << " generating random pixel values" << endl; + fillChannels (random, img1); + + Header hdr; + hdr.dataWindow() = Box2i (V2i (40, 50), V2i (60, 70)); + + cout << " saving scan line file" << endl; + saveFlatScanLineImage (fileName, hdr, img1, USE_HEADER_DATA_WINDOW); + + cout << " loading file" << endl; + FlatImage img2; + loadFlatImage (fileName, img2); + + assert (img2.dataWindow() != img1.dataWindow()); + assert (img2.dataWindow() == hdr.dataWindow()); + + cout << " comparing" << endl; + + verifyPixelsAreEqual (img2.level().channel ("A"), + img1.level().channel ("A"), + 0, 0); + + + cout << " saving tiled file" << endl; + saveFlatTiledImage (fileName, hdr, img1, USE_HEADER_DATA_WINDOW); + + cout << " loading file" << endl; + FlatImage img3; + loadFlatImage (fileName, img3); + + assert (img3.dataWindow() != img1.dataWindow()); + assert (img3.dataWindow() == hdr.dataWindow()); + + cout << " comparing" << endl; + + verifyPixelsAreEqual (img3.level(0).channel ("A"), + img1.level(0).channel ("A"), + 0, 0); +} + + +void +testRenameChannel () +{ + cout << "renaming a single channel" << endl; + + FlatImage img (Box2i (V2i (15, 20), V2i (45, 60)), MIPMAP_LEVELS); + img.insertChannel ("A", HALF); + img.insertChannel ("B", HALF); + + for (int i = 0; i < img.numLevels(); ++i) + { + const FlatImageLevel &level = img.level (i); + assert (level.findTypedChannel ("A") != 0); + assert (level.findTypedChannel ("B") != 0); + assert (level.findTypedChannel ("C") == 0); + } + + img.renameChannel ("A", "C"); + + for (int i = 0; i < img.numLevels(); ++i) + { + const FlatImageLevel &level = img.level (i); + assert (level.findTypedChannel ("A") == 0); + assert (level.findTypedChannel ("B") != 0); + assert (level.findTypedChannel ("C") != 0); + } + + try + { + img.renameChannel ("A", "D"); // "A" doesn't exist + assert (false); + } + catch (...) + { + // expecting exception + } + + try + { + img.renameChannel ("C", "B"); // "B" exists already + assert (false); + } + catch (...) + { + // expecting exception + } +} + + +void +testRenameChannels () +{ + cout << "renaming multiple channels at the same time" << endl; + + FlatImage img (Box2i (V2i (0, 0), V2i (10, 10)), MIPMAP_LEVELS); + img.insertChannel ("A", HALF); + img.insertChannel ("B", HALF); + img.insertChannel ("C", HALF); + img.insertChannel ("D", HALF); + + img.level(0).typedChannel("A").at (0, 0) = 1; + img.level(0).typedChannel("B").at (0, 0) = 2; + img.level(0).typedChannel("C").at (0, 0) = 3; + img.level(0).typedChannel("D").at (0, 0) = 4; + + img.level(1).typedChannel("A").at (0, 0) = 1; + img.level(1).typedChannel("B").at (0, 0) = 2; + img.level(1).typedChannel("C").at (0, 0) = 3; + img.level(1).typedChannel("D").at (0, 0) = 4; + + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "B"; + oldToNewNames["B"] = "A"; + oldToNewNames["C"] = "E"; + oldToNewNames["X"] = "Y"; + + img.renameChannels (oldToNewNames); + } + + assert (img.level(0).findChannel("A") != 0); + assert (img.level(0).findChannel("B") != 0); + assert (img.level(0).findChannel("C") == 0); + assert (img.level(0).findChannel("D") != 0); + assert (img.level(0).findChannel("E") != 0); + + assert (img.level(0).typedChannel("A").at (0, 0) == 2); + assert (img.level(0).typedChannel("B").at (0, 0) == 1); + assert (img.level(0).typedChannel("D").at (0, 0) == 4); + assert (img.level(0).typedChannel("E").at (0, 0) == 3); + + assert (img.level(1).typedChannel("A").at (0, 0) == 2); + assert (img.level(1).typedChannel("B").at (0, 0) == 1); + assert (img.level(1).typedChannel("D").at (0, 0) == 4); + assert (img.level(1).typedChannel("E").at (0, 0) == 3); + + try + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "F"; + oldToNewNames["B"] = "F"; // duplicate new name "F" + + img.renameChannels (oldToNewNames); + assert (false); + } + catch (...) + { + // expecting exception + } + + try + { + RenamingMap oldToNewNames; + oldToNewNames["A"] = "B"; // duplicate new name "B" + + img.renameChannels (oldToNewNames); + assert (false); + } + catch (...) + { + // expecting exception + } +} + +} // namespace + + +void +testFlatImage (const string &tempDir) +{ + try + { + cout << "Testing class FlatImage" << endl; + + testScanLineImages (tempDir + "scanLines.exr"); + testTiledImages (tempDir + "tiles.exr"); + testShiftPixels(); + testCropping (tempDir + "cropped.exr"); + testRenameChannel(); + testRenameChannels(); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfUtilTest/testFlatImage.h b/IlmImfUtilTest/testFlatImage.h new file mode 100644 index 0000000..7e2780a --- /dev/null +++ b/IlmImfUtilTest/testFlatImage.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testFlatImage (const std::string &tempDir); + diff --git a/IlmImfUtilTest/testIO.cpp b/IlmImfUtilTest/testIO.cpp new file mode 100644 index 0000000..4e4abac --- /dev/null +++ b/IlmImfUtilTest/testIO.cpp @@ -0,0 +1,250 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace IEX_NAMESPACE; +using namespace std; + +namespace { + +void +testFlatScanLineImage1 (const string &fileName) +{ + FlatImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + saveImage (fileName, img1); + + Header hdr; + Image* img2 = loadImage (fileName, hdr); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (!hdr.hasTileDescription()); + + delete img2; +} + +void +testFlatScanLineImage2 (const string &fileName) +{ + FlatImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + + Header hdr1; + addComments (hdr1, "it's raining"); + + saveImage (fileName, hdr1, img1); + + Header hdr2; + Image* img2 = loadImage (fileName, hdr2); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (!hdr2.hasTileDescription()); + assert (hasComments (hdr2)); + assert (comments (hdr2) == "it's raining"); + + delete img2; +} + + +void +testFlatTiledImage1 (const string &fileName) +{ + FlatImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), MIPMAP_LEVELS, ROUND_DOWN); + img1.insertChannel ("H", HALF); + saveImage (fileName, img1); + + Header hdr; + Image* img2 = loadImage (fileName, hdr); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == MIPMAP_LEVELS); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (hdr.hasTileDescription()); + + delete img2; +} + + +void +testFlatTiledImage2 (const string &fileName) +{ + FlatImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + + Header hdr1; + hdr1.setTileDescription (TileDescription (32, 32)); + + saveImage (fileName, hdr1, img1); + + Header hdr2; + Image* img2 = loadImage (fileName, hdr2); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (hdr2.hasTileDescription()); + + delete img2; +} + + +void +testDeepScanLineImage1 (const string &fileName) +{ + DeepImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + saveImage (fileName, img1); + + Header hdr; + Image* img2 = loadImage (fileName, hdr); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (!hdr.hasTileDescription()); + + delete img2; +} + +void +testDeepScanLineImage2 (const string &fileName) +{ + DeepImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + + Header hdr1; + addComments (hdr1, "it's raining"); + + saveImage (fileName, hdr1, img1); + + Header hdr2; + Image* img2 = loadImage (fileName, hdr2); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (!hdr2.hasTileDescription()); + assert (hasComments (hdr2)); + assert (comments (hdr2) == "it's raining"); + + delete img2; +} + + +void +testDeepTiledImage1 (const string &fileName) +{ + DeepImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), MIPMAP_LEVELS, ROUND_DOWN); + img1.insertChannel ("H", HALF); + saveImage (fileName, img1); + + Header hdr; + Image* img2 = loadImage (fileName, hdr); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == MIPMAP_LEVELS); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (hdr.hasTileDescription()); + + delete img2; +} + + +void +testDeepTiledImage2 (const string &fileName) +{ + DeepImage img1 (Box2i (V2i (0, 0), V2i (5, 5)), ONE_LEVEL, ROUND_DOWN); + img1.insertChannel ("H", HALF); + + Header hdr1; + hdr1.setTileDescription (TileDescription (32, 32)); + + saveImage (fileName, hdr1, img1); + + Header hdr2; + Image* img2 = loadImage (fileName, hdr2); + + assert (dynamic_cast (img2)); + assert (img2->levelMode() == ONE_LEVEL); + assert (img2->levelRoundingMode() == ROUND_DOWN); + assert (hdr2.hasTileDescription()); + + delete img2; +} + + +} // namespace + + +void +testIO (const string &tempDir) +{ + try + { + cout << "Testing I/O based on image and file type" << endl; + + testFlatScanLineImage1 (tempDir + "io.exr"); + testFlatScanLineImage2 (tempDir + "io.exr"); + testFlatTiledImage1 (tempDir + "io.exr"); + testFlatTiledImage1 (tempDir + "io.exr"); + testDeepScanLineImage1 (tempDir + "io.exr"); + testDeepScanLineImage2 (tempDir + "io.exr"); + testDeepTiledImage1 (tempDir + "io.exr"); + testDeepTiledImage2 (tempDir + "io.exr"); + + cout << "ok\n" << endl; + } + catch (const std::exception &e) + { + cerr << "ERROR -- caught exception: " << e.what() << endl; + assert (false); + } +} diff --git a/IlmImfUtilTest/testIO.h b/IlmImfUtilTest/testIO.h new file mode 100644 index 0000000..c44c4bf --- /dev/null +++ b/IlmImfUtilTest/testIO.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014 Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + + +#include + +void testIO (const std::string &tempDir); + diff --git a/IlmImfUtilTest/tmpDir.h b/IlmImfUtilTest/tmpDir.h new file mode 100644 index 0000000..62c4cd5 --- /dev/null +++ b/IlmImfUtilTest/tmpDir.h @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#if defined(ANDROID) || defined(__ANDROID_API__) + #define IMF_TMP_DIR "/sdcard/" + #define IMF_PATH_SEPARATOR "/" +#elif defined(_WIN32) || defined(_WIN64) || defined(__MWERKS__) + #define IMF_TMP_DIR "" // TODO: get this from GetTempPath() or env var $TEMP or $TMP + #define IMF_PATH_SEPARATOR "\\" + #include // for _mkdir, _rmdir + #define mkdir(name,mode) _mkdir(name) + #define rmdir _rmdir +#else + #include // for mkdir + #define IMF_TMP_DIR "/var/tmp/" + #define IMF_PATH_SEPARATOR "/" +#endif diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6372750 --- /dev/null +++ b/LICENSE @@ -0,0 +1,34 @@ +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm +Entertainment Company Ltd. Portions contributed and copyright held by +others as indicated. 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 Industrial Light & Magic nor the names of + any other contributors to this software 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/Makefile.am b/Makefile.am new file mode 100644 index 0000000..3a232af --- /dev/null +++ b/Makefile.am @@ -0,0 +1,27 @@ +## Process this file with automake to produce Makefile.in + +# tell autoconf to include the m4 macros in the /m4 directory +# (an alternative to the acinclude.m4 mechanism) +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = config IlmImf IlmImfUtil IlmImfTest IlmImfUtilTest \ + IlmImfFuzzTest exrheader exrmaketiled IlmImfExamples doc \ + exrstdattr exrmakepreview exrenvmap exrmultiview exrmultipart + +DIST_SUBDIRS = \ + $(SUBDIRS) + +EXTRA_DIST = \ + AUTHORS COPYING ChangeLog INSTALL LICENSE NEWS PATENTS \ + README README.CVS README.OSX README.win32 \ + README.git README.namespacing README.cmake.txt \ + bootstrap openexr.m4 \ + config.windows/OpenEXRConfig.h \ + CMakeLists.txt + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = OpenEXR.pc + +m4datadir = $(datadir)/aclocal +m4data_DATA = openexr.m4 + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..c63c319 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,812 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/OpenEXR.pc.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + config.guess config.sub depcomp install-sh ltmain.sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = OpenEXR.pc +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" +DATA = $(m4data_DATA) $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# tell autoconf to include the m4 macros in the /m4 directory +# (an alternative to the acinclude.m4 mechanism) +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = config IlmImf IlmImfUtil IlmImfTest IlmImfUtilTest \ + IlmImfFuzzTest exrheader exrmaketiled IlmImfExamples doc \ + exrstdattr exrmakepreview exrenvmap exrmultiview exrmultipart + +DIST_SUBDIRS = \ + $(SUBDIRS) + +EXTRA_DIST = \ + AUTHORS COPYING ChangeLog INSTALL LICENSE NEWS PATENTS \ + README README.CVS README.OSX README.win32 \ + README.git README.namespacing README.cmake.txt \ + bootstrap openexr.m4 \ + config.windows/OpenEXRConfig.h \ + CMakeLists.txt + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = OpenEXR.pc +m4datadir = $(datadir)/aclocal +m4data_DATA = openexr.m4 +all: all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +OpenEXR.pc: $(top_builddir)/config.status $(srcdir)/OpenEXR.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)" + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(m4datadir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(m4datadir)" && rm -f $$files +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-m4dataDATA install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-m4dataDATA uninstall-pkgconfigDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-m4dataDATA install-man \ + install-pdf install-pdf-am install-pkgconfigDATA install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-m4dataDATA \ + uninstall-pkgconfigDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e8dde6c --- /dev/null +++ b/NEWS @@ -0,0 +1,184 @@ +Version 1.5.0: + - Separated some of the code into other libraries - IlmBase and + OpenEXR_Viewers - for easier integration with CTL. + +Version 1.4.0a: + - Fix for Visual Studio .NET 2003 ReleaseDLL builds. + +Version 1.4.0: + - Production release. + - Bug fix for setFrameBuffer() on a tiled file. + +Version 1.3.1: + - Fixed the ReleaseDLL targets on Visual Studio 2005. + +Version 1.3.0: + - The 1.3.x series is a developer-only release for testing + OpenEXR's new multithreaded I/O support. + - Multithread support for reading and writing an OpenEXR + file. + - Support for Intel-based OS X systems. + - Support for Visual Studio 2005. + - When compiling against OpenEXR headers, there's no longer any + need to define any PLATFORM_* or HAVE_* macros; OpenEXR now + supplies an OpenEXRConfig.h header file which is included by + the OpenEXR headers that need these special macros. However, + on Windows platforms, when using OpenEXR DLLs, you must still + define the OPENEXR_DLL preprocessor directive in your project. + - New documentation for multithread support, plus some + updates and additions. + - Bug fixes releated to better handling of incomplete/damaged + files. + - Numerous bug fixes and cleanups to the autoconf-based + build system. + - Removed support for the following configurations that were + previously supported. Some of these configurations may happen + to continue to function, but we can't help you if they don't, + largely because we don't have any way to test OpenEXR on these + configurations. + - IRIX + - OSF1 + - SunOS + - OS X versions prior to 10.3. + - gcc on any platform prior to version 3.3 + +Version 1.2.2: + - New build system for Windows; support for DLLs. + - Imath: Removed TMatrix classes; these classes are still + under development and are too difficult to keep in sync + with OpenEXR CVS. + - IlmImf: support for image layers in ChannelList. + - IlmImf: added isComplete() method to file classes to check + whether a file is complete. + - IlmImf: exposed staticInitialize() in ImfHeader.h in + order to allow thread-safe library initialization in + multithreaded applications. + - IlmImf: New "time code" standard attribute. + - exrdisplay: support for displaying wrap-around texture map + images. + - exrmaketiled: can now specify wrap mode. + - IlmImf: New "wrapmodes" standard attribute to indicate + extrapolation mode for mipmaps and ripmaps. + - IlmImf: New "key code" standard attribute to identify motion + picture film frames. + +Version 1.2.1: + - reduced memory footprint of exrenvmap and exrmaketiled + utilities. + - IlmImf: new helper functions to determine whether a + file is an OpenEXR file, and whether it's scanline- or + tile-based. + - IlmImf: bug fix for PXR24 compression with ySampling != 1. + - Imath: a few new enhancements + - Better support for gcc 3.4. + - Warning cleanups in Visual C++. + +Version 1.2: + - Production-ready release. + - Support for gcc 3.4. + - Supports gcc 2.95 again. + - IlmImf: bug fix for handling broken OpenEXR files without + crashing. + +Version 1.1.1: + - Added Pixar's new "slightly lossy" image compression method + for FLOAT channels, called PXR24. HALF and UINT channels + are compressed without loss. + - Changed top-level LICENSE file to allow for other copyright + holders for individual files. + - Reading tiled files with the scanline interface is faster. + - OpenEXR now supports YCA (luminance/chroma/alpha) images with + subsampled chroma channels. + - IlmImf: various bug fixes. + - The half class is now faster in some expressions. + - New tiled file format. The new format is incompatible with + the format used by 1.1.0. + +Version 1.1.0: + - IlmImfExamples: Updated to include examples of how to use + the tiling and mip/ripmapping interfaces. + - exrmakepreview: A new utility for embedding preview images + in OpenEXR files. + - exrenvmap: A new utility for creating OpenEXR environment maps. + - exrstdattr: A new utility for manipulating standard attributes. + - exrdisplay: Support for tiled, mip/ripmapped images, display + windows, and preview images. + - exrmaketiled: A new utility which generates tiled versions + of OpenEXR images. + - exrheader: Support for tiles, mipmaps, environment maps. + - IlmImf: Support for environment maps. + - IlmImf: Support for abstracted stream I/O. You can + wrap the IStream and OStream classes around your API + of choice (FILE *, fd, even an HTTP 1.1 stream) as long + as it supports seeking. + - IlmImf: Support for tiled and mip/ripmapped files. This + requires a new file format. Scanline files generated by + the 1.1.0 version of the library can be read by older + versions, but tiled files can only be read by 1.1.0 or + greater. + - Imath: added TMatrix*, generic 2D matricies and algorithms. + - Imath: various updates and bug fixes. + +Version 1.0.7: + - Support for "optional standard" attributes: + Primary and white point chromaticities. + Absolute luminance. + Content owner + Comments + Image acquisition time and place + Focus distance + Lens aperture + Film sensitivity + If you want to use these new attributes in your application, see + ImfStandardAttributes.h for documentation on what they are and how + to use them. + - Bug fix in OpaqueAttributes. + +Version 1.0.6: + - Support for embedded preview images (thumbnails). + - Automatic frame buffer type conversion. + - Support for Visual Studio .NET 2003 w/ Microsoft's C++ compiler. + - Minor bug fixes. + +Version 1.0.5: + - PIZ decoding should be 20-60% faster on Athlon and Pentium 4 + systems. + - exrdisplay supports hardware rendering with vp30 profile fragment + shaders. + - Support for Win32 with Visual Studio 6.0 and Intel C++ compiler + version 7.0. + - Support for gcc 2.95. + - New exrheader utility. + - exrdisplay works on Win32 and OS X now. + - Minor bug fixes. + +Version 1.0.4: + - Released under the new modified BSD license. + +Version 1.0.3: + - Even more OS X fixes. + - Support for Metrowerks Codewarrior compiler. Enables OpenEXR code + to be used in a MacOS Photoshop plugin, if someone wants to write + one. ;) + - Fixed a bug in Imath, added some new confidence tests to ImathTest. + - Other minor fixes. + - Install include files. + - exrdisplay requires fltk 1.1+ now. + +Version 1.0.2: + - More OS X fixes. + - Fixed a rotation bug in Imath. + +Version 1.0.1: + - OS X fixes. + - Removed the example images; these are now distributed separately. + +Version 1.0: + - official release. + +Version 0.9: + - another limited release. + - included exrdisplay viewer and sample EXR images. + +Version 0.8: + - initial limited release. diff --git a/OpenEXR.pc.in b/OpenEXR.pc.in new file mode 100644 index 0000000..f1d4e59 --- /dev/null +++ b/OpenEXR.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +OpenEXR_includedir=@includedir@/OpenEXR + +Name: OpenEXR +Description: OpenEXR image library +Version: @OPENEXR_VERSION@ + +Libs: -L${libdir} -lIlmImf +Cflags: -I${OpenEXR_includedir} +Requires: IlmBase +Libs.private: -lz diff --git a/PATENTS b/PATENTS new file mode 100644 index 0000000..ce9fb28 --- /dev/null +++ b/PATENTS @@ -0,0 +1,23 @@ +Additional IP Rights Grant (Patents) "DreamWorks Lossy Compression" means the +copyrightable works distributed by DreamWorks Animation as part of the OpenEXR +Project. Within the OpenEXR project, DreamWorks Animation hereby grants to you +a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, use, +import, sell products which incorporate this IP as part of the OpenEXR +standard, transfer, and otherwise run, modify and propagate the contents of +this implementation of DreamWorks Lossy Compression within the OpenEXR standard, +where such license applies only to those patent claims, both currently owned by +DreamWorks Animation and acquired in the future, licensable by DreamWorks +Animation that are necessarily infringed by this implementation of DreamWorks +Lossy Compression. This grant does not include use of DreamWorks Lossy +Compression outside of the OpenEXR standard. This grant does not include claims +that would be infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or order +or agree to the institution of patent litigation against any entity (including +a cross-claim or counterclaim in a lawsuit) alleging that this implementation +of DreamWorks Lossy Compression or any code incorporated within this +implementation of DreamWorks Lossy Compression constitutes direct or +contributory patent infringement, or inducement of patent infringement, then +any patent rights granted to you under this License for this implementation +of DreamWorks Lossy Compression shall terminate as of the date such litigation +is filed. diff --git a/README b/README new file mode 100644 index 0000000..7038b1c --- /dev/null +++ b/README @@ -0,0 +1,77 @@ +ABOUT THE OPENEXR LIBRARIES +---------------------------- + +IlmImf is our "EXR" file format for storing 16-bit FP images. Libraries in +this package depend on the IlmBase library. + +See the IlmImfExamples directory for some code that demonstrates how +to use the IlmImf library to read and write OpenEXR files. The doc +directory contains some high-level documentation and history about the +OpenEXR format. + +If you have questions about using the OpenEXR libraries, you may want +to join our developer mailing list. See http://www.openexr.com for +details. + + +LICENSE +------- + +The OpenEXR source code distribution is free software. See the file +named COPYING (included in this distribution) for details. + + +BUILDING OPENEXR +---------------- + +Building OpenEXR requires the IlmBase and the zlib library. + +You can obtain the source code for zlib from: + + http://www.zlib.net + +If you're building OpenEXR on a Windows platform, see README.win32 for +instructions on how to build OpenEXR. The remainder of this file +applies only to GNU/Linux or other UNIX-like systems. + +After installing the required libraries, to build OpenEXR on +GNU/Linux or other UNIX-like systems, do this: + +./configure +make +make install + +unless you obtained IlmBase directly from git, in which case you +should first read README.git + + +Please type : + +./configure --help + +for a list of options in relation to building IlmBase libraries. In +particular, peruse README.namespaces for information regarding the +use of namespaces in IlmBase and OpenEXR. + +See README.OSX for details on building OpenEXR in MacOS X. + +Do `make check` to run the OpenEXR confidence tests. They should all +pass; if you find a test that does not pass on your system, please let +us know. + +Other UNIX variants haven't been tested, but should be easy to build. +Let us know if you're having problems porting OpenEXR to a particular +platform. + +All include files needed to use the OpenEXR libraries are installed in the +OpenEXR subdirectory of the install prefix, e.g. /usr/local/include/OpenEXR. + + +USING OPENEXR IN YOUR APPLICATIONS +---------------------------------- + +On systems with support for pkg-config, use `pkg-config --cflags +OpenEXR` for the C++ flags required to compile against OpenEXR +headers; and `pkg-config --libs OpenEXR` for the linker flags required +to link against OpenEXR libraries. + diff --git a/README.CVS b/README.CVS new file mode 100644 index 0000000..90a4fa3 --- /dev/null +++ b/README.CVS @@ -0,0 +1,16 @@ +If you're using OpenEXR from CVS, you should run the bootstrap script +to create the auto* files. It's a good idea to run this whenever you +update OpenEXR from CVS. + +Then run './configure' and make. + +Note that the configure.ac file requires a fairly new version of +automake. If you get this error message: + +running aclocal ... +aclocal: configure.ac: 142: macro `AM_CFLAGS' not found in library +aclocal: configure.ac: 143: macro `AM_CXXFLAGS' not found in library +failed! + +you should upgrade your automake to version 1.6 or better. + diff --git a/README.OSX b/README.OSX new file mode 100644 index 0000000..646646d --- /dev/null +++ b/README.OSX @@ -0,0 +1,57 @@ +OpenEXR on MacOS X +------------------ + +Building OpenEXR on MacOS X is just like building it on GNU/Linux. +Follow the instructions in the README file under BUILDLING OPENEXR, +but see below re: shared libraries. + +Missing gnu automake tools on Mac OS X 10.8+ +------------------ +Later versions of OS X ,10.8+, do not, by default have all the necessary +tools for building. In particular, Autoconf and Automake may be missing. + +The following commands will download and install the necessary components: + +cd ~/myDevLoc +curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.64.tar.gz +tar xzf autoconf-2.64.tar.gz +cd autoconf-2.64 +./configure --prefix=~/myDevLoc/autotools-bin +make; make install + +cd ~/myDevLoc +curl -OL http://ftpmirror.gnu.org/automake/automake-1.12.tar.gz +tar xzf automake-1.12.tar.gz +cd automake-1.12 +./configure --prefix=~/myDevLoc/autotools-bin +make; make install + +cd ~/myDevLoc +curl -OL http://ftpmirror.gnu.org/libtool/libtool-2.4.tar.gz +tar xzf libtool-2.4.tar.gz +cd libtool-2.4 +./configure --prefix=~/myDevLoc/autotools-bin +make; make install + + +You may want to export the installation path for your convenience. +Finally, make sure that you have installed the command line tools for XCode. + + +Universal Builds on Mac OS X +------------------ + +On OS X 10.4, you can build universal binaries by passing +'--enable-osx-universal-binaries --disable-dependency-tracking' to the +configure script. The default is *not* to build universal binaries. + + +Shared libraries +---------------- + +OpenEXR requires the "flat namespace" option when built as a shared +library. You may have problems trying to use OpenEXR shared libraries +with applications that expect OS X's two-level namespace. We have not +tested the shared libs extensively, though they appear to work with +exrdisplay and exrheader, but use them at your own risk. We will +support two-level namespace shared libs in a future release. diff --git a/README.cmake.txt b/README.cmake.txt new file mode 100644 index 0000000..17776e5 --- /dev/null +++ b/README.cmake.txt @@ -0,0 +1,54 @@ +Build IlmBase and OpenEXR on Windows using cmake +------------------ + +What follows are instructions for generating Visual Studio solution +files and building those two packages + +1. Launch a command window, navigate to the IlmBase folder with +CMakeLists.txt,and type command: + setlocal + del /f CMakeCache.txt + cmake + -DCMAKE_INSTALL_PREFIX= + -G "Visual Studio 10 Win64" + ..\ilmbase + +2. Navigate to IlmBase folder in Windows Explorer, open ILMBase.sln +and build the solution. When it build successfully, right click +INSTALL project and build. It will install the output to the path +you set up at the previous step. + +3. Go to http://www.zlib.net and download zlib + +4. Launch a command window, navigate to the OpenEXR folder with +CMakeLists.txt, and type command: + setlocal + del /f CMakeCache.txt + cmake + -DZLIB_ROOT= + -DILMBASE_PACKAGE_PREFIX= + -DCMAKE_INSTALL_PREFIX= + -G "Visual Studio 10 Win64" ^ + ..\openexr + +5. Navigate to OpenEXR folder in Windows Explorer, open OpenEXR.sln +and build the solution. When it build successfully, right click +INSTALL project and build. It will install the output to the path +you set up at the previous step. + + + +------------- +-- OpenEXR -- +------------- +initial bootstraping: + cmake -DILMBASE_PACKAGE_PREFIX= -DCMAKE_INSTALL_PREFIX= + +build the actual code base: + make -j 4 + +for testing do: + make test + +then to install to your chosen location: + make install diff --git a/README.git b/README.git new file mode 100644 index 0000000..d963e72 --- /dev/null +++ b/README.git @@ -0,0 +1,16 @@ +If you're using IlmBase from github, you should run the bootstrap script +to create the auto* files. It's a good idea to run this whenever you +update IlmBase from github. + +Then run './configure' and make. + +Note that the configure.ac file requires a fairly new version of +automake. If you get this error message: + +running aclocal ... +aclocal: configure.ac: 142: macro `AM_CFLAGS' not found in library +aclocal: configure.ac: 143: macro `AM_CXXFLAGS' not found in library +failed! + +you should upgrade your automake to version 1.6 or better. + diff --git a/README.namespacing b/README.namespacing new file mode 100644 index 0000000..ffae65f --- /dev/null +++ b/README.namespacing @@ -0,0 +1,83 @@ +------------------------------------------------ + On the use of namespace in IlmBase and OpenEXR +------------------------------------------------ + +v2.0 of the code base introduces user configurable namespaces for +component libraries. This addition introduces the ability to deal with +multiple versions of these libraries loaded at runtime. +An example case: + Application is built with OpenEXR v1.7, but the required plugin + requires functionality from OpenEXR v2.0. + + By injecting the version number into the (mangled) symbols, via + the namespacing mechanism, and changing the soname, via the build + system, the developer can link his plugin against the v2.0 library + At run time the dynamic linker can load both the 1.7 and 2.0 + versions of the library since the library soname are different and + the symbols are different. + + +When building IlmBase or OpenEXR the following configure script options +are available: + --enable-namespaceversioning +and + --enable-customusernamespace + + + +-- Internal Library Namespace +The option, --enable-namespaceversioning, controls the namespace that +is used in the library. Without an argument (see below) the library +will be built with a suffix made up of the major and minor versions. +For example, for version 2.0.0, the internal library namespaces will be +Imath_2_0, Iex_2_0, IlmThread_2_0 etc + +For additional flexibility and control, this option can take an additional +argument in which case the internal library namespace will be suffixed +accordingly. +For example: + ./configure --enable-namespaceversioning=ILM +will result in the namespaces of the type Imath_ILM, Iex_ILM etc. + +This can be useful for completely isolating your local build. + +Code using the library should continue to use the namespace Imath, or for +greater portability IMATH_NAMESPACE, to refer to objects in libImath. +In particular, the explicit use of the internal namespace is discouraged. +This ensures that code will continue to compile with customised or future +versions of the library, which may have a different internal namespace. + +Similarily, for other namespaces in the libraries: Iex, IlmThread and IlmImf. + +Note that this scheme allows existing code to compile without modifications, +since the 'old' namespaces Imath, Iex, IlmThread and IlmImf continue to be +available, albeit in a slightly different form. +This is achieved via the following, in the Imath case: + namespace IMATH_INTERNAL_NAMESPACE {} + namespace IMATH_NAMESPACE + { + using namespace IMATH_INTERNAL_NAMESPACE; + } +This is included in all header files in the Imath library and similar ones +are present for the libraries Iex, IlmThread and IlmImf. + +The only exception to this is where user code has forward declarations of +objects in the Imf namespace, as these will forward declare symbols in an +incorrect namespace +These forward declarations should be removed, and replaced with + #include , +which forward-declares all types correctly. + + + +-- Public/User Library Namespace +The option, --enable-customusernamespace, can override the namespace into +which we will 'export' the internal namespace. This takes an argument +that sets the name of the custom user namespace. +In the example above, IMATH_NAMESPACE could be resolved into something other +than Imath, say Imath_MySpecialNamespace. + +In nearly all cases, this will not be used as per the above discussion +regarding code compatibility. +Its presence is to provide a mechanism for not prohibiting the case when +the application must pass objects from two different versions of the library. diff --git a/README.win32 b/README.win32 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/README.win32 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..ae72401 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,8943 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/compilelinkrun.m4]) +m4_include([m4/path.pkgconfig.m4]) +m4_include([m4/threads.m4]) diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..8b0d76e --- /dev/null +++ b/bootstrap @@ -0,0 +1,60 @@ +#! /bin/sh +# If we're on OS X, use glibtoolize instead of toolize when available +HOSTTYPE=`uname` +if [ "$HOSTTYPE" == "Darwin" ] && $(which glibtoolize > /dev/null 2>&1) ; then + LIBTOOLIZE=glibtoolize +else + LIBTOOLIZE=libtoolize +fi + + + +# Check Autoconf version +if [ -x `which autoconf` ]; then + AC_VER=`autoconf --version | head -n 1 | sed 's/^[^0-9]*//'` + AC_VER_MAJOR=`echo $AC_VER | cut -f1 -d'.'` + AC_VER_MINOR=`echo $AC_VER | cut -f2 -d'.' | sed 's/[^0-9]*$//'` + + if [ "$AC_VER_MAJOR" -lt "2" ]; then + echo "Autoconf 2.13 or greater needed to build configure." + exit 1 + fi + + if [ "$AC_VER_MINOR" -lt "13" ]; then + echo "Autoconf 2.13 or greater needed to build configure." + exit 1 + fi + + if [ "$AC_VER_MINOR" -lt "50" ]; then + if [ ! -e configure.in ]; then + ln -s configure.ac configure.in + fi + echo "If you see some warnings about cross-compiling, don't worry; this is normal." + else + rm -f configure.in + fi +else + echo autoconf not found. OpenEXR CVS requires autoconf to bootstrap itself. + exit 1 +fi + +run_cmd() { + echo running $* ... + if ! $*; then + echo failed! + exit 1 + fi +} + +# Check if /usr/local/share/aclocal exists +if [ -d /usr/local/share/aclocal ]; then + ACLOCAL_INCLUDE="$ACLOCAL_INCLUDE -I /usr/local/share/aclocal" +fi + +run_cmd aclocal -I m4 $ACLOCAL_INCLUDE +run_cmd $LIBTOOLIZE --automake --copy +run_cmd automake --add-missing --copy +run_cmd autoconf +echo +echo "Now type './configure' to configure OpenEXR." +echo diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..dc84c68 --- /dev/null +++ b/config.guess @@ -0,0 +1,1501 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..2a55a50 --- /dev/null +++ b/config.sub @@ -0,0 +1,1705 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.windows/OpenEXRConfig.h b/config.windows/OpenEXRConfig.h new file mode 100644 index 0000000..6fa1a85 --- /dev/null +++ b/config.windows/OpenEXRConfig.h @@ -0,0 +1,43 @@ +// +// This is a hard-coded config file for Windows platforms. Don't +// change any of these settings. +// + +// +// Define and set to 1 if the target system has POSIX thread support +// and you want OpenEXR to use it for multithreaded file I/O. +// + +/* #undef HAVE_PTHREAD */ + +// +// Define and set to 1 if the target system supports POSIX semaphores +// and you want OpenEXR to use them; otherwise, OpenEXR will use its +// own semaphore implementation. +// + +/* #undef HAVE_POSIX_SEMAPHORES */ + +// +// Define and set to 1 if the target system is a Darwin-based system +// (e.g., OS X). +// + +/* #undef HAVE_DARWIN */ + +// +// Define and set to 1 if the target system supports a proc filesystem +// compatible with the Linux kernel's proc filesystem. Note that this +// is only used by a program in the IlmImfTest test suite, it's not +// used by any OpenEXR library or application code. +// + +/* #undef HAVE_LINUX_PROCFS */ + +// +// Define and set to 1 if the target system has a complete +// implementation, specifically if it supports the std::right +// formatter. +// + +#define HAVE_COMPLETE_IOMANIP 1 diff --git a/config/Makefile.am b/config/Makefile.am new file mode 100644 index 0000000..1407a07 --- /dev/null +++ b/config/Makefile.am @@ -0,0 +1,7 @@ +## Process this file with automake to produce Makefile.in + +configincludedir = $(includedir)/OpenEXR + +configinclude_HEADERS = OpenEXRConfig.h + +EXTRA_DIST = OpenEXRConfig.h.in diff --git a/config/Makefile.in b/config/Makefile.in new file mode 100644 index 0000000..f542211 --- /dev/null +++ b/config/Makefile.in @@ -0,0 +1,492 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = config +DIST_COMMON = $(configinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/OpenEXRConfig.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(configincludedir)" +HEADERS = $(configinclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +configincludedir = $(includedir)/OpenEXR +configinclude_HEADERS = OpenEXRConfig.h +EXTRA_DIST = OpenEXRConfig.h.in +all: OpenEXRConfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu config/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu config/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +OpenEXRConfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/OpenEXRConfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config/OpenEXRConfig.h +$(srcdir)/OpenEXRConfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f OpenEXRConfig.h stamp-h1 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-configincludeHEADERS: $(configinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(configincludedir)" || $(MKDIR_P) "$(DESTDIR)$(configincludedir)" + @list='$(configinclude_HEADERS)'; test -n "$(configincludedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(configincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(configincludedir)" || exit $$?; \ + done + +uninstall-configincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(configinclude_HEADERS)'; test -n "$(configincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(configincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(configincludedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) OpenEXRConfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) OpenEXRConfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) OpenEXRConfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) OpenEXRConfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) OpenEXRConfig.h +installdirs: + for dir in "$(DESTDIR)$(configincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-configincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-configincludeHEADERS + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool ctags distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am \ + install-configincludeHEADERS install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags uninstall uninstall-am \ + uninstall-configincludeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/config/OpenEXRConfig.h b/config/OpenEXRConfig.h new file mode 100644 index 0000000..a92067d --- /dev/null +++ b/config/OpenEXRConfig.h @@ -0,0 +1,73 @@ +/* config/OpenEXRConfig.h. Generated from OpenEXRConfig.h.in by configure. */ +// +// Define and set to 1 if the target system supports a proc filesystem +// compatible with the Linux kernel's proc filesystem. Note that this +// is only used by a program in the IlmImfTest test suite, it's not +// used by any OpenEXR library or application code. +// + +#define OPENEXR_IMF_HAVE_LINUX_PROCFS 1 + +// +// Define and set to 1 if the target system is a Darwin-based system +// (e.g., OS X). +// + +/* #undef OPENEXR_IMF_HAVE_DARWIN */ + +// +// Define and set to 1 if the target system has a complete +// implementation, specifically if it supports the std::right +// formatter. +// + +#define OPENEXR_IMF_HAVE_COMPLETE_IOMANIP 1 + +// +// Define and set to 1 if the target system has support for large +// stack sizes. +// + +#define OPENEXR_IMF_HAVE_LARGE_STACK 1 + +// +// Define if we can support GCC style inline asm with AVX instructions +// + +#define OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX 1 + +// +// Define if we can use sysconf(_SC_NPROCESSORS_ONLN) to get CPU count +// + +#define OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN 1 + +// +// Current internal library namepace name +// +#define OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM 1 +#define OPENEXR_IMF_INTERNAL_NAMESPACE Imf_2_2 + +// +// Current public user namepace name +// + +/* #undef OPENEXR_IMF_NAMESPACE_CUSTOM */ +#define OPENEXR_IMF_NAMESPACE Imf + +// +// Version string for runtime access +// + +#define OPENEXR_VERSION_STRING "2.2.0" +#define OPENEXR_PACKAGE_STRING "OpenEXR 2.2.0" + +#define OPENEXR_VERSION_MAJOR 2 +#define OPENEXR_VERSION_MINOR 2 +#define OPENEXR_VERSION_PATCH 0 + +// Version as a single hex number, e.g. 0x01000300 == 1.0.3 +#define OPENEXR_VERSION_HEX ((OPENEXR_VERSION_MAJOR << 24) | \ + (OPENEXR_VERSION_MINOR << 16) | \ + (OPENEXR_VERSION_PATCH << 8)) + diff --git a/config/OpenEXRConfig.h.in b/config/OpenEXRConfig.h.in new file mode 100644 index 0000000..17ca639 --- /dev/null +++ b/config/OpenEXRConfig.h.in @@ -0,0 +1,72 @@ +// +// Define and set to 1 if the target system supports a proc filesystem +// compatible with the Linux kernel's proc filesystem. Note that this +// is only used by a program in the IlmImfTest test suite, it's not +// used by any OpenEXR library or application code. +// + +#undef OPENEXR_IMF_HAVE_LINUX_PROCFS + +// +// Define and set to 1 if the target system is a Darwin-based system +// (e.g., OS X). +// + +#undef OPENEXR_IMF_HAVE_DARWIN + +// +// Define and set to 1 if the target system has a complete +// implementation, specifically if it supports the std::right +// formatter. +// + +#undef OPENEXR_IMF_HAVE_COMPLETE_IOMANIP + +// +// Define and set to 1 if the target system has support for large +// stack sizes. +// + +#undef OPENEXR_IMF_HAVE_LARGE_STACK + +// +// Define if we can support GCC style inline asm with AVX instructions +// + +#undef OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX + +// +// Define if we can use sysconf(_SC_NPROCESSORS_ONLN) to get CPU count +// + +#undef OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN + +// +// Current internal library namepace name +// +#undef OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM +#undef OPENEXR_IMF_INTERNAL_NAMESPACE + +// +// Current public user namepace name +// + +#undef OPENEXR_IMF_NAMESPACE_CUSTOM +#undef OPENEXR_IMF_NAMESPACE + +// +// Version string for runtime access +// + +#undef OPENEXR_VERSION_STRING +#undef OPENEXR_PACKAGE_STRING + +#undef OPENEXR_VERSION_MAJOR +#undef OPENEXR_VERSION_MINOR +#undef OPENEXR_VERSION_PATCH + +// Version as a single hex number, e.g. 0x01000300 == 1.0.3 +#define OPENEXR_VERSION_HEX ((OPENEXR_VERSION_MAJOR << 24) | \ + (OPENEXR_VERSION_MINOR << 16) | \ + (OPENEXR_VERSION_PATCH << 8)) + diff --git a/configure b/configure new file mode 100755 index 0000000..e386cee --- /dev/null +++ b/configure @@ -0,0 +1,20643 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63 for OpenEXR 2.2.0. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='OpenEXR' +PACKAGE_TARNAME='openexr' +PACKAGE_VERSION='2.2.0' +PACKAGE_STRING='OpenEXR 2.2.0' +PACKAGE_BUGREPORT='' + +ac_unique_file="IlmImfTest/main.cpp" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +LIB_SUFFIX_EXISTS_FALSE +LIB_SUFFIX_EXISTS_TRUE +LIB_SUFFIX_DASH +LIB_SUFFIX +BUILD_IMFHUGETEST_FALSE +BUILD_IMFHUGETEST_TRUE +BUILD_IMFFUZZTEST_FALSE +BUILD_IMFFUZZTEST_TRUE +BUILD_IMFEXAMPLES_FALSE +BUILD_IMFEXAMPLES_TRUE +AM_CXXFLAGS +AM_CFLAGS +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +acx_pthread_config +ILMBASE_LIBS +ILMBASE_LDFLAGS +ILMBASE_CXXFLAGS +PKG_CONFIG +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +RANLIB +AR +OBJDUMP +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +LN_S +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +ac_ct_CC +CFLAGS +CC +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CXX +CPPFLAGS +LDFLAGS +CXXFLAGS +CXX +LIBTOOL_VERSION +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +OPENEXR_VERSION_API +OPENEXR_VERSION +OPENEXR_VERSION_PATCH +OPENEXR_VERSION_MINOR +OPENEXR_VERSION_MAJOR +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_ilmbase_prefix +with_pkg_config +enable_threading +enable_posix_sem +enable_large_stack +enable_ilmbasetest +enable_osx_universal_binaries +enable_imfexamples +enable_imffuzztest +enable_imfhugetest +enable_namespaceversioning +enable_customusernamespace +' + ac_precious_vars='build_alias +host_alias +target_alias +CXX +CXXFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCC +CC +CFLAGS +CPP +CXXCPP +PKG_CONFIG' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures OpenEXR 2.2.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/openexr] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of OpenEXR 2.2.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-threading enable multi-threading [default=yes] + --disable-posix-sem do not attempt to use POSIX unnamed semaphores + --enable-large-stack enable optimizations for systems that support large + stack sizes [default=yes] + --enable-large-stack enable optimizations for systems that support large + stack sizes [default=no] + --disable-ilmbasetest Do not try to compile and run a test IlmBase program + --enable-osx-universal-binaries + build universal binaries on OS X [default=no] + --enable-imfexamples build IlmImf example program [default=no] + --enable-imffuzztest build IlmImf damaged input resilience test + [default=no] + --enable-imfhugetest build IlmImf huge input resilience test + [default=no] + --enable-namespaceversioning + enable symbol versioning via versioned/custom + namespace to prevent runtime conflicts + [default=yes] + --enable-customusernamespace + user namespace; this is the namespace into which the + library namespace will be exported to + [default=Imf] + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-ilmbase-prefix=PFX Prefix where tested libraries are supposed to be installed (optional) + --with-pkg-config=PATH Specify which pkg-config to use (optional) + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + PKG_CONFIG Path to pkg-config command + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +OpenEXR configure 2.2.0 +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by OpenEXR $as_me 2.2.0, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +OPENEXR_VERSION_MAJOR=2 + +OPENEXR_VERSION_MINOR=2 + +OPENEXR_VERSION_PATCH=0 + + +OPENEXR_VERSION=${OPENEXR_VERSION_MAJOR}.${OPENEXR_VERSION_MINOR}.${OPENEXR_VERSION_PATCH} + +OPENEXR_VERSION_API=${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR} + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +ac_config_headers="$ac_config_headers config/OpenEXRConfig.h" + +am__api_version='1.11' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 +$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} + { (exit 1); exit 1; }; };; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 +$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} + { (exit 1); exit 1; }; };; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done +done +IFS=$as_save_IFS + +fi + + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='openexr' + VERSION='2.2.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + +{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + + +LIBTOOL_CURRENT=22 +LIBTOOL_REVISION=0 +LIBTOOL_AGE=0 +LIBTOOL_VERSION=$LIBTOOL_CURRENT:$LIBTOOL_REVISION:$LIBTOOL_AGE + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.2.6b' +macro_revision='1.3017' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + $as_unset ac_script || ac_script= + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if test "${ac_cv_path_FGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DUMPBIN+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in "dumpbin -symbols" "link -dump -symbols" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if test "${lt_cv_nm_interface+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:5095: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:5098: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:5101: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$LINENO: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 6296 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_LIPO+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL64+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_lt_caught_CXX_error=yes; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + + + + + + + + + + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8887: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8891: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:9226: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:9230: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:9331: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:9335: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:9386: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:9390: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat >conftest.$ac_ext <<_ACEOF +int foo(void) {} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 12189 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 12285 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5]* | *pgcpp\ [1-5]*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14305: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:14309: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14404: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14408: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14456: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14460: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +if test -z "${PKG_CONFIG_PATH}"; then + PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig +fi + +LIB64_IF_EXISTS="" +if [ -e /usr/lib64 ]; then + LIB64_IF_EXISTS="-L/usr/lib64" +fi + + + +export PKG_CONFIG_PATH + + + + + + + + + + + + + +TEST_CXXFLAGS="" +TEST_LDFLAGS="" +TEST_LIBS="" + + +# Check whether --with-ilmbase-prefix was given. +if test "${with_ilmbase_prefix+set}" = set; then + withval=$with_ilmbase_prefix; test_prefix="$withval" +else + test_prefix="NONE" +fi + +echo "test_prefix = $test_prefix" + + +# Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +# Check whether --with-pkg-config was given. +if test "${with_pkg_config+set}" = set; then + withval=$with_pkg_config; PKG_CONFIG="$withval" +fi + + + +if test "x$test_prefix" != "xNONE" ; then + echo "using ilmbase-prefix to set ILMBASE_CXXFLAGS, ILMBASE_LDFLAGS and ILMBASE_LIBS:" + for inc_dir in OpenEXR + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I$test_prefix/include/$inc_dir" + done + TEST_LDFLAGS="-L$test_prefix/lib" + TEST_LDFLAGS="$TEST_LDFLAGS $LIB64_IF_EXISTS -L/usr/local/lib" + TEST_LIBS="-lImath -lHalf -lIex -lIlmThread -lpthread" +else + if test x$PKG_CONFIG != xno ; then + echo "using pkg-config to set ILMBASE_CXXFLAGS and ILMBASE_LDFLAGS:" + TEST_CXXFLAGS="`$PKG_CONFIG --cflags IlmBase`" + TEST_LDFLAGS="`$PKG_CONFIG --libs-only-L IlmBase`" + TEST_LIBS="`$PKG_CONFIG --libs IlmBase`" + else + echo "Not using pkg-config." + TEST_CXXFLAGS="" + TEST_LDFLAGS="" + TEST_LIBS="" + fi + + if test -z "${TEST_CXXFLAGS}"; then + TEST_CXXFLAGS="" + if test "x$prefix" != "xNONE"; then + echo "using prefix to set ILMBASE_CXXFLAGS and ILMBASE_LDFLAGS:" + for inc_dir in OpenEXR + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I$prefix/include/$inc_dir" + done + TEST_LDFLAGS="-L$prefix/lib" + else + echo "using default as guess for ILMBASE_CXXFLAGS and ILMBASE_LDFLAGS:" + for inc_dir in OpenEXR + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I/usr/local/include/$inc_dir" + done + TEST_LDFLAGS="$LIB64_IF_EXISTS -L/usr/local/lib" + fi + TEST_LIBS="-lImath -lHalf -lIex -lIlmThread -lpthread" + fi +fi + +echo " ILMBASE_CXXFLAGS = $TEST_CXXFLAGS" +echo " ILMBASE_LDFLAGS = $TEST_LDFLAGS" +echo " ILMBASE_LIBS = $TEST_LIBS" + + +ILMBASE_CXXFLAGS=$TEST_CXXFLAGS + +ILMBASE_LDFLAGS=$TEST_LDFLAGS + +ILMBASE_LIBS=$TEST_LIBS + + + + + + + + + + + + + + + +cat >>confdefs.h <<_ACEOF +#define OPENEXR_VERSION_STRING "${VERSION}" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define OPENEXR_PACKAGE_STRING "${PACKAGE_STRING}" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define OPENEXR_VERSION_MAJOR ${OPENEXR_VERSION_MAJOR} +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define OPENEXR_VERSION_MINOR ${OPENEXR_VERSION_MINOR} +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define OPENEXR_VERSION_PATCH ${OPENEXR_VERSION_PATCH} +_ACEOF + + + +# Check whether --enable-threading was given. +if test "${enable_threading+set}" = set; then + enableval=$enable_threading; multithread="${enableval}" +else + multithread=yes +fi + + +if test x$PKG_CONFIG == xno && test "x${multithread}" != xno ; then + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + acx_pthread_ok=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + PTHREAD_LIBS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_acx_pthread_config+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$acx_pthread_config"; then + ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_acx_pthread_config="yes" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" +fi +fi +acx_pthread_config=$ac_cv_prog_acx_pthread_config +if test -n "$acx_pthread_config"; then + { $as_echo "$as_me:$LINENO: result: $acx_pthread_config" >&5 +$as_echo "$acx_pthread_config" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + acx_pthread_ok=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int attr=$attr; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + attr_name=$attr; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:$LINENO: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { $as_echo "$as_me:$LINENO: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + # Extract the first word of "cc_r", so it can be a program name with args. +set dummy cc_r; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PTHREAD_CC="cc_r" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_PTHREAD 1 +_ACEOF + + ILMBASE_LIBS="$PTHREAD_LIBS $ILMBASE_LIBS" + ILMBASE_CXXFLAGS="$ILMBASE_CXXFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + + +# Check whether --enable-posix-sem was given. +if test "${enable_posix_sem+set}" = set; then + enableval=$enable_posix_sem; +fi + + +am_posix_sem_ok=no +if test "${enable_posix_sem:-yes}" != "no"; then + +for ac_header in semaphore.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: checking for library containing sem_init" >&5 +$as_echo_n "checking for library containing sem_init... " >&6; } +if test "${ac_cv_search_sem_init+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sem_init (); +int +main () +{ +return sem_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' posix4 pthread; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_sem_init=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_sem_init+set}" = set; then + break +fi +done +if test "${ac_cv_search_sem_init+set}" = set; then + : +else + ac_cv_search_sem_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_sem_init" >&5 +$as_echo "$ac_cv_search_sem_init" >&6; } +ac_res=$ac_cv_search_sem_init +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + { $as_echo "$as_me:$LINENO: checking whether to use POSIX unnamed semaphores" >&5 +$as_echo_n "checking whether to use POSIX unnamed semaphores... " >&6; } + if test "$cross_compiling" = yes; then + + { $as_echo "$as_me:$LINENO: result: no (cannot check usability when cross compiling)" >&5 +$as_echo "no (cannot check usability when cross compiling)" >&6; } +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + sem_t mysem; + if (sem_init (&mysem, 1, 1) == 0) + { + if (sem_wait (&mysem) == 0) + { + sem_post (&mysem); + sem_destroy (&mysem); + return 0; + } + } + return 1; + + ; + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + am_posix_sem_ok=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + { $as_echo "$as_me:$LINENO: result: no (pshared not usable)" >&5 +$as_echo "no (pshared not usable)" >&6; } +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +fi + + +fi + +done + +fi + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$am_posix_sem_ok" = xyes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_POSIX_SEMAPHORES 1 +_ACEOF + + : +else + am_posix_sem_ok=no + +fi + + + : +else + acx_pthread_ok=no + { { $as_echo "$as_me:$LINENO: error: POSIX thread support required" >&5 +$as_echo "$as_me: error: POSIX thread support required" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { $as_echo "$as_me:$LINENO: multithread true, LIBS = $LIBS, CC = $CC, CXXFLAGS = $CXXFLAGS" >&5 +$as_echo "$as_me: multithread true, LIBS = $LIBS, CC = $CC, CXXFLAGS = $CXXFLAGS" >&6;} +fi + +case "$host" in +*linux*) + # Check whether --enable-large-stack was given. +if test "${enable_large_stack+set}" = set; then + enableval=$enable_large_stack; large_stack="${enableval}" +else + large_stack=yes +fi + + ;; +*) + # Check whether --enable-large-stack was given. +if test "${enable_large_stack+set}" = set; then + enableval=$enable_large_stack; large_stack="${enableval}" +else + large_stack=no +fi + + ;; +esac + +if test "x${large_stack}" != xno ; then + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_LARGE_STACK 1 +_ACEOF + +fi + + + + + + + + + + + + + + +# Check whether --enable-ilmbasetest was given. +if test "${enable_ilmbasetest+set}" = set; then + enableval=$enable_ilmbasetest; +else + enable_programtest=yes +fi + + + + if test "x$enable_programtest" = "xyes" ; then + + { $as_echo "$as_me:$LINENO: checking for IlmBase" >&5 +$as_echo_n "checking for IlmBase... " >&6; } + test_runs="yes" + + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + ac_save_LIBS="$LIBS" + CXXFLAGS="$CXXFLAGS $ILMBASE_CXXFLAGS" + LDFLAGS="$LDFLAGS $ILMBASE_LDFLAGS" + LIBS="$LIBS $ILMBASE_LIBS" + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + rm -f conf.testprogram + + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +double d = IMATH_NAMESPACE::succd(.23); d+= .2;; system("touch conf.testprogram"); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + test_runs=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +test_runs=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + if test "x$test_runs" = "xyes" || test -f conf.testprogram ; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:$LINENO: result: Compiled and ran IlmBase test program." >&5 +$as_echo "Compiled and ran IlmBase test program." >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + echo "*** Could not run the IlmBase test program, checking why..." + + test_compiles="yes" + test_links="yes" + + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +double d = IMATH_NAMESPACE::succd(.23); d+= .2; ; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + test_compiles=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + test_compiles=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test "x$test_compiles" = "xno" ; then + echo "*** The test program could not be compiled. Is IlmBase installed?" + echo "*** Check that the cflags (below) includes the IlmBase include directory" + + else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +double d = IMATH_NAMESPACE::succd(.23); d+= .2; ; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + test_links=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + test_links=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$test_links" = "xyes"; then + echo "*** The test program compiled and staticly linked, but did not run. This " + echo "*** usually means that the run-time linker is not finding IlmBase or finding" + echo "*** the wrong version of IlmBase." + echo "***" + echo "*** If the linker is not finding IlmBase, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system." + else + echo "*** The IlmBase test program could be compiled, but could not be dynamically." + echo "*** or statically linked." + echo "***" + echo "*** Make sure the LDFLAGS points to the location of the IlmBase library." + echo "*** (e.g. -L/usr/local/lib)." + echo "*** If the run-time linker is not finding IlmBase, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system." + fi + fi + + echo "***" + echo "*** Flags used by the test:" + echo "*** cflags: $CXXFLAGS " + echo "*** ldflags: $LDFLAGS" + echo "***" + echo "*** You can also run configure with --disable-ilmbasetest to skip this test." + + { { $as_echo "$as_me:$LINENO: error: Could not compile IlmBase test program." >&5 +$as_echo "$as_me: error: Could not compile IlmBase test program." >&2;} + { (exit 1); exit 1; }; } + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$ac_save_CXXFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + LIBS="$ac_save_LIBS" + + rm -f conf.testprogram + fi + + + + + + + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + +for ac_header in limits.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + +{ $as_echo "$as_me:$LINENO: checking for compress in -lz" >&5 +$as_echo_n "checking for compress in -lz... " >&6; } +if test "${ac_cv_lib_z_compress+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char compress (); +int +main () +{ +return compress (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_z_compress=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_z_compress=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_z_compress" >&5 +$as_echo "$ac_cv_lib_z_compress" >&6; } +if test "x$ac_cv_lib_z_compress" = x""yes; then + : +else + { { $as_echo "$as_me:$LINENO: error: +*** OpenEXR requires a recent version of zlib, which you don't appear to +*** have. +*** +*** This could be because the run-time linker is not finding zlib, or it +*** is finding the wrong version. In this case, you'll need to set your +*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point +*** to the proper version. Also, make sure you have run ldconfig if +*** that is required on your system. + " >&5 +$as_echo "$as_me: error: +*** OpenEXR requires a recent version of zlib, which you don't appear to +*** have. +*** +*** This could be because the run-time linker is not finding zlib, or it +*** is finding the wrong version. In this case, you'll need to set your +*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point +*** to the proper version. Also, make sure you have run ldconfig if +*** that is required on your system. + " >&2;} + { (exit 1); exit 1; }; } + +fi + + +{ $as_echo "$as_me:$LINENO: checking for complete iomanip support in C++ standard library" >&5 +$as_echo_n "checking for complete iomanip support in C++ standard library... " >&6; } +complete_iomanip="no" + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + + std::right; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_COMPLETE_IOMANIP 1 +_ACEOF + complete_iomanip=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $complete_iomanip" >&5 +$as_echo "$complete_iomanip" >&6; } +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +{ $as_echo "$as_me:$LINENO: checking for gcc optimization flags" >&5 +$as_echo_n "checking for gcc optimization flags... " >&6; } +old_cflags=$CFLAGS +CFLAGS="$CFLAGS -pipe" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + printf ("hello, world"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + EXTRA_OPT_CFLAGS="-pipe" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + EXTRA_OPT_CFLAGS="" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS=$old_cflags +{ $as_echo "$as_me:$LINENO: result: $EXTRA_OPT_CFLAGS" >&5 +$as_echo "$EXTRA_OPT_CFLAGS" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for AVX instructions in GCC style inline asm" >&5 +$as_echo_n "checking for AVX instructions in GCC style inline asm... " >&6; } +gcc_inline_asm_avx="no" +cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + #if defined(__GNUC__) && defined(__SSE2__) + int n = 0; + int eax = 0; + int edx = 0; + __asm__( + "xgetbv \n" + "vzeroupper " + : "=a"(eax), "=d"(edx) : "c"(n) : ); + #else + #error No GCC style inline asm supported for AVX instructions + #endif + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + gcc_inline_asm_avx="yes" + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + gcc_inline_asm_avx="no" + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $gcc_inline_asm_avx" >&5 +$as_echo "$gcc_inline_asm_avx" >&6; } +if test "x${gcc_inline_asm_avx}" == xyes ; then + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX 1 +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for sysconf(_SC_NPROCESSORS_ONLN)" >&5 +$as_echo_n "checking for sysconf(_SC_NPROCESSORS_ONLN)... " >&6; } +sysconf_nproc="no" +cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +sysconf(_SC_NPROCESSORS_ONLN); + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + sysconf_nproc="yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + sysconf_nproc="no" + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $sysconf_nproc" >&5 +$as_echo "$sysconf_nproc" >&6; } +if test "x${sysconf_nproc}" == xyes ; then + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN 1 +_ACEOF + +fi + +case "$host" in +*linux*) + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_LINUX_PROCFS 1 +_ACEOF + + ;; +*darwin*) + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HAVE_DARWIN 1 +_ACEOF + + + # Check whether --enable-osx-universal-binaries was given. +if test "${enable_osx_universal_binaries+set}" = set; then + enableval=$enable_osx_universal_binaries; build_osxuniversal="${enableval}" +else + build_osxuniversal=no +fi + + + if test "${build_osxuniversal}" != no ; then + if test "$enable_dependency_tracking" != no ; then + { { $as_echo "$as_me:$LINENO: error: --enable-osx-universal-binary requires --disable-dependency-tracking. +Please re-run configure with these options: + --disable-dependency-tracking --enable-osx-universal-binary + " >&5 +$as_echo "$as_me: error: --enable-osx-universal-binary requires --disable-dependency-tracking. +Please re-run configure with these options: + --disable-dependency-tracking --enable-osx-universal-binary + " >&2;} + { (exit 1); exit 1; }; } + fi + CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" + fi + + ;; +esac + +AM_CFLAGS="$EXTRA_OPT_CFLAGS" +AM_CXXFLAGS="$EXTRA_OPT_CFLAGS" + + + + +build_imfexamples="no" +# Check whether --enable-imfexamples was given. +if test "${enable_imfexamples+set}" = set; then + enableval=$enable_imfexamples; build_imfexamples="${enableval}" +else + build_imfexamples=no +fi + + + if test "x$build_imfexamples" = xyes; then + BUILD_IMFEXAMPLES_TRUE= + BUILD_IMFEXAMPLES_FALSE='#' +else + BUILD_IMFEXAMPLES_TRUE='#' + BUILD_IMFEXAMPLES_FALSE= +fi + + +build_imffuzztest="no" +# Check whether --enable-imffuzztest was given. +if test "${enable_imffuzztest+set}" = set; then + enableval=$enable_imffuzztest; build_imffuzztest="${enableval}" +else + build_imffuzztest=no +fi + + + if test "x$build_imffuzztest" = xyes; then + BUILD_IMFFUZZTEST_TRUE= + BUILD_IMFFUZZTEST_FALSE='#' +else + BUILD_IMFFUZZTEST_TRUE='#' + BUILD_IMFFUZZTEST_FALSE= +fi + + +build_imfhugetest="no" +# Check whether --enable-imfhugetest was given. +if test "${enable_imfhugetest+set}" = set; then + enableval=$enable_imfhugetest; build_imfhugetest="${enableval}" +else + build_imfhugetest=no +fi + + + if test "x$build_imfhugetest" = xyes; then + BUILD_IMFHUGETEST_TRUE= + BUILD_IMFHUGETEST_FALSE='#' +else + BUILD_IMFHUGETEST_TRUE='#' + BUILD_IMFHUGETEST_FALSE= +fi + + +if test "x${build_imfhugetest}" != xno ; then + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_HUGETEST 1 +_ACEOF + +fi + + +library_namespace_versioning="yes" +# Check whether --enable-namespaceversioning was given. +if test "${enable_namespaceversioning+set}" = set; then + enableval=$enable_namespaceversioning; library_namespace_versioning="${enableval}" +else + library_namespace_versioning=yes +fi + + +LIB_SUFFIX="" +lib_suffix_valid="no" + +lib_namespace="Imf" +if test "x${library_namespace_versioning}" == xyes ; then + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_INTERNAL_NAMESPACE Imf_${OPENEXR_VERSION_API} +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM 1 +_ACEOF + + + lib_namespace="Imf_${OPENEXR_VERSION_API}" + LIB_SUFFIX="${OPENEXR_VERSION_API}" + lib_suffix_valid="yes" +elif test "x${library_namespace_versioning}" == xno ; then + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_INTERNAL_NAMESPACE Imf +_ACEOF + + + lib_namespace="Imf" +else + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_INTERNAL_NAMESPACE ${library_namespace_versioning} +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM 1 +_ACEOF + + + lib_namespace="${library_namespace_versioning}" + LIB_SUFFIX="${library_namespace_versioning}" + lib_suffix_valid="yes" +fi + + +if test "x${lib_suffix_valid}" == xyes ; then +LIB_SUFFIX_DASH="-${LIB_SUFFIX}" + + if true; then + LIB_SUFFIX_EXISTS_TRUE= + LIB_SUFFIX_EXISTS_FALSE='#' +else + LIB_SUFFIX_EXISTS_TRUE='#' + LIB_SUFFIX_EXISTS_FALSE= +fi + +else +LIB_SUFFIX_DASH="" + + if false; then + LIB_SUFFIX_EXISTS_TRUE= + LIB_SUFFIX_EXISTS_FALSE='#' +else + LIB_SUFFIX_EXISTS_TRUE='#' + LIB_SUFFIX_EXISTS_FALSE= +fi + +fi + + +custom_usr_namespace="no" +usr_namespace="Imf" +# Check whether --enable-customusernamespace was given. +if test "${enable_customusernamespace+set}" = set; then + enableval=$enable_customusernamespace; custom_usr_namespace="${enableval}" +else + custom_usr_namespace=no +fi + + +if test "x${custom_usr_namespace}" == xyes ; then + { $as_echo "$as_me:$LINENO: WARNING: Enabling 'custom user namespace' requires an additional argument, reverting to 'Imf'" >&5 +$as_echo "$as_me: WARNING: Enabling 'custom user namespace' requires an additional argument, reverting to 'Imf'" >&2;} + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_NAMESPACE Imf +_ACEOF + + usr_namespace="Imf" +elif test "x${custom_usr_namespace}" == xno ; then + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_NAMESPACE Imf +_ACEOF + + usr_namespace="Imf" +else + cat >>confdefs.h <<_ACEOF +#define OPENEXR_IMF_NAMESPACE ${custom_usr_namespace} +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define OPENEXR_IMF_NAMESPACE_CUSTOM 1 +_ACEOF + + + usr_namespace=${custom_usr_namespace} +fi + + + +ac_config_files="$ac_config_files Makefile OpenEXR.pc config/Makefile IlmImf/Makefile IlmImfTest/Makefile IlmImfUtil/Makefile IlmImfUtilTest/Makefile IlmImfFuzzTest/Makefile exrheader/Makefile exrmaketiled/Makefile IlmImfExamples/Makefile doc/Makefile exrstdattr/Makefile exrmakepreview/Makefile exrenvmap/Makefile exrmultiview/Makefile exrmultipart/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_IMFEXAMPLES_TRUE}" && test -z "${BUILD_IMFEXAMPLES_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_IMFEXAMPLES\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_IMFEXAMPLES\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_IMFFUZZTEST_TRUE}" && test -z "${BUILD_IMFFUZZTEST_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_IMFFUZZTEST\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_IMFFUZZTEST\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_IMFHUGETEST_TRUE}" && test -z "${BUILD_IMFHUGETEST_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_IMFHUGETEST\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_IMFHUGETEST\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${LIB_SUFFIX_EXISTS_TRUE}" && test -z "${LIB_SUFFIX_EXISTS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"LIB_SUFFIX_EXISTS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"LIB_SUFFIX_EXISTS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${LIB_SUFFIX_EXISTS_TRUE}" && test -z "${LIB_SUFFIX_EXISTS_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"LIB_SUFFIX_EXISTS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"LIB_SUFFIX_EXISTS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by OpenEXR $as_me 2.2.0, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +OpenEXR config.status 2.2.0 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config/OpenEXRConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS config/OpenEXRConfig.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "OpenEXR.pc") CONFIG_FILES="$CONFIG_FILES OpenEXR.pc" ;; + "config/Makefile") CONFIG_FILES="$CONFIG_FILES config/Makefile" ;; + "IlmImf/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImf/Makefile" ;; + "IlmImfTest/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImfTest/Makefile" ;; + "IlmImfUtil/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImfUtil/Makefile" ;; + "IlmImfUtilTest/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImfUtilTest/Makefile" ;; + "IlmImfFuzzTest/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImfFuzzTest/Makefile" ;; + "exrheader/Makefile") CONFIG_FILES="$CONFIG_FILES exrheader/Makefile" ;; + "exrmaketiled/Makefile") CONFIG_FILES="$CONFIG_FILES exrmaketiled/Makefile" ;; + "IlmImfExamples/Makefile") CONFIG_FILES="$CONFIG_FILES IlmImfExamples/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "exrstdattr/Makefile") CONFIG_FILES="$CONFIG_FILES exrstdattr/Makefile" ;; + "exrmakepreview/Makefile") CONFIG_FILES="$CONFIG_FILES exrmakepreview/Makefile" ;; + "exrenvmap/Makefile") CONFIG_FILES="$CONFIG_FILES exrenvmap/Makefile" ;; + "exrmultiview/Makefile") CONFIG_FILES="$CONFIG_FILES exrmultiview/Makefile" ;; + "exrmultipart/Makefile") CONFIG_FILES="$CONFIG_FILES exrmultipart/Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\).*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\).*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$ac_file_inputs '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +{ $as_echo "$as_me:$LINENO: result: +--------------------------------------------- +Summary for OpenEXR features: + +build IlmImf example program $build_imfexamples +build IlmImf damaged input resilience test $build_imffuzztest +build IlmImf huge input test $build_imfhugetest +enable large stack optimizations $large_stack +internal library namespace $lib_namespace +user-client namespace $usr_namespace" >&5 +$as_echo " +--------------------------------------------- +Summary for OpenEXR features: + +build IlmImf example program $build_imfexamples +build IlmImf damaged input resilience test $build_imffuzztest +build IlmImf huge input test $build_imfhugetest +enable large stack optimizations $large_stack +internal library namespace $lib_namespace +user-client namespace $usr_namespace" >&6; } + +if test "x$build_osxuniversal" == xyes; then +{ $as_echo "$as_me:$LINENO: result: +build OS X universal binaries $build_osxuniversal" >&5 +$as_echo " +build OS X universal binaries $build_osxuniversal" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: result: +--------------------------------------------- +" >&5 +$as_echo " +--------------------------------------------- +" >&6; } + + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..880cb1b --- /dev/null +++ b/configure.ac @@ -0,0 +1,406 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(OpenEXR, 2.2.0) + +AC_SUBST(OPENEXR_VERSION_MAJOR, 2) +AC_SUBST(OPENEXR_VERSION_MINOR, 2) +AC_SUBST(OPENEXR_VERSION_PATCH, 0) + +AC_SUBST(OPENEXR_VERSION, ${OPENEXR_VERSION_MAJOR}.${OPENEXR_VERSION_MINOR}.${OPENEXR_VERSION_PATCH}) +AC_SUBST(OPENEXR_VERSION_API, ${OPENEXR_VERSION_MAJOR}_${OPENEXR_VERSION_MINOR}) + +AC_CANONICAL_HOST +AC_CONFIG_SRCDIR(IlmImfTest/main.cpp) +AC_CONFIG_HEADER(config/OpenEXRConfig.h) +AM_INIT_AUTOMAKE(1.6.3) dnl Require automake 1.6.3 or better +AM_MAINTAINER_MODE + + +LIBTOOL_CURRENT=22 +LIBTOOL_REVISION=0 +LIBTOOL_AGE=0 +LIBTOOL_VERSION=$LIBTOOL_CURRENT:$LIBTOOL_REVISION:$LIBTOOL_AGE +AC_SUBST(LIBTOOL_VERSION) + +dnl Checks for programs. +AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_CC +AC_PROG_LN_S +AC_PROG_LIBTOOL +AC_PROG_MAKE_SET + +dnl +dnl PKGCONFIG preparations +dnl + +if test -z "${PKG_CONFIG_PATH}"; then + PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig +fi + +LIB64_IF_EXISTS="" +if [[ -e /usr/lib64 ]]; then + LIB64_IF_EXISTS="-L/usr/lib64" +fi + + + +export PKG_CONFIG_PATH + +dnl +dnl get ccflags and libs from openexr packages, then check +dnl whether test programs compile +AM_PATH_PKGCONFIG( + [ILMBASE_CXXFLAGS], + [ILMBASE_LDFLAGS], + [ILMBASE_LIBS], + [IlmBase], + [OpenEXR], + [$LIB64_IF_EXISTS -L/usr/local/lib], + [-lImath -lHalf -lIex -lIlmThread -lpthread], + [ilmbase-prefix]) + + +dnl Define the version string +AC_DEFINE_UNQUOTED(OPENEXR_VERSION_STRING, "${VERSION}") +AC_DEFINE_UNQUOTED(OPENEXR_PACKAGE_STRING, "${PACKAGE_STRING}") +AC_DEFINE_UNQUOTED(OPENEXR_VERSION_MAJOR, ${OPENEXR_VERSION_MAJOR}) +AC_DEFINE_UNQUOTED(OPENEXR_VERSION_MINOR, ${OPENEXR_VERSION_MINOR}) +AC_DEFINE_UNQUOTED(OPENEXR_VERSION_PATCH, ${OPENEXR_VERSION_PATCH}) + + +dnl --enable-threading +AC_ARG_ENABLE(threading, + AC_HELP_STRING([--enable-threading], + [enable multi-threading [[default=yes]]]), + [multithread="${enableval}"], [multithread=yes]) + +if test x$PKG_CONFIG == xno && test "x${multithread}" != xno ; then + ACX_PTHREAD( + [ + AC_DEFINE(OPENEXR_IMF_HAVE_PTHREAD) + ILMBASE_LIBS="$PTHREAD_LIBS $ILMBASE_LIBS" + ILMBASE_CXXFLAGS="$ILMBASE_CXXFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + + AM_POSIX_SEM() + ], + [AC_MSG_ERROR([POSIX thread support required])]) + AC_MSG_NOTICE([multithread true, LIBS = $LIBS, CC = $CC, CXXFLAGS = $CXXFLAGS]) +fi + +dnl --enable-large-stack +case "$host" in +*linux*) + AC_ARG_ENABLE(large-stack, + AC_HELP_STRING([--enable-large-stack], + [enable optimizations for systems that support + large stack sizes [[default=yes]]]), + [large_stack="${enableval}"], + [large_stack=yes]) + ;; +*) + AC_ARG_ENABLE(large-stack, + AC_HELP_STRING([--enable-large-stack], + [enable optimizations for systems that support + large stack sizes [[default=no]]]), + [large_stack="${enableval}"], + [large_stack=no]) + ;; +esac + +if test "x${large_stack}" != xno ; then + AC_DEFINE(OPENEXR_IMF_HAVE_LARGE_STACK) +fi + +AM_COMPILELINKRUN( + [IlmBase], + [ilmbasetest], + [$ILMBASE_CXXFLAGS], + [$ILMBASE_LDFLAGS], + [$ILMBASE_LIBS],[[ +#include +#include +]], + [[double d = IMATH_NAMESPACE::succd(.23); d+= .2;]], + AC_MSG_RESULT([Compiled and ran IlmBase test program.]), + AC_MSG_ERROR([Could not compile IlmBase test program.])) + + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(limits.h unistd.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T + +dnl Checks for zlib +AC_CHECK_LIB(z, compress, + [:], + [AC_MSG_ERROR([ +*** OpenEXR requires a recent version of zlib, which you don't appear to +*** have. +*** +*** This could be because the run-time linker is not finding zlib, or it +*** is finding the wrong version. In this case, you'll need to set your +*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point +*** to the proper version. Also, make sure you have run ldconfig if +*** that is required on your system. + ])] +) + +dnl Checks for std::right etc. in iomanip +AC_MSG_CHECKING(for complete iomanip support in C++ standard library) +complete_iomanip="no" +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([#include ],[ + + std::right; +], +AC_DEFINE(OPENEXR_IMF_HAVE_COMPLETE_IOMANIP) complete_iomanip=yes) +AC_MSG_RESULT($complete_iomanip) +AC_LANG_RESTORE + + +AC_MSG_CHECKING(for gcc optimization flags) +old_cflags=$CFLAGS +CFLAGS="$CFLAGS -pipe" +AC_TRY_COMPILE([#include ], +[ printf ("hello, world"); ], +[ EXTRA_OPT_CFLAGS="-pipe"],[ EXTRA_OPT_CFLAGS=""]) +CFLAGS=$old_cflags +AC_MSG_RESULT([$EXTRA_OPT_CFLAGS]) + +dnl Check to see if the toolset supports AVX instructions in inline asm +AC_MSG_CHECKING(for AVX instructions in GCC style inline asm) +gcc_inline_asm_avx="no" +AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM([], + [ + #if defined(__GNUC__) && defined(__SSE2__) + int n = 0; + int eax = 0; + int edx = 0; + __asm__( + "xgetbv \n" + "vzeroupper " + : "=a"(eax), "=d"(edx) : "c"(n) : ); + #else + #error No GCC style inline asm supported for AVX instructions + #endif + ]) + ], + [ + gcc_inline_asm_avx="yes" + ], + [ + gcc_inline_asm_avx="no" + ] +) +AC_MSG_RESULT([$gcc_inline_asm_avx]) +if test "x${gcc_inline_asm_avx}" == xyes ; then + AC_DEFINE(OPENEXR_IMF_HAVE_GCC_INLINE_ASM_AVX) +fi + +dnl Check if sysconf(_SC_NPROCESSORS_ONLN) can be used for CPU count +AC_MSG_CHECKING([for sysconf(_SC_NPROCESSORS_ONLN)]) +sysconf_nproc="no" +AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [#include ], + [sysconf(_SC_NPROCESSORS_ONLN);] + ) + ], + [sysconf_nproc="yes"], + [sysconf_nproc="no"] +) +AC_MSG_RESULT([$sysconf_nproc]) +if test "x${sysconf_nproc}" == xyes ; then + AC_DEFINE(OPENEXR_IMF_HAVE_SYSCONF_NPROCESSORS_ONLN) +fi + +dnl Platform-specific stuff +case "$host" in +*linux*) + AC_DEFINE(OPENEXR_IMF_HAVE_LINUX_PROCFS) + ;; +*darwin*) + AC_DEFINE(OPENEXR_IMF_HAVE_DARWIN) + + dnl OS X universal binary support, requires --disable-dependency-tracking + AC_ARG_ENABLE(osx-universal-binaries, + AC_HELP_STRING([--enable-osx-universal-binaries], + [build universal binaries on OS X [[default=no]]]), + [build_osxuniversal="${enableval}"], [build_osxuniversal=no]) + + if test "${build_osxuniversal}" != no ; then + if test "$enable_dependency_tracking" != no ; then + AC_MSG_ERROR([--enable-osx-universal-binary requires --disable-dependency-tracking. +Please re-run configure with these options: + --disable-dependency-tracking --enable-osx-universal-binary + ]) + fi + CXXFLAGS="$CXXFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" + dnl LDFLAGS="$LDFLAGS -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" + fi + + ;; +esac + +AM_CFLAGS="$EXTRA_OPT_CFLAGS" +AM_CXXFLAGS="$EXTRA_OPT_CFLAGS" + +AC_SUBST(AM_CFLAGS) +AC_SUBST(AM_CXXFLAGS) + +dnl build imfexamples example program? +build_imfexamples="no" +AC_ARG_ENABLE(imfexamples, + AC_HELP_STRING([--enable-imfexamples], + [build IlmImf example program [[default=no]]]), + [build_imfexamples="${enableval}"], [build_imfexamples=no]) + +AM_CONDITIONAL(BUILD_IMFEXAMPLES, test "x$build_imfexamples" = xyes) + +dnl build imffuzztest? +build_imffuzztest="no" +AC_ARG_ENABLE(imffuzztest, + AC_HELP_STRING([--enable-imffuzztest], + [build IlmImf damaged input resilience test [[default=no]]]), + [build_imffuzztest="${enableval}"], [build_imffuzztest=no]) + +AM_CONDITIONAL(BUILD_IMFFUZZTEST, test "x$build_imffuzztest" = xyes) + +dnl build imfhugetest? +build_imfhugetest="no" +AC_ARG_ENABLE(imfhugetest, + AC_HELP_STRING([--enable-imfhugetest], + [build IlmImf huge input resilience test [[default=no]]]), + [build_imfhugetest="${enableval}"], [build_imfhugetest=no]) + +AM_CONDITIONAL(BUILD_IMFHUGETEST, test "x$build_imfhugetest" = xyes) + +if test "x${build_imfhugetest}" != xno ; then + AC_DEFINE(OPENEXR_IMF_HUGETEST) +fi + + +dnl +dnl Handle namespacing configuration : internal library namespace +dnl user-client namespace +dnl +library_namespace_versioning="yes" +AC_ARG_ENABLE(namespaceversioning, + AC_HELP_STRING([--enable-namespaceversioning], + [enable symbol versioning via versioned/custom namespace to prevent runtime conflicts [[default=yes]]] ), + [library_namespace_versioning="${enableval}"], + [library_namespace_versioning=yes]) + +dnl Suffix for the shared library via the '-release' option +LIB_SUFFIX="" +lib_suffix_valid="no" + +lib_namespace="Imf" +if test "x${library_namespace_versioning}" == xyes ; then + AC_DEFINE_UNQUOTED(OPENEXR_IMF_INTERNAL_NAMESPACE, Imf_${OPENEXR_VERSION_API}) + AC_DEFINE(OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM) + + lib_namespace="Imf_${OPENEXR_VERSION_API}" + LIB_SUFFIX="${OPENEXR_VERSION_API}" + lib_suffix_valid="yes" +elif test "x${library_namespace_versioning}" == xno ; then + AC_DEFINE_UNQUOTED(OPENEXR_IMF_INTERNAL_NAMESPACE, Imf) + + lib_namespace="Imf" +else + AC_DEFINE_UNQUOTED(OPENEXR_IMF_INTERNAL_NAMESPACE, ${library_namespace_versioning} ) + AC_DEFINE(OPENEXR_IMF_INTERNAL_NAMESPACE_CUSTOM) + + lib_namespace="${library_namespace_versioning}" + LIB_SUFFIX="${library_namespace_versioning}" + lib_suffix_valid="yes" +fi +AC_SUBST(LIB_SUFFIX) + +if test "x${lib_suffix_valid}" == xyes ; then +AC_SUBST(LIB_SUFFIX_DASH,"-${LIB_SUFFIX}") +AM_CONDITIONAL(LIB_SUFFIX_EXISTS,true) +else +AC_SUBST(LIB_SUFFIX_DASH,"") +AM_CONDITIONAL(LIB_SUFFIX_EXISTS,false) +fi + + +dnl +dnl User namespace +dnl +custom_usr_namespace="no" +usr_namespace="Imf" +AC_ARG_ENABLE(customusernamespace, + AC_HELP_STRING([--enable-customusernamespace], + [user namespace; this is the namespace into which the library namespace will be exported to [[default=Imf]]] ), + [custom_usr_namespace="${enableval}"], + [custom_usr_namespace=no]) + +if test "x${custom_usr_namespace}" == xyes ; then + AC_MSG_WARN([Enabling 'custom user namespace' requires an additional argument, reverting to 'Imf']) + AC_DEFINE_UNQUOTED(OPENEXR_IMF_NAMESPACE, Imf) + usr_namespace="Imf" +elif test "x${custom_usr_namespace}" == xno ; then + AC_DEFINE_UNQUOTED(OPENEXR_IMF_NAMESPACE, Imf) + usr_namespace="Imf" +else + AC_DEFINE_UNQUOTED(OPENEXR_IMF_NAMESPACE, ${custom_usr_namespace}) + AC_DEFINE(OPENEXR_IMF_NAMESPACE_CUSTOM) + + usr_namespace=${custom_usr_namespace} +fi + + + +AC_OUTPUT([ +Makefile +OpenEXR.pc +config/Makefile +IlmImf/Makefile +IlmImfTest/Makefile +IlmImfUtil/Makefile +IlmImfUtilTest/Makefile +IlmImfFuzzTest/Makefile +exrheader/Makefile +exrmaketiled/Makefile +IlmImfExamples/Makefile +doc/Makefile +exrstdattr/Makefile +exrmakepreview/Makefile +exrenvmap/Makefile +exrmultiview/Makefile +exrmultipart/Makefile +]) + +AC_MSG_RESULT([ +--------------------------------------------- +Summary for OpenEXR features: + +build IlmImf example program $build_imfexamples +build IlmImf damaged input resilience test $build_imffuzztest +build IlmImf huge input test $build_imfhugetest +enable large stack optimizations $large_stack +internal library namespace $lib_namespace +user-client namespace $usr_namespace]) + +if test "x$build_osxuniversal" == xyes; then +AC_MSG_RESULT([ +build OS X universal binaries $build_osxuniversal]) +fi + +AC_MSG_RESULT([ +--------------------------------------------- +]) + + diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/doc/InterpretingDeepPixels.pdf b/doc/InterpretingDeepPixels.pdf new file mode 100644 index 0000000..eecfe1e Binary files /dev/null and b/doc/InterpretingDeepPixels.pdf differ diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..b818575 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,10 @@ +EXTRA_DIST = \ + ReadingAndWritingImageFiles.pdf \ + TechnicalIntroduction.pdf \ + OpenEXRFileLayout.pdf \ + MultiViewOpenEXR.pdf \ + InterpretingDeepPixels.pdf \ + TheoryDeepPixels.pdf + +docdir=$(datadir)/doc/OpenEXR-@OPENEXR_VERSION@ +doc_DATA = $(EXTRA_DIST) diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..2c30539 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,429 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(docdir)" +DATA = $(doc_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = $(datadir)/doc/OpenEXR-@OPENEXR_VERSION@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + ReadingAndWritingImageFiles.pdf \ + TechnicalIntroduction.pdf \ + OpenEXRFileLayout.pdf \ + MultiViewOpenEXR.pdf \ + InterpretingDeepPixels.pdf \ + TheoryDeepPixels.pdf + +doc_DATA = $(EXTRA_DIST) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(docdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(docdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-docDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-docDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-docDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-docDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/MultiViewOpenEXR.pdf b/doc/MultiViewOpenEXR.pdf new file mode 100644 index 0000000..fd7a05b Binary files /dev/null and b/doc/MultiViewOpenEXR.pdf differ diff --git a/doc/OpenEXRFileLayout.pdf b/doc/OpenEXRFileLayout.pdf new file mode 100644 index 0000000..000bd95 Binary files /dev/null and b/doc/OpenEXRFileLayout.pdf differ diff --git a/doc/ReadingAndWritingImageFiles.pdf b/doc/ReadingAndWritingImageFiles.pdf new file mode 100644 index 0000000..f4eecb9 Binary files /dev/null and b/doc/ReadingAndWritingImageFiles.pdf differ diff --git a/doc/TechnicalIntroduction.pdf b/doc/TechnicalIntroduction.pdf new file mode 100644 index 0000000..186abb0 Binary files /dev/null and b/doc/TechnicalIntroduction.pdf differ diff --git a/doc/TheoryDeepPixels.pdf b/doc/TheoryDeepPixels.pdf new file mode 100644 index 0000000..1a5b08f Binary files /dev/null and b/doc/TheoryDeepPixels.pdf differ diff --git a/exrenvmap/CMakeLists.txt b/exrenvmap/CMakeLists.txt new file mode 100644 index 0000000..70ebd83 --- /dev/null +++ b/exrenvmap/CMakeLists.txt @@ -0,0 +1,26 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrenvmap + makeLatLongMap.cpp + readInputImage.cpp + resizeImage.cpp + makeCubeMap.cpp + main.cpp + blurImage.cpp + EnvmapImage.cpp +) + +TARGET_LINK_LIBRARIES ( exrenvmap + IlmImf + IlmThread${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrenvmap + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrenvmap/EnvmapImage.cpp b/exrenvmap/EnvmapImage.cpp new file mode 100644 index 0000000..0249a15 --- /dev/null +++ b/exrenvmap/EnvmapImage.cpp @@ -0,0 +1,275 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class EnvmapImage +// +//----------------------------------------------------------------------------- + +#include "EnvmapImage.h" +#include + + +#include "namespaceAlias.h" +using namespace IMF; +using namespace IMATH; + + +EnvmapImage::EnvmapImage (): + _type (ENVMAP_LATLONG), + _dataWindow (V2i (0, 0), V2i (0, 0)), + _pixels (1, 1) +{ + clear(); +} + + +EnvmapImage::EnvmapImage (Envmap type, const Box2i &dataWindow): + _type (type), + _dataWindow (dataWindow), + _pixels (dataWindow.max.y - dataWindow.min.y + 1, + dataWindow.max.x - dataWindow.min.x + 1) +{ + clear(); +} + + +void +EnvmapImage::resize (Envmap type, const Box2i &dataWindow) +{ + _pixels.resizeEraseUnsafe (dataWindow.max.y - dataWindow.min.y + 1, + dataWindow.max.x - dataWindow.min.x + 1); + _type = type; + _dataWindow = dataWindow; + + clear(); +} + + +void +EnvmapImage::clear () +{ + int w = _dataWindow.max.x - _dataWindow.min.x + 1; + int h = _dataWindow.max.y - _dataWindow.min.y + 1; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + Rgba &p = _pixels[y][x]; + + p.r = 0; + p.g = 0; + p.b = 0; + p.a = 0; + } + } +} + + +Envmap +EnvmapImage::type () const +{ + return _type; +} + + +const Box2i & +EnvmapImage::dataWindow () const +{ + return _dataWindow; +} + + +Array2D & +EnvmapImage::pixels () +{ + return _pixels; +} + + +const Array2D & +EnvmapImage::pixels () const +{ + return _pixels; +} + + + +namespace { + +V2f +dirToPosLatLong (const Box2i &dataWindow, const V3f &dir) +{ + return LatLongMap::pixelPosition (dataWindow, dir); +} + + +V2f +dirToPosCube (const Box2i &dataWindow, const V3f &dir) +{ + CubeMapFace face; + V2f posInFace; + CubeMap::faceAndPixelPosition (dir, dataWindow, face, posInFace); + return CubeMap::pixelPosition (face, dataWindow, posInFace); +} + +} // namespace + + +Rgba +EnvmapImage::filteredLookup (V3f d, float r, int n) const +{ + // + // Filtered environment map lookup: Take n by n point samples + // from the environment map, clustered around direction d, and + // combine the samples with a tent filter. + // + + // + // Depending on the type of map, pick an appropriate function + // to convert 3D directions to 2D pixel poitions. + // + + V2f (* dirToPos) (const Box2i &, const V3f &); + + if (_type == ENVMAP_LATLONG) + dirToPos = dirToPosLatLong; + else + dirToPos = dirToPosCube; + + // + // Pick two vectors, dx and dy, of length r, that are orthogonal + // to the lookup direction, d, and to each other. + // + + d.normalize(); + V3f dx, dy; + + if (abs (d.x) > 0.707f) + dx = (d % V3f (0, 1, 0)).normalized() * r; + else + dx = (d % V3f (1, 0, 0)).normalized() * r; + + dy = (d % dx).normalized() * r; + + // + // Take n by n point samples from the map, and add them up. + // The directions for the point samples are all within the pyramid + // defined by the vectors d-dy-dx, d-dy+dx, d+dy-dx, d+dy+dx. + // + + float wt = 0; + + float cr = 0; + float cg = 0; + float cb = 0; + float ca = 0; + + for (int y = 0; y < n; ++y) + { + float ry = float (2 * y + 2) / float (n + 1) - 1; + float wy = 1 - abs (ry); + V3f ddy (ry * dy); + + for (int x = 0; x < n; ++x) + { + float rx = float (2 * x + 2) / float (n + 1) - 1; + float wx = 1 - abs (rx); + V3f ddx (rx * dx); + + Rgba s = sample (dirToPos (_dataWindow, d + ddx + ddy)); + + float w = wx * wy; + wt += w; + + cr += s.r * w; + cg += s.g * w; + cb += s.b * w; + ca += s.a * w; + } + } + + wt = 1 / wt; + + Rgba c; + + c.r = cr * wt; + c.g = cg * wt; + c.b = cb * wt; + c.a = ca * wt; + + return c; +} + + +Rgba +EnvmapImage::sample (const V2f &pos) const +{ + // + // Point-sample the environment map image at 2D position pos. + // Interpolate bilinearly between the four nearest pixels. + // + + int x1 = IMATH::floor (pos.x); + int x2 = x1 + 1; + float sx = x2 - pos.x; + float tx = 1 - sx; + + x1 = clamp (x1, _dataWindow.min.x, _dataWindow.max.x) - _dataWindow.min.x; + x2 = clamp (x2, _dataWindow.min.x, _dataWindow.max.x) - _dataWindow.min.x; + + int y1 = IMATH::floor (pos.y); + int y2 = y1 + 1; + float sy = y2 - pos.y; + float ty = 1 - sy; + + y1 = clamp (y1, _dataWindow.min.y, _dataWindow.max.y) - _dataWindow.min.y; + y2 = clamp (y2, _dataWindow.min.y, _dataWindow.max.y) - _dataWindow.min.y; + + Rgba p11 = _pixels[y1][x1]; + Rgba p12 = _pixels[y1][x2]; + Rgba p21 = _pixels[y2][x1]; + Rgba p22 = _pixels[y2][x2]; + + Rgba p; + p.r = (p11.r * sx + p12.r * tx) * sy + (p21.r * sx + p22.r * tx) * ty; + p.g = (p11.g * sx + p12.g * tx) * sy + (p21.g * sx + p22.g * tx) * ty; + p.b = (p11.b * sx + p12.b * tx) * sy + (p21.b * sx + p22.b * tx) * ty; + p.a = (p11.a * sx + p12.a * tx) * sy + (p21.a * sx + p22.a * tx) * ty; + + return p; +} diff --git a/exrenvmap/EnvmapImage.h b/exrenvmap/EnvmapImage.h new file mode 100644 index 0000000..548b28d --- /dev/null +++ b/exrenvmap/EnvmapImage.h @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_ENVMAP_IMAGE_H +#define INCLUDED_ENVMAP_IMAGE_H + +//----------------------------------------------------------------------------- +// +// class EnvmapImage +// +//----------------------------------------------------------------------------- + +#include "namespaceAlias.h" + +#include +#include +#include +#include + + + +class EnvmapImage +{ + public: + + EnvmapImage (); + EnvmapImage (IMF::Envmap type, const IMATH::Box2i &dataWindow); + + void resize (IMF::Envmap type, + const IMATH::Box2i &dataWindow); + + void clear (); + + IMF::Envmap type () const; + const IMATH::Box2i & dataWindow () const; + + IMF::Array2D & pixels (); + const IMF::Array2D & + pixels () const; + + IMF::Rgba filteredLookup (IMATH::V3f direction, + float radius, + int numSamples) const; + + private: + + IMF::Rgba sample (const IMATH::V2f &pos) const; + + IMF::Envmap _type; + IMATH::Box2i _dataWindow; + IMF::Array2D _pixels; +}; + + +#endif diff --git a/exrenvmap/Makefile.am b/exrenvmap/Makefile.am new file mode 100644 index 0000000..7fcc6c2 --- /dev/null +++ b/exrenvmap/Makefile.am @@ -0,0 +1,31 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrenvmap + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@\ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrenvmap_SOURCES = main.cpp EnvmapImage.cpp EnvmapImage.h \ + readInputImage.cpp readInputImage.h \ + resizeImage.cpp resizeImage.h \ + blurImage.cpp blurImage.h \ + makeCubeMap.cpp makeCubeMap.h \ + makeLatLongMap.cpp makeLatLongMap.h \ + namespaceAlias.h + +noinst_HEADERS = EnvmapImage.h makeCubeMap.h makeLatLongMap.h + +EXTRA_DIST = main.cpp EnvmapImage.cpp EnvmapImage.h \ + readInputImage.cpp readInputImage.h \ + resizeImage.cpp resizeImage.h \ + blurImage.cpp blurImage.h \ + makeCubeMap.cpp makeCubeMap.h \ + makeLatLongMap.cpp makeLatLongMap.h \ + namespaceAlias.h \ + CMakeLists.txt + diff --git a/exrenvmap/Makefile.in b/exrenvmap/Makefile.in new file mode 100644 index 0000000..692ccdf --- /dev/null +++ b/exrenvmap/Makefile.in @@ -0,0 +1,574 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrenvmap$(EXEEXT) +subdir = exrenvmap +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrenvmap_OBJECTS = main.$(OBJEXT) EnvmapImage.$(OBJEXT) \ + readInputImage.$(OBJEXT) resizeImage.$(OBJEXT) \ + blurImage.$(OBJEXT) makeCubeMap.$(OBJEXT) \ + makeLatLongMap.$(OBJEXT) +exrenvmap_OBJECTS = $(am_exrenvmap_OBJECTS) +exrenvmap_LDADD = $(LDADD) +exrenvmap_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrenvmap_SOURCES) +DIST_SOURCES = $(exrenvmap_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@\ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrenvmap_SOURCES = main.cpp EnvmapImage.cpp EnvmapImage.h \ + readInputImage.cpp readInputImage.h \ + resizeImage.cpp resizeImage.h \ + blurImage.cpp blurImage.h \ + makeCubeMap.cpp makeCubeMap.h \ + makeLatLongMap.cpp makeLatLongMap.h \ + namespaceAlias.h + +noinst_HEADERS = EnvmapImage.h makeCubeMap.h makeLatLongMap.h +EXTRA_DIST = main.cpp EnvmapImage.cpp EnvmapImage.h \ + readInputImage.cpp readInputImage.h \ + resizeImage.cpp resizeImage.h \ + blurImage.cpp blurImage.h \ + makeCubeMap.cpp makeCubeMap.h \ + makeLatLongMap.cpp makeLatLongMap.h \ + namespaceAlias.h \ + CMakeLists.txt + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrenvmap/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrenvmap/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrenvmap$(EXEEXT): $(exrenvmap_OBJECTS) $(exrenvmap_DEPENDENCIES) + @rm -f exrenvmap$(EXEEXT) + $(CXXLINK) $(exrenvmap_OBJECTS) $(exrenvmap_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EnvmapImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blurImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makeCubeMap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makeLatLongMap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readInputImage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resizeImage.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrenvmap/blurImage.cpp b/exrenvmap/blurImage.cpp new file mode 100644 index 0000000..f8ea953 --- /dev/null +++ b/exrenvmap/blurImage.cpp @@ -0,0 +1,430 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// function blurImage() -- performs a hemispherical blur +// +//----------------------------------------------------------------------------- + +#include "blurImage.h" + +#include "namespaceAlias.h" + +#include +#include +#include "Iex.h" +#include +#include +#include + + +using namespace IMF; +using namespace std; +using namespace IMATH; + + +inline int +toInt (float x) +{ + return int (x + 0.5f); +} + + +inline double +sqr (double x) +{ + return x * x; +} + + +void +blurImage (EnvmapImage &image1, bool verbose) +{ + // + // Ideally we would blur the input image directly by convolving + // it with a 180-degree wide blur kernel. Unfortunately this + // is prohibitively expensive when the input image is large. + // In order to keep running times reasonable, we perform the + // blur on a small proxy image that will later be re-sampled + // to the desired output resolution. + // + // Here's how it works: + // + // * If the input image is in latitude-longitude format, + // convert it into a cube-face environment map. + // + // * Repeatedly resample the image, each time shrinking + // it to no less than half its current size, until the + // width of each cube face is MAX_IN_WIDTH pixels. + // + // * Multiply each pixel by a weight that is proportinal + // to the solid angle subtended by the pixel as seen + // from the center of the environment cube. + // + // * Create an output image in cube-face format. + // The cube faces of the output image are OUT_WIDTH + // pixels wide. + // + // * For each pixel of the output image: + // + // Set the output pixel's color to black + // + // Determine the direction, d2, from the center of the + // output environment cube to the center of the output + // pixel. + // + // For each pixel of the input image: + // + // Determine the direction, d1, from the center of + // the input environment cube to the center of the + // input pixel. + // + // Multiply the input pixel's color by max (0, d1.dot(d2)) + // and add the result to the output pixel. + // + + const int MAX_IN_WIDTH = 40; + const int OUT_WIDTH = 100; + + if (verbose) + cout << "blurring map image" << endl; + + EnvmapImage image2; + EnvmapImage *iptr1 = &image1; + EnvmapImage *iptr2 = &image2; + + int w = image1.dataWindow().max.x - image1.dataWindow().min.x + 1; + int h = w * 6; + + if (iptr1->type() == ENVMAP_LATLONG) + { + // + // Convert the input image from latitude-longitude + // to cube-face format. + // + + if (verbose) + cout << " converting to cube-face format" << endl; + + w /= 4; + h = w * 6; + + Box2i dw (V2i (0, 0), V2i (w - 1, h - 1)); + resizeCube (*iptr1, *iptr2, dw, 1, 7); + + swap (iptr1, iptr2); + } + + while (w > MAX_IN_WIDTH) + { + // + // Shrink the image. + // + + if (w >= MAX_IN_WIDTH * 2) + w /= 2; + else + w = MAX_IN_WIDTH; + + h = w * 6; + + if (verbose) + { + cout << " resizing cube faces " + "to " << w << " by " << w << " pixels" << endl; + } + + Box2i dw (V2i (0, 0), V2i (w - 1, h - 1)); + resizeCube (*iptr1, *iptr2, dw, 1, 7); + + swap (iptr1, iptr2); + } + + if (verbose) + cout << " computing pixel weights" << endl; + + { + // + // Multiply each pixel by a weight that is proportinal + // to the solid angle subtended by the pixel. + // + + Box2i dw = iptr1->dataWindow(); + int sof = CubeMap::sizeOfFace (dw); + + Array2D &pixels = iptr1->pixels(); + + double weightTotal = 0; + + for (int f = CUBEFACE_POS_X; f <= CUBEFACE_NEG_Z; ++f) + { + if (verbose) + cout << " face " << f << endl; + + CubeMapFace face = CubeMapFace (f); + V3f faceDir (0, 0, 0); + int ix = 0, iy = 0, iz = 0; + + switch (face) + { + case CUBEFACE_POS_X: + faceDir = V3f (1, 0, 0); + ix = 0; + iy = 1; + iz = 2; + break; + + case CUBEFACE_NEG_X: + faceDir = V3f (-1, 0, 0); + ix = 0; + iy = 1; + iz = 2; + break; + + case CUBEFACE_POS_Y: + faceDir = V3f (0, 1, 0); + ix = 1; + iy = 0; + iz = 2; + break; + + case CUBEFACE_NEG_Y: + faceDir = V3f (0, -1, 0); + ix = 1; + iy = 0; + iz = 2; + break; + + case CUBEFACE_POS_Z: + faceDir = V3f (0, 0, 1); + ix = 2; + iy = 0; + iz = 1; + break; + + case CUBEFACE_NEG_Z: + faceDir = V3f (0, 0, -1); + ix = 2; + iy = 0; + iz = 1; + break; + } + + for (int y = 0; y < sof; ++y) + { + bool yEdge = (y == 0 || y == sof - 1); + + for (int x = 0; x < sof; ++x) + { + bool xEdge = (x == 0 || x == sof - 1); + + V2f posInFace (x, y); + + V3f dir = + CubeMap::direction (face, dw, posInFace).normalized(); + + V2f pos = + CubeMap::pixelPosition (face, dw, posInFace); + + // + // The solid angle subtended by pixel (x,y), as seen + // from the center of the cube, is proportional to the + // square of the distance of the pixel from the center + // of the cube and proportional to the dot product of + // the viewing direction and the normal of the cube + // face that contains the pixel. + // + + double weight = + (dir ^ faceDir) * + (sqr (dir[iy] / dir[ix]) + sqr (dir[iz] / dir[ix]) + 1); + + // + // Pixels at the edges and corners of the + // cube are duplicated; we must adjust the + // pixel weights accordingly. + // + + if (xEdge && yEdge) + weight /= 3; + else if (xEdge || yEdge) + weight /= 2; + + Rgba &pixel = pixels[toInt (pos.y)][toInt (pos.x)]; + + pixel.r *= weight; + pixel.g *= weight; + pixel.b *= weight; + pixel.a *= weight; + + weightTotal += weight; + } + } + } + + // + // The weighting operation above has made the overall image darker. + // Apply a correction to recover the image's original brightness. + // + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + size_t numPixels = w * h; + double weight = numPixels / weightTotal; + + Rgba *p = &pixels[0][0]; + Rgba *end = p + numPixels; + + while (p < end) + { + p->r *= weight; + p->g *= weight; + p->b *= weight; + p->a *= weight; + + ++p; + } + } + + { + if (verbose) + cout << " generating blurred image" << endl; + + Box2i dw1 = iptr1->dataWindow(); + int sof1 = CubeMap::sizeOfFace (dw1); + + Box2i dw2 (V2i (0, 0), V2i (OUT_WIDTH - 1, OUT_WIDTH * 6 - 1)); + int sof2 = CubeMap::sizeOfFace (dw2); + + iptr2->resize (ENVMAP_CUBE, dw2); + iptr2->clear (); + + Array2D &pixels1 = iptr1->pixels(); + Array2D &pixels2 = iptr2->pixels(); + + for (int f2 = CUBEFACE_POS_X; f2 <= CUBEFACE_NEG_Z; ++f2) + { + if (verbose) + cout << " face " << f2 << endl; + + CubeMapFace face2 = CubeMapFace (f2); + + for (int y2 = 0; y2 < sof2; ++y2) + { + for (int x2 = 0; x2 < sof2; ++x2) + { + V2f posInFace2 (x2, y2); + + V3f dir2 = CubeMap::direction + (face2, dw2, posInFace2); + + V2f pos2 = CubeMap::pixelPosition + (face2, dw2, posInFace2); + + double weightTotal = 0; + double rTotal = 0; + double gTotal = 0; + double bTotal = 0; + double aTotal = 0; + + Rgba &pixel2 = + pixels2[toInt (pos2.y)][toInt (pos2.x)]; + + for (int f1 = CUBEFACE_POS_X; f1 <= CUBEFACE_NEG_Z; ++f1) + { + CubeMapFace face1 = CubeMapFace (f1); + + for (int y1 = 0; y1 < sof1; ++y1) + { + for (int x1 = 0; x1 < sof1; ++x1) + { + V2f posInFace1 (x1, y1); + + V3f dir1 = CubeMap::direction + (face1, dw1, posInFace1); + + V2f pos1 = CubeMap::pixelPosition + (face1, dw1, posInFace1); + + double weight = dir1 ^ dir2; + + if (weight <= 0) + continue; + + Rgba &pixel1 = + pixels1[toInt (pos1.y)][toInt (pos1.x)]; + + weightTotal += weight; + rTotal += pixel1.r * weight; + gTotal += pixel1.g * weight; + bTotal += pixel1.b * weight; + aTotal += pixel1.a * weight; + } + } + } + + pixel2.r = rTotal / weightTotal; + pixel2.g = gTotal / weightTotal; + pixel2.b = bTotal / weightTotal; + pixel2.a = aTotal / weightTotal; + } + } + } + + swap (iptr1, iptr2); + } + + // + // Depending on how many times we've re-sampled the image, + // the result is now either in image1 or in image2. + // If necessary, copy the result into image1. + // + + if (iptr1 != &image1) + { + if (verbose) + cout << " copying" << endl; + + Box2i dw = iptr1->dataWindow(); + image1.resize (ENVMAP_CUBE, dw); + + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + size_t size = w * h * sizeof (Rgba); + + memcpy (&image1.pixels()[0][0], &iptr1->pixels()[0][0], size); + } +} diff --git a/exrenvmap/blurImage.h b/exrenvmap/blurImage.h new file mode 100644 index 0000000..967c953 --- /dev/null +++ b/exrenvmap/blurImage.h @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_BLUR_IMAGE_H +#define INCLUDED_BLUR_IMAGE_H + +//----------------------------------------------------------------------------- +// +// function blurImage() -- performs a hemispherical blur +// +// An environment map image is blurred by applying a 180-degree-wide +// filter kernel, such that point-sampling the blurred image at a +// location that corresponds to 3D direction N returns the color that +// a white diffuse reflector with surface normal N would have if it +// was illuminated using the original non-blurred image. +// +//----------------------------------------------------------------------------- + +#include + + +void +blurImage (EnvmapImage &image, bool verbose); + + +#endif diff --git a/exrenvmap/main.cpp b/exrenvmap/main.cpp new file mode 100644 index 0000000..f3cc4b8 --- /dev/null +++ b/exrenvmap/main.cpp @@ -0,0 +1,506 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// exrenvmap -- makes OpenEXR environment maps +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; + + +namespace { + +void +usageMessage (const char argv0[], bool verbose = false) +{ + cerr << "usage: " << argv0 << " [options] infile outfile" << endl; + + if (verbose) + { + cerr << "\n" + "Converts OpenEXR latitude-longitude environment maps\n" + "into cube-face environment maps or vice versa.\n" + "Reads an environment map image from infile, converts\n" + "it, and stores the result in outfile.\n" + "\n" + "If the input file name contains a '%' character, then an\n" + "input cube-face environment map is assembled from six\n" + "square sub-images that represent the six faces of the cube.\n" + "The names of the six image files are generated by replacing\n" + "the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n" + "\n" + "If the output file name contains a '%' character and\n" + "the program has been instructed to produce a cube-face\n" + "environment map, then the output image is split into six\n" + "square sub-images that are saved in six separate output\n" + "files. The names of the files are generated by replacing\n" + "the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n" + "\n" + "Options:\n" + "\n" + "-o produces a ONE_LEVEL output file (default)\n" + "\n" + "-m produces a MIPMAP_LEVELS output file (-m has\n" + " no effect if the output image is split into\n" + " multiple files)\n" + "\n" + "-c the output file will be a cube-face environment\n" + " map (default)\n" + "\n" + "-l the output file will be a latitude-longitude\n" + " environment map\n" + "\n" + "-ci the input file is interpreted as a cube-face\n" + " environment map, regardless of its envmap\n" + " attribute\n" + "\n" + "-li the input file is interpreted as a latitude-\n" + " longitude environment map, regardless of its\n" + " envmap attribute (-li has no effect if the\n" + " input image is assembled from multiple files)\n" + "\n" + "-w x sets the width of the output image to x pixels\n" + " (default is 256). The height of the output image\n" + " will be x*6 pixels for a cube-face map, or x/2\n" + " pixels for a latitude-longitude map.\n" + "\n" + "-f r n sets the antialiasing filter radius to r\n" + " (default is 1.0) and the sampling rate to\n" + " n by n (default is 5 by 5). Increasing r\n" + " makes the output image blurrier; decreasing r\n" + " makes the image sharper but may cause aliasing.\n" + " Increasing n improves antialiasing, but\n" + " generating the output image takes longer.\n" + "\n" + "-b blurs the environment map image by applying a\n" + " 180-degree-wide filter kernel such that point-\n" + " sampling the blurred image at a location that\n" + " corresponds to 3D direction N returns the color\n" + " that a white diffuse reflector with surface\n" + " normal N would have if it was illuminated using\n" + " the original non-blurred image.\n" + " Generating the blurred image can be fairly slow.\n" + "\n" + "-t x y sets the output file's tile size to x by y pixels\n" + " (default is 64 by 64)\n" + "\n" + "-p t b if the input image is a latitude-longitude map,\n" + " pad the image at the top and bottom with t*h\n" + " and b*h extra scan lines, where h is the height\n" + " of the input image. This is useful for images\n" + " from 360-degree panoramic scans that cover\n" + " less than 180 degrees vertically.\n" + "\n" + "-d sets level size rounding to ROUND_DOWN (default)\n" + "\n" + "-u sets level size rounding to ROUND_UP\n" + "\n" + "-z x sets the data compression method to x\n" + " (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n" + " default is zip)\n" + "\n" + "-v verbose mode\n" + "\n" + "-h prints this message\n"; + + cerr << endl; + } + + exit (1); +} + + +Compression +getCompression (const string &str) +{ + Compression c; + + if (str == "no" || str == "none" || str == "NO" || str == "NONE") + { + c = NO_COMPRESSION; + } + else if (str == "rle" || str == "RLE") + { + c = RLE_COMPRESSION; + } + else if (str == "zip" || str == "ZIP") + { + c = ZIP_COMPRESSION; + } + else if (str == "piz" || str == "PIZ") + { + c = PIZ_COMPRESSION; + } + else if (str == "pxr24" || str == "PXR24") + { + c = PXR24_COMPRESSION; + } + else if (str == "b44" || str == "B44") + { + c = B44_COMPRESSION; + } + else if (str == "b44a" || str == "B44A") + { + c = B44A_COMPRESSION; + } + else if (str == "dwaa" || str == "DWAA") + { + c = DWAA_COMPRESSION; + } + else if (str == "dwab" || str == "DWAB") + { + c = DWAB_COMPRESSION; + } + else + { + cerr << "Unknown compression method \"" << str << "\"." << endl; + exit (1); + } + + return c; +} + +} // namespace + + +int +main(int argc, char **argv) +{ + const char *inFile = 0; + const char *outFile = 0; + Envmap type = ENVMAP_CUBE; + Envmap overrideInputType = NUM_ENVMAPTYPES; + LevelMode levelMode = ONE_LEVEL; + LevelRoundingMode roundingMode = ROUND_DOWN; + Compression compression = ZIP_COMPRESSION; + int mapWidth = 256; + int tileWidth = 64; + int tileHeight = 64; + float padTop = 0; + float padBottom = 0; + float filterRadius = 1; + int numSamples = 5; + bool diffuseBlur = false; + bool verbose = false; + + // + // Parse the command line. + // + + if (argc < 2) + usageMessage (argv[0], true); + + int i = 1; + + while (i < argc) + { + if (!strcmp (argv[i], "-o")) + { + // + // generate a ONE_LEVEL image + // + + levelMode = ONE_LEVEL; + i += 1; + } + else if (!strcmp (argv[i], "-m")) + { + // + // Generate a MIPMAP_LEVELS image + // + + levelMode = MIPMAP_LEVELS; + i += 1; + } + else if (!strcmp (argv[i], "-c")) + { + // + // Generate a cube-face map + // + + type = ENVMAP_CUBE; + i += 1; + } + else if (!strcmp (argv[i], "-l")) + { + // + // Generate a latitude-longitude map + // + + type = ENVMAP_LATLONG; + i += 1; + } + else if (!strcmp (argv[i], "-ci")) + { + // + // Assume input is a cube-face map + // + + overrideInputType = ENVMAP_CUBE; + i += 1; + } + else if (!strcmp (argv[i], "-li")) + { + // + // Assume input is a latitude-longitude map + // + + overrideInputType = ENVMAP_LATLONG; + i += 1; + } + else if (!strcmp (argv[i], "-w")) + { + // + // Set output image width + // + + if (i > argc - 2) + usageMessage (argv[0]); + + mapWidth = strtol (argv[i + 1], 0, 0); + + if (mapWidth <= 0) + { + cerr << "Output image width must be greater than zero." << endl; + return 1; + } + + i += 2; + } + else if (!strcmp (argv[i], "-f")) + { + // + // Set filter radius and supersampling rate + // + + if (i > argc - 3) + usageMessage (argv[0]); + + filterRadius = strtod (argv[i + 1], 0); + numSamples = strtol (argv[i + 2], 0, 0); + + if (filterRadius < 0) + { + cerr << "Filter radius must not be less than zero." << endl; + return 1; + } + + if (numSamples <= 0) + { + cerr << "Sampling rate must be greater than zero." << endl; + return 1; + } + + i += 3; + } + else if (!strcmp (argv[i], "-b")) + { + // + // Diffuse blur + // + + diffuseBlur = true; + i += 1; + } + else if (!strcmp (argv[i], "-t")) + { + // + // Set tile size + // + + if (i > argc - 3) + usageMessage (argv[0]); + + tileWidth = strtol (argv[i + 1], 0, 0); + tileHeight = strtol (argv[i + 2], 0, 0); + + if (tileWidth <= 0 || tileHeight <= 0) + { + cerr << "Tile size must be greater than zero." << endl; + return 1; + } + + i += 3; + } + else if (!strcmp (argv[i], "-p")) + { + // + // Set top and bottom padding + // + + if (i > argc - 3) + usageMessage (argv[0]); + + padTop = strtod (argv[i + 1], 0); + padBottom = strtod (argv[i + 2], 0); + + if (padTop < 0 || padBottom < 0) + { + cerr << "Padding must not be less than zero." << endl; + return 1; + } + + i += 3; + } + else if (!strcmp (argv[i], "-d")) + { + // + // Round down + // + + roundingMode = ROUND_DOWN; + i += 1; + } + else if (!strcmp (argv[i], "-u")) + { + // + // Round down + // + + roundingMode = ROUND_UP; + i += 1; + } + else if (!strcmp (argv[i], "-z")) + { + // + // Set compression method + // + + if (i > argc - 2) + usageMessage (argv[0]); + + compression = getCompression (argv[i + 1]); + i += 2; + } + else if (!strcmp (argv[i], "-v")) + { + // + // Verbose mode + // + + verbose = true; + i += 1; + } + else if (!strcmp (argv[i], "-h")) + { + // + // Print help message + // + + usageMessage (argv[0], true); + } + else + { + // + // Image file name + // + + if (inFile == 0) + inFile = argv[i]; + else + outFile = argv[i]; + + i += 1; + } + } + + if (inFile == 0 || outFile == 0) + usageMessage (argv[0]); + + // + // Load inFile, convert it, and save the result in outFile. + // + + int exitStatus = 0; + + try + { + EnvmapImage image; + Header header; + RgbaChannels channels; + + readInputImage (inFile, padTop, padBottom, + overrideInputType, verbose, + image, header, channels); + + if (diffuseBlur) + blurImage (image, verbose); + + if (type == ENVMAP_CUBE) + { + makeCubeMap (image, header, channels, + outFile, + tileWidth, tileHeight, + levelMode, roundingMode, + compression, mapWidth, + filterRadius, numSamples, + verbose); + } + else + { + makeLatLongMap (image, header, channels, + outFile, + tileWidth, tileHeight, + levelMode, roundingMode, + compression, mapWidth, + filterRadius, numSamples, + verbose); + } + } + catch (const exception &e) + { + cerr << e.what() << endl; + exitStatus = 1; + } + + return exitStatus; +} diff --git a/exrenvmap/makeCubeMap.cpp b/exrenvmap/makeCubeMap.cpp new file mode 100644 index 0000000..1951223 --- /dev/null +++ b/exrenvmap/makeCubeMap.cpp @@ -0,0 +1,242 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// function makeCubeMap() -- makes cube-face environment maps +// +//----------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include "Iex.h" +#include +#include +#include +#include + + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH; + +namespace { + +void +makeCubeMapSingleFile (EnvmapImage &image1, + Header &header, + RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + LevelMode levelMode, + LevelRoundingMode roundingMode, + Compression compression, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose) +{ + if (levelMode == RIPMAP_LEVELS) + throw IEX::NoImplExc ("Cannot generate ripmap cube-face environments."); + + // + // Open the file that will contain the cube-face map, + // and write the header. + // + + int mapHeight = mapWidth * 6; + + header.dataWindow() = Box2i (V2i (0, 0), V2i (mapWidth - 1, mapHeight - 1)); + header.displayWindow() = header.dataWindow(); + header.compression() = compression; + + addEnvmap (header, ENVMAP_CUBE); + + TiledRgbaOutputFile out (outFileName, + header, + channels, + tileWidth, tileHeight, + levelMode, + roundingMode); + if (verbose) + cout << "writing file " << outFileName << endl; + + // + // Generate the pixels for the various levels of the cube-face map, + // and store them in the file. The pixels for the highest-resolution + // level are generated by resampling the original input image; for + // each of the other levels, the pixels are generated by resampling + // the previous level. + // + + EnvmapImage image2; + EnvmapImage *iptr1 = &image1; + EnvmapImage *iptr2 = &image2; + + for (int level = 0; level < out.numLevels(); ++level) + { + if (verbose) + cout << "level " << level << endl; + + Box2i dw = out.dataWindowForLevel (level); + resizeCube (*iptr1, *iptr2, dw, filterRadius, numSamples); + + out.setFrameBuffer (&iptr2->pixels()[0][0], 1, dw.max.x + 1); + + for (int tileY = 0; tileY < out.numYTiles (level); ++tileY) + for (int tileX = 0; tileX < out.numXTiles (level); ++tileX) + out.writeTile (tileX, tileY, level); + + swap (iptr1, iptr2); + } + + if (verbose) + cout << "done." << endl; +} + + +void +makeCubeMapSixFiles (EnvmapImage &image1, + Header &header, + RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + Compression compression, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose) +{ + static const char *faceNames[] = + {"+X", "-X", "+Y", "-Y", "+Z", "-Z"}; + + size_t pos = strchr (outFileName, '%') - outFileName; + + int mapHeight = mapWidth * 6; + const Box2i dw (V2i (0, 0), V2i (mapWidth - 1, mapHeight - 1)); + const Box2i faceDw (V2i (0, 0), V2i (mapWidth - 1, mapWidth - 1)); + + EnvmapImage image2; + resizeCube (image1, image2, dw, filterRadius, numSamples); + const Rgba *pixels = &(image2.pixels())[0][0]; + + for (int i = 0; i < 6; ++i) + { + string name = string (outFileName).replace (pos, 1, faceNames[i]); + + if (verbose) + cout << "writing file " << name << endl; + + TiledRgbaOutputFile out (name.c_str(), + tileWidth, tileHeight, + ONE_LEVEL, ROUND_DOWN, + faceDw, // displayWindow + faceDw, // dataWindow + channels, + 1, // pixelAspectRatio + V2f (0, 0), // screenWindowCenter + 1, // screenWindowWidth + INCREASING_Y, // lineOrder + compression); + + out.setFrameBuffer (pixels, 1, dw.max.x + 1); + + for (int tileY = 0; tileY < out.numYTiles(); ++tileY) + for (int tileX = 0; tileX < out.numXTiles(); ++tileX) + out.writeTile (tileX, tileY); + + pixels += mapWidth * mapWidth; + } + + if (verbose) + cout << "done." << endl; +} + +} //namespace + + +void +makeCubeMap (EnvmapImage &image1, + Header &header, + RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + LevelMode levelMode, + LevelRoundingMode roundingMode, + Compression compression, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose) +{ + if (strchr (outFileName, '%')) + { + makeCubeMapSixFiles (image1, + header, + channels, + outFileName, + tileWidth, + tileHeight, + compression, + mapWidth, + filterRadius, + numSamples, + verbose); + } + else + { + makeCubeMapSingleFile (image1, + header, + channels, + outFileName, + tileWidth, + tileHeight, + levelMode, + roundingMode, + compression, + mapWidth, + filterRadius, + numSamples, + verbose); + } +} diff --git a/exrenvmap/makeCubeMap.h b/exrenvmap/makeCubeMap.h new file mode 100644 index 0000000..c4b1a03 --- /dev/null +++ b/exrenvmap/makeCubeMap.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_MAKE_CUBE_MAP_H +#define INCLUDED_MAKE_CUBE_MAP_H + +//----------------------------------------------------------------------------- +// +// function makeCubeMap() -- makes cube-face environment maps +// +//----------------------------------------------------------------------------- + +#include "readInputImage.h" +#include "namespaceAlias.h" + +#include +#include + +void +makeCubeMap (EnvmapImage &image, + IMF::Header &header, + IMF::RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + IMF::LevelMode levelMode, + IMF::LevelRoundingMode roundingMode, + IMF::Compression compression, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose); + + +#endif diff --git a/exrenvmap/makeLatLongMap.cpp b/exrenvmap/makeLatLongMap.cpp new file mode 100644 index 0000000..aa1c168 --- /dev/null +++ b/exrenvmap/makeLatLongMap.cpp @@ -0,0 +1,133 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// function makeLatLongMap() -- makes latitude-longitude environment maps +// +//----------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include "Iex.h" +#include +#include + + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH; + + +void +makeLatLongMap (EnvmapImage &image1, + Header &header, + RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + LevelMode levelMode, + LevelRoundingMode roundingMode, + Compression compression, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose) +{ + if (levelMode == RIPMAP_LEVELS) + { + throw IEX::NoImplExc ("Cannot generate ripmap " + "latitude-longitude environments."); + } + + // + // Open the file that will contain the latitude-longitude map, + // and write the header. + // + + int mapHeight = mapWidth / 2; + + header.dataWindow() = Box2i (V2i (0, 0), V2i (mapWidth - 1, mapHeight - 1)); + header.displayWindow() = header.dataWindow(); + header.compression() = compression; + + addEnvmap (header, ENVMAP_LATLONG); + + TiledRgbaOutputFile out (outFileName, + header, + channels, + tileWidth, tileHeight, + levelMode, + roundingMode); + if (verbose) + cout << "writing file " << outFileName << endl; + + // + // Generate the pixels for the various levels of the latitude-longitude + // map, and store them in the file. The pixels for the highest-resolution + // level are generated by resampling the original input image; for each of + // the other levels, the pixels are generated by resampling the previous + // level. + // + + EnvmapImage image2; + EnvmapImage *iptr1 = &image1; + EnvmapImage *iptr2 = &image2; + + for (int level = 0; level < out.numLevels(); ++level) + { + if (verbose) + cout << "level " << level << endl; + + Box2i dw = out.dataWindowForLevel (level); + resizeLatLong (*iptr1, *iptr2, dw, filterRadius, numSamples); + + out.setFrameBuffer (&(iptr2->pixels()[0][0]), 1, dw.max.x + 1); + + for (int tileY = 0; tileY < out.numYTiles (level); ++tileY) + for (int tileX = 0; tileX < out.numXTiles (level); ++tileX) + out.writeTile (tileX, tileY, level); + + swap (iptr1, iptr2); + } + + if (verbose) + cout << "done." << endl; +} diff --git a/exrenvmap/makeLatLongMap.h b/exrenvmap/makeLatLongMap.h new file mode 100644 index 0000000..745b6af --- /dev/null +++ b/exrenvmap/makeLatLongMap.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_MAKE_LATLONG_MAP_H +#define INCLUDED_MAKE_LATLONG_MAP_H + +//----------------------------------------------------------------------------- +// +// function makeLatLongMap() -- makes latitude-longitude environment maps +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "namespaceAlias.h" + + +void +makeLatLongMap (EnvmapImage &image, + IMF::Header &header, + IMF::RgbaChannels channels, + const char outFileName[], + int tileWidth, + int tileHeight, + IMF::LevelMode levelMode, + IMF::LevelRoundingMode roundingMode, + IMF::Compression compresssion, + int mapWidth, + float filterRadius, + int numSamples, + bool verbose); + + +#endif // INCLUDED_MAKE_LATLONG_MAP_H diff --git a/exrenvmap/namespaceAlias.h b/exrenvmap/namespaceAlias.h new file mode 100644 index 0000000..bf488da --- /dev/null +++ b/exrenvmap/namespaceAlias.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +#ifndef NAMESPACEALIAS_H_ +#define NAMESPACEALIAS_H_ + +#include "ImfNamespace.h" +#include "ImathNamespace.h" +#include "IexNamespace.h" + +namespace IMF = OPENEXR_IMF_NAMESPACE; +namespace IMATH = IMATH_NAMESPACE; +namespace IEX = IEX_NAMESPACE; + +#endif /* NAMESPACEALIAS_H_ */ diff --git a/exrenvmap/readInputImage.cpp b/exrenvmap/readInputImage.cpp new file mode 100644 index 0000000..79cd6aa --- /dev/null +++ b/exrenvmap/readInputImage.cpp @@ -0,0 +1,236 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// function readInputImage() -- +// reads an image file and constructs an EnvMapImage object +// +//----------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include "Iex.h" +#include "IexMacros.h" +#include +#include +#include + + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH; + + +namespace { + +void +readSingleImage (const char inFileName[], + float padTop, + float padBottom, + Envmap overrideType, + bool verbose, + EnvmapImage &image, + Header &header, + RgbaChannels &channels) +{ + // + // Read the input image, and if necessary, + // pad the image at the top and bottom. + // + + RgbaInputFile in (inFileName); + + if (verbose) + cout << "reading file " << inFileName << endl; + + header = in.header(); + channels = in.channels(); + + Envmap type = ENVMAP_LATLONG; + + if (hasEnvmap (in.header())) + type = envmap (in.header()); + + if (overrideType == ENVMAP_LATLONG || + overrideType == ENVMAP_CUBE) + { + type = overrideType; + addEnvmap (header, overrideType); + } + + const Box2i &dw = in.dataWindow(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + + int pt = 0; + int pb = 0; + + if (type == ENVMAP_LATLONG) + { + pt = int (padTop * h + 0.5f); + pb = int (padBottom * h + 0.5f); + } + + Box2i paddedDw (V2i (dw.min.x, dw.min.y - pt), + V2i (dw.max.x, dw.max.y + pb)); + + image.resize (type, paddedDw); + Array2D &pixels = image.pixels(); + + in.setFrameBuffer (&pixels[-paddedDw.min.y][-paddedDw.min.x], 1, w); + in.readPixels (dw.min.y, dw.max.y); + + for (int y = 0; y < pt; ++y) + for (int x = 0; x < w; ++x) + pixels[y][x] = pixels[pt][x]; + + for (int y = h + pt; y < h + pt + pb; ++y) + { + for (int x = 0; x < w; ++x) + pixels[y][x] = pixels[h + pt - 1][x]; + } +} + + +void +readSixImages (const char inFileName[], + bool verbose, + EnvmapImage &image, + Header &header, + RgbaChannels &channels) +{ + // + // Generate six file names by replacing the first '%' character in + // inFileName with +X, -X, ... -Z. Interpreting the corresponding + // image files as the six sides of a cube, assembe a single cube- + // face map image. + // + + static const char *faceNames[] = + {"+X", "-X", "+Y", "-Y", "+Z", "-Z"}; + + size_t pos = strchr (inFileName, '%') - inFileName; + string name = string(inFileName).replace (pos, 1, faceNames[0]); + + Box2i dw; + int w, h; + + { + RgbaInputFile in (name.c_str()); + + if (verbose) + cout << "reading cube face size from file " << name << endl; + + dw = in.dataWindow(); + w = dw.max.x - dw.min.x + 1; + h = dw.max.y - dw.min.y + 1; + + if (w != h) + { + THROW (IEX::InputExc, + "Cube face image " << name << " is not square."); + } + + header = in.header(); + channels = in.channels(); + addEnvmap (header, ENVMAP_CUBE); + } + + const Box2i imageDw (V2i (0, 0), V2i (w - 1, 6 * h - 1)); + + image.resize (ENVMAP_CUBE, imageDw); + Rgba *pixels = &(image.pixels()[0][0]); + + for (int i = 0; i < 6; ++i) + { + string name = string(inFileName).replace (pos, 1, faceNames[i]); + + RgbaInputFile in (name.c_str()); + + if (verbose) + cout << "reading file " << name << endl; + + if (in.dataWindow() != dw) + { + THROW (IEX::InputExc, + "The data window of cube face " << name << " differs " + "from the data window of other cube faces."); + } + + in.setFrameBuffer (pixels - dw.min.x - dw.min.y * w, 1, w); + in.readPixels (dw.min.y, dw.max.y); + + pixels += w * h; + } +} + +} // namespace + + +void +readInputImage (const char inFileName[], + float padTop, + float padBottom, + Envmap overrideType, + bool verbose, + EnvmapImage &image, + Header &header, + RgbaChannels &channels) +{ + if (strchr (inFileName, '%')) + { + readSixImages (inFileName, + verbose, + image, + header, + channels); + } + else + { + readSingleImage (inFileName, + padTop, + padBottom, + overrideType, + verbose, + image, + header, + channels); + } +} diff --git a/exrenvmap/readInputImage.h b/exrenvmap/readInputImage.h new file mode 100644 index 0000000..e0b408e --- /dev/null +++ b/exrenvmap/readInputImage.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_READ_INPUT_IMAGE_H +#define INCLUDED_READ_INPUT_IMAGE_H + +//----------------------------------------------------------------------------- +// +// function readInputImage() -- +// reads an image file and constructs an EnvMapImage object +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +#include "namespaceAlias.h" + +class EnvmapImage; + + +void +readInputImage (const char inFileName[], + float padTop, + float padBottom, + IMF::Envmap overrideType, + bool verbose, + EnvmapImage &image, + IMF::Header &header, + IMF::RgbaChannels &channels); + + +#endif diff --git a/exrenvmap/resizeImage.cpp b/exrenvmap/resizeImage.cpp new file mode 100644 index 0000000..b2aa3d6 --- /dev/null +++ b/exrenvmap/resizeImage.cpp @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// resizeLatLong(), resizeCube() -- functions that resample +// an environment map and convert it to latitude-longitude or +// cube-face format. +// +//----------------------------------------------------------------------------- + +#include + +#include "Iex.h" +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; +using namespace IMATH; + + +void +resizeLatLong (const EnvmapImage &image1, + EnvmapImage &image2, + const Box2i &image2DataWindow, + float filterRadius, + int numSamples) +{ + int w = image2DataWindow.max.x - image2DataWindow.min.x + 1; + int h = image2DataWindow.max.y - image2DataWindow.min.y + 1; + float radius = 0.5f * 2 * M_PI * filterRadius / w; + + image2.resize (ENVMAP_LATLONG, image2DataWindow); + image2.clear (); + + Array2D &pixels = image2.pixels(); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + V3f dir = LatLongMap::direction (image2DataWindow, V2f (x, y)); + pixels[y][x] = image1.filteredLookup (dir, radius, numSamples); + } + } +} + + +void +resizeCube (const EnvmapImage &image1, + EnvmapImage &image2, + const Box2i &image2DataWindow, + float filterRadius, + int numSamples) +{ + if (image1.type() == ENVMAP_CUBE && image1.dataWindow() == image2DataWindow) + { + // + // Special case - the input image is a cube-face environment + // map with the same size as the output image. We can copy + // the input image without resampling. + // + + image2.resize (ENVMAP_CUBE, image2DataWindow); + + int w = image2DataWindow.max.x - image2DataWindow.min.x + 1; + int h = image2DataWindow.max.y - image2DataWindow.min.y + 1; + + memcpy (&(image2.pixels()[0][0]), + &(image1.pixels()[0][0]), + sizeof (Rgba) * w * h); + + return; + } + + // + // Resampe the input image + // + + int sof = CubeMap::sizeOfFace (image2DataWindow); + float radius = 1.5f * filterRadius / sof; + + image2.resize (ENVMAP_CUBE, image2DataWindow); + image2.clear (); + + Array2D &pixels = image2.pixels(); + + for (int f = CUBEFACE_POS_X; f <= CUBEFACE_NEG_Z; ++f) + { + CubeMapFace face = CubeMapFace (f); + + for (int y = 0; y < sof; ++y) + { + for (int x = 0; x < sof; ++x) + { + V2f posInFace (x, y); + + V3f dir = + CubeMap::direction (face, image2DataWindow, posInFace); + + V2f pos = + CubeMap::pixelPosition (face, image2DataWindow, posInFace); + + pixels[int (pos.y + 0.5f)][int (pos.x + 0.5f)] = + image1.filteredLookup (dir, radius, numSamples); + } + } + } +} diff --git a/exrenvmap/resizeImage.h b/exrenvmap/resizeImage.h new file mode 100644 index 0000000..6c2fe3c --- /dev/null +++ b/exrenvmap/resizeImage.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_RESIZE_IMAGE_H +#define INCLUDED_RESIZE_IMAGE_H + +//----------------------------------------------------------------------------- +// +// resizeLatLong(), resizeCube() -- functions that resample +// an environment map and convert it to latitude-longitude or +// cube-face format. +// +//----------------------------------------------------------------------------- + +#include "EnvmapImage.h" + + +void +resizeLatLong (const EnvmapImage &image1, + EnvmapImage &image2, + const IMATH::Box2i &image2DataWindow, + float filterRadius, + int numSamples); + +void +resizeCube (const EnvmapImage &image1, + EnvmapImage &image2, + const IMATH::Box2i &image2DataWindow, + float filterRadius, + int numSamples); + + +#endif diff --git a/exrheader/CMakeLists.txt b/exrheader/CMakeLists.txt new file mode 100644 index 0000000..1953836 --- /dev/null +++ b/exrheader/CMakeLists.txt @@ -0,0 +1,20 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrheader + main.cpp +) + +TARGET_LINK_LIBRARIES ( exrheader + IlmImf + Iex${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrheader + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrheader/Makefile.am b/exrheader/Makefile.am new file mode 100644 index 0000000..641b07a --- /dev/null +++ b/exrheader/Makefile.am @@ -0,0 +1,15 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrheader + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrheader_SOURCES = main.cpp + +EXTRA_DIST = CMakeLists.txt diff --git a/exrheader/Makefile.in b/exrheader/Makefile.in new file mode 100644 index 0000000..079258b --- /dev/null +++ b/exrheader/Makefile.in @@ -0,0 +1,537 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrheader$(EXEEXT) +subdir = exrheader +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrheader_OBJECTS = main.$(OBJEXT) +exrheader_OBJECTS = $(am_exrheader_OBJECTS) +exrheader_LDADD = $(LDADD) +exrheader_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrheader_SOURCES) +DIST_SOURCES = $(exrheader_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrheader_SOURCES = main.cpp +EXTRA_DIST = CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrheader/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrheader/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrheader$(EXEEXT): $(exrheader_OBJECTS) $(exrheader_DEPENDENCIES) + @rm -f exrheader$(EXEEXT) + $(CXXLINK) $(exrheader_OBJECTS) $(exrheader_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrheader/main.cpp b/exrheader/main.cpp new file mode 100644 index 0000000..fd14b0f --- /dev/null +++ b/exrheader/main.cpp @@ -0,0 +1,572 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Utility program to print an image file's header +// +//----------------------------------------------------------------------------- + +#include "ImfNamespace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +using namespace OPENEXR_IMF_NAMESPACE; +using namespace std; + + +void +printCompression (Compression c) +{ + switch (c) + { + case NO_COMPRESSION: + cout << "none"; + break; + + case RLE_COMPRESSION: + cout << "run-length encoding"; + break; + + case ZIPS_COMPRESSION: + cout << "zip, individual scanlines"; + break; + + case ZIP_COMPRESSION: + cout << "zip, multi-scanline blocks"; + break; + + case PIZ_COMPRESSION: + cout << "piz"; + break; + + case PXR24_COMPRESSION: + cout << "pxr24"; + break; + + case B44_COMPRESSION: + cout << "b44"; + break; + + case B44A_COMPRESSION: + cout << "b44a"; + break; + + case DWAA_COMPRESSION: + cout << "dwa, small scanline blocks"; + break; + + case DWAB_COMPRESSION: + cout << "dwa, medium scanline blocks"; + break; + + default: + cout << int (c); + break; + } +} + + +void +printLineOrder (LineOrder lo) +{ + switch (lo) + { + case INCREASING_Y: + cout << "increasing y"; + break; + + case DECREASING_Y: + cout << "decreasing y"; + break; + + case RANDOM_Y: + cout << "random y"; + break; + + default: + cout << int (lo); + break; + } +} + + +void +printPixelType (PixelType pt) +{ + switch (pt) + { + case UINT: + cout << "32-bit unsigned integer"; + break; + + case HALF: + cout << "16-bit floating-point"; + break; + + case FLOAT: + cout << "32-bit floating-point"; + break; + + default: + cout << "type " << int (pt); + break; + } +} + + +void +printLevelMode (LevelMode lm) +{ + switch (lm) + { + case ONE_LEVEL: + cout << "single level"; + break; + + case MIPMAP_LEVELS: + cout << "mip-map"; + break; + + case RIPMAP_LEVELS: + cout << "rip-map"; + break; + + default: + cout << "level mode " << int (lm); + break; + } +} + + +void +printLevelRoundingMode (LevelRoundingMode lm) +{ + switch (lm) + { + case ROUND_DOWN: + cout << "down"; + break; + + case ROUND_UP: + cout << "up"; + break; + + default: + cout << "mode " << int (lm); + break; + } +} + + +void +printTimeCode (TimeCode tc) +{ + cout << " " + "time " << + setfill ('0') << +#ifndef HAVE_COMPLETE_IOMANIP + setw (2) << tc.hours() << ":" << + setw (2) << tc.minutes() << ":" << + setw (2) << tc.seconds() << ":" << + setw (2) << tc.frame() << "\n" << +#else + setw (2) << right << tc.hours() << ":" << + setw (2) << right << tc.minutes() << ":" << + setw (2) << right << tc.seconds() << ":" << + setw (2) << right << tc.frame() << "\n" << +#endif + setfill (' ') << + " " + "drop frame " << tc.dropFrame() << ", " + "color frame " << tc.colorFrame() << ", " + "field/phase " << tc.fieldPhase() << "\n" + " " + "bgf0 " << tc.bgf0() << ", " + "bgf1 " << tc.bgf1() << ", " + "bgf2 " << tc.bgf2() << "\n" + " " + "user data 0x" << hex << tc.userData() << dec; +} + + +void +printEnvmap (Envmap e) +{ + switch (e) + { + case ENVMAP_LATLONG: + cout << "latitude-longitude map"; + break; + + case ENVMAP_CUBE: + cout << "cube-face map"; + break; + + default: + cout << "map type " << int (e); + break; + } +} + + +void +printChannelList (const ChannelList &cl) +{ + for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) + { + cout << "\n " << i.name() << ", "; + + printPixelType (i.channel().type); + + cout << ", sampling " << + i.channel().xSampling << " " << + i.channel().ySampling; + + if (i.channel().pLinear) + cout << ", plinear"; + } +} + + +void +printInfo (const char fileName[]) +{ + MultiPartInputFile in (fileName); + int parts = in.parts(); + + // + // Check to see if any parts are incomplete + // + + bool fileComplete = true; + + for (int i = 0; i < parts && fileComplete; ++i) + if (!in.partComplete (i)) + fileComplete = false; + + // + // Print file name and file format version + // + + cout << "\nfile " << fileName << + (fileComplete? "": " (incomplete)") << + ":\n\n"; + + cout << "file format version: " << + getVersion (in.version()) << ", " + "flags 0x" << + setbase (16) << getFlags (in.version()) << setbase (10) << "\n"; + + // + // Print the header of every part in the file + // + + for (int p = 0; p < parts ; ++p) + { + const Header & h = in.header (p); + + if (parts != 1) + { + cout << "\n\n part " << p << + (in.partComplete (p)? "": " (incomplete)") << + ":\n"; + + } + + for (Header::ConstIterator i = h.begin(); i != h.end(); ++i) + { + const Attribute *a = &i.attribute(); + cout << i.name() << " (type " << a->typeName() << ")"; + + if (const Box2iAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value().min << " - " << ta->value().max; + } + + else if (const Box2fAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value().min << " - " << ta->value().max; + } + else if (const ChannelListAttribute *ta = + dynamic_cast (a)) + { + cout << ":"; + printChannelList (ta->value()); + } + else if (const ChromaticitiesAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n" + " red " << ta->value().red << "\n" + " green " << ta->value().green << "\n" + " blue " << ta->value().blue << "\n" + " white " << ta->value().white; + } + else if (const CompressionAttribute *ta = + dynamic_cast (a)) + { + cout << ": "; + printCompression (ta->value()); + } + else if (const DoubleAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const EnvmapAttribute *ta = + dynamic_cast (a)) + { + cout << ": "; + printEnvmap (ta->value()); + } + else if (const FloatAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const IntAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const KeyCodeAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n" + " film manufacturer code " << + ta->value().filmMfcCode() << "\n" + " film type code " << + ta->value().filmType() << "\n" + " prefix " << + ta->value().prefix() << "\n" + " count " << + ta->value().count() << "\n" + " perf offset " << + ta->value().perfOffset() << "\n" + " perfs per frame " << + ta->value().perfsPerFrame() << "\n" + " perfs per count " << + ta->value().perfsPerCount(); + } + else if (const LineOrderAttribute *ta = + dynamic_cast (a)) + { + cout << ": "; + printLineOrder (ta->value()); + } + else if (const M33fAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n" + " (" << + ta->value()[0][0] << " " << + ta->value()[0][1] << " " << + ta->value()[0][2] << "\n " << + ta->value()[1][0] << " " << + ta->value()[1][1] << " " << + ta->value()[1][2] << "\n " << + ta->value()[2][0] << " " << + ta->value()[2][1] << " " << + ta->value()[2][2] << ")"; + } + else if (const M44fAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n" + " (" << + ta->value()[0][0] << " " << + ta->value()[0][1] << " " << + ta->value()[0][2] << " " << + ta->value()[0][3] << "\n " << + ta->value()[1][0] << " " << + ta->value()[1][1] << " " << + ta->value()[1][2] << " " << + ta->value()[1][3] << "\n " << + ta->value()[2][0] << " " << + ta->value()[2][1] << " " << + ta->value()[2][2] << " " << + ta->value()[2][3] << "\n " << + ta->value()[3][0] << " " << + ta->value()[3][1] << " " << + ta->value()[3][2] << " " << + ta->value()[3][3] << ")"; + } + else if (const PreviewImageAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << + ta->value().width() << " by " << + ta->value().height() << " pixels"; + } + else if (const StringAttribute *ta = + dynamic_cast (a)) + { + cout << ": \"" << ta->value() << "\""; + } + else if (const StringVectorAttribute * ta = + dynamic_cast(a)) + { + cout << ":"; + + for (StringVector::const_iterator i = ta->value().begin(); + i != ta->value().end(); + ++i) + { + cout << "\n \"" << *i << "\""; + } + } + else if (const RationalAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value().n << "/" << ta->value().d << + " (" << double (ta->value()) << ")"; + } + else if (const TileDescriptionAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n "; + + printLevelMode (ta->value().mode); + + cout << "\n tile size " << + ta->value().xSize << " by " << + ta->value().ySize << " pixels"; + + if (ta->value().mode != ONE_LEVEL) + { + cout << "\n level sizes rounded "; + printLevelRoundingMode (ta->value().roundingMode); + } + } + else if (const TimeCodeAttribute *ta = + dynamic_cast (a)) + { + cout << ":\n"; + printTimeCode (ta->value()); + } + else if (const V2iAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const V2fAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const V3iAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + else if (const V3fAttribute *ta = + dynamic_cast (a)) + { + cout << ": " << ta->value(); + } + + cout << '\n'; + } + } + + cout << endl; +} + + +void +usageMessage (const char argv0[]) +{ + std::cerr << "usage: " << argv0 << " imagefile [imagefile ...]\n"; +} + + +int +main(int argc, char **argv) +{ + if (argc < 2) + { + usageMessage (argv[0]); + return 1; + } + + for (int i = 1; i < argc; ++i) + { + if (!strcmp (argv[i], "-h")) + { + usageMessage (argv[0]); + return 1; + } + } + + try + { + for (int i = 1; i < argc; ++i) + printInfo (argv[i]); + + return 0; + } + catch (const std::exception &e) + { + std::cerr << e.what() << std::endl; + return 1; + } + +} diff --git a/exrmakepreview/CMakeLists.txt b/exrmakepreview/CMakeLists.txt new file mode 100644 index 0000000..78b9278 --- /dev/null +++ b/exrmakepreview/CMakeLists.txt @@ -0,0 +1,21 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrmakepreview + makePreview.cpp + main.cpp +) + +TARGET_LINK_LIBRARIES ( exrmakepreview + IlmImf + IlmThread${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrmakepreview + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrmakepreview/Makefile.am b/exrmakepreview/Makefile.am new file mode 100644 index 0000000..2b79da2 --- /dev/null +++ b/exrmakepreview/Makefile.am @@ -0,0 +1,17 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrmakepreview + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@\ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmakepreview_SOURCES = main.cpp makePreview.cpp makePreview.h + +noinst_HEADERS = makePreview.h + +EXTRA_DIST = main.cpp makePreview.cpp makePreview.h CMakeLists.txt diff --git a/exrmakepreview/Makefile.in b/exrmakepreview/Makefile.in new file mode 100644 index 0000000..ffe2c70 --- /dev/null +++ b/exrmakepreview/Makefile.in @@ -0,0 +1,551 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrmakepreview$(EXEEXT) +subdir = exrmakepreview +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrmakepreview_OBJECTS = main.$(OBJEXT) makePreview.$(OBJEXT) +exrmakepreview_OBJECTS = $(am_exrmakepreview_OBJECTS) +exrmakepreview_LDADD = $(LDADD) +exrmakepreview_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrmakepreview_SOURCES) +DIST_SOURCES = $(exrmakepreview_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@\ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmakepreview_SOURCES = main.cpp makePreview.cpp makePreview.h +noinst_HEADERS = makePreview.h +EXTRA_DIST = main.cpp makePreview.cpp makePreview.h CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrmakepreview/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrmakepreview/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrmakepreview$(EXEEXT): $(exrmakepreview_OBJECTS) $(exrmakepreview_DEPENDENCIES) + @rm -f exrmakepreview$(EXEEXT) + $(CXXLINK) $(exrmakepreview_OBJECTS) $(exrmakepreview_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makePreview.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrmakepreview/main.cpp b/exrmakepreview/main.cpp new file mode 100644 index 0000000..707e583 --- /dev/null +++ b/exrmakepreview/main.cpp @@ -0,0 +1,194 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// exrmakepreview -- a program that inserts a +// preview image into an OpenEXR file's header. +// +//----------------------------------------------------------------------------- + +#include "makePreview.h" + +#include +#include +#include +#include + +using namespace std; + + +void +usageMessage (const char argv0[], bool verbose = false) +{ + cerr << "usage: " << argv0 << " [options] infile outfile" << endl; + + if (verbose) + { + cerr << "\n" + "Reads an OpenEXR image from infile, generates a preview\n" + "image, adds it to the image's header, and saves the result\n" + "in outfile. Infile and outfile must not refer to the same\n" + "file (the program cannot edit an image file \"in place\").\n" + "\n" + "Options:\n" + "\n" + "-w x sets the width of the preview image to x pixels\n" + " (default is 100)\n" + "\n" + "-e s adjusts the preview image's exposure by s f-stops\n" + " (default is 0). Positive values make the image\n" + " brighter, negative values make it darker.\n" + "\n" + "-v verbose mode\n" + "\n" + "-h prints this message\n"; + + cerr << endl; + } + + exit (1); +} + + +int +main(int argc, char **argv) +{ + const char *inFile = 0; + const char *outFile = 0; + int previewWidth = 100; + float exposure = 0; + bool verbose = false; + + // + // Parse the command line. + // + + if (argc < 2) + usageMessage (argv[0], true); + + int i = 1; + + while (i < argc) + { + if (!strcmp (argv[i], "-w")) + { + // + // Set preview image width + // + + if (i > argc - 2) + usageMessage (argv[0]); + + previewWidth = strtol (argv[i + 1], 0, 0); + i += 2; + } + else if (!strcmp (argv[i], "-e")) + { + // + // Set preview image width + // + + if (i > argc - 2) + usageMessage (argv[0]); + + exposure = strtod (argv[i + 1], 0); + i += 2; + } + else if (!strcmp (argv[i], "-v")) + { + // + // Verbose mode + // + + verbose = true; + i += 1; + } + else if (!strcmp (argv[i], "-h")) + { + // + // Print help message + // + + usageMessage (argv[0], true); + } + else + { + // + // Image file name + // + + if (inFile == 0) + inFile = argv[i]; + else + outFile = argv[i]; + + i += 1; + } + } + + if (inFile == 0 || outFile == 0) + usageMessage (argv[0]); + + if (!strcmp (inFile, outFile)) + { + cerr << "Input and output cannot be the same file." << endl; + return 1; + } + + if (previewWidth <= 0) + { + cerr << "Preview image width must be greather than zero." << endl; + return 1; + } + + // + // Load inFile, add a preview image, and save the result in outFile. + // + + int exitStatus = 0; + + try + { + makePreview (inFile, outFile, previewWidth, exposure, verbose); + } + catch (const exception &e) + { + cerr << e.what() << endl; + exitStatus = 1; + } + + return exitStatus; +} diff --git a/exrmakepreview/makePreview.cpp b/exrmakepreview/makePreview.cpp new file mode 100644 index 0000000..dc2b1da --- /dev/null +++ b/exrmakepreview/makePreview.cpp @@ -0,0 +1,186 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Add a preview image to an OpenEXR file. +// +//---------------------------------------------------------------------------- + + +#include "makePreview.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; +using namespace std; + + +namespace { + +float +knee (float x, float f) +{ + return log (x * f + 1) / f; +} + + +unsigned char +gamma (half h, float m) +{ + // + // Conversion from half to unsigned char pixel data, + // with gamma correction. The conversion is the same + // as in the exrdisplay program's ImageView class, + // except with defog, kneeLow, and kneeHigh fixed + // at 0.0, 0.0, and 5.0 respectively. + // + + float x = max (0.f, h * m); + + if (x > 1) + x = 1 + knee (x - 1, 0.184874f); + + return (unsigned char) (clamp (Math::pow (x, 0.4545f) * 84.66f, + 0.f, + 255.f)); +} + + +void +generatePreview (const char inFileName[], + float exposure, + int previewWidth, + int &previewHeight, + Array2D &previewPixels) +{ + // + // Read the input file + // + + RgbaInputFile in (inFileName); + + Box2i dw = in.dataWindow(); + float a = in.pixelAspectRatio(); + int w = dw.max.x - dw.min.x + 1; + int h = dw.max.y - dw.min.y + 1; + + Array2D pixels (h, w); + in.setFrameBuffer (&pixels[0][0] - dw.min.y * w - dw.min.x, 1, w); + in.readPixels (dw.min.y, dw.max.y); + + // + // Make a preview image + // + + previewHeight = max (int (h / (w * a) * previewWidth + .5f), 1); + previewPixels.resizeErase (previewHeight, previewWidth); + + float fx = (previewWidth > 0)? (float (w - 1) / (previewWidth - 1)): 1; + float fy = (previewHeight > 0)? (float (h - 1) / (previewHeight - 1)): 1; + float m = Math::pow (2.f, clamp (exposure + 2.47393f, -20.f, 20.f)); + + for (int y = 0; y < previewHeight; ++y) + { + for (int x = 0; x < previewWidth; ++x) + { + PreviewRgba &preview = previewPixels[y][x]; + const Rgba &pixel = pixels[int (y * fy + .5f)][int (x * fx + .5f)]; + + preview.r = gamma (pixel.r, m); + preview.g = gamma (pixel.g, m); + preview.b = gamma (pixel.b, m); + preview.a = int (clamp (pixel.a * 255.f, 0.f, 255.f) + .5f); + } + } +} + +} // namespace + + +void +makePreview (const char inFileName[], + const char outFileName[], + int previewWidth, + float exposure, + bool verbose) +{ + if (verbose) + cout << "generating preview image" << endl; + + Array2D previewPixels; + int previewHeight; + + generatePreview (inFileName, + exposure, + previewWidth, + previewHeight, + previewPixels); + + InputFile in (inFileName); + Header header = in.header(); + + header.setPreviewImage + (PreviewImage (previewWidth, previewHeight, &previewPixels[0][0])); + + if (verbose) + cout << "copying " << inFileName << " to " << outFileName << endl; + + if (header.hasTileDescription()) + { + TiledOutputFile out (outFileName, header); + out.copyPixels (in); + } + else + { + OutputFile out (outFileName, header); + out.copyPixels (in); + } + + if (verbose) + cout << "done." << endl; +} diff --git a/exrmakepreview/makePreview.h b/exrmakepreview/makePreview.h new file mode 100644 index 0000000..4c4bef7 --- /dev/null +++ b/exrmakepreview/makePreview.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_MAKE_PREVIEW_H +#define INCLUDED_MAKE_PREVIEW_H + +//---------------------------------------------------------------------------- +// +// Add a preview image to an OpenEXR file. +// +//---------------------------------------------------------------------------- + + +void makePreview (const char inFileName[], + const char outFileName[], + int previewWidth, + float exposure, + bool verbose); + + +#endif diff --git a/exrmaketiled/CMakeLists.txt b/exrmaketiled/CMakeLists.txt new file mode 100644 index 0000000..1e8f00d --- /dev/null +++ b/exrmaketiled/CMakeLists.txt @@ -0,0 +1,22 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrmaketiled + makeTiled.cpp + main.cpp + Image.cpp +) + +TARGET_LINK_LIBRARIES ( exrmaketiled + IlmImf + IlmThread${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrmaketiled + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrmaketiled/Image.cpp b/exrmaketiled/Image.cpp new file mode 100644 index 0000000..1eb1b5c --- /dev/null +++ b/exrmaketiled/Image.cpp @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Classes for storing OpenEXR images in memory. +// +//---------------------------------------------------------------------------- + +#include "Image.h" +#include "namespaceAlias.h" + +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace std; + + +ImageChannel::ImageChannel (Image &image): _image (image) +{ + // empty +} + + +ImageChannel::~ImageChannel () +{ + // empty +} + + +Image::Image (): _dataWindow (Box2i (V2i (0, 0), V2i (0, 0))) +{ + // empty +} + + +Image::Image (const Box2i &dataWindow): _dataWindow (dataWindow) +{ + // empty +} + + +Image::~Image () +{ + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + delete i->second; +} + + +void +Image::resize (const IMATH_NAMESPACE::Box2i &dataWindow) +{ + _dataWindow = dataWindow; + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resize (width(), height()); +} + + +void +Image::addChannel (const string &name, PixelType type) +{ + switch (type) + { + case IMF::HALF: + _channels[name] = new HalfChannel (*this, width(), height()); + break; + + case IMF::FLOAT: + _channels[name] = new FloatChannel (*this, width(), height()); + break; + + case IMF::UINT: + _channels[name] = new UIntChannel (*this, width(), height()); + break; + + default: + throw IEX_NAMESPACE::ArgExc ("Unknown channel type."); + } +} + + +ImageChannel & +Image::channel (const string &name) +{ + return *_channels.find(name)->second; +} + + +const ImageChannel & +Image::channel (const string &name) const +{ + return *_channels.find(name)->second; +} diff --git a/exrmaketiled/Image.h b/exrmaketiled/Image.h new file mode 100644 index 0000000..21253bb --- /dev/null +++ b/exrmaketiled/Image.h @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMAGE_H +#define INCLUDED_IMAGE_H + +//---------------------------------------------------------------------------- +// +// Classes for storing OpenEXR images in memory. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +#include +#include + +#include "namespaceAlias.h" + + +class Image; + + +class ImageChannel +{ + public: + + friend class Image; + + ImageChannel (Image &image); + virtual ~ImageChannel(); + + virtual IMF::Slice slice () const = 0; + + Image & image () {return _image;} + const Image & image () const {return _image;} + + private: + + virtual void resize (int width, int height) = 0; + + Image & _image; +}; + + +template +class TypedImageChannel: public ImageChannel +{ + public: + + TypedImageChannel (Image &image, int width, int height); + virtual ~TypedImageChannel (); + + IMF::PixelType pixelType () const; + + virtual IMF::Slice slice () const; + + T & operator () (int x, int y); + const T & operator () (int x, int y) const; + + private: + + virtual void resize (int width, int height); + + IMF::Array2D _pixels; +}; + + +typedef TypedImageChannel HalfChannel; +typedef TypedImageChannel FloatChannel; +typedef TypedImageChannel UIntChannel; + + +class Image +{ + public: + + Image (); + Image (const IMATH_NAMESPACE::Box2i &dataWindow); + ~Image (); + + const IMATH_NAMESPACE::Box2i & dataWindow () const; + void resize (const IMATH_NAMESPACE::Box2i &dataWindow); + + int width () const; + int height () const; + + void addChannel (const std::string &name, + IMF::PixelType type); + + ImageChannel & channel (const std::string &name); + const ImageChannel & channel (const std::string &name) const; + + template + TypedImageChannel & typedChannel (const std::string &name); + + template + const TypedImageChannel & typedChannel (const std::string &name) const; + + private: + + typedef std::map ChannelMap; + + IMATH_NAMESPACE::Box2i _dataWindow; + ChannelMap _channels; +}; + + +// +// Implementation of templates and inline functions. +// + +template +TypedImageChannel::TypedImageChannel (Image &image, int width, int height): + ImageChannel (image), + _pixels (height, width) +{ + // empty +} + + +template +TypedImageChannel::~TypedImageChannel () +{ + // empty +} + + +template <> +inline OPENEXR_IMF_INTERNAL_NAMESPACE::PixelType +HalfChannel::pixelType () const +{ + return OPENEXR_IMF_INTERNAL_NAMESPACE::HALF; +} + + +template <> +inline OPENEXR_IMF_INTERNAL_NAMESPACE::PixelType +FloatChannel::pixelType () const +{ + return OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT; +} + + +template <> +inline OPENEXR_IMF_INTERNAL_NAMESPACE::PixelType +UIntChannel::pixelType () const +{ + return OPENEXR_IMF_INTERNAL_NAMESPACE::UINT; +} + + +template +OPENEXR_IMF_INTERNAL_NAMESPACE::Slice +TypedImageChannel::slice () const +{ + const IMATH_NAMESPACE::Box2i &dw = image().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + + return OPENEXR_IMF_INTERNAL_NAMESPACE::Slice (pixelType(), + (char *) (&_pixels[0][0] - dw.min.y * w - dw.min.x), + sizeof (T), + w * sizeof (T)); +} + + +template +inline const T & +TypedImageChannel::operator () (int x, int y) const +{ + return _pixels[y][x]; +} + + +template +inline T & +TypedImageChannel::operator () (int x, int y) +{ + return _pixels[y][x]; +} + + +template +void +TypedImageChannel::resize (int width, int height) +{ + _pixels.resizeEraseUnsafe (height, width); +} + + +inline const IMATH_NAMESPACE::Box2i & +Image::dataWindow () const +{ + return _dataWindow; +} + + +inline int +Image::width () const +{ + return _dataWindow.max.x - _dataWindow.min.x + 1; +} + + +inline int +Image::height () const +{ + return _dataWindow.max.y - _dataWindow.min.y + 1; +} + + +template +TypedImageChannel & +Image::typedChannel (const std::string &name) +{ + return dynamic_cast &> (channel (name)); +} + + +template +const TypedImageChannel & +Image::typedChannel (const std::string &name) const +{ + return dynamic_cast &> (channel (name)); +} + + +#endif diff --git a/exrmaketiled/Makefile.am b/exrmaketiled/Makefile.am new file mode 100644 index 0000000..84ea84b --- /dev/null +++ b/exrmaketiled/Makefile.am @@ -0,0 +1,24 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrmaketiled + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmaketiled_SOURCES = main.cpp \ + Image.h Image.cpp \ + makeTiled.cpp makeTiled.h \ + namespaceAlias.h + +noinst_HEADERS = Image.h makeTiled.h + +EXTRA_DIST = main.cpp \ + Image.h Image.cpp \ + makeTiled.cpp makeTiled.h \ + namespaceAlias.h \ + CMakeLists.txt diff --git a/exrmaketiled/Makefile.in b/exrmaketiled/Makefile.in new file mode 100644 index 0000000..5bfe3de --- /dev/null +++ b/exrmaketiled/Makefile.in @@ -0,0 +1,562 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrmaketiled$(EXEEXT) +subdir = exrmaketiled +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrmaketiled_OBJECTS = main.$(OBJEXT) Image.$(OBJEXT) \ + makeTiled.$(OBJEXT) +exrmaketiled_OBJECTS = $(am_exrmaketiled_OBJECTS) +exrmaketiled_LDADD = $(LDADD) +exrmaketiled_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrmaketiled_SOURCES) +DIST_SOURCES = $(exrmaketiled_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmaketiled_SOURCES = main.cpp \ + Image.h Image.cpp \ + makeTiled.cpp makeTiled.h \ + namespaceAlias.h + +noinst_HEADERS = Image.h makeTiled.h +EXTRA_DIST = main.cpp \ + Image.h Image.cpp \ + makeTiled.cpp makeTiled.h \ + namespaceAlias.h \ + CMakeLists.txt + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrmaketiled/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrmaketiled/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrmaketiled$(EXEEXT): $(exrmaketiled_OBJECTS) $(exrmaketiled_DEPENDENCIES) + @rm -f exrmaketiled$(EXEEXT) + $(CXXLINK) $(exrmaketiled_OBJECTS) $(exrmaketiled_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makeTiled.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrmaketiled/main.cpp b/exrmaketiled/main.cpp new file mode 100644 index 0000000..72568a8 --- /dev/null +++ b/exrmaketiled/main.cpp @@ -0,0 +1,435 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// exrmaketiled -- program that produces tiled +// multiresolution versions of OpenEXR images. +// +//----------------------------------------------------------------------------- + +#include "makeTiled.h" + +#include +#include +#include +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; + + + +namespace { + +void +usageMessage (const char argv0[], bool verbose = false) +{ + cerr << "usage: " << argv0 << " [options] infile outfile" << endl; + + if (verbose) + { + cerr << "\n" + "Reads an OpenEXR image from infile, produces a tiled\n" + "version of the image, and saves the result in outfile.\n" + "\n" + "Options:\n" + "\n" + "-o produces a ONE_LEVEL image (default)\n" + "\n" + "-m produces a MIPMAP_LEVELS multiresolution image\n" + "\n" + "-r produces a RIPMAP_LEVELS multiresolution image\n" + "\n" + "-f c when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n" + " is produced, image channel c will be resampled\n" + " without low-pass filtering. This option can\n" + " be specified multiple times to disable low-pass\n" + " filtering for mutiple channels.\n" + "\n" + "-e x y when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n" + " is produced, low-pass filtering takes samples\n" + " outside the image's data window. This requires\n" + " extrapolating the image. Option -e specifies\n" + " how the image is extrapolated horizontally and\n" + " vertically (black/clamp/periodic/mirror, default\n" + " is clamp).\n" + "\n" + "-t x y sets the tile size in the output image to\n" + " x by y pixels (default is 64 by 64)\n" + "\n" + "-d sets level size rounding to ROUND_DOWN (default)\n" + "\n" + "-u sets level size rounding to ROUND_UP\n" + "\n" + "-z x sets the data compression method to x\n" + " (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n" + " default is zip)\n" + "\n" + "-v verbose mode\n" + "\n" + "-h prints this message\n" + "\n" + "Multipart Options:\n" + "\n" + "-p i part number, default is 0\n"; + + cerr << endl; + } + + exit (1); +} + + +Compression +getCompression (const string &str) +{ + Compression c; + + if (str == "no" || str == "none" || str == "NO" || str == "NONE") + { + c = NO_COMPRESSION; + } + else if (str == "rle" || str == "RLE") + { + c = RLE_COMPRESSION; + } + else if (str == "zip" || str == "ZIP") + { + c = ZIP_COMPRESSION; + } + else if (str == "piz" || str == "PIZ") + { + c = PIZ_COMPRESSION; + } + else if (str == "pxr24" || str == "PXR24") + { + c = PXR24_COMPRESSION; + } + else if (str == "b44" || str == "B44") + { + c = B44_COMPRESSION; + } + else if (str == "b44a" || str == "B44A") + { + c = B44A_COMPRESSION; + } + else if (str == "dwaa" || str == "DWAA") + { + c = DWAA_COMPRESSION; + } + else if (str == "dwab" || str == "DWAB") + { + c = DWAB_COMPRESSION; + } + else + { + cerr << "Unknown compression method \"" << str << "\"." << endl; + exit (1); + } + + return c; +} + + +Extrapolation +getExtrapolation (const string &str) +{ + Extrapolation e; + + if (str == "black" || str == "BLACK") + { + e = BLACK; + } + else if (str == "clamp" || str == "CLAMP") + { + e = CLAMP; + } + else if (str == "periodic" || str == "PERIODIC") + { + e = PERIODIC; + } + else if (str == "mirror" || str == "MIRROR") + { + e = MIRROR; + } + else + { + cerr << "Unknown extrapolation method \"" << str << "\"." << endl; + exit (1); + } + + return e; +} + +void +getPartNum (int argc, + char **argv, + int &i, + int *j) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + *j = strtol (argv[i + 1], 0, 0); + cout << "part number: "<< *j << endl; + i += 2; +} + +} // namespace + + +int +main(int argc, char **argv) +{ + const char *inFile = 0; + const char *outFile = 0; + LevelMode mode = ONE_LEVEL; + LevelRoundingMode roundingMode = ROUND_DOWN; + Compression compression = ZIP_COMPRESSION; + int tileSizeX = 64; + int tileSizeY = 64; + set doNotFilter; + Extrapolation extX = CLAMP; + Extrapolation extY = CLAMP; + bool verbose = false; + + // + // Parse the command line. + // + + if (argc < 2) + usageMessage (argv[0], true); + + int i = 1; + int partnum = 0; + + while (i < argc) + { + if (!strcmp (argv[i], "-o")) + { + // + // generate a ONE_LEVEL image + // + + mode = ONE_LEVEL; + i += 1; + } + else if (!strcmp (argv[i], "-m")) + { + // + // Generate a MIPMAP_LEVELS image + // + + mode = MIPMAP_LEVELS; + i += 1; + } + else if (!strcmp (argv[i], "-r")) + { + // + // Generate a RIPMAP_LEVELS image + // + + mode = RIPMAP_LEVELS; + i += 1; + } + else if (!strcmp (argv[i], "-f")) + { + // + // Don't low-pass filter the specified image channel + // + + if (i > argc - 2) + usageMessage (argv[0]); + + doNotFilter.insert (argv[i + 1]); + i += 2; + } + else if (!strcmp (argv[i], "-e")) + { + // + // Set x and y extrapolation method + // + + if (i > argc - 3) + usageMessage (argv[0]); + + extX = getExtrapolation (argv[i + 1]); + extY = getExtrapolation (argv[i + 2]); + i += 3; + } + else if (!strcmp (argv[i], "-t")) + { + // + // Set tile size + // + + if (i > argc - 3) + usageMessage (argv[0]); + + tileSizeX = strtol (argv[i + 1], 0, 0); + tileSizeY = strtol (argv[i + 2], 0, 0); + + if (tileSizeX <= 0 || tileSizeY <= 0) + { + cerr << "Tile size must be greater than zero." << endl; + return 1; + } + + i += 3; + } + else if (!strcmp (argv[i], "-d")) + { + // + // Round down + // + + roundingMode = ROUND_DOWN; + i += 1; + } + else if (!strcmp (argv[i], "-u")) + { + // + // Round down + // + + roundingMode = ROUND_UP; + i += 1; + } + else if (!strcmp (argv[i], "-z")) + { + // + // Set compression method + // + + if (i > argc - 2) + usageMessage (argv[0]); + + compression = getCompression (argv[i + 1]); + i += 2; + } + else if (!strcmp (argv[i], "-v")) + { + // + // Verbose mode + // + + verbose = true; + i += 1; + } + else if (!strcmp (argv[i], "-h")) + { + // + // Print help message + // + + usageMessage (argv[0], true); + } + else if (!strcmp (argv[i], "-p")) + { + getPartNum (argc, argv, i, &partnum); + } + else + { + // + // Image file name + // + + if (inFile == 0) + inFile = argv[i]; + else + outFile = argv[i]; + + i += 1; + } + } + + if (inFile == 0 || outFile == 0) + usageMessage (argv[0]); + + if (!strcmp (inFile, outFile)) + { + cerr << "Input and output cannot be the same file." << endl; + return 1; + } + + // + // Load inFile, and save a tiled version in outFile. + // + + int exitStatus = 0; + + // + // check input + // + { + MultiPartInputFile input (inFile); + int parts = input.parts(); + + if (partnum < 0 || partnum >= parts){ + cerr << "ERROR: you asked for part " << partnum << " in " << inFile; + cerr << ", which only has " << parts << " parts\n"; + exit(1); + } + + Header h = input.header (partnum); + if (h.type() == DEEPTILE || h.type() == DEEPSCANLINE) + { + cerr << "Cannot make tile for deep data" << endl; + exit(1); + } + + } + + + try + { + makeTiled (inFile, outFile, partnum, + mode, roundingMode, compression, + tileSizeX, tileSizeY, + doNotFilter, + extX, extY, + verbose); + } + catch (const exception &e) + { + cerr << e.what() << endl; + exitStatus = 1; + } + + return exitStatus; +} diff --git a/exrmaketiled/makeTiled.cpp b/exrmaketiled/makeTiled.cpp new file mode 100644 index 0000000..26164f1 --- /dev/null +++ b/exrmaketiled/makeTiled.cpp @@ -0,0 +1,754 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Produce a tiled version of an OpenEXR image. +// +//---------------------------------------------------------------------------- + +#include "makeTiled.h" +#include "Image.h" + +#include "ImfTiledInputPart.h" +#include "ImfTiledOutputPart.h" +#include "ImfInputPart.h" +#include "ImfOutputPart.h" +#include "ImfDeepScanLineInputPart.h" +#include "ImfDeepScanLineOutputPart.h" +#include "ImfDeepTiledInputPart.h" +#include "ImfDeepTiledOutputPart.h" +#include "ImfChannelList.h" +#include "ImfChannelList.h" +#include "ImfFrameBuffer.h" +#include "ImfStandardAttributes.h" +#include "ImathFun.h" +#include "Iex.h" +#include "ImfMisc.h" + +#include +#include +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace std; + + +namespace { + +string +extToString (Extrapolation ext) +{ + string str; + + switch (ext) + { + case BLACK: + str = "black"; + break; + + case CLAMP: + str = "clamp"; + break; + + case PERIODIC: + str = "periodic"; + break; + + case MIRROR: + str = "mirror"; + break; + } + + return str; +} + + +int +mirror (int x, int w) +{ + int d = divp (x, w); + int m = modp (x, w); + return (d & 1)? w - 1 - m: m; +} + + +template +double +sampleX (const TypedImageChannel &channel, + int w, + double x, + int y, + Extrapolation ext) +{ + // + // Sample an image channel at location (x, y), where + // x is a floating point number, and y is an integer. + // + + int xs = IMATH_NAMESPACE::floor (x); + int xt = xs + 1; + double s = xt - x; + double t = 1 - s; + double vs=0.0; + double vt=0.0; + + switch (ext) + { + case BLACK: + + vs = (xs >= 0 && xs < w)? double (channel (xs, y)): 0.0; + vt = (xt >= 0 && xt < w)? double (channel (xt, y)): 0.0; + break; + + case CLAMP: + + xs = clamp (xs, 0, w - 1); + xt = clamp (xt, 0, w - 1); + vs = channel (xs, y); + vt = channel (xt, y); + break; + + case PERIODIC: + + xs = modp (xs, w); + xt = modp (xt, w); + vs = channel (xs, y); + vt = channel (xt, y); + break; + + case MIRROR: + + xs = mirror (xs, w); + xt = mirror (xt, w); + vs = channel (xs, y); + vt = channel (xt, y); + break; + } + + return s * vs + t * vt; +} + + +template +double +sampleY (const TypedImageChannel &channel, + int h, + int x, + double y, + Extrapolation ext) +{ + // + // Sample an image channel at location (x, y), where + // x is an integer, and y is a floating point number. + // + + int ys = IMATH_NAMESPACE::floor (y); + int yt = ys + 1; + double s = yt - y; + double t = 1 - s; + double vs=0.0; + double vt=0.0; + + switch (ext) + { + case BLACK: + + vs = (ys >= 0 && ys < h)? double (channel (x, ys)): 0.0; + vt = (yt >= 0 && yt < h)? double (channel (x, yt)): 0.0; + break; + + case CLAMP: + + ys = clamp (ys, 0, h - 1); + yt = clamp (yt, 0, h - 1); + vs = channel (x, ys); + vt = channel (x, yt); + break; + + case PERIODIC: + + ys = modp (ys, h); + yt = modp (yt, h); + vs = channel (x, ys); + vt = channel (x, yt); + break; + + case MIRROR: + + ys = mirror (ys, h); + yt = mirror (yt, h); + vs = channel (x, ys); + vt = channel (x, yt); + break; + } + + return s * vs + t * vt; +} + + +template +T +filterX (const TypedImageChannel &channel, + int w, + double x, + int y, + Extrapolation ext) +{ + // + // Horizontal four-tap filter, centered on pixel (x + 0.5, y) + // + + return T (0.125 * sampleX (channel, w, x - 1, y, ext) + + 0.375 * sampleX (channel, w, x, y, ext) + + 0.375 * sampleX (channel, w, x + 1, y, ext) + + 0.125 * sampleX (channel, w, x + 2, y, ext)); +} + + +template +T +filterY (const TypedImageChannel &channel, + int h, + int x, + double y, + Extrapolation ext) +{ + // + // Vertical four-tap filter, centered on pixel (x, y + 0.5) + // + + return T (0.125 * sampleY (channel, h, x, y - 1, ext) + + 0.375 * sampleY (channel, h, x, y, ext) + + 0.375 * sampleY (channel, h, x, y + 1, ext) + + 0.125 * sampleY (channel, h, x, y + 2, ext)); +} + + +template +void +reduceX (const TypedImageChannel &channel0, + TypedImageChannel &channel1, + bool filter, + Extrapolation &ext, + bool odd) +{ + // + // Shrink an image channel, channel0, horizontally + // by a factor of 2, and store the result in channel1. + // + + int w0 = channel0.image().width(); + int w1 = channel1.image().width(); + int h1 = channel1.image().height(); + + if (filter) + { + // + // Low-pass filter and resample. + // For pixels (0, y) and (w1 - 1, y) in channel 1, + // the low-pass filter in channel0 is centered on + // pixels (0.5, y) and (w0 - 1.5, y) respectively. + // + + double f = (w1 > 1)? double (w0 - 2) / (w1 - 1): 1; + + for (int y = 0; y < h1; ++y) + for (int x = 0; x < w1; ++x) + channel1 (x, y) = filterX (channel0, w0, x * f, y, ext); + } + else + { + // + // Resample, skipping every other pixel, without + // low-pass filtering. In order to keep the image + // from sliding to the right if the channel is + // resampled repeatedly, we skip the rightmost + // pixel of every row on even passes, and the + // leftmost pixel on odd passes. + // + + int offset = odd? ((w0 - 1) - 2 * (w1 - 1)): 0; + + for (int y = 0; y < h1; ++y) + for (int x = 0; x < w1; ++x) + channel1 (x, y) = channel0 (2 * x + offset, y); + } +} + + +template +void +reduceY (const TypedImageChannel &channel0, + TypedImageChannel &channel1, + bool filter, + Extrapolation ext, + bool odd) +{ + // + // Shrink an image channel, channel0, vertically + // by a factor of 2, and store the result in channel1. + // + + int w1 = channel1.image().width(); + int h0 = channel0.image().height(); + int h1 = channel1.image().height(); + + if (filter) + { + // + // Low-pass filter and resample. + // For pixels (x, 0) and (x, h1 - 1) in channel 1, + // the low-pass filter in channel0 is centered on + // pixels (x, 0.5) and (x, h0 - 1.5) respectively. + // + + double f = (h1 > 1)? double (h0 - 2) / (h1 - 1): 1; + + for (int y = 0; y < h1; ++y) + for (int x = 0; x < w1; ++x) + channel1 (x, y) = filterY (channel0, h0, x, y * f, ext); + } + else + { + // + // Resample, skipping every other pixel, without + // low-pass filtering. In order to keep the image + // from sliding towards the top if the channel is + // resampled repeatedly, we skip the top pixel of + // every column on even passes, and the bottom pixel + // on odd passes. + // + + int offset = odd? ((h0 - 1) - 2 * (h1 - 1)): 0; + + for (int y = 0; y < h1; ++y) + for (int x = 0; x < w1; ++x) + channel1 (x, y) = channel0 (x, 2 * y + offset); + } +} + + +void +reduceX (const ChannelList &channels, + const set &doNotFilter, + Extrapolation ext, + bool odd, + const Image &image0, + Image &image1) +{ + // + // Shrink image image0 horizontally by a factor of 2, + // and store the result in image image1. + // + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + const char *name = i.name(); + const Channel &channel = i.channel(); + bool filter = (doNotFilter.find (name) == doNotFilter.end()); + + switch (channel.type) + { + case IMF::HALF: + + reduceX (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + + case IMF::FLOAT: + + reduceX (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + + case IMF::UINT: + + reduceX (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + default : + break; + + } + } +} + + +void +reduceY (const ChannelList &channels, + const set &doNotFilter, + Extrapolation ext, + bool odd, + const Image &image0, + Image &image1) +{ + // + // Shrink image image0 vertically by a factor of 2, + // and store the result in image image1. + // + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + const char *name = i.name(); + const Channel &channel = i.channel(); + bool filter = (doNotFilter.find (name) == doNotFilter.end()); + + switch (channel.type) + { + case IMF::HALF: + + reduceY (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + + case IMF::FLOAT: + + reduceY (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + + case IMF::UINT: + + reduceY (image0.typedChannel (name), + image1.typedChannel (name), + filter, ext, odd); + break; + default : + break; + + } + } +} + + +void +storeLevel (TiledOutputPart &out, + const ChannelList &channels, + int lx, + int ly, + const Image &image) +{ + // + // Store the pixels for level (lx, ly) in output file out. + // + + FrameBuffer fb; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + const char *name = i.name(); + fb.insert (name, image.channel(name).slice()); + } + + out.setFrameBuffer (fb); + + for (int y = 0; y < out.numYTiles (ly); ++y) + for (int x = 0; x < out.numXTiles (lx); ++x) + out.writeTile (x, y, lx, ly); +} + +} // namespace + + +void +makeTiled (const char inFileName[], + const char outFileName[], + int partnum, + LevelMode mode, + LevelRoundingMode roundingMode, + Compression compression, + int tileSizeX, + int tileSizeY, + const set &doNotFilter, + Extrapolation extX, + Extrapolation extY, + bool verbose) +{ + Image image0; + Image image1; + Image image2; + Header header; + FrameBuffer fb; + vector
headers; + + // + // Load the input image + // + + MultiPartInputFile input (inFileName); + int parts = input.parts(); + + for (int p = 0 ; p < parts; p++) + { + if (verbose) + cout << "reading file " << inFileName << endl; + + if(p == partnum) + { + InputPart in (input, p); + header = in.header(); + if (hasEnvmap (header) && mode != ONE_LEVEL) + { + // + // Proper low-pass filtering and subsampling + // of environment maps is not implemented in + // this program. + // + + throw IEX_NAMESPACE::NoImplExc ("This program cannot generate " + "multiresolution environment maps. " + "Use exrenvmap instead."); + } + + image0.resize (header.dataWindow()); + + for (ChannelList::ConstIterator i = header.channels().begin(); + i != header.channels().end(); + ++i) + { + const char *name = i.name(); + const Channel &channel = i.channel(); + + if (channel.xSampling != 1 || channel.ySampling != 1) + { + throw IEX_NAMESPACE::InputExc ("Sub-sampled image channels are " + "not supported in tiled files."); + } + + image0.addChannel (name, channel.type); + image1.addChannel (name, channel.type); + image2.addChannel (name, channel.type); + fb.insert (name, image0.channel(name).slice()); + } + + in.setFrameBuffer (fb); + in.readPixels (header.dataWindow().min.y, header.dataWindow().max.y); + + + // + // Generate the header for the output file by modifying + // the input file's header + // + + header.setTileDescription (TileDescription (tileSizeX, tileSizeY, + mode, roundingMode)); + + header.compression() = compression; + header.lineOrder() = INCREASING_Y; + + if (mode != ONE_LEVEL) + addWrapmodes (header, extToString (extX) + "," + extToString (extY)); + + // + // set tileDescription, type, and chunckcount for multipart + // + header.setType(TILEDIMAGE); + int chunkcount = getChunkOffsetTableSize(header, true); + header.setChunkCount(chunkcount); + + headers.push_back(header); + } + else + { + Header h = input.header(p); + headers.push_back(h); + } + + } + + // + // Store the highest-resolution level of the image in the output file + // + + MultiPartOutputFile output (outFileName, &headers[0], headers.size()); + + for(int p = 0 ; p < parts; p++) + { + if (p == partnum) + { + try + { + TiledOutputPart out (output, partnum); + // TiledOutputFile out (outFileName, header); + + + out.setFrameBuffer (fb); + + if (verbose) + cout << "writing file " << outFileName << "\n" + "level (0, 0)" << endl; + + for (int y = 0; y < out.numYTiles (0); ++y) + for (int x = 0; x < out.numXTiles (0); ++x) + out.writeTile (x, y, 0); + + // + // If necessary, generate the lower-resolution mipmap + // or ripmap levels, and store them in the output file. + // + + if (mode == MIPMAP_LEVELS) + { + for (int l = 1; l < out.numLevels(); ++l) + { + image1.resize (out.dataWindowForLevel (l, l - 1)); + + reduceX (header.channels(), + doNotFilter, + extX, + l & 1, + image0, + image1); + + image0.resize (out.dataWindowForLevel (l, l)); + + reduceY (header.channels(), + doNotFilter, + extY, + l & 1, + image1, + image0); + + if (verbose) + cout << "level (" << l << ", " << l << ")" << endl; + + storeLevel (out, header.channels(), l, l, image0); + } + } + + if (mode == RIPMAP_LEVELS) + { + Image *iptr0 = &image0; + Image *iptr1 = &image1; + Image *iptr2 = &image2; + + for (int ly = 0; ly < out.numYLevels(); ++ly) + { + if (ly < out.numYLevels() - 1) + { + iptr2->resize (out.dataWindowForLevel (0, ly + 1)); + + reduceY (header.channels(), + doNotFilter, + extY, + ly & 1, + *iptr0, + *iptr2); + } + + for (int lx = 0; lx < out.numXLevels(); ++lx) + { + if (lx != 0 || ly != 0) + { + if (verbose) + cout << "level (" << lx << ", " << ly << ")" << endl; + + storeLevel (out, header.channels(), lx, ly, *iptr0); + } + + if (lx < out.numXLevels() - 1) + { + iptr1->resize (out.dataWindowForLevel (lx + 1, ly)); + + reduceX (header.channels(), + doNotFilter, + extX, + lx & 1, + *iptr0, + *iptr1); + + swap (iptr0, iptr1); + } + } + + swap (iptr2, iptr0); + } + } + } + catch (const exception &e) + { + cerr << e.what() << endl; + } + } + else + { + Header header = headers[p]; + std::string type = header.type(); + if (type == TILEDIMAGE) + { + TiledInputPart in (input, p); + TiledOutputPart out (output, p); + out.copyPixels (in); + } + else if (type == SCANLINEIMAGE) + { + using std::max; InputPart in (input, p); + OutputPart out (output, p); + out.copyPixels (in); + } + else if (type == DEEPSCANLINE) + { + DeepScanLineInputPart in (input,p); + DeepScanLineOutputPart out (output,p); + out.copyPixels (in); + } + else if (type == DEEPTILE) + { + DeepTiledInputPart in (input,p); + DeepTiledOutputPart out (output,p); + out.copyPixels (in); + } + } + } + + if (verbose) + cout << "done." << endl; +} + diff --git a/exrmaketiled/makeTiled.h b/exrmaketiled/makeTiled.h new file mode 100644 index 0000000..754fd8e --- /dev/null +++ b/exrmaketiled/makeTiled.h @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_MAKE_TILED_H +#define INCLUDED_MAKE_TILED_H + +//---------------------------------------------------------------------------- +// +// Produce a tiled version of an OpenEXR image. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "namespaceAlias.h" + +enum Extrapolation +{ + BLACK, + CLAMP, + PERIODIC, + MIRROR +}; + + +void makeTiled (const char inFileName[], + const char outFileName[], + int partnum, + IMF::LevelMode mode, + IMF::LevelRoundingMode roundingMode, + IMF::Compression compression, + int tileSizeX, + int tileSizeY, + const std::set &doNotFilter, + Extrapolation extX, + Extrapolation extY, + bool verbose); + + +#endif diff --git a/exrmaketiled/namespaceAlias.h b/exrmaketiled/namespaceAlias.h new file mode 100644 index 0000000..19567eb --- /dev/null +++ b/exrmaketiled/namespaceAlias.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +#ifndef NAMESPACEALIAS_H_ +#define NAMESPACEALIAS_H_ + +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +namespace IMATH = IMATH_NAMESPACE; +namespace IEX = IEX_NAMESPACE; + +#endif /* NAMESPACEALIAS_H_ */ diff --git a/exrmultipart/CMakeLists.txt b/exrmultipart/CMakeLists.txt new file mode 100644 index 0000000..4f013cd --- /dev/null +++ b/exrmultipart/CMakeLists.txt @@ -0,0 +1,20 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrmultipart + exrmultipart.cpp +) + +TARGET_LINK_LIBRARIES ( exrmultipart + IlmImf + IlmThread${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrmultipart + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrmultipart/Makefile.am b/exrmultipart/Makefile.am new file mode 100644 index 0000000..416dfc1 --- /dev/null +++ b/exrmultipart/Makefile.am @@ -0,0 +1,16 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrmultipart + +INCLUDES = -I$(top_builddir) \ +-I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ +@ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ +$(top_builddir)/IlmImf/libIlmImf.la \ +-lz + +exrmultipart_SOURCES = exrmultipart.cpp + +EXTRA_DIST = CMakeLists.txt + diff --git a/exrmultipart/Makefile.in b/exrmultipart/Makefile.in new file mode 100644 index 0000000..bf02d1c --- /dev/null +++ b/exrmultipart/Makefile.in @@ -0,0 +1,537 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrmultipart$(EXEEXT) +subdir = exrmultipart +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrmultipart_OBJECTS = exrmultipart.$(OBJEXT) +exrmultipart_OBJECTS = $(am_exrmultipart_OBJECTS) +exrmultipart_LDADD = $(LDADD) +exrmultipart_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrmultipart_SOURCES) +DIST_SOURCES = $(exrmultipart_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ +-I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ +@ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ +$(top_builddir)/IlmImf/libIlmImf.la \ +-lz + +exrmultipart_SOURCES = exrmultipart.cpp +EXTRA_DIST = CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrmultipart/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrmultipart/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrmultipart$(EXEEXT): $(exrmultipart_OBJECTS) $(exrmultipart_DEPENDENCIES) + @rm -f exrmultipart$(EXEEXT) + $(CXXLINK) $(exrmultipart_OBJECTS) $(exrmultipart_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exrmultipart.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrmultipart/exrmultipart.cpp b/exrmultipart/exrmultipart.cpp new file mode 100644 index 0000000..8c4fa66 --- /dev/null +++ b/exrmultipart/exrmultipart.cpp @@ -0,0 +1,830 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// Portions contributed and copyright held by others as indicated. +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Utility program to combine or separate multipart image files +// +//----------------------------------------------------------------------------- + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include // pair +#include +#include +#include +#include +#include + +using std::cerr; +using std::cout; +using std::endl; +using std::vector; +using std::pair; +using std::set; +using std::ostringstream; +using std::min; +using std::max; +using std::string; +using std::make_pair; +using IMATH_NAMESPACE::Box2i; + +using namespace OPENEXR_IMF_NAMESPACE; + + +#if defined(ANDROID) || defined(__ANDROID_API__) + #define IMF_PATH_SEPARATOR "/" +#elif defined(_WIN32) || defined(_WIN64) || defined(__MWERKS__) || defined(PLATFORM_WINDOWS) + #define IMF_PATH_SEPARATOR "\\" +#else + #define IMF_PATH_SEPARATOR "/" +#endif + + +void +copy_tile (MultiPartInputFile & input, + MultiPartOutputFile & output, + int inPart, int outPart) +{ + TiledInputPart in (input, inPart); + TiledOutputPart out (output, outPart); + + out.copyPixels (in); +} + +void +copy_tiledeep (MultiPartInputFile & input, + MultiPartOutputFile & output, + int inPart, int outPart) +{ + DeepTiledInputPart in (input, inPart); + DeepTiledOutputPart out (output, outPart); + + out.copyPixels (in); +} + +void +copy_scanline (MultiPartInputFile & input, + MultiPartOutputFile & output, + int inPart, int outPart) +{ + InputPart in (input, inPart); + OutputPart out (output, outPart); + + out.copyPixels (in); +} + +void +copy_scanlinedeep (MultiPartInputFile & input, + MultiPartOutputFile & output, + int inPart, int outPart) +{ + DeepScanLineInputPart in (input, inPart); + DeepScanLineOutputPart out (output, outPart); + + out.copyPixels (in); +} + +bool +is_number(const std::string& s) +{ + std::string::const_iterator it = s.begin(); + while (it != s.end() && std::isdigit(*it)) ++it; + return !s.empty() && it == s.end(); +} + +void +parse_partname (string & part_name) +{ + // strip off a path delimitation + size_t posSlash = part_name.rfind(IMF_PATH_SEPARATOR); + if (posSlash != string::npos) + part_name = part_name.substr(posSlash+1); + + + // strip the exr ext + size_t pos = part_name.rfind(".exr"); + if (pos != string::npos) + { + part_name = part_name.substr(0, pos); + + // strip off the frame number + size_t pos2 = part_name.rfind("."); + if (pos2 != string::npos) + { + string frame = part_name.substr(pos2+1, pos); + if (is_number(frame)) + part_name = part_name.substr(0, pos2); + } + } +} + + +/// +/// If input is <...>::: then extract part number, +/// Else, use all parts +/// +void +parse_filename (string & file_name, + string & part_name, + bool & force_part_name, + int & part_num) +{ + force_part_name = false; + part_name = file_name; // default is the file_name + size_t doublecolon = file_name.rfind ("::"); + if (doublecolon != string::npos) + { + part_name = file_name.substr (doublecolon+2); + file_name = file_name.substr (0, doublecolon); + force_part_name = true; + } + else + { + parse_partname(part_name); + } + + size_t colon = file_name.rfind (':'); + if (colon == string::npos) + { + part_num = -1; // use all parts + } + else + { + string num = file_name.substr (colon + 1); + if (is_number(num)) + { + part_num = atoi (num.c_str()); + file_name = file_name.substr (0, colon); + } + else + { + cerr <<"\n" << "ERROR: part number must be a number" << endl; + exit(1); + } + } +} + + +void +make_unique_names (vector
& headers) +{ + set names; + for ( size_t i = 0 ; i < headers.size() ; i++ ) + { + Header & h = headers[i]; + std::string base_name; + + // if no name at all, set it to (first part is part 1) + if (!h.hasName()) + { + // We should not be here, we have populated all headers with names. + cerr << "\n" << "Software Error: header does not have a valid name" + << ":" << __LINE__ << endl; + exit (1); + } + else + { + base_name = h.name(); + } + + + // check name has already been used, if so add a _ to it + if (names.find (base_name) != names.end()) + { + ostringstream s; + size_t backup=1; + do + { + s.clear(); + s << h.name() << "_" << i << "_" << backup; + backup++; + } + while (names.find(s.str()) != names.end()); + h.setName (s.str()); + } + + names.insert (h.name()); + } +} + +void +filename_check (vector names, const char* aname) +{ + string bname(aname); + for (size_t i = 0; i < names.size(); i++) + { + if (bname.compare (names[i]) == 0) + { + cerr << "\n" << "ERROR: " + "input and output file names cannot be the same." << endl; + exit (1); + } + } +} + +void +convert(vector in, + vector views, + const char* outname, + bool override) +{ + if(in.size()!=1) + { + cerr <<"\n" << "ERROR: " + "can only convert one file at once - use 'combine' mode for multiple files" << endl; + exit(1); + } + try + { + MultiPartInputFile infile(in[0]); + + if(infile.parts() != 1) + { + cerr <<"\n" << "ERROR: " + "can only convert single part EXRs to multipart EXR-2.0 files: use 'split' mode instead" << endl; + exit(1); + } + + vector input_channels; + + string hero; + if(hasMultiView(infile.header(0))) + { + StringVector h = multiView (infile.header(0)); + if(h.size()>0) + { + hero=h[0]; + } + } + + // retrieve channel names from input file in view-friendly format + GetChannelsInMultiPartFile(infile,input_channels); + + + vector< MultiViewChannelName > output_channels = input_channels; + // remap channels to multiple output parts + int parts = SplitChannels(output_channels.begin(),output_channels.end(),true,hero); + + vector
output_headers(parts); + vector output_framebuffers(parts); + FrameBuffer input_framebuffer; + + // + // make all output headers the same as the input header but + // with no channels + // + for(int i=0;i > channelstore(channel_count); + + + // + // insert channels into correct header and framebuffers + // + for( size_t i=0 ; i in, + vector views, + const char* outname, + bool override) +{ + size_t numInputs = in.size(); + int numparts; + vector partnums; + vector inputs; + vector fordelete; + MultiPartInputFile *infile; + vector
headers; + vector fornamecheck; + + // + // parse all inputs + // + + // Input format : + // We support the following syntax for each input + // [:][::] + + for (size_t i = 0 ; i < numInputs; i++) + { + string filename (in[i]); + string partname; + bool forcepartname; + int partnum; + parse_filename (filename, partname, forcepartname, partnum); + + if (partnum == -1) + { + fornamecheck.push_back (filename); + + try + { + infile = new MultiPartInputFile (filename.c_str()); + fordelete.push_back (infile); + numparts = infile->parts(); + + //copy header from all parts of input to our header array + for (int j = 0; j < numparts; j++) + { + inputs.push_back (infile); + + Header h = infile->header(j); + if (!h.hasName() || forcepartname) + h.setName (partname); + + headers.push_back (h); + + if( views[i] != NULL ) + headers[headers.size()-1].setView( views[i] ); + + partnums.push_back (j); + } + } + catch (IEX_NAMESPACE::BaseExc &e) + { + cerr << "\n" << "ERROR:" << endl; + cerr << e.what() << endl; + exit (1); + } + } // no user parts specified + else + { + fornamecheck.push_back (filename); + + try + { + infile = new MultiPartInputFile (filename.c_str()); + fordelete.push_back (infile); + + if (partnum >= infile->parts()) + { + cerr << "ERROR: you asked for part " << partnum << " in " << in[i]; + cerr << ", which only has " << infile->parts() << " parts\n"; + exit (1); + } + //copy header from required part of input to our header array + inputs.push_back (infile); + + Header h = infile->header(partnum); + if (!h.hasName() || forcepartname) + h.setName (partname); + + headers.push_back (h); + + + if( views[i] != NULL ) + headers[headers.size()-1].setView( views[i] ); + + partnums.push_back (partnum); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + cerr << "\n" << "ERROR:" << endl; + cerr << e.what()<< endl; + exit (1); + } + } // user parts specified + } + + filename_check (fornamecheck, outname); + // + // sort out names - make unique + // + if (numInputs>1) + { + make_unique_names (headers); + } + + // + // do combine + // + + // early bail if need be + try + { + MultiPartOutputFile temp (outname, &headers[0], headers.size(), override); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + cerr << "\n" << "ERROR: " << e.what() << endl; + exit (1); + } + MultiPartOutputFile out (outname, &headers[0], headers.size(), override); + + for (size_t p = 0 ; p < partnums.size();p++) + { + std::string type = headers[p].type(); + if (type == SCANLINEIMAGE) + { + cout << "part " << p << ": "<< "scanlineimage" << endl; + copy_scanline (*inputs[p], out, partnums[p], p); + } + else if (type == TILEDIMAGE) + { + cout << "part " << p << ": "<< "tiledimage" << endl; + copy_tile (*inputs[p], out, partnums[p], p); + } + else if (type == DEEPSCANLINE) + { + cout << "part " << p << ": "<< "deepscanlineimage" << endl; + copy_scanlinedeep (*inputs[p], out, partnums[p], p); + } + else if (type == DEEPTILE) + { + cout << "part " << p << ": "<< "deeptile" << endl; + copy_tiledeep (*inputs[p], out, partnums[p], p); + } + } + + + for (size_t k = 0; k < fordelete.size(); k++) + { + delete fordelete[k]; + } + + inputs.clear(); + fordelete.size(); + + cout << "\n" << "Combine Success" << endl; +} + +void +separate (vector in, const char* out, bool override) +{ + if (in.size() > 1) + { + cerr << "ERROR: -separate only take one input file\n" + "syntax: exrmultipart -separate -i infile.exr -o outfileBaseName\n"; + exit (1); + } + + // + // parse the multipart input + // + string filename (in[0]); + MultiPartInputFile *inputimage; + int numOutputs; + vector fornamecheck; + + // add check for existance of the file + try + { + MultiPartInputFile temp (filename.c_str()); + } + catch (IEX_NAMESPACE::BaseExc &e) + { + cerr << "\n" << "ERROR: " << e.what() << endl; + exit (1); + } + + inputimage = new MultiPartInputFile (filename.c_str()); + numOutputs = inputimage->parts(); + cout << "numOutputs: " << numOutputs << endl; + + // + // set outputs names + // + for (int p = 0 ; p header (p); + + MultiPartOutputFile out (fornamecheck[p].c_str(), &header, 1, override); + + std::string type = header.type(); + if (type == "scanlineimage") + { + cout << "scanlineimage" << endl; + copy_scanline (*inputimage, out, p, 0); + } + else if (type == "tiledimage") + { + cout << "tiledimage" << endl; + copy_tile (*inputimage, out, p, 0); + } + else if (type == "deepscanline") + { + cout << "deepscanline" << endl; + copy_scanlinedeep (*inputimage, out, p, 0); + } + else if (type == "deeptile") + { + cout << "deeptile" << endl; + copy_tiledeep (*inputimage, out, p, 0); + } + } + + delete inputimage; + cout << "\n" << "Seperate Success" << endl; +} + +void +usageMessage (const char argv[]) +{ + cout << argv << " handles the combining and splitting of multipart data\n"; + cout << "\n" << "Usage: " + "exrmultipart -combine -i input.exr[:partnum][::partname] " + "[input2.exr[:partnum]][::partname] [...] -o outfile.exr [options]\n"; + cout << " or: exrmultipart -separate -i infile.exr -o outfileBaseName " + "[options]\n"; + cout << " or: exrmultipart -convert -i infile.exr -o outfile.exr " + "[options]\n"; + cout << "\n" << "Options:\n"; + cout << "-override [0/1] 0-do not override conflicting shared " + "attributes [default]\n" + " 1-override conflicting shared attributes\n"; + + cout << "-view name (after specifying -i) " + "assign following inputs to view 'name'\n"; + exit (1); +} + +int +main (int argc, char * argv[]) +{ + if (argc < 6) + { + usageMessage (argv[0]); + } + + vector inFiles; + vector views; + const char* view = 0; + const char *outFile = 0; + bool override = false; + + int i = 1; + int mode = 0; // 0-do not read input, 1-infiles, 2-outfile, 3-override, 4-view + + while (i < argc) + { + if (!strcmp (argv[i], "-h")) + { + usageMessage (argv[0]); + } + + if (!strcmp (argv[i], "-i")) + { + mode = 1; + } + else if (!strcmp (argv[i], "-o")) + { + mode = 2; + } + else if (!strcmp (argv[i], "-override")) + { + mode = 3; + } + else if (!strcmp (argv[i], "-view")) + { + if(mode !=1 ) + { + usageMessage (argv[0]); + return 1; + } + mode = 4; + } + else + { + switch (mode) + { + case 1: + inFiles.push_back (argv[i]); + views.push_back (view); + break; + case 2: outFile = argv[i]; + break; + case 3: override = atoi (argv[i]); + break; + case 4: view = argv[i]; + mode=1; + break; + } + } + i++; + } + + // check input and output files found or not + if (inFiles.size() == 0) + { + cerr << "\n" << "ERROR: found no input files" << endl; + exit (1); + } + + cout << "input:" << endl; + for (size_t i = 0; i < inFiles.size(); i++) + { + cout << " " << inFiles[i]; + if(views[i]) cout << " in view " << views[i]; + cout << endl; + } + + if (!outFile) + { + cerr << "\n"<<"ERROR: found no output file" << endl; + exit (1); + } + + cout << "output:\n " << outFile << endl; + cout << "override:" << override << "\n" << endl; + + + if (!strcmp (argv[1], "-combine")) + { + cout << "-combine multipart input " << endl; + combine (inFiles, views, outFile, override); + } + else if (!strcmp(argv[1], "-separate")) + { + cout << "-separate multipart input " << endl; + separate (inFiles, outFile, override); + } + else if(!strcmp(argv[1],"-convert")) + { + cout << "-convert input to EXR2 multipart" << endl; + convert (inFiles, views, outFile, override); + } + else + { + usageMessage (argv[0]); + } + + return 0; +} + diff --git a/exrmultiview/CMakeLists.txt b/exrmultiview/CMakeLists.txt new file mode 100644 index 0000000..4c71437 --- /dev/null +++ b/exrmultiview/CMakeLists.txt @@ -0,0 +1,23 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrmultiview + makeMultiView.cpp + main.cpp + Image.cpp +) + +TARGET_LINK_LIBRARIES ( exrmultiview + IlmImf + Half + Imath${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + IlmThread${ILMBASE_LIBSUFFIX} + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrmultiview + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrmultiview/Image.cpp b/exrmultiview/Image.cpp new file mode 100644 index 0000000..7f8789f --- /dev/null +++ b/exrmultiview/Image.cpp @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Classes for storing OpenEXR images in memory. +// +//---------------------------------------------------------------------------- + +#include "Image.h" +#include "namespaceAlias.h" + +using namespace std; +using namespace IMATH; +using namespace IEX; +using namespace IMF; + + +ImageChannel::ImageChannel (Image &image): _image (image) +{ + // empty +} + + +ImageChannel::~ImageChannel () +{ + // empty +} + + +Image::Image (): _dataWindow (Box2i (V2i (0, 0), V2i (0, 0))) +{ + // empty +} + + +Image::Image (const Box2i &dataWindow): _dataWindow (dataWindow) +{ + // empty +} + + +Image::~Image () +{ + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + delete i->second; +} + + +void +Image::resize (const IMATH::Box2i &dataWindow) +{ + _dataWindow = dataWindow; + + for (ChannelMap::iterator i = _channels.begin(); i != _channels.end(); ++i) + i->second->resize(); +} + + +void +Image::addChannel (const string &name, const IMF::Channel &channel) +{ + switch (channel.type) + { + case IMF::HALF: + _channels[name] = new HalfChannel (*this, + channel.xSampling, + channel.ySampling); + break; + + case IMF::FLOAT: + _channels[name] = new FloatChannel (*this, + channel.xSampling, + channel.ySampling); + break; + + case IMF::UINT: + _channels[name] = new UIntChannel (*this, + channel.xSampling, + channel.ySampling); + break; + + default: + throw IEX::ArgExc ("Unknown channel type."); + } +} + + +ImageChannel & +Image::channel (const string &name) +{ + return *_channels.find(name)->second; +} + + +const ImageChannel & +Image::channel (const string &name) const +{ + return *_channels.find(name)->second; +} diff --git a/exrmultiview/Image.h b/exrmultiview/Image.h new file mode 100644 index 0000000..5d718f5 --- /dev/null +++ b/exrmultiview/Image.h @@ -0,0 +1,271 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_IMAGE_H +#define INCLUDED_IMAGE_H + +//---------------------------------------------------------------------------- +// +// Classes for storing OpenEXR images in memory. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +#include +#include + +#include "namespaceAlias.h" + +class Image; + + +class ImageChannel +{ + public: + + friend class Image; + + ImageChannel (Image &image); + virtual ~ImageChannel(); + + virtual IMF::Slice slice () const = 0; + + Image & image () {return _image;} + const Image & image () const {return _image;} + virtual void black() =0; + private: + + virtual void resize () = 0; + + Image & _image; +}; + + +template +class TypedImageChannel: public ImageChannel +{ + public: + + TypedImageChannel (Image &image, int xSampling, int ySampling); + + virtual ~TypedImageChannel (); + + IMF::PixelType pixelType () const; + + virtual IMF::Slice slice () const; + + + private: + + virtual void resize (); + virtual void black(); + + int _xSampling; + int _ySampling; + IMF::Array2D _pixels; +}; + + +typedef TypedImageChannel HalfChannel; +typedef TypedImageChannel FloatChannel; +typedef TypedImageChannel UIntChannel; + + +class Image +{ + public: + + Image (); + Image (const IMATH_NAMESPACE::Box2i &dataWindow); + ~Image (); + + const IMATH_NAMESPACE::Box2i & dataWindow () const; + void resize (const IMATH_NAMESPACE::Box2i &dataWindow); + + int width () const; + int height () const; + + void addChannel (const std::string &name, + const IMF::Channel &channel); + + ImageChannel & channel (const std::string &name); + const ImageChannel & channel (const std::string &name) const; + + template + TypedImageChannel & typedChannel (const std::string &name); + + template + const TypedImageChannel & typedChannel (const std::string &name) const; + + + + private: + + typedef std::map ChannelMap; + + IMATH_NAMESPACE::Box2i _dataWindow; + ChannelMap _channels; +}; + + +// +// Implementation of templates and inline functions. +// + +template +TypedImageChannel::TypedImageChannel + (Image &image, + int xSampling, + int ySampling) +: + ImageChannel (image), + _xSampling (xSampling), + _ySampling (ySampling), + _pixels (0, 0) +{ + resize(); +} + + +template +TypedImageChannel::~TypedImageChannel () +{ + // empty +} + + +template <> +inline IMF::PixelType +HalfChannel::pixelType () const +{ + return IMF::HALF; +} + + +template <> +inline IMF::PixelType +FloatChannel::pixelType () const +{ + return IMF::FLOAT; +} + + +template <> +inline IMF::PixelType +UIntChannel::pixelType () const +{ + return IMF::UINT; +} + + +template +IMF::Slice +TypedImageChannel::slice () const +{ + const IMATH_NAMESPACE::Box2i &dw = image().dataWindow(); + int w = dw.max.x - dw.min.x + 1; + + return IMF::Slice (pixelType(), + (char *) (&_pixels[0][0] - + dw.min.y / _ySampling * (w / _xSampling) - + dw.min.x / _xSampling), + sizeof (T), + (w / _xSampling) * sizeof (T), + _xSampling, + _ySampling); +} + + +template +void +TypedImageChannel::resize () +{ + int width = image().width() / _xSampling; + int height = image().height() / _ySampling; + + _pixels.resizeEraseUnsafe (height, width); +} + + +template +void +TypedImageChannel::black () +{ + memset(&_pixels[0][0],0,image().width()/_xSampling*image().height()/_ySampling*sizeof(T)); +} + + +inline const IMATH_NAMESPACE::Box2i & +Image::dataWindow () const +{ + return _dataWindow; +} + + +inline int +Image::width () const +{ + return _dataWindow.max.x - _dataWindow.min.x + 1; +} + + +inline int +Image::height () const +{ + return _dataWindow.max.y - _dataWindow.min.y + 1; +} + + +template +TypedImageChannel & +Image::typedChannel (const std::string &name) +{ + return dynamic_cast &> (channel (name)); +} + + +template +const TypedImageChannel & +Image::typedChannel (const std::string &name) const +{ + return dynamic_cast &> (channel (name)); +} + + +#endif diff --git a/exrmultiview/Makefile.am b/exrmultiview/Makefile.am new file mode 100644 index 0000000..dee94c3 --- /dev/null +++ b/exrmultiview/Makefile.am @@ -0,0 +1,24 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrmultiview + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmultiview_SOURCES = main.cpp \ + Image.h Image.cpp \ + makeMultiView.cpp makeMultiView.h \ + namespaceAlias.h + +noinst_HEADERS = Image.h makeMultiView.h + +EXTRA_DIST = main.cpp \ + Image.h Image.cpp \ + makeMultiView.h makeMultiView.cpp \ + namespaceAlias.h \ + CMakeLists.txt diff --git a/exrmultiview/Makefile.in b/exrmultiview/Makefile.in new file mode 100644 index 0000000..d7ff2a9 --- /dev/null +++ b/exrmultiview/Makefile.in @@ -0,0 +1,562 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrmultiview$(EXEEXT) +subdir = exrmultiview +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrmultiview_OBJECTS = main.$(OBJEXT) Image.$(OBJEXT) \ + makeMultiView.$(OBJEXT) +exrmultiview_OBJECTS = $(am_exrmultiview_OBJECTS) +exrmultiview_LDADD = $(LDADD) +exrmultiview_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrmultiview_SOURCES) +DIST_SOURCES = $(exrmultiview_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrmultiview_SOURCES = main.cpp \ + Image.h Image.cpp \ + makeMultiView.cpp makeMultiView.h \ + namespaceAlias.h + +noinst_HEADERS = Image.h makeMultiView.h +EXTRA_DIST = main.cpp \ + Image.h Image.cpp \ + makeMultiView.h makeMultiView.cpp \ + namespaceAlias.h \ + CMakeLists.txt + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrmultiview/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrmultiview/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrmultiview$(EXEEXT): $(exrmultiview_OBJECTS) $(exrmultiview_DEPENDENCIES) + @rm -f exrmultiview$(EXEEXT) + $(CXXLINK) $(exrmultiview_OBJECTS) $(exrmultiview_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/makeMultiView.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrmultiview/main.cpp b/exrmultiview/main.cpp new file mode 100644 index 0000000..6dd8d24 --- /dev/null +++ b/exrmultiview/main.cpp @@ -0,0 +1,260 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// exrmultiview -- a program that combines multiple +// single-view OpenEXR image files into a single +// multi-view image file. +// +//----------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include + +#include "namespaceAlias.h" +using namespace IMF; +using namespace std; + + + +namespace { + +void +usageMessage (const char argv0[], bool verbose = false) +{ + cerr << "usage: " << argv0 << " " + "[options] viewname1 infile1 viewname2 infile2 ... outfile" << endl; + + if (verbose) + { + cerr << "\n" + "Combines two or more single-view OpenEXR image files into\n" + "a single multi-view image file. On the command line,\n" + "each single-view input image is specified together with\n" + "a corresponding view name. The first view on the command\n" + "line becomes the default view. Example:\n" + "\n" + " " << argv0 << " left imgL.exr right imgR.exr imgLR.exr\n" + "\n" + "Here, imgL.exr and imgR.exr become the left and right\n" + "views in output file imgLR.exr. The left view becomes\n" + "the default view.\n" + "\n" + "Options:\n" + "\n" + "-z x sets the data compression method to x\n" + " (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n" + " default is piz)\n" + "\n" + "-v verbose mode\n" + "\n" + "-h prints this message\n"; + + cerr << endl; + } + + exit (1); +} + + +Compression +getCompression (const string &str) +{ + Compression c; + + if (str == "no" || str == "none" || str == "NO" || str == "NONE") + { + c = NO_COMPRESSION; + } + else if (str == "rle" || str == "RLE") + { + c = RLE_COMPRESSION; + } + else if (str == "zip" || str == "ZIP") + { + c = ZIP_COMPRESSION; + } + else if (str == "piz" || str == "PIZ") + { + c = PIZ_COMPRESSION; + } + else if (str == "pxr24" || str == "PXR24") + { + c = PXR24_COMPRESSION; + } + else if (str == "b44" || str == "B44") + { + c = B44_COMPRESSION; + } + else if (str == "b44a" || str == "B44A") + { + c = B44A_COMPRESSION; + } + else if (str == "dwaa" || str == "DWAA") + { + c = DWAA_COMPRESSION; + } + else if (str == "dwab" || str == "DWAB") + { + c = DWAB_COMPRESSION; + } + else + { + cerr << "Unknown compression method \"" << str << "\"." << endl; + exit (1); + } + + return c; +} + +} // namespace + + +int +main(int argc, char **argv) +{ + vector views; + vector inFiles; + const char *outFile = 0; + Compression compression = PIZ_COMPRESSION; + bool verbose = false; + + // + // Parse the command line. + // + + if (argc < 2) + usageMessage (argv[0], true); + + int i = 1; + + while (i < argc) + { + if (!strcmp (argv[i], "-z")) + { + // + // Set compression method + // + + if (i > argc - 2) + usageMessage (argv[0]); + + compression = getCompression (argv[i + 1]); + i += 2; + } + else if (!strcmp (argv[i], "-v")) + { + // + // Verbose mode + // + + verbose = true; + i += 1; + } + else if (!strcmp (argv[i], "-h")) + { + // + // Print help message + // + + usageMessage (argv[0], true); + } + else + { + // + // View or image file name + // + + if (i > argc - 2 || argv[i + 1][0] == '-') + { + // + // Output file + // + + if (outFile) + usageMessage (argv[0]); + + outFile = argv[i]; + i += 1; + } + else + { + // + // View plus input file + // + + views.push_back (argv[i]); + inFiles.push_back (argv[i + 1]); + i += 2; + } + } + } + + if (views.size() < 2) + { + cerr << "Must specify at least two views." << endl; + return 1; + } + + if (outFile == 0) + { + cerr << "Must specify an output file." << endl; + return 1; + } + + // + // Load inFiles, and save a combined multi-view image in outFile. + // + + int exitStatus = 0; + + try + { + makeMultiView (views, inFiles, outFile, compression, verbose); + } + catch (const exception &e) + { + cerr << e.what() << endl; + exitStatus = 1; + } + + return exitStatus; +} diff --git a/exrmultiview/makeMultiView.cpp b/exrmultiview/makeMultiView.cpp new file mode 100644 index 0000000..8cdd8e2 --- /dev/null +++ b/exrmultiview/makeMultiView.cpp @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Combine multiple single-view images +// into one multi-view image. +// +//---------------------------------------------------------------------------- + +#include "makeMultiView.h" +#include "Image.h" +#include +#include +#include +#include +#include +#include +#include "Iex.h" +#include +#include +#include + + +#include "namespaceAlias.h" +using namespace IMF; +using namespace IMATH_NAMESPACE; +using namespace std; + + +void +makeMultiView (const vector &viewNames, + const vector &inFileNames, + const char *outFileName, + Compression compression, + bool verbose) +{ + Header header; + Image image; + FrameBuffer outFb; + + // + // Find the size of the dataWindow, check files + // + + Box2i d; + + + for (size_t i = 0; i < viewNames.size(); ++i) + { + InputFile in (inFileNames[i]); + + if (verbose) + { + cout << "reading file " << inFileNames[i] << " " + "for " << viewNames[i] << " view" << endl; + } + + if (hasMultiView (in.header())) + { + THROW (IEX_NAMESPACE::NoImplExc, + "The image in file " << inFileNames[i] << " is already a " + "multi-view image. Cannot combine multiple multi-view " + "images."); + } + + header = in.header(); + if (i == 0) + { + d=header.dataWindow(); + }else{ + d.extendBy(header.dataWindow()); + } + } + + + image.resize (d); + + header.dataWindow()=d; + + // blow away channels; we'll rebuild them + header.channels()=ChannelList(); + + + // + // Read the input image files + // + + for (size_t i = 0; i < viewNames.size(); ++i) + { + InputFile in (inFileNames[i]); + + if (verbose) + { + cout << "reading file " << inFileNames[i] << " " + "for " << viewNames[i] << " view" << endl; + } + + FrameBuffer inFb; + + for (ChannelList::ConstIterator j = in.header().channels().begin(); + j != in.header().channels().end(); + ++j) + { + const Channel &inChannel = j.channel(); + string inChanName = j.name(); + string outChanName = insertViewName (inChanName, viewNames, i); + + image.addChannel (outChanName, inChannel); + image.channel(outChanName).black(); + + header.channels().insert (outChanName, inChannel); + + inFb.insert (inChanName, image.channel(outChanName).slice()); + outFb.insert (outChanName, image.channel(outChanName).slice()); + } + + in.setFrameBuffer (inFb); + in.readPixels (in.header().dataWindow().min.y, in.header().dataWindow().max.y); + } + + // + // Write the output image file + // + + { + header.compression() = compression; + addMultiView (header, viewNames); + + OutputFile out (outFileName, header); + + if (verbose) + cout << "writing file " << outFileName << endl; + + out.setFrameBuffer (outFb); + + out.writePixels + (header.dataWindow().max.y - header.dataWindow().min.y + 1); + } +} diff --git a/exrmultiview/makeMultiView.h b/exrmultiview/makeMultiView.h new file mode 100644 index 0000000..d840298 --- /dev/null +++ b/exrmultiview/makeMultiView.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +#ifndef INCLUDED_MAKE_MULTI_VIEW_H +#define INCLUDED_MAKE_MULTI_VIEW_H + +//---------------------------------------------------------------------------- +// +// Combine multiple single-view images +// into one multi-view image. +// +//---------------------------------------------------------------------------- + +#include +#include +#include +#include "namespaceAlias.h" + + +void makeMultiView (const std::vector &viewNames, + const std::vector &inFileNames, + const char *outFileName, + IMF::Compression compression, + bool verbose); + +#endif diff --git a/exrmultiview/namespaceAlias.h b/exrmultiview/namespaceAlias.h new file mode 100644 index 0000000..19567eb --- /dev/null +++ b/exrmultiview/namespaceAlias.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// +#ifndef NAMESPACEALIAS_H_ +#define NAMESPACEALIAS_H_ + +#include +#include +#include + +namespace IMF = OPENEXR_IMF_NAMESPACE; +namespace IMATH = IMATH_NAMESPACE; +namespace IEX = IEX_NAMESPACE; + +#endif /* NAMESPACEALIAS_H_ */ diff --git a/exrstdattr/CMakeLists.txt b/exrstdattr/CMakeLists.txt new file mode 100644 index 0000000..f8904dd --- /dev/null +++ b/exrstdattr/CMakeLists.txt @@ -0,0 +1,20 @@ +# yue.nicholas@gmail.com + +ADD_EXECUTABLE ( exrstdattr + main.cpp +) + +TARGET_LINK_LIBRARIES ( exrstdattr + IlmImf + IlmThread${ILMBASE_LIBSUFFIX} + Iex${ILMBASE_LIBSUFFIX} + Half + ${PTHREAD_LIB} + ${ZLIB_LIBRARIES} +) + +INSTALL ( TARGETS + exrstdattr + DESTINATION + ${CMAKE_INSTALL_PREFIX}/bin +) diff --git a/exrstdattr/Makefile.am b/exrstdattr/Makefile.am new file mode 100644 index 0000000..128bdb9 --- /dev/null +++ b/exrstdattr/Makefile.am @@ -0,0 +1,14 @@ +## Process this file with automake to produce Makefile.in + +bin_PROGRAMS = exrstdattr + +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrstdattr_SOURCES = main.cpp CMakeLists.txt + diff --git a/exrstdattr/Makefile.in b/exrstdattr/Makefile.in new file mode 100644 index 0000000..75ed944 --- /dev/null +++ b/exrstdattr/Makefile.in @@ -0,0 +1,536 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = exrstdattr$(EXEEXT) +subdir = exrstdattr +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/compilelinkrun.m4 \ + $(top_srcdir)/m4/path.pkgconfig.m4 $(top_srcdir)/m4/threads.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config/OpenEXRConfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_exrstdattr_OBJECTS = main.$(OBJEXT) +exrstdattr_OBJECTS = $(am_exrstdattr_OBJECTS) +exrstdattr_LDADD = $(LDADD) +exrstdattr_DEPENDENCIES = $(top_builddir)/IlmImf/libIlmImf.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/config +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(exrstdattr_SOURCES) +DIST_SOURCES = $(exrstdattr_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +ILMBASE_CXXFLAGS = @ILMBASE_CXXFLAGS@ +ILMBASE_LDFLAGS = @ILMBASE_LDFLAGS@ +ILMBASE_LIBS = @ILMBASE_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LIB_SUFFIX = @LIB_SUFFIX@ +LIB_SUFFIX_DASH = @LIB_SUFFIX_DASH@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENEXR_VERSION = @OPENEXR_VERSION@ +OPENEXR_VERSION_API = @OPENEXR_VERSION_API@ +OPENEXR_VERSION_MAJOR = @OPENEXR_VERSION_MAJOR@ +OPENEXR_VERSION_MINOR = @OPENEXR_VERSION_MINOR@ +OPENEXR_VERSION_PATCH = @OPENEXR_VERSION_PATCH@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I$(top_builddir) \ + -I$(top_srcdir)/IlmImf -I$(top_srcdir)/config \ + @ILMBASE_CXXFLAGS@ + +LDADD = @ILMBASE_LDFLAGS@ @ILMBASE_LIBS@ \ + $(top_builddir)/IlmImf/libIlmImf.la \ + -lz + +exrstdattr_SOURCES = main.cpp CMakeLists.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exrstdattr/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu exrstdattr/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +exrstdattr$(EXEEXT): $(exrstdattr_OBJECTS) $(exrstdattr_DEPENDENCIES) + @rm -f exrstdattr$(EXEEXT) + $(CXXLINK) $(exrstdattr_OBJECTS) $(exrstdattr_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/exrstdattr/main.cpp b/exrstdattr/main.cpp new file mode 100644 index 0000000..c65914e --- /dev/null +++ b/exrstdattr/main.cpp @@ -0,0 +1,904 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2014, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// exrstdattr -- a program that can set the values of most +// standard attributes in an OpenEXR image file's header. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace OPENEXR_IMF_NAMESPACE; +using namespace IMATH_NAMESPACE; + + +void +usageMessage (const char argv0[], bool verbose = false) +{ + cerr << "usage: " << argv0 << " [commands] infile outfile" << endl; + + if (verbose) + { + cerr << "\n" + "Reads OpenEXR image file infile, sets the values of one\n" + "or more attributes in the headers of the file, and saves\n" + "the result in outfile. Infile and outfile must not refer\n" + "to the same file (the program cannot edit an image file " + "\"in place\").\n" + "\n" + "Command for selecting headers:\n" + "\n" + " -part i\n" + " If i is greater than or equal to zero, and less\n" + " than the number of parts in the input file, then\n" + " the header for part i becomes \"current.\" If i\n" + " is \"any\" or -1, then all headers become current.\n" + " Subsequent attribute setting commands affect only\n" + " the current header or headers. All headers are\n" + " current before the first -part command.\n" + "\n" + " For example, the command sequence\n" + "\n" + " -focus 3 -part 2 -aperture 8 -expTime 0.01 " + "-part any -owner luke\n" + "\n" + " sets the focus and owner attributes in all\n" + " headers, as well as the aperture and expTime\n" + " attributes in the header of part 2.\n" + "\n" + "Commands for setting attribute values:\n" + "\n" + " -chromaticities f f f f f f f f\n" + " CIE xy chromaticities for the red, green\n" + " and blue primaries, and for the white point\n" + " (8 floats)\n" + "\n" + " -whiteLuminance f\n" + " white luminance, in candelas per square meter\n" + " (float, >= 0.0)\n" + "\n" + " -adoptedNeutral f f\n" + " CIE xy coordinates that should be considered\n" + " \"neutral\" during color rendering. Pixels in\n" + " the image file whose xy coordinates match the\n" + " adoptedNeutral value should be mapped to neutral\n" + " values on the display. (2 floats)\n" + "\n" + " -renderingTransform s\n" + " name of the CTL rendering transform for this\n" + " image (string)\n" + "\n" + " -lookModTransform s\n" + " name of the CTL look modification transform for\n" + " this image (string)\n" + "\n" + " -xDensity f\n" + " horizontal output density, in pixels per inch\n" + " (float, >= 0.0)\n" + "\n" + " -owner s\n" + " name of the owner of the image (string)\n" + "\n" + " -comments s\n" + " additional information about the image (string)\n" + "\n" + " -capDate s\n" + " date when the image was created or\n" + " captured, in local time (string,\n" + " formatted as YYYY:MM:DD hh:mm:ss)\n" + "\n" + " -utcOffset f\n" + " offset of local time at capDate from UTC, in\n" + " seconds (float, UTC == local time + x)\n" + "\n" + " -longitude f\n" + " -latitude f\n" + " -altitude f\n" + " location where the image was recorded, in\n" + " degrees east of Greenwich and north of the\n" + " equator, and in meters above sea level\n" + " (float)\n" + "\n" + " -focus f\n" + " the camera's focus distance, in meters\n" + " (float, > 0, or \"infinity\")\n" + "\n" + " -expTime f\n" + " exposure time, in seconds (float, >= 0)\n" + "\n" + " -aperture f\n" + " lens apterture, in f-stops (float, >= 0)\n" + "\n" + " -isoSpeed f\n" + " effective speed of the film or image\n" + " sensor that was used to record the image\n" + " (float, >= 0)\n" + "\n" + " -envmap s\n" + " indicates that the image is an environment map\n" + " (string, LATLONG or CUBE)\n" + "\n" + " -framesPerSecond i i\n" + " playback frame rate expressed as a ratio of two\n" + " integers, n and d (the frame rate is n/d frames\n" + " per second)\n" + "\n" + " -keyCode i i i i i i i\n" + " key code that uniquely identifies a motion\n" + " picture film frame using 7 integers:\n" + " * film manufacturer code (0 - 99)\n" + " * film type code (0 - 99)\n" + " * prefix to identify film roll (0 - 999999)\n" + " * count, increments once every perfsPerCount\n" + " perforations (0 - 9999)\n" + " * offset of frame, in perforations from\n" + " zero-frame reference mark (0 - 119)\n" + " * number of perforations per frame (1 - 15)\n" + " * number of perforations per count (20 - 120)\n" + "\n" + " -timeCode i i\n" + " SMPTE time and control code, specified as a pair\n" + " of 8-digit base-16 integers. The first number\n" + " contains the time address and flags (drop frame,\n" + " color frame, field/phase, bgf0, bgf1, bgf2).\n" + " The second number contains the user data and\n" + " control codes.\n" + "\n" + " -wrapmodes s\n" + " if the image is used as a texture map, specifies\n" + " how the image should be extrapolated outside the\n" + " zero-to-one texture coordinate range\n" + " (string, e.g. \"clamp\" or \"periodic,clamp\")\n" + "\n" + " -pixelAspectRatio f\n" + " width divided by height of a pixel\n" + " (float, >= 0)\n" + "\n" + " -screenWindowWidth f\n" + " width of the screen window (float, >= 0)\n" + "\n" + " -screenWindowCenter f f\n" + " center of the screen window (2 floats)\n" + "\n" + " -string s s\n" + " custom string attribute\n" + " (2 strings, attribute name and value)\n" + "\n" + " -float s f\n" + " custom float attribute (string + float,\n" + " attribute name and value)\n" + "\n" + " -int s i\n" + " custom integer attribute (string + integer,\n" + " attribute name and value)\n" + "\n" + "Other Commands:\n" + "\n" + " -h prints this message\n"; + + cerr << endl; + } + + exit (1); +} + + +struct SetAttr +{ + string name; + int part; + Attribute * attr; + + SetAttr (const string &name, int part, Attribute *attr): + name (name), part (part), attr (attr) {} +}; + +typedef vector SetAttrVector; + + +void +isNonNegative (const char attrName[], float f) +{ + if (f < 0) + { + cerr << "The value for the " << attrName << " attribute " + "must not be less than zero." << endl; + exit (1); + } +} + + +void +isPositive (const char attrName[], float f) +{ + if (f <= 0) + { + cerr << "The value for the " << attrName << " attribute " + "must be greater than zero." << endl; + exit (1); + } +} + + +void +notValidDate (const char attrName[]) +{ + cerr << "The value for the " << attrName << " attribute " + "is not a valid date of the form \"YYYY:MM:DD yy:mm:ss\"." << endl; + exit (1); +} + + +int +strToInt (const char str[], int length) +{ + int x = 0; + + for (int i = 0; i < length; ++i) + { + if (str[i] < '0' || str[i] > '9') + return -1; + + x = x * 10 + (str[i] - '0'); + } + + return x; +} + + +void +isDate (const char attrName[], const char str[]) +{ + // + // Check that str represents a valid + // date of the form YYYY:MM:DD hh:mm:ss. + // + + if (strlen (str) != 19 || + str[4] != ':' || str[7] != ':' || + str[10] != ' ' || + str[13] != ':' || str[16] != ':') + { + notValidDate (attrName); + } + + int Y = strToInt (str + 0, 4); // year + int M = strToInt (str + 5, 2); // month + int D = strToInt (str + 8, 2); // day + int h = strToInt (str + 11, 2); // hour + int m = strToInt (str + 14, 2); // minute + int s = strToInt (str + 17, 2); // second + + if (Y < 0 || + M < 1 || M > 12 || + D < 1 || + h < 0 || h > 23 || + m < 0 || m > 59 || + s < 0 || s > 59) + { + notValidDate (attrName); + } + + if (M == 2) + { + bool leapYear = (Y % 4 == 0) && (Y % 100 != 0 || Y % 400 == 0); + + if (D > (leapYear? 29: 28)) + notValidDate (attrName); + } + else if (M == 4 || M == 6 || M == 9 || M == 11) + { + if (D > 30) + notValidDate (attrName); + } + else + { + if (D > 31) + notValidDate (attrName); + } +} + + +void +getFloat (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs, + void (*check) (const char attrName[], float f) = 0) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + float f = strtod (argv[i + 1], 0); + + if (check) + check (attrName, f); + + attrs.push_back (SetAttr (attrName, part, new FloatAttribute (f))); + i += 2; +} + + +void +getPosFloatOrInf (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + float f; + + if (!strcmp (argv[i + 1], "inf") || !strcmp (argv[i + 1], "infinity")) + { + f = float (half::posInf()); + } + else + { + f = strtod (argv[i + 1], 0); + + if (f <= 0) + { + cerr << "The value for the " << attrName << " attribute " + "must be greater than zero, or \"infinity\"." << endl; + exit (1); + } + } + + attrs.push_back (SetAttr (attrName, part, new FloatAttribute (f))); + i += 2; +} + + +void +getV2f (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs, + void (*check) (const char attrName[], const V2f &v) = 0) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + V2f v (strtod (argv[i + 1], 0), strtod (argv[i + 2], 0)); + + if (check) + check (attrName, v); + + attrs.push_back (SetAttr (attrName, part, new V2fAttribute (v))); + i += 3; +} + + +void +getRational (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs, + void (*check) (const char attrName[], const Rational &r) = 0) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + Rational r (strtol (argv[i + 1], 0, 0), strtol (argv[i + 2], 0, 0)); + + if (check) + check (attrName, r); + + attrs.push_back (SetAttr (attrName, part, new RationalAttribute (r))); + i += 3; +} + + +void +getString (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs, + void (*check) (const char attrName[], const char str[]) = 0) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + const char *str = argv[i + 1]; + + if (check) + check (attrName, str); + + attrs.push_back (SetAttr (attrName, part, new StringAttribute (str))); + i += 2; +} + + +void +getNameAndString (int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + const char *attrName = argv[i + 1]; + const char *str = argv[i + 2]; + attrs.push_back (SetAttr (attrName, part, new StringAttribute (str))); + i += 3; +} + + +void +getNameAndFloat (int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + const char *attrName = argv[i + 1]; + float f = strtod (argv[i + 2], 0); + attrs.push_back (SetAttr (attrName, part, new FloatAttribute (f))); + i += 3; +} + + +void +getNameAndInt (int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + const char *attrName = argv[i + 1]; + int j = strtol (argv[i + 2], 0, 0); + attrs.push_back (SetAttr (attrName, part, new IntAttribute (j))); + i += 3; +} + + +void +getChromaticities (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 9) + usageMessage (argv[0]); + + ChromaticitiesAttribute *a = new ChromaticitiesAttribute; + attrs.push_back (SetAttr (attrName, part, a)); + + a->value().red.x = strtod (argv[i + 1], 0); + a->value().red.y = strtod (argv[i + 2], 0); + a->value().green.x = strtod (argv[i + 3], 0); + a->value().green.y = strtod (argv[i + 4], 0); + a->value().blue.x = strtod (argv[i + 5], 0); + a->value().blue.y = strtod (argv[i + 6], 0); + a->value().white.x = strtod (argv[i + 7], 0); + a->value().white.y = strtod (argv[i + 8], 0); + i += 9; +} + + +void +getEnvmap (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + char *str = argv[i + 1]; + Envmap type; + + if (!strcmp (str, "latlong") || !strcmp (str, "LATLONG")) + { + type = ENVMAP_LATLONG; + } + else if (!strcmp (str, "cube") || !strcmp (str, "CUBE")) + { + type = ENVMAP_CUBE; + } + else + { + cerr << "The value for the " << attrName << " attribute " + "must be either LATLONG or CUBE." << endl; + exit (1); + } + + attrs.push_back (SetAttr (attrName, part, new EnvmapAttribute (type))); + i += 2; +} + + +void +getKeyCode (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 8) + usageMessage (argv[0]); + + KeyCodeAttribute *a = new KeyCodeAttribute; + attrs.push_back (SetAttr (attrName, part, a)); + + a->value().setFilmMfcCode (strtol (argv[i + 1], 0, 0)); + a->value().setFilmType (strtol (argv[i + 2], 0, 0)); + a->value().setPrefix (strtol (argv[i + 3], 0, 0)); + a->value().setCount (strtol (argv[i + 4], 0, 0)); + a->value().setPerfOffset (strtol (argv[i + 5], 0, 0)); + a->value().setPerfsPerFrame (strtol (argv[i + 6], 0, 0)); + a->value().setPerfsPerCount (strtol (argv[i + 7], 0, 0)); + i += 8; +} + + +void +getTimeCode (const char attrName[], + int argc, + char **argv, + int &i, + int part, + SetAttrVector &attrs) +{ + if (i > argc - 3) + usageMessage (argv[0]); + + TimeCodeAttribute *a = new TimeCodeAttribute; + attrs.push_back (SetAttr (attrName, part, a)); + + a->value().setTimeAndFlags (strtoul (argv[i + 1], 0, 16)); + a->value().setUserData (strtoul (argv[i + 2], 0, 16)); + i += 3; +} + + +void +getPart (const char attrName[], + int argc, + char **argv, + int &i, + int &part) +{ + if (i > argc - 2) + usageMessage (argv[0]); + + if (!strcmp (argv[i + 1], "any")) + part = -1; + else + part = strtol (argv[i + 1], 0, 0); + + i += 2; +} + + +int +main(int argc, char **argv) +{ + // + // Parse the command line. + // + + if (argc < 2) + usageMessage (argv[0], true); + + int exitStatus = 0; + + try + { + const char *inFileName = 0; + const char *outFileName = 0; + + SetAttrVector attrs; + int part = -1; + int i = 1; + + while (i < argc) + { + const char *attrName = argv[i] + 1; + + if (!strcmp (argv[i], "-part")) + { + getPart (attrName, argc, argv, i, part); + } + else if (!strcmp (argv[i], "-chromaticities")) + { + getChromaticities (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-whiteLuminance")) + { + getFloat (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-adoptedNeutral")) + { + getV2f (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-renderingTransform")) + { + getString (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-lookModTransform")) + { + getString (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-xDensity")) + { + getFloat (attrName, argc, argv, i, part, attrs, isPositive); + } + else if (!strcmp (argv[i], "-owner")) + { + getString (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-comments")) + { + getString (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-capDate")) + { + getString (attrName, argc, argv, i, part, attrs, isDate); + } + else if (!strcmp (argv[i], "-utcOffset")) + { + getFloat (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-longitude")) + { + getFloat (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-latitude")) + { + getFloat (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-altitude")) + { + getFloat (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-focus")) + { + getPosFloatOrInf (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-expTime")) + { + getFloat (attrName, argc, argv, i, part, attrs, isPositive); + } + else if (!strcmp (argv[i], "-aperture")) + { + getFloat (attrName, argc, argv, i, part, attrs, isPositive); + } + else if (!strcmp (argv[i], "-isoSpeed")) + { + getFloat (attrName, argc, argv, i, part, attrs, isPositive); + } + else if (!strcmp (argv[i], "-envmap")) + { + getEnvmap (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-framesPerSecond")) + { + getRational (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-keyCode")) + { + getKeyCode (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-timeCode")) + { + getTimeCode (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-wrapmodes")) + { + getString (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-pixelAspectRatio")) + { + getFloat (attrName, argc, argv, i, part, attrs, isPositive); + } + else if (!strcmp (argv[i], "-screenWindowWidth")) + { + getFloat (attrName, argc, argv, i, part, attrs, isNonNegative); + } + else if (!strcmp (argv[i], "-screenWindowCenter")) + { + getV2f (attrName, argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-string")) + { + getNameAndString (argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-float")) + { + getNameAndFloat (argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-int")) + { + getNameAndInt (argc, argv, i, part, attrs); + } + else if (!strcmp (argv[i], "-h")) + { + usageMessage (argv[0], true); + } + else + { + if (inFileName == 0) + inFileName = argv[i]; + else + outFileName = argv[i]; + + i += 1; + } + } + + if (inFileName == 0 || outFileName == 0) + usageMessage (argv[0]); + + if (!strcmp (inFileName, outFileName)) + { + cerr << "Input and output cannot be the same file." << endl; + return 1; + } + + // + // Load the headers from the input file + // and add attributes to the headers. + // + + MultiPartInputFile in (inFileName); + int numParts = in.parts(); + vector
headers; + + for (int part = 0; part < numParts; ++part) + { + Header h = in.header (part); + + for (int i = 0; i < attrs.size(); ++i) + { + const SetAttr &attr = attrs[i]; + + if (attr.part == -1 || attr.part == part) + { + h.insert (attr.name, *attr.attr); + } + else if (attr.part < 0 || attr.part >= numParts) + { + cerr << "Invalid part number " << attr.part << ". " + "Part numbers in file " << inFileName << " " + "go from 0 to " << numParts - 1 << "." << endl; + + return 1; + } + } + + headers.push_back(h); + } + + // + // Crete an output file with the modified headers, + // and copy the pixels from the input file to the + // output file. + // + + MultiPartOutputFile out (outFileName, &headers[0], numParts); + + for (int p = 0; p < numParts; ++p) + { + const Header &h = in.header (p); + const string &type = h.type(); + + if (type == SCANLINEIMAGE) + { + InputPart inPart (in, p); + OutputPart outPart (out, p); + outPart.copyPixels (inPart); + } + else if (type == TILEDIMAGE) + { + TiledInputPart inPart (in, p); + TiledOutputPart outPart (out, p); + outPart.copyPixels (inPart); + } + else if (type == DEEPSCANLINE) + { + DeepScanLineInputPart inPart (in, p); + DeepScanLineOutputPart outPart (out, p); + outPart.copyPixels (inPart); + } + else if (type == DEEPTILE) + { + DeepTiledInputPart inPart (in, p); + DeepTiledOutputPart outPart (out, p); + outPart.copyPixels (inPart); + } + } + } + catch (const exception &e) + { + cerr << e.what() << endl; + exitStatus = 1; + } + + return exitStatus; +} diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100755 index 0000000..a72f2fd --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6b +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6b +TIMESTAMP="" +package_revision=1.3017 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? value : ""))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/m4/compilelinkrun.m4 b/m4/compilelinkrun.m4 new file mode 100644 index 0000000..ea56669 --- /dev/null +++ b/m4/compilelinkrun.m4 @@ -0,0 +1,171 @@ +dnl +dnl +dnl compilelinkrun.m4 - used to check whether a required package is properly +dnl installed. Compiles, links and runs a c++ test program that uses the +dnl package to verify that the package is properly installed +dnl +dnl Expected arguments: +dnl $1: the name of the package we are testing, e.g. "OpenEXR" +dnl used for informational messages, warnings & errors +dnl +dnl $2: the argument passed to configure specifying how to disable this test +dnl for example: +dnl $3 = "openexrtest" and +dnl "configure --disable-openexrtest" will skip the test +dnl +dnl $3: CXXFLAGS used by the test +dnl +dnl $4: LDFLAGS used by the test +dnl +dnl $5: include section of sourcecode for a c++ test program +dnl $6: body section of sourcecode for a c++ test program +dnl The test program should make use of a library that is supposed to +dnl be tested. +dnl +dnl $7: the action to be perfomed if the test succeeds +dnl (e.g. AC_MSG_RESULT("OpenEXR test program succeeded")) +dnl +dnl $8 the action to be perfomed if the test fails +dnl (e.g. AC_MSG_ERROR("OpenEXR test program failed")) +dnl + +AC_DEFUN([AM_COMPILELINKRUN], +[ + +dnl create some local m4 "variables" so that we don't have to use numbers +define([arg_pkg_name],$1) +define([arg_disable],$2) +define([arg_cxxflags],$3) +define([arg_ldflags],$4) +define([arg_libs],$5) +define([arg_include_source],$6) +define([arg_body_source],$7) +define([arg_do_yes],$8) +define([arg_do_no],$9) + + +dnl check arguments +AC_ARG_ENABLE(arg_disable, [ --disable-arg_disable Do not try to compile and run a test arg_pkg_name program],, enable_programtest=yes) + + +dnl +dnl if the test hasn't been disabled, then compile, link and run test program +dnl + if test "x$enable_programtest" = "xyes" ; then + + dnl basic preliminary checks + AC_MSG_CHECKING(for arg_pkg_name) + test_runs="yes" + + dnl save settings and setup c++ before we start + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + ac_save_LIBS="$LIBS" + CXXFLAGS="$CXXFLAGS arg_cxxflags" + LDFLAGS="$LDFLAGS arg_ldflags" + LIBS="$LIBS arg_libs" + AC_REQUIRE_CPP() + AC_LANG_PUSH([C++]) + rm -f conf.testprogram + + dnl + dnl first try a complete test - compile, link run + dnl + AC_RUN_IFELSE([AC_LANG_PROGRAM(arg_include_source, + arg_body_source; [[system("touch conf.testprogram"); ]])], + test_runs=yes, + test_runs=no, + [echo $ac_n "cross compiling; assumed OK... $ac_c"]) + + if test "x$test_runs" = "xyes" || test -f conf.testprogram ; then + AC_MSG_RESULT(yes) + ifelse([arg_do_yes], , :, [arg_do_yes]) + else + AC_MSG_RESULT(no) + echo "*** Could not run the arg_pkg_name test program, checking why..." + + test_compiles="yes" + test_links="yes" + + dnl + dnl if the program did not run, attempt to compile only + dnl + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM(arg_include_source, + arg_body_source ; )], + test_compiles=yes, + test_compiles=no) + + if test "x$test_compiles" = "xno" ; then + echo "*** The test program could not be compiled. Is arg_pkg_name installed?" + echo "*** Check that the cflags (below) includes the arg_pkg_name include directory" + + else + dnl + dnl if the program did compile, try linking + dnl + AC_LINK_IFELSE([AC_LANG_PROGRAM(arg_include_source, + arg_body_source ; )], + test_links=yes, + test_links=no) + + if test "x$test_links" = "xyes"; then + echo "*** The test program compiled and staticly linked, but did not run. This " + echo "*** usually means that the run-time linker is not finding arg_pkg_name or finding" + echo "*** the wrong version of arg_pkg_name." + echo "***" + echo "*** If the linker is not finding arg_pkg_name, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system." + else + echo "*** The arg_pkg_name test program could be compiled, but could not be dynamically." + echo "*** or statically linked." + echo "***" + echo "*** Make sure the LDFLAGS points to the location of the arg_pkg_name library." + echo "*** (e.g. -L/usr/local/lib)." + echo "*** If the run-time linker is not finding arg_pkg_name, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system." + fi + fi + + dnl + dnl The test failed for some reason. Print out more info, + dnl unset flags and signal an error. + dnl + echo "***" + echo "*** Flags used by the test:" + echo "*** cflags: $CXXFLAGS " + echo "*** ldflags: $LDFLAGS" + echo "***" + echo "*** You can also run configure with --disable-arg_disable to skip this test." + + ifelse([arg_do_no], , :, [arg_do_no]) + fi + + AC_LANG_POP([C++]) + CXXFLAGS="$ac_save_CXXFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + LIBS="$ac_save_LIBS" + + dnl + dnl clean up + dnl + rm -f conf.testprogram + fi + + +dnl clean up local "variables" +undefine([arg_pkg_name]) +undefine([arg_disable]) +undefine([arg_cxxflags]) +undefine([arg_ldflags]) +undefine([arg_libs]) +undefine([arg_include_source]) +undefine([arg_body_source]) +undefine([arg_do_yes]) +undefine([arg_do_no]) + +]) diff --git a/m4/path.pkgconfig.m4 b/m4/path.pkgconfig.m4 new file mode 100644 index 0000000..a6a36ae --- /dev/null +++ b/m4/path.pkgconfig.m4 @@ -0,0 +1,134 @@ +AC_DEFUN([AM_PATH_PKGCONFIG], +[ + +dnl sets cflags and ldflags +dnl TEST_CXXFLAGS and TEST_LDFLAGS, by trying thes following +dnl until something works: +dnl +dnl 1 - try the test_prefix +dnl 2 - check whether pkgconfig can find values (unless --with-pkg-config=no) +dnl 3 - use the prefix, if it is not the default +dnl 4 - use defaults, /usr/local/include/OpenEXR and /usr/local/lib +dnl +dnl +dnl Expected arguments +dnl $1: arg_cxxflags - CXXFLAGS variable to set +dnl +dnl $2: arg-ldflags - LDFLAGS variable to set +dnl +dnl $3: package name (the package being checked), as requried by pkg-config +dnl +dnl $4: arg_include_subdir +dnl the name of the subdirectory name that is tacked on to +dnl the end of the include path e.g. "OpenEXR" in +dnl /usr/local/include/OpenEXR +dnl +dnl $5: arg_default_libs - default libraries, used if pkgconfig doesnt work +dnl +dnl $6: arg_test_prefix +dnl the argument passed to configure specifying a directory to +dnl be used in the CXX and LD flags for example: +dnl $2 = "openexr-prefix" and +dnl "configure --openexr-prefix=/usr/lib" +dnl leads to CXX including "-I/usr/lib/OpenEXR" +dnl + +dnl create some local m4 "variables" so that we don't have to use numbers +define([arg_cxxflags],$1) +define([arg_ldflags],$2) +define([arg_libs],$3) +define([arg_pkg_name],$4) +define([arg_include_subdir],$5) +define([arg_default_ldflags],$6) +define([arg_default_libs],$7) +define([arg_test_prefix],$8) + +TEST_CXXFLAGS="" +TEST_LDFLAGS="" +TEST_LIBS="" + +AC_ARG_WITH(arg_test_prefix,[ --with-arg_test_prefix=PFX Prefix where tested libraries are supposed to be installed (optional)], test_prefix="$withval", test_prefix="NONE") +echo "test_prefix = $test_prefix" + +AC_ARG_VAR(PKG_CONFIG, Path to pkg-config command) +AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +AC_ARG_WITH(pkg-config,[ --with-pkg-config=PATH Specify which pkg-config to use (optional)], PKG_CONFIG="$withval",) + + +if test "x$test_prefix" != "xNONE" ; then + echo "using arg_test_prefix to set arg_cxxflags, arg_ldflags and arg_libs:" + for inc_dir in arg_include_subdir + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I$test_prefix/include/$inc_dir" + done + TEST_LDFLAGS="-L$test_prefix/lib" + TEST_LDFLAGS="$TEST_LDFLAGS arg_default_ldflags" + TEST_LIBS="arg_default_libs" +else + dnl + dnl Get the cflags and libraries from the arg_pkg_name package using + dnl pkg-config + dnl + dnl Note: the TEST_LIBS contains both the -L and the -l flags. This means + dnl the -L flags will appear twice on the command line, but we can not + dnl limit it to --libs-only-l because it may include the "-pthread" flag. + dnl + if test x$PKG_CONFIG != xno ; then + echo "using pkg-config to set arg_cxxflags and arg_ldflags:" + TEST_CXXFLAGS="`$PKG_CONFIG --cflags arg_pkg_name`" + TEST_LDFLAGS="`$PKG_CONFIG --libs-only-L arg_pkg_name`" + TEST_LIBS="`$PKG_CONFIG --libs arg_pkg_name`" + else + echo "Not using pkg-config." + TEST_CXXFLAGS="" + TEST_LDFLAGS="" + TEST_LIBS="" + fi + + dnl + dnl if the flags are still not set, try a prefix and finally a default + dnl + if test -z "${TEST_CXXFLAGS}"; then + TEST_CXXFLAGS="" + if test "x$prefix" != "xNONE"; then + echo "using prefix to set arg_cxxflags and arg_ldflags:" + for inc_dir in arg_include_subdir + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I$prefix/include/$inc_dir" + done + TEST_LDFLAGS="-L$prefix/lib" + else + echo "using default as guess for arg_cxxflags and arg_ldflags:" + for inc_dir in arg_include_subdir + do + TEST_CXXFLAGS="$TEST_CXXFLAGS -I/usr/local/include/$inc_dir" + done + TEST_LDFLAGS="arg_default_ldflags" + fi + TEST_LIBS="arg_default_libs" + fi +fi + +echo " arg_cxxflags = $TEST_CXXFLAGS" +echo " arg_ldflags = $TEST_LDFLAGS" +echo " arg_libs = $TEST_LIBS" + + +AC_SUBST(arg_cxxflags, $TEST_CXXFLAGS) +AC_SUBST(arg_ldflags, $TEST_LDFLAGS) +AC_SUBST(arg_libs, $TEST_LIBS) + + +dnl clean up local "variables" +undefine([arg_cxxflags]) +undefine([arg_ldflags]) +undefine([arg_libs]) +undefine([arg_pkg_name]) +undefine([arg_include_subdir]) +undefine([arg_default_ldflags]) +undefine([arg_default_libs]) +undefine([arg_test_prefix]) + +]) + + diff --git a/m4/threads.m4 b/m4/threads.m4 new file mode 100644 index 0000000..2213bb8 --- /dev/null +++ b/m4/threads.m4 @@ -0,0 +1,291 @@ + +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl Modified by Wojciech Jarosz (2005) to include check for POSIX +dnl semaphore usability. Defines HAVE_POSIX_SEMAPHORES if found. +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2005-01-14 +dnl @license GPLWithACException + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + PTHREAD_LIBS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi + +AC_LANG_RESTORE +])dnl ACX_PTHREAD + + +dnl +dnl Posix Semaphore support +dnl + +AC_DEFUN([AM_POSIX_SEM], +[ +AC_ARG_ENABLE([posix-sem], AC_HELP_STRING([--disable-posix-sem], + [do not attempt to use POSIX unnamed semaphores])) + +am_posix_sem_ok=no +if test "${enable_posix_sem:-yes}" != "no"; then + AC_CHECK_HEADERS([semaphore.h], [ + AC_SEARCH_LIBS(sem_init, [posix4 pthread], [ + AC_MSG_CHECKING([whether to use POSIX unnamed semaphores]) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([#include ], [ + sem_t mysem; + if (sem_init (&mysem, 1, 1) == 0) + { + if (sem_wait (&mysem) == 0) + { + sem_post (&mysem); + sem_destroy (&mysem); + return 0; + } + } + return 1; + ]) + ], [ + AC_MSG_RESULT([yes]) + am_posix_sem_ok=yes], [ + AC_MSG_RESULT([no (pshared not usable)])], [ + AC_MSG_RESULT([no (cannot check usability when cross compiling)])]) + ]) + ]) +fi + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$am_posix_sem_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_POSIX_SEMAPHORES),[$1]) + : +else + am_posix_sem_ok=no + $2 +fi +]) + + diff --git a/missing b/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/openexr.m4 b/openexr.m4 new file mode 100644 index 0000000..ca45ff2 --- /dev/null +++ b/openexr.m4 @@ -0,0 +1,19 @@ +# aclocal.m4 generated automatically by aclocal 1.6.3 -*- Autoconf -*- + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +dnl +dnl Note: to check whether openexr is properly installed, please +dnl look at the m4 macro AM_COMPILELINKRUN and it's use to set +dnl OPENEXR_CXXFLAGS and OPENEXR_LDFLAGS in the OpenEXR_Viewers package +dnl +